@arbidocs/blocks 0.3.116 → 0.3.117
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +142 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +39 -2
- package/dist/index.d.ts +39 -2
- package/dist/index.js +144 -7
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/prompts.ts","../src/theme/tokens.ts","../src/theme/store.ts","../src/theme/ThemeEditor.tsx","../src/connection/ConnectionProvider.tsx","../src/connection/LegalArbiProvider.tsx","../src/connection/ai.ts","../src/lib/testid.ts","../src/lib/format.ts","../src/components/EmptyState.tsx","../src/components/DataTable.tsx","../src/components/DataTableBlock.tsx","../src/components/GridView.tsx","../src/components/PageHeader.tsx","../src/components/SectionHeading.tsx","../src/components/Toolbar.tsx","../src/components/MetricCard.tsx","../src/components/assetResolver.tsx","../src/components/BlockImage.tsx","../src/components/Hero.tsx","../src/components/FeatureGrid.tsx","../src/components/StatGroup.tsx","../src/components/Testimonial.tsx","../src/components/CTABanner.tsx","../src/components/LogoCloud.tsx","../src/components/FAQ.tsx","../src/components/RichTextBlock.tsx","../src/components/Callout.tsx","../src/components/AvatarBlock.tsx","../src/components/Navbar.tsx","../src/components/Footer.tsx","../src/components/ListBlock.tsx","../src/components/Columns.tsx","../src/components/Spacer.tsx","../src/components/Container.tsx","../src/components/PricingTable.tsx","../src/components/Tabs.tsx","../src/components/Accordion.tsx","../src/components/Gallery.tsx","../src/components/VideoEmbed.tsx","../src/components/ContactForm.tsx","../src/components/Banner.tsx","../src/components/MediaText.tsx","../src/components/TeamGrid.tsx","../src/components/Steps.tsx","../src/components/TestimonialGrid.tsx","../src/nav/AppShell.tsx","../src/studio/liveData.ts","../src/studio/liveWidgetRuntime.tsx","../src/studio/widgets.tsx","../src/studio/publish.ts","../src/studio/StudioEditor.tsx","../src/studio/PageRenderer.tsx","../src/studio/persistence.ts","../src/studio/aiFields.tsx","../src/connection/useImageGen.ts","../src/studio/imageFields.tsx","../src/studio/Section.tsx","../src/studio/blockKit.tsx","../src/studio/websiteBlocks.tsx","../src/studio/siteBlocks.tsx","../src/studio/blocksConfig.tsx","../src/builder/modules/registry.ts","../src/builder/modules/store.ts","../src/builder/agents/store.ts","../src/builder/export.ts","../src/builder/ModuleManager.tsx","../src/builder/AgentsPanel.tsx","../src/builder/VerticalBuilder.tsx"],"names":["tid","useState","jsx","useKitAiTask","useCallback","useKitWorkspaceDocs","useKitSemanticSearch","jsxs","cn","useMemo","useEffect","lines","alignClass","Input","Card","createContext","useContext","useArbi","TONE_SURFACE","Button","ArrowRight","Avatar","AvatarImage","AvatarFallback","GRID","SIZE","Check","toggle","ChevronDown","COLS","ASPECT","Quote","Fragment","Sparkles","useRef","persist","Link","Palette","Loader2","useDocuments","useThumbnails","Link2","PADDING","WIDTH","FileText","Info","Rocket","emptySlot","id","create","a","b","RotateCcw","CardHeader","CardTitle","CardContent","Badge","useQuery","Cpu","Bot","Tabs"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The reusable AI-native law-firm prompt library.\n *\n * Deliberately opinionated, litigation-grade instructions: they demand citations\n * to the source documents, hedge appropriately, and always frame the output as a\n * draft for a regulated lawyer to review (\"AI proposes, the lawyer disposes\").\n * Firm-specific register (name, jurisdiction, house language) is injected via\n * {@link PromptConfig} so a second firm reuses the same library with its own\n * voice — call {@link createPromptLibrary} once and share the result app-wide.\n */\n\nexport interface MatterContext {\n title: string\n client?: string\n court?: string\n claimNumber?: string\n practice?: string\n summary?: string\n}\n\n/** Build a {@link MatterContext} from any matter-shaped record. */\nexport function matterToContext(m: {\n title: string\n clientName?: string\n court?: string | null\n claimNumber?: string | null\n practice?: string\n summary?: string\n}): MatterContext {\n return {\n title: m.title,\n client: m.clientName,\n court: m.court ?? undefined,\n claimNumber: m.claimNumber ?? undefined,\n practice: m.practice,\n summary: m.summary,\n }\n}\n\n/** Firm voice for the prompt library — everything firm-specific lives here. */\nexport interface PromptConfig {\n /** The firm's name, e.g. \"Acme Legal\". */\n firmName: string\n /** The legal system adjective used throughout, e.g. \"English\". */\n jurisdiction?: string\n /** House writing language, e.g. \"British English\". */\n language?: string\n /** How the reviewing professional is addressed, e.g. \"qualified solicitor\". */\n reviewerTitle?: string\n /** Who signs off compliance/onboarding, e.g. \"MLRO\". */\n complianceOfficer?: string\n}\n\nexport type PromptLibrary = ReturnType<typeof createPromptLibrary>\n/** The map of prompt builders (`prompts.brief(ctx)`, `prompts.revise(...)`, …). */\nexport type Prompts = PromptLibrary['prompts']\n\n/**\n * Build a firm-branded prompt library. Every prompt grounds on the supplied\n * documents, cites sources, and is framed as a draft for a lawyer to review.\n */\nexport function createPromptLibrary(config: PromptConfig) {\n const {\n firmName,\n jurisdiction = 'English',\n language = 'British English',\n reviewerTitle = 'qualified solicitor',\n complianceOfficer = 'MLRO',\n } = config\n\n const HOUSE_RULES = `You are ${firmName}'s litigation AI, working for a regulated ${jurisdiction} law firm.\nGround every statement in the supplied documents and cite the source document (and page/section where possible) for each material point.\nIf the documents do not support a point, say so plainly rather than inventing it. Write in concise ${language} for a ${reviewerTitle}. This is a draft for a lawyer to review — never present it as final legal advice.`\n\n const withContext = (m: MatterContext | undefined, body: string): string => {\n if (!m) return `${HOUSE_RULES}\\n\\n${body}`\n const facts = [\n `Matter: ${m.title}`,\n m.client && `Client: ${m.client}`,\n m.court && `Forum: ${m.court}`,\n m.claimNumber && `Case reference: ${m.claimNumber}`,\n m.practice && `Practice area: ${m.practice}`,\n ]\n .filter(Boolean)\n .join('\\n')\n return `${HOUSE_RULES}\\n\\nContext for this matter:\\n${facts}\\n\\n${body}`\n }\n\n const prompts = {\n /** Executive brief of the matter, from the live bundle. */\n brief: (m?: MatterContext) =>\n withContext(\n m,\n `Produce a crisp executive brief of this matter for a partner picking it up cold. Cover, with citations: (1) what the dispute is about, (2) the parties and their roles, (3) the key issues in play, (4) the current procedural posture, and (5) the two or three things that most need attention next. Keep it under 300 words.`\n ),\n\n /** Sourced chronology of events. */\n chronology: (m?: MatterContext) =>\n withContext(\n m,\n `Build a chronology of every material dated event across the documents. Output a table with columns: Date | Event | Source (document + page). Order strictly by date. Include correspondence, transactions, procedural steps and factual events. Flag any date that is ambiguous or disputed in the documents.`\n ),\n\n /** Disclosure / relevance + privilege review. */\n disclosure: (m?: MatterContext) =>\n withContext(\n m,\n `Act as a disclosure reviewer. For each document, assess: (a) relevance to the issues in dispute (High / Medium / Low, with a one-line reason), and (b) whether it may attract legal professional privilege or contain sensitive/personal data that needs redaction — with your reasoning. Present as a table: Document | Relevance | Privilege/PII risk | Reason. Be conservative: when unsure about privilege, flag it for a lawyer.`\n ),\n\n /** Merits / risk assessment — the real \"AI outlook\". */\n risk: (m?: MatterContext) =>\n withContext(\n m,\n `Give a balanced merits assessment grounded in the documents. Cover: the strongest points for our client, the strongest points against, key evidential gaps, and the main quantum drivers. End with a single calibrated headline: an overall assessment of the client's position (Strong / Favourable / Balanced / Difficult) with a one-sentence justification. Cite sources throughout. Be candid about weaknesses — a partner needs the downside, not comfort.`\n ),\n\n /** Extract deadlines / key dates with rule references. */\n deadlines: (m?: MatterContext) =>\n withContext(\n m,\n `Extract every deadline, key date and time-limited step referenced in the documents. Output a table: Due date | Event | Rule/basis (e.g. CPR reference, contractual clause, court order) | Source document. Include implied deadlines (e.g. a defence due 28 days after service) and note the trigger. Flag anything overdue or imminent.`\n ),\n\n /** Draft a document (letter / pleading / note). */\n draft: (kind: string, m?: MatterContext) =>\n withContext(\n m,\n `Draft a first-pass ${kind} for this matter, grounded in the documents. Use the correct ${jurisdiction} litigation format and tone. Where a fact relies on a document, cite it inline in [square brackets] so the solicitor can verify. Leave clearly-marked [PLACEHOLDERS] where information is missing rather than guessing. Add a short \"Points to verify before sending\" list at the end.`\n ),\n\n /** Free-form question about the matter. */\n ask: (question: string, m?: MatterContext) => withContext(m, `Question: ${question}`),\n\n /**\n * Draft a clean document artifact (output IS the document — no preamble).\n *\n * Pure single-pass generation from the matter context: it deliberately does\n * NOT tell the agent to look up or cite the document bundle. Asking a drafting\n * agent to \"cite the source behind each fact\" sends it into a retrieval loop\n * that can spin for minutes before emitting a token; a lawyer wants a fast\n * first draft to refine, so we draft from the known matter facts and mark\n * genuinely-missing specifics as [PLACEHOLDER]. (Grounded, cited analysis is\n * what {@link brief}/{@link risk} are for.)\n */\n draftArtifact: (kind: string, instructions: string, m?: MatterContext) =>\n withContext(\n m,\n `Draft a ${kind} for this matter now, in a single pass, using only the matter context above — do not look anything up.${instructions ? ` Specific instructions: ${instructions}.` : ''}\\n\\nKeep it tight — about 180–240 words, the essential body only. Where a specific detail isn't given in the context, insert a clearly-marked [PLACEHOLDER] and keep drafting — never stop to search for it.\\n\\nOutput ONLY the finished document in clean Markdown — a short title, then the body in correct ${jurisdiction} litigation format. No commentary before or after the document.`\n ),\n\n /**\n * Revise a supplied passage. Returns ONLY the full revised text (no commentary),\n * so the app can diff it against the original into a redline.\n */\n revise: (original: string, instruction: string, m?: MatterContext) =>\n withContext(\n m,\n `Revise the following passage per this instruction: \"${instruction}\". Improve it for an ${jurisdiction} disputes matter — tighten drafting, close gaps, and align with the documents where relevant.\\n\\nReturn ONLY the complete revised passage as plain text. No preamble, no explanation, no markdown fences — just the revised words so they can be compared against the original.\\n\\nPASSAGE:\\n\"\"\"${original}\"\"\"`\n ),\n\n /** Morning digest across the matter. */\n digest: (m?: MatterContext) =>\n withContext(\n m,\n `Write a short \"start of day\" brief for the fee-earner on this matter (5-6 bullet points). Surface: what changed or is newly relevant in the documents, the most pressing deadline or risk, and one concrete recommended next action. Be specific and cite sources. Keep it scannable.`\n ),\n\n /** UTBMS-coded billing narrative from time context. */\n billing: (activity: string, m?: MatterContext) =>\n withContext(\n m,\n `Draft a compliant, client-ready time-entry narrative for the following work: \"${activity}\". Write it in the third person, be specific about what was done and why it advanced the matter, avoid block-billing language, and suggest the most appropriate UTBMS task and activity codes. Keep it to 1-2 sentences.`\n ),\n\n /** Closing / lessons-learned memo. */\n closing: (m?: MatterContext) =>\n withContext(\n m,\n `Draft a matter closing memo grounded in the documents. Cover: the outcome, a concise narrative of how the matter resolved, key lessons for similar future matters, and any residual risks or follow-up obligations (limitation, undertakings, retention). Cite sources.`\n ),\n\n /** Thought-leadership / insight article from the matter's themes. */\n insight: (m?: MatterContext) =>\n withContext(\n m,\n `Using the legal and commercial themes in these documents, draft an 800-word thought-leadership insight article suitable for the firm's website. Anonymise all party-specific and confidential details — write about the legal principles and practical lessons, not this specific client. Give it a compelling headline and a two-sentence standfirst. This is marketing content; keep it authoritative but accessible.`\n ),\n\n /** Auto-tagging / issue classification of documents. */\n autoTag: (m?: MatterContext) =>\n withContext(\n m,\n `Propose a concise set of issue tags and document-type labels for this bundle so it can be organised. For each document, suggest 2-4 short tags (e.g. issue, document type, key party). Output as: Document | Suggested tags. Keep tags reusable and consistent across the set.`\n ),\n\n /** Verify uploaded onboarding documents against a KYC/CDD checklist. */\n kyc: (clientName: string, m?: MatterContext) =>\n withContext(\n m,\n `Act as ${firmName}'s client onboarding / KYC-CDD analyst for a new client, \"${clientName}\". Review the documents in this workspace against the firm's onboarding checklist and report each item as ✅ satisfied, ⚠️ partial, or ❌ missing, with a one-line reason citing the source.\\n\\nChecklist:\\n1. Proof of identity (individual) or certificate of incorporation (entity)\\n2. Proof of registered/residential address\\n3. Beneficial ownership / corporate authority to instruct\\n4. Source of funds / source of wealth indication\\n5. Sanctions / PEP screening flags apparent from the papers\\n\\nOutput a Markdown table: Item | Status | Notes (source). End with an overall onboarding recommendation (Proceed / Proceed with conditions / Do not proceed) and any information still required. This is a compliance aid; the ${complianceOfficer} signs off.`\n ),\n\n // ── Pitch / intake stage (may run before a workspace has full documents) ──\n\n /** Triage a prospective enquiry. */\n triage: (enquiry: string, m?: MatterContext) =>\n withContext(\n m,\n `A prospective client has made this enquiry:\\n\\n\"\"\"${enquiry}\"\"\"\\n\\nTriage it for the firm. Provide: (1) the likely practice area and a one-line matter description, (2) an initial risk/complexity rating with reasons, (3) the key questions we must ask before taking it on, and (4) any obvious limitation or urgency concerns. Be practical.`\n ),\n\n /** Conflict-of-interest style check against the workspace. */\n conflict: (parties: string, m?: MatterContext) =>\n withContext(\n m,\n `Run a conflict-awareness check. The prospective matter involves these parties/entities:\\n\\n\"\"\"${parties}\"\"\"\\n\\nSearch the documents for any mention of these names or closely related entities that could indicate a conflict of interest or prior involvement. Report each potential match with the source and a plain-English explanation of why it might matter. If nothing is found, say so clearly. This is a screening aid, not a substitute for a formal conflict search.`\n ),\n\n /** Capability statement / pitch letter. */\n pitch: (opportunity: string, m?: MatterContext) =>\n withContext(\n m,\n `Draft a persuasive one-page capability statement to pitch for this opportunity:\\n\\n\"\"\"${opportunity}\"\"\"\\n\\nLead with why the firm is the right choice, reference relevant experience at a thematic level (no confidential client details), set out the proposed team and approach, and close with a clear next step. Confident but not boastful.`\n ),\n }\n\n /** The four headline agentic workflows surfaced as one-click actions. */\n const WORKFLOW_ACTIONS = [\n { id: 'brief', title: 'Matter brief', prompt: prompts.brief },\n { id: 'chronology', title: 'Build a chronology', prompt: prompts.chronology },\n { id: 'disclosure', title: 'Review for disclosure', prompt: prompts.disclosure },\n { id: 'risk', title: 'Merits & risk', prompt: prompts.risk },\n ] as const\n\n return { prompts, WORKFLOW_ACTIONS }\n}\n","/**\n * The theme-token model. Firm-agnostic: the token *catalog*, default values and\n * presets are supplied by the consuming app (via {@link createThemeStore}); this\n * module owns the shared types and the logic for writing tokens onto the live\n * document.\n *\n * There are two emit models, selected per-app by {@link ThemeEmitMode}:\n *\n * - `'flat'` (default): each colour key is written as an inline `--color-<key>`\n * custom property on `<html>`, plus `--font-*` / `--radius`. Inline styles\n * override the compiled `@theme` defaults, so an edit previews live across the\n * whole app (and the @arbidocs AI kit) and reverts cleanly. Apps whose CSS sets\n * `--color-*` HEX directly rely on this.\n *\n * - `'cssVars'`: each colour key is written as a raw\n * HSL-triplet custom property (`--<key>: <h s l>`) into an injected\n * `<style id=\"arbi-theme-vars\">` appended to `<head>`. The monolith's source\n * of truth is HSL triplets wrapped as `hsl(var(--x))`, with a real `.dark`\n * variant; writing resolved hex inline would pin the colour and defeat both\n * the indirection and the dark-class swap. The injected sheet is *unlayered*,\n * so it wins over the monolith's `@layer base` `colors.css` at equal\n * specificity, and a `:root { light } / :root.dark { dark }` structure keeps\n * the dark cascade alive.\n */\n\nexport interface ColorToken {\n /** Key without the `--color-` prefix, e.g. \"primary\" → `--color-primary`. */\n key: string\n label: string\n /** Grouping id for the panel layout (e.g. \"shadcn\" | \"brand\" | \"ai\"). */\n group: string\n}\n\nexport interface ThemeFonts {\n display: string\n sans: string\n}\n\nexport interface ThemeTokens {\n /** Colour values keyed by token key (hex). */\n colors: Record<string, string>\n fonts: ThemeFonts\n /** Base radius in rem. */\n radius: number\n}\n\nexport interface ThemePreset {\n id: string\n label: string\n tokens: ThemeTokens\n}\n\n/** How a theme is written onto the document. See the module doc for the models. */\nexport type ThemeEmitMode = 'flat' | 'cssVars'\n\nexport interface ApplyThemeOptions {\n /** Emit model. Defaults to `'flat'`. */\n mode?: ThemeEmitMode\n /**\n * `cssVars` mode only: dark-variant colour values keyed by token key. Emitted\n * under `:root.dark`. When omitted, only `:root` is emitted — note that an\n * overridden light token then also applies in dark (the injected `:root` is\n * unlayered and beats the app's own `.dark` rules), so a firm with a dark mode\n * MUST supply this for every editable token to keep dark mode intact.\n */\n dark?: Record<string, string>\n /** `flat` mode only: target element. Defaults to `document.documentElement`. */\n root?: HTMLElement\n}\n\n/** Id of the injected `<style>` that carries the `cssVars`-mode custom properties. */\nexport const THEME_STYLE_ID = 'arbi-theme-vars'\n\nconst TRIPLET_RE = /^-?\\d+(?:\\.\\d+)?\\s+-?\\d+(?:\\.\\d+)?%\\s+-?\\d+(?:\\.\\d+)?%$/\n\nfunction parseRgb(color: string): { r: number; g: number; b: number } | null {\n if (color.startsWith('#')) {\n let hex = color.slice(1)\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map((ch) => ch + ch)\n .join('')\n }\n if (hex.length === 6 && /^[0-9a-fA-F]{6}$/.test(hex)) {\n return {\n r: parseInt(hex.slice(0, 2), 16),\n g: parseInt(hex.slice(2, 4), 16),\n b: parseInt(hex.slice(4, 6), 16),\n }\n }\n return null\n }\n const m = color.match(/^rgba?\\(\\s*([\\d.]+)[\\s,]+([\\d.]+)[\\s,]+([\\d.]+)/i)\n if (m) return { r: Number(m[1]), g: Number(m[2]), b: Number(m[3]) }\n return null\n}\n\nfunction rgbToHslTriplet(r: number, g: number, b: number): string {\n const rn = r / 255\n const gn = g / 255\n const bn = b / 255\n const max = Math.max(rn, gn, bn)\n const min = Math.min(rn, gn, bn)\n const l = (max + min) / 2\n const d = max - min\n let h = 0\n let s = 0\n if (d !== 0) {\n s = d / (1 - Math.abs(2 * l - 1))\n switch (max) {\n case rn:\n h = 60 * (((gn - bn) / d) % 6)\n break\n case gn:\n h = 60 * ((bn - rn) / d + 2)\n break\n default:\n h = 60 * ((rn - gn) / d + 4)\n break\n }\n }\n if (h < 0) h += 360\n return `${Math.round(h)} ${Math.round(s * 100)}% ${Math.round(l * 100)}%`\n}\n\n/**\n * Convert a colour to the monolith's `H S% L%` HSL-triplet format.\n *\n * Handles `#rgb` / `#rrggbb`, `rgb()` / `rgba()`, and passes an existing triplet\n * through untouched (so a firm can seed exact `colors.css` triplets for a\n * byte-identical no-op). Values it cannot parse — notably `oklch(...)`, which the\n * status tokens use — are returned unchanged so they remain usable as a raw\n * custom-property value; converting those cleanly is out of scope.\n */\nexport function toHslTriplet(color: string): string {\n const c = color.trim()\n if (TRIPLET_RE.test(c)) return c\n const rgb = parseRgb(c)\n if (!rgb) return c\n return rgbToHslTriplet(rgb.r, rgb.g, rgb.b)\n}\n\nfunction renderTripletBlock(colors: Record<string, string>): string {\n return Object.entries(colors)\n .map(([key, value]) => ` --${key}: ${toHslTriplet(value)};`)\n .join('\\n')\n}\n\nfunction emitCssVars(theme: ThemeTokens, dark?: Record<string, string>): void {\n if (typeof document === 'undefined') return\n const meta = [\n ` --font-display: ${theme.fonts.display};`,\n ` --font-sans: ${theme.fonts.sans};`,\n ` --radius: ${theme.radius}rem;`,\n ].join('\\n')\n let css = `:root {\\n${renderTripletBlock(theme.colors)}\\n${meta}\\n}`\n if (dark) {\n css += `\\n:root.dark {\\n${renderTripletBlock(dark)}\\n}`\n }\n let style = document.getElementById(THEME_STYLE_ID) as HTMLStyleElement | null\n if (!style) {\n style = document.createElement('style')\n style.id = THEME_STYLE_ID\n document.head.appendChild(style)\n }\n style.textContent = css\n}\n\nfunction removeCssVars(): void {\n if (typeof document === 'undefined') return\n document.getElementById(THEME_STYLE_ID)?.remove()\n}\n\nfunction normalizeOptions(optionsOrRoot: ApplyThemeOptions | HTMLElement): ApplyThemeOptions {\n if (typeof HTMLElement !== 'undefined' && optionsOrRoot instanceof HTMLElement) {\n return { root: optionsOrRoot }\n }\n return optionsOrRoot as ApplyThemeOptions\n}\n\n/**\n * Write a theme onto the live document.\n *\n * In `flat` mode (default) writes inline `--color-<key>` / `--font-*` / `--radius`\n * on `document.documentElement` (or a supplied root). In `cssVars` mode writes\n * raw HSL-triplet vars into an injected `<style#arbi-theme-vars>` (see the module\n * doc). The legacy `applyThemeVars(theme, rootElement)` call form still works.\n */\nexport function applyThemeVars(\n theme: ThemeTokens,\n optionsOrRoot: ApplyThemeOptions | HTMLElement = {}\n): void {\n const { mode = 'flat', dark, root = document.documentElement } = normalizeOptions(optionsOrRoot)\n\n if (mode === 'cssVars') {\n emitCssVars(theme, dark)\n return\n }\n\n for (const [key, value] of Object.entries(theme.colors)) {\n root.style.setProperty(`--color-${key}`, value)\n }\n root.style.setProperty('--font-display', theme.fonts.display)\n root.style.setProperty('--font-sans', theme.fonts.sans)\n root.style.setProperty('--radius', `${theme.radius}rem`)\n}\n\n/**\n * Remove a theme's overrides, reverting to the stylesheet defaults.\n *\n * In `flat` mode removes the inline overrides for the theme's keys. In `cssVars`\n * mode removes the injected `<style#arbi-theme-vars>` in full (restoring the\n * app's own `colors.css` exactly).\n */\nexport function clearThemeVars(\n theme: ThemeTokens,\n optionsOrRoot: ApplyThemeOptions | HTMLElement = {}\n): void {\n const { mode = 'flat', root = document.documentElement } = normalizeOptions(optionsOrRoot)\n\n if (mode === 'cssVars') {\n removeCssVars()\n return\n }\n\n for (const key of Object.keys(theme.colors)) {\n root.style.removeProperty(`--color-${key}`)\n }\n root.style.removeProperty('--font-display')\n root.style.removeProperty('--font-sans')\n root.style.removeProperty('--radius')\n}\n","/**\n * The shared theme store factory. A firm calls {@link createThemeStore} once\n * with its token catalog, default values and presets; the returned bundle (a\n * zustand hook + metadata) is the single source of truth consumed by every\n * theme surface (the back-office builder panel and the studio drawer), so the\n * token model, presets and apply logic live in exactly one place.\n */\nimport { create, type UseBoundStore, type StoreApi } from 'zustand'\nimport { persist } from 'zustand/middleware'\nimport {\n applyThemeVars,\n type ColorToken,\n type ThemeEmitMode,\n type ThemeFonts,\n type ThemePreset,\n type ThemeTokens,\n} from './tokens'\n\nexport interface ThemeState extends ThemeTokens {\n activePresetId: string | null\n setColor: (key: string, value: string) => void\n setFont: (which: keyof ThemeFonts, value: string) => void\n setRadius: (radius: number) => void\n applyPreset: (presetId: string) => void\n reset: () => void\n /** Snapshot of the editable tokens (for export / live apply). */\n snapshot: () => ThemeTokens\n}\n\nexport interface ThemeStoreConfig {\n /** The editable token catalog (keys + labels + groups). */\n tokens: ColorToken[]\n /** Group id → heading, for the grouped panel layout. */\n groupLabels: Record<string, string>\n /** Shipped defaults (the firm's brand values). */\n defaultTheme: ThemeTokens\n /** Starting points the user can apply then fine-tune. */\n presets: ThemePreset[]\n /** localStorage key for persistence (namespaced per firm). */\n storageKey: string\n /**\n * How edits are written onto the document. Defaults to `'flat'` (inline\n * `--color-*`). `'cssVars'` emits raw HSL-triplet vars into an injected\n * `<style>` so an app's own `hsl(var(--x))` indirection + `.dark` variant\n * survive. See {@link applyThemeVars}.\n */\n mode?: ThemeEmitMode\n /**\n * `cssVars` mode only: the dark-variant colour values keyed by token key,\n * emitted under `:root.dark`. Required (per editable token) for any firm with a\n * dark mode, otherwise a light-token override leaks into dark.\n */\n darkColors?: Record<string, string>\n}\n\nexport interface ThemeBundle extends ThemeStoreConfig {\n useStore: UseBoundStore<StoreApi<ThemeState>>\n}\n\n/** Build a firm-branded theme store bundle. */\nexport function createThemeStore(config: ThemeStoreConfig): ThemeBundle {\n const { defaultTheme, presets, storageKey } = config\n\n const useStore = create<ThemeState>()(\n persist(\n (set, get) => ({\n ...defaultTheme,\n activePresetId: presets[0]?.id ?? null,\n\n setColor: (key, value) =>\n set((s) => ({ colors: { ...s.colors, [key]: value }, activePresetId: null })),\n\n setFont: (which, value) =>\n set((s) => ({ fonts: { ...s.fonts, [which]: value }, activePresetId: null })),\n\n setRadius: (radius) => set({ radius, activePresetId: null }),\n\n applyPreset: (presetId) => {\n const preset = presets.find((p) => p.id === presetId)\n if (!preset) return\n set({\n colors: { ...preset.tokens.colors },\n fonts: { ...preset.tokens.fonts },\n radius: preset.tokens.radius,\n activePresetId: presetId,\n })\n },\n\n reset: () =>\n set({\n colors: { ...defaultTheme.colors },\n fonts: { ...defaultTheme.fonts },\n radius: defaultTheme.radius,\n activePresetId: presets[0]?.id ?? null,\n }),\n\n snapshot: () => {\n const { colors, fonts, radius } = get()\n return { colors, fonts, radius }\n },\n }),\n { name: storageKey }\n )\n )\n\n return { ...config, useStore }\n}\n\n/** Apply a bundle's current store to the live document, honouring its emit mode. */\nexport function applyStoredTheme(bundle: ThemeBundle): void {\n const { colors, fonts, radius } = bundle.useStore.getState()\n applyThemeVars({ colors, fonts, radius }, { mode: bundle.mode, dark: bundle.darkColors })\n}\n","/**\n * The one theme editor, shared by every surface. `variant=\"panel\"` is the roomy\n * back-office layout (grouped token cards + a live preview); `variant=\"drawer\"`\n * is the compact slide-over beside the studio canvas. Both drive the same\n * {@link ThemeBundle} store, so there is a single token model, preset list and\n * apply path. Firm-agnostic: chrome uses only universal surface tokens and the\n * preview renders the theme's own swatches, so it needs no brand-specific\n * component variants.\n */\nimport { useEffect, useState } from 'react'\nimport { RotateCcw, Palette, Save, Check } from 'lucide-react'\nimport { Card, CardHeader, CardTitle, CardContent, Input } from '@arbidocs/react'\nimport { applyThemeVars } from './tokens'\nimport type { ThemeBundle } from './store'\n\nexport interface ThemeEditorProps {\n /** The firm's theme store bundle (from createThemeStore). */\n bundle: ThemeBundle\n variant?: 'panel' | 'drawer'\n /** Firm identity shown in the panel's live-preview header. */\n preview?: { title: string; subtitle?: string }\n /** Optional persistence side-channel (e.g. save theme to ARBI); returns a \"via\" label. */\n onSave?: () => Promise<string | void>\n /** Stable testid namespace, e.g. \"builder-theme\" | \"studio-theme\". */\n testIdPrefix?: string\n}\n\nexport function ThemeEditor({\n bundle,\n variant = 'panel',\n preview,\n onSave,\n testIdPrefix = 'theme',\n}: ThemeEditorProps) {\n const { useStore, tokens, presets, groupLabels, mode, darkColors } = bundle\n const colors = useStore((s) => s.colors)\n const fonts = useStore((s) => s.fonts)\n const radius = useStore((s) => s.radius)\n const activePresetId = useStore((s) => s.activePresetId)\n const setColor = useStore((s) => s.setColor)\n const setFont = useStore((s) => s.setFont)\n const setRadius = useStore((s) => s.setRadius)\n const applyPreset = useStore((s) => s.applyPreset)\n const reset = useStore((s) => s.reset)\n\n const [saving, setSaving] = useState(false)\n const [savedVia, setSavedVia] = useState<string | null>(null)\n\n // Live preview: reflect every token change onto the running app, using the\n // firm's emit mode (flat inline vars, or injected HSL-triplet cssVars).\n useEffect(() => {\n applyThemeVars({ colors, fonts, radius }, { mode, dark: darkColors })\n }, [colors, fonts, radius, mode, darkColors])\n\n const tid = (suffix: string) => `${testIdPrefix}-${suffix}`\n const groups = [...new Set(tokens.map((t) => t.group))]\n\n const save = async () => {\n if (!onSave) return\n setSaving(true)\n const via = await onSave()\n setSavedVia(typeof via === 'string' ? via : 'saved')\n setSaving(false)\n }\n\n // ── Presets row ────────────────────────────────────────────────────────────\n const Presets = (\n <div className=\"flex flex-wrap items-center gap-2\">\n {presets.map((p) => (\n <button\n key={p.id}\n type=\"button\"\n onClick={() => applyPreset(p.id)}\n className={`rounded-full border px-3 py-1 text-xs font-medium transition-colors ${\n activePresetId === p.id\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-border text-foreground hover:border-primary'\n }`}\n data-testid={tid(`preset-${p.id}`)}\n >\n {p.label}\n </button>\n ))}\n <button\n type=\"button\"\n onClick={reset}\n className=\"ml-auto inline-flex items-center gap-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n data-testid={tid('reset')}\n >\n <RotateCcw className=\"size-3\" /> Reset\n </button>\n </div>\n )\n\n // ── A single colour control ─────────────────────────────────────────────────\n // A plain function (not a component) so it inlines into the parent tree: this\n // avoids remounting the inputs on every keystroke (which would drop focus).\n const colorRow = (k: string, label: string) => (\n <div key={k} className=\"flex items-center gap-3\">\n <input\n type=\"color\"\n value={colors[k] ?? '#000000'}\n onChange={(e) => setColor(k, e.target.value)}\n className=\"size-9 shrink-0 cursor-pointer rounded-md border border-border bg-transparent\"\n aria-label={label}\n data-testid={tid(`color-${k}`)}\n />\n <div className=\"min-w-0 flex-1\">\n <span className=\"block text-xs text-muted-foreground\">{label}</span>\n <Input\n value={colors[k] ?? ''}\n onChange={(e) => setColor(k, e.target.value)}\n className=\"bg-card placeholder:text-muted-foreground/70 focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring/50 h-7 font-mono text-xs\"\n data-testid={tid(`hex-${k}`)}\n />\n </div>\n </div>\n )\n\n // ── Typography + radius ─────────────────────────────────────────────────────\n const Typography = (\n <div className=\"space-y-4\">\n <div>\n <span className=\"block text-xs text-muted-foreground\">Display font stack</span>\n <Input\n value={fonts.display}\n onChange={(e) => setFont('display', e.target.value)}\n className=\"bg-card placeholder:text-muted-foreground/70 focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring/50 mt-1 font-mono text-xs\"\n data-testid={tid('font-display')}\n />\n </div>\n <div>\n <span className=\"block text-xs text-muted-foreground\">Body font stack</span>\n <Input\n value={fonts.sans}\n onChange={(e) => setFont('sans', e.target.value)}\n className=\"bg-card placeholder:text-muted-foreground/70 focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring/50 mt-1 font-mono text-xs\"\n data-testid={tid('font-sans')}\n />\n </div>\n <div>\n <span className=\"block text-xs text-muted-foreground\">Base radius — {radius}rem</span>\n <input\n type=\"range\"\n min={0}\n max={1.5}\n step={0.125}\n value={radius}\n onChange={(e) => setRadius(Number(e.target.value))}\n className=\"mt-2 w-full accent-[color:var(--color-primary)]\"\n data-testid={tid('radius')}\n />\n </div>\n </div>\n )\n\n // ── Live preview (panel only) — renders the theme's own swatches ────────────\n const Preview = (\n <Card variant=\"elevated\" className=\"rounded-xl\" data-testid={tid('preview')}>\n <CardHeader>\n <CardTitle className=\"text-base\">Live preview</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <div className=\"rounded-[var(--radius)] bg-primary p-4 text-primary-foreground\">\n <p className=\"font-display text-lg font-semibold\">{preview?.title ?? 'Preview'}</p>\n {preview?.subtitle && <p className=\"text-xs opacity-80\">{preview.subtitle}</p>}\n </div>\n <div className=\"grid grid-cols-6 gap-1.5\">\n {tokens.map((t) => (\n <div\n key={t.key}\n title={t.label}\n className=\"aspect-square rounded-md border border-border\"\n style={{ background: `var(--color-${t.key})` }}\n />\n ))}\n </div>\n <div className=\"rounded-[var(--radius)] border border-border bg-[color:var(--color-ai-accent-soft,var(--color-accent))] p-3\">\n <p className=\"text-sm font-medium text-[color:var(--color-ai-accent,var(--color-primary))]\">\n AI action surface\n </p>\n <p className=\"text-xs text-muted-foreground\">Themed by the AI-kit accent tokens.</p>\n </div>\n </CardContent>\n </Card>\n )\n\n const SaveBar = onSave && (\n <div className=\"mt-6 flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => void save()}\n disabled={saving}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:opacity-90 disabled:opacity-60\"\n data-testid={tid('save')}\n >\n {savedVia ? <Check className=\"size-4\" /> : <Save className=\"size-4\" />}\n {saving ? 'Saving…' : savedVia ? 'Saved' : 'Save theme'}\n </button>\n {savedVia && (\n <span className=\"text-xs text-muted-foreground\" data-testid={tid('via')}>\n stored via {savedVia}\n </span>\n )}\n </div>\n )\n\n // ── Drawer layout — compact, single column ──────────────────────────────────\n if (variant === 'drawer') {\n return (\n <div className=\"flex h-full flex-col overflow-y-auto bg-card p-5\" data-testid={testIdPrefix}>\n <div className=\"mb-4 flex items-center justify-between\">\n <h2 className=\"font-display text-lg font-semibold text-foreground\">Theme</h2>\n </div>\n {Presets}\n <p className=\"mt-5 mb-2 text-[10px] font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n Colours\n </p>\n <div className=\"space-y-3\">{tokens.map((t) => colorRow(t.key, t.label))}</div>\n <p className=\"mt-6 mb-2 text-[10px] font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n Typography & shape\n </p>\n {Typography}\n {SaveBar}\n </div>\n )\n }\n\n // ── Panel layout — grouped cards + live preview ─────────────────────────────\n return (\n <div className=\"grid gap-6 lg:grid-cols-[1fr_320px]\" data-testid={testIdPrefix}>\n <div className=\"space-y-6\">\n <Card variant=\"elevated\" className=\"rounded-xl\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Palette className=\"size-4 text-[color:var(--color-primary)]\" /> Presets\n </CardTitle>\n </CardHeader>\n <CardContent>{Presets}</CardContent>\n </Card>\n\n {groups.map((group) => (\n <Card\n key={group}\n variant=\"elevated\"\n className=\"rounded-xl\"\n data-testid={tid(`group-${group}`)}\n >\n <CardHeader>\n <CardTitle className=\"text-base\">{groupLabels[group] ?? group}</CardTitle>\n </CardHeader>\n <CardContent className=\"grid gap-3 sm:grid-cols-2\">\n {tokens.filter((t) => t.group === group).map((t) => colorRow(t.key, t.label))}\n </CardContent>\n </Card>\n ))}\n\n <Card variant=\"elevated\" className=\"rounded-xl\">\n <CardHeader>\n <CardTitle className=\"text-base\">Typography & shape</CardTitle>\n </CardHeader>\n <CardContent>{Typography}</CardContent>\n </Card>\n {SaveBar}\n </div>\n\n <div className=\"lg:sticky lg:top-4 lg:self-start\">{Preview}</div>\n </div>\n )\n}\n","/**\n * The demo/live connection layer for a firm app. Holds auth + workspace\n * selection state and exposes it via {@link useConnection}, so every surface\n * works identically whether it's talking to a live ARBI backend or the seeded\n * demo firm. Firm-specific values (backend URL, demo identity, default\n * workspace/assistant ids) arrive once through {@link FirmArbiConfig}.\n */\nimport { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from 'react'\nimport { useArbi } from '@arbidocs/react'\nimport type { ArbiMode, ArbiUser, ConnectionStatus, FirmArbiConfig } from './types'\n\ninterface ConnectionValue {\n mode: ArbiMode\n status: ConnectionStatus\n user: ArbiUser | null\n workspaceId: string | null\n apiConfigured: boolean\n apiUrl: string\n error: string | null\n /** Default assistant config ext_id (for the AI hooks). */\n assistantConfig?: string\n /** Fallback workspace ext_id when none is actively selected. */\n fallbackWorkspaceId?: string\n /** Authenticate. Live login when a backend is configured, otherwise the demo firm. */\n login: (email: string, password: string) => Promise<void>\n /** One-click demo entry (no backend required). */\n enterDemo: () => void\n logout: () => void\n setWorkspace: (id: string) => void\n}\n\nconst ConnectionContext = createContext<ConnectionValue | null>(null)\n\nexport function ConnectionProvider({\n config,\n children,\n}: {\n config: FirmArbiConfig\n children: ReactNode\n}) {\n const arbi = useArbi()\n const isLiveConfigured = config.apiUrl.length > 0\n const demoWorkspaceId = config.demoWorkspaceId ?? 'demo-firm'\n\n const [status, setStatus] = useState<ConnectionStatus>('disconnected')\n const [user, setUser] = useState<ArbiUser | null>(null)\n const [workspaceId, setWorkspaceId] = useState<string | null>(null)\n const [mode, setMode] = useState<ArbiMode>('demo')\n const [error, setError] = useState<string | null>(null)\n\n const enterDemo = useCallback(() => {\n setMode('demo')\n setStatus('demo')\n setError(null)\n setUser({ name: config.demoUser.name, email: config.demoUser.email })\n setWorkspaceId(demoWorkspaceId)\n }, [config.demoUser.name, config.demoUser.email, demoWorkspaceId])\n\n const login = useCallback(\n async (email: string, password: string) => {\n setError(null)\n // No backend configured → run the seeded demo firm.\n if (!isLiveConfigured) {\n enterDemo()\n return\n }\n setStatus('connecting')\n setMode('live')\n try {\n await arbi.login(email, password)\n const workspaces = await arbi.workspaces.list()\n if (workspaces?.length) {\n // Prefer the configured matter workspace (there may be several — e.g.\n // a marketing/KM workspace) rather than whichever happens to be first.\n // Ternary (not `&&`) so an empty config value can't leak `\"\"` into `target`.\n const preferred = config.workspaceId\n const target =\n (preferred ? workspaces.find((w) => w.external_id === preferred) : undefined) ??\n workspaces[0]\n await arbi.selectWorkspace(target.external_id)\n setWorkspaceId(target.external_id)\n }\n setUser({ name: email.split('@')[0], email })\n setStatus('authenticated')\n } catch (e) {\n // Surface the real error — no silent fallback to a fake session.\n setError(e instanceof Error ? e.message : 'Sign-in failed. Check your credentials.')\n setStatus('error')\n }\n },\n [arbi, enterDemo, isLiveConfigured, config.workspaceId]\n )\n\n const logout = useCallback(() => {\n if (mode === 'live') {\n void arbi.logout?.()\n }\n setUser(null)\n setWorkspaceId(null)\n setStatus('disconnected')\n setError(null)\n }, [arbi, mode])\n\n const setWorkspace = useCallback((id: string) => setWorkspaceId(id), [])\n\n const value = useMemo<ConnectionValue>(\n () => ({\n mode,\n status,\n user,\n workspaceId,\n apiConfigured: isLiveConfigured,\n apiUrl: config.apiUrl,\n error,\n assistantConfig: config.assistantConfig,\n fallbackWorkspaceId: config.workspaceId,\n login,\n enterDemo,\n logout,\n setWorkspace,\n }),\n [\n mode,\n status,\n user,\n workspaceId,\n isLiveConfigured,\n config.apiUrl,\n config.assistantConfig,\n config.workspaceId,\n error,\n login,\n enterDemo,\n logout,\n setWorkspace,\n ]\n )\n\n return <ConnectionContext.Provider value={value}>{children}</ConnectionContext.Provider>\n}\n\nexport function useConnection(): ConnectionValue {\n const ctx = useContext(ConnectionContext)\n if (!ctx) throw new Error('useConnection must be used within ConnectionProvider')\n return ctx\n}\n\nexport const isAuthenticated = (s: ConnectionStatus) => s === 'demo' || s === 'authenticated'\n","/**\n * Composition root for a firm app on the ARBI React SDK.\n *\n * QueryClientProvider → react-query cache shared with the SDK\n * ArbiProvider → the SDK's Arbi instance (no network until login)\n * ConnectionProvider → demo/live auth + workspace layer\n *\n * With no live `apiUrl`, ArbiProvider is still mounted (cheap, inert) against\n * `demoApiUrl` and the app runs entirely in seeded demo mode.\n */\nimport { useState, type ReactNode } from 'react'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { ArbiProvider, ArbiWebSocketProvider } from '@arbidocs/react'\nimport { ConnectionProvider, useConnection } from './ConnectionProvider'\nimport type { FirmArbiConfig } from './types'\n\n/**\n * Opens the shared SDK WebSocket once the app is live-authenticated (demo /\n * logged-out sessions have no backend, so they stay disconnected). Lives inside\n * ConnectionProvider so it can read the live status.\n */\nfunction ConnectionBoundWebSocket({ children }: { children: ReactNode }) {\n const { status } = useConnection()\n return (\n <ArbiWebSocketProvider enabled={status === 'authenticated'}>{children}</ArbiWebSocketProvider>\n )\n}\n\nexport function LegalArbiProvider({\n config,\n children,\n}: {\n config: FirmArbiConfig\n children: ReactNode\n}) {\n const [queryClient] = useState(\n () =>\n new QueryClient({\n defaultOptions: { queries: { staleTime: 30_000, retry: 1, refetchOnWindowFocus: false } },\n })\n )\n\n const providerUrl = config.apiUrl || config.demoApiUrl || 'https://demo.arbi.local'\n\n return (\n <QueryClientProvider client={queryClient}>\n <ArbiProvider url={providerUrl}>\n <ConnectionProvider config={config}>\n <ConnectionBoundWebSocket>{children}</ConnectionBoundWebSocket>\n </ConnectionProvider>\n </ArbiProvider>\n </QueryClientProvider>\n )\n}\n","/**\n * The firm agent hooks — thin adapters over the reusable AI kit in\n * `@arbidocs/react`. The streaming/accumulation/search plumbing lives once in\n * the SDK; these hooks only bind the *workspace source* (from the connection\n * context, falling back to the configured workspace) and inject the firm's\n * default assistant *configuration* so call sites needn't know the config\n * ext_id. An explicit `opts.model` still wins.\n */\nimport { useCallback } from 'react'\nimport {\n useAiTask as useKitAiTask,\n useWorkspaceDocs as useKitWorkspaceDocs,\n useSemanticSearch as useKitSemanticSearch,\n type AiRunOptions,\n} from '@arbidocs/react'\nimport { useConnection } from './ConnectionProvider'\n\nexport type { AiTaskStatus, AiRunOptions, SearchChunk, ArtifactEvent } from '@arbidocs/react'\n\n/** Client-side redlining, re-exported so a firm app has one import surface. */\nexport { toRedlineMarkdown, redlineStats, textToArtifact } from '@arbidocs/react'\n\n/**\n * The kit's `useAiTask` with the firm's default assistant configuration\n * injected, so call sites needn't know the config ext_id.\n */\nexport function useFirmAiTask() {\n const { assistantConfig } = useConnection()\n const task = useKitAiTask()\n const kitRun = task.run\n const run = useCallback(\n (question: string, docIds: string[], opts?: AiRunOptions) =>\n kitRun(question, docIds, { ...opts, model: opts?.model ?? assistantConfig }),\n [kitRun, assistantConfig]\n )\n return { ...task, run }\n}\n\n/** Resolve the active workspace + its document ids (what we ground the agent on). */\nexport function useWorkspaceDocs() {\n const { workspaceId, fallbackWorkspaceId } = useConnection()\n return useKitWorkspaceDocs(workspaceId ?? fallbackWorkspaceId)\n}\n\n/** Search the active workspace's documents and return the top matching passages. */\nexport function useSemanticSearch() {\n const { docIds } = useWorkspaceDocs()\n return useKitSemanticSearch(docIds)\n}\n","/**\n * Compose a stable, kebab-case data-testid from parts.\n * Convention: {area}-{element}[-{qualifier}...]\n * tid(\"matters\", \"row\", \"CLM-2026-0042\") -> \"matters-row-clm-2026-0042\"\n * Keeps Playwright selectors predictable across a firm app.\n */\nexport function tid(...parts: Array<string | number | undefined | false>): string {\n return parts\n .filter((p): p is string | number => p !== undefined && p !== false && p !== '')\n .map((p) =>\n String(p)\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n )\n .join('-')\n}\n","/**\n * Firm-app formatting helpers — currency, initials, dates, durations and\n * percentages. UK-oriented defaults (en-GB / GBP / \"d MMM yyyy\") suit an English\n * law firm; nothing here is firm-branded, so every firm app shares them.\n *\n * Dependency-free on purpose (uses the platform `Intl` APIs) so the package\n * stays light and needs no date library.\n */\n\n/** Format a number as GBP, e.g. £1,240,000 or £12.4k depending on `compact`. */\nexport function gbp(value: number, compact = false): string {\n return new Intl.NumberFormat('en-GB', {\n style: 'currency',\n currency: 'GBP',\n maximumFractionDigits: compact && Math.abs(value) >= 1000 ? 1 : 0,\n notation: compact ? 'compact' : 'standard',\n }).format(value)\n}\n\n/** Initials from a person's name, e.g. \"Amara N. Okafor\" -> \"AO\". */\nexport function initials(name: string): string {\n const parts = name.trim().split(/\\s+/)\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase()\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase()\n}\n\n/**\n * Parse an ISO string. Date-only strings (\"2026-03-12\") are read as LOCAL\n * midnight (matching date-fns `parseISO`), not UTC, so day-level maths and\n * formatting don't drift across time zones.\n */\nfunction parseIso(iso: string): Date {\n const dateOnly = /^\\d{4}-\\d{2}-\\d{2}$/.test(iso)\n const d = new Date(dateOnly ? `${iso}T00:00:00` : iso)\n if (Number.isNaN(d.getTime())) throw new Error(`Invalid ISO date: ${iso}`)\n return d\n}\n\n/** \"12 Mar 2026\" */\nexport function fmtDate(iso: string): string {\n try {\n return new Intl.DateTimeFormat('en-GB', {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n }).format(parseIso(iso))\n } catch {\n return iso\n }\n}\n\n/** \"12 Mar 2026, 14:30\" */\nexport function fmtDateTime(iso: string): string {\n try {\n return new Intl.DateTimeFormat('en-GB', {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n }).format(parseIso(iso))\n } catch {\n return iso\n }\n}\n\nconst RELATIVE_UNITS: Array<[Intl.RelativeTimeFormatUnit, number]> = [\n ['year', 31_536_000],\n ['month', 2_592_000],\n ['week', 604_800],\n ['day', 86_400],\n ['hour', 3_600],\n ['minute', 60],\n ['second', 1],\n]\n\n/** \"3 days ago\" / \"in 2 hours\" — largest whole unit, like date-fns strict. */\nexport function fromNow(iso: string, from: Date = new Date()): string {\n try {\n const diffSeconds = (parseIso(iso).getTime() - from.getTime()) / 1000\n const abs = Math.abs(diffSeconds)\n const rtf = new Intl.RelativeTimeFormat('en-GB', { numeric: 'always' })\n for (const [unit, secs] of RELATIVE_UNITS) {\n if (abs >= secs || unit === 'second') {\n const value = Math.round(diffSeconds / secs)\n return rtf.format(value, unit)\n }\n }\n return rtf.format(0, 'second')\n } catch {\n return iso\n }\n}\n\n/** Signed day count to a date from a reference day. Negative = overdue. */\nexport function daysUntil(iso: string, from: Date = new Date()): number {\n try {\n const target = parseIso(iso)\n // Compare calendar days at local midnight, ignoring time-of-day.\n const a = Date.UTC(target.getFullYear(), target.getMonth(), target.getDate())\n const b = Date.UTC(from.getFullYear(), from.getMonth(), from.getDate())\n return Math.round((a - b) / 86_400_000)\n } catch {\n return 0\n }\n}\n\n/** Compact hours, e.g. 12.5h */\nexport function hrs(n: number): string {\n return `${n.toFixed(1)}h`\n}\n\n/** Percentage with no decimals, e.g. 82% */\nexport function pct(n: number): string {\n return `${Math.round(n)}%`\n}\n","import type { LucideIcon } from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react'\n\n/** Centered placeholder for empty lists/panels: icon + title + description + action. */\nexport function EmptyState({\n icon: Icon,\n title,\n description,\n action,\n className,\n testId,\n}: {\n icon?: LucideIcon\n title: string\n description?: string\n action?: ReactNode\n className?: string\n testId?: string\n}) {\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center rounded-xl border border-dashed border-border bg-muted/30 px-6 py-12 text-center',\n className\n )}\n data-testid={testId}\n >\n {Icon && (\n <div className=\"mb-3 flex size-11 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n <Icon className=\"size-5\" />\n </div>\n )}\n <p className=\"font-display text-base font-semibold text-foreground\">{title}</p>\n {description && <p className=\"mt-1 max-w-sm text-sm text-muted-foreground\">{description}</p>}\n {action && <div className=\"mt-4\">{action}</div>}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@arbidocs/react'\nimport { tid } from '../lib/testid'\nimport { EmptyState } from './EmptyState'\n\nexport interface Column<T> {\n key: string\n header: ReactNode\n render: (row: T) => ReactNode\n align?: 'left' | 'right' | 'center'\n className?: string\n headClassName?: string\n}\n\ninterface DataTableProps<T> {\n columns: Column<T>[]\n rows: T[]\n getRowId: (row: T) => string\n onRowClick?: (row: T) => void\n /** testid area prefix, e.g. \"matters\" -> rows get \"matters-row-{id}\" */\n area: string\n emptyTitle?: string\n emptyDescription?: string\n className?: string\n}\n\nconst alignClass = { left: 'text-left', right: 'text-right', center: 'text-center' } as const\n\n/** The one true table. Column-config driven, fully test-id'd, optional row navigation. */\nexport function DataTable<T>({\n columns,\n rows,\n getRowId,\n onRowClick,\n area,\n emptyTitle = 'Nothing to show',\n emptyDescription,\n className,\n}: DataTableProps<T>) {\n if (rows.length === 0) {\n return (\n <EmptyState title={emptyTitle} description={emptyDescription} testId={tid(area, 'empty')} />\n )\n }\n return (\n <div className={cn('rounded-xl border border-border bg-card', className)}>\n <Table data-testid={tid(area, 'table')}>\n <TableHeader>\n <TableRow className=\"hover:bg-transparent\">\n {columns.map((c) => (\n <TableHead\n key={c.key}\n className={cn(c.align && alignClass[c.align], c.headClassName)}\n >\n {c.header}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((row) => {\n const id = getRowId(row)\n return (\n <TableRow\n key={id}\n data-testid={tid(area, 'row', id)}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={cn(onRowClick && 'cursor-pointer')}\n >\n {columns.map((c) => (\n <TableCell\n key={c.key}\n className={cn(c.align && alignClass[c.align], c.className)}\n >\n {c.render(row)}\n </TableCell>\n ))}\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n </div>\n )\n}\n","/**\n * A **serializable** data table for the Puck builder.\n *\n * The library's developer-facing {@link DataTable} is driven by `Column<T>` whose\n * `header`/`render` are React nodes and functions — powerful, but non-serializable,\n * so it can never be a Puck block. `DataTableBlock` closes that gap with a flat,\n * JSON-safe schema (string headers, string field keys, string cells) and rebuilds\n * the non-serializable `Column<Row>[]` internally, rendering through the very same\n * {@link DataTable} so it inherits the library's markup and tokens verbatim.\n */\nimport { DataTable, type Column } from './DataTable'\n\nexport interface DataTableBlockColumn {\n /** Column heading text. */\n header: string\n /** Key used to look a cell up in each row record. */\n field: string\n /** Cell/heading alignment. */\n align?: 'left' | 'right' | 'center'\n}\n\nexport interface DataTableBlockProps {\n /** Serializable column schema. */\n columns: DataTableBlockColumn[]\n /** One record per row; cells are looked up by each column's `field`. */\n rows: Array<Record<string, string>>\n /** Optional caption rendered above the table. */\n caption?: string\n /** Empty-state title shown when there are no rows. */\n emptyText?: string\n /** testid area prefix; also set on the wrapper element. */\n testId?: string\n}\n\n/** A row wrapper so {@link DataTable} gets a stable id without polluting the record. */\ninterface TableRowData {\n __id: string\n cells: Record<string, string>\n}\n\n/**\n * Renders a {@link DataTable} from a flat, serializable schema. Columns are mapped\n * to `Column<TableRowData>[]` (header string, positional-stable key, alignment) and\n * each cell is resolved by `field`; rows carry a synthetic id for React keys/testids.\n */\nexport function DataTableBlock({ columns, rows, caption, emptyText, testId }: DataTableBlockProps) {\n const area = testId ?? 'data-table-block'\n\n const tableColumns: Column<TableRowData>[] = columns.map((col, index) => ({\n key: col.field || `col-${index}`,\n header: col.header,\n align: col.align,\n render: (row) => row.cells[col.field] ?? '',\n }))\n\n const tableRows: TableRowData[] = rows.map((cells, index) => ({ __id: String(index), cells }))\n\n return (\n <div data-testid={testId}>\n {caption ? (\n <p\n className=\"mb-2 text-sm text-muted-foreground\"\n data-testid={testId ? `${testId}-caption` : undefined}\n >\n {caption}\n </p>\n ) : null}\n <DataTable\n columns={tableColumns}\n rows={tableRows}\n getRowId={(row) => row.__id}\n area={area}\n emptyTitle={emptyText}\n />\n </div>\n )\n}\n","/**\n * GridView — a flexible AG Grid presentational core.\n *\n * Pure and app-agnostic: it owns no global state and pulls in no store. Column\n * state persistence (order / width / visibility / sort / filter) is exposed as a\n * controlled/uncontrolled prop pair — `gridState` (initial state, read once at\n * mount) and `onGridStateChange` (called whenever AG Grid's state changes). An\n * app wires those to wherever it keeps the state (Zustand, localStorage, a URL,\n * a server) via a thin adapter; the core stays decoupled.\n *\n * Themed entirely via CSS variables (see the sibling `grid.css`, which a\n * consuming app imports globally), so it inherits the host's light/dark theme.\n */\n\nimport React, { useRef, useCallback, useMemo, useEffect } from 'react'\nimport { AgGridReact } from 'ag-grid-react'\nimport {\n ColDef,\n GridOptions,\n GridApi,\n GridState,\n themeQuartz,\n CellValueChangedEvent,\n GridReadyEvent,\n RowClickedEvent,\n} from 'ag-grid-community'\nimport { AllCommunityModule } from 'ag-grid-community'\n\n// Create the custom ARBI theme using themeQuartz\n// Colors are defined via CSS variables in the sibling grid.css\n// This enables dark mode support and consistent theming\nconst arbiTheme = themeQuartz.withParams({\n // Font settings\n fontFamily: {\n googleFont: 'Nunito',\n },\n fontSize: 14,\n headerFontSize: 13,\n headerFontWeight: 600,\n\n // Sizing\n headerHeight: 44,\n rowHeight: 40,\n cellHorizontalPadding: 16,\n\n // Borders - structural settings only.\n // Row border is a real hairline in the theme border colour (not hardcoded\n // white, which was invisible on the light-mode background and wrong in dark\n // mode) so adjacent rows are clearly separated — important now that rows can\n // be tall and multi-line (e.g. the Abstract column).\n rowBorder: { style: 'solid', width: 1, color: 'hsl(var(--border))' },\n columnBorder: false, // No column borders - using CSS dividers instead\n wrapperBorder: false,\n\n // No rounded corners for clean look (except checkboxes)\n borderRadius: 0,\n wrapperBorderRadius: 0,\n checkboxBorderRadius: 2, // Keep checkboxes square\n})\n\n// Selection configuration\nexport interface GridViewSelection<T> {\n mode: 'single' | 'multiple'\n selected: T[]\n onSelectionChange: (items: T[]) => void\n}\n\n// Empty state configuration\nexport interface GridViewEmptyState {\n icon?: React.ReactNode\n title?: string\n message?: string\n action?: React.ReactNode\n}\n\n// Generic props to make this grid reusable with different data types\nexport interface GridViewProps<T> {\n // Core data\n items: T[]\n // Column configuration\n columnDefs: ColDef<T>[]\n // Row identity function\n getItemId: (item: T) => string\n // Selection handling\n selection?: GridViewSelection<T>\n // Empty state\n emptyState?: GridViewEmptyState\n // Loading state\n isLoading?: boolean\n loadingMessage?: string\n // Grid options\n gridOptions?: Partial<GridOptions<T>>\n // Grid initialization\n onGridReady?: (params: { api: GridApi<T> }) => void\n // Cell value changes\n onCellValueChanged?: (event: CellValueChangedEvent<T>) => void\n // Row click handler\n onRowClick?: (item: T) => void\n // State persistence.\n // The core is decoupled from any store: when `persistState` is on it seeds\n // AG Grid from `gridState` (read once at mount) and reports every subsequent\n // state change through `onGridStateChange`. An app-adapter wires these to its\n // own store. `gridId` is retained as an opaque identity hint for adapters\n // (the core itself does not read it).\n persistState?: boolean\n gridId?: string\n // Persisted column/sort/filter state to restore at mount (controlled input).\n gridState?: GridState\n // Called whenever AG Grid's state changes so an adapter can persist it.\n onGridStateChange?: (state: GridState) => void\n // Initial visible columns (applied when no saved state exists)\n initialVisibleColumns?: string[]\n // Basic styling\n className?: string\n height?: string | number\n // Per-instance row height. Applied via the theme (not just gridOptions) so the\n // theme's calculated line-height tracks it and cell content stays vertically\n // centered. Fixed height — keeps row virtualization on the fast path.\n rowHeight?: number\n testId?: string\n // Pinned rows\n pinnedBottomRowData?: T[]\n pinnedTopRowData?: T[]\n // Pagination (disabled by default)\n pagination?: boolean\n paginationPageSizeSelector?: number[]\n // Force empty-state UI even when items.length > 0.\n // Used when rows are present but all hidden by an external filter.\n showEmpty?: boolean\n}\n\nexport function GridView<T>({\n items,\n columnDefs,\n getItemId,\n selection,\n emptyState,\n isLoading = false,\n loadingMessage = 'Loading...',\n gridOptions,\n onGridReady,\n onCellValueChanged,\n onRowClick,\n persistState = false,\n gridState,\n onGridStateChange,\n initialVisibleColumns,\n className = 'w-full',\n height = 500,\n rowHeight,\n testId = 'grid-view',\n pinnedBottomRowData,\n pinnedTopRowData,\n pagination = false,\n paginationPageSizeSelector,\n showEmpty,\n}: GridViewProps<T>) {\n // Reference to the grid API\n const gridApiRef = useRef<GridApi<T> | null>(null)\n\n // Initial row height, captured once so it can live in the (stable) default\n // grid options. rowHeight is NOT passed as a reactive prop — that would make\n // the AgGridReact wrapper re-process grid options on every change and snap\n // manually-resized columns back to their colDef widths. Subsequent changes are\n // applied imperatively (see effect below).\n const initialRowHeightRef = useRef(rowHeight)\n\n // Persisted state to seed the grid with — captured once at mount so a reactive\n // `gridState` prop (e.g. an adapter re-reading its store each render) can never\n // re-initialise the grid mid-session. Mirrors AG Grid's own initialState,\n // which is read once.\n const initialGridStateRef = useRef(gridState)\n\n // Get initial state for the grid (read once at mount)\n const initialState = useMemo(() => {\n if (!persistState) return undefined\n return initialGridStateRef.current\n }, [persistState])\n\n // Save grid state via the adapter using modern AG Grid state API\n const saveGridState = useCallback(() => {\n if (!persistState || !onGridStateChange || !gridApiRef.current) return\n\n // Use AG Grid's comprehensive state API to capture complete state\n // This includes: filters, sort, column order, column visibility, column widths, etc.\n const state = gridApiRef.current.getState()\n\n onGridStateChange(state)\n }, [persistState, onGridStateChange])\n\n // Ensure selection column is visible after grid initialization\n const ensureSelectionColumnVisible = useCallback(() => {\n if (!gridApiRef.current || !selection?.mode) return\n\n // IMPORTANT: Force selection column to be visible after state restoration\n // This ensures even old saved states don't hide the selection column\n // Also handles case where selection column is completely missing from state\n const currentState = gridApiRef.current.getColumnState()\n const selectionColumn = currentState.find((col) => col.colId === 'ag-Grid-SelectionColumn')\n const selectionColumnIndex = currentState.findIndex(\n (col) => col.colId === 'ag-Grid-SelectionColumn'\n )\n\n // Fix if column is hidden OR missing entirely OR not in first position\n if (!selectionColumn || selectionColumn.hide || selectionColumnIndex !== 0) {\n // Use setColumnsVisible for more reliable visibility control\n gridApiRef.current.setColumnsVisible(['ag-Grid-SelectionColumn'], true)\n\n // Also apply state to ensure proper width\n gridApiRef.current.applyColumnState({\n state: [\n {\n colId: 'ag-Grid-SelectionColumn',\n hide: false,\n width: selectionColumn?.width || 48,\n pinned: null, // Ensure not pinned in wrong position\n },\n ],\n defaultState: { hide: undefined },\n applyOrder: false,\n })\n\n // Move selection column to first position if it's not there\n if (selectionColumnIndex !== 0) {\n gridApiRef.current.moveColumns(['ag-Grid-SelectionColumn'], 0)\n }\n }\n }, [selection?.mode])\n\n // Handle row ID\n const getRowId = useCallback(\n (params: { data: T }) => {\n return getItemId(params.data)\n },\n [getItemId]\n )\n\n // Refs for selection — avoids handleGridReady/handleSelectionChanged recreating\n // when selection object changes (which happens on every selectionConfig recompute)\n const selectionRef = useRef(selection)\n selectionRef.current = selection\n\n const onSelectionChangeRef = useRef(selection?.onSelectionChange)\n onSelectionChangeRef.current = selection?.onSelectionChange\n\n const handleSelectionChanged = useCallback(() => {\n if (!onSelectionChangeRef.current || !gridApiRef.current) return\n\n const selectedNodes = gridApiRef.current.getSelectedNodes()\n const selectedData = selectedNodes\n .map((node) => node.data)\n .filter((item): item is T => item !== undefined)\n\n onSelectionChangeRef.current(selectedData)\n }, [])\n\n // Handle row clicks\n const handleRowClicked = useCallback(\n (event: RowClickedEvent<T>) => {\n if (!onRowClick || !event.data) return\n // Don't fire when the click originated from an interactive element inside the cell\n // (e.g. action buttons). AG Grid fires rowClicked regardless of DOM stopPropagation.\n const target = event.event?.target as HTMLElement | null\n if (target?.closest('button, input, a, select, textarea, [role=\"button\"]')) return\n onRowClick(event.data)\n },\n [onRowClick]\n )\n\n // Handle grid ready\n const handleGridReady = useCallback(\n (event: GridReadyEvent<T>) => {\n gridApiRef.current = event.api\n\n // Apply initial visible columns when no saved state exists\n // This prevents showing all columns by default for new users\n if (!initialState && initialVisibleColumns?.length) {\n const currentState = event.api.getColumnState()\n const stateMap = new Map(currentState.map((col) => [col.colId, col]))\n const visibleSet = new Set(initialVisibleColumns)\n\n // Build ordered state: selection column first (always visible), then visible columns, then hidden\n const selectionCol = stateMap.get('ag-Grid-SelectionColumn')\n const orderedState = [\n // Selection column first - ALWAYS visible, create if not in state\n selectionCol\n ? { ...selectionCol, hide: false }\n : { colId: 'ag-Grid-SelectionColumn', hide: false, width: 48 },\n // Visible columns in specified order\n ...initialVisibleColumns\n .filter((colId) => colId !== 'ag-Grid-SelectionColumn') // Don't duplicate selection column\n .map((colId) => {\n const col = stateMap.get(colId)\n return col ? { ...col, hide: false } : undefined\n }),\n // Hidden columns (everything else)\n ...currentState\n .filter((col) => col.colId !== 'ag-Grid-SelectionColumn' && !visibleSet.has(col.colId))\n .map((col) => ({ ...col, hide: true })),\n ].filter((col): col is NonNullable<typeof col> => col !== undefined)\n\n event.api.applyColumnState({ state: orderedState, applyOrder: true })\n }\n\n // When restoring persisted state, detect columns from columnDefs that\n // aren't in the saved state (e.g. newly added columns) and append them.\n // AG Grid's maintainColumnOrder adds them but may place them inconsistently;\n // this ensures they appear as hidden at the end so the navigator picks them up.\n if (initialState && initialVisibleColumns?.length) {\n const currentState = event.api.getColumnState()\n const savedColIds = new Set(\n initialState.columnOrder?.orderedColIds ?? currentState.map((c) => c.colId)\n )\n const newCols = currentState.filter(\n (col) => !savedColIds.has(col.colId) && col.colId !== 'ag-Grid-SelectionColumn'\n )\n if (newCols.length > 0) {\n // Make new columns visible if they're in the default visible set\n const defaultVisible = new Set(initialVisibleColumns)\n event.api.applyColumnState({\n state: newCols.map((col) => ({\n ...col,\n hide: !defaultVisible.has(col.colId),\n })),\n })\n }\n }\n\n // Ensure selection column is visible (in case saved state hides it)\n ensureSelectionColumnVisible()\n\n // Call the provided onGridReady callback\n if (onGridReady) {\n onGridReady({ api: event.api })\n }\n\n // Restore selection state if needed (read from ref to keep callback stable)\n const sel = selectionRef.current\n if (sel && sel.selected.length > 0) {\n const selectedIds = new Set(sel.selected.map(getItemId))\n event.api.forEachNode((node) => {\n if (node.data && selectedIds.has(getItemId(node.data))) {\n node.setSelected(true)\n }\n })\n }\n },\n [onGridReady, getItemId, ensureSelectionColumnVisible, initialState, initialVisibleColumns]\n )\n\n // Handle first data rendered - no auto-sizing, let flex columns handle it\n const handleFirstDataRendered = useCallback(() => {\n // Columns with flex will auto-fill, columns with width stay fixed\n // Also ensure selection column is visible as a backup (handles timing issues with initialState)\n ensureSelectionColumnVisible()\n }, [ensureSelectionColumnVisible])\n\n // Track when AG Grid processes row updates\n const handleModelUpdated = useCallback(() => {\n // AG Grid handles model updates internally\n }, [])\n\n // Track row data changes for AG Grid updates\n const prevItemsRef = useRef<T[]>([])\n useEffect(() => {\n prevItemsRef.current = items\n }, [items])\n\n // Handle state updates - save state when it changes (modern AG Grid approach)\n const handleStateUpdated = useCallback(() => {\n saveGridState()\n }, [saveGridState])\n\n // Removed problematic useEffect that caused unnecessary re-renders\n // AG Grid handles selection internally, only sync on initial load\n\n // Default grid options with minimal settings - memoized to prevent re-renders\n const defaultOptions: GridOptions<T> = useMemo(() => {\n return {\n // Initial row height (stable — captured once). Live changes go through the\n // imperative effect, not this option, to avoid column-state churn.\n rowHeight: initialRowHeightRef.current,\n suppressMenuHide: true, // Prevent hiding columns since we don't have enterprise sidebar\n maintainColumnOrder: true, // Preserve column order when columns are added/removed\n\n // Row virtualization: Render rows as needed for performance\n // rowBuffer renders extra rows above/below viewport for smoother scrolling\n rowBuffer: 10, // Render 10 extra rows above/below viewport for smooth scrolling\n suppressColumnVirtualisation: false, // Keep column virtualization enabled\n suppressRowVirtualisation: false, // ENABLE row virtualization - only render visible rows\n animateRows: false, // Disable row animations\n suppressColumnMoveAnimation: true, // Disable column move/resize animations\n\n // Efficient updates with React Query cache\n // getRowId enables change detection - grid only re-renders changed rows\n // Works perfectly with React Query's cache updates\n getRowId: getRowId,\n\n rowSelection: selection?.mode\n ? {\n mode: selection.mode === 'single' ? 'singleRow' : 'multiRow',\n selectAll: 'filtered', // Header checkbox selects all filtered rows (across all pages)\n // In multi-row mode, only checkboxes should toggle selection (clicking row body would replace selection)\n enableClickSelection: selection.mode === 'single',\n checkboxes: true,\n headerCheckbox: selection.mode === 'multiple',\n }\n : undefined,\n selectionColumnDef: selection?.mode\n ? {\n sortable: selection.mode === 'multiple',\n width: 48,\n lockVisible: true, // Cannot be hidden\n suppressMovable: true, // Cannot be moved\n }\n : undefined,\n // Use normal layout for better performance - autoHeight causes forced reflows\n domLayout: 'normal',\n // Stop editing when clicking outside the cell/grid\n stopEditingWhenCellsLoseFocus: true,\n // Additional performance optimizations\n suppressCellFocus: true, // Don't focus cells on click (faster)\n suppressRowHoverHighlight: true, // Disable hover highlight - reduces DOM manipulation during scroll\n suppressScrollOnNewData: true, // Don't scroll when data updates\n suppressAggFuncInHeader: true, // Don't show aggregation functions (faster)\n // Tooltip UX: the AG Grid default show-delay is 2 s which hurts\n // discoverability for cells where tooltips carry the \"reveal full\n // content\" affordance for non-editable users. 300 ms is snappy\n // without being accidental. tooltipInteraction lets users hover\n // onto the tooltip itself (e.g. to select / copy long text).\n // These are AG Grid's native tooltip controls — no React / Radix\n // provider involved, zero per-row cost; tooltip DOM is created on\n // demand when hover-delay elapses and destroyed on mouseout.\n tooltipShowDelay: 300,\n tooltipHideDelay: 4000,\n tooltipInteraction: true,\n // Pagination (disabled by default)\n pagination,\n paginationPageSizeSelector,\n defaultColDef: {\n sortable: true,\n resizable: true,\n unSortIcon: true, // Show unsort icon\n sortingOrder: ['asc', 'desc', null], // 3-way sorting: asc → desc → unsorted (AG Grid default)\n wrapText: false, // Disable text wrapping for cleaner display\n autoHeight: false, // Use fixed row height from theme\n wrapHeaderText: false, // Disable header text wrapping for cleaner look\n autoHeaderHeight: false, // Fixed header height\n filterParams: {\n maxNumConditions: 1,\n buttons: ['reset'],\n },\n },\n }\n }, [selection?.mode, getRowId, pagination, paginationPageSizeSelector])\n\n // Combine default options with passed options - memoized to prevent re-renders\n const combinedOptions = useMemo(\n () => ({ ...defaultOptions, ...gridOptions }),\n [defaultOptions, gridOptions]\n )\n\n // Apply fixed height for better performance — autoHeight causes forced\n // reflows by measuring all rows, avoid it.\n //\n // Also derive the geometry the wrapping Abstract column needs so its overflow\n // clip lands on a WHOLE-line boundary (never mid-line, which reads as a\n // half-line \"bleeding\" into the neighbouring row). All computed once here per\n // row-height change and handed to CSS as variables — zero per-row cost on the\n // million-row grid:\n // --abstract-pad-y : vertical cell padding, shrunk on very short rows so at\n // least one whole line always fits.\n // --abstract-max-h : cap of exactly N whole lines + padding + border, so the\n // clip is always on a line boundary.\n const containerStyle = useMemo(() => {\n const style: React.CSSProperties = { height }\n if (rowHeight) {\n const LINE_PX = 14 * 1.35 // grid font-size × abstract line-height (18.9px)\n const BORDER = 2 // abstract cell top + bottom border (1px each, border-box)\n const PREFERRED_PAD = 16 // preferred total vertical padding (8px top + 8px bottom)\n // Don't let padding eat the room a single line needs on short rows.\n const padTotal = Math.max(0, Math.min(PREFERRED_PAD, rowHeight - BORDER - LINE_PX))\n const lines = Math.max(1, Math.floor((rowHeight - BORDER - padTotal) / LINE_PX))\n const vars = style as Record<string, string | number>\n vars['--abstract-pad-y'] = `${padTotal / 2}px`\n vars['--abstract-max-h'] = `${lines * LINE_PX + padTotal + BORDER}px`\n }\n return style\n }, [height, rowHeight])\n\n // Apply rowHeight changes imperatively via the grid option (not the theme —\n // recreating the theme would re-initialise the grid). This only re-lays-out\n // rows; columns, row virtualization, and the transaction bus are untouched.\n useEffect(() => {\n const api = gridApiRef.current\n if (!api || api.isDestroyed() || !rowHeight) return\n api.setGridOption('rowHeight', rowHeight)\n api.resetRowHeights()\n }, [rowHeight])\n\n // Add professional shadow for 3D effect\n // Add overflow-visible only for autoHeight layout\n const containerClassName = useMemo(() => {\n const baseClass = className || ''\n const shadowClass = 'shadow-sm' // Tailwind shadow for professional look\n // Height-adjustable grids vertically center cell content (CSS) so a\n // one-line cell or a lone pill sits in the middle of the row, and multi-line\n // text (e.g. Abstract) is balanced top-to-bottom — flagged here, applied in\n // grid.css.\n const alignClass = rowHeight ? 'ag-cells-centered' : ''\n return [baseClass, shadowClass, alignClass].filter(Boolean).join(' ')\n }, [className, rowHeight])\n\n // Show loading state — grey skeleton rows so the page transition feels instant\n if (isLoading) {\n const skeletonRowCount = 12\n return (\n <div\n data-testid={`${testId}-loading`}\n className={containerClassName}\n style={containerStyle}\n aria-busy=\"true\"\n aria-label={loadingMessage}\n >\n {/* Header skeleton */}\n <div className=\"flex h-11 items-center gap-4 border-b border-border/40 px-4\">\n <div className=\"h-3 w-6 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-32 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-24 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-20 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-28 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-16 rounded bg-muted animate-pulse ml-auto\" />\n </div>\n {/* Row skeletons */}\n {Array.from({ length: skeletonRowCount }).map((_, rowIdx) => (\n <div key={rowIdx} className=\"flex h-10 items-center gap-4 border-b border-border/20 px-4\">\n <div className=\"h-4 w-4 rounded-sm bg-muted/70 animate-pulse\" />\n <div\n className=\"h-3 rounded bg-muted/70 animate-pulse\"\n style={{ width: `${20 + ((rowIdx * 17) % 40)}%` }}\n />\n <div\n className=\"h-3 rounded bg-muted/60 animate-pulse\"\n style={{ width: `${8 + ((rowIdx * 11) % 12)}%` }}\n />\n <div\n className=\"h-3 rounded bg-muted/60 animate-pulse\"\n style={{ width: `${6 + ((rowIdx * 7) % 10)}%` }}\n />\n <div\n className=\"h-3 rounded bg-muted/50 animate-pulse ml-auto\"\n style={{ width: `${5 + ((rowIdx * 5) % 8)}%` }}\n />\n </div>\n ))}\n </div>\n )\n }\n\n // Show empty state\n // showEmpty lets callers force this UI (e.g. when an external filter hid\n // every row but the underlying items array is non-empty).\n if ((showEmpty ?? items.length === 0) && emptyState) {\n return (\n <div\n data-testid={`${testId}-empty`}\n className=\"flex flex-col justify-center items-center h-96 text-center p-6\"\n >\n {emptyState.icon && <div className=\"text-muted-foreground/60 mb-4\">{emptyState.icon}</div>}\n {emptyState.title && <h3 className=\"text-xl font-medium mb-2\">{emptyState.title}</h3>}\n {emptyState.message && (\n <p className=\"text-muted-foreground mb-6 max-w-md\">{emptyState.message}</p>\n )}\n {emptyState.action}\n </div>\n )\n }\n\n return (\n <div className={containerClassName} style={containerStyle} data-testid={testId}>\n <AgGridReact\n theme={arbiTheme}\n modules={[AllCommunityModule]}\n columnDefs={columnDefs}\n rowData={items}\n pinnedBottomRowData={pinnedBottomRowData}\n pinnedTopRowData={pinnedTopRowData}\n getRowId={getRowId}\n initialState={initialState}\n onGridReady={handleGridReady}\n onFirstDataRendered={handleFirstDataRendered}\n onModelUpdated={handleModelUpdated}\n onSelectionChanged={handleSelectionChanged}\n onCellValueChanged={onCellValueChanged}\n onRowClicked={handleRowClicked}\n onStateUpdated={handleStateUpdated}\n {...combinedOptions}\n />\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react'\n\n/** Standard back-office page title block: eyebrow + title + description + actions. */\nexport function PageHeader({\n title,\n eyebrow,\n description,\n actions,\n className,\n testId,\n}: {\n title: string\n eyebrow?: string\n description?: string\n actions?: ReactNode\n className?: string\n testId?: string\n}) {\n return (\n <div\n className={cn('flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between', className)}\n data-testid={testId}\n >\n <div className=\"min-w-0\">\n {eyebrow && (\n <p className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {eyebrow}\n </p>\n )}\n <h1 className=\"font-display text-2xl font-semibold tracking-tight text-foreground\">\n {title}\n </h1>\n {description && (\n <p className=\"mt-1 max-w-2xl text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>}\n </div>\n )\n}\n","import { cn } from '@arbidocs/react'\n\n/** Editorial heading block for marketing sections: eyebrow + title + lead. */\nexport function SectionHeading({\n eyebrow,\n title,\n lead,\n align = 'left',\n className,\n invert,\n eyebrowClassName,\n}: {\n eyebrow?: string\n title: string\n lead?: string\n align?: 'left' | 'center'\n className?: string\n invert?: boolean\n /** Override the eyebrow styling (e.g. a firm brand accent). Default: token classes. */\n eyebrowClassName?: string\n}) {\n return (\n <div className={cn('max-w-3xl', align === 'center' && 'mx-auto text-center', className)}>\n {eyebrow && (\n <p\n className={cn(\n 'mb-3 text-xs font-semibold uppercase tracking-wider',\n eyebrowClassName ?? (invert ? 'text-background/60' : 'text-muted-foreground')\n )}\n >\n {eyebrow}\n </p>\n )}\n <h2\n className={cn(\n 'font-display text-3xl font-semibold tracking-tight text-balance sm:text-4xl',\n invert ? 'text-background' : 'text-foreground'\n )}\n >\n {title}\n </h2>\n {lead && (\n <p\n className={cn(\n 'mt-4 text-lg leading-relaxed',\n invert ? 'text-background/70' : 'text-muted-foreground'\n )}\n >\n {lead}\n </p>\n )}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Search } from 'lucide-react'\nimport { Input, cn } from '@arbidocs/react'\n\n/** Search + filter bar used above every list view. */\nexport function Toolbar({\n search,\n onSearch,\n searchPlaceholder = 'Search…',\n filters,\n actions,\n className,\n testId,\n}: {\n search?: string\n onSearch?: (v: string) => void\n searchPlaceholder?: string\n filters?: ReactNode\n actions?: ReactNode\n className?: string\n testId?: string\n}) {\n return (\n <div\n className={cn(\n 'flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between',\n className\n )}\n data-testid={testId}\n >\n <div className=\"flex flex-1 flex-wrap items-center gap-2\">\n {onSearch && (\n <div className=\"relative w-full max-w-xs\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(e) => onSearch(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"bg-card text-sm placeholder:text-muted-foreground/70 focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring/50 pl-8\"\n data-testid={testId ? `${testId}-search` : 'toolbar-search'}\n />\n </div>\n )}\n {filters}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n )\n}\n","import type { LucideIcon } from 'lucide-react'\nimport { ArrowDownRight, ArrowUpRight } from 'lucide-react'\nimport { Card, cn } from '@arbidocs/react'\n\nexport interface MetricCardProps {\n label: string\n value: string | number\n icon?: LucideIcon\n hint?: string\n delta?: { value: string; direction: 'up' | 'down'; good?: boolean }\n /**\n * Icon accent as a theme colour-token key (e.g. `primary`, `success`, or a\n * firm's own brand token). Resolved to `var(--color-<accent>)` at render, so\n * it themes with whatever firm consumes it. `'default'` inherits `foreground`.\n */\n accent?: string\n testId?: string\n}\n\n/** The one true KPI tile. Used across every dashboard and module header. */\nexport function MetricCard({\n label,\n value,\n icon: Icon,\n hint,\n delta,\n accent = 'default',\n testId,\n}: MetricCardProps) {\n const accentStyle =\n accent && accent !== 'default' ? { color: `var(--color-${accent})` } : undefined\n const deltaGood = delta?.good ?? delta?.direction === 'up'\n return (\n <Card variant=\"elevated\" className=\"card-hover rounded-xl p-5\" data-testid={testId}>\n <div className=\"flex items-start justify-between gap-3\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">{label}</p>\n {Icon && <Icon className=\"size-4 shrink-0\" style={accentStyle} />}\n </div>\n <p\n className=\"mt-2 font-display text-2xl font-semibold tracking-tight\"\n data-testid={testId && `${testId}-value`}\n >\n {value}\n </p>\n <div className=\"mt-1 flex items-center gap-2\">\n {delta && (\n <span\n className={cn(\n 'inline-flex items-center gap-0.5 text-xs font-medium',\n deltaGood ? 'text-success' : 'text-destructive'\n )}\n >\n {delta.direction === 'up' ? (\n <ArrowUpRight className=\"size-3\" />\n ) : (\n <ArrowDownRight className=\"size-3\" />\n )}\n {delta.value}\n </span>\n )}\n {hint && <span className=\"text-xs text-muted-foreground\">{hint}</span>}\n </div>\n </Card>\n )\n}\n","/**\n * Asset resolution for the editor canvas.\n *\n * An image block's stored `src` is one of three things: a **workspace asset ref**\n * while authoring (an `asset:<docId>` string), a plain URL, or — once published —\n * an inlined `data:` URI (see the studio publish/materialize step). Only inside\n * the authenticated Studio can an asset ref be resolved to displayable bytes (via\n * the thumbnail endpoint). So resolution is gated on a context flag that ONLY the\n * Studio sets: outside it (the pure coverage guard, the unauthenticated public\n * renderer) `src` is rendered verbatim and the React-Query thumbnail hook is\n * never mounted.\n *\n * Refs are **explicitly prefixed** (`asset:`) rather than bare ext_ids so the\n * publish walk can distinguish an image source from any other token-like prop\n * (block ids, `\"left\"`, icon names…) with zero false positives.\n */\nimport { createContext, useContext, useEffect, type ReactNode } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { useArbi, useThumbnails } from '@arbidocs/react'\n\n/** Marks a stored image value as a workspace asset ref rather than a URL. */\nexport const ASSET_REF_PREFIX = 'asset:'\n\n/** Wrap a workspace document ext_id as a storable asset ref. */\nexport function asAssetRef(docId: string): string {\n return `${ASSET_REF_PREFIX}${docId}`\n}\n\n/** The workspace document ext_id behind an asset ref (`asset:doc-1` → `doc-1`). */\nexport function assetRefId(src: string): string {\n return src.slice(ASSET_REF_PREFIX.length)\n}\n\n/** True only where a bare asset ext_id can be resolved (the authenticated Studio). */\nexport const AssetResolverContext = createContext<boolean>(false)\n\nexport function AssetResolverProvider({ children }: { children: ReactNode }) {\n return <AssetResolverContext.Provider value={true}>{children}</AssetResolverContext.Provider>\n}\n\nexport function useAssetResolverActive(): boolean {\n return useContext(AssetResolverContext)\n}\n\n/**\n * Is `src` a workspace asset ref (`asset:<docId>`) rather than an already-\n * renderable URL / `data:` URI? Only prefixed refs need resolution.\n */\nexport function isAssetRef(src: string | undefined): src is string {\n return !!src && src.startsWith(ASSET_REF_PREFIX)\n}\n\n/**\n * Resolve an asset ext_id to a displayable image src.\n *\n * Prefer the cheap thumbnail endpoint, but fall back to downloading the actual\n * bytes as an object URL when there's no thumbnail — AI-generated (and freshly\n * uploaded) images have no thumbnail yet, so the thumbnail-only path renders a\n * broken `<img>`. The bytes always exist (it's a stored document), so the editor\n * shows the real image immediately instead of waiting on async thumbnailing.\n */\nexport function useAssetImage(docId: string): string | undefined {\n const arbi = useArbi()\n const { data: thumbs } = useThumbnails([docId])\n const thumb = thumbs?.[docId]\n\n const { data: objectUrl } = useQuery({\n queryKey: ['arbi', 'asset-image', docId],\n queryFn: async () => {\n const res = await arbi.documents.download(docId)\n const blob = await res.blob()\n return URL.createObjectURL(blob)\n },\n // Only download when the thumbnail is genuinely absent (not merely loading).\n enabled: !!docId && thumbs != null && !thumb && arbi.hasWorkspace,\n staleTime: 10 * 60_000,\n })\n\n // Release the object URL when the doc changes / unmounts.\n useEffect(() => {\n return () => {\n if (objectUrl) URL.revokeObjectURL(objectUrl)\n }\n }, [objectUrl])\n\n return thumb ?? objectUrl\n}\n\n/** Resolve a single asset ext_id and render it as an <img>. */\nexport function AssetThumb({\n docId,\n alt,\n className,\n testId,\n}: {\n docId: string\n alt?: string\n className?: string\n testId?: string\n}) {\n const src = useAssetImage(docId)\n return <img src={src ?? undefined} alt={alt ?? ''} className={className} data-testid={testId} />\n}\n","import { ImageIcon } from 'lucide-react'\nimport { cn } from '@arbidocs/react'\nimport { AssetThumb, assetRefId, isAssetRef, useAssetResolverActive } from './assetResolver'\n\nexport type BlockImageAspect = '16:9' | '4:3' | '1:1' | '21:9' | '4:5'\nexport type BlockImageRounded = 'none' | 'md' | 'lg' | 'full'\n\nexport interface BlockImageProps {\n src?: string\n alt?: string\n aspect?: BlockImageAspect\n rounded?: BlockImageRounded\n /** Editorial \"photo frame\" treatment: a matte border ring + soft shadow. */\n framed?: boolean\n className?: string\n testId?: string\n}\n\nconst ASPECT: Record<BlockImageAspect, string> = {\n '16:9': 'aspect-video',\n '4:3': 'aspect-[4/3]',\n '1:1': 'aspect-square',\n '21:9': 'aspect-[21/9]',\n '4:5': 'aspect-[4/5]',\n}\n\nconst ROUNDED: Record<BlockImageRounded, string> = {\n none: 'rounded-none',\n md: 'rounded-md',\n lg: 'rounded-xl',\n full: 'rounded-full',\n}\n\n/**\n * Image with a graceful, self-contained fallback: when `src` is empty it renders a\n * token-clean gradient placeholder (no network needed) so the palette always looks\n * good in the editor and in demos. Token-only classes so it themes per firm.\n */\nexport function BlockImage({\n src,\n alt = '',\n aspect = '16:9',\n rounded = 'lg',\n framed,\n className,\n testId,\n}: BlockImageProps) {\n const shape = cn(\n ASPECT[aspect] ?? ASPECT['16:9'],\n ROUNDED[rounded] ?? ROUNDED.lg,\n framed && 'ring-1 ring-border shadow-xl'\n )\n const canResolve = useAssetResolverActive()\n // In the Studio, an `asset:` ref resolves to its thumbnail; elsewhere `src` is\n // already a URL / data-URI and renders verbatim (the publish step inlines refs).\n if (canResolve && isAssetRef(src)) {\n return (\n <AssetThumb\n docId={assetRefId(src)}\n alt={alt}\n className={cn('w-full object-cover', shape, className)}\n testId={testId}\n />\n )\n }\n if (src && !isAssetRef(src)) {\n return (\n <img\n src={src}\n alt={alt}\n className={cn('w-full object-cover', shape, className)}\n data-testid={testId}\n />\n )\n }\n return (\n <div\n className={cn(\n 'flex w-full items-center justify-center overflow-hidden border border-border',\n 'bg-gradient-to-br from-muted via-card to-accent text-muted-foreground',\n shape,\n className\n )}\n data-testid={testId}\n aria-label={alt || 'Image placeholder'}\n role=\"img\"\n >\n <ImageIcon className=\"size-8 opacity-60\" />\n </div>\n )\n}\n","import type { CSSProperties, ReactNode } from 'react'\nimport { ArrowRight } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react'\nimport { BlockImage } from './BlockImage'\n\nexport type HeroTone = 'default' | 'muted' | 'ink'\nexport type HeroAlign = 'left' | 'center'\n\nexport interface HeroCta {\n label?: string\n href?: string\n}\n\nexport interface HeroProps {\n eyebrow?: string\n title: string\n /** A word/phrase within the title to accent (rendered in the primary colour). */\n emphasis?: string\n subtitle?: string\n primaryCta?: HeroCta\n secondaryCta?: HeroCta\n align?: HeroAlign\n tone?: HeroTone\n /** Side visual (ignored when `backgroundImage` is set). */\n imageUrl?: string\n /** Full-bleed background image URL/data-URI. Turns the hero into a cover band. */\n backgroundImage?: string\n /** Darkening scrim over the background image, for legible copy. Default true. */\n overlay?: boolean\n /** Override the eyebrow styling (e.g. a firm brand accent). Default: token classes. */\n eyebrowClassName?: string\n testId?: string\n}\n\nconst TONE_SURFACE: Record<HeroTone, string> = {\n default: 'bg-background text-foreground',\n muted: 'bg-muted text-foreground',\n ink: 'bg-foreground text-background',\n}\n\n/** Highlight each occurrence of `emphasis` inside `title` with the accent colour. */\nfunction renderTitle(title: string, emphasis?: string): ReactNode {\n if (!emphasis || !title.includes(emphasis)) return title\n const parts = title.split(emphasis)\n return parts.map((part, i) => (\n <span key={i}>\n {part}\n {i < parts.length - 1 && <span className=\"text-primary\">{emphasis}</span>}\n </span>\n ))\n}\n\n/** Editorial marketing hero: eyebrow, headline, subtitle, two CTAs and a visual. */\nexport function Hero({\n eyebrow,\n title,\n emphasis,\n subtitle,\n primaryCta,\n secondaryCta,\n align = 'left',\n tone = 'default',\n imageUrl,\n backgroundImage,\n overlay = true,\n eyebrowClassName,\n testId,\n}: HeroProps) {\n // Over a background image the surface is dark, so copy reads on-background.\n const onDark = Boolean(backgroundImage) || tone === 'ink'\n const subtle = onDark ? 'text-background/70' : 'text-muted-foreground'\n const eyebrowClass = eyebrowClassName ?? (onDark ? 'text-background/60' : 'text-muted-foreground')\n const centered = align === 'center' || Boolean(backgroundImage)\n\n const heading = renderTitle(title, emphasis)\n\n const copy = (\n <div\n className={cn(\n 'max-w-2xl',\n centered && 'mx-auto text-center',\n backgroundImage && 'text-background'\n )}\n >\n {eyebrow && (\n <p className={cn('mb-4 text-sm font-semibold uppercase tracking-wider', eyebrowClass)}>\n {eyebrow}\n </p>\n )}\n <h1 className=\"text-4xl font-semibold tracking-tight text-balance sm:text-5xl\">{heading}</h1>\n {subtitle && <p className={cn('mt-6 text-lg leading-relaxed', subtle)}>{subtitle}</p>}\n {(primaryCta?.label || secondaryCta?.label) && (\n <div\n className={cn('mt-8 flex flex-col gap-3 sm:flex-row', centered && 'sm:justify-center')}\n >\n {primaryCta?.label && (\n <Button asChild size=\"lg\">\n <a href={primaryCta.href || '#'}>\n {primaryCta.label}\n <ArrowRight className=\"size-4\" />\n </a>\n </Button>\n )}\n {secondaryCta?.label && (\n <Button asChild size=\"lg\" variant=\"outline\">\n <a href={secondaryCta.href || '#'}>{secondaryCta.label}</a>\n </Button>\n )}\n </div>\n )}\n </div>\n )\n\n // Full-bleed cover hero: background image + optional scrim + centered copy.\n if (backgroundImage) {\n const bgStyle: CSSProperties = {\n backgroundImage: `url(\"${backgroundImage}\")`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }\n return (\n <section\n className=\"relative isolate overflow-hidden\"\n style={bgStyle}\n data-testid={testId}\n data-bg={testId && `${testId}-bg`}\n >\n {overlay && <div className=\"absolute inset-0 bg-black/55\" aria-hidden />}\n <div className=\"relative mx-auto max-w-7xl px-5 py-28 lg:px-8 lg:py-36\">{copy}</div>\n </section>\n )\n }\n\n return (\n <section className={cn(TONE_SURFACE[tone] ?? TONE_SURFACE.default)} data-testid={testId}>\n <div className=\"mx-auto max-w-7xl px-5 py-20 lg:px-8 lg:py-28\">\n {centered ? (\n <div className=\"flex flex-col items-center gap-12\">\n {copy}\n {imageUrl && (\n <BlockImage\n src={imageUrl}\n aspect=\"16:9\"\n rounded=\"lg\"\n className=\"w-full max-w-4xl\"\n testId={testId && `${testId}-image`}\n />\n )}\n </div>\n ) : (\n <div className=\"grid items-center gap-12 lg:grid-cols-2\">\n {copy}\n <BlockImage\n src={imageUrl}\n aspect=\"4:5\"\n rounded=\"lg\"\n testId={testId && `${testId}-image`}\n />\n </div>\n )}\n </div>\n </section>\n )\n}\n","import type { LucideIcon } from 'lucide-react'\nimport { Card, cn } from '@arbidocs/react'\n\nexport interface FeatureItem {\n icon?: LucideIcon\n title: string\n description?: string\n}\n\nexport interface FeatureGridProps {\n columns?: '2' | '3'\n items: FeatureItem[]\n testId?: string\n}\n\nconst COLS: Record<'2' | '3', string> = {\n '2': 'sm:grid-cols-2',\n '3': 'sm:grid-cols-2 lg:grid-cols-3',\n}\n\n/** Responsive grid of icon + title + description feature cards. */\nexport function FeatureGrid({ columns = '3', items, testId }: FeatureGridProps) {\n return (\n <div className={cn('grid gap-5', COLS[columns] ?? COLS['3'])} data-testid={testId}>\n {(items ?? []).map((item, i) => {\n const Icon = item.icon\n return (\n <Card\n key={i}\n variant=\"outline\"\n className=\"h-full p-6\"\n data-testid={testId && `${testId}-item-${i}`}\n >\n {Icon && (\n <span className=\"mb-4 inline-flex size-10 items-center justify-center rounded-lg bg-primary/10 text-primary\">\n <Icon className=\"size-5\" />\n </span>\n )}\n <h3 className=\"text-lg font-semibold tracking-tight\">{item.title}</h3>\n {item.description && (\n <p className=\"mt-2 text-sm leading-relaxed text-muted-foreground\">\n {item.description}\n </p>\n )}\n </Card>\n )\n })}\n </div>\n )\n}\n","import { cn } from '@arbidocs/react'\n\nexport interface StatItem {\n value: string\n label: string\n}\n\nexport interface StatGroupProps {\n items: StatItem[]\n testId?: string\n}\n\nconst GRID: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-2 sm:grid-cols-3',\n 4: 'grid-cols-2 lg:grid-cols-4',\n}\n\n/** Big-number stat group — headline metrics with captions. */\nexport function StatGroup({ items, testId }: StatGroupProps) {\n const list = items ?? []\n const cols = GRID[Math.min(list.length, 4)] ?? GRID[4]\n return (\n <dl className={cn('grid gap-8', cols)} data-testid={testId}>\n {list.map((item, i) => (\n <div key={i} className=\"text-center\" data-testid={testId && `${testId}-item-${i}`}>\n <dt className=\"sr-only\">{item.label}</dt>\n <dd className=\"text-4xl font-semibold tracking-tight sm:text-5xl\">{item.value}</dd>\n <p className=\"mt-2 text-sm text-muted-foreground\">{item.label}</p>\n </div>\n ))}\n </dl>\n )\n}\n","import { Quote } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage, Card } from '@arbidocs/react'\nimport { initials } from '../lib/format'\n\nexport interface TestimonialProps {\n quote: string\n author?: string\n role?: string\n avatarUrl?: string\n testId?: string\n}\n\n/** A single pull-quote testimonial with an author and optional avatar. */\nexport function Testimonial({ quote, author, role, avatarUrl, testId }: TestimonialProps) {\n return (\n <Card variant=\"outline\" className=\"mx-auto max-w-3xl p-8 text-center\" data-testid={testId}>\n <Quote className=\"mx-auto size-8 text-primary/40\" aria-hidden />\n <blockquote className=\"mt-4 text-xl font-medium leading-relaxed text-balance\">\n {quote}\n </blockquote>\n {(author || avatarUrl) && (\n <div className=\"mt-6 flex items-center justify-center gap-3\">\n {(avatarUrl || author) && (\n <Avatar>\n {avatarUrl && <AvatarImage src={avatarUrl} alt={author ?? ''} />}\n <AvatarFallback>{initials(author || '?')}</AvatarFallback>\n </Avatar>\n )}\n <div className=\"text-left\">\n {author && <p className=\"text-sm font-semibold\">{author}</p>}\n {role && <p className=\"text-sm text-muted-foreground\">{role}</p>}\n </div>\n </div>\n )}\n </Card>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { ArrowRight } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react'\n\nexport type CTABannerTone = 'default' | 'muted' | 'ink'\n\nexport interface CTABannerProps {\n title: string\n subtitle?: string\n cta?: { label?: string; href?: string }\n tone?: CTABannerTone\n /** Full-bleed background image URL/data-URI. Overrides the tone surface. */\n backgroundImage?: string\n /** Darkening scrim over the background image. Default true. */\n overlay?: boolean\n testId?: string\n}\n\nconst TONE_SURFACE: Record<CTABannerTone, string> = {\n default: 'bg-primary text-primary-foreground',\n muted: 'bg-muted text-foreground',\n ink: 'bg-foreground text-background',\n}\n\n/** Full-width call-to-action banner. */\nexport function CTABanner({\n title,\n subtitle,\n cta,\n tone = 'default',\n backgroundImage,\n overlay = true,\n testId,\n}: CTABannerProps) {\n const onImage = Boolean(backgroundImage)\n const subtle = onImage\n ? 'text-white/80'\n : tone === 'default'\n ? 'text-primary-foreground/80'\n : tone === 'ink'\n ? 'text-background/70'\n : 'text-muted-foreground'\n const bgStyle: CSSProperties | undefined = backgroundImage\n ? {\n backgroundImage: `url(\"${backgroundImage}\")`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }\n : undefined\n return (\n <div\n className={cn(\n 'relative isolate overflow-hidden rounded-2xl px-8 py-14 text-center',\n onImage ? 'text-white' : (TONE_SURFACE[tone] ?? TONE_SURFACE.default)\n )}\n style={bgStyle}\n data-testid={testId}\n >\n {onImage && overlay && <div className=\"absolute inset-0 bg-black/55\" aria-hidden />}\n <div className=\"relative\">\n <h2 className=\"text-3xl font-semibold tracking-tight text-balance sm:text-4xl\">{title}</h2>\n {subtitle && <p className={cn('mx-auto mt-4 max-w-2xl text-lg', subtle)}>{subtitle}</p>}\n {cta?.label && (\n <div className=\"mt-8\">\n <Button\n asChild\n size=\"lg\"\n variant={tone === 'default' && !onImage ? 'secondary' : 'default'}\n >\n <a href={cta.href || '#'}>\n {cta.label}\n <ArrowRight className=\"size-4\" />\n </a>\n </Button>\n </div>\n )}\n </div>\n </div>\n )\n}\n","export interface LogoItem {\n label: string\n}\n\nexport interface LogoCloudProps {\n items: LogoItem[]\n testId?: string\n}\n\n/**\n * Text-based \"logo\" wall — brand names rendered as muted pill marks. Self-contained\n * (no external images) so the palette looks complete offline.\n */\nexport function LogoCloud({ items, testId }: LogoCloudProps) {\n return (\n <div className=\"flex flex-wrap items-center justify-center gap-4\" data-testid={testId}>\n {(items ?? []).map((item, i) => (\n <span\n key={i}\n className=\"rounded-md border border-border bg-muted px-5 py-2.5 text-sm font-semibold uppercase tracking-wide text-muted-foreground\"\n data-testid={testId && `${testId}-item-${i}`}\n >\n {item.label}\n </span>\n ))}\n </div>\n )\n}\n","import { ChevronDown } from 'lucide-react'\n\nexport interface FaqItem {\n question: string\n answer?: string\n}\n\nexport interface FAQProps {\n items: FaqItem[]\n testId?: string\n}\n\n/**\n * Accessible disclosure list. Built on native `<details>`/`<summary>` so it works\n * without client state (correct in the Puck preview and static renders) and stays\n * keyboard-accessible. Token-only styling.\n */\nexport function FAQ({ items, testId }: FAQProps) {\n return (\n <div className=\"mx-auto max-w-3xl divide-y divide-border\" data-testid={testId}>\n {(items ?? []).map((item, i) => (\n <details key={i} className=\"group py-4\" data-testid={testId && `${testId}-item-${i}`}>\n <summary className=\"flex cursor-pointer list-none items-center justify-between gap-4 text-left text-base font-medium\">\n {item.question}\n <ChevronDown className=\"size-4 shrink-0 text-muted-foreground transition-transform group-open:rotate-180\" />\n </summary>\n {item.answer && (\n <p className=\"mt-3 text-sm leading-relaxed text-muted-foreground\">{item.answer}</p>\n )}\n </details>\n ))}\n </div>\n )\n}\n","import { AiMarkdown } from '@arbidocs/react'\n\nexport interface RichTextBlockProps {\n content: string\n testId?: string\n}\n\n/**\n * Prose block. Reuses the shared markdown renderer (`AiMarkdown`) so long-form copy\n * gets the one house style for headings, lists, tables and emphasis — token-clean\n * and themeable per firm.\n */\nexport function RichTextBlock({ content, testId }: RichTextBlockProps) {\n return (\n <div className=\"mx-auto max-w-3xl\" data-testid={testId}>\n <AiMarkdown>{content ?? ''}</AiMarkdown>\n </div>\n )\n}\n","import type { LucideIcon } from 'lucide-react'\nimport { AlertTriangle, CheckCircle2, Info, XCircle } from 'lucide-react'\nimport { cn } from '@arbidocs/react'\n\nexport type CalloutVariant = 'info' | 'success' | 'warning' | 'danger'\n\nexport interface CalloutProps {\n variant?: CalloutVariant\n title?: string\n body?: string\n testId?: string\n}\n\nconst STYLES: Record<CalloutVariant, { wrap: string; icon: string; Icon: LucideIcon }> = {\n info: { wrap: 'border-primary/30 bg-primary/5', icon: 'text-primary', Icon: Info },\n success: { wrap: 'border-success/30 bg-success/10', icon: 'text-success', Icon: CheckCircle2 },\n warning: { wrap: 'border-warning/40 bg-warning/10', icon: 'text-warning', Icon: AlertTriangle },\n danger: {\n wrap: 'border-destructive/30 bg-destructive/10',\n icon: 'text-destructive',\n Icon: XCircle,\n },\n}\n\n/** Inline notice box in one of four semantic tones. */\nexport function Callout({ variant = 'info', title, body, testId }: CalloutProps) {\n const style = STYLES[variant] ?? STYLES.info\n const Icon = style.Icon\n return (\n <div\n className={cn('flex gap-3 rounded-lg border p-4 text-foreground', style.wrap)}\n data-testid={testId}\n role=\"note\"\n >\n <Icon className={cn('mt-0.5 size-5 shrink-0', style.icon)} aria-hidden />\n <div className=\"min-w-0\">\n {title && <p className=\"font-semibold\">{title}</p>}\n {body && <p className=\"text-sm leading-relaxed text-muted-foreground\">{body}</p>}\n </div>\n </div>\n )\n}\n","import { Avatar, AvatarFallback, AvatarImage, cn } from '@arbidocs/react'\nimport { initials } from '../lib/format'\n\nexport type AvatarBlockSize = 'sm' | 'md' | 'lg' | 'xl'\n\nexport interface AvatarBlockProps {\n src?: string\n name?: string\n size?: AvatarBlockSize\n testId?: string\n}\n\nconst SIZE: Record<AvatarBlockSize, string> = {\n sm: 'size-8 text-xs',\n md: 'size-10 text-sm',\n lg: 'size-14 text-base',\n xl: 'size-20 text-xl',\n}\n\n/** Avatar with an initials fallback when no image is supplied. */\nexport function AvatarBlock({ src, name = '', size = 'md', testId }: AvatarBlockProps) {\n return (\n <Avatar className={cn(SIZE[size] ?? SIZE.md)} data-testid={testId}>\n {src && <AvatarImage src={src} alt={name} />}\n <AvatarFallback className=\"font-semibold\">{initials(name || '?')}</AvatarFallback>\n </Avatar>\n )\n}\n","import { Button } from '@arbidocs/react'\n\nexport interface NavLink {\n label: string\n href?: string\n}\n\nexport interface NavbarProps {\n brand: string\n links: NavLink[]\n cta?: { label?: string; href?: string }\n testId?: string\n}\n\n/** Marketing top navigation: brand, inline links and an optional CTA button. */\nexport function Navbar({ brand, links, cta, testId }: NavbarProps) {\n return (\n <header className=\"border-b border-border bg-background\" data-testid={testId}>\n <nav className=\"mx-auto flex max-w-7xl items-center justify-between gap-6 px-5 py-4 lg:px-8\">\n <span className=\"text-lg font-semibold tracking-tight\">{brand}</span>\n <div className=\"hidden items-center gap-6 md:flex\">\n {(links ?? []).map((link, i) => (\n <a\n key={i}\n href={link.href || '#'}\n className=\"text-sm font-medium text-muted-foreground transition-colors hover:text-foreground\"\n data-testid={testId && `${testId}-link-${i}`}\n >\n {link.label}\n </a>\n ))}\n </div>\n {cta?.label && (\n <Button asChild size=\"sm\">\n <a href={cta.href || '#'}>{cta.label}</a>\n </Button>\n )}\n </nav>\n </header>\n )\n}\n","export interface FooterLink {\n label: string\n href?: string\n}\n\nexport interface FooterColumn {\n heading: string\n links: FooterLink[]\n}\n\nexport interface FooterProps {\n columns: FooterColumn[]\n copyright?: string\n testId?: string\n}\n\n/** Site footer: a row of link columns plus a copyright line. */\nexport function Footer({ columns, copyright, testId }: FooterProps) {\n return (\n <footer className=\"border-t border-border bg-muted text-foreground\" data-testid={testId}>\n <div className=\"mx-auto max-w-7xl px-5 py-14 lg:px-8\">\n <div className=\"grid gap-8 sm:grid-cols-2 lg:grid-cols-4\">\n {(columns ?? []).map((col, i) => (\n <div key={i} data-testid={testId && `${testId}-col-${i}`}>\n <h3 className=\"text-sm font-semibold tracking-tight\">{col.heading}</h3>\n <ul className=\"mt-4 space-y-2\">\n {(col.links ?? []).map((link, j) => (\n <li key={j}>\n <a\n href={link.href || '#'}\n className=\"text-sm text-muted-foreground transition-colors hover:text-foreground\"\n >\n {link.label}\n </a>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n {copyright && (\n <p className=\"mt-12 border-t border-border pt-6 text-sm text-muted-foreground\">\n {copyright}\n </p>\n )}\n </div>\n </footer>\n )\n}\n","import { cn } from '@arbidocs/react'\n\nexport interface ListItem {\n text: string\n}\n\nexport interface ListBlockProps {\n ordered?: boolean\n items: ListItem[]\n testId?: string\n}\n\n/** Ordered or unordered prose list. Token-clean. */\nexport function ListBlock({ ordered = false, items, testId }: ListBlockProps) {\n const list = items ?? []\n const className = cn(\n 'mx-auto max-w-3xl space-y-2 pl-5 text-foreground',\n ordered ? 'list-decimal' : 'list-disc'\n )\n const content = list.map((item, i) => (\n <li key={i} className=\"leading-relaxed marker:text-muted-foreground\">\n {item.text}\n </li>\n ))\n return ordered ? (\n <ol className={className} data-testid={testId}>\n {content}\n </ol>\n ) : (\n <ul className={className} data-testid={testId}>\n {content}\n </ul>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react'\n\nexport type ColumnsCount = 2 | 3 | 4\nexport type ColumnsGap = 'sm' | 'md' | 'lg'\n\nexport interface ColumnsProps {\n count?: ColumnsCount\n gap?: ColumnsGap\n columns: ReactNode[]\n testId?: string\n}\n\nconst GRID: Record<ColumnsCount, string> = {\n 2: 'sm:grid-cols-2',\n 3: 'sm:grid-cols-2 lg:grid-cols-3',\n 4: 'sm:grid-cols-2 lg:grid-cols-4',\n}\n\nconst GAP: Record<ColumnsGap, string> = {\n sm: 'gap-3',\n md: 'gap-6',\n lg: 'gap-10',\n}\n\n/** Responsive N-column row. Each column hosts a nested Puck slot. */\nexport function Columns({ count = 3, gap = 'md', columns, testId }: ColumnsProps) {\n return (\n <div\n className={cn('grid grid-cols-1', GRID[count] ?? GRID[3], GAP[gap] ?? GAP.md)}\n data-testid={testId}\n >\n {columns.map((col, i) => (\n <div key={i} data-testid={testId && `${testId}-col-${i}`}>\n {col}\n </div>\n ))}\n </div>\n )\n}\n","import { cn } from '@arbidocs/react'\n\nexport type SpacerSize = 'sm' | 'md' | 'lg' | 'xl'\n\nexport interface SpacerProps {\n size?: SpacerSize\n testId?: string\n}\n\nconst SIZE: Record<SpacerSize, string> = {\n sm: 'h-4',\n md: 'h-8',\n lg: 'h-16',\n xl: 'h-24',\n}\n\n/** Vertical whitespace. */\nexport function Spacer({ size = 'md', testId }: SpacerProps) {\n return <div className={cn('w-full', SIZE[size] ?? SIZE.md)} data-testid={testId} aria-hidden />\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react'\n\nexport type ContainerWidth = 'narrow' | 'default' | 'wide' | 'full'\nexport type ContainerPadding = 'none' | 'sm' | 'md' | 'lg'\n\nexport interface ContainerProps {\n width?: ContainerWidth\n padding?: ContainerPadding\n children: ReactNode\n testId?: string\n}\n\nconst WIDTH: Record<ContainerWidth, string> = {\n narrow: 'max-w-3xl',\n default: 'max-w-5xl',\n wide: 'max-w-7xl',\n full: 'max-w-none',\n}\n\nconst PADDING: Record<ContainerPadding, string> = {\n none: 'px-0 py-0',\n sm: 'px-4 py-6',\n md: 'px-5 py-12 lg:px-8',\n lg: 'px-5 py-20 lg:px-8',\n}\n\n/** Max-width wrapper that centres and pads a nested Puck slot. */\nexport function Container({ width = 'default', padding = 'md', children, testId }: ContainerProps) {\n return (\n <div\n className={cn(\n 'mx-auto w-full',\n WIDTH[width] ?? WIDTH.default,\n PADDING[padding] ?? PADDING.md\n )}\n data-testid={testId}\n >\n {children}\n </div>\n )\n}\n","import { Check } from 'lucide-react'\nimport { Button, Card, cn } from '@arbidocs/react'\n\nexport interface PricingPlan {\n name: string\n price: string\n period?: string\n description?: string\n features?: string[]\n cta?: { label?: string; href?: string }\n /** Highlight this plan as the recommended one. */\n featured?: boolean\n}\n\nexport interface PricingTableProps {\n plans: PricingPlan[]\n testId?: string\n}\n\n/** A row of pricing plan cards with feature lists and a CTA per plan. */\nexport function PricingTable({ plans, testId }: PricingTableProps) {\n return (\n <div\n className={cn('grid gap-6', (plans?.length ?? 0) >= 3 ? 'md:grid-cols-3' : 'sm:grid-cols-2')}\n data-testid={testId}\n >\n {(plans ?? []).map((plan, i) => (\n <Card\n key={i}\n variant={plan.featured ? 'elevated' : 'outline'}\n className={cn('flex h-full flex-col p-6', plan.featured && 'ring-2 ring-primary')}\n data-testid={testId && `${testId}-item-${i}`}\n >\n <h3 className=\"text-lg font-semibold tracking-tight\">{plan.name}</h3>\n <div className=\"mt-3 flex items-baseline gap-1\">\n <span className=\"text-3xl font-semibold tracking-tight\">{plan.price}</span>\n {plan.period && <span className=\"text-sm text-muted-foreground\">/{plan.period}</span>}\n </div>\n {plan.description && (\n <p className=\"mt-2 text-sm leading-relaxed text-muted-foreground\">{plan.description}</p>\n )}\n {plan.features && plan.features.length > 0 && (\n <ul className=\"mt-5 flex-1 space-y-2\">\n {plan.features.map((f, j) => (\n <li key={j} className=\"flex items-start gap-2 text-sm\">\n <Check className=\"mt-0.5 size-4 shrink-0 text-primary\" />\n <span>{f}</span>\n </li>\n ))}\n </ul>\n )}\n {plan.cta?.label && (\n <Button asChild className=\"mt-6 w-full\" variant={plan.featured ? 'default' : 'outline'}>\n <a href={plan.cta.href || '#'}>{plan.cta.label}</a>\n </Button>\n )}\n </Card>\n ))}\n </div>\n )\n}\n","import { useState } from 'react'\nimport { cn } from '@arbidocs/react'\n\nexport interface TabItem {\n label: string\n content: string\n}\n\nexport interface TabsProps {\n items: TabItem[]\n testId?: string\n}\n\n/** A simple tabbed panel: a row of tab buttons over the active tab's content. */\nexport function Tabs({ items, testId }: TabsProps) {\n const [active, setActive] = useState(0)\n const list = items ?? []\n const current = list[Math.min(active, Math.max(list.length - 1, 0))]\n return (\n <div data-testid={testId}>\n <div className=\"flex flex-wrap gap-1 border-b border-border\" role=\"tablist\">\n {list.map((t, i) => {\n const selected = i === active\n return (\n <button\n key={i}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n onClick={() => setActive(i)}\n className={cn(\n '-mb-px border-b-2 px-4 py-2 text-sm font-medium transition-colors',\n selected\n ? 'border-primary text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n )}\n data-testid={testId && `${testId}-tab-${i}`}\n >\n {t.label}\n </button>\n )\n })}\n </div>\n {current && (\n <div\n role=\"tabpanel\"\n className=\"pt-5 text-sm leading-relaxed text-muted-foreground\"\n data-testid={testId && `${testId}-panel`}\n >\n {current.content}\n </div>\n )}\n </div>\n )\n}\n","import { useState } from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport { cn } from '@arbidocs/react'\n\nexport interface AccordionItem {\n title: string\n content: string\n}\n\nexport interface AccordionProps {\n items: AccordionItem[]\n /** Allow multiple panels open at once. Default false (single-open). */\n allowMultiple?: boolean\n testId?: string\n}\n\n/** A stack of collapsible title/content panels. */\nexport function Accordion({ items, allowMultiple = false, testId }: AccordionProps) {\n const [open, setOpen] = useState<number[]>([])\n const toggle = (i: number) =>\n setOpen((prev) =>\n prev.includes(i) ? prev.filter((n) => n !== i) : allowMultiple ? [...prev, i] : [i]\n )\n return (\n <div className=\"divide-y divide-border border-y border-border\" data-testid={testId}>\n {(items ?? []).map((item, i) => {\n const isOpen = open.includes(i)\n return (\n <div key={i} data-testid={testId && `${testId}-item-${i}`}>\n <button\n type=\"button\"\n aria-expanded={isOpen}\n onClick={() => toggle(i)}\n className=\"flex w-full items-center justify-between gap-4 py-4 text-left text-base font-medium\"\n data-testid={testId && `${testId}-trigger-${i}`}\n >\n {item.title}\n <ChevronDown\n className={cn('size-4 shrink-0 transition-transform', isOpen && 'rotate-180')}\n />\n </button>\n {isOpen && (\n <p\n className=\"pb-4 text-sm leading-relaxed text-muted-foreground\"\n data-testid={testId && `${testId}-content-${i}`}\n >\n {item.content}\n </p>\n )}\n </div>\n )\n })}\n </div>\n )\n}\n","import { cn } from '@arbidocs/react'\nimport { BlockImage, type BlockImageProps } from './BlockImage'\n\nexport interface GalleryImage {\n src?: string\n alt?: string\n caption?: string\n}\n\nexport interface GalleryProps {\n images: GalleryImage[]\n columns?: '2' | '3' | '4'\n aspect?: BlockImageProps['aspect']\n rounded?: BlockImageProps['rounded']\n testId?: string\n}\n\nconst COLS: Record<'2' | '3' | '4', string> = {\n '2': 'grid-cols-2',\n '3': 'grid-cols-2 sm:grid-cols-3',\n '4': 'grid-cols-2 sm:grid-cols-4',\n}\n\n/** A responsive image grid. Each tile previews via BlockImage with a caption. */\nexport function Gallery({\n images,\n columns = '3',\n aspect = '1:1',\n rounded = 'lg',\n testId,\n}: GalleryProps) {\n return (\n <div className={cn('grid gap-4', COLS[columns] ?? COLS['3'])} data-testid={testId}>\n {(images ?? []).map((img, i) => (\n <figure key={i} data-testid={testId && `${testId}-item-${i}`}>\n <BlockImage\n src={img.src}\n alt={img.alt}\n aspect={aspect}\n rounded={rounded}\n testId={testId && `${testId}-item-${i}-image`}\n />\n {img.caption && (\n <figcaption className=\"mt-1.5 text-xs text-muted-foreground\">{img.caption}</figcaption>\n )}\n </figure>\n ))}\n </div>\n )\n}\n","import { cn } from '@arbidocs/react'\n\nexport type VideoAspect = '16:9' | '4:3' | '1:1'\n\nexport interface VideoEmbedProps {\n /** A YouTube / Vimeo / Loom page URL, or a direct video file URL. */\n url: string\n title?: string\n aspect?: VideoAspect\n rounded?: boolean\n testId?: string\n}\n\nconst ASPECT: Record<VideoAspect, string> = {\n '16:9': 'aspect-video',\n '4:3': 'aspect-[4/3]',\n '1:1': 'aspect-square',\n}\n\n/**\n * Resolve a shareable video URL to an embeddable iframe src. Supports YouTube,\n * Vimeo and Loom; returns null for anything else (rendered as a `<video>`).\n */\nexport function toEmbedUrl(url: string): string | null {\n if (!url) return null\n const yt = url.match(/(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/|youtube\\.com\\/embed\\/)([\\w-]{11})/)\n if (yt) return `https://www.youtube.com/embed/${yt[1]}`\n const vimeo = url.match(/vimeo\\.com\\/(?:video\\/)?(\\d+)/)\n if (vimeo) return `https://player.vimeo.com/video/${vimeo[1]}`\n const loom = url.match(/loom\\.com\\/(?:share|embed)\\/([\\w-]+)/)\n if (loom) return `https://www.loom.com/embed/${loom[1]}`\n return null\n}\n\n/** Embed a video from a YouTube/Vimeo/Loom link or a direct file, in a set aspect. */\nexport function VideoEmbed({\n url,\n title,\n aspect = '16:9',\n rounded = true,\n testId,\n}: VideoEmbedProps) {\n const embed = toEmbedUrl(url)\n const frame = cn(\n 'w-full overflow-hidden border border-border bg-muted',\n ASPECT[aspect] ?? ASPECT['16:9'],\n rounded && 'rounded-lg'\n )\n return (\n <div className={frame} data-testid={testId}>\n {embed ? (\n <iframe\n src={embed}\n title={title || 'Embedded video'}\n className=\"size-full\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n data-testid={testId && `${testId}-iframe`}\n />\n ) : url ? (\n <video src={url} controls className=\"size-full\" data-testid={testId && `${testId}-video`} />\n ) : null}\n </div>\n )\n}\n","import { useState, type FormEvent } from 'react'\nimport { Button, cn } from '@arbidocs/react'\n\nexport interface ContactField {\n name: string\n label: string\n type?: 'text' | 'email' | 'tel' | 'textarea'\n required?: boolean\n}\n\nexport interface ContactFormProps {\n fields: ContactField[]\n submitLabel?: string\n /** Optional POST endpoint. When set, the form submits natively to it. */\n action?: string\n /** Message shown after a client-side (no-action) submit. */\n successMessage?: string\n testId?: string\n}\n\n/** A configurable lead/contact form. Posts to `action`, or confirms client-side. */\nexport function ContactForm({\n fields,\n submitLabel = 'Send',\n action,\n successMessage = 'Thanks — we’ll be in touch shortly.',\n testId,\n}: ContactFormProps) {\n const [sent, setSent] = useState(false)\n const list = fields ?? []\n\n const onSubmit = (e: FormEvent<HTMLFormElement>) => {\n // With an action we let the browser POST natively; otherwise confirm inline.\n if (!action) {\n e.preventDefault()\n setSent(true)\n }\n }\n\n if (sent) {\n return (\n <p\n className=\"rounded-lg border border-border bg-muted p-6 text-center text-sm text-foreground\"\n role=\"status\"\n data-testid={testId && `${testId}-success`}\n >\n {successMessage}\n </p>\n )\n }\n\n return (\n <form\n action={action}\n method={action ? 'post' : undefined}\n onSubmit={onSubmit}\n className=\"mx-auto flex max-w-xl flex-col gap-4\"\n data-testid={testId}\n >\n {list.map((f, i) => {\n const inputClass =\n 'w-full rounded-md border border-border bg-card px-3 py-2 text-sm text-foreground outline-none focus:border-primary'\n return (\n <label key={i} className=\"flex flex-col gap-1.5 text-left\">\n <span className=\"text-sm font-medium\">{f.label}</span>\n {f.type === 'textarea' ? (\n <textarea\n name={f.name}\n required={f.required}\n rows={4}\n className={inputClass}\n data-testid={testId && `${testId}-field-${f.name}`}\n />\n ) : (\n <input\n name={f.name}\n type={f.type || 'text'}\n required={f.required}\n className={inputClass}\n data-testid={testId && `${testId}-field-${f.name}`}\n />\n )}\n </label>\n )\n })}\n <Button\n type=\"submit\"\n className={cn('mt-1 self-start')}\n data-testid={testId && `${testId}-submit`}\n >\n {submitLabel}\n </Button>\n </form>\n )\n}\n","import { ArrowRight } from 'lucide-react'\nimport { cn } from '@arbidocs/react'\n\nexport type BannerTone = 'primary' | 'muted' | 'ink'\n\nexport interface BannerProps {\n text: string\n cta?: { label?: string; href?: string }\n tone?: BannerTone\n testId?: string\n}\n\nconst TONE: Record<BannerTone, string> = {\n primary: 'bg-primary text-primary-foreground',\n muted: 'bg-muted text-foreground',\n ink: 'bg-foreground text-background',\n}\n\n/** A slim full-width announcement strip with optional inline CTA. */\nexport function Banner({ text, cta, tone = 'primary', testId }: BannerProps) {\n return (\n <div\n className={cn('w-full px-5 py-2.5 text-center text-sm', TONE[tone] ?? TONE.primary)}\n data-testid={testId}\n >\n <span className=\"font-medium\">{text}</span>\n {cta?.label && (\n <a\n href={cta.href || '#'}\n className=\"ml-2 inline-flex items-center gap-1 font-semibold underline underline-offset-4\"\n data-testid={testId && `${testId}-cta`}\n >\n {cta.label}\n <ArrowRight className=\"size-3.5\" />\n </a>\n )}\n </div>\n )\n}\n","import { ArrowRight } from 'lucide-react'\nimport { Button } from '@arbidocs/react'\nimport { BlockImage } from './BlockImage'\n\nexport interface MediaTextProps {\n eyebrow?: string\n title: string\n body?: string\n imageUrl?: string\n /** Which side the media sits on (desktop). */\n mediaSide?: 'left' | 'right'\n cta?: { label?: string; href?: string }\n testId?: string\n}\n\n/** A split media-and-copy row: an image on one side, prose + CTA on the other. */\nexport function MediaText({\n eyebrow,\n title,\n body,\n imageUrl,\n mediaSide = 'left',\n cta,\n testId,\n}: MediaTextProps) {\n const media = (\n <BlockImage src={imageUrl} aspect=\"4:3\" rounded=\"lg\" testId={testId && `${testId}-image`} />\n )\n const copy = (\n <div>\n {eyebrow && (\n <p className=\"mb-3 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {eyebrow}\n </p>\n )}\n <h2 className=\"text-3xl font-semibold tracking-tight text-balance\">{title}</h2>\n {body && <p className=\"mt-4 text-lg leading-relaxed text-muted-foreground\">{body}</p>}\n {cta?.label && (\n <Button asChild className=\"mt-6\">\n <a href={cta.href || '#'}>\n {cta.label}\n <ArrowRight className=\"size-4\" />\n </a>\n </Button>\n )}\n </div>\n )\n return (\n <div className=\"grid items-center gap-10 lg:grid-cols-2\" data-testid={testId}>\n {mediaSide === 'right' ? (\n <>\n {copy}\n {media}\n </>\n ) : (\n <>\n {media}\n {copy}\n </>\n )}\n </div>\n )\n}\n","import { Avatar, AvatarFallback, AvatarImage, Card, cn } from '@arbidocs/react'\nimport { initials } from '../lib/format'\n\nexport interface TeamMember {\n name: string\n role?: string\n bio?: string\n avatarUrl?: string\n}\n\nexport interface TeamGridProps {\n members: TeamMember[]\n columns?: '2' | '3' | '4'\n testId?: string\n}\n\nconst COLS: Record<'2' | '3' | '4', string> = {\n '2': 'sm:grid-cols-2',\n '3': 'sm:grid-cols-2 lg:grid-cols-3',\n '4': 'sm:grid-cols-2 lg:grid-cols-4',\n}\n\n/** A grid of people cards: avatar, name, role and an optional short bio. */\nexport function TeamGrid({ members, columns = '3', testId }: TeamGridProps) {\n return (\n <div className={cn('grid gap-6', COLS[columns] ?? COLS['3'])} data-testid={testId}>\n {(members ?? []).map((m, i) => (\n <Card\n key={i}\n variant=\"outline\"\n className=\"flex h-full flex-col items-center p-6 text-center\"\n data-testid={testId && `${testId}-item-${i}`}\n >\n <Avatar className=\"size-20\">\n {m.avatarUrl && <AvatarImage src={m.avatarUrl} alt={m.name} />}\n <AvatarFallback>{initials(m.name || '?')}</AvatarFallback>\n </Avatar>\n <h3 className=\"mt-4 text-base font-semibold tracking-tight\">{m.name}</h3>\n {m.role && <p className=\"text-sm text-primary\">{m.role}</p>}\n {m.bio && <p className=\"mt-2 text-sm leading-relaxed text-muted-foreground\">{m.bio}</p>}\n </Card>\n ))}\n </div>\n )\n}\n","import { cn } from '@arbidocs/react'\n\nexport interface StepItem {\n title: string\n description?: string\n}\n\nexport interface StepsProps {\n steps: StepItem[]\n /** `timeline` draws a connected vertical rail; `numbered` is a horizontal grid. */\n variant?: 'numbered' | 'timeline'\n testId?: string\n}\n\n/** A process / how-it-works sequence, as numbered cards or a vertical timeline. */\nexport function Steps({ steps, variant = 'numbered', testId }: StepsProps) {\n const list = steps ?? []\n if (variant === 'timeline') {\n return (\n <ol className=\"relative ml-3 border-l border-border\" data-testid={testId}>\n {list.map((s, i) => (\n <li key={i} className=\"mb-8 ml-6 last:mb-0\" data-testid={testId && `${testId}-item-${i}`}>\n <span className=\"absolute -left-3 flex size-6 items-center justify-center rounded-full bg-primary text-xs font-semibold text-primary-foreground\">\n {i + 1}\n </span>\n <h3 className=\"text-base font-semibold tracking-tight\">{s.title}</h3>\n {s.description && (\n <p className=\"mt-1 text-sm leading-relaxed text-muted-foreground\">{s.description}</p>\n )}\n </li>\n ))}\n </ol>\n )\n }\n return (\n <div\n className={cn('grid gap-6', list.length >= 4 ? 'md:grid-cols-4' : 'sm:grid-cols-3')}\n data-testid={testId}\n >\n {list.map((s, i) => (\n <div key={i} data-testid={testId && `${testId}-item-${i}`}>\n <span className=\"flex size-9 items-center justify-center rounded-full bg-primary/10 text-sm font-semibold text-primary\">\n {i + 1}\n </span>\n <h3 className=\"mt-4 text-base font-semibold tracking-tight\">{s.title}</h3>\n {s.description && (\n <p className=\"mt-2 text-sm leading-relaxed text-muted-foreground\">{s.description}</p>\n )}\n </div>\n ))}\n </div>\n )\n}\n","import { Quote } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage, Card, cn } from '@arbidocs/react'\nimport { initials } from '../lib/format'\n\nexport interface TestimonialItem {\n quote: string\n author?: string\n role?: string\n avatarUrl?: string\n}\n\nexport interface TestimonialGridProps {\n items: TestimonialItem[]\n columns?: '2' | '3'\n testId?: string\n}\n\nconst COLS: Record<'2' | '3', string> = {\n '2': 'sm:grid-cols-2',\n '3': 'sm:grid-cols-2 lg:grid-cols-3',\n}\n\n/** A grid of multiple pull-quote testimonials. */\nexport function TestimonialGrid({ items, columns = '3', testId }: TestimonialGridProps) {\n return (\n <div className={cn('grid gap-6', COLS[columns] ?? COLS['3'])} data-testid={testId}>\n {(items ?? []).map((t, i) => (\n <Card\n key={i}\n variant=\"outline\"\n className=\"flex h-full flex-col p-6\"\n data-testid={testId && `${testId}-item-${i}`}\n >\n <Quote className=\"size-6 text-primary/40\" aria-hidden />\n <blockquote className=\"mt-3 flex-1 text-base leading-relaxed\">{t.quote}</blockquote>\n {(t.author || t.avatarUrl) && (\n <div className=\"mt-5 flex items-center gap-3\">\n <Avatar className=\"size-9\">\n {t.avatarUrl && <AvatarImage src={t.avatarUrl} alt={t.author ?? ''} />}\n <AvatarFallback>{initials(t.author || '?')}</AvatarFallback>\n </Avatar>\n <div>\n {t.author && <p className=\"text-sm font-semibold\">{t.author}</p>}\n {t.role && <p className=\"text-xs text-muted-foreground\">{t.role}</p>}\n </div>\n </div>\n )}\n </Card>\n ))}\n </div>\n )\n}\n","/**\n * AppShell — the shared back-office chrome for a firm app: a left navigation rail\n * (a permanent sidebar on `lg+`, a hamburger-opened overlay drawer below it) plus\n * a topbar frame and the main content region. Driven entirely by the firm's\n * {@link AppNavSection} manifest, so every consumer gets the same responsive shell\n * from data — no bespoke sidebar/topbar per app.\n *\n * Firm-agnostic: brand (logo, topbar actions, sidebar footer, an optional right\n * rail) and content arrive as slots; the look tracks the `sidebar-*` theme tokens.\n * The drawer state is internal (the hamburger and drawer live in the same\n * component), so no cross-component store is needed.\n */\nimport { useEffect, useState, type ReactNode } from 'react'\nimport { Link, NavLink, useLocation } from 'react-router-dom'\nimport { Menu, Sparkles, X } from 'lucide-react'\nimport { cn } from '@arbidocs/react'\nimport { tid } from '../lib/testid'\nimport type { AppNavItem, AppNavSection } from './types'\n\nexport interface AppShellProps {\n /** Nav sections to render (already filtered/ordered by the app). */\n sections: AppNavSection[]\n /** Footer nav items pinned to the bottom of the sidebar (e.g. Settings). */\n footerItems?: AppNavItem[]\n /** Brand mark shown in the sidebar header. */\n logo?: ReactNode\n /** Where the logo links to (omit to render the logo without a link). */\n logoHref?: string\n logoLabel?: string\n /** Extra content below the footer nav (e.g. a connection-status pill). */\n sidebarFooter?: ReactNode\n /** Topbar content, rendered to the right of the mobile hamburger. */\n topbar?: ReactNode\n /** Optional docked panel on the far right (e.g. an AI chat rail). */\n rightRail?: ReactNode\n /** Main scroll region content (typically a router `<Outlet/>` wrapper). */\n children: ReactNode\n /** Extra classes for the `<main>` scroll region (e.g. a slim-scrollbar util). */\n mainClassName?: string\n /** Testid namespace for the shell/topbar/sidebar. Default \"app\". */\n testIdPrefix?: string\n}\n\nfunction NavItemLink({ item, onNavigate }: { item: AppNavItem; onNavigate?: () => void }) {\n return (\n <NavLink\n to={item.to}\n end={item.end}\n onClick={onNavigate}\n data-testid={tid('sidebar-nav', item.id)}\n className={({ isActive }) =>\n cn(\n 'group flex items-center gap-3 rounded-md px-3 py-2 text-sm font-medium transition-colors',\n isActive\n ? 'bg-sidebar-accent text-sidebar-accent-foreground'\n : 'text-sidebar-foreground hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground'\n )\n }\n >\n <item.icon className=\"size-[18px] shrink-0\" />\n <span className=\"flex-1 truncate\">{item.label}</span>\n {item.arbi && (\n <Sparkles className=\"size-3.5 text-sidebar-primary\" aria-label=\"Powered by ARBI\" />\n )}\n </NavLink>\n )\n}\n\ninterface SidebarBodyProps {\n sections: AppNavSection[]\n footerItems?: AppNavItem[]\n logo?: ReactNode\n logoHref?: string\n logoLabel?: string\n sidebarFooter?: ReactNode\n onNavigate?: () => void\n}\n\nfunction SidebarBody({\n sections,\n footerItems,\n logo,\n logoHref,\n logoLabel,\n sidebarFooter,\n onNavigate,\n}: SidebarBodyProps) {\n return (\n <>\n {logo && (\n <div className=\"flex h-16 items-center border-b border-sidebar-border px-5\">\n {logoHref ? (\n <Link to={logoHref} aria-label={logoLabel} onClick={onNavigate}>\n {logo}\n </Link>\n ) : (\n logo\n )}\n </div>\n )}\n\n <nav className=\"flex-1 space-y-6 overflow-y-auto px-3 py-5\">\n {sections.map((section) => (\n <div key={section.heading}>\n <p className=\"px-3 pb-2 text-[10px] font-semibold uppercase tracking-[0.14em] text-sidebar-foreground/55\">\n {section.heading}\n </p>\n <div className=\"space-y-0.5\">\n {section.items.map((item) => (\n <NavItemLink key={item.id} item={item} onNavigate={onNavigate} />\n ))}\n </div>\n </div>\n ))}\n </nav>\n\n {(footerItems?.length || sidebarFooter) && (\n <div className=\"border-t border-sidebar-border px-3 py-3\">\n {footerItems?.map((item) => (\n <NavItemLink key={item.id} item={item} onNavigate={onNavigate} />\n ))}\n {sidebarFooter}\n </div>\n )}\n </>\n )\n}\n\nexport function AppShell({\n sections,\n footerItems,\n logo,\n logoHref,\n logoLabel,\n sidebarFooter,\n topbar,\n rightRail,\n children,\n mainClassName,\n testIdPrefix = 'app',\n}: AppShellProps) {\n const [open, setOpen] = useState(false)\n const location = useLocation()\n\n // Close the drawer whenever the route changes (tapping a nav item navigates).\n useEffect(() => {\n setOpen(false)\n }, [location.pathname])\n\n const body = (onNavigate?: () => void) => (\n <SidebarBody\n sections={sections}\n footerItems={footerItems}\n logo={logo}\n logoHref={logoHref}\n logoLabel={logoLabel}\n sidebarFooter={sidebarFooter}\n onNavigate={onNavigate}\n />\n )\n\n return (\n <div\n className=\"flex h-screen overflow-hidden bg-background\"\n data-testid={`${testIdPrefix}-shell`}\n >\n {/* Desktop rail — permanent from lg up. */}\n <aside\n className=\"hidden h-full w-64 shrink-0 flex-col border-r border-sidebar-border bg-sidebar lg:flex\"\n data-testid={`${testIdPrefix}-sidebar`}\n >\n {body()}\n </aside>\n\n {/* Mobile drawer — overlay + slide-in panel, only mounted when open. */}\n {open && (\n <div\n className=\"fixed inset-0 z-50 lg:hidden\"\n data-testid={`${testIdPrefix}-sidebar-mobile`}\n >\n <div\n className=\"absolute inset-0 bg-black/60 backdrop-blur-sm\"\n onClick={() => setOpen(false)}\n aria-hidden\n />\n <aside className=\"absolute inset-y-0 left-0 flex w-64 max-w-[82%] flex-col border-r border-sidebar-border bg-sidebar shadow-xl\">\n <button\n type=\"button\"\n onClick={() => setOpen(false)}\n className=\"absolute right-3 top-4 z-10 flex size-8 items-center justify-center rounded-md text-sidebar-foreground/70 hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground\"\n aria-label=\"Close menu\"\n data-testid={`${testIdPrefix}-sidebar-close`}\n >\n <X className=\"size-5\" />\n </button>\n {body(() => setOpen(false))}\n </aside>\n </div>\n )}\n\n {/* Main column: topbar frame + scrollable content. */}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <header\n className=\"flex h-16 shrink-0 items-center gap-4 border-b border-border bg-card/80 px-6 backdrop-blur\"\n data-testid={`${testIdPrefix}-topbar`}\n >\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n className=\"flex size-9 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground lg:hidden\"\n data-testid={`${testIdPrefix}-nav-toggle`}\n aria-label=\"Open menu\"\n >\n <Menu className=\"size-5\" />\n </button>\n {topbar}\n </header>\n <main\n className={cn('flex-1 overflow-y-auto', mainClassName)}\n data-testid={`${testIdPrefix}-main`}\n >\n {children}\n </main>\n </div>\n\n {rightRail}\n </div>\n )\n}\n","/**\n * Live-data gate for the widget seam (context + hook only — no components, so\n * this stays fast-refresh clean and can be imported by both the runtime scaffold\n * and the widget factory without a cycle).\n *\n * The flag is `true` ONLY inside an authenticated in-app renderer\n * (`PageRenderer liveData`), which is where live ARBI data may resolve. In the\n * Studio editor canvas and on the public site it stays `false`, so every live\n * widget renders a placeholder instead of hitting the backend. It is deliberately\n * separate from the asset resolver (which IS on in the editor, to preview\n * images): back-office data must never resolve on the marketing canvas.\n */\nimport { createContext, useContext } from 'react'\n\n/** True only where live widgets may resolve backend data (an authenticated app tree). */\nexport const LiveDataContext = createContext<boolean>(false)\n\n/** Whether live widgets may resolve backend data here (false in editor/public). */\nexport function useLiveDataActive(): boolean {\n return useContext(LiveDataContext)\n}\n","/**\n * Live-widget runtime: everything in the seam that RENDERS — the provider that\n * turns the live-data gate on for an authenticated app tree, the placeholder\n * shown everywhere else, and the widget block bodies themselves (each gates on\n * the live-data flag and renders live data or a placeholder).\n *\n * Components only — kept apart from the context/hook ({@link ./liveData}) and the\n * config factory ({@link ./widgets}) so every file in the seam is fast-refresh\n * clean (a file exports either components or non-components, never both, and a\n * non-component-export file defines no components).\n *\n * The widgets read the SHARED `@arbidocs/react` hooks and the package connection\n * (for the active workspace), so they are firm-agnostic.\n */\nimport type { LucideIcon } from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { Bot, FileText, MessagesSquare, Sparkles } from 'lucide-react'\nimport { Card, useConversations, useDocuments } from '@arbidocs/react'\nimport { MetricCard } from '../components/MetricCard'\nimport { useConnection } from '../connection/ConnectionProvider'\nimport { LiveDataContext, useLiveDataActive } from './liveData'\n\n// ── Scaffolding ───────────────────────────────────────────────────────────────\n/** Marks the subtree as an authenticated app tree, so live widgets resolve data. */\nexport function LiveDataProvider({ children }: { children: ReactNode }) {\n return <LiveDataContext.Provider value={true}>{children}</LiveDataContext.Provider>\n}\n\n/**\n * What a live widget shows when it can't (or shouldn't) resolve data: a labelled,\n * dashed card. Used in the Studio canvas and the public renderer so authoring a\n * dashboard is WYSIWYG-ish without leaking live back-office data.\n */\nexport function WidgetPlaceholder({\n label,\n icon: Icon = Sparkles,\n testId,\n}: {\n label: string\n icon?: LucideIcon\n testId?: string\n}) {\n return (\n <div\n className=\"flex items-center gap-3 rounded-xl border border-dashed border-border bg-muted/30 px-5 py-6 text-sm text-muted-foreground\"\n data-testid={testId}\n >\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n <Icon className=\"size-4\" />\n </span>\n <span>\n <span className=\"font-medium text-foreground\">{label}</span>\n <span className=\"ml-1\">· live in the app</span>\n </span>\n </div>\n )\n}\n\n// ── Shared helpers ────────────────────────────────────────────────────────────\n/** Resolve the active workspace id from the package connection (firm-agnostic). */\nfunction useActiveWorkspaceId(): string | undefined {\n const { workspaceId, fallbackWorkspaceId } = useConnection()\n return workspaceId ?? fallbackWorkspaceId ?? undefined\n}\n\n/** Compact relative time (\"3h ago\") — self-contained so widgets need no firm util. */\nfunction timeAgo(iso: string | undefined): string {\n if (!iso) return ''\n const then = new Date(iso).getTime()\n if (Number.isNaN(then)) return ''\n const s = Math.max(0, Math.round((Date.now() - then) / 1000))\n if (s < 60) return 'just now'\n const m = Math.round(s / 60)\n if (m < 60) return `${m}m ago`\n const h = Math.round(m / 60)\n if (h < 24) return `${h}h ago`\n return `${Math.round(h / 24)}d ago`\n}\n\nconst METRIC_SOURCES = {\n documents: { label: 'Documents', icon: FileText },\n conversations: { label: 'Agent threads', icon: Bot },\n} as const\ntype MetricSource = keyof typeof METRIC_SOURCES\n\nconst asMetricSource = (s: string): MetricSource =>\n s in METRIC_SOURCES ? (s as MetricSource) : 'documents'\n\ninterface Conversation {\n external_id?: string\n title?: string\n updated_at?: string\n}\n\n// ── Live inner bodies (only mounted where the gate is on) ─────────────────────\nfunction AgentActivityLive({\n title,\n limit,\n testId,\n}: {\n title: string\n limit: number\n testId: string\n}) {\n const wsId = useActiveWorkspaceId()\n const { data, isLoading } = useConversations(wsId)\n const rows = [...((data ?? []) as Conversation[])]\n .sort((a, b) => +new Date(b.updated_at ?? 0) - +new Date(a.updated_at ?? 0))\n .slice(0, limit)\n\n return (\n <Card variant=\"elevated\" className=\"rounded-xl p-5\" data-testid={testId}>\n <div className=\"mb-3 flex items-center gap-2\">\n <Bot className=\"size-4 text-muted-foreground\" />\n <p className=\"text-sm font-semibold text-foreground\">{title}</p>\n </div>\n {isLoading ? (\n <p className=\"text-sm text-muted-foreground\" data-testid={`${testId}-loading`}>\n Loading agent threads…\n </p>\n ) : rows.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\" data-testid={`${testId}-empty`}>\n No agent threads yet.\n </p>\n ) : (\n <ul className=\"space-y-2\" data-testid={`${testId}-list`}>\n {rows.map((c, i) => (\n <li\n key={c.external_id ?? i}\n className=\"flex items-center justify-between gap-3\"\n data-testid={`${testId}-item-${i}`}\n >\n <span className=\"flex items-center gap-2 truncate\">\n <MessagesSquare className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"truncate text-sm text-foreground\">\n {c.title?.trim() || 'Untitled thread'}\n </span>\n </span>\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">\n {timeAgo(c.updated_at)}\n </span>\n </li>\n ))}\n </ul>\n )}\n </Card>\n )\n}\n\nfunction LiveMetricInner({\n label,\n source,\n accent,\n testId,\n}: {\n label: string\n source: MetricSource\n accent: string\n testId: string\n}) {\n const wsId = useActiveWorkspaceId()\n const docs = useDocuments(wsId, { enabled: source === 'documents' })\n const convos = useConversations(wsId, { enabled: source === 'conversations' })\n const query = source === 'documents' ? docs : convos\n const count = Array.isArray(query.data) ? query.data.length : 0\n return (\n <MetricCard\n label={label || METRIC_SOURCES[source].label}\n value={query.isLoading ? '—' : String(count)}\n accent={accent}\n icon={METRIC_SOURCES[source].icon}\n testId={testId}\n />\n )\n}\n\n// ── Widget block bodies (gate on the live flag) ───────────────────────────────\n// Named components (not the Puck `render` arrow) so the live-context hook is a\n// legit component-level hook — mirrors how BlockImage gates on the asset resolver.\nexport function AgentActivityBlock({\n title,\n limit,\n testId,\n}: {\n title: string\n limit: number\n testId: string\n}) {\n return useLiveDataActive() ? (\n <AgentActivityLive title={title} limit={limit} testId={testId} />\n ) : (\n <WidgetPlaceholder label={String(title || 'Agent activity')} icon={Bot} testId={testId} />\n )\n}\n\nexport function LiveMetricBlock({\n label,\n source,\n accent,\n testId,\n}: {\n label: string\n source: string\n accent: string\n testId: string\n}) {\n const src = asMetricSource(source)\n return useLiveDataActive() ? (\n <LiveMetricInner label={label} source={src} accent={accent} testId={testId} />\n ) : (\n <WidgetPlaceholder\n label={String(label || METRIC_SOURCES[src].label)}\n icon={METRIC_SOURCES[src].icon}\n testId={testId}\n />\n )\n}\n","/**\n * Live-widget block factory for @arbidocs/blocks.\n *\n * Mirrors the other `create*Blocks` factories: it only WIRES pre-built block\n * components (from {@link ./liveWidgetRuntime}) into Puck `ComponentConfig`s, so\n * it exports a single function and defines no components of its own — keeping it\n * fast-refresh clean. The blocks gate on the live-data flag ({@link ./liveData}),\n * rendering real ARBI data inside an authenticated app tree and a placeholder in\n * the editor/public. They read the SHARED `@arbidocs/react` hooks, so any client\n * with an ARBI workspace gets them; a client supplies only *composition* via\n * `createArbiBlocksConfig({ liveWidgets: true })`.\n */\nimport type { ComponentConfig } from '@measured/puck'\nimport { AgentActivityBlock, LiveMetricBlock } from './liveWidgetRuntime'\nimport type { BlockKit } from './blockKit'\n\n/**\n * Build the live-widget block set, closing over the shared {@link BlockKit} for\n * stable testids. Registered under a \"Widgets\" category when a consumer opts in\n * with `createArbiBlocksConfig({ liveWidgets: true })`.\n */\nexport function createLiveWidgets(kit: BlockKit): Record<string, ComponentConfig> {\n const { blockTestId } = kit\n\n const AgentActivityWidget: ComponentConfig = {\n label: 'Agent activity (live)',\n fields: {\n title: { type: 'text', label: 'Title' },\n limit: { type: 'number', label: 'Rows', min: 1, max: 8 },\n },\n defaultProps: { title: 'Recent agent activity', limit: 4 },\n render: ({ id, title, limit }) => (\n <AgentActivityBlock title={title} limit={limit} testId={blockTestId(id)} />\n ),\n }\n\n const LiveMetricWidget: ComponentConfig = {\n label: 'Live metric',\n fields: {\n label: { type: 'text', label: 'Label' },\n source: {\n type: 'select',\n label: 'Source',\n options: [\n { label: 'Documents', value: 'documents' },\n { label: 'Agent threads', value: 'conversations' },\n ],\n },\n accent: {\n type: 'radio',\n label: 'Accent',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Primary', value: 'primary' },\n { label: 'Success', value: 'success' },\n ],\n },\n },\n defaultProps: { label: '', source: 'documents', accent: 'primary' },\n render: ({ id, label, source, accent }) => (\n <LiveMetricBlock label={label} source={source} accent={accent} testId={blockTestId(id)} />\n ),\n }\n\n return {\n AgentActivity: AgentActivityWidget,\n LiveMetric: LiveMetricWidget,\n }\n}\n","/**\n * Publish-time asset materialization.\n *\n * While authoring, an image is stored as a workspace **asset ref**\n * (`asset:<docId>`) — resolvable only inside the authenticated Studio. The\n * public marketing renderer has no auth token, so a published page must be\n * **self-contained**: every asset ref is replaced with a directly-renderable\n * source before the page is saved for the public.\n *\n * The default {@link createArbiMaterializer} downloads each asset once and\n * inlines it as a `data:` URI — the bytes travel *inside* the published JSON,\n * so nothing is fetched, served or auth-gated at render time (no backend). A\n * consumer that prefers a CDN/static host can pass a `publishAsset` hook that\n * uploads the bytes and returns a URL instead; that is purely a payload-size\n * optimization and keeps this package firm- and backend-agnostic.\n */\nimport type { Data } from '@measured/puck'\nimport { assetRefId, isAssetRef } from '../components/assetResolver'\nimport type { Arbi } from './types'\n\n/** Resolve a workspace document ext_id to a public-renderable src, or null. */\nexport type AssetMaterializer = (docId: string) => Promise<string | null>\n\nexport interface MaterializeOptions {\n /**\n * Optional sink: given a doc id + its bytes, store them somewhere public and\n * return the URL. When omitted, bytes are inlined as a `data:` URI (no backend).\n */\n publishAsset?: (docId: string, blob: Blob) => Promise<string>\n}\n\n/** Read a Blob as a `data:<mime>;base64,…` URI. */\nfunction blobToDataUrl(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(reader.result as string)\n reader.onerror = () => reject(reader.error)\n reader.readAsDataURL(blob)\n })\n}\n\n/**\n * A materializer backed by the authenticated Arbi client: download the asset,\n * then either hand it to `publishAsset` or inline it as a data URI. Any failure\n * resolves to `null` so a single broken asset never fails the whole publish.\n */\nexport function createArbiMaterializer(\n arbi: Arbi,\n opts: MaterializeOptions = {}\n): AssetMaterializer {\n return async (docId: string) => {\n try {\n const res = await arbi.documents.download(docId)\n const blob = await res.blob()\n if (opts.publishAsset) return await opts.publishAsset(docId, blob)\n return await blobToDataUrl(blob)\n } catch {\n return null\n }\n }\n}\n\n/** Depth-first collect every distinct asset ref (`asset:…`) in a JSON value. */\nfunction collectAssetRefs(node: unknown, acc: Set<string>): void {\n if (typeof node === 'string') {\n if (isAssetRef(node)) acc.add(node)\n return\n }\n if (Array.isArray(node)) {\n for (const child of node) collectAssetRefs(child, acc)\n return\n }\n if (node && typeof node === 'object') {\n for (const value of Object.values(node)) collectAssetRefs(value, acc)\n }\n}\n\n/** Deep-clone a JSON value, swapping any string found in `replacements`. */\nfunction replaceAssetRefs<T>(node: T, replacements: Map<string, string>): T {\n if (typeof node === 'string') {\n return (replacements.get(node) ?? node) as T\n }\n if (Array.isArray(node)) {\n return node.map((child) => replaceAssetRefs(child, replacements)) as unknown as T\n }\n if (node && typeof node === 'object') {\n const out: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(node)) {\n out[key] = replaceAssetRefs(value, replacements)\n }\n return out as T\n }\n return node\n}\n\n/**\n * Return a copy of `data` with every `asset:<docId>` ref replaced by its\n * materialized source. Each distinct ref is resolved exactly once; a ref that\n * fails to resolve is left untouched (it simply won't paint for the public).\n */\nexport async function materializePageData(\n data: Data,\n materialize: AssetMaterializer\n): Promise<Data> {\n const refs = new Set<string>()\n collectAssetRefs(data, refs)\n if (refs.size === 0) return data\n\n const replacements = new Map<string, string>()\n await Promise.all(\n [...refs].map(async (ref) => {\n const src = await materialize(assetRefId(ref))\n if (src) replacements.set(ref, src)\n })\n )\n if (replacements.size === 0) return data\n return replaceAssetRefs(data, replacements)\n}\n","/**\n * StudioEditor — the WYSIWYG marketing-site builder.\n *\n * Wraps Puck's <Puck> with a firm-supplied block config, a slim brand toolbar\n * (page picker, theme drawer, publish) and injected persistence. Data is loaded\n * per page slug on mount / slug change and saved on publish. The theme editor\n * rides in a slide-over so token changes preview live against the canvas.\n *\n * Firm-agnostic: the block config, page list, persistence, theme bundle/defaults\n * and brand labels all arrive as props; `live` is passed in (never read from env).\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Link } from 'react-router-dom'\nimport { Puck, type Config, type Data } from '@measured/puck'\nimport { ArrowLeft, Loader2, Palette, Rocket } from 'lucide-react'\nimport { useArbi } from '@arbidocs/react'\nimport { ThemeEditor } from '../theme/ThemeEditor'\nimport { AssetResolverProvider } from '../components/assetResolver'\nimport { applyStoredTheme, type ThemeBundle } from '../theme/store'\nimport type { ThemeTokens } from '../theme/tokens'\nimport { createArbiMaterializer, materializePageData, type MaterializeOptions } from './publish'\nimport type { StudioPageMeta, StudioPersistence, PersistVia } from './types'\n\nconst EMPTY_DATA = { content: [], root: {} } as Data\n\nexport interface StudioEditorProps {\n config: Config\n pages: readonly StudioPageMeta[]\n persistence: StudioPersistence\n themeBundle: ThemeBundle\n defaultTheme: ThemeTokens\n brandLabel: string\n backHref?: string\n backLabel?: string\n live: boolean\n initialSlug?: string\n testIdPrefix?: string\n /**\n * Install a DEV-only `window.__studioResetSlug(slug)` hook that clears a slug's\n * stored page so a fresh seed governs the canvas. For tests/demos only — it can\n * delete pages, so keep it off in production (pass `import.meta.env.DEV`). The\n * package stays env-agnostic; the consumer owns the flag.\n */\n resetSeam?: boolean\n /**\n * Optional sink for published image bytes. When omitted, publishing inlines\n * each asset as a `data:` URI (self-contained, no backend). Provide this to\n * upload bytes to a CDN/static host and return a URL instead.\n */\n publishAsset?: MaterializeOptions['publishAsset']\n}\n\nexport function StudioEditor({\n config,\n pages,\n persistence,\n themeBundle,\n defaultTheme,\n brandLabel,\n backHref,\n backLabel = 'Back',\n live,\n initialSlug,\n testIdPrefix = 'studio',\n publishAsset,\n resetSeam = false,\n}: StudioEditorProps) {\n const arbi = useArbi()\n const materialize = useMemo(\n () => createArbiMaterializer(arbi, { publishAsset }),\n [arbi, publishAsset]\n )\n\n const [slug, setSlug] = useState<string>(initialSlug ?? pages[0]?.slug ?? 'home')\n const [data, setData] = useState<Data>(EMPTY_DATA)\n const [rev, setRev] = useState(0) // bump to force-remount Puck on (re)load\n const [loading, setLoading] = useState(true)\n const [themeOpen, setThemeOpen] = useState(false)\n const [via, setVia] = useState<PersistVia | null>(null)\n const [saving, setSaving] = useState(false)\n const latest = useRef<Data>(EMPTY_DATA)\n\n // (Re)load the page's stored layout whenever the slug changes.\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n void (async () => {\n const { data: loaded } = await persistence.loadPage<Data>(arbi, live, slug)\n if (cancelled) return\n const next = loaded ?? EMPTY_DATA\n setData(next)\n latest.current = next\n setRev((r) => r + 1)\n setLoading(false)\n })()\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [slug, live])\n\n // DEV-only reset seam: clear a slug's stored page so a fresh seed governs the\n // canvas (backend content otherwise wins over localStorage). Lives in the\n // builder so EVERY client's studio gets deterministic test/demo resets for\n // free — no per-client wiring.\n useEffect(() => {\n if (!resetSeam) return\n const w = window as unknown as { __studioResetSlug?: (slug: string) => Promise<void> }\n w.__studioResetSlug = (s) => persistence.deletePage(arbi, live, s)\n return () => {\n delete w.__studioResetSlug\n }\n }, [resetSeam, arbi, live, persistence])\n\n // Publish = save the authoring layout (asset refs preserved, reusable) AND a\n // materialized copy (refs → data: URIs) the unauthenticated public can render.\n const persist = useCallback(\n async (toSave: Data) => {\n setSaving(true)\n try {\n const where = await persistence.savePage(arbi, live, slug, toSave)\n const published = await materializePageData(toSave, materialize)\n await persistence.savePublished(arbi, live, slug, published)\n setVia(where)\n } finally {\n setSaving(false)\n }\n },\n [arbi, live, slug, persistence, materialize]\n )\n\n // Hydrate the shared theme store from any persisted theme, then preview it live\n // so the canvas is painted exactly as a published page will render.\n useEffect(() => {\n let cancelled = false\n void (async () => {\n const { data: stored } = await persistence.loadTheme<ThemeTokens>(arbi, live)\n if (cancelled || !stored) return\n themeBundle.useStore.setState({\n colors: { ...defaultTheme.colors, ...stored.colors },\n fonts: stored.fonts ?? defaultTheme.fonts,\n radius: stored.radius ?? defaultTheme.radius,\n activePresetId: null,\n })\n applyStoredTheme(themeBundle)\n })()\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [arbi, live])\n\n // Persist the current theme so PageRenderer can paint published pages.\n const saveThemeToArbi = useCallback(async () => {\n const snapshot = themeBundle.useStore.getState().snapshot()\n return persistence.saveTheme(arbi, live, snapshot)\n }, [arbi, live, persistence, themeBundle])\n\n return (\n <div className=\"al-studio\" data-testid=\"page-studio\">\n {/* Brand toolbar */}\n <header className=\"flex items-center gap-3 border-b border-border bg-card px-4 py-2\">\n {backHref && (\n <>\n <Link\n to={backHref}\n className=\"inline-flex items-center gap-1.5 rounded-md px-2 py-1 text-sm text-muted-foreground hover:text-primary\"\n data-testid={`${testIdPrefix}-back`}\n >\n <ArrowLeft className=\"size-4\" /> {backLabel}\n </Link>\n <span className=\"h-4 w-px bg-border\" />\n </>\n )}\n <span className=\"font-display text-sm font-semibold text-foreground\">{brandLabel}</span>\n <select\n value={slug}\n onChange={(e) => setSlug(e.target.value)}\n className=\"rounded border border-border bg-background px-2 py-1 text-sm\"\n data-testid={`${testIdPrefix}-slug`}\n >\n {pages.map((p) => (\n <option key={p.slug} value={p.slug}>\n {p.label}\n </option>\n ))}\n </select>\n\n <div className=\"ml-auto flex items-center gap-2\">\n {via && (\n <span\n className=\"text-xs text-muted-foreground\"\n data-testid={`${testIdPrefix}-save-via`}\n >\n saved via {via}\n </span>\n )}\n <button\n type=\"button\"\n onClick={() => setThemeOpen((o) => !o)}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-1.5 text-sm font-medium text-foreground hover:border-primary hover:text-primary\"\n data-testid={`${testIdPrefix}-theme-toggle`}\n >\n <Palette className=\"size-4\" /> Theme\n </button>\n <button\n type=\"button\"\n onClick={() => void persist(latest.current)}\n disabled={saving || loading}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-60\"\n data-testid={`${testIdPrefix}-publish`}\n >\n {saving ? <Loader2 className=\"size-4 animate-spin\" /> : <Rocket className=\"size-4\" />}\n {saving ? 'Publishing…' : 'Publish'}\n </button>\n </div>\n </header>\n\n {/* Editor + theme drawer */}\n <div className=\"al-studio__puck relative flex\">\n <div className=\"min-w-0 flex-1\">\n {loading ? (\n <div\n className=\"flex h-full items-center justify-center text-sm text-muted-foreground\"\n data-testid={`${testIdPrefix}-loading`}\n >\n <Loader2 className=\"mr-2 size-4 animate-spin\" /> Loading “{slug}”…\n </div>\n ) : (\n <AssetResolverProvider>\n <Puck\n key={`${slug}-${rev}`}\n config={config}\n data={data}\n onChange={(d) => {\n latest.current = d\n }}\n onPublish={(d) => void persist(d)}\n />\n </AssetResolverProvider>\n )}\n </div>\n\n {themeOpen && (\n <aside\n className=\"w-80 shrink-0 border-l border-border\"\n data-testid={`${testIdPrefix}-theme-drawer`}\n >\n <ThemeEditor\n bundle={themeBundle}\n variant=\"drawer\"\n testIdPrefix={`${testIdPrefix}-theme`}\n onSave={saveThemeToArbi}\n />\n </aside>\n )}\n </div>\n </div>\n )\n}\n","/**\n * PageRenderer — the public, read-only renderer for a studio-authored page.\n *\n * Loads the **published** Puck `data` for a slug (ARBI → localStorage) and paints\n * it with <Render>. The published copy is self-contained — its image refs were\n * materialized to `data:` URIs at publish — so this renders with no auth (no asset\n * resolver). Falls back to the authoring layout for pages saved before publish.\n * Also applies any persisted theme so a published page looks exactly as it did in\n * the editor. Intended to be mounted at a public route.\n *\n * Firm-agnostic: the block config, persistence, theme defaults and empty-state\n * copy arrive as props; `live` is passed in (never read from env).\n */\nimport { useEffect, useState } from 'react'\nimport { useParams } from 'react-router-dom'\nimport { Render, type Config, type Data } from '@measured/puck'\nimport { useArbi } from '@arbidocs/react'\nimport { applyThemeVars, type ThemeTokens } from '../theme/tokens'\nimport { LiveDataProvider } from './liveWidgetRuntime'\nimport type { StudioPersistence } from './types'\n\nexport interface PageRendererProps {\n config: Config\n persistence: StudioPersistence\n defaultTheme: ThemeTokens\n live: boolean\n slug?: string\n emptyState?: { title: string; body: string }\n testIdPrefix?: string\n /**\n * Render inside a {@link LiveDataProvider}, so live-widget blocks resolve real\n * ARBI data. Only pass this when mounting the renderer INSIDE the authenticated\n * app tree (providers + a selected workspace present); on the public site leave\n * it off and widgets render placeholders.\n */\n liveData?: boolean\n /**\n * Render this page verbatim instead of loading a slug from persistence — for an\n * in-code page (e.g. a config-authored in-app board) that isn't a published\n * studio document. The slug is ignored.\n */\n initialData?: Data\n /**\n * Apply the persisted studio theme to the document (default true). Turn OFF for\n * an in-app renderer so it keeps the ambient app theme instead of repainting the\n * whole document with the marketing palette.\n */\n applyTheme?: boolean\n}\n\nexport function PageRenderer({\n config,\n persistence,\n defaultTheme,\n live,\n slug: slugProp,\n emptyState,\n testIdPrefix = 'studio',\n liveData = false,\n initialData,\n applyTheme = true,\n}: PageRendererProps) {\n const params = useParams()\n const slug = slugProp ?? params.slug ?? 'home'\n const arbi = useArbi()\n\n const [data, setData] = useState<Data | null>(initialData ?? null)\n const [loading, setLoading] = useState(!initialData)\n\n useEffect(() => {\n let cancelled = false\n setLoading(!initialData)\n void (async () => {\n // Optionally load + apply the studio theme (off for an in-app renderer, so\n // it keeps the ambient app palette instead of the marketing one).\n const theme = applyTheme\n ? (await persistence.loadTheme<ThemeTokens>(arbi, live)).data\n : undefined\n if (cancelled) return\n // An in-code page renders verbatim; otherwise load the published layout\n // (falling back to the authoring layout for pages that predate a publish).\n const page =\n initialData ??\n (await persistence.loadPublished<Data>(arbi, live, slug)).data ??\n (await persistence.loadPage<Data>(arbi, live, slug)).data\n if (cancelled) return\n if (applyTheme) {\n applyThemeVars(\n theme\n ? { ...defaultTheme, ...theme, colors: { ...defaultTheme.colors, ...theme.colors } }\n : defaultTheme\n )\n }\n setData(page)\n setLoading(false)\n })()\n return () => {\n cancelled = true\n }\n }, [arbi, live, slug, persistence, defaultTheme, initialData, applyTheme])\n\n if (loading) {\n return (\n <div\n className=\"flex min-h-[60vh] items-center justify-center text-sm text-muted-foreground\"\n data-testid={`${testIdPrefix}-render-loading`}\n >\n Loading page…\n </div>\n )\n }\n\n if (!data || data.content.length === 0) {\n const title = emptyState?.title ?? 'Nothing published yet'\n const body = emptyState?.body ?? `Publish the “${slug}” page to see it here.`\n return (\n <div\n className=\"mx-auto max-w-2xl px-5 py-24 text-center\"\n data-testid={`${testIdPrefix}-render-empty`}\n >\n <h1 className=\"font-display text-2xl font-semibold text-foreground\">{title}</h1>\n <p className=\"mt-2 text-sm text-muted-foreground\">{body}</p>\n </div>\n )\n }\n\n const rendered = <Render config={config} data={data} />\n return (\n <main data-testid={`page-${testIdPrefix}-render`}>\n {liveData ? <LiveDataProvider>{rendered}</LiveDataProvider> : rendered}\n </main>\n )\n}\n","/**\n * Studio persistence — save/load the Puck page `data` (and the theme) to a\n * firm's public marketing workspace, with a robust localStorage fallback.\n *\n * Contract:\n * - Pages are stored as JSON documents named `<slug>.json` in the `site/`\n * folder of the configured workspace.\n * - The theme is stored as `theme.json` in the same folder.\n * - Whichever path is taken (\"arbi\" | \"local\") is logged and returned, so the\n * UI can show where the content lives. We always mirror to localStorage so a\n * save is never silently lost when the backend is unavailable (demo mode).\n *\n * Firm-agnostic: {@link createStudioPersistence} closes the workspace, folder\n * and storage-key constants over a config, returning a {@link StudioPersistence}.\n */\nimport type { useArbi } from '@arbidocs/react'\nimport type { LoadResult, PersistVia, StudioPersistence } from './types'\n\n/** The Arbi instance type, borrowed from the hook so we don't import internals. */\ntype Arbi = ReturnType<typeof useArbi>\n\nexport interface StudioPersistenceConfig {\n /** The public marketing workspace that backs the site builder. */\n workspaceId: string\n /** Folder inside the workspace where studio artefacts live. */\n folder?: string\n /** Prefix for the localStorage mirror keys (e.g. \"studio-\"). */\n storagePrefix: string\n /** localStorage key for the theme mirror (default `${storagePrefix}theme`). */\n themeStorageKey?: string\n /** File name for the persisted theme document (default \"theme.json\"). */\n themeFileName?: string\n /** File name for a page's persisted document (default `${slug}.json`). */\n pageFileName?: (slug: string) => string\n /** File name for a page's published document (default `${slug}.published.json`). */\n publishedFileName?: (slug: string) => string\n}\n\nexport function createStudioPersistence(cfg: StudioPersistenceConfig): StudioPersistence {\n const WORKSPACE_ID = cfg.workspaceId\n const FOLDER = cfg.folder ?? 'site'\n const pageKey = (slug: string) => `${cfg.storagePrefix}${slug}`\n const publishedKey = (slug: string) => `${cfg.storagePrefix}published-${slug}`\n const THEME_KEY = cfg.themeStorageKey ?? `${cfg.storagePrefix}theme`\n const THEME_FILE = cfg.themeFileName ?? 'theme.json'\n const pageFile = cfg.pageFileName ?? ((slug: string) => `${slug}.json`)\n const publishedFile = cfg.publishedFileName ?? ((slug: string) => `${slug}.published.json`)\n\n /** Should we even attempt the live backend? Demo sessions have no real store. */\n function canUseArbi(arbi: Arbi | null, live: boolean): arbi is Arbi {\n return live && !!arbi\n }\n\n /** Write JSON to the workspace as a named document; throws on failure. */\n async function uploadJson(arbi: Arbi, fileName: string, obj: unknown): Promise<void> {\n await arbi.selectWorkspace(WORKSPACE_ID)\n const blob = new Blob([JSON.stringify(obj, null, 2)], { type: 'application/json' })\n await arbi.documents.uploadFile(blob, fileName, { folder: FOLDER })\n }\n\n /** Read + parse the most recent `site/<fileName>` document, or null if absent. */\n async function downloadJson<T>(arbi: Arbi, fileName: string): Promise<T | null> {\n await arbi.selectWorkspace(WORKSPACE_ID)\n const docs = await arbi.documents.list()\n // Newest wins if the same name was uploaded more than once.\n const match = docs\n .filter((d) => (d.file_name ?? '').endsWith(fileName) && (d.folder ?? '').includes(FOLDER))\n .sort((a, b) => (a.created_at < b.created_at ? 1 : -1))[0]\n if (!match) return null\n\n // Prefer the raw bytes (round-trips JSON exactly); fall back to parsed content.\n try {\n const res = await arbi.documents.download(match.external_id)\n return JSON.parse(await res.text()) as T\n } catch {\n const parsed = await arbi.documents.getParsedContent(match.external_id, 'content')\n const raw = typeof parsed?.content === 'string' ? parsed.content : JSON.stringify(parsed)\n return JSON.parse(raw) as T\n }\n }\n\n /** Persist a page-shaped artifact (authoring or published). Mirrors to localStorage. */\n async function writePage(\n arbi: Arbi | null,\n live: boolean,\n kind: string,\n localKey: string,\n fileName: string,\n data: unknown\n ): Promise<PersistVia> {\n try {\n localStorage.setItem(localKey, JSON.stringify(data))\n } catch {\n /* storage may be unavailable; the ARBI path can still succeed */\n }\n if (canUseArbi(arbi, live)) {\n try {\n await uploadJson(arbi, fileName, data)\n console.info(`[studio] saved ${kind} \"${fileName}\" → ARBI (${WORKSPACE_ID})`)\n return 'arbi'\n } catch (e) {\n console.warn(`[studio] ARBI save failed for \"${fileName}\", kept localStorage`, e)\n }\n }\n console.info(`[studio] saved ${kind} \"${fileName}\" → localStorage`)\n return 'local'\n }\n\n /** Load a page-shaped artifact. Prefers ARBI, falls back to localStorage. */\n async function readPage<T>(\n arbi: Arbi | null,\n live: boolean,\n localKey: string,\n fileName: string\n ): Promise<LoadResult<T>> {\n if (canUseArbi(arbi, live)) {\n try {\n const data = await downloadJson<T>(arbi, fileName)\n if (data) return { data, via: 'arbi' }\n } catch (e) {\n console.warn(`[studio] ARBI load failed for \"${fileName}\", trying localStorage`, e)\n }\n }\n const raw = safeLocalGet(localKey)\n return { data: raw ? (JSON.parse(raw) as T) : null, via: 'local' }\n }\n\n /** Persist a page's authoring layout (image values stay `asset:` refs). */\n function savePage(arbi: Arbi | null, live: boolean, slug: string, data: unknown) {\n return writePage(arbi, live, 'page', pageKey(slug), pageFile(slug), data)\n }\n\n function loadPage<T>(arbi: Arbi | null, live: boolean, slug: string) {\n return readPage<T>(arbi, live, pageKey(slug), pageFile(slug))\n }\n\n /** Persist a page's published (materialized) layout, read by the public renderer. */\n function savePublished(arbi: Arbi | null, live: boolean, slug: string, data: unknown) {\n return writePage(arbi, live, 'published page', publishedKey(slug), publishedFile(slug), data)\n }\n\n function loadPublished<T>(arbi: Arbi | null, live: boolean, slug: string) {\n return readPage<T>(arbi, live, publishedKey(slug), publishedFile(slug))\n }\n\n /** Delete a slug's stored pages (authoring + published) from the backend and\n * the localStorage mirror, so the page resets to empty / a fresh seed governs. */\n async function deletePage(arbi: Arbi | null, live: boolean, slug: string): Promise<void> {\n try {\n localStorage.removeItem(pageKey(slug))\n localStorage.removeItem(publishedKey(slug))\n } catch {\n /* storage may be unavailable */\n }\n if (!canUseArbi(arbi, live)) return\n try {\n await arbi.selectWorkspace(WORKSPACE_ID)\n const docs = await arbi.documents.list()\n const names = [pageFile(slug), publishedFile(slug)]\n const ids = docs\n .filter(\n (d) =>\n (d.folder ?? '').includes(FOLDER) && names.some((n) => (d.file_name ?? '').endsWith(n))\n )\n .map((d) => d.external_id)\n if (ids.length) await arbi.documents.delete(ids)\n console.info(`[studio] deleted ${ids.length} doc(s) for \"${slug}\" from ARBI`)\n } catch (e) {\n console.warn(`[studio] ARBI delete failed for \"${slug}\"`, e)\n }\n }\n\n /** Persist the theme token set. */\n async function saveTheme(arbi: Arbi | null, live: boolean, theme: unknown): Promise<PersistVia> {\n try {\n localStorage.setItem(THEME_KEY, JSON.stringify(theme))\n } catch {\n /* ignore */\n }\n if (canUseArbi(arbi, live)) {\n try {\n await uploadJson(arbi, THEME_FILE, theme)\n console.info(`[studio] saved theme → ARBI (${WORKSPACE_ID})`)\n return 'arbi'\n } catch (e) {\n console.warn('[studio] ARBI theme save failed, kept localStorage', e)\n }\n }\n console.info('[studio] saved theme → localStorage')\n return 'local'\n }\n\n /** Load the theme token set. */\n async function loadTheme<T>(arbi: Arbi | null, live: boolean): Promise<LoadResult<T>> {\n if (canUseArbi(arbi, live)) {\n try {\n const data = await downloadJson<T>(arbi, THEME_FILE)\n if (data) return { data, via: 'arbi' }\n } catch (e) {\n console.warn('[studio] ARBI theme load failed, trying localStorage', e)\n }\n }\n const raw = safeLocalGet(THEME_KEY)\n return { data: raw ? (JSON.parse(raw) as T) : null, via: 'local' }\n }\n\n function safeLocalGet(key: string): string | null {\n try {\n return localStorage.getItem(key)\n } catch {\n return null\n }\n }\n\n return { savePage, loadPage, savePublished, loadPublished, deletePage, saveTheme, loadTheme }\n}\n","/**\n * \"Write with AI\" fields — custom Puck fields that render a text input/area plus\n * a control that drafts copy grounded in a firm's marketing workspace documents\n * (via the AI kit's `useAiTask`).\n *\n * The generation is non-blocking: the button shows a spinner while streaming and\n * the field fills live as tokens arrive. \"AI proposes\" — the editor still edits\n * and publishes the copy themselves. Firm-agnostic: {@link createAiFields} closes\n * the workspace id, prompt voice and testid prefix over a config.\n */\nimport { useEffect, useRef, useState } from 'react'\nimport { Loader2, Sparkles } from 'lucide-react'\nimport type { CustomField } from '@measured/puck'\nimport { useAiTask, useWorkspaceDocs as useKitWorkspaceDocs } from '@arbidocs/react'\nimport { tid } from '../lib/testid'\nimport type { BuildPrompt } from './types'\n\nexport interface AiFieldsConfig {\n /** The marketing workspace the AI grounds on. */\n workspaceId: string\n /** Turns a field's kind/label/current text into an instruction. */\n buildPrompt: BuildPrompt\n /** Default prompt kind when a field does not specify one. */\n defaultKind?: string\n /** Testid namespace for the field + write button. */\n testIdPrefix?: string\n}\n\nexport interface AiFields {\n aiText: (label: string, placeholder?: string) => CustomField<string>\n aiTextarea: (label: string, placeholder?: string, kind?: string) => CustomField<string>\n}\n\ninterface AiTextFieldProps {\n value: string\n onChange: (v: string) => void\n name: string\n label: string\n multiline?: boolean\n placeholder?: string\n kind: string\n workspaceId: string\n buildPrompt: BuildPrompt\n testIdPrefix: string\n}\n\nfunction AiTextField({\n value,\n onChange,\n name,\n label,\n multiline,\n placeholder,\n kind,\n workspaceId,\n buildPrompt,\n testIdPrefix,\n}: AiTextFieldProps) {\n const { docIds } = useKitWorkspaceDocs(workspaceId)\n const task = useAiTask()\n const [active, setActive] = useState(false)\n const activeRef = useRef(false)\n\n // Stream tokens straight into the field while a generation is in flight.\n useEffect(() => {\n if (activeRef.current && task.text) onChange(task.text)\n }, [task.text, onChange])\n\n useEffect(() => {\n if (active && !task.isRunning) {\n activeRef.current = false\n setActive(false)\n }\n }, [active, task.isRunning])\n\n const write = async () => {\n if (task.isRunning) return\n activeRef.current = true\n setActive(true)\n await task.run(buildPrompt({ kind, label, current: value ?? '' }), docIds)\n }\n\n const inputTid = tid(`${testIdPrefix}-field`, name)\n\n return (\n <div className=\"al-ai-field\">\n {multiline ? (\n <textarea\n className=\"al-ai-field__input\"\n rows={5}\n value={value ?? ''}\n placeholder={placeholder}\n onChange={(e) => onChange(e.target.value)}\n data-testid={inputTid}\n />\n ) : (\n <input\n className=\"al-ai-field__input\"\n value={value ?? ''}\n placeholder={placeholder}\n onChange={(e) => onChange(e.target.value)}\n data-testid={inputTid}\n />\n )}\n <button\n type=\"button\"\n className=\"al-ai-field__btn\"\n onClick={() => void write()}\n disabled={task.isRunning}\n data-testid={tid(`${testIdPrefix}-ai-write`, name)}\n title=\"Draft this field with AI, grounded in the marketing workspace\"\n >\n {task.isRunning ? (\n <Loader2 className=\"size-3 animate-spin\" />\n ) : (\n <Sparkles className=\"size-3\" />\n )}\n {task.isRunning ? 'Writing…' : 'Write with AI'}\n </button>\n </div>\n )\n}\n\nexport function createAiFields(cfg: AiFieldsConfig): AiFields {\n const { workspaceId, buildPrompt } = cfg\n const defaultKind = cfg.defaultKind ?? 'copy'\n const testIdPrefix = cfg.testIdPrefix ?? 'studio'\n\n /** An AI-authorable single-line text field. */\n const aiText = (label: string, placeholder?: string): CustomField<string> => ({\n type: 'custom',\n label,\n render: ({ value, onChange, name }) => (\n <AiTextField\n value={value ?? ''}\n onChange={onChange}\n name={name}\n label={label}\n placeholder={placeholder}\n kind={defaultKind}\n workspaceId={workspaceId}\n buildPrompt={buildPrompt}\n testIdPrefix={testIdPrefix}\n />\n ),\n })\n\n /** An AI-authorable multi-line text field. */\n const aiTextarea = (\n label: string,\n placeholder?: string,\n kind: string = defaultKind\n ): CustomField<string> => ({\n type: 'custom',\n label,\n render: ({ value, onChange, name }) => (\n <AiTextField\n value={value ?? ''}\n onChange={onChange}\n name={name}\n label={label}\n placeholder={placeholder}\n kind={kind}\n workspaceId={workspaceId}\n buildPrompt={buildPrompt}\n testIdPrefix={testIdPrefix}\n multiline\n />\n ),\n })\n\n return { aiText, aiTextarea }\n}\n","/**\n * useImageGen — the typed capability hook behind image generation.\n *\n * Wraps the firm AI task with the `/image` slash-command contract so callers\n * never hand-assemble the command string or dig the generated document out of\n * the artifact stream. `/image <prompt>` runs the normal agent loop with the\n * image tool force-enabled (backend `create_image`); the produced PNG arrives\n * as an `ArtifactEvent` with `mode: 'image'` carrying the workspace document\n * ext_id — which is what gets stored as the asset reference.\n */\nimport { useCallback, useMemo } from 'react'\nimport type { AiTaskStatus, ArtifactEvent } from './ai'\nimport { useFirmAiTask } from './ai'\n\n/** ext_id of the newest image artifact in a list, or null if there is none. */\nfunction latestImageDocId(artifacts: readonly ArtifactEvent[]): string | null {\n for (let i = artifacts.length - 1; i >= 0; i--) {\n if (artifacts[i].mode === 'image') return artifacts[i].doc_ext_id\n }\n return null\n}\n\nexport interface UseImageGen {\n /** ext_id of the most recently generated image document (null until one exists). */\n docExtId: string | null\n /** Underlying task status: 'idle' | 'running' | 'done' | 'error'. */\n status: AiTaskStatus\n /** Human-readable failure message, or null. */\n error: string | null\n /** True while a generation is in flight. */\n isGenerating: boolean\n /**\n * Generate an image from a prompt. Resolves with the new image document's\n * ext_id, or null when the prompt is empty or no image was produced.\n */\n generate: (prompt: string) => Promise<string | null>\n /** Clear the current result and error. */\n reset: () => void\n}\n\nexport function useImageGen(): UseImageGen {\n const task = useFirmAiTask()\n const { run } = task\n\n const generate = useCallback(\n async (prompt: string): Promise<string | null> => {\n const trimmed = prompt.trim()\n if (!trimmed) return null\n // `/image` rides the agent pipeline and needs no doc grounding — the\n // backend resolves the active workspace from the session.\n const result = await run(`/image ${trimmed}`, [])\n return latestImageDocId(result?.artifacts ?? [])\n },\n [run]\n )\n\n const docExtId = useMemo(() => latestImageDocId(task.artifacts), [task.artifacts])\n\n return {\n docExtId,\n status: task.status,\n error: task.error,\n isGenerating: task.isRunning,\n generate,\n reset: task.reset,\n }\n}\n","/**\n * The image field — a custom Puck field for choosing an image any of the ways an\n * author expects: pick an existing **workspace asset**, **upload** from the\n * computer, paste a **URL**, or **generate** one with AI. Upload and generate both\n * save a workspace document, so every image lands in the reusable asset library.\n *\n * The stored value is a workspace **asset ref** (`asset:<docId>`) for asset /\n * upload / generate, or a plain URL for the URL mode. The editor previews a ref\n * via its thumbnail (see {@link AssetResolverProvider}); at publish the ref is\n * inlined to a `data:` URI (see the studio publish step). Firm-agnostic:\n * {@link createImageField} closes the workspace id and testid prefix over a config.\n */\nimport { useMemo, useState, type ChangeEvent } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { ImagePlus, Link2, Loader2, Sparkles, Upload } from 'lucide-react'\nimport type { CustomField } from '@measured/puck'\nimport { useArbi, useDocuments, useThumbnails } from '@arbidocs/react'\nimport { asAssetRef } from '../components/assetResolver'\nimport { BlockImage } from '../components/BlockImage'\nimport { useImageGen } from '../connection/useImageGen'\nimport { tid } from '../lib/testid'\n\nexport interface ImageFieldConfig {\n /** The workspace uploads/generations are saved to, and assets are picked from. */\n workspaceId: string\n /** Folder for uploaded/authored assets. Default \"assets\". */\n folder?: string\n /** Testid namespace. Default \"studio\". */\n testIdPrefix?: string\n}\n\nexport interface ImageFieldFactory {\n imageField: (label: string) => CustomField<string>\n}\n\ntype Mode = 'asset' | 'upload' | 'url' | 'generate'\n\ninterface ControlProps {\n value: string\n onChange: (v: string) => void\n name: string\n workspaceId: string\n folder: string\n testIdPrefix: string\n}\n\nconst IMAGE_EXT = /\\.(png|jpe?g|webp|gif|avif|svg)$/i\n\nfunction ImageFieldControl({\n value,\n onChange,\n name,\n workspaceId,\n folder,\n testIdPrefix,\n}: ControlProps) {\n const [mode, setMode] = useState<Mode>('asset')\n const [url, setUrl] = useState('')\n const [prompt, setPrompt] = useState('')\n const [busy, setBusy] = useState(false)\n const arbi = useArbi()\n const gen = useImageGen()\n const queryClient = useQueryClient()\n\n const tp = (...q: (string | number)[]) => tid(`${testIdPrefix}-image`, name, ...q)\n\n // A freshly uploaded/generated asset must appear in the picker grid at once —\n // refresh the workspace document list (and its thumbnails) so it's selectable.\n const refreshAssets = () =>\n queryClient.invalidateQueries({ queryKey: ['arbi', 'documents', workspaceId] })\n\n // Workspace image documents, for the \"pick an existing asset\" grid.\n const { data: docs } = useDocuments(workspaceId)\n const imageDocs = useMemo(\n () =>\n (docs ?? []).filter(\n (d: { file_name?: string | null }) => d.file_name && IMAGE_EXT.test(d.file_name)\n ),\n [docs]\n )\n const imageIds = useMemo(\n () => imageDocs.map((d: { external_id: string }) => d.external_id),\n [imageDocs]\n )\n const { data: thumbs } = useThumbnails(imageIds)\n\n const onUpload = async (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (!file) return\n setBusy(true)\n try {\n await arbi.selectWorkspace(workspaceId)\n const res = await arbi.documents.uploadFile(file, file.name, { folder })\n const id = res.doc_ext_ids?.[0]\n if (id) {\n onChange(asAssetRef(id))\n void refreshAssets()\n }\n } finally {\n setBusy(false)\n }\n }\n\n const onGenerate = async () => {\n if (!prompt.trim() || gen.isGenerating) return\n const id = await gen.generate(prompt)\n if (id) {\n onChange(asAssetRef(id))\n void refreshAssets()\n }\n }\n\n const MODES: { key: Mode; label: string; icon: typeof Upload }[] = [\n { key: 'asset', label: 'Assets', icon: ImagePlus },\n { key: 'upload', label: 'Upload', icon: Upload },\n { key: 'url', label: 'URL', icon: Link2 },\n { key: 'generate', label: 'Generate', icon: Sparkles },\n ]\n\n const inputClass =\n 'w-full rounded-md border border-border bg-card px-2.5 py-1.5 text-sm text-foreground outline-none focus:border-primary'\n const tabClass = (on: boolean) =>\n `inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs font-medium ${\n on ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:text-foreground'\n }`\n\n return (\n <div className=\"flex flex-col gap-2\" data-testid={tp()}>\n <BlockImage src={value} aspect=\"16:9\" rounded=\"md\" testId={tp('preview')} />\n\n <div className=\"flex flex-wrap gap-1\">\n {MODES.map((m) => (\n <button\n key={m.key}\n type=\"button\"\n className={tabClass(mode === m.key)}\n onClick={() => setMode(m.key)}\n data-testid={tp('mode', m.key)}\n >\n <m.icon className=\"size-3\" /> {m.label}\n </button>\n ))}\n </div>\n\n {mode === 'asset' && (\n <div className=\"grid max-h-48 grid-cols-3 gap-1.5 overflow-auto\" data-testid={tp('assets')}>\n {imageDocs.length === 0 && (\n <p className=\"col-span-3 py-3 text-center text-xs text-muted-foreground\">\n No image assets yet — upload or generate one.\n </p>\n )}\n {imageDocs.map((d: { external_id: string; file_name?: string | null }) => {\n const thumb = thumbs?.[d.external_id]\n const selected = value === asAssetRef(d.external_id)\n return (\n <button\n key={d.external_id}\n type=\"button\"\n onClick={() => onChange(asAssetRef(d.external_id))}\n className={`overflow-hidden rounded border ${selected ? 'border-primary ring-1 ring-primary' : 'border-border'}`}\n title={d.file_name ?? ''}\n data-testid={tp('asset', d.external_id)}\n >\n {thumb ? (\n <img\n src={thumb}\n alt={d.file_name ?? ''}\n className=\"aspect-square w-full bg-muted object-contain\"\n />\n ) : (\n <span className=\"flex aspect-square w-full items-center justify-center bg-muted text-muted-foreground\">\n <ImagePlus className=\"size-4\" />\n </span>\n )}\n </button>\n )\n })}\n </div>\n )}\n\n {mode === 'upload' && (\n <label className=\"inline-flex cursor-pointer items-center gap-2 rounded-md border border-border px-2.5 py-1.5 text-sm text-foreground\">\n {busy ? <Loader2 className=\"size-4 animate-spin\" /> : <Upload className=\"size-4\" />}\n {busy ? 'Uploading…' : 'Choose a file'}\n <input\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n disabled={busy}\n onChange={(e) => void onUpload(e)}\n data-testid={tp('upload')}\n />\n </label>\n )}\n\n {mode === 'url' && (\n <div className=\"flex gap-1.5\">\n <input\n className={inputClass}\n placeholder=\"https://…\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n data-testid={tp('url')}\n />\n <button\n type=\"button\"\n className=\"rounded-md bg-primary px-2.5 py-1.5 text-sm font-medium text-primary-foreground disabled:opacity-50\"\n disabled={!url.trim()}\n onClick={() => onChange(url.trim())}\n data-testid={tp('url-apply')}\n >\n Use\n </button>\n </div>\n )}\n\n {mode === 'generate' && (\n <div className=\"flex flex-col gap-1.5\">\n <textarea\n className={inputClass}\n rows={2}\n placeholder=\"Describe the image…\"\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n data-testid={tp('prompt')}\n />\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1.5 self-start rounded-md bg-primary px-2.5 py-1.5 text-sm font-medium text-primary-foreground disabled:opacity-50\"\n disabled={!prompt.trim() || gen.isGenerating}\n onClick={() => void onGenerate()}\n data-testid={tp('generate')}\n >\n {gen.isGenerating ? (\n <Loader2 className=\"size-3.5 animate-spin\" />\n ) : (\n <Sparkles className=\"size-3.5\" />\n )}\n {gen.isGenerating ? 'Generating…' : 'Generate'}\n </button>\n {gen.error && (\n <span className=\"text-xs text-destructive\" role=\"alert\">\n {gen.error}\n </span>\n )}\n </div>\n )}\n\n {value && (\n <button\n type=\"button\"\n className=\"self-start text-xs text-muted-foreground hover:text-foreground\"\n onClick={() => onChange('')}\n data-testid={tp('clear')}\n >\n Clear\n </button>\n )}\n </div>\n )\n}\n\n/** Build the image field, closing over the firm's workspace + testid prefix. */\nexport function createImageField(cfg: ImageFieldConfig): ImageFieldFactory {\n const { workspaceId } = cfg\n const folder = cfg.folder ?? 'assets'\n const testIdPrefix = cfg.testIdPrefix ?? 'studio'\n\n const imageField = (label: string): CustomField<string> => ({\n type: 'custom',\n label,\n render: ({ value, onChange, name }) => (\n <ImageFieldControl\n value={value ?? ''}\n onChange={onChange}\n name={name}\n workspaceId={workspaceId}\n folder={folder}\n testIdPrefix={testIdPrefix}\n />\n ),\n })\n\n return { imageField }\n}\n","/**\n * Standard section shell — max-width, padding and an optional tone. Token-only so\n * it themes to whatever app consumes it; shared by blocks that echo a page's\n * section rhythm.\n *\n * The `ink` tone is a true **dark island**: it scopes a full inverted `--color-*`\n * context (background↔foreground swapped, card/muted/border derived), so any child\n * block that uses semantic tokens renders correctly on a dark surface. This lets a\n * single page mix genuinely light and dark sections.\n */\nimport type { CSSProperties, ReactNode } from 'react'\nimport { cn } from '@arbidocs/react'\n\nexport type SectionTone = 'default' | 'muted' | 'ink'\nexport type SectionPadding = 'none' | 'sm' | 'md' | 'lg'\nexport type SectionWidth = 'narrow' | 'default' | 'wide' | 'full'\n\nexport interface SectionProps {\n children: ReactNode\n tone?: SectionTone\n padding?: SectionPadding\n maxWidth?: SectionWidth\n /** Subtle grain/texture overlay in the current text colour (editorial surfaces). */\n texture?: boolean\n className?: string\n}\n\n/** A dependency-free micro-dot grain in `currentColor`, kept very faint. */\nconst TEXTURE_STYLE: CSSProperties = {\n backgroundImage: 'radial-gradient(currentColor 0.5px, transparent 0.5px)',\n backgroundSize: '4px 4px',\n opacity: 0.04,\n}\n\nconst PADDING: Record<SectionPadding, string> = {\n none: '',\n sm: 'py-8 lg:py-10',\n md: 'py-16 lg:py-20',\n lg: 'py-24 lg:py-28',\n}\n\nconst WIDTH: Record<SectionWidth, string> = {\n narrow: 'max-w-3xl',\n default: 'max-w-7xl',\n wide: 'max-w-[90rem]',\n full: 'max-w-none',\n}\n\n/** A scoped inverted token context — the \"dark island\". */\nconst INVERTED_VARS: CSSProperties = {\n ['--color-background' as string]: 'var(--color-foreground)',\n ['--color-foreground' as string]: 'var(--color-background)',\n ['--color-card' as string]: 'color-mix(in srgb, var(--color-foreground) 92%, #fff)',\n ['--color-muted' as string]: 'color-mix(in srgb, var(--color-foreground) 85%, #fff)',\n ['--color-muted-foreground' as string]:\n 'color-mix(in srgb, var(--color-background) 60%, transparent)',\n ['--color-border' as string]: 'color-mix(in srgb, var(--color-background) 18%, transparent)',\n ['--color-accent' as string]: 'color-mix(in srgb, var(--color-foreground) 80%, #fff)',\n}\n\nexport function Section({\n children,\n tone = 'default',\n padding = 'md',\n maxWidth = 'default',\n texture,\n className = '',\n}: SectionProps) {\n const inverted = tone === 'ink'\n const toneClass = inverted\n ? 'bg-background text-foreground'\n : tone === 'muted'\n ? 'border-y border-border bg-card/40'\n : ''\n return (\n <section className={cn('relative', toneClass)} style={inverted ? INVERTED_VARS : undefined}>\n {texture && (\n <div className=\"pointer-events-none absolute inset-0\" style={TEXTURE_STYLE} aria-hidden />\n )}\n <div\n className={cn(\n 'relative mx-auto px-5 lg:px-8',\n WIDTH[maxWidth],\n PADDING[padding],\n className\n )}\n >\n {children}\n </div>\n </section>\n )\n}\n","/**\n * Shared field helpers for the block registry. Every block config — the built-ins\n * in {@link createArbiBlocksConfig} and the website blocks in\n * {@link file://./websiteBlocks.tsx} — builds its Puck fields from this one kit so\n * the AI-or-plain copy fallback, the icon `select`, the tone/bool radios and the\n * stable render-time testid are declared once.\n */\nimport type { Field } from '@measured/puck'\nimport type { LucideIcon } from 'lucide-react'\nimport {\n Activity,\n AlertCircle,\n Award,\n BarChart3,\n Bell,\n Briefcase,\n Calendar,\n CheckCircle,\n Clock,\n Cloud,\n Code,\n Cpu,\n DollarSign,\n FileText,\n Folder,\n Gavel,\n Globe,\n Heart,\n Info,\n Layers,\n Lock,\n Mail,\n MapPin,\n MessageSquare,\n Phone,\n Rocket,\n Scale,\n Shield,\n Sparkles,\n Star,\n Target,\n TrendingUp,\n Users,\n Zap,\n} from 'lucide-react'\nimport { tid } from '../lib/testid'\nimport type { AiFields } from './aiFields'\n\n// ── Icon registry ─────────────────────────────────────────────────────────────\n// A curated set of common back-office + marketing icons exposed as a `select`. The\n// editor picks a name; {@link BlockKit.resolveIcon} maps it back to the component.\nexport const iconMap: Record<string, LucideIcon> = {\n FileText,\n Folder,\n Users,\n Briefcase,\n Calendar,\n Clock,\n CheckCircle,\n AlertCircle,\n Info,\n TrendingUp,\n DollarSign,\n BarChart3,\n Activity,\n Bell,\n Scale,\n Gavel,\n Sparkles,\n // Marketing set\n Zap,\n Shield,\n Rocket,\n Star,\n Heart,\n Globe,\n Lock,\n Mail,\n Phone,\n MapPin,\n Award,\n Target,\n Layers,\n Cloud,\n Code,\n Cpu,\n MessageSquare,\n}\n\nconst ICON_OPTIONS = [\n { label: 'None', value: '' },\n ...Object.keys(iconMap).map((name) => ({ label: name, value: name })),\n]\n\n/** The bundle of field helpers a block config needs. */\nexport interface BlockKit {\n /** Single-line copy: AI-authorable when a firm supplies aiFields, else plain text. */\n textField: (label: string, placeholder?: string) => Field\n /** Multi-line copy: AI-authorable when a firm supplies aiFields, else plain textarea. */\n textareaField: (label: string, placeholder?: string, kind?: string) => Field\n /** Image source: a workspace-asset picker when a firm supplies imageField, else a URL input. */\n imageField: (label: string) => Field\n /** A Yes/No radio. */\n boolRadio: (label: string) => Field\n /** A `select` over {@link iconMap} names. */\n iconField: (label?: string) => Field\n /** Resolve an icon name to its Lucide component. */\n resolveIcon: (name?: string) => LucideIcon | undefined\n /** Stable, e2e-locatable testid derived from a block's Puck id. */\n blockTestId: (id: string) => string\n /**\n * Optional firm override for the eyebrow style on heading-bearing blocks\n * (Hero, Section heading). Lets a consumer render a brand accent (e.g. a brass\n * eyebrow) without forking the blocks. Undefined → the default token classes.\n */\n eyebrowClassName?: string\n}\n\n/** Build the shared field helpers, closing over the firm's optional AI + image fields. */\nexport function createBlockKit(\n ai?: AiFields,\n image?: (label: string) => Field,\n eyebrowClassName?: string\n): BlockKit {\n return {\n eyebrowClassName,\n textField: (label, placeholder) =>\n ai ? (ai.aiText(label, placeholder) as Field) : { type: 'text', label, placeholder },\n textareaField: (label, placeholder, kind) =>\n ai\n ? (ai.aiTextarea(label, placeholder, kind) as Field)\n : { type: 'textarea', label, placeholder },\n imageField: (label) => (image ? image(label) : { type: 'text', label }),\n boolRadio: (label) => ({\n type: 'radio',\n label,\n options: [\n { label: 'No', value: false },\n { label: 'Yes', value: true },\n ],\n }),\n iconField: (label = 'Icon') => ({ type: 'select', label, options: ICON_OPTIONS }),\n resolveIcon: (name) => (name ? iconMap[name] : undefined),\n blockTestId: (id) => tid('arbi-block', id),\n }\n}\n","/**\n * Website-building blocks for the shared registry — the marketing vocabulary a user\n * drags to design a full site: heroes, feature grids, stats, testimonials, CTAs,\n * FAQs, navigation, media and layout primitives.\n *\n * Every block is serializable-only (text/textarea/number/radio/select/array/object/\n * slot/custom-AI — no function/ReactNode props), token-clean (semantic tokens so D1\n * live-theming recolours it), routes copy through the shared AI-or-plain fields, has\n * a stable render-time `data-testid`, and ships sensible defaults so it looks good\n * the moment it is dropped.\n */\nimport type { ComponentType, ReactNode } from 'react'\nimport type { ComponentConfig, Field } from '@measured/puck'\nimport type { BlockKit } from './blockKit'\nimport { Hero } from '../components/Hero'\nimport { FeatureGrid } from '../components/FeatureGrid'\nimport { StatGroup } from '../components/StatGroup'\nimport { Testimonial } from '../components/Testimonial'\nimport { CTABanner } from '../components/CTABanner'\nimport { LogoCloud } from '../components/LogoCloud'\nimport { FAQ } from '../components/FAQ'\nimport { RichTextBlock } from '../components/RichTextBlock'\nimport { Callout } from '../components/Callout'\nimport { BlockImage } from '../components/BlockImage'\nimport { AvatarBlock } from '../components/AvatarBlock'\nimport { Navbar } from '../components/Navbar'\nimport { Footer } from '../components/Footer'\nimport { ListBlock } from '../components/ListBlock'\nimport { Columns } from '../components/Columns'\nimport { Spacer } from '../components/Spacer'\nimport { Container } from '../components/Container'\n\n// Puck injects a component for each slot at render; default to an empty array.\nconst emptySlot = [] as unknown as ReactNode\nconst renderSlot = (slot: unknown): ReactNode => {\n if (typeof slot !== 'function') return null\n const Slot = slot as ComponentType\n return <Slot />\n}\n\nconst toneField: Field = {\n type: 'radio',\n label: 'Tone',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Muted', value: 'muted' },\n { label: 'Ink', value: 'ink' },\n ],\n}\n\n/** Build every website block, closing over the shared field {@link BlockKit}. */\nexport function createWebsiteBlocks(kit: BlockKit): Record<string, ComponentConfig> {\n const { textField, textareaField, imageField, boolRadio, iconField, resolveIcon, blockTestId } =\n kit\n\n const ctaField = (label: string): Field => ({\n type: 'object',\n label,\n objectFields: {\n label: textField('Label'),\n href: { type: 'text', label: 'Link' },\n },\n })\n\n // ── Layout ──────────────────────────────────────────────────────────────────\n const ColumnsBlock: ComponentConfig = {\n label: 'Columns',\n fields: {\n count: {\n type: 'radio',\n label: 'Columns',\n options: [\n { label: '2', value: 2 },\n { label: '3', value: 3 },\n { label: '4', value: 4 },\n ],\n },\n gap: {\n type: 'radio',\n label: 'Gap',\n options: [\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n ],\n },\n col1: { type: 'slot' },\n col2: { type: 'slot' },\n col3: { type: 'slot' },\n col4: { type: 'slot' },\n },\n defaultProps: {\n count: 3,\n gap: 'md',\n col1: emptySlot,\n col2: emptySlot,\n col3: emptySlot,\n col4: emptySlot,\n },\n render: ({ id, count, gap, col1, col2, col3, col4 }) => {\n const n = Number(count) || 3\n const columns = [col1, col2, col3, col4].slice(0, n).map(renderSlot)\n return <Columns count={n as 2 | 3 | 4} gap={gap} columns={columns} testId={blockTestId(id)} />\n },\n }\n\n const SpacerBlock: ComponentConfig = {\n label: 'Spacer',\n fields: {\n size: {\n type: 'radio',\n label: 'Size',\n options: [\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n { label: 'XL', value: 'xl' },\n ],\n },\n },\n defaultProps: { size: 'md' },\n render: ({ id, size }) => <Spacer size={size} testId={blockTestId(id)} />,\n }\n\n const ContainerBlock: ComponentConfig = {\n label: 'Container',\n fields: {\n width: {\n type: 'radio',\n label: 'Width',\n options: [\n { label: 'Narrow', value: 'narrow' },\n { label: 'Default', value: 'default' },\n { label: 'Wide', value: 'wide' },\n { label: 'Full', value: 'full' },\n ],\n },\n padding: {\n type: 'radio',\n label: 'Padding',\n options: [\n { label: 'None', value: 'none' },\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n ],\n },\n children: { type: 'slot' },\n },\n defaultProps: { width: 'default', padding: 'md', children: emptySlot },\n render: ({ id, width, padding, children }) => (\n <Container width={width} padding={padding} testId={blockTestId(id)}>\n {renderSlot(children)}\n </Container>\n ),\n }\n\n // ── Marketing ───────────────────────────────────────────────────────────────\n const HeroBlock: ComponentConfig = {\n label: 'Hero',\n fields: {\n eyebrow: textField('Eyebrow'),\n title: textField('Title'),\n emphasis: { type: 'text', label: 'Emphasised word' },\n subtitle: textareaField('Subtitle', undefined, 'lead'),\n primaryCta: ctaField('Primary CTA'),\n secondaryCta: ctaField('Secondary CTA'),\n align: {\n type: 'radio',\n label: 'Align',\n options: [\n { label: 'Left', value: 'left' },\n { label: 'Center', value: 'center' },\n ],\n },\n tone: toneField,\n imageUrl: imageField('Side image'),\n backgroundImage: imageField('Background image'),\n overlay: boolRadio('Background overlay'),\n },\n defaultProps: {\n eyebrow: 'Introducing',\n title: 'Build a better website, faster.',\n emphasis: '',\n subtitle:\n 'A flexible platform that helps your team ship polished, on-brand pages without waiting on engineering.',\n primaryCta: { label: 'Get started', href: '#' },\n secondaryCta: { label: 'Learn more', href: '#' },\n align: 'left',\n tone: 'default',\n imageUrl: '',\n backgroundImage: '',\n overlay: true,\n },\n render: ({\n id,\n eyebrow,\n title,\n emphasis,\n subtitle,\n primaryCta,\n secondaryCta,\n align,\n tone,\n imageUrl,\n backgroundImage,\n overlay,\n }) => (\n <Hero\n eyebrow={eyebrow}\n title={title}\n emphasis={emphasis}\n subtitle={subtitle}\n primaryCta={primaryCta}\n secondaryCta={secondaryCta}\n align={align}\n tone={tone}\n imageUrl={imageUrl}\n backgroundImage={backgroundImage}\n overlay={overlay}\n eyebrowClassName={kit.eyebrowClassName}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const FeatureGridBlock: ComponentConfig = {\n label: 'Feature grid',\n fields: {\n columns: {\n type: 'radio',\n label: 'Columns',\n options: [\n { label: '2', value: '2' },\n { label: '3', value: '3' },\n ],\n },\n items: {\n type: 'array',\n label: 'Features',\n arrayFields: {\n icon: iconField(),\n title: textField('Title'),\n description: textareaField('Description'),\n },\n defaultItemProps: {\n icon: 'Sparkles',\n title: 'Feature',\n description: 'Describe this feature.',\n },\n getItemSummary: (item: { title?: string }) => item?.title || 'Feature',\n },\n },\n defaultProps: {\n columns: '3',\n items: [\n {\n icon: 'Zap',\n title: 'Fast by default',\n description: 'Ship pages in minutes with sensible, on-brand defaults.',\n },\n {\n icon: 'Shield',\n title: 'Secure & reliable',\n description: 'Enterprise-grade security baked into every layer.',\n },\n {\n icon: 'Layers',\n title: 'Composable',\n description: 'Mix and match blocks to build any layout you need.',\n },\n ],\n },\n render: ({ id, columns, items }) => {\n const list = (items ?? []).map(\n (it: { icon?: string; title: string; description?: string }) => ({\n ...it,\n icon: resolveIcon(it.icon),\n })\n )\n return <FeatureGrid columns={columns} items={list} testId={blockTestId(id)} />\n },\n }\n\n const StatGroupBlock: ComponentConfig = {\n label: 'Stat group',\n fields: {\n items: {\n type: 'array',\n label: 'Stats',\n arrayFields: {\n value: textField('Value'),\n label: textField('Label'),\n },\n defaultItemProps: { value: '100%', label: 'Metric' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Stat',\n },\n },\n defaultProps: {\n items: [\n { value: '10k+', label: 'Active users' },\n { value: '99.9%', label: 'Uptime' },\n { value: '4.9/5', label: 'Customer rating' },\n { value: '24/7', label: 'Support' },\n ],\n },\n render: ({ id, items }) => <StatGroup items={items} testId={blockTestId(id)} />,\n }\n\n const TestimonialBlock: ComponentConfig = {\n label: 'Testimonial',\n fields: {\n quote: textareaField('Quote'),\n author: textField('Author'),\n role: textField('Role'),\n avatarUrl: { type: 'text', label: 'Avatar URL' },\n },\n defaultProps: {\n quote: 'This is the best tool our team has adopted in years. It just works.',\n author: 'Alex Morgan',\n role: 'Head of Product, Northwind',\n avatarUrl: '',\n },\n render: ({ id, quote, author, role, avatarUrl }) => (\n <Testimonial\n quote={quote}\n author={author}\n role={role}\n avatarUrl={avatarUrl}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const CTABannerBlock: ComponentConfig = {\n label: 'CTA banner',\n fields: {\n title: textField('Title'),\n subtitle: textareaField('Subtitle'),\n cta: ctaField('Button'),\n tone: toneField,\n backgroundImage: imageField('Background image'),\n overlay: boolRadio('Background overlay'),\n },\n defaultProps: {\n title: 'Ready to get started?',\n subtitle: 'Join thousands of teams already building with us.',\n cta: { label: 'Start free trial', href: '#' },\n tone: 'default',\n backgroundImage: '',\n overlay: true,\n },\n render: ({ id, title, subtitle, cta, tone, backgroundImage, overlay }) => (\n <CTABanner\n title={title}\n subtitle={subtitle}\n cta={cta}\n tone={tone}\n backgroundImage={backgroundImage}\n overlay={overlay}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const LogoCloudBlock: ComponentConfig = {\n label: 'Logo cloud',\n fields: {\n items: {\n type: 'array',\n label: 'Logos',\n arrayFields: { label: textField('Label') },\n defaultItemProps: { label: 'Brand' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Logo',\n },\n },\n defaultProps: {\n items: [\n { label: 'Northwind' },\n { label: 'Acme' },\n { label: 'Globex' },\n { label: 'Initech' },\n { label: 'Umbrella' },\n ],\n },\n render: ({ id, items }) => <LogoCloud items={items} testId={blockTestId(id)} />,\n }\n\n const FAQBlock: ComponentConfig = {\n label: 'FAQ',\n fields: {\n items: {\n type: 'array',\n label: 'Questions',\n arrayFields: {\n question: textField('Question'),\n answer: textareaField('Answer'),\n },\n defaultItemProps: { question: 'A question?', answer: 'The answer.' },\n getItemSummary: (item: { question?: string }) => item?.question || 'Question',\n },\n },\n defaultProps: {\n items: [\n {\n question: 'How does the free trial work?',\n answer: 'You get full access for 14 days, no credit card required.',\n },\n {\n question: 'Can I change plans later?',\n answer: 'Yes — upgrade or downgrade at any time from your dashboard.',\n },\n {\n question: 'Do you offer support?',\n answer: 'Every plan includes 24/7 support from our team.',\n },\n ],\n },\n render: ({ id, items }) => <FAQ items={items} testId={blockTestId(id)} />,\n }\n\n const RichTextBlockConfig: ComponentConfig = {\n label: 'Rich text',\n fields: {\n content: textareaField('Content', undefined, 'body'),\n },\n defaultProps: {\n content:\n '## About us\\n\\nWe build tools that help teams do their best work. Our platform combines **power** and _simplicity_ so you can focus on what matters.\\n\\n- Fast to learn\\n- Easy to scale\\n- Loved by teams',\n },\n render: ({ id, content }) => <RichTextBlock content={content} testId={blockTestId(id)} />,\n }\n\n const CalloutBlock: ComponentConfig = {\n label: 'Callout',\n fields: {\n variant: {\n type: 'radio',\n label: 'Variant',\n options: [\n { label: 'Info', value: 'info' },\n { label: 'Success', value: 'success' },\n { label: 'Warning', value: 'warning' },\n { label: 'Danger', value: 'danger' },\n ],\n },\n title: textField('Title'),\n body: textareaField('Body'),\n },\n defaultProps: {\n variant: 'info',\n title: 'Good to know',\n body: 'This is a helpful note that draws attention to important information.',\n },\n render: ({ id, variant, title, body }) => (\n <Callout variant={variant} title={title} body={body} testId={blockTestId(id)} />\n ),\n }\n\n // ── Media ───────────────────────────────────────────────────────────────────\n const ImageBlock: ComponentConfig = {\n label: 'Image',\n fields: {\n src: imageField('Image'),\n alt: textField('Alt text'),\n aspect: {\n type: 'radio',\n label: 'Aspect',\n options: [\n { label: '16:9', value: '16:9' },\n { label: '4:3', value: '4:3' },\n { label: '1:1', value: '1:1' },\n { label: '21:9', value: '21:9' },\n ],\n },\n rounded: {\n type: 'radio',\n label: 'Rounded',\n options: [\n { label: 'None', value: 'none' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n { label: 'Full', value: 'full' },\n ],\n },\n framed: boolRadio('Framed'),\n },\n defaultProps: { src: '', alt: 'Image', aspect: '16:9', rounded: 'lg', framed: false },\n render: ({ id, src, alt, aspect, rounded, framed }) => (\n <BlockImage\n src={src}\n alt={alt}\n aspect={aspect}\n rounded={rounded}\n framed={framed}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const AvatarBlockConfig: ComponentConfig = {\n label: 'Avatar',\n fields: {\n src: { type: 'text', label: 'Image URL' },\n name: textField('Name'),\n size: {\n type: 'radio',\n label: 'Size',\n options: [\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n { label: 'XL', value: 'xl' },\n ],\n },\n },\n defaultProps: { src: '', name: 'Jane Doe', size: 'md' },\n render: ({ id, src, name, size }) => (\n <AvatarBlock src={src} name={name} size={size} testId={blockTestId(id)} />\n ),\n }\n\n // ── Navigation ──────────────────────────────────────────────────────────────\n const NavbarBlock: ComponentConfig = {\n label: 'Navbar',\n fields: {\n brand: textField('Brand'),\n links: {\n type: 'array',\n label: 'Links',\n arrayFields: {\n label: textField('Label'),\n href: { type: 'text', label: 'Link' },\n },\n defaultItemProps: { label: 'Link', href: '#' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Link',\n },\n cta: ctaField('CTA'),\n },\n defaultProps: {\n brand: 'Acme',\n links: [\n { label: 'Product', href: '#' },\n { label: 'Pricing', href: '#' },\n { label: 'About', href: '#' },\n { label: 'Contact', href: '#' },\n ],\n cta: { label: 'Sign up', href: '#' },\n },\n render: ({ id, brand, links, cta }) => (\n <Navbar brand={brand} links={links} cta={cta} testId={blockTestId(id)} />\n ),\n }\n\n const FooterBlock: ComponentConfig = {\n label: 'Footer',\n fields: {\n columns: {\n type: 'array',\n label: 'Columns',\n arrayFields: {\n heading: textField('Heading'),\n links: {\n type: 'array',\n label: 'Links',\n arrayFields: {\n label: textField('Label'),\n href: { type: 'text', label: 'Link' },\n },\n defaultItemProps: { label: 'Link', href: '#' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Link',\n },\n },\n defaultItemProps: { heading: 'Column', links: [{ label: 'Link', href: '#' }] },\n getItemSummary: (item: { heading?: string }) => item?.heading || 'Column',\n },\n copyright: { type: 'text', label: 'Copyright' },\n },\n defaultProps: {\n columns: [\n {\n heading: 'Product',\n links: [\n { label: 'Features', href: '#' },\n { label: 'Pricing', href: '#' },\n ],\n },\n {\n heading: 'Company',\n links: [\n { label: 'About', href: '#' },\n { label: 'Careers', href: '#' },\n ],\n },\n {\n heading: 'Resources',\n links: [\n { label: 'Blog', href: '#' },\n { label: 'Docs', href: '#' },\n ],\n },\n {\n heading: 'Legal',\n links: [\n { label: 'Privacy', href: '#' },\n { label: 'Terms', href: '#' },\n ],\n },\n ],\n copyright: '© 2026 Acme, Inc. All rights reserved.',\n },\n render: ({ id, columns, copyright }) => (\n <Footer columns={columns} copyright={copyright} testId={blockTestId(id)} />\n ),\n }\n\n // ── Content ─────────────────────────────────────────────────────────────────\n const ListBlockConfig: ComponentConfig = {\n label: 'List',\n fields: {\n ordered: boolRadio('Ordered'),\n items: {\n type: 'array',\n label: 'Items',\n arrayFields: { text: textField('Text') },\n defaultItemProps: { text: 'List item' },\n getItemSummary: (item: { text?: string }) => item?.text || 'Item',\n },\n },\n defaultProps: {\n ordered: false,\n items: [{ text: 'First item' }, { text: 'Second item' }, { text: 'Third item' }],\n },\n render: ({ id, ordered, items }) => (\n <ListBlock ordered={ordered} items={items} testId={blockTestId(id)} />\n ),\n }\n\n return {\n Columns: ColumnsBlock,\n Spacer: SpacerBlock,\n Container: ContainerBlock,\n Hero: HeroBlock,\n FeatureGrid: FeatureGridBlock,\n StatGroup: StatGroupBlock,\n Testimonial: TestimonialBlock,\n CTABanner: CTABannerBlock,\n LogoCloud: LogoCloudBlock,\n FAQ: FAQBlock,\n RichText: RichTextBlockConfig,\n Callout: CalloutBlock,\n Image: ImageBlock,\n Avatar: AvatarBlockConfig,\n Navbar: NavbarBlock,\n Footer: FooterBlock,\n List: ListBlockConfig,\n }\n}\n","/**\n * The extended site-building block set — the richer vocabulary a builder needs to\n * assemble arbitrary sites beyond the marketing basics: pricing, tabs, accordion,\n * gallery, video, contact form, banner, split media, team, steps and a\n * multi-testimonial grid.\n *\n * Same contract as {@link createWebsiteBlocks}: serializable-only props, semantic\n * tokens (themes with the firm), a stable render-time `data-testid`, and sensible\n * defaults so each block looks right the moment it is dropped. Copy props route\n * through the shared {@link BlockKit} AI-or-plain fields.\n */\nimport type { ComponentConfig, Field } from '@measured/puck'\nimport type { BlockKit } from './blockKit'\nimport { PricingTable } from '../components/PricingTable'\nimport { Tabs } from '../components/Tabs'\nimport { Accordion } from '../components/Accordion'\nimport { Gallery } from '../components/Gallery'\nimport { VideoEmbed } from '../components/VideoEmbed'\nimport { ContactForm } from '../components/ContactForm'\nimport { Banner } from '../components/Banner'\nimport { MediaText } from '../components/MediaText'\nimport { TeamGrid } from '../components/TeamGrid'\nimport { Steps } from '../components/Steps'\nimport { TestimonialGrid } from '../components/TestimonialGrid'\n\n/** Split a newline-authored textarea into a trimmed, non-empty string list. */\nconst lines = (s: string | undefined): string[] =>\n (s ?? '')\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean)\n\nexport function createSiteBlocks(kit: BlockKit): Record<string, ComponentConfig> {\n const { textField, textareaField, imageField, boolRadio, blockTestId } = kit\n\n const ctaField = (label: string): Field => ({\n type: 'object',\n label,\n objectFields: {\n label: textField('Label'),\n href: { type: 'text', label: 'Link' },\n },\n })\n\n const columnsField = (values: string[]): Field => ({\n type: 'radio',\n label: 'Columns',\n options: values.map((v) => ({ label: v, value: v })),\n })\n\n // ── Commerce ──────────────────────────────────────────────────────────────────\n const PricingBlock: ComponentConfig = {\n label: 'Pricing',\n fields: {\n plans: {\n type: 'array',\n label: 'Plans',\n getItemSummary: (item: { name?: string }) => item?.name || 'Plan',\n defaultItemProps: {\n name: 'Plan',\n price: '£0',\n period: 'mo',\n description: '',\n features: 'Feature one\\nFeature two',\n ctaLabel: 'Choose',\n ctaHref: '#',\n featured: false,\n },\n arrayFields: {\n name: textField('Name'),\n price: { type: 'text', label: 'Price' },\n period: { type: 'text', label: 'Period' },\n description: textareaField('Description'),\n features: { type: 'textarea', label: 'Features (one per line)' },\n ctaLabel: { type: 'text', label: 'Button label' },\n ctaHref: { type: 'text', label: 'Button link' },\n featured: boolRadio('Featured'),\n },\n },\n },\n defaultProps: {\n plans: [\n {\n name: 'Starter',\n price: '£0',\n period: 'mo',\n description: 'For getting started.',\n features: 'Up to 3 projects\\nCommunity support',\n ctaLabel: 'Get started',\n ctaHref: '#',\n featured: false,\n },\n {\n name: 'Pro',\n price: '£29',\n period: 'mo',\n description: 'For growing teams.',\n features: 'Unlimited projects\\nPriority support\\nAdvanced analytics',\n ctaLabel: 'Start free trial',\n ctaHref: '#',\n featured: true,\n },\n {\n name: 'Enterprise',\n price: 'Custom',\n period: '',\n description: 'For large organisations.',\n features: 'SSO & SAML\\nDedicated success manager\\nSLA',\n ctaLabel: 'Contact sales',\n ctaHref: '#',\n featured: false,\n },\n ],\n },\n render: ({ id, plans }) => (\n <PricingTable\n plans={(plans ?? []).map(\n (p: {\n name: string\n price: string\n period?: string\n description?: string\n features?: string\n ctaLabel?: string\n ctaHref?: string\n featured?: boolean\n }) => ({\n name: p.name,\n price: p.price,\n period: p.period,\n description: p.description,\n features: lines(p.features),\n cta: { label: p.ctaLabel, href: p.ctaHref },\n featured: p.featured,\n })\n )}\n testId={blockTestId(id)}\n />\n ),\n }\n\n // ── Interactive ───────────────────────────────────────────────────────────────\n const TabsBlock: ComponentConfig = {\n label: 'Tabs',\n fields: {\n items: {\n type: 'array',\n label: 'Tabs',\n getItemSummary: (item: { label?: string }) => item?.label || 'Tab',\n defaultItemProps: { label: 'Tab', content: 'Tab content.' },\n arrayFields: {\n label: textField('Label'),\n content: textareaField('Content'),\n },\n },\n },\n defaultProps: {\n items: [\n { label: 'Overview', content: 'A quick overview of this section.' },\n { label: 'Details', content: 'The finer details go here.' },\n { label: 'FAQ', content: 'Answers to common questions.' },\n ],\n },\n render: ({ id, items }) => <Tabs items={items} testId={blockTestId(id)} />,\n }\n\n const AccordionBlock: ComponentConfig = {\n label: 'Accordion',\n fields: {\n allowMultiple: boolRadio('Allow multiple open'),\n items: {\n type: 'array',\n label: 'Items',\n getItemSummary: (item: { title?: string }) => item?.title || 'Item',\n defaultItemProps: { title: 'Section', content: 'Section content.' },\n arrayFields: {\n title: textField('Title'),\n content: textareaField('Content'),\n },\n },\n },\n defaultProps: {\n allowMultiple: false,\n items: [\n { title: 'What is included?', content: 'Everything you need to get started.' },\n { title: 'How does billing work?', content: 'Monthly or annually, cancel anytime.' },\n ],\n },\n render: ({ id, allowMultiple, items }) => (\n <Accordion allowMultiple={allowMultiple} items={items} testId={blockTestId(id)} />\n ),\n }\n\n // ── Media ───────────────────────────────────────────────────────────────────\n const GalleryBlock: ComponentConfig = {\n label: 'Gallery',\n fields: {\n columns: columnsField(['2', '3', '4']),\n aspect: {\n type: 'radio',\n label: 'Aspect',\n options: [\n { label: '1:1', value: '1:1' },\n { label: '4:3', value: '4:3' },\n { label: '16:9', value: '16:9' },\n ],\n },\n images: {\n type: 'array',\n label: 'Images',\n getItemSummary: (item: { alt?: string }) => item?.alt || 'Image',\n defaultItemProps: { src: '', alt: 'Image', caption: '' },\n arrayFields: {\n src: imageField('Image'),\n alt: { type: 'text', label: 'Alt text' },\n caption: { type: 'text', label: 'Caption' },\n },\n },\n },\n defaultProps: {\n columns: '3',\n aspect: '1:1',\n images: [\n { src: '', alt: 'Image one', caption: '' },\n { src: '', alt: 'Image two', caption: '' },\n { src: '', alt: 'Image three', caption: '' },\n ],\n },\n render: ({ id, columns, aspect, images }) => (\n <Gallery columns={columns} aspect={aspect} images={images} testId={blockTestId(id)} />\n ),\n }\n\n const VideoBlock: ComponentConfig = {\n label: 'Video',\n fields: {\n url: { type: 'text', label: 'Video URL (YouTube/Vimeo/Loom or file)' },\n title: { type: 'text', label: 'Title' },\n aspect: {\n type: 'radio',\n label: 'Aspect',\n options: [\n { label: '16:9', value: '16:9' },\n { label: '4:3', value: '4:3' },\n { label: '1:1', value: '1:1' },\n ],\n },\n rounded: boolRadio('Rounded'),\n },\n defaultProps: { url: '', title: '', aspect: '16:9', rounded: true },\n render: ({ id, url, title, aspect, rounded }) => (\n <VideoEmbed\n url={url}\n title={title}\n aspect={aspect}\n rounded={rounded}\n testId={blockTestId(id)}\n />\n ),\n }\n\n // ── Forms ───────────────────────────────────────────────────────────────────\n const ContactFormBlock: ComponentConfig = {\n label: 'Contact form',\n fields: {\n submitLabel: { type: 'text', label: 'Submit label' },\n action: { type: 'text', label: 'POST endpoint (optional)' },\n successMessage: textareaField('Success message'),\n fields: {\n type: 'array',\n label: 'Fields',\n getItemSummary: (item: { label?: string }) => item?.label || 'Field',\n defaultItemProps: { name: 'field', label: 'Field', type: 'text', required: false },\n arrayFields: {\n name: { type: 'text', label: 'Name attribute' },\n label: textField('Label'),\n type: {\n type: 'select',\n label: 'Type',\n options: [\n { label: 'Text', value: 'text' },\n { label: 'Email', value: 'email' },\n { label: 'Phone', value: 'tel' },\n { label: 'Multi-line', value: 'textarea' },\n ],\n },\n required: boolRadio('Required'),\n },\n },\n },\n defaultProps: {\n submitLabel: 'Send',\n action: '',\n successMessage: 'Thanks — we’ll be in touch shortly.',\n fields: [\n { name: 'name', label: 'Name', type: 'text', required: true },\n { name: 'email', label: 'Email', type: 'email', required: true },\n { name: 'message', label: 'Message', type: 'textarea', required: true },\n ],\n },\n render: ({ id, submitLabel, action, successMessage, fields }) => (\n <ContactForm\n submitLabel={submitLabel}\n action={action || undefined}\n successMessage={successMessage}\n fields={fields}\n testId={blockTestId(id)}\n />\n ),\n }\n\n // ── Marketing (extended) ──────────────────────────────────────────────────────\n const BannerBlock: ComponentConfig = {\n label: 'Banner',\n fields: {\n text: textField('Text'),\n cta: ctaField('CTA'),\n tone: {\n type: 'radio',\n label: 'Tone',\n options: [\n { label: 'Primary', value: 'primary' },\n { label: 'Muted', value: 'muted' },\n { label: 'Dark', value: 'ink' },\n ],\n },\n },\n defaultProps: {\n text: 'We just shipped something new.',\n cta: { label: 'Read more', href: '#' },\n tone: 'primary',\n },\n render: ({ id, text, cta, tone }) => (\n <Banner text={text} cta={cta} tone={tone} testId={blockTestId(id)} />\n ),\n }\n\n const MediaTextBlock: ComponentConfig = {\n label: 'Media & text',\n fields: {\n eyebrow: textField('Eyebrow'),\n title: textField('Title'),\n body: textareaField('Body', undefined, 'lead'),\n imageUrl: imageField('Image'),\n mediaSide: {\n type: 'radio',\n label: 'Media side',\n options: [\n { label: 'Left', value: 'left' },\n { label: 'Right', value: 'right' },\n ],\n },\n cta: ctaField('CTA'),\n },\n defaultProps: {\n eyebrow: '',\n title: 'A closer look at what we do.',\n body: 'Pair a compelling visual with the copy that explains it — the classic split section, on any theme.',\n imageUrl: '',\n mediaSide: 'left',\n cta: { label: 'Learn more', href: '#' },\n },\n render: ({ id, eyebrow, title, body, imageUrl, mediaSide, cta }) => (\n <MediaText\n eyebrow={eyebrow}\n title={title}\n body={body}\n imageUrl={imageUrl}\n mediaSide={mediaSide}\n cta={cta}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const TeamGridBlock: ComponentConfig = {\n label: 'Team',\n fields: {\n columns: columnsField(['2', '3', '4']),\n members: {\n type: 'array',\n label: 'Members',\n getItemSummary: (item: { name?: string }) => item?.name || 'Member',\n defaultItemProps: { name: 'New member', role: 'Role', bio: '', avatarUrl: '' },\n arrayFields: {\n name: textField('Name'),\n role: { type: 'text', label: 'Role' },\n bio: textareaField('Bio'),\n avatarUrl: { type: 'text', label: 'Avatar URL' },\n },\n },\n },\n defaultProps: {\n columns: '3',\n members: [\n { name: 'Alex Morgan', role: 'Founder & CEO', bio: '', avatarUrl: '' },\n { name: 'Sam Rivera', role: 'Head of Product', bio: '', avatarUrl: '' },\n { name: 'Jordan Lee', role: 'Lead Engineer', bio: '', avatarUrl: '' },\n ],\n },\n render: ({ id, columns, members }) => (\n <TeamGrid columns={columns} members={members} testId={blockTestId(id)} />\n ),\n }\n\n const StepsBlock: ComponentConfig = {\n label: 'Steps',\n fields: {\n variant: {\n type: 'radio',\n label: 'Style',\n options: [\n { label: 'Numbered', value: 'numbered' },\n { label: 'Timeline', value: 'timeline' },\n ],\n },\n steps: {\n type: 'array',\n label: 'Steps',\n getItemSummary: (item: { title?: string }) => item?.title || 'Step',\n defaultItemProps: { title: 'Step', description: 'Describe this step.' },\n arrayFields: {\n title: textField('Title'),\n description: textareaField('Description'),\n },\n },\n },\n defaultProps: {\n variant: 'numbered',\n steps: [\n { title: 'Sign up', description: 'Create your account in seconds.' },\n { title: 'Configure', description: 'Set things up to match your workflow.' },\n { title: 'Launch', description: 'Go live and start seeing results.' },\n ],\n },\n render: ({ id, variant, steps }) => (\n <Steps variant={variant} steps={steps} testId={blockTestId(id)} />\n ),\n }\n\n const TestimonialGridBlock: ComponentConfig = {\n label: 'Testimonial grid',\n fields: {\n columns: columnsField(['2', '3']),\n items: {\n type: 'array',\n label: 'Testimonials',\n getItemSummary: (item: { author?: string }) => item?.author || 'Testimonial',\n defaultItemProps: { quote: 'A great quote.', author: 'Author', role: '', avatarUrl: '' },\n arrayFields: {\n quote: textareaField('Quote'),\n author: textField('Author'),\n role: { type: 'text', label: 'Role' },\n avatarUrl: { type: 'text', label: 'Avatar URL' },\n },\n },\n },\n defaultProps: {\n columns: '3',\n items: [\n {\n quote: 'This changed how our whole team works.',\n author: 'Alex Morgan',\n role: 'CTO, Northwind',\n avatarUrl: '',\n },\n {\n quote: 'The best tool we adopted this year.',\n author: 'Sam Rivera',\n role: 'Ops Lead, Acme',\n avatarUrl: '',\n },\n {\n quote: 'Simple, fast, and it just works.',\n author: 'Jordan Lee',\n role: 'Founder, Globex',\n avatarUrl: '',\n },\n ],\n },\n render: ({ id, columns, items }) => (\n <TestimonialGrid columns={columns} items={items} testId={blockTestId(id)} />\n ),\n }\n\n return {\n Pricing: PricingBlock,\n Tabs: TabsBlock,\n Accordion: AccordionBlock,\n Gallery: GalleryBlock,\n Video: VideoBlock,\n ContactForm: ContactFormBlock,\n Banner: BannerBlock,\n MediaText: MediaTextBlock,\n Team: TeamGridBlock,\n Steps: StepsBlock,\n TestimonialGrid: TestimonialGridBlock,\n }\n}\n","/**\n * Shared Puck block registry for @arbidocs/blocks.\n *\n * {@link createArbiBlocksConfig} turns the package's shared components into a\n * single draggable builder palette (a Puck `Config`) so every consuming app gets\n * one shared block set instead of hand-rolling its own. It spans a full\n * website-building vocabulary: back-office data/content blocks plus marketing,\n * media, navigation and layout blocks (see {@link createWebsiteBlocks}).\n *\n * Cross-cutting rules baked in here:\n * - Copy props (\"title\", \"lead\", …) use the firm's AI \"Write with AI\" fields when\n * `opts.aiFields` is provided, else fall back to Puck's built-in text/textarea —\n * so the config works with or without an AI-configured firm.\n * - Icon props are a curated {@link iconMap} exposed as a `select`; the name is\n * resolved to a Lucide component at render.\n * - `className`/`testId` are never editor fields. A stable `data-testid` is derived\n * from each block's Puck id at render, so e2e locates by testid, never copy text.\n * - Container blocks (Section, Card, Columns, Container) expose children as Puck slots.\n */\nimport type { ReactNode } from 'react'\nimport type { ComponentConfig, Config, Field } from '@measured/puck'\nimport { Badge, Button, Card, Separator, cn } from '@arbidocs/react'\nimport { SectionHeading } from '../components/SectionHeading'\nimport { PageHeader } from '../components/PageHeader'\nimport { EmptyState } from '../components/EmptyState'\nimport { MetricCard } from '../components/MetricCard'\nimport { DataTableBlock, type DataTableBlockColumn } from '../components/DataTableBlock'\nimport { Section } from './Section'\nimport { createBlockKit, iconMap } from './blockKit'\nimport { createWebsiteBlocks } from './websiteBlocks'\nimport { createSiteBlocks } from './siteBlocks'\nimport { createLiveWidgets } from './widgets'\nimport type { AiFields } from './aiFields'\n\nexport interface ArbiBlocksConfigOptions {\n /**\n * Firm AI fields from {@link createAiFields}. When present, every string copy\n * prop becomes an AI-authorable field; when absent, plain Puck text inputs.\n */\n aiFields?: AiFields\n /**\n * Firm image field from {@link createImageField}. When present, image props\n * become a workspace-asset picker (pick / upload / URL / generate); when absent,\n * a plain URL text input.\n */\n imageField?: (label: string) => Field\n /**\n * Page canvas overrides. The builder paints every page inside this root; a\n * consumer sets e.g. a dark editorial canvas without forking the package.\n * Defaults to `bg-background text-foreground font-sans` on a neutral wrapper.\n */\n root?: {\n /** Extra classes appended to (and able to override) the default canvas classes. */\n className?: string\n /** testid for the page root wrapper. Defaults to `arbi-blocks-page-root`. */\n testId?: string\n }\n /**\n * Firm override for the eyebrow style on heading-bearing blocks (Hero, Section\n * heading) — e.g. a brand accent like a brass eyebrow. Undefined → token default.\n */\n eyebrowClassName?: string\n /**\n * Register the live-widget blocks (a \"Widgets\" category) that read shared ARBI\n * hooks — Agent activity, Live metric. They render placeholders in the editor\n * and on the public site, resolving real data only inside an authenticated\n * in-app renderer (`PageRenderer liveData`). Opt-in so a pure marketing builder\n * doesn't surface back-office widgets.\n */\n liveWidgets?: boolean\n}\n\n// Re-exported so consumers keep importing the icon registry from here.\nexport { iconMap }\n\n// Puck injects a component for each `slot` field at render; its default value is\n// an empty array. Shared here so slot-bearing blocks default to an empty drop zone.\nconst emptySlot = [] as unknown as ReactNode\n\n// Responsive grid presets for the MetricRow KPI band (keyed by authored column count).\nconst METRIC_COLS: Record<string, string> = {\n '2': 'sm:grid-cols-2',\n '3': 'sm:grid-cols-2 lg:grid-cols-3',\n '4': 'sm:grid-cols-2 lg:grid-cols-4',\n}\nconst METRIC_GAP: Record<string, string> = { sm: 'gap-3', md: 'gap-4', lg: 'gap-6' }\n\n// ── Factory ───────────────────────────────────────────────────────────────────\nexport function createArbiBlocksConfig(opts: ArbiBlocksConfigOptions = {}): Config {\n const kit = createBlockKit(opts.aiFields, opts.imageField, opts.eyebrowClassName)\n const { textField, textareaField, boolRadio, iconField, resolveIcon, blockTestId } = kit\n\n // Each block is declared with explicit prop typing so render args stay checked.\n\n const SectionHeadingBlock: ComponentConfig = {\n label: 'Section heading',\n fields: {\n title: textField('Title'),\n eyebrow: textField('Eyebrow'),\n lead: textareaField('Lead', undefined, 'lead'),\n align: {\n type: 'radio',\n label: 'Align',\n options: [\n { label: 'Left', value: 'left' },\n { label: 'Center', value: 'center' },\n ],\n },\n invert: boolRadio('Invert (on dark)'),\n },\n defaultProps: { title: 'Section title', align: 'left', invert: false },\n render: ({ id, title, eyebrow, lead, align, invert }) => (\n <div data-testid={blockTestId(id)}>\n <SectionHeading\n title={title}\n eyebrow={eyebrow}\n lead={lead}\n align={align}\n invert={invert}\n eyebrowClassName={kit.eyebrowClassName}\n />\n </div>\n ),\n }\n\n const PageHeaderBlock: ComponentConfig = {\n label: 'Page header',\n fields: {\n title: textField('Title'),\n eyebrow: textField('Eyebrow'),\n description: textareaField('Description', undefined, 'description'),\n // `actions` is a slot so the top band can host real buttons/badges authored\n // as blocks (drop a Button in), while the interactive body stays bespoke.\n actions: { type: 'slot', allow: ['Button', 'Badge'] },\n },\n defaultProps: { title: 'Page title', actions: emptySlot },\n render: ({ id, title, eyebrow, description, actions: Actions }) => (\n <PageHeader\n title={title}\n eyebrow={eyebrow}\n description={description}\n actions={<Actions className=\"flex items-center gap-2\" />}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const EmptyStateBlock: ComponentConfig = {\n label: 'Empty state',\n fields: {\n title: textField('Title'),\n description: textareaField('Description', undefined, 'description'),\n icon: iconField(),\n // `action` is a slot so an empty state can offer a real call-to-action button.\n action: { type: 'slot', allow: ['Button'] },\n },\n defaultProps: { title: 'Nothing here yet', action: emptySlot },\n render: ({ id, title, description, icon, action: Action }) => (\n <EmptyState\n title={title}\n description={description}\n icon={resolveIcon(icon)}\n action={<Action />}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const MetricCardBlock: ComponentConfig = {\n label: 'Metric card',\n fields: {\n label: { type: 'text', label: 'Label' },\n value: { type: 'text', label: 'Value' },\n hint: { type: 'text', label: 'Hint' },\n accent: {\n type: 'radio',\n label: 'Accent',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Primary', value: 'primary' },\n { label: 'Success', value: 'success' },\n { label: 'Muted', value: 'muted' },\n ],\n },\n delta: {\n type: 'object',\n label: 'Delta',\n objectFields: {\n value: { type: 'text', label: 'Value' },\n direction: {\n type: 'radio',\n label: 'Direction',\n options: [\n { label: 'Up', value: 'up' },\n { label: 'Down', value: 'down' },\n ],\n },\n good: boolRadio('Good'),\n },\n },\n icon: iconField(),\n },\n defaultProps: { label: 'Metric', value: '0', accent: 'default' },\n render: ({ id, label, value, hint, accent, delta, icon }) => (\n <MetricCard\n label={label}\n value={value}\n hint={hint}\n accent={accent}\n delta={delta}\n icon={resolveIcon(icon)}\n testId={blockTestId(id)}\n />\n ),\n }\n\n // A KPI band: a responsive grid whose cells are MetricCard blocks, so the top\n // of a page (dashboard/module header) is authored as config while the live body\n // stays bespoke. Slot-based (not a self-contained array) so it reuses the\n // MetricCard block verbatim — every card keeps its delta/icon/accent options.\n const MetricRowBlock: ComponentConfig = {\n label: 'Metric row',\n fields: {\n columns: {\n type: 'radio',\n label: 'Columns',\n options: [\n { label: '2', value: '2' },\n { label: '3', value: '3' },\n { label: '4', value: '4' },\n ],\n },\n gap: {\n type: 'radio',\n label: 'Gap',\n options: [\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n ],\n },\n // Static KPI tiles and (when registered) live metric widgets both belong in a band.\n items: { type: 'slot', allow: ['MetricCard', 'LiveMetric'] },\n },\n defaultProps: { columns: '3', gap: 'md', items: emptySlot },\n render: ({ id, columns, gap, items: Items }) => (\n <div data-testid={blockTestId(id)}>\n <Items\n className={cn(\n 'grid grid-cols-1',\n METRIC_COLS[columns as string] ?? METRIC_COLS['3'],\n METRIC_GAP[gap as string] ?? METRIC_GAP.md\n )}\n />\n </div>\n ),\n }\n\n // Serializable table. `columns` is a flat schema (header/field/align). `rows` is a\n // Puck array of rows, each holding a nested array of string `cells` — genuinely\n // per-cell authorable and decoupled from column count (Puck objectFields are\n // static, so keying rows by an author-chosen `field` is impossible). Cells map to\n // columns by position at render, where they're rekeyed to the field-keyed records\n // {@link DataTableBlock} expects.\n const DataTableBlockConfig: ComponentConfig = {\n label: 'Data table',\n fields: {\n caption: textField('Caption'),\n columns: {\n type: 'array',\n label: 'Columns',\n arrayFields: {\n header: { type: 'text', label: 'Header' },\n field: { type: 'text', label: 'Field key' },\n align: {\n type: 'radio',\n label: 'Align',\n options: [\n { label: 'Left', value: 'left' },\n { label: 'Right', value: 'right' },\n { label: 'Center', value: 'center' },\n ],\n },\n },\n defaultItemProps: { header: 'Column', field: 'field', align: 'left' },\n getItemSummary: (item: DataTableBlockColumn) => item?.header || 'Column',\n },\n rows: {\n type: 'array',\n label: 'Rows',\n arrayFields: {\n cells: {\n type: 'array',\n label: 'Cells',\n arrayFields: {\n value: { type: 'text', label: 'Value' },\n },\n defaultItemProps: { value: '' },\n getItemSummary: (item: { value?: string }) => item?.value || 'Cell',\n },\n },\n defaultItemProps: { cells: [{ value: '' }, { value: '' }] },\n getItemSummary: (_item: unknown, i?: number) => `Row ${(i ?? 0) + 1}`,\n },\n emptyText: textField('Empty text'),\n },\n defaultProps: {\n columns: [\n { header: 'Matter', field: 'matter', align: 'left' },\n { header: 'Status', field: 'status', align: 'left' },\n ],\n rows: [\n { cells: [{ value: 'Acme v. Globex' }, { value: 'Active' }] },\n { cells: [{ value: 'Initech Merger' }, { value: 'Closed' }] },\n ],\n emptyText: 'No rows yet',\n },\n render: ({ id, columns, rows, caption, emptyText }) => {\n const cols = (columns ?? []) as DataTableBlockColumn[]\n const rawRows = (rows ?? []) as Array<{ cells?: Array<{ value?: string }> }>\n // Positional cells → field-keyed record, so DataTableBlock can look cells up by column field.\n const recordRows = rawRows.map((row) => {\n const record: Record<string, string> = {}\n cols.forEach((col, index) => {\n record[col.field || `col-${index}`] = row.cells?.[index]?.value ?? ''\n })\n return record\n })\n const normalisedCols = cols.map((col, index) => ({\n ...col,\n field: col.field || `col-${index}`,\n }))\n return (\n <DataTableBlock\n columns={normalisedCols}\n rows={recordRows}\n caption={caption}\n emptyText={emptyText}\n testId={blockTestId(id)}\n />\n )\n },\n }\n\n const SectionBlock: ComponentConfig = {\n label: 'Section',\n fields: {\n children: { type: 'slot' },\n tone: {\n type: 'radio',\n label: 'Tone',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Muted', value: 'muted' },\n { label: 'Dark', value: 'ink' },\n ],\n },\n padding: {\n type: 'radio',\n label: 'Padding',\n options: [\n { label: 'None', value: 'none' },\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n ],\n },\n maxWidth: {\n type: 'radio',\n label: 'Width',\n options: [\n { label: 'Narrow', value: 'narrow' },\n { label: 'Default', value: 'default' },\n { label: 'Wide', value: 'wide' },\n { label: 'Full', value: 'full' },\n ],\n },\n texture: boolRadio('Texture'),\n },\n defaultProps: {\n tone: 'default',\n padding: 'md',\n maxWidth: 'default',\n texture: false,\n children: [] as unknown as ReactNode,\n },\n render: ({ id, tone, padding, maxWidth, texture, children: Children }) => (\n <div data-testid={blockTestId(id)}>\n <Section tone={tone} padding={padding} maxWidth={maxWidth} texture={texture}>\n <Children />\n </Section>\n </div>\n ),\n }\n\n const CardBlock: ComponentConfig = {\n label: 'Card',\n fields: {\n variant: {\n type: 'select',\n label: 'Variant',\n options: [\n { label: 'Flat', value: 'flat' },\n { label: 'Outline', value: 'outline' },\n { label: 'Elevated', value: 'elevated' },\n ],\n },\n children: { type: 'slot' },\n },\n defaultProps: { variant: 'flat', children: [] as unknown as ReactNode },\n render: ({ id, variant, children: Children }) => (\n <Card variant={variant} className=\"p-5\" data-testid={blockTestId(id)}>\n <Children />\n </Card>\n ),\n }\n\n const ButtonBlock: ComponentConfig = {\n label: 'Button',\n fields: {\n children: { type: 'text', label: 'Label' },\n variant: {\n type: 'select',\n label: 'Variant',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Accent', value: 'accent' },\n { label: 'Destructive', value: 'destructive' },\n { label: 'Outline', value: 'outline' },\n { label: 'Secondary', value: 'secondary' },\n { label: 'Ghost', value: 'ghost' },\n { label: 'Link', value: 'link' },\n ],\n },\n size: {\n type: 'select',\n label: 'Size',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Small', value: 'sm' },\n { label: 'Large', value: 'lg' },\n { label: 'Icon', value: 'icon' },\n ],\n },\n },\n defaultProps: { variant: 'default', size: 'default', children: 'Button' },\n render: ({ id, children, variant, size }) => (\n <Button variant={variant} size={size} data-testid={blockTestId(id)}>\n {children}\n </Button>\n ),\n }\n\n const BadgeBlock: ComponentConfig = {\n label: 'Badge',\n fields: {\n text: { type: 'text', label: 'Text' },\n variant: {\n type: 'select',\n label: 'Variant',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Accent', value: 'accent' },\n { label: 'Secondary', value: 'secondary' },\n { label: 'Destructive', value: 'destructive' },\n { label: 'Outline', value: 'outline' },\n ],\n },\n },\n defaultProps: { text: 'Badge', variant: 'default' },\n render: ({ id, text, variant }) => (\n <Badge variant={variant} data-testid={blockTestId(id)}>\n {text}\n </Badge>\n ),\n }\n\n const SeparatorBlock: ComponentConfig = {\n label: 'Separator',\n fields: {},\n defaultProps: {},\n render: ({ id }) => <Separator data-testid={blockTestId(id)} />,\n }\n\n const website = createWebsiteBlocks(kit)\n const site = createSiteBlocks(kit)\n const widgets = opts.liveWidgets ? createLiveWidgets(kit) : {}\n\n const components = {\n SectionHeading: SectionHeadingBlock,\n PageHeader: PageHeaderBlock,\n EmptyState: EmptyStateBlock,\n MetricCard: MetricCardBlock,\n MetricRow: MetricRowBlock,\n DataTable: DataTableBlockConfig,\n Section: SectionBlock,\n Card: CardBlock,\n Button: ButtonBlock,\n Badge: BadgeBlock,\n Separator: SeparatorBlock,\n ...website,\n ...site,\n ...widgets,\n }\n\n const config: Config = {\n categories: {\n Layout: {\n title: 'Layout',\n components: ['Section', 'Container', 'Columns', 'Card', 'Spacer'],\n },\n Marketing: {\n title: 'Marketing',\n components: [\n 'Hero',\n 'FeatureGrid',\n 'StatGroup',\n 'Testimonial',\n 'TestimonialGrid',\n 'CTABanner',\n 'Banner',\n 'LogoCloud',\n 'FAQ',\n 'MediaText',\n 'Steps',\n 'Team',\n ],\n },\n Content: {\n title: 'Content',\n components: ['SectionHeading', 'PageHeader', 'EmptyState', 'RichText', 'Callout', 'List'],\n },\n Interactive: { title: 'Interactive', components: ['Tabs', 'Accordion'] },\n Media: { title: 'Media', components: ['Image', 'Avatar', 'Gallery', 'Video'] },\n Commerce: { title: 'Commerce', components: ['Pricing'] },\n Forms: { title: 'Forms', components: ['ContactForm'] },\n Navigation: { title: 'Navigation', components: ['Navbar', 'Footer'] },\n Data: { title: 'Data', components: ['MetricRow', 'MetricCard', 'DataTable'] },\n ...(opts.liveWidgets\n ? { Widgets: { title: 'Widgets', components: ['AgentActivity', 'LiveMetric'] } }\n : {}),\n Primitives: { title: 'Primitives', components: ['Button', 'Badge', 'Separator'] },\n },\n components: components as Config['components'],\n root: {\n render: ({ children }: { children?: ReactNode }) => (\n <div\n className={cn('bg-background text-foreground font-sans', opts.root?.className)}\n data-testid={opts.root?.testId ?? 'arbi-blocks-page-root'}\n >\n {children}\n </div>\n ),\n },\n }\n\n return config\n}\n","/**\n * Module registry — a typed model of the back-office modules derived from a\n * firm's canonical nav. We read the nav rather than re-declaring it so the\n * registry can never drift from the shipped nav (DRY). The builder\n * toggles/reorders these; the sidebar can consume the result via the module\n * store's `useEnabledNav()` without any nav data being duplicated here.\n */\nimport type { AppNavItem, AppNavSection } from '../../nav/types'\nimport type { BuilderModule, ModuleRegistry } from './types'\n\n/** Build a registry from a firm's nav manifest. */\nexport function createModuleRegistry(appNav: AppNavSection[]): ModuleRegistry {\n /** Flattened, ordered registry built once from appNav. */\n const DEFAULT_MODULES: BuilderModule[] = appNav.flatMap((section, sIdx) =>\n section.items.map((item, iIdx) => ({\n id: item.id,\n label: item.label,\n section: section.heading,\n icon: item.icon,\n to: item.to,\n arbi: item.arbi ?? false,\n end: item.end ?? false,\n // Global order that preserves section grouping then in-section order.\n defaultOrder: sIdx * 100 + iIdx,\n }))\n )\n\n /** Section headings in their canonical order. */\n const SECTION_ORDER: string[] = appNav.map((s) => s.heading)\n\n /** Rebuild an AppNavItem from a registry entry (shape the sidebar consumes). */\n const toNavItem = (m: BuilderModule): AppNavItem => ({\n to: m.to,\n label: m.label,\n icon: m.icon,\n id: m.id,\n arbi: m.arbi || undefined,\n end: m.end || undefined,\n })\n\n return { DEFAULT_MODULES, SECTION_ORDER, toNavItem }\n}\n","/**\n * Module toggle/order store — pure config state (which modules the vertical\n * ships, and in what order), persisted to localStorage. Defaults are empty so\n * every existing module stays enabled in its canonical position — nothing in\n * the app breaks until an admin opts to change it.\n *\n * Firm-agnostic: {@link createModuleStore} closes the store + hooks over an\n * injected registry and storage key.\n */\nimport { useMemo } from 'react'\nimport { create, type StoreApi, type UseBoundStore } from 'zustand'\nimport { persist } from 'zustand/middleware'\nimport type { AppNavSection } from '../../nav/types'\nimport type { BuilderModule, ModuleRegistry, ResolvedModule } from './types'\n\ninterface ModuleOverride {\n enabled: boolean\n /** Effective order within the section. */\n order: number\n}\n\ninterface ModuleStore {\n /** Sparse overrides keyed by module id; absent → registry default. */\n overrides: Record<string, ModuleOverride>\n toggle: (id: string) => void\n /** Move a module up/down among its enabled+disabled section siblings. */\n move: (id: string, dir: 'up' | 'down') => void\n reset: () => void\n}\n\nexport interface ModuleStoreBundle {\n useModuleStore: UseBoundStore<StoreApi<ModuleStore>>\n useResolvedModules: () => { section: string; modules: ResolvedModule[] }[]\n useEnabledNav: () => AppNavSection[]\n}\n\nexport function createModuleStore({\n registry,\n storageKey,\n}: {\n registry: ModuleRegistry\n storageKey: string\n}): ModuleStoreBundle {\n const { DEFAULT_MODULES, SECTION_ORDER, toNavItem } = registry\n\n /** Effective enabled flag for a module given the current overrides. */\n function isEnabled(overrides: Record<string, ModuleOverride>, id: string): boolean {\n return overrides[id]?.enabled ?? true\n }\n\n const id = (m: BuilderModule) => m.id\n\n /** Effective order for a module (override wins, else its default position). */\n function orderOf(overrides: Record<string, ModuleOverride>, m: BuilderModule): number {\n return overrides[id(m)]?.order ?? m.defaultOrder\n }\n\n const useModuleStore = create<ModuleStore>()(\n persist(\n (set, get) => ({\n overrides: {},\n\n toggle: (moduleId) => {\n const m = DEFAULT_MODULES.find((x) => x.id === moduleId)\n if (!m) return\n const cur = get().overrides\n const prev = cur[moduleId] ?? { enabled: true, order: m.defaultOrder }\n set({\n overrides: { ...cur, [moduleId]: { ...prev, enabled: !isEnabled(cur, moduleId) } },\n })\n },\n\n move: (moduleId, dir) => {\n const cur = get().overrides\n const target = DEFAULT_MODULES.find((x) => x.id === moduleId)\n if (!target) return\n // Siblings in the same section, in current effective order.\n const siblings = DEFAULT_MODULES.filter((x) => x.section === target.section).sort(\n (a, b) => orderOf(cur, a) - orderOf(cur, b)\n )\n const idx = siblings.findIndex((x) => x.id === moduleId)\n const swapIdx = dir === 'up' ? idx - 1 : idx + 1\n if (swapIdx < 0 || swapIdx >= siblings.length) return\n const a = siblings[idx]\n const b = siblings[swapIdx]\n const next = { ...cur }\n // Persist both siblings' effective orders, swapped.\n next[a.id] = { enabled: isEnabled(cur, a.id), order: orderOf(cur, b) }\n next[b.id] = { enabled: isEnabled(cur, b.id), order: orderOf(cur, a) }\n set({ overrides: next })\n },\n\n reset: () => set({ overrides: {} }),\n }),\n { name: storageKey }\n )\n )\n\n /** The full registry resolved against overrides, grouped + sorted by section. */\n function useResolvedModules(): { section: string; modules: ResolvedModule[] }[] {\n const overrides = useModuleStore((s) => s.overrides)\n return useMemo(() => {\n return SECTION_ORDER.map((section) => ({\n section,\n modules: DEFAULT_MODULES.filter((m) => m.section === section)\n .map((m) => ({ ...m, enabled: isEnabled(overrides, m.id), order: orderOf(overrides, m) }))\n .sort((a, b) => a.order - b.order),\n }))\n }, [overrides])\n }\n\n /**\n * The filtered/ordered nav the sidebar COULD consume — same shape as `appNav`.\n * One-line integration in AppSidebar: `const nav = useEnabledNav()` then map\n * over `nav` instead of the imported `appNav`.\n */\n function useEnabledNav(): AppNavSection[] {\n const grouped = useResolvedModules()\n return useMemo(\n () =>\n grouped\n .map((g) => ({\n heading: g.section,\n items: g.modules.filter((m) => m.enabled).map(toNavItem),\n }))\n .filter((s) => s.items.length > 0),\n [grouped]\n )\n }\n\n return { useModuleStore, useResolvedModules, useEnabledNav }\n}\n","/**\n * Agent-selection store — which ARBI behaviour configurations and agents the\n * firm marks \"active\" for this vertical. Pure selection state (the configs and\n * agents themselves come live from ARBI via React Query), persisted so the\n * choice seeds the exported vertical config.\n *\n * Firm-agnostic: {@link createAgentSelectionStore} parameterises the persist key.\n */\nimport { create, type StoreApi, type UseBoundStore } from 'zustand'\nimport { persist } from 'zustand/middleware'\n\nexport interface AgentSelectionStore {\n /** Configuration ext_ids marked active. */\n configIds: string[]\n /** Agent ext_ids marked active. */\n agentIds: string[]\n toggleConfig: (id: string) => void\n toggleAgent: (id: string) => void\n clear: () => void\n}\n\nconst toggle = (list: string[], id: string) =>\n list.includes(id) ? list.filter((x) => x !== id) : [...list, id]\n\nexport function createAgentSelectionStore({\n storageKey,\n}: {\n storageKey: string\n}): UseBoundStore<StoreApi<AgentSelectionStore>> {\n return create<AgentSelectionStore>()(\n persist(\n (set) => ({\n configIds: [],\n agentIds: [],\n toggleConfig: (id) => set((s) => ({ configIds: toggle(s.configIds, id) })),\n toggleAgent: (id) => set((s) => ({ agentIds: toggle(s.agentIds, id) })),\n clear: () => set({ configIds: [], agentIds: [] }),\n }),\n { name: storageKey }\n )\n )\n}\n","/**\n * Vertical-config export — combine the configured theme, enabled/ordered\n * modules and selected ARBI agent configs into one JSON document. This is the\n * seed a generator would consume to stamp out a new vertical app.\n *\n * Firm-agnostic: {@link createVerticalExport} closes over the theme/module/agent\n * stores and the module registry.\n */\nimport type { StoreApi, UseBoundStore } from 'zustand'\nimport type { ThemeState } from '../theme/store'\nimport type { ModuleRegistry } from './modules/types'\nimport type { ModuleStoreBundle } from './modules/store'\nimport type { AgentSelectionStore } from './agents/store'\nimport type { ExportedModule, VerticalConfig } from './types'\n\nexport interface VerticalExportConfig {\n vertical: { name: string; key: string }\n themeStore: UseBoundStore<StoreApi<ThemeState>>\n moduleStore: ModuleStoreBundle\n agentStore: UseBoundStore<StoreApi<AgentSelectionStore>>\n registry: ModuleRegistry\n}\n\nexport interface VerticalExport {\n buildVerticalConfig: () => VerticalConfig\n serialize: (cfg?: VerticalConfig) => string\n download: (cfg?: VerticalConfig) => void\n}\n\nexport function createVerticalExport(cfg: VerticalExportConfig): VerticalExport {\n const { vertical, themeStore, moduleStore, agentStore, registry } = cfg\n const { DEFAULT_MODULES, SECTION_ORDER } = registry\n\n /** Build the export payload from current store state (pure, side-effect free). */\n function buildVerticalConfig(): VerticalConfig {\n const { colors, fonts, radius } = themeStore.getState()\n const { overrides } = moduleStore.useModuleStore.getState()\n const { configIds, agentIds } = agentStore.getState()\n\n const modules: ExportedModule[] = DEFAULT_MODULES.map((m) => ({\n id: m.id,\n label: m.label,\n section: m.section,\n to: m.to,\n arbi: m.arbi,\n enabled: overrides[m.id]?.enabled ?? true,\n order: overrides[m.id]?.order ?? m.defaultOrder,\n })).sort(\n (a, b) =>\n SECTION_ORDER.indexOf(a.section) - SECTION_ORDER.indexOf(b.section) || a.order - b.order\n )\n\n return {\n version: 1,\n generatedAt: new Date().toISOString(),\n vertical,\n theme: { colors, fonts, radius },\n modules,\n agents: { configIds, agentIds },\n }\n }\n\n /** Serialise the export as pretty JSON. */\n function serialize(config: VerticalConfig = buildVerticalConfig()): string {\n return JSON.stringify(config, null, 2)\n }\n\n /** Trigger a browser download of the vertical config JSON. */\n function download(config: VerticalConfig = buildVerticalConfig()): void {\n const blob = new Blob([serialize(config)], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${config.vertical.key}-vertical.json`\n document.body.appendChild(a)\n a.click()\n a.remove()\n URL.revokeObjectURL(url)\n }\n\n return { buildVerticalConfig, serialize, download }\n}\n","/**\n * Module registry UI — enable/disable and reorder the vertical's modules.\n * Firm-agnostic: consumes an injected module-store bundle instead of a\n * singleton, so every firm app drives its own registry through the same UI.\n */\nimport { ChevronUp, ChevronDown, RotateCcw, Sparkles } from 'lucide-react'\nimport { Card, CardContent, CardHeader, CardTitle, Button, Badge } from '@arbidocs/react'\nimport { Switch } from '@arbidocs/react'\nimport { tid } from '../lib/testid'\nimport type { ModuleStoreBundle } from './modules/store'\n\nexport interface ModuleManagerProps {\n store: ModuleStoreBundle\n testIdPrefix?: string\n}\n\nexport function ModuleManager({ store, testIdPrefix = 'builder' }: ModuleManagerProps) {\n const grouped = store.useResolvedModules()\n const toggle = store.useModuleStore((s) => s.toggle)\n const move = store.useModuleStore((s) => s.move)\n const reset = store.useModuleStore((s) => s.reset)\n\n const enabledCount = grouped.reduce((n, g) => n + g.modules.filter((m) => m.enabled).length, 0)\n const total = grouped.reduce((n, g) => n + g.modules.length, 0)\n\n return (\n <div className=\"space-y-5\" data-testid={`${testIdPrefix}-modules`}>\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-muted-foreground\" data-testid={`${testIdPrefix}-modules-count`}>\n {enabledCount} of {total} modules enabled\n </p>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={reset}\n data-testid={`${testIdPrefix}-modules-reset`}\n >\n <RotateCcw className=\"size-3.5\" /> Reset\n </Button>\n </div>\n\n {grouped.map((group) => (\n <Card\n key={group.section}\n variant=\"elevated\"\n className=\"rounded-xl\"\n data-testid={tid(`${testIdPrefix}-modules-section`, group.section)}\n >\n <CardHeader>\n <CardTitle className=\"text-base\">{group.section}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-1.5\">\n {group.modules.map((m, idx) => {\n const Icon = m.icon\n return (\n <div\n key={m.id}\n className=\"flex items-center gap-3 rounded-md border border-border/60 bg-card px-3 py-2\"\n data-testid={tid(`${testIdPrefix}-module`, m.id)}\n >\n <div className=\"flex flex-col\">\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-6\"\n disabled={idx === 0}\n onClick={() => move(m.id, 'up')}\n aria-label={`Move ${m.label} up`}\n data-testid={tid(`${testIdPrefix}-module-up`, m.id)}\n >\n <ChevronUp className=\"size-3.5\" />\n </Button>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-6\"\n disabled={idx === group.modules.length - 1}\n onClick={() => move(m.id, 'down')}\n aria-label={`Move ${m.label} down`}\n data-testid={tid(`${testIdPrefix}-module-down`, m.id)}\n >\n <ChevronDown className=\"size-3.5\" />\n </Button>\n </div>\n <Icon className=\"size-4 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">{m.label}</p>\n <p className=\"truncate font-mono text-[11px] text-muted-foreground\">{m.to}</p>\n </div>\n {m.arbi && (\n <Badge variant=\"accent\" className=\"text-[10px]\">\n <Sparkles className=\"size-3\" /> ARBI\n </Badge>\n )}\n <Switch\n checked={m.enabled}\n onCheckedChange={() => toggle(m.id)}\n aria-label={`Enable ${m.label}`}\n data-testid={tid(`${testIdPrefix}-module-toggle`, m.id)}\n />\n </div>\n )\n })}\n </CardContent>\n </Card>\n ))}\n </div>\n )\n}\n","/**\n * Agent/behaviour surface — select which ARBI configs and agents are active for\n * the vertical. Firm-agnostic: consumes an injected agent-selection store; the\n * configs and agents themselves come live from ARBI via React Query.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport type { StoreApi, UseBoundStore } from 'zustand'\nimport {\n useArbi,\n useAgents,\n useConfigs,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Badge,\n} from '@arbidocs/react'\nimport { Bot, BrainCircuit, Cpu } from 'lucide-react'\nimport { Checkbox } from '@arbidocs/react'\nimport { tid } from '../lib/testid'\nimport type { AgentSelectionStore } from './agents/store'\n\ntype AgentStore = UseBoundStore<StoreApi<AgentSelectionStore>>\n\ntype BadgeVariant = 'default' | 'accent' | 'secondary'\n\n/** Colour the model tier so Premium/Wise read at a glance. */\nconst TIER_VARIANT: Record<string, BadgeVariant> = {\n Premium: 'default',\n Wise: 'accent',\n Fast: 'secondary',\n auto: 'secondary',\n}\n\n/**\n * The model tier lives inside a configuration's `Agents.AGENT_MODEL_NAME`\n * (auto|Fast|Wise|Premium) — NOT the list response — so we fetch the config\n * detail lazily. This is the tier, distinct from the assistant query `model`\n * field (which carries a configuration ext_id, not a tier).\n */\nfunction ConfigModelBadge({ configId, testIdPrefix }: { configId: string; testIdPrefix: string }) {\n const arbi = useArbi()\n const { data, isLoading, isError } = useQuery({\n queryKey: ['builder', 'config-model', configId],\n queryFn: async () => (await arbi.agentConfig.get(configId)).Agents.AGENT_MODEL_NAME,\n staleTime: 60_000,\n })\n const tier = isLoading ? '…' : isError || !data ? '—' : data\n return (\n <Badge\n variant={TIER_VARIANT[tier] ?? 'secondary'}\n data-testid={tid(`${testIdPrefix}-agents-config-tier`, configId)}\n >\n <Cpu className=\"size-3\" /> {tier}\n </Badge>\n )\n}\n\nexport interface AgentsPanelProps {\n store: AgentStore\n testIdPrefix?: string\n}\n\nexport function AgentsPanel({ store, testIdPrefix = 'builder' }: AgentsPanelProps) {\n const { data: configs, isLoading: configsLoading } = useConfigs()\n const { data: agents = [], isLoading: agentsLoading } = useAgents()\n const configIds = store((s) => s.configIds)\n const agentIds = store((s) => s.agentIds)\n const toggleConfig = store((s) => s.toggleConfig)\n const toggleAgent = store((s) => s.toggleAgent)\n\n const versions = configs?.versions ?? []\n\n return (\n <div className=\"space-y-6\" data-testid={`${testIdPrefix}-agents`}>\n {/* Behaviour configurations */}\n <Card\n variant=\"elevated\"\n className=\"rounded-xl\"\n data-testid={`${testIdPrefix}-agents-configs`}\n >\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <BrainCircuit className=\"size-4 text-primary\" /> Behaviour configurations\n <Badge variant=\"secondary\" className=\"ml-1\">\n {versions.length}\n </Badge>\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-1.5\">\n {configsLoading && (\n <p className=\"text-sm text-muted-foreground\">Loading configurations…</p>\n )}\n {!configsLoading && versions.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">\n No configurations found on this workspace.\n </p>\n )}\n {versions.map((v) => (\n <label\n key={v.external_id}\n className=\"flex cursor-pointer items-center gap-3 rounded-md border border-border/60 bg-card px-3 py-2\"\n data-testid={tid(`${testIdPrefix}-agents-config`, v.external_id)}\n >\n <Checkbox\n checked={configIds.includes(v.external_id)}\n onCheckedChange={() => toggleConfig(v.external_id)}\n data-testid={tid(`${testIdPrefix}-agents-config-toggle`, v.external_id)}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">\n {v.title ?? 'Untitled behaviour'}\n </p>\n <p className=\"truncate font-mono text-[11px] text-muted-foreground\">\n {v.external_id}\n </p>\n </div>\n <ConfigModelBadge configId={v.external_id} testIdPrefix={testIdPrefix} />\n </label>\n ))}\n </CardContent>\n </Card>\n\n {/* Agents */}\n <Card variant=\"elevated\" className=\"rounded-xl\" data-testid={`${testIdPrefix}-agents-agents`}>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Bot className=\"size-4 text-primary\" /> Agents\n <Badge variant=\"secondary\" className=\"ml-1\">\n {agents.length}\n </Badge>\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-1.5\">\n {agentsLoading && <p className=\"text-sm text-muted-foreground\">Loading agents…</p>}\n {!agentsLoading && agents.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">No agents provisioned.</p>\n )}\n {agents.map((a) => (\n <label\n key={a.external_id}\n className=\"flex cursor-pointer items-center gap-3 rounded-md border border-border/60 bg-card px-3 py-2\"\n data-testid={tid(`${testIdPrefix}-agents-agent`, a.external_id)}\n >\n <Checkbox\n checked={agentIds.includes(a.external_id)}\n onCheckedChange={() => toggleAgent(a.external_id)}\n data-testid={tid(`${testIdPrefix}-agents-agent-toggle`, a.external_id)}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">\n {(a.given_name ?? 'Agent').replace(/-/g, ' ')}\n </p>\n <p className=\"truncate font-mono text-[11px] text-muted-foreground\">\n {a.external_id}\n </p>\n </div>\n </label>\n ))}\n </CardContent>\n </Card>\n </div>\n )\n}\n","/**\n * VerticalBuilder — the back-office surface that configures a firm's vertical:\n * theme tokens, which modules ship (and in what order) and which ARBI\n * behaviours/agents are active. Not a page builder — it produces a\n * vertical-config seed.\n *\n * Firm-agnostic: the theme bundle, module/agent stores and exporter arrive as\n * props; the firm supplies its own `header` (PageHeader + links + badges) so\n * app-specific routing stays in the app.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport { Download, Palette, LayoutGrid, Bot, FileJson } from 'lucide-react'\nimport type { StoreApi, UseBoundStore } from 'zustand'\nimport { Card, CardContent, CardHeader, CardTitle, Button } from '@arbidocs/react'\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '@arbidocs/react'\nimport { ThemeEditor } from '../theme/ThemeEditor'\nimport type { ThemeBundle } from '../theme/store'\nimport { ModuleManager } from './ModuleManager'\nimport { AgentsPanel } from './AgentsPanel'\nimport type { ModuleStoreBundle } from './modules/store'\nimport type { AgentSelectionStore } from './agents/store'\nimport type { VerticalExport } from './export'\n\ntype AgentStore = UseBoundStore<StoreApi<AgentSelectionStore>>\n\nexport interface VerticalBuilderProps {\n themeBundle: ThemeBundle\n moduleStore: ModuleStoreBundle\n agentStore: AgentStore\n exporter: VerticalExport\n themePreview: { title: string; subtitle?: string }\n header?: ReactNode\n studioHref?: string\n testIdPrefix?: string\n}\n\n/** Export tab — a live JSON preview of the combined vertical config + download. */\nfunction ExportPanel({\n themeBundle,\n moduleStore,\n agentStore,\n exporter,\n testIdPrefix,\n}: {\n themeBundle: ThemeBundle\n moduleStore: ModuleStoreBundle\n agentStore: AgentStore\n exporter: VerticalExport\n testIdPrefix: string\n}) {\n // Subscribe to each store so the preview recomputes as the admin edits.\n const theme = themeBundle.useStore()\n const modules = moduleStore.useModuleStore()\n const agents = agentStore()\n const json = useMemo(() => exporter.serialize(), [theme, modules, agents, exporter])\n\n return (\n <Card variant=\"elevated\" className=\"rounded-xl\" data-testid={`${testIdPrefix}-export-panel`}>\n <CardHeader>\n <CardTitle className=\"flex items-center justify-between text-base\">\n <span className=\"flex items-center gap-2\">\n <FileJson className=\"size-4 text-primary\" /> Vertical config\n </span>\n <Button\n size=\"sm\"\n variant=\"accent\"\n onClick={() => exporter.download()}\n data-testid={`${testIdPrefix}-export`}\n >\n <Download className=\"size-4\" /> Download JSON\n </Button>\n </CardTitle>\n </CardHeader>\n <CardContent>\n <pre\n className=\"scrollbar-slim max-h-[520px] overflow-auto rounded-md bg-foreground p-4 font-mono text-[11px] leading-relaxed text-background\"\n data-testid={`${testIdPrefix}-export-preview`}\n >\n {json}\n </pre>\n </CardContent>\n </Card>\n )\n}\n\nexport function VerticalBuilder({\n themeBundle,\n moduleStore,\n agentStore,\n exporter,\n themePreview,\n header,\n testIdPrefix = 'builder',\n}: VerticalBuilderProps) {\n return (\n <div className=\"space-y-6\" data-testid={`page-${testIdPrefix}`}>\n {header}\n\n <Tabs defaultValue=\"theme\">\n <TabsList data-testid={`${testIdPrefix}-tabs`}>\n <TabsTrigger value=\"theme\" data-testid={`${testIdPrefix}-tab-theme`}>\n <Palette className=\"size-4\" /> Theme\n </TabsTrigger>\n <TabsTrigger value=\"modules\" data-testid={`${testIdPrefix}-tab-modules`}>\n <LayoutGrid className=\"size-4\" /> Modules\n </TabsTrigger>\n <TabsTrigger value=\"agents\" data-testid={`${testIdPrefix}-tab-agents`}>\n <Bot className=\"size-4\" /> Agents\n </TabsTrigger>\n <TabsTrigger value=\"export\" data-testid={`${testIdPrefix}-tab-export`}>\n <FileJson className=\"size-4\" /> Export\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"theme\">\n <ThemeEditor\n bundle={themeBundle}\n variant=\"panel\"\n testIdPrefix={`${testIdPrefix}-theme`}\n preview={themePreview}\n />\n </TabsContent>\n <TabsContent value=\"modules\">\n <ModuleManager store={moduleStore} testIdPrefix={testIdPrefix} />\n </TabsContent>\n <TabsContent value=\"agents\">\n <AgentsPanel store={agentStore} testIdPrefix={testIdPrefix} />\n </TabsContent>\n <TabsContent value=\"export\">\n <ExportPanel\n themeBundle={themeBundle}\n moduleStore={moduleStore}\n agentStore={agentStore}\n exporter={exporter}\n testIdPrefix={testIdPrefix}\n />\n </TabsContent>\n </Tabs>\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/prompts.ts","../src/theme/tokens.ts","../src/theme/store.ts","../src/theme/ThemeEditor.tsx","../src/connection/ConnectionProvider.tsx","../src/connection/LegalArbiProvider.tsx","../src/connection/ai.ts","../src/lib/testid.ts","../src/lib/format.ts","../src/components/EmptyState.tsx","../src/components/DataTable.tsx","../src/components/DataTableBlock.tsx","../src/components/GridView.tsx","../src/components/PageHeader.tsx","../src/components/SectionHeading.tsx","../src/components/Toolbar.tsx","../src/components/MetricCard.tsx","../src/components/assetResolver.tsx","../src/components/BlockImage.tsx","../src/components/Hero.tsx","../src/components/FeatureGrid.tsx","../src/components/StatGroup.tsx","../src/components/Testimonial.tsx","../src/components/CTABanner.tsx","../src/components/LogoCloud.tsx","../src/components/FAQ.tsx","../src/components/RichTextBlock.tsx","../src/components/Callout.tsx","../src/components/AvatarBlock.tsx","../src/components/Navbar.tsx","../src/components/Footer.tsx","../src/components/ListBlock.tsx","../src/components/Columns.tsx","../src/components/Spacer.tsx","../src/components/Container.tsx","../src/components/PricingTable.tsx","../src/components/Tabs.tsx","../src/components/Accordion.tsx","../src/components/Gallery.tsx","../src/components/VideoEmbed.tsx","../src/components/ContactForm.tsx","../src/components/Banner.tsx","../src/components/MediaText.tsx","../src/components/TeamGrid.tsx","../src/components/Steps.tsx","../src/components/TestimonialGrid.tsx","../src/nav/AppShell.tsx","../src/nav/AppHeader.tsx","../src/studio/liveData.ts","../src/studio/liveWidgetRuntime.tsx","../src/studio/widgets.tsx","../src/studio/publish.ts","../src/studio/StudioEditor.tsx","../src/studio/PageRenderer.tsx","../src/studio/persistence.ts","../src/studio/aiFields.tsx","../src/connection/useImageGen.ts","../src/studio/imageFields.tsx","../src/studio/Section.tsx","../src/studio/blockKit.tsx","../src/studio/websiteBlocks.tsx","../src/studio/siteBlocks.tsx","../src/studio/blocksConfig.tsx","../src/builder/modules/registry.ts","../src/builder/modules/store.ts","../src/builder/agents/store.ts","../src/builder/export.ts","../src/builder/ModuleManager.tsx","../src/builder/AgentsPanel.tsx","../src/builder/VerticalBuilder.tsx"],"names":["tid","useState","jsx","useKitAiTask","useCallback","useKitWorkspaceDocs","useKitSemanticSearch","jsxs","cn","useMemo","useEffect","lines","alignClass","Input","Card","createContext","useContext","useArbi","TONE_SURFACE","Button","ArrowRight","Avatar","AvatarImage","AvatarFallback","GRID","SIZE","Check","toggle","ChevronDown","COLS","ASPECT","Quote","Fragment","Search","Sparkles","useRef","persist","Link","Palette","Loader2","useDocuments","useThumbnails","name","Link2","PADDING","WIDTH","FileText","Info","Rocket","emptySlot","id","create","a","b","RotateCcw","CardHeader","CardTitle","CardContent","Badge","useQuery","Cpu","Bot","Tabs"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The reusable AI-native law-firm prompt library.\n *\n * Deliberately opinionated, litigation-grade instructions: they demand citations\n * to the source documents, hedge appropriately, and always frame the output as a\n * draft for a regulated lawyer to review (\"AI proposes, the lawyer disposes\").\n * Firm-specific register (name, jurisdiction, house language) is injected via\n * {@link PromptConfig} so a second firm reuses the same library with its own\n * voice — call {@link createPromptLibrary} once and share the result app-wide.\n */\n\nexport interface MatterContext {\n title: string\n client?: string\n court?: string\n claimNumber?: string\n practice?: string\n summary?: string\n}\n\n/** Build a {@link MatterContext} from any matter-shaped record. */\nexport function matterToContext(m: {\n title: string\n clientName?: string\n court?: string | null\n claimNumber?: string | null\n practice?: string\n summary?: string\n}): MatterContext {\n return {\n title: m.title,\n client: m.clientName,\n court: m.court ?? undefined,\n claimNumber: m.claimNumber ?? undefined,\n practice: m.practice,\n summary: m.summary,\n }\n}\n\n/** Firm voice for the prompt library — everything firm-specific lives here. */\nexport interface PromptConfig {\n /** The firm's name, e.g. \"Acme Legal\". */\n firmName: string\n /** The legal system adjective used throughout, e.g. \"English\". */\n jurisdiction?: string\n /** House writing language, e.g. \"British English\". */\n language?: string\n /** How the reviewing professional is addressed, e.g. \"qualified solicitor\". */\n reviewerTitle?: string\n /** Who signs off compliance/onboarding, e.g. \"MLRO\". */\n complianceOfficer?: string\n}\n\nexport type PromptLibrary = ReturnType<typeof createPromptLibrary>\n/** The map of prompt builders (`prompts.brief(ctx)`, `prompts.revise(...)`, …). */\nexport type Prompts = PromptLibrary['prompts']\n\n/**\n * Build a firm-branded prompt library. Every prompt grounds on the supplied\n * documents, cites sources, and is framed as a draft for a lawyer to review.\n */\nexport function createPromptLibrary(config: PromptConfig) {\n const {\n firmName,\n jurisdiction = 'English',\n language = 'British English',\n reviewerTitle = 'qualified solicitor',\n complianceOfficer = 'MLRO',\n } = config\n\n const HOUSE_RULES = `You are ${firmName}'s litigation AI, working for a regulated ${jurisdiction} law firm.\nGround every statement in the supplied documents and cite the source document (and page/section where possible) for each material point.\nIf the documents do not support a point, say so plainly rather than inventing it. Write in concise ${language} for a ${reviewerTitle}. This is a draft for a lawyer to review — never present it as final legal advice.`\n\n const withContext = (m: MatterContext | undefined, body: string): string => {\n if (!m) return `${HOUSE_RULES}\\n\\n${body}`\n const facts = [\n `Matter: ${m.title}`,\n m.client && `Client: ${m.client}`,\n m.court && `Forum: ${m.court}`,\n m.claimNumber && `Case reference: ${m.claimNumber}`,\n m.practice && `Practice area: ${m.practice}`,\n ]\n .filter(Boolean)\n .join('\\n')\n return `${HOUSE_RULES}\\n\\nContext for this matter:\\n${facts}\\n\\n${body}`\n }\n\n const prompts = {\n /** Executive brief of the matter, from the live bundle. */\n brief: (m?: MatterContext) =>\n withContext(\n m,\n `Produce a crisp executive brief of this matter for a partner picking it up cold. Cover, with citations: (1) what the dispute is about, (2) the parties and their roles, (3) the key issues in play, (4) the current procedural posture, and (5) the two or three things that most need attention next. Keep it under 300 words.`\n ),\n\n /** Sourced chronology of events. */\n chronology: (m?: MatterContext) =>\n withContext(\n m,\n `Build a chronology of every material dated event across the documents. Output a table with columns: Date | Event | Source (document + page). Order strictly by date. Include correspondence, transactions, procedural steps and factual events. Flag any date that is ambiguous or disputed in the documents.`\n ),\n\n /** Disclosure / relevance + privilege review. */\n disclosure: (m?: MatterContext) =>\n withContext(\n m,\n `Act as a disclosure reviewer. For each document, assess: (a) relevance to the issues in dispute (High / Medium / Low, with a one-line reason), and (b) whether it may attract legal professional privilege or contain sensitive/personal data that needs redaction — with your reasoning. Present as a table: Document | Relevance | Privilege/PII risk | Reason. Be conservative: when unsure about privilege, flag it for a lawyer.`\n ),\n\n /** Merits / risk assessment — the real \"AI outlook\". */\n risk: (m?: MatterContext) =>\n withContext(\n m,\n `Give a balanced merits assessment grounded in the documents. Cover: the strongest points for our client, the strongest points against, key evidential gaps, and the main quantum drivers. End with a single calibrated headline: an overall assessment of the client's position (Strong / Favourable / Balanced / Difficult) with a one-sentence justification. Cite sources throughout. Be candid about weaknesses — a partner needs the downside, not comfort.`\n ),\n\n /** Extract deadlines / key dates with rule references. */\n deadlines: (m?: MatterContext) =>\n withContext(\n m,\n `Extract every deadline, key date and time-limited step referenced in the documents. Output a table: Due date | Event | Rule/basis (e.g. CPR reference, contractual clause, court order) | Source document. Include implied deadlines (e.g. a defence due 28 days after service) and note the trigger. Flag anything overdue or imminent.`\n ),\n\n /** Draft a document (letter / pleading / note). */\n draft: (kind: string, m?: MatterContext) =>\n withContext(\n m,\n `Draft a first-pass ${kind} for this matter, grounded in the documents. Use the correct ${jurisdiction} litigation format and tone. Where a fact relies on a document, cite it inline in [square brackets] so the solicitor can verify. Leave clearly-marked [PLACEHOLDERS] where information is missing rather than guessing. Add a short \"Points to verify before sending\" list at the end.`\n ),\n\n /** Free-form question about the matter. */\n ask: (question: string, m?: MatterContext) => withContext(m, `Question: ${question}`),\n\n /**\n * Draft a clean document artifact (output IS the document — no preamble).\n *\n * Pure single-pass generation from the matter context: it deliberately does\n * NOT tell the agent to look up or cite the document bundle. Asking a drafting\n * agent to \"cite the source behind each fact\" sends it into a retrieval loop\n * that can spin for minutes before emitting a token; a lawyer wants a fast\n * first draft to refine, so we draft from the known matter facts and mark\n * genuinely-missing specifics as [PLACEHOLDER]. (Grounded, cited analysis is\n * what {@link brief}/{@link risk} are for.)\n */\n draftArtifact: (kind: string, instructions: string, m?: MatterContext) =>\n withContext(\n m,\n `Draft a ${kind} for this matter now, in a single pass, using only the matter context above — do not look anything up.${instructions ? ` Specific instructions: ${instructions}.` : ''}\\n\\nKeep it tight — about 180–240 words, the essential body only. Where a specific detail isn't given in the context, insert a clearly-marked [PLACEHOLDER] and keep drafting — never stop to search for it.\\n\\nOutput ONLY the finished document in clean Markdown — a short title, then the body in correct ${jurisdiction} litigation format. No commentary before or after the document.`\n ),\n\n /**\n * Revise a supplied passage. Returns ONLY the full revised text (no commentary),\n * so the app can diff it against the original into a redline.\n */\n revise: (original: string, instruction: string, m?: MatterContext) =>\n withContext(\n m,\n `Revise the following passage per this instruction: \"${instruction}\". Improve it for an ${jurisdiction} disputes matter — tighten drafting, close gaps, and align with the documents where relevant.\\n\\nReturn ONLY the complete revised passage as plain text. No preamble, no explanation, no markdown fences — just the revised words so they can be compared against the original.\\n\\nPASSAGE:\\n\"\"\"${original}\"\"\"`\n ),\n\n /** Morning digest across the matter. */\n digest: (m?: MatterContext) =>\n withContext(\n m,\n `Write a short \"start of day\" brief for the fee-earner on this matter (5-6 bullet points). Surface: what changed or is newly relevant in the documents, the most pressing deadline or risk, and one concrete recommended next action. Be specific and cite sources. Keep it scannable.`\n ),\n\n /** UTBMS-coded billing narrative from time context. */\n billing: (activity: string, m?: MatterContext) =>\n withContext(\n m,\n `Draft a compliant, client-ready time-entry narrative for the following work: \"${activity}\". Write it in the third person, be specific about what was done and why it advanced the matter, avoid block-billing language, and suggest the most appropriate UTBMS task and activity codes. Keep it to 1-2 sentences.`\n ),\n\n /** Closing / lessons-learned memo. */\n closing: (m?: MatterContext) =>\n withContext(\n m,\n `Draft a matter closing memo grounded in the documents. Cover: the outcome, a concise narrative of how the matter resolved, key lessons for similar future matters, and any residual risks or follow-up obligations (limitation, undertakings, retention). Cite sources.`\n ),\n\n /** Thought-leadership / insight article from the matter's themes. */\n insight: (m?: MatterContext) =>\n withContext(\n m,\n `Using the legal and commercial themes in these documents, draft an 800-word thought-leadership insight article suitable for the firm's website. Anonymise all party-specific and confidential details — write about the legal principles and practical lessons, not this specific client. Give it a compelling headline and a two-sentence standfirst. This is marketing content; keep it authoritative but accessible.`\n ),\n\n /** Auto-tagging / issue classification of documents. */\n autoTag: (m?: MatterContext) =>\n withContext(\n m,\n `Propose a concise set of issue tags and document-type labels for this bundle so it can be organised. For each document, suggest 2-4 short tags (e.g. issue, document type, key party). Output as: Document | Suggested tags. Keep tags reusable and consistent across the set.`\n ),\n\n /** Verify uploaded onboarding documents against a KYC/CDD checklist. */\n kyc: (clientName: string, m?: MatterContext) =>\n withContext(\n m,\n `Act as ${firmName}'s client onboarding / KYC-CDD analyst for a new client, \"${clientName}\". Review the documents in this workspace against the firm's onboarding checklist and report each item as ✅ satisfied, ⚠️ partial, or ❌ missing, with a one-line reason citing the source.\\n\\nChecklist:\\n1. Proof of identity (individual) or certificate of incorporation (entity)\\n2. Proof of registered/residential address\\n3. Beneficial ownership / corporate authority to instruct\\n4. Source of funds / source of wealth indication\\n5. Sanctions / PEP screening flags apparent from the papers\\n\\nOutput a Markdown table: Item | Status | Notes (source). End with an overall onboarding recommendation (Proceed / Proceed with conditions / Do not proceed) and any information still required. This is a compliance aid; the ${complianceOfficer} signs off.`\n ),\n\n // ── Pitch / intake stage (may run before a workspace has full documents) ──\n\n /** Triage a prospective enquiry. */\n triage: (enquiry: string, m?: MatterContext) =>\n withContext(\n m,\n `A prospective client has made this enquiry:\\n\\n\"\"\"${enquiry}\"\"\"\\n\\nTriage it for the firm. Provide: (1) the likely practice area and a one-line matter description, (2) an initial risk/complexity rating with reasons, (3) the key questions we must ask before taking it on, and (4) any obvious limitation or urgency concerns. Be practical.`\n ),\n\n /** Conflict-of-interest style check against the workspace. */\n conflict: (parties: string, m?: MatterContext) =>\n withContext(\n m,\n `Run a conflict-awareness check. The prospective matter involves these parties/entities:\\n\\n\"\"\"${parties}\"\"\"\\n\\nSearch the documents for any mention of these names or closely related entities that could indicate a conflict of interest or prior involvement. Report each potential match with the source and a plain-English explanation of why it might matter. If nothing is found, say so clearly. This is a screening aid, not a substitute for a formal conflict search.`\n ),\n\n /** Capability statement / pitch letter. */\n pitch: (opportunity: string, m?: MatterContext) =>\n withContext(\n m,\n `Draft a persuasive one-page capability statement to pitch for this opportunity:\\n\\n\"\"\"${opportunity}\"\"\"\\n\\nLead with why the firm is the right choice, reference relevant experience at a thematic level (no confidential client details), set out the proposed team and approach, and close with a clear next step. Confident but not boastful.`\n ),\n }\n\n /** The four headline agentic workflows surfaced as one-click actions. */\n const WORKFLOW_ACTIONS = [\n { id: 'brief', title: 'Matter brief', prompt: prompts.brief },\n { id: 'chronology', title: 'Build a chronology', prompt: prompts.chronology },\n { id: 'disclosure', title: 'Review for disclosure', prompt: prompts.disclosure },\n { id: 'risk', title: 'Merits & risk', prompt: prompts.risk },\n ] as const\n\n return { prompts, WORKFLOW_ACTIONS }\n}\n","/**\n * The theme-token model. Firm-agnostic: the token *catalog*, default values and\n * presets are supplied by the consuming app (via {@link createThemeStore}); this\n * module owns the shared types and the logic for writing tokens onto the live\n * document.\n *\n * There are two emit models, selected per-app by {@link ThemeEmitMode}:\n *\n * - `'flat'` (default): each colour key is written as an inline `--color-<key>`\n * custom property on `<html>`, plus `--font-*` / `--radius`. Inline styles\n * override the compiled `@theme` defaults, so an edit previews live across the\n * whole app (and the @arbidocs AI kit) and reverts cleanly. Apps whose CSS sets\n * `--color-*` HEX directly rely on this.\n *\n * - `'cssVars'`: each colour key is written as a raw\n * HSL-triplet custom property (`--<key>: <h s l>`) into an injected\n * `<style id=\"arbi-theme-vars\">` appended to `<head>`. The monolith's source\n * of truth is HSL triplets wrapped as `hsl(var(--x))`, with a real `.dark`\n * variant; writing resolved hex inline would pin the colour and defeat both\n * the indirection and the dark-class swap. The injected sheet is *unlayered*,\n * so it wins over the monolith's `@layer base` `colors.css` at equal\n * specificity, and a `:root { light } / :root.dark { dark }` structure keeps\n * the dark cascade alive.\n */\n\nexport interface ColorToken {\n /** Key without the `--color-` prefix, e.g. \"primary\" → `--color-primary`. */\n key: string\n label: string\n /** Grouping id for the panel layout (e.g. \"shadcn\" | \"brand\" | \"ai\"). */\n group: string\n}\n\nexport interface ThemeFonts {\n display: string\n sans: string\n}\n\nexport interface ThemeTokens {\n /** Colour values keyed by token key (hex). */\n colors: Record<string, string>\n fonts: ThemeFonts\n /** Base radius in rem. */\n radius: number\n}\n\nexport interface ThemePreset {\n id: string\n label: string\n tokens: ThemeTokens\n}\n\n/** How a theme is written onto the document. See the module doc for the models. */\nexport type ThemeEmitMode = 'flat' | 'cssVars'\n\nexport interface ApplyThemeOptions {\n /** Emit model. Defaults to `'flat'`. */\n mode?: ThemeEmitMode\n /**\n * `cssVars` mode only: dark-variant colour values keyed by token key. Emitted\n * under `:root.dark`. When omitted, only `:root` is emitted — note that an\n * overridden light token then also applies in dark (the injected `:root` is\n * unlayered and beats the app's own `.dark` rules), so a firm with a dark mode\n * MUST supply this for every editable token to keep dark mode intact.\n */\n dark?: Record<string, string>\n /** `flat` mode only: target element. Defaults to `document.documentElement`. */\n root?: HTMLElement\n}\n\n/** Id of the injected `<style>` that carries the `cssVars`-mode custom properties. */\nexport const THEME_STYLE_ID = 'arbi-theme-vars'\n\nconst TRIPLET_RE = /^-?\\d+(?:\\.\\d+)?\\s+-?\\d+(?:\\.\\d+)?%\\s+-?\\d+(?:\\.\\d+)?%$/\n\nfunction parseRgb(color: string): { r: number; g: number; b: number } | null {\n if (color.startsWith('#')) {\n let hex = color.slice(1)\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map((ch) => ch + ch)\n .join('')\n }\n if (hex.length === 6 && /^[0-9a-fA-F]{6}$/.test(hex)) {\n return {\n r: parseInt(hex.slice(0, 2), 16),\n g: parseInt(hex.slice(2, 4), 16),\n b: parseInt(hex.slice(4, 6), 16),\n }\n }\n return null\n }\n const m = color.match(/^rgba?\\(\\s*([\\d.]+)[\\s,]+([\\d.]+)[\\s,]+([\\d.]+)/i)\n if (m) return { r: Number(m[1]), g: Number(m[2]), b: Number(m[3]) }\n return null\n}\n\nfunction rgbToHslTriplet(r: number, g: number, b: number): string {\n const rn = r / 255\n const gn = g / 255\n const bn = b / 255\n const max = Math.max(rn, gn, bn)\n const min = Math.min(rn, gn, bn)\n const l = (max + min) / 2\n const d = max - min\n let h = 0\n let s = 0\n if (d !== 0) {\n s = d / (1 - Math.abs(2 * l - 1))\n switch (max) {\n case rn:\n h = 60 * (((gn - bn) / d) % 6)\n break\n case gn:\n h = 60 * ((bn - rn) / d + 2)\n break\n default:\n h = 60 * ((rn - gn) / d + 4)\n break\n }\n }\n if (h < 0) h += 360\n return `${Math.round(h)} ${Math.round(s * 100)}% ${Math.round(l * 100)}%`\n}\n\n/**\n * Convert a colour to the monolith's `H S% L%` HSL-triplet format.\n *\n * Handles `#rgb` / `#rrggbb`, `rgb()` / `rgba()`, and passes an existing triplet\n * through untouched (so a firm can seed exact `colors.css` triplets for a\n * byte-identical no-op). Values it cannot parse — notably `oklch(...)`, which the\n * status tokens use — are returned unchanged so they remain usable as a raw\n * custom-property value; converting those cleanly is out of scope.\n */\nexport function toHslTriplet(color: string): string {\n const c = color.trim()\n if (TRIPLET_RE.test(c)) return c\n const rgb = parseRgb(c)\n if (!rgb) return c\n return rgbToHslTriplet(rgb.r, rgb.g, rgb.b)\n}\n\nfunction renderTripletBlock(colors: Record<string, string>): string {\n return Object.entries(colors)\n .map(([key, value]) => ` --${key}: ${toHslTriplet(value)};`)\n .join('\\n')\n}\n\nfunction emitCssVars(theme: ThemeTokens, dark?: Record<string, string>): void {\n if (typeof document === 'undefined') return\n const meta = [\n ` --font-display: ${theme.fonts.display};`,\n ` --font-sans: ${theme.fonts.sans};`,\n ` --radius: ${theme.radius}rem;`,\n ].join('\\n')\n let css = `:root {\\n${renderTripletBlock(theme.colors)}\\n${meta}\\n}`\n if (dark) {\n css += `\\n:root.dark {\\n${renderTripletBlock(dark)}\\n}`\n }\n let style = document.getElementById(THEME_STYLE_ID) as HTMLStyleElement | null\n if (!style) {\n style = document.createElement('style')\n style.id = THEME_STYLE_ID\n document.head.appendChild(style)\n }\n style.textContent = css\n}\n\nfunction removeCssVars(): void {\n if (typeof document === 'undefined') return\n document.getElementById(THEME_STYLE_ID)?.remove()\n}\n\nfunction normalizeOptions(optionsOrRoot: ApplyThemeOptions | HTMLElement): ApplyThemeOptions {\n if (typeof HTMLElement !== 'undefined' && optionsOrRoot instanceof HTMLElement) {\n return { root: optionsOrRoot }\n }\n return optionsOrRoot as ApplyThemeOptions\n}\n\n/**\n * Write a theme onto the live document.\n *\n * In `flat` mode (default) writes inline `--color-<key>` / `--font-*` / `--radius`\n * on `document.documentElement` (or a supplied root). In `cssVars` mode writes\n * raw HSL-triplet vars into an injected `<style#arbi-theme-vars>` (see the module\n * doc). The legacy `applyThemeVars(theme, rootElement)` call form still works.\n */\nexport function applyThemeVars(\n theme: ThemeTokens,\n optionsOrRoot: ApplyThemeOptions | HTMLElement = {}\n): void {\n const { mode = 'flat', dark, root = document.documentElement } = normalizeOptions(optionsOrRoot)\n\n if (mode === 'cssVars') {\n emitCssVars(theme, dark)\n return\n }\n\n for (const [key, value] of Object.entries(theme.colors)) {\n root.style.setProperty(`--color-${key}`, value)\n }\n root.style.setProperty('--font-display', theme.fonts.display)\n root.style.setProperty('--font-sans', theme.fonts.sans)\n root.style.setProperty('--radius', `${theme.radius}rem`)\n}\n\n/**\n * Remove a theme's overrides, reverting to the stylesheet defaults.\n *\n * In `flat` mode removes the inline overrides for the theme's keys. In `cssVars`\n * mode removes the injected `<style#arbi-theme-vars>` in full (restoring the\n * app's own `colors.css` exactly).\n */\nexport function clearThemeVars(\n theme: ThemeTokens,\n optionsOrRoot: ApplyThemeOptions | HTMLElement = {}\n): void {\n const { mode = 'flat', root = document.documentElement } = normalizeOptions(optionsOrRoot)\n\n if (mode === 'cssVars') {\n removeCssVars()\n return\n }\n\n for (const key of Object.keys(theme.colors)) {\n root.style.removeProperty(`--color-${key}`)\n }\n root.style.removeProperty('--font-display')\n root.style.removeProperty('--font-sans')\n root.style.removeProperty('--radius')\n}\n","/**\n * The shared theme store factory. A firm calls {@link createThemeStore} once\n * with its token catalog, default values and presets; the returned bundle (a\n * zustand hook + metadata) is the single source of truth consumed by every\n * theme surface (the back-office builder panel and the studio drawer), so the\n * token model, presets and apply logic live in exactly one place.\n */\nimport { create, type UseBoundStore, type StoreApi } from 'zustand'\nimport { persist } from 'zustand/middleware'\nimport {\n applyThemeVars,\n type ColorToken,\n type ThemeEmitMode,\n type ThemeFonts,\n type ThemePreset,\n type ThemeTokens,\n} from './tokens'\n\nexport interface ThemeState extends ThemeTokens {\n activePresetId: string | null\n setColor: (key: string, value: string) => void\n setFont: (which: keyof ThemeFonts, value: string) => void\n setRadius: (radius: number) => void\n applyPreset: (presetId: string) => void\n reset: () => void\n /** Snapshot of the editable tokens (for export / live apply). */\n snapshot: () => ThemeTokens\n}\n\nexport interface ThemeStoreConfig {\n /** The editable token catalog (keys + labels + groups). */\n tokens: ColorToken[]\n /** Group id → heading, for the grouped panel layout. */\n groupLabels: Record<string, string>\n /** Shipped defaults (the firm's brand values). */\n defaultTheme: ThemeTokens\n /** Starting points the user can apply then fine-tune. */\n presets: ThemePreset[]\n /** localStorage key for persistence (namespaced per firm). */\n storageKey: string\n /**\n * How edits are written onto the document. Defaults to `'flat'` (inline\n * `--color-*`). `'cssVars'` emits raw HSL-triplet vars into an injected\n * `<style>` so an app's own `hsl(var(--x))` indirection + `.dark` variant\n * survive. See {@link applyThemeVars}.\n */\n mode?: ThemeEmitMode\n /**\n * `cssVars` mode only: the dark-variant colour values keyed by token key,\n * emitted under `:root.dark`. Required (per editable token) for any firm with a\n * dark mode, otherwise a light-token override leaks into dark.\n */\n darkColors?: Record<string, string>\n}\n\nexport interface ThemeBundle extends ThemeStoreConfig {\n useStore: UseBoundStore<StoreApi<ThemeState>>\n}\n\n/** Build a firm-branded theme store bundle. */\nexport function createThemeStore(config: ThemeStoreConfig): ThemeBundle {\n const { defaultTheme, presets, storageKey } = config\n\n const useStore = create<ThemeState>()(\n persist(\n (set, get) => ({\n ...defaultTheme,\n activePresetId: presets[0]?.id ?? null,\n\n setColor: (key, value) =>\n set((s) => ({ colors: { ...s.colors, [key]: value }, activePresetId: null })),\n\n setFont: (which, value) =>\n set((s) => ({ fonts: { ...s.fonts, [which]: value }, activePresetId: null })),\n\n setRadius: (radius) => set({ radius, activePresetId: null }),\n\n applyPreset: (presetId) => {\n const preset = presets.find((p) => p.id === presetId)\n if (!preset) return\n set({\n colors: { ...preset.tokens.colors },\n fonts: { ...preset.tokens.fonts },\n radius: preset.tokens.radius,\n activePresetId: presetId,\n })\n },\n\n reset: () =>\n set({\n colors: { ...defaultTheme.colors },\n fonts: { ...defaultTheme.fonts },\n radius: defaultTheme.radius,\n activePresetId: presets[0]?.id ?? null,\n }),\n\n snapshot: () => {\n const { colors, fonts, radius } = get()\n return { colors, fonts, radius }\n },\n }),\n { name: storageKey }\n )\n )\n\n return { ...config, useStore }\n}\n\n/** Apply a bundle's current store to the live document, honouring its emit mode. */\nexport function applyStoredTheme(bundle: ThemeBundle): void {\n const { colors, fonts, radius } = bundle.useStore.getState()\n applyThemeVars({ colors, fonts, radius }, { mode: bundle.mode, dark: bundle.darkColors })\n}\n","/**\n * The one theme editor, shared by every surface. `variant=\"panel\"` is the roomy\n * back-office layout (grouped token cards + a live preview); `variant=\"drawer\"`\n * is the compact slide-over beside the studio canvas. Both drive the same\n * {@link ThemeBundle} store, so there is a single token model, preset list and\n * apply path. Firm-agnostic: chrome uses only universal surface tokens and the\n * preview renders the theme's own swatches, so it needs no brand-specific\n * component variants.\n */\nimport { useEffect, useState } from 'react'\nimport { RotateCcw, Palette, Save, Check } from 'lucide-react'\nimport { Card, CardHeader, CardTitle, CardContent, Input } from '@arbidocs/react'\nimport { applyThemeVars } from './tokens'\nimport type { ThemeBundle } from './store'\n\nexport interface ThemeEditorProps {\n /** The firm's theme store bundle (from createThemeStore). */\n bundle: ThemeBundle\n variant?: 'panel' | 'drawer'\n /** Firm identity shown in the panel's live-preview header. */\n preview?: { title: string; subtitle?: string }\n /** Optional persistence side-channel (e.g. save theme to ARBI); returns a \"via\" label. */\n onSave?: () => Promise<string | void>\n /** Stable testid namespace, e.g. \"builder-theme\" | \"studio-theme\". */\n testIdPrefix?: string\n}\n\nexport function ThemeEditor({\n bundle,\n variant = 'panel',\n preview,\n onSave,\n testIdPrefix = 'theme',\n}: ThemeEditorProps) {\n const { useStore, tokens, presets, groupLabels, mode, darkColors } = bundle\n const colors = useStore((s) => s.colors)\n const fonts = useStore((s) => s.fonts)\n const radius = useStore((s) => s.radius)\n const activePresetId = useStore((s) => s.activePresetId)\n const setColor = useStore((s) => s.setColor)\n const setFont = useStore((s) => s.setFont)\n const setRadius = useStore((s) => s.setRadius)\n const applyPreset = useStore((s) => s.applyPreset)\n const reset = useStore((s) => s.reset)\n\n const [saving, setSaving] = useState(false)\n const [savedVia, setSavedVia] = useState<string | null>(null)\n\n // Live preview: reflect every token change onto the running app, using the\n // firm's emit mode (flat inline vars, or injected HSL-triplet cssVars).\n useEffect(() => {\n applyThemeVars({ colors, fonts, radius }, { mode, dark: darkColors })\n }, [colors, fonts, radius, mode, darkColors])\n\n const tid = (suffix: string) => `${testIdPrefix}-${suffix}`\n const groups = [...new Set(tokens.map((t) => t.group))]\n\n const save = async () => {\n if (!onSave) return\n setSaving(true)\n const via = await onSave()\n setSavedVia(typeof via === 'string' ? via : 'saved')\n setSaving(false)\n }\n\n // ── Presets row ────────────────────────────────────────────────────────────\n const Presets = (\n <div className=\"flex flex-wrap items-center gap-2\">\n {presets.map((p) => (\n <button\n key={p.id}\n type=\"button\"\n onClick={() => applyPreset(p.id)}\n className={`rounded-full border px-3 py-1 text-xs font-medium transition-colors ${\n activePresetId === p.id\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-border text-foreground hover:border-primary'\n }`}\n data-testid={tid(`preset-${p.id}`)}\n >\n {p.label}\n </button>\n ))}\n <button\n type=\"button\"\n onClick={reset}\n className=\"ml-auto inline-flex items-center gap-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n data-testid={tid('reset')}\n >\n <RotateCcw className=\"size-3\" /> Reset\n </button>\n </div>\n )\n\n // ── A single colour control ─────────────────────────────────────────────────\n // A plain function (not a component) so it inlines into the parent tree: this\n // avoids remounting the inputs on every keystroke (which would drop focus).\n const colorRow = (k: string, label: string) => (\n <div key={k} className=\"flex items-center gap-3\">\n <input\n type=\"color\"\n value={colors[k] ?? '#000000'}\n onChange={(e) => setColor(k, e.target.value)}\n className=\"size-9 shrink-0 cursor-pointer rounded-md border border-border bg-transparent\"\n aria-label={label}\n data-testid={tid(`color-${k}`)}\n />\n <div className=\"min-w-0 flex-1\">\n <span className=\"block text-xs text-muted-foreground\">{label}</span>\n <Input\n value={colors[k] ?? ''}\n onChange={(e) => setColor(k, e.target.value)}\n className=\"bg-card placeholder:text-muted-foreground/70 focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring/50 h-7 font-mono text-xs\"\n data-testid={tid(`hex-${k}`)}\n />\n </div>\n </div>\n )\n\n // ── Typography + radius ─────────────────────────────────────────────────────\n const Typography = (\n <div className=\"space-y-4\">\n <div>\n <span className=\"block text-xs text-muted-foreground\">Display font stack</span>\n <Input\n value={fonts.display}\n onChange={(e) => setFont('display', e.target.value)}\n className=\"bg-card placeholder:text-muted-foreground/70 focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring/50 mt-1 font-mono text-xs\"\n data-testid={tid('font-display')}\n />\n </div>\n <div>\n <span className=\"block text-xs text-muted-foreground\">Body font stack</span>\n <Input\n value={fonts.sans}\n onChange={(e) => setFont('sans', e.target.value)}\n className=\"bg-card placeholder:text-muted-foreground/70 focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring/50 mt-1 font-mono text-xs\"\n data-testid={tid('font-sans')}\n />\n </div>\n <div>\n <span className=\"block text-xs text-muted-foreground\">Base radius — {radius}rem</span>\n <input\n type=\"range\"\n min={0}\n max={1.5}\n step={0.125}\n value={radius}\n onChange={(e) => setRadius(Number(e.target.value))}\n className=\"mt-2 w-full accent-[color:var(--color-primary)]\"\n data-testid={tid('radius')}\n />\n </div>\n </div>\n )\n\n // ── Live preview (panel only) — renders the theme's own swatches ────────────\n const Preview = (\n <Card variant=\"elevated\" className=\"rounded-xl\" data-testid={tid('preview')}>\n <CardHeader>\n <CardTitle className=\"text-base\">Live preview</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <div className=\"rounded-[var(--radius)] bg-primary p-4 text-primary-foreground\">\n <p className=\"font-display text-lg font-semibold\">{preview?.title ?? 'Preview'}</p>\n {preview?.subtitle && <p className=\"text-xs opacity-80\">{preview.subtitle}</p>}\n </div>\n <div className=\"grid grid-cols-6 gap-1.5\">\n {tokens.map((t) => (\n <div\n key={t.key}\n title={t.label}\n className=\"aspect-square rounded-md border border-border\"\n style={{ background: `var(--color-${t.key})` }}\n />\n ))}\n </div>\n <div className=\"rounded-[var(--radius)] border border-border bg-[color:var(--color-ai-accent-soft,var(--color-accent))] p-3\">\n <p className=\"text-sm font-medium text-[color:var(--color-ai-accent,var(--color-primary))]\">\n AI action surface\n </p>\n <p className=\"text-xs text-muted-foreground\">Themed by the AI-kit accent tokens.</p>\n </div>\n </CardContent>\n </Card>\n )\n\n const SaveBar = onSave && (\n <div className=\"mt-6 flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => void save()}\n disabled={saving}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:opacity-90 disabled:opacity-60\"\n data-testid={tid('save')}\n >\n {savedVia ? <Check className=\"size-4\" /> : <Save className=\"size-4\" />}\n {saving ? 'Saving…' : savedVia ? 'Saved' : 'Save theme'}\n </button>\n {savedVia && (\n <span className=\"text-xs text-muted-foreground\" data-testid={tid('via')}>\n stored via {savedVia}\n </span>\n )}\n </div>\n )\n\n // ── Drawer layout — compact, single column ──────────────────────────────────\n if (variant === 'drawer') {\n return (\n <div className=\"flex h-full flex-col overflow-y-auto bg-card p-5\" data-testid={testIdPrefix}>\n <div className=\"mb-4 flex items-center justify-between\">\n <h2 className=\"font-display text-lg font-semibold text-foreground\">Theme</h2>\n </div>\n {Presets}\n <p className=\"mt-5 mb-2 text-[10px] font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n Colours\n </p>\n <div className=\"space-y-3\">{tokens.map((t) => colorRow(t.key, t.label))}</div>\n <p className=\"mt-6 mb-2 text-[10px] font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n Typography & shape\n </p>\n {Typography}\n {SaveBar}\n </div>\n )\n }\n\n // ── Panel layout — grouped cards + live preview ─────────────────────────────\n return (\n <div className=\"grid gap-6 lg:grid-cols-[1fr_320px]\" data-testid={testIdPrefix}>\n <div className=\"space-y-6\">\n <Card variant=\"elevated\" className=\"rounded-xl\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Palette className=\"size-4 text-[color:var(--color-primary)]\" /> Presets\n </CardTitle>\n </CardHeader>\n <CardContent>{Presets}</CardContent>\n </Card>\n\n {groups.map((group) => (\n <Card\n key={group}\n variant=\"elevated\"\n className=\"rounded-xl\"\n data-testid={tid(`group-${group}`)}\n >\n <CardHeader>\n <CardTitle className=\"text-base\">{groupLabels[group] ?? group}</CardTitle>\n </CardHeader>\n <CardContent className=\"grid gap-3 sm:grid-cols-2\">\n {tokens.filter((t) => t.group === group).map((t) => colorRow(t.key, t.label))}\n </CardContent>\n </Card>\n ))}\n\n <Card variant=\"elevated\" className=\"rounded-xl\">\n <CardHeader>\n <CardTitle className=\"text-base\">Typography & shape</CardTitle>\n </CardHeader>\n <CardContent>{Typography}</CardContent>\n </Card>\n {SaveBar}\n </div>\n\n <div className=\"lg:sticky lg:top-4 lg:self-start\">{Preview}</div>\n </div>\n )\n}\n","/**\n * The demo/live connection layer for a firm app. Holds auth + workspace\n * selection state and exposes it via {@link useConnection}, so every surface\n * works identically whether it's talking to a live ARBI backend or the seeded\n * demo firm. Firm-specific values (backend URL, demo identity, default\n * workspace/assistant ids) arrive once through {@link FirmArbiConfig}.\n */\nimport { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from 'react'\nimport { useArbi } from '@arbidocs/react'\nimport type { ArbiMode, ArbiUser, ConnectionStatus, FirmArbiConfig } from './types'\n\ninterface ConnectionValue {\n mode: ArbiMode\n status: ConnectionStatus\n user: ArbiUser | null\n workspaceId: string | null\n apiConfigured: boolean\n apiUrl: string\n error: string | null\n /** Default assistant config ext_id (for the AI hooks). */\n assistantConfig?: string\n /** Fallback workspace ext_id when none is actively selected. */\n fallbackWorkspaceId?: string\n /** Authenticate. Live login when a backend is configured, otherwise the demo firm. */\n login: (email: string, password: string) => Promise<void>\n /** One-click demo entry (no backend required). */\n enterDemo: () => void\n logout: () => void\n setWorkspace: (id: string) => void\n}\n\nconst ConnectionContext = createContext<ConnectionValue | null>(null)\n\nexport function ConnectionProvider({\n config,\n children,\n}: {\n config: FirmArbiConfig\n children: ReactNode\n}) {\n const arbi = useArbi()\n const isLiveConfigured = config.apiUrl.length > 0\n const demoWorkspaceId = config.demoWorkspaceId ?? 'demo-firm'\n\n const [status, setStatus] = useState<ConnectionStatus>('disconnected')\n const [user, setUser] = useState<ArbiUser | null>(null)\n const [workspaceId, setWorkspaceId] = useState<string | null>(null)\n const [mode, setMode] = useState<ArbiMode>('demo')\n const [error, setError] = useState<string | null>(null)\n\n const enterDemo = useCallback(() => {\n setMode('demo')\n setStatus('demo')\n setError(null)\n setUser({ name: config.demoUser.name, email: config.demoUser.email })\n setWorkspaceId(demoWorkspaceId)\n }, [config.demoUser.name, config.demoUser.email, demoWorkspaceId])\n\n const login = useCallback(\n async (email: string, password: string) => {\n setError(null)\n // No backend configured → run the seeded demo firm.\n if (!isLiveConfigured) {\n enterDemo()\n return\n }\n setStatus('connecting')\n setMode('live')\n try {\n await arbi.login(email, password)\n const workspaces = await arbi.workspaces.list()\n if (workspaces?.length) {\n // Prefer the configured matter workspace (there may be several — e.g.\n // a marketing/KM workspace) rather than whichever happens to be first.\n // Ternary (not `&&`) so an empty config value can't leak `\"\"` into `target`.\n const preferred = config.workspaceId\n const target =\n (preferred ? workspaces.find((w) => w.external_id === preferred) : undefined) ??\n workspaces[0]\n await arbi.selectWorkspace(target.external_id)\n setWorkspaceId(target.external_id)\n }\n // Resolve the real profile (name + avatar) by finding ourselves in the\n // workspace roster — the login response doesn't surface the picture, but\n // the member list does. Best-effort: fall back to the email local-part.\n let resolved: ArbiUser = { name: email.split('@')[0], email }\n try {\n const me = arbi.user.identity()\n const members = await arbi.workspaces.listUsers()\n const self = members.find((m) => m.user.external_id === me?.externalId)?.user\n if (self) {\n const fullName = [self.given_name, self.family_name].filter(Boolean).join(' ').trim()\n resolved = {\n name: fullName || email.split('@')[0],\n email: self.email || email,\n externalId: self.external_id,\n picture: self.picture ?? null,\n }\n } else if (me?.externalId) {\n resolved.externalId = me.externalId\n }\n } catch {\n // Roster not available (e.g. no workspace) — keep the fallback identity.\n }\n setUser(resolved)\n setStatus('authenticated')\n } catch (e) {\n // Surface the real error — no silent fallback to a fake session.\n setError(e instanceof Error ? e.message : 'Sign-in failed. Check your credentials.')\n setStatus('error')\n }\n },\n [arbi, enterDemo, isLiveConfigured, config.workspaceId]\n )\n\n const logout = useCallback(() => {\n if (mode === 'live') {\n void arbi.logout?.()\n }\n setUser(null)\n setWorkspaceId(null)\n setStatus('disconnected')\n setError(null)\n }, [arbi, mode])\n\n const setWorkspace = useCallback((id: string) => setWorkspaceId(id), [])\n\n const value = useMemo<ConnectionValue>(\n () => ({\n mode,\n status,\n user,\n workspaceId,\n apiConfigured: isLiveConfigured,\n apiUrl: config.apiUrl,\n error,\n assistantConfig: config.assistantConfig,\n fallbackWorkspaceId: config.workspaceId,\n login,\n enterDemo,\n logout,\n setWorkspace,\n }),\n [\n mode,\n status,\n user,\n workspaceId,\n isLiveConfigured,\n config.apiUrl,\n config.assistantConfig,\n config.workspaceId,\n error,\n login,\n enterDemo,\n logout,\n setWorkspace,\n ]\n )\n\n return <ConnectionContext.Provider value={value}>{children}</ConnectionContext.Provider>\n}\n\nexport function useConnection(): ConnectionValue {\n const ctx = useContext(ConnectionContext)\n if (!ctx) throw new Error('useConnection must be used within ConnectionProvider')\n return ctx\n}\n\nexport const isAuthenticated = (s: ConnectionStatus) => s === 'demo' || s === 'authenticated'\n","/**\n * Composition root for a firm app on the ARBI React SDK.\n *\n * QueryClientProvider → react-query cache shared with the SDK\n * ArbiProvider → the SDK's Arbi instance (no network until login)\n * ConnectionProvider → demo/live auth + workspace layer\n *\n * With no live `apiUrl`, ArbiProvider is still mounted (cheap, inert) against\n * `demoApiUrl` and the app runs entirely in seeded demo mode.\n */\nimport { useState, type ReactNode } from 'react'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { ArbiProvider, ArbiWebSocketProvider } from '@arbidocs/react'\nimport { ConnectionProvider, useConnection } from './ConnectionProvider'\nimport type { FirmArbiConfig } from './types'\n\n/**\n * Opens the shared SDK WebSocket once the app is live-authenticated (demo /\n * logged-out sessions have no backend, so they stay disconnected). Lives inside\n * ConnectionProvider so it can read the live status.\n */\nfunction ConnectionBoundWebSocket({ children }: { children: ReactNode }) {\n const { status } = useConnection()\n return (\n <ArbiWebSocketProvider enabled={status === 'authenticated'}>{children}</ArbiWebSocketProvider>\n )\n}\n\nexport function LegalArbiProvider({\n config,\n children,\n}: {\n config: FirmArbiConfig\n children: ReactNode\n}) {\n const [queryClient] = useState(\n () =>\n new QueryClient({\n defaultOptions: { queries: { staleTime: 30_000, retry: 1, refetchOnWindowFocus: false } },\n })\n )\n\n const providerUrl = config.apiUrl || config.demoApiUrl || 'https://demo.arbi.local'\n\n return (\n <QueryClientProvider client={queryClient}>\n <ArbiProvider url={providerUrl}>\n <ConnectionProvider config={config}>\n <ConnectionBoundWebSocket>{children}</ConnectionBoundWebSocket>\n </ConnectionProvider>\n </ArbiProvider>\n </QueryClientProvider>\n )\n}\n","/**\n * The firm agent hooks — thin adapters over the reusable AI kit in\n * `@arbidocs/react`. The streaming/accumulation/search plumbing lives once in\n * the SDK; these hooks only bind the *workspace source* (from the connection\n * context, falling back to the configured workspace) and inject the firm's\n * default assistant *configuration* so call sites needn't know the config\n * ext_id. An explicit `opts.model` still wins.\n */\nimport { useCallback } from 'react'\nimport {\n useAiTask as useKitAiTask,\n useWorkspaceDocs as useKitWorkspaceDocs,\n useSemanticSearch as useKitSemanticSearch,\n type AiRunOptions,\n} from '@arbidocs/react'\nimport { useConnection } from './ConnectionProvider'\n\nexport type { AiTaskStatus, AiRunOptions, SearchChunk, ArtifactEvent } from '@arbidocs/react'\n\n/** Client-side redlining, re-exported so a firm app has one import surface. */\nexport { toRedlineMarkdown, redlineStats, textToArtifact } from '@arbidocs/react'\n\n/**\n * The kit's `useAiTask` with the firm's default assistant configuration\n * injected, so call sites needn't know the config ext_id.\n */\nexport function useFirmAiTask() {\n const { assistantConfig } = useConnection()\n const task = useKitAiTask()\n const kitRun = task.run\n const run = useCallback(\n (question: string, docIds: string[], opts?: AiRunOptions) =>\n kitRun(question, docIds, { ...opts, model: opts?.model ?? assistantConfig }),\n [kitRun, assistantConfig]\n )\n return { ...task, run }\n}\n\n/** Resolve the active workspace + its document ids (what we ground the agent on). */\nexport function useWorkspaceDocs() {\n const { workspaceId, fallbackWorkspaceId } = useConnection()\n return useKitWorkspaceDocs(workspaceId ?? fallbackWorkspaceId)\n}\n\n/** Search the active workspace's documents and return the top matching passages. */\nexport function useSemanticSearch() {\n const { docIds } = useWorkspaceDocs()\n return useKitSemanticSearch(docIds)\n}\n","/**\n * Compose a stable, kebab-case data-testid from parts.\n * Convention: {area}-{element}[-{qualifier}...]\n * tid(\"matters\", \"row\", \"CLM-2026-0042\") -> \"matters-row-clm-2026-0042\"\n * Keeps Playwright selectors predictable across a firm app.\n */\nexport function tid(...parts: Array<string | number | undefined | false>): string {\n return parts\n .filter((p): p is string | number => p !== undefined && p !== false && p !== '')\n .map((p) =>\n String(p)\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n )\n .join('-')\n}\n","/**\n * Firm-app formatting helpers — currency, initials, dates, durations and\n * percentages. UK-oriented defaults (en-GB / GBP / \"d MMM yyyy\") suit an English\n * law firm; nothing here is firm-branded, so every firm app shares them.\n *\n * Dependency-free on purpose (uses the platform `Intl` APIs) so the package\n * stays light and needs no date library.\n */\n\n/** Format a number as GBP, e.g. £1,240,000 or £12.4k depending on `compact`. */\nexport function gbp(value: number, compact = false): string {\n return new Intl.NumberFormat('en-GB', {\n style: 'currency',\n currency: 'GBP',\n maximumFractionDigits: compact && Math.abs(value) >= 1000 ? 1 : 0,\n notation: compact ? 'compact' : 'standard',\n }).format(value)\n}\n\n/** Initials from a person's name, e.g. \"Amara N. Okafor\" -> \"AO\". */\nexport function initials(name: string): string {\n const parts = name.trim().split(/\\s+/)\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase()\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase()\n}\n\n/**\n * Parse an ISO string. Date-only strings (\"2026-03-12\") are read as LOCAL\n * midnight (matching date-fns `parseISO`), not UTC, so day-level maths and\n * formatting don't drift across time zones.\n */\nfunction parseIso(iso: string): Date {\n const dateOnly = /^\\d{4}-\\d{2}-\\d{2}$/.test(iso)\n const d = new Date(dateOnly ? `${iso}T00:00:00` : iso)\n if (Number.isNaN(d.getTime())) throw new Error(`Invalid ISO date: ${iso}`)\n return d\n}\n\n/** \"12 Mar 2026\" */\nexport function fmtDate(iso: string): string {\n try {\n return new Intl.DateTimeFormat('en-GB', {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n }).format(parseIso(iso))\n } catch {\n return iso\n }\n}\n\n/** \"12 Mar 2026, 14:30\" */\nexport function fmtDateTime(iso: string): string {\n try {\n return new Intl.DateTimeFormat('en-GB', {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n }).format(parseIso(iso))\n } catch {\n return iso\n }\n}\n\nconst RELATIVE_UNITS: Array<[Intl.RelativeTimeFormatUnit, number]> = [\n ['year', 31_536_000],\n ['month', 2_592_000],\n ['week', 604_800],\n ['day', 86_400],\n ['hour', 3_600],\n ['minute', 60],\n ['second', 1],\n]\n\n/** \"3 days ago\" / \"in 2 hours\" — largest whole unit, like date-fns strict. */\nexport function fromNow(iso: string, from: Date = new Date()): string {\n try {\n const diffSeconds = (parseIso(iso).getTime() - from.getTime()) / 1000\n const abs = Math.abs(diffSeconds)\n const rtf = new Intl.RelativeTimeFormat('en-GB', { numeric: 'always' })\n for (const [unit, secs] of RELATIVE_UNITS) {\n if (abs >= secs || unit === 'second') {\n const value = Math.round(diffSeconds / secs)\n return rtf.format(value, unit)\n }\n }\n return rtf.format(0, 'second')\n } catch {\n return iso\n }\n}\n\n/** Signed day count to a date from a reference day. Negative = overdue. */\nexport function daysUntil(iso: string, from: Date = new Date()): number {\n try {\n const target = parseIso(iso)\n // Compare calendar days at local midnight, ignoring time-of-day.\n const a = Date.UTC(target.getFullYear(), target.getMonth(), target.getDate())\n const b = Date.UTC(from.getFullYear(), from.getMonth(), from.getDate())\n return Math.round((a - b) / 86_400_000)\n } catch {\n return 0\n }\n}\n\n/** Compact hours, e.g. 12.5h */\nexport function hrs(n: number): string {\n return `${n.toFixed(1)}h`\n}\n\n/** Percentage with no decimals, e.g. 82% */\nexport function pct(n: number): string {\n return `${Math.round(n)}%`\n}\n","import type { LucideIcon } from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react'\n\n/** Centered placeholder for empty lists/panels: icon + title + description + action. */\nexport function EmptyState({\n icon: Icon,\n title,\n description,\n action,\n className,\n testId,\n}: {\n icon?: LucideIcon\n title: string\n description?: string\n action?: ReactNode\n className?: string\n testId?: string\n}) {\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center rounded-xl border border-dashed border-border bg-muted/30 px-6 py-12 text-center',\n className\n )}\n data-testid={testId}\n >\n {Icon && (\n <div className=\"mb-3 flex size-11 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n <Icon className=\"size-5\" />\n </div>\n )}\n <p className=\"font-display text-base font-semibold text-foreground\">{title}</p>\n {description && <p className=\"mt-1 max-w-sm text-sm text-muted-foreground\">{description}</p>}\n {action && <div className=\"mt-4\">{action}</div>}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@arbidocs/react'\nimport { tid } from '../lib/testid'\nimport { EmptyState } from './EmptyState'\n\nexport interface Column<T> {\n key: string\n header: ReactNode\n render: (row: T) => ReactNode\n align?: 'left' | 'right' | 'center'\n className?: string\n headClassName?: string\n}\n\ninterface DataTableProps<T> {\n columns: Column<T>[]\n rows: T[]\n getRowId: (row: T) => string\n onRowClick?: (row: T) => void\n /** testid area prefix, e.g. \"matters\" -> rows get \"matters-row-{id}\" */\n area: string\n emptyTitle?: string\n emptyDescription?: string\n className?: string\n}\n\nconst alignClass = { left: 'text-left', right: 'text-right', center: 'text-center' } as const\n\n/** The one true table. Column-config driven, fully test-id'd, optional row navigation. */\nexport function DataTable<T>({\n columns,\n rows,\n getRowId,\n onRowClick,\n area,\n emptyTitle = 'Nothing to show',\n emptyDescription,\n className,\n}: DataTableProps<T>) {\n if (rows.length === 0) {\n return (\n <EmptyState title={emptyTitle} description={emptyDescription} testId={tid(area, 'empty')} />\n )\n }\n return (\n <div className={cn('rounded-xl border border-border bg-card', className)}>\n <Table data-testid={tid(area, 'table')}>\n <TableHeader>\n <TableRow className=\"hover:bg-transparent\">\n {columns.map((c) => (\n <TableHead\n key={c.key}\n className={cn(c.align && alignClass[c.align], c.headClassName)}\n >\n {c.header}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((row) => {\n const id = getRowId(row)\n return (\n <TableRow\n key={id}\n data-testid={tid(area, 'row', id)}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={cn(onRowClick && 'cursor-pointer')}\n >\n {columns.map((c) => (\n <TableCell\n key={c.key}\n className={cn(c.align && alignClass[c.align], c.className)}\n >\n {c.render(row)}\n </TableCell>\n ))}\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n </div>\n )\n}\n","/**\n * A **serializable** data table for the Puck builder.\n *\n * The library's developer-facing {@link DataTable} is driven by `Column<T>` whose\n * `header`/`render` are React nodes and functions — powerful, but non-serializable,\n * so it can never be a Puck block. `DataTableBlock` closes that gap with a flat,\n * JSON-safe schema (string headers, string field keys, string cells) and rebuilds\n * the non-serializable `Column<Row>[]` internally, rendering through the very same\n * {@link DataTable} so it inherits the library's markup and tokens verbatim.\n */\nimport { DataTable, type Column } from './DataTable'\n\nexport interface DataTableBlockColumn {\n /** Column heading text. */\n header: string\n /** Key used to look a cell up in each row record. */\n field: string\n /** Cell/heading alignment. */\n align?: 'left' | 'right' | 'center'\n}\n\nexport interface DataTableBlockProps {\n /** Serializable column schema. */\n columns: DataTableBlockColumn[]\n /** One record per row; cells are looked up by each column's `field`. */\n rows: Array<Record<string, string>>\n /** Optional caption rendered above the table. */\n caption?: string\n /** Empty-state title shown when there are no rows. */\n emptyText?: string\n /** testid area prefix; also set on the wrapper element. */\n testId?: string\n}\n\n/** A row wrapper so {@link DataTable} gets a stable id without polluting the record. */\ninterface TableRowData {\n __id: string\n cells: Record<string, string>\n}\n\n/**\n * Renders a {@link DataTable} from a flat, serializable schema. Columns are mapped\n * to `Column<TableRowData>[]` (header string, positional-stable key, alignment) and\n * each cell is resolved by `field`; rows carry a synthetic id for React keys/testids.\n */\nexport function DataTableBlock({ columns, rows, caption, emptyText, testId }: DataTableBlockProps) {\n const area = testId ?? 'data-table-block'\n\n const tableColumns: Column<TableRowData>[] = columns.map((col, index) => ({\n key: col.field || `col-${index}`,\n header: col.header,\n align: col.align,\n render: (row) => row.cells[col.field] ?? '',\n }))\n\n const tableRows: TableRowData[] = rows.map((cells, index) => ({ __id: String(index), cells }))\n\n return (\n <div data-testid={testId}>\n {caption ? (\n <p\n className=\"mb-2 text-sm text-muted-foreground\"\n data-testid={testId ? `${testId}-caption` : undefined}\n >\n {caption}\n </p>\n ) : null}\n <DataTable\n columns={tableColumns}\n rows={tableRows}\n getRowId={(row) => row.__id}\n area={area}\n emptyTitle={emptyText}\n />\n </div>\n )\n}\n","/**\n * GridView — a flexible AG Grid presentational core.\n *\n * Pure and app-agnostic: it owns no global state and pulls in no store. Column\n * state persistence (order / width / visibility / sort / filter) is exposed as a\n * controlled/uncontrolled prop pair — `gridState` (initial state, read once at\n * mount) and `onGridStateChange` (called whenever AG Grid's state changes). An\n * app wires those to wherever it keeps the state (Zustand, localStorage, a URL,\n * a server) via a thin adapter; the core stays decoupled.\n *\n * Themed entirely via CSS variables (see the sibling `grid.css`, which a\n * consuming app imports globally), so it inherits the host's light/dark theme.\n */\n\nimport React, { useRef, useCallback, useMemo, useEffect } from 'react'\nimport { AgGridReact } from 'ag-grid-react'\nimport {\n ColDef,\n GridOptions,\n GridApi,\n GridState,\n themeQuartz,\n CellValueChangedEvent,\n GridReadyEvent,\n RowClickedEvent,\n} from 'ag-grid-community'\nimport { AllCommunityModule } from 'ag-grid-community'\n\n// Create the custom ARBI theme using themeQuartz\n// Colors are defined via CSS variables in the sibling grid.css\n// This enables dark mode support and consistent theming\nconst arbiTheme = themeQuartz.withParams({\n // Font settings\n fontFamily: {\n googleFont: 'Nunito',\n },\n fontSize: 14,\n headerFontSize: 13,\n headerFontWeight: 600,\n\n // Sizing\n headerHeight: 44,\n rowHeight: 40,\n cellHorizontalPadding: 16,\n\n // Borders - structural settings only.\n // Row border is a real hairline in the theme border colour (not hardcoded\n // white, which was invisible on the light-mode background and wrong in dark\n // mode) so adjacent rows are clearly separated — important now that rows can\n // be tall and multi-line (e.g. the Abstract column).\n rowBorder: { style: 'solid', width: 1, color: 'hsl(var(--border))' },\n columnBorder: false, // No column borders - using CSS dividers instead\n wrapperBorder: false,\n\n // No rounded corners for clean look (except checkboxes)\n borderRadius: 0,\n wrapperBorderRadius: 0,\n checkboxBorderRadius: 2, // Keep checkboxes square\n})\n\n// Selection configuration\nexport interface GridViewSelection<T> {\n mode: 'single' | 'multiple'\n selected: T[]\n onSelectionChange: (items: T[]) => void\n}\n\n// Empty state configuration\nexport interface GridViewEmptyState {\n icon?: React.ReactNode\n title?: string\n message?: string\n action?: React.ReactNode\n}\n\n// Generic props to make this grid reusable with different data types\nexport interface GridViewProps<T> {\n // Core data\n items: T[]\n // Column configuration\n columnDefs: ColDef<T>[]\n // Row identity function\n getItemId: (item: T) => string\n // Selection handling\n selection?: GridViewSelection<T>\n // Empty state\n emptyState?: GridViewEmptyState\n // Loading state\n isLoading?: boolean\n loadingMessage?: string\n // Grid options\n gridOptions?: Partial<GridOptions<T>>\n // Grid initialization\n onGridReady?: (params: { api: GridApi<T> }) => void\n // Cell value changes\n onCellValueChanged?: (event: CellValueChangedEvent<T>) => void\n // Row click handler\n onRowClick?: (item: T) => void\n // State persistence.\n // The core is decoupled from any store: when `persistState` is on it seeds\n // AG Grid from `gridState` (read once at mount) and reports every subsequent\n // state change through `onGridStateChange`. An app-adapter wires these to its\n // own store. `gridId` is retained as an opaque identity hint for adapters\n // (the core itself does not read it).\n persistState?: boolean\n gridId?: string\n // Persisted column/sort/filter state to restore at mount (controlled input).\n gridState?: GridState\n // Called whenever AG Grid's state changes so an adapter can persist it.\n onGridStateChange?: (state: GridState) => void\n // Initial visible columns (applied when no saved state exists)\n initialVisibleColumns?: string[]\n // Basic styling\n className?: string\n height?: string | number\n // Per-instance row height. Applied via the theme (not just gridOptions) so the\n // theme's calculated line-height tracks it and cell content stays vertically\n // centered. Fixed height — keeps row virtualization on the fast path.\n rowHeight?: number\n testId?: string\n // Pinned rows\n pinnedBottomRowData?: T[]\n pinnedTopRowData?: T[]\n // Pagination (disabled by default)\n pagination?: boolean\n paginationPageSizeSelector?: number[]\n // Force empty-state UI even when items.length > 0.\n // Used when rows are present but all hidden by an external filter.\n showEmpty?: boolean\n}\n\nexport function GridView<T>({\n items,\n columnDefs,\n getItemId,\n selection,\n emptyState,\n isLoading = false,\n loadingMessage = 'Loading...',\n gridOptions,\n onGridReady,\n onCellValueChanged,\n onRowClick,\n persistState = false,\n gridState,\n onGridStateChange,\n initialVisibleColumns,\n className = 'w-full',\n height = 500,\n rowHeight,\n testId = 'grid-view',\n pinnedBottomRowData,\n pinnedTopRowData,\n pagination = false,\n paginationPageSizeSelector,\n showEmpty,\n}: GridViewProps<T>) {\n // Reference to the grid API\n const gridApiRef = useRef<GridApi<T> | null>(null)\n\n // Initial row height, captured once so it can live in the (stable) default\n // grid options. rowHeight is NOT passed as a reactive prop — that would make\n // the AgGridReact wrapper re-process grid options on every change and snap\n // manually-resized columns back to their colDef widths. Subsequent changes are\n // applied imperatively (see effect below).\n const initialRowHeightRef = useRef(rowHeight)\n\n // Persisted state to seed the grid with — captured once at mount so a reactive\n // `gridState` prop (e.g. an adapter re-reading its store each render) can never\n // re-initialise the grid mid-session. Mirrors AG Grid's own initialState,\n // which is read once.\n const initialGridStateRef = useRef(gridState)\n\n // Get initial state for the grid (read once at mount)\n const initialState = useMemo(() => {\n if (!persistState) return undefined\n return initialGridStateRef.current\n }, [persistState])\n\n // Save grid state via the adapter using modern AG Grid state API\n const saveGridState = useCallback(() => {\n if (!persistState || !onGridStateChange || !gridApiRef.current) return\n\n // Use AG Grid's comprehensive state API to capture complete state\n // This includes: filters, sort, column order, column visibility, column widths, etc.\n const state = gridApiRef.current.getState()\n\n onGridStateChange(state)\n }, [persistState, onGridStateChange])\n\n // Ensure selection column is visible after grid initialization\n const ensureSelectionColumnVisible = useCallback(() => {\n if (!gridApiRef.current || !selection?.mode) return\n\n // IMPORTANT: Force selection column to be visible after state restoration\n // This ensures even old saved states don't hide the selection column\n // Also handles case where selection column is completely missing from state\n const currentState = gridApiRef.current.getColumnState()\n const selectionColumn = currentState.find((col) => col.colId === 'ag-Grid-SelectionColumn')\n const selectionColumnIndex = currentState.findIndex(\n (col) => col.colId === 'ag-Grid-SelectionColumn'\n )\n\n // Fix if column is hidden OR missing entirely OR not in first position\n if (!selectionColumn || selectionColumn.hide || selectionColumnIndex !== 0) {\n // Use setColumnsVisible for more reliable visibility control\n gridApiRef.current.setColumnsVisible(['ag-Grid-SelectionColumn'], true)\n\n // Also apply state to ensure proper width\n gridApiRef.current.applyColumnState({\n state: [\n {\n colId: 'ag-Grid-SelectionColumn',\n hide: false,\n width: selectionColumn?.width || 48,\n pinned: null, // Ensure not pinned in wrong position\n },\n ],\n defaultState: { hide: undefined },\n applyOrder: false,\n })\n\n // Move selection column to first position if it's not there\n if (selectionColumnIndex !== 0) {\n gridApiRef.current.moveColumns(['ag-Grid-SelectionColumn'], 0)\n }\n }\n }, [selection?.mode])\n\n // Handle row ID\n const getRowId = useCallback(\n (params: { data: T }) => {\n return getItemId(params.data)\n },\n [getItemId]\n )\n\n // Refs for selection — avoids handleGridReady/handleSelectionChanged recreating\n // when selection object changes (which happens on every selectionConfig recompute)\n const selectionRef = useRef(selection)\n selectionRef.current = selection\n\n const onSelectionChangeRef = useRef(selection?.onSelectionChange)\n onSelectionChangeRef.current = selection?.onSelectionChange\n\n const handleSelectionChanged = useCallback(() => {\n if (!onSelectionChangeRef.current || !gridApiRef.current) return\n\n const selectedNodes = gridApiRef.current.getSelectedNodes()\n const selectedData = selectedNodes\n .map((node) => node.data)\n .filter((item): item is T => item !== undefined)\n\n onSelectionChangeRef.current(selectedData)\n }, [])\n\n // Handle row clicks\n const handleRowClicked = useCallback(\n (event: RowClickedEvent<T>) => {\n if (!onRowClick || !event.data) return\n // Don't fire when the click originated from an interactive element inside the cell\n // (e.g. action buttons). AG Grid fires rowClicked regardless of DOM stopPropagation.\n const target = event.event?.target as HTMLElement | null\n if (target?.closest('button, input, a, select, textarea, [role=\"button\"]')) return\n onRowClick(event.data)\n },\n [onRowClick]\n )\n\n // Handle grid ready\n const handleGridReady = useCallback(\n (event: GridReadyEvent<T>) => {\n gridApiRef.current = event.api\n\n // Apply initial visible columns when no saved state exists\n // This prevents showing all columns by default for new users\n if (!initialState && initialVisibleColumns?.length) {\n const currentState = event.api.getColumnState()\n const stateMap = new Map(currentState.map((col) => [col.colId, col]))\n const visibleSet = new Set(initialVisibleColumns)\n\n // Build ordered state: selection column first (always visible), then visible columns, then hidden\n const selectionCol = stateMap.get('ag-Grid-SelectionColumn')\n const orderedState = [\n // Selection column first - ALWAYS visible, create if not in state\n selectionCol\n ? { ...selectionCol, hide: false }\n : { colId: 'ag-Grid-SelectionColumn', hide: false, width: 48 },\n // Visible columns in specified order\n ...initialVisibleColumns\n .filter((colId) => colId !== 'ag-Grid-SelectionColumn') // Don't duplicate selection column\n .map((colId) => {\n const col = stateMap.get(colId)\n return col ? { ...col, hide: false } : undefined\n }),\n // Hidden columns (everything else)\n ...currentState\n .filter((col) => col.colId !== 'ag-Grid-SelectionColumn' && !visibleSet.has(col.colId))\n .map((col) => ({ ...col, hide: true })),\n ].filter((col): col is NonNullable<typeof col> => col !== undefined)\n\n event.api.applyColumnState({ state: orderedState, applyOrder: true })\n }\n\n // When restoring persisted state, detect columns from columnDefs that\n // aren't in the saved state (e.g. newly added columns) and append them.\n // AG Grid's maintainColumnOrder adds them but may place them inconsistently;\n // this ensures they appear as hidden at the end so the navigator picks them up.\n if (initialState && initialVisibleColumns?.length) {\n const currentState = event.api.getColumnState()\n const savedColIds = new Set(\n initialState.columnOrder?.orderedColIds ?? currentState.map((c) => c.colId)\n )\n const newCols = currentState.filter(\n (col) => !savedColIds.has(col.colId) && col.colId !== 'ag-Grid-SelectionColumn'\n )\n if (newCols.length > 0) {\n // Make new columns visible if they're in the default visible set\n const defaultVisible = new Set(initialVisibleColumns)\n event.api.applyColumnState({\n state: newCols.map((col) => ({\n ...col,\n hide: !defaultVisible.has(col.colId),\n })),\n })\n }\n }\n\n // Ensure selection column is visible (in case saved state hides it)\n ensureSelectionColumnVisible()\n\n // Call the provided onGridReady callback\n if (onGridReady) {\n onGridReady({ api: event.api })\n }\n\n // Restore selection state if needed (read from ref to keep callback stable)\n const sel = selectionRef.current\n if (sel && sel.selected.length > 0) {\n const selectedIds = new Set(sel.selected.map(getItemId))\n event.api.forEachNode((node) => {\n if (node.data && selectedIds.has(getItemId(node.data))) {\n node.setSelected(true)\n }\n })\n }\n },\n [onGridReady, getItemId, ensureSelectionColumnVisible, initialState, initialVisibleColumns]\n )\n\n // Handle first data rendered - no auto-sizing, let flex columns handle it\n const handleFirstDataRendered = useCallback(() => {\n // Columns with flex will auto-fill, columns with width stay fixed\n // Also ensure selection column is visible as a backup (handles timing issues with initialState)\n ensureSelectionColumnVisible()\n }, [ensureSelectionColumnVisible])\n\n // Track when AG Grid processes row updates\n const handleModelUpdated = useCallback(() => {\n // AG Grid handles model updates internally\n }, [])\n\n // Track row data changes for AG Grid updates\n const prevItemsRef = useRef<T[]>([])\n useEffect(() => {\n prevItemsRef.current = items\n }, [items])\n\n // Handle state updates - save state when it changes (modern AG Grid approach)\n const handleStateUpdated = useCallback(() => {\n saveGridState()\n }, [saveGridState])\n\n // Removed problematic useEffect that caused unnecessary re-renders\n // AG Grid handles selection internally, only sync on initial load\n\n // Default grid options with minimal settings - memoized to prevent re-renders\n const defaultOptions: GridOptions<T> = useMemo(() => {\n return {\n // Initial row height (stable — captured once). Live changes go through the\n // imperative effect, not this option, to avoid column-state churn.\n rowHeight: initialRowHeightRef.current,\n suppressMenuHide: true, // Prevent hiding columns since we don't have enterprise sidebar\n maintainColumnOrder: true, // Preserve column order when columns are added/removed\n\n // Row virtualization: Render rows as needed for performance\n // rowBuffer renders extra rows above/below viewport for smoother scrolling\n rowBuffer: 10, // Render 10 extra rows above/below viewport for smooth scrolling\n suppressColumnVirtualisation: false, // Keep column virtualization enabled\n suppressRowVirtualisation: false, // ENABLE row virtualization - only render visible rows\n animateRows: false, // Disable row animations\n suppressColumnMoveAnimation: true, // Disable column move/resize animations\n\n // Efficient updates with React Query cache\n // getRowId enables change detection - grid only re-renders changed rows\n // Works perfectly with React Query's cache updates\n getRowId: getRowId,\n\n rowSelection: selection?.mode\n ? {\n mode: selection.mode === 'single' ? 'singleRow' : 'multiRow',\n selectAll: 'filtered', // Header checkbox selects all filtered rows (across all pages)\n // In multi-row mode, only checkboxes should toggle selection (clicking row body would replace selection)\n enableClickSelection: selection.mode === 'single',\n checkboxes: true,\n headerCheckbox: selection.mode === 'multiple',\n }\n : undefined,\n selectionColumnDef: selection?.mode\n ? {\n sortable: selection.mode === 'multiple',\n width: 48,\n lockVisible: true, // Cannot be hidden\n suppressMovable: true, // Cannot be moved\n }\n : undefined,\n // Use normal layout for better performance - autoHeight causes forced reflows\n domLayout: 'normal',\n // Stop editing when clicking outside the cell/grid\n stopEditingWhenCellsLoseFocus: true,\n // Additional performance optimizations\n suppressCellFocus: true, // Don't focus cells on click (faster)\n suppressRowHoverHighlight: true, // Disable hover highlight - reduces DOM manipulation during scroll\n suppressScrollOnNewData: true, // Don't scroll when data updates\n suppressAggFuncInHeader: true, // Don't show aggregation functions (faster)\n // Tooltip UX: the AG Grid default show-delay is 2 s which hurts\n // discoverability for cells where tooltips carry the \"reveal full\n // content\" affordance for non-editable users. 300 ms is snappy\n // without being accidental. tooltipInteraction lets users hover\n // onto the tooltip itself (e.g. to select / copy long text).\n // These are AG Grid's native tooltip controls — no React / Radix\n // provider involved, zero per-row cost; tooltip DOM is created on\n // demand when hover-delay elapses and destroyed on mouseout.\n tooltipShowDelay: 300,\n tooltipHideDelay: 4000,\n tooltipInteraction: true,\n // Pagination (disabled by default)\n pagination,\n paginationPageSizeSelector,\n defaultColDef: {\n sortable: true,\n resizable: true,\n unSortIcon: true, // Show unsort icon\n sortingOrder: ['asc', 'desc', null], // 3-way sorting: asc → desc → unsorted (AG Grid default)\n wrapText: false, // Disable text wrapping for cleaner display\n autoHeight: false, // Use fixed row height from theme\n wrapHeaderText: false, // Disable header text wrapping for cleaner look\n autoHeaderHeight: false, // Fixed header height\n filterParams: {\n maxNumConditions: 1,\n buttons: ['reset'],\n },\n },\n }\n }, [selection?.mode, getRowId, pagination, paginationPageSizeSelector])\n\n // Combine default options with passed options - memoized to prevent re-renders\n const combinedOptions = useMemo(\n () => ({ ...defaultOptions, ...gridOptions }),\n [defaultOptions, gridOptions]\n )\n\n // Apply fixed height for better performance — autoHeight causes forced\n // reflows by measuring all rows, avoid it.\n //\n // Also derive the geometry the wrapping Abstract column needs so its overflow\n // clip lands on a WHOLE-line boundary (never mid-line, which reads as a\n // half-line \"bleeding\" into the neighbouring row). All computed once here per\n // row-height change and handed to CSS as variables — zero per-row cost on the\n // million-row grid:\n // --abstract-pad-y : vertical cell padding, shrunk on very short rows so at\n // least one whole line always fits.\n // --abstract-max-h : cap of exactly N whole lines + padding + border, so the\n // clip is always on a line boundary.\n const containerStyle = useMemo(() => {\n const style: React.CSSProperties = { height }\n if (rowHeight) {\n const LINE_PX = 14 * 1.35 // grid font-size × abstract line-height (18.9px)\n const BORDER = 2 // abstract cell top + bottom border (1px each, border-box)\n const PREFERRED_PAD = 16 // preferred total vertical padding (8px top + 8px bottom)\n // Don't let padding eat the room a single line needs on short rows.\n const padTotal = Math.max(0, Math.min(PREFERRED_PAD, rowHeight - BORDER - LINE_PX))\n const lines = Math.max(1, Math.floor((rowHeight - BORDER - padTotal) / LINE_PX))\n const vars = style as Record<string, string | number>\n vars['--abstract-pad-y'] = `${padTotal / 2}px`\n vars['--abstract-max-h'] = `${lines * LINE_PX + padTotal + BORDER}px`\n }\n return style\n }, [height, rowHeight])\n\n // Apply rowHeight changes imperatively via the grid option (not the theme —\n // recreating the theme would re-initialise the grid). This only re-lays-out\n // rows; columns, row virtualization, and the transaction bus are untouched.\n useEffect(() => {\n const api = gridApiRef.current\n if (!api || api.isDestroyed() || !rowHeight) return\n api.setGridOption('rowHeight', rowHeight)\n api.resetRowHeights()\n }, [rowHeight])\n\n // Add professional shadow for 3D effect\n // Add overflow-visible only for autoHeight layout\n const containerClassName = useMemo(() => {\n const baseClass = className || ''\n const shadowClass = 'shadow-sm' // Tailwind shadow for professional look\n // Height-adjustable grids vertically center cell content (CSS) so a\n // one-line cell or a lone pill sits in the middle of the row, and multi-line\n // text (e.g. Abstract) is balanced top-to-bottom — flagged here, applied in\n // grid.css.\n const alignClass = rowHeight ? 'ag-cells-centered' : ''\n return [baseClass, shadowClass, alignClass].filter(Boolean).join(' ')\n }, [className, rowHeight])\n\n // Show loading state — grey skeleton rows so the page transition feels instant\n if (isLoading) {\n const skeletonRowCount = 12\n return (\n <div\n data-testid={`${testId}-loading`}\n className={containerClassName}\n style={containerStyle}\n aria-busy=\"true\"\n aria-label={loadingMessage}\n >\n {/* Header skeleton */}\n <div className=\"flex h-11 items-center gap-4 border-b border-border/40 px-4\">\n <div className=\"h-3 w-6 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-32 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-24 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-20 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-28 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-16 rounded bg-muted animate-pulse ml-auto\" />\n </div>\n {/* Row skeletons */}\n {Array.from({ length: skeletonRowCount }).map((_, rowIdx) => (\n <div key={rowIdx} className=\"flex h-10 items-center gap-4 border-b border-border/20 px-4\">\n <div className=\"h-4 w-4 rounded-sm bg-muted/70 animate-pulse\" />\n <div\n className=\"h-3 rounded bg-muted/70 animate-pulse\"\n style={{ width: `${20 + ((rowIdx * 17) % 40)}%` }}\n />\n <div\n className=\"h-3 rounded bg-muted/60 animate-pulse\"\n style={{ width: `${8 + ((rowIdx * 11) % 12)}%` }}\n />\n <div\n className=\"h-3 rounded bg-muted/60 animate-pulse\"\n style={{ width: `${6 + ((rowIdx * 7) % 10)}%` }}\n />\n <div\n className=\"h-3 rounded bg-muted/50 animate-pulse ml-auto\"\n style={{ width: `${5 + ((rowIdx * 5) % 8)}%` }}\n />\n </div>\n ))}\n </div>\n )\n }\n\n // Show empty state\n // showEmpty lets callers force this UI (e.g. when an external filter hid\n // every row but the underlying items array is non-empty).\n if ((showEmpty ?? items.length === 0) && emptyState) {\n return (\n <div\n data-testid={`${testId}-empty`}\n className=\"flex flex-col justify-center items-center h-96 text-center p-6\"\n >\n {emptyState.icon && <div className=\"text-muted-foreground/60 mb-4\">{emptyState.icon}</div>}\n {emptyState.title && <h3 className=\"text-xl font-medium mb-2\">{emptyState.title}</h3>}\n {emptyState.message && (\n <p className=\"text-muted-foreground mb-6 max-w-md\">{emptyState.message}</p>\n )}\n {emptyState.action}\n </div>\n )\n }\n\n return (\n <div className={containerClassName} style={containerStyle} data-testid={testId}>\n <AgGridReact\n theme={arbiTheme}\n modules={[AllCommunityModule]}\n columnDefs={columnDefs}\n rowData={items}\n pinnedBottomRowData={pinnedBottomRowData}\n pinnedTopRowData={pinnedTopRowData}\n getRowId={getRowId}\n initialState={initialState}\n onGridReady={handleGridReady}\n onFirstDataRendered={handleFirstDataRendered}\n onModelUpdated={handleModelUpdated}\n onSelectionChanged={handleSelectionChanged}\n onCellValueChanged={onCellValueChanged}\n onRowClicked={handleRowClicked}\n onStateUpdated={handleStateUpdated}\n {...combinedOptions}\n />\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react'\n\n/** Standard back-office page title block: eyebrow + title + description + actions. */\nexport function PageHeader({\n title,\n eyebrow,\n description,\n actions,\n className,\n testId,\n}: {\n title: string\n eyebrow?: string\n description?: string\n actions?: ReactNode\n className?: string\n testId?: string\n}) {\n return (\n <div\n className={cn('flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between', className)}\n data-testid={testId}\n >\n <div className=\"min-w-0\">\n {eyebrow && (\n <p className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {eyebrow}\n </p>\n )}\n <h1 className=\"font-display text-2xl font-semibold tracking-tight text-foreground\">\n {title}\n </h1>\n {description && (\n <p className=\"mt-1 max-w-2xl text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>}\n </div>\n )\n}\n","import { cn } from '@arbidocs/react'\n\n/** Editorial heading block for marketing sections: eyebrow + title + lead. */\nexport function SectionHeading({\n eyebrow,\n title,\n lead,\n align = 'left',\n className,\n invert,\n eyebrowClassName,\n}: {\n eyebrow?: string\n title: string\n lead?: string\n align?: 'left' | 'center'\n className?: string\n invert?: boolean\n /** Override the eyebrow styling (e.g. a firm brand accent). Default: token classes. */\n eyebrowClassName?: string\n}) {\n return (\n <div className={cn('max-w-3xl', align === 'center' && 'mx-auto text-center', className)}>\n {eyebrow && (\n <p\n className={cn(\n 'mb-3 text-xs font-semibold uppercase tracking-wider',\n eyebrowClassName ?? (invert ? 'text-background/60' : 'text-muted-foreground')\n )}\n >\n {eyebrow}\n </p>\n )}\n <h2\n className={cn(\n 'font-display text-3xl font-semibold tracking-tight text-balance sm:text-4xl',\n invert ? 'text-background' : 'text-foreground'\n )}\n >\n {title}\n </h2>\n {lead && (\n <p\n className={cn(\n 'mt-4 text-lg leading-relaxed',\n invert ? 'text-background/70' : 'text-muted-foreground'\n )}\n >\n {lead}\n </p>\n )}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Search } from 'lucide-react'\nimport { Input, cn } from '@arbidocs/react'\n\n/** Search + filter bar used above every list view. */\nexport function Toolbar({\n search,\n onSearch,\n searchPlaceholder = 'Search…',\n filters,\n actions,\n className,\n testId,\n}: {\n search?: string\n onSearch?: (v: string) => void\n searchPlaceholder?: string\n filters?: ReactNode\n actions?: ReactNode\n className?: string\n testId?: string\n}) {\n return (\n <div\n className={cn(\n 'flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between',\n className\n )}\n data-testid={testId}\n >\n <div className=\"flex flex-1 flex-wrap items-center gap-2\">\n {onSearch && (\n <div className=\"relative w-full max-w-xs\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(e) => onSearch(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"bg-card text-sm placeholder:text-muted-foreground/70 focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring/50 pl-8\"\n data-testid={testId ? `${testId}-search` : 'toolbar-search'}\n />\n </div>\n )}\n {filters}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n )\n}\n","import type { LucideIcon } from 'lucide-react'\nimport { ArrowDownRight, ArrowUpRight } from 'lucide-react'\nimport { Card, cn } from '@arbidocs/react'\n\nexport interface MetricCardProps {\n label: string\n value: string | number\n icon?: LucideIcon\n hint?: string\n delta?: { value: string; direction: 'up' | 'down'; good?: boolean }\n /**\n * Icon accent as a theme colour-token key (e.g. `primary`, `success`, or a\n * firm's own brand token). Resolved to `var(--color-<accent>)` at render, so\n * it themes with whatever firm consumes it. `'default'` inherits `foreground`.\n */\n accent?: string\n testId?: string\n}\n\n/** The one true KPI tile. Used across every dashboard and module header. */\nexport function MetricCard({\n label,\n value,\n icon: Icon,\n hint,\n delta,\n accent = 'default',\n testId,\n}: MetricCardProps) {\n const accentStyle =\n accent && accent !== 'default' ? { color: `var(--color-${accent})` } : undefined\n const deltaGood = delta?.good ?? delta?.direction === 'up'\n return (\n <Card variant=\"elevated\" className=\"card-hover rounded-xl p-5\" data-testid={testId}>\n <div className=\"flex items-start justify-between gap-3\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">{label}</p>\n {Icon && <Icon className=\"size-4 shrink-0\" style={accentStyle} />}\n </div>\n <p\n className=\"mt-2 font-display text-2xl font-semibold tracking-tight\"\n data-testid={testId && `${testId}-value`}\n >\n {value}\n </p>\n <div className=\"mt-1 flex items-center gap-2\">\n {delta && (\n <span\n className={cn(\n 'inline-flex items-center gap-0.5 text-xs font-medium',\n deltaGood ? 'text-success' : 'text-destructive'\n )}\n >\n {delta.direction === 'up' ? (\n <ArrowUpRight className=\"size-3\" />\n ) : (\n <ArrowDownRight className=\"size-3\" />\n )}\n {delta.value}\n </span>\n )}\n {hint && <span className=\"text-xs text-muted-foreground\">{hint}</span>}\n </div>\n </Card>\n )\n}\n","/**\n * Asset resolution for the editor canvas.\n *\n * An image block's stored `src` is one of three things: a **workspace asset ref**\n * while authoring (an `asset:<docId>` string), a plain URL, or — once published —\n * an inlined `data:` URI (see the studio publish/materialize step). Only inside\n * the authenticated Studio can an asset ref be resolved to displayable bytes (via\n * the thumbnail endpoint). So resolution is gated on a context flag that ONLY the\n * Studio sets: outside it (the pure coverage guard, the unauthenticated public\n * renderer) `src` is rendered verbatim and the React-Query thumbnail hook is\n * never mounted.\n *\n * Refs are **explicitly prefixed** (`asset:`) rather than bare ext_ids so the\n * publish walk can distinguish an image source from any other token-like prop\n * (block ids, `\"left\"`, icon names…) with zero false positives.\n */\nimport { createContext, useContext, useEffect, type ReactNode } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { useArbi, useThumbnails } from '@arbidocs/react'\n\n/** Marks a stored image value as a workspace asset ref rather than a URL. */\nexport const ASSET_REF_PREFIX = 'asset:'\n\n/** Wrap a workspace document ext_id as a storable asset ref. */\nexport function asAssetRef(docId: string): string {\n return `${ASSET_REF_PREFIX}${docId}`\n}\n\n/** The workspace document ext_id behind an asset ref (`asset:doc-1` → `doc-1`). */\nexport function assetRefId(src: string): string {\n return src.slice(ASSET_REF_PREFIX.length)\n}\n\n/** True only where a bare asset ext_id can be resolved (the authenticated Studio). */\nexport const AssetResolverContext = createContext<boolean>(false)\n\nexport function AssetResolverProvider({ children }: { children: ReactNode }) {\n return <AssetResolverContext.Provider value={true}>{children}</AssetResolverContext.Provider>\n}\n\nexport function useAssetResolverActive(): boolean {\n return useContext(AssetResolverContext)\n}\n\n/**\n * Is `src` a workspace asset ref (`asset:<docId>`) rather than an already-\n * renderable URL / `data:` URI? Only prefixed refs need resolution.\n */\nexport function isAssetRef(src: string | undefined): src is string {\n return !!src && src.startsWith(ASSET_REF_PREFIX)\n}\n\n/**\n * Resolve an asset ext_id to a displayable image src.\n *\n * Prefer the cheap thumbnail endpoint, but fall back to downloading the actual\n * bytes as an object URL when there's no thumbnail — AI-generated (and freshly\n * uploaded) images have no thumbnail yet, so the thumbnail-only path renders a\n * broken `<img>`. The bytes always exist (it's a stored document), so the editor\n * shows the real image immediately instead of waiting on async thumbnailing.\n */\nexport function useAssetImage(docId: string): string | undefined {\n const arbi = useArbi()\n const { data: thumbs } = useThumbnails([docId])\n const thumb = thumbs?.[docId]\n\n const { data: objectUrl } = useQuery({\n queryKey: ['arbi', 'asset-image', docId],\n queryFn: async () => {\n const res = await arbi.documents.download(docId)\n const blob = await res.blob()\n return URL.createObjectURL(blob)\n },\n // Only download when the thumbnail is genuinely absent (not merely loading).\n enabled: !!docId && thumbs != null && !thumb && arbi.hasWorkspace,\n staleTime: 10 * 60_000,\n })\n\n // Release the object URL when the doc changes / unmounts.\n useEffect(() => {\n return () => {\n if (objectUrl) URL.revokeObjectURL(objectUrl)\n }\n }, [objectUrl])\n\n return thumb ?? objectUrl\n}\n\n/** Resolve a single asset ext_id and render it as an <img>. */\nexport function AssetThumb({\n docId,\n alt,\n className,\n testId,\n}: {\n docId: string\n alt?: string\n className?: string\n testId?: string\n}) {\n const src = useAssetImage(docId)\n return <img src={src ?? undefined} alt={alt ?? ''} className={className} data-testid={testId} />\n}\n","import { ImageIcon } from 'lucide-react'\nimport { cn } from '@arbidocs/react'\nimport { AssetThumb, assetRefId, isAssetRef, useAssetResolverActive } from './assetResolver'\n\nexport type BlockImageAspect = '16:9' | '4:3' | '1:1' | '21:9' | '4:5'\nexport type BlockImageRounded = 'none' | 'md' | 'lg' | 'full'\n\nexport interface BlockImageProps {\n src?: string\n alt?: string\n aspect?: BlockImageAspect\n rounded?: BlockImageRounded\n /** Editorial \"photo frame\" treatment: a matte border ring + soft shadow. */\n framed?: boolean\n className?: string\n testId?: string\n}\n\nconst ASPECT: Record<BlockImageAspect, string> = {\n '16:9': 'aspect-video',\n '4:3': 'aspect-[4/3]',\n '1:1': 'aspect-square',\n '21:9': 'aspect-[21/9]',\n '4:5': 'aspect-[4/5]',\n}\n\nconst ROUNDED: Record<BlockImageRounded, string> = {\n none: 'rounded-none',\n md: 'rounded-md',\n lg: 'rounded-xl',\n full: 'rounded-full',\n}\n\n/**\n * Image with a graceful, self-contained fallback: when `src` is empty it renders a\n * token-clean gradient placeholder (no network needed) so the palette always looks\n * good in the editor and in demos. Token-only classes so it themes per firm.\n */\nexport function BlockImage({\n src,\n alt = '',\n aspect = '16:9',\n rounded = 'lg',\n framed,\n className,\n testId,\n}: BlockImageProps) {\n const shape = cn(\n ASPECT[aspect] ?? ASPECT['16:9'],\n ROUNDED[rounded] ?? ROUNDED.lg,\n framed && 'ring-1 ring-border shadow-xl'\n )\n const canResolve = useAssetResolverActive()\n // In the Studio, an `asset:` ref resolves to its thumbnail; elsewhere `src` is\n // already a URL / data-URI and renders verbatim (the publish step inlines refs).\n if (canResolve && isAssetRef(src)) {\n return (\n <AssetThumb\n docId={assetRefId(src)}\n alt={alt}\n className={cn('w-full object-cover', shape, className)}\n testId={testId}\n />\n )\n }\n if (src && !isAssetRef(src)) {\n return (\n <img\n src={src}\n alt={alt}\n className={cn('w-full object-cover', shape, className)}\n data-testid={testId}\n />\n )\n }\n return (\n <div\n className={cn(\n 'flex w-full items-center justify-center overflow-hidden border border-border',\n 'bg-gradient-to-br from-muted via-card to-accent text-muted-foreground',\n shape,\n className\n )}\n data-testid={testId}\n aria-label={alt || 'Image placeholder'}\n role=\"img\"\n >\n <ImageIcon className=\"size-8 opacity-60\" />\n </div>\n )\n}\n","import type { CSSProperties, ReactNode } from 'react'\nimport { ArrowRight } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react'\nimport { BlockImage } from './BlockImage'\n\nexport type HeroTone = 'default' | 'muted' | 'ink'\nexport type HeroAlign = 'left' | 'center'\n\nexport interface HeroCta {\n label?: string\n href?: string\n}\n\nexport interface HeroProps {\n eyebrow?: string\n title: string\n /** A word/phrase within the title to accent (rendered in the primary colour). */\n emphasis?: string\n subtitle?: string\n primaryCta?: HeroCta\n secondaryCta?: HeroCta\n align?: HeroAlign\n tone?: HeroTone\n /** Side visual (ignored when `backgroundImage` is set). */\n imageUrl?: string\n /** Full-bleed background image URL/data-URI. Turns the hero into a cover band. */\n backgroundImage?: string\n /** Darkening scrim over the background image, for legible copy. Default true. */\n overlay?: boolean\n /** Override the eyebrow styling (e.g. a firm brand accent). Default: token classes. */\n eyebrowClassName?: string\n testId?: string\n}\n\nconst TONE_SURFACE: Record<HeroTone, string> = {\n default: 'bg-background text-foreground',\n muted: 'bg-muted text-foreground',\n ink: 'bg-foreground text-background',\n}\n\n/** Highlight each occurrence of `emphasis` inside `title` with the accent colour. */\nfunction renderTitle(title: string, emphasis?: string): ReactNode {\n if (!emphasis || !title.includes(emphasis)) return title\n const parts = title.split(emphasis)\n return parts.map((part, i) => (\n <span key={i}>\n {part}\n {i < parts.length - 1 && <span className=\"text-primary\">{emphasis}</span>}\n </span>\n ))\n}\n\n/** Editorial marketing hero: eyebrow, headline, subtitle, two CTAs and a visual. */\nexport function Hero({\n eyebrow,\n title,\n emphasis,\n subtitle,\n primaryCta,\n secondaryCta,\n align = 'left',\n tone = 'default',\n imageUrl,\n backgroundImage,\n overlay = true,\n eyebrowClassName,\n testId,\n}: HeroProps) {\n // Over a background image the surface is dark, so copy reads on-background.\n const onDark = Boolean(backgroundImage) || tone === 'ink'\n const subtle = onDark ? 'text-background/70' : 'text-muted-foreground'\n const eyebrowClass = eyebrowClassName ?? (onDark ? 'text-background/60' : 'text-muted-foreground')\n const centered = align === 'center' || Boolean(backgroundImage)\n\n const heading = renderTitle(title, emphasis)\n\n const copy = (\n <div\n className={cn(\n 'max-w-2xl',\n centered && 'mx-auto text-center',\n backgroundImage && 'text-background'\n )}\n >\n {eyebrow && (\n <p className={cn('mb-4 text-sm font-semibold uppercase tracking-wider', eyebrowClass)}>\n {eyebrow}\n </p>\n )}\n <h1 className=\"text-4xl font-semibold tracking-tight text-balance sm:text-5xl\">{heading}</h1>\n {subtitle && <p className={cn('mt-6 text-lg leading-relaxed', subtle)}>{subtitle}</p>}\n {(primaryCta?.label || secondaryCta?.label) && (\n <div\n className={cn('mt-8 flex flex-col gap-3 sm:flex-row', centered && 'sm:justify-center')}\n >\n {primaryCta?.label && (\n <Button asChild size=\"lg\">\n <a href={primaryCta.href || '#'}>\n {primaryCta.label}\n <ArrowRight className=\"size-4\" />\n </a>\n </Button>\n )}\n {secondaryCta?.label && (\n <Button asChild size=\"lg\" variant=\"outline\">\n <a href={secondaryCta.href || '#'}>{secondaryCta.label}</a>\n </Button>\n )}\n </div>\n )}\n </div>\n )\n\n // Full-bleed cover hero: background image + optional scrim + centered copy.\n if (backgroundImage) {\n const bgStyle: CSSProperties = {\n backgroundImage: `url(\"${backgroundImage}\")`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }\n return (\n <section\n className=\"relative isolate overflow-hidden\"\n style={bgStyle}\n data-testid={testId}\n data-bg={testId && `${testId}-bg`}\n >\n {overlay && <div className=\"absolute inset-0 bg-black/55\" aria-hidden />}\n <div className=\"relative mx-auto max-w-7xl px-5 py-28 lg:px-8 lg:py-36\">{copy}</div>\n </section>\n )\n }\n\n return (\n <section className={cn(TONE_SURFACE[tone] ?? TONE_SURFACE.default)} data-testid={testId}>\n <div className=\"mx-auto max-w-7xl px-5 py-20 lg:px-8 lg:py-28\">\n {centered ? (\n <div className=\"flex flex-col items-center gap-12\">\n {copy}\n {imageUrl && (\n <BlockImage\n src={imageUrl}\n aspect=\"16:9\"\n rounded=\"lg\"\n className=\"w-full max-w-4xl\"\n testId={testId && `${testId}-image`}\n />\n )}\n </div>\n ) : (\n <div className=\"grid items-center gap-12 lg:grid-cols-2\">\n {copy}\n <BlockImage\n src={imageUrl}\n aspect=\"4:5\"\n rounded=\"lg\"\n testId={testId && `${testId}-image`}\n />\n </div>\n )}\n </div>\n </section>\n )\n}\n","import type { LucideIcon } from 'lucide-react'\nimport { Card, cn } from '@arbidocs/react'\n\nexport interface FeatureItem {\n icon?: LucideIcon\n title: string\n description?: string\n}\n\nexport interface FeatureGridProps {\n columns?: '2' | '3'\n items: FeatureItem[]\n testId?: string\n}\n\nconst COLS: Record<'2' | '3', string> = {\n '2': 'sm:grid-cols-2',\n '3': 'sm:grid-cols-2 lg:grid-cols-3',\n}\n\n/** Responsive grid of icon + title + description feature cards. */\nexport function FeatureGrid({ columns = '3', items, testId }: FeatureGridProps) {\n return (\n <div className={cn('grid gap-5', COLS[columns] ?? COLS['3'])} data-testid={testId}>\n {(items ?? []).map((item, i) => {\n const Icon = item.icon\n return (\n <Card\n key={i}\n variant=\"outline\"\n className=\"h-full p-6\"\n data-testid={testId && `${testId}-item-${i}`}\n >\n {Icon && (\n <span className=\"mb-4 inline-flex size-10 items-center justify-center rounded-lg bg-primary/10 text-primary\">\n <Icon className=\"size-5\" />\n </span>\n )}\n <h3 className=\"text-lg font-semibold tracking-tight\">{item.title}</h3>\n {item.description && (\n <p className=\"mt-2 text-sm leading-relaxed text-muted-foreground\">\n {item.description}\n </p>\n )}\n </Card>\n )\n })}\n </div>\n )\n}\n","import { cn } from '@arbidocs/react'\n\nexport interface StatItem {\n value: string\n label: string\n}\n\nexport interface StatGroupProps {\n items: StatItem[]\n testId?: string\n}\n\nconst GRID: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-2 sm:grid-cols-3',\n 4: 'grid-cols-2 lg:grid-cols-4',\n}\n\n/** Big-number stat group — headline metrics with captions. */\nexport function StatGroup({ items, testId }: StatGroupProps) {\n const list = items ?? []\n const cols = GRID[Math.min(list.length, 4)] ?? GRID[4]\n return (\n <dl className={cn('grid gap-8', cols)} data-testid={testId}>\n {list.map((item, i) => (\n <div key={i} className=\"text-center\" data-testid={testId && `${testId}-item-${i}`}>\n <dt className=\"sr-only\">{item.label}</dt>\n <dd className=\"text-4xl font-semibold tracking-tight sm:text-5xl\">{item.value}</dd>\n <p className=\"mt-2 text-sm text-muted-foreground\">{item.label}</p>\n </div>\n ))}\n </dl>\n )\n}\n","import { Quote } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage, Card } from '@arbidocs/react'\nimport { initials } from '../lib/format'\n\nexport interface TestimonialProps {\n quote: string\n author?: string\n role?: string\n avatarUrl?: string\n testId?: string\n}\n\n/** A single pull-quote testimonial with an author and optional avatar. */\nexport function Testimonial({ quote, author, role, avatarUrl, testId }: TestimonialProps) {\n return (\n <Card variant=\"outline\" className=\"mx-auto max-w-3xl p-8 text-center\" data-testid={testId}>\n <Quote className=\"mx-auto size-8 text-primary/40\" aria-hidden />\n <blockquote className=\"mt-4 text-xl font-medium leading-relaxed text-balance\">\n {quote}\n </blockquote>\n {(author || avatarUrl) && (\n <div className=\"mt-6 flex items-center justify-center gap-3\">\n {(avatarUrl || author) && (\n <Avatar>\n {avatarUrl && <AvatarImage src={avatarUrl} alt={author ?? ''} />}\n <AvatarFallback>{initials(author || '?')}</AvatarFallback>\n </Avatar>\n )}\n <div className=\"text-left\">\n {author && <p className=\"text-sm font-semibold\">{author}</p>}\n {role && <p className=\"text-sm text-muted-foreground\">{role}</p>}\n </div>\n </div>\n )}\n </Card>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { ArrowRight } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react'\n\nexport type CTABannerTone = 'default' | 'muted' | 'ink'\n\nexport interface CTABannerProps {\n title: string\n subtitle?: string\n cta?: { label?: string; href?: string }\n tone?: CTABannerTone\n /** Full-bleed background image URL/data-URI. Overrides the tone surface. */\n backgroundImage?: string\n /** Darkening scrim over the background image. Default true. */\n overlay?: boolean\n testId?: string\n}\n\nconst TONE_SURFACE: Record<CTABannerTone, string> = {\n default: 'bg-primary text-primary-foreground',\n muted: 'bg-muted text-foreground',\n ink: 'bg-foreground text-background',\n}\n\n/** Full-width call-to-action banner. */\nexport function CTABanner({\n title,\n subtitle,\n cta,\n tone = 'default',\n backgroundImage,\n overlay = true,\n testId,\n}: CTABannerProps) {\n const onImage = Boolean(backgroundImage)\n const subtle = onImage\n ? 'text-white/80'\n : tone === 'default'\n ? 'text-primary-foreground/80'\n : tone === 'ink'\n ? 'text-background/70'\n : 'text-muted-foreground'\n const bgStyle: CSSProperties | undefined = backgroundImage\n ? {\n backgroundImage: `url(\"${backgroundImage}\")`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }\n : undefined\n return (\n <div\n className={cn(\n 'relative isolate overflow-hidden rounded-2xl px-8 py-14 text-center',\n onImage ? 'text-white' : (TONE_SURFACE[tone] ?? TONE_SURFACE.default)\n )}\n style={bgStyle}\n data-testid={testId}\n >\n {onImage && overlay && <div className=\"absolute inset-0 bg-black/55\" aria-hidden />}\n <div className=\"relative\">\n <h2 className=\"text-3xl font-semibold tracking-tight text-balance sm:text-4xl\">{title}</h2>\n {subtitle && <p className={cn('mx-auto mt-4 max-w-2xl text-lg', subtle)}>{subtitle}</p>}\n {cta?.label && (\n <div className=\"mt-8\">\n <Button\n asChild\n size=\"lg\"\n variant={tone === 'default' && !onImage ? 'secondary' : 'default'}\n >\n <a href={cta.href || '#'}>\n {cta.label}\n <ArrowRight className=\"size-4\" />\n </a>\n </Button>\n </div>\n )}\n </div>\n </div>\n )\n}\n","export interface LogoItem {\n label: string\n}\n\nexport interface LogoCloudProps {\n items: LogoItem[]\n testId?: string\n}\n\n/**\n * Text-based \"logo\" wall — brand names rendered as muted pill marks. Self-contained\n * (no external images) so the palette looks complete offline.\n */\nexport function LogoCloud({ items, testId }: LogoCloudProps) {\n return (\n <div className=\"flex flex-wrap items-center justify-center gap-4\" data-testid={testId}>\n {(items ?? []).map((item, i) => (\n <span\n key={i}\n className=\"rounded-md border border-border bg-muted px-5 py-2.5 text-sm font-semibold uppercase tracking-wide text-muted-foreground\"\n data-testid={testId && `${testId}-item-${i}`}\n >\n {item.label}\n </span>\n ))}\n </div>\n )\n}\n","import { ChevronDown } from 'lucide-react'\n\nexport interface FaqItem {\n question: string\n answer?: string\n}\n\nexport interface FAQProps {\n items: FaqItem[]\n testId?: string\n}\n\n/**\n * Accessible disclosure list. Built on native `<details>`/`<summary>` so it works\n * without client state (correct in the Puck preview and static renders) and stays\n * keyboard-accessible. Token-only styling.\n */\nexport function FAQ({ items, testId }: FAQProps) {\n return (\n <div className=\"mx-auto max-w-3xl divide-y divide-border\" data-testid={testId}>\n {(items ?? []).map((item, i) => (\n <details key={i} className=\"group py-4\" data-testid={testId && `${testId}-item-${i}`}>\n <summary className=\"flex cursor-pointer list-none items-center justify-between gap-4 text-left text-base font-medium\">\n {item.question}\n <ChevronDown className=\"size-4 shrink-0 text-muted-foreground transition-transform group-open:rotate-180\" />\n </summary>\n {item.answer && (\n <p className=\"mt-3 text-sm leading-relaxed text-muted-foreground\">{item.answer}</p>\n )}\n </details>\n ))}\n </div>\n )\n}\n","import { AiMarkdown } from '@arbidocs/react'\n\nexport interface RichTextBlockProps {\n content: string\n testId?: string\n}\n\n/**\n * Prose block. Reuses the shared markdown renderer (`AiMarkdown`) so long-form copy\n * gets the one house style for headings, lists, tables and emphasis — token-clean\n * and themeable per firm.\n */\nexport function RichTextBlock({ content, testId }: RichTextBlockProps) {\n return (\n <div className=\"mx-auto max-w-3xl\" data-testid={testId}>\n <AiMarkdown>{content ?? ''}</AiMarkdown>\n </div>\n )\n}\n","import type { LucideIcon } from 'lucide-react'\nimport { AlertTriangle, CheckCircle2, Info, XCircle } from 'lucide-react'\nimport { cn } from '@arbidocs/react'\n\nexport type CalloutVariant = 'info' | 'success' | 'warning' | 'danger'\n\nexport interface CalloutProps {\n variant?: CalloutVariant\n title?: string\n body?: string\n testId?: string\n}\n\nconst STYLES: Record<CalloutVariant, { wrap: string; icon: string; Icon: LucideIcon }> = {\n info: { wrap: 'border-primary/30 bg-primary/5', icon: 'text-primary', Icon: Info },\n success: { wrap: 'border-success/30 bg-success/10', icon: 'text-success', Icon: CheckCircle2 },\n warning: { wrap: 'border-warning/40 bg-warning/10', icon: 'text-warning', Icon: AlertTriangle },\n danger: {\n wrap: 'border-destructive/30 bg-destructive/10',\n icon: 'text-destructive',\n Icon: XCircle,\n },\n}\n\n/** Inline notice box in one of four semantic tones. */\nexport function Callout({ variant = 'info', title, body, testId }: CalloutProps) {\n const style = STYLES[variant] ?? STYLES.info\n const Icon = style.Icon\n return (\n <div\n className={cn('flex gap-3 rounded-lg border p-4 text-foreground', style.wrap)}\n data-testid={testId}\n role=\"note\"\n >\n <Icon className={cn('mt-0.5 size-5 shrink-0', style.icon)} aria-hidden />\n <div className=\"min-w-0\">\n {title && <p className=\"font-semibold\">{title}</p>}\n {body && <p className=\"text-sm leading-relaxed text-muted-foreground\">{body}</p>}\n </div>\n </div>\n )\n}\n","import { Avatar, AvatarFallback, AvatarImage, cn } from '@arbidocs/react'\nimport { initials } from '../lib/format'\n\nexport type AvatarBlockSize = 'sm' | 'md' | 'lg' | 'xl'\n\nexport interface AvatarBlockProps {\n src?: string\n name?: string\n size?: AvatarBlockSize\n testId?: string\n}\n\nconst SIZE: Record<AvatarBlockSize, string> = {\n sm: 'size-8 text-xs',\n md: 'size-10 text-sm',\n lg: 'size-14 text-base',\n xl: 'size-20 text-xl',\n}\n\n/** Avatar with an initials fallback when no image is supplied. */\nexport function AvatarBlock({ src, name = '', size = 'md', testId }: AvatarBlockProps) {\n return (\n <Avatar className={cn(SIZE[size] ?? SIZE.md)} data-testid={testId}>\n {src && <AvatarImage src={src} alt={name} />}\n <AvatarFallback className=\"font-semibold\">{initials(name || '?')}</AvatarFallback>\n </Avatar>\n )\n}\n","import { Button } from '@arbidocs/react'\n\nexport interface NavLink {\n label: string\n href?: string\n}\n\nexport interface NavbarProps {\n brand: string\n links: NavLink[]\n cta?: { label?: string; href?: string }\n testId?: string\n}\n\n/** Marketing top navigation: brand, inline links and an optional CTA button. */\nexport function Navbar({ brand, links, cta, testId }: NavbarProps) {\n return (\n <header className=\"border-b border-border bg-background\" data-testid={testId}>\n <nav className=\"mx-auto flex max-w-7xl items-center justify-between gap-6 px-5 py-4 lg:px-8\">\n <span className=\"text-lg font-semibold tracking-tight\">{brand}</span>\n <div className=\"hidden items-center gap-6 md:flex\">\n {(links ?? []).map((link, i) => (\n <a\n key={i}\n href={link.href || '#'}\n className=\"text-sm font-medium text-muted-foreground transition-colors hover:text-foreground\"\n data-testid={testId && `${testId}-link-${i}`}\n >\n {link.label}\n </a>\n ))}\n </div>\n {cta?.label && (\n <Button asChild size=\"sm\">\n <a href={cta.href || '#'}>{cta.label}</a>\n </Button>\n )}\n </nav>\n </header>\n )\n}\n","export interface FooterLink {\n label: string\n href?: string\n}\n\nexport interface FooterColumn {\n heading: string\n links: FooterLink[]\n}\n\nexport interface FooterProps {\n columns: FooterColumn[]\n copyright?: string\n testId?: string\n}\n\n/** Site footer: a row of link columns plus a copyright line. */\nexport function Footer({ columns, copyright, testId }: FooterProps) {\n return (\n <footer className=\"border-t border-border bg-muted text-foreground\" data-testid={testId}>\n <div className=\"mx-auto max-w-7xl px-5 py-14 lg:px-8\">\n <div className=\"grid gap-8 sm:grid-cols-2 lg:grid-cols-4\">\n {(columns ?? []).map((col, i) => (\n <div key={i} data-testid={testId && `${testId}-col-${i}`}>\n <h3 className=\"text-sm font-semibold tracking-tight\">{col.heading}</h3>\n <ul className=\"mt-4 space-y-2\">\n {(col.links ?? []).map((link, j) => (\n <li key={j}>\n <a\n href={link.href || '#'}\n className=\"text-sm text-muted-foreground transition-colors hover:text-foreground\"\n >\n {link.label}\n </a>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n {copyright && (\n <p className=\"mt-12 border-t border-border pt-6 text-sm text-muted-foreground\">\n {copyright}\n </p>\n )}\n </div>\n </footer>\n )\n}\n","import { cn } from '@arbidocs/react'\n\nexport interface ListItem {\n text: string\n}\n\nexport interface ListBlockProps {\n ordered?: boolean\n items: ListItem[]\n testId?: string\n}\n\n/** Ordered or unordered prose list. Token-clean. */\nexport function ListBlock({ ordered = false, items, testId }: ListBlockProps) {\n const list = items ?? []\n const className = cn(\n 'mx-auto max-w-3xl space-y-2 pl-5 text-foreground',\n ordered ? 'list-decimal' : 'list-disc'\n )\n const content = list.map((item, i) => (\n <li key={i} className=\"leading-relaxed marker:text-muted-foreground\">\n {item.text}\n </li>\n ))\n return ordered ? (\n <ol className={className} data-testid={testId}>\n {content}\n </ol>\n ) : (\n <ul className={className} data-testid={testId}>\n {content}\n </ul>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react'\n\nexport type ColumnsCount = 2 | 3 | 4\nexport type ColumnsGap = 'sm' | 'md' | 'lg'\n\nexport interface ColumnsProps {\n count?: ColumnsCount\n gap?: ColumnsGap\n columns: ReactNode[]\n testId?: string\n}\n\nconst GRID: Record<ColumnsCount, string> = {\n 2: 'sm:grid-cols-2',\n 3: 'sm:grid-cols-2 lg:grid-cols-3',\n 4: 'sm:grid-cols-2 lg:grid-cols-4',\n}\n\nconst GAP: Record<ColumnsGap, string> = {\n sm: 'gap-3',\n md: 'gap-6',\n lg: 'gap-10',\n}\n\n/** Responsive N-column row. Each column hosts a nested Puck slot. */\nexport function Columns({ count = 3, gap = 'md', columns, testId }: ColumnsProps) {\n return (\n <div\n className={cn('grid grid-cols-1', GRID[count] ?? GRID[3], GAP[gap] ?? GAP.md)}\n data-testid={testId}\n >\n {columns.map((col, i) => (\n <div key={i} data-testid={testId && `${testId}-col-${i}`}>\n {col}\n </div>\n ))}\n </div>\n )\n}\n","import { cn } from '@arbidocs/react'\n\nexport type SpacerSize = 'sm' | 'md' | 'lg' | 'xl'\n\nexport interface SpacerProps {\n size?: SpacerSize\n testId?: string\n}\n\nconst SIZE: Record<SpacerSize, string> = {\n sm: 'h-4',\n md: 'h-8',\n lg: 'h-16',\n xl: 'h-24',\n}\n\n/** Vertical whitespace. */\nexport function Spacer({ size = 'md', testId }: SpacerProps) {\n return <div className={cn('w-full', SIZE[size] ?? SIZE.md)} data-testid={testId} aria-hidden />\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react'\n\nexport type ContainerWidth = 'narrow' | 'default' | 'wide' | 'full'\nexport type ContainerPadding = 'none' | 'sm' | 'md' | 'lg'\n\nexport interface ContainerProps {\n width?: ContainerWidth\n padding?: ContainerPadding\n children: ReactNode\n testId?: string\n}\n\nconst WIDTH: Record<ContainerWidth, string> = {\n narrow: 'max-w-3xl',\n default: 'max-w-5xl',\n wide: 'max-w-7xl',\n full: 'max-w-none',\n}\n\nconst PADDING: Record<ContainerPadding, string> = {\n none: 'px-0 py-0',\n sm: 'px-4 py-6',\n md: 'px-5 py-12 lg:px-8',\n lg: 'px-5 py-20 lg:px-8',\n}\n\n/** Max-width wrapper that centres and pads a nested Puck slot. */\nexport function Container({ width = 'default', padding = 'md', children, testId }: ContainerProps) {\n return (\n <div\n className={cn(\n 'mx-auto w-full',\n WIDTH[width] ?? WIDTH.default,\n PADDING[padding] ?? PADDING.md\n )}\n data-testid={testId}\n >\n {children}\n </div>\n )\n}\n","import { Check } from 'lucide-react'\nimport { Button, Card, cn } from '@arbidocs/react'\n\nexport interface PricingPlan {\n name: string\n price: string\n period?: string\n description?: string\n features?: string[]\n cta?: { label?: string; href?: string }\n /** Highlight this plan as the recommended one. */\n featured?: boolean\n}\n\nexport interface PricingTableProps {\n plans: PricingPlan[]\n testId?: string\n}\n\n/** A row of pricing plan cards with feature lists and a CTA per plan. */\nexport function PricingTable({ plans, testId }: PricingTableProps) {\n return (\n <div\n className={cn('grid gap-6', (plans?.length ?? 0) >= 3 ? 'md:grid-cols-3' : 'sm:grid-cols-2')}\n data-testid={testId}\n >\n {(plans ?? []).map((plan, i) => (\n <Card\n key={i}\n variant={plan.featured ? 'elevated' : 'outline'}\n className={cn('flex h-full flex-col p-6', plan.featured && 'ring-2 ring-primary')}\n data-testid={testId && `${testId}-item-${i}`}\n >\n <h3 className=\"text-lg font-semibold tracking-tight\">{plan.name}</h3>\n <div className=\"mt-3 flex items-baseline gap-1\">\n <span className=\"text-3xl font-semibold tracking-tight\">{plan.price}</span>\n {plan.period && <span className=\"text-sm text-muted-foreground\">/{plan.period}</span>}\n </div>\n {plan.description && (\n <p className=\"mt-2 text-sm leading-relaxed text-muted-foreground\">{plan.description}</p>\n )}\n {plan.features && plan.features.length > 0 && (\n <ul className=\"mt-5 flex-1 space-y-2\">\n {plan.features.map((f, j) => (\n <li key={j} className=\"flex items-start gap-2 text-sm\">\n <Check className=\"mt-0.5 size-4 shrink-0 text-primary\" />\n <span>{f}</span>\n </li>\n ))}\n </ul>\n )}\n {plan.cta?.label && (\n <Button asChild className=\"mt-6 w-full\" variant={plan.featured ? 'default' : 'outline'}>\n <a href={plan.cta.href || '#'}>{plan.cta.label}</a>\n </Button>\n )}\n </Card>\n ))}\n </div>\n )\n}\n","import { useState } from 'react'\nimport { cn } from '@arbidocs/react'\n\nexport interface TabItem {\n label: string\n content: string\n}\n\nexport interface TabsProps {\n items: TabItem[]\n testId?: string\n}\n\n/** A simple tabbed panel: a row of tab buttons over the active tab's content. */\nexport function Tabs({ items, testId }: TabsProps) {\n const [active, setActive] = useState(0)\n const list = items ?? []\n const current = list[Math.min(active, Math.max(list.length - 1, 0))]\n return (\n <div data-testid={testId}>\n <div className=\"flex flex-wrap gap-1 border-b border-border\" role=\"tablist\">\n {list.map((t, i) => {\n const selected = i === active\n return (\n <button\n key={i}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n onClick={() => setActive(i)}\n className={cn(\n '-mb-px border-b-2 px-4 py-2 text-sm font-medium transition-colors',\n selected\n ? 'border-primary text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n )}\n data-testid={testId && `${testId}-tab-${i}`}\n >\n {t.label}\n </button>\n )\n })}\n </div>\n {current && (\n <div\n role=\"tabpanel\"\n className=\"pt-5 text-sm leading-relaxed text-muted-foreground\"\n data-testid={testId && `${testId}-panel`}\n >\n {current.content}\n </div>\n )}\n </div>\n )\n}\n","import { useState } from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport { cn } from '@arbidocs/react'\n\nexport interface AccordionItem {\n title: string\n content: string\n}\n\nexport interface AccordionProps {\n items: AccordionItem[]\n /** Allow multiple panels open at once. Default false (single-open). */\n allowMultiple?: boolean\n testId?: string\n}\n\n/** A stack of collapsible title/content panels. */\nexport function Accordion({ items, allowMultiple = false, testId }: AccordionProps) {\n const [open, setOpen] = useState<number[]>([])\n const toggle = (i: number) =>\n setOpen((prev) =>\n prev.includes(i) ? prev.filter((n) => n !== i) : allowMultiple ? [...prev, i] : [i]\n )\n return (\n <div className=\"divide-y divide-border border-y border-border\" data-testid={testId}>\n {(items ?? []).map((item, i) => {\n const isOpen = open.includes(i)\n return (\n <div key={i} data-testid={testId && `${testId}-item-${i}`}>\n <button\n type=\"button\"\n aria-expanded={isOpen}\n onClick={() => toggle(i)}\n className=\"flex w-full items-center justify-between gap-4 py-4 text-left text-base font-medium\"\n data-testid={testId && `${testId}-trigger-${i}`}\n >\n {item.title}\n <ChevronDown\n className={cn('size-4 shrink-0 transition-transform', isOpen && 'rotate-180')}\n />\n </button>\n {isOpen && (\n <p\n className=\"pb-4 text-sm leading-relaxed text-muted-foreground\"\n data-testid={testId && `${testId}-content-${i}`}\n >\n {item.content}\n </p>\n )}\n </div>\n )\n })}\n </div>\n )\n}\n","import { cn } from '@arbidocs/react'\nimport { BlockImage, type BlockImageProps } from './BlockImage'\n\nexport interface GalleryImage {\n src?: string\n alt?: string\n caption?: string\n}\n\nexport interface GalleryProps {\n images: GalleryImage[]\n columns?: '2' | '3' | '4'\n aspect?: BlockImageProps['aspect']\n rounded?: BlockImageProps['rounded']\n testId?: string\n}\n\nconst COLS: Record<'2' | '3' | '4', string> = {\n '2': 'grid-cols-2',\n '3': 'grid-cols-2 sm:grid-cols-3',\n '4': 'grid-cols-2 sm:grid-cols-4',\n}\n\n/** A responsive image grid. Each tile previews via BlockImage with a caption. */\nexport function Gallery({\n images,\n columns = '3',\n aspect = '1:1',\n rounded = 'lg',\n testId,\n}: GalleryProps) {\n return (\n <div className={cn('grid gap-4', COLS[columns] ?? COLS['3'])} data-testid={testId}>\n {(images ?? []).map((img, i) => (\n <figure key={i} data-testid={testId && `${testId}-item-${i}`}>\n <BlockImage\n src={img.src}\n alt={img.alt}\n aspect={aspect}\n rounded={rounded}\n testId={testId && `${testId}-item-${i}-image`}\n />\n {img.caption && (\n <figcaption className=\"mt-1.5 text-xs text-muted-foreground\">{img.caption}</figcaption>\n )}\n </figure>\n ))}\n </div>\n )\n}\n","import { cn } from '@arbidocs/react'\n\nexport type VideoAspect = '16:9' | '4:3' | '1:1'\n\nexport interface VideoEmbedProps {\n /** A YouTube / Vimeo / Loom page URL, or a direct video file URL. */\n url: string\n title?: string\n aspect?: VideoAspect\n rounded?: boolean\n testId?: string\n}\n\nconst ASPECT: Record<VideoAspect, string> = {\n '16:9': 'aspect-video',\n '4:3': 'aspect-[4/3]',\n '1:1': 'aspect-square',\n}\n\n/**\n * Resolve a shareable video URL to an embeddable iframe src. Supports YouTube,\n * Vimeo and Loom; returns null for anything else (rendered as a `<video>`).\n */\nexport function toEmbedUrl(url: string): string | null {\n if (!url) return null\n const yt = url.match(/(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/|youtube\\.com\\/embed\\/)([\\w-]{11})/)\n if (yt) return `https://www.youtube.com/embed/${yt[1]}`\n const vimeo = url.match(/vimeo\\.com\\/(?:video\\/)?(\\d+)/)\n if (vimeo) return `https://player.vimeo.com/video/${vimeo[1]}`\n const loom = url.match(/loom\\.com\\/(?:share|embed)\\/([\\w-]+)/)\n if (loom) return `https://www.loom.com/embed/${loom[1]}`\n return null\n}\n\n/** Embed a video from a YouTube/Vimeo/Loom link or a direct file, in a set aspect. */\nexport function VideoEmbed({\n url,\n title,\n aspect = '16:9',\n rounded = true,\n testId,\n}: VideoEmbedProps) {\n const embed = toEmbedUrl(url)\n const frame = cn(\n 'w-full overflow-hidden border border-border bg-muted',\n ASPECT[aspect] ?? ASPECT['16:9'],\n rounded && 'rounded-lg'\n )\n return (\n <div className={frame} data-testid={testId}>\n {embed ? (\n <iframe\n src={embed}\n title={title || 'Embedded video'}\n className=\"size-full\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n data-testid={testId && `${testId}-iframe`}\n />\n ) : url ? (\n <video src={url} controls className=\"size-full\" data-testid={testId && `${testId}-video`} />\n ) : null}\n </div>\n )\n}\n","import { useState, type FormEvent } from 'react'\nimport { Button, cn } from '@arbidocs/react'\n\nexport interface ContactField {\n name: string\n label: string\n type?: 'text' | 'email' | 'tel' | 'textarea'\n required?: boolean\n}\n\nexport interface ContactFormProps {\n fields: ContactField[]\n submitLabel?: string\n /** Optional POST endpoint. When set, the form submits natively to it. */\n action?: string\n /** Message shown after a client-side (no-action) submit. */\n successMessage?: string\n testId?: string\n}\n\n/** A configurable lead/contact form. Posts to `action`, or confirms client-side. */\nexport function ContactForm({\n fields,\n submitLabel = 'Send',\n action,\n successMessage = 'Thanks — we’ll be in touch shortly.',\n testId,\n}: ContactFormProps) {\n const [sent, setSent] = useState(false)\n const list = fields ?? []\n\n const onSubmit = (e: FormEvent<HTMLFormElement>) => {\n // With an action we let the browser POST natively; otherwise confirm inline.\n if (!action) {\n e.preventDefault()\n setSent(true)\n }\n }\n\n if (sent) {\n return (\n <p\n className=\"rounded-lg border border-border bg-muted p-6 text-center text-sm text-foreground\"\n role=\"status\"\n data-testid={testId && `${testId}-success`}\n >\n {successMessage}\n </p>\n )\n }\n\n return (\n <form\n action={action}\n method={action ? 'post' : undefined}\n onSubmit={onSubmit}\n className=\"mx-auto flex max-w-xl flex-col gap-4\"\n data-testid={testId}\n >\n {list.map((f, i) => {\n const inputClass =\n 'w-full rounded-md border border-border bg-card px-3 py-2 text-sm text-foreground outline-none focus:border-primary'\n return (\n <label key={i} className=\"flex flex-col gap-1.5 text-left\">\n <span className=\"text-sm font-medium\">{f.label}</span>\n {f.type === 'textarea' ? (\n <textarea\n name={f.name}\n required={f.required}\n rows={4}\n className={inputClass}\n data-testid={testId && `${testId}-field-${f.name}`}\n />\n ) : (\n <input\n name={f.name}\n type={f.type || 'text'}\n required={f.required}\n className={inputClass}\n data-testid={testId && `${testId}-field-${f.name}`}\n />\n )}\n </label>\n )\n })}\n <Button\n type=\"submit\"\n className={cn('mt-1 self-start')}\n data-testid={testId && `${testId}-submit`}\n >\n {submitLabel}\n </Button>\n </form>\n )\n}\n","import { ArrowRight } from 'lucide-react'\nimport { cn } from '@arbidocs/react'\n\nexport type BannerTone = 'primary' | 'muted' | 'ink'\n\nexport interface BannerProps {\n text: string\n cta?: { label?: string; href?: string }\n tone?: BannerTone\n testId?: string\n}\n\nconst TONE: Record<BannerTone, string> = {\n primary: 'bg-primary text-primary-foreground',\n muted: 'bg-muted text-foreground',\n ink: 'bg-foreground text-background',\n}\n\n/** A slim full-width announcement strip with optional inline CTA. */\nexport function Banner({ text, cta, tone = 'primary', testId }: BannerProps) {\n return (\n <div\n className={cn('w-full px-5 py-2.5 text-center text-sm', TONE[tone] ?? TONE.primary)}\n data-testid={testId}\n >\n <span className=\"font-medium\">{text}</span>\n {cta?.label && (\n <a\n href={cta.href || '#'}\n className=\"ml-2 inline-flex items-center gap-1 font-semibold underline underline-offset-4\"\n data-testid={testId && `${testId}-cta`}\n >\n {cta.label}\n <ArrowRight className=\"size-3.5\" />\n </a>\n )}\n </div>\n )\n}\n","import { ArrowRight } from 'lucide-react'\nimport { Button } from '@arbidocs/react'\nimport { BlockImage } from './BlockImage'\n\nexport interface MediaTextProps {\n eyebrow?: string\n title: string\n body?: string\n imageUrl?: string\n /** Which side the media sits on (desktop). */\n mediaSide?: 'left' | 'right'\n cta?: { label?: string; href?: string }\n testId?: string\n}\n\n/** A split media-and-copy row: an image on one side, prose + CTA on the other. */\nexport function MediaText({\n eyebrow,\n title,\n body,\n imageUrl,\n mediaSide = 'left',\n cta,\n testId,\n}: MediaTextProps) {\n const media = (\n <BlockImage src={imageUrl} aspect=\"4:3\" rounded=\"lg\" testId={testId && `${testId}-image`} />\n )\n const copy = (\n <div>\n {eyebrow && (\n <p className=\"mb-3 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {eyebrow}\n </p>\n )}\n <h2 className=\"text-3xl font-semibold tracking-tight text-balance\">{title}</h2>\n {body && <p className=\"mt-4 text-lg leading-relaxed text-muted-foreground\">{body}</p>}\n {cta?.label && (\n <Button asChild className=\"mt-6\">\n <a href={cta.href || '#'}>\n {cta.label}\n <ArrowRight className=\"size-4\" />\n </a>\n </Button>\n )}\n </div>\n )\n return (\n <div className=\"grid items-center gap-10 lg:grid-cols-2\" data-testid={testId}>\n {mediaSide === 'right' ? (\n <>\n {copy}\n {media}\n </>\n ) : (\n <>\n {media}\n {copy}\n </>\n )}\n </div>\n )\n}\n","import { Avatar, AvatarFallback, AvatarImage, Card, cn } from '@arbidocs/react'\nimport { initials } from '../lib/format'\n\nexport interface TeamMember {\n name: string\n role?: string\n bio?: string\n avatarUrl?: string\n}\n\nexport interface TeamGridProps {\n members: TeamMember[]\n columns?: '2' | '3' | '4'\n testId?: string\n}\n\nconst COLS: Record<'2' | '3' | '4', string> = {\n '2': 'sm:grid-cols-2',\n '3': 'sm:grid-cols-2 lg:grid-cols-3',\n '4': 'sm:grid-cols-2 lg:grid-cols-4',\n}\n\n/** A grid of people cards: avatar, name, role and an optional short bio. */\nexport function TeamGrid({ members, columns = '3', testId }: TeamGridProps) {\n return (\n <div className={cn('grid gap-6', COLS[columns] ?? COLS['3'])} data-testid={testId}>\n {(members ?? []).map((m, i) => (\n <Card\n key={i}\n variant=\"outline\"\n className=\"flex h-full flex-col items-center p-6 text-center\"\n data-testid={testId && `${testId}-item-${i}`}\n >\n <Avatar className=\"size-20\">\n {m.avatarUrl && <AvatarImage src={m.avatarUrl} alt={m.name} />}\n <AvatarFallback>{initials(m.name || '?')}</AvatarFallback>\n </Avatar>\n <h3 className=\"mt-4 text-base font-semibold tracking-tight\">{m.name}</h3>\n {m.role && <p className=\"text-sm text-primary\">{m.role}</p>}\n {m.bio && <p className=\"mt-2 text-sm leading-relaxed text-muted-foreground\">{m.bio}</p>}\n </Card>\n ))}\n </div>\n )\n}\n","import { cn } from '@arbidocs/react'\n\nexport interface StepItem {\n title: string\n description?: string\n}\n\nexport interface StepsProps {\n steps: StepItem[]\n /** `timeline` draws a connected vertical rail; `numbered` is a horizontal grid. */\n variant?: 'numbered' | 'timeline'\n testId?: string\n}\n\n/** A process / how-it-works sequence, as numbered cards or a vertical timeline. */\nexport function Steps({ steps, variant = 'numbered', testId }: StepsProps) {\n const list = steps ?? []\n if (variant === 'timeline') {\n return (\n <ol className=\"relative ml-3 border-l border-border\" data-testid={testId}>\n {list.map((s, i) => (\n <li key={i} className=\"mb-8 ml-6 last:mb-0\" data-testid={testId && `${testId}-item-${i}`}>\n <span className=\"absolute -left-3 flex size-6 items-center justify-center rounded-full bg-primary text-xs font-semibold text-primary-foreground\">\n {i + 1}\n </span>\n <h3 className=\"text-base font-semibold tracking-tight\">{s.title}</h3>\n {s.description && (\n <p className=\"mt-1 text-sm leading-relaxed text-muted-foreground\">{s.description}</p>\n )}\n </li>\n ))}\n </ol>\n )\n }\n return (\n <div\n className={cn('grid gap-6', list.length >= 4 ? 'md:grid-cols-4' : 'sm:grid-cols-3')}\n data-testid={testId}\n >\n {list.map((s, i) => (\n <div key={i} data-testid={testId && `${testId}-item-${i}`}>\n <span className=\"flex size-9 items-center justify-center rounded-full bg-primary/10 text-sm font-semibold text-primary\">\n {i + 1}\n </span>\n <h3 className=\"mt-4 text-base font-semibold tracking-tight\">{s.title}</h3>\n {s.description && (\n <p className=\"mt-2 text-sm leading-relaxed text-muted-foreground\">{s.description}</p>\n )}\n </div>\n ))}\n </div>\n )\n}\n","import { Quote } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage, Card, cn } from '@arbidocs/react'\nimport { initials } from '../lib/format'\n\nexport interface TestimonialItem {\n quote: string\n author?: string\n role?: string\n avatarUrl?: string\n}\n\nexport interface TestimonialGridProps {\n items: TestimonialItem[]\n columns?: '2' | '3'\n testId?: string\n}\n\nconst COLS: Record<'2' | '3', string> = {\n '2': 'sm:grid-cols-2',\n '3': 'sm:grid-cols-2 lg:grid-cols-3',\n}\n\n/** A grid of multiple pull-quote testimonials. */\nexport function TestimonialGrid({ items, columns = '3', testId }: TestimonialGridProps) {\n return (\n <div className={cn('grid gap-6', COLS[columns] ?? COLS['3'])} data-testid={testId}>\n {(items ?? []).map((t, i) => (\n <Card\n key={i}\n variant=\"outline\"\n className=\"flex h-full flex-col p-6\"\n data-testid={testId && `${testId}-item-${i}`}\n >\n <Quote className=\"size-6 text-primary/40\" aria-hidden />\n <blockquote className=\"mt-3 flex-1 text-base leading-relaxed\">{t.quote}</blockquote>\n {(t.author || t.avatarUrl) && (\n <div className=\"mt-5 flex items-center gap-3\">\n <Avatar className=\"size-9\">\n {t.avatarUrl && <AvatarImage src={t.avatarUrl} alt={t.author ?? ''} />}\n <AvatarFallback>{initials(t.author || '?')}</AvatarFallback>\n </Avatar>\n <div>\n {t.author && <p className=\"text-sm font-semibold\">{t.author}</p>}\n {t.role && <p className=\"text-xs text-muted-foreground\">{t.role}</p>}\n </div>\n </div>\n )}\n </Card>\n ))}\n </div>\n )\n}\n","/**\n * AppShell — the shared back-office chrome for a firm app: a left navigation rail\n * (a permanent sidebar on `lg+`, a hamburger-opened overlay drawer below it) plus\n * a topbar frame and the main content region. Driven entirely by the firm's\n * {@link AppNavSection} manifest, so every consumer gets the same responsive shell\n * from data — no bespoke sidebar/topbar per app.\n *\n * Firm-agnostic: brand (logo, topbar actions, sidebar footer, an optional right\n * rail) and content arrive as slots; the look tracks the `sidebar-*` theme tokens.\n * The drawer state is internal (the hamburger and drawer live in the same\n * component), so no cross-component store is needed.\n */\nimport { useEffect, useState, type ReactNode } from 'react'\nimport { Link, NavLink, useLocation } from 'react-router-dom'\nimport { Menu, Sparkles, X } from 'lucide-react'\nimport { cn } from '@arbidocs/react'\nimport { tid } from '../lib/testid'\nimport type { AppNavItem, AppNavSection } from './types'\n\nexport interface AppShellProps {\n /** Nav sections to render (already filtered/ordered by the app). */\n sections: AppNavSection[]\n /** Footer nav items pinned to the bottom of the sidebar (e.g. Settings). */\n footerItems?: AppNavItem[]\n /** Brand mark shown in the sidebar header. */\n logo?: ReactNode\n /** Where the logo links to (omit to render the logo without a link). */\n logoHref?: string\n logoLabel?: string\n /** Extra content below the footer nav (e.g. a connection-status pill). */\n sidebarFooter?: ReactNode\n /** Topbar content, rendered to the right of the mobile hamburger. */\n topbar?: ReactNode\n /** Optional docked panel on the far right (e.g. an AI chat rail). */\n rightRail?: ReactNode\n /** Main scroll region content (typically a router `<Outlet/>` wrapper). */\n children: ReactNode\n /** Extra classes for the `<main>` scroll region (e.g. a slim-scrollbar util). */\n mainClassName?: string\n /** Testid namespace for the shell/topbar/sidebar. Default \"app\". */\n testIdPrefix?: string\n}\n\nfunction NavItemLink({ item, onNavigate }: { item: AppNavItem; onNavigate?: () => void }) {\n return (\n <NavLink\n to={item.to}\n end={item.end}\n onClick={onNavigate}\n data-testid={tid('sidebar-nav', item.id)}\n className={({ isActive }) =>\n cn(\n 'group flex items-center gap-3 rounded-md px-3 py-2 text-sm font-medium transition-colors',\n isActive\n ? 'bg-sidebar-accent text-sidebar-accent-foreground'\n : 'text-sidebar-foreground hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground'\n )\n }\n >\n <item.icon className=\"size-[18px] shrink-0\" />\n <span className=\"flex-1 truncate\">{item.label}</span>\n {item.arbi && (\n <Sparkles className=\"size-3.5 text-sidebar-primary\" aria-label=\"Powered by ARBI\" />\n )}\n </NavLink>\n )\n}\n\ninterface SidebarBodyProps {\n sections: AppNavSection[]\n footerItems?: AppNavItem[]\n logo?: ReactNode\n logoHref?: string\n logoLabel?: string\n sidebarFooter?: ReactNode\n onNavigate?: () => void\n}\n\nfunction SidebarBody({\n sections,\n footerItems,\n logo,\n logoHref,\n logoLabel,\n sidebarFooter,\n onNavigate,\n}: SidebarBodyProps) {\n return (\n <>\n {logo && (\n <div className=\"flex h-16 items-center border-b border-sidebar-border px-5\">\n {logoHref ? (\n <Link to={logoHref} aria-label={logoLabel} onClick={onNavigate}>\n {logo}\n </Link>\n ) : (\n logo\n )}\n </div>\n )}\n\n <nav className=\"flex-1 space-y-6 overflow-y-auto px-3 py-5\">\n {sections.map((section) => (\n <div key={section.heading}>\n <p className=\"px-3 pb-2 text-[10px] font-semibold uppercase tracking-[0.14em] text-sidebar-foreground/55\">\n {section.heading}\n </p>\n <div className=\"space-y-0.5\">\n {section.items.map((item) => (\n <NavItemLink key={item.id} item={item} onNavigate={onNavigate} />\n ))}\n </div>\n </div>\n ))}\n </nav>\n\n {(footerItems?.length || sidebarFooter) && (\n <div className=\"border-t border-sidebar-border px-3 py-3\">\n {footerItems?.map((item) => (\n <NavItemLink key={item.id} item={item} onNavigate={onNavigate} />\n ))}\n {sidebarFooter}\n </div>\n )}\n </>\n )\n}\n\nexport function AppShell({\n sections,\n footerItems,\n logo,\n logoHref,\n logoLabel,\n sidebarFooter,\n topbar,\n rightRail,\n children,\n mainClassName,\n testIdPrefix = 'app',\n}: AppShellProps) {\n const [open, setOpen] = useState(false)\n const location = useLocation()\n\n // Close the drawer whenever the route changes (tapping a nav item navigates).\n useEffect(() => {\n setOpen(false)\n }, [location.pathname])\n\n const body = (onNavigate?: () => void) => (\n <SidebarBody\n sections={sections}\n footerItems={footerItems}\n logo={logo}\n logoHref={logoHref}\n logoLabel={logoLabel}\n sidebarFooter={sidebarFooter}\n onNavigate={onNavigate}\n />\n )\n\n return (\n <div\n className=\"flex h-screen overflow-hidden bg-background\"\n data-testid={`${testIdPrefix}-shell`}\n >\n {/* Desktop rail — permanent from lg up. */}\n <aside\n className=\"hidden h-full w-64 shrink-0 flex-col border-r border-sidebar-border bg-sidebar lg:flex\"\n data-testid={`${testIdPrefix}-sidebar`}\n >\n {body()}\n </aside>\n\n {/* Mobile drawer — overlay + slide-in panel, only mounted when open. */}\n {open && (\n <div\n className=\"fixed inset-0 z-50 lg:hidden\"\n data-testid={`${testIdPrefix}-sidebar-mobile`}\n >\n <div\n className=\"absolute inset-0 bg-black/60 backdrop-blur-sm\"\n onClick={() => setOpen(false)}\n aria-hidden\n />\n <aside className=\"absolute inset-y-0 left-0 flex w-64 max-w-[82%] flex-col border-r border-sidebar-border bg-sidebar shadow-xl\">\n <button\n type=\"button\"\n onClick={() => setOpen(false)}\n className=\"absolute right-3 top-4 z-10 flex size-8 items-center justify-center rounded-md text-sidebar-foreground/70 hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground\"\n aria-label=\"Close menu\"\n data-testid={`${testIdPrefix}-sidebar-close`}\n >\n <X className=\"size-5\" />\n </button>\n {body(() => setOpen(false))}\n </aside>\n </div>\n )}\n\n {/* Main column: topbar frame + scrollable content. */}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <header\n className=\"flex h-16 shrink-0 items-center gap-4 border-b border-border bg-card/80 px-6 backdrop-blur\"\n data-testid={`${testIdPrefix}-topbar`}\n >\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n className=\"flex size-9 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground lg:hidden\"\n data-testid={`${testIdPrefix}-nav-toggle`}\n aria-label=\"Open menu\"\n >\n <Menu className=\"size-5\" />\n </button>\n {topbar}\n </header>\n <main\n className={cn('flex-1 overflow-y-auto', mainClassName)}\n data-testid={`${testIdPrefix}-main`}\n >\n {children}\n </main>\n </div>\n\n {rightRail}\n </div>\n )\n}\n","/**\n * AppHeader — the shared topbar content that fills {@link AppShell}'s `topbar`\n * slot: a ⌘K search trigger on the left and a right cluster of an \"Ask AI\" button,\n * firm-supplied extras, the notification bell and the user menu. Assembles the\n * promoted @arbidocs/react chrome (bell + user menu) so every firm app gets the\n * same header from data — the palette itself is opened via `onSearch`/`onAsk`\n * (wire the app in a CommandPaletteProvider and pass its `open`).\n *\n * Firm-agnostic: identity, actions and navigation arrive as props; styling tracks\n * the semantic tokens. Per-variant notification tones are overridable so a firm\n * can restore its brand accent.\n */\nimport { type ReactNode } from 'react'\nimport { Search, Sparkles } from 'lucide-react'\nimport {\n Button,\n NotificationBell,\n UserMenu,\n type UserMenuItem,\n type NotifyVariant,\n} from '@arbidocs/react'\nimport { tid } from '../lib/testid'\n\nexport interface AppHeaderUser {\n name: string\n email?: string | null\n picture?: string | null\n}\n\nexport interface AppHeaderProps {\n /** Open the command palette (⌘K). Bound to the search trigger. */\n onSearch: () => void\n /** Open the palette in ask mode (defaults to `onSearch`). */\n onAsk?: () => void\n searchPlaceholder?: string\n searchKbd?: string\n askLabel?: string\n /** Right-cluster content before the action buttons (e.g. a running-timer). */\n leading?: ReactNode\n /** Extra icon buttons between Ask AI and the bell (e.g. a chat toggle). */\n actions?: ReactNode\n user: AppHeaderUser\n /** Account actions above sign-out (e.g. Settings). */\n userItems?: UserMenuItem[]\n onLogout: () => void\n /** Called with a notification's href when an entry is clicked. */\n onNotificationNavigate?: (href: string) => void\n /** Override per-variant notification glyph colours (e.g. brand accent). */\n notificationTones?: Partial<Record<NotifyVariant, string>>\n classNames?: { search?: string; askButton?: string }\n testIdPrefix?: string\n}\n\nexport function AppHeader({\n onSearch,\n onAsk,\n searchPlaceholder = 'Ask AI or search…',\n searchKbd = '⌘K',\n askLabel = 'Ask AI',\n leading,\n actions,\n user,\n userItems,\n onLogout,\n onNotificationNavigate,\n notificationTones,\n classNames,\n testIdPrefix = 'app',\n}: AppHeaderProps) {\n return (\n <>\n {/* The global search doubles as the AI command palette (⌘K). */}\n <button\n type=\"button\"\n onClick={onSearch}\n className={\n classNames?.search ??\n 'relative hidden max-w-md flex-1 items-center rounded-md border border-input bg-background py-2 pl-9 pr-3 text-left text-sm text-muted-foreground transition-colors hover:bg-accent md:flex'\n }\n data-testid={tid(testIdPrefix, 'global-search')}\n >\n <Search className=\"pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <span className=\"flex-1\">{searchPlaceholder}</span>\n <kbd className=\"rounded border border-border px-1.5 py-0.5 text-[10px]\">{searchKbd}</kbd>\n </button>\n\n <div className=\"ml-auto flex items-center gap-3\">\n {leading}\n <Button\n size=\"sm\"\n onClick={onAsk ?? onSearch}\n className={classNames?.askButton}\n data-testid={tid(testIdPrefix, 'ask-ai')}\n >\n <Sparkles className=\"size-4\" />\n {askLabel}\n </Button>\n {actions}\n <NotificationBell\n testId={tid(testIdPrefix, 'notifications')}\n onNavigate={onNotificationNavigate}\n toneClassNames={notificationTones}\n />\n <UserMenu\n user={user}\n items={userItems}\n onLogout={onLogout}\n testId={tid(testIdPrefix, 'user-menu')}\n logoutTestId={tid(testIdPrefix, 'logout')}\n />\n </div>\n </>\n )\n}\n","/**\n * Live-data gate for the widget seam (context + hook only — no components, so\n * this stays fast-refresh clean and can be imported by both the runtime scaffold\n * and the widget factory without a cycle).\n *\n * The flag is `true` ONLY inside an authenticated in-app renderer\n * (`PageRenderer liveData`), which is where live ARBI data may resolve. In the\n * Studio editor canvas and on the public site it stays `false`, so every live\n * widget renders a placeholder instead of hitting the backend. It is deliberately\n * separate from the asset resolver (which IS on in the editor, to preview\n * images): back-office data must never resolve on the marketing canvas.\n */\nimport { createContext, useContext } from 'react'\n\n/** True only where live widgets may resolve backend data (an authenticated app tree). */\nexport const LiveDataContext = createContext<boolean>(false)\n\n/** Whether live widgets may resolve backend data here (false in editor/public). */\nexport function useLiveDataActive(): boolean {\n return useContext(LiveDataContext)\n}\n","/**\n * Live-widget runtime: everything in the seam that RENDERS — the provider that\n * turns the live-data gate on for an authenticated app tree, the placeholder\n * shown everywhere else, and the widget block bodies themselves (each gates on\n * the live-data flag and renders live data or a placeholder).\n *\n * Components only — kept apart from the context/hook ({@link ./liveData}) and the\n * config factory ({@link ./widgets}) so every file in the seam is fast-refresh\n * clean (a file exports either components or non-components, never both, and a\n * non-component-export file defines no components).\n *\n * The widgets read the SHARED `@arbidocs/react` hooks and the package connection\n * (for the active workspace), so they are firm-agnostic.\n */\nimport type { LucideIcon } from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { Bot, FileText, MessagesSquare, Sparkles } from 'lucide-react'\nimport { Card, useConversations, useDocuments } from '@arbidocs/react'\nimport { MetricCard } from '../components/MetricCard'\nimport { useConnection } from '../connection/ConnectionProvider'\nimport { LiveDataContext, useLiveDataActive } from './liveData'\n\n// ── Scaffolding ───────────────────────────────────────────────────────────────\n/** Marks the subtree as an authenticated app tree, so live widgets resolve data. */\nexport function LiveDataProvider({ children }: { children: ReactNode }) {\n return <LiveDataContext.Provider value={true}>{children}</LiveDataContext.Provider>\n}\n\n/**\n * What a live widget shows when it can't (or shouldn't) resolve data: a labelled,\n * dashed card. Used in the Studio canvas and the public renderer so authoring a\n * dashboard is WYSIWYG-ish without leaking live back-office data.\n */\nexport function WidgetPlaceholder({\n label,\n icon: Icon = Sparkles,\n testId,\n}: {\n label: string\n icon?: LucideIcon\n testId?: string\n}) {\n return (\n <div\n className=\"flex items-center gap-3 rounded-xl border border-dashed border-border bg-muted/30 px-5 py-6 text-sm text-muted-foreground\"\n data-testid={testId}\n >\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n <Icon className=\"size-4\" />\n </span>\n <span>\n <span className=\"font-medium text-foreground\">{label}</span>\n <span className=\"ml-1\">· live in the app</span>\n </span>\n </div>\n )\n}\n\n// ── Shared helpers ────────────────────────────────────────────────────────────\n/** Resolve the active workspace id from the package connection (firm-agnostic). */\nfunction useActiveWorkspaceId(): string | undefined {\n const { workspaceId, fallbackWorkspaceId } = useConnection()\n return workspaceId ?? fallbackWorkspaceId ?? undefined\n}\n\n/** Compact relative time (\"3h ago\") — self-contained so widgets need no firm util. */\nfunction timeAgo(iso: string | undefined): string {\n if (!iso) return ''\n const then = new Date(iso).getTime()\n if (Number.isNaN(then)) return ''\n const s = Math.max(0, Math.round((Date.now() - then) / 1000))\n if (s < 60) return 'just now'\n const m = Math.round(s / 60)\n if (m < 60) return `${m}m ago`\n const h = Math.round(m / 60)\n if (h < 24) return `${h}h ago`\n return `${Math.round(h / 24)}d ago`\n}\n\nconst METRIC_SOURCES = {\n documents: { label: 'Documents', icon: FileText },\n conversations: { label: 'Agent threads', icon: Bot },\n} as const\ntype MetricSource = keyof typeof METRIC_SOURCES\n\nconst asMetricSource = (s: string): MetricSource =>\n s in METRIC_SOURCES ? (s as MetricSource) : 'documents'\n\ninterface Conversation {\n external_id?: string\n title?: string\n updated_at?: string\n}\n\n// ── Live inner bodies (only mounted where the gate is on) ─────────────────────\nfunction AgentActivityLive({\n title,\n limit,\n testId,\n}: {\n title: string\n limit: number\n testId: string\n}) {\n const wsId = useActiveWorkspaceId()\n const { data, isLoading } = useConversations(wsId)\n const rows = [...((data ?? []) as Conversation[])]\n .sort((a, b) => +new Date(b.updated_at ?? 0) - +new Date(a.updated_at ?? 0))\n .slice(0, limit)\n\n return (\n <Card variant=\"elevated\" className=\"rounded-xl p-5\" data-testid={testId}>\n <div className=\"mb-3 flex items-center gap-2\">\n <Bot className=\"size-4 text-muted-foreground\" />\n <p className=\"text-sm font-semibold text-foreground\">{title}</p>\n </div>\n {isLoading ? (\n <p className=\"text-sm text-muted-foreground\" data-testid={`${testId}-loading`}>\n Loading agent threads…\n </p>\n ) : rows.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\" data-testid={`${testId}-empty`}>\n No agent threads yet.\n </p>\n ) : (\n <ul className=\"space-y-2\" data-testid={`${testId}-list`}>\n {rows.map((c, i) => (\n <li\n key={c.external_id ?? i}\n className=\"flex items-center justify-between gap-3\"\n data-testid={`${testId}-item-${i}`}\n >\n <span className=\"flex items-center gap-2 truncate\">\n <MessagesSquare className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"truncate text-sm text-foreground\">\n {c.title?.trim() || 'Untitled thread'}\n </span>\n </span>\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">\n {timeAgo(c.updated_at)}\n </span>\n </li>\n ))}\n </ul>\n )}\n </Card>\n )\n}\n\nfunction LiveMetricInner({\n label,\n source,\n accent,\n testId,\n}: {\n label: string\n source: MetricSource\n accent: string\n testId: string\n}) {\n const wsId = useActiveWorkspaceId()\n const docs = useDocuments(wsId, { enabled: source === 'documents' })\n const convos = useConversations(wsId, { enabled: source === 'conversations' })\n const query = source === 'documents' ? docs : convos\n const count = Array.isArray(query.data) ? query.data.length : 0\n return (\n <MetricCard\n label={label || METRIC_SOURCES[source].label}\n value={query.isLoading ? '—' : String(count)}\n accent={accent}\n icon={METRIC_SOURCES[source].icon}\n testId={testId}\n />\n )\n}\n\n// ── Widget block bodies (gate on the live flag) ───────────────────────────────\n// Named components (not the Puck `render` arrow) so the live-context hook is a\n// legit component-level hook — mirrors how BlockImage gates on the asset resolver.\nexport function AgentActivityBlock({\n title,\n limit,\n testId,\n}: {\n title: string\n limit: number\n testId: string\n}) {\n return useLiveDataActive() ? (\n <AgentActivityLive title={title} limit={limit} testId={testId} />\n ) : (\n <WidgetPlaceholder label={String(title || 'Agent activity')} icon={Bot} testId={testId} />\n )\n}\n\nexport function LiveMetricBlock({\n label,\n source,\n accent,\n testId,\n}: {\n label: string\n source: string\n accent: string\n testId: string\n}) {\n const src = asMetricSource(source)\n return useLiveDataActive() ? (\n <LiveMetricInner label={label} source={src} accent={accent} testId={testId} />\n ) : (\n <WidgetPlaceholder\n label={String(label || METRIC_SOURCES[src].label)}\n icon={METRIC_SOURCES[src].icon}\n testId={testId}\n />\n )\n}\n","/**\n * Live-widget block factory for @arbidocs/blocks.\n *\n * Mirrors the other `create*Blocks` factories: it only WIRES pre-built block\n * components (from {@link ./liveWidgetRuntime}) into Puck `ComponentConfig`s, so\n * it exports a single function and defines no components of its own — keeping it\n * fast-refresh clean. The blocks gate on the live-data flag ({@link ./liveData}),\n * rendering real ARBI data inside an authenticated app tree and a placeholder in\n * the editor/public. They read the SHARED `@arbidocs/react` hooks, so any client\n * with an ARBI workspace gets them; a client supplies only *composition* via\n * `createArbiBlocksConfig({ liveWidgets: true })`.\n */\nimport type { ComponentConfig } from '@measured/puck'\nimport { AgentActivityBlock, LiveMetricBlock } from './liveWidgetRuntime'\nimport type { BlockKit } from './blockKit'\n\n/**\n * Build the live-widget block set, closing over the shared {@link BlockKit} for\n * stable testids. Registered under a \"Widgets\" category when a consumer opts in\n * with `createArbiBlocksConfig({ liveWidgets: true })`.\n */\nexport function createLiveWidgets(kit: BlockKit): Record<string, ComponentConfig> {\n const { blockTestId } = kit\n\n const AgentActivityWidget: ComponentConfig = {\n label: 'Agent activity (live)',\n fields: {\n title: { type: 'text', label: 'Title' },\n limit: { type: 'number', label: 'Rows', min: 1, max: 8 },\n },\n defaultProps: { title: 'Recent agent activity', limit: 4 },\n render: ({ id, title, limit }) => (\n <AgentActivityBlock title={title} limit={limit} testId={blockTestId(id)} />\n ),\n }\n\n const LiveMetricWidget: ComponentConfig = {\n label: 'Live metric',\n fields: {\n label: { type: 'text', label: 'Label' },\n source: {\n type: 'select',\n label: 'Source',\n options: [\n { label: 'Documents', value: 'documents' },\n { label: 'Agent threads', value: 'conversations' },\n ],\n },\n accent: {\n type: 'radio',\n label: 'Accent',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Primary', value: 'primary' },\n { label: 'Success', value: 'success' },\n ],\n },\n },\n defaultProps: { label: '', source: 'documents', accent: 'primary' },\n render: ({ id, label, source, accent }) => (\n <LiveMetricBlock label={label} source={source} accent={accent} testId={blockTestId(id)} />\n ),\n }\n\n return {\n AgentActivity: AgentActivityWidget,\n LiveMetric: LiveMetricWidget,\n }\n}\n","/**\n * Publish-time asset materialization.\n *\n * While authoring, an image is stored as a workspace **asset ref**\n * (`asset:<docId>`) — resolvable only inside the authenticated Studio. The\n * public marketing renderer has no auth token, so a published page must be\n * **self-contained**: every asset ref is replaced with a directly-renderable\n * source before the page is saved for the public.\n *\n * The default {@link createArbiMaterializer} downloads each asset once and\n * inlines it as a `data:` URI — the bytes travel *inside* the published JSON,\n * so nothing is fetched, served or auth-gated at render time (no backend). A\n * consumer that prefers a CDN/static host can pass a `publishAsset` hook that\n * uploads the bytes and returns a URL instead; that is purely a payload-size\n * optimization and keeps this package firm- and backend-agnostic.\n */\nimport type { Data } from '@measured/puck'\nimport { assetRefId, isAssetRef } from '../components/assetResolver'\nimport type { Arbi } from './types'\n\n/** Resolve a workspace document ext_id to a public-renderable src, or null. */\nexport type AssetMaterializer = (docId: string) => Promise<string | null>\n\nexport interface MaterializeOptions {\n /**\n * Optional sink: given a doc id + its bytes, store them somewhere public and\n * return the URL. When omitted, bytes are inlined as a `data:` URI (no backend).\n */\n publishAsset?: (docId: string, blob: Blob) => Promise<string>\n}\n\n/** Read a Blob as a `data:<mime>;base64,…` URI. */\nfunction blobToDataUrl(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(reader.result as string)\n reader.onerror = () => reject(reader.error)\n reader.readAsDataURL(blob)\n })\n}\n\n/**\n * A materializer backed by the authenticated Arbi client: download the asset,\n * then either hand it to `publishAsset` or inline it as a data URI. Any failure\n * resolves to `null` so a single broken asset never fails the whole publish.\n */\nexport function createArbiMaterializer(\n arbi: Arbi,\n opts: MaterializeOptions = {}\n): AssetMaterializer {\n return async (docId: string) => {\n try {\n const res = await arbi.documents.download(docId)\n const blob = await res.blob()\n if (opts.publishAsset) return await opts.publishAsset(docId, blob)\n return await blobToDataUrl(blob)\n } catch {\n return null\n }\n }\n}\n\n/** Depth-first collect every distinct asset ref (`asset:…`) in a JSON value. */\nfunction collectAssetRefs(node: unknown, acc: Set<string>): void {\n if (typeof node === 'string') {\n if (isAssetRef(node)) acc.add(node)\n return\n }\n if (Array.isArray(node)) {\n for (const child of node) collectAssetRefs(child, acc)\n return\n }\n if (node && typeof node === 'object') {\n for (const value of Object.values(node)) collectAssetRefs(value, acc)\n }\n}\n\n/** Deep-clone a JSON value, swapping any string found in `replacements`. */\nfunction replaceAssetRefs<T>(node: T, replacements: Map<string, string>): T {\n if (typeof node === 'string') {\n return (replacements.get(node) ?? node) as T\n }\n if (Array.isArray(node)) {\n return node.map((child) => replaceAssetRefs(child, replacements)) as unknown as T\n }\n if (node && typeof node === 'object') {\n const out: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(node)) {\n out[key] = replaceAssetRefs(value, replacements)\n }\n return out as T\n }\n return node\n}\n\n/**\n * Return a copy of `data` with every `asset:<docId>` ref replaced by its\n * materialized source. Each distinct ref is resolved exactly once; a ref that\n * fails to resolve is left untouched (it simply won't paint for the public).\n */\nexport async function materializePageData(\n data: Data,\n materialize: AssetMaterializer\n): Promise<Data> {\n const refs = new Set<string>()\n collectAssetRefs(data, refs)\n if (refs.size === 0) return data\n\n const replacements = new Map<string, string>()\n await Promise.all(\n [...refs].map(async (ref) => {\n const src = await materialize(assetRefId(ref))\n if (src) replacements.set(ref, src)\n })\n )\n if (replacements.size === 0) return data\n return replaceAssetRefs(data, replacements)\n}\n","/**\n * StudioEditor — the WYSIWYG marketing-site builder.\n *\n * Wraps Puck's <Puck> with a firm-supplied block config, a slim brand toolbar\n * (page picker, theme drawer, publish) and injected persistence. Data is loaded\n * per page slug on mount / slug change and saved on publish. The theme editor\n * rides in a slide-over so token changes preview live against the canvas.\n *\n * Firm-agnostic: the block config, page list, persistence, theme bundle/defaults\n * and brand labels all arrive as props; `live` is passed in (never read from env).\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Link } from 'react-router-dom'\nimport { Puck, type Config, type Data } from '@measured/puck'\nimport { ArrowLeft, Loader2, Palette, Rocket } from 'lucide-react'\nimport { useArbi } from '@arbidocs/react'\nimport { ThemeEditor } from '../theme/ThemeEditor'\nimport { AssetResolverProvider } from '../components/assetResolver'\nimport { applyStoredTheme, type ThemeBundle } from '../theme/store'\nimport type { ThemeTokens } from '../theme/tokens'\nimport { createArbiMaterializer, materializePageData, type MaterializeOptions } from './publish'\nimport type { StudioPageMeta, StudioPersistence, PersistVia } from './types'\n\nconst EMPTY_DATA = { content: [], root: {} } as Data\n\nexport interface StudioEditorProps {\n config: Config\n pages: readonly StudioPageMeta[]\n persistence: StudioPersistence\n themeBundle: ThemeBundle\n defaultTheme: ThemeTokens\n brandLabel: string\n backHref?: string\n backLabel?: string\n live: boolean\n initialSlug?: string\n testIdPrefix?: string\n /**\n * Install a DEV-only `window.__studioResetSlug(slug)` hook that clears a slug's\n * stored page so a fresh seed governs the canvas. For tests/demos only — it can\n * delete pages, so keep it off in production (pass `import.meta.env.DEV`). The\n * package stays env-agnostic; the consumer owns the flag.\n */\n resetSeam?: boolean\n /**\n * Optional sink for published image bytes. When omitted, publishing inlines\n * each asset as a `data:` URI (self-contained, no backend). Provide this to\n * upload bytes to a CDN/static host and return a URL instead.\n */\n publishAsset?: MaterializeOptions['publishAsset']\n}\n\nexport function StudioEditor({\n config,\n pages,\n persistence,\n themeBundle,\n defaultTheme,\n brandLabel,\n backHref,\n backLabel = 'Back',\n live,\n initialSlug,\n testIdPrefix = 'studio',\n publishAsset,\n resetSeam = false,\n}: StudioEditorProps) {\n const arbi = useArbi()\n const materialize = useMemo(\n () => createArbiMaterializer(arbi, { publishAsset }),\n [arbi, publishAsset]\n )\n\n const [slug, setSlug] = useState<string>(initialSlug ?? pages[0]?.slug ?? 'home')\n const [data, setData] = useState<Data>(EMPTY_DATA)\n const [rev, setRev] = useState(0) // bump to force-remount Puck on (re)load\n const [loading, setLoading] = useState(true)\n const [themeOpen, setThemeOpen] = useState(false)\n const [via, setVia] = useState<PersistVia | null>(null)\n const [saving, setSaving] = useState(false)\n const latest = useRef<Data>(EMPTY_DATA)\n\n // (Re)load the page's stored layout whenever the slug changes.\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n void (async () => {\n const { data: loaded } = await persistence.loadPage<Data>(arbi, live, slug)\n if (cancelled) return\n const next = loaded ?? EMPTY_DATA\n setData(next)\n latest.current = next\n setRev((r) => r + 1)\n setLoading(false)\n })()\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [slug, live])\n\n // DEV-only reset seam: clear a slug's stored page so a fresh seed governs the\n // canvas (backend content otherwise wins over localStorage). Lives in the\n // builder so EVERY client's studio gets deterministic test/demo resets for\n // free — no per-client wiring.\n useEffect(() => {\n if (!resetSeam) return\n const w = window as unknown as { __studioResetSlug?: (slug: string) => Promise<void> }\n w.__studioResetSlug = (s) => persistence.deletePage(arbi, live, s)\n return () => {\n delete w.__studioResetSlug\n }\n }, [resetSeam, arbi, live, persistence])\n\n // Publish = save the authoring layout (asset refs preserved, reusable) AND a\n // materialized copy (refs → data: URIs) the unauthenticated public can render.\n const persist = useCallback(\n async (toSave: Data) => {\n setSaving(true)\n try {\n const where = await persistence.savePage(arbi, live, slug, toSave)\n const published = await materializePageData(toSave, materialize)\n await persistence.savePublished(arbi, live, slug, published)\n setVia(where)\n } finally {\n setSaving(false)\n }\n },\n [arbi, live, slug, persistence, materialize]\n )\n\n // Hydrate the shared theme store from any persisted theme, then preview it live\n // so the canvas is painted exactly as a published page will render.\n useEffect(() => {\n let cancelled = false\n void (async () => {\n const { data: stored } = await persistence.loadTheme<ThemeTokens>(arbi, live)\n if (cancelled || !stored) return\n themeBundle.useStore.setState({\n colors: { ...defaultTheme.colors, ...stored.colors },\n fonts: stored.fonts ?? defaultTheme.fonts,\n radius: stored.radius ?? defaultTheme.radius,\n activePresetId: null,\n })\n applyStoredTheme(themeBundle)\n })()\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [arbi, live])\n\n // Persist the current theme so PageRenderer can paint published pages.\n const saveThemeToArbi = useCallback(async () => {\n const snapshot = themeBundle.useStore.getState().snapshot()\n return persistence.saveTheme(arbi, live, snapshot)\n }, [arbi, live, persistence, themeBundle])\n\n return (\n <div className=\"al-studio\" data-testid=\"page-studio\">\n {/* Brand toolbar */}\n <header className=\"flex items-center gap-3 border-b border-border bg-card px-4 py-2\">\n {backHref && (\n <>\n <Link\n to={backHref}\n className=\"inline-flex items-center gap-1.5 rounded-md px-2 py-1 text-sm text-muted-foreground hover:text-primary\"\n data-testid={`${testIdPrefix}-back`}\n >\n <ArrowLeft className=\"size-4\" /> {backLabel}\n </Link>\n <span className=\"h-4 w-px bg-border\" />\n </>\n )}\n <span className=\"font-display text-sm font-semibold text-foreground\">{brandLabel}</span>\n <select\n value={slug}\n onChange={(e) => setSlug(e.target.value)}\n className=\"rounded border border-border bg-background px-2 py-1 text-sm\"\n data-testid={`${testIdPrefix}-slug`}\n >\n {pages.map((p) => (\n <option key={p.slug} value={p.slug}>\n {p.label}\n </option>\n ))}\n </select>\n\n <div className=\"ml-auto flex items-center gap-2\">\n {via && (\n <span\n className=\"text-xs text-muted-foreground\"\n data-testid={`${testIdPrefix}-save-via`}\n >\n saved via {via}\n </span>\n )}\n <button\n type=\"button\"\n onClick={() => setThemeOpen((o) => !o)}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-1.5 text-sm font-medium text-foreground hover:border-primary hover:text-primary\"\n data-testid={`${testIdPrefix}-theme-toggle`}\n >\n <Palette className=\"size-4\" /> Theme\n </button>\n <button\n type=\"button\"\n onClick={() => void persist(latest.current)}\n disabled={saving || loading}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-60\"\n data-testid={`${testIdPrefix}-publish`}\n >\n {saving ? <Loader2 className=\"size-4 animate-spin\" /> : <Rocket className=\"size-4\" />}\n {saving ? 'Publishing…' : 'Publish'}\n </button>\n </div>\n </header>\n\n {/* Editor + theme drawer */}\n <div className=\"al-studio__puck relative flex\">\n <div className=\"min-w-0 flex-1\">\n {loading ? (\n <div\n className=\"flex h-full items-center justify-center text-sm text-muted-foreground\"\n data-testid={`${testIdPrefix}-loading`}\n >\n <Loader2 className=\"mr-2 size-4 animate-spin\" /> Loading “{slug}”…\n </div>\n ) : (\n <AssetResolverProvider>\n <Puck\n key={`${slug}-${rev}`}\n config={config}\n data={data}\n onChange={(d) => {\n latest.current = d\n }}\n onPublish={(d) => void persist(d)}\n />\n </AssetResolverProvider>\n )}\n </div>\n\n {themeOpen && (\n <aside\n className=\"w-80 shrink-0 border-l border-border\"\n data-testid={`${testIdPrefix}-theme-drawer`}\n >\n <ThemeEditor\n bundle={themeBundle}\n variant=\"drawer\"\n testIdPrefix={`${testIdPrefix}-theme`}\n onSave={saveThemeToArbi}\n />\n </aside>\n )}\n </div>\n </div>\n )\n}\n","/**\n * PageRenderer — the public, read-only renderer for a studio-authored page.\n *\n * Loads the **published** Puck `data` for a slug (ARBI → localStorage) and paints\n * it with <Render>. The published copy is self-contained — its image refs were\n * materialized to `data:` URIs at publish — so this renders with no auth (no asset\n * resolver). Falls back to the authoring layout for pages saved before publish.\n * Also applies any persisted theme so a published page looks exactly as it did in\n * the editor. Intended to be mounted at a public route.\n *\n * Firm-agnostic: the block config, persistence, theme defaults and empty-state\n * copy arrive as props; `live` is passed in (never read from env).\n */\nimport { useEffect, useState } from 'react'\nimport { useParams } from 'react-router-dom'\nimport { Render, type Config, type Data } from '@measured/puck'\nimport { useArbi } from '@arbidocs/react'\nimport { applyThemeVars, type ThemeTokens } from '../theme/tokens'\nimport { LiveDataProvider } from './liveWidgetRuntime'\nimport type { StudioPersistence } from './types'\n\nexport interface PageRendererProps {\n config: Config\n persistence: StudioPersistence\n defaultTheme: ThemeTokens\n live: boolean\n slug?: string\n emptyState?: { title: string; body: string }\n testIdPrefix?: string\n /**\n * Render inside a {@link LiveDataProvider}, so live-widget blocks resolve real\n * ARBI data. Only pass this when mounting the renderer INSIDE the authenticated\n * app tree (providers + a selected workspace present); on the public site leave\n * it off and widgets render placeholders.\n */\n liveData?: boolean\n /**\n * Render this page verbatim instead of loading a slug from persistence — for an\n * in-code page (e.g. a config-authored in-app board) that isn't a published\n * studio document. The slug is ignored.\n */\n initialData?: Data\n /**\n * Apply the persisted studio theme to the document (default true). Turn OFF for\n * an in-app renderer so it keeps the ambient app theme instead of repainting the\n * whole document with the marketing palette.\n */\n applyTheme?: boolean\n}\n\nexport function PageRenderer({\n config,\n persistence,\n defaultTheme,\n live,\n slug: slugProp,\n emptyState,\n testIdPrefix = 'studio',\n liveData = false,\n initialData,\n applyTheme = true,\n}: PageRendererProps) {\n const params = useParams()\n const slug = slugProp ?? params.slug ?? 'home'\n const arbi = useArbi()\n\n const [data, setData] = useState<Data | null>(initialData ?? null)\n const [loading, setLoading] = useState(!initialData)\n\n useEffect(() => {\n let cancelled = false\n setLoading(!initialData)\n void (async () => {\n // Optionally load + apply the studio theme (off for an in-app renderer, so\n // it keeps the ambient app palette instead of the marketing one).\n const theme = applyTheme\n ? (await persistence.loadTheme<ThemeTokens>(arbi, live)).data\n : undefined\n if (cancelled) return\n // An in-code page renders verbatim; otherwise load the published layout\n // (falling back to the authoring layout for pages that predate a publish).\n const page =\n initialData ??\n (await persistence.loadPublished<Data>(arbi, live, slug)).data ??\n (await persistence.loadPage<Data>(arbi, live, slug)).data\n if (cancelled) return\n if (applyTheme) {\n applyThemeVars(\n theme\n ? { ...defaultTheme, ...theme, colors: { ...defaultTheme.colors, ...theme.colors } }\n : defaultTheme\n )\n }\n setData(page)\n setLoading(false)\n })()\n return () => {\n cancelled = true\n }\n }, [arbi, live, slug, persistence, defaultTheme, initialData, applyTheme])\n\n if (loading) {\n return (\n <div\n className=\"flex min-h-[60vh] items-center justify-center text-sm text-muted-foreground\"\n data-testid={`${testIdPrefix}-render-loading`}\n >\n Loading page…\n </div>\n )\n }\n\n if (!data || data.content.length === 0) {\n const title = emptyState?.title ?? 'Nothing published yet'\n const body = emptyState?.body ?? `Publish the “${slug}” page to see it here.`\n return (\n <div\n className=\"mx-auto max-w-2xl px-5 py-24 text-center\"\n data-testid={`${testIdPrefix}-render-empty`}\n >\n <h1 className=\"font-display text-2xl font-semibold text-foreground\">{title}</h1>\n <p className=\"mt-2 text-sm text-muted-foreground\">{body}</p>\n </div>\n )\n }\n\n const rendered = <Render config={config} data={data} />\n return (\n <main data-testid={`page-${testIdPrefix}-render`}>\n {liveData ? <LiveDataProvider>{rendered}</LiveDataProvider> : rendered}\n </main>\n )\n}\n","/**\n * Studio persistence — save/load the Puck page `data` (and the theme) to a\n * firm's public marketing workspace, with a robust localStorage fallback.\n *\n * Contract:\n * - Pages are stored as JSON documents named `<slug>.json` in the `site/`\n * folder of the configured workspace.\n * - The theme is stored as `theme.json` in the same folder.\n * - Whichever path is taken (\"arbi\" | \"local\") is logged and returned, so the\n * UI can show where the content lives. We always mirror to localStorage so a\n * save is never silently lost when the backend is unavailable (demo mode).\n *\n * Firm-agnostic: {@link createStudioPersistence} closes the workspace, folder\n * and storage-key constants over a config, returning a {@link StudioPersistence}.\n */\nimport type { useArbi } from '@arbidocs/react'\nimport type { LoadResult, PersistVia, StudioPersistence } from './types'\n\n/** The Arbi instance type, borrowed from the hook so we don't import internals. */\ntype Arbi = ReturnType<typeof useArbi>\n\nexport interface StudioPersistenceConfig {\n /** The public marketing workspace that backs the site builder. */\n workspaceId: string\n /** Folder inside the workspace where studio artefacts live. */\n folder?: string\n /** Prefix for the localStorage mirror keys (e.g. \"studio-\"). */\n storagePrefix: string\n /** localStorage key for the theme mirror (default `${storagePrefix}theme`). */\n themeStorageKey?: string\n /** File name for the persisted theme document (default \"theme.json\"). */\n themeFileName?: string\n /** File name for a page's persisted document (default `${slug}.json`). */\n pageFileName?: (slug: string) => string\n /** File name for a page's published document (default `${slug}.published.json`). */\n publishedFileName?: (slug: string) => string\n}\n\nexport function createStudioPersistence(cfg: StudioPersistenceConfig): StudioPersistence {\n const WORKSPACE_ID = cfg.workspaceId\n const FOLDER = cfg.folder ?? 'site'\n const pageKey = (slug: string) => `${cfg.storagePrefix}${slug}`\n const publishedKey = (slug: string) => `${cfg.storagePrefix}published-${slug}`\n const THEME_KEY = cfg.themeStorageKey ?? `${cfg.storagePrefix}theme`\n const THEME_FILE = cfg.themeFileName ?? 'theme.json'\n const pageFile = cfg.pageFileName ?? ((slug: string) => `${slug}.json`)\n const publishedFile = cfg.publishedFileName ?? ((slug: string) => `${slug}.published.json`)\n\n /** Should we even attempt the live backend? Demo sessions have no real store. */\n function canUseArbi(arbi: Arbi | null, live: boolean): arbi is Arbi {\n return live && !!arbi\n }\n\n /** Write JSON to the workspace as a named document; throws on failure. */\n async function uploadJson(arbi: Arbi, fileName: string, obj: unknown): Promise<void> {\n await arbi.selectWorkspace(WORKSPACE_ID)\n const blob = new Blob([JSON.stringify(obj, null, 2)], { type: 'application/json' })\n await arbi.documents.uploadFile(blob, fileName, { folder: FOLDER })\n }\n\n /** Read + parse the most recent `site/<fileName>` document, or null if absent. */\n async function downloadJson<T>(arbi: Arbi, fileName: string): Promise<T | null> {\n await arbi.selectWorkspace(WORKSPACE_ID)\n const docs = await arbi.documents.list()\n // Newest wins if the same name was uploaded more than once.\n const match = docs\n .filter((d) => (d.file_name ?? '').endsWith(fileName) && (d.folder ?? '').includes(FOLDER))\n .sort((a, b) => (a.created_at < b.created_at ? 1 : -1))[0]\n if (!match) return null\n\n // Prefer the raw bytes (round-trips JSON exactly); fall back to parsed content.\n try {\n const res = await arbi.documents.download(match.external_id)\n return JSON.parse(await res.text()) as T\n } catch {\n const parsed = await arbi.documents.getParsedContent(match.external_id, 'content')\n const raw = typeof parsed?.content === 'string' ? parsed.content : JSON.stringify(parsed)\n return JSON.parse(raw) as T\n }\n }\n\n /** Persist a page-shaped artifact (authoring or published). Mirrors to localStorage. */\n async function writePage(\n arbi: Arbi | null,\n live: boolean,\n kind: string,\n localKey: string,\n fileName: string,\n data: unknown\n ): Promise<PersistVia> {\n try {\n localStorage.setItem(localKey, JSON.stringify(data))\n } catch {\n /* storage may be unavailable; the ARBI path can still succeed */\n }\n if (canUseArbi(arbi, live)) {\n try {\n await uploadJson(arbi, fileName, data)\n console.info(`[studio] saved ${kind} \"${fileName}\" → ARBI (${WORKSPACE_ID})`)\n return 'arbi'\n } catch (e) {\n console.warn(`[studio] ARBI save failed for \"${fileName}\", kept localStorage`, e)\n }\n }\n console.info(`[studio] saved ${kind} \"${fileName}\" → localStorage`)\n return 'local'\n }\n\n /** Load a page-shaped artifact. Prefers ARBI, falls back to localStorage. */\n async function readPage<T>(\n arbi: Arbi | null,\n live: boolean,\n localKey: string,\n fileName: string\n ): Promise<LoadResult<T>> {\n if (canUseArbi(arbi, live)) {\n try {\n const data = await downloadJson<T>(arbi, fileName)\n if (data) return { data, via: 'arbi' }\n } catch (e) {\n console.warn(`[studio] ARBI load failed for \"${fileName}\", trying localStorage`, e)\n }\n }\n const raw = safeLocalGet(localKey)\n return { data: raw ? (JSON.parse(raw) as T) : null, via: 'local' }\n }\n\n /** Persist a page's authoring layout (image values stay `asset:` refs). */\n function savePage(arbi: Arbi | null, live: boolean, slug: string, data: unknown) {\n return writePage(arbi, live, 'page', pageKey(slug), pageFile(slug), data)\n }\n\n function loadPage<T>(arbi: Arbi | null, live: boolean, slug: string) {\n return readPage<T>(arbi, live, pageKey(slug), pageFile(slug))\n }\n\n /** Persist a page's published (materialized) layout, read by the public renderer. */\n function savePublished(arbi: Arbi | null, live: boolean, slug: string, data: unknown) {\n return writePage(arbi, live, 'published page', publishedKey(slug), publishedFile(slug), data)\n }\n\n function loadPublished<T>(arbi: Arbi | null, live: boolean, slug: string) {\n return readPage<T>(arbi, live, publishedKey(slug), publishedFile(slug))\n }\n\n /** Delete a slug's stored pages (authoring + published) from the backend and\n * the localStorage mirror, so the page resets to empty / a fresh seed governs. */\n async function deletePage(arbi: Arbi | null, live: boolean, slug: string): Promise<void> {\n try {\n localStorage.removeItem(pageKey(slug))\n localStorage.removeItem(publishedKey(slug))\n } catch {\n /* storage may be unavailable */\n }\n if (!canUseArbi(arbi, live)) return\n try {\n await arbi.selectWorkspace(WORKSPACE_ID)\n const docs = await arbi.documents.list()\n const names = [pageFile(slug), publishedFile(slug)]\n const ids = docs\n .filter(\n (d) =>\n (d.folder ?? '').includes(FOLDER) && names.some((n) => (d.file_name ?? '').endsWith(n))\n )\n .map((d) => d.external_id)\n if (ids.length) await arbi.documents.delete(ids)\n console.info(`[studio] deleted ${ids.length} doc(s) for \"${slug}\" from ARBI`)\n } catch (e) {\n console.warn(`[studio] ARBI delete failed for \"${slug}\"`, e)\n }\n }\n\n /** Persist the theme token set. */\n async function saveTheme(arbi: Arbi | null, live: boolean, theme: unknown): Promise<PersistVia> {\n try {\n localStorage.setItem(THEME_KEY, JSON.stringify(theme))\n } catch {\n /* ignore */\n }\n if (canUseArbi(arbi, live)) {\n try {\n await uploadJson(arbi, THEME_FILE, theme)\n console.info(`[studio] saved theme → ARBI (${WORKSPACE_ID})`)\n return 'arbi'\n } catch (e) {\n console.warn('[studio] ARBI theme save failed, kept localStorage', e)\n }\n }\n console.info('[studio] saved theme → localStorage')\n return 'local'\n }\n\n /** Load the theme token set. */\n async function loadTheme<T>(arbi: Arbi | null, live: boolean): Promise<LoadResult<T>> {\n if (canUseArbi(arbi, live)) {\n try {\n const data = await downloadJson<T>(arbi, THEME_FILE)\n if (data) return { data, via: 'arbi' }\n } catch (e) {\n console.warn('[studio] ARBI theme load failed, trying localStorage', e)\n }\n }\n const raw = safeLocalGet(THEME_KEY)\n return { data: raw ? (JSON.parse(raw) as T) : null, via: 'local' }\n }\n\n function safeLocalGet(key: string): string | null {\n try {\n return localStorage.getItem(key)\n } catch {\n return null\n }\n }\n\n return { savePage, loadPage, savePublished, loadPublished, deletePage, saveTheme, loadTheme }\n}\n","/**\n * \"Write with AI\" fields — custom Puck fields that render a text input/area plus\n * a control that drafts copy grounded in a firm's marketing workspace documents\n * (via the AI kit's `useAiTask`).\n *\n * The generation is non-blocking: the button shows a spinner while streaming and\n * the field fills live as tokens arrive. \"AI proposes\" — the editor still edits\n * and publishes the copy themselves. Firm-agnostic: {@link createAiFields} closes\n * the workspace id, prompt voice and testid prefix over a config.\n */\nimport { useEffect, useRef, useState } from 'react'\nimport { Loader2, Sparkles } from 'lucide-react'\nimport type { CustomField } from '@measured/puck'\nimport { useAiTask, useWorkspaceDocs as useKitWorkspaceDocs } from '@arbidocs/react'\nimport { tid } from '../lib/testid'\nimport type { BuildPrompt } from './types'\n\nexport interface AiFieldsConfig {\n /** The marketing workspace the AI grounds on. */\n workspaceId: string\n /** Turns a field's kind/label/current text into an instruction. */\n buildPrompt: BuildPrompt\n /** Default prompt kind when a field does not specify one. */\n defaultKind?: string\n /** Testid namespace for the field + write button. */\n testIdPrefix?: string\n}\n\nexport interface AiFields {\n aiText: (label: string, placeholder?: string) => CustomField<string>\n aiTextarea: (label: string, placeholder?: string, kind?: string) => CustomField<string>\n}\n\ninterface AiTextFieldProps {\n value: string\n onChange: (v: string) => void\n name: string\n label: string\n multiline?: boolean\n placeholder?: string\n kind: string\n workspaceId: string\n buildPrompt: BuildPrompt\n testIdPrefix: string\n}\n\nfunction AiTextField({\n value,\n onChange,\n name,\n label,\n multiline,\n placeholder,\n kind,\n workspaceId,\n buildPrompt,\n testIdPrefix,\n}: AiTextFieldProps) {\n const { docIds } = useKitWorkspaceDocs(workspaceId)\n const task = useAiTask()\n const [active, setActive] = useState(false)\n const activeRef = useRef(false)\n\n // Stream tokens straight into the field while a generation is in flight.\n useEffect(() => {\n if (activeRef.current && task.text) onChange(task.text)\n }, [task.text, onChange])\n\n useEffect(() => {\n if (active && !task.isRunning) {\n activeRef.current = false\n setActive(false)\n }\n }, [active, task.isRunning])\n\n const write = async () => {\n if (task.isRunning) return\n activeRef.current = true\n setActive(true)\n await task.run(buildPrompt({ kind, label, current: value ?? '' }), docIds)\n }\n\n const inputTid = tid(`${testIdPrefix}-field`, name)\n\n return (\n <div className=\"al-ai-field\">\n {multiline ? (\n <textarea\n className=\"al-ai-field__input\"\n rows={5}\n value={value ?? ''}\n placeholder={placeholder}\n onChange={(e) => onChange(e.target.value)}\n data-testid={inputTid}\n />\n ) : (\n <input\n className=\"al-ai-field__input\"\n value={value ?? ''}\n placeholder={placeholder}\n onChange={(e) => onChange(e.target.value)}\n data-testid={inputTid}\n />\n )}\n <button\n type=\"button\"\n className=\"al-ai-field__btn\"\n onClick={() => void write()}\n disabled={task.isRunning}\n data-testid={tid(`${testIdPrefix}-ai-write`, name)}\n title=\"Draft this field with AI, grounded in the marketing workspace\"\n >\n {task.isRunning ? (\n <Loader2 className=\"size-3 animate-spin\" />\n ) : (\n <Sparkles className=\"size-3\" />\n )}\n {task.isRunning ? 'Writing…' : 'Write with AI'}\n </button>\n </div>\n )\n}\n\nexport function createAiFields(cfg: AiFieldsConfig): AiFields {\n const { workspaceId, buildPrompt } = cfg\n const defaultKind = cfg.defaultKind ?? 'copy'\n const testIdPrefix = cfg.testIdPrefix ?? 'studio'\n\n /** An AI-authorable single-line text field. */\n const aiText = (label: string, placeholder?: string): CustomField<string> => ({\n type: 'custom',\n label,\n render: ({ value, onChange, name }) => (\n <AiTextField\n value={value ?? ''}\n onChange={onChange}\n name={name}\n label={label}\n placeholder={placeholder}\n kind={defaultKind}\n workspaceId={workspaceId}\n buildPrompt={buildPrompt}\n testIdPrefix={testIdPrefix}\n />\n ),\n })\n\n /** An AI-authorable multi-line text field. */\n const aiTextarea = (\n label: string,\n placeholder?: string,\n kind: string = defaultKind\n ): CustomField<string> => ({\n type: 'custom',\n label,\n render: ({ value, onChange, name }) => (\n <AiTextField\n value={value ?? ''}\n onChange={onChange}\n name={name}\n label={label}\n placeholder={placeholder}\n kind={kind}\n workspaceId={workspaceId}\n buildPrompt={buildPrompt}\n testIdPrefix={testIdPrefix}\n multiline\n />\n ),\n })\n\n return { aiText, aiTextarea }\n}\n","/**\n * useImageGen — the typed capability hook behind image generation.\n *\n * Wraps the firm AI task with the `/image` slash-command contract so callers\n * never hand-assemble the command string or dig the generated document out of\n * the artifact stream. `/image <prompt>` runs the normal agent loop with the\n * image tool force-enabled (backend `create_image`); the produced PNG arrives\n * as an `ArtifactEvent` with `mode: 'image'` carrying the workspace document\n * ext_id — which is what gets stored as the asset reference.\n */\nimport { useCallback, useMemo } from 'react'\nimport type { AiTaskStatus, ArtifactEvent } from './ai'\nimport { useFirmAiTask } from './ai'\n\n/** ext_id of the newest image artifact in a list, or null if there is none. */\nfunction latestImageDocId(artifacts: readonly ArtifactEvent[]): string | null {\n for (let i = artifacts.length - 1; i >= 0; i--) {\n if (artifacts[i].mode === 'image') return artifacts[i].doc_ext_id\n }\n return null\n}\n\nexport interface UseImageGen {\n /** ext_id of the most recently generated image document (null until one exists). */\n docExtId: string | null\n /** Underlying task status: 'idle' | 'running' | 'done' | 'error'. */\n status: AiTaskStatus\n /** Human-readable failure message, or null. */\n error: string | null\n /** True while a generation is in flight. */\n isGenerating: boolean\n /**\n * Generate an image from a prompt. Resolves with the new image document's\n * ext_id, or null when the prompt is empty or no image was produced.\n */\n generate: (prompt: string) => Promise<string | null>\n /** Clear the current result and error. */\n reset: () => void\n}\n\nexport function useImageGen(): UseImageGen {\n const task = useFirmAiTask()\n const { run } = task\n\n const generate = useCallback(\n async (prompt: string): Promise<string | null> => {\n const trimmed = prompt.trim()\n if (!trimmed) return null\n // `/image` rides the agent pipeline and needs no doc grounding — the\n // backend resolves the active workspace from the session.\n const result = await run(`/image ${trimmed}`, [])\n return latestImageDocId(result?.artifacts ?? [])\n },\n [run]\n )\n\n const docExtId = useMemo(() => latestImageDocId(task.artifacts), [task.artifacts])\n\n return {\n docExtId,\n status: task.status,\n error: task.error,\n isGenerating: task.isRunning,\n generate,\n reset: task.reset,\n }\n}\n","/**\n * The image field — a custom Puck field for choosing an image any of the ways an\n * author expects: pick an existing **workspace asset**, **upload** from the\n * computer, paste a **URL**, or **generate** one with AI. Upload and generate both\n * save a workspace document, so every image lands in the reusable asset library.\n *\n * The stored value is a workspace **asset ref** (`asset:<docId>`) for asset /\n * upload / generate, or a plain URL for the URL mode. The editor previews a ref\n * via its thumbnail (see {@link AssetResolverProvider}); at publish the ref is\n * inlined to a `data:` URI (see the studio publish step). Firm-agnostic:\n * {@link createImageField} closes the workspace id and testid prefix over a config.\n */\nimport { useMemo, useState, type ChangeEvent } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { Crop, ImagePlus, Link2, Loader2, Sparkles, Upload } from 'lucide-react'\nimport type { CustomField } from '@measured/puck'\nimport {\n useArbi,\n useDocuments,\n useThumbnails,\n ImageCropModal,\n DEFAULT_ASPECT_OPTIONS,\n type CropResult,\n} from '@arbidocs/react'\nimport { asAssetRef, assetRefId, isAssetRef, useAssetImage } from '../components/assetResolver'\nimport { BlockImage } from '../components/BlockImage'\nimport { useImageGen } from '../connection/useImageGen'\nimport { tid } from '../lib/testid'\n\n/** Force a JPEG extension on a crop-exported filename. */\nfunction toJpgName(name: string): string {\n return name.replace(/\\.[^.]+$/, '') + '.jpg'\n}\n\nexport interface ImageFieldConfig {\n /** The workspace uploads/generations are saved to, and assets are picked from. */\n workspaceId: string\n /** Folder for uploaded/authored assets. Default \"assets\". */\n folder?: string\n /** Testid namespace. Default \"studio\". */\n testIdPrefix?: string\n}\n\nexport interface ImageFieldFactory {\n imageField: (label: string) => CustomField<string>\n}\n\ntype Mode = 'asset' | 'upload' | 'url' | 'generate'\n\ninterface ControlProps {\n value: string\n onChange: (v: string) => void\n name: string\n workspaceId: string\n folder: string\n testIdPrefix: string\n}\n\nconst IMAGE_EXT = /\\.(png|jpe?g|webp|gif|avif|svg)$/i\n\nfunction ImageFieldControl({\n value,\n onChange,\n name,\n workspaceId,\n folder,\n testIdPrefix,\n}: ControlProps) {\n const [mode, setMode] = useState<Mode>('asset')\n const [url, setUrl] = useState('')\n const [prompt, setPrompt] = useState('')\n const [busy, setBusy] = useState(false)\n // Crop workflow: the image being framed + the filename to save it under.\n const [cropSrc, setCropSrc] = useState<string | null>(null)\n const [cropName, setCropName] = useState('image.jpg')\n const arbi = useArbi()\n const gen = useImageGen()\n const queryClient = useQueryClient()\n\n // Resolved image for the current asset value — lets us reframe an already\n // uploaded OR generated image (both are asset refs). Empty id → undefined.\n const currentAssetImage = useAssetImage(isAssetRef(value) ? assetRefId(value) : '')\n\n const tp = (...q: (string | number)[]) => tid(`${testIdPrefix}-image`, name, ...q)\n\n // A freshly uploaded/generated asset must appear in the picker grid at once —\n // refresh the workspace document list (and its thumbnails) so it's selectable.\n const refreshAssets = () =>\n queryClient.invalidateQueries({ queryKey: ['arbi', 'documents', workspaceId] })\n\n // Workspace image documents, for the \"pick an existing asset\" grid.\n const { data: docs } = useDocuments(workspaceId)\n const imageDocs = useMemo(\n () =>\n (docs ?? []).filter(\n (d: { file_name?: string | null }) => d.file_name && IMAGE_EXT.test(d.file_name)\n ),\n [docs]\n )\n const imageIds = useMemo(\n () => imageDocs.map((d: { external_id: string }) => d.external_id),\n [imageDocs]\n )\n const { data: thumbs } = useThumbnails(imageIds)\n\n // Uploading and reframing both route through the crop modal, then save the\n // framed result as a workspace asset — one path, whatever the source.\n const onUpload = (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (!file) return\n setCropName(toJpgName(file.name))\n setCropSrc(URL.createObjectURL(file))\n e.target.value = '' // allow re-picking the same file\n }\n\n const openReframe = () => {\n if (!currentAssetImage) return\n setCropName('reframe.jpg')\n setCropSrc(currentAssetImage)\n }\n\n const uploadBlobAsAsset = async (blob: Blob, name: string) => {\n setBusy(true)\n try {\n await arbi.selectWorkspace(workspaceId)\n const file = new File([blob], name, { type: blob.type })\n const res = await arbi.documents.uploadFile(file, name, { folder })\n const id = res.doc_ext_ids?.[0]\n if (id) {\n onChange(asAssetRef(id))\n void refreshAssets()\n }\n } finally {\n setBusy(false)\n }\n }\n\n const onCropComplete = async (result: CropResult) => {\n const src = cropSrc\n setCropSrc(null)\n await uploadBlobAsAsset(result.blob, cropName)\n if (src?.startsWith('blob:')) URL.revokeObjectURL(src)\n }\n\n const onGenerate = async () => {\n if (!prompt.trim() || gen.isGenerating) return\n const id = await gen.generate(prompt)\n if (id) {\n onChange(asAssetRef(id))\n void refreshAssets()\n }\n }\n\n const MODES: { key: Mode; label: string; icon: typeof Upload }[] = [\n { key: 'asset', label: 'Assets', icon: ImagePlus },\n { key: 'upload', label: 'Upload', icon: Upload },\n { key: 'url', label: 'URL', icon: Link2 },\n { key: 'generate', label: 'Generate', icon: Sparkles },\n ]\n\n const inputClass =\n 'w-full rounded-md border border-border bg-card px-2.5 py-1.5 text-sm text-foreground outline-none focus:border-primary'\n const tabClass = (on: boolean) =>\n `inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs font-medium ${\n on ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:text-foreground'\n }`\n\n return (\n <div className=\"flex flex-col gap-2\" data-testid={tp()}>\n <div className=\"relative\">\n <BlockImage src={value} aspect=\"16:9\" rounded=\"md\" testId={tp('preview')} />\n {currentAssetImage ? (\n <button\n type=\"button\"\n onClick={openReframe}\n className=\"absolute right-1.5 top-1.5 inline-flex items-center gap-1 rounded-md bg-background/85 px-2 py-1 text-xs font-medium text-foreground shadow-sm backdrop-blur hover:bg-background\"\n data-testid={tp('reframe')}\n >\n <Crop className=\"size-3\" /> Crop\n </button>\n ) : null}\n </div>\n\n <div className=\"flex flex-wrap gap-1\">\n {MODES.map((m) => (\n <button\n key={m.key}\n type=\"button\"\n className={tabClass(mode === m.key)}\n onClick={() => setMode(m.key)}\n data-testid={tp('mode', m.key)}\n >\n <m.icon className=\"size-3\" /> {m.label}\n </button>\n ))}\n </div>\n\n {mode === 'asset' && (\n <div className=\"grid max-h-48 grid-cols-3 gap-1.5 overflow-auto\" data-testid={tp('assets')}>\n {imageDocs.length === 0 && (\n <p className=\"col-span-3 py-3 text-center text-xs text-muted-foreground\">\n No image assets yet — upload or generate one.\n </p>\n )}\n {imageDocs.map((d: { external_id: string; file_name?: string | null }) => {\n const thumb = thumbs?.[d.external_id]\n const selected = value === asAssetRef(d.external_id)\n return (\n <button\n key={d.external_id}\n type=\"button\"\n onClick={() => onChange(asAssetRef(d.external_id))}\n className={`overflow-hidden rounded border ${selected ? 'border-primary ring-1 ring-primary' : 'border-border'}`}\n title={d.file_name ?? ''}\n data-testid={tp('asset', d.external_id)}\n >\n {thumb ? (\n <img\n src={thumb}\n alt={d.file_name ?? ''}\n className=\"aspect-square w-full bg-muted object-contain\"\n />\n ) : (\n <span className=\"flex aspect-square w-full items-center justify-center bg-muted text-muted-foreground\">\n <ImagePlus className=\"size-4\" />\n </span>\n )}\n </button>\n )\n })}\n </div>\n )}\n\n {mode === 'upload' && (\n <label className=\"inline-flex cursor-pointer items-center gap-2 rounded-md border border-border px-2.5 py-1.5 text-sm text-foreground\">\n {busy ? <Loader2 className=\"size-4 animate-spin\" /> : <Upload className=\"size-4\" />}\n {busy ? 'Uploading…' : 'Choose a file'}\n <input\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n disabled={busy}\n onChange={(e) => void onUpload(e)}\n data-testid={tp('upload')}\n />\n </label>\n )}\n\n {mode === 'url' && (\n <div className=\"flex gap-1.5\">\n <input\n className={inputClass}\n placeholder=\"https://…\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n data-testid={tp('url')}\n />\n <button\n type=\"button\"\n className=\"rounded-md bg-primary px-2.5 py-1.5 text-sm font-medium text-primary-foreground disabled:opacity-50\"\n disabled={!url.trim()}\n onClick={() => onChange(url.trim())}\n data-testid={tp('url-apply')}\n >\n Use\n </button>\n </div>\n )}\n\n {mode === 'generate' && (\n <div className=\"flex flex-col gap-1.5\">\n <textarea\n className={inputClass}\n rows={2}\n placeholder=\"Describe the image…\"\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n data-testid={tp('prompt')}\n />\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1.5 self-start rounded-md bg-primary px-2.5 py-1.5 text-sm font-medium text-primary-foreground disabled:opacity-50\"\n disabled={!prompt.trim() || gen.isGenerating}\n onClick={() => void onGenerate()}\n data-testid={tp('generate')}\n >\n {gen.isGenerating ? (\n <Loader2 className=\"size-3.5 animate-spin\" />\n ) : (\n <Sparkles className=\"size-3.5\" />\n )}\n {gen.isGenerating ? 'Generating…' : 'Generate'}\n </button>\n {gen.error && (\n <span className=\"text-xs text-destructive\" role=\"alert\">\n {gen.error}\n </span>\n )}\n </div>\n )}\n\n {value && (\n <button\n type=\"button\"\n className=\"self-start text-xs text-muted-foreground hover:text-foreground\"\n onClick={() => onChange('')}\n data-testid={tp('clear')}\n >\n Clear\n </button>\n )}\n\n <ImageCropModal\n open={!!cropSrc}\n image={cropSrc}\n title=\"Frame your image\"\n aspectOptions={DEFAULT_ASPECT_OPTIONS}\n cropShape=\"rect\"\n output={{ maxSize: 1600 }}\n onComplete={onCropComplete}\n onCancel={() => setCropSrc(null)}\n />\n </div>\n )\n}\n\n/** Build the image field, closing over the firm's workspace + testid prefix. */\nexport function createImageField(cfg: ImageFieldConfig): ImageFieldFactory {\n const { workspaceId } = cfg\n const folder = cfg.folder ?? 'assets'\n const testIdPrefix = cfg.testIdPrefix ?? 'studio'\n\n const imageField = (label: string): CustomField<string> => ({\n type: 'custom',\n label,\n render: ({ value, onChange, name }) => (\n <ImageFieldControl\n value={value ?? ''}\n onChange={onChange}\n name={name}\n workspaceId={workspaceId}\n folder={folder}\n testIdPrefix={testIdPrefix}\n />\n ),\n })\n\n return { imageField }\n}\n","/**\n * Standard section shell — max-width, padding and an optional tone. Token-only so\n * it themes to whatever app consumes it; shared by blocks that echo a page's\n * section rhythm.\n *\n * The `ink` tone is a true **dark island**: it scopes a full inverted `--color-*`\n * context (background↔foreground swapped, card/muted/border derived), so any child\n * block that uses semantic tokens renders correctly on a dark surface. This lets a\n * single page mix genuinely light and dark sections.\n */\nimport type { CSSProperties, ReactNode } from 'react'\nimport { cn } from '@arbidocs/react'\n\nexport type SectionTone = 'default' | 'muted' | 'ink'\nexport type SectionPadding = 'none' | 'sm' | 'md' | 'lg'\nexport type SectionWidth = 'narrow' | 'default' | 'wide' | 'full'\n\nexport interface SectionProps {\n children: ReactNode\n tone?: SectionTone\n padding?: SectionPadding\n maxWidth?: SectionWidth\n /** Subtle grain/texture overlay in the current text colour (editorial surfaces). */\n texture?: boolean\n className?: string\n}\n\n/** A dependency-free micro-dot grain in `currentColor`, kept very faint. */\nconst TEXTURE_STYLE: CSSProperties = {\n backgroundImage: 'radial-gradient(currentColor 0.5px, transparent 0.5px)',\n backgroundSize: '4px 4px',\n opacity: 0.04,\n}\n\nconst PADDING: Record<SectionPadding, string> = {\n none: '',\n sm: 'py-8 lg:py-10',\n md: 'py-16 lg:py-20',\n lg: 'py-24 lg:py-28',\n}\n\nconst WIDTH: Record<SectionWidth, string> = {\n narrow: 'max-w-3xl',\n default: 'max-w-7xl',\n wide: 'max-w-[90rem]',\n full: 'max-w-none',\n}\n\n/** A scoped inverted token context — the \"dark island\". */\nconst INVERTED_VARS: CSSProperties = {\n ['--color-background' as string]: 'var(--color-foreground)',\n ['--color-foreground' as string]: 'var(--color-background)',\n ['--color-card' as string]: 'color-mix(in srgb, var(--color-foreground) 92%, #fff)',\n ['--color-muted' as string]: 'color-mix(in srgb, var(--color-foreground) 85%, #fff)',\n ['--color-muted-foreground' as string]:\n 'color-mix(in srgb, var(--color-background) 60%, transparent)',\n ['--color-border' as string]: 'color-mix(in srgb, var(--color-background) 18%, transparent)',\n ['--color-accent' as string]: 'color-mix(in srgb, var(--color-foreground) 80%, #fff)',\n}\n\nexport function Section({\n children,\n tone = 'default',\n padding = 'md',\n maxWidth = 'default',\n texture,\n className = '',\n}: SectionProps) {\n const inverted = tone === 'ink'\n const toneClass = inverted\n ? 'bg-background text-foreground'\n : tone === 'muted'\n ? 'border-y border-border bg-card/40'\n : ''\n return (\n <section className={cn('relative', toneClass)} style={inverted ? INVERTED_VARS : undefined}>\n {texture && (\n <div className=\"pointer-events-none absolute inset-0\" style={TEXTURE_STYLE} aria-hidden />\n )}\n <div\n className={cn(\n 'relative mx-auto px-5 lg:px-8',\n WIDTH[maxWidth],\n PADDING[padding],\n className\n )}\n >\n {children}\n </div>\n </section>\n )\n}\n","/**\n * Shared field helpers for the block registry. Every block config — the built-ins\n * in {@link createArbiBlocksConfig} and the website blocks in\n * {@link file://./websiteBlocks.tsx} — builds its Puck fields from this one kit so\n * the AI-or-plain copy fallback, the icon `select`, the tone/bool radios and the\n * stable render-time testid are declared once.\n */\nimport type { Field } from '@measured/puck'\nimport type { LucideIcon } from 'lucide-react'\nimport {\n Activity,\n AlertCircle,\n Award,\n BarChart3,\n Bell,\n Briefcase,\n Calendar,\n CheckCircle,\n Clock,\n Cloud,\n Code,\n Cpu,\n DollarSign,\n FileText,\n Folder,\n Gavel,\n Globe,\n Heart,\n Info,\n Layers,\n Lock,\n Mail,\n MapPin,\n MessageSquare,\n Phone,\n Rocket,\n Scale,\n Shield,\n Sparkles,\n Star,\n Target,\n TrendingUp,\n Users,\n Zap,\n} from 'lucide-react'\nimport { tid } from '../lib/testid'\nimport type { AiFields } from './aiFields'\n\n// ── Icon registry ─────────────────────────────────────────────────────────────\n// A curated set of common back-office + marketing icons exposed as a `select`. The\n// editor picks a name; {@link BlockKit.resolveIcon} maps it back to the component.\nexport const iconMap: Record<string, LucideIcon> = {\n FileText,\n Folder,\n Users,\n Briefcase,\n Calendar,\n Clock,\n CheckCircle,\n AlertCircle,\n Info,\n TrendingUp,\n DollarSign,\n BarChart3,\n Activity,\n Bell,\n Scale,\n Gavel,\n Sparkles,\n // Marketing set\n Zap,\n Shield,\n Rocket,\n Star,\n Heart,\n Globe,\n Lock,\n Mail,\n Phone,\n MapPin,\n Award,\n Target,\n Layers,\n Cloud,\n Code,\n Cpu,\n MessageSquare,\n}\n\nconst ICON_OPTIONS = [\n { label: 'None', value: '' },\n ...Object.keys(iconMap).map((name) => ({ label: name, value: name })),\n]\n\n/** The bundle of field helpers a block config needs. */\nexport interface BlockKit {\n /** Single-line copy: AI-authorable when a firm supplies aiFields, else plain text. */\n textField: (label: string, placeholder?: string) => Field\n /** Multi-line copy: AI-authorable when a firm supplies aiFields, else plain textarea. */\n textareaField: (label: string, placeholder?: string, kind?: string) => Field\n /** Image source: a workspace-asset picker when a firm supplies imageField, else a URL input. */\n imageField: (label: string) => Field\n /** A Yes/No radio. */\n boolRadio: (label: string) => Field\n /** A `select` over {@link iconMap} names. */\n iconField: (label?: string) => Field\n /** Resolve an icon name to its Lucide component. */\n resolveIcon: (name?: string) => LucideIcon | undefined\n /** Stable, e2e-locatable testid derived from a block's Puck id. */\n blockTestId: (id: string) => string\n /**\n * Optional firm override for the eyebrow style on heading-bearing blocks\n * (Hero, Section heading). Lets a consumer render a brand accent (e.g. a brass\n * eyebrow) without forking the blocks. Undefined → the default token classes.\n */\n eyebrowClassName?: string\n}\n\n/** Build the shared field helpers, closing over the firm's optional AI + image fields. */\nexport function createBlockKit(\n ai?: AiFields,\n image?: (label: string) => Field,\n eyebrowClassName?: string\n): BlockKit {\n return {\n eyebrowClassName,\n textField: (label, placeholder) =>\n ai ? (ai.aiText(label, placeholder) as Field) : { type: 'text', label, placeholder },\n textareaField: (label, placeholder, kind) =>\n ai\n ? (ai.aiTextarea(label, placeholder, kind) as Field)\n : { type: 'textarea', label, placeholder },\n imageField: (label) => (image ? image(label) : { type: 'text', label }),\n boolRadio: (label) => ({\n type: 'radio',\n label,\n options: [\n { label: 'No', value: false },\n { label: 'Yes', value: true },\n ],\n }),\n iconField: (label = 'Icon') => ({ type: 'select', label, options: ICON_OPTIONS }),\n resolveIcon: (name) => (name ? iconMap[name] : undefined),\n blockTestId: (id) => tid('arbi-block', id),\n }\n}\n","/**\n * Website-building blocks for the shared registry — the marketing vocabulary a user\n * drags to design a full site: heroes, feature grids, stats, testimonials, CTAs,\n * FAQs, navigation, media and layout primitives.\n *\n * Every block is serializable-only (text/textarea/number/radio/select/array/object/\n * slot/custom-AI — no function/ReactNode props), token-clean (semantic tokens so D1\n * live-theming recolours it), routes copy through the shared AI-or-plain fields, has\n * a stable render-time `data-testid`, and ships sensible defaults so it looks good\n * the moment it is dropped.\n */\nimport type { ComponentType, ReactNode } from 'react'\nimport type { ComponentConfig, Field } from '@measured/puck'\nimport type { BlockKit } from './blockKit'\nimport { Hero } from '../components/Hero'\nimport { FeatureGrid } from '../components/FeatureGrid'\nimport { StatGroup } from '../components/StatGroup'\nimport { Testimonial } from '../components/Testimonial'\nimport { CTABanner } from '../components/CTABanner'\nimport { LogoCloud } from '../components/LogoCloud'\nimport { FAQ } from '../components/FAQ'\nimport { RichTextBlock } from '../components/RichTextBlock'\nimport { Callout } from '../components/Callout'\nimport { BlockImage } from '../components/BlockImage'\nimport { AvatarBlock } from '../components/AvatarBlock'\nimport { Navbar } from '../components/Navbar'\nimport { Footer } from '../components/Footer'\nimport { ListBlock } from '../components/ListBlock'\nimport { Columns } from '../components/Columns'\nimport { Spacer } from '../components/Spacer'\nimport { Container } from '../components/Container'\n\n// Puck injects a component for each slot at render; default to an empty array.\nconst emptySlot = [] as unknown as ReactNode\nconst renderSlot = (slot: unknown): ReactNode => {\n if (typeof slot !== 'function') return null\n const Slot = slot as ComponentType\n return <Slot />\n}\n\nconst toneField: Field = {\n type: 'radio',\n label: 'Tone',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Muted', value: 'muted' },\n { label: 'Ink', value: 'ink' },\n ],\n}\n\n/** Build every website block, closing over the shared field {@link BlockKit}. */\nexport function createWebsiteBlocks(kit: BlockKit): Record<string, ComponentConfig> {\n const { textField, textareaField, imageField, boolRadio, iconField, resolveIcon, blockTestId } =\n kit\n\n const ctaField = (label: string): Field => ({\n type: 'object',\n label,\n objectFields: {\n label: textField('Label'),\n href: { type: 'text', label: 'Link' },\n },\n })\n\n // ── Layout ──────────────────────────────────────────────────────────────────\n const ColumnsBlock: ComponentConfig = {\n label: 'Columns',\n fields: {\n count: {\n type: 'radio',\n label: 'Columns',\n options: [\n { label: '2', value: 2 },\n { label: '3', value: 3 },\n { label: '4', value: 4 },\n ],\n },\n gap: {\n type: 'radio',\n label: 'Gap',\n options: [\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n ],\n },\n col1: { type: 'slot' },\n col2: { type: 'slot' },\n col3: { type: 'slot' },\n col4: { type: 'slot' },\n },\n defaultProps: {\n count: 3,\n gap: 'md',\n col1: emptySlot,\n col2: emptySlot,\n col3: emptySlot,\n col4: emptySlot,\n },\n render: ({ id, count, gap, col1, col2, col3, col4 }) => {\n const n = Number(count) || 3\n const columns = [col1, col2, col3, col4].slice(0, n).map(renderSlot)\n return <Columns count={n as 2 | 3 | 4} gap={gap} columns={columns} testId={blockTestId(id)} />\n },\n }\n\n const SpacerBlock: ComponentConfig = {\n label: 'Spacer',\n fields: {\n size: {\n type: 'radio',\n label: 'Size',\n options: [\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n { label: 'XL', value: 'xl' },\n ],\n },\n },\n defaultProps: { size: 'md' },\n render: ({ id, size }) => <Spacer size={size} testId={blockTestId(id)} />,\n }\n\n const ContainerBlock: ComponentConfig = {\n label: 'Container',\n fields: {\n width: {\n type: 'radio',\n label: 'Width',\n options: [\n { label: 'Narrow', value: 'narrow' },\n { label: 'Default', value: 'default' },\n { label: 'Wide', value: 'wide' },\n { label: 'Full', value: 'full' },\n ],\n },\n padding: {\n type: 'radio',\n label: 'Padding',\n options: [\n { label: 'None', value: 'none' },\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n ],\n },\n children: { type: 'slot' },\n },\n defaultProps: { width: 'default', padding: 'md', children: emptySlot },\n render: ({ id, width, padding, children }) => (\n <Container width={width} padding={padding} testId={blockTestId(id)}>\n {renderSlot(children)}\n </Container>\n ),\n }\n\n // ── Marketing ───────────────────────────────────────────────────────────────\n const HeroBlock: ComponentConfig = {\n label: 'Hero',\n fields: {\n eyebrow: textField('Eyebrow'),\n title: textField('Title'),\n emphasis: { type: 'text', label: 'Emphasised word' },\n subtitle: textareaField('Subtitle', undefined, 'lead'),\n primaryCta: ctaField('Primary CTA'),\n secondaryCta: ctaField('Secondary CTA'),\n align: {\n type: 'radio',\n label: 'Align',\n options: [\n { label: 'Left', value: 'left' },\n { label: 'Center', value: 'center' },\n ],\n },\n tone: toneField,\n imageUrl: imageField('Side image'),\n backgroundImage: imageField('Background image'),\n overlay: boolRadio('Background overlay'),\n },\n defaultProps: {\n eyebrow: 'Introducing',\n title: 'Build a better website, faster.',\n emphasis: '',\n subtitle:\n 'A flexible platform that helps your team ship polished, on-brand pages without waiting on engineering.',\n primaryCta: { label: 'Get started', href: '#' },\n secondaryCta: { label: 'Learn more', href: '#' },\n align: 'left',\n tone: 'default',\n imageUrl: '',\n backgroundImage: '',\n overlay: true,\n },\n render: ({\n id,\n eyebrow,\n title,\n emphasis,\n subtitle,\n primaryCta,\n secondaryCta,\n align,\n tone,\n imageUrl,\n backgroundImage,\n overlay,\n }) => (\n <Hero\n eyebrow={eyebrow}\n title={title}\n emphasis={emphasis}\n subtitle={subtitle}\n primaryCta={primaryCta}\n secondaryCta={secondaryCta}\n align={align}\n tone={tone}\n imageUrl={imageUrl}\n backgroundImage={backgroundImage}\n overlay={overlay}\n eyebrowClassName={kit.eyebrowClassName}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const FeatureGridBlock: ComponentConfig = {\n label: 'Feature grid',\n fields: {\n columns: {\n type: 'radio',\n label: 'Columns',\n options: [\n { label: '2', value: '2' },\n { label: '3', value: '3' },\n ],\n },\n items: {\n type: 'array',\n label: 'Features',\n arrayFields: {\n icon: iconField(),\n title: textField('Title'),\n description: textareaField('Description'),\n },\n defaultItemProps: {\n icon: 'Sparkles',\n title: 'Feature',\n description: 'Describe this feature.',\n },\n getItemSummary: (item: { title?: string }) => item?.title || 'Feature',\n },\n },\n defaultProps: {\n columns: '3',\n items: [\n {\n icon: 'Zap',\n title: 'Fast by default',\n description: 'Ship pages in minutes with sensible, on-brand defaults.',\n },\n {\n icon: 'Shield',\n title: 'Secure & reliable',\n description: 'Enterprise-grade security baked into every layer.',\n },\n {\n icon: 'Layers',\n title: 'Composable',\n description: 'Mix and match blocks to build any layout you need.',\n },\n ],\n },\n render: ({ id, columns, items }) => {\n const list = (items ?? []).map(\n (it: { icon?: string; title: string; description?: string }) => ({\n ...it,\n icon: resolveIcon(it.icon),\n })\n )\n return <FeatureGrid columns={columns} items={list} testId={blockTestId(id)} />\n },\n }\n\n const StatGroupBlock: ComponentConfig = {\n label: 'Stat group',\n fields: {\n items: {\n type: 'array',\n label: 'Stats',\n arrayFields: {\n value: textField('Value'),\n label: textField('Label'),\n },\n defaultItemProps: { value: '100%', label: 'Metric' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Stat',\n },\n },\n defaultProps: {\n items: [\n { value: '10k+', label: 'Active users' },\n { value: '99.9%', label: 'Uptime' },\n { value: '4.9/5', label: 'Customer rating' },\n { value: '24/7', label: 'Support' },\n ],\n },\n render: ({ id, items }) => <StatGroup items={items} testId={blockTestId(id)} />,\n }\n\n const TestimonialBlock: ComponentConfig = {\n label: 'Testimonial',\n fields: {\n quote: textareaField('Quote'),\n author: textField('Author'),\n role: textField('Role'),\n avatarUrl: { type: 'text', label: 'Avatar URL' },\n },\n defaultProps: {\n quote: 'This is the best tool our team has adopted in years. It just works.',\n author: 'Alex Morgan',\n role: 'Head of Product, Northwind',\n avatarUrl: '',\n },\n render: ({ id, quote, author, role, avatarUrl }) => (\n <Testimonial\n quote={quote}\n author={author}\n role={role}\n avatarUrl={avatarUrl}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const CTABannerBlock: ComponentConfig = {\n label: 'CTA banner',\n fields: {\n title: textField('Title'),\n subtitle: textareaField('Subtitle'),\n cta: ctaField('Button'),\n tone: toneField,\n backgroundImage: imageField('Background image'),\n overlay: boolRadio('Background overlay'),\n },\n defaultProps: {\n title: 'Ready to get started?',\n subtitle: 'Join thousands of teams already building with us.',\n cta: { label: 'Start free trial', href: '#' },\n tone: 'default',\n backgroundImage: '',\n overlay: true,\n },\n render: ({ id, title, subtitle, cta, tone, backgroundImage, overlay }) => (\n <CTABanner\n title={title}\n subtitle={subtitle}\n cta={cta}\n tone={tone}\n backgroundImage={backgroundImage}\n overlay={overlay}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const LogoCloudBlock: ComponentConfig = {\n label: 'Logo cloud',\n fields: {\n items: {\n type: 'array',\n label: 'Logos',\n arrayFields: { label: textField('Label') },\n defaultItemProps: { label: 'Brand' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Logo',\n },\n },\n defaultProps: {\n items: [\n { label: 'Northwind' },\n { label: 'Acme' },\n { label: 'Globex' },\n { label: 'Initech' },\n { label: 'Umbrella' },\n ],\n },\n render: ({ id, items }) => <LogoCloud items={items} testId={blockTestId(id)} />,\n }\n\n const FAQBlock: ComponentConfig = {\n label: 'FAQ',\n fields: {\n items: {\n type: 'array',\n label: 'Questions',\n arrayFields: {\n question: textField('Question'),\n answer: textareaField('Answer'),\n },\n defaultItemProps: { question: 'A question?', answer: 'The answer.' },\n getItemSummary: (item: { question?: string }) => item?.question || 'Question',\n },\n },\n defaultProps: {\n items: [\n {\n question: 'How does the free trial work?',\n answer: 'You get full access for 14 days, no credit card required.',\n },\n {\n question: 'Can I change plans later?',\n answer: 'Yes — upgrade or downgrade at any time from your dashboard.',\n },\n {\n question: 'Do you offer support?',\n answer: 'Every plan includes 24/7 support from our team.',\n },\n ],\n },\n render: ({ id, items }) => <FAQ items={items} testId={blockTestId(id)} />,\n }\n\n const RichTextBlockConfig: ComponentConfig = {\n label: 'Rich text',\n fields: {\n content: textareaField('Content', undefined, 'body'),\n },\n defaultProps: {\n content:\n '## About us\\n\\nWe build tools that help teams do their best work. Our platform combines **power** and _simplicity_ so you can focus on what matters.\\n\\n- Fast to learn\\n- Easy to scale\\n- Loved by teams',\n },\n render: ({ id, content }) => <RichTextBlock content={content} testId={blockTestId(id)} />,\n }\n\n const CalloutBlock: ComponentConfig = {\n label: 'Callout',\n fields: {\n variant: {\n type: 'radio',\n label: 'Variant',\n options: [\n { label: 'Info', value: 'info' },\n { label: 'Success', value: 'success' },\n { label: 'Warning', value: 'warning' },\n { label: 'Danger', value: 'danger' },\n ],\n },\n title: textField('Title'),\n body: textareaField('Body'),\n },\n defaultProps: {\n variant: 'info',\n title: 'Good to know',\n body: 'This is a helpful note that draws attention to important information.',\n },\n render: ({ id, variant, title, body }) => (\n <Callout variant={variant} title={title} body={body} testId={blockTestId(id)} />\n ),\n }\n\n // ── Media ───────────────────────────────────────────────────────────────────\n const ImageBlock: ComponentConfig = {\n label: 'Image',\n fields: {\n src: imageField('Image'),\n alt: textField('Alt text'),\n aspect: {\n type: 'radio',\n label: 'Aspect',\n options: [\n { label: '16:9', value: '16:9' },\n { label: '4:3', value: '4:3' },\n { label: '1:1', value: '1:1' },\n { label: '21:9', value: '21:9' },\n ],\n },\n rounded: {\n type: 'radio',\n label: 'Rounded',\n options: [\n { label: 'None', value: 'none' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n { label: 'Full', value: 'full' },\n ],\n },\n framed: boolRadio('Framed'),\n },\n defaultProps: { src: '', alt: 'Image', aspect: '16:9', rounded: 'lg', framed: false },\n render: ({ id, src, alt, aspect, rounded, framed }) => (\n <BlockImage\n src={src}\n alt={alt}\n aspect={aspect}\n rounded={rounded}\n framed={framed}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const AvatarBlockConfig: ComponentConfig = {\n label: 'Avatar',\n fields: {\n src: { type: 'text', label: 'Image URL' },\n name: textField('Name'),\n size: {\n type: 'radio',\n label: 'Size',\n options: [\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n { label: 'XL', value: 'xl' },\n ],\n },\n },\n defaultProps: { src: '', name: 'Jane Doe', size: 'md' },\n render: ({ id, src, name, size }) => (\n <AvatarBlock src={src} name={name} size={size} testId={blockTestId(id)} />\n ),\n }\n\n // ── Navigation ──────────────────────────────────────────────────────────────\n const NavbarBlock: ComponentConfig = {\n label: 'Navbar',\n fields: {\n brand: textField('Brand'),\n links: {\n type: 'array',\n label: 'Links',\n arrayFields: {\n label: textField('Label'),\n href: { type: 'text', label: 'Link' },\n },\n defaultItemProps: { label: 'Link', href: '#' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Link',\n },\n cta: ctaField('CTA'),\n },\n defaultProps: {\n brand: 'Acme',\n links: [\n { label: 'Product', href: '#' },\n { label: 'Pricing', href: '#' },\n { label: 'About', href: '#' },\n { label: 'Contact', href: '#' },\n ],\n cta: { label: 'Sign up', href: '#' },\n },\n render: ({ id, brand, links, cta }) => (\n <Navbar brand={brand} links={links} cta={cta} testId={blockTestId(id)} />\n ),\n }\n\n const FooterBlock: ComponentConfig = {\n label: 'Footer',\n fields: {\n columns: {\n type: 'array',\n label: 'Columns',\n arrayFields: {\n heading: textField('Heading'),\n links: {\n type: 'array',\n label: 'Links',\n arrayFields: {\n label: textField('Label'),\n href: { type: 'text', label: 'Link' },\n },\n defaultItemProps: { label: 'Link', href: '#' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Link',\n },\n },\n defaultItemProps: { heading: 'Column', links: [{ label: 'Link', href: '#' }] },\n getItemSummary: (item: { heading?: string }) => item?.heading || 'Column',\n },\n copyright: { type: 'text', label: 'Copyright' },\n },\n defaultProps: {\n columns: [\n {\n heading: 'Product',\n links: [\n { label: 'Features', href: '#' },\n { label: 'Pricing', href: '#' },\n ],\n },\n {\n heading: 'Company',\n links: [\n { label: 'About', href: '#' },\n { label: 'Careers', href: '#' },\n ],\n },\n {\n heading: 'Resources',\n links: [\n { label: 'Blog', href: '#' },\n { label: 'Docs', href: '#' },\n ],\n },\n {\n heading: 'Legal',\n links: [\n { label: 'Privacy', href: '#' },\n { label: 'Terms', href: '#' },\n ],\n },\n ],\n copyright: '© 2026 Acme, Inc. All rights reserved.',\n },\n render: ({ id, columns, copyright }) => (\n <Footer columns={columns} copyright={copyright} testId={blockTestId(id)} />\n ),\n }\n\n // ── Content ─────────────────────────────────────────────────────────────────\n const ListBlockConfig: ComponentConfig = {\n label: 'List',\n fields: {\n ordered: boolRadio('Ordered'),\n items: {\n type: 'array',\n label: 'Items',\n arrayFields: { text: textField('Text') },\n defaultItemProps: { text: 'List item' },\n getItemSummary: (item: { text?: string }) => item?.text || 'Item',\n },\n },\n defaultProps: {\n ordered: false,\n items: [{ text: 'First item' }, { text: 'Second item' }, { text: 'Third item' }],\n },\n render: ({ id, ordered, items }) => (\n <ListBlock ordered={ordered} items={items} testId={blockTestId(id)} />\n ),\n }\n\n return {\n Columns: ColumnsBlock,\n Spacer: SpacerBlock,\n Container: ContainerBlock,\n Hero: HeroBlock,\n FeatureGrid: FeatureGridBlock,\n StatGroup: StatGroupBlock,\n Testimonial: TestimonialBlock,\n CTABanner: CTABannerBlock,\n LogoCloud: LogoCloudBlock,\n FAQ: FAQBlock,\n RichText: RichTextBlockConfig,\n Callout: CalloutBlock,\n Image: ImageBlock,\n Avatar: AvatarBlockConfig,\n Navbar: NavbarBlock,\n Footer: FooterBlock,\n List: ListBlockConfig,\n }\n}\n","/**\n * The extended site-building block set — the richer vocabulary a builder needs to\n * assemble arbitrary sites beyond the marketing basics: pricing, tabs, accordion,\n * gallery, video, contact form, banner, split media, team, steps and a\n * multi-testimonial grid.\n *\n * Same contract as {@link createWebsiteBlocks}: serializable-only props, semantic\n * tokens (themes with the firm), a stable render-time `data-testid`, and sensible\n * defaults so each block looks right the moment it is dropped. Copy props route\n * through the shared {@link BlockKit} AI-or-plain fields.\n */\nimport type { ComponentConfig, Field } from '@measured/puck'\nimport type { BlockKit } from './blockKit'\nimport { PricingTable } from '../components/PricingTable'\nimport { Tabs } from '../components/Tabs'\nimport { Accordion } from '../components/Accordion'\nimport { Gallery } from '../components/Gallery'\nimport { VideoEmbed } from '../components/VideoEmbed'\nimport { ContactForm } from '../components/ContactForm'\nimport { Banner } from '../components/Banner'\nimport { MediaText } from '../components/MediaText'\nimport { TeamGrid } from '../components/TeamGrid'\nimport { Steps } from '../components/Steps'\nimport { TestimonialGrid } from '../components/TestimonialGrid'\n\n/** Split a newline-authored textarea into a trimmed, non-empty string list. */\nconst lines = (s: string | undefined): string[] =>\n (s ?? '')\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean)\n\nexport function createSiteBlocks(kit: BlockKit): Record<string, ComponentConfig> {\n const { textField, textareaField, imageField, boolRadio, blockTestId } = kit\n\n const ctaField = (label: string): Field => ({\n type: 'object',\n label,\n objectFields: {\n label: textField('Label'),\n href: { type: 'text', label: 'Link' },\n },\n })\n\n const columnsField = (values: string[]): Field => ({\n type: 'radio',\n label: 'Columns',\n options: values.map((v) => ({ label: v, value: v })),\n })\n\n // ── Commerce ──────────────────────────────────────────────────────────────────\n const PricingBlock: ComponentConfig = {\n label: 'Pricing',\n fields: {\n plans: {\n type: 'array',\n label: 'Plans',\n getItemSummary: (item: { name?: string }) => item?.name || 'Plan',\n defaultItemProps: {\n name: 'Plan',\n price: '£0',\n period: 'mo',\n description: '',\n features: 'Feature one\\nFeature two',\n ctaLabel: 'Choose',\n ctaHref: '#',\n featured: false,\n },\n arrayFields: {\n name: textField('Name'),\n price: { type: 'text', label: 'Price' },\n period: { type: 'text', label: 'Period' },\n description: textareaField('Description'),\n features: { type: 'textarea', label: 'Features (one per line)' },\n ctaLabel: { type: 'text', label: 'Button label' },\n ctaHref: { type: 'text', label: 'Button link' },\n featured: boolRadio('Featured'),\n },\n },\n },\n defaultProps: {\n plans: [\n {\n name: 'Starter',\n price: '£0',\n period: 'mo',\n description: 'For getting started.',\n features: 'Up to 3 projects\\nCommunity support',\n ctaLabel: 'Get started',\n ctaHref: '#',\n featured: false,\n },\n {\n name: 'Pro',\n price: '£29',\n period: 'mo',\n description: 'For growing teams.',\n features: 'Unlimited projects\\nPriority support\\nAdvanced analytics',\n ctaLabel: 'Start free trial',\n ctaHref: '#',\n featured: true,\n },\n {\n name: 'Enterprise',\n price: 'Custom',\n period: '',\n description: 'For large organisations.',\n features: 'SSO & SAML\\nDedicated success manager\\nSLA',\n ctaLabel: 'Contact sales',\n ctaHref: '#',\n featured: false,\n },\n ],\n },\n render: ({ id, plans }) => (\n <PricingTable\n plans={(plans ?? []).map(\n (p: {\n name: string\n price: string\n period?: string\n description?: string\n features?: string\n ctaLabel?: string\n ctaHref?: string\n featured?: boolean\n }) => ({\n name: p.name,\n price: p.price,\n period: p.period,\n description: p.description,\n features: lines(p.features),\n cta: { label: p.ctaLabel, href: p.ctaHref },\n featured: p.featured,\n })\n )}\n testId={blockTestId(id)}\n />\n ),\n }\n\n // ── Interactive ───────────────────────────────────────────────────────────────\n const TabsBlock: ComponentConfig = {\n label: 'Tabs',\n fields: {\n items: {\n type: 'array',\n label: 'Tabs',\n getItemSummary: (item: { label?: string }) => item?.label || 'Tab',\n defaultItemProps: { label: 'Tab', content: 'Tab content.' },\n arrayFields: {\n label: textField('Label'),\n content: textareaField('Content'),\n },\n },\n },\n defaultProps: {\n items: [\n { label: 'Overview', content: 'A quick overview of this section.' },\n { label: 'Details', content: 'The finer details go here.' },\n { label: 'FAQ', content: 'Answers to common questions.' },\n ],\n },\n render: ({ id, items }) => <Tabs items={items} testId={blockTestId(id)} />,\n }\n\n const AccordionBlock: ComponentConfig = {\n label: 'Accordion',\n fields: {\n allowMultiple: boolRadio('Allow multiple open'),\n items: {\n type: 'array',\n label: 'Items',\n getItemSummary: (item: { title?: string }) => item?.title || 'Item',\n defaultItemProps: { title: 'Section', content: 'Section content.' },\n arrayFields: {\n title: textField('Title'),\n content: textareaField('Content'),\n },\n },\n },\n defaultProps: {\n allowMultiple: false,\n items: [\n { title: 'What is included?', content: 'Everything you need to get started.' },\n { title: 'How does billing work?', content: 'Monthly or annually, cancel anytime.' },\n ],\n },\n render: ({ id, allowMultiple, items }) => (\n <Accordion allowMultiple={allowMultiple} items={items} testId={blockTestId(id)} />\n ),\n }\n\n // ── Media ───────────────────────────────────────────────────────────────────\n const GalleryBlock: ComponentConfig = {\n label: 'Gallery',\n fields: {\n columns: columnsField(['2', '3', '4']),\n aspect: {\n type: 'radio',\n label: 'Aspect',\n options: [\n { label: '1:1', value: '1:1' },\n { label: '4:3', value: '4:3' },\n { label: '16:9', value: '16:9' },\n ],\n },\n images: {\n type: 'array',\n label: 'Images',\n getItemSummary: (item: { alt?: string }) => item?.alt || 'Image',\n defaultItemProps: { src: '', alt: 'Image', caption: '' },\n arrayFields: {\n src: imageField('Image'),\n alt: { type: 'text', label: 'Alt text' },\n caption: { type: 'text', label: 'Caption' },\n },\n },\n },\n defaultProps: {\n columns: '3',\n aspect: '1:1',\n images: [\n { src: '', alt: 'Image one', caption: '' },\n { src: '', alt: 'Image two', caption: '' },\n { src: '', alt: 'Image three', caption: '' },\n ],\n },\n render: ({ id, columns, aspect, images }) => (\n <Gallery columns={columns} aspect={aspect} images={images} testId={blockTestId(id)} />\n ),\n }\n\n const VideoBlock: ComponentConfig = {\n label: 'Video',\n fields: {\n url: { type: 'text', label: 'Video URL (YouTube/Vimeo/Loom or file)' },\n title: { type: 'text', label: 'Title' },\n aspect: {\n type: 'radio',\n label: 'Aspect',\n options: [\n { label: '16:9', value: '16:9' },\n { label: '4:3', value: '4:3' },\n { label: '1:1', value: '1:1' },\n ],\n },\n rounded: boolRadio('Rounded'),\n },\n defaultProps: { url: '', title: '', aspect: '16:9', rounded: true },\n render: ({ id, url, title, aspect, rounded }) => (\n <VideoEmbed\n url={url}\n title={title}\n aspect={aspect}\n rounded={rounded}\n testId={blockTestId(id)}\n />\n ),\n }\n\n // ── Forms ───────────────────────────────────────────────────────────────────\n const ContactFormBlock: ComponentConfig = {\n label: 'Contact form',\n fields: {\n submitLabel: { type: 'text', label: 'Submit label' },\n action: { type: 'text', label: 'POST endpoint (optional)' },\n successMessage: textareaField('Success message'),\n fields: {\n type: 'array',\n label: 'Fields',\n getItemSummary: (item: { label?: string }) => item?.label || 'Field',\n defaultItemProps: { name: 'field', label: 'Field', type: 'text', required: false },\n arrayFields: {\n name: { type: 'text', label: 'Name attribute' },\n label: textField('Label'),\n type: {\n type: 'select',\n label: 'Type',\n options: [\n { label: 'Text', value: 'text' },\n { label: 'Email', value: 'email' },\n { label: 'Phone', value: 'tel' },\n { label: 'Multi-line', value: 'textarea' },\n ],\n },\n required: boolRadio('Required'),\n },\n },\n },\n defaultProps: {\n submitLabel: 'Send',\n action: '',\n successMessage: 'Thanks — we’ll be in touch shortly.',\n fields: [\n { name: 'name', label: 'Name', type: 'text', required: true },\n { name: 'email', label: 'Email', type: 'email', required: true },\n { name: 'message', label: 'Message', type: 'textarea', required: true },\n ],\n },\n render: ({ id, submitLabel, action, successMessage, fields }) => (\n <ContactForm\n submitLabel={submitLabel}\n action={action || undefined}\n successMessage={successMessage}\n fields={fields}\n testId={blockTestId(id)}\n />\n ),\n }\n\n // ── Marketing (extended) ──────────────────────────────────────────────────────\n const BannerBlock: ComponentConfig = {\n label: 'Banner',\n fields: {\n text: textField('Text'),\n cta: ctaField('CTA'),\n tone: {\n type: 'radio',\n label: 'Tone',\n options: [\n { label: 'Primary', value: 'primary' },\n { label: 'Muted', value: 'muted' },\n { label: 'Dark', value: 'ink' },\n ],\n },\n },\n defaultProps: {\n text: 'We just shipped something new.',\n cta: { label: 'Read more', href: '#' },\n tone: 'primary',\n },\n render: ({ id, text, cta, tone }) => (\n <Banner text={text} cta={cta} tone={tone} testId={blockTestId(id)} />\n ),\n }\n\n const MediaTextBlock: ComponentConfig = {\n label: 'Media & text',\n fields: {\n eyebrow: textField('Eyebrow'),\n title: textField('Title'),\n body: textareaField('Body', undefined, 'lead'),\n imageUrl: imageField('Image'),\n mediaSide: {\n type: 'radio',\n label: 'Media side',\n options: [\n { label: 'Left', value: 'left' },\n { label: 'Right', value: 'right' },\n ],\n },\n cta: ctaField('CTA'),\n },\n defaultProps: {\n eyebrow: '',\n title: 'A closer look at what we do.',\n body: 'Pair a compelling visual with the copy that explains it — the classic split section, on any theme.',\n imageUrl: '',\n mediaSide: 'left',\n cta: { label: 'Learn more', href: '#' },\n },\n render: ({ id, eyebrow, title, body, imageUrl, mediaSide, cta }) => (\n <MediaText\n eyebrow={eyebrow}\n title={title}\n body={body}\n imageUrl={imageUrl}\n mediaSide={mediaSide}\n cta={cta}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const TeamGridBlock: ComponentConfig = {\n label: 'Team',\n fields: {\n columns: columnsField(['2', '3', '4']),\n members: {\n type: 'array',\n label: 'Members',\n getItemSummary: (item: { name?: string }) => item?.name || 'Member',\n defaultItemProps: { name: 'New member', role: 'Role', bio: '', avatarUrl: '' },\n arrayFields: {\n name: textField('Name'),\n role: { type: 'text', label: 'Role' },\n bio: textareaField('Bio'),\n avatarUrl: { type: 'text', label: 'Avatar URL' },\n },\n },\n },\n defaultProps: {\n columns: '3',\n members: [\n { name: 'Alex Morgan', role: 'Founder & CEO', bio: '', avatarUrl: '' },\n { name: 'Sam Rivera', role: 'Head of Product', bio: '', avatarUrl: '' },\n { name: 'Jordan Lee', role: 'Lead Engineer', bio: '', avatarUrl: '' },\n ],\n },\n render: ({ id, columns, members }) => (\n <TeamGrid columns={columns} members={members} testId={blockTestId(id)} />\n ),\n }\n\n const StepsBlock: ComponentConfig = {\n label: 'Steps',\n fields: {\n variant: {\n type: 'radio',\n label: 'Style',\n options: [\n { label: 'Numbered', value: 'numbered' },\n { label: 'Timeline', value: 'timeline' },\n ],\n },\n steps: {\n type: 'array',\n label: 'Steps',\n getItemSummary: (item: { title?: string }) => item?.title || 'Step',\n defaultItemProps: { title: 'Step', description: 'Describe this step.' },\n arrayFields: {\n title: textField('Title'),\n description: textareaField('Description'),\n },\n },\n },\n defaultProps: {\n variant: 'numbered',\n steps: [\n { title: 'Sign up', description: 'Create your account in seconds.' },\n { title: 'Configure', description: 'Set things up to match your workflow.' },\n { title: 'Launch', description: 'Go live and start seeing results.' },\n ],\n },\n render: ({ id, variant, steps }) => (\n <Steps variant={variant} steps={steps} testId={blockTestId(id)} />\n ),\n }\n\n const TestimonialGridBlock: ComponentConfig = {\n label: 'Testimonial grid',\n fields: {\n columns: columnsField(['2', '3']),\n items: {\n type: 'array',\n label: 'Testimonials',\n getItemSummary: (item: { author?: string }) => item?.author || 'Testimonial',\n defaultItemProps: { quote: 'A great quote.', author: 'Author', role: '', avatarUrl: '' },\n arrayFields: {\n quote: textareaField('Quote'),\n author: textField('Author'),\n role: { type: 'text', label: 'Role' },\n avatarUrl: { type: 'text', label: 'Avatar URL' },\n },\n },\n },\n defaultProps: {\n columns: '3',\n items: [\n {\n quote: 'This changed how our whole team works.',\n author: 'Alex Morgan',\n role: 'CTO, Northwind',\n avatarUrl: '',\n },\n {\n quote: 'The best tool we adopted this year.',\n author: 'Sam Rivera',\n role: 'Ops Lead, Acme',\n avatarUrl: '',\n },\n {\n quote: 'Simple, fast, and it just works.',\n author: 'Jordan Lee',\n role: 'Founder, Globex',\n avatarUrl: '',\n },\n ],\n },\n render: ({ id, columns, items }) => (\n <TestimonialGrid columns={columns} items={items} testId={blockTestId(id)} />\n ),\n }\n\n return {\n Pricing: PricingBlock,\n Tabs: TabsBlock,\n Accordion: AccordionBlock,\n Gallery: GalleryBlock,\n Video: VideoBlock,\n ContactForm: ContactFormBlock,\n Banner: BannerBlock,\n MediaText: MediaTextBlock,\n Team: TeamGridBlock,\n Steps: StepsBlock,\n TestimonialGrid: TestimonialGridBlock,\n }\n}\n","/**\n * Shared Puck block registry for @arbidocs/blocks.\n *\n * {@link createArbiBlocksConfig} turns the package's shared components into a\n * single draggable builder palette (a Puck `Config`) so every consuming app gets\n * one shared block set instead of hand-rolling its own. It spans a full\n * website-building vocabulary: back-office data/content blocks plus marketing,\n * media, navigation and layout blocks (see {@link createWebsiteBlocks}).\n *\n * Cross-cutting rules baked in here:\n * - Copy props (\"title\", \"lead\", …) use the firm's AI \"Write with AI\" fields when\n * `opts.aiFields` is provided, else fall back to Puck's built-in text/textarea —\n * so the config works with or without an AI-configured firm.\n * - Icon props are a curated {@link iconMap} exposed as a `select`; the name is\n * resolved to a Lucide component at render.\n * - `className`/`testId` are never editor fields. A stable `data-testid` is derived\n * from each block's Puck id at render, so e2e locates by testid, never copy text.\n * - Container blocks (Section, Card, Columns, Container) expose children as Puck slots.\n */\nimport type { ReactNode } from 'react'\nimport type { ComponentConfig, Config, Field } from '@measured/puck'\nimport { Badge, Button, Card, Separator, cn } from '@arbidocs/react'\nimport { SectionHeading } from '../components/SectionHeading'\nimport { PageHeader } from '../components/PageHeader'\nimport { EmptyState } from '../components/EmptyState'\nimport { MetricCard } from '../components/MetricCard'\nimport { DataTableBlock, type DataTableBlockColumn } from '../components/DataTableBlock'\nimport { Section } from './Section'\nimport { createBlockKit, iconMap } from './blockKit'\nimport { createWebsiteBlocks } from './websiteBlocks'\nimport { createSiteBlocks } from './siteBlocks'\nimport { createLiveWidgets } from './widgets'\nimport type { AiFields } from './aiFields'\n\nexport interface ArbiBlocksConfigOptions {\n /**\n * Firm AI fields from {@link createAiFields}. When present, every string copy\n * prop becomes an AI-authorable field; when absent, plain Puck text inputs.\n */\n aiFields?: AiFields\n /**\n * Firm image field from {@link createImageField}. When present, image props\n * become a workspace-asset picker (pick / upload / URL / generate); when absent,\n * a plain URL text input.\n */\n imageField?: (label: string) => Field\n /**\n * Page canvas overrides. The builder paints every page inside this root; a\n * consumer sets e.g. a dark editorial canvas without forking the package.\n * Defaults to `bg-background text-foreground font-sans` on a neutral wrapper.\n */\n root?: {\n /** Extra classes appended to (and able to override) the default canvas classes. */\n className?: string\n /** testid for the page root wrapper. Defaults to `arbi-blocks-page-root`. */\n testId?: string\n }\n /**\n * Firm override for the eyebrow style on heading-bearing blocks (Hero, Section\n * heading) — e.g. a brand accent like a brass eyebrow. Undefined → token default.\n */\n eyebrowClassName?: string\n /**\n * Register the live-widget blocks (a \"Widgets\" category) that read shared ARBI\n * hooks — Agent activity, Live metric. They render placeholders in the editor\n * and on the public site, resolving real data only inside an authenticated\n * in-app renderer (`PageRenderer liveData`). Opt-in so a pure marketing builder\n * doesn't surface back-office widgets.\n */\n liveWidgets?: boolean\n}\n\n// Re-exported so consumers keep importing the icon registry from here.\nexport { iconMap }\n\n// Puck injects a component for each `slot` field at render; its default value is\n// an empty array. Shared here so slot-bearing blocks default to an empty drop zone.\nconst emptySlot = [] as unknown as ReactNode\n\n// Responsive grid presets for the MetricRow KPI band (keyed by authored column count).\nconst METRIC_COLS: Record<string, string> = {\n '2': 'sm:grid-cols-2',\n '3': 'sm:grid-cols-2 lg:grid-cols-3',\n '4': 'sm:grid-cols-2 lg:grid-cols-4',\n}\nconst METRIC_GAP: Record<string, string> = { sm: 'gap-3', md: 'gap-4', lg: 'gap-6' }\n\n// ── Factory ───────────────────────────────────────────────────────────────────\nexport function createArbiBlocksConfig(opts: ArbiBlocksConfigOptions = {}): Config {\n const kit = createBlockKit(opts.aiFields, opts.imageField, opts.eyebrowClassName)\n const { textField, textareaField, boolRadio, iconField, resolveIcon, blockTestId } = kit\n\n // Each block is declared with explicit prop typing so render args stay checked.\n\n const SectionHeadingBlock: ComponentConfig = {\n label: 'Section heading',\n fields: {\n title: textField('Title'),\n eyebrow: textField('Eyebrow'),\n lead: textareaField('Lead', undefined, 'lead'),\n align: {\n type: 'radio',\n label: 'Align',\n options: [\n { label: 'Left', value: 'left' },\n { label: 'Center', value: 'center' },\n ],\n },\n invert: boolRadio('Invert (on dark)'),\n },\n defaultProps: { title: 'Section title', align: 'left', invert: false },\n render: ({ id, title, eyebrow, lead, align, invert }) => (\n <div data-testid={blockTestId(id)}>\n <SectionHeading\n title={title}\n eyebrow={eyebrow}\n lead={lead}\n align={align}\n invert={invert}\n eyebrowClassName={kit.eyebrowClassName}\n />\n </div>\n ),\n }\n\n const PageHeaderBlock: ComponentConfig = {\n label: 'Page header',\n fields: {\n title: textField('Title'),\n eyebrow: textField('Eyebrow'),\n description: textareaField('Description', undefined, 'description'),\n // `actions` is a slot so the top band can host real buttons/badges authored\n // as blocks (drop a Button in), while the interactive body stays bespoke.\n actions: { type: 'slot', allow: ['Button', 'Badge'] },\n },\n defaultProps: { title: 'Page title', actions: emptySlot },\n render: ({ id, title, eyebrow, description, actions: Actions }) => (\n <PageHeader\n title={title}\n eyebrow={eyebrow}\n description={description}\n actions={<Actions className=\"flex items-center gap-2\" />}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const EmptyStateBlock: ComponentConfig = {\n label: 'Empty state',\n fields: {\n title: textField('Title'),\n description: textareaField('Description', undefined, 'description'),\n icon: iconField(),\n // `action` is a slot so an empty state can offer a real call-to-action button.\n action: { type: 'slot', allow: ['Button'] },\n },\n defaultProps: { title: 'Nothing here yet', action: emptySlot },\n render: ({ id, title, description, icon, action: Action }) => (\n <EmptyState\n title={title}\n description={description}\n icon={resolveIcon(icon)}\n action={<Action />}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const MetricCardBlock: ComponentConfig = {\n label: 'Metric card',\n fields: {\n label: { type: 'text', label: 'Label' },\n value: { type: 'text', label: 'Value' },\n hint: { type: 'text', label: 'Hint' },\n accent: {\n type: 'radio',\n label: 'Accent',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Primary', value: 'primary' },\n { label: 'Success', value: 'success' },\n { label: 'Muted', value: 'muted' },\n ],\n },\n delta: {\n type: 'object',\n label: 'Delta',\n objectFields: {\n value: { type: 'text', label: 'Value' },\n direction: {\n type: 'radio',\n label: 'Direction',\n options: [\n { label: 'Up', value: 'up' },\n { label: 'Down', value: 'down' },\n ],\n },\n good: boolRadio('Good'),\n },\n },\n icon: iconField(),\n },\n defaultProps: { label: 'Metric', value: '0', accent: 'default' },\n render: ({ id, label, value, hint, accent, delta, icon }) => (\n <MetricCard\n label={label}\n value={value}\n hint={hint}\n accent={accent}\n delta={delta}\n icon={resolveIcon(icon)}\n testId={blockTestId(id)}\n />\n ),\n }\n\n // A KPI band: a responsive grid whose cells are MetricCard blocks, so the top\n // of a page (dashboard/module header) is authored as config while the live body\n // stays bespoke. Slot-based (not a self-contained array) so it reuses the\n // MetricCard block verbatim — every card keeps its delta/icon/accent options.\n const MetricRowBlock: ComponentConfig = {\n label: 'Metric row',\n fields: {\n columns: {\n type: 'radio',\n label: 'Columns',\n options: [\n { label: '2', value: '2' },\n { label: '3', value: '3' },\n { label: '4', value: '4' },\n ],\n },\n gap: {\n type: 'radio',\n label: 'Gap',\n options: [\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n ],\n },\n // Static KPI tiles and (when registered) live metric widgets both belong in a band.\n items: { type: 'slot', allow: ['MetricCard', 'LiveMetric'] },\n },\n defaultProps: { columns: '3', gap: 'md', items: emptySlot },\n render: ({ id, columns, gap, items: Items }) => (\n <div data-testid={blockTestId(id)}>\n <Items\n className={cn(\n 'grid grid-cols-1',\n METRIC_COLS[columns as string] ?? METRIC_COLS['3'],\n METRIC_GAP[gap as string] ?? METRIC_GAP.md\n )}\n />\n </div>\n ),\n }\n\n // Serializable table. `columns` is a flat schema (header/field/align). `rows` is a\n // Puck array of rows, each holding a nested array of string `cells` — genuinely\n // per-cell authorable and decoupled from column count (Puck objectFields are\n // static, so keying rows by an author-chosen `field` is impossible). Cells map to\n // columns by position at render, where they're rekeyed to the field-keyed records\n // {@link DataTableBlock} expects.\n const DataTableBlockConfig: ComponentConfig = {\n label: 'Data table',\n fields: {\n caption: textField('Caption'),\n columns: {\n type: 'array',\n label: 'Columns',\n arrayFields: {\n header: { type: 'text', label: 'Header' },\n field: { type: 'text', label: 'Field key' },\n align: {\n type: 'radio',\n label: 'Align',\n options: [\n { label: 'Left', value: 'left' },\n { label: 'Right', value: 'right' },\n { label: 'Center', value: 'center' },\n ],\n },\n },\n defaultItemProps: { header: 'Column', field: 'field', align: 'left' },\n getItemSummary: (item: DataTableBlockColumn) => item?.header || 'Column',\n },\n rows: {\n type: 'array',\n label: 'Rows',\n arrayFields: {\n cells: {\n type: 'array',\n label: 'Cells',\n arrayFields: {\n value: { type: 'text', label: 'Value' },\n },\n defaultItemProps: { value: '' },\n getItemSummary: (item: { value?: string }) => item?.value || 'Cell',\n },\n },\n defaultItemProps: { cells: [{ value: '' }, { value: '' }] },\n getItemSummary: (_item: unknown, i?: number) => `Row ${(i ?? 0) + 1}`,\n },\n emptyText: textField('Empty text'),\n },\n defaultProps: {\n columns: [\n { header: 'Matter', field: 'matter', align: 'left' },\n { header: 'Status', field: 'status', align: 'left' },\n ],\n rows: [\n { cells: [{ value: 'Acme v. Globex' }, { value: 'Active' }] },\n { cells: [{ value: 'Initech Merger' }, { value: 'Closed' }] },\n ],\n emptyText: 'No rows yet',\n },\n render: ({ id, columns, rows, caption, emptyText }) => {\n const cols = (columns ?? []) as DataTableBlockColumn[]\n const rawRows = (rows ?? []) as Array<{ cells?: Array<{ value?: string }> }>\n // Positional cells → field-keyed record, so DataTableBlock can look cells up by column field.\n const recordRows = rawRows.map((row) => {\n const record: Record<string, string> = {}\n cols.forEach((col, index) => {\n record[col.field || `col-${index}`] = row.cells?.[index]?.value ?? ''\n })\n return record\n })\n const normalisedCols = cols.map((col, index) => ({\n ...col,\n field: col.field || `col-${index}`,\n }))\n return (\n <DataTableBlock\n columns={normalisedCols}\n rows={recordRows}\n caption={caption}\n emptyText={emptyText}\n testId={blockTestId(id)}\n />\n )\n },\n }\n\n const SectionBlock: ComponentConfig = {\n label: 'Section',\n fields: {\n children: { type: 'slot' },\n tone: {\n type: 'radio',\n label: 'Tone',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Muted', value: 'muted' },\n { label: 'Dark', value: 'ink' },\n ],\n },\n padding: {\n type: 'radio',\n label: 'Padding',\n options: [\n { label: 'None', value: 'none' },\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n ],\n },\n maxWidth: {\n type: 'radio',\n label: 'Width',\n options: [\n { label: 'Narrow', value: 'narrow' },\n { label: 'Default', value: 'default' },\n { label: 'Wide', value: 'wide' },\n { label: 'Full', value: 'full' },\n ],\n },\n texture: boolRadio('Texture'),\n },\n defaultProps: {\n tone: 'default',\n padding: 'md',\n maxWidth: 'default',\n texture: false,\n children: [] as unknown as ReactNode,\n },\n render: ({ id, tone, padding, maxWidth, texture, children: Children }) => (\n <div data-testid={blockTestId(id)}>\n <Section tone={tone} padding={padding} maxWidth={maxWidth} texture={texture}>\n <Children />\n </Section>\n </div>\n ),\n }\n\n const CardBlock: ComponentConfig = {\n label: 'Card',\n fields: {\n variant: {\n type: 'select',\n label: 'Variant',\n options: [\n { label: 'Flat', value: 'flat' },\n { label: 'Outline', value: 'outline' },\n { label: 'Elevated', value: 'elevated' },\n ],\n },\n children: { type: 'slot' },\n },\n defaultProps: { variant: 'flat', children: [] as unknown as ReactNode },\n render: ({ id, variant, children: Children }) => (\n <Card variant={variant} className=\"p-5\" data-testid={blockTestId(id)}>\n <Children />\n </Card>\n ),\n }\n\n const ButtonBlock: ComponentConfig = {\n label: 'Button',\n fields: {\n children: { type: 'text', label: 'Label' },\n variant: {\n type: 'select',\n label: 'Variant',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Accent', value: 'accent' },\n { label: 'Destructive', value: 'destructive' },\n { label: 'Outline', value: 'outline' },\n { label: 'Secondary', value: 'secondary' },\n { label: 'Ghost', value: 'ghost' },\n { label: 'Link', value: 'link' },\n ],\n },\n size: {\n type: 'select',\n label: 'Size',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Small', value: 'sm' },\n { label: 'Large', value: 'lg' },\n { label: 'Icon', value: 'icon' },\n ],\n },\n },\n defaultProps: { variant: 'default', size: 'default', children: 'Button' },\n render: ({ id, children, variant, size }) => (\n <Button variant={variant} size={size} data-testid={blockTestId(id)}>\n {children}\n </Button>\n ),\n }\n\n const BadgeBlock: ComponentConfig = {\n label: 'Badge',\n fields: {\n text: { type: 'text', label: 'Text' },\n variant: {\n type: 'select',\n label: 'Variant',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Accent', value: 'accent' },\n { label: 'Secondary', value: 'secondary' },\n { label: 'Destructive', value: 'destructive' },\n { label: 'Outline', value: 'outline' },\n ],\n },\n },\n defaultProps: { text: 'Badge', variant: 'default' },\n render: ({ id, text, variant }) => (\n <Badge variant={variant} data-testid={blockTestId(id)}>\n {text}\n </Badge>\n ),\n }\n\n const SeparatorBlock: ComponentConfig = {\n label: 'Separator',\n fields: {},\n defaultProps: {},\n render: ({ id }) => <Separator data-testid={blockTestId(id)} />,\n }\n\n const website = createWebsiteBlocks(kit)\n const site = createSiteBlocks(kit)\n const widgets = opts.liveWidgets ? createLiveWidgets(kit) : {}\n\n const components = {\n SectionHeading: SectionHeadingBlock,\n PageHeader: PageHeaderBlock,\n EmptyState: EmptyStateBlock,\n MetricCard: MetricCardBlock,\n MetricRow: MetricRowBlock,\n DataTable: DataTableBlockConfig,\n Section: SectionBlock,\n Card: CardBlock,\n Button: ButtonBlock,\n Badge: BadgeBlock,\n Separator: SeparatorBlock,\n ...website,\n ...site,\n ...widgets,\n }\n\n const config: Config = {\n categories: {\n Layout: {\n title: 'Layout',\n components: ['Section', 'Container', 'Columns', 'Card', 'Spacer'],\n },\n Marketing: {\n title: 'Marketing',\n components: [\n 'Hero',\n 'FeatureGrid',\n 'StatGroup',\n 'Testimonial',\n 'TestimonialGrid',\n 'CTABanner',\n 'Banner',\n 'LogoCloud',\n 'FAQ',\n 'MediaText',\n 'Steps',\n 'Team',\n ],\n },\n Content: {\n title: 'Content',\n components: ['SectionHeading', 'PageHeader', 'EmptyState', 'RichText', 'Callout', 'List'],\n },\n Interactive: { title: 'Interactive', components: ['Tabs', 'Accordion'] },\n Media: { title: 'Media', components: ['Image', 'Avatar', 'Gallery', 'Video'] },\n Commerce: { title: 'Commerce', components: ['Pricing'] },\n Forms: { title: 'Forms', components: ['ContactForm'] },\n Navigation: { title: 'Navigation', components: ['Navbar', 'Footer'] },\n Data: { title: 'Data', components: ['MetricRow', 'MetricCard', 'DataTable'] },\n ...(opts.liveWidgets\n ? { Widgets: { title: 'Widgets', components: ['AgentActivity', 'LiveMetric'] } }\n : {}),\n Primitives: { title: 'Primitives', components: ['Button', 'Badge', 'Separator'] },\n },\n components: components as Config['components'],\n root: {\n render: ({ children }: { children?: ReactNode }) => (\n <div\n className={cn('bg-background text-foreground font-sans', opts.root?.className)}\n data-testid={opts.root?.testId ?? 'arbi-blocks-page-root'}\n >\n {children}\n </div>\n ),\n },\n }\n\n return config\n}\n","/**\n * Module registry — a typed model of the back-office modules derived from a\n * firm's canonical nav. We read the nav rather than re-declaring it so the\n * registry can never drift from the shipped nav (DRY). The builder\n * toggles/reorders these; the sidebar can consume the result via the module\n * store's `useEnabledNav()` without any nav data being duplicated here.\n */\nimport type { AppNavItem, AppNavSection } from '../../nav/types'\nimport type { BuilderModule, ModuleRegistry } from './types'\n\n/** Build a registry from a firm's nav manifest. */\nexport function createModuleRegistry(appNav: AppNavSection[]): ModuleRegistry {\n /** Flattened, ordered registry built once from appNav. */\n const DEFAULT_MODULES: BuilderModule[] = appNav.flatMap((section, sIdx) =>\n section.items.map((item, iIdx) => ({\n id: item.id,\n label: item.label,\n section: section.heading,\n icon: item.icon,\n to: item.to,\n arbi: item.arbi ?? false,\n end: item.end ?? false,\n // Global order that preserves section grouping then in-section order.\n defaultOrder: sIdx * 100 + iIdx,\n }))\n )\n\n /** Section headings in their canonical order. */\n const SECTION_ORDER: string[] = appNav.map((s) => s.heading)\n\n /** Rebuild an AppNavItem from a registry entry (shape the sidebar consumes). */\n const toNavItem = (m: BuilderModule): AppNavItem => ({\n to: m.to,\n label: m.label,\n icon: m.icon,\n id: m.id,\n arbi: m.arbi || undefined,\n end: m.end || undefined,\n })\n\n return { DEFAULT_MODULES, SECTION_ORDER, toNavItem }\n}\n","/**\n * Module toggle/order store — pure config state (which modules the vertical\n * ships, and in what order), persisted to localStorage. Defaults are empty so\n * every existing module stays enabled in its canonical position — nothing in\n * the app breaks until an admin opts to change it.\n *\n * Firm-agnostic: {@link createModuleStore} closes the store + hooks over an\n * injected registry and storage key.\n */\nimport { useMemo } from 'react'\nimport { create, type StoreApi, type UseBoundStore } from 'zustand'\nimport { persist } from 'zustand/middleware'\nimport type { AppNavSection } from '../../nav/types'\nimport type { BuilderModule, ModuleRegistry, ResolvedModule } from './types'\n\ninterface ModuleOverride {\n enabled: boolean\n /** Effective order within the section. */\n order: number\n}\n\ninterface ModuleStore {\n /** Sparse overrides keyed by module id; absent → registry default. */\n overrides: Record<string, ModuleOverride>\n toggle: (id: string) => void\n /** Move a module up/down among its enabled+disabled section siblings. */\n move: (id: string, dir: 'up' | 'down') => void\n reset: () => void\n}\n\nexport interface ModuleStoreBundle {\n useModuleStore: UseBoundStore<StoreApi<ModuleStore>>\n useResolvedModules: () => { section: string; modules: ResolvedModule[] }[]\n useEnabledNav: () => AppNavSection[]\n}\n\nexport function createModuleStore({\n registry,\n storageKey,\n}: {\n registry: ModuleRegistry\n storageKey: string\n}): ModuleStoreBundle {\n const { DEFAULT_MODULES, SECTION_ORDER, toNavItem } = registry\n\n /** Effective enabled flag for a module given the current overrides. */\n function isEnabled(overrides: Record<string, ModuleOverride>, id: string): boolean {\n return overrides[id]?.enabled ?? true\n }\n\n const id = (m: BuilderModule) => m.id\n\n /** Effective order for a module (override wins, else its default position). */\n function orderOf(overrides: Record<string, ModuleOverride>, m: BuilderModule): number {\n return overrides[id(m)]?.order ?? m.defaultOrder\n }\n\n const useModuleStore = create<ModuleStore>()(\n persist(\n (set, get) => ({\n overrides: {},\n\n toggle: (moduleId) => {\n const m = DEFAULT_MODULES.find((x) => x.id === moduleId)\n if (!m) return\n const cur = get().overrides\n const prev = cur[moduleId] ?? { enabled: true, order: m.defaultOrder }\n set({\n overrides: { ...cur, [moduleId]: { ...prev, enabled: !isEnabled(cur, moduleId) } },\n })\n },\n\n move: (moduleId, dir) => {\n const cur = get().overrides\n const target = DEFAULT_MODULES.find((x) => x.id === moduleId)\n if (!target) return\n // Siblings in the same section, in current effective order.\n const siblings = DEFAULT_MODULES.filter((x) => x.section === target.section).sort(\n (a, b) => orderOf(cur, a) - orderOf(cur, b)\n )\n const idx = siblings.findIndex((x) => x.id === moduleId)\n const swapIdx = dir === 'up' ? idx - 1 : idx + 1\n if (swapIdx < 0 || swapIdx >= siblings.length) return\n const a = siblings[idx]\n const b = siblings[swapIdx]\n const next = { ...cur }\n // Persist both siblings' effective orders, swapped.\n next[a.id] = { enabled: isEnabled(cur, a.id), order: orderOf(cur, b) }\n next[b.id] = { enabled: isEnabled(cur, b.id), order: orderOf(cur, a) }\n set({ overrides: next })\n },\n\n reset: () => set({ overrides: {} }),\n }),\n { name: storageKey }\n )\n )\n\n /** The full registry resolved against overrides, grouped + sorted by section. */\n function useResolvedModules(): { section: string; modules: ResolvedModule[] }[] {\n const overrides = useModuleStore((s) => s.overrides)\n return useMemo(() => {\n return SECTION_ORDER.map((section) => ({\n section,\n modules: DEFAULT_MODULES.filter((m) => m.section === section)\n .map((m) => ({ ...m, enabled: isEnabled(overrides, m.id), order: orderOf(overrides, m) }))\n .sort((a, b) => a.order - b.order),\n }))\n }, [overrides])\n }\n\n /**\n * The filtered/ordered nav the sidebar COULD consume — same shape as `appNav`.\n * One-line integration in AppSidebar: `const nav = useEnabledNav()` then map\n * over `nav` instead of the imported `appNav`.\n */\n function useEnabledNav(): AppNavSection[] {\n const grouped = useResolvedModules()\n return useMemo(\n () =>\n grouped\n .map((g) => ({\n heading: g.section,\n items: g.modules.filter((m) => m.enabled).map(toNavItem),\n }))\n .filter((s) => s.items.length > 0),\n [grouped]\n )\n }\n\n return { useModuleStore, useResolvedModules, useEnabledNav }\n}\n","/**\n * Agent-selection store — which ARBI behaviour configurations and agents the\n * firm marks \"active\" for this vertical. Pure selection state (the configs and\n * agents themselves come live from ARBI via React Query), persisted so the\n * choice seeds the exported vertical config.\n *\n * Firm-agnostic: {@link createAgentSelectionStore} parameterises the persist key.\n */\nimport { create, type StoreApi, type UseBoundStore } from 'zustand'\nimport { persist } from 'zustand/middleware'\n\nexport interface AgentSelectionStore {\n /** Configuration ext_ids marked active. */\n configIds: string[]\n /** Agent ext_ids marked active. */\n agentIds: string[]\n toggleConfig: (id: string) => void\n toggleAgent: (id: string) => void\n clear: () => void\n}\n\nconst toggle = (list: string[], id: string) =>\n list.includes(id) ? list.filter((x) => x !== id) : [...list, id]\n\nexport function createAgentSelectionStore({\n storageKey,\n}: {\n storageKey: string\n}): UseBoundStore<StoreApi<AgentSelectionStore>> {\n return create<AgentSelectionStore>()(\n persist(\n (set) => ({\n configIds: [],\n agentIds: [],\n toggleConfig: (id) => set((s) => ({ configIds: toggle(s.configIds, id) })),\n toggleAgent: (id) => set((s) => ({ agentIds: toggle(s.agentIds, id) })),\n clear: () => set({ configIds: [], agentIds: [] }),\n }),\n { name: storageKey }\n )\n )\n}\n","/**\n * Vertical-config export — combine the configured theme, enabled/ordered\n * modules and selected ARBI agent configs into one JSON document. This is the\n * seed a generator would consume to stamp out a new vertical app.\n *\n * Firm-agnostic: {@link createVerticalExport} closes over the theme/module/agent\n * stores and the module registry.\n */\nimport type { StoreApi, UseBoundStore } from 'zustand'\nimport type { ThemeState } from '../theme/store'\nimport type { ModuleRegistry } from './modules/types'\nimport type { ModuleStoreBundle } from './modules/store'\nimport type { AgentSelectionStore } from './agents/store'\nimport type { ExportedModule, VerticalConfig } from './types'\n\nexport interface VerticalExportConfig {\n vertical: { name: string; key: string }\n themeStore: UseBoundStore<StoreApi<ThemeState>>\n moduleStore: ModuleStoreBundle\n agentStore: UseBoundStore<StoreApi<AgentSelectionStore>>\n registry: ModuleRegistry\n}\n\nexport interface VerticalExport {\n buildVerticalConfig: () => VerticalConfig\n serialize: (cfg?: VerticalConfig) => string\n download: (cfg?: VerticalConfig) => void\n}\n\nexport function createVerticalExport(cfg: VerticalExportConfig): VerticalExport {\n const { vertical, themeStore, moduleStore, agentStore, registry } = cfg\n const { DEFAULT_MODULES, SECTION_ORDER } = registry\n\n /** Build the export payload from current store state (pure, side-effect free). */\n function buildVerticalConfig(): VerticalConfig {\n const { colors, fonts, radius } = themeStore.getState()\n const { overrides } = moduleStore.useModuleStore.getState()\n const { configIds, agentIds } = agentStore.getState()\n\n const modules: ExportedModule[] = DEFAULT_MODULES.map((m) => ({\n id: m.id,\n label: m.label,\n section: m.section,\n to: m.to,\n arbi: m.arbi,\n enabled: overrides[m.id]?.enabled ?? true,\n order: overrides[m.id]?.order ?? m.defaultOrder,\n })).sort(\n (a, b) =>\n SECTION_ORDER.indexOf(a.section) - SECTION_ORDER.indexOf(b.section) || a.order - b.order\n )\n\n return {\n version: 1,\n generatedAt: new Date().toISOString(),\n vertical,\n theme: { colors, fonts, radius },\n modules,\n agents: { configIds, agentIds },\n }\n }\n\n /** Serialise the export as pretty JSON. */\n function serialize(config: VerticalConfig = buildVerticalConfig()): string {\n return JSON.stringify(config, null, 2)\n }\n\n /** Trigger a browser download of the vertical config JSON. */\n function download(config: VerticalConfig = buildVerticalConfig()): void {\n const blob = new Blob([serialize(config)], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${config.vertical.key}-vertical.json`\n document.body.appendChild(a)\n a.click()\n a.remove()\n URL.revokeObjectURL(url)\n }\n\n return { buildVerticalConfig, serialize, download }\n}\n","/**\n * Module registry UI — enable/disable and reorder the vertical's modules.\n * Firm-agnostic: consumes an injected module-store bundle instead of a\n * singleton, so every firm app drives its own registry through the same UI.\n */\nimport { ChevronUp, ChevronDown, RotateCcw, Sparkles } from 'lucide-react'\nimport { Card, CardContent, CardHeader, CardTitle, Button, Badge } from '@arbidocs/react'\nimport { Switch } from '@arbidocs/react'\nimport { tid } from '../lib/testid'\nimport type { ModuleStoreBundle } from './modules/store'\n\nexport interface ModuleManagerProps {\n store: ModuleStoreBundle\n testIdPrefix?: string\n}\n\nexport function ModuleManager({ store, testIdPrefix = 'builder' }: ModuleManagerProps) {\n const grouped = store.useResolvedModules()\n const toggle = store.useModuleStore((s) => s.toggle)\n const move = store.useModuleStore((s) => s.move)\n const reset = store.useModuleStore((s) => s.reset)\n\n const enabledCount = grouped.reduce((n, g) => n + g.modules.filter((m) => m.enabled).length, 0)\n const total = grouped.reduce((n, g) => n + g.modules.length, 0)\n\n return (\n <div className=\"space-y-5\" data-testid={`${testIdPrefix}-modules`}>\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-muted-foreground\" data-testid={`${testIdPrefix}-modules-count`}>\n {enabledCount} of {total} modules enabled\n </p>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={reset}\n data-testid={`${testIdPrefix}-modules-reset`}\n >\n <RotateCcw className=\"size-3.5\" /> Reset\n </Button>\n </div>\n\n {grouped.map((group) => (\n <Card\n key={group.section}\n variant=\"elevated\"\n className=\"rounded-xl\"\n data-testid={tid(`${testIdPrefix}-modules-section`, group.section)}\n >\n <CardHeader>\n <CardTitle className=\"text-base\">{group.section}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-1.5\">\n {group.modules.map((m, idx) => {\n const Icon = m.icon\n return (\n <div\n key={m.id}\n className=\"flex items-center gap-3 rounded-md border border-border/60 bg-card px-3 py-2\"\n data-testid={tid(`${testIdPrefix}-module`, m.id)}\n >\n <div className=\"flex flex-col\">\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-6\"\n disabled={idx === 0}\n onClick={() => move(m.id, 'up')}\n aria-label={`Move ${m.label} up`}\n data-testid={tid(`${testIdPrefix}-module-up`, m.id)}\n >\n <ChevronUp className=\"size-3.5\" />\n </Button>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-6\"\n disabled={idx === group.modules.length - 1}\n onClick={() => move(m.id, 'down')}\n aria-label={`Move ${m.label} down`}\n data-testid={tid(`${testIdPrefix}-module-down`, m.id)}\n >\n <ChevronDown className=\"size-3.5\" />\n </Button>\n </div>\n <Icon className=\"size-4 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">{m.label}</p>\n <p className=\"truncate font-mono text-[11px] text-muted-foreground\">{m.to}</p>\n </div>\n {m.arbi && (\n <Badge variant=\"accent\" className=\"text-[10px]\">\n <Sparkles className=\"size-3\" /> ARBI\n </Badge>\n )}\n <Switch\n checked={m.enabled}\n onCheckedChange={() => toggle(m.id)}\n aria-label={`Enable ${m.label}`}\n data-testid={tid(`${testIdPrefix}-module-toggle`, m.id)}\n />\n </div>\n )\n })}\n </CardContent>\n </Card>\n ))}\n </div>\n )\n}\n","/**\n * Agent/behaviour surface — select which ARBI configs and agents are active for\n * the vertical. Firm-agnostic: consumes an injected agent-selection store; the\n * configs and agents themselves come live from ARBI via React Query.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport type { StoreApi, UseBoundStore } from 'zustand'\nimport {\n useArbi,\n useAgents,\n useConfigs,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Badge,\n} from '@arbidocs/react'\nimport { Bot, BrainCircuit, Cpu } from 'lucide-react'\nimport { Checkbox } from '@arbidocs/react'\nimport { tid } from '../lib/testid'\nimport type { AgentSelectionStore } from './agents/store'\n\ntype AgentStore = UseBoundStore<StoreApi<AgentSelectionStore>>\n\ntype BadgeVariant = 'default' | 'accent' | 'secondary'\n\n/** Colour the model tier so Premium/Wise read at a glance. */\nconst TIER_VARIANT: Record<string, BadgeVariant> = {\n Premium: 'default',\n Wise: 'accent',\n Fast: 'secondary',\n auto: 'secondary',\n}\n\n/**\n * The model tier lives inside a configuration's `Agents.AGENT_MODEL_NAME`\n * (auto|Fast|Wise|Premium) — NOT the list response — so we fetch the config\n * detail lazily. This is the tier, distinct from the assistant query `model`\n * field (which carries a configuration ext_id, not a tier).\n */\nfunction ConfigModelBadge({ configId, testIdPrefix }: { configId: string; testIdPrefix: string }) {\n const arbi = useArbi()\n const { data, isLoading, isError } = useQuery({\n queryKey: ['builder', 'config-model', configId],\n queryFn: async () => (await arbi.agentConfig.get(configId)).Agents.AGENT_MODEL_NAME,\n staleTime: 60_000,\n })\n const tier = isLoading ? '…' : isError || !data ? '—' : data\n return (\n <Badge\n variant={TIER_VARIANT[tier] ?? 'secondary'}\n data-testid={tid(`${testIdPrefix}-agents-config-tier`, configId)}\n >\n <Cpu className=\"size-3\" /> {tier}\n </Badge>\n )\n}\n\nexport interface AgentsPanelProps {\n store: AgentStore\n testIdPrefix?: string\n}\n\nexport function AgentsPanel({ store, testIdPrefix = 'builder' }: AgentsPanelProps) {\n const { data: configs, isLoading: configsLoading } = useConfigs()\n const { data: agents = [], isLoading: agentsLoading } = useAgents()\n const configIds = store((s) => s.configIds)\n const agentIds = store((s) => s.agentIds)\n const toggleConfig = store((s) => s.toggleConfig)\n const toggleAgent = store((s) => s.toggleAgent)\n\n const versions = configs?.versions ?? []\n\n return (\n <div className=\"space-y-6\" data-testid={`${testIdPrefix}-agents`}>\n {/* Behaviour configurations */}\n <Card\n variant=\"elevated\"\n className=\"rounded-xl\"\n data-testid={`${testIdPrefix}-agents-configs`}\n >\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <BrainCircuit className=\"size-4 text-primary\" /> Behaviour configurations\n <Badge variant=\"secondary\" className=\"ml-1\">\n {versions.length}\n </Badge>\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-1.5\">\n {configsLoading && (\n <p className=\"text-sm text-muted-foreground\">Loading configurations…</p>\n )}\n {!configsLoading && versions.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">\n No configurations found on this workspace.\n </p>\n )}\n {versions.map((v) => (\n <label\n key={v.external_id}\n className=\"flex cursor-pointer items-center gap-3 rounded-md border border-border/60 bg-card px-3 py-2\"\n data-testid={tid(`${testIdPrefix}-agents-config`, v.external_id)}\n >\n <Checkbox\n checked={configIds.includes(v.external_id)}\n onCheckedChange={() => toggleConfig(v.external_id)}\n data-testid={tid(`${testIdPrefix}-agents-config-toggle`, v.external_id)}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">\n {v.title ?? 'Untitled behaviour'}\n </p>\n <p className=\"truncate font-mono text-[11px] text-muted-foreground\">\n {v.external_id}\n </p>\n </div>\n <ConfigModelBadge configId={v.external_id} testIdPrefix={testIdPrefix} />\n </label>\n ))}\n </CardContent>\n </Card>\n\n {/* Agents */}\n <Card variant=\"elevated\" className=\"rounded-xl\" data-testid={`${testIdPrefix}-agents-agents`}>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Bot className=\"size-4 text-primary\" /> Agents\n <Badge variant=\"secondary\" className=\"ml-1\">\n {agents.length}\n </Badge>\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-1.5\">\n {agentsLoading && <p className=\"text-sm text-muted-foreground\">Loading agents…</p>}\n {!agentsLoading && agents.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">No agents provisioned.</p>\n )}\n {agents.map((a) => (\n <label\n key={a.external_id}\n className=\"flex cursor-pointer items-center gap-3 rounded-md border border-border/60 bg-card px-3 py-2\"\n data-testid={tid(`${testIdPrefix}-agents-agent`, a.external_id)}\n >\n <Checkbox\n checked={agentIds.includes(a.external_id)}\n onCheckedChange={() => toggleAgent(a.external_id)}\n data-testid={tid(`${testIdPrefix}-agents-agent-toggle`, a.external_id)}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">\n {(a.given_name ?? 'Agent').replace(/-/g, ' ')}\n </p>\n <p className=\"truncate font-mono text-[11px] text-muted-foreground\">\n {a.external_id}\n </p>\n </div>\n </label>\n ))}\n </CardContent>\n </Card>\n </div>\n )\n}\n","/**\n * VerticalBuilder — the back-office surface that configures a firm's vertical:\n * theme tokens, which modules ship (and in what order) and which ARBI\n * behaviours/agents are active. Not a page builder — it produces a\n * vertical-config seed.\n *\n * Firm-agnostic: the theme bundle, module/agent stores and exporter arrive as\n * props; the firm supplies its own `header` (PageHeader + links + badges) so\n * app-specific routing stays in the app.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport { Download, Palette, LayoutGrid, Bot, FileJson } from 'lucide-react'\nimport type { StoreApi, UseBoundStore } from 'zustand'\nimport { Card, CardContent, CardHeader, CardTitle, Button } from '@arbidocs/react'\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '@arbidocs/react'\nimport { ThemeEditor } from '../theme/ThemeEditor'\nimport type { ThemeBundle } from '../theme/store'\nimport { ModuleManager } from './ModuleManager'\nimport { AgentsPanel } from './AgentsPanel'\nimport type { ModuleStoreBundle } from './modules/store'\nimport type { AgentSelectionStore } from './agents/store'\nimport type { VerticalExport } from './export'\n\ntype AgentStore = UseBoundStore<StoreApi<AgentSelectionStore>>\n\nexport interface VerticalBuilderProps {\n themeBundle: ThemeBundle\n moduleStore: ModuleStoreBundle\n agentStore: AgentStore\n exporter: VerticalExport\n themePreview: { title: string; subtitle?: string }\n header?: ReactNode\n studioHref?: string\n testIdPrefix?: string\n}\n\n/** Export tab — a live JSON preview of the combined vertical config + download. */\nfunction ExportPanel({\n themeBundle,\n moduleStore,\n agentStore,\n exporter,\n testIdPrefix,\n}: {\n themeBundle: ThemeBundle\n moduleStore: ModuleStoreBundle\n agentStore: AgentStore\n exporter: VerticalExport\n testIdPrefix: string\n}) {\n // Subscribe to each store so the preview recomputes as the admin edits.\n const theme = themeBundle.useStore()\n const modules = moduleStore.useModuleStore()\n const agents = agentStore()\n const json = useMemo(() => exporter.serialize(), [theme, modules, agents, exporter])\n\n return (\n <Card variant=\"elevated\" className=\"rounded-xl\" data-testid={`${testIdPrefix}-export-panel`}>\n <CardHeader>\n <CardTitle className=\"flex items-center justify-between text-base\">\n <span className=\"flex items-center gap-2\">\n <FileJson className=\"size-4 text-primary\" /> Vertical config\n </span>\n <Button\n size=\"sm\"\n variant=\"accent\"\n onClick={() => exporter.download()}\n data-testid={`${testIdPrefix}-export`}\n >\n <Download className=\"size-4\" /> Download JSON\n </Button>\n </CardTitle>\n </CardHeader>\n <CardContent>\n <pre\n className=\"scrollbar-slim max-h-[520px] overflow-auto rounded-md bg-foreground p-4 font-mono text-[11px] leading-relaxed text-background\"\n data-testid={`${testIdPrefix}-export-preview`}\n >\n {json}\n </pre>\n </CardContent>\n </Card>\n )\n}\n\nexport function VerticalBuilder({\n themeBundle,\n moduleStore,\n agentStore,\n exporter,\n themePreview,\n header,\n testIdPrefix = 'builder',\n}: VerticalBuilderProps) {\n return (\n <div className=\"space-y-6\" data-testid={`page-${testIdPrefix}`}>\n {header}\n\n <Tabs defaultValue=\"theme\">\n <TabsList data-testid={`${testIdPrefix}-tabs`}>\n <TabsTrigger value=\"theme\" data-testid={`${testIdPrefix}-tab-theme`}>\n <Palette className=\"size-4\" /> Theme\n </TabsTrigger>\n <TabsTrigger value=\"modules\" data-testid={`${testIdPrefix}-tab-modules`}>\n <LayoutGrid className=\"size-4\" /> Modules\n </TabsTrigger>\n <TabsTrigger value=\"agents\" data-testid={`${testIdPrefix}-tab-agents`}>\n <Bot className=\"size-4\" /> Agents\n </TabsTrigger>\n <TabsTrigger value=\"export\" data-testid={`${testIdPrefix}-tab-export`}>\n <FileJson className=\"size-4\" /> Export\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"theme\">\n <ThemeEditor\n bundle={themeBundle}\n variant=\"panel\"\n testIdPrefix={`${testIdPrefix}-theme`}\n preview={themePreview}\n />\n </TabsContent>\n <TabsContent value=\"modules\">\n <ModuleManager store={moduleStore} testIdPrefix={testIdPrefix} />\n </TabsContent>\n <TabsContent value=\"agents\">\n <AgentsPanel store={agentStore} testIdPrefix={testIdPrefix} />\n </TabsContent>\n <TabsContent value=\"export\">\n <ExportPanel\n themeBundle={themeBundle}\n moduleStore={moduleStore}\n agentStore={agentStore}\n exporter={exporter}\n testIdPrefix={testIdPrefix}\n />\n </TabsContent>\n </Tabs>\n </div>\n )\n}\n"]}
|