@arbidocs/blocks 0.3.176 → 0.3.179

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/prompts.ts","../src/citations/CitationEditor.tsx","../src/connection/ConnectionProvider.tsx","../src/connection/LegalArbiProvider.tsx","../src/connection/ai.ts","../src/components/EmptyState.tsx","../src/components/DataTable.tsx","../src/components/DataTableBlock.tsx","../src/components/GridView.tsx","../src/components/UsageMeter.tsx","../src/components/UploadDropzone.tsx","../src/components/PageHeader.tsx","../src/components/Toolbar.tsx","../src/components/EntityIdentityBar.tsx","../src/components/MemberAvatarStack.tsx","../src/components/MetricCard.tsx","../src/components/RecentActivityCard.tsx","../src/components/AskBar.tsx","../src/components/ResumeStrip.tsx","../src/components/SectionStrip.tsx","../src/components/StartHero.tsx","../src/components/WorkspaceCard.tsx","../src/components/StatGroup.tsx","../src/nav/AppShell.tsx","../src/nav/AppHeader.tsx","../src/studio/liveData.ts","../src/studio/liveWidgetRuntime.tsx","../src/studio/widgets.tsx","../src/components/assetImage.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":["useState","useCallback","useMemo","jsx","useKitAiTask","useKitWorkspaceDocs","useKitSemanticSearch","jsxs","cn","useRef","useEffect","lines","alignClass","pct","Textarea","Input","Card","Fragment","Search","Button","Plus","Loader2","Sparkles","X","createContext","useContext","FileText","MessagesSquare","useArbi","persist","Link","useDocuments","useThumbnails","name","Link2","Users","Rocket","Tabs","emptySlot","id","a","b","create","toggle","CardHeader","CardTitle","CardContent","ChevronDown","Badge","useQuery","Cpu","Bot","Palette"],"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 * CitationEditor Component\n *\n * Note input plus the source passages backing it.\n * - Pick related documents; each opens so its passages can be chosen by reading\n * - Click a passage to add it, shift-click for a range; repeat across documents\n *\n * A note answers ONE question, so it has ONE set of sources. It used to carry a\n * map of citations, each with its own statement and character offsets, rendered\n * as inline highlighted spans with [n] badges — but the statements were copies\n * of the note text and the offsets spanned all of it, so the highlight was the\n * whole field. That machinery is gone; the note renders as plain text.\n *\n * ``activeCitationKey``/``onActiveCitationChange`` are kept because the viewer\n * and store thread them through to decide which field is receiving passages.\n * With a single citation the key is just a sentinel — see ONLY_CITATION_KEY.\n */\n\nimport { useCallback, useState, useRef, useEffect, useMemo } from 'react'\nimport { X } from 'lucide-react'\nimport { cn, DocumentEntity, Textarea, type DocumentLike } from '@arbidocs/react'\nimport { formatPageRefs } from '../lib/format'\n\nimport type { components } from '@arbidocs/client'\n\ntype CitationSources = components['schemas']['CitationSources']\n\ntype Citations = CitationSources | null\n\nexport interface CitationEditorProps {\n value: string\n citations: Citations | null\n onChange: (note: string, citations: Citations | null) => void\n /** Currently active citation key (controlled from parent) */\n activeCitationKey?: string | null\n /**\n * Open a document in the viewer, armed to collect passages for this field —\n * and tag its first passage, so a chosen document is immediately a usable\n * citation. Passages are picked by reading, so citing means opening.\n *\n * The caller owns this because resolving \"first passage\" needs the parsed\n * document, and keeping that fetch out here is what lets this component stay\n * store- and API-free (and therefore hoistable to @arbidocs/blocks).\n */\n onCiteDocument?: (docExtId: string) => void\n /** Cited documents, already resolved by the caller — keyed by external id. */\n citedDocs?: Record<string, DocumentLike>\n /**\n * The app's document picker, injected as a slot. It is store-coupled, so it\n * is passed in rather than imported, and receives the chosen document id.\n */\n renderDocumentPicker?: (\n onSelect: (docExtId: string) => void,\n selectedIds: string[]\n ) => React.ReactNode\n placeholder?: string\n readOnly?: boolean\n className?: string\n /** Start in edit mode with the caret in the field (composer behaviour). */\n autoFocus?: boolean\n /** Applied to the text field itself, so callers can target it directly. */\n 'data-testid'?: string\n /** Persisted textarea height in pixels */\n defaultHeight?: number\n /** Called after user resizes the textarea */\n onHeightChange?: (height: number) => void\n}\n\nexport function CitationEditor({\n value,\n citations,\n onChange,\n activeCitationKey,\n onCiteDocument,\n citedDocs,\n renderDocumentPicker,\n autoFocus = false,\n 'data-testid': dataTestId,\n placeholder = 'Add a note...',\n readOnly = false,\n className,\n defaultHeight,\n onHeightChange,\n}: CitationEditorProps) {\n const [localValue, setLocalValue] = useState(value)\n const [isEditing, setIsEditing] = useState(autoFocus)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // Sync from parent only when not editing\n useEffect(() => {\n if (!isEditing) {\n setLocalValue(value)\n }\n }, [value, isEditing])\n\n const passages = useMemo(() => citations?.passages ?? [], [citations])\n const hasCitations = passages.length > 0\n\n // A citation is doc-first: each passage carries its document, so the sources\n // are a grouping rather than a separate list to keep in sync.\n const byDoc = useMemo(() => {\n const groups = new Map<string, { pages: number[]; count: number }>()\n for (const passage of passages) {\n if (!passage.doc_ext_id) continue\n const group = groups.get(passage.doc_ext_id) ?? { pages: [], count: 0 }\n group.count += 1\n if (passage.page != null && !group.pages.includes(passage.page))\n group.pages.push(passage.page)\n groups.set(passage.doc_ext_id, group)\n }\n return groups\n }, [passages])\n\n const docIds = Array.from(byDoc.keys())\n\n const handleRemoveDocument = useCallback(\n (docExtId: string) => {\n const remaining = passages.filter((p) => p.doc_ext_id !== docExtId)\n onChange(localValue, remaining.length ? { passages: remaining } : null)\n },\n [passages, localValue, onChange]\n )\n\n const handleToggleDocument = useCallback(\n (docExtId: string) => {\n if (!docExtId) return\n // Selecting one already in the list removes it (and its passages) — the\n // tick in the picker has to mean something you can undo from there.\n if (docIds.includes(docExtId)) {\n handleRemoveDocument(docExtId)\n return\n }\n onCiteDocument?.(docExtId)\n },\n [docIds, onCiteDocument, handleRemoveDocument]\n )\n\n // The note is plain text. Nothing to slice: with one citation per note there\n // are no per-statement spans to highlight.\n const renderedContent = useMemo(\n () => (localValue ? <span>{localValue}</span> : null),\n [localValue]\n )\n\n // Debounced text change. Editing the note no longer has to re-anchor\n // anything — the sources are attached to the note as a whole.\n const handleChange = useCallback(\n (newValue: string) => {\n setLocalValue(newValue)\n if (debounceRef.current) clearTimeout(debounceRef.current)\n debounceRef.current = setTimeout(() => onChange(newValue, citations ?? null), 400)\n },\n [citations, onChange]\n )\n\n /**\n * Publish any debounced edit immediately.\n *\n * Without this, typing and then clicking Save within the debounce window\n * silently drops the last keystrokes: the parent still holds the previous\n * value when it reads state to submit.\n */\n const flushPendingChange = useCallback(() => {\n if (!debounceRef.current) return\n clearTimeout(debounceRef.current)\n debounceRef.current = null\n onChange(localValue, citations ?? null)\n }, [localValue, citations, onChange])\n\n return (\n <div className={cn('space-y-1', className)}>\n {/* Text area with highlighted citations preview when not editing */}\n <div className=\"relative\">\n {isEditing ? (\n <Textarea\n ref={textareaRef}\n dictate\n value={localValue}\n onChange={(e) => handleChange(e.target.value)}\n onBlur={() => {\n flushPendingChange()\n setIsEditing(false)\n }}\n onMouseUp={() => {\n if (textareaRef.current && onHeightChange) {\n onHeightChange(textareaRef.current.offsetHeight)\n }\n }}\n placeholder={placeholder}\n readOnly={readOnly}\n rows={2}\n data-testid={dataTestId}\n autoFocus\n style={defaultHeight ? { height: defaultHeight } : undefined}\n className=\"w-full text-sm p-2 pr-14 border border-border rounded-md resize-y bg-background focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n ) : (\n <div\n onClick={() => !readOnly && setIsEditing(true)}\n style={defaultHeight ? { minHeight: defaultHeight } : undefined}\n data-testid={dataTestId}\n className={cn(\n 'w-full text-sm p-2 pr-14 border border-border rounded-md min-h-[4rem] whitespace-pre-wrap bg-background',\n !readOnly && 'cursor-text hover:border-ring',\n !localValue && 'text-muted-foreground'\n )}\n >\n {renderedContent || placeholder}\n </div>\n )}\n </div>\n\n {/* Sources — one row per cited document, each showing how many passages\n were tagged in it. Clicking a document reopens it in the viewer so more\n passages can be tagged; the passages themselves are chosen by reading,\n which is why citing is inseparable from opening. */}\n {(hasCitations || !readOnly) && (\n <div className=\"flex flex-col gap-1\">\n {docIds.map((docId) => {\n const doc = citedDocs?.[docId]\n const group = byDoc.get(docId)\n const pages = (group?.pages ?? []).slice().sort((a, b) => a - b)\n return (\n <div\n key={docId}\n className=\"flex items-center gap-1.5 text-sm\"\n data-testid={`citation-doc-${docId}`}\n >\n {doc ? (\n <button\n type=\"button\"\n onClick={() => !readOnly && onCiteDocument?.(docId)}\n // flex-1 so the title gets the row's spare width — the count\n // and remove control are shrink-0 and sit at the end.\n className=\"flex-1 min-w-0 text-left\"\n title=\"Open to tag more passages\"\n >\n <DocumentEntity doc={doc} fullWidth labelMaxWidth=\"max-w-full\" />\n </button>\n ) : (\n <span className=\"text-muted-foreground\">{docId}</span>\n )}\n <span className=\"text-muted-foreground shrink-0\">{formatPageRefs(pages)}</span>\n {!readOnly && (\n <button\n type=\"button\"\n onClick={() => handleRemoveDocument(docId)}\n aria-label=\"Remove this document\"\n className=\"p-0.5 hover:bg-destructive/20 hover:text-destructive rounded shrink-0\"\n >\n <X size={12} />\n </button>\n )}\n </div>\n )\n })}\n\n {/* Passages with no recorded document — citations written before the\n document was captured. Shown so they are never silently dropped. */}\n {passages.some((p) => !p.doc_ext_id) && (\n <span className=\"text-sm text-muted-foreground\">\n {passages.filter((p) => !p.doc_ext_id).length} passage(s) without a recorded document\n </span>\n )}\n\n {!readOnly && (\n <div className=\"flex items-center gap-1\">\n {/* The picker is rendered inline rather than behind a button: adding\n a source is the primary action here, and hiding it behind\n \"+ Document\" cost a click for no benefit. Once a document is\n cited, this row becomes \"add another\". */}\n <div className=\"flex-1 min-w-0\" data-testid=\"citation-document-picker\">\n {renderDocumentPicker?.(handleToggleDocument, docIds)}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Hint when citation is active */}\n {activeCitationKey && (\n <p className=\"text-sm text-blue-text\">\n Click a passage in the document to add it — <strong>shift-click</strong> to take a whole\n range. Add as many as you like, from as many documents as you like.\n </p>\n )}\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 /**\n * Affirmatively select a workspace: opens it on the server (via the SDK),\n * updates the app-wide state, and persists the choice so it survives future\n * logins. This is the single entry point for \"the user is now in workspace X\".\n */\n setWorkspace: (id: string) => Promise<void>\n /**\n * Re-assert the selected workspace on the server session (idempotent `/open`).\n * Call before a workspace-scoped write when the session may have lost its open\n * workspace (token re-login, backend restart, session expiry) — the server\n * resolves the workspace from the session, so a dropped `/open` yields\n * \"No active workspace\" until it's re-opened.\n */\n ensureWorkspaceOpen: () => Promise<void>\n}\n\nconst ConnectionContext = createContext<ConnectionValue | null>(null)\n\n/**\n * Persist the affirmatively-selected workspace per backend, so a returning user\n * lands back in the workspace they last chose (mirrors how ARBI-frontend keeps\n * the selected workspace in persisted store). Namespaced by apiUrl so distinct\n * deployments (and the demo firm) don't clobber each other.\n */\nconst WORKSPACE_STORAGE_PREFIX = 'arbi:selectedWorkspace'\nconst workspaceStorageKey = (apiUrl: string) => `${WORKSPACE_STORAGE_PREFIX}:${apiUrl || 'demo'}`\n\nfunction readPersistedWorkspace(apiUrl: string): string | null {\n try {\n return window.localStorage.getItem(workspaceStorageKey(apiUrl))\n } catch {\n return null\n }\n}\n\nfunction persistWorkspace(apiUrl: string, id: string | null): void {\n try {\n if (id) window.localStorage.setItem(workspaceStorageKey(apiUrl), id)\n else window.localStorage.removeItem(workspaceStorageKey(apiUrl))\n } catch {\n // Storage unavailable (private mode, SSR) — selection stays in-memory only.\n }\n}\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 workspace the user last affirmatively selected (persisted),\n // then the configured matter workspace (there may be several — e.g. a\n // marketing/KM workspace), then whichever happens to be first. Ternary\n // (not `&&`) so an empty value can't leak `\"\"` into `target`.\n const persisted = readPersistedWorkspace(config.apiUrl)\n const preferred = persisted ?? 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 persistWorkspace(config.apiUrl, 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, config.apiUrl]\n )\n\n const logout = useCallback(() => {\n if (mode === 'live') {\n void arbi.logout?.()\n }\n setUser(null)\n setWorkspaceId(null)\n persistWorkspace(config.apiUrl, null)\n setStatus('disconnected')\n setError(null)\n }, [arbi, mode, config.apiUrl])\n\n // Affirmative selection: open the workspace on the server (live), then remember\n // it in state + storage so every surface — and the next login — is in sync.\n const setWorkspace = useCallback(\n async (id: string) => {\n if (mode === 'live' && arbi.isLoggedIn) {\n await arbi.selectWorkspace(id)\n }\n setWorkspaceId(id)\n persistWorkspace(config.apiUrl, id)\n },\n [arbi, mode, config.apiUrl]\n )\n\n // Re-open the selected workspace on the session if the server may have dropped\n // it. Idempotent: re-running `/open` for the already-selected workspace is safe.\n const ensureWorkspaceOpen = useCallback(async () => {\n if (mode !== 'live' || !arbi.isLoggedIn) return\n const id = workspaceId ?? readPersistedWorkspace(config.apiUrl) ?? config.workspaceId\n if (id) await arbi.selectWorkspace(id)\n }, [arbi, mode, workspaceId, config.apiUrl, config.workspaceId])\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 ensureWorkspaceOpen,\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 ensureWorkspaceOpen,\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","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 — inherit the host app's font. A googleFont here never\n // loaded under the apps' CSP, so every grid silently fell back to the\n // browser's default SERIF and read as unstyled.\n fontFamily: 'inherit',\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 multiline columns (.cell-multiline —\n // Abstract, Author, custom text fields) need so their overflow clip lands on\n // a WHOLE-line boundary (never mid-line, which reads as a half-line\n // \"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 // --multiline-line-clamp : whole number of lines that fit — drives the CSS\n // line-clamp that hides overflow lines entirely.\n // --multiline-pad-y : vertical cell padding, shrunk on very short rows so\n // at least one whole line always fits.\n // --multiline-max-h : cap of exactly N whole lines + TOP padding + borders.\n // Deliberately excludes the bottom padding: AG Grid\n // forces cell height, so overflow clips at the\n // padding-box edge and any bottom padding becomes a\n // window onto the next (clamped-away) line. Ending the\n // box right at line N's bottom puts the clip on the\n // line boundary; the row supplies the visual gap below.\n const containerStyle = useMemo(() => {\n const style: React.CSSProperties = { height }\n if (rowHeight) {\n const LINE_PX = 14 * 1.35 // grid font-size × multiline line-height (18.9px)\n const BORDER = 2 // multiline 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['--multiline-line-clamp'] = `${lines}`\n vars['--multiline-pad-y'] = `${padTotal / 2}px`\n vars['--multiline-max-h'] = `${lines * LINE_PX + padTotal / 2 + 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 { LucideIcon } from 'lucide-react'\nimport { cn } from '@arbidocs/react'\n\n/**\n * One labelled quota meter: icon + label on the left, used-of-limit on the\n * right, a thin bar underneath. The bar's tone follows pressure with the shared\n * green → yellow → red gradation — green while there's room, yellow past the\n * halfway mark, red at the limit — so a stack of meters reads at a glance which\n * quota is the one to think about.\n */\nexport function UsageMeter({\n icon: Icon,\n label,\n value,\n pct,\n hint,\n className,\n testId,\n}: {\n icon?: LucideIcon\n label: string\n /** Formatted used-of-limit text, e.g. \"1,200 / 25,000\" or \"40 / 500 MB\". */\n value: string\n /** Fill percentage, 0–100 (values are clamped). */\n pct: number\n /** Inline parenthetical after the label, e.g. \"resets May 31, 2025\" —\n * same font as the label, so the meter never grows an extra row. */\n hint?: string\n className?: string\n testId?: string\n}) {\n const clamped = Math.max(0, Math.min(100, pct))\n // Shared green → yellow → red gradation (same thresholds as the project-card\n // quota badges): green with room, yellow past the halfway mark, red at limit.\n const tone = clamped >= 100 ? 'bg-red-500' : clamped >= 50 ? 'bg-yellow-500' : 'bg-green-500'\n return (\n <div className={cn('space-y-1.5', className)} data-testid={testId}>\n <div className=\"flex items-center justify-between gap-3 text-sm\">\n <span className=\"flex min-w-0 items-center gap-1.5 text-muted-foreground\">\n {Icon && <Icon className=\"size-3.5 shrink-0\" />}\n <span className=\"truncate\">\n {label}\n {hint ? ` (${hint})` : ''}\n </span>\n </span>\n <span className=\"shrink-0 font-medium tabular-nums text-foreground\">{value}</span>\n </div>\n <div className=\"h-1.5 overflow-hidden rounded-full bg-muted\">\n <div\n className={cn('h-full rounded-full transition-[width]', tone)}\n style={{ width: `${clamped}%` }}\n role=\"progressbar\"\n aria-valuenow={clamped}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={label}\n />\n </div>\n </div>\n )\n}\n","import { useRef, useState } from 'react'\nimport type { DragEvent } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { Loader2, UploadCloud } from 'lucide-react'\nimport { cn } from '@arbidocs/react'\n\nexport interface UploadDropzoneProps {\n /** Called with the chosen/dropped files. */\n onFiles: (files: File[]) => void\n /** `accept` attribute for the file picker (e.g. `.pdf,.docx`). */\n accept?: string\n /** Allow selecting more than one file. Defaults to true. */\n multiple?: boolean\n /** Disables picking/dropping (e.g. no active workspace yet). */\n disabled?: boolean\n /** Shows a spinner + busy copy while an upload is in flight. */\n uploading?: boolean\n /** Primary line, e.g. \"Drag files here\". */\n title?: string\n /** Secondary line under the title. */\n description?: string\n /** Small muted hint, e.g. \"PDF, DOCX, images — up to 50MB\". */\n hint?: string\n /** Copy shown next to the spinner while uploading. */\n uploadingLabel?: string\n /** Glyph in the tile. Defaults to an upload-cloud icon. */\n icon?: LucideIcon\n testId?: string\n className?: string\n}\n\n/**\n * A themeable drag-and-drop upload target. Source-agnostic: it just surfaces\n * chosen files via `onFiles` — the host owns the actual upload. Handles its own\n * drag-over state, click-to-browse, and a busy state, styled with the kit's\n * SEMANTIC tokens only (border, muted, primary, foreground) so it renders in\n * each firm's colours.\n */\nexport function UploadDropzone({\n onFiles,\n accept,\n multiple = true,\n disabled = false,\n uploading = false,\n title = 'Drag files here',\n description = 'or click to browse',\n hint,\n uploadingLabel = 'Uploading…',\n icon: Icon = UploadCloud,\n testId,\n className,\n}: UploadDropzoneProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const [dragOver, setDragOver] = useState(false)\n const inert = disabled || uploading\n\n const pick = (files: FileList | null) => {\n if (!files?.length) return\n onFiles(Array.from(files))\n }\n\n const onDrop = (e: DragEvent<HTMLButtonElement>) => {\n e.preventDefault()\n setDragOver(false)\n if (inert) return\n pick(e.dataTransfer.files)\n }\n\n const onDragOver = (e: DragEvent<HTMLButtonElement>) => {\n e.preventDefault()\n if (!inert) setDragOver(true)\n }\n\n return (\n <button\n type=\"button\"\n onClick={() => !inert && inputRef.current?.click()}\n onDrop={onDrop}\n onDragOver={onDragOver}\n onDragLeave={() => setDragOver(false)}\n disabled={inert}\n data-testid={testId}\n className={cn(\n 'flex w-full flex-col items-center justify-center gap-3 rounded-xl border-2 border-dashed border-border bg-muted/30 px-6 py-12 text-center transition-colors',\n 'hover:border-primary/50 hover:bg-muted/50',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n dragOver && 'border-primary bg-primary/5',\n inert && 'cursor-not-allowed opacity-60 hover:border-border hover:bg-muted/30',\n className\n )}\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"hidden\"\n onChange={(e) => {\n pick(e.target.files)\n if (inputRef.current) inputRef.current.value = ''\n }}\n data-testid={testId ? `${testId}-input` : undefined}\n />\n <div className=\"flex size-12 items-center justify-center rounded-full bg-primary/10 text-primary\">\n {uploading ? <Loader2 className=\"size-6 animate-spin\" /> : <Icon className=\"size-6\" />}\n </div>\n {uploading ? (\n <p className=\"text-sm font-medium text-foreground\">{uploadingLabel}</p>\n ) : (\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {title} <span className=\"text-muted-foreground\">{description}</span>\n </p>\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </div>\n )}\n </button>\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 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 { useEffect, useState, type ReactNode } from 'react'\nimport { Pencil } from 'lucide-react'\nimport { Input, Textarea, cn } from '@arbidocs/react'\n\n/** Longest a name may be. Exported so a form editing the same field agrees. */\nexport const IDENTITY_NAME_MAX_LENGTH = 50\n\n/** Shown once the remaining allowance gets this low, not for the whole time. */\nconst COUNTER_THRESHOLD = 10\n\nexport interface EntityIdentityField {\n /** Row caption. Rendered with a trailing colon. */\n label: string\n value: string\n /** Stands in for an empty value, in italics — never a blank row. */\n placeholder: string\n /** Commits the edit. Not called when the value is unchanged. */\n onSave: (next: string) => void\n /** A description needs line breaks; a name does not. */\n multiline?: boolean\n /** Caps the input and shows a counter as it fills. Names only, by default. */\n maxLength?: number\n /** Classes for the read-mode value, e.g. a larger weight for the name. */\n valueClassName?: string\n /**\n * Content pinned to the RIGHT END of this row — e.g. the owning project\n * beside a name, a member stack beside a status. Rows without one let their\n * value run the full width, which is what a description wants.\n */\n trailing?: ReactNode\n /** Row test id; the pencil and input derive `-edit` and `-input`. */\n testId?: string\n}\n\nexport interface EntityIdentityBarProps {\n /** The editable text fields, in order. Usually name then description. */\n fields: EntityIdentityField[]\n /**\n * Read-only rows shown after the editable ones — anything whose control the\n * consumer owns (a project picker, an owner avatar, a status). Rendered with\n * the same caption column so every row lines up.\n */\n extraRows?: { label: string; content: ReactNode; trailing?: ReactNode; testId?: string }[]\n /** Hides every pencil. A viewer without permission sees values, not controls. */\n canEdit?: boolean\n /** Trailing controls, pinned right — e.g. a member stack, a status. */\n actions?: ReactNode\n /**\n * Controls that act on the ENTITY rather than on any one field — typically an\n * overflow menu holding delete or leave. Sits under the field list, where a\n * destructive action is findable but not in the path of everyday reading.\n */\n footer?: ReactNode\n className?: string\n testId?: string\n}\n\n/**\n * The \"what am I looking at\" bar for an entity's own page.\n *\n * A caption column (`Name:`, `Description:`, `Project:`) and a value column. The\n * captions are the point: a bare bold string at the top of a page reads equally\n * as a workspace, a project, a matter or a folder, and people read it as\n * whichever they expected. Saying which field is which costs one column and\n * removes the ambiguity entirely.\n *\n * Editing happens in place. The pencil is always visible to someone who can use\n * it rather than revealed on hover — a control you have to go hunting for is one\n * most people never find, and hover doesn't exist on touch. Commit is on blur\n * and on Enter (single-line fields only, so a description can hold line\n * breaks); Escape abandons the edit.\n *\n * Deliberately NOT a form: no submit, no dirty state, no field-level errors.\n * When a consumer needs visibility toggles, destructive actions or validation\n * messages, those belong in its settings form — this bar is the identity of the\n * thing, shown where you are working on it.\n *\n * Styled with SEMANTIC tokens only, so every firm gets it in its own colours.\n */\nexport function EntityIdentityBar({\n fields,\n extraRows = [],\n canEdit = false,\n actions,\n footer,\n className,\n testId,\n}: EntityIdentityBarProps) {\n return (\n <div\n className={cn('flex flex-wrap items-start justify-between gap-x-6 gap-y-3', className)}\n data-testid={testId}\n >\n <dl className=\"min-w-0 flex-1 space-y-1.5\">\n {fields.map((field) => (\n <IdentityFieldRow key={field.label} field={field} canEdit={canEdit} />\n ))}\n {extraRows.map((row) => (\n <div key={row.label} className=\"flex min-w-0 items-center gap-2\" data-testid={row.testId}>\n <dt className=\"w-24 shrink-0 text-sm font-medium text-muted-foreground\">\n {row.label}:\n </dt>\n <dd className=\"flex min-w-0 flex-1 items-center gap-2\">\n {row.content}\n {row.trailing ? <div className=\"ml-auto shrink-0\">{row.trailing}</div> : null}\n </dd>\n </div>\n ))}\n {footer ? <div className=\"flex items-center pt-0.5\">{footer}</div> : null}\n </dl>\n {actions ? <div className=\"flex shrink-0 items-center gap-2\">{actions}</div> : null}\n </div>\n )\n}\n\nfunction IdentityFieldRow({ field, canEdit }: { field: EntityIdentityField; canEdit: boolean }) {\n const {\n label,\n value,\n placeholder,\n onSave,\n multiline = false,\n maxLength,\n valueClassName,\n trailing,\n testId,\n } = field\n\n const [isEditing, setIsEditing] = useState(false)\n const [draft, setDraft] = useState(value)\n\n // Track the value while not editing, so an update from elsewhere (another\n // tab, a websocket) doesn't get overwritten by a stale draft on the next edit.\n useEffect(() => {\n if (!isEditing) setDraft(value)\n }, [value, isEditing])\n\n const commit = () => {\n setIsEditing(false)\n const next = draft.trim()\n if (next !== value) onSave(next)\n }\n\n const cancel = () => {\n setDraft(value)\n setIsEditing(false)\n }\n\n const charsLeft = maxLength === undefined ? null : maxLength - draft.length\n\n // Editing must not move anything. The input carries the read view's exact\n // typography and padding, drops the border and shadow entirely, and marks\n // focus with a contrasting FIELD instead — a box appearing around the text\n // (and the row growing to fit it) reads as the page jumping under the cursor.\n const fieldClass =\n 'h-auto rounded border-0 bg-muted px-1.5 py-0.5 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0'\n\n const shared = {\n autoFocus: true,\n value: draft,\n placeholder,\n maxLength,\n 'aria-label': label,\n 'data-testid': testId && `${testId}-input`,\n onBlur: commit,\n onChange: (e: { target: { value: string } }) => setDraft(e.target.value),\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n cancel()\n } else if (e.key === 'Enter' && !multiline) {\n e.preventDefault()\n commit()\n }\n },\n }\n\n return (\n <div className={cn('flex min-w-0 gap-2', multiline ? 'items-start' : 'items-center')}>\n <dt\n className={cn(\n 'w-24 shrink-0 text-sm font-medium text-muted-foreground',\n multiline && 'pt-1'\n )}\n >\n {label}:\n </dt>\n <dd className=\"flex min-w-0 flex-1 items-center gap-2\">\n {isEditing ? (\n <div className=\"relative min-w-0 flex-1\">\n {multiline ? (\n <Textarea\n {...shared}\n rows={2}\n className={cn(fieldClass, 'min-h-0 resize-none leading-snug', valueClassName)}\n />\n ) : (\n <Input {...shared} className={cn(fieldClass, 'pr-20', valueClassName)} />\n )}\n {charsLeft !== null && charsLeft <= COUNTER_THRESHOLD && (\n <span\n className={cn(\n 'pointer-events-none absolute right-3 top-1/2 hidden -translate-y-1/2 text-sm lg:block',\n charsLeft < 0 ? 'text-destructive' : 'text-muted-foreground'\n )}\n data-testid={testId && `${testId}-counter`}\n >\n {charsLeft < 0 ? `${-charsLeft} over` : `${charsLeft} left`}\n </span>\n )}\n </div>\n ) : (\n // `identity-field` (not the generic `group`) scopes the pencil's hover\n // to THIS field only — an ancestor card also carries `group`, so a\n // `.group:hover` rule would reveal every field's pencil at once.\n <span className=\"identity-field flex min-w-0 items-center gap-1.5\">\n {/* Same padding as the input above — the swap must not nudge the\n text sideways or change the row's height. */}\n <span className={cn('px-1.5 py-0.5', valueClassName)} data-testid={testId}>\n {value || <span className=\"italic text-muted-foreground\">{placeholder}</span>}\n </span>\n {canEdit && (\n <button\n type=\"button\"\n onClick={() => setIsEditing(true)}\n aria-label={`Edit ${label.toLowerCase()}`}\n title={`Edit ${label.toLowerCase()}`}\n // Quiet by default — the pencil only surfaces when the row is\n // hovered so it reads as clean text, and stays reachable by\n // keyboard (focus-visible).\n //\n // NB: use the ungated `[.identity-field:hover_&]` selector rather\n // than Tailwind's `group-hover:`. The latter compiles behind\n // `@media (hover: hover)`, so on a touchscreen (whose PRIMARY\n // pointer reports `hover: none`) the rule is disabled even when a\n // real mouse is firing hover events — the pencil then stays at\n // opacity-0 forever. The arbitrary selector has no media gate, so\n // it reveals on any genuine `:hover`.\n className=\"shrink-0 cursor-pointer rounded p-1 text-muted-foreground opacity-0 transition-[color,background-color,opacity] hover:bg-accent hover:text-foreground focus-visible:opacity-100 [.identity-field:hover_&]:opacity-100\"\n data-testid={testId && `${testId}-edit`}\n >\n <Pencil className=\"size-3.5\" />\n </button>\n )}\n </span>\n )}\n {trailing ? <div className=\"ml-auto shrink-0\">{trailing}</div> : null}\n </dd>\n </div>\n )\n}\n","import { ChevronDown } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage, cn } from '@arbidocs/react'\nimport { initials } from '../lib/format'\n\n/** One face in the stack — source-agnostic, not a raw SDK user. */\nexport interface StackedMember {\n name: string\n picture?: string | null\n}\n\nexport interface MemberAvatarStackProps {\n members: StackedMember[]\n /** Total, when it exceeds what's shown. Defaults to `members.length`. */\n total?: number\n /** Faces before the rest collapse into a `+N`. */\n max?: number\n /**\n * The viewer isn't allowed to see who is here (e.g. row-level security hides\n * the members of a public workspace you haven't joined). Renders an em dash\n * rather than lying with an empty stack.\n */\n hidden?: boolean\n /** Makes the stack a button — e.g. to expand the member list below it. */\n onClick?: () => void\n /** Rotates the chevron and drives `aria-expanded` when it is a toggle. */\n expanded?: boolean\n /** Ring colour behind each face; match the surface it sits on. */\n ringClassName?: string\n className?: string\n testId?: string\n}\n\nconst MAX_DEFAULT = 3\n\n/**\n * An overlapping stack of member faces, with the overflow collapsed to `+N`.\n *\n * Lives here rather than inside a card because \"who is in this thing\" is shown\n * in more than one place — a workspace card, a workspace's own header — and\n * those had drawn it twice. Given `onClick` it becomes the control that expands\n * the full list, which is a better affordance than a button labelled \"Members\"\n * beside the very faces it would reveal.\n */\nexport function MemberAvatarStack({\n members,\n total,\n max = MAX_DEFAULT,\n hidden = false,\n onClick,\n expanded = false,\n ringClassName = 'border-card',\n className,\n testId,\n}: MemberAvatarStackProps) {\n const count = total ?? members.length\n const shown = hidden ? [] : members.slice(0, max)\n const extra = count - shown.length\n\n const faces = (\n <>\n {hidden ? (\n <span className=\"text-sm text-muted-foreground\">—</span>\n ) : (\n shown.map((m, i) => (\n <Avatar key={i} className={cn('size-6 border-2', ringClassName)} title={m.name}>\n {m.picture && <AvatarImage src={m.picture} alt={m.name} />}\n <AvatarFallback className=\"bg-foreground text-[9px] font-medium text-background\">\n {initials(m.name || '?')}\n </AvatarFallback>\n </Avatar>\n ))\n )}\n {!hidden && extra > 0 && (\n <Avatar className={cn('size-6 border-2', ringClassName)}>\n <AvatarFallback className=\"bg-accent text-[9px] font-medium text-muted-foreground\">\n +{extra}\n </AvatarFallback>\n </Avatar>\n )}\n </>\n )\n\n if (!onClick) {\n return (\n <div className={cn('flex shrink-0 -space-x-2', className)} data-testid={testId}>\n {faces}\n </div>\n )\n }\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-expanded={expanded}\n className={cn(\n 'flex shrink-0 cursor-pointer items-center gap-1.5 rounded-full py-0.5 pl-0.5 pr-1.5 transition-colors hover:bg-accent/60',\n className\n )}\n data-testid={testId}\n >\n <span className=\"flex -space-x-2\">{faces}</span>\n <ChevronDown\n className={cn(\n 'size-3.5 text-muted-foreground transition-transform',\n expanded && 'rotate-180'\n )}\n />\n </button>\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","import type { ReactNode } from 'react'\nimport { Plus, type LucideIcon } from 'lucide-react'\nimport { Button, Card, cn } from '@arbidocs/react'\n\n/** One listed item. Source-agnostic: a chat, a file, a matter, a person. */\nexport interface RecentActivityRow {\n id: string\n /**\n * The row's avatar/logo — a person's face, a file-type mark, a tinted glyph.\n * Supplied by the consumer, because only it knows what these things look\n * like.\n */\n leading?: ReactNode\n title: string\n /** Second line: what this row is, in a few words. */\n subtitle?: string\n /** Pinned right on the second line, like a message time. */\n meta?: string\n onClick?: () => void\n /**\n * A control rendered beside the row, OUTSIDE its button — e.g. a role\n * dropdown. It cannot live inside the button: nested interactives are invalid\n * and the button would eat the click. Supplying this hides `meta`, since they\n * compete for the same edge.\n */\n trailing?: ReactNode\n}\n\nexport interface RecentActivityCardProps {\n /** Glyph beside the title, in the header. */\n icon?: LucideIcon\n /** The section this card is about — \"Chats\", \"Matters\", \"Members\". */\n title: string\n /** Total across everything, not just what's listed. Omit to hide. */\n count?: number\n /** Header click — go to this section's full page. */\n onOpen?: () => void\n /** Secondary action that CREATES one. Omit the label to hide the button. */\n actionLabel?: string\n actionIcon?: LucideIcon\n onAction?: () => void\n /**\n * A custom header action node — rendered in the action slot INSTEAD of the\n * built-in label button. For actions that aren't a single click (e.g. a\n * source dropdown). The empty-card CTA still uses `onAction`/`emptyActionLabel`.\n */\n action?: ReactNode\n rows: RecentActivityRow[]\n /** Says what the list is — \"Recent\", \"Recently joined\". */\n caption?: string\n /** Shown instead of the list when there is nothing yet. */\n emptyText?: ReactNode\n /**\n * Verb for the empty card's call to action, e.g. \"New chat\" rather than the\n * header button's terse \"New\". An empty card is mostly whitespace, and that\n * whitespace is the best invitation the card will ever get — so it becomes\n * the action, at full size. Defaults to `actionLabel`; the CTA only appears\n * when there is an `onAction` to run.\n */\n emptyActionLabel?: string\n /** Extra classes on the card root. */\n className?: string\n /** Root test id; children derive `-open`, `-action`, `-caption`, `-row`. */\n testId?: string\n}\n\n/**\n * A section's recent items, as a card you can get back INTO the work through.\n *\n * Three parts, and the split is the point:\n *\n * - the HEADER links to that section's full page. Clicking the thing's name\n * should take you to the thing.\n * - the BODY lists what changed most recently, each row jumping straight to\n * that item.\n * - the ACTION creates a new one, kept visually distinct from the header link\n * so \"go there\" and \"make one\" are never the same click.\n *\n * Deliberately NOT a KPI tile — that's {@link MetricCard}. A count tells a\n * returning professional nothing they need: \"128 documents\" doesn't help you\n * resume work, whereas the name of the file you touched an hour ago does. The\n * count rides along as a caption beside the title, not as the content.\n *\n * The row anatomy is the DM conversation chip's (leading avatar, bold name\n * line, muted second line with the time pinned right), because a list of\n * recognisable things reads the same way whoever owns it.\n *\n * Styled with SEMANTIC tokens only (card, border, foreground, muted-foreground,\n * primary, accent), so every firm gets it in its own colours.\n */\nexport function RecentActivityCard({\n icon: Icon,\n title,\n count,\n onOpen,\n actionLabel,\n actionIcon: ActionIcon,\n onAction,\n action,\n rows,\n caption,\n emptyText,\n emptyActionLabel,\n className,\n testId,\n}: RecentActivityCardProps) {\n return (\n <Card\n variant=\"flat\"\n className={cn(\n // Grows to its content. The card must NOT scroll internally: a list\n // scrolling inside a fixed-height card puts a scrollbar in the middle\n // of the page, where every other page in the app scrolls at its outer\n // edge. The page is the scroll container; the card is just tall.\n //\n // No `card-hover` lift: the card is a container, not a single link — its\n // header and each row have their OWN hover, so a whole-card lift on any\n // hover would highlight the section instead of the item under the cursor.\n 'flex flex-col overflow-hidden rounded-xl bg-card p-0 shadow-sm',\n className\n )}\n data-testid={testId}\n >\n {/* Header — the title navigates; the action beside it creates. No rule\n under it: the first row's own hairline is separation enough. */}\n <div className=\"flex items-center gap-1 px-2 pt-2\">\n <button\n type=\"button\"\n onClick={onOpen}\n disabled={!onOpen}\n className=\"group flex min-w-0 flex-1 cursor-pointer items-center gap-2 rounded-lg px-2 py-1.5 text-left transition-colors hover:bg-primary/10 disabled:cursor-default disabled:hover:bg-transparent\"\n data-testid={testId && `${testId}-open`}\n >\n {Icon && <Icon className=\"size-4 shrink-0 text-muted-foreground\" />}\n {/* `whitespace-nowrap`, not `truncate`: these labels are one short\n word, and truncating rendered \"DOCUM…\" beside acres of free\n space. */}\n <span className=\"whitespace-nowrap text-sm font-semibold text-foreground\">{title}</span>\n {count !== undefined && (\n <span className=\"text-xs tabular-nums text-muted-foreground\">{count}</span>\n )}\n </button>\n {action ? (\n <div className=\"shrink-0\">{action}</div>\n ) : actionLabel ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 shrink-0 px-2 text-xs font-medium text-muted-foreground hover:text-foreground\"\n onClick={onAction}\n title={actionLabel}\n data-testid={testId && `${testId}-action`}\n >\n {ActionIcon && <ActionIcon className=\"size-3.5\" />}\n <span className=\"sr-only @md:not-sr-only @md:ml-1.5\">{actionLabel}</span>\n </Button>\n ) : null}\n </div>\n\n {rows.length === 0 ? (\n onAction ? (\n // The whole empty area is the button. A muted sentence in a big void\n // tells you the card is empty; this tells you what to do about it.\n <button\n type=\"button\"\n onClick={onAction}\n className=\"group m-3 flex flex-1 cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed border-border px-4 text-center transition-colors hover:border-border hover:bg-accent/50 focus-visible:border-border focus-visible:bg-accent/50 focus-visible:outline-none\"\n data-testid={testId && `${testId}-empty-action`}\n >\n <span className=\"mt-6 flex size-11 items-center justify-center rounded-full bg-primary/10 text-primary transition-colors group-hover:bg-primary group-hover:text-primary-foreground\">\n {ActionIcon ? <ActionIcon className=\"size-5\" /> : <Plus className=\"size-5\" />}\n </span>\n <span className=\"text-sm font-semibold text-foreground\">\n {emptyActionLabel ?? actionLabel}\n </span>\n <span className=\"text-xs leading-relaxed text-muted-foreground\">{emptyText}</span>\n </button>\n ) : (\n <p className=\"flex flex-1 items-center px-4 py-6 text-xs leading-relaxed text-muted-foreground\">\n {emptyText}\n </p>\n )\n ) : (\n <>\n {caption && (\n // A caption, so the list says what it is instead of leaving you to\n // infer it from the order.\n <p\n className=\"mt-1 px-4 pb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\"\n data-testid={testId && `${testId}-caption`}\n >\n {caption}\n </p>\n )}\n <ul className=\"flex-1\">\n {rows.map((row) => (\n <li\n key={row.id}\n className={cn(\n 'group relative flex items-center border-b border-border/60 transition-colors last:border-b-0',\n // Clearly highlight the row under the cursor so it's obvious\n // which item will be clicked. Use the ungated `[&:hover]`\n // selector rather than `hover:` — the latter compiles behind\n // `@media (hover: hover)`, so on a touchscreen (primary pointer\n // reports `hover: none`) the highlight never shows even with a\n // real mouse attached.\n '[&:hover]:bg-primary/10 has-[button:focus-visible]:bg-primary/10'\n )}\n >\n <button\n type=\"button\"\n onClick={row.onClick}\n // The full text on hover: these names truncate, and the row is\n // often the only place the whole thing appears.\n title={row.title}\n className={cn(\n 'flex min-w-0 flex-1 items-start gap-3 py-2.5 pl-4 pr-2 text-left focus-visible:outline-none',\n row.onClick && 'cursor-pointer'\n )}\n data-testid={testId && `${testId}-row`}\n >\n {row.leading}\n <div className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-semibold text-foreground group-hover:text-primary\">\n {row.title}\n </span>\n <div className=\"mt-0.5 flex items-center gap-1.5\">\n <p className=\"min-w-0 flex-1 truncate text-xs text-muted-foreground\">\n {row.subtitle}\n </p>\n {!row.trailing && row.meta && (\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">\n {row.meta}\n </span>\n )}\n </div>\n </div>\n </button>\n {row.trailing ? <div className=\"shrink-0 pr-3\">{row.trailing}</div> : null}\n </li>\n ))}\n </ul>\n </>\n )}\n </Card>\n )\n}\n","/**\n * A question box that IS the product's front door, not a link to one.\n *\n * One input, two destinations: Enter (or the arrow) ASKS — hands the trimmed\n * text to `onAsk`, the conversational answer — while the Search button beside\n * it hands the same text to `onSearch`, the retrieval experience. The split\n * matters because a professional's queries come in both registers (\"what does\n * clause 7 mean\" vs \"find every mention of clause 7\") and making them choose a\n * page before typing kills the impulse. Omit `onSearch` and the bar is a plain\n * ask composer.\n *\n * The consumer owns what asking and searching mean (start a chat, run smart\n * search, open a matter). Suggestion chips prefill the input rather than\n * firing immediately: a suggestion is a starting point you edit, not a button\n * you regret.\n *\n * Styled with SEMANTIC tokens only (card, border, foreground, muted-foreground,\n * primary), so every firm gets it in its own colours.\n */\n\nimport { useRef, useState, type KeyboardEventHandler, type ReactNode, type RefObject } from 'react'\nimport { Search, Sparkles } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react'\n\nexport interface AskBarProps {\n /** Receives the trimmed question; the caller owns what asking means. */\n onAsk: (text: string) => void\n /** Second destination for the same text — retrieval. Omit to hide. */\n onSearch?: (text: string) => void\n /** Prefill-on-click starter questions, shown under the input. */\n suggestions?: string[]\n placeholder?: string\n askLabel?: string\n searchLabel?: string\n /** Controlled value. Omit for the bar to own its own text. */\n value?: string\n onValueChange?: (value: string) => void\n /** Raw keydown on the input — lets a consumer run an autocomplete\n * (arrow/Enter/Tab/Escape) before the form's own submit handling.\n * preventDefault() on Enter suppresses the submit. */\n onInputKeyDown?: KeyboardEventHandler<HTMLInputElement>\n /** Popover anchored to the pill (e.g. a slash-command menu). Rendered in a\n * relative wrapper around the form, so absolute children position against\n * the pill. */\n menu?: ReactNode\n /** External input ref, for consumers that refocus after menu selection. */\n inputRef?: RefObject<HTMLInputElement | null>\n className?: string\n /** Root test id; children derive `-input`, `-submit`, `-search`, `-suggestion`. */\n testId?: string\n}\n\nexport function AskBar({\n onAsk,\n onSearch,\n suggestions = [],\n placeholder = 'Ask anything…',\n askLabel = 'Ask',\n searchLabel = 'Search',\n value,\n onValueChange,\n onInputKeyDown,\n menu,\n inputRef: externalInputRef,\n className,\n testId = 'ask-bar',\n}: AskBarProps) {\n const [innerText, setInnerText] = useState('')\n const text = value !== undefined ? value : innerText\n const setText = (next: string) => {\n onValueChange?.(next)\n if (value === undefined) setInnerText(next)\n }\n const localInputRef = useRef<HTMLInputElement>(null)\n const inputRef = externalInputRef ?? localInputRef\n\n const submitTo = (handler: (text: string) => void) => {\n const question = text.trim()\n if (!question) return\n handler(question)\n setText('')\n }\n\n return (\n <div className={cn('flex flex-col gap-2', className)} data-testid={testId}>\n <div className=\"relative\">\n {menu}\n <form\n onSubmit={(e) => {\n e.preventDefault()\n submitTo(onAsk)\n }}\n // The AppHeader search pill's language exactly — rounded-md,\n // border-input, magnifier left, muted text — so the bar sits in a\n // topbar the way clarum's ⌘K trigger does, not like a chat composer\n // dropped into a header.\n className=\"flex h-12 items-center gap-1.5 rounded-md border border-border/50 bg-background pl-3 pr-1.5 transition-colors focus-within:border-border\"\n >\n <Search className=\"pointer-events-none size-4 shrink-0 text-muted-foreground\" />\n <input\n ref={inputRef}\n type=\"text\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={onInputKeyDown}\n placeholder={placeholder}\n className=\"h-8 min-w-0 flex-1 bg-transparent text-sm text-foreground outline-none placeholder:text-muted-foreground\"\n data-testid={testId && `${testId}-input`}\n />\n {onSearch && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={!text.trim()}\n onClick={() => submitTo(onSearch)}\n className=\"h-8 shrink-0 px-2.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n data-testid={testId && `${testId}-search`}\n >\n {searchLabel}\n </Button>\n )}\n {/* The primary door wears clarum's Ask AI anatomy: Sparkles + label. */}\n <Button\n type=\"submit\"\n size=\"sm\"\n disabled={!text.trim()}\n className=\"h-8 shrink-0 px-3 text-xs font-medium\"\n data-testid={testId && `${testId}-submit`}\n >\n <Sparkles className=\"size-3.5\" />\n {askLabel}\n </Button>\n </form>\n </div>\n {suggestions.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {suggestions.map((s) => (\n <button\n key={s}\n type=\"button\"\n onClick={() => {\n setText(s)\n inputRef.current?.focus()\n }}\n className=\"rounded-full border border-border/50 bg-card px-3 py-1 text-xs text-muted-foreground transition-colors hover:border-border hover:bg-accent hover:text-foreground\"\n data-testid={testId && `${testId}-suggestion`}\n >\n {s}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n","/**\n * \"Pick up where you left off\" — the last few things you touched, whatever\n * their type, as one row of chips.\n *\n * Section cards segregate by type; this strip answers the question a returning\n * professional actually has (\"what was I doing?\"), which is time-ordered and\n * type-blind. The consumer merges and sorts; the strip only renders, so what\n * counts as \"recent\" stays a product decision, not a layout one.\n *\n * Styled with SEMANTIC tokens only, so every firm gets it in its own colours.\n */\n\nimport type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react'\n\nexport interface ResumeStripItem {\n id: string\n /** The item's type mark — a chat glyph, a document's file icon. */\n leading?: ReactNode\n title: string\n /** Compact age, e.g. \"2h\", \"3d\". */\n meta?: string\n onClick?: () => void\n}\n\nexport interface ResumeStripProps {\n items: ResumeStripItem[]\n /** Says what the strip is. */\n caption?: string\n className?: string\n /** Root test id; chips derive `-item`. */\n testId?: string\n}\n\nexport function ResumeStrip({\n items,\n caption = 'Pick up where you left off',\n className,\n testId = 'resume-strip',\n}: ResumeStripProps) {\n if (items.length === 0) return null\n\n return (\n <div className={cn('flex flex-col gap-1.5', className)} data-testid={testId}>\n <p className=\"text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {caption}\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={item.onClick}\n title={item.title}\n className=\"group flex min-w-0 items-center gap-2 rounded-lg border border-border/50 bg-card py-2 pl-2.5 pr-3 shadow-sm transition-colors hover:border-border hover:bg-accent/50\"\n data-testid={testId && `${testId}-item`}\n >\n {item.leading}\n <span className=\"max-w-[14rem] truncate text-sm font-medium text-foreground group-hover:text-primary\">\n {item.title}\n </span>\n {item.meta && (\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">{item.meta}</span>\n )}\n </button>\n ))}\n </div>\n </div>\n )\n}\n","/**\n * A section's entry on a home surface as one slim band — for sections that\n * earn a glance, not a quarter of the page.\n *\n * Anatomy mirrors {@link RecentActivityCard}'s split (header navigates,\n * actions beside it act, rows jump to items) at a fraction of the height, with\n * one addition: rows come in captioned GROUPS, because some sections read in\n * two registers at once — deadlines you plan around vs notes that accrete,\n * open items vs recently closed. The consumer decides the grouping; the strip\n * only renders it.\n *\n * An empty section gets a single quiet row, not a void: a band exists to stay\n * out of the way.\n *\n * Styled with SEMANTIC tokens only, so every firm gets it in its own colours.\n */\n\nimport type { ReactNode } from 'react'\nimport { Plus, type LucideIcon } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react'\n\nexport interface SectionStripRow {\n id: string\n /** The row's mark — a pin, a dot, a tiny glyph. Consumer-supplied. */\n leading?: ReactNode\n title: string\n /** Pinned right: a date, an age. */\n meta?: string\n onClick?: () => void\n}\n\nexport interface SectionStripGroup {\n /** Says what the group is — \"Upcoming\", \"Recent\". */\n caption: string\n rows: SectionStripRow[]\n /** Test id for this group's rows. Falls back to `<root>-row`. */\n rowTestId?: string\n}\n\nexport interface SectionStripAction {\n icon?: LucideIcon\n label: string\n onClick: () => void\n testId?: string\n /**\n * A custom element rendered in place of the default ghost button — for a\n * primary/emphasised action that shouldn't look like the quiet header doors.\n */\n node?: ReactNode\n}\n\nexport interface SectionStripProps {\n /** Glyph beside the title, in the header. */\n icon?: LucideIcon\n /** The section this band is about. */\n title: string\n /** Total across everything, not just what's listed. Omit to hide. */\n count?: number\n /** Header click — go to this section's full page. */\n onOpen?: () => void\n /** Header-right actions: distinct doors into the section's experiences. */\n actions?: SectionStripAction[]\n /** Captioned row groups; groups with no rows are skipped. */\n groups: SectionStripGroup[]\n /**\n * Shown when every group is empty. By default a single quiet row. Supply an\n * `icon` (and optional `description`) to render the fuller dashed empty state\n * instead — the same shape a card uses, for sections that want the empty\n * state to invite rather than just note.\n */\n empty?: {\n label: ReactNode\n onClick?: () => void\n testId?: string\n icon?: LucideIcon\n description?: ReactNode\n }\n className?: string\n /** Root test id; children derive `-open` and per-action/per-group ids. */\n testId?: string\n}\n\nexport function SectionStrip({\n icon: Icon,\n title,\n count,\n onOpen,\n actions = [],\n groups,\n empty,\n className,\n testId = 'section-strip',\n}: SectionStripProps) {\n const filledGroups = groups.filter((g) => g.rows.length > 0)\n\n return (\n <div\n className={cn('rounded-xl border border-border/60 bg-card p-2 shadow-sm', className)}\n data-testid={testId}\n >\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={onOpen}\n disabled={!onOpen}\n className=\"group flex min-w-0 flex-1 cursor-pointer items-center gap-2 rounded-lg px-2 py-1.5 text-left transition-colors hover:bg-primary/10 disabled:cursor-default disabled:hover:bg-transparent\"\n data-testid={testId && `${testId}-open`}\n >\n {Icon && <Icon className=\"size-4 shrink-0 text-muted-foreground\" />}\n <span className=\"whitespace-nowrap text-sm font-semibold text-foreground\">{title}</span>\n {count !== undefined && (\n <span className=\"text-xs tabular-nums text-muted-foreground\">{count}</span>\n )}\n </button>\n {actions.map((action) =>\n action.node ? (\n <div key={action.label} className=\"shrink-0\">\n {action.node}\n </div>\n ) : (\n <Button\n key={action.label}\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 shrink-0 px-2 text-xs font-medium text-muted-foreground hover:text-foreground\"\n onClick={action.onClick}\n title={action.label}\n data-testid={action.testId}\n >\n {action.icon && <action.icon className=\"size-3.5\" />}\n <span className=\"sr-only @md:not-sr-only @md:ml-1.5\">{action.label}</span>\n </Button>\n )\n )}\n </div>\n\n {filledGroups.length === 0 ? (\n empty ? (\n empty.icon ? (\n // Fuller dashed empty state, matching a card's — an invitation, not\n // just a note. The icon glyph rides a tinted circle that fills on\n // hover, exactly like RecentActivityCard's empty card.\n <button\n type=\"button\"\n onClick={empty.onClick}\n className=\"group mt-2 flex w-full cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed border-border px-4 py-8 text-center transition-colors hover:border-border hover:bg-accent/50 focus-visible:border-border focus-visible:bg-accent/50 focus-visible:outline-none\"\n data-testid={empty.testId}\n >\n <span className=\"mt-2 flex size-11 items-center justify-center rounded-full bg-primary/10 text-primary transition-colors group-hover:bg-primary group-hover:text-primary-foreground\">\n <empty.icon className=\"size-5\" />\n </span>\n <span className=\"text-sm font-semibold text-foreground\">{empty.label}</span>\n {empty.description && (\n <span className=\"text-xs leading-relaxed text-muted-foreground\">\n {empty.description}\n </span>\n )}\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={empty.onClick}\n className=\"flex w-full items-center gap-2 rounded-lg px-2 py-1.5 text-left text-sm text-muted-foreground transition-colors hover:bg-primary/5 hover:text-foreground\"\n data-testid={empty.testId}\n >\n <Plus className=\"size-3.5 shrink-0\" />\n {empty.label}\n </button>\n )\n ) : null\n ) : (\n <div className=\"grid gap-x-4 @2xl:grid-cols-2\">\n {filledGroups.map((group) => (\n <div key={group.caption}>\n <p className=\"mt-1 px-2 pb-0.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {group.caption}\n </p>\n <ul>\n {group.rows.map((row) => (\n <li key={row.id}>\n <button\n type=\"button\"\n onClick={row.onClick}\n title={row.title}\n className=\"group flex w-full min-w-0 items-center gap-2 rounded-lg px-2 py-1.5 text-left transition-colors [&:hover]:bg-primary/10\"\n data-testid={group.rowTestId ?? (testId && `${testId}-row`)}\n >\n {row.leading}\n <span className=\"min-w-0 flex-1 truncate text-sm text-foreground group-hover:text-primary\">\n {row.title}\n </span>\n {row.meta && (\n <span className=\"shrink-0 text-[11px] tabular-nums text-muted-foreground\">\n {row.meta}\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n","/**\n * An empty home surface as ONE invitation, not a grid of voids.\n *\n * A centered column: what this place is for (title, subtitle), the primary way\n * in (children — typically an {@link AskBar}), a big dashed secondary door\n * (add files, create the first record), and a quiet footer line. Empty cards\n * tell you a page has nothing; this tells you what the place is FOR.\n *\n * Styled with SEMANTIC tokens only, so every firm gets it in its own colours.\n */\n\nimport type { ReactNode } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { cn } from '@arbidocs/react'\n\nexport interface StartHeroProps {\n title: string\n subtitle?: string\n /** The primary way in — typically an AskBar. */\n children?: ReactNode\n /** The big dashed secondary door. */\n tile?: {\n icon: LucideIcon\n label: string\n description?: string\n onClick: () => void\n testId?: string\n }\n /** A quiet closing line — membership state, a hint. */\n footer?: ReactNode\n className?: string\n testId?: string\n}\n\nexport function StartHero({\n title,\n subtitle,\n children,\n tile,\n footer,\n className,\n testId,\n}: StartHeroProps) {\n return (\n <div className={cn('py-6', className)} data-testid={testId}>\n <div className=\"mx-auto flex max-w-2xl flex-col gap-5 text-center\">\n <div>\n <h2 className=\"text-lg font-semibold text-foreground\">{title}</h2>\n {subtitle && <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p>}\n </div>\n {children}\n {tile && (\n <button\n type=\"button\"\n onClick={tile.onClick}\n className=\"group flex cursor-pointer flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed border-border px-4 py-6 text-center transition-colors hover:border-border hover:bg-accent/50 focus-visible:border-border focus-visible:bg-accent/50 focus-visible:outline-none\"\n data-testid={tile.testId}\n >\n <span className=\"flex size-11 items-center justify-center rounded-full bg-primary/10 text-primary transition-colors group-hover:bg-primary group-hover:text-primary-foreground\">\n <tile.icon className=\"size-5\" />\n </span>\n <span className=\"text-sm font-semibold text-foreground\">{tile.label}</span>\n {tile.description && (\n <span className=\"text-xs leading-relaxed text-muted-foreground\">\n {tile.description}\n </span>\n )}\n </button>\n )}\n {footer && <div className=\"text-xs text-muted-foreground\">{footer}</div>}\n </div>\n </div>\n )\n}\n","import type { LucideIcon } from 'lucide-react'\nimport { useState, type FocusEvent, type KeyboardEvent, type ReactNode } from 'react'\nimport {\n ArrowLeftRight,\n CheckCircle2,\n FileText,\n FolderLock,\n Loader2,\n MessagesSquare,\n Users,\n} from 'lucide-react'\nimport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react'\nimport { fmtDate, fromNow } from '../lib/format'\nimport { MemberAvatarStack } from './MemberAvatarStack'\n\n/** One member shown in the avatar stack — source-agnostic, not the raw SDK shape. */\nexport interface WorkspaceCardMember {\n name: string\n picture?: string | null\n}\n\nexport interface WorkspaceCardProps {\n name: string\n /** Uppercase eyebrow under the name, e.g. the matter reference. Omit to let\n * the name and description carry the card on their own. */\n matterRef?: string\n description?: string\n docCount: number\n /** Conversation count, shown as a third stat. Omit to hide the stat entirely. */\n chatCount?: number\n /** Defaults to `members.length` when omitted. */\n memberCount?: number\n /** Drives the overlapping avatar stack (shows up to 3, then a `+N` overflow). */\n members?: WorkspaceCardMember[]\n /**\n * The member list is not visible to this viewer (e.g. row-level security hides\n * the members of a public workspace you haven't joined). Renders an em dash in\n * place of the count and drops the avatar stack, rather than lying with a `0`.\n */\n membersHidden?: boolean\n /** ISO timestamp — renders \"Updated {relative} ago\" at the footer's right edge. */\n updatedAt?: string\n /** Marks this as the current workspace: an accented card surface and a footer label. */\n active?: boolean\n /** Shows a spinner in the Open affordance while a switch is in flight. */\n busy?: boolean\n onOpen?: () => void\n /** Icon in the header tile. Defaults to a lock/folder glyph. */\n icon?: LucideIcon\n /** Replaces the whole header icon tile — for a richer, app-supplied glyph. */\n iconSlot?: ReactNode\n /** Canonical workspace entity pill shown at the top of the description tooltip. */\n tooltipEntitySlot?: ReactNode\n /**\n * Secondary context for the card (the ARBI app puts the owning project here).\n * Sits top-right and is revealed on hover/focus, so the resting card stays\n * about the workspace itself.\n */\n cornerSlot?: ReactNode\n /**\n * Accent as a theme colour-token key (e.g. `emerald`, or a firm's own brand\n * token), resolved to `var(--color-<accent>)` at render — same contract as\n * MetricCard. Tints the icon tile and the Open affordance, so a firm can accent\n * the card without its brand classes leaking into the kit. `'default'` (or\n * omitted) uses the semantic `primary` token.\n */\n accent?: string\n /** Stable id for the card root; the footer action gets `${testId}-open`. */\n testId?: string\n /** Overrides the footer action's test id when a caller needs a specific one. */\n buttonTestId?: string\n className?: string\n}\n\nconst MAX_AVATARS = 3\n\n/**\n * The one true workspace card. A themeable, source-agnostic tile, in three bands:\n *\n * 1. header — icon + workspace name; secondary context (`cornerSlot`) hides\n * top-right until hover, keeping the resting card about the workspace.\n * 2. body — an expanded description area with the centred Open/current\n * affordance layered over it only on hover or keyboard focus.\n * 3. footer — doc/chat counts stay left and membership stays right, followed\n * by a final left-aligned update timestamp.\n *\n * State is said once, in words. There is deliberately no status badge.\n *\n * Styled with the kit's SEMANTIC tokens only (foreground, muted-foreground,\n * primary, card, border, accent), so every firm gets it in its own colours\n * without any firm-branded classes leaking in.\n */\nexport function WorkspaceCard({\n name,\n matterRef,\n description,\n docCount,\n chatCount,\n memberCount,\n members = [],\n membersHidden = false,\n updatedAt,\n active = false,\n busy = false,\n onOpen,\n icon: Icon = FolderLock,\n iconSlot,\n tooltipEntitySlot,\n cornerSlot,\n accent = 'default',\n testId,\n buttonTestId,\n className,\n}: WorkspaceCardProps) {\n const totalMembers = memberCount ?? members.length\n const actionTestId = buttonTestId ?? (testId ? `${testId}-open` : undefined)\n const canOpen = Boolean(onOpen) && !busy\n const [isHoverPointerActive, setIsHoverPointerActive] = useState(false)\n const [isKeyboardFocused, setIsKeyboardFocused] = useState(false)\n const revealInteractiveContent = isHoverPointerActive || isKeyboardFocused\n const showOpenAction = busy || revealInteractiveContent\n\n // An accent overrides the semantic primary the tile and Open affordance default to.\n // The soft fill is a color-mix of the accent, so one token key drives both.\n const hue = accent && accent !== 'default' ? `var(--color-${accent})` : null\n const tileStyle = hue\n ? { backgroundColor: `color-mix(in oklab, ${hue} 14%, transparent)`, color: hue }\n : undefined\n const openStyle = hue ? { backgroundColor: hue, color: 'var(--color-background)' } : undefined\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (!canOpen || event.target !== event.currentTarget) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n onOpen?.()\n }\n }\n\n const handleFocusCapture = (event: FocusEvent<HTMLDivElement>) => {\n setIsKeyboardFocused(event.target instanceof Element && event.target.matches(':focus-visible'))\n }\n\n const handleBlurCapture = (event: FocusEvent<HTMLDivElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) {\n setIsKeyboardFocused(false)\n }\n }\n\n return (\n <Card\n variant=\"flat\"\n className={cn(\n 'card-hover relative flex h-48 w-full flex-col gap-3 overflow-hidden rounded-xl bg-card p-4 shadow-sm',\n canOpen &&\n 'cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2',\n active && 'bg-primary/10 shadow-md',\n className\n )}\n data-testid={testId}\n data-active={active || undefined}\n role={canOpen ? 'button' : undefined}\n tabIndex={canOpen ? 0 : undefined}\n aria-current={active ? 'page' : undefined}\n aria-label={canOpen ? `Open workspace ${name}` : undefined}\n aria-busy={busy || undefined}\n onClick={canOpen ? onOpen : undefined}\n onKeyDown={handleKeyDown}\n onPointerEnter={(event) => {\n if (event.pointerType !== 'touch') setIsHoverPointerActive(true)\n }}\n onPointerLeave={() => setIsHoverPointerActive(false)}\n onFocusCapture={handleFocusCapture}\n onBlurCapture={handleBlurCapture}\n >\n <CardHeader className=\"flex flex-row items-center gap-3 space-y-0 p-0\">\n {iconSlot ?? (\n <div\n className=\"flex size-9 shrink-0 items-center justify-center rounded-md bg-primary/10 text-primary\"\n style={tileStyle}\n >\n <Icon className=\"size-5\" />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <CardTitle\n className=\"line-clamp-2 text-base font-bold leading-tight\"\n data-testid={testId && `${testId}-title`}\n >\n {name}\n </CardTitle>\n {matterRef && (\n <CardDescription className=\"mt-0.5 truncate text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {matterRef}\n </CardDescription>\n )}\n </div>\n {cornerSlot && (\n <div\n className={cn(\n 'shrink-0 opacity-0 transition-opacity',\n revealInteractiveContent && 'opacity-100'\n )}\n >\n {cornerSlot}\n </div>\n )}\n </CardHeader>\n\n <CardContent className=\"relative flex min-h-0 flex-1 flex-col p-0\">\n {description && (\n <Tooltip>\n <TooltipTrigger asChild>\n <p\n className={cn(\n 'line-clamp-2 text-sm text-muted-foreground opacity-100 transition-opacity',\n showOpenAction && 'opacity-0'\n )}\n >\n {description}\n </p>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-sm p-0\">\n <div className=\"overflow-hidden rounded-md\">\n <div className=\"flex items-center bg-muted/70 px-3 py-2.5\">\n {tooltipEntitySlot ?? <span className=\"text-sm font-semibold\">{name}</span>}\n </div>\n <p className=\"px-3 py-3 text-sm leading-relaxed text-foreground/90\">\n {description}\n </p>\n </div>\n </TooltipContent>\n </Tooltip>\n )}\n\n <span\n className={cn(\n 'pointer-events-none absolute inset-0 z-10 inline-flex items-center justify-center whitespace-nowrap opacity-0 transition-opacity',\n showOpenAction && 'opacity-100'\n )}\n data-testid={actionTestId}\n >\n <span\n className={cn(\n 'inline-flex w-full items-center justify-center gap-2 rounded-md px-4 py-2 text-base font-semibold shadow-md',\n active ? 'bg-muted-foreground text-background' : 'bg-primary text-primary-foreground'\n )}\n style={active ? undefined : openStyle}\n >\n {active ? (\n <>\n <CheckCircle2 className=\"size-4\" /> Current workspace\n </>\n ) : busy ? (\n <>\n <Loader2 className=\"size-4 animate-spin\" /> Opening\n </>\n ) : (\n <>\n <ArrowLeftRight className=\"size-4\" /> Open\n </>\n )}\n </span>\n </span>\n </CardContent>\n\n <CardFooter className=\"mt-auto flex w-full min-w-0 flex-col items-stretch gap-3 overflow-hidden p-0\">\n {/* Lucide stats stay left; only the member faces stay right. */}\n <div className=\"flex w-full items-center gap-x-3 text-sm\">\n <div className=\"flex items-center gap-x-3\">\n <span className=\"inline-flex items-center gap-1 text-foreground\" title=\"Documents\">\n <FileText className=\"size-3.5 text-muted-foreground\" />\n <span className=\"font-medium tabular-nums\">{docCount.toLocaleString()}</span>\n </span>\n {chatCount !== undefined && (\n <span className=\"inline-flex items-center gap-1 text-foreground\" title=\"Chats\">\n <MessagesSquare className=\"size-3.5 text-muted-foreground\" />\n <span className=\"font-medium tabular-nums\">{chatCount.toLocaleString()}</span>\n </span>\n )}\n <span className=\"inline-flex items-center gap-1 text-foreground\" title=\"Members\">\n <Users className=\"size-3.5 text-muted-foreground\" />\n <span\n className=\"font-medium tabular-nums\"\n data-testid={testId && `${testId}-member-count`}\n >\n {membersHidden ? '—' : totalMembers}\n </span>\n </span>\n </div>\n\n <MemberAvatarStack\n members={members}\n total={totalMembers}\n max={MAX_AVATARS}\n hidden={membersHidden}\n className=\"ml-auto\"\n testId={testId && `${testId}-member-avatars`}\n />\n </div>\n\n {updatedAt && (\n <span\n className=\"min-w-0 max-w-full self-start truncate text-left text-xs text-muted-foreground\"\n title={fmtDate(updatedAt)}\n >\n Updated {fromNow(updatedAt)}\n </span>\n )}\n </CardFooter>\n </Card>\n )\n}\n","import { cn } from '@arbidocs/react'\n\nexport interface StatItem {\n value: string\n label: string\n /** Optional caption under the label (e.g. a qualifier or unit). */\n sub?: 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 {item.sub && <p className=\"mt-1 text-xs text-muted-foreground/80\">{item.sub}</p>}\n </div>\n ))}\n </dl>\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, TooltipProvider } 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 // One TooltipProvider for the whole back office: every kit component that\n // renders a tooltip (entity pills, document tiles, toolbars) inherits the\n // same hover delay, and no app has to remember to mount it.\n <TooltipProvider>\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 </TooltipProvider>\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 * The SDK-backed half of asset resolution.\n *\n * Kept apart from `assetResolver.tsx` on purpose. `BlockImage` — and through it\n * every website block — must not reach the SDK, React Query or AG Grid, so that\n * `@arbidocs/blocks/site` can be imported by an unauthenticated marketing page.\n * A dead code path is not enough: neither kit package declares `sideEffects`, so\n * a bundler must keep whatever the module graph mentions. The resolver is\n * therefore *injected* (see `AssetResolverProvider`) rather than imported, and\n * only the authenticated Studio — which already depends on the SDK — hands this\n * module in.\n */\nimport { useEffect } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { useArbi, useThumbnails } from '@arbidocs/react'\nimport type { AssetRenderProps } from './assetResolver'\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/**\n * Resolve a single asset ext_id and render it as an `<img>`. This is the\n * `AssetRenderer` the Studio injects; it satisfies `AssetRenderProps`.\n */\nexport function AssetThumb({ docId, alt, className, testId }: AssetRenderProps) {\n const src = useAssetImage(docId)\n return <img src={src ?? undefined} alt={alt ?? ''} className={className} data-testid={testId} />\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 { AssetThumb } from '../components/assetImage'\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 render={AssetThumb}>\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, optionally editing / drawing on one or\n * more reference images already in the workspace. Pass the reference images'\n * document ext_ids in `referenceDocIds` (omit or `[]` for plain text→image).\n * Resolves with the new image document's ext_id, or null when the prompt is\n * empty or no image was produced.\n */\n generate: (prompt: string, referenceDocIds?: 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, referenceDocIds: string[] = []): Promise<string | null> => {\n const trimmed = prompt.trim()\n if (!trimmed) return null\n // `/image` rides the agent pipeline; the backend resolves the active\n // workspace from the session. Reference images are *grounded* on the task\n // (second arg) — they land in the agent's document index (typed as images\n // via its Type column), so the create_image tool picks them up as\n // `input_image_doc_ids`. Empty → plain text→image.\n const result = await run(`/image ${trimmed}`, referenceDocIds)\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 { Check, 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 } from '../components/assetResolver'\nimport { useAssetImage } from '../components/assetImage'\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 // Reference images (doc ext_ids) to edit / draw on when generating. Empty is a\n // plain text→image; one or more turns it into an edit / variation.\n const [refIds, setRefIds] = useState<string[]>([])\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 // Toggle a workspace image doc in/out of the reference set.\n const toggleRef = (id: string) =>\n setRefIds((prev) => (prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]))\n\n const onGenerate = async () => {\n if (!prompt.trim() || gen.isGenerating) return\n const id = await gen.generate(prompt, refIds)\n if (id) {\n onChange(asAssetRef(id))\n setRefIds([]) // fresh slate for the next generation\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 {/* Reference images (optional): edit or draw on existing workspace\n images. Multi-select — the backend accepts one or more. */}\n {imageDocs.length > 0 && (\n <div className=\"flex flex-col gap-1\" data-testid={tp('refs')}>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-muted-foreground\">\n Reference images{refIds.length > 0 ? ` (${refIds.length})` : ' (optional)'}\n </span>\n {isAssetRef(value) && (\n <button\n type=\"button\"\n className=\"text-xs font-medium text-primary hover:underline\"\n onClick={() => toggleRef(assetRefId(value))}\n data-testid={tp('vary-current')}\n >\n {refIds.includes(assetRefId(value)) ? 'Varying current' : 'Vary current image'}\n </button>\n )}\n </div>\n <div className=\"grid max-h-28 grid-cols-4 gap-1.5 overflow-auto\">\n {imageDocs.map((d: { external_id: string; file_name?: string | null }) => {\n const thumb = thumbs?.[d.external_id]\n const on = refIds.includes(d.external_id)\n return (\n <button\n key={d.external_id}\n type=\"button\"\n onClick={() => toggleRef(d.external_id)}\n aria-pressed={on}\n className={`relative overflow-hidden rounded border ${on ? 'border-primary ring-1 ring-primary' : 'border-border'}`}\n title={d.file_name ?? ''}\n data-testid={tp('ref', 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-3.5\" />\n </span>\n )}\n {on && (\n <span className=\"absolute right-0.5 top-0.5 rounded-full bg-primary p-0.5 text-primary-foreground\">\n <Check className=\"size-2.5\" />\n </span>\n )}\n </button>\n )\n })}\n </div>\n </div>\n )}\n <textarea\n className={inputClass}\n rows={2}\n placeholder={refIds.length > 0 ? 'Describe the edit to apply…' : '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\n ? 'Generating…'\n : refIds.length > 0\n ? `Generate from ${refIds.length} reference${refIds.length > 1 ? 's' : ''}`\n : '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'\nimport { Timeline, type TimelineViewMode } from '../timeline'\n\n/** One editor row of the Timeline block's `items` array. */\ninterface TimelineEntryProps {\n label?: string\n description?: string\n start: string\n end?: string\n}\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 /** A dated chronology on a page — key dates, a project plan, a hearing timetable.\n *\n * Dates are typed as ISO text (`2026-03-01`, or a full timestamp) because that\n * is what a span needs and what every backend already returns. An item without\n * an end is an instant; give it one and it becomes a bar covering that stretch. */\n const TimelineBlockConfig: ComponentConfig = {\n label: 'Timeline',\n fields: {\n view: {\n type: 'radio',\n label: 'View',\n options: [\n { label: 'Reader chooses', value: 'both' },\n { label: 'Calendar', value: 'calendar' },\n { label: 'Gantt', value: 'gantt' },\n ],\n },\n height: { type: 'number', label: 'Height (px)', min: 200, max: 1200 },\n items: {\n type: 'array',\n label: 'Entries',\n arrayFields: {\n label: textField('Label'),\n description: textareaField('Description'),\n start: { type: 'text', label: 'Start (YYYY-MM-DD)' },\n end: { type: 'text', label: 'End (YYYY-MM-DD, optional)' },\n },\n defaultItemProps: { label: 'Milestone', description: '', start: '', end: '' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Entry',\n },\n },\n defaultProps: {\n view: 'both',\n height: 520,\n items: [\n {\n label: 'Kick-off',\n description: 'Project starts.',\n start: '2026-01-12',\n end: '',\n },\n {\n label: 'Build phase',\n description: 'Design and implementation.',\n start: '2026-01-19',\n end: '2026-03-13',\n },\n {\n label: 'Launch',\n description: 'Public release.',\n start: '2026-03-30',\n end: '',\n },\n ],\n },\n render: ({ id, view, height, items }) => (\n <div style={{ height: height ?? 520 }}>\n <Timeline\n items={(items ?? [])\n .filter((item: { start?: string }) => !!item?.start)\n .map((item: TimelineEntryProps, index: number) => ({\n id: `${id}-${index}`,\n label: item.label ?? '',\n start: item.start,\n end: item.end || undefined,\n description: item.description || undefined,\n }))}\n view={view === 'both' ? undefined : (view as TimelineViewMode)}\n testId={blockTestId(id)}\n />\n </div>\n ),\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 Timeline: TimelineBlockConfig,\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', 'Timeline'] },\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/citations/CitationEditor.tsx","../src/connection/ConnectionProvider.tsx","../src/connection/LegalArbiProvider.tsx","../src/connection/ai.ts","../src/components/EmptyState.tsx","../src/components/DataTable.tsx","../src/components/DataTableBlock.tsx","../src/components/GridView.tsx","../src/components/UsageMeter.tsx","../src/components/UploadDropzone.tsx","../src/components/PageHeader.tsx","../src/components/Toolbar.tsx","../src/components/EntityIdentityBar.tsx","../src/components/MemberAvatarStack.tsx","../src/components/MetricCard.tsx","../src/components/RecentActivityCard.tsx","../src/components/AskBar.tsx","../src/components/ResumeStrip.tsx","../src/components/SectionCaption.tsx","../src/components/QuickActionCards.tsx","../src/components/SectionStrip.tsx","../src/components/StartHero.tsx","../src/components/WorkspaceCard.tsx","../src/components/StatGroup.tsx","../src/nav/AppShell.tsx","../src/nav/AppHeader.tsx","../src/studio/liveData.ts","../src/studio/liveWidgetRuntime.tsx","../src/studio/widgets.tsx","../src/components/assetImage.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":["useState","useCallback","useMemo","jsx","useKitAiTask","useKitWorkspaceDocs","useKitSemanticSearch","jsxs","cn","useRef","useEffect","lines","alignClass","pct","Textarea","Input","Card","Fragment","Search","Button","Plus","Loader2","Sparkles","X","createContext","useContext","FileText","MessagesSquare","useArbi","persist","Link","useDocuments","useThumbnails","name","Link2","Users","Rocket","Tabs","emptySlot","id","a","b","create","toggle","CardHeader","CardTitle","CardContent","ChevronDown","Badge","useQuery","Cpu","Bot","Palette"],"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 * CitationEditor Component\n *\n * Note input plus the source passages backing it.\n * - Pick related documents; each opens so its passages can be chosen by reading\n * - Click a passage to add it, shift-click for a range; repeat across documents\n *\n * A note answers ONE question, so it has ONE set of sources. It used to carry a\n * map of citations, each with its own statement and character offsets, rendered\n * as inline highlighted spans with [n] badges — but the statements were copies\n * of the note text and the offsets spanned all of it, so the highlight was the\n * whole field. That machinery is gone; the note renders as plain text.\n *\n * ``activeCitationKey``/``onActiveCitationChange`` are kept because the viewer\n * and store thread them through to decide which field is receiving passages.\n * With a single citation the key is just a sentinel — see ONLY_CITATION_KEY.\n */\n\nimport { useCallback, useState, useRef, useEffect, useMemo } from 'react'\nimport { X } from 'lucide-react'\nimport { cn, DocumentEntity, Textarea, type DocumentLike } from '@arbidocs/react'\nimport { formatPageRefs } from '../lib/format'\n\nimport type { components } from '@arbidocs/client'\n\ntype CitationSources = components['schemas']['CitationSources']\n\ntype Citations = CitationSources | null\n\nexport interface CitationEditorProps {\n value: string\n citations: Citations | null\n onChange: (note: string, citations: Citations | null) => void\n /** Currently active citation key (controlled from parent) */\n activeCitationKey?: string | null\n /**\n * Open a document in the viewer, armed to collect passages for this field —\n * and tag its first passage, so a chosen document is immediately a usable\n * citation. Passages are picked by reading, so citing means opening.\n *\n * The caller owns this because resolving \"first passage\" needs the parsed\n * document, and keeping that fetch out here is what lets this component stay\n * store- and API-free (and therefore hoistable to @arbidocs/blocks).\n */\n onCiteDocument?: (docExtId: string) => void\n /** Cited documents, already resolved by the caller — keyed by external id. */\n citedDocs?: Record<string, DocumentLike>\n /**\n * The app's document picker, injected as a slot. It is store-coupled, so it\n * is passed in rather than imported, and receives the chosen document id.\n */\n renderDocumentPicker?: (\n onSelect: (docExtId: string) => void,\n selectedIds: string[]\n ) => React.ReactNode\n placeholder?: string\n readOnly?: boolean\n className?: string\n /** Start in edit mode with the caret in the field (composer behaviour). */\n autoFocus?: boolean\n /** Applied to the text field itself, so callers can target it directly. */\n 'data-testid'?: string\n /** Persisted textarea height in pixels */\n defaultHeight?: number\n /** Called after user resizes the textarea */\n onHeightChange?: (height: number) => void\n}\n\nexport function CitationEditor({\n value,\n citations,\n onChange,\n activeCitationKey,\n onCiteDocument,\n citedDocs,\n renderDocumentPicker,\n autoFocus = false,\n 'data-testid': dataTestId,\n placeholder = 'Add a note...',\n readOnly = false,\n className,\n defaultHeight,\n onHeightChange,\n}: CitationEditorProps) {\n const [localValue, setLocalValue] = useState(value)\n const [isEditing, setIsEditing] = useState(autoFocus)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // Sync from parent only when not editing\n useEffect(() => {\n if (!isEditing) {\n setLocalValue(value)\n }\n }, [value, isEditing])\n\n const sources = useMemo(() => citations ?? [], [citations])\n const hasCitations = sources.length > 0\n\n // A citation is doc-first: each entry is a document with the pages cited\n // from it (none = the whole document).\n const byDoc = useMemo(() => {\n const groups = new Map<string, { pages: number[]; count: number }>()\n for (const doc of sources) {\n const chunks = doc.chunks ?? []\n const pages: number[] = []\n for (const c of chunks) if (c.page != null && !pages.includes(c.page)) pages.push(c.page)\n groups.set(doc.doc_ext_id, { pages, count: chunks.length })\n }\n return groups\n }, [sources])\n\n const docIds = Array.from(byDoc.keys())\n\n const handleRemoveDocument = useCallback(\n (docExtId: string) => {\n const remaining = sources.filter((d) => d.doc_ext_id !== docExtId)\n onChange(localValue, remaining.length ? remaining : null)\n },\n [sources, localValue, onChange]\n )\n\n const handleToggleDocument = useCallback(\n (docExtId: string) => {\n if (!docExtId) return\n // Selecting one already in the list removes it (and its passages) — the\n // tick in the picker has to mean something you can undo from there.\n if (docIds.includes(docExtId)) {\n handleRemoveDocument(docExtId)\n return\n }\n onCiteDocument?.(docExtId)\n },\n [docIds, onCiteDocument, handleRemoveDocument]\n )\n\n // The note is plain text. Nothing to slice: with one citation per note there\n // are no per-statement spans to highlight.\n const renderedContent = useMemo(\n () => (localValue ? <span>{localValue}</span> : null),\n [localValue]\n )\n\n // Debounced text change. Editing the note no longer has to re-anchor\n // anything — the sources are attached to the note as a whole.\n const handleChange = useCallback(\n (newValue: string) => {\n setLocalValue(newValue)\n if (debounceRef.current) clearTimeout(debounceRef.current)\n debounceRef.current = setTimeout(() => onChange(newValue, citations ?? null), 400)\n },\n [citations, onChange]\n )\n\n /**\n * Publish any debounced edit immediately.\n *\n * Without this, typing and then clicking Save within the debounce window\n * silently drops the last keystrokes: the parent still holds the previous\n * value when it reads state to submit.\n */\n const flushPendingChange = useCallback(() => {\n if (!debounceRef.current) return\n clearTimeout(debounceRef.current)\n debounceRef.current = null\n onChange(localValue, citations ?? null)\n }, [localValue, citations, onChange])\n\n return (\n <div className={cn('space-y-1', className)}>\n {/* Text area with highlighted citations preview when not editing */}\n <div className=\"relative\">\n {isEditing ? (\n <Textarea\n ref={textareaRef}\n dictate\n value={localValue}\n onChange={(e) => handleChange(e.target.value)}\n onBlur={() => {\n flushPendingChange()\n setIsEditing(false)\n }}\n onMouseUp={() => {\n if (textareaRef.current && onHeightChange) {\n onHeightChange(textareaRef.current.offsetHeight)\n }\n }}\n placeholder={placeholder}\n readOnly={readOnly}\n rows={2}\n data-testid={dataTestId}\n autoFocus\n style={defaultHeight ? { height: defaultHeight } : undefined}\n className=\"w-full text-sm p-2 pr-14 border border-border rounded-md resize-y bg-background focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n ) : (\n <div\n onClick={() => !readOnly && setIsEditing(true)}\n style={defaultHeight ? { minHeight: defaultHeight } : undefined}\n data-testid={dataTestId}\n className={cn(\n 'w-full text-sm p-2 pr-14 border border-border rounded-md min-h-[4rem] whitespace-pre-wrap bg-background',\n !readOnly && 'cursor-text hover:border-ring',\n !localValue && 'text-muted-foreground'\n )}\n >\n {renderedContent || placeholder}\n </div>\n )}\n </div>\n\n {/* Sources — one row per cited document, each showing how many passages\n were tagged in it. Clicking a document reopens it in the viewer so more\n passages can be tagged; the passages themselves are chosen by reading,\n which is why citing is inseparable from opening. */}\n {(hasCitations || !readOnly) && (\n <div className=\"flex flex-col gap-1\">\n {docIds.map((docId) => {\n const doc = citedDocs?.[docId]\n const group = byDoc.get(docId)\n const pages = (group?.pages ?? []).slice().sort((a, b) => a - b)\n return (\n <div\n key={docId}\n className=\"flex items-center gap-1.5 text-sm\"\n data-testid={`citation-doc-${docId}`}\n >\n {doc ? (\n <button\n type=\"button\"\n onClick={() => !readOnly && onCiteDocument?.(docId)}\n // flex-1 so the title gets the row's spare width — the count\n // and remove control are shrink-0 and sit at the end.\n className=\"flex-1 min-w-0 text-left\"\n title=\"Open to tag more passages\"\n >\n <DocumentEntity doc={doc} fullWidth labelMaxWidth=\"max-w-full\" />\n </button>\n ) : (\n <span className=\"text-muted-foreground\">{docId}</span>\n )}\n <span className=\"text-muted-foreground shrink-0\">{formatPageRefs(pages)}</span>\n {!readOnly && (\n <button\n type=\"button\"\n onClick={() => handleRemoveDocument(docId)}\n aria-label=\"Remove this document\"\n className=\"p-0.5 hover:bg-destructive/20 hover:text-destructive rounded shrink-0\"\n >\n <X size={12} />\n </button>\n )}\n </div>\n )\n })}\n\n {!readOnly && (\n <div className=\"flex items-center gap-1\">\n {/* The picker is rendered inline rather than behind a button: adding\n a source is the primary action here, and hiding it behind\n \"+ Document\" cost a click for no benefit. Once a document is\n cited, this row becomes \"add another\". */}\n <div className=\"flex-1 min-w-0\" data-testid=\"citation-document-picker\">\n {renderDocumentPicker?.(handleToggleDocument, docIds)}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Hint when citation is active */}\n {activeCitationKey && (\n <p className=\"text-sm text-blue-text\">\n Click a passage in the document to add it — <strong>shift-click</strong> to take a whole\n range. Add as many as you like, from as many documents as you like.\n </p>\n )}\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 /**\n * Affirmatively select a workspace: opens it on the server (via the SDK),\n * updates the app-wide state, and persists the choice so it survives future\n * logins. This is the single entry point for \"the user is now in workspace X\".\n */\n setWorkspace: (id: string) => Promise<void>\n /**\n * Re-assert the selected workspace on the server session (idempotent `/open`).\n * Call before a workspace-scoped write when the session may have lost its open\n * workspace (token re-login, backend restart, session expiry) — the server\n * resolves the workspace from the session, so a dropped `/open` yields\n * \"No active workspace\" until it's re-opened.\n */\n ensureWorkspaceOpen: () => Promise<void>\n}\n\nconst ConnectionContext = createContext<ConnectionValue | null>(null)\n\n/**\n * Persist the affirmatively-selected workspace per backend, so a returning user\n * lands back in the workspace they last chose (mirrors how ARBI-frontend keeps\n * the selected workspace in persisted store). Namespaced by apiUrl so distinct\n * deployments (and the demo firm) don't clobber each other.\n */\nconst WORKSPACE_STORAGE_PREFIX = 'arbi:selectedWorkspace'\nconst workspaceStorageKey = (apiUrl: string) => `${WORKSPACE_STORAGE_PREFIX}:${apiUrl || 'demo'}`\n\nfunction readPersistedWorkspace(apiUrl: string): string | null {\n try {\n return window.localStorage.getItem(workspaceStorageKey(apiUrl))\n } catch {\n return null\n }\n}\n\nfunction persistWorkspace(apiUrl: string, id: string | null): void {\n try {\n if (id) window.localStorage.setItem(workspaceStorageKey(apiUrl), id)\n else window.localStorage.removeItem(workspaceStorageKey(apiUrl))\n } catch {\n // Storage unavailable (private mode, SSR) — selection stays in-memory only.\n }\n}\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 workspace the user last affirmatively selected (persisted),\n // then the configured matter workspace (there may be several — e.g. a\n // marketing/KM workspace), then whichever happens to be first. Ternary\n // (not `&&`) so an empty value can't leak `\"\"` into `target`.\n const persisted = readPersistedWorkspace(config.apiUrl)\n const preferred = persisted ?? 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 persistWorkspace(config.apiUrl, 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, config.apiUrl]\n )\n\n const logout = useCallback(() => {\n if (mode === 'live') {\n void arbi.logout?.()\n }\n setUser(null)\n setWorkspaceId(null)\n persistWorkspace(config.apiUrl, null)\n setStatus('disconnected')\n setError(null)\n }, [arbi, mode, config.apiUrl])\n\n // Affirmative selection: open the workspace on the server (live), then remember\n // it in state + storage so every surface — and the next login — is in sync.\n const setWorkspace = useCallback(\n async (id: string) => {\n if (mode === 'live' && arbi.isLoggedIn) {\n await arbi.selectWorkspace(id)\n }\n setWorkspaceId(id)\n persistWorkspace(config.apiUrl, id)\n },\n [arbi, mode, config.apiUrl]\n )\n\n // Re-open the selected workspace on the session if the server may have dropped\n // it. Idempotent: re-running `/open` for the already-selected workspace is safe.\n const ensureWorkspaceOpen = useCallback(async () => {\n if (mode !== 'live' || !arbi.isLoggedIn) return\n const id = workspaceId ?? readPersistedWorkspace(config.apiUrl) ?? config.workspaceId\n if (id) await arbi.selectWorkspace(id)\n }, [arbi, mode, workspaceId, config.apiUrl, config.workspaceId])\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 ensureWorkspaceOpen,\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 ensureWorkspaceOpen,\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","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 — inherit the host app's font. A googleFont here never\n // loaded under the apps' CSP, so every grid silently fell back to the\n // browser's default SERIF and read as unstyled.\n fontFamily: 'inherit',\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 // The visibility the user actually intends, per colId. AG Grid re-processes the\n // column definitions on some React re-renders even when the `columnDefs`\n // reference is unchanged, and that reset restores each colDef's `hide` — so a\n // column the user turned on (e.g. via a fields menu) silently disappears the\n // next time the host re-renders (opening an editor, selecting a row, …). We\n // remember the intended visibility and restore it whenever such a reset fires.\n // A Map (not a Set of hidden ids) so a genuinely NEW column from a real\n // columnDefs change — one we've never seen — is left at its colDef default\n // rather than force-shown.\n const desiredHiddenRef = useRef<Map<string, boolean> | null>(null)\n\n const snapshotDesiredHidden = useCallback(() => {\n const api = gridApiRef.current\n if (!api) return\n desiredHiddenRef.current = new Map(api.getColumnState().map((c) => [c.colId, !!c.hide]))\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 // Seed the intended column visibility from the state AG Grid settled on\n // (colDefs + restored persisted state) so a later colDef-driven reset can\n // be undone rather than silently hiding a user-shown column.\n snapshotDesiredHidden()\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 [\n onGridReady,\n getItemId,\n ensureSelectionColumnVisible,\n snapshotDesiredHidden,\n initialState,\n initialVisibleColumns,\n ]\n )\n\n // Undo AG Grid's colDef-driven visibility reset; record genuine user changes.\n const handleColumnVisible = useCallback(\n (event: { source?: string }) => {\n const api = gridApiRef.current\n if (!api) return\n // A columnDefs re-apply reports `gridOptionsChanged`; a real toggle reports\n // an interaction source (api, toolPanelUi, columnMenu, …).\n if (event.source === 'gridOptionsChanged') {\n const desired = desiredHiddenRef.current\n if (!desired) return\n // Only correct columns we've seen before (in the snapshot); a brand-new\n // column keeps its colDef default.\n const fixes = api\n .getColumnState()\n .filter(\n (c) =>\n c.colId !== 'ag-Grid-SelectionColumn' &&\n desired.has(c.colId) &&\n desired.get(c.colId) !== !!c.hide\n )\n .map((c) => ({ colId: c.colId, hide: desired.get(c.colId) }))\n if (fixes.length) api.applyColumnState({ state: fixes })\n } else {\n // Genuine change — this is now the intended visibility.\n snapshotDesiredHidden()\n }\n },\n [snapshotDesiredHidden]\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 // Seed the intended visibility from the state AG Grid settled on (colDefs +\n // any restored persisted state), so later resets can be undone.\n snapshotDesiredHidden()\n }, [ensureSelectionColumnVisible, snapshotDesiredHidden])\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 multiline columns (.cell-multiline —\n // Abstract, Author, custom text fields) need so their overflow clip lands on\n // a WHOLE-line boundary (never mid-line, which reads as a half-line\n // \"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 // --multiline-line-clamp : whole number of lines that fit — drives the CSS\n // line-clamp that hides overflow lines entirely.\n // --multiline-pad-y : vertical cell padding, shrunk on very short rows so\n // at least one whole line always fits.\n // --multiline-max-h : cap of exactly N whole lines + TOP padding + borders.\n // Deliberately excludes the bottom padding: AG Grid\n // forces cell height, so overflow clips at the\n // padding-box edge and any bottom padding becomes a\n // window onto the next (clamped-away) line. Ending the\n // box right at line N's bottom puts the clip on the\n // line boundary; the row supplies the visual gap below.\n const containerStyle = useMemo(() => {\n const style: React.CSSProperties = { height }\n if (rowHeight) {\n const LINE_PX = 14 * 1.35 // grid font-size × multiline line-height (18.9px)\n const BORDER = 2 // multiline 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['--multiline-line-clamp'] = `${lines}`\n vars['--multiline-pad-y'] = `${padTotal / 2}px`\n vars['--multiline-max-h'] = `${lines * LINE_PX + padTotal / 2 + 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 onColumnVisible={handleColumnVisible}\n {...combinedOptions}\n />\n </div>\n )\n}\n","import type { LucideIcon } from 'lucide-react'\nimport { cn } from '@arbidocs/react'\n\n/**\n * One labelled quota meter: icon + label on the left, used-of-limit on the\n * right, a thin bar underneath. The bar's tone follows pressure with the shared\n * green → yellow → red gradation — green while there's room, yellow past the\n * halfway mark, red at the limit — so a stack of meters reads at a glance which\n * quota is the one to think about.\n */\nexport function UsageMeter({\n icon: Icon,\n label,\n value,\n pct,\n hint,\n className,\n testId,\n}: {\n icon?: LucideIcon\n label: string\n /** Formatted used-of-limit text, e.g. \"1,200 / 25,000\" or \"40 / 500 MB\". */\n value: string\n /** Fill percentage, 0–100 (values are clamped). */\n pct: number\n /** Inline parenthetical after the label, e.g. \"resets May 31, 2025\" —\n * same font as the label, so the meter never grows an extra row. */\n hint?: string\n className?: string\n testId?: string\n}) {\n const clamped = Math.max(0, Math.min(100, pct))\n // Shared green → yellow → red gradation (same thresholds as the project-card\n // quota badges): green with room, yellow past the halfway mark, red at limit.\n const tone = clamped >= 100 ? 'bg-red-500' : clamped >= 50 ? 'bg-yellow-500' : 'bg-green-500'\n return (\n <div className={cn('space-y-1.5', className)} data-testid={testId}>\n <div className=\"flex items-center justify-between gap-3 text-sm\">\n <span className=\"flex min-w-0 items-center gap-1.5 text-muted-foreground\">\n {Icon && <Icon className=\"size-3.5 shrink-0\" />}\n <span className=\"truncate\">\n {label}\n {hint ? ` (${hint})` : ''}\n </span>\n </span>\n <span className=\"shrink-0 font-medium tabular-nums text-foreground\">{value}</span>\n </div>\n <div className=\"h-1.5 overflow-hidden rounded-full bg-muted\">\n <div\n className={cn('h-full rounded-full transition-[width]', tone)}\n style={{ width: `${clamped}%` }}\n role=\"progressbar\"\n aria-valuenow={clamped}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={label}\n />\n </div>\n </div>\n )\n}\n","import { useRef, useState } from 'react'\nimport type { DragEvent } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { Loader2, UploadCloud } from 'lucide-react'\nimport { cn } from '@arbidocs/react'\n\nexport interface UploadDropzoneProps {\n /** Called with the chosen/dropped files. */\n onFiles: (files: File[]) => void\n /** `accept` attribute for the file picker (e.g. `.pdf,.docx`). */\n accept?: string\n /** Allow selecting more than one file. Defaults to true. */\n multiple?: boolean\n /** Disables picking/dropping (e.g. no active workspace yet). */\n disabled?: boolean\n /** Shows a spinner + busy copy while an upload is in flight. */\n uploading?: boolean\n /** Primary line, e.g. \"Drag files here\". */\n title?: string\n /** Secondary line under the title. */\n description?: string\n /** Small muted hint, e.g. \"PDF, DOCX, images — up to 50MB\". */\n hint?: string\n /** Copy shown next to the spinner while uploading. */\n uploadingLabel?: string\n /** Glyph in the tile. Defaults to an upload-cloud icon. */\n icon?: LucideIcon\n testId?: string\n className?: string\n}\n\n/**\n * A themeable drag-and-drop upload target. Source-agnostic: it just surfaces\n * chosen files via `onFiles` — the host owns the actual upload. Handles its own\n * drag-over state, click-to-browse, and a busy state, styled with the kit's\n * SEMANTIC tokens only (border, muted, primary, foreground) so it renders in\n * each firm's colours.\n */\nexport function UploadDropzone({\n onFiles,\n accept,\n multiple = true,\n disabled = false,\n uploading = false,\n title = 'Drag files here',\n description = 'or click to browse',\n hint,\n uploadingLabel = 'Uploading…',\n icon: Icon = UploadCloud,\n testId,\n className,\n}: UploadDropzoneProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const [dragOver, setDragOver] = useState(false)\n const inert = disabled || uploading\n\n const pick = (files: FileList | null) => {\n if (!files?.length) return\n onFiles(Array.from(files))\n }\n\n const onDrop = (e: DragEvent<HTMLButtonElement>) => {\n e.preventDefault()\n setDragOver(false)\n if (inert) return\n pick(e.dataTransfer.files)\n }\n\n const onDragOver = (e: DragEvent<HTMLButtonElement>) => {\n e.preventDefault()\n if (!inert) setDragOver(true)\n }\n\n return (\n <button\n type=\"button\"\n onClick={() => !inert && inputRef.current?.click()}\n onDrop={onDrop}\n onDragOver={onDragOver}\n onDragLeave={() => setDragOver(false)}\n disabled={inert}\n data-testid={testId}\n className={cn(\n 'flex w-full flex-col items-center justify-center gap-3 rounded-xl border-2 border-dashed border-border bg-muted/30 px-6 py-12 text-center transition-colors',\n 'hover:border-primary/50 hover:bg-muted/50',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n dragOver && 'border-primary bg-primary/5',\n inert && 'cursor-not-allowed opacity-60 hover:border-border hover:bg-muted/30',\n className\n )}\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"hidden\"\n onChange={(e) => {\n pick(e.target.files)\n if (inputRef.current) inputRef.current.value = ''\n }}\n data-testid={testId ? `${testId}-input` : undefined}\n />\n <div className=\"flex size-12 items-center justify-center rounded-full bg-primary/10 text-primary\">\n {uploading ? <Loader2 className=\"size-6 animate-spin\" /> : <Icon className=\"size-6\" />}\n </div>\n {uploading ? (\n <p className=\"text-sm font-medium text-foreground\">{uploadingLabel}</p>\n ) : (\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {title} <span className=\"text-muted-foreground\">{description}</span>\n </p>\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </div>\n )}\n </button>\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 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 { useEffect, useState, type ReactNode } from 'react'\nimport { Pencil } from 'lucide-react'\nimport { Input, Textarea, cn } from '@arbidocs/react'\n\n/** Longest a name may be. Exported so a form editing the same field agrees. */\nexport const IDENTITY_NAME_MAX_LENGTH = 50\n\n/** Shown once the remaining allowance gets this low, not for the whole time. */\nconst COUNTER_THRESHOLD = 10\n\nexport interface EntityIdentityField {\n /** Row caption. Rendered with a trailing colon. */\n label: string\n value: string\n /** Stands in for an empty value, in italics — never a blank row. */\n placeholder: string\n /** Commits the edit. Not called when the value is unchanged. */\n onSave: (next: string) => void\n /** A description needs line breaks; a name does not. */\n multiline?: boolean\n /** Caps the input and shows a counter as it fills. Names only, by default. */\n maxLength?: number\n /** Classes for the read-mode value, e.g. a larger weight for the name. */\n valueClassName?: string\n /**\n * Content pinned to the RIGHT END of this row — e.g. the owning project\n * beside a name, a member stack beside a status. Rows without one let their\n * value run the full width, which is what a description wants.\n */\n trailing?: ReactNode\n /** Row test id; the pencil and input derive `-edit` and `-input`. */\n testId?: string\n}\n\nexport interface EntityIdentityBarProps {\n /** The editable text fields, in order. Usually name then description. */\n fields: EntityIdentityField[]\n /**\n * Read-only rows shown after the editable ones — anything whose control the\n * consumer owns (a project picker, an owner avatar, a status). Rendered with\n * the same caption column so every row lines up.\n */\n extraRows?: { label: string; content: ReactNode; trailing?: ReactNode; testId?: string }[]\n /** Hides every pencil. A viewer without permission sees values, not controls. */\n canEdit?: boolean\n /** Trailing controls, pinned right — e.g. a member stack, a status. */\n actions?: ReactNode\n /**\n * Controls that act on the ENTITY rather than on any one field — typically an\n * overflow menu holding delete or leave. Sits under the field list, where a\n * destructive action is findable but not in the path of everyday reading.\n */\n footer?: ReactNode\n className?: string\n testId?: string\n}\n\n/**\n * The \"what am I looking at\" bar for an entity's own page.\n *\n * A caption column (`Name:`, `Description:`, `Project:`) and a value column. The\n * captions are the point: a bare bold string at the top of a page reads equally\n * as a workspace, a project, a matter or a folder, and people read it as\n * whichever they expected. Saying which field is which costs one column and\n * removes the ambiguity entirely.\n *\n * Editing happens in place. The pencil is always visible to someone who can use\n * it rather than revealed on hover — a control you have to go hunting for is one\n * most people never find, and hover doesn't exist on touch. Commit is on blur\n * and on Enter (single-line fields only, so a description can hold line\n * breaks); Escape abandons the edit.\n *\n * Deliberately NOT a form: no submit, no dirty state, no field-level errors.\n * When a consumer needs visibility toggles, destructive actions or validation\n * messages, those belong in its settings form — this bar is the identity of the\n * thing, shown where you are working on it.\n *\n * Styled with SEMANTIC tokens only, so every firm gets it in its own colours.\n */\nexport function EntityIdentityBar({\n fields,\n extraRows = [],\n canEdit = false,\n actions,\n footer,\n className,\n testId,\n}: EntityIdentityBarProps) {\n return (\n <div\n className={cn('flex flex-wrap items-start justify-between gap-x-6 gap-y-3', className)}\n data-testid={testId}\n >\n <dl className=\"min-w-0 flex-1 space-y-1.5\">\n {fields.map((field) => (\n <IdentityFieldRow key={field.label} field={field} canEdit={canEdit} />\n ))}\n {extraRows.map((row) => (\n <div\n key={row.label}\n className=\"flex min-h-7 min-w-0 items-center gap-2\"\n data-testid={row.testId}\n >\n <dt className=\"w-24 shrink-0 text-sm font-medium text-muted-foreground\">\n {row.label}:\n </dt>\n <dd className=\"flex min-w-0 flex-1 items-center gap-2\">\n {row.content}\n {row.trailing ? <div className=\"ml-auto shrink-0\">{row.trailing}</div> : null}\n </dd>\n </div>\n ))}\n {footer ? <div className=\"flex items-center pt-0.5\">{footer}</div> : null}\n </dl>\n {actions ? <div className=\"flex shrink-0 items-center gap-2\">{actions}</div> : null}\n </div>\n )\n}\n\nfunction IdentityFieldRow({ field, canEdit }: { field: EntityIdentityField; canEdit: boolean }) {\n const {\n label,\n value,\n placeholder,\n onSave,\n multiline = false,\n maxLength,\n valueClassName,\n trailing,\n testId,\n } = field\n\n const [isEditing, setIsEditing] = useState(false)\n const [draft, setDraft] = useState(value)\n\n // Track the value while not editing, so an update from elsewhere (another\n // tab, a websocket) doesn't get overwritten by a stale draft on the next edit.\n useEffect(() => {\n if (!isEditing) setDraft(value)\n }, [value, isEditing])\n\n const commit = () => {\n setIsEditing(false)\n const next = draft.trim()\n if (next !== value) onSave(next)\n }\n\n const cancel = () => {\n setDraft(value)\n setIsEditing(false)\n }\n\n const charsLeft = maxLength === undefined ? null : maxLength - draft.length\n\n // Editing must not move anything. The input carries the read view's exact\n // typography and padding, drops the border and shadow entirely, and marks\n // focus with a contrasting FIELD instead — a box appearing around the text\n // (and the row growing to fit it) reads as the page jumping under the cursor.\n const fieldClass =\n 'h-auto rounded border-0 bg-muted px-1.5 py-0.5 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0'\n\n const shared = {\n autoFocus: true,\n value: draft,\n placeholder,\n maxLength,\n 'aria-label': label,\n 'data-testid': testId && `${testId}-input`,\n onBlur: commit,\n onChange: (e: { target: { value: string } }) => setDraft(e.target.value),\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n cancel()\n } else if (e.key === 'Enter' && !multiline) {\n e.preventDefault()\n commit()\n }\n },\n }\n\n // Every row shares one minimum height: that of the small controls (h-7) a\n // row may carry at its trailing end. A row that is only text then sits in\n // the same rhythm as one holding a button, so the captions fall on an even\n // beat down the bar instead of bunching up wherever a row has no control.\n return (\n <div className={cn('flex min-h-7 min-w-0 gap-2', multiline ? 'items-start' : 'items-center')}>\n <dt\n className={cn(\n 'w-24 shrink-0 text-sm font-medium text-muted-foreground',\n multiline && 'pt-1'\n )}\n >\n {label}:\n </dt>\n <dd className=\"flex min-w-0 flex-1 items-center gap-2\">\n {isEditing ? (\n <div className=\"relative min-w-0 flex-1\">\n {multiline ? (\n <Textarea\n {...shared}\n rows={2}\n className={cn(fieldClass, 'min-h-0 resize-none leading-snug', valueClassName)}\n />\n ) : (\n <Input {...shared} className={cn(fieldClass, 'pr-20', valueClassName)} />\n )}\n {charsLeft !== null && charsLeft <= COUNTER_THRESHOLD && (\n <span\n className={cn(\n 'pointer-events-none absolute right-3 top-1/2 hidden -translate-y-1/2 text-sm lg:block',\n charsLeft < 0 ? 'text-destructive' : 'text-muted-foreground'\n )}\n data-testid={testId && `${testId}-counter`}\n >\n {charsLeft < 0 ? `${-charsLeft} over` : `${charsLeft} left`}\n </span>\n )}\n </div>\n ) : (\n // `identity-field` (not the generic `group`) scopes the pencil's hover\n // to THIS field only — an ancestor card also carries `group`, so a\n // `.group:hover` rule would reveal every field's pencil at once.\n <span className=\"identity-field flex min-w-0 items-center gap-1.5\">\n {/* Same padding as the input above — the swap must not nudge the\n text sideways or change the row's height. */}\n <span className={cn('px-1.5 py-0.5', valueClassName)} data-testid={testId}>\n {value || <span className=\"italic text-muted-foreground\">{placeholder}</span>}\n </span>\n {canEdit && (\n <button\n type=\"button\"\n onClick={() => setIsEditing(true)}\n aria-label={`Edit ${label.toLowerCase()}`}\n title={`Edit ${label.toLowerCase()}`}\n // Quiet by default — the pencil only surfaces when the row is\n // hovered so it reads as clean text, and stays reachable by\n // keyboard (focus-visible).\n //\n // NB: use the ungated `[.identity-field:hover_&]` selector rather\n // than Tailwind's `group-hover:`. The latter compiles behind\n // `@media (hover: hover)`, so on a touchscreen (whose PRIMARY\n // pointer reports `hover: none`) the rule is disabled even when a\n // real mouse is firing hover events — the pencil then stays at\n // opacity-0 forever. The arbitrary selector has no media gate, so\n // it reveals on any genuine `:hover`.\n className=\"shrink-0 cursor-pointer rounded p-1 text-muted-foreground opacity-0 transition-[color,background-color,opacity] hover:bg-accent hover:text-foreground focus-visible:opacity-100 [.identity-field:hover_&]:opacity-100\"\n data-testid={testId && `${testId}-edit`}\n >\n <Pencil className=\"size-3.5\" />\n </button>\n )}\n </span>\n )}\n {trailing ? <div className=\"ml-auto shrink-0\">{trailing}</div> : null}\n </dd>\n </div>\n )\n}\n","import { ChevronDown } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage, cn } from '@arbidocs/react'\nimport { initials } from '../lib/format'\n\n/** One face in the stack — source-agnostic, not a raw SDK user. */\nexport interface StackedMember {\n name: string\n picture?: string | null\n}\n\nexport interface MemberAvatarStackProps {\n members: StackedMember[]\n /** Total, when it exceeds what's shown. Defaults to `members.length`. */\n total?: number\n /** Faces before the rest collapse into a `+N`. */\n max?: number\n /**\n * The viewer isn't allowed to see who is here (e.g. row-level security hides\n * the members of a public workspace you haven't joined). Renders an em dash\n * rather than lying with an empty stack.\n */\n hidden?: boolean\n /** Makes the stack a button — e.g. to expand the member list below it. */\n onClick?: () => void\n /** Rotates the chevron and drives `aria-expanded` when it is a toggle. */\n expanded?: boolean\n /** Ring colour behind each face; match the surface it sits on. */\n ringClassName?: string\n className?: string\n testId?: string\n}\n\nconst MAX_DEFAULT = 3\n\n/**\n * An overlapping stack of member faces, with the overflow collapsed to `+N`.\n *\n * Lives here rather than inside a card because \"who is in this thing\" is shown\n * in more than one place — a workspace card, a workspace's own header — and\n * those had drawn it twice. Given `onClick` it becomes the control that expands\n * the full list, which is a better affordance than a button labelled \"Members\"\n * beside the very faces it would reveal.\n */\nexport function MemberAvatarStack({\n members,\n total,\n max = MAX_DEFAULT,\n hidden = false,\n onClick,\n expanded = false,\n ringClassName = 'border-card',\n className,\n testId,\n}: MemberAvatarStackProps) {\n const count = total ?? members.length\n const shown = hidden ? [] : members.slice(0, max)\n const extra = count - shown.length\n\n const faces = (\n <>\n {hidden ? (\n <span className=\"text-sm text-muted-foreground\">—</span>\n ) : (\n shown.map((m, i) => (\n <Avatar key={i} className={cn('size-6 border-2', ringClassName)} title={m.name}>\n {m.picture && <AvatarImage src={m.picture} alt={m.name} />}\n <AvatarFallback className=\"bg-foreground text-[9px] font-medium text-background\">\n {initials(m.name || '?')}\n </AvatarFallback>\n </Avatar>\n ))\n )}\n {!hidden && extra > 0 && (\n <Avatar className={cn('size-6 border-2', ringClassName)}>\n <AvatarFallback className=\"bg-accent text-[9px] font-medium text-muted-foreground\">\n +{extra}\n </AvatarFallback>\n </Avatar>\n )}\n </>\n )\n\n if (!onClick) {\n return (\n <div className={cn('flex shrink-0 -space-x-2', className)} data-testid={testId}>\n {faces}\n </div>\n )\n }\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-expanded={expanded}\n className={cn(\n 'flex shrink-0 cursor-pointer items-center gap-1.5 rounded-full py-0.5 pl-0.5 pr-1.5 transition-colors hover:bg-accent/60',\n className\n )}\n data-testid={testId}\n >\n <span className=\"flex -space-x-2\">{faces}</span>\n <ChevronDown\n className={cn(\n 'size-3.5 text-muted-foreground transition-transform',\n expanded && 'rotate-180'\n )}\n />\n </button>\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","import type { ReactNode } from 'react'\nimport { Plus, type LucideIcon } from 'lucide-react'\nimport { Button, Card, cn } from '@arbidocs/react'\n\n/** One listed item. Source-agnostic: a chat, a file, a matter, a person. */\nexport interface RecentActivityRow {\n id: string\n /**\n * The row's avatar/logo — a person's face, a file-type mark, a tinted glyph.\n * Supplied by the consumer, because only it knows what these things look\n * like.\n */\n leading?: ReactNode\n title: string\n /** Second line: what this row is, in a few words. */\n subtitle?: string\n /** Pinned right on the title line, like a message time. */\n meta?: string\n onClick?: () => void\n /**\n * A control rendered beside the row, OUTSIDE its button — e.g. a role\n * dropdown. It cannot live inside the button: nested interactives are invalid\n * and the button would eat the click. Supplying this hides `meta`, since they\n * compete for the same edge.\n */\n trailing?: ReactNode\n}\n\nexport interface RecentActivityCardProps {\n /** Glyph beside the title, in the header. */\n icon?: LucideIcon\n /** The section this card is about — \"Chats\", \"Matters\", \"Members\". */\n title: string\n /** Total across everything, not just what's listed. Omit to hide. */\n count?: number\n /** Header click — go to this section's full page. */\n onOpen?: () => void\n /** Secondary action that CREATES one. Omit the label to hide the button. */\n actionLabel?: string\n actionIcon?: LucideIcon\n onAction?: () => void\n /**\n * A custom header action node — rendered in the action slot INSTEAD of the\n * built-in label button. For actions that aren't a single click (e.g. a\n * source dropdown). The empty-card CTA still uses `onAction`/`emptyActionLabel`.\n */\n action?: ReactNode\n rows: RecentActivityRow[]\n /** Says what the list is — \"Recent\", \"Recently joined\". */\n caption?: string\n /** Shown instead of the list when there is nothing yet. */\n emptyText?: ReactNode\n /**\n * Verb for the empty card's call to action, e.g. \"New chat\" rather than the\n * header button's terse \"New\". An empty card is mostly whitespace, and that\n * whitespace is the best invitation the card will ever get — so it becomes\n * the action, at full size. Defaults to `actionLabel`; the CTA only appears\n * when there is an `onAction` to run.\n */\n emptyActionLabel?: string\n /** Extra classes on the card root. */\n className?: string\n /** Root test id; children derive `-open`, `-action`, `-caption`, `-row`. */\n testId?: string\n}\n\n/**\n * A section's recent items, as a card you can get back INTO the work through.\n *\n * Three parts, and the split is the point:\n *\n * - the HEADER links to that section's full page. Clicking the thing's name\n * should take you to the thing.\n * - the BODY lists what changed most recently, each row jumping straight to\n * that item.\n * - the ACTION creates a new one, kept visually distinct from the header link\n * so \"go there\" and \"make one\" are never the same click.\n *\n * Deliberately NOT a KPI tile — that's {@link MetricCard}. A count tells a\n * returning professional nothing they need: \"128 documents\" doesn't help you\n * resume work, whereas the name of the file you touched an hour ago does. The\n * count rides along as a caption beside the title, not as the content.\n *\n * The row anatomy is the DM conversation chip's (leading avatar, bold name\n * line with the time pinned right, muted second line), because a list of\n * recognisable things reads the same way whoever owns it.\n *\n * Styled with SEMANTIC tokens only (card, border, foreground, muted-foreground,\n * primary, accent), so every firm gets it in its own colours.\n */\nexport function RecentActivityCard({\n icon: Icon,\n title,\n count,\n onOpen,\n actionLabel,\n actionIcon: ActionIcon,\n onAction,\n action,\n rows,\n caption,\n emptyText,\n emptyActionLabel,\n className,\n testId,\n}: RecentActivityCardProps) {\n return (\n <Card\n variant=\"flat\"\n className={cn(\n // Grows to its content. The card must NOT scroll internally: a list\n // scrolling inside a fixed-height card puts a scrollbar in the middle\n // of the page, where every other page in the app scrolls at its outer\n // edge. The page is the scroll container; the card is just tall.\n //\n // No `card-hover` lift: the card is a container, not a single link — its\n // header and each row have their OWN hover, so a whole-card lift on any\n // hover would highlight the section instead of the item under the cursor.\n 'flex flex-col overflow-hidden rounded-xl bg-card p-0 shadow-sm',\n className\n )}\n data-testid={testId}\n >\n {/* Header — the title navigates; the action beside it creates. No rule\n under it: the first row's own hairline is separation enough. */}\n <div className=\"flex items-center gap-1 px-2 pt-2\">\n <button\n type=\"button\"\n onClick={onOpen}\n disabled={!onOpen}\n className=\"group flex min-w-0 flex-1 cursor-pointer items-center gap-2 rounded-lg px-2 py-1.5 text-left transition-colors hover:bg-primary/10 disabled:cursor-default disabled:hover:bg-transparent\"\n data-testid={testId && `${testId}-open`}\n >\n {Icon && <Icon className=\"size-4 shrink-0 text-muted-foreground\" />}\n {/* `whitespace-nowrap`, not `truncate`: these labels are one short\n word, and truncating rendered \"DOCUM…\" beside acres of free\n space. */}\n <span className=\"whitespace-nowrap text-sm font-semibold text-foreground\">{title}</span>\n {count !== undefined && (\n <span className=\"text-xs tabular-nums text-muted-foreground\">{count}</span>\n )}\n </button>\n {action ? (\n <div className=\"shrink-0\">{action}</div>\n ) : actionLabel ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 shrink-0 px-2 text-xs font-medium text-muted-foreground hover:text-foreground\"\n onClick={onAction}\n title={actionLabel}\n data-testid={testId && `${testId}-action`}\n >\n {ActionIcon && <ActionIcon className=\"size-3.5\" />}\n <span className=\"sr-only @md:not-sr-only @md:ml-1.5\">{actionLabel}</span>\n </Button>\n ) : null}\n </div>\n\n {rows.length === 0 ? (\n onAction ? (\n // The whole empty area is the button. A muted sentence in a big void\n // tells you the card is empty; this tells you what to do about it.\n <button\n type=\"button\"\n onClick={onAction}\n className=\"group m-3 flex flex-1 cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed border-border px-4 text-center transition-colors hover:border-border hover:bg-accent/50 focus-visible:border-border focus-visible:bg-accent/50 focus-visible:outline-none\"\n data-testid={testId && `${testId}-empty-action`}\n >\n <span className=\"mt-6 flex size-11 items-center justify-center rounded-full bg-primary/10 text-primary transition-colors group-hover:bg-primary group-hover:text-primary-foreground\">\n {ActionIcon ? <ActionIcon className=\"size-5\" /> : <Plus className=\"size-5\" />}\n </span>\n <span className=\"text-sm font-semibold text-foreground\">\n {emptyActionLabel ?? actionLabel}\n </span>\n <span className=\"text-xs leading-relaxed text-muted-foreground\">{emptyText}</span>\n </button>\n ) : (\n <p className=\"flex flex-1 items-center px-4 py-6 text-xs leading-relaxed text-muted-foreground\">\n {emptyText}\n </p>\n )\n ) : (\n <>\n {caption && (\n // A caption, so the list says what it is instead of leaving you to\n // infer it from the order.\n <p\n className=\"mt-1 px-4 pb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\"\n data-testid={testId && `${testId}-caption`}\n >\n {caption}\n </p>\n )}\n <ul className=\"flex-1\">\n {rows.map((row) => (\n <li\n key={row.id}\n className={cn(\n 'group relative flex items-center border-b border-border/60 transition-colors last:border-b-0',\n // Clearly highlight the row under the cursor so it's obvious\n // which item will be clicked. Use the ungated `[&:hover]`\n // selector rather than `hover:` — the latter compiles behind\n // `@media (hover: hover)`, so on a touchscreen (primary pointer\n // reports `hover: none`) the highlight never shows even with a\n // real mouse attached.\n '[&:hover]:bg-primary/10 has-[button:focus-visible]:bg-primary/10'\n )}\n >\n <button\n type=\"button\"\n onClick={row.onClick}\n // The full text on hover: these names truncate, and the row is\n // often the only place the whole thing appears.\n title={row.title}\n // `py-1.5`, not the roomier `py-2.5` a chip in a conversation\n // list wears: these rows sit six deep in a card on a page\n // with three more sections below it, and looser rows push\n // the ones after them off the first screen.\n className={cn(\n 'flex min-w-0 flex-1 items-start gap-3 py-1.5 pl-4 pr-2 text-left focus-visible:outline-none',\n row.onClick && 'cursor-pointer'\n )}\n data-testid={testId && `${testId}-row`}\n >\n {row.leading}\n <div className=\"min-w-0 flex-1\">\n {/* The time sits on the TITLE line, on the baseline of the\n name, where a message list puts it — the eye reads\n \"what, when\" in one sweep, and the muted second line is\n left to say what the thing is. */}\n <div className=\"flex items-baseline gap-1.5\">\n <span className=\"min-w-0 flex-1 truncate text-sm font-semibold text-foreground group-hover:text-primary\">\n {row.title}\n </span>\n {!row.trailing && row.meta && (\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">\n {row.meta}\n </span>\n )}\n </div>\n <p className=\"mt-0.5 truncate text-xs text-muted-foreground\">{row.subtitle}</p>\n </div>\n </button>\n {row.trailing ? <div className=\"shrink-0 pr-3\">{row.trailing}</div> : null}\n </li>\n ))}\n </ul>\n </>\n )}\n </Card>\n )\n}\n","/**\n * A question box that IS the product's front door, not a link to one.\n *\n * One input, two destinations: Enter (or the arrow) ASKS — hands the trimmed\n * text to `onAsk`, the conversational answer — while the Search button beside\n * it hands the same text to `onSearch`, the retrieval experience. The split\n * matters because a professional's queries come in both registers (\"what does\n * clause 7 mean\" vs \"find every mention of clause 7\") and making them choose a\n * page before typing kills the impulse. Omit `onSearch` and the bar is a plain\n * ask composer.\n *\n * The consumer owns what asking and searching mean (start a chat, run smart\n * search, open a matter). Suggestion chips prefill the input rather than\n * firing immediately: a suggestion is a starting point you edit, not a button\n * you regret.\n *\n * Styled with SEMANTIC tokens only (card, border, foreground, muted-foreground,\n * primary), so every firm gets it in its own colours.\n */\n\nimport { useRef, useState, type KeyboardEventHandler, type ReactNode, type RefObject } from 'react'\nimport { Search, Sparkles } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react'\n\nexport interface AskBarProps {\n /** Receives the trimmed question; the caller owns what asking means. */\n onAsk: (text: string) => void\n /** Second destination for the same text — retrieval. Omit to hide. */\n onSearch?: (text: string) => void\n /** Prefill-on-click starter questions, shown under the input. */\n suggestions?: string[]\n placeholder?: string\n askLabel?: string\n searchLabel?: string\n /** Controlled value. Omit for the bar to own its own text. */\n value?: string\n onValueChange?: (value: string) => void\n /** Raw keydown on the input — lets a consumer run an autocomplete\n * (arrow/Enter/Tab/Escape) before the form's own submit handling.\n * preventDefault() on Enter suppresses the submit. */\n onInputKeyDown?: KeyboardEventHandler<HTMLInputElement>\n /** Popover anchored to the pill (e.g. a slash-command menu). Rendered in a\n * relative wrapper around the form, so absolute children position against\n * the pill. */\n menu?: ReactNode\n /** External input ref, for consumers that refocus after menu selection. */\n inputRef?: RefObject<HTMLInputElement | null>\n className?: string\n /** Root test id; children derive `-input`, `-submit`, `-search`, `-suggestion`. */\n testId?: string\n}\n\nexport function AskBar({\n onAsk,\n onSearch,\n suggestions = [],\n placeholder = 'Ask anything…',\n askLabel = 'Ask',\n searchLabel = 'Search',\n value,\n onValueChange,\n onInputKeyDown,\n menu,\n inputRef: externalInputRef,\n className,\n testId = 'ask-bar',\n}: AskBarProps) {\n const [innerText, setInnerText] = useState('')\n const text = value !== undefined ? value : innerText\n const setText = (next: string) => {\n onValueChange?.(next)\n if (value === undefined) setInnerText(next)\n }\n const localInputRef = useRef<HTMLInputElement>(null)\n const inputRef = externalInputRef ?? localInputRef\n\n const submitTo = (handler: (text: string) => void) => {\n const question = text.trim()\n if (!question) return\n handler(question)\n setText('')\n }\n\n return (\n <div className={cn('flex flex-col gap-2', className)} data-testid={testId}>\n <div className=\"relative\">\n {menu}\n <form\n onSubmit={(e) => {\n e.preventDefault()\n submitTo(onAsk)\n }}\n // The AppHeader search pill's language exactly — rounded-md,\n // border-input, magnifier left, muted text — so the bar sits in a\n // topbar the way clarum's ⌘K trigger does, not like a chat composer\n // dropped into a header.\n className=\"flex h-12 items-center gap-1.5 rounded-md border border-border/50 bg-background pl-3 pr-1.5 transition-colors focus-within:border-border\"\n >\n <Search className=\"pointer-events-none size-4 shrink-0 text-muted-foreground\" />\n <input\n ref={inputRef}\n type=\"text\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={onInputKeyDown}\n placeholder={placeholder}\n className=\"h-8 min-w-0 flex-1 bg-transparent text-sm text-foreground outline-none placeholder:text-muted-foreground\"\n data-testid={testId && `${testId}-input`}\n />\n {onSearch && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={!text.trim()}\n onClick={() => submitTo(onSearch)}\n className=\"h-8 shrink-0 px-2.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n data-testid={testId && `${testId}-search`}\n >\n {searchLabel}\n </Button>\n )}\n {/* The primary door wears clarum's Ask AI anatomy: Sparkles + label. */}\n <Button\n type=\"submit\"\n size=\"sm\"\n disabled={!text.trim()}\n className=\"h-8 shrink-0 px-3 text-xs font-medium\"\n data-testid={testId && `${testId}-submit`}\n >\n <Sparkles className=\"size-3.5\" />\n {askLabel}\n </Button>\n </form>\n </div>\n {suggestions.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {suggestions.map((s) => (\n <button\n key={s}\n type=\"button\"\n onClick={() => {\n setText(s)\n inputRef.current?.focus()\n }}\n className=\"rounded-full border border-border/50 bg-card px-3 py-1 text-xs text-muted-foreground transition-colors hover:border-border hover:bg-accent hover:text-foreground\"\n data-testid={testId && `${testId}-suggestion`}\n >\n {s}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n","/**\n * \"Pick up where you left off\" — the last few things you touched, whatever\n * their type, as one row of chips.\n *\n * Section cards segregate by type; this strip answers the question a returning\n * professional actually has (\"what was I doing?\"), which is time-ordered and\n * type-blind. The consumer merges and sorts; the strip only renders, so what\n * counts as \"recent\" stays a product decision, not a layout one.\n *\n * Styled with SEMANTIC tokens only, so every firm gets it in its own colours.\n */\n\nimport type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react'\n\nexport interface ResumeStripItem {\n id: string\n /** The item's type mark — a chat glyph, a document's file icon. */\n leading?: ReactNode\n title: string\n /** Compact age, e.g. \"2h\", \"3d\". */\n meta?: string\n onClick?: () => void\n}\n\nexport interface ResumeStripProps {\n items: ResumeStripItem[]\n /** Says what the strip is. */\n caption?: string\n className?: string\n /** Root test id; chips derive `-item`. */\n testId?: string\n}\n\nexport function ResumeStrip({\n items,\n caption = 'Pick up where you left off',\n className,\n testId = 'resume-strip',\n}: ResumeStripProps) {\n if (items.length === 0) return null\n\n return (\n <div className={cn('flex flex-col gap-1.5', className)} data-testid={testId}>\n <p className=\"text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {caption}\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={item.onClick}\n title={item.title}\n className=\"group flex min-w-0 items-center gap-2 rounded-lg border border-border/50 bg-card py-2 pl-2.5 pr-3 shadow-sm transition-colors hover:border-border hover:bg-accent/50\"\n data-testid={testId && `${testId}-item`}\n >\n {item.leading}\n <span className=\"max-w-[14rem] truncate text-sm font-medium text-foreground group-hover:text-primary\">\n {item.title}\n </span>\n {item.meta && (\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">{item.meta}</span>\n )}\n </button>\n ))}\n </div>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react'\n\nexport interface SectionCaptionProps {\n children: ReactNode\n className?: string\n testId?: string\n}\n\n/**\n * The small uppercase eyebrow that names a band of a page — \"Start something\",\n * \"Continue a chat\". One component so every band on a home surface wears the\n * same caption, and a single screenful never mixes two caption languages.\n *\n * Styled with SEMANTIC tokens only, so every firm gets it in its own colours.\n */\nexport function SectionCaption({ children, className, testId }: SectionCaptionProps) {\n return (\n <p\n className={cn(\n 'text-[11px] font-medium uppercase tracking-wide text-muted-foreground',\n className\n )}\n data-testid={testId}\n >\n {children}\n </p>\n )\n}\n","/**\n * The first thing a home surface can offer someone who hasn't decided what to\n * do yet: a short row of capabilities, each one click from being underway.\n *\n * A card is not a link to a page — it is the START of a job, and the consumer's\n * handler is expected to arrive somewhere with the work already begun (a prompt\n * in the composer, a question in the form, the chooser open). So the copy names\n * the job in the user's words and the card reads as a soft, pressable object\n * rather than another panel: fully rounded corners, one accent, no chrome.\n *\n * A capability the workspace can't do yet stays VISIBLE and disabled with the\n * reason attached — the row's second job is telling you what the product can\n * do, and hiding two thirds of that on an empty workspace defeats it.\n *\n * Styled with SEMANTIC tokens only, so every firm gets it in its own colours.\n */\n\nimport type { LucideIcon } from 'lucide-react'\nimport { cn } from '@arbidocs/react'\nimport { SectionCaption } from './SectionCaption'\n\nexport interface QuickActionItem {\n id: string\n icon: LucideIcon\n /** The job, in the user's words — \"Deep research\", not \"Research agent\". */\n title: string\n /** One line on what happens. Sentence case, no full stop needed. */\n description: string\n onClick: () => void\n /** Rendered non-interactive and dimmed; `disabledReason` explains why. */\n disabled?: boolean\n /** Shown as the card's tooltip when disabled — say how to unblock it. */\n disabledReason?: string\n testId?: string\n}\n\nexport interface QuickActionCardsProps {\n items: QuickActionItem[]\n /** Optional lead-in above the row. */\n caption?: string\n className?: string\n testId?: string\n}\n\nexport function QuickActionCards({\n items,\n caption,\n className,\n testId = 'quick-action-cards',\n}: QuickActionCardsProps) {\n if (items.length === 0) return null\n\n return (\n <section className={cn('flex flex-col gap-2', className)} data-testid={testId}>\n {/* The caption style the sibling blocks use — this row sits directly above\n their \"Recent\" / \"Recently added\" captions, and two caption languages\n within one screenful reads as an accident. */}\n {caption && <SectionCaption>{caption}</SectionCaption>}\n {/* Auto-fitting columns rather than breakpoints: a home surface is often a\n panel that resizes independently of the window, and the row should hold\n any number of capabilities without a new breakpoint each time one is\n added. Cards wrap to whatever fits at >=190px each. */}\n <div className=\"grid gap-2 [grid-template-columns:repeat(auto-fit,minmax(190px,1fr))]\">\n {items.map((item) => {\n const Icon = item.icon\n return (\n <button\n key={item.id}\n type=\"button\"\n onClick={item.onClick}\n disabled={item.disabled}\n title={item.disabled ? item.disabledReason : undefined}\n aria-describedby={undefined}\n className={cn(\n 'group flex h-full items-start gap-3 rounded-2xl border border-border/70 bg-card p-4 text-left',\n 'transition-colors',\n // `[&:hover]` rather than `hover:` — Tailwind v4 wraps the hover\n // variant in @media (hover: hover), so on a touchscreen the\n // affordance would never appear at all.\n '[&:hover]:border-theme-cyan/50 [&:hover]:bg-theme-cyan/5',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-theme-cyan focus-visible:ring-offset-2',\n 'disabled:cursor-default disabled:opacity-55',\n 'disabled:[&:hover]:border-border/70 disabled:[&:hover]:bg-card'\n )}\n data-testid={item.testId}\n >\n <span\n className={cn(\n 'flex h-10 w-10 shrink-0 items-center justify-center rounded-full',\n 'bg-theme-cyan/10 text-theme-cyan transition-colors',\n '[.group:hover_&]:bg-theme-cyan/20',\n item.disabled && 'bg-muted text-muted-foreground [.group:hover_&]:bg-muted'\n )}\n >\n <Icon className=\"h-5 w-5\" />\n </span>\n <span className=\"min-w-0\">\n <span className=\"block text-base font-medium text-foreground\">{item.title}</span>\n <span className=\"mt-0.5 block text-sm leading-snug text-muted-foreground\">\n {item.disabled && item.disabledReason ? item.disabledReason : item.description}\n </span>\n </span>\n </button>\n )\n })}\n </div>\n </section>\n )\n}\n","/**\n * A section's entry on a home surface as one slim band — for sections that\n * earn a glance, not a quarter of the page.\n *\n * Anatomy mirrors {@link RecentActivityCard}'s split (header navigates,\n * actions beside it act, rows jump to items) at a fraction of the height, with\n * one addition: rows come in captioned GROUPS, because some sections read in\n * two registers at once — deadlines you plan around vs notes that accrete,\n * open items vs recently closed. The consumer decides the grouping; the strip\n * only renders it.\n *\n * An empty section gets a single quiet row, not a void: a band exists to stay\n * out of the way.\n *\n * Styled with SEMANTIC tokens only, so every firm gets it in its own colours.\n */\n\nimport type { ReactNode } from 'react'\nimport { Plus, type LucideIcon } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react'\n\nexport interface SectionStripRow {\n id: string\n /** The row's mark — a pin, a dot, a tiny glyph. Consumer-supplied. */\n leading?: ReactNode\n title: string\n /** Pinned right: a date, an age. */\n meta?: string\n onClick?: () => void\n}\n\nexport interface SectionStripGroup {\n /** Says what the group is — \"Upcoming\", \"Recent\". */\n caption: string\n rows: SectionStripRow[]\n /** Test id for this group's rows. Falls back to `<root>-row`. */\n rowTestId?: string\n}\n\nexport interface SectionStripAction {\n icon?: LucideIcon\n label: string\n onClick: () => void\n testId?: string\n /**\n * A custom element rendered in place of the default ghost button — for a\n * primary/emphasised action that shouldn't look like the quiet header doors.\n */\n node?: ReactNode\n}\n\nexport interface SectionStripProps {\n /** Glyph beside the title, in the header. */\n icon?: LucideIcon\n /** The section this band is about. */\n title: string\n /** Total across everything, not just what's listed. Omit to hide. */\n count?: number\n /** Header click — go to this section's full page. */\n onOpen?: () => void\n /** Header-right actions: distinct doors into the section's experiences. */\n actions?: SectionStripAction[]\n /** Captioned row groups; groups with no rows are skipped. */\n groups: SectionStripGroup[]\n /**\n * Shown when every group is empty. By default a single quiet row. Supply an\n * `icon` (and optional `description`) to render the fuller dashed empty state\n * instead — the same shape a card uses, for sections that want the empty\n * state to invite rather than just note.\n */\n empty?: {\n label: ReactNode\n onClick?: () => void\n testId?: string\n icon?: LucideIcon\n description?: ReactNode\n }\n className?: string\n /** Root test id; children derive `-open` and per-action/per-group ids. */\n testId?: string\n}\n\nexport function SectionStrip({\n icon: Icon,\n title,\n count,\n onOpen,\n actions = [],\n groups,\n empty,\n className,\n testId = 'section-strip',\n}: SectionStripProps) {\n const filledGroups = groups.filter((g) => g.rows.length > 0)\n\n return (\n <div\n className={cn('rounded-xl border border-border/60 bg-card p-2 shadow-sm', className)}\n data-testid={testId}\n >\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={onOpen}\n disabled={!onOpen}\n className=\"group flex min-w-0 flex-1 cursor-pointer items-center gap-2 rounded-lg px-2 py-1.5 text-left transition-colors hover:bg-primary/10 disabled:cursor-default disabled:hover:bg-transparent\"\n data-testid={testId && `${testId}-open`}\n >\n {Icon && <Icon className=\"size-4 shrink-0 text-muted-foreground\" />}\n <span className=\"whitespace-nowrap text-sm font-semibold text-foreground\">{title}</span>\n {count !== undefined && (\n <span className=\"text-xs tabular-nums text-muted-foreground\">{count}</span>\n )}\n </button>\n {actions.map((action) =>\n action.node ? (\n <div key={action.label} className=\"shrink-0\">\n {action.node}\n </div>\n ) : (\n <Button\n key={action.label}\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 shrink-0 px-2 text-xs font-medium text-muted-foreground hover:text-foreground\"\n onClick={action.onClick}\n title={action.label}\n data-testid={action.testId}\n >\n {action.icon && <action.icon className=\"size-3.5\" />}\n <span className=\"sr-only @md:not-sr-only @md:ml-1.5\">{action.label}</span>\n </Button>\n )\n )}\n </div>\n\n {filledGroups.length === 0 ? (\n empty ? (\n empty.icon ? (\n // Fuller dashed empty state, matching a card's — an invitation, not\n // just a note. The icon glyph rides a tinted circle that fills on\n // hover, exactly like RecentActivityCard's empty card.\n <button\n type=\"button\"\n onClick={empty.onClick}\n className=\"group mt-2 flex w-full cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed border-border px-4 py-8 text-center transition-colors hover:border-border hover:bg-accent/50 focus-visible:border-border focus-visible:bg-accent/50 focus-visible:outline-none\"\n data-testid={empty.testId}\n >\n <span className=\"mt-2 flex size-11 items-center justify-center rounded-full bg-primary/10 text-primary transition-colors group-hover:bg-primary group-hover:text-primary-foreground\">\n <empty.icon className=\"size-5\" />\n </span>\n <span className=\"text-sm font-semibold text-foreground\">{empty.label}</span>\n {empty.description && (\n <span className=\"text-xs leading-relaxed text-muted-foreground\">\n {empty.description}\n </span>\n )}\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={empty.onClick}\n className=\"flex w-full items-center gap-2 rounded-lg px-2 py-1.5 text-left text-sm text-muted-foreground transition-colors hover:bg-primary/5 hover:text-foreground\"\n data-testid={empty.testId}\n >\n <Plus className=\"size-3.5 shrink-0\" />\n {empty.label}\n </button>\n )\n ) : null\n ) : (\n <div className=\"grid gap-x-4 @2xl:grid-cols-2\">\n {filledGroups.map((group) => (\n <div key={group.caption}>\n <p className=\"mt-1 px-2 pb-0.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {group.caption}\n </p>\n <ul>\n {group.rows.map((row) => (\n <li key={row.id}>\n <button\n type=\"button\"\n onClick={row.onClick}\n title={row.title}\n className=\"group flex w-full min-w-0 items-center gap-2 rounded-lg px-2 py-1.5 text-left transition-colors [&:hover]:bg-primary/10\"\n data-testid={group.rowTestId ?? (testId && `${testId}-row`)}\n >\n {row.leading}\n <span className=\"min-w-0 flex-1 truncate text-sm text-foreground group-hover:text-primary\">\n {row.title}\n </span>\n {row.meta && (\n <span className=\"shrink-0 text-[11px] tabular-nums text-muted-foreground\">\n {row.meta}\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n","/**\n * An empty home surface as ONE invitation, not a grid of voids.\n *\n * A centered column: what this place is for (title, subtitle), the primary way\n * in (children — typically an {@link AskBar}), a big dashed secondary door\n * (add files, create the first record), and a quiet footer line. Empty cards\n * tell you a page has nothing; this tells you what the place is FOR.\n *\n * Styled with SEMANTIC tokens only, so every firm gets it in its own colours.\n */\n\nimport type { ReactNode } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { cn } from '@arbidocs/react'\n\nexport interface StartHeroProps {\n title: string\n subtitle?: string\n /** The primary way in — typically an AskBar. */\n children?: ReactNode\n /** The big dashed secondary door. */\n tile?: {\n icon: LucideIcon\n label: string\n description?: string\n onClick: () => void\n testId?: string\n }\n /** A quiet closing line — membership state, a hint. */\n footer?: ReactNode\n className?: string\n testId?: string\n}\n\nexport function StartHero({\n title,\n subtitle,\n children,\n tile,\n footer,\n className,\n testId,\n}: StartHeroProps) {\n return (\n <div className={cn('py-6', className)} data-testid={testId}>\n <div className=\"mx-auto flex max-w-2xl flex-col gap-5 text-center\">\n <div>\n <h2 className=\"text-lg font-semibold text-foreground\">{title}</h2>\n {subtitle && <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p>}\n </div>\n {children}\n {tile && (\n <button\n type=\"button\"\n onClick={tile.onClick}\n className=\"group flex cursor-pointer flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed border-border px-4 py-6 text-center transition-colors hover:border-border hover:bg-accent/50 focus-visible:border-border focus-visible:bg-accent/50 focus-visible:outline-none\"\n data-testid={tile.testId}\n >\n <span className=\"flex size-11 items-center justify-center rounded-full bg-primary/10 text-primary transition-colors group-hover:bg-primary group-hover:text-primary-foreground\">\n <tile.icon className=\"size-5\" />\n </span>\n <span className=\"text-sm font-semibold text-foreground\">{tile.label}</span>\n {tile.description && (\n <span className=\"text-xs leading-relaxed text-muted-foreground\">\n {tile.description}\n </span>\n )}\n </button>\n )}\n {footer && <div className=\"text-xs text-muted-foreground\">{footer}</div>}\n </div>\n </div>\n )\n}\n","import type { LucideIcon } from 'lucide-react'\nimport { useState, type FocusEvent, type KeyboardEvent, type ReactNode } from 'react'\nimport {\n ArrowLeftRight,\n CheckCircle2,\n FileText,\n FolderLock,\n Loader2,\n MessagesSquare,\n Users,\n} from 'lucide-react'\nimport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react'\nimport { fmtDate, fromNow } from '../lib/format'\nimport { MemberAvatarStack } from './MemberAvatarStack'\n\n/** One member shown in the avatar stack — source-agnostic, not the raw SDK shape. */\nexport interface WorkspaceCardMember {\n name: string\n picture?: string | null\n}\n\nexport interface WorkspaceCardProps {\n name: string\n /** Uppercase eyebrow under the name, e.g. the matter reference. Omit to let\n * the name and description carry the card on their own. */\n matterRef?: string\n description?: string\n docCount: number\n /** Conversation count, shown as a third stat. Omit to hide the stat entirely. */\n chatCount?: number\n /** Defaults to `members.length` when omitted. */\n memberCount?: number\n /** Drives the overlapping avatar stack (shows up to 3, then a `+N` overflow). */\n members?: WorkspaceCardMember[]\n /**\n * The member list is not visible to this viewer (e.g. row-level security hides\n * the members of a public workspace you haven't joined). Renders an em dash in\n * place of the count and drops the avatar stack, rather than lying with a `0`.\n */\n membersHidden?: boolean\n /** ISO timestamp — renders \"Updated {relative} ago\" at the footer's right edge. */\n updatedAt?: string\n /** Marks this as the current workspace: an accented card surface and a footer label. */\n active?: boolean\n /** Shows a spinner in the Open affordance while a switch is in flight. */\n busy?: boolean\n onOpen?: () => void\n /** Icon in the header tile. Defaults to a lock/folder glyph. */\n icon?: LucideIcon\n /** Replaces the whole header icon tile — for a richer, app-supplied glyph. */\n iconSlot?: ReactNode\n /** Canonical workspace entity pill shown at the top of the description tooltip. */\n tooltipEntitySlot?: ReactNode\n /**\n * Secondary context for the card (the ARBI app puts the owning project here).\n * Sits top-right and is revealed on hover/focus, so the resting card stays\n * about the workspace itself.\n */\n cornerSlot?: ReactNode\n /**\n * Accent as a theme colour-token key (e.g. `emerald`, or a firm's own brand\n * token), resolved to `var(--color-<accent>)` at render — same contract as\n * MetricCard. Tints the icon tile and the Open affordance, so a firm can accent\n * the card without its brand classes leaking into the kit. `'default'` (or\n * omitted) uses the semantic `primary` token.\n */\n accent?: string\n /** Stable id for the card root; the footer action gets `${testId}-open`. */\n testId?: string\n /** Overrides the footer action's test id when a caller needs a specific one. */\n buttonTestId?: string\n className?: string\n}\n\nconst MAX_AVATARS = 3\n\n/**\n * The one true workspace card. A themeable, source-agnostic tile, in three bands:\n *\n * 1. header — icon + workspace name; secondary context (`cornerSlot`) hides\n * top-right until hover, keeping the resting card about the workspace.\n * 2. body — an expanded description area with the centred Open/current\n * affordance layered over it only on hover or keyboard focus.\n * 3. footer — doc/chat counts stay left and membership stays right, followed\n * by a final left-aligned update timestamp.\n *\n * State is said once, in words. There is deliberately no status badge.\n *\n * Styled with the kit's SEMANTIC tokens only (foreground, muted-foreground,\n * primary, card, border, accent), so every firm gets it in its own colours\n * without any firm-branded classes leaking in.\n */\nexport function WorkspaceCard({\n name,\n matterRef,\n description,\n docCount,\n chatCount,\n memberCount,\n members = [],\n membersHidden = false,\n updatedAt,\n active = false,\n busy = false,\n onOpen,\n icon: Icon = FolderLock,\n iconSlot,\n tooltipEntitySlot,\n cornerSlot,\n accent = 'default',\n testId,\n buttonTestId,\n className,\n}: WorkspaceCardProps) {\n const totalMembers = memberCount ?? members.length\n const actionTestId = buttonTestId ?? (testId ? `${testId}-open` : undefined)\n const canOpen = Boolean(onOpen) && !busy\n const [isHoverPointerActive, setIsHoverPointerActive] = useState(false)\n const [isKeyboardFocused, setIsKeyboardFocused] = useState(false)\n const revealInteractiveContent = isHoverPointerActive || isKeyboardFocused\n const showOpenAction = busy || revealInteractiveContent\n\n // An accent overrides the semantic primary the tile and Open affordance default to.\n // The soft fill is a color-mix of the accent, so one token key drives both.\n const hue = accent && accent !== 'default' ? `var(--color-${accent})` : null\n const tileStyle = hue\n ? { backgroundColor: `color-mix(in oklab, ${hue} 14%, transparent)`, color: hue }\n : undefined\n const openStyle = hue ? { backgroundColor: hue, color: 'var(--color-background)' } : undefined\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (!canOpen || event.target !== event.currentTarget) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n onOpen?.()\n }\n }\n\n const handleFocusCapture = (event: FocusEvent<HTMLDivElement>) => {\n setIsKeyboardFocused(event.target instanceof Element && event.target.matches(':focus-visible'))\n }\n\n const handleBlurCapture = (event: FocusEvent<HTMLDivElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) {\n setIsKeyboardFocused(false)\n }\n }\n\n return (\n <Card\n variant=\"flat\"\n className={cn(\n 'card-hover relative flex h-48 w-full flex-col gap-3 overflow-hidden rounded-xl bg-card p-4 shadow-sm',\n canOpen &&\n 'cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2',\n active && 'bg-primary/10 shadow-md',\n className\n )}\n data-testid={testId}\n data-active={active || undefined}\n role={canOpen ? 'button' : undefined}\n tabIndex={canOpen ? 0 : undefined}\n aria-current={active ? 'page' : undefined}\n aria-label={canOpen ? `Open workspace ${name}` : undefined}\n aria-busy={busy || undefined}\n onClick={canOpen ? onOpen : undefined}\n onKeyDown={handleKeyDown}\n onPointerEnter={(event) => {\n if (event.pointerType !== 'touch') setIsHoverPointerActive(true)\n }}\n onPointerLeave={() => setIsHoverPointerActive(false)}\n onFocusCapture={handleFocusCapture}\n onBlurCapture={handleBlurCapture}\n >\n <CardHeader className=\"flex flex-row items-center gap-3 space-y-0 p-0\">\n {iconSlot ?? (\n <div\n className=\"flex size-9 shrink-0 items-center justify-center rounded-md bg-primary/10 text-primary\"\n style={tileStyle}\n >\n <Icon className=\"size-5\" />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <CardTitle\n className=\"line-clamp-2 text-base font-bold leading-tight\"\n data-testid={testId && `${testId}-title`}\n >\n {name}\n </CardTitle>\n {matterRef && (\n <CardDescription className=\"mt-0.5 truncate text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {matterRef}\n </CardDescription>\n )}\n </div>\n {cornerSlot && (\n <div\n className={cn(\n 'shrink-0 opacity-0 transition-opacity',\n revealInteractiveContent && 'opacity-100'\n )}\n >\n {cornerSlot}\n </div>\n )}\n </CardHeader>\n\n <CardContent className=\"relative flex min-h-0 flex-1 flex-col p-0\">\n {description && (\n <Tooltip>\n <TooltipTrigger asChild>\n <p\n className={cn(\n 'line-clamp-2 text-sm text-muted-foreground opacity-100 transition-opacity',\n showOpenAction && 'opacity-0'\n )}\n >\n {description}\n </p>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-sm p-0\">\n <div className=\"overflow-hidden rounded-md\">\n <div className=\"flex items-center bg-muted/70 px-3 py-2.5\">\n {tooltipEntitySlot ?? <span className=\"text-sm font-semibold\">{name}</span>}\n </div>\n <p className=\"px-3 py-3 text-sm leading-relaxed text-foreground/90\">\n {description}\n </p>\n </div>\n </TooltipContent>\n </Tooltip>\n )}\n\n <span\n className={cn(\n 'pointer-events-none absolute inset-0 z-10 inline-flex items-center justify-center whitespace-nowrap opacity-0 transition-opacity',\n showOpenAction && 'opacity-100'\n )}\n data-testid={actionTestId}\n >\n <span\n className={cn(\n 'inline-flex w-full items-center justify-center gap-2 rounded-md px-4 py-2 text-base font-semibold shadow-md',\n active ? 'bg-muted-foreground text-background' : 'bg-primary text-primary-foreground'\n )}\n style={active ? undefined : openStyle}\n >\n {active ? (\n <>\n <CheckCircle2 className=\"size-4\" /> Current workspace\n </>\n ) : busy ? (\n <>\n <Loader2 className=\"size-4 animate-spin\" /> Opening\n </>\n ) : (\n <>\n <ArrowLeftRight className=\"size-4\" /> Open\n </>\n )}\n </span>\n </span>\n </CardContent>\n\n <CardFooter className=\"mt-auto flex w-full min-w-0 flex-col items-stretch gap-3 overflow-hidden p-0\">\n {/* Lucide stats stay left; only the member faces stay right. */}\n {/* Slightly larger than the card body text so the counts read at a glance. */}\n <div className=\"flex w-full items-center gap-x-3 text-[15px]\">\n <div className=\"flex items-center gap-x-3\">\n <span className=\"inline-flex items-center gap-1 text-foreground\" title=\"Documents\">\n <FileText className=\"size-4 text-muted-foreground\" />\n <span className=\"font-medium tabular-nums\">{docCount.toLocaleString()}</span>\n </span>\n {chatCount !== undefined && (\n <span className=\"inline-flex items-center gap-1 text-foreground\" title=\"Chats\">\n <MessagesSquare className=\"size-4 text-muted-foreground\" />\n <span className=\"font-medium tabular-nums\">{chatCount.toLocaleString()}</span>\n </span>\n )}\n <span className=\"inline-flex items-center gap-1 text-foreground\" title=\"Members\">\n <Users className=\"size-4 text-muted-foreground\" />\n <span\n className=\"font-medium tabular-nums\"\n data-testid={testId && `${testId}-member-count`}\n >\n {membersHidden ? '—' : totalMembers}\n </span>\n </span>\n </div>\n\n <MemberAvatarStack\n members={members}\n total={totalMembers}\n max={MAX_AVATARS}\n hidden={membersHidden}\n className=\"ml-auto\"\n testId={testId && `${testId}-member-avatars`}\n />\n </div>\n\n {updatedAt && (\n <span\n className=\"min-w-0 max-w-full self-start truncate text-left text-xs text-muted-foreground\"\n title={fmtDate(updatedAt)}\n >\n Updated {fromNow(updatedAt)}\n </span>\n )}\n </CardFooter>\n </Card>\n )\n}\n","import { cn } from '@arbidocs/react'\n\nexport interface StatItem {\n value: string\n label: string\n /** Optional caption under the label (e.g. a qualifier or unit). */\n sub?: 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 {item.sub && <p className=\"mt-1 text-xs text-muted-foreground/80\">{item.sub}</p>}\n </div>\n ))}\n </dl>\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, TooltipProvider } 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 // One TooltipProvider for the whole back office: every kit component that\n // renders a tooltip (entity pills, document tiles, toolbars) inherits the\n // same hover delay, and no app has to remember to mount it.\n <TooltipProvider>\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 </TooltipProvider>\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 * The SDK-backed half of asset resolution.\n *\n * Kept apart from `assetResolver.tsx` on purpose. `BlockImage` — and through it\n * every website block — must not reach the SDK, React Query or AG Grid, so that\n * `@arbidocs/blocks/site` can be imported by an unauthenticated marketing page.\n * A dead code path is not enough: neither kit package declares `sideEffects`, so\n * a bundler must keep whatever the module graph mentions. The resolver is\n * therefore *injected* (see `AssetResolverProvider`) rather than imported, and\n * only the authenticated Studio — which already depends on the SDK — hands this\n * module in.\n */\nimport { useEffect } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { useArbi, useThumbnails } from '@arbidocs/react'\nimport type { AssetRenderProps } from './assetResolver'\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/**\n * Resolve a single asset ext_id and render it as an `<img>`. This is the\n * `AssetRenderer` the Studio injects; it satisfies `AssetRenderProps`.\n */\nexport function AssetThumb({ docId, alt, className, testId }: AssetRenderProps) {\n const src = useAssetImage(docId)\n return <img src={src ?? undefined} alt={alt ?? ''} className={className} data-testid={testId} />\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 { AssetThumb } from '../components/assetImage'\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 render={AssetThumb}>\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, optionally editing / drawing on one or\n * more reference images already in the workspace. Pass the reference images'\n * document ext_ids in `referenceDocIds` (omit or `[]` for plain text→image).\n * Resolves with the new image document's ext_id, or null when the prompt is\n * empty or no image was produced.\n */\n generate: (prompt: string, referenceDocIds?: 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, referenceDocIds: string[] = []): Promise<string | null> => {\n const trimmed = prompt.trim()\n if (!trimmed) return null\n // `/image` rides the agent pipeline; the backend resolves the active\n // workspace from the session. Reference images are *grounded* on the task\n // (second arg) — they land in the agent's document index (typed as images\n // via its Type column), so the create_image tool picks them up as\n // `input_image_doc_ids`. Empty → plain text→image.\n const result = await run(`/image ${trimmed}`, referenceDocIds)\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 { Check, 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 } from '../components/assetResolver'\nimport { useAssetImage } from '../components/assetImage'\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 // Reference images (doc ext_ids) to edit / draw on when generating. Empty is a\n // plain text→image; one or more turns it into an edit / variation.\n const [refIds, setRefIds] = useState<string[]>([])\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 // Toggle a workspace image doc in/out of the reference set.\n const toggleRef = (id: string) =>\n setRefIds((prev) => (prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]))\n\n const onGenerate = async () => {\n if (!prompt.trim() || gen.isGenerating) return\n const id = await gen.generate(prompt, refIds)\n if (id) {\n onChange(asAssetRef(id))\n setRefIds([]) // fresh slate for the next generation\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 {/* Reference images (optional): edit or draw on existing workspace\n images. Multi-select — the backend accepts one or more. */}\n {imageDocs.length > 0 && (\n <div className=\"flex flex-col gap-1\" data-testid={tp('refs')}>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-muted-foreground\">\n Reference images{refIds.length > 0 ? ` (${refIds.length})` : ' (optional)'}\n </span>\n {isAssetRef(value) && (\n <button\n type=\"button\"\n className=\"text-xs font-medium text-primary hover:underline\"\n onClick={() => toggleRef(assetRefId(value))}\n data-testid={tp('vary-current')}\n >\n {refIds.includes(assetRefId(value)) ? 'Varying current' : 'Vary current image'}\n </button>\n )}\n </div>\n <div className=\"grid max-h-28 grid-cols-4 gap-1.5 overflow-auto\">\n {imageDocs.map((d: { external_id: string; file_name?: string | null }) => {\n const thumb = thumbs?.[d.external_id]\n const on = refIds.includes(d.external_id)\n return (\n <button\n key={d.external_id}\n type=\"button\"\n onClick={() => toggleRef(d.external_id)}\n aria-pressed={on}\n className={`relative overflow-hidden rounded border ${on ? 'border-primary ring-1 ring-primary' : 'border-border'}`}\n title={d.file_name ?? ''}\n data-testid={tp('ref', 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-3.5\" />\n </span>\n )}\n {on && (\n <span className=\"absolute right-0.5 top-0.5 rounded-full bg-primary p-0.5 text-primary-foreground\">\n <Check className=\"size-2.5\" />\n </span>\n )}\n </button>\n )\n })}\n </div>\n </div>\n )}\n <textarea\n className={inputClass}\n rows={2}\n placeholder={refIds.length > 0 ? 'Describe the edit to apply…' : '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\n ? 'Generating…'\n : refIds.length > 0\n ? `Generate from ${refIds.length} reference${refIds.length > 1 ? 's' : ''}`\n : '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'\nimport { Timeline, type TimelineViewMode } from '../timeline'\n\n/** One editor row of the Timeline block's `items` array. */\ninterface TimelineEntryProps {\n label?: string\n description?: string\n start: string\n end?: string\n}\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 /** A dated chronology on a page — key dates, a project plan, a hearing timetable.\n *\n * Dates are typed as ISO text (`2026-03-01`, or a full timestamp) because that\n * is what a span needs and what every backend already returns. An item without\n * an end is an instant; give it one and it becomes a bar covering that stretch. */\n const TimelineBlockConfig: ComponentConfig = {\n label: 'Timeline',\n fields: {\n view: {\n type: 'radio',\n label: 'View',\n options: [\n { label: 'Reader chooses', value: 'both' },\n { label: 'Calendar', value: 'calendar' },\n { label: 'Gantt', value: 'gantt' },\n ],\n },\n height: { type: 'number', label: 'Height (px)', min: 200, max: 1200 },\n items: {\n type: 'array',\n label: 'Entries',\n arrayFields: {\n label: textField('Label'),\n description: textareaField('Description'),\n start: { type: 'text', label: 'Start (YYYY-MM-DD)' },\n end: { type: 'text', label: 'End (YYYY-MM-DD, optional)' },\n },\n defaultItemProps: { label: 'Milestone', description: '', start: '', end: '' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Entry',\n },\n },\n defaultProps: {\n view: 'both',\n height: 520,\n items: [\n {\n label: 'Kick-off',\n description: 'Project starts.',\n start: '2026-01-12',\n end: '',\n },\n {\n label: 'Build phase',\n description: 'Design and implementation.',\n start: '2026-01-19',\n end: '2026-03-13',\n },\n {\n label: 'Launch',\n description: 'Public release.',\n start: '2026-03-30',\n end: '',\n },\n ],\n },\n render: ({ id, view, height, items }) => (\n <div style={{ height: height ?? 520 }}>\n <Timeline\n items={(items ?? [])\n .filter((item: { start?: string }) => !!item?.start)\n .map((item: TimelineEntryProps, index: number) => ({\n id: `${id}-${index}`,\n label: item.label ?? '',\n start: item.start,\n end: item.end || undefined,\n description: item.description || undefined,\n }))}\n view={view === 'both' ? undefined : (view as TimelineViewMode)}\n testId={blockTestId(id)}\n />\n </div>\n ),\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 Timeline: TimelineBlockConfig,\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', 'Timeline'] },\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"]}