@spectare-personalisation/react 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +292 -164
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +98 -55
- package/dist/index.d.ts +98 -55
- package/dist/index.js +213 -115
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/tokens.ts","../src/ComponentRenderer.tsx","../src/PersonalisedSection.tsx"],"names":["marked","DOMPurify","jsxs","jsx","useState","useRef","useEffect","res","_a","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["export type ComponentName =\n | 'AnnouncementBar'\n | 'HeroStatement'\n | 'AtomCard'\n | 'StatGrid'\n | 'CodeBlock'\n | 'ComparisonTable'\n | 'FeatureList'\n | 'TestimonialCard'\n | 'ImageCtaHero'\n | 'CtaStrip';\n\nexport type AssemblyZone = 'announce' | 'hero' | 'body' | 'proof' | 'cta';\n\nconst COMPONENT_ZONES: Record<ComponentName, AssemblyZone> = {\n AnnouncementBar: 'announce',\n HeroStatement: 'hero',\n ImageCtaHero: 'hero',\n AtomCard: 'body',\n StatGrid: 'body',\n CodeBlock: 'body',\n ComparisonTable: 'body',\n FeatureList: 'body',\n TestimonialCard: 'proof',\n CtaStrip: 'cta',\n};\n\nexport type ComponentAssembly = Array<{\n component: ComponentName;\n slots?: Record<string, unknown>;\n size?: 'full' | 'half';\n zone?: AssemblyZone;\n // Atom IDs this component was built from; drives conversion attribution.\n sourceAtomIds?: number[];\n}>;\n\nexport function filterAssemblyByZone(assembly: ComponentAssembly, zone: AssemblyZone): ComponentAssembly {\n return assembly.filter(item => {\n const effectiveZone = item.zone ?? COMPONENT_ZONES[item.component];\n return effectiveZone === zone;\n });\n}\n","/**\n * The one place this package's design tokens are defined.\n *\n * Two things that are easy to get wrong here:\n *\n * 1. Tokens are declared on `.sp-root`, not `:root`. Declaring them at `:root` writes into\n * the host's document, allows only one theme per page, and means a customer overriding\n * `--sp-accent` competes with us at equal specificity so tag order decides the winner.\n * Scoping also lets two differently themed sections sit on one page.\n *\n * 2. `tokens.css` must stay byte-identical to `buildTokenCss({ scope: STYLESHEET_SCOPE })`,\n * which differs from the injected CSS in its selector and in nothing else.\n * tests/unit/react-tokens.test.ts enforces both halves, because a customer who imports the\n * stylesheet and a customer who renders the component must get the same page.\n *\n * components/ServerAssemblyRenderer.tsx in the Spectare app is a deliberate mirror of the\n * values below. It is not the same file: that renderer uses rem, this one uses px.\n */\n\n/** The package default. `spectare.js` and the WordPress plugin default to #2563eb, which is\n * a live inconsistency and a brand decision rather than a technical one, so it is left alone\n * here. Pass `accent` to override on either path. */\nexport const DEFAULT_ACCENT = '#60a5fa';\n\n/** Class the tokens are scoped to. Applied by ComponentRenderer to its own wrapper. */\nexport const SP_ROOT = 'sp-root';\n\n/**\n * Selector the shipped `tokens.css` declares on.\n *\n * `:where(:root)` has zero specificity, so it gives a host that imports the stylesheet and\n * composes the individual components a working set of defaults without a wrapper, while losing\n * to literally any rule the host writes, including a bare `:root` of their own. `.sp-root` then\n * wins over it wherever both apply, which is what makes a differently themed section on one page\n * work. The runtime CSS the renderer injects uses `.sp-root` alone: it applies the class itself,\n * so it has no reason to touch the host's document.\n */\nexport const STYLESHEET_SCOPE = `:where(:root),.${SP_ROOT}`;\n\n/**\n * Colour tokens, in the order they are emitted.\n *\n * `--sp-text-muted` and `--sp-text-dim` were #71717a (3.67:1) and #52525b (2.29:1) on\n * `--sp-bg`, which fail WCAG AA for body text and, in the case of dim, fail even the 3:1\n * large-text floor. They now measure 4.65:1 and 3.36:1. Every other value is unchanged.\n *\n * `--sp-cta-bg` / `--sp-cta-text` carry the values CtaStrip used to hardcode, so the dark\n * rendering is pixel-identical and a light host can correct a button that would otherwise\n * be white on white.\n */\nfunction palette(accent: string): Record<string, string> {\n return {\n '--sp-accent': accent,\n '--sp-accent-bg': `color-mix(in srgb,${accent} 10%,transparent)`,\n '--sp-accent-border': `color-mix(in srgb,${accent} 20%,transparent)`,\n '--sp-bg': '#18181b',\n '--sp-surface': '#09090b',\n '--sp-border': '#27272a',\n '--sp-text': '#f4f4f5',\n '--sp-text-sub': '#d4d4d8',\n '--sp-text-strong': '#e4e4e7',\n '--sp-text-muted': '#82828b',\n '--sp-text-dim': '#6b6b74',\n '--sp-text-body': '#a1a1aa',\n '--sp-positive': '#6ee7b7',\n '--sp-cta-bg': '#fff',\n '--sp-cta-text': '#09090b',\n '--sp-divider': 'rgba(255,255,255,0.06)',\n '--sp-code-bg': 'rgba(255,255,255,0.07)',\n '--sp-code-border': 'rgba(255,255,255,0.08)',\n '--sp-pre-bg': 'rgba(0,0,0,0.4)',\n };\n}\n\n/**\n * Prose and layout rules, scoped to the same class so the package ships no global classes.\n *\n * `unit` exists because the app's server renderer sizes in rem and this package sizes in px.\n * 20px and 1.25rem are the same length at a 16px base, so this is not a design difference, but\n * the two were separate string literals and separate string literals drift.\n */\nfunction rules(unit: 'px' | 'rem'): string {\n const gap = unit === 'px' ? '20px' : '1.25rem';\n return [\n '.sp-root .sp-prose p{margin-bottom:.625rem}',\n '.sp-root .sp-prose p:last-child{margin-bottom:0}',\n '.sp-root .sp-prose ul{list-style:disc;padding-left:1.25rem;margin-bottom:.625rem}',\n '.sp-root .sp-prose ol{list-style:decimal;padding-left:1.25rem;margin-bottom:.625rem}',\n '.sp-root .sp-prose li{margin-bottom:.25rem}',\n '.sp-root .sp-prose strong{color:var(--sp-text-strong);font-weight:600}',\n '.sp-root .sp-prose h2,.sp-root .sp-prose h3{color:var(--sp-text);font-weight:600;margin:.875rem 0 .375rem;font-size:1rem}',\n '.sp-root .sp-prose code{background:var(--sp-code-bg);border:1px solid var(--sp-code-border);padding:.1rem .35rem;border-radius:.25rem;font-size:.82em;color:var(--sp-text)}',\n '.sp-root .sp-prose blockquote{border-left:3px solid var(--sp-border);padding-left:1rem;color:var(--sp-text-muted);margin:.75rem 0}',\n `.sp-root .sp-pair{display:grid;grid-template-columns:1fr 1fr;gap:${gap}}`,\n '@media(max-width:640px){.sp-root .sp-pair{grid-template-columns:1fr}}',\n ].join('');\n}\n\n/**\n * Returns the stylesheet a renderer injects.\n *\n * @param accent brand colour. Accepts anything CSS does; `--sp-accent-bg` and\n * `--sp-accent-border` are derived from it so a customer sets one value\n * rather than three. Defaults to DEFAULT_ACCENT.\n * @param unit length unit for layout rules. 'px' for this package, 'rem' for the app's\n * server renderer, which sizes in rem throughout.\n * @param scope selector the custom properties are declared on. Defaults to `.sp-root`, which is\n * what a renderer injecting this at runtime wants. `tokens.css` is generated with\n * STYLESHEET_SCOPE instead, so importing it works without a wrapper.\n */\nexport function buildTokenCss({ accent = DEFAULT_ACCENT, unit = 'px', scope = `.${SP_ROOT}` }: { accent?: string; unit?: 'px' | 'rem'; scope?: string } = {}): string {\n const decls = Object.entries(palette(accent)).map(([k, v]) => `${k}:${v}`).join(';');\n return `${scope}{${decls}}${rules(unit)}`;\n}\n","'use client';\n\nimport { marked } from 'marked';\nimport DOMPurify from 'isomorphic-dompurify';\nimport { filterAssemblyByZone } from './types';\nimport { buildTokenCss, SP_ROOT } from './tokens';\nimport type { ComponentAssembly, ComponentName, AssemblyZone } from './types';\n\n// The assembly API returns atom content as raw markdown. marked emits raw HTML,\n// so the output must be sanitised before it reaches dangerouslySetInnerHTML,\n// otherwise a malicious atom can run script in the host site's visitors' browsers.\nfunction renderMarkdown(content: string): string {\n const raw = marked.parse(content ?? '', { async: false }) as string;\n return DOMPurify.sanitize(raw, { USE_PROFILES: { html: true } });\n}\n\n// Default half-size components: used when assembly item omits size.\nconst HALF_COMPONENTS = new Set<ComponentName>(['TestimonialCard']);\n\n// ── Individual component renderers ────────────────────────────────────────────\n\n// Alignment is a host decision, not baked into a component: the host passes `align`\n// and statement-style components adopt it. flexItems maps it to a flex alignment so\n// block children (a max-width subheading, an inline CTA) align too, not just the text.\ntype Align = 'left' | 'center' | 'right';\nconst flexItems = (a: Align): 'flex-start' | 'center' | 'flex-end' =>\n a === 'center' ? 'center' : a === 'right' ? 'flex-end' : 'flex-start';\n\n/**\n * A single line above everything else. Deliberately the plainest component in the set: no\n * heading, no image, no padding to speak of. A bar that draws attention to itself competes with\n * the page it is announcing something about.\n *\n * Uses the accent rather than a red or amber alert colour. This is a fact worth knowing, not a\n * warning, and a venue putting \"members book from Thursday\" in an alarm colour reads as a problem\n * rather than an offer.\n */\nexport function AnnouncementBar({ text, link }: { text?: string; link?: { label: string; href: string } }) {\n if (!text) return null;\n return (\n <div style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '10px',\n flexWrap: 'wrap', textAlign: 'center',\n background: 'var(--sp-accent-bg)', border: '1px solid var(--sp-accent-border)',\n borderRadius: '8px', padding: '8px 16px', fontSize: '14px', lineHeight: 1.4,\n color: 'var(--sp-text-sub)',\n }}>\n <span>{text}</span>\n {link?.href && link?.label && (\n <a href={link.href} style={{ color: 'var(--sp-accent)', fontWeight: 600, textDecoration: 'none', whiteSpace: 'nowrap' }}>\n {link.label} →\n </a>\n )}\n </div>\n );\n}\n\nexport function HeroStatement({ headline, subheading, align = 'left' }: { headline: string; subheading?: string; align?: Align }) {\n return (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: flexItems(align), textAlign: align, paddingTop: '24px', paddingBottom: '24px' }}>\n <h2 style={{ fontSize: '32px', fontWeight: 700, letterSpacing: '-0.025em', lineHeight: 1.2, color: 'var(--sp-text)', margin: '0 0 12px' }}>\n {headline}\n </h2>\n {subheading && (\n <p style={{ fontSize: '18px', color: 'var(--sp-text-sub)', lineHeight: 1.6, maxWidth: '672px', margin: 0 }}>{subheading}</p>\n )}\n </div>\n );\n}\n\n// The atom owns title / content / stats / cta; its layout decides which appear and in\n// what order. Default order when the atom has no layout. Mirrors the atom editor and the\n// server renderer.\nconst ATOM_LAYOUT_DEFAULT = ['title', 'content', 'stats', 'cta'];\n\n// Clamp atom prose unless the assembly asked for the full body. See the note in\n// components/ServerAssemblyRenderer.tsx: CSS rather than an expand toggle, so the identical\n// rule works here, in the server renderer, in spectare.js and in the WordPress plugin.\nconst ATOM_CLAMP_LINES = 4;\nconst clampStyle = {\n display: '-webkit-box',\n WebkitLineClamp: ATOM_CLAMP_LINES,\n WebkitBoxOrient: 'vertical' as const,\n overflow: 'hidden',\n};\n\nexport function AtomCard(\n { title, content, layout, stats = [], ctaText, ctaUrl, full }:\n { title?: string; content?: string; layout?: string[]; stats?: { value: string; label: string }[]; ctaText?: string; ctaUrl?: string; full?: boolean },\n) {\n const order = layout && layout.length ? layout : ATOM_LAYOUT_DEFAULT;\n const element = (name: string) => {\n if (name === 'title') return title\n ? <h3 key=\"title\" style={{ fontSize: '16px', fontWeight: 600, color: 'var(--sp-text)', margin: '0 0 12px' }}>{title}</h3> : null;\n if (name === 'content') return content\n ? <div key=\"content\" className=\"sp-prose\" style={{ fontSize: '15px', color: 'var(--sp-text-sub)', lineHeight: 1.6, ...(full ? {} : clampStyle) }} dangerouslySetInnerHTML={{ __html: renderMarkdown(content) }} /> : null;\n if (name === 'stats') return stats.length\n ? (\n <div key=\"stats\" style={{ display: 'flex', flexWrap: 'wrap', gap: '20px', margin: '0 0 12px', paddingBottom: '12px', borderBottom: '1px solid var(--sp-border)' }}>\n {stats.map((s, i) => (\n <div key={i} style={{ display: 'flex', flexDirection: 'column', gap: '2px' }}>\n <span style={{ fontSize: '22px', fontWeight: 700, color: 'var(--sp-text)', lineHeight: 1, fontVariantNumeric: 'tabular-nums' }}>{s.value}</span>\n <span style={{ fontSize: '11px', color: 'var(--sp-text-muted)', textTransform: 'uppercase', letterSpacing: '0.06em' }}>{s.label}</span>\n </div>\n ))}\n </div>\n ) : null;\n if (name === 'cta') return ctaText && ctaUrl\n ? <a key=\"cta\" href={ctaUrl} style={{ display: 'inline-flex', alignItems: 'center', gap: '4px', marginTop: '12px', fontSize: '13px', fontWeight: 600, color: 'var(--sp-accent)', textDecoration: 'none' }}>{ctaText} →</a> : null;\n return null;\n };\n return (\n <div style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '12px', padding: '24px', height: '100%' }}>\n {order.map(element)}\n </div>\n );\n}\n\nexport function StatGrid({ stats = [], caption }: { stats?: { value: string; label: string }[]; caption?: string }) {\n const cols = stats.length === 2 ? 2 : stats.length === 3 ? 3 : 4;\n return (\n <div>\n <div style={{ display: 'grid', gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: '12px' }}>\n {stats.map(({ value, label }) => (\n <div key={label} style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '10px', padding: '16px 20px', display: 'flex', flexDirection: 'column', justifyContent: 'space-between', minHeight: '88px' }}>\n <p style={{ fontSize: '11px', color: 'var(--sp-text-muted)', textTransform: 'uppercase', letterSpacing: '0.06em', margin: '0 0 12px', lineHeight: 1.3 }}>{label}</p>\n <p style={{ fontSize: '20px', fontWeight: 500, color: 'var(--sp-text)', fontVariantNumeric: 'tabular-nums', lineHeight: 1, margin: 0 }}>{value}</p>\n </div>\n ))}\n </div>\n {caption && (\n <p style={{ fontSize: '13px', color: 'var(--sp-text-muted)', margin: '12px 0 0' }}>{caption}</p>\n )}\n </div>\n );\n}\n\nexport function CodeBlock({ code, lang = 'typescript', caption }: { code: string; lang?: string; caption?: string }) {\n return (\n <div style={{ borderRadius: '12px', overflow: 'hidden', border: '1px solid var(--sp-border)' }}>\n <div style={{ background: 'var(--sp-bg)', padding: '10px 16px', display: 'flex', alignItems: 'center', justifyContent: 'space-between', borderBottom: '1px solid var(--sp-border)' }}>\n <span style={{ fontSize: '12px', color: 'var(--sp-text-muted)', fontFamily: 'monospace' }}>{lang}</span>\n {caption && <span style={{ fontSize: '12px', color: 'var(--sp-text-muted)' }}>{caption}</span>}\n </div>\n <pre style={{ background: 'var(--sp-surface)', padding: '20px', fontSize: '13px', color: 'var(--sp-text-sub)', overflowX: 'auto', lineHeight: 1.6, fontFamily: 'monospace', whiteSpace: 'pre', margin: 0 }}>\n {code}\n </pre>\n </div>\n );\n}\n\nexport function ComparisonTable({ brand = 'Us', competitor, rows = [] }: { brand?: string; competitor: string; rows?: { label: string; spectare: string; them: string }[] }) {\n return (\n <div style={{ border: '1px solid var(--sp-border)', borderRadius: '12px', overflow: 'hidden' }}>\n <div style={{ overflowX: 'auto' }}>\n <table style={{ width: '100%', fontSize: '14px', borderCollapse: 'collapse' }}>\n <thead>\n <tr style={{ borderBottom: '1px solid var(--sp-border)', background: 'var(--sp-bg)' }}>\n <th style={{ textAlign: 'left', padding: '12px 16px', color: 'var(--sp-text-muted)', fontWeight: 500, fontSize: '12px', width: '33%' }} />\n <th style={{ textAlign: 'left', padding: '12px 16px', fontWeight: 600, color: 'var(--sp-accent)', fontSize: '12px' }}>{brand}</th>\n <th style={{ textAlign: 'left', padding: '12px 16px', color: 'var(--sp-text-muted)', fontWeight: 500, fontSize: '12px' }}>{competitor}</th>\n </tr>\n </thead>\n <tbody>\n {rows.map(({ label, spectare, them }) => (\n <tr key={label} style={{ borderBottom: '1px solid var(--sp-border)' }}>\n <td style={{ padding: '12px 16px', fontSize: '13px', color: 'var(--sp-text-muted)', fontWeight: 500 }}>{label}</td>\n <td style={{ padding: '12px 16px', fontSize: '13px', color: 'var(--sp-positive)', fontWeight: 500 }}>{spectare}</td>\n <td style={{ padding: '12px 16px', fontSize: '13px', color: 'var(--sp-text-muted)' }}>{them}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\nexport function FeatureList({ items = [] }: { items?: { text: string; sub?: string }[] }) {\n return (\n <div style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '12px', padding: '24px' }}>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0, display: 'flex', flexDirection: 'column', gap: '16px' }}>\n {items.map(({ text, sub }) => (\n <li key={text} style={{ display: 'flex', gap: '12px' }}>\n <span style={{ color: 'var(--sp-accent)', flexShrink: 0, fontSize: '15px', marginTop: '2px' }}>✓</span>\n <div>\n <p style={{ fontSize: '15px', fontWeight: 500, color: 'var(--sp-text)', lineHeight: 1.4, margin: 0 }}>{text}</p>\n {sub && <p style={{ fontSize: '13px', color: 'var(--sp-text-muted)', lineHeight: 1.5, margin: '4px 0 0' }}>{sub}</p>}\n </div>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\nexport function TestimonialCard({ quote, name, role, company }: { quote: string; name: string; role: string; company?: string }) {\n return (\n <div style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '12px', padding: '24px', display: 'flex', flexDirection: 'column', gap: '20px', height: '100%' }}>\n <p style={{ fontSize: '15px', color: 'var(--sp-text-sub)', lineHeight: 1.6, flex: 1, margin: 0 }}>\n <span style={{ color: 'var(--sp-text-dim)', fontSize: '18px', lineHeight: 1, marginRight: '4px' }}>\"</span>\n {quote}\n <span style={{ color: 'var(--sp-text-dim)', fontSize: '18px', lineHeight: 1, marginLeft: '4px' }}>\"</span>\n </p>\n <div style={{ borderTop: '1px solid var(--sp-border)', paddingTop: '16px' }}>\n <p style={{ fontSize: '14px', fontWeight: 600, color: 'var(--sp-text)', margin: 0 }}>{name}</p>\n <p style={{ fontSize: '13px', color: 'var(--sp-text-muted)', margin: '2px 0 0' }}>\n {role}{company ? `, ${company}` : ''}\n </p>\n </div>\n </div>\n );\n}\n\nexport function ImageCtaHero({ src, alt = '', headline, subheading, ctaLabel, ctaHref, align = 'left' }: { src?: string; alt?: string; headline?: string; subheading?: string; ctaLabel?: string; ctaHref?: string; align?: Align }) {\n if (!src) return null;\n return (\n <div style={{ borderRadius: '12px', overflow: 'hidden', position: 'relative', width: '100%', paddingBottom: '56.25%' }}>\n <img src={src} alt={alt} style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', objectFit: 'cover' }} />\n <div style={{ position: 'absolute', inset: 0, background: 'rgba(0,0,0,0.45)' }} />\n <div style={{ position: 'absolute', inset: 0, background: 'linear-gradient(to top, rgba(0,0,0,0.85) 0%, rgba(0,0,0,0.2) 60%, transparent 100%)' }} />\n <div style={{ position: 'absolute', bottom: 0, left: 0, right: 0, padding: '28px', textAlign: align }}>\n {headline && (\n <h2 style={{ fontSize: '24px', fontWeight: 700, color: '#fff', lineHeight: 1.2, margin: '0 0 8px', letterSpacing: '-0.02em' }}>{headline}</h2>\n )}\n {subheading && (\n <p style={{ fontSize: '15px', color: 'rgba(255,255,255,0.75)', lineHeight: 1.5, margin: '0 0 20px' }}>{subheading}</p>\n )}\n {ctaHref && ctaLabel && (\n <a href={ctaHref} style={{ display: 'inline-block', background: '#fff', color: '#09090b', padding: '8px 20px', borderRadius: '8px', fontWeight: 600, fontSize: '14px', textDecoration: 'none' }}>\n {ctaLabel}\n </a>\n )}\n </div>\n </div>\n );\n}\n\nexport function CtaStrip({ headline, primary, secondary, align = 'center' }: { headline: string; primary: { label: string; href: string }; secondary?: { label: string; href: string }; align?: Align }) {\n return (\n <div style={{ border: '1px solid var(--sp-border)', borderRadius: '12px', padding: '32px', textAlign: align, background: 'var(--sp-bg)' }}>\n <h3 style={{ fontSize: '24px', fontWeight: 700, color: 'var(--sp-text)', margin: '0 0 24px' }}>{headline}</h3>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: flexItems(align), gap: '16px', flexWrap: 'wrap' }}>\n <a href={primary.href} style={{ background: 'var(--sp-cta-bg)', color: 'var(--sp-cta-text)', padding: '10px 24px', borderRadius: '12px', fontWeight: 600, fontSize: '15px', textDecoration: 'none' }}>\n {primary.label}\n </a>\n {secondary && (\n <a href={secondary.href} style={{ fontSize: '15px', color: 'var(--sp-text-sub)', textDecoration: 'none' }}>\n {secondary.label} →\n </a>\n )}\n </div>\n </div>\n );\n}\n\n// ── Dispatch ──────────────────────────────────────────────────────────────────\n\nfunction renderSingle(item: ComponentAssembly[0], brand?: string, align?: Align): React.ReactNode {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const s = item.slots as Record<string, any> ?? {};\n\n switch (item.component as ComponentName) {\n case 'AnnouncementBar': return <AnnouncementBar text={s.text} link={s.link} />;\n case 'HeroStatement': return <HeroStatement headline={s.headline} subheading={s.subheading} align={align} />;\n // A full-width card has nothing beside it, so there is nothing for a clamp to protect.\n case 'AtomCard': return <AtomCard title={s.title} content={s.content} layout={s.layout} stats={s.stats} ctaText={s.ctaText} ctaUrl={s.ctaUrl} full={s.full || resolvedSize(item) === 'full'} />;\n case 'StatGrid': return <StatGrid stats={s.stats} caption={s.caption} />;\n case 'CodeBlock': return <CodeBlock code={s.code} lang={s.lang} caption={s.caption} />;\n case 'ComparisonTable': return <ComparisonTable brand={s.brand ?? brand} competitor={s.competitor} rows={s.rows} />;\n case 'FeatureList': return <FeatureList items={s.items} />;\n case 'TestimonialCard': return <TestimonialCard quote={s.quote} name={s.name} role={s.role} company={s.company} />;\n case 'ImageCtaHero': return <ImageCtaHero src={s.src} alt={s.alt} headline={s.headline} subheading={s.subheading} ctaLabel={s.ctaLabel} ctaHref={s.ctaHref} align={align} />;\n case 'CtaStrip': return <CtaStrip headline={s.headline} primary={s.primary} secondary={s.secondary} align={align} />;\n // An unrecognised component name used to render nothing at all. A component needs a\n // renderer in three places plus the WordPress plugin, so missing one made its content\n // silently absent on that surface only: no error, no warning, just a shorter page that\n // looks deliberate. That is the failure mode to remove before the registry grows.\n //\n // Falls back to AtomCard when the slots carry something readable, since almost every\n // component is built from an atom and title/content is the shape they share. When there\n // is genuinely nothing to show it still renders nothing, because an empty card is worse\n // than a gap, but the warning fires either way.\n default: {\n console.warn(`[spectare] ComponentRenderer: no renderer for \"${item.component}\", falling back to AtomCard`);\n if (!s.title && !s.content) return null;\n return <AtomCard title={s.title} content={s.content} stats={s.stats} ctaText={s.ctaText} ctaUrl={s.ctaUrl} full />;\n }\n }\n}\n\n// ── Layout ────────────────────────────────────────────────────────────────────\n\nfunction resolvedSize(item: ComponentAssembly[0]): 'full' | 'half' {\n if (item.size) return item.size;\n return HALF_COMPONENTS.has(item.component as ComponentName) ? 'half' : 'full';\n}\n\ntype LayoutGroup =\n | { type: 'full'; item: ComponentAssembly[0] }\n | { type: 'pair'; items: [ComponentAssembly[0], ComponentAssembly[0]] }\n | { type: 'half-solo'; item: ComponentAssembly[0] };\n\nfunction buildLayout(assembly: ComponentAssembly): LayoutGroup[] {\n const groups: LayoutGroup[] = [];\n let i = 0;\n while (i < assembly.length) {\n const cur = assembly[i];\n const next = assembly[i + 1];\n if (resolvedSize(cur) === 'half' && next && resolvedSize(next) === 'half') {\n groups.push({ type: 'pair', items: [cur, next] });\n i += 2;\n } else if (resolvedSize(cur) === 'half') {\n groups.push({ type: 'half-solo', item: cur });\n i++;\n } else {\n groups.push({ type: 'full', item: cur });\n i++;\n }\n }\n return groups;\n}\n\n// ── X-ray badge ───────────────────────────────────────────────────────────────\n\nfunction XrayBadge({ name, size }: { name: string; size: string }) {\n return (\n <div style={{ position: 'absolute', top: '8px', left: '8px', zIndex: 10, display: 'flex', alignItems: 'center', gap: '6px', pointerEvents: 'none', userSelect: 'none' }}>\n <span style={{ fontSize: '10px', fontFamily: 'monospace', background: 'rgba(59,130,246,0.9)', color: '#fff', padding: '2px 6px', borderRadius: '4px', lineHeight: 1 }}>{name}</span>\n <span style={{ fontSize: '10px', fontFamily: 'monospace', color: '#71717a', lineHeight: 1 }}>{size}</span>\n </div>\n );\n}\n\n// ── Main export ───────────────────────────────────────────────────────────────\n\nexport interface ComponentRendererProps {\n assembly: ComponentAssembly;\n /** Your brand name, used as the left column header in ComparisonTable. Defaults to \"Us\". */\n brand?: string;\n /** Overlay a component name badge on each item. Useful for demos and debugging. */\n xray?: boolean;\n /** Render only components assigned to this zone. */\n zone?: AssemblyZone;\n /**\n * Alignment for statement-style components (HeroStatement, CtaStrip, ImageCtaHero),\n * so assembled content can match the host page. Omit to use each component's natural\n * default (HeroStatement left, CtaStrip centered).\n */\n align?: 'left' | 'center' | 'right';\n /**\n * Brand accent, as an explicit input rather than a custom property you override and hope\n * wins on tag order. Any CSS colour. `--sp-accent-bg` and `--sp-accent-border` are derived\n * from it, so one value covers all three. Defaults to #60a5fa.\n */\n accent?: string;\n}\n\n\nexport function ComponentRenderer({ assembly, brand, xray = false, zone, align, accent }: ComponentRendererProps) {\n const filtered = zone ? filterAssemblyByZone(assembly, zone) : assembly;\n const layout = buildLayout(filtered);\n\n return (\n <div className={SP_ROOT} style={{ display: 'flex', flexDirection: 'column', gap: '20px', fontSize: '16px' }}>\n <style dangerouslySetInnerHTML={{ __html: buildTokenCss({ accent }) }} />\n {layout.map((group, i) => {\n if (group.type === 'full') {\n return (\n <div key={i} style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.item.component} size=\"full\" />}\n {renderSingle(group.item, brand, align)}\n </div>\n );\n }\n if (group.type === 'pair') {\n return (\n <div key={i} className=\"sp-pair\">\n <div style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.items[0].component} size=\"half\" />}\n {renderSingle(group.items[0], brand, align)}\n </div>\n <div style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.items[1].component} size=\"half\" />}\n {renderSingle(group.items[1], brand, align)}\n </div>\n </div>\n );\n }\n return (\n <div key={i} style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.item.component} size=\"full\" />}\n {renderSingle(group.item, brand, align)}\n </div>\n );\n })}\n </div>\n );\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { ComponentRenderer } from './ComponentRenderer';\nimport { filterAssemblyByZone } from './types';\nimport type { ComponentAssembly, AssemblyZone } from './types';\n\ntype ConversionCheckResult =\n | { matched: false }\n | { matched: true; goalName: string | null; goalType: string; valueSelector: string | null; currencySelector: string | null; defaultCurrency: string };\n\n// The arrangement this visitor saw, kept per-org in sessionStorage so a conversion fired on a\n// later page can attribute itself to it. Shares its key with spectare.js and the SSR\n// VariantTracker, so whichever surface rendered last wins, which is the arrangement the\n// visitor actually saw.\nconst VARIANT_KEY = (orgSlug: string) => `_spectare_variant_${orgSlug}`;\n\nfunction readVariantId(orgSlug: string): string | null {\n try { return sessionStorage.getItem(VARIANT_KEY(orgSlug)); } catch { return null; }\n}\n\nfunction writeVariantId(orgSlug: string, variantId: string): void {\n try { sessionStorage.setItem(VARIANT_KEY(orgSlug), variantId); } catch { /* private browsing */ }\n}\n\n\nfunction buildSummary(pageHint: string, orgSlug: string): string {\n const parts: string[] = [pageHint];\n const referrer = document.referrer;\n if (referrer) parts.push(`Arrived from: ${referrer}`);\n const p = new URLSearchParams(window.location.search);\n const source = p.get('utm_source');\n const medium = p.get('utm_medium');\n const campaign = p.get('utm_campaign');\n const term = p.get('utm_term');\n if (source) parts.push(`Source: ${source}`);\n if (medium) parts.push(`Medium: ${medium}`);\n if (campaign) parts.push(`Campaign: ${campaign}`);\n if (term) parts.push(`Search term: ${term}`);\n try {\n const history = localStorage.getItem(`_spectare_visits_${orgSlug}`);\n if (history) parts.push(`Previously visited: ${history}`);\n } catch { /* private browsing */ }\n return parts.filter(Boolean).join('. ');\n}\n\n// Reconstructs the visitor's page journey from spectare.js visit history.\nfunction readVisitPath(orgSlug: string): string[] {\n try {\n const raw = JSON.parse(localStorage.getItem(`_spectare_visits_${orgSlug}`) || '[]') as Array<{ path?: string }>;\n const path: string[] = [];\n for (const v of raw) {\n if (typeof v?.path === 'string' && (!path.length || path[path.length - 1] !== v.path)) path.push(v.path);\n }\n const cur = window.location.pathname;\n if (!path.length || path[path.length - 1] !== cur) path.push(cur);\n return path;\n } catch { return []; }\n}\n\nfunction Shimmer() {\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>\n <div style={{ height: '20px', background: 'rgba(39,39,42,0.6)', borderRadius: '8px', width: '75%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '14px', background: 'rgba(39,39,42,0.4)', borderRadius: '8px', width: '100%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '14px', background: 'rgba(39,39,42,0.4)', borderRadius: '8px', width: '83%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '14px', background: 'rgba(39,39,42,0.4)', borderRadius: '8px', width: '67%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n </div>\n );\n}\n\nexport interface PersonalisedSectionProps {\n orgSlug: string;\n /** Base URL of your Spectare instance. Defaults to 'https://spectare.ai'. */\n baseUrl?: string;\n /** Your brand name, used in ComparisonTable column header. */\n brand?: string;\n pageHint?: string;\n className?: string;\n style?: React.CSSProperties;\n initialAssembly?: ComponentAssembly;\n initialIntent?: { audience: string; stage: string };\n /**\n * Seed conversion attribution with a server-rendered arrangement: pass the variantId that\n * /api/assemble/ssr returned alongside initialAssembly. Without it, a visit where the client\n * classification matches the server's (so no client render happens) has no variant for a\n * later conversion to credit.\n */\n initialVariantId?: string;\n /**\n * Explicit visitor-typed context (e.g. a demo input box). Bypasses the session token cache\n * and re-qualifies immediately with the direct flag, which the server cost-caps (cheaper\n * model on a cache miss) and never writes to the shared cache.\n */\n directSummary?: string;\n /** Render only components assigned to this zone. */\n zone?: AssemblyZone;\n /** Alignment for statement-style components, to match the host page. */\n align?: 'left' | 'center' | 'right';\n /**\n * Brand accent. Passed through to ComponentRenderer, which emits it into the scoped\n * token set. Defaults to #60a5fa.\n */\n accent?: string;\n}\n\nexport function PersonalisedSection({\n orgSlug,\n baseUrl = 'https://spectare.ai',\n brand,\n pageHint,\n className,\n style,\n initialAssembly,\n initialIntent,\n initialVariantId,\n directSummary,\n zone,\n align,\n accent,\n}: PersonalisedSectionProps) {\n const [assembly, setAssembly] = useState<ComponentAssembly>(initialAssembly ?? []);\n const [loading, setLoading] = useState(!initialAssembly);\n const [orgName, setOrgName] = useState<string | undefined>(undefined);\n const [debugMode, setDebugMode] = useState(false);\n const [debugIntent, setDebugIntent] = useState<{ audience: string; stage: string } | null>(null);\n const tokenRef = useRef<string | null>(null);\n const conversionFiredRef = useRef(false);\n\n useEffect(() => {\n setDebugMode(new URLSearchParams(window.location.search).has('spectare_debug'));\n if (initialIntent) setDebugIntent(initialIntent);\n }, [initialIntent]);\n\n // Seed sessionStorage with the server-rendered variantId so conversions attribute correctly\n // even when the client assembly matches the SSR one and no client fetch replaces it.\n useEffect(() => {\n if (initialVariantId) writeVariantId(orgSlug, initialVariantId);\n }, [orgSlug, initialVariantId]);\n\n useEffect(() => {\n let cancelled = false;\n\n async function load() {\n try {\n let token: string | null = null;\n\n if (directSummary) {\n // Explicit visitor input: skip the token cache, re-qualify immediately with direct.\n setLoading(true);\n setAssembly([]);\n const res = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary: directSummary, direct: true }),\n });\n if (!res.ok || cancelled) { setLoading(false); return; }\n const data = await res.json();\n token = (data.token as string | undefined) ?? null;\n } else {\n // Key includes UTM params so a visitor arriving via a campaign link always\n // re-qualifies rather than reusing a token from a prior session context.\n const p = new URLSearchParams(window.location.search);\n const utmSuffix = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term']\n .map(k => p.get(k) ?? '').filter(Boolean).join('_');\n const tokenKey = `_spectare_token_${orgSlug}${utmSuffix ? '_' + utmSuffix : ''}`;\n token = sessionStorage.getItem(tokenKey);\n\n if (!token) {\n const summary = buildSummary(pageHint ?? `Visiting ${document.title}`, orgSlug);\n const res = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!res.ok || cancelled) { setLoading(false); return; }\n const data = await res.json();\n token = data.token as string | undefined ?? null;\n if (token) sessionStorage.setItem(tokenKey, token);\n if (data.orgName) setOrgName(data.orgName as string);\n }\n }\n\n if (!token || cancelled) { setLoading(false); return; }\n\n tokenRef.current = token;\n let res = await fetch(`${baseUrl}/api/assemble/components`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n // Direct: flag it so the server cost-caps the build, and omit the seen-variant\n // exclusion so it can read the shared cache instead of forcing a fresh build.\n body: JSON.stringify(\n directSummary\n ? { token, orgSlug, direct: true }\n : { token, orgSlug, excludeVariantId: readVariantId(orgSlug) },\n ),\n });\n\n if (res.status === 401 && !cancelled && !directSummary) {\n // Cached token expired: clear it, re-qualify, and retry once.\n const p = new URLSearchParams(window.location.search);\n const utmSuffix = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term']\n .map(k => p.get(k) ?? '').filter(Boolean).join('_');\n const tokenKey = `_spectare_token_${orgSlug}${utmSuffix ? '_' + utmSuffix : ''}`;\n sessionStorage.removeItem(tokenKey);\n const summary = buildSummary(pageHint ?? `Visiting ${document.title}`, orgSlug);\n const qRes = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!qRes.ok || cancelled) { setLoading(false); return; }\n const qData = await qRes.json();\n token = qData.token as string | undefined ?? null;\n if (token) {\n sessionStorage.setItem(tokenKey, token);\n tokenRef.current = token;\n }\n if (!token || cancelled) { setLoading(false); return; }\n res = await fetch(`${baseUrl}/api/assemble/components`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token, orgSlug, excludeVariantId: readVariantId(orgSlug) }),\n });\n }\n\n if (!res.ok || cancelled) { setLoading(false); return; }\n\n const contentType = res.headers.get('content-type') ?? '';\n\n if (contentType.includes('text/event-stream')) {\n // Cold path: stream components as Claude generates them.\n // Render progressively — shimmer shows until the first component arrives.\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let buf = '';\n let loadingCleared = false;\n try {\n while (!cancelled) {\n const { done, value } = await reader.read();\n if (done || cancelled) break;\n buf += decoder.decode(value, { stream: true });\n const lines = buf.split('\\n');\n buf = lines.pop() ?? '';\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const payload = line.slice(6).trim();\n if (payload === '[DONE]') break;\n try {\n const parsed = JSON.parse(payload) as Record<string, unknown>;\n // Control frames: {_variant} carries attribution, {_error} means the stream\n // died server-side. Neither is a component; pushing them into the assembly\n // recorded a phantom entry the renderer silently skipped.\n if (parsed._variant && typeof parsed._variant === 'string') {\n writeVariantId(orgSlug, parsed._variant);\n continue;\n }\n if (parsed._error) {\n if (!loadingCleared) { setLoading(false); loadingCleared = true; }\n continue;\n }\n if (!parsed.component) continue;\n const comp = parsed as unknown as ComponentAssembly[0];\n if (!loadingCleared) { setLoading(false); loadingCleared = true; }\n setAssembly(prev => [...prev, comp]);\n } catch { /* malformed event — skip */ }\n }\n }\n } finally {\n reader.cancel().catch(() => {});\n }\n } else {\n // Warm path: cache hit returns full JSON immediately.\n const data = await res.json() as {\n assembly?: ComponentAssembly;\n intent?: { userContext?: { audience?: string; stage?: string } };\n variantId?: string;\n };\n if (data.variantId) writeVariantId(orgSlug, data.variantId);\n\n if (cancelled) return;\n\n const clientAudience = data.intent?.userContext?.audience;\n const clientStage = data.intent?.userContext?.stage;\n const ssrMatches =\n initialIntent &&\n clientAudience === initialIntent.audience &&\n clientStage === initialIntent.stage;\n\n if (clientAudience && clientStage) {\n setDebugIntent({ audience: clientAudience, stage: clientStage });\n }\n\n if (!ssrMatches && Array.isArray(data.assembly) && data.assembly.length > 0) {\n setAssembly(data.assembly as ComponentAssembly);\n }\n }\n } catch {\n // fail silently\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n\n load();\n return () => { cancelled = true; };\n }, [orgSlug, baseUrl, pageHint, initialAssembly, initialIntent, directSummary]);\n\n useEffect(() => {\n if (!assembly.length || conversionFiredRef.current) return;\n const token = tokenRef.current;\n if (!token) return;\n const url = window.location.href;\n fetch(`${baseUrl}/api/conversion-check`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ orgSlug, url }),\n }).then(r => r.json() as Promise<ConversionCheckResult>).then(data => {\n if (!data.matched) return;\n conversionFiredRef.current = true;\n let goalValue: number | null = null;\n let goalCurrency: string | null = data.defaultCurrency;\n if (data.valueSelector) {\n try {\n const el = document.querySelector(data.valueSelector);\n if (el) {\n const num = parseFloat((el.textContent ?? '').trim().replace(/[^0-9.]/g, ''));\n if (!isNaN(num)) goalValue = num;\n }\n } catch { /* skip */ }\n }\n if (data.currencySelector) {\n try {\n const el = document.querySelector(data.currencySelector);\n if (el) goalCurrency = (el.textContent ?? '').trim() || goalCurrency;\n } catch { /* skip */ }\n }\n const atomsShown = [...new Set(assembly.flatMap(i => i.sourceAtomIds ?? []))];\n const visitPath = readVisitPath(orgSlug);\n fetch(`${baseUrl}/api/conversion`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n token,\n orgSlug,\n url,\n variantId: readVariantId(orgSlug),\n ...(atomsShown.length ? { atomsShown } : {}),\n ...(visitPath.length > 1 ? { visitPath } : {}),\n ...(data.goalName ? { goalName: data.goalName } : {}),\n ...(goalValue !== null ? { goalValue, goalCurrency } : {}),\n }),\n }).catch(() => {});\n }).catch(() => {});\n }, [assembly, orgSlug, baseUrl]);\n\n if (!loading && assembly.length === 0) return null;\n\n // ?spectare_debug outlines the section and names the classified intent, so anyone checking\n // an integration can see where personalisation lands and what the visitor was read as.\n const debugStyle = debugMode\n ? { outline: '2px solid rgba(96,165,250,0.5)', borderRadius: '0.5rem', position: 'relative' as const, padding: '0.5rem', ...style }\n : style;\n\n return (\n <>\n <style dangerouslySetInnerHTML={{ __html: '@keyframes sp-pulse{0%,100%{opacity:1}50%{opacity:0.4}}' }} />\n <div className={className} style={debugStyle}>\n {debugMode && (\n <div style={{ position: 'absolute', top: '-1px', right: '-1px', zIndex: 20, display: 'flex', alignItems: 'center', gap: '0.375rem', background: 'rgba(96,165,250,0.9)', borderRadius: '0 0.5rem 0 0.375rem', padding: '0.25rem 0.625rem', fontSize: '0.625rem', fontFamily: 'monospace', color: '#fff', pointerEvents: 'none', userSelect: 'none' }}>\n Personalised by Spectare\n {debugIntent && (\n <span style={{ opacity: 0.75 }}>\n {' '}{debugIntent.audience}/{debugIntent.stage}\n </span>\n )}\n </div>\n )}\n {loading && assembly.length === 0\n ? <Shimmer />\n : <ComponentRenderer assembly={zone ? filterAssemblyByZone(assembly, zone) : assembly} brand={brand ?? orgName} align={align} accent={accent} />}\n </div>\n </>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/PersonalisedSection.tsx","../src/ComponentRenderer.tsx","../src/types.ts","../src/tokens.ts"],"sourcesContent":["export { PersonalisedSection } from './PersonalisedSection';\nexport { ComponentRenderer } from './ComponentRenderer';\nexport { filterAssemblyByZone } from './types';\n\n// Design tokens. Exported so a host composing the individual components below can emit the same\n// scoped token set the renderer does, and so the Spectare app's server renderer shares one\n// definition with this package rather than mirroring it.\nexport { buildTokenCss, DEFAULT_ACCENT, SP_ROOT } from './tokens';\nexport type { PersonalisedSectionProps } from './PersonalisedSection';\nexport type { ComponentRendererProps } from './ComponentRenderer';\nexport type { ComponentAssembly, ComponentName, AssemblyZone } from './types';\n\n// The nine assembly components, exported individually so a host can compose its own layout\n// rather than handing ComponentRenderer a whole assembly. ComponentRenderer remains the normal\n// path; these are for custom layouts, and for design tooling that needs to place one at a time.\nexport {\n AnnouncementBar,\n HeroStatement,\n AtomCard,\n StatGrid,\n CodeBlock,\n ComparisonTable,\n FeatureList,\n TestimonialCard,\n ImageCtaHero,\n CtaStrip,\n} from './ComponentRenderer';\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { ComponentRenderer } from './ComponentRenderer';\nimport { filterAssemblyByZone } from './types';\nimport type { ComponentAssembly, AssemblyZone } from './types';\n\ntype ConversionCheckResult =\n | { matched: false }\n | { matched: true; goalName: string | null; goalType: string; valueSelector: string | null; currencySelector: string | null; defaultCurrency: string };\n\n// The arrangement this visitor saw, kept per-org in sessionStorage so a conversion fired on a\n// later page can attribute itself to it. Shares its key with spectare.js and the SSR\n// VariantTracker, so whichever surface rendered last wins, which is the arrangement the\n// visitor actually saw.\nconst VARIANT_KEY = (orgSlug: string) => `_spectare_variant_${orgSlug}`;\n\nfunction readVariantId(orgSlug: string): string | null {\n try { return sessionStorage.getItem(VARIANT_KEY(orgSlug)); } catch { return null; }\n}\n\nfunction writeVariantId(orgSlug: string, variantId: string): void {\n try { sessionStorage.setItem(VARIANT_KEY(orgSlug), variantId); } catch { /* private browsing */ }\n}\n\n\nfunction buildSummary(pageHint: string, orgSlug: string): string {\n const parts: string[] = [pageHint];\n const referrer = document.referrer;\n if (referrer) parts.push(`Arrived from: ${referrer}`);\n const p = new URLSearchParams(window.location.search);\n const source = p.get('utm_source');\n const medium = p.get('utm_medium');\n const campaign = p.get('utm_campaign');\n const term = p.get('utm_term');\n if (source) parts.push(`Source: ${source}`);\n if (medium) parts.push(`Medium: ${medium}`);\n if (campaign) parts.push(`Campaign: ${campaign}`);\n if (term) parts.push(`Search term: ${term}`);\n try {\n const history = localStorage.getItem(`_spectare_visits_${orgSlug}`);\n if (history) parts.push(`Previously visited: ${history}`);\n } catch { /* private browsing */ }\n return parts.filter(Boolean).join('. ');\n}\n\n// Reconstructs the visitor's page journey from spectare.js visit history.\nfunction readVisitPath(orgSlug: string): string[] {\n try {\n const raw = JSON.parse(localStorage.getItem(`_spectare_visits_${orgSlug}`) || '[]') as Array<{ path?: string }>;\n const path: string[] = [];\n for (const v of raw) {\n if (typeof v?.path === 'string' && (!path.length || path[path.length - 1] !== v.path)) path.push(v.path);\n }\n const cur = window.location.pathname;\n if (!path.length || path[path.length - 1] !== cur) path.push(cur);\n return path;\n } catch { return []; }\n}\n\nfunction Shimmer() {\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>\n <div style={{ height: '20px', background: 'rgba(39,39,42,0.6)', borderRadius: '8px', width: '75%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '14px', background: 'rgba(39,39,42,0.4)', borderRadius: '8px', width: '100%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '14px', background: 'rgba(39,39,42,0.4)', borderRadius: '8px', width: '83%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '14px', background: 'rgba(39,39,42,0.4)', borderRadius: '8px', width: '67%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n </div>\n );\n}\n\nexport interface PersonalisedSectionProps {\n orgSlug: string;\n /** Base URL of your Spectare instance. Defaults to 'https://spectare.ai'. */\n baseUrl?: string;\n /** Your brand name, used in ComparisonTable column header. */\n brand?: string;\n pageHint?: string;\n className?: string;\n style?: React.CSSProperties;\n initialAssembly?: ComponentAssembly;\n initialIntent?: { audience: string; stage: string };\n /**\n * Seed conversion attribution with a server-rendered arrangement: pass the variantId that\n * /api/assemble/ssr returned alongside initialAssembly. Without it, a visit where the client\n * classification matches the server's (so no client render happens) has no variant for a\n * later conversion to credit.\n */\n initialVariantId?: string;\n /**\n * Explicit visitor-typed context (e.g. a demo input box). Bypasses the session token cache\n * and re-qualifies immediately with the direct flag, which the server cost-caps (cheaper\n * model on a cache miss) and never writes to the shared cache.\n */\n directSummary?: string;\n /** Render only components assigned to this zone. */\n zone?: AssemblyZone;\n /** Alignment for statement-style components, to match the host page. */\n align?: 'left' | 'center' | 'right';\n /**\n * Brand accent. Passed through to ComponentRenderer, which emits it into the scoped\n * token set. Defaults to #60a5fa (dark) or #2563eb (light).\n */\n accent?: string;\n /** dark (default) or light, matching your page's ground. See ComponentRenderer. */\n theme?: 'dark' | 'light';\n}\n\nexport function PersonalisedSection({\n orgSlug,\n baseUrl = 'https://spectare.ai',\n brand,\n pageHint,\n className,\n style,\n initialAssembly,\n initialIntent,\n initialVariantId,\n directSummary,\n zone,\n align,\n accent,\n theme,\n}: PersonalisedSectionProps) {\n const [assembly, setAssembly] = useState<ComponentAssembly>(initialAssembly ?? []);\n const [loading, setLoading] = useState(!initialAssembly);\n const [orgName, setOrgName] = useState<string | undefined>(undefined);\n const [debugMode, setDebugMode] = useState(false);\n const [debugIntent, setDebugIntent] = useState<{ audience: string; stage: string } | null>(null);\n const tokenRef = useRef<string | null>(null);\n const conversionFiredRef = useRef(false);\n\n useEffect(() => {\n setDebugMode(new URLSearchParams(window.location.search).has('spectare_debug'));\n if (initialIntent) setDebugIntent(initialIntent);\n }, [initialIntent]);\n\n // Seed sessionStorage with the server-rendered variantId so conversions attribute correctly\n // even when the client assembly matches the SSR one and no client fetch replaces it.\n useEffect(() => {\n if (initialVariantId) writeVariantId(orgSlug, initialVariantId);\n }, [orgSlug, initialVariantId]);\n\n useEffect(() => {\n let cancelled = false;\n\n async function load() {\n try {\n let token: string | null = null;\n\n if (directSummary) {\n // Explicit visitor input: skip the token cache, re-qualify immediately with direct.\n setLoading(true);\n setAssembly([]);\n const res = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary: directSummary, direct: true }),\n });\n if (!res.ok || cancelled) { setLoading(false); return; }\n const data = await res.json();\n token = (data.token as string | undefined) ?? null;\n } else {\n // Key includes UTM params so a visitor arriving via a campaign link always\n // re-qualifies rather than reusing a token from a prior session context.\n const p = new URLSearchParams(window.location.search);\n const utmSuffix = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term']\n .map(k => p.get(k) ?? '').filter(Boolean).join('_');\n const tokenKey = `_spectare_token_${orgSlug}${utmSuffix ? '_' + utmSuffix : ''}`;\n token = sessionStorage.getItem(tokenKey);\n\n if (!token) {\n const summary = buildSummary(pageHint ?? `Visiting ${document.title}`, orgSlug);\n const res = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!res.ok || cancelled) { setLoading(false); return; }\n const data = await res.json();\n token = data.token as string | undefined ?? null;\n if (token) sessionStorage.setItem(tokenKey, token);\n if (data.orgName) setOrgName(data.orgName as string);\n }\n }\n\n if (!token || cancelled) { setLoading(false); return; }\n\n tokenRef.current = token;\n let res = await fetch(`${baseUrl}/api/assemble/components`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n // Direct: flag it so the server cost-caps the build, and omit the seen-variant\n // exclusion so it can read the shared cache instead of forcing a fresh build.\n body: JSON.stringify(\n directSummary\n ? { token, orgSlug, direct: true }\n : { token, orgSlug, excludeVariantId: readVariantId(orgSlug) },\n ),\n });\n\n if (res.status === 401 && !cancelled && !directSummary) {\n // Cached token expired: clear it, re-qualify, and retry once.\n const p = new URLSearchParams(window.location.search);\n const utmSuffix = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term']\n .map(k => p.get(k) ?? '').filter(Boolean).join('_');\n const tokenKey = `_spectare_token_${orgSlug}${utmSuffix ? '_' + utmSuffix : ''}`;\n sessionStorage.removeItem(tokenKey);\n const summary = buildSummary(pageHint ?? `Visiting ${document.title}`, orgSlug);\n const qRes = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!qRes.ok || cancelled) { setLoading(false); return; }\n const qData = await qRes.json();\n token = qData.token as string | undefined ?? null;\n if (token) {\n sessionStorage.setItem(tokenKey, token);\n tokenRef.current = token;\n }\n if (!token || cancelled) { setLoading(false); return; }\n res = await fetch(`${baseUrl}/api/assemble/components`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token, orgSlug, excludeVariantId: readVariantId(orgSlug) }),\n });\n }\n\n if (!res.ok || cancelled) { setLoading(false); return; }\n\n const contentType = res.headers.get('content-type') ?? '';\n\n if (contentType.includes('text/event-stream')) {\n // Cold path: stream components as Claude generates them.\n // Render progressively — shimmer shows until the first component arrives.\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let buf = '';\n let loadingCleared = false;\n try {\n while (!cancelled) {\n const { done, value } = await reader.read();\n if (done || cancelled) break;\n buf += decoder.decode(value, { stream: true });\n const lines = buf.split('\\n');\n buf = lines.pop() ?? '';\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const payload = line.slice(6).trim();\n if (payload === '[DONE]') break;\n try {\n const parsed = JSON.parse(payload) as Record<string, unknown>;\n // Control frames: {_variant} carries attribution, {_error} means the stream\n // died server-side. Neither is a component; pushing them into the assembly\n // recorded a phantom entry the renderer silently skipped.\n if (parsed._variant && typeof parsed._variant === 'string') {\n writeVariantId(orgSlug, parsed._variant);\n continue;\n }\n if (parsed._error) {\n if (!loadingCleared) { setLoading(false); loadingCleared = true; }\n continue;\n }\n if (!parsed.component) continue;\n const comp = parsed as unknown as ComponentAssembly[0];\n if (!loadingCleared) { setLoading(false); loadingCleared = true; }\n setAssembly(prev => [...prev, comp]);\n } catch { /* malformed event — skip */ }\n }\n }\n } finally {\n reader.cancel().catch(() => {});\n }\n } else {\n // Warm path: cache hit returns full JSON immediately.\n const data = await res.json() as {\n assembly?: ComponentAssembly;\n intent?: { userContext?: { audience?: string; stage?: string } };\n variantId?: string;\n };\n if (data.variantId) writeVariantId(orgSlug, data.variantId);\n\n if (cancelled) return;\n\n const clientAudience = data.intent?.userContext?.audience;\n const clientStage = data.intent?.userContext?.stage;\n const ssrMatches =\n initialIntent &&\n clientAudience === initialIntent.audience &&\n clientStage === initialIntent.stage;\n\n if (clientAudience && clientStage) {\n setDebugIntent({ audience: clientAudience, stage: clientStage });\n }\n\n if (!ssrMatches && Array.isArray(data.assembly) && data.assembly.length > 0) {\n setAssembly(data.assembly as ComponentAssembly);\n }\n }\n } catch {\n // fail silently\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n\n load();\n return () => { cancelled = true; };\n }, [orgSlug, baseUrl, pageHint, initialAssembly, initialIntent, directSummary]);\n\n useEffect(() => {\n if (!assembly.length || conversionFiredRef.current) return;\n const token = tokenRef.current;\n if (!token) return;\n const url = window.location.href;\n fetch(`${baseUrl}/api/conversion-check`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ orgSlug, url }),\n }).then(r => r.json() as Promise<ConversionCheckResult>).then(data => {\n if (!data.matched) return;\n conversionFiredRef.current = true;\n let goalValue: number | null = null;\n let goalCurrency: string | null = data.defaultCurrency;\n if (data.valueSelector) {\n try {\n const el = document.querySelector(data.valueSelector);\n if (el) {\n const num = parseFloat((el.textContent ?? '').trim().replace(/[^0-9.]/g, ''));\n if (!isNaN(num)) goalValue = num;\n }\n } catch { /* skip */ }\n }\n if (data.currencySelector) {\n try {\n const el = document.querySelector(data.currencySelector);\n if (el) goalCurrency = (el.textContent ?? '').trim() || goalCurrency;\n } catch { /* skip */ }\n }\n const atomsShown = [...new Set(assembly.flatMap(i => i.sourceAtomIds ?? []))];\n const visitPath = readVisitPath(orgSlug);\n fetch(`${baseUrl}/api/conversion`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n token,\n orgSlug,\n url,\n variantId: readVariantId(orgSlug),\n ...(atomsShown.length ? { atomsShown } : {}),\n ...(visitPath.length > 1 ? { visitPath } : {}),\n ...(data.goalName ? { goalName: data.goalName } : {}),\n ...(goalValue !== null ? { goalValue, goalCurrency } : {}),\n }),\n }).catch(() => {});\n }).catch(() => {});\n }, [assembly, orgSlug, baseUrl]);\n\n if (!loading && assembly.length === 0) return null;\n\n // ?spectare_debug outlines the section and names the classified intent, so anyone checking\n // an integration can see where personalisation lands and what the visitor was read as.\n const debugStyle = debugMode\n ? { outline: '2px solid rgba(96,165,250,0.5)', borderRadius: '0.5rem', position: 'relative' as const, padding: '0.5rem', ...style }\n : style;\n\n return (\n <>\n <style dangerouslySetInnerHTML={{ __html: '@keyframes sp-pulse{0%,100%{opacity:1}50%{opacity:0.4}}' }} />\n <div className={className} style={debugStyle}>\n {debugMode && (\n <div style={{ position: 'absolute', top: '-1px', right: '-1px', zIndex: 20, display: 'flex', alignItems: 'center', gap: '0.375rem', background: 'rgba(96,165,250,0.9)', borderRadius: '0 0.5rem 0 0.375rem', padding: '0.25rem 0.625rem', fontSize: '0.625rem', fontFamily: 'monospace', color: '#fff', pointerEvents: 'none', userSelect: 'none' }}>\n Personalised by Spectare\n {debugIntent && (\n <span style={{ opacity: 0.75 }}>\n {' '}{debugIntent.audience}/{debugIntent.stage}\n </span>\n )}\n </div>\n )}\n {loading && assembly.length === 0\n ? <Shimmer />\n : <ComponentRenderer assembly={zone ? filterAssemblyByZone(assembly, zone) : assembly} brand={brand ?? orgName} align={align} accent={accent} theme={theme} />}\n </div>\n </>\n );\n}\n","// Universal renderer: deliberately NO 'use client' in this source file. Nothing here uses hooks, state, or event\n// handlers, so the same file renders as a React Server Component (zero JS shipped, how the\n// Spectare app uses it via components/ServerAssemblyRenderer.tsx) and inside a client tree\n// (how PersonalisedSection uses it). Adding a hook or handler here would silently force every\n// server consumer to ship and hydrate it: keep interactivity in wrappers.\n//\n// Sizing is numeric, scaled through u(): px for embedded hosts (predictable inside arbitrary\n// pages) or rem for hosts that want to track the reader's font-size preference (the Spectare\n// site). Until 2026-08-31 the rem variant was a hand-maintained mirror of this file, and the\n// two drifted a pixel apart in six places; one number set, one scale function, no mirror.\nimport { marked } from 'marked';\nimport DOMPurify from 'isomorphic-dompurify';\nimport { filterAssemblyByZone, COMPONENT_CATEGORIES } from './types';\nimport { buildTokenCss, SP_ROOT } from './tokens';\nimport type { SpTheme } from './tokens';\nimport type { ComponentAssembly, ComponentName, AssemblyZone } from './types';\n\n// The assembly API returns atom content as raw markdown. marked emits raw HTML,\n// so the output must be sanitised before it reaches dangerouslySetInnerHTML,\n// otherwise a malicious atom can run script in the host site's visitors' browsers.\nfunction renderMarkdown(content: string): string {\n const raw = marked.parse(content ?? '', { async: false }) as string;\n return DOMPurify.sanitize(raw, { USE_PROFILES: { html: true } });\n}\n\nexport type Unit = 'px' | 'rem';\ntype U = (n: number) => string;\nconst scaler = (unit: Unit): U => (n: number) => (unit === 'rem' ? `${n / 16}rem` : `${n}px`);\nconst PX = scaler('px');\n\n// Default half-size components: used when assembly item omits size.\nconst HALF_COMPONENTS = new Set<ComponentName>(['TestimonialCard']);\n\n// ── Individual component renderers ────────────────────────────────────────────\n\n// Alignment is a host decision, not baked into a component: the host passes `align`\n// and statement-style components adopt it. flexItems maps it to a flex alignment so\n// block children (a max-width subheading, an inline CTA) align too, not just the text.\ntype Align = 'left' | 'center' | 'right';\nconst flexItems = (a: Align): 'flex-start' | 'center' | 'flex-end' =>\n a === 'center' ? 'center' : a === 'right' ? 'flex-end' : 'flex-start';\n\n/**\n * A single line above everything else. Deliberately the plainest component in the set: no\n * heading, no image, no padding to speak of. A bar that draws attention to itself competes with\n * the page it is announcing something about.\n *\n * Uses the accent rather than a red or amber alert colour. This is a fact worth knowing, not a\n * warning, and a venue putting \"members book from Thursday\" in an alarm colour reads as a problem\n * rather than an offer.\n */\nexport function AnnouncementBar({ text, link, unit = 'px' }: { text?: string; link?: { label: string; href: string }; unit?: Unit }) {\n const u = scaler(unit);\n if (!text) return null;\n return (\n <div style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center', gap: u(10),\n flexWrap: 'wrap', textAlign: 'center',\n background: 'var(--sp-accent-bg)', border: '1px solid var(--sp-accent-border)',\n borderRadius: u(8), padding: `${u(8)} ${u(16)}`, fontSize: u(14), lineHeight: 1.4,\n color: 'var(--sp-text-sub)',\n }}>\n <span>{text}</span>\n {link?.href && link?.label && (\n <a href={link.href} style={{ color: 'var(--sp-accent)', fontWeight: 600, textDecoration: 'none', whiteSpace: 'nowrap' }}>\n {link.label} →\n </a>\n )}\n </div>\n );\n}\n\nexport function HeroStatement({ headline, subheading, align = 'left', unit = 'px' }: { headline: string; subheading?: string; align?: Align; unit?: Unit }) {\n const u = scaler(unit);\n return (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: flexItems(align), textAlign: align, paddingTop: u(24), paddingBottom: u(24) }}>\n <h2 style={{ fontSize: u(32), fontWeight: 700, letterSpacing: '-0.025em', lineHeight: 1.2, color: 'var(--sp-text)', margin: `0 0 ${u(12)}` }}>\n {headline}\n </h2>\n {subheading && (\n <p style={{ fontSize: u(18), color: 'var(--sp-text-sub)', lineHeight: 1.6, maxWidth: u(672), margin: 0 }}>{subheading}</p>\n )}\n </div>\n );\n}\n\n// The atom owns title / content / stats / cta; its layout decides which appear and in\n// what order. Default order when the atom has no layout. Mirrors the atom editor.\nconst ATOM_LAYOUT_DEFAULT = ['title', 'content', 'stats', 'cta'];\n\n// Clamp atom prose unless the assembly asked for the full body. CSS rather than an expand\n// toggle, so the identical rule works here (including server-rendered with no JS), in\n// spectare.js and in the WordPress plugin.\nexport const ATOM_CLAMP_LINES = 4;\nconst clampStyle = {\n display: '-webkit-box',\n WebkitLineClamp: ATOM_CLAMP_LINES,\n WebkitBoxOrient: 'vertical' as const,\n overflow: 'hidden',\n};\n\nexport function AtomCard(\n { title, content, summary, layout, stats = [], ctaText, ctaUrl, full, variant, unit = 'px' }:\n { title?: string; content?: string; summary?: string; layout?: string[]; stats?: { value: string; label: string }[]; ctaText?: string; ctaUrl?: string; full?: boolean; variant?: string; unit?: Unit },\n) {\n const u = scaler(unit);\n\n // The card face: title, one-sentence summary, and the full body behind a native <details>\n // disclosure. <details> is the one expand that needs no JavaScript, so it works identically\n // in a server component, a client tree, and any host page; nothing is ever unreachable on a\n // site that has no per-atom pages. The Spectare app substitutes its own card face (which\n // links to the atom's page) via renderOverride, so this is the everywhere-else rendering.\n if (variant === 'card') {\n const face = summary?.trim() || (content ? `${content.replace(/\\s+/g, ' ').split(/(?<=[.!?])\\s/)[0]}` : '');\n return (\n <div style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: u(12), padding: u(20) }}>\n {title && <h3 style={{ fontSize: u(16), fontWeight: 600, color: 'var(--sp-text)', margin: 0, lineHeight: 1.35 }}>{title}</h3>}\n {face && <p style={{ fontSize: u(15), color: 'var(--sp-text-sub)', lineHeight: 1.6, margin: `${u(8)} 0 0` }}>{face}</p>}\n {content && (\n <details style={{ marginTop: u(10) }}>\n <summary style={{ cursor: 'pointer', fontSize: u(13), fontWeight: 600, color: 'var(--sp-accent)', listStyle: 'none' }}>Read more</summary>\n <div className=\"sp-prose\" style={{ fontSize: u(15), color: 'var(--sp-text-sub)', lineHeight: 1.6, marginTop: u(10) }} dangerouslySetInnerHTML={{ __html: renderMarkdown(content) }} />\n </details>\n )}\n {ctaText && ctaUrl && (\n <a href={ctaUrl} style={{ display: 'inline-flex', alignItems: 'center', gap: u(4), marginTop: u(10), fontSize: u(13), fontWeight: 600, color: 'var(--sp-accent)', textDecoration: 'none' }}>{ctaText} →</a>\n )}\n </div>\n );\n }\n\n const order = layout && layout.length ? layout : ATOM_LAYOUT_DEFAULT;\n const element = (name: string) => {\n if (name === 'title') return title\n ? <h3 key=\"title\" style={{ fontSize: u(16), fontWeight: 600, color: 'var(--sp-text)', margin: `0 0 ${u(12)}` }}>{title}</h3> : null;\n if (name === 'content') return content\n ? <div key=\"content\" className=\"sp-prose\" style={{ fontSize: u(15), color: 'var(--sp-text-sub)', lineHeight: 1.6, ...(full ? {} : clampStyle) }} dangerouslySetInnerHTML={{ __html: renderMarkdown(content) }} /> : null;\n if (name === 'stats') return stats.length\n ? (\n <div key=\"stats\" style={{ display: 'flex', flexWrap: 'wrap', gap: u(20), margin: `0 0 ${u(12)}`, paddingBottom: u(12), borderBottom: '1px solid var(--sp-border)' }}>\n {stats.map((s, i) => (\n <div key={i} style={{ display: 'flex', flexDirection: 'column', gap: u(2) }}>\n <span style={{ fontSize: u(22), fontWeight: 700, color: 'var(--sp-text)', lineHeight: 1, fontVariantNumeric: 'tabular-nums' }}>{s.value}</span>\n <span style={{ fontSize: u(11), color: 'var(--sp-text-muted)', textTransform: 'uppercase', letterSpacing: '0.06em' }}>{s.label}</span>\n </div>\n ))}\n </div>\n ) : null;\n if (name === 'cta') return ctaText && ctaUrl\n ? <a key=\"cta\" href={ctaUrl} style={{ display: 'inline-flex', alignItems: 'center', gap: u(4), marginTop: u(12), fontSize: u(13), fontWeight: 600, color: 'var(--sp-accent)', textDecoration: 'none' }}>{ctaText} →</a> : null;\n return null;\n };\n return (\n <div style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: u(12), padding: u(24), height: '100%' }}>\n {order.map(element)}\n </div>\n );\n}\n\nexport function StatGrid({ stats = [], caption, unit = 'px' }: { stats?: { value: string; label: string }[]; caption?: string; unit?: Unit }) {\n const u = scaler(unit);\n const cols = stats.length === 2 ? 2 : stats.length === 3 ? 3 : 4;\n return (\n <div>\n <div style={{ display: 'grid', gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: u(12) }}>\n {stats.map(({ value, label }) => (\n <div key={label} style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: u(10), padding: `${u(16)} ${u(20)}`, display: 'flex', flexDirection: 'column', justifyContent: 'space-between', minHeight: u(88) }}>\n <p style={{ fontSize: u(11), color: 'var(--sp-text-muted)', textTransform: 'uppercase', letterSpacing: '0.06em', margin: `0 0 ${u(12)}`, lineHeight: 1.3 }}>{label}</p>\n <p style={{ fontSize: u(20), fontWeight: 500, color: 'var(--sp-text)', fontVariantNumeric: 'tabular-nums', lineHeight: 1, margin: 0 }}>{value}</p>\n </div>\n ))}\n </div>\n {caption && (\n <p style={{ fontSize: u(13), color: 'var(--sp-text-muted)', margin: `${u(12)} 0 0` }}>{caption}</p>\n )}\n </div>\n );\n}\n\nexport function CodeBlock({ code, lang = 'typescript', caption, unit = 'px' }: { code: string; lang?: string; caption?: string; unit?: Unit }) {\n const u = scaler(unit);\n return (\n <div style={{ borderRadius: u(12), overflow: 'hidden', border: '1px solid var(--sp-border)' }}>\n <div style={{ background: 'var(--sp-bg)', padding: `${u(10)} ${u(16)}`, display: 'flex', alignItems: 'center', justifyContent: 'space-between', borderBottom: '1px solid var(--sp-border)' }}>\n <span style={{ fontSize: u(12), color: 'var(--sp-text-muted)', fontFamily: 'monospace' }}>{lang}</span>\n {caption && <span style={{ fontSize: u(12), color: 'var(--sp-text-muted)' }}>{caption}</span>}\n </div>\n <pre style={{ background: 'var(--sp-surface)', padding: u(20), fontSize: u(13), color: 'var(--sp-text-sub)', overflowX: 'auto', lineHeight: 1.6, fontFamily: 'monospace', whiteSpace: 'pre', margin: 0 }}>\n {code}\n </pre>\n </div>\n );\n}\n\nexport function ComparisonTable({ brand = 'Us', competitor, rows = [], unit = 'px' }: { brand?: string; competitor: string; rows?: { label: string; spectare: string; them: string }[]; unit?: Unit }) {\n const u = scaler(unit);\n const cell = { textAlign: 'left' as const, padding: `${u(12)} ${u(16)}` };\n return (\n <div style={{ border: '1px solid var(--sp-border)', borderRadius: u(12), overflow: 'hidden' }}>\n <div style={{ overflowX: 'auto' }}>\n <table style={{ width: '100%', fontSize: u(14), borderCollapse: 'collapse' }}>\n <thead>\n <tr style={{ borderBottom: '1px solid var(--sp-border)', background: 'var(--sp-bg)' }}>\n <th style={{ ...cell, color: 'var(--sp-text-muted)', fontWeight: 500, fontSize: u(12), width: '33%' }} />\n <th scope=\"col\" style={{ ...cell, fontWeight: 600, color: 'var(--sp-accent)', fontSize: u(12) }}>{brand}</th>\n <th scope=\"col\" style={{ ...cell, color: 'var(--sp-text-muted)', fontWeight: 500, fontSize: u(12) }}>{competitor}</th>\n </tr>\n </thead>\n <tbody>\n {rows.map(({ label, spectare, them }) => (\n <tr key={label} style={{ borderBottom: '1px solid var(--sp-border)' }}>\n <th scope=\"row\" style={{ ...cell, fontSize: u(13), color: 'var(--sp-text-muted)', fontWeight: 500 }}>{label}</th>\n <td style={{ ...cell, fontSize: u(13), color: 'var(--sp-positive)', fontWeight: 500 }}>{spectare}</td>\n <td style={{ ...cell, fontSize: u(13), color: 'var(--sp-text-muted)' }}>{them}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\nexport function FeatureList({ items = [], unit = 'px' }: { items?: { text: string; sub?: string }[]; unit?: Unit }) {\n const u = scaler(unit);\n return (\n <div style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: u(12), padding: u(24) }}>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0, display: 'flex', flexDirection: 'column', gap: u(16) }}>\n {items.map(({ text, sub }) => (\n <li key={text} style={{ display: 'flex', gap: u(12) }}>\n <span style={{ color: 'var(--sp-accent)', flexShrink: 0, fontSize: u(15), marginTop: u(2) }}>✓</span>\n <div>\n <p style={{ fontSize: u(15), fontWeight: 500, color: 'var(--sp-text)', lineHeight: 1.4, margin: 0 }}>{text}</p>\n {sub && <p style={{ fontSize: u(13), color: 'var(--sp-text-muted)', lineHeight: 1.5, margin: `${u(4)} 0 0` }}>{sub}</p>}\n </div>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\nexport function TestimonialCard({ quote, name, role, company, unit = 'px' }: { quote: string; name: string; role: string; company?: string; unit?: Unit }) {\n const u = scaler(unit);\n return (\n <div style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: u(12), padding: u(24), display: 'flex', flexDirection: 'column', gap: u(20), height: '100%' }}>\n <p style={{ fontSize: u(15), color: 'var(--sp-text-sub)', lineHeight: 1.6, flex: 1, margin: 0 }}>\n <span style={{ color: 'var(--sp-text-dim)', fontSize: u(18), lineHeight: 1, marginRight: u(4) }}>\"</span>\n {quote}\n <span style={{ color: 'var(--sp-text-dim)', fontSize: u(18), lineHeight: 1, marginLeft: u(4) }}>\"</span>\n </p>\n <div style={{ borderTop: '1px solid var(--sp-border)', paddingTop: u(16) }}>\n <p style={{ fontSize: u(14), fontWeight: 600, color: 'var(--sp-text)', margin: 0 }}>{name}</p>\n <p style={{ fontSize: u(13), color: 'var(--sp-text-muted)', margin: `${u(2)} 0 0` }}>\n {role}{company ? `, ${company}` : ''}\n </p>\n </div>\n </div>\n );\n}\n\nexport function ImageCtaHero({ src, alt = '', headline, subheading, ctaLabel, ctaHref, align = 'left', unit = 'px' }: { src?: string; alt?: string; headline?: string; subheading?: string; ctaLabel?: string; ctaHref?: string; align?: Align; unit?: Unit }) {\n const u = scaler(unit);\n if (!src) return null;\n return (\n <div style={{ borderRadius: u(12), overflow: 'hidden', position: 'relative', width: '100%', paddingBottom: '56.25%' }}>\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img src={src} alt={alt} style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', objectFit: 'cover' }} />\n <div style={{ position: 'absolute', inset: 0, background: 'rgba(0,0,0,0.45)' }} />\n <div style={{ position: 'absolute', inset: 0, background: 'linear-gradient(to top, rgba(0,0,0,0.85) 0%, rgba(0,0,0,0.2) 60%, transparent 100%)' }} />\n <div style={{ position: 'absolute', bottom: 0, left: 0, right: 0, padding: u(28), textAlign: align }}>\n {headline && (\n <h2 style={{ fontSize: u(24), fontWeight: 700, color: '#fff', lineHeight: 1.2, margin: `0 0 ${u(8)}`, letterSpacing: '-0.02em' }}>{headline}</h2>\n )}\n {subheading && (\n <p style={{ fontSize: u(15), color: 'rgba(255,255,255,0.75)', lineHeight: 1.5, margin: `0 0 ${u(20)}` }}>{subheading}</p>\n )}\n {ctaHref && ctaLabel && (\n <a href={ctaHref} style={{ display: 'inline-block', background: '#fff', color: '#09090b', padding: `${u(8)} ${u(20)}`, borderRadius: u(8), fontWeight: 600, fontSize: u(14), textDecoration: 'none' }}>\n {ctaLabel}\n </a>\n )}\n </div>\n </div>\n );\n}\n\nexport function CtaStrip({ headline, primary, secondary, align = 'center', unit = 'px' }: { headline: string; primary: { label: string; href: string }; secondary?: { label: string; href: string }; align?: Align; unit?: Unit }) {\n const u = scaler(unit);\n return (\n <div style={{ border: '1px solid var(--sp-border)', borderRadius: u(12), padding: u(32), textAlign: align, background: 'var(--sp-bg)' }}>\n <h3 style={{ fontSize: u(24), fontWeight: 700, color: 'var(--sp-text)', margin: `0 0 ${u(24)}` }}>{headline}</h3>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: flexItems(align), gap: u(16), flexWrap: 'wrap' }}>\n <a href={primary.href} style={{ background: 'var(--sp-cta-bg)', color: 'var(--sp-cta-text)', padding: `${u(10)} ${u(24)}`, borderRadius: u(12), fontWeight: 600, fontSize: u(15), textDecoration: 'none' }}>\n {primary.label}\n </a>\n {secondary && (\n <a href={secondary.href} style={{ fontSize: u(15), color: 'var(--sp-text-sub)', textDecoration: 'none' }}>\n {secondary.label} →\n </a>\n )}\n </div>\n </div>\n );\n}\n\n// ── Dispatch ──────────────────────────────────────────────────────────────────\n\nfunction renderSingle(item: ComponentAssembly[0], brand?: string, align?: Align, unit: Unit = 'px'): React.ReactNode {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const s = item.slots as Record<string, any> ?? {};\n\n switch (item.component as ComponentName) {\n case 'AnnouncementBar': return <AnnouncementBar text={s.text} link={s.link} unit={unit} />;\n case 'HeroStatement': return <HeroStatement headline={s.headline} subheading={s.subheading} align={align} unit={unit} />;\n // A full-width card has nothing beside it, so there is nothing for a clamp to protect.\n case 'AtomCard': return <AtomCard title={s.title} content={s.content} summary={s.summary} layout={s.layout} stats={s.stats} ctaText={s.ctaText} ctaUrl={s.ctaUrl} full={s.full || resolvedSize(item) === 'full'} variant={s.variant} unit={unit} />;\n case 'StatGrid': return <StatGrid stats={s.stats} caption={s.caption} unit={unit} />;\n case 'CodeBlock': return <CodeBlock code={s.code} lang={s.lang} caption={s.caption} unit={unit} />;\n case 'ComparisonTable': return <ComparisonTable brand={s.brand ?? brand} competitor={s.competitor} rows={s.rows} unit={unit} />;\n case 'FeatureList': return <FeatureList items={s.items} unit={unit} />;\n case 'TestimonialCard': return <TestimonialCard quote={s.quote} name={s.name} role={s.role} company={s.company} unit={unit} />;\n case 'ImageCtaHero': return <ImageCtaHero src={s.src} alt={s.alt} headline={s.headline} subheading={s.subheading} ctaLabel={s.ctaLabel} ctaHref={s.ctaHref} align={align} unit={unit} />;\n case 'CtaStrip': return <CtaStrip headline={s.headline} primary={s.primary} secondary={s.secondary} align={align} unit={unit} />;\n // An unrecognised component name used to render nothing at all. A component needs a\n // renderer here plus spectare.js plus the WordPress plugin, so missing one made its content\n // silently absent on that surface only: no error, no warning, just a shorter page that\n // looks deliberate. That is the failure mode to remove before the registry grows.\n //\n // Falls back to AtomCard when the slots carry something readable, since almost every\n // component is built from an atom and title/content is the shape they share. When there\n // is genuinely nothing to show it still renders nothing, because an empty card is worse\n // than a gap, but the warning fires either way.\n default: {\n console.warn(`[spectare] ComponentRenderer: no renderer for \"${item.component}\", falling back to AtomCard`);\n if (!s.title && !s.content) return null;\n return <AtomCard title={s.title} content={s.content} stats={s.stats} ctaText={s.ctaText} ctaUrl={s.ctaUrl} full unit={unit} />;\n }\n }\n}\n\n// ── Layout ────────────────────────────────────────────────────────────────────\n\nfunction resolvedSize(item: ComponentAssembly[0]): 'full' | 'half' {\n if (item.size) return item.size;\n return HALF_COMPONENTS.has(item.component as ComponentName) ? 'half' : 'full';\n}\n\ntype LayoutGroup =\n | { type: 'full'; item: ComponentAssembly[0] }\n | { type: 'pair'; items: [ComponentAssembly[0], ComponentAssembly[0]] }\n | { type: 'half-solo'; item: ComponentAssembly[0] };\n\n// Two half-width components only sit side by side well if they read at the same speed. A\n// prose block beside a scannable list forces the eye to switch modes, and the grid stretches\n// the shorter one, leaving dead space. Registry category is the available proxy for reading\n// mode, so pair within a category and give anything else its own row.\nfunction pairable(a: ComponentAssembly[0], b: ComponentAssembly[0]): boolean {\n const catOf = (x: ComponentAssembly[0]) =>\n COMPONENT_CATEGORIES[x.component as ComponentName];\n const ca = catOf(a);\n const cb = catOf(b);\n return ca !== undefined && ca === cb;\n}\n\nfunction buildLayout(assembly: ComponentAssembly): LayoutGroup[] {\n const groups: LayoutGroup[] = [];\n let i = 0;\n while (i < assembly.length) {\n const cur = assembly[i];\n const next = assembly[i + 1];\n if (resolvedSize(cur) === 'half' && next && resolvedSize(next) === 'half' && pairable(cur, next)) {\n groups.push({ type: 'pair', items: [cur, next] });\n i += 2;\n } else if (resolvedSize(cur) === 'half') {\n groups.push({ type: 'half-solo', item: cur });\n i++;\n } else {\n groups.push({ type: 'full', item: cur });\n i++;\n }\n }\n return groups;\n}\n\n// ── X-ray badge ───────────────────────────────────────────────────────────────\n\nfunction XrayBadge({ name, size }: { name: string; size: string }) {\n return (\n <div style={{ position: 'absolute', top: PX(8), left: PX(8), zIndex: 10, display: 'flex', alignItems: 'center', gap: PX(6), pointerEvents: 'none', userSelect: 'none' }}>\n <span style={{ fontSize: PX(10), fontFamily: 'monospace', background: 'rgba(59,130,246,0.9)', color: '#fff', padding: `${PX(2)} ${PX(6)}`, borderRadius: PX(4), lineHeight: 1 }}>{name}</span>\n <span style={{ fontSize: PX(10), fontFamily: 'monospace', color: '#71717a', lineHeight: 1 }}>{size}</span>\n </div>\n );\n}\n\n// ── Main export ───────────────────────────────────────────────────────────────\n\nexport interface ComponentRendererProps {\n assembly: ComponentAssembly;\n /** Your brand name, used as the left column header in ComparisonTable. Defaults to \"Us\". */\n brand?: string;\n /** Overlay a component name badge on each item. Useful for demos and debugging. */\n xray?: boolean;\n /** Render only components assigned to this zone. */\n zone?: AssemblyZone;\n /**\n * Alignment for statement-style components (HeroStatement, CtaStrip, ImageCtaHero),\n * so assembled content can match the host page. Omit to use each component's natural\n * default (HeroStatement left, CtaStrip centered).\n */\n align?: 'left' | 'center' | 'right';\n /**\n * Brand accent, as an explicit input rather than a custom property you override and hope\n * wins on tag order. Any CSS colour. `--sp-accent-bg` and `--sp-accent-border` are derived\n * from it, so one value covers all three. Defaults to #60a5fa.\n */\n accent?: string;\n /**\n * dark (default) is the package's original near-black card set. light renders white cards\n * with a dark text ramp for light host pages; without it the components paint near-white\n * text and near-black slabs onto a light ground. Both palettes hold the same contrast\n * floors (see tests/unit/token-contrast.test.ts).\n */\n theme?: SpTheme;\n /**\n * px (default) sizes components absolutely, predictable inside arbitrary host pages.\n * rem tracks the reader's font-size preference; the root then also inherits the host's\n * font size instead of pinning 16px.\n */\n unit?: Unit;\n /**\n * Substitute rendering for an item: return a node to replace the built-in renderer\n * (including null to render nothing), or undefined to keep the default. How the Spectare\n * app swaps the card-variant AtomCard for its server-rendered card face.\n */\n renderOverride?: (item: ComponentAssembly[0]) => React.ReactNode | undefined;\n /**\n * Wrap each rendered item, e.g. with source attribution or a debug badge. Receives the\n * assembly item and its rendered node; whatever it returns is placed in the layout.\n */\n renderItem?: (item: ComponentAssembly[0], rendered: React.ReactNode) => React.ReactNode;\n /** Extra attributes for the root element (e.g. a data marker a host overlay targets). */\n rootProps?: Record<string, unknown>;\n}\n\n\nexport function ComponentRenderer({ assembly, brand, xray = false, zone, align, accent, theme, unit = 'px', renderOverride, renderItem, rootProps }: ComponentRendererProps) {\n const u = scaler(unit);\n const filtered = zone ? filterAssemblyByZone(assembly, zone) : assembly;\n const layout = buildLayout(filtered);\n\n // Merge rather than spread-clobber: a host className joins sp-root instead of replacing it\n // (every --sp-* token is scoped to .sp-root, so losing it un-themes every component), and a\n // host style merges under the layout styles rather than being silently discarded.\n const { className: extraClass, style: extraStyle, ...restRoot } = (rootProps ?? {}) as { className?: string; style?: React.CSSProperties } & Record<string, unknown>;\n\n const renderOne = (item: ComponentAssembly[0]): React.ReactNode => {\n const override = renderOverride?.(item);\n const node = override === undefined ? renderSingle(item, brand, align, unit) : override;\n return renderItem ? renderItem(item, node) : node;\n };\n\n return (\n <div className={extraClass ? `${SP_ROOT} ${extraClass}` : SP_ROOT} {...restRoot} style={{ ...extraStyle, display: 'flex', flexDirection: 'column', gap: u(20), ...(unit === 'px' ? { fontSize: '16px' } : {}) }}>\n <style dangerouslySetInnerHTML={{ __html: buildTokenCss({ accent, unit, theme }) }} />\n {layout.map((group, i) => {\n if (group.type === 'pair') {\n return (\n <div key={i} className=\"sp-pair\">\n <div style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.items[0].component} size=\"half\" />}\n {renderOne(group.items[0])}\n </div>\n <div style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.items[1].component} size=\"half\" />}\n {renderOne(group.items[1])}\n </div>\n </div>\n );\n }\n return (\n <div key={i} style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.item.component} size={group.type === 'half-solo' ? 'half' : 'full'} />}\n {renderOne(group.item)}\n </div>\n );\n })}\n </div>\n );\n}\n","export type ComponentName =\n | 'AnnouncementBar'\n | 'HeroStatement'\n | 'AtomCard'\n | 'StatGrid'\n | 'CodeBlock'\n | 'ComparisonTable'\n | 'FeatureList'\n | 'TestimonialCard'\n | 'ImageCtaHero'\n | 'CtaStrip';\n\nexport type AssemblyZone = 'announce' | 'hero' | 'body' | 'proof' | 'cta';\n\nconst COMPONENT_ZONES: Record<ComponentName, AssemblyZone> = {\n AnnouncementBar: 'announce',\n HeroStatement: 'hero',\n ImageCtaHero: 'hero',\n AtomCard: 'body',\n StatGrid: 'body',\n CodeBlock: 'body',\n ComparisonTable: 'body',\n FeatureList: 'body',\n TestimonialCard: 'proof',\n CtaStrip: 'cta',\n};\n\nexport type ComponentAssembly = Array<{\n component: ComponentName;\n slots?: Record<string, unknown>;\n size?: 'full' | 'half';\n zone?: AssemblyZone;\n // Atom IDs this component was built from; drives conversion attribution.\n sourceAtomIds?: number[];\n}>;\n\nexport function filterAssemblyByZone(assembly: ComponentAssembly, zone: AssemblyZone): ComponentAssembly {\n return assembly.filter(item => {\n const effectiveZone = item.zone ?? COMPONENT_ZONES[item.component];\n return effectiveZone === zone;\n });\n}\n\n/**\n * Reading-mode category per component: the layout's pairing key. Two half-width components\n * only sit side by side when they share a category, so a prose block never lands beside a\n * scannable list. Mirrors the `category` field in the app's lib/component-registry.ts (the\n * source of truth, which also drives the assembly prompt);\n * tests/unit/renderer-category-parity.test.ts fails when the two drift.\n */\nexport const COMPONENT_CATEGORIES: Record<ComponentName, string> = {\n AnnouncementBar: 'conversion',\n HeroStatement: 'hero',\n AtomCard: 'content',\n StatGrid: 'content',\n CodeBlock: 'technical',\n ComparisonTable: 'evaluation',\n FeatureList: 'content',\n TestimonialCard: 'social-proof',\n ImageCtaHero: 'hero',\n CtaStrip: 'conversion',\n};\n","/**\n * The one place this package's design tokens are defined.\n *\n * Two things that are easy to get wrong here:\n *\n * 1. Tokens are declared on `.sp-root`, not `:root`. Declaring them at `:root` writes into\n * the host's document, allows only one theme per page, and means a customer overriding\n * `--sp-accent` competes with us at equal specificity so tag order decides the winner.\n * Scoping also lets two differently themed sections sit on one page.\n *\n * 2. `tokens.css` must stay byte-identical to `buildTokenCss({ scope: STYLESHEET_SCOPE })`,\n * which differs from the injected CSS in its selector and in nothing else.\n * tests/unit/react-tokens.test.ts enforces both halves, because a customer who imports the\n * stylesheet and a customer who renders the component must get the same page.\n *\n * components/ServerAssemblyRenderer.tsx in the Spectare app is a deliberate mirror of the\n * values below. It is not the same file: that renderer uses rem, this one uses px.\n */\n\n/** The package default. `spectare.js` and the WordPress plugin default to #2563eb, which is\n * a live inconsistency and a brand decision rather than a technical one, so it is left alone\n * here. Pass `accent` to override on either path. */\nexport const DEFAULT_ACCENT = '#60a5fa';\n\n/** The light theme's default accent. #60a5fa reads at ~2.5:1 on white, far below the 4.5:1\n * body floor, so light gets the deeper blue the widget and plugin already default to. */\nexport const DEFAULT_ACCENT_LIGHT = '#2563eb';\n\nexport type SpTheme = 'dark' | 'light';\n\n/** Class the tokens are scoped to. Applied by ComponentRenderer to its own wrapper. */\nexport const SP_ROOT = 'sp-root';\n\n/**\n * Selector the shipped `tokens.css` declares on.\n *\n * `:where(:root)` has zero specificity, so it gives a host that imports the stylesheet and\n * composes the individual components a working set of defaults without a wrapper, while losing\n * to literally any rule the host writes, including a bare `:root` of their own. `.sp-root` then\n * wins over it wherever both apply, which is what makes a differently themed section on one page\n * work. The runtime CSS the renderer injects uses `.sp-root` alone: it applies the class itself,\n * so it has no reason to touch the host's document.\n */\nexport const STYLESHEET_SCOPE = `:where(:root),.${SP_ROOT}`;\n\n/**\n * Colour tokens, in the order they are emitted.\n *\n * `--sp-text-muted` and `--sp-text-dim` were #71717a (3.67:1) and #52525b (2.29:1) on\n * `--sp-bg`, which fail WCAG AA for body text and, in the case of dim, fail even the 3:1\n * large-text floor. They now measure 4.65:1 and 3.36:1. Every other value is unchanged.\n *\n * `--sp-cta-bg` / `--sp-cta-text` carry the values CtaStrip used to hardcode, so the dark\n * rendering is pixel-identical and a light host can correct a button that would otherwise\n * be white on white.\n */\nfunction palette(accent: string, theme: SpTheme): Record<string, string> {\n const shared = {\n '--sp-accent': accent,\n '--sp-accent-bg': `color-mix(in srgb,${accent} 10%,transparent)`,\n '--sp-accent-border': `color-mix(in srgb,${accent} 20%,transparent)`,\n };\n // The light set mirrors the dark ramp with the same contrast discipline: every text token\n // holds its floor on both --sp-bg and --sp-surface (tests/unit/token-contrast.test.ts runs\n // the identical assertions against both themes), and the ramp stays strictly ordered.\n if (theme === 'light') {\n return {\n ...shared,\n '--sp-bg': '#ffffff',\n '--sp-surface': '#f4f4f5',\n '--sp-border': '#e4e4e7',\n '--sp-text': '#18181b',\n '--sp-text-sub': '#3f3f46',\n '--sp-text-strong': '#27272a',\n '--sp-text-muted': '#6b6b74',\n '--sp-text-dim': '#82828b',\n '--sp-text-body': '#52525b',\n '--sp-positive': '#047857',\n '--sp-cta-bg': '#18181b',\n '--sp-cta-text': '#ffffff',\n '--sp-divider': 'rgba(0,0,0,0.06)',\n '--sp-code-bg': 'rgba(0,0,0,0.05)',\n '--sp-code-border': 'rgba(0,0,0,0.08)',\n '--sp-pre-bg': 'rgba(0,0,0,0.04)',\n };\n }\n return {\n ...shared,\n '--sp-bg': '#18181b',\n '--sp-surface': '#09090b',\n '--sp-border': '#27272a',\n '--sp-text': '#f4f4f5',\n '--sp-text-sub': '#d4d4d8',\n '--sp-text-strong': '#e4e4e7',\n '--sp-text-muted': '#82828b',\n '--sp-text-dim': '#6b6b74',\n '--sp-text-body': '#a1a1aa',\n '--sp-positive': '#6ee7b7',\n '--sp-cta-bg': '#fff',\n '--sp-cta-text': '#09090b',\n '--sp-divider': 'rgba(255,255,255,0.06)',\n '--sp-code-bg': 'rgba(255,255,255,0.07)',\n '--sp-code-border': 'rgba(255,255,255,0.08)',\n '--sp-pre-bg': 'rgba(0,0,0,0.4)',\n };\n}\n\n/**\n * Prose and layout rules, scoped to the same class so the package ships no global classes.\n *\n * `unit` exists because the app's server renderer sizes in rem and this package sizes in px.\n * 20px and 1.25rem are the same length at a 16px base, so this is not a design difference, but\n * the two were separate string literals and separate string literals drift.\n */\nfunction rules(unit: 'px' | 'rem'): string {\n const gap = unit === 'px' ? '20px' : '1.25rem';\n return [\n '.sp-root .sp-prose p{margin-bottom:.625rem}',\n '.sp-root .sp-prose p:last-child{margin-bottom:0}',\n '.sp-root .sp-prose ul{list-style:disc;padding-left:1.25rem;margin-bottom:.625rem}',\n '.sp-root .sp-prose ol{list-style:decimal;padding-left:1.25rem;margin-bottom:.625rem}',\n '.sp-root .sp-prose li{margin-bottom:.25rem}',\n '.sp-root .sp-prose strong{color:var(--sp-text-strong);font-weight:600}',\n '.sp-root .sp-prose h2,.sp-root .sp-prose h3{color:var(--sp-text);font-weight:600;margin:.875rem 0 .375rem;font-size:1rem}',\n '.sp-root .sp-prose code{background:var(--sp-code-bg);border:1px solid var(--sp-code-border);padding:.1rem .35rem;border-radius:.25rem;font-size:.82em;color:var(--sp-text)}',\n '.sp-root .sp-prose blockquote{border-left:3px solid var(--sp-border);padding-left:1rem;color:var(--sp-text-muted);margin:.75rem 0}',\n `.sp-root .sp-pair{display:grid;grid-template-columns:1fr 1fr;gap:${gap}}`,\n '@media(max-width:640px){.sp-root .sp-pair{grid-template-columns:1fr}}',\n ].join('');\n}\n\n/**\n * Returns the stylesheet a renderer injects.\n *\n * @param accent brand colour. Accepts anything CSS does; `--sp-accent-bg` and\n * `--sp-accent-border` are derived from it so a customer sets one value\n * rather than three. Defaults to DEFAULT_ACCENT.\n * @param unit length unit for layout rules. 'px' for this package, 'rem' for the app's\n * server renderer, which sizes in rem throughout.\n * @param scope selector the custom properties are declared on. Defaults to `.sp-root`, which is\n * what a renderer injecting this at runtime wants. `tokens.css` is generated with\n * STYLESHEET_SCOPE instead, so importing it works without a wrapper.\n */\nexport function buildTokenCss({ accent, unit = 'px', scope = `.${SP_ROOT}`, theme = 'dark' }: { accent?: string; unit?: 'px' | 'rem'; scope?: string; theme?: SpTheme } = {}): string {\n const resolved = accent ?? (theme === 'light' ? DEFAULT_ACCENT_LIGHT : DEFAULT_ACCENT);\n const decls = Object.entries(palette(resolved, theme)).map(([k, v]) => `${k}:${v}`).join(';');\n return `${scope}{${decls}}${rules(unit)}`;\n}\n"],"mappings":"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","names":["DOMPurify","import_jsx_runtime","res","_a"]}
|