@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/{chunk-6HGMAQLB.cjs → chunk-DBAUZD7A.cjs} +448 -113
- package/dist/chunk-DBAUZD7A.cjs.map +1 -0
- package/dist/{chunk-27Q4AST5.js → chunk-FZ2S6VAZ.js} +449 -116
- package/dist/chunk-FZ2S6VAZ.js.map +1 -0
- package/dist/{index-er1L8kkn.d.cts → index-DduoEosi.d.cts} +65 -2
- package/dist/{index-er1L8kkn.d.ts → index-DduoEosi.d.ts} +65 -2
- package/dist/index.cjs +293 -180
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +64 -9
- package/dist/index.d.ts +64 -9
- package/dist/index.js +145 -42
- package/dist/index.js.map +1 -1
- package/dist/site/index.cjs +61 -61
- package/dist/site/index.d.cts +1 -1
- package/dist/site/index.d.ts +1 -1
- package/dist/site/index.js +1 -1
- package/package.json +3 -3
- package/dist/chunk-27Q4AST5.js.map +0 -1
- package/dist/chunk-6HGMAQLB.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/theme/tokens.ts","../src/theme/fontPairings.ts","../src/theme/store.ts","../src/lib/format.ts","../src/theme/ThemeEditor.tsx","../src/lib/testid.ts","../src/timeline/span.ts","../src/timeline/TimelineCalendar.tsx","../src/timeline/TimelineGantt.tsx","../src/timeline/Timeline.tsx","../src/components/SectionHeading.tsx","../src/components/assetResolver.tsx","../src/components/BlockImage.tsx","../src/components/Hero.tsx","../src/components/blockLink.tsx","../src/components/FeatureGrid.tsx","../src/components/Testimonial.tsx","../src/components/CTABanner.tsx","../src/components/LogoCloud.tsx","../src/components/FAQ.tsx","../src/components/RichTextBlock.tsx","../src/components/Callout.tsx","../src/components/AvatarBlock.tsx","../src/components/Navbar.tsx","../src/components/Footer.tsx","../src/components/ListBlock.tsx","../src/components/Columns.tsx","../src/components/Spacer.tsx","../src/components/Container.tsx","../src/components/PricingTable.tsx","../src/components/Tabs.tsx","../src/components/Accordion.tsx","../src/components/Gallery.tsx","../src/components/VideoEmbed.tsx","../src/components/ContactForm.tsx","../src/components/Banner.tsx","../src/components/MediaText.tsx","../src/components/TeamGrid.tsx","../src/components/Steps.tsx","../src/components/TestimonialGrid.tsx"],"names":["tid","parseIso","day","jsx","jsxs","useState","cn","Fragment","Card","TONE_SURFACE","Button","ArrowRight","Avatar","AvatarImage","AvatarFallback","SIZE","Check","ChevronDown","COLS","ASPECT","Quote"],"mappings":"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","file":"chunk-27Q4AST5.js","sourcesContent":["/**\n * The theme-token model. Firm-agnostic: the token *catalog*, default values and\n * presets are supplied by the consuming app (via {@link createThemeStore}); this\n * module owns the shared types and the logic for writing tokens onto the live\n * document.\n *\n * There are two emit models, selected per-app by {@link ThemeEmitMode}:\n *\n * - `'flat'` (default): each colour key is written as an inline `--color-<key>`\n * custom property on `<html>`, plus `--font-*` / `--radius`. Inline styles\n * override the compiled `@theme` defaults, so an edit previews live across the\n * whole app (and the @arbidocs AI kit) and reverts cleanly. Apps whose CSS sets\n * `--color-*` HEX directly rely on this.\n *\n * - `'cssVars'`: each colour key is written as a raw\n * HSL-triplet custom property (`--<key>: <h s l>`) into an injected\n * `<style id=\"arbi-theme-vars\">` appended to `<head>`. The monolith's source\n * of truth is HSL triplets wrapped as `hsl(var(--x))`, with a real `.dark`\n * variant; writing resolved hex inline would pin the colour and defeat both\n * the indirection and the dark-class swap. The injected sheet is *unlayered*,\n * so it wins over the monolith's `@layer base` `colors.css` at equal\n * specificity, and a `:root { light } / :root.dark { dark }` structure keeps\n * the dark cascade alive.\n */\n\nexport interface ColorToken {\n /** Key without the `--color-` prefix, e.g. \"primary\" → `--color-primary`. */\n key: string\n label: string\n /** Grouping id for the panel layout (e.g. \"shadcn\" | \"brand\" | \"ai\"). */\n group: string\n}\n\nexport interface ThemeFonts {\n display: string\n sans: string\n}\n\nexport interface ThemeTokens {\n /** Colour values keyed by token key (hex). */\n colors: Record<string, string>\n fonts: ThemeFonts\n /** Base radius in rem. */\n radius: number\n}\n\nexport interface ThemePreset {\n id: string\n label: string\n tokens: ThemeTokens\n}\n\n/** How a theme is written onto the document. See the module doc for the models. */\nexport type ThemeEmitMode = 'flat' | 'cssVars'\n\nexport interface ApplyThemeOptions {\n /** Emit model. Defaults to `'flat'`. */\n mode?: ThemeEmitMode\n /**\n * `cssVars` mode only: dark-variant colour values keyed by token key. Emitted\n * under `:root.dark`. When omitted, only `:root` is emitted — note that an\n * overridden light token then also applies in dark (the injected `:root` is\n * unlayered and beats the app's own `.dark` rules), so a firm with a dark mode\n * MUST supply this for every editable token to keep dark mode intact.\n */\n dark?: Record<string, string>\n /** `flat` mode only: target element. Defaults to `document.documentElement`. */\n root?: HTMLElement\n}\n\n/** Id of the injected `<style>` that carries the `cssVars`-mode custom properties. */\nexport const THEME_STYLE_ID = 'arbi-theme-vars'\n\nconst TRIPLET_RE = /^-?\\d+(?:\\.\\d+)?\\s+-?\\d+(?:\\.\\d+)?%\\s+-?\\d+(?:\\.\\d+)?%$/\n\nfunction parseRgb(color: string): { r: number; g: number; b: number } | null {\n if (color.startsWith('#')) {\n let hex = color.slice(1)\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map((ch) => ch + ch)\n .join('')\n }\n if (hex.length === 6 && /^[0-9a-fA-F]{6}$/.test(hex)) {\n return {\n r: parseInt(hex.slice(0, 2), 16),\n g: parseInt(hex.slice(2, 4), 16),\n b: parseInt(hex.slice(4, 6), 16),\n }\n }\n return null\n }\n const m = color.match(/^rgba?\\(\\s*([\\d.]+)[\\s,]+([\\d.]+)[\\s,]+([\\d.]+)/i)\n if (m) return { r: Number(m[1]), g: Number(m[2]), b: Number(m[3]) }\n return null\n}\n\nfunction rgbToHslTriplet(r: number, g: number, b: number): string {\n const rn = r / 255\n const gn = g / 255\n const bn = b / 255\n const max = Math.max(rn, gn, bn)\n const min = Math.min(rn, gn, bn)\n const l = (max + min) / 2\n const d = max - min\n let h = 0\n let s = 0\n if (d !== 0) {\n s = d / (1 - Math.abs(2 * l - 1))\n switch (max) {\n case rn:\n h = 60 * (((gn - bn) / d) % 6)\n break\n case gn:\n h = 60 * ((bn - rn) / d + 2)\n break\n default:\n h = 60 * ((rn - gn) / d + 4)\n break\n }\n }\n if (h < 0) h += 360\n return `${Math.round(h)} ${Math.round(s * 100)}% ${Math.round(l * 100)}%`\n}\n\n/**\n * Convert a colour to the monolith's `H S% L%` HSL-triplet format.\n *\n * Handles `#rgb` / `#rrggbb`, `rgb()` / `rgba()`, and passes an existing triplet\n * through untouched (so a firm can seed exact `colors.css` triplets for a\n * byte-identical no-op). Values it cannot parse — notably `oklch(...)`, which the\n * status tokens use — are returned unchanged so they remain usable as a raw\n * custom-property value; converting those cleanly is out of scope.\n */\nexport function toHslTriplet(color: string): string {\n const c = color.trim()\n if (TRIPLET_RE.test(c)) return c\n const rgb = parseRgb(c)\n if (!rgb) return c\n return rgbToHslTriplet(rgb.r, rgb.g, rgb.b)\n}\n\nfunction renderTripletBlock(colors: Record<string, string>): string {\n return Object.entries(colors)\n .map(([key, value]) => ` --${key}: ${toHslTriplet(value)};`)\n .join('\\n')\n}\n\nfunction emitCssVars(theme: ThemeTokens, dark?: Record<string, string>): void {\n if (typeof document === 'undefined') return\n const meta = [\n ` --font-display: ${theme.fonts.display};`,\n ` --font-sans: ${theme.fonts.sans};`,\n ` --radius: ${theme.radius}rem;`,\n ].join('\\n')\n let css = `:root {\\n${renderTripletBlock(theme.colors)}\\n${meta}\\n}`\n if (dark) {\n css += `\\n:root.dark {\\n${renderTripletBlock(dark)}\\n}`\n }\n let style = document.getElementById(THEME_STYLE_ID) as HTMLStyleElement | null\n if (!style) {\n style = document.createElement('style')\n style.id = THEME_STYLE_ID\n document.head.appendChild(style)\n }\n style.textContent = css\n}\n\nfunction removeCssVars(): void {\n if (typeof document === 'undefined') return\n document.getElementById(THEME_STYLE_ID)?.remove()\n}\n\nfunction normalizeOptions(optionsOrRoot: ApplyThemeOptions | HTMLElement): ApplyThemeOptions {\n if (typeof HTMLElement !== 'undefined' && optionsOrRoot instanceof HTMLElement) {\n return { root: optionsOrRoot }\n }\n return optionsOrRoot as ApplyThemeOptions\n}\n\n/**\n * Write a theme onto the live document.\n *\n * In `flat` mode (default) writes inline `--color-<key>` / `--font-*` / `--radius`\n * on `document.documentElement` (or a supplied root). In `cssVars` mode writes\n * raw HSL-triplet vars into an injected `<style#arbi-theme-vars>` (see the module\n * doc). The legacy `applyThemeVars(theme, rootElement)` call form still works.\n */\nexport function applyThemeVars(\n theme: ThemeTokens,\n optionsOrRoot: ApplyThemeOptions | HTMLElement = {}\n): void {\n const { mode = 'flat', dark, root = document.documentElement } = normalizeOptions(optionsOrRoot)\n\n if (mode === 'cssVars') {\n emitCssVars(theme, dark)\n return\n }\n\n for (const [key, value] of Object.entries(theme.colors)) {\n root.style.setProperty(`--color-${key}`, value)\n }\n root.style.setProperty('--font-display', theme.fonts.display)\n root.style.setProperty('--font-sans', theme.fonts.sans)\n root.style.setProperty('--radius', `${theme.radius}rem`)\n}\n\n/**\n * Set ONLY the typography vars, as inline styles on the root element.\n *\n * Typography is often chosen independently of colour — an app may let a reader\n * pick a typeface while its palette is owned elsewhere. Writing the two vars\n * inline (rather than through `applyThemeVars`) keeps this orthogonal in two\n * ways: it touches no colour or radius token, and an inline style outranks any\n * selector, so a font choice survives a `cssVars`-mode theme that emits its own\n * `:root` block (the ARBI studio's theme editor does exactly that).\n */\nexport function applyFontVars(\n fonts: ThemeFonts,\n root: HTMLElement = document.documentElement\n): void {\n root.style.setProperty('--font-display', fonts.display)\n root.style.setProperty('--font-sans', fonts.sans)\n}\n\n/** Undo {@link applyFontVars}, reverting to the stylesheet's own font tokens. */\nexport function clearFontVars(root: HTMLElement = document.documentElement): void {\n root.style.removeProperty('--font-display')\n root.style.removeProperty('--font-sans')\n}\n\n/**\n * Remove a theme's overrides, reverting to the stylesheet defaults.\n *\n * In `flat` mode removes the inline overrides for the theme's keys. In `cssVars`\n * mode removes the injected `<style#arbi-theme-vars>` in full (restoring the\n * app's own `colors.css` exactly).\n */\nexport function clearThemeVars(\n theme: ThemeTokens,\n optionsOrRoot: ApplyThemeOptions | HTMLElement = {}\n): void {\n const { mode = 'flat', root = document.documentElement } = normalizeOptions(optionsOrRoot)\n\n if (mode === 'cssVars') {\n removeCssVars()\n return\n }\n\n for (const key of Object.keys(theme.colors)) {\n root.style.removeProperty(`--color-${key}`)\n }\n root.style.removeProperty('--font-display')\n root.style.removeProperty('--font-sans')\n root.style.removeProperty('--radius')\n}\n","/**\n * Curated typography pairings — the choice a user actually makes.\n *\n * A pairing is a display face + a body face that are known to sit well together,\n * so picking typography means picking a *look*, not authoring two CSS font\n * stacks. The raw stacks remain editable for power users.\n *\n * DATA ONLY. This module names families; it never loads them, so the kit takes no\n * font dependency. Web fonts are self-hosted per app (`@fontsource-variable/*`\n * imported from the app's entry or stylesheet); `fontPackages()` reports exactly\n * which packages a set of pairings needs. A pairing whose family an app has not\n * imported does not error — it falls back down its own stack — so an app that\n * offers a pairing must also ship its fonts.\n */\n\nexport interface FontPairing {\n id: string\n /** Shown in the picker, e.g. \"Newsreader / Inter\". */\n label: string\n /** One line on the character of the pairing. */\n description: string\n /** Font stack for headings (`--font-display`). */\n display: string\n /** Font stack for body copy (`--font-sans`). */\n sans: string\n /**\n * The npm packages an app must install + import to actually render this\n * pairing, e.g. `['@fontsource-variable/inter']`. Empty when the pairing uses\n * only system faces.\n */\n packages: string[]\n}\n\n/** Fallback tails, so a missing web font degrades to something sane. */\nconst SERIF_TAIL = 'ui-serif, Georgia, serif'\nconst SANS_TAIL = 'ui-sans-serif, system-ui, sans-serif'\n\n/**\n * The shipped catalog. Every entry uses variable fonts (one file per family)\n * rather than per-weight static files.\n */\nexport const FONT_PAIRINGS: FontPairing[] = [\n {\n id: 'system',\n label: 'System',\n description: 'The reader’s own interface font. Loads nothing.',\n display: SANS_TAIL,\n sans: SANS_TAIL,\n packages: [],\n },\n {\n id: 'newsreader-inter',\n label: 'Newsreader / Inter',\n description: 'Editorial serif headlines over a neutral, highly legible body.',\n display: `\"Newsreader Variable\", ${SERIF_TAIL}`,\n sans: `\"Inter Variable\", ${SANS_TAIL}`,\n packages: ['@fontsource-variable/newsreader', '@fontsource-variable/inter'],\n },\n {\n id: 'fraunces-inter',\n label: 'Fraunces / Inter',\n description: 'Characterful, slightly literary display with a quiet body.',\n display: `\"Fraunces Variable\", ${SERIF_TAIL}`,\n sans: `\"Inter Variable\", ${SANS_TAIL}`,\n packages: ['@fontsource-variable/fraunces', '@fontsource-variable/inter'],\n },\n {\n id: 'source-serif-inter',\n label: 'Source Serif / Inter',\n description: 'A workhorse serif for headings; sober and institutional.',\n display: `\"Source Serif 4 Variable\", ${SERIF_TAIL}`,\n sans: `\"Inter Variable\", ${SANS_TAIL}`,\n packages: ['@fontsource-variable/source-serif-4', '@fontsource-variable/inter'],\n },\n {\n id: 'inter',\n label: 'Inter',\n description: 'One neutral grotesque throughout. Product-like, no contrast.',\n display: `\"Inter Variable\", ${SANS_TAIL}`,\n sans: `\"Inter Variable\", ${SANS_TAIL}`,\n packages: ['@fontsource-variable/inter'],\n },\n {\n id: 'montserrat-nunito',\n label: 'Montserrat / Nunito',\n description: 'Geometric headings over a rounded body. ARBI’s historic look.',\n display: `\"Montserrat Variable\", ${SANS_TAIL}`,\n sans: `\"Nunito Variable\", ${SANS_TAIL}`,\n packages: ['@fontsource-variable/montserrat', '@fontsource-variable/nunito'],\n },\n]\n\n/** Look a pairing up by id. Returns undefined for an unknown id. */\nexport function getFontPairing(id: string): FontPairing | undefined {\n return FONT_PAIRINGS.find((p) => p.id === id)\n}\n\n/**\n * The pairing whose stacks match `fonts`, or undefined when the stacks have been\n * hand-edited away from every preset. Lets a picker show \"Custom\" honestly.\n */\nexport function matchFontPairing(fonts: {\n display: string\n sans: string\n}): FontPairing | undefined {\n return FONT_PAIRINGS.find((p) => p.display === fonts.display && p.sans === fonts.sans)\n}\n\n/** Every npm package needed to render the given pairings (deduped). */\nexport function fontPackages(pairings: FontPairing[] = FONT_PAIRINGS): string[] {\n return [...new Set(pairings.flatMap((p) => p.packages))].sort()\n}\n","/**\n * The shared theme store factory. A firm calls {@link createThemeStore} once\n * with its token catalog, default values and presets; the returned bundle (a\n * zustand hook + metadata) is the single source of truth consumed by every\n * theme surface (the back-office builder panel and the studio drawer), so the\n * token model, presets and apply logic live in exactly one place.\n */\nimport { create, type UseBoundStore, type StoreApi } from 'zustand'\nimport { persist } from 'zustand/middleware'\nimport {\n applyThemeVars,\n type ColorToken,\n type ThemeEmitMode,\n type ThemeFonts,\n type ThemePreset,\n type ThemeTokens,\n} from './tokens'\nimport { getFontPairing } from './fontPairings'\n\nexport interface ThemeState extends ThemeTokens {\n activePresetId: string | null\n setColor: (key: string, value: string) => void\n setFont: (which: keyof ThemeFonts, value: string) => void\n /** Apply a curated pairing, setting the display and body faces together. */\n setFontPairing: (pairingId: string) => void\n setRadius: (radius: number) => void\n applyPreset: (presetId: string) => void\n reset: () => void\n /** Snapshot of the editable tokens (for export / live apply). */\n snapshot: () => ThemeTokens\n}\n\nexport interface ThemeStoreConfig {\n /** The editable token catalog (keys + labels + groups). */\n tokens: ColorToken[]\n /** Group id → heading, for the grouped panel layout. */\n groupLabels: Record<string, string>\n /** Shipped defaults (the firm's brand values). */\n defaultTheme: ThemeTokens\n /** Starting points the user can apply then fine-tune. */\n presets: ThemePreset[]\n /** localStorage key for persistence (namespaced per firm). */\n storageKey: string\n /**\n * How edits are written onto the document. Defaults to `'flat'` (inline\n * `--color-*`). `'cssVars'` emits raw HSL-triplet vars into an injected\n * `<style>` so an app's own `hsl(var(--x))` indirection + `.dark` variant\n * survive. See {@link applyThemeVars}.\n */\n mode?: ThemeEmitMode\n /**\n * `cssVars` mode only: the dark-variant colour values keyed by token key,\n * emitted under `:root.dark`. Required (per editable token) for any firm with a\n * dark mode, otherwise a light-token override leaks into dark.\n */\n darkColors?: Record<string, string>\n}\n\nexport interface ThemeBundle extends ThemeStoreConfig {\n useStore: UseBoundStore<StoreApi<ThemeState>>\n}\n\n/** Build a firm-branded theme store bundle. */\nexport function createThemeStore(config: ThemeStoreConfig): ThemeBundle {\n const { defaultTheme, presets, storageKey } = config\n\n const useStore = create<ThemeState>()(\n persist(\n (set, get) => ({\n ...defaultTheme,\n activePresetId: presets[0]?.id ?? null,\n\n setColor: (key, value) =>\n set((s) => ({ colors: { ...s.colors, [key]: value }, activePresetId: null })),\n\n setFont: (which, value) =>\n set((s) => ({ fonts: { ...s.fonts, [which]: value }, activePresetId: null })),\n\n // A pairing sets both faces together — that is the whole point of it.\n // Unknown ids are ignored rather than clearing the typography.\n setFontPairing: (pairingId) => {\n const pairing = getFontPairing(pairingId)\n if (!pairing) return\n set({ fonts: { display: pairing.display, sans: pairing.sans } })\n },\n\n setRadius: (radius) => set({ radius, activePresetId: null }),\n\n applyPreset: (presetId) => {\n const preset = presets.find((p) => p.id === presetId)\n if (!preset) return\n set({\n colors: { ...preset.tokens.colors },\n fonts: { ...preset.tokens.fonts },\n radius: preset.tokens.radius,\n activePresetId: presetId,\n })\n },\n\n reset: () =>\n set({\n colors: { ...defaultTheme.colors },\n fonts: { ...defaultTheme.fonts },\n radius: defaultTheme.radius,\n activePresetId: presets[0]?.id ?? null,\n }),\n\n snapshot: () => {\n const { colors, fonts, radius } = get()\n return { colors, fonts, radius }\n },\n }),\n { name: storageKey }\n )\n )\n\n return { ...config, useStore }\n}\n\n/** Apply a bundle's current store to the live document, honouring its emit mode. */\nexport function applyStoredTheme(bundle: ThemeBundle): void {\n const { colors, fonts, radius } = bundle.useStore.getState()\n applyThemeVars({ colors, fonts, radius }, { mode: bundle.mode, dark: bundle.darkColors })\n}\n","/**\n * Firm-app formatting helpers — currency, initials, dates, durations and\n * percentages. UK-oriented defaults (en-GB / GBP / \"d MMM yyyy\") suit an English\n * law firm; nothing here is firm-branded, so every firm app shares them.\n *\n * Dependency-free on purpose (uses the platform `Intl` APIs) so the package\n * stays light and needs no date library.\n */\n\n/** Format a number as GBP, e.g. £1,240,000 or £12.4k depending on `compact`. */\nexport function gbp(value: number, compact = false): string {\n return new Intl.NumberFormat('en-GB', {\n style: 'currency',\n currency: 'GBP',\n maximumFractionDigits: compact && Math.abs(value) >= 1000 ? 1 : 0,\n notation: compact ? 'compact' : 'standard',\n }).format(value)\n}\n\n/** Initials from a person's name, e.g. \"Amara N. Okafor\" -> \"AO\". */\nexport function initials(name: string): string {\n const parts = name.trim().split(/\\s+/)\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase()\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase()\n}\n\n/**\n * Parse an ISO string. Date-only strings (\"2026-03-12\") are read as LOCAL\n * midnight (matching date-fns `parseISO`), not UTC, so day-level maths and\n * formatting don't drift across time zones.\n */\nfunction parseIso(iso: string): Date {\n const dateOnly = /^\\d{4}-\\d{2}-\\d{2}$/.test(iso)\n const d = new Date(dateOnly ? `${iso}T00:00:00` : iso)\n if (Number.isNaN(d.getTime())) throw new Error(`Invalid ISO date: ${iso}`)\n return d\n}\n\n/** \"12 Mar 2026\" */\nexport function fmtDate(iso: string): string {\n try {\n return new Intl.DateTimeFormat('en-GB', {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n }).format(parseIso(iso))\n } catch {\n return iso\n }\n}\n\n/** \"12 Mar 2026, 14:30\" */\nexport function fmtDateTime(iso: string): string {\n try {\n return new Intl.DateTimeFormat('en-GB', {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n }).format(parseIso(iso))\n } catch {\n return iso\n }\n}\n\nconst RELATIVE_UNITS: Array<[Intl.RelativeTimeFormatUnit, number]> = [\n ['year', 31_536_000],\n ['month', 2_592_000],\n ['week', 604_800],\n ['day', 86_400],\n ['hour', 3_600],\n ['minute', 60],\n ['second', 1],\n]\n\n/** \"3 days ago\" / \"in 2 hours\" — largest whole unit, like date-fns strict. */\nexport function fromNow(iso: string, from: Date = new Date()): string {\n try {\n const diffSeconds = (parseIso(iso).getTime() - from.getTime()) / 1000\n const abs = Math.abs(diffSeconds)\n const rtf = new Intl.RelativeTimeFormat('en-GB', { numeric: 'always' })\n for (const [unit, secs] of RELATIVE_UNITS) {\n if (abs >= secs || unit === 'second') {\n const value = Math.round(diffSeconds / secs)\n return rtf.format(value, unit)\n }\n }\n return rtf.format(0, 'second')\n } catch {\n return iso\n }\n}\n\n/** Signed day count to a date from a reference day. Negative = overdue. */\nexport function daysUntil(iso: string, from: Date = new Date()): number {\n try {\n const target = parseIso(iso)\n // Compare calendar days at local midnight, ignoring time-of-day.\n const a = Date.UTC(target.getFullYear(), target.getMonth(), target.getDate())\n const b = Date.UTC(from.getFullYear(), from.getMonth(), from.getDate())\n return Math.round((a - b) / 86_400_000)\n } catch {\n return 0\n }\n}\n\n/** Compact hours, e.g. 12.5h */\nexport function hrs(n: number): string {\n return `${n.toFixed(1)}h`\n}\n\n/** Percentage with no decimals, e.g. 82% */\nexport function pct(n: number): string {\n return `${Math.round(n)}%`\n}\n\n/**\n * Page references for a set of cited pages: \"p 2\", \"pp 2, 5\", \"pp 2–4, 9\".\n *\n * Pages, not passage counts — the page is what a reader turns to; how many\n * passages sit inside it is detail they did not ask for. Consecutive pages\n * collapse into a range, the same way a contiguous run of passages collapses\n * into a single mark in the viewer.\n */\nexport function formatPageRefs(pages: number[]): string {\n const sorted = [...new Set(pages)].sort((a, b) => a - b)\n if (sorted.length === 0) return ''\n const parts: string[] = []\n let start = sorted[0]\n let end = sorted[0]\n for (const page of sorted.slice(1)) {\n if (page === end + 1) {\n end = page\n continue\n }\n parts.push(start === end ? `${start}` : `${start}–${end}`)\n start = end = page\n }\n parts.push(start === end ? `${start}` : `${start}–${end}`)\n return `${sorted.length === 1 ? 'p' : 'pp'} ${parts.join(', ')}`\n}\n","/**\n * The one theme editor, shared by every surface. `variant=\"panel\"` is the roomy\n * back-office layout (grouped token cards + a live preview); `variant=\"drawer\"`\n * is the compact slide-over beside the studio canvas. Both drive the same\n * {@link ThemeBundle} store, so there is a single token model, preset list and\n * apply path. Firm-agnostic: chrome uses only universal surface tokens and the\n * preview renders the theme's own swatches, so it needs no brand-specific\n * component variants.\n */\nimport { useEffect, useState } from 'react'\nimport { RotateCcw, Palette, Save, Check } from 'lucide-react'\nimport { Card, CardHeader, CardTitle, CardContent, Input } from '@arbidocs/react/ui'\nimport { applyThemeVars } from './tokens'\nimport { FONT_PAIRINGS, matchFontPairing } from './fontPairings'\nimport type { ThemeBundle } from './store'\n\nexport interface ThemeEditorProps {\n /** The firm's theme store bundle (from createThemeStore). */\n bundle: ThemeBundle\n variant?: 'panel' | 'drawer'\n /** Firm identity shown in the panel's live-preview header. */\n preview?: { title: string; subtitle?: string }\n /** Optional persistence side-channel (e.g. save theme to ARBI); returns a \"via\" label. */\n onSave?: () => Promise<string | void>\n /** Stable testid namespace, e.g. \"builder-theme\" | \"studio-theme\". */\n testIdPrefix?: string\n}\n\nexport function ThemeEditor({\n bundle,\n variant = 'panel',\n preview,\n onSave,\n testIdPrefix = 'theme',\n}: ThemeEditorProps) {\n const { useStore, tokens, presets, groupLabels, mode, darkColors } = bundle\n const colors = useStore((s) => s.colors)\n const fonts = useStore((s) => s.fonts)\n const radius = useStore((s) => s.radius)\n const activePresetId = useStore((s) => s.activePresetId)\n const setColor = useStore((s) => s.setColor)\n const setFont = useStore((s) => s.setFont)\n const setFontPairing = useStore((s) => s.setFontPairing)\n const setRadius = useStore((s) => s.setRadius)\n const applyPreset = useStore((s) => s.applyPreset)\n const reset = useStore((s) => s.reset)\n\n const [saving, setSaving] = useState(false)\n const [savedVia, setSavedVia] = useState<string | null>(null)\n\n // Live preview: reflect every token change onto the running app, using the\n // firm's emit mode (flat inline vars, or injected HSL-triplet cssVars).\n useEffect(() => {\n applyThemeVars({ colors, fonts, radius }, { mode, dark: darkColors })\n }, [colors, fonts, radius, mode, darkColors])\n\n const tid = (suffix: string) => `${testIdPrefix}-${suffix}`\n const groups = [...new Set(tokens.map((t) => t.group))]\n\n const save = async () => {\n if (!onSave) return\n setSaving(true)\n const via = await onSave()\n setSavedVia(typeof via === 'string' ? via : 'saved')\n setSaving(false)\n }\n\n // ── Presets row ────────────────────────────────────────────────────────────\n const Presets = (\n <div className=\"flex flex-wrap items-center gap-2\">\n {presets.map((p) => (\n <button\n key={p.id}\n type=\"button\"\n onClick={() => applyPreset(p.id)}\n className={`rounded-full border px-3 py-1 text-xs font-medium transition-colors ${\n activePresetId === p.id\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-border text-foreground hover:border-primary'\n }`}\n data-testid={tid(`preset-${p.id}`)}\n >\n {p.label}\n </button>\n ))}\n <button\n type=\"button\"\n onClick={reset}\n className=\"ml-auto inline-flex items-center gap-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n data-testid={tid('reset')}\n >\n <RotateCcw className=\"size-3\" /> Reset\n </button>\n </div>\n )\n\n // ── A single colour control ─────────────────────────────────────────────────\n // A plain function (not a component) so it inlines into the parent tree: this\n // avoids remounting the inputs on every keystroke (which would drop focus).\n const colorRow = (k: string, label: string) => (\n <div key={k} className=\"flex items-center gap-3\">\n <input\n type=\"color\"\n value={colors[k] ?? '#000000'}\n onChange={(e) => setColor(k, e.target.value)}\n className=\"size-9 shrink-0 cursor-pointer rounded-md border border-border bg-transparent\"\n aria-label={label}\n data-testid={tid(`color-${k}`)}\n />\n <div className=\"min-w-0 flex-1\">\n <span className=\"block text-xs text-muted-foreground\">{label}</span>\n <Input\n value={colors[k] ?? ''}\n onChange={(e) => setColor(k, e.target.value)}\n className=\"bg-card placeholder:text-muted-foreground/70 focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring/50 h-7 font-mono text-xs\"\n data-testid={tid(`hex-${k}`)}\n />\n </div>\n </div>\n )\n\n // ── Typography + radius ─────────────────────────────────────────────────────\n // The pairing picker is the primary control; the raw stacks below stay for\n // anyone who needs a face the catalog doesn't carry. Editing a stack by hand\n // drops the selection to \"Custom\" rather than silently mismatching.\n const activePairing = matchFontPairing(fonts)\n const Typography = (\n <div className=\"space-y-4\">\n <div>\n <span className=\"block text-xs text-muted-foreground\">Typeface</span>\n <select\n value={activePairing?.id ?? ''}\n onChange={(e) => setFontPairing(e.target.value)}\n className=\"mt-1 h-8 w-full rounded-md border border-border bg-card px-2 text-xs text-foreground focus-visible:border-ring/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50\"\n data-testid={tid('font-pairing')}\n >\n {!activePairing && <option value=\"\">Custom</option>}\n {FONT_PAIRINGS.map((pairing) => (\n <option key={pairing.id} value={pairing.id}>\n {pairing.label}\n </option>\n ))}\n </select>\n <p className=\"mt-1 text-[11px] text-muted-foreground\">\n {activePairing?.description ?? 'Hand-edited font stacks.'}\n </p>\n </div>\n <div>\n <span className=\"block text-xs text-muted-foreground\">Display font stack</span>\n <Input\n value={fonts.display}\n onChange={(e) => setFont('display', e.target.value)}\n className=\"bg-card placeholder:text-muted-foreground/70 focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring/50 mt-1 font-mono text-xs\"\n data-testid={tid('font-display')}\n />\n </div>\n <div>\n <span className=\"block text-xs text-muted-foreground\">Body font stack</span>\n <Input\n value={fonts.sans}\n onChange={(e) => setFont('sans', e.target.value)}\n className=\"bg-card placeholder:text-muted-foreground/70 focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring/50 mt-1 font-mono text-xs\"\n data-testid={tid('font-sans')}\n />\n </div>\n <div>\n <span className=\"block text-xs text-muted-foreground\">Base radius — {radius}rem</span>\n <input\n type=\"range\"\n min={0}\n max={1.5}\n step={0.125}\n value={radius}\n onChange={(e) => setRadius(Number(e.target.value))}\n className=\"mt-2 w-full accent-[color:var(--color-primary)]\"\n data-testid={tid('radius')}\n />\n </div>\n </div>\n )\n\n // ── Live preview (panel only) — renders the theme's own swatches ────────────\n const Preview = (\n <Card variant=\"elevated\" className=\"rounded-xl\" data-testid={tid('preview')}>\n <CardHeader>\n <CardTitle className=\"text-base\">Live preview</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <div className=\"rounded-[var(--radius)] bg-primary p-4 text-primary-foreground\">\n <p className=\"font-display text-lg font-semibold\">{preview?.title ?? 'Preview'}</p>\n {preview?.subtitle && <p className=\"text-xs opacity-80\">{preview.subtitle}</p>}\n </div>\n <div className=\"grid grid-cols-6 gap-1.5\">\n {tokens.map((t) => (\n <div\n key={t.key}\n title={t.label}\n className=\"aspect-square rounded-md border border-border\"\n style={{ background: `var(--color-${t.key})` }}\n />\n ))}\n </div>\n <div className=\"rounded-[var(--radius)] border border-border bg-[color:var(--color-ai-accent-soft,var(--color-accent))] p-3\">\n <p className=\"text-sm font-medium text-[color:var(--color-ai-accent,var(--color-primary))]\">\n AI action surface\n </p>\n <p className=\"text-xs text-muted-foreground\">Themed by the AI-kit accent tokens.</p>\n </div>\n </CardContent>\n </Card>\n )\n\n const SaveBar = onSave && (\n <div className=\"mt-6 flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => void save()}\n disabled={saving}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:opacity-90 disabled:opacity-60\"\n data-testid={tid('save')}\n >\n {savedVia ? <Check className=\"size-4\" /> : <Save className=\"size-4\" />}\n {saving ? 'Saving…' : savedVia ? 'Saved' : 'Save theme'}\n </button>\n {savedVia && (\n <span className=\"text-xs text-muted-foreground\" data-testid={tid('via')}>\n stored via {savedVia}\n </span>\n )}\n </div>\n )\n\n // ── Drawer layout — compact, single column ──────────────────────────────────\n if (variant === 'drawer') {\n return (\n <div className=\"flex h-full flex-col overflow-y-auto bg-card p-5\" data-testid={testIdPrefix}>\n <div className=\"mb-4 flex items-center justify-between\">\n <h2 className=\"font-display text-lg font-semibold text-foreground\">Theme</h2>\n </div>\n {Presets}\n <p className=\"mt-5 mb-2 text-[10px] font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n Colours\n </p>\n <div className=\"space-y-3\">{tokens.map((t) => colorRow(t.key, t.label))}</div>\n <p className=\"mt-6 mb-2 text-[10px] font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n Typography & shape\n </p>\n {Typography}\n {SaveBar}\n </div>\n )\n }\n\n // ── Panel layout — grouped cards + live preview ─────────────────────────────\n return (\n <div className=\"grid gap-6 lg:grid-cols-[1fr_320px]\" data-testid={testIdPrefix}>\n <div className=\"space-y-6\">\n <Card variant=\"elevated\" className=\"rounded-xl\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Palette className=\"size-4 text-[color:var(--color-primary)]\" /> Presets\n </CardTitle>\n </CardHeader>\n <CardContent>{Presets}</CardContent>\n </Card>\n\n {groups.map((group) => (\n <Card\n key={group}\n variant=\"elevated\"\n className=\"rounded-xl\"\n data-testid={tid(`group-${group}`)}\n >\n <CardHeader>\n <CardTitle className=\"text-base\">{groupLabels[group] ?? group}</CardTitle>\n </CardHeader>\n <CardContent className=\"grid gap-3 sm:grid-cols-2\">\n {tokens.filter((t) => t.group === group).map((t) => colorRow(t.key, t.label))}\n </CardContent>\n </Card>\n ))}\n\n <Card variant=\"elevated\" className=\"rounded-xl\">\n <CardHeader>\n <CardTitle className=\"text-base\">Typography & shape</CardTitle>\n </CardHeader>\n <CardContent>{Typography}</CardContent>\n </Card>\n {SaveBar}\n </div>\n\n <div className=\"lg:sticky lg:top-4 lg:self-start\">{Preview}</div>\n </div>\n )\n}\n","/**\n * Compose a stable, kebab-case data-testid from parts.\n * Convention: {area}-{element}[-{qualifier}...]\n * tid(\"matters\", \"row\", \"CLM-2026-0042\") -> \"matters-row-clm-2026-0042\"\n * Keeps Playwright selectors predictable across a firm app.\n */\nexport function tid(...parts: Array<string | number | undefined | false>): string {\n return parts\n .filter((p): p is string | number => p !== undefined && p !== false && p !== '')\n .map((p) =>\n String(p)\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n )\n .join('-')\n}\n","/**\n * Reading a stored date span back at the precision it was written.\n *\n * A span carries no precision flag — \"October 2019\" and \"the whole of October\"\n * are the same thing on a timeline — so precision is inferred from the shape of\n * the bounds: midnight to 23:59:59 across a month is \"Oct 2019\", across one day\n * is that date, a zero-width span is an instant, and anything else is a range.\n *\n * Every value is read from its UTC components and NEVER localised. A\n * day-precision value stored at 00:00Z would otherwise display as the previous\n * day for every viewer west of UTC — which is also why these helpers spell out\n * English month names instead of delegating to `Intl`: the formatter's timezone\n * handling is the exact trap being avoided.\n */\n\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n\nconst MONTH_NAMES = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n]\n\nexport const WEEKDAY_NAMES = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']\n\nexport const DAY_MS = 86_400_000\n\n/** Month name and year, e.g. \"October 2019\". */\nexport function monthLabel(d: Date): string {\n return `${MONTH_NAMES[d.getUTCMonth()]} ${d.getUTCFullYear()}`\n}\n\n/** The UTC midnight that starts the day `d` falls in. */\nexport function utcDay(d: Date): Date {\n return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()))\n}\n\n/** `YYYY-MM-DD` for the UTC day — a stable key and testid suffix. */\nexport function dayKey(d: Date): string {\n return d.toISOString().slice(0, 10)\n}\n\n/** Parse an ISO string, returning null rather than an Invalid Date. */\nexport function parseIso(iso: string | null | undefined): Date | null {\n if (!iso) return null\n const d = new Date(iso)\n return isNaN(d.getTime()) ? null : d\n}\n\nfunction isMidnight(d: Date): boolean {\n return d.getUTCHours() === 0 && d.getUTCMinutes() === 0 && d.getUTCSeconds() === 0\n}\n\nfunction isEndOfDay(d: Date): boolean {\n return d.getUTCHours() === 23 && d.getUTCMinutes() === 59\n}\n\nfunction lastDayOfMonth(d: Date): number {\n return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth() + 1, 0)).getUTCDate()\n}\n\nfunction day(d: Date): string {\n return `${d.getUTCDate()} ${MONTHS[d.getUTCMonth()]} ${d.getUTCFullYear()}`\n}\n\n/** `day(d)`, but read from `d`'s wall-clock in `timeZone` instead of UTC.\n * Only used for the instant case below, where a real zone was recorded —\n * every viewer reads the same zone, so this doesn't reintroduce the\n * viewer-dependent localisation the rest of this file avoids. */\nfunction zonedDayAndTime(d: Date, timeZone: string): { day: string; hh: string; mm: string } {\n const parts = Object.fromEntries(\n new Intl.DateTimeFormat('en-US', {\n timeZone,\n hourCycle: 'h23',\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n .formatToParts(d)\n .map((p) => [p.type, p.value])\n )\n return { day: `${parts.day} ${parts.month} ${parts.year}`, hh: parts.hour, mm: parts.minute }\n}\n\n/** Format a stored span the way its precision implies. '' when undated.\n * `timezone` renders an instant in its recorded zone instead of UTC — pass it\n * only where the source actually carries one (e.g. a fact's `timezone`\n * field); day-precision spans stay zone-agnostic regardless. */\nexport function formatSpan(\n startIso: string | null | undefined,\n endIso: string | null | undefined,\n timezone?: string | null\n): string {\n if (!startIso) return ''\n const start = new Date(startIso)\n const end = endIso ? new Date(endIso) : start\n\n // An instant — an email, a precise deadline.\n if (startIso === endIso) {\n if (timezone) {\n try {\n const zoned = zonedDayAndTime(start, timezone)\n return `${zoned.day}, ${zoned.hh}:${zoned.mm} ${timezone}`\n } catch {\n // Unrecognised zone string — fall through to the UTC rendering below.\n }\n }\n const hh = String(start.getUTCHours()).padStart(2, '0')\n const mm = String(start.getUTCMinutes()).padStart(2, '0')\n return `${day(start)}, ${hh}:${mm} UTC`\n }\n\n if (isMidnight(start) && isEndOfDay(end)) {\n const sameDay =\n start.getUTCFullYear() === end.getUTCFullYear() &&\n start.getUTCMonth() === end.getUTCMonth() &&\n start.getUTCDate() === end.getUTCDate()\n if (sameDay) return day(start)\n\n // A month or a year only reads as one when the span covers ALL of it. The\n // end bound must reach the last day too, or 1–3 June would print \"Jun 2023\"\n // and a three-day span would lose two days to the label.\n const firstOfMonth = start.getUTCDate() === 1\n const endsMonth = end.getUTCDate() === lastDayOfMonth(end)\n const sameMonth =\n start.getUTCFullYear() === end.getUTCFullYear() && start.getUTCMonth() === end.getUTCMonth()\n if (firstOfMonth && endsMonth && sameMonth) {\n return `${MONTHS[start.getUTCMonth()]} ${start.getUTCFullYear()}`\n }\n\n const wholeYear =\n firstOfMonth &&\n endsMonth &&\n start.getUTCMonth() === 0 &&\n end.getUTCMonth() === 11 &&\n start.getUTCFullYear() === end.getUTCFullYear()\n if (wholeYear) return String(start.getUTCFullYear())\n\n return `${day(start)} – ${day(end)}`\n }\n\n return `${day(start)} – ${day(end)}`\n}\n","/**\n * Continuous calendar over dated items.\n *\n * An item is a span, so one dated \"October 2019\" genuinely occupies every day of\n * October. Repeating its label in all 31 cells is unreadable, so a multi-day item\n * renders as ONE continuous bar spanning its days, broken only where a week ends\n * — the label appears once, on the segment where the item starts.\n *\n * Segments are packed into lanes so overlapping items stack rather than collide,\n * which is what makes a dense month legible.\n *\n * It scrolls as one unbroken run of weeks from the earliest item to the latest,\n * rather than paging month by month: a chronology is read by moving along it, and\n * paging hides exactly the thing you want to see — what sits on either side of a\n * boundary. Month names mark where they change, and weeks stay whole, so days\n * belonging to the neighbouring month simply appear dimmed.\n *\n * Everything reads the UTC components and never localises: a day-precision item\n * stored at 00:00Z would otherwise land on the previous day for viewers west of\n * UTC.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport type { TimelineItem } from './types'\nimport { DAY_MS, WEEKDAY_NAMES, dayKey, formatSpan, monthLabel, utcDay } from './span'\n\n/** Bars per week before the rest collapse into a \"+n more\" row. */\nconst DEFAULT_MAX_LANES = 3\n/** A stray item dated 1900 must not ask the browser for 6,000 week rows. */\nconst MAX_WEEKS = 520\n\nexport interface TimelineCalendarProps<T extends TimelineItem = TimelineItem> {\n items: T[]\n /** Clicking a bar. The caller's own object comes back, not a copy. */\n onSelect?: (item: T) => void\n /** Bars shown per week before the remainder collapses to \"+n more\". */\n maxLanes?: number\n /** Shown when nothing in `items` carries a date. */\n emptyState?: ReactNode\n className?: string\n /** Prefix for every `data-testid` this view emits. */\n testId?: string\n}\n\ninterface Segment<T> {\n item: T\n startCol: number // 0-6 within the week\n span: number // days covered in THIS week\n isStart: boolean // the item begins in this segment — label goes here\n isEnd: boolean\n lane: number\n}\n\n/** A span covering exactly one day — rendered solid, the rest muted. */\nfunction isPrecise(item: TimelineItem): boolean {\n if (!item.start || !item.end) return false\n return item.start.slice(0, 10) === item.end.slice(0, 10)\n}\n\nexport function TimelineCalendar<T extends TimelineItem = TimelineItem>({\n items,\n onSelect,\n maxLanes = DEFAULT_MAX_LANES,\n emptyState,\n className,\n testId = 'timeline-calendar',\n}: TimelineCalendarProps<T>) {\n const dated = useMemo(() => items.filter((i) => i.start), [items])\n\n /** Every week from the earliest item to the latest, unbroken.\n *\n * Weeks are whole, so a month boundary falls mid-week and the neighbouring\n * month's days show dimmed rather than being clipped. Capped so a stray item\n * dated 1900 cannot ask the browser to lay out fifteen hundred weeks.\n */\n const weeks = useMemo(() => {\n if (dated.length === 0) return []\n const times = dated.flatMap((i) => [\n new Date(i.start).getTime(),\n new Date(i.end ?? i.start).getTime(),\n ])\n const first = utcDay(new Date(Math.min(...times)))\n const last = utcDay(new Date(Math.max(...times)))\n\n // Back up to the Monday on or before the first day.\n const gridStart = new Date(first)\n gridStart.setUTCDate(first.getUTCDate() - ((first.getUTCDay() + 6) % 7))\n\n const out: Date[][] = []\n const cursor = new Date(gridStart)\n while (cursor <= last && out.length < MAX_WEEKS) {\n out.push(\n Array.from({ length: 7 }, (_, d) => {\n const day = new Date(cursor)\n day.setUTCDate(cursor.getUTCDate() + d)\n return day\n })\n )\n cursor.setUTCDate(cursor.getUTCDate() + 7)\n }\n return out\n }, [dated])\n\n /** Per week: one segment per item overlapping it, packed into lanes. */\n const segmentsByWeek = useMemo(() => {\n return weeks.map((week) => {\n const weekStart = week[0]\n const weekEnd = week[6]\n const overlapping = dated\n .map((item) => ({\n item,\n start: utcDay(new Date(item.start)),\n end: utcDay(new Date(item.end ?? item.start)),\n }))\n .filter(({ start, end }) => start <= weekEnd && end >= weekStart)\n // Longest first so the big spans take the top lanes and read as context.\n .sort((a, b) => {\n const lenA = b.end.getTime() - b.start.getTime()\n const lenB = a.end.getTime() - a.start.getTime()\n return lenA - lenB || a.start.getTime() - b.start.getTime()\n })\n\n const laneEnds: number[] = [] // last occupied column per lane\n const segments: Segment<T>[] = []\n let overflow = 0\n\n for (const { item, start, end } of overlapping) {\n const from = start < weekStart ? weekStart : start\n const to = end > weekEnd ? weekEnd : end\n const startCol = Math.round((from.getTime() - weekStart.getTime()) / DAY_MS)\n const endCol = Math.round((to.getTime() - weekStart.getTime()) / DAY_MS)\n\n let lane = laneEnds.findIndex((last) => last < startCol)\n if (lane === -1) lane = laneEnds.length\n if (lane >= maxLanes) {\n overflow += 1\n continue\n }\n laneEnds[lane] = endCol\n segments.push({\n item,\n startCol,\n span: endCol - startCol + 1,\n isStart: start >= weekStart,\n isEnd: end <= weekEnd,\n lane,\n })\n }\n return { segments, overflow }\n })\n }, [weeks, dated, maxLanes])\n\n if (weeks.length === 0 && emptyState) {\n return <>{emptyState}</>\n }\n\n return (\n <div className={cn('flex flex-col h-full', className)} data-testid={testId}>\n <div className=\"grid grid-cols-7 border-b border-border bg-background\">\n {WEEKDAY_NAMES.map((d) => (\n <div key={d} className=\"px-2 py-1 text-[11px] text-muted-foreground text-center\">\n {d}\n </div>\n ))}\n </div>\n\n {/* The scroller is addressable: a continuous calendar is read by scrolling,\n so a test or a host that wants to move through it needs a handle. */}\n <div className=\"flex-1 overflow-auto\" data-testid={`${testId}-scroll`}>\n {weeks.map((week, wi) => {\n const { segments, overflow } = segmentsByWeek[wi]\n // Label a month where it starts: the first week overall, or any week\n // containing the 1st.\n // Prefer the month that STARTS in this week. The first row usually\n // begins in the previous month (the Monday before the earliest item),\n // so labelling it week[0] would name December for a January range.\n const monthStartDay = week.find((d) => d.getUTCDate() === 1)\n const marker = monthStartDay ?? (wi === 0 ? week[0] : undefined)\n return (\n <div key={dayKey(week[0])}>\n {marker && (\n // Sticky, so the month you are LOOKING at names itself: it\n // pins to the top of the scroller while you are inside it and\n // is pushed up by the next one. No scroll listener needed.\n <div\n className=\"sticky top-0 z-10 px-3 py-1 text-xs font-medium text-foreground bg-background/95 backdrop-blur border-y border-border/60\"\n data-testid={`${testId}-month-${marker.getUTCFullYear()}-${String(\n marker.getUTCMonth() + 1\n ).padStart(2, '0')}`}\n >\n {monthLabel(marker)}\n </div>\n )}\n <div className=\"border-b border-border/40\">\n <div className=\"grid grid-cols-7 bg-background\">\n {week.map((day) => (\n <div\n key={dayKey(day)}\n data-testid={`${testId}-day-${dayKey(day)}`}\n className={cn(\n 'px-1 pt-1 text-[11px] border-r border-border/40',\n day.getUTCDate() === 1\n ? 'text-foreground font-medium'\n : 'text-muted-foreground/60'\n )}\n >\n {day.getUTCDate()}\n </div>\n ))}\n </div>\n\n {/* Bars. A span crossing days is ONE element, not a label\n repeated in every cell. */}\n <div\n className=\"grid grid-cols-7 gap-y-0.5 px-0.5 pb-1 bg-muted/40\"\n // Rows grow to fit their content: a long label wraps into\n // the space the week already has rather than truncating while\n // most of the row sits empty. Capped by line-clamp below so a\n // paragraph cannot swallow the month.\n style={{ gridAutoRows: 'minmax(18px, auto)', minHeight: 62 }}\n >\n {segments.map((seg) => (\n <button\n key={`${seg.item.id}-${seg.startCol}`}\n type=\"button\"\n onClick={() => onSelect?.(seg.item)}\n title={`${formatSpan(seg.item.start, seg.item.end)} — ${seg.item.label}`}\n data-testid={`${testId}-entry-${seg.item.id}`}\n style={{\n gridColumn: `${seg.startCol + 1} / span ${seg.span}`,\n gridRow: seg.lane + 1,\n }}\n className={cn(\n 'text-left text-[10px] leading-[13px] py-[2px] px-1 min-h-[18px] whitespace-normal break-words line-clamp-3',\n isPrecise(seg.item)\n ? 'bg-primary/20 text-foreground'\n : 'bg-muted text-muted-foreground',\n seg.isStart && 'rounded-l',\n seg.isEnd && 'rounded-r'\n )}\n >\n {/* Label once, where the item begins; a continuation is\n the bar alone. */}\n {seg.isStart ? seg.item.label : ' '}\n </button>\n ))}\n {overflow > 0 && (\n <span\n className=\"text-[10px] text-muted-foreground px-1\"\n style={{ gridColumn: '1 / span 7', gridRow: maxLanes + 1 }}\n >\n +{overflow} more\n </span>\n )}\n </div>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n","/**\n * Gantt view over dated items — one swimlane per item on a shared date axis.\n *\n * The axis is what makes it readable: bars are positioned by real elapsed time,\n * so a span's WIDTH is its duration and an imprecise date shows AS imprecision —\n * an item dated \"2019\" is a year-wide bar, an emailed one a hairline tick.\n *\n * Rows are sorted chronologically here rather than left to the caller: this is a\n * chronology, and a caller handing over rows in creation order (newest first, as\n * a notes list does) would render the timeline backwards.\n *\n * Selecting a bar opens the detail panel. The panel owns the parts every caller\n * has — label, span, description — and hands the rest to `renderDetail`, which is\n * where an app adds its own context (source documents, an owner, a link).\n */\nimport { useState, type ReactNode } from 'react'\nimport { Calendar, X } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport type { TimelineItem } from './types'\nimport { formatSpan, parseIso } from './span'\n\n/** Bar colours cycle so adjacent rows stay distinguishable. */\nconst BAR_PALETTE = [\n {\n gradient: 'linear-gradient(90deg, #6366f1, #818cf8)',\n shadow: '0 2px 6px rgba(99,102,241,.35)',\n },\n {\n gradient: 'linear-gradient(90deg, #8b5cf6, #a78bfa)',\n shadow: '0 2px 6px rgba(139,92,246,.35)',\n },\n { gradient: 'linear-gradient(90deg, #ef4444, #f87171)', shadow: '0 2px 6px rgba(239,68,68,.35)' },\n {\n gradient: 'linear-gradient(90deg, #f59e0b, #fbbf24)',\n shadow: '0 2px 6px rgba(245,158,11,.35)',\n },\n { gradient: 'linear-gradient(90deg, #22c55e, #4ade80)', shadow: '0 2px 6px rgba(34,197,94,.35)' },\n { gradient: 'linear-gradient(90deg, #06b6d4, #22d3ee)', shadow: '0 2px 6px rgba(6,182,212,.35)' },\n]\n\nconst WEEK_MS = 7 * 24 * 60 * 60 * 1000\n\nexport interface TimelineGanttProps<T extends TimelineItem = TimelineItem> {\n items: T[]\n /** The selected item, or null when the panel closes. */\n onSelect?: (item: T | null) => void\n /** Extra detail-panel content for the selected item — sources, links, actions. */\n renderDetail?: (item: T) => ReactNode\n /** Width of the row-label gutter, in pixels. */\n labelWidth?: number\n /** Shown when nothing in `items` carries a usable date. */\n emptyMessage?: string\n className?: string\n /** Prefix for every `data-testid` this view emits. */\n testId?: string\n}\n\nfunction formatAxisDate(d: Date): string {\n return d.toLocaleDateString('en-US', { month: 'short', year: 'numeric' })\n}\n\nexport function TimelineGantt<T extends TimelineItem = TimelineItem>({\n items,\n onSelect,\n renderDetail,\n labelWidth = 240,\n emptyMessage = 'Nothing dated yet.',\n className,\n testId = 'timeline-gantt',\n}: TimelineGanttProps<T>) {\n const [activeIndex, setActiveIndex] = useState<number | null>(null)\n\n const rows = items\n .filter((i) => parseIso(i.start) !== null)\n .slice()\n .sort((a, b) => parseIso(a.start)!.getTime() - parseIso(b.start)!.getTime())\n\n if (rows.length === 0) {\n return (\n <div\n data-testid={`${testId}-empty-state`}\n className={cn(\n 'flex flex-col items-center justify-center py-16 text-muted-foreground',\n className\n )}\n >\n <Calendar className=\"w-12 h-12 mb-3 opacity-30\" />\n <p className=\"text-sm\">{emptyMessage}</p>\n </div>\n )\n }\n\n // Axis bounds, padded so the first and last bars are not flush to the edge.\n const allDates = rows.flatMap((i) => {\n const s = parseIso(i.start)!\n return [s, parseIso(i.end ?? null) ?? s]\n })\n const minTime = Math.min(...allDates.map((d) => d.getTime()))\n const maxTime = Math.max(...allDates.map((d) => d.getTime()))\n const pad = Math.max((maxTime - minTime) * 0.04, WEEK_MS)\n const axisMin = new Date(minTime - pad)\n const axisMax = new Date(maxTime + pad)\n const axisRange = axisMax.getTime() - axisMin.getTime()\n\n const toPercent = (d: Date) =>\n Math.min(100, Math.max(0, ((d.getTime() - axisMin.getTime()) / axisRange) * 100))\n\n const ticks = Array.from(\n { length: 5 },\n (_, i) => new Date(axisMin.getTime() + (axisRange * i) / 4)\n )\n\n const today = new Date()\n const todayPct = toPercent(today)\n const showToday = today > axisMin && today < axisMax\n\n const activeItem = activeIndex !== null ? rows[activeIndex] : null\n // A detail slot that renders nothing for this item gets no divider either — an\n // empty labelled section reads as missing data rather than as no data.\n const detail = activeItem ? renderDetail?.(activeItem) : null\n\n const select = (index: number | null) => {\n setActiveIndex(index)\n onSelect?.(index === null ? null : rows[index])\n }\n\n return (\n <div className={cn('flex h-full min-h-0', className)}>\n {/* Chart area */}\n <div className=\"flex-1 min-w-0 p-5 overflow-x-auto\">\n {/* Axis row */}\n <div className=\"flex mb-1\">\n <div\n style={{ width: labelWidth, flexShrink: 0 }}\n className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground pb-1\"\n >\n Event\n </div>\n <div className=\"flex-1 relative h-6 border-b border-border\">\n {ticks.map((tick, i) => (\n <span\n key={i}\n style={{ left: `${toPercent(tick)}%` }}\n className=\"absolute bottom-1 text-[10px] text-muted-foreground -translate-x-1/2 whitespace-nowrap select-none\"\n >\n {formatAxisDate(tick)}\n </span>\n ))}\n </div>\n </div>\n\n {/* Swimlane rows */}\n <div className=\"relative mt-2\">\n {showToday && (\n <div\n className=\"absolute top-0 bottom-0 pointer-events-none z-10\"\n style={{\n left: `calc(${labelWidth}px + (100% - ${labelWidth}px) * ${todayPct / 100})`,\n }}\n >\n <div className=\"h-full border-l-2 border-dashed border-muted-foreground/50\" />\n <span className=\"absolute -top-5 -translate-x-1/2 text-[9px] text-muted-foreground bg-background border rounded px-1\">\n today\n </span>\n </div>\n )}\n\n {rows.map((item, i) => {\n const startDate = parseIso(item.start)!\n const endDate = parseIso(item.end ?? null) ?? startDate\n const leftPct = toPercent(startDate)\n const widthPct = Math.max(1, toPercent(endDate) - toPercent(startDate))\n const color = BAR_PALETTE[i % BAR_PALETTE.length]\n const isActive = activeIndex === i\n\n return (\n <div key={item.id} className=\"flex items-center mb-2\">\n <div\n style={{ width: labelWidth, flexShrink: 0 }}\n className=\"text-xs font-medium text-muted-foreground pr-3 break-words leading-snug\"\n >\n {item.label}\n </div>\n <div className=\"flex-1 h-7 bg-muted/30 border border-border rounded-md relative overflow-visible\">\n <button\n data-testid={`${testId}-bar-${i}`}\n aria-label={item.label}\n aria-pressed={isActive}\n style={{\n left: `${leftPct}%`,\n width: `${widthPct}%`,\n background: color.gradient,\n boxShadow: isActive ? '0 0 0 2px white, 0 0 0 4px #6366f1' : color.shadow,\n }}\n // The bar carries NO text. It used to print its own date\n // range, which (a) repeated what the axis and the side\n // panel already say, and (b) made the bar's readability a\n // function of its width — a same-day fact is a point, and a\n // point cannot hold \"Jan 23 – Mar 24\". The title is the\n // gutter label to its left, at a width the data can't\n // change; the exact span is one click away in the panel,\n // and on hover.\n title={formatSpan(item.start, item.end) || undefined}\n className=\"absolute top-0.5 h-6 min-w-[6px] rounded cursor-pointer transition-[filter] hover:brightness-110 focus:outline-none\"\n onClick={() => select(isActive ? null : i)}\n />\n </div>\n </div>\n )\n })}\n </div>\n </div>\n\n {/* Side panel */}\n <div\n data-testid={`${testId}-side-panel`}\n className={cn(\n 'border-l bg-muted/20 flex flex-col shrink-0 overflow-hidden transition-all duration-300',\n activeItem ? 'w-60 open' : 'w-0'\n )}\n >\n <div\n className={cn(\n 'w-60 p-4 flex flex-col gap-3 transition-opacity duration-200',\n activeItem ? 'opacity-100' : 'opacity-0'\n )}\n >\n {activeItem && (\n <>\n <div className=\"flex justify-end\">\n <button\n data-testid={`${testId}-panel-close`}\n className=\"w-6 h-6 rounded flex items-center justify-center text-muted-foreground hover:bg-muted\"\n onClick={() => select(null)}\n aria-label=\"Close panel\"\n >\n <X className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n\n <div>\n <div\n data-testid={`${testId}-panel-title`}\n className=\"text-sm font-semibold text-foreground leading-snug\"\n >\n {activeItem.label}\n </div>\n <div className=\"flex items-center gap-1 mt-1 text-xs text-muted-foreground\">\n <Calendar className=\"w-3 h-3 shrink-0\" />\n <span>{formatSpan(activeItem.start, activeItem.end) || 'Date unknown'}</span>\n </div>\n </div>\n\n {activeItem.description && (\n <>\n <hr className=\"border-border\" />\n <div>\n <div className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground mb-1\">\n Summary\n </div>\n <p\n data-testid={`${testId}-panel-desc`}\n className=\"text-xs text-muted-foreground leading-relaxed\"\n >\n {activeItem.description}\n </p>\n </div>\n </>\n )}\n\n {detail && (\n <>\n <hr className=\"border-border\" />\n {detail}\n </>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n )\n}\n","/**\n * A timeline you can drop anywhere: the same items, seen as a calendar or as a\n * Gantt, with a toggle between them.\n *\n * The two views answer different questions — a calendar says \"what falls in this\n * week\", a Gantt says \"how long did this run and what overlapped it\" — and both\n * read the identical {@link TimelineItem} array, so a host renders one component\n * and lets the reader choose. Fix `view` to pin it to one.\n */\nimport { useState, type ReactNode } from 'react'\nimport { CalendarDays, GanttChartSquare } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport type { TimelineItem } from './types'\nimport { TimelineCalendar } from './TimelineCalendar'\nimport { TimelineGantt } from './TimelineGantt'\n\nexport type TimelineViewMode = 'calendar' | 'gantt'\n\nexport interface TimelineProps<T extends TimelineItem = TimelineItem> {\n items: T[]\n /** Pin the view. Omit to show the toggle and let the reader switch. */\n view?: TimelineViewMode\n /** Which view the toggle starts on. */\n defaultView?: TimelineViewMode\n onSelect?: (item: T) => void\n /** Extra Gantt detail-panel content — sources, links, actions. */\n renderDetail?: (item: T) => ReactNode\n /** Shown when nothing carries a date. */\n emptyMessage?: string\n className?: string\n testId?: string\n}\n\nconst TOGGLE = [\n { mode: 'calendar' as const, label: 'Calendar', Icon: CalendarDays },\n { mode: 'gantt' as const, label: 'Gantt', Icon: GanttChartSquare },\n]\n\nexport function Timeline<T extends TimelineItem = TimelineItem>({\n items,\n view,\n defaultView = 'calendar',\n onSelect,\n renderDetail,\n emptyMessage,\n className,\n testId = 'timeline',\n}: TimelineProps<T>) {\n const [picked, setPicked] = useState<TimelineViewMode>(defaultView)\n const mode = view ?? picked\n\n return (\n <div className={cn('flex flex-col h-full min-h-0', className)} data-testid={testId}>\n {!view && (\n <div className=\"flex items-center gap-1 p-2 border-b border-border\">\n {TOGGLE.map(({ mode: m, label, Icon }) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => setPicked(m)}\n aria-pressed={mode === m}\n data-testid={`${testId}-view-${m}`}\n className={cn(\n 'flex items-center gap-1.5 rounded px-2 py-1 text-xs',\n mode === m\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n <Icon className=\"w-3.5 h-3.5\" />\n {label}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"flex-1 min-h-0\">\n {mode === 'calendar' ? (\n <TimelineCalendar\n items={items}\n onSelect={onSelect}\n testId={`${testId}-calendar`}\n emptyState={\n <div className=\"flex h-full items-center justify-center p-8 text-sm text-muted-foreground\">\n {emptyMessage ?? 'Nothing dated yet.'}\n </div>\n }\n />\n ) : (\n <TimelineGantt\n items={items}\n onSelect={(item) => item && onSelect?.(item)}\n renderDetail={renderDetail}\n emptyMessage={emptyMessage}\n testId={`${testId}-gantt`}\n />\n )}\n </div>\n </div>\n )\n}\n","import { cn } from '@arbidocs/react/ui'\n\n/** Editorial heading block for marketing sections: eyebrow + title + lead. */\nexport function SectionHeading({\n eyebrow,\n title,\n lead,\n align = 'left',\n className,\n invert,\n eyebrowClassName,\n}: {\n eyebrow?: string\n title: string\n lead?: string\n align?: 'left' | 'center'\n className?: string\n invert?: boolean\n /** Override the eyebrow styling (e.g. a firm brand accent). Default: token classes. */\n eyebrowClassName?: string\n}) {\n return (\n <div className={cn('max-w-3xl', align === 'center' && 'mx-auto text-center', className)}>\n {eyebrow && (\n <p\n className={cn(\n 'mb-3 text-xs font-semibold uppercase tracking-wider',\n eyebrowClassName ?? (invert ? 'text-background/60' : 'text-muted-foreground')\n )}\n >\n {eyebrow}\n </p>\n )}\n <h2\n className={cn(\n 'font-display text-3xl font-semibold tracking-tight text-balance sm:text-4xl',\n invert ? 'text-background' : 'text-foreground'\n )}\n >\n {title}\n </h2>\n {lead && (\n <p\n className={cn(\n 'mt-4 text-lg leading-relaxed',\n invert ? 'text-background/70' : 'text-muted-foreground'\n )}\n >\n {lead}\n </p>\n )}\n </div>\n )\n}\n","/**\n * Asset resolution for the editor canvas — the SDK-free half.\n *\n * An image block's stored `src` is one of three things: a **workspace asset ref**\n * while authoring (an `asset:<docId>` string), a plain URL, or — once published —\n * an inlined `data:` URI (see the studio publish/materialize step). Only inside\n * the authenticated Studio can an asset ref be resolved to displayable bytes (via\n * the thumbnail endpoint).\n *\n * So the resolver is **injected, not imported**. This module knows only that\n * *some* component can turn a `docId` into pixels; the Studio supplies\n * `AssetThumb` from `./assetImage`, which is where the SDK and React Query live.\n * Everywhere else — the pure coverage guard, the unauthenticated public renderer,\n * a marketing site importing `@arbidocs/blocks/site` — the context is empty and\n * `src` renders verbatim. Importing the resolver here instead would drag the SDK\n * into every website block: a dead code path still pins the module graph, because\n * neither kit package declares `sideEffects`.\n *\n * Refs are **explicitly prefixed** (`asset:`) rather than bare ext_ids so the\n * publish walk can distinguish an image source from any other token-like prop\n * (block ids, `\"left\"`, icon names…) with zero false positives.\n */\nimport { createContext, useContext, type ComponentType, type ReactNode } from 'react'\n\n/** Marks a stored image value as a workspace asset ref rather than a URL. */\nexport const ASSET_REF_PREFIX = 'asset:'\n\n/** Wrap a workspace document ext_id as a storable asset ref. */\nexport function asAssetRef(docId: string): string {\n return `${ASSET_REF_PREFIX}${docId}`\n}\n\n/** The workspace document ext_id behind an asset ref (`asset:doc-1` → `doc-1`). */\nexport function assetRefId(src: string): string {\n return src.slice(ASSET_REF_PREFIX.length)\n}\n\n/** What a resolver component receives. `AssetThumb` in `./assetImage` implements it. */\nexport interface AssetRenderProps {\n docId: string\n alt?: string\n className?: string\n testId?: string\n}\n\n/** Renders a workspace asset ext_id as an image. */\nexport type AssetRenderer = ComponentType<AssetRenderProps>\n\n/**\n * The injected resolver, or `null` where asset refs cannot be resolved (the\n * public renderer, tests, any unauthenticated page).\n */\nexport const AssetResolverContext = createContext<AssetRenderer | null>(null)\n\nexport function AssetResolverProvider({\n render,\n children,\n}: {\n /** Typically `AssetThumb` from `./assetImage`. */\n render: AssetRenderer\n children: ReactNode\n}) {\n return <AssetResolverContext.Provider value={render}>{children}</AssetResolverContext.Provider>\n}\n\n/** The active resolver, or `null` when asset refs must render verbatim. */\nexport function useAssetRenderer(): AssetRenderer | null {\n return useContext(AssetResolverContext)\n}\n\n/** True only where a bare asset ext_id can be resolved (the authenticated Studio). */\nexport function useAssetResolverActive(): boolean {\n return useAssetRenderer() !== null\n}\n\n/**\n * Is `src` a workspace asset ref (`asset:<docId>`) rather than an already-\n * renderable URL / `data:` URI? Only prefixed refs need resolution.\n */\nexport function isAssetRef(src: string | undefined): src is string {\n return !!src && src.startsWith(ASSET_REF_PREFIX)\n}\n","import { ImageIcon } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { assetRefId, isAssetRef, useAssetRenderer } from './assetResolver'\n\nexport type BlockImageAspect = '16:9' | '4:3' | '1:1' | '21:9' | '4:5'\nexport type BlockImageRounded = 'none' | 'md' | 'lg' | 'full'\n\nexport interface BlockImageProps {\n src?: string\n alt?: string\n aspect?: BlockImageAspect\n rounded?: BlockImageRounded\n /** Editorial \"photo frame\" treatment: a matte border ring + soft shadow. */\n framed?: boolean\n className?: string\n testId?: string\n}\n\nconst ASPECT: Record<BlockImageAspect, string> = {\n '16:9': 'aspect-video',\n '4:3': 'aspect-[4/3]',\n '1:1': 'aspect-square',\n '21:9': 'aspect-[21/9]',\n '4:5': 'aspect-[4/5]',\n}\n\nconst ROUNDED: Record<BlockImageRounded, string> = {\n none: 'rounded-none',\n md: 'rounded-md',\n lg: 'rounded-xl',\n full: 'rounded-full',\n}\n\n/**\n * Image with a graceful, self-contained fallback: when `src` is empty it renders a\n * token-clean gradient placeholder (no network needed) so the palette always looks\n * good in the editor and in demos. Token-only classes so it themes per firm.\n */\nexport function BlockImage({\n src,\n alt = '',\n aspect = '16:9',\n rounded = 'lg',\n framed,\n className,\n testId,\n}: BlockImageProps) {\n const shape = cn(\n ASPECT[aspect] ?? ASPECT['16:9'],\n ROUNDED[rounded] ?? ROUNDED.lg,\n framed && 'ring-1 ring-border shadow-xl'\n )\n // In the Studio a resolver is injected and an `asset:` ref resolves to its\n // thumbnail; elsewhere there is none, and `src` is already a URL / data-URI\n // that renders verbatim (the publish step inlines refs).\n const AssetRenderer = useAssetRenderer()\n if (AssetRenderer && isAssetRef(src)) {\n return (\n <AssetRenderer\n docId={assetRefId(src)}\n alt={alt}\n className={cn('w-full object-cover', shape, className)}\n testId={testId}\n />\n )\n }\n if (src && !isAssetRef(src)) {\n return (\n <img\n src={src}\n alt={alt}\n className={cn('w-full object-cover', shape, className)}\n data-testid={testId}\n />\n )\n }\n return (\n <div\n className={cn(\n 'flex w-full items-center justify-center overflow-hidden border border-border',\n 'bg-gradient-to-br from-muted via-card to-accent text-muted-foreground',\n shape,\n className\n )}\n data-testid={testId}\n aria-label={alt || 'Image placeholder'}\n role=\"img\"\n >\n <ImageIcon className=\"size-8 opacity-60\" />\n </div>\n )\n}\n","import type { CSSProperties, ReactNode } from 'react'\nimport { ArrowRight } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { BlockImage } from './BlockImage'\n\nexport type HeroTone = 'default' | 'muted' | 'ink'\nexport type HeroAlign = 'left' | 'center'\n\nexport interface HeroCta {\n label?: string\n href?: string\n}\n\nexport interface HeroProps {\n eyebrow?: string\n title: string\n /** A word/phrase within the title to accent (rendered in the primary colour). */\n emphasis?: string\n subtitle?: string\n primaryCta?: HeroCta\n secondaryCta?: HeroCta\n align?: HeroAlign\n tone?: HeroTone\n /** Side visual (ignored when `backgroundImage` is set). */\n imageUrl?: string\n /** Full-bleed background image URL/data-URI. Turns the hero into a cover band. */\n backgroundImage?: string\n /** Darkening scrim over the background image, for legible copy. Default true. */\n overlay?: boolean\n /** Override the eyebrow styling (e.g. a firm brand accent). Default: token classes. */\n eyebrowClassName?: string\n testId?: string\n}\n\nconst TONE_SURFACE: Record<HeroTone, string> = {\n default: 'bg-background text-foreground',\n muted: 'bg-muted text-foreground',\n ink: 'bg-foreground text-background',\n}\n\n/** Highlight each occurrence of `emphasis` inside `title` with the accent colour. */\nfunction renderTitle(title: string, emphasis?: string): ReactNode {\n if (!emphasis || !title.includes(emphasis)) return title\n const parts = title.split(emphasis)\n return parts.map((part, i) => (\n <span key={i}>\n {part}\n {i < parts.length - 1 && <span className=\"text-primary\">{emphasis}</span>}\n </span>\n ))\n}\n\n/** Editorial marketing hero: eyebrow, headline, subtitle, two CTAs and a visual. */\nexport function Hero({\n eyebrow,\n title,\n emphasis,\n subtitle,\n primaryCta,\n secondaryCta,\n align = 'left',\n tone = 'default',\n imageUrl,\n backgroundImage,\n overlay = true,\n eyebrowClassName,\n testId,\n}: HeroProps) {\n // Over a background image the surface is dark, so copy reads on-background.\n const onDark = Boolean(backgroundImage) || tone === 'ink'\n const subtle = onDark ? 'text-background/70' : 'text-muted-foreground'\n const eyebrowClass = eyebrowClassName ?? (onDark ? 'text-background/60' : 'text-muted-foreground')\n const centered = align === 'center' || Boolean(backgroundImage)\n\n const heading = renderTitle(title, emphasis)\n\n const copy = (\n <div\n className={cn(\n 'max-w-2xl',\n centered && 'mx-auto text-center',\n backgroundImage && 'text-background'\n )}\n >\n {eyebrow && (\n <p className={cn('mb-4 text-sm font-semibold uppercase tracking-wider', eyebrowClass)}>\n {eyebrow}\n </p>\n )}\n <h1 className=\"text-4xl font-semibold tracking-tight text-balance sm:text-5xl\">{heading}</h1>\n {subtitle && <p className={cn('mt-6 text-lg leading-relaxed', subtle)}>{subtitle}</p>}\n {(primaryCta?.label || secondaryCta?.label) && (\n <div\n className={cn('mt-8 flex flex-col gap-3 sm:flex-row', centered && 'sm:justify-center')}\n >\n {primaryCta?.label && (\n <Button asChild size=\"lg\">\n <a href={primaryCta.href || '#'}>\n {primaryCta.label}\n <ArrowRight className=\"size-4\" />\n </a>\n </Button>\n )}\n {secondaryCta?.label && (\n <Button\n asChild\n size=\"lg\"\n variant=\"outline\"\n className={cn(\n onDark &&\n 'border-background/35 bg-transparent text-background hover:bg-background/10 hover:text-background'\n )}\n >\n <a href={secondaryCta.href || '#'}>{secondaryCta.label}</a>\n </Button>\n )}\n </div>\n )}\n </div>\n )\n\n // Full-bleed cover hero: background image + optional scrim + centered copy.\n if (backgroundImage) {\n const bgStyle: CSSProperties = {\n backgroundImage: `url(\"${backgroundImage}\")`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }\n return (\n <section\n className=\"relative isolate overflow-hidden\"\n style={bgStyle}\n data-testid={testId}\n data-bg={testId && `${testId}-bg`}\n >\n {overlay && <div className=\"absolute inset-0 bg-black/55\" aria-hidden />}\n <div className=\"relative mx-auto max-w-7xl px-5 py-28 lg:px-8 lg:py-36\">{copy}</div>\n </section>\n )\n }\n\n return (\n <section className={cn(TONE_SURFACE[tone] ?? TONE_SURFACE.default)} data-testid={testId}>\n <div className=\"mx-auto max-w-7xl px-5 py-20 lg:px-8 lg:py-28\">\n {centered ? (\n <div className=\"flex flex-col items-center gap-12\">\n {copy}\n {imageUrl && (\n <BlockImage\n src={imageUrl}\n aspect=\"16:9\"\n rounded=\"lg\"\n className=\"w-full max-w-4xl\"\n testId={testId && `${testId}-image`}\n />\n )}\n </div>\n ) : (\n <div className=\"grid items-center gap-12 lg:grid-cols-2\">\n {copy}\n <BlockImage\n src={imageUrl}\n aspect=\"4:5\"\n rounded=\"lg\"\n testId={testId && `${testId}-image`}\n />\n </div>\n )}\n </div>\n </section>\n )\n}\n","import type { ComponentType, ReactNode } from 'react'\n\n/**\n * Firm-agnostic link injection for marketing blocks. A card that navigates to a\n * detail page renders an internal `<a href>` by default, but a consuming app can\n * inject its router's link (e.g. react-router's `Link`, adapted to `href`) via\n * `linkComponent` so navigation stays in-SPA. When no `href` is given the block\n * renders its children unwrapped, so this is fully opt-in and backward compatible.\n */\nexport type BlockLinkComponent = ComponentType<{\n href: string\n className?: string\n children: ReactNode\n}>\n\nexport interface BlockLinkProps {\n href?: string\n linkComponent?: BlockLinkComponent\n className?: string\n children: ReactNode\n}\n\nexport function BlockLink({ href, linkComponent: Link, className, children }: BlockLinkProps) {\n if (!href) return <>{children}</>\n if (Link) {\n return (\n <Link href={href} className={className}>\n {children}\n </Link>\n )\n }\n return (\n <a href={href} className={className}>\n {children}\n </a>\n )\n}\n","import type { LucideIcon } from 'lucide-react'\nimport { Card, cn } from '@arbidocs/react/ui'\nimport { BlockLink, type BlockLinkComponent } from './blockLink'\n\nexport interface FeatureItem {\n icon?: LucideIcon\n title: string\n description?: string\n /** When set, the card becomes a link to this destination. */\n href?: string\n}\n\nexport interface FeatureGridProps {\n columns?: '2' | '3'\n items: FeatureItem[]\n /** Inject a router link (adapted to `href`) so linked cards navigate in-SPA. */\n linkComponent?: BlockLinkComponent\n testId?: string\n}\n\nconst COLS: Record<'2' | '3', string> = {\n '2': 'sm:grid-cols-2',\n '3': 'sm:grid-cols-2 lg:grid-cols-3',\n}\n\n/** Responsive grid of icon + title + description feature cards. */\nexport function FeatureGrid({ columns = '3', items, linkComponent, testId }: FeatureGridProps) {\n return (\n <div className={cn('grid gap-5', COLS[columns] ?? COLS['3'])} data-testid={testId}>\n {(items ?? []).map((item, i) => {\n const Icon = item.icon\n return (\n <BlockLink\n key={i}\n href={item.href}\n linkComponent={linkComponent}\n className={cn('block h-full', item.href && 'group')}\n >\n <Card\n variant=\"outline\"\n className={cn(\n 'h-full p-6',\n item.href && 'transition-colors group-hover:border-primary/40'\n )}\n data-testid={testId && `${testId}-item-${i}`}\n >\n {Icon && (\n <span className=\"mb-4 inline-flex size-10 items-center justify-center rounded-lg bg-primary/10 text-primary\">\n <Icon className=\"size-5\" />\n </span>\n )}\n <h3 className=\"text-lg font-semibold tracking-tight\">{item.title}</h3>\n {item.description && (\n <p className=\"mt-2 text-sm leading-relaxed text-muted-foreground\">\n {item.description}\n </p>\n )}\n </Card>\n </BlockLink>\n )\n })}\n </div>\n )\n}\n","import { Quote } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage, Card } from '@arbidocs/react/ui'\nimport { initials } from '../lib/format'\n\nexport interface TestimonialProps {\n quote: string\n author?: string\n role?: string\n avatarUrl?: string\n testId?: string\n}\n\n/** A single pull-quote testimonial with an author and optional avatar. */\nexport function Testimonial({ quote, author, role, avatarUrl, testId }: TestimonialProps) {\n return (\n <Card variant=\"outline\" className=\"mx-auto max-w-3xl p-8 text-center\" data-testid={testId}>\n <Quote className=\"mx-auto size-8 text-primary/40\" aria-hidden />\n <blockquote className=\"mt-4 text-xl font-medium leading-relaxed text-balance\">\n {quote}\n </blockquote>\n {(author || avatarUrl) && (\n <div className=\"mt-6 flex items-center justify-center gap-3\">\n {(avatarUrl || author) && (\n <Avatar>\n {avatarUrl && <AvatarImage src={avatarUrl} alt={author ?? ''} />}\n <AvatarFallback>{initials(author || '?')}</AvatarFallback>\n </Avatar>\n )}\n <div className=\"text-left\">\n {author && <p className=\"text-sm font-semibold\">{author}</p>}\n {role && <p className=\"text-sm text-muted-foreground\">{role}</p>}\n </div>\n </div>\n )}\n </Card>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { ArrowRight } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\n\nexport type CTABannerTone = 'default' | 'muted' | 'ink'\n\nexport interface CTABannerProps {\n title: string\n subtitle?: string\n cta?: { label?: string; href?: string }\n tone?: CTABannerTone\n /** Full-bleed background image URL/data-URI. Overrides the tone surface. */\n backgroundImage?: string\n /** Darkening scrim over the background image. Default true. */\n overlay?: boolean\n testId?: string\n}\n\nconst TONE_SURFACE: Record<CTABannerTone, string> = {\n default: 'bg-primary text-primary-foreground',\n muted: 'bg-muted text-foreground',\n ink: 'bg-foreground text-background',\n}\n\n/** Full-width call-to-action banner. */\nexport function CTABanner({\n title,\n subtitle,\n cta,\n tone = 'default',\n backgroundImage,\n overlay = true,\n testId,\n}: CTABannerProps) {\n const onImage = Boolean(backgroundImage)\n const subtle = onImage\n ? 'text-white/80'\n : tone === 'default'\n ? 'text-primary-foreground/80'\n : tone === 'ink'\n ? 'text-background/70'\n : 'text-muted-foreground'\n const bgStyle: CSSProperties | undefined = backgroundImage\n ? {\n backgroundImage: `url(\"${backgroundImage}\")`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }\n : undefined\n return (\n <div\n className={cn(\n 'relative isolate overflow-hidden rounded-2xl px-8 py-14 text-center',\n onImage ? 'text-white' : (TONE_SURFACE[tone] ?? TONE_SURFACE.default)\n )}\n style={bgStyle}\n data-testid={testId}\n >\n {onImage && overlay && <div className=\"absolute inset-0 bg-black/55\" aria-hidden />}\n <div className=\"relative\">\n <h2 className=\"text-3xl font-semibold tracking-tight text-balance sm:text-4xl\">{title}</h2>\n {subtitle && <p className={cn('mx-auto mt-4 max-w-2xl text-lg', subtle)}>{subtitle}</p>}\n {cta?.label && (\n <div className=\"mt-8\">\n <Button\n asChild\n size=\"lg\"\n variant={tone === 'default' && !onImage ? 'secondary' : 'default'}\n >\n <a href={cta.href || '#'}>\n {cta.label}\n <ArrowRight className=\"size-4\" />\n </a>\n </Button>\n </div>\n )}\n </div>\n </div>\n )\n}\n","export interface LogoItem {\n label: string\n}\n\nexport interface LogoCloudProps {\n items: LogoItem[]\n testId?: string\n}\n\n/**\n * Text-based \"logo\" wall — brand names rendered as muted pill marks. Self-contained\n * (no external images) so the palette looks complete offline.\n */\nexport function LogoCloud({ items, testId }: LogoCloudProps) {\n return (\n <div className=\"flex flex-wrap items-center justify-center gap-4\" data-testid={testId}>\n {(items ?? []).map((item, i) => (\n <span\n key={i}\n className=\"rounded-md border border-border bg-muted px-5 py-2.5 text-sm font-semibold uppercase tracking-wide text-muted-foreground\"\n data-testid={testId && `${testId}-item-${i}`}\n >\n {item.label}\n </span>\n ))}\n </div>\n )\n}\n","import { ChevronDown } from 'lucide-react'\n\nexport interface FaqItem {\n question: string\n answer?: string\n}\n\nexport interface FAQProps {\n items: FaqItem[]\n testId?: string\n}\n\n/**\n * Accessible disclosure list. Built on native `<details>`/`<summary>` so it works\n * without client state (correct in the Puck preview and static renders) and stays\n * keyboard-accessible. Token-only styling.\n */\nexport function FAQ({ items, testId }: FAQProps) {\n return (\n <div className=\"mx-auto max-w-3xl divide-y divide-border\" data-testid={testId}>\n {(items ?? []).map((item, i) => (\n <details key={i} className=\"group py-4\" data-testid={testId && `${testId}-item-${i}`}>\n <summary className=\"flex cursor-pointer list-none items-center justify-between gap-4 text-left text-base font-medium\">\n {item.question}\n <ChevronDown className=\"size-4 shrink-0 text-muted-foreground transition-transform group-open:rotate-180\" />\n </summary>\n {item.answer && (\n <p className=\"mt-3 text-sm leading-relaxed text-muted-foreground\">{item.answer}</p>\n )}\n </details>\n ))}\n </div>\n )\n}\n","import { AiMarkdown } from '@arbidocs/react/ui'\n\nexport interface RichTextBlockProps {\n content: string\n testId?: string\n}\n\n/**\n * Prose block. Reuses the shared markdown renderer (`AiMarkdown`) so long-form copy\n * gets the one house style for headings, lists, tables and emphasis — token-clean\n * and themeable per firm.\n */\nexport function RichTextBlock({ content, testId }: RichTextBlockProps) {\n return (\n <div className=\"mx-auto max-w-3xl\" data-testid={testId}>\n <AiMarkdown>{content ?? ''}</AiMarkdown>\n </div>\n )\n}\n","import type { LucideIcon } from 'lucide-react'\nimport { AlertTriangle, CheckCircle2, Info, XCircle } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport type CalloutVariant = 'info' | 'success' | 'warning' | 'danger'\n\nexport interface CalloutProps {\n variant?: CalloutVariant\n title?: string\n body?: string\n testId?: string\n}\n\nconst STYLES: Record<CalloutVariant, { wrap: string; icon: string; Icon: LucideIcon }> = {\n info: { wrap: 'border-primary/30 bg-primary/5', icon: 'text-primary', Icon: Info },\n success: { wrap: 'border-success/30 bg-success/10', icon: 'text-success', Icon: CheckCircle2 },\n warning: { wrap: 'border-warning/40 bg-warning/10', icon: 'text-warning', Icon: AlertTriangle },\n danger: {\n wrap: 'border-destructive/30 bg-destructive/10',\n icon: 'text-destructive',\n Icon: XCircle,\n },\n}\n\n/** Inline notice box in one of four semantic tones. */\nexport function Callout({ variant = 'info', title, body, testId }: CalloutProps) {\n const style = STYLES[variant] ?? STYLES.info\n const Icon = style.Icon\n return (\n <div\n className={cn('flex gap-3 rounded-lg border p-4 text-foreground', style.wrap)}\n data-testid={testId}\n role=\"note\"\n >\n <Icon className={cn('mt-0.5 size-5 shrink-0', style.icon)} aria-hidden />\n <div className=\"min-w-0\">\n {title && <p className=\"font-semibold\">{title}</p>}\n {body && <p className=\"text-sm leading-relaxed text-muted-foreground\">{body}</p>}\n </div>\n </div>\n )\n}\n","import { Avatar, AvatarFallback, AvatarImage, cn } from '@arbidocs/react/ui'\nimport { initials } from '../lib/format'\n\nexport type AvatarBlockSize = 'sm' | 'md' | 'lg' | 'xl'\n\nexport interface AvatarBlockProps {\n src?: string\n name?: string\n size?: AvatarBlockSize\n testId?: string\n}\n\nconst SIZE: Record<AvatarBlockSize, string> = {\n sm: 'size-8 text-xs',\n md: 'size-10 text-sm',\n lg: 'size-14 text-base',\n xl: 'size-20 text-xl',\n}\n\n/** Avatar with an initials fallback when no image is supplied. */\nexport function AvatarBlock({ src, name = '', size = 'md', testId }: AvatarBlockProps) {\n return (\n <Avatar className={cn(SIZE[size] ?? SIZE.md)} data-testid={testId}>\n {src && <AvatarImage src={src} alt={name} />}\n <AvatarFallback className=\"font-semibold\">{initials(name || '?')}</AvatarFallback>\n </Avatar>\n )\n}\n","import { Button } from '@arbidocs/react/ui'\n\nexport interface NavLink {\n label: string\n href?: string\n}\n\nexport interface NavbarProps {\n brand: string\n links: NavLink[]\n cta?: { label?: string; href?: string }\n testId?: string\n}\n\n/** Marketing top navigation: brand, inline links and an optional CTA button. */\nexport function Navbar({ brand, links, cta, testId }: NavbarProps) {\n return (\n <header className=\"border-b border-border bg-background\" data-testid={testId}>\n <nav className=\"mx-auto flex max-w-7xl items-center justify-between gap-6 px-5 py-4 lg:px-8\">\n <span className=\"text-lg font-semibold tracking-tight\">{brand}</span>\n <div className=\"hidden items-center gap-6 md:flex\">\n {(links ?? []).map((link, i) => (\n <a\n key={i}\n href={link.href || '#'}\n className=\"text-sm font-medium text-muted-foreground transition-colors hover:text-foreground\"\n data-testid={testId && `${testId}-link-${i}`}\n >\n {link.label}\n </a>\n ))}\n </div>\n {cta?.label && (\n <Button asChild size=\"sm\">\n <a href={cta.href || '#'}>{cta.label}</a>\n </Button>\n )}\n </nav>\n </header>\n )\n}\n","export interface FooterLink {\n label: string\n href?: string\n}\n\nexport interface FooterColumn {\n heading: string\n links: FooterLink[]\n}\n\nexport interface FooterProps {\n columns: FooterColumn[]\n copyright?: string\n testId?: string\n}\n\n/** Site footer: a row of link columns plus a copyright line. */\nexport function Footer({ columns, copyright, testId }: FooterProps) {\n return (\n <footer className=\"border-t border-border bg-muted text-foreground\" data-testid={testId}>\n <div className=\"mx-auto max-w-7xl px-5 py-14 lg:px-8\">\n <div className=\"grid gap-8 sm:grid-cols-2 lg:grid-cols-4\">\n {(columns ?? []).map((col, i) => (\n <div key={i} data-testid={testId && `${testId}-col-${i}`}>\n <h3 className=\"text-sm font-semibold tracking-tight\">{col.heading}</h3>\n <ul className=\"mt-4 space-y-2\">\n {(col.links ?? []).map((link, j) => (\n <li key={j}>\n <a\n href={link.href || '#'}\n className=\"text-sm text-muted-foreground transition-colors hover:text-foreground\"\n >\n {link.label}\n </a>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n {copyright && (\n <p className=\"mt-12 border-t border-border pt-6 text-sm text-muted-foreground\">\n {copyright}\n </p>\n )}\n </div>\n </footer>\n )\n}\n","import { cn } from '@arbidocs/react/ui'\n\nexport interface ListItem {\n text: string\n}\n\nexport interface ListBlockProps {\n ordered?: boolean\n items: ListItem[]\n testId?: string\n}\n\n/** Ordered or unordered prose list. Token-clean. */\nexport function ListBlock({ ordered = false, items, testId }: ListBlockProps) {\n const list = items ?? []\n const className = cn(\n 'mx-auto max-w-3xl space-y-2 pl-5 text-foreground',\n ordered ? 'list-decimal' : 'list-disc'\n )\n const content = list.map((item, i) => (\n <li key={i} className=\"leading-relaxed marker:text-muted-foreground\">\n {item.text}\n </li>\n ))\n return ordered ? (\n <ol className={className} data-testid={testId}>\n {content}\n </ol>\n ) : (\n <ul className={className} data-testid={testId}>\n {content}\n </ul>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport type ColumnsCount = 2 | 3 | 4\nexport type ColumnsGap = 'sm' | 'md' | 'lg'\n\nexport interface ColumnsProps {\n count?: ColumnsCount\n gap?: ColumnsGap\n columns: ReactNode[]\n testId?: string\n}\n\nconst GRID: Record<ColumnsCount, string> = {\n 2: 'sm:grid-cols-2',\n 3: 'sm:grid-cols-2 lg:grid-cols-3',\n 4: 'sm:grid-cols-2 lg:grid-cols-4',\n}\n\nconst GAP: Record<ColumnsGap, string> = {\n sm: 'gap-3',\n md: 'gap-6',\n lg: 'gap-10',\n}\n\n/** Responsive N-column row. Each column hosts a nested Puck slot. */\nexport function Columns({ count = 3, gap = 'md', columns, testId }: ColumnsProps) {\n return (\n <div\n className={cn('grid grid-cols-1', GRID[count] ?? GRID[3], GAP[gap] ?? GAP.md)}\n data-testid={testId}\n >\n {columns.map((col, i) => (\n <div key={i} data-testid={testId && `${testId}-col-${i}`}>\n {col}\n </div>\n ))}\n </div>\n )\n}\n","import { cn } from '@arbidocs/react/ui'\n\nexport type SpacerSize = 'sm' | 'md' | 'lg' | 'xl'\n\nexport interface SpacerProps {\n size?: SpacerSize\n testId?: string\n}\n\nconst SIZE: Record<SpacerSize, string> = {\n sm: 'h-4',\n md: 'h-8',\n lg: 'h-16',\n xl: 'h-24',\n}\n\n/** Vertical whitespace. */\nexport function Spacer({ size = 'md', testId }: SpacerProps) {\n return <div className={cn('w-full', SIZE[size] ?? SIZE.md)} data-testid={testId} aria-hidden />\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport type ContainerWidth = 'narrow' | 'default' | 'wide' | 'full'\nexport type ContainerPadding = 'none' | 'sm' | 'md' | 'lg'\n\nexport interface ContainerProps {\n width?: ContainerWidth\n padding?: ContainerPadding\n children: ReactNode\n testId?: string\n}\n\nconst WIDTH: Record<ContainerWidth, string> = {\n narrow: 'max-w-3xl',\n default: 'max-w-5xl',\n wide: 'max-w-7xl',\n full: 'max-w-none',\n}\n\nconst PADDING: Record<ContainerPadding, string> = {\n none: 'px-0 py-0',\n sm: 'px-4 py-6',\n md: 'px-5 py-12 lg:px-8',\n lg: 'px-5 py-20 lg:px-8',\n}\n\n/** Max-width wrapper that centres and pads a nested Puck slot. */\nexport function Container({ width = 'default', padding = 'md', children, testId }: ContainerProps) {\n return (\n <div\n className={cn(\n 'mx-auto w-full',\n WIDTH[width] ?? WIDTH.default,\n PADDING[padding] ?? PADDING.md\n )}\n data-testid={testId}\n >\n {children}\n </div>\n )\n}\n","import { Check } from 'lucide-react'\nimport { Button, Card, cn } from '@arbidocs/react/ui'\n\nexport interface PricingPlan {\n name: string\n price: string\n period?: string\n description?: string\n features?: string[]\n cta?: { label?: string; href?: string }\n /** Highlight this plan as the recommended one. */\n featured?: boolean\n}\n\nexport interface PricingTableProps {\n plans: PricingPlan[]\n testId?: string\n}\n\n/** A row of pricing plan cards with feature lists and a CTA per plan. */\nexport function PricingTable({ plans, testId }: PricingTableProps) {\n return (\n <div\n className={cn('grid gap-6', (plans?.length ?? 0) >= 3 ? 'md:grid-cols-3' : 'sm:grid-cols-2')}\n data-testid={testId}\n >\n {(plans ?? []).map((plan, i) => (\n <Card\n key={i}\n variant={plan.featured ? 'elevated' : 'outline'}\n className={cn('flex h-full flex-col p-6', plan.featured && 'ring-2 ring-primary')}\n data-testid={testId && `${testId}-item-${i}`}\n >\n <h3 className=\"text-lg font-semibold tracking-tight\">{plan.name}</h3>\n <div className=\"mt-3 flex items-baseline gap-1\">\n <span className=\"text-3xl font-semibold tracking-tight\">{plan.price}</span>\n {plan.period && <span className=\"text-sm text-muted-foreground\">/{plan.period}</span>}\n </div>\n {plan.description && (\n <p className=\"mt-2 text-sm leading-relaxed text-muted-foreground\">{plan.description}</p>\n )}\n {plan.features && plan.features.length > 0 && (\n <ul className=\"mt-5 flex-1 space-y-2\">\n {plan.features.map((f, j) => (\n <li key={j} className=\"flex items-start gap-2 text-sm\">\n <Check className=\"mt-0.5 size-4 shrink-0 text-primary\" />\n <span>{f}</span>\n </li>\n ))}\n </ul>\n )}\n {plan.cta?.label && (\n <Button asChild className=\"mt-6 w-full\" variant={plan.featured ? 'default' : 'outline'}>\n <a href={plan.cta.href || '#'}>{plan.cta.label}</a>\n </Button>\n )}\n </Card>\n ))}\n </div>\n )\n}\n","import { useState } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface TabItem {\n label: string\n content: string\n}\n\nexport interface TabsProps {\n items: TabItem[]\n testId?: string\n}\n\n/** A simple tabbed panel: a row of tab buttons over the active tab's content. */\nexport function Tabs({ items, testId }: TabsProps) {\n const [active, setActive] = useState(0)\n const list = items ?? []\n const current = list[Math.min(active, Math.max(list.length - 1, 0))]\n return (\n <div data-testid={testId}>\n <div className=\"flex flex-wrap gap-1 border-b border-border\" role=\"tablist\">\n {list.map((t, i) => {\n const selected = i === active\n return (\n <button\n key={i}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n onClick={() => setActive(i)}\n className={cn(\n '-mb-px border-b-2 px-4 py-2 text-sm font-medium transition-colors',\n selected\n ? 'border-primary text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n )}\n data-testid={testId && `${testId}-tab-${i}`}\n >\n {t.label}\n </button>\n )\n })}\n </div>\n {current && (\n <div\n role=\"tabpanel\"\n className=\"pt-5 text-sm leading-relaxed text-muted-foreground\"\n data-testid={testId && `${testId}-panel`}\n >\n {current.content}\n </div>\n )}\n </div>\n )\n}\n","import { useState } from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface AccordionItem {\n title: string\n content: string\n}\n\nexport interface AccordionProps {\n items: AccordionItem[]\n /** Allow multiple panels open at once. Default false (single-open). */\n allowMultiple?: boolean\n testId?: string\n}\n\n/** A stack of collapsible title/content panels. */\nexport function Accordion({ items, allowMultiple = false, testId }: AccordionProps) {\n const [open, setOpen] = useState<number[]>([])\n const toggle = (i: number) =>\n setOpen((prev) =>\n prev.includes(i) ? prev.filter((n) => n !== i) : allowMultiple ? [...prev, i] : [i]\n )\n return (\n <div className=\"divide-y divide-border border-y border-border\" data-testid={testId}>\n {(items ?? []).map((item, i) => {\n const isOpen = open.includes(i)\n return (\n <div key={i} data-testid={testId && `${testId}-item-${i}`}>\n <button\n type=\"button\"\n aria-expanded={isOpen}\n onClick={() => toggle(i)}\n className=\"flex w-full items-center justify-between gap-4 py-4 text-left text-base font-medium\"\n data-testid={testId && `${testId}-trigger-${i}`}\n >\n {item.title}\n <ChevronDown\n className={cn('size-4 shrink-0 transition-transform', isOpen && 'rotate-180')}\n />\n </button>\n {isOpen && (\n <p\n className=\"pb-4 text-sm leading-relaxed text-muted-foreground\"\n data-testid={testId && `${testId}-content-${i}`}\n >\n {item.content}\n </p>\n )}\n </div>\n )\n })}\n </div>\n )\n}\n","import { cn } from '@arbidocs/react/ui'\nimport { BlockImage, type BlockImageProps } from './BlockImage'\n\nexport interface GalleryImage {\n src?: string\n alt?: string\n caption?: string\n}\n\nexport interface GalleryProps {\n images: GalleryImage[]\n columns?: '2' | '3' | '4'\n aspect?: BlockImageProps['aspect']\n rounded?: BlockImageProps['rounded']\n testId?: string\n}\n\nconst COLS: Record<'2' | '3' | '4', string> = {\n '2': 'grid-cols-2',\n '3': 'grid-cols-2 sm:grid-cols-3',\n '4': 'grid-cols-2 sm:grid-cols-4',\n}\n\n/** A responsive image grid. Each tile previews via BlockImage with a caption. */\nexport function Gallery({\n images,\n columns = '3',\n aspect = '1:1',\n rounded = 'lg',\n testId,\n}: GalleryProps) {\n return (\n <div className={cn('grid gap-4', COLS[columns] ?? COLS['3'])} data-testid={testId}>\n {(images ?? []).map((img, i) => (\n <figure key={i} data-testid={testId && `${testId}-item-${i}`}>\n <BlockImage\n src={img.src}\n alt={img.alt}\n aspect={aspect}\n rounded={rounded}\n testId={testId && `${testId}-item-${i}-image`}\n />\n {img.caption && (\n <figcaption className=\"mt-1.5 text-xs text-muted-foreground\">{img.caption}</figcaption>\n )}\n </figure>\n ))}\n </div>\n )\n}\n","import { cn } from '@arbidocs/react/ui'\n\nexport type VideoAspect = '16:9' | '4:3' | '1:1'\n\nexport interface VideoEmbedProps {\n /** A YouTube / Vimeo / Loom page URL, or a direct video file URL. */\n url: string\n title?: string\n aspect?: VideoAspect\n rounded?: boolean\n testId?: string\n}\n\nconst ASPECT: Record<VideoAspect, string> = {\n '16:9': 'aspect-video',\n '4:3': 'aspect-[4/3]',\n '1:1': 'aspect-square',\n}\n\n/**\n * Resolve a shareable video URL to an embeddable iframe src. Supports YouTube,\n * Vimeo and Loom; returns null for anything else (rendered as a `<video>`).\n */\nexport function toEmbedUrl(url: string): string | null {\n if (!url) return null\n const yt = url.match(/(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/|youtube\\.com\\/embed\\/)([\\w-]{11})/)\n if (yt) return `https://www.youtube.com/embed/${yt[1]}`\n const vimeo = url.match(/vimeo\\.com\\/(?:video\\/)?(\\d+)/)\n if (vimeo) return `https://player.vimeo.com/video/${vimeo[1]}`\n const loom = url.match(/loom\\.com\\/(?:share|embed)\\/([\\w-]+)/)\n if (loom) return `https://www.loom.com/embed/${loom[1]}`\n return null\n}\n\n/** Embed a video from a YouTube/Vimeo/Loom link or a direct file, in a set aspect. */\nexport function VideoEmbed({\n url,\n title,\n aspect = '16:9',\n rounded = true,\n testId,\n}: VideoEmbedProps) {\n const embed = toEmbedUrl(url)\n const frame = cn(\n 'w-full overflow-hidden border border-border bg-muted',\n ASPECT[aspect] ?? ASPECT['16:9'],\n rounded && 'rounded-lg'\n )\n return (\n <div className={frame} data-testid={testId}>\n {embed ? (\n <iframe\n src={embed}\n title={title || 'Embedded video'}\n className=\"size-full\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n data-testid={testId && `${testId}-iframe`}\n />\n ) : url ? (\n <video src={url} controls className=\"size-full\" data-testid={testId && `${testId}-video`} />\n ) : null}\n </div>\n )\n}\n","import { useState, type FormEvent } from 'react'\nimport { Button, cn } from '@arbidocs/react/ui'\n\nexport interface ContactField {\n name: string\n label: string\n type?: 'text' | 'email' | 'tel' | 'textarea'\n required?: boolean\n}\n\nexport interface ContactFormProps {\n fields: ContactField[]\n submitLabel?: string\n /** Optional POST endpoint. When set, the form submits natively to it. */\n action?: string\n /** Message shown after a client-side (no-action) submit. */\n successMessage?: string\n testId?: string\n}\n\n/** A configurable lead/contact form. Posts to `action`, or confirms client-side. */\nexport function ContactForm({\n fields,\n submitLabel = 'Send',\n action,\n successMessage = 'Thanks — we’ll be in touch shortly.',\n testId,\n}: ContactFormProps) {\n const [sent, setSent] = useState(false)\n const list = fields ?? []\n\n const onSubmit = (e: FormEvent<HTMLFormElement>) => {\n // With an action we let the browser POST natively; otherwise confirm inline.\n if (!action) {\n e.preventDefault()\n setSent(true)\n }\n }\n\n if (sent) {\n return (\n <p\n className=\"rounded-lg border border-border bg-muted p-6 text-center text-sm text-foreground\"\n role=\"status\"\n data-testid={testId && `${testId}-success`}\n >\n {successMessage}\n </p>\n )\n }\n\n return (\n <form\n action={action}\n method={action ? 'post' : undefined}\n onSubmit={onSubmit}\n className=\"mx-auto flex max-w-xl flex-col gap-4\"\n data-testid={testId}\n >\n {list.map((f, i) => {\n const inputClass =\n 'w-full rounded-md border border-border bg-card px-3 py-2 text-sm text-foreground outline-none focus:border-primary'\n return (\n <label key={i} className=\"flex flex-col gap-1.5 text-left\">\n <span className=\"text-sm font-medium\">{f.label}</span>\n {f.type === 'textarea' ? (\n <textarea\n name={f.name}\n required={f.required}\n rows={4}\n className={inputClass}\n data-testid={testId && `${testId}-field-${f.name}`}\n />\n ) : (\n <input\n name={f.name}\n type={f.type || 'text'}\n required={f.required}\n className={inputClass}\n data-testid={testId && `${testId}-field-${f.name}`}\n />\n )}\n </label>\n )\n })}\n <Button\n type=\"submit\"\n className={cn('mt-1 self-start')}\n data-testid={testId && `${testId}-submit`}\n >\n {submitLabel}\n </Button>\n </form>\n )\n}\n","import { ArrowRight } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport type BannerTone = 'primary' | 'muted' | 'ink'\n\nexport interface BannerProps {\n text: string\n cta?: { label?: string; href?: string }\n tone?: BannerTone\n testId?: string\n}\n\nconst TONE: Record<BannerTone, string> = {\n primary: 'bg-primary text-primary-foreground',\n muted: 'bg-muted text-foreground',\n ink: 'bg-foreground text-background',\n}\n\n/** A slim full-width announcement strip with optional inline CTA. */\nexport function Banner({ text, cta, tone = 'primary', testId }: BannerProps) {\n return (\n <div\n className={cn('w-full px-5 py-2.5 text-center text-sm', TONE[tone] ?? TONE.primary)}\n data-testid={testId}\n >\n <span className=\"font-medium\">{text}</span>\n {cta?.label && (\n <a\n href={cta.href || '#'}\n className=\"ml-2 inline-flex items-center gap-1 font-semibold underline underline-offset-4\"\n data-testid={testId && `${testId}-cta`}\n >\n {cta.label}\n <ArrowRight className=\"size-3.5\" />\n </a>\n )}\n </div>\n )\n}\n","import { ArrowRight } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { BlockImage } from './BlockImage'\n\nexport interface MediaTextProps {\n eyebrow?: string\n title: string\n body?: string\n imageUrl?: string\n /** Which side the media sits on (desktop). */\n mediaSide?: 'left' | 'right'\n cta?: { label?: string; href?: string }\n testId?: string\n}\n\n/** A split media-and-copy row: an image on one side, prose + CTA on the other. */\nexport function MediaText({\n eyebrow,\n title,\n body,\n imageUrl,\n mediaSide = 'left',\n cta,\n testId,\n}: MediaTextProps) {\n const media = (\n <BlockImage src={imageUrl} aspect=\"4:3\" rounded=\"lg\" testId={testId && `${testId}-image`} />\n )\n const copy = (\n <div>\n {eyebrow && (\n <p className=\"mb-3 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {eyebrow}\n </p>\n )}\n <h2 className=\"text-3xl font-semibold tracking-tight text-balance\">{title}</h2>\n {body && <p className=\"mt-4 text-lg leading-relaxed text-muted-foreground\">{body}</p>}\n {cta?.label && (\n <Button asChild className=\"mt-6\">\n <a href={cta.href || '#'}>\n {cta.label}\n <ArrowRight className=\"size-4\" />\n </a>\n </Button>\n )}\n </div>\n )\n return (\n <div className=\"grid items-center gap-10 lg:grid-cols-2\" data-testid={testId}>\n {mediaSide === 'right' ? (\n <>\n {copy}\n {media}\n </>\n ) : (\n <>\n {media}\n {copy}\n </>\n )}\n </div>\n )\n}\n","import { Avatar, AvatarFallback, AvatarImage, Card, cn } from '@arbidocs/react/ui'\nimport { initials } from '../lib/format'\nimport { BlockLink, type BlockLinkComponent } from './blockLink'\n\nexport interface TeamMember {\n name: string\n role?: string\n bio?: string\n avatarUrl?: string\n /** When set, the card becomes a link to this person's detail page. */\n href?: string\n}\n\nexport interface TeamGridProps {\n members: TeamMember[]\n columns?: '2' | '3' | '4'\n /** Inject a router link (adapted to `href`) so linked cards navigate in-SPA. */\n linkComponent?: BlockLinkComponent\n testId?: string\n}\n\nconst COLS: Record<'2' | '3' | '4', string> = {\n '2': 'sm:grid-cols-2',\n '3': 'sm:grid-cols-2 lg:grid-cols-3',\n '4': 'sm:grid-cols-2 lg:grid-cols-4',\n}\n\n/** A grid of people cards: avatar, name, role and an optional short bio. */\nexport function TeamGrid({ members, columns = '3', linkComponent, testId }: TeamGridProps) {\n return (\n <div className={cn('grid gap-6', COLS[columns] ?? COLS['3'])} data-testid={testId}>\n {(members ?? []).map((m, i) => (\n <BlockLink\n key={i}\n href={m.href}\n linkComponent={linkComponent}\n className={cn('block h-full', m.href && 'group')}\n >\n <Card\n variant=\"outline\"\n className={cn(\n 'flex h-full flex-col items-center p-6 text-center',\n m.href && 'transition-colors group-hover:border-primary/40'\n )}\n data-testid={testId && `${testId}-item-${i}`}\n >\n <Avatar className=\"size-20\">\n {m.avatarUrl && <AvatarImage src={m.avatarUrl} alt={m.name} />}\n <AvatarFallback>{initials(m.name || '?')}</AvatarFallback>\n </Avatar>\n <h3 className=\"mt-4 text-base font-semibold tracking-tight\">{m.name}</h3>\n {m.role && <p className=\"text-sm text-primary\">{m.role}</p>}\n {m.bio && <p className=\"mt-2 text-sm leading-relaxed text-muted-foreground\">{m.bio}</p>}\n </Card>\n </BlockLink>\n ))}\n </div>\n )\n}\n","import { cn } from '@arbidocs/react/ui'\n\nexport interface StepItem {\n title: string\n description?: string\n}\n\nexport interface StepsProps {\n steps: StepItem[]\n /** `timeline` draws a connected vertical rail; `numbered` is a horizontal grid. */\n variant?: 'numbered' | 'timeline'\n testId?: string\n}\n\n/** A process / how-it-works sequence, as numbered cards or a vertical timeline. */\nexport function Steps({ steps, variant = 'numbered', testId }: StepsProps) {\n const list = steps ?? []\n if (variant === 'timeline') {\n return (\n <ol className=\"relative ml-3 border-l border-border\" data-testid={testId}>\n {list.map((s, i) => (\n <li key={i} className=\"mb-8 ml-6 last:mb-0\" data-testid={testId && `${testId}-item-${i}`}>\n <span className=\"absolute -left-3 flex size-6 items-center justify-center rounded-full bg-primary text-xs font-semibold text-primary-foreground\">\n {i + 1}\n </span>\n <h3 className=\"text-base font-semibold tracking-tight\">{s.title}</h3>\n {s.description && (\n <p className=\"mt-1 text-sm leading-relaxed text-muted-foreground\">{s.description}</p>\n )}\n </li>\n ))}\n </ol>\n )\n }\n return (\n <div\n className={cn('grid gap-6', list.length >= 4 ? 'md:grid-cols-4' : 'sm:grid-cols-3')}\n data-testid={testId}\n >\n {list.map((s, i) => (\n <div key={i} data-testid={testId && `${testId}-item-${i}`}>\n <span className=\"flex size-9 items-center justify-center rounded-full bg-primary/10 text-sm font-semibold text-primary\">\n {i + 1}\n </span>\n <h3 className=\"mt-4 text-base font-semibold tracking-tight\">{s.title}</h3>\n {s.description && (\n <p className=\"mt-2 text-sm leading-relaxed text-muted-foreground\">{s.description}</p>\n )}\n </div>\n ))}\n </div>\n )\n}\n","import { Quote } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage, Card, cn } from '@arbidocs/react/ui'\nimport { initials } from '../lib/format'\n\nexport interface TestimonialItem {\n quote: string\n author?: string\n role?: string\n avatarUrl?: string\n}\n\nexport interface TestimonialGridProps {\n items: TestimonialItem[]\n columns?: '2' | '3'\n testId?: string\n}\n\nconst COLS: Record<'2' | '3', string> = {\n '2': 'sm:grid-cols-2',\n '3': 'sm:grid-cols-2 lg:grid-cols-3',\n}\n\n/** A grid of multiple pull-quote testimonials. */\nexport function TestimonialGrid({ items, columns = '3', testId }: TestimonialGridProps) {\n return (\n <div className={cn('grid gap-6', COLS[columns] ?? COLS['3'])} data-testid={testId}>\n {(items ?? []).map((t, i) => (\n <Card\n key={i}\n variant=\"outline\"\n className=\"flex h-full flex-col p-6\"\n data-testid={testId && `${testId}-item-${i}`}\n >\n <Quote className=\"size-6 text-primary/40\" aria-hidden />\n <blockquote className=\"mt-3 flex-1 text-base leading-relaxed\">{t.quote}</blockquote>\n {(t.author || t.avatarUrl) && (\n <div className=\"mt-5 flex items-center gap-3\">\n <Avatar className=\"size-9\">\n {t.avatarUrl && <AvatarImage src={t.avatarUrl} alt={t.author ?? ''} />}\n <AvatarFallback>{initials(t.author || '?')}</AvatarFallback>\n </Avatar>\n <div>\n {t.author && <p className=\"text-sm font-semibold\">{t.author}</p>}\n {t.role && <p className=\"text-xs text-muted-foreground\">{t.role}</p>}\n </div>\n </div>\n )}\n </Card>\n ))}\n </div>\n )\n}\n"]}
|