@arbidocs/blocks 0.4.31 → 0.4.33
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/agents/index.cjs +256 -214
- package/dist/agents/index.js +7 -5
- package/dist/agents/tasks/ConversationListView.d.ts +58 -0
- package/dist/agents/tasks/ConversationTurnSpeaker.d.ts +16 -0
- package/dist/agents/tasks/NewThreadDialog.d.ts +1 -1
- package/dist/agents/tasks/TaskActivityTimeline.d.ts +1 -1
- package/dist/agents/tasks/TaskFlow.d.ts +22 -0
- package/dist/agents/tasks/TaskInbox.d.ts +26 -0
- package/dist/agents/tasks/TaskReviewDialog.d.ts +22 -0
- package/dist/agents/tasks/TaskRowMenu.d.ts +10 -2
- package/dist/agents/tasks/TaskRunsDialog.d.ts +8 -3
- package/dist/agents/tasks/TaskStartDialog.d.ts +24 -0
- package/dist/agents/tasks/TaskTable.d.ts +1 -1
- package/dist/agents/tasks/ThreadNotifyDialog.d.ts +11 -0
- package/dist/agents/tasks/WorkflowComposer.d.ts +1 -1
- package/dist/agents/tasks/WorkflowsTable.d.ts +7 -0
- package/dist/agents/tasks/compact-thread-activity.d.ts +8 -0
- package/dist/agents/tasks/index.d.ts +10 -0
- package/dist/agents/tasks/taskComposerTypes.d.ts +16 -1
- package/dist/agents/tasks/taskRequest.d.ts +1 -0
- package/dist/agents/tasks/testGrid.d.ts +24 -0
- package/dist/agents/tasks/workflowColumns.d.ts +2 -1
- package/dist/agents/tasks/workflowRows.d.ts +6 -0
- package/dist/agents/workflows/types.d.ts +2 -0
- package/dist/auth/index.cjs +27 -27
- package/dist/auth/index.js +1 -1
- package/dist/chat/Message.d.ts +8 -2
- package/dist/chat/index.cjs +132 -120
- package/dist/chat/index.d.ts +2 -0
- package/dist/chat/index.js +2 -2
- package/dist/chat/participant-tints.d.ts +1 -0
- package/dist/chat/useRecipientDraft.d.ts +14 -0
- package/dist/{chunk-KF4EC5XU.js → chunk-24KQJYSB.js} +3 -3
- package/dist/{chunk-KF4EC5XU.js.map → chunk-24KQJYSB.js.map} +1 -1
- package/dist/{chunk-GVQOBJKR.cjs → chunk-2EAE5JP6.cjs} +7 -4
- package/dist/chunk-2EAE5JP6.cjs.map +1 -0
- package/dist/{chunk-S5HZBXZA.cjs → chunk-2QTT2RZE.cjs} +242 -2
- package/dist/chunk-2QTT2RZE.cjs.map +1 -0
- package/dist/chunk-3AFWGEDJ.cjs +53 -0
- package/dist/chunk-3AFWGEDJ.cjs.map +1 -0
- package/dist/{chunk-4XJZ6AAY.js → chunk-4AWS54US.js} +244 -6
- package/dist/chunk-4AWS54US.js.map +1 -0
- package/dist/{chunk-56BUD74K.cjs → chunk-65THHQVB.cjs} +27 -27
- package/dist/{chunk-56BUD74K.cjs.map → chunk-65THHQVB.cjs.map} +1 -1
- package/dist/{chunk-5B4PXAKI.cjs → chunk-6DNYPLCD.cjs} +21 -7
- package/dist/chunk-6DNYPLCD.cjs.map +1 -0
- package/dist/{chunk-Y2LWA4ZO.js → chunk-6RXUMBTK.js} +1855 -501
- package/dist/chunk-6RXUMBTK.js.map +1 -0
- package/dist/{chunk-UTYQPVIW.cjs → chunk-7QDX2CO4.cjs} +6 -6
- package/dist/{chunk-UTYQPVIW.cjs.map → chunk-7QDX2CO4.cjs.map} +1 -1
- package/dist/{chunk-FRRDPYBR.cjs → chunk-AZ75JUIH.cjs} +74 -5
- package/dist/chunk-AZ75JUIH.cjs.map +1 -0
- package/dist/{chunk-NUPVHEJW.js → chunk-BUHKUKKB.js} +7 -4
- package/dist/chunk-BUHKUKKB.js.map +1 -0
- package/dist/chunk-C7FGONCM.js +124 -0
- package/dist/chunk-C7FGONCM.js.map +1 -0
- package/dist/{chunk-KXMDOTGW.js → chunk-DLBUFHLY.js} +10 -2
- package/dist/chunk-DLBUFHLY.js.map +1 -0
- package/dist/{chunk-ZHLMDJCO.cjs → chunk-DLVX6R6B.cjs} +62 -26
- package/dist/chunk-DLVX6R6B.cjs.map +1 -0
- package/dist/{chunk-JGZTRLKL.cjs → chunk-IA7RTPT3.cjs} +7 -4
- package/dist/chunk-IA7RTPT3.cjs.map +1 -0
- package/dist/{chunk-NJL4LIXX.js → chunk-LFGJAZ5H.js} +11 -8
- package/dist/chunk-LFGJAZ5H.js.map +1 -0
- package/dist/{chunk-IAKUTBPX.js → chunk-LYUO3E6V.js} +3 -3
- package/dist/{chunk-IAKUTBPX.js.map → chunk-LYUO3E6V.js.map} +1 -1
- package/dist/{chunk-EYPPB5CY.cjs → chunk-M2YGPC5N.cjs} +4 -4
- package/dist/{chunk-EYPPB5CY.cjs.map → chunk-M2YGPC5N.cjs.map} +1 -1
- package/dist/{chunk-5ZBP7TCD.cjs → chunk-MJCCBMM5.cjs} +10 -2
- package/dist/chunk-MJCCBMM5.cjs.map +1 -0
- package/dist/chunk-MZL67U2E.cjs +128 -0
- package/dist/chunk-MZL67U2E.cjs.map +1 -0
- package/dist/{chunk-OJSWQM4G.js → chunk-OZJ5PXA6.js} +29 -4
- package/dist/chunk-OZJ5PXA6.js.map +1 -0
- package/dist/{chunk-UBNVIIBT.js → chunk-PXFJDX2C.js} +21 -7
- package/dist/chunk-PXFJDX2C.js.map +1 -0
- package/dist/{chunk-RGHQFJOL.cjs → chunk-QFUF4A4J.cjs} +28 -2
- package/dist/chunk-QFUF4A4J.cjs.map +1 -0
- package/dist/chunk-RFXJYIDV.js +50 -0
- package/dist/chunk-RFXJYIDV.js.map +1 -0
- package/dist/{chunk-CQWRVIJC.cjs → chunk-SEQWI6E4.cjs} +1882 -517
- package/dist/chunk-SEQWI6E4.cjs.map +1 -0
- package/dist/{chunk-QN42OA5J.js → chunk-SFXVNFES.js} +4 -4
- package/dist/chunk-SFXVNFES.js.map +1 -0
- package/dist/{chunk-3NZR6PAG.js → chunk-V6U5KVAR.js} +70 -4
- package/dist/chunk-V6U5KVAR.js.map +1 -0
- package/dist/{chunk-YVIOCITQ.cjs → chunk-VUEZARW5.cjs} +3 -3
- package/dist/chunk-VUEZARW5.cjs.map +1 -0
- package/dist/{chunk-JLOYWXRB.js → chunk-VZGBCBYB.js} +3 -3
- package/dist/chunk-VZGBCBYB.js.map +1 -0
- package/dist/{chunk-ZVPTFTGV.cjs → chunk-WBDK4PIA.cjs} +11 -8
- package/dist/chunk-WBDK4PIA.cjs.map +1 -0
- package/dist/{chunk-ZORQ5M3W.cjs → chunk-WQFGG2BV.cjs} +4 -4
- package/dist/chunk-WQFGG2BV.cjs.map +1 -0
- package/dist/{chunk-C75S6USL.js → chunk-WYVCXY7R.js} +7 -4
- package/dist/chunk-WYVCXY7R.js.map +1 -0
- package/dist/{chunk-WSJVHSGN.js → chunk-XWEJ5LV2.js} +63 -27
- package/dist/chunk-XWEJ5LV2.js.map +1 -0
- package/dist/{chunk-YMHGF6R5.js → chunk-ZCF2JJFA.js} +3 -3
- package/dist/{chunk-YMHGF6R5.js.map → chunk-ZCF2JJFA.js.map} +1 -1
- package/dist/collaboration/index.cjs +45 -41
- package/dist/collaboration/index.js +1 -1
- package/dist/collaboration/mail/MailMessagePreview.d.ts +11 -0
- package/dist/collaboration/mail/index.d.ts +1 -0
- package/dist/connect/index.cjs +33 -33
- package/dist/connect/index.js +4 -4
- package/dist/facts/FactsFilterInput.d.ts +2 -46
- package/dist/facts/FactsToolbar.d.ts +5 -5
- package/dist/facts/index.cjs +27 -124
- package/dist/facts/index.cjs.map +1 -1
- package/dist/facts/index.js +13 -118
- package/dist/facts/index.js.map +1 -1
- package/dist/files/FilesPage.d.ts +1 -1
- package/dist/files/FilesToolbar.d.ts +1 -1
- package/dist/files/FolderPicker.d.ts +2 -1
- package/dist/files/ViewerChrome.d.ts +1 -1
- package/dist/files/bulk/FolderFilterButton.d.ts +3 -2
- package/dist/files/cells/BulkLabelSelect.d.ts +11 -0
- package/dist/files/cells/LabelMultiSelect.d.ts +2 -1
- package/dist/files/cells/index.d.ts +1 -0
- package/dist/files/index.cjs +108 -165
- package/dist/files/index.cjs.map +1 -1
- package/dist/files/index.js +94 -157
- package/dist/files/index.js.map +1 -1
- package/dist/home/index.cjs +19 -19
- package/dist/home/index.cjs.map +1 -1
- package/dist/home/index.js +4 -4
- package/dist/home/index.js.map +1 -1
- package/dist/index.cjs +790 -767
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +20 -68
- package/dist/index.js.map +1 -1
- package/dist/settings/SettingsPanel.d.ts +1 -1
- package/dist/settings/index.cjs +55 -280
- package/dist/settings/index.cjs.map +1 -1
- package/dist/settings/index.js +17 -248
- package/dist/settings/index.js.map +1 -1
- package/dist/shell/FilterInput.d.ts +46 -0
- package/dist/shell/TabHeader.d.ts +5 -1
- package/dist/shell/index.cjs +61 -48
- package/dist/shell/index.d.ts +1 -0
- package/dist/shell/index.js +3 -2
- package/dist/site/index.cjs +62 -62
- package/dist/site/index.js +2 -2
- package/dist/studio/index.cjs +74 -74
- package/dist/studio/index.js +5 -5
- package/dist/workspaces/WorkspaceCard.d.ts +2 -2
- package/dist/workspaces/index.cjs +9 -2
- package/dist/workspaces/index.cjs.map +1 -1
- package/dist/workspaces/index.js +9 -2
- package/dist/workspaces/index.js.map +1 -1
- package/package.json +3 -3
- package/src/blocks.css +4 -0
- package/src/components/grid.css +10 -0
- package/dist/chunk-3NZR6PAG.js.map +0 -1
- package/dist/chunk-4XJZ6AAY.js.map +0 -1
- package/dist/chunk-5B4PXAKI.cjs.map +0 -1
- package/dist/chunk-5ZBP7TCD.cjs.map +0 -1
- package/dist/chunk-C75S6USL.js.map +0 -1
- package/dist/chunk-CQWRVIJC.cjs.map +0 -1
- package/dist/chunk-FRRDPYBR.cjs.map +0 -1
- package/dist/chunk-GVQOBJKR.cjs.map +0 -1
- package/dist/chunk-JGZTRLKL.cjs.map +0 -1
- package/dist/chunk-JLOYWXRB.js.map +0 -1
- package/dist/chunk-KXMDOTGW.js.map +0 -1
- package/dist/chunk-NJL4LIXX.js.map +0 -1
- package/dist/chunk-NUPVHEJW.js.map +0 -1
- package/dist/chunk-OJSWQM4G.js.map +0 -1
- package/dist/chunk-QN42OA5J.js.map +0 -1
- package/dist/chunk-RGHQFJOL.cjs.map +0 -1
- package/dist/chunk-S5HZBXZA.cjs.map +0 -1
- package/dist/chunk-UBNVIIBT.js.map +0 -1
- package/dist/chunk-WSJVHSGN.js.map +0 -1
- package/dist/chunk-Y2LWA4ZO.js.map +0 -1
- package/dist/chunk-YVIOCITQ.cjs.map +0 -1
- package/dist/chunk-ZHLMDJCO.cjs.map +0 -1
- package/dist/chunk-ZORQ5M3W.cjs.map +0 -1
- package/dist/chunk-ZVPTFTGV.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/theme/tokens.ts","../src/theme/fontPairings.ts","../src/theme/store.ts","../src/theme/ThemeEditor.tsx","../src/lib/testid.ts","../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/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/editorial/tone.ts","../src/components/editorial/ProfileCard.tsx","../src/components/TeamGrid.tsx","../src/components/Steps.tsx","../src/components/TestimonialGrid.tsx"],"names":["create","persist","useState","useEffect","tid","jsxs","jsx","RotateCcw","Input","Card","CardHeader","CardTitle","CardContent","Check","Save","ChevronDown","Palette","cn","createContext","useContext","ImageIcon","Button","Fragment","ArrowRight","Quote","Avatar","AvatarImage","AvatarFallback","initials","TONE_SURFACE","AiMarkdown","X","Menu","SIZE","TabsPrimitive","COLS","ASPECT","ArrowUpRight"],"mappings":"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","file":"chunk-MJCCBMM5.cjs","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 host 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 host 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: 'office',\n label: 'Office (Segoe UI)',\n description:\n 'The Microsoft Office interface face where installed (Word, Outlook), Inter elsewhere.',\n display: `\"Segoe UI Variable Text\", \"Segoe UI\", \"Inter Variable\", ${SANS_TAIL}`,\n sans: `\"Segoe UI Variable Text\", \"Segoe UI\", \"Inter Variable\", ${SANS_TAIL}`,\n packages: ['@fontsource-variable/inter'],\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 host 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 host'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 host). */\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 host 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 brand-specific 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 * 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; `variant=\"collapsed\"` is\n * the settings-page form: presets and a swatch strip always visible, the colour\n * and typography controls behind a \"Customize\" disclosure in a bounded scroller\n * (the full editor is very tall). All 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, ChevronDown } 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 host's theme store bundle (from createThemeStore). */\n bundle: ThemeBundle\n variant?: 'panel' | 'drawer' | 'collapsed'\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 /** `collapsed` only: start with the controls open. */\n defaultOpen?: boolean\n}\n\nexport function ThemeEditor({\n bundle,\n variant = 'panel',\n preview,\n onSave,\n testIdPrefix = 'theme',\n defaultOpen = false,\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 [open, setOpen] = useState(defaultOpen)\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 // host'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 try {\n const via = await onSave()\n setSavedVia(typeof via === 'string' ? via : 'saved')\n } catch {\n // The host's onSave reports the failure (notify); never show a false \"saved\".\n setSavedVia(null)\n } finally {\n setSaving(false)\n }\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 aria-label={`${label} hex value`}\n className=\"bg-card placeholder:text-muted-foreground focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring 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 aria-label=\"Typeface\"\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\"\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-xs 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 aria-label=\"Display font stack\"\n className=\"bg-card placeholder:text-muted-foreground focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring 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 aria-label=\"Body font stack\"\n className=\"bg-card placeholder:text-muted-foreground focus-visible:border-ring/60 focus-visible:ring-2 focus-visible:ring-ring 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 aria-label=\"Base radius\"\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-lg\" 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 // ── Collapsed layout — settings pages ───────────────────────────────────────\n if (variant === 'collapsed') {\n const controlsId = `${testIdPrefix}-controls`\n return (\n <div className=\"space-y-3\" data-testid={testIdPrefix}>\n {Presets}\n <div className=\"grid grid-cols-8 gap-1.5 @xl:grid-cols-12\" aria-hidden=\"true\">\n {tokens.slice(0, 12).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 <button\n type=\"button\"\n onClick={() => setOpen((o) => !o)}\n aria-expanded={open}\n aria-controls={controlsId}\n className=\"inline-flex items-center gap-1.5 text-sm font-medium text-foreground hover:text-primary\"\n data-testid={tid('customize')}\n >\n <ChevronDown className={`size-4 transition-transform ${open ? 'rotate-180' : ''}`} />\n Customize colours and type\n </button>\n {open && (\n <div\n id={controlsId}\n className=\"max-h-[28rem] overflow-y-auto rounded-md border border-border bg-card p-4\"\n data-testid={tid('controls')}\n >\n <p className=\"mb-2 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n Colours\n </p>\n <div className=\"grid gap-3 @xl:grid-cols-2\">\n {tokens.map((t) => colorRow(t.key, t.label))}\n </div>\n <p className=\"mt-6 mb-2 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n Typography & shape\n </p>\n {Typography}\n </div>\n )}\n {SaveBar}\n </div>\n )\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-xs 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-xs 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-lg\">\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-lg\"\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 @xl: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-lg\">\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(\"orders\", \"row\", \"CLM-2026-0042\") -> \"orders-row-clm-2026-0042\"\n * Keeps Playwright selectors predictable across a host 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","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 host 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-lg',\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 host.\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'\nimport type { BlockLinkComponent } from './blockLink'\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?: ReactNode\n /** Text (with optional `emphasis`) or any node. */\n title: ReactNode\n /** A word/phrase within a string `title` to accent (rendered in the primary colour). */\n emphasis?: string\n subtitle?: ReactNode\n /** Small print under the buttons (a trust line, a note). */\n caption?: ReactNode\n /** Router link for the CTAs (default: plain anchors). */\n linkComponent?: BlockLinkComponent\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 host 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: ReactNode, emphasis?: string): ReactNode {\n if (typeof title !== 'string' || !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\nfunction renderLink(Link: BlockLinkComponent | undefined, href: string, children: ReactNode) {\n return Link ? <Link href={href}>{children}</Link> : <a href={href}>{children}</a>\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 caption,\n linkComponent: Link,\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 {renderLink(\n Link,\n primaryCta.href || '#',\n <>\n {primaryCta.label}\n <ArrowRight className=\"size-4\" />\n </>\n )}\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 {renderLink(Link, secondaryCta.href || '#', secondaryCta.label)}\n </Button>\n )}\n </div>\n )}\n {caption && <div className={cn('mt-4 text-sm', subtle)}>{caption}</div>}\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 { AnchorHTMLAttributes, 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 BlockLinkRenderProps = Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> & {\n href: string\n className?: string\n children: ReactNode\n}\n\n/**\n * The host's link. Interactive blocks (nav rows, tiles, cards) pass anchor attributes beyond\n * `href` (`onClick`, `aria-current`, `data-*`, a `ref`), so an adapter should forward unknown\n * props to its anchor, as react-router's `Link` does.\n */\nexport type BlockLinkComponent = ComponentType<BlockLinkRenderProps>\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-lg 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 host.\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 { 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 { useState, type ReactNode } from 'react'\nimport { Menu, X } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport type { BlockLinkComponent } from './blockLink'\n\nexport interface NavLink {\n label: string\n href?: string\n}\n\nexport interface NavbarTestIds {\n /** Link `i` (default `{testId}-link-{i}`). */\n link: (index: number) => string\n cta: string\n menuButton: string\n menu: string\n}\n\nexport interface NavbarProps {\n /** Brand: text, or any node (logo + name). */\n brand: ReactNode\n /** Where the brand points. Omit for a non-link brand. */\n brandHref?: string\n links: NavLink[]\n cta?: { label?: string; href?: string }\n /** Replaces `cta` with any node (a button group, a user menu). */\n ctaSlot?: ReactNode\n /** Router link for the brand, links and CTA (default: plain anchors). */\n linkComponent?: BlockLinkComponent\n /** Replaces the default mobile menu body (the links plus the CTA). */\n mobileMenu?: ReactNode\n /** Labels of the mobile menu button. */\n labels?: { openMenu: string; closeMenu: string }\n testId?: string\n testIds?: Partial<NavbarTestIds>\n}\n\nconst DEFAULT_LABELS = { openMenu: 'Open menu', closeMenu: 'Close menu' }\n\n/** Marketing top navigation: brand, inline links, an optional CTA and a mobile menu. */\nexport function Navbar({\n brand,\n brandHref,\n links,\n cta,\n ctaSlot,\n linkComponent: Link,\n mobileMenu,\n labels,\n testId,\n testIds,\n}: NavbarProps) {\n const [isOpen, setIsOpen] = useState(false)\n const l = { ...DEFAULT_LABELS, ...labels }\n const items = links ?? []\n const linkId = (i: number) => testIds?.link?.(i) ?? (testId ? `${testId}-link-${i}` : undefined)\n const ctaId = testIds?.cta ?? (testId ? `${testId}-cta` : undefined)\n const menuId = testIds?.menu ?? (testId ? `${testId}-menu` : undefined)\n const menuButtonId = testIds?.menuButton ?? (testId ? `${testId}-menu-button` : undefined)\n\n const anchor = (href: string, className: string | undefined, children: ReactNode, id?: string) =>\n Link ? (\n <Link href={href} className={className} data-testid={id}>\n {children}\n </Link>\n ) : (\n <a href={href} className={className} data-testid={id}>\n {children}\n </a>\n )\n\n const linkClass =\n 'text-sm font-medium text-muted-foreground transition-colors hover:text-foreground'\n const brandNode = <span className=\"text-lg font-semibold tracking-tight\">{brand}</span>\n const ctaNode =\n ctaSlot ??\n (cta?.label && (\n <Button asChild size=\"sm\">\n {anchor(cta.href || '#', undefined, cta.label, ctaId)}\n </Button>\n ))\n\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 {brandHref ? anchor(brandHref, undefined, brandNode) : brandNode}\n <div className=\"hidden items-center gap-6 md:flex\">\n {items.map((link, i) => (\n <span key={i}>{anchor(link.href || '#', linkClass, link.label, linkId(i))}</span>\n ))}\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"hidden md:block\">{ctaNode}</div>\n <button\n type=\"button\"\n className=\"rounded-md p-2 text-foreground hover:bg-muted md:hidden\"\n aria-expanded={isOpen}\n aria-label={isOpen ? l.closeMenu : l.openMenu}\n onClick={() => setIsOpen((open) => !open)}\n data-testid={menuButtonId}\n >\n {isOpen ? <X className=\"size-5\" /> : <Menu className=\"size-5\" />}\n </button>\n </div>\n </nav>\n {isOpen && (\n <div\n className=\"border-t border-border px-5 py-4 md:hidden\"\n data-slot=\"navbar-mobile-menu\"\n data-testid={menuId}\n >\n {mobileMenu ?? (\n <div className=\"flex flex-col gap-3\">\n {items.map((link, i) => (\n <span key={i}>{anchor(link.href || '#', linkClass, link.label)}</span>\n ))}\n {ctaNode}\n </div>\n )}\n </div>\n )}\n </header>\n )\n}\n","import type { ReactNode } from 'react'\nimport type { BlockLinkComponent } from './blockLink'\n\nexport 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 /** Brand block (logo, name) above the columns. */\n brand?: ReactNode\n /** Short description under the brand. */\n blurb?: ReactNode\n /** Bottom row, right of the copyright: legal links, regulatory text, a language switch. */\n legal?: ReactNode\n /** Router link for the column links (default: plain anchors). */\n linkComponent?: BlockLinkComponent\n testId?: string\n}\n\n/** Site footer: optional brand and blurb, link columns, and a copyright and legal row. */\nexport function Footer({\n columns,\n copyright,\n brand,\n blurb,\n legal,\n linkComponent: Link,\n testId,\n}: FooterProps) {\n const linkClass = 'text-sm text-muted-foreground transition-colors hover:text-foreground'\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 {(brand || blurb) && (\n <div className=\"mb-10 max-w-md\" data-slot=\"footer-brand\">\n {brand && <div className=\"text-lg font-semibold tracking-tight\">{brand}</div>}\n {blurb && <p className=\"mt-2 text-sm text-muted-foreground\">{blurb}</p>}\n </div>\n )}\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 {Link ? (\n <Link href={link.href || '#'} className={linkClass}>\n {link.label}\n </Link>\n ) : (\n <a href={link.href || '#'} className={linkClass}>\n {link.label}\n </a>\n )}\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n {(copyright || legal) && (\n <div className=\"mt-12 flex flex-col gap-3 border-t border-border pt-6 text-sm text-muted-foreground sm:flex-row sm:items-center sm:justify-between\">\n {copyright && <p>{copyright}</p>}\n {legal && <div data-slot=\"footer-legal\">{legal}</div>}\n </div>\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, type ReactNode } from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface TabItem {\n label: string\n content: ReactNode\n}\n\nexport interface TabsProps {\n items: TabItem[]\n testId?: string\n}\n\n/**\n * A tabbed panel: a row of tabs over the active tab's content. Radix Tabs gives the full WAI-ARIA\n * pattern: one tab stop, arrow keys / Home / End move between tabs, `aria-controls` and\n * `aria-labelledby` pair each tab with its panel.\n */\nexport function Tabs({ items, testId }: TabsProps) {\n const list = items ?? []\n const [active, setActive] = useState('0')\n const activeIndex = Math.min(Number(active), Math.max(list.length - 1, 0))\n return (\n <TabsPrimitive.Root value={String(activeIndex)} onValueChange={setActive} data-testid={testId}>\n <TabsPrimitive.List className=\"flex flex-wrap gap-1 border-b border-border\">\n {list.map((t, i) => (\n <TabsPrimitive.Trigger\n key={i}\n value={String(i)}\n className={cn(\n '-mb-px border-b-2 px-4 py-2 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11',\n i === activeIndex\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 </TabsPrimitive.Trigger>\n ))}\n </TabsPrimitive.List>\n {list.map((t, i) => (\n <TabsPrimitive.Content\n key={i}\n value={String(i)}\n className=\"pt-5 text-sm leading-relaxed text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n data-testid={i === activeIndex ? testId && `${testId}-panel` : undefined}\n >\n {t.content}\n </TabsPrimitive.Content>\n ))}\n </TabsPrimitive.Root>\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, type ReactNode } from 'react'\nimport { Button, cn } from '@arbidocs/react/ui'\n\nexport interface ContactFieldOption {\n value: string\n label: string\n}\n\nexport interface ContactField {\n name: string\n label: string\n type?: 'text' | 'email' | 'tel' | 'textarea' | 'select'\n required?: boolean\n /** Choices for `type: 'select'`. */\n options?: ContactFieldOption[]\n /** Initial value (for example read from the URL query by the host). */\n defaultValue?: string\n placeholder?: string\n}\n\nexport interface ContactFormTestIds {\n form: string\n success: string\n submit: string\n /** Control of the field named `name` (default `{testId}-field-{name}`). */\n field: (name: string) => string\n}\n\nexport interface ContactFormProps {\n fields: ContactField[]\n submitLabel?: string\n /** Optional POST endpoint. When set (and no `onSubmit`), the form submits natively to it. */\n action?: string\n /**\n * Handles the submit: receives the field values. When provided the form does not post\n * natively; resolve to show the success state, reject to keep the form open.\n */\n onSubmit?: (values: Record<string, string>) => void | Promise<void>\n /** Message shown after a client-side (no-action) submit. */\n successMessage?: string\n /**\n * Replaces the success message block. The second argument returns the form to its initial\n * state (no remount with `key` needed), e.g. for a \"send another\" button.\n */\n renderSuccess?: (values: Record<string, string>, reset: () => void) => ReactNode\n /** With the default success message, adds a button with this label that resets the form. */\n resetLabel?: string\n /** Called with every field's current value on each change (and not on the initial render). */\n onValuesChange?: (values: Record<string, string>) => void\n /**\n * Content between the fields and the submit button: a note that depends on a field, a consent\n * line, a summary. A function receives the current values and re-renders on every change.\n */\n footerSlot?: ReactNode | ((values: Record<string, string>) => ReactNode)\n testId?: string\n testIds?: Partial<ContactFormTestIds>\n}\n\nfunction initialValues(fields: ContactField[]): Record<string, string> {\n const values: Record<string, string> = {}\n for (const f of fields) values[f.name] = f.defaultValue ?? ''\n return values\n}\n\nconst INPUT_CLASS =\n 'w-full rounded-md border border-border bg-card px-3 py-2 text-sm text-foreground outline-none focus:border-primary'\n\n/** A configurable lead/contact form. Posts to `action`, hands values to `onSubmit`, or confirms. */\nexport function ContactForm({\n fields,\n submitLabel = 'Send',\n action,\n onSubmit,\n successMessage = 'Thanks — we’ll be in touch shortly.',\n renderSuccess,\n resetLabel,\n onValuesChange,\n footerSlot,\n testId,\n testIds,\n}: ContactFormProps) {\n const [sentValues, setSentValues] = useState<Record<string, string> | null>(null)\n const [isSending, setIsSending] = useState(false)\n const list = fields ?? []\n const [liveValues, setLiveValues] = useState(() => initialValues(list))\n const ids = {\n form: testIds?.form ?? testId,\n success: testIds?.success ?? (testId ? `${testId}-success` : undefined),\n submit: testIds?.submit ?? (testId ? `${testId}-submit` : undefined),\n field: (name: string) =>\n testIds?.field?.(name) ?? (testId ? `${testId}-field-${name}` : undefined),\n }\n\n const reset = () => {\n setLiveValues(initialValues(list))\n setSentValues(null)\n }\n\n const handleChange = (e: FormEvent<HTMLFormElement>) => {\n const values: Record<string, string> = { ...initialValues(list) }\n new FormData(e.currentTarget).forEach((v, k) => {\n if (typeof v === 'string') values[k] = v\n })\n setLiveValues(values)\n onValuesChange?.(values)\n }\n\n const handleSubmit = async (e: FormEvent<HTMLFormElement>) => {\n // With an action (and no handler) we let the browser POST natively; otherwise confirm inline.\n if (action && !onSubmit) return\n e.preventDefault()\n const values: Record<string, string> = {}\n new FormData(e.currentTarget).forEach((v, k) => {\n if (typeof v === 'string') values[k] = v\n })\n if (onSubmit) {\n setIsSending(true)\n try {\n await onSubmit(values)\n } catch {\n return\n } finally {\n setIsSending(false)\n }\n }\n setSentValues(values)\n }\n\n if (sentValues) {\n return renderSuccess ? (\n <div data-testid={ids.success}>{renderSuccess(sentValues, reset)}</div>\n ) : (\n <div\n className=\"rounded-lg border border-border bg-muted p-6 text-center text-sm text-foreground\"\n role=\"status\"\n data-testid={ids.success}\n >\n <p>{successMessage}</p>\n {resetLabel && (\n <Button type=\"button\" variant=\"outline\" className=\"mt-4\" onClick={reset}>\n {resetLabel}\n </Button>\n )}\n </div>\n )\n }\n\n return (\n <form\n action={action}\n method={action && !onSubmit ? 'post' : undefined}\n onSubmit={handleSubmit}\n onChange={handleChange}\n className=\"mx-auto flex max-w-xl flex-col gap-4\"\n data-testid={ids.form}\n >\n {list.map((f, i) => (\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 defaultValue={f.defaultValue}\n placeholder={f.placeholder}\n className={INPUT_CLASS}\n data-testid={ids.field(f.name)}\n />\n ) : f.type === 'select' ? (\n <select\n name={f.name}\n required={f.required}\n defaultValue={f.defaultValue ?? ''}\n className={INPUT_CLASS}\n data-testid={ids.field(f.name)}\n >\n <option value=\"\" disabled={f.required}>\n {f.placeholder ?? ''}\n </option>\n {(f.options ?? []).map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n ) : (\n <input\n name={f.name}\n type={f.type || 'text'}\n required={f.required}\n defaultValue={f.defaultValue}\n placeholder={f.placeholder}\n className={INPUT_CLASS}\n data-testid={ids.field(f.name)}\n />\n )}\n </label>\n ))}\n {typeof footerSlot === 'function' ? footerSlot(liveValues) : footerSlot}\n <Button\n type=\"submit\"\n className={cn('mt-1 self-start')}\n disabled={isSending}\n data-testid={ids.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 { createContext, useContext } from 'react'\n\n/**\n * Editorial parts read their colours from the theme tokens only. `inverse` flips the page\n * tokens (`bg-foreground text-background`) for dark bands on a light theme; on a theme that is\n * already dark, leave `default` and let the host tokens do the work.\n */\nexport type EditorialTone = 'default' | 'inverse'\n\nexport interface EditorialToneClasses {\n /** Body text colour of the band. */\n text: string\n /** Secondary copy (lede, descriptions). */\n muted: string\n /** Tertiary copy (meta lines, small print). */\n subtle: string\n /** Accent text (links, kickers, markers). */\n accent: string\n /** Hairline between rows and around bands. */\n hairline: string\n /** A lifted surface (panel, row, chip). */\n panel: string\n /** Hover state of an interactive panel. */\n panelHover: string\n /** Small bordered chip. */\n chip: string\n /** Icon tile. */\n tile: string\n}\n\nconst TONES: Record<EditorialTone, EditorialToneClasses> = {\n default: {\n text: 'text-foreground',\n muted: 'text-muted-foreground',\n subtle: 'text-muted-foreground',\n accent: 'text-primary',\n hairline: 'border-border',\n panel: 'border-border bg-card text-card-foreground',\n panelHover: 'hover:border-primary/45 hover:bg-muted/60',\n chip: 'border-border text-muted-foreground',\n tile: 'border-primary/30 text-primary',\n },\n inverse: {\n text: 'text-background',\n muted: 'text-background/70',\n subtle: 'text-background/55',\n accent: 'text-primary',\n hairline: 'border-background/15',\n panel: 'border-background/15 bg-background/5 text-background',\n panelHover: 'hover:border-primary/45 hover:bg-background/10',\n chip: 'border-background/20 text-background/65',\n tile: 'border-primary/40 text-primary',\n },\n}\n\nexport const EditorialToneContext = createContext<EditorialTone>('default')\n\n/** The tone of the enclosing band, unless a part overrides it. */\nexport function useEditorialTone(override?: EditorialTone): EditorialToneClasses & {\n tone: EditorialTone\n} {\n const inherited = useContext(EditorialToneContext)\n const tone = override ?? inherited\n return { tone, ...TONES[tone] }\n}\n\n/** `01`, `02`, ... for a numbered label; strings pass through. */\nexport function formatIndex(index: number | string): string {\n return typeof index === 'number' ? String(index).padStart(2, '0') : index\n}\n","import type { ReactNode } from 'react'\nimport { ArrowUpRight } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage, cn } from '@arbidocs/react/ui'\nimport { initials } from '../../lib/format'\nimport { BlockLink, type BlockLinkComponent } from '../blockLink'\nimport { useEditorialTone } from './tone'\n\nexport interface ProfileCardProps {\n name: string\n role?: string\n /** An accent line under the role (practice, team). */\n kicker?: string\n bio?: string\n avatarUrl?: string\n /** Replaces the avatar (a photo frame, a monogram). */\n avatar?: ReactNode\n /** Extra classes of the avatar fallback, e.g. a host tint. */\n avatarClassName?: string\n /** Chips, links or stats under the bio, pinned to the card foot. */\n meta?: ReactNode\n /** Makes the whole card a link to the profile. */\n href?: string\n linkComponent?: BlockLinkComponent\n /** Lines of bio shown before truncation (0 shows it all). */\n bioLines?: 0 | 2 | 3 | 4\n /** Heading level of the name (default 3). */\n headingLevel?: 2 | 3 | 4\n className?: string\n testId?: string\n}\n\nconst CLAMP: Record<2 | 3 | 4, string> = { 2: 'line-clamp-2', 3: 'line-clamp-3', 4: 'line-clamp-4' }\n\n/** A person's card: avatar, name, role, kicker, clamped bio and a meta slot. */\nexport function ProfileCard({\n name,\n role,\n kicker,\n bio,\n avatarUrl,\n avatar,\n avatarClassName,\n meta,\n href,\n linkComponent,\n bioLines = 3,\n headingLevel = 3,\n className,\n testId,\n}: ProfileCardProps) {\n const t = useEditorialTone()\n const Heading = `h${headingLevel}` as 'h2' | 'h3' | 'h4'\n return (\n <BlockLink href={href} linkComponent={linkComponent} className=\"group block h-full\">\n <article\n className={cn(\n 'flex h-full flex-col rounded-sm border p-6 transition-colors duration-300',\n t.panel,\n href && t.panelHover,\n className\n )}\n data-slot=\"profile-card\"\n data-testid={testId}\n >\n <div className=\"flex items-start justify-between gap-4\">\n {avatar ?? (\n <Avatar className=\"size-14 text-sm\">\n {avatarUrl && <AvatarImage src={avatarUrl} alt=\"\" />}\n <AvatarFallback className={avatarClassName}>{initials(name || '?')}</AvatarFallback>\n </Avatar>\n )}\n {href && (\n <ArrowUpRight\n aria-hidden=\"true\"\n className={cn('size-4 shrink-0 transition-colors group-hover:text-primary', t.subtle)}\n />\n )}\n </div>\n <Heading className={cn('mt-5 font-display text-lg font-semibold', t.text)}>{name}</Heading>\n {role && <p className={cn('text-sm', t.muted)}>{role}</p>}\n {kicker && <p className={cn('mt-0.5 text-xs', t.accent)}>{kicker}</p>}\n {bio && (\n <p\n className={cn(\n 'mt-4 text-sm leading-relaxed',\n t.muted,\n bioLines ? CLAMP[bioLines] : undefined\n )}\n >\n {bio}\n </p>\n )}\n {meta && <div className=\"mt-auto pt-5\">{meta}</div>}\n </article>\n </BlockLink>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Avatar, AvatarFallback, AvatarImage, Card, cn } from '@arbidocs/react/ui'\nimport { initials } from '../lib/format'\nimport { BlockLink, type BlockLinkComponent } from './blockLink'\nimport { ProfileCard } from './editorial/ProfileCard'\n\nexport interface TeamMember {\n name: string\n role?: string\n /** An accent line under the role (practice, team). */\n kicker?: 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 /** Overrides this card's test id (default `{testId}-item-{index}`). */\n testId?: string\n}\n\nexport interface TeamGridProps {\n members: TeamMember[]\n columns?: '2' | '3' | '4'\n /**\n * `centered`: the stacked, centred card. `profile`: the start-aligned editorial card\n * (`ProfileCard`: clamped bio, meta pinned to the foot, arrow on linked cards).\n */\n variant?: 'centered' | 'profile'\n /** Per-member content under the bio (practice chips, focus areas, links). */\n renderMeta?: (member: TeamMember, index: number) => ReactNode\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 and meta slot. */\nexport function TeamGrid({\n members,\n columns = '3',\n variant = 'centered',\n renderMeta,\n linkComponent,\n testId,\n}: TeamGridProps) {\n const profile = variant === 'profile'\n return (\n <div\n className={cn('grid', profile ? 'gap-4' : 'gap-6', COLS[columns] ?? COLS['3'])}\n data-testid={testId}\n >\n {(members ?? []).map((m, i) => {\n const cardTestId = m.testId ?? (testId ? `${testId}-item-${i}` : undefined)\n const meta = renderMeta?.(m, i)\n if (profile) {\n return (\n <ProfileCard\n key={i}\n name={m.name}\n role={m.role}\n kicker={m.kicker}\n bio={m.bio}\n avatarUrl={m.avatarUrl}\n href={m.href}\n linkComponent={linkComponent}\n meta={meta}\n testId={cardTestId}\n />\n )\n }\n return (\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={cardTestId}\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.kicker && <p className=\"text-xs text-muted-foreground\">{m.kicker}</p>}\n {m.bio && (\n <p className=\"mt-2 text-sm leading-relaxed text-muted-foreground\">{m.bio}</p>\n )}\n {meta && <div className=\"mt-4\">{meta}</div>}\n </Card>\n </BlockLink>\n )\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"]}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var chunkMHVNT4J3_cjs = require('./chunk-MHVNT4J3.cjs');
|
|
5
|
+
var lucideReact = require('lucide-react');
|
|
6
|
+
var ui = require('@arbidocs/react/ui');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
var DEFAULT_FILTER_FIELDS = [
|
|
10
|
+
{ value: "text", label: "Text" },
|
|
11
|
+
{ value: "labels", label: "Labels" }
|
|
12
|
+
];
|
|
13
|
+
var DEFAULT_FILTER_INPUT_LABELS = {
|
|
14
|
+
placeholder: "Filter...",
|
|
15
|
+
clear: "Clear filter",
|
|
16
|
+
chooseFields: "Choose fields to filter",
|
|
17
|
+
fieldsHeading: "Filter fields",
|
|
18
|
+
fieldNames: { text: "Text", labels: "Labels" }
|
|
19
|
+
};
|
|
20
|
+
function FilterInput({
|
|
21
|
+
fieldOptions,
|
|
22
|
+
value,
|
|
23
|
+
hideFieldPicker = false,
|
|
24
|
+
ariaLabel,
|
|
25
|
+
onChange,
|
|
26
|
+
fields,
|
|
27
|
+
onFieldsChange,
|
|
28
|
+
filter,
|
|
29
|
+
className,
|
|
30
|
+
labels,
|
|
31
|
+
testIds
|
|
32
|
+
}) {
|
|
33
|
+
const l = { ...DEFAULT_FILTER_INPUT_LABELS, ...labels };
|
|
34
|
+
const options = fieldOptions ?? DEFAULT_FILTER_FIELDS;
|
|
35
|
+
const toggleField = (field) => onFieldsChange(fields.includes(field) ? fields.filter((f) => f !== field) : [...fields, field]);
|
|
36
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
37
|
+
"div",
|
|
38
|
+
{
|
|
39
|
+
className: ui.cn("flex min-w-0 items-center", className ?? "w-44 pointer-coarse:w-56"),
|
|
40
|
+
"data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.root, { testId: "facts-filter" }),
|
|
41
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex-1 min-w-0", children: [
|
|
42
|
+
filter ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
43
|
+
"div",
|
|
44
|
+
{
|
|
45
|
+
className: "absolute left-1 top-1/2 z-10 -translate-y-1/2",
|
|
46
|
+
"data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.quick, { testId: "facts-filter-quick" }),
|
|
47
|
+
children: filter
|
|
48
|
+
}
|
|
49
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Filter, { className: "pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }),
|
|
50
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
51
|
+
ui.Input,
|
|
52
|
+
{
|
|
53
|
+
"aria-label": ariaLabel,
|
|
54
|
+
value,
|
|
55
|
+
onChange: (e) => onChange(e.target.value),
|
|
56
|
+
placeholder: l.placeholder,
|
|
57
|
+
"data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.input, { testId: "facts-filter-input" }),
|
|
58
|
+
className: ui.cn(
|
|
59
|
+
"h-7 border-input bg-background pr-12 text-sm shadow-none focus-visible:ring-0 pointer-coarse:h-11 pointer-coarse:pr-24",
|
|
60
|
+
filter ? "pl-11" : "pl-7",
|
|
61
|
+
hideFieldPicker && "pr-7 pointer-coarse:pr-11"
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
),
|
|
65
|
+
value && /* @__PURE__ */ jsxRuntime.jsx(
|
|
66
|
+
"button",
|
|
67
|
+
{
|
|
68
|
+
type: "button",
|
|
69
|
+
onClick: () => onChange(""),
|
|
70
|
+
"aria-label": l.clear,
|
|
71
|
+
className: ui.cn(
|
|
72
|
+
"absolute top-1/2 z-10 -translate-y-1/2 text-muted-foreground hover:text-foreground pointer-coarse:flex pointer-coarse:size-11 pointer-coarse:items-center pointer-coarse:justify-center",
|
|
73
|
+
hideFieldPicker ? "right-1.5 pointer-coarse:right-0" : "right-7 pointer-coarse:right-11"
|
|
74
|
+
),
|
|
75
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "size-3" })
|
|
76
|
+
}
|
|
77
|
+
),
|
|
78
|
+
!hideFieldPicker && /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { children: [
|
|
79
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
80
|
+
"button",
|
|
81
|
+
{
|
|
82
|
+
type: "button",
|
|
83
|
+
"aria-label": l.chooseFields,
|
|
84
|
+
"data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.fieldsButton, {
|
|
85
|
+
testId: "facts-filter-fields-button"
|
|
86
|
+
}),
|
|
87
|
+
className: "absolute right-1.5 top-1/2 z-10 -translate-y-1/2 !h-5 !w-5 !p-0 text-muted-foreground/60 transition-colors hover:text-foreground pointer-coarse:right-0 pointer-coarse:!flex pointer-coarse:!h-11 pointer-coarse:!w-11 pointer-coarse:items-center pointer-coarse:justify-center",
|
|
88
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SlidersHorizontal, { className: "size-3.5" })
|
|
89
|
+
}
|
|
90
|
+
) }),
|
|
91
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.PopoverContent, { className: "w-44 p-0", align: "end", sideOffset: 4, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Command, { shouldFilter: false, children: /* @__PURE__ */ jsxRuntime.jsx(ui.CommandList, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.CommandGroup, { heading: l.fieldsHeading, children: options.map((option) => {
|
|
92
|
+
const isSelected = fields.includes(option.value);
|
|
93
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
94
|
+
ui.CommandItem,
|
|
95
|
+
{
|
|
96
|
+
onSelect: () => toggleField(option.value),
|
|
97
|
+
className: "cursor-pointer text-sm",
|
|
98
|
+
"data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.field?.(option.value), {
|
|
99
|
+
testId: `facts-filter-field-${option.value}`
|
|
100
|
+
}),
|
|
101
|
+
children: [
|
|
102
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
103
|
+
"div",
|
|
104
|
+
{
|
|
105
|
+
className: ui.cn(
|
|
106
|
+
"mr-2 flex size-3.5 items-center justify-center rounded-sm border border-primary",
|
|
107
|
+
isSelected ? "bg-primary text-primary-foreground" : "opacity-50 [&_svg]:invisible"
|
|
108
|
+
),
|
|
109
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "size-3" })
|
|
110
|
+
}
|
|
111
|
+
),
|
|
112
|
+
labels?.fieldNames?.[option.value] ?? option.label
|
|
113
|
+
]
|
|
114
|
+
},
|
|
115
|
+
option.value
|
|
116
|
+
);
|
|
117
|
+
}) }) }) }) })
|
|
118
|
+
] })
|
|
119
|
+
] })
|
|
120
|
+
}
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
exports.DEFAULT_FILTER_FIELDS = DEFAULT_FILTER_FIELDS;
|
|
125
|
+
exports.DEFAULT_FILTER_INPUT_LABELS = DEFAULT_FILTER_INPUT_LABELS;
|
|
126
|
+
exports.FilterInput = FilterInput;
|
|
127
|
+
//# sourceMappingURL=chunk-MZL67U2E.cjs.map
|
|
128
|
+
//# sourceMappingURL=chunk-MZL67U2E.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shell/FilterInput.tsx"],"names":["jsx","cn","testIdOr","jsxs","Filter","Input","X","Popover","PopoverTrigger","SlidersHorizontal","PopoverContent","Command","CommandList","CommandGroup","CommandItem","Check"],"mappings":";;;;;;;AAkBO,IAAM,qBAAA,GAAiE;AAAA,EAC5E,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,EAC/B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAC5B;AAWO,IAAM,2BAAA,GAAiD;AAAA,EAC5D,WAAA,EAAa,WAAA;AAAA,EACb,KAAA,EAAO,cAAA;AAAA,EACP,YAAA,EAAc,yBAAA;AAAA,EACd,aAAA,EAAe,eAAA;AAAA,EACf,UAAA,EAAY,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,QAAA;AACtC;AA8BO,SAAS,WAAA,CAAgD;AAAA,EAC9D,YAAA;AAAA,EACA,KAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,2BAAA,EAA6B,GAAG,MAAA,EAAO;AACtD,EAAA,MAAM,UAAU,YAAA,IAAiB,qBAAA;AACjC,EAAA,MAAM,cAAc,CAAC,KAAA,KACnB,eAAe,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,MAAA,CAAO,OAAO,CAAC,CAAA,KAAM,MAAM,KAAK,CAAA,GAAI,CAAC,GAAG,MAAA,EAAQ,KAAK,CAAC,CAAA;AAEhG,EAAA,uBACEA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWC,KAAA,CAAG,2BAAA,EAA6B,SAAA,IAAa,0BAA0B,CAAA;AAAA,MAClF,eAAaC,0BAAA,CAAS,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,gBAAgB,CAAA;AAAA,MAE/D,QAAA,kBAAAC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,MAAA,mBACCH,cAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,+CAAA;AAAA,YACV,eAAaE,0BAAA,CAAS,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,sBAAsB,CAAA;AAAA,YAErE,QAAA,EAAA;AAAA;AAAA,SACH,mBAEAF,cAAA,CAACI,kBAAA,EAAA,EAAO,SAAA,EAAU,6FAAA,EAA8F,CAAA;AAAA,wBAElHJ,cAAA;AAAA,UAACK,QAAA;AAAA,UAAA;AAAA,YACC,YAAA,EAAY,SAAA;AAAA,YACZ,KAAA;AAAA,YACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACxC,aAAa,CAAA,CAAE,WAAA;AAAA,YACf,eAAaH,0BAAA,CAAS,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,sBAAsB,CAAA;AAAA,YACtE,SAAA,EAAWD,KAAA;AAAA,cACT,wHAAA;AAAA,cACA,SAAS,OAAA,GAAU,MAAA;AAAA,cACnB,eAAA,IAAmB;AAAA;AACrB;AAAA,SACF;AAAA,QACC,KAAA,oBACCD,cAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,QAAA,CAAS,EAAE,CAAA;AAAA,YAC1B,cAAY,CAAA,CAAE,KAAA;AAAA,YACd,SAAA,EAAWC,KAAA;AAAA,cACT,yLAAA;AAAA,cACA,kBACI,kCAAA,GACA;AAAA,aACN;AAAA,YAEA,QAAA,kBAAAD,cAAA,CAACM,aAAA,EAAA,EAAE,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,SACxB;AAAA,QAID,CAAC,eAAA,oBACAH,eAAA,CAACI,UAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAP,cAAA,CAACQ,iBAAA,EAAA,EAAe,SAAO,IAAA,EACrB,QAAA,kBAAAR,cAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,cAAY,CAAA,CAAE,YAAA;AAAA,cACd,aAAA,EAAaE,0BAAA,CAAS,OAAA,EAAS,YAAA,EAAc;AAAA,gBAC3C,MAAA,EAAQ;AAAA,eACT,CAAA;AAAA,cACD,SAAA,EAAU,kRAAA;AAAA,cAEV,QAAA,kBAAAF,cAAA,CAACS,6BAAA,EAAA,EAAkB,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA,WAC1C,EACF,CAAA;AAAA,0BACAT,cAAA,CAACU,qBAAe,SAAA,EAAU,UAAA,EAAW,OAAM,KAAA,EAAM,UAAA,EAAY,CAAA,EAC3D,QAAA,kBAAAV,cAAA,CAACW,UAAA,EAAA,EAAQ,YAAA,EAAc,OACrB,QAAA,kBAAAX,cAAA,CAACY,cAAA,EAAA,EACC,yCAACC,eAAA,EAAA,EAAa,OAAA,EAAS,EAAE,aAAA,EACtB,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACvB,YAAA,MAAM,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAC/C,YAAA,uBACEV,eAAA;AAAA,cAACW,cAAA;AAAA,cAAA;AAAA,gBAEC,QAAA,EAAU,MAAM,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA;AAAA,gBACxC,SAAA,EAAU,wBAAA;AAAA,gBACV,eAAaZ,0BAAA,CAAS,OAAA,EAAS,KAAA,GAAQ,MAAA,CAAO,KAAK,CAAA,EAAG;AAAA,kBACpD,MAAA,EAAQ,CAAA,mBAAA,EAAsB,MAAA,CAAO,KAAK,CAAA;AAAA,iBAC3C,CAAA;AAAA,gBAED,QAAA,EAAA;AAAA,kCAAAF,cAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAWC,KAAA;AAAA,wBACT,iFAAA;AAAA,wBACA,aACI,oCAAA,GACA;AAAA,uBACN;AAAA,sBAEA,QAAA,kBAAAD,cAAA,CAACe,iBAAA,EAAA,EAAM,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,mBAC5B;AAAA,kBACC,MAAA,EAAQ,UAAA,GAAa,MAAA,CAAO,KAAK,KAAK,MAAA,CAAO;AAAA;AAAA,eAAA;AAAA,cAjBzC,MAAA,CAAO;AAAA,aAkBd;AAAA,UAEJ,CAAC,CAAA,EACH,CAAA,EACF,CAAA,EACF,CAAA,EACF;AAAA,SAAA,EACF;AAAA,OAAA,EAEJ;AAAA;AAAA,GACF;AAEJ","file":"chunk-MZL67U2E.cjs","sourcesContent":["/** Shared page filter with configurable searchable fields and optional quick-filter control. */\nimport type { ReactNode } from 'react'\nimport { X, Filter, SlidersHorizontal, Check } from 'lucide-react'\nimport {\n Command,\n CommandGroup,\n CommandItem,\n CommandList,\n Input,\n Popover,\n PopoverContent,\n PopoverTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport type FilterField = 'text' | 'labels'\n\nexport const DEFAULT_FILTER_FIELDS: { value: FilterField; label: string }[] = [\n { value: 'text', label: 'Text' },\n { value: 'labels', label: 'Labels' },\n]\n\nexport interface FilterInputLabels<Field extends string = FilterField> {\n placeholder: string\n clear: string\n chooseFields: string\n fieldsHeading: string\n /** Display name per searchable field. */\n fieldNames: Partial<Record<Field, string>>\n}\n\nexport const DEFAULT_FILTER_INPUT_LABELS: FilterInputLabels = {\n placeholder: 'Filter...',\n clear: 'Clear filter',\n chooseFields: 'Choose fields to filter',\n fieldsHeading: 'Filter fields',\n fieldNames: { text: 'Text', labels: 'Labels' },\n}\n\nexport interface FilterInputTestIds<Field extends string = FilterField> {\n root: string\n quick: string\n input: string\n fieldsButton: string\n field: (field: Field) => string\n}\n\nexport interface FilterInputProps<Field extends string = FilterField> {\n fieldOptions?: { value: Field; label: string }[]\n value: string\n /** Lists with one searchable field need no field selector. */\n hideFieldPicker?: boolean\n ariaLabel?: string\n onChange: (q: string) => void\n fields: Field[]\n onFieldsChange: (fields: Field[]) => void\n /**\n * The quick-filter dropdown trigger, embedded inside the input on the left\n * (mirroring the Files search box). When absent, a static funnel icon shows.\n */\n filter?: ReactNode\n /** Width classes for the box (default `w-44`). */\n className?: string\n labels?: Partial<FilterInputLabels<Field>>\n testIds?: Partial<FilterInputTestIds<Field>>\n}\n\nexport function FilterInput<Field extends string = FilterField>({\n fieldOptions,\n value,\n hideFieldPicker = false,\n ariaLabel,\n onChange,\n fields,\n onFieldsChange,\n filter,\n className,\n labels,\n testIds,\n}: FilterInputProps<Field>) {\n const l = { ...DEFAULT_FILTER_INPUT_LABELS, ...labels }\n const options = fieldOptions ?? (DEFAULT_FILTER_FIELDS as { value: Field; label: string }[])\n const toggleField = (field: Field) =>\n onFieldsChange(fields.includes(field) ? fields.filter((f) => f !== field) : [...fields, field])\n\n return (\n <div\n className={cn('flex min-w-0 items-center', className ?? 'w-44 pointer-coarse:w-56')}\n data-testid={testIdOr(testIds?.root, { testId: 'facts-filter' })}\n >\n <div className=\"relative flex-1 min-w-0\">\n {filter ? (\n <div\n className=\"absolute left-1 top-1/2 z-10 -translate-y-1/2\"\n data-testid={testIdOr(testIds?.quick, { testId: 'facts-filter-quick' })}\n >\n {filter}\n </div>\n ) : (\n <Filter className=\"pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n )}\n <Input\n aria-label={ariaLabel}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={l.placeholder}\n data-testid={testIdOr(testIds?.input, { testId: 'facts-filter-input' })}\n className={cn(\n 'h-7 border-input bg-background pr-12 text-sm shadow-none focus-visible:ring-0 pointer-coarse:h-11 pointer-coarse:pr-24',\n filter ? 'pl-11' : 'pl-7',\n hideFieldPicker && 'pr-7 pointer-coarse:pr-11'\n )}\n />\n {value && (\n <button\n type=\"button\"\n onClick={() => onChange('')}\n aria-label={l.clear}\n className={cn(\n 'absolute top-1/2 z-10 -translate-y-1/2 text-muted-foreground hover:text-foreground pointer-coarse:flex pointer-coarse:size-11 pointer-coarse:items-center pointer-coarse:justify-center',\n hideFieldPicker\n ? 'right-1.5 pointer-coarse:right-0'\n : 'right-7 pointer-coarse:right-11'\n )}\n >\n <X className=\"size-3\" />\n </button>\n )}\n {/* Field picker — inside the input on the right, muted, exactly as the\n Files search box renders it. */}\n {!hideFieldPicker && (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={l.chooseFields}\n data-testid={testIdOr(testIds?.fieldsButton, {\n testId: 'facts-filter-fields-button',\n })}\n className=\"absolute right-1.5 top-1/2 z-10 -translate-y-1/2 !h-5 !w-5 !p-0 text-muted-foreground/60 transition-colors hover:text-foreground pointer-coarse:right-0 pointer-coarse:!flex pointer-coarse:!h-11 pointer-coarse:!w-11 pointer-coarse:items-center pointer-coarse:justify-center\"\n >\n <SlidersHorizontal className=\"size-3.5\" />\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-44 p-0\" align=\"end\" sideOffset={4}>\n <Command shouldFilter={false}>\n <CommandList>\n <CommandGroup heading={l.fieldsHeading}>\n {options.map((option) => {\n const isSelected = fields.includes(option.value)\n return (\n <CommandItem\n key={option.value}\n onSelect={() => toggleField(option.value)}\n className=\"cursor-pointer text-sm\"\n data-testid={testIdOr(testIds?.field?.(option.value), {\n testId: `facts-filter-field-${option.value}`,\n })}\n >\n <div\n className={cn(\n 'mr-2 flex size-3.5 items-center justify-center rounded-sm border border-primary',\n isSelected\n ? 'bg-primary text-primary-foreground'\n : 'opacity-50 [&_svg]:invisible'\n )}\n >\n <Check className=\"size-3\" />\n </div>\n {labels?.fieldNames?.[option.value] ?? option.label}\n </CommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )}\n </div>\n </div>\n )\n}\n"]}
|