@spectare-personalisation/react 0.2.1 → 0.4.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 +241 -52
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +167 -5
- package/dist/index.d.ts +167 -5
- package/dist/index.js +229 -53
- package/dist/index.js.map +1 -1
- package/dist/tokens.css +78 -0
- package/dist/tokens.css.map +1 -0
- package/dist/tokens.d.cts +2 -0
- package/dist/tokens.d.ts +2 -0
- package/package.json +4 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/ComponentRenderer.tsx","../src/PersonalisedSection.tsx"],"names":["marked","DOMPurify","jsxs","jsx","useState","useRef","useEffect","_a","res","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["export type ComponentName =\n | 'HeroStatement'\n | 'AtomCard'\n | 'StatGrid'\n | 'CodeBlock'\n | 'ComparisonTable'\n | 'FeatureList'\n | 'TestimonialCard'\n | 'ImageCtaHero'\n | 'CtaStrip';\n\nexport type AssemblyZone = 'hero' | 'body' | 'proof' | 'cta';\n\nconst COMPONENT_ZONES: Record<ComponentName, AssemblyZone> = {\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","'use client';\n\nimport { marked } from 'marked';\nimport DOMPurify from 'isomorphic-dompurify';\nimport { filterAssemblyByZone } from './types';\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\nfunction HeroStatement({ headline, subheading }: { headline: string; subheading?: string }) {\n return (\n <div style={{ 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\nfunction AtomCard(\n { title, content, layout, stats = [], ctaText, ctaUrl }:\n { title?: string; content?: string; layout?: string[]; stats?: { value: string; label: string }[]; ctaText?: string; ctaUrl?: string },\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 }} 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction ImageCtaHero({ src, alt = '', headline, subheading, ctaLabel, ctaHref }: { src?: string; alt?: string; headline?: string; subheading?: string; ctaLabel?: string; ctaHref?: string }) {\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' }}>\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\nfunction CtaStrip({ headline, primary, secondary }: { headline: string; primary: { label: string; href: string }; secondary?: { label: string; href: string } }) {\n return (\n <div style={{ border: '1px solid var(--sp-border)', borderRadius: '12px', padding: '32px', textAlign: 'center', 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: 'center', gap: '16px', flexWrap: 'wrap' }}>\n <a href={primary.href} style={{ background: '#fff', color: '#09090b', 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): 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 'HeroStatement': return <HeroStatement headline={s.headline} subheading={s.subheading} />;\n case 'AtomCard': return <AtomCard title={s.title} content={s.content} layout={s.layout} stats={s.stats} ctaText={s.ctaText} ctaUrl={s.ctaUrl} />;\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} />;\n case 'CtaStrip': return <CtaStrip headline={s.headline} primary={s.primary} secondary={s.secondary} />;\n default: return null;\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\nconst PAIR_STYLE = '.sp-pair{display:grid;grid-template-columns:1fr 1fr;gap:20px}@media(max-width:640px){.sp-pair{grid-template-columns:1fr}}';\n\nexport function ComponentRenderer({ assembly, brand, xray = false, zone }: ComponentRendererProps) {\n const filtered = zone ? filterAssemblyByZone(assembly, zone) : assembly;\n const layout = buildLayout(filtered);\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '20px', fontSize: '16px' }}>\n <style dangerouslySetInnerHTML={{ __html: PAIR_STYLE }} />\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)}\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)}\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)}\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)}\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\nconst CSS_TOKENS = `:root{--sp-accent:#60a5fa;--sp-accent-bg:rgba(96,165,250,0.1);--sp-accent-border:rgba(96,165,250,0.2);--sp-bg:#18181b;--sp-surface:#09090b;--sp-border:#27272a;--sp-text:#f4f4f5;--sp-text-sub:#d4d4d8;--sp-text-strong:#e4e4e7;--sp-text-muted:#71717a;--sp-text-dim:#52525b;--sp-text-body:#a1a1aa;--sp-positive:#6ee7b7;--sp-divider:rgba(255,255,255,0.06);--sp-code-bg:rgba(255,255,255,0.07);--sp-code-border:rgba(255,255,255,0.08);--sp-pre-bg:rgba(0,0,0,0.4)}.sp-prose p{margin-bottom:.625rem}.sp-prose p:last-child{margin-bottom:0}.sp-prose ul{list-style:disc;padding-left:1.25rem;margin-bottom:.625rem}.sp-prose ol{list-style:decimal;padding-left:1.25rem;margin-bottom:.625rem}.sp-prose li{margin-bottom:.25rem}.sp-prose strong{color:var(--sp-text-strong);font-weight:600}.sp-prose h2,.sp-prose h3{color:var(--sp-text);font-weight:600;margin:.875rem 0 .375rem;font-size:1rem}.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)}.sp-prose blockquote{border-left:3px solid var(--sp-border);padding-left:1rem;color:var(--sp-text-muted);margin:.75rem 0}`;\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 /** Render only components assigned to this zone. */\n zone?: AssemblyZone;\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 zone,\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 tokenRef = useRef<string | null>(null);\n const conversionFiredRef = useRef(false);\n\n useEffect(() => {\n let cancelled = false;\n\n async function load() {\n try {\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 let 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 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 body: JSON.stringify({ token, orgSlug }),\n });\n\n if (res.status === 401 && !cancelled) {\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 }),\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 comp = JSON.parse(payload) 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 };\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 (!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]);\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 ...(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 return (\n <>\n <style dangerouslySetInnerHTML={{ __html: CSS_TOKENS }} />\n <style dangerouslySetInnerHTML={{ __html: '@keyframes sp-pulse{0%,100%{opacity:1}50%{opacity:0.4}}' }} />\n <div className={className} style={style}>\n {loading && assembly.length === 0\n ? <Shimmer />\n : <ComponentRenderer assembly={zone ? filterAssemblyByZone(assembly, zone) : assembly} brand={brand ?? orgName} />}\n </div>\n </>\n );\n}\n"]}
|
|
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"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
|
|
3
|
-
type ComponentName = 'HeroStatement' | 'AtomCard' | 'StatGrid' | 'CodeBlock' | 'ComparisonTable' | 'FeatureList' | 'TestimonialCard' | 'ImageCtaHero' | 'CtaStrip';
|
|
4
|
-
type AssemblyZone = 'hero' | 'body' | 'proof' | 'cta';
|
|
3
|
+
type ComponentName = 'AnnouncementBar' | 'HeroStatement' | 'AtomCard' | 'StatGrid' | 'CodeBlock' | 'ComparisonTable' | 'FeatureList' | 'TestimonialCard' | 'ImageCtaHero' | 'CtaStrip';
|
|
4
|
+
type AssemblyZone = 'announce' | 'hero' | 'body' | 'proof' | 'cta';
|
|
5
5
|
type ComponentAssembly = Array<{
|
|
6
6
|
component: ComponentName;
|
|
7
7
|
slots?: Record<string, unknown>;
|
|
@@ -25,11 +25,119 @@ interface PersonalisedSectionProps {
|
|
|
25
25
|
audience: string;
|
|
26
26
|
stage: string;
|
|
27
27
|
};
|
|
28
|
+
/**
|
|
29
|
+
* Seed conversion attribution with a server-rendered arrangement: pass the variantId that
|
|
30
|
+
* /api/assemble/ssr returned alongside initialAssembly. Without it, a visit where the client
|
|
31
|
+
* classification matches the server's (so no client render happens) has no variant for a
|
|
32
|
+
* later conversion to credit.
|
|
33
|
+
*/
|
|
34
|
+
initialVariantId?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Explicit visitor-typed context (e.g. a demo input box). Bypasses the session token cache
|
|
37
|
+
* and re-qualifies immediately with the direct flag, which the server cost-caps (cheaper
|
|
38
|
+
* model on a cache miss) and never writes to the shared cache.
|
|
39
|
+
*/
|
|
40
|
+
directSummary?: string;
|
|
28
41
|
/** Render only components assigned to this zone. */
|
|
29
42
|
zone?: AssemblyZone;
|
|
43
|
+
/** Alignment for statement-style components, to match the host page. */
|
|
44
|
+
align?: 'left' | 'center' | 'right';
|
|
45
|
+
/**
|
|
46
|
+
* Brand accent. Passed through to ComponentRenderer, which emits it into the scoped
|
|
47
|
+
* token set. Defaults to #60a5fa.
|
|
48
|
+
*/
|
|
49
|
+
accent?: string;
|
|
30
50
|
}
|
|
31
|
-
declare function PersonalisedSection({ orgSlug, baseUrl, brand, pageHint, className, style, initialAssembly, initialIntent, zone, }: PersonalisedSectionProps): react_jsx_runtime.JSX.Element | null;
|
|
51
|
+
declare function PersonalisedSection({ orgSlug, baseUrl, brand, pageHint, className, style, initialAssembly, initialIntent, initialVariantId, directSummary, zone, align, accent, }: PersonalisedSectionProps): react_jsx_runtime.JSX.Element | null;
|
|
32
52
|
|
|
53
|
+
type Align = 'left' | 'center' | 'right';
|
|
54
|
+
/**
|
|
55
|
+
* A single line above everything else. Deliberately the plainest component in the set: no
|
|
56
|
+
* heading, no image, no padding to speak of. A bar that draws attention to itself competes with
|
|
57
|
+
* the page it is announcing something about.
|
|
58
|
+
*
|
|
59
|
+
* Uses the accent rather than a red or amber alert colour. This is a fact worth knowing, not a
|
|
60
|
+
* warning, and a venue putting "members book from Thursday" in an alarm colour reads as a problem
|
|
61
|
+
* rather than an offer.
|
|
62
|
+
*/
|
|
63
|
+
declare function AnnouncementBar({ text, link }: {
|
|
64
|
+
text?: string;
|
|
65
|
+
link?: {
|
|
66
|
+
label: string;
|
|
67
|
+
href: string;
|
|
68
|
+
};
|
|
69
|
+
}): react_jsx_runtime.JSX.Element | null;
|
|
70
|
+
declare function HeroStatement({ headline, subheading, align }: {
|
|
71
|
+
headline: string;
|
|
72
|
+
subheading?: string;
|
|
73
|
+
align?: Align;
|
|
74
|
+
}): react_jsx_runtime.JSX.Element;
|
|
75
|
+
declare function AtomCard({ title, content, layout, stats, ctaText, ctaUrl, full }: {
|
|
76
|
+
title?: string;
|
|
77
|
+
content?: string;
|
|
78
|
+
layout?: string[];
|
|
79
|
+
stats?: {
|
|
80
|
+
value: string;
|
|
81
|
+
label: string;
|
|
82
|
+
}[];
|
|
83
|
+
ctaText?: string;
|
|
84
|
+
ctaUrl?: string;
|
|
85
|
+
full?: boolean;
|
|
86
|
+
}): react_jsx_runtime.JSX.Element;
|
|
87
|
+
declare function StatGrid({ stats, caption }: {
|
|
88
|
+
stats?: {
|
|
89
|
+
value: string;
|
|
90
|
+
label: string;
|
|
91
|
+
}[];
|
|
92
|
+
caption?: string;
|
|
93
|
+
}): react_jsx_runtime.JSX.Element;
|
|
94
|
+
declare function CodeBlock({ code, lang, caption }: {
|
|
95
|
+
code: string;
|
|
96
|
+
lang?: string;
|
|
97
|
+
caption?: string;
|
|
98
|
+
}): react_jsx_runtime.JSX.Element;
|
|
99
|
+
declare function ComparisonTable({ brand, competitor, rows }: {
|
|
100
|
+
brand?: string;
|
|
101
|
+
competitor: string;
|
|
102
|
+
rows?: {
|
|
103
|
+
label: string;
|
|
104
|
+
spectare: string;
|
|
105
|
+
them: string;
|
|
106
|
+
}[];
|
|
107
|
+
}): react_jsx_runtime.JSX.Element;
|
|
108
|
+
declare function FeatureList({ items }: {
|
|
109
|
+
items?: {
|
|
110
|
+
text: string;
|
|
111
|
+
sub?: string;
|
|
112
|
+
}[];
|
|
113
|
+
}): react_jsx_runtime.JSX.Element;
|
|
114
|
+
declare function TestimonialCard({ quote, name, role, company }: {
|
|
115
|
+
quote: string;
|
|
116
|
+
name: string;
|
|
117
|
+
role: string;
|
|
118
|
+
company?: string;
|
|
119
|
+
}): react_jsx_runtime.JSX.Element;
|
|
120
|
+
declare function ImageCtaHero({ src, alt, headline, subheading, ctaLabel, ctaHref, align }: {
|
|
121
|
+
src?: string;
|
|
122
|
+
alt?: string;
|
|
123
|
+
headline?: string;
|
|
124
|
+
subheading?: string;
|
|
125
|
+
ctaLabel?: string;
|
|
126
|
+
ctaHref?: string;
|
|
127
|
+
align?: Align;
|
|
128
|
+
}): react_jsx_runtime.JSX.Element | null;
|
|
129
|
+
declare function CtaStrip({ headline, primary, secondary, align }: {
|
|
130
|
+
headline: string;
|
|
131
|
+
primary: {
|
|
132
|
+
label: string;
|
|
133
|
+
href: string;
|
|
134
|
+
};
|
|
135
|
+
secondary?: {
|
|
136
|
+
label: string;
|
|
137
|
+
href: string;
|
|
138
|
+
};
|
|
139
|
+
align?: Align;
|
|
140
|
+
}): react_jsx_runtime.JSX.Element;
|
|
33
141
|
interface ComponentRendererProps {
|
|
34
142
|
assembly: ComponentAssembly;
|
|
35
143
|
/** Your brand name, used as the left column header in ComparisonTable. Defaults to "Us". */
|
|
@@ -38,7 +146,61 @@ interface ComponentRendererProps {
|
|
|
38
146
|
xray?: boolean;
|
|
39
147
|
/** Render only components assigned to this zone. */
|
|
40
148
|
zone?: AssemblyZone;
|
|
149
|
+
/**
|
|
150
|
+
* Alignment for statement-style components (HeroStatement, CtaStrip, ImageCtaHero),
|
|
151
|
+
* so assembled content can match the host page. Omit to use each component's natural
|
|
152
|
+
* default (HeroStatement left, CtaStrip centered).
|
|
153
|
+
*/
|
|
154
|
+
align?: 'left' | 'center' | 'right';
|
|
155
|
+
/**
|
|
156
|
+
* Brand accent, as an explicit input rather than a custom property you override and hope
|
|
157
|
+
* wins on tag order. Any CSS colour. `--sp-accent-bg` and `--sp-accent-border` are derived
|
|
158
|
+
* from it, so one value covers all three. Defaults to #60a5fa.
|
|
159
|
+
*/
|
|
160
|
+
accent?: string;
|
|
41
161
|
}
|
|
42
|
-
declare function ComponentRenderer({ assembly, brand, xray, zone }: ComponentRendererProps): react_jsx_runtime.JSX.Element;
|
|
162
|
+
declare function ComponentRenderer({ assembly, brand, xray, zone, align, accent }: ComponentRendererProps): react_jsx_runtime.JSX.Element;
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* The one place this package's design tokens are defined.
|
|
166
|
+
*
|
|
167
|
+
* Two things that are easy to get wrong here:
|
|
168
|
+
*
|
|
169
|
+
* 1. Tokens are declared on `.sp-root`, not `:root`. Declaring them at `:root` writes into
|
|
170
|
+
* the host's document, allows only one theme per page, and means a customer overriding
|
|
171
|
+
* `--sp-accent` competes with us at equal specificity so tag order decides the winner.
|
|
172
|
+
* Scoping also lets two differently themed sections sit on one page.
|
|
173
|
+
*
|
|
174
|
+
* 2. `tokens.css` must stay byte-identical to `buildTokenCss({ scope: STYLESHEET_SCOPE })`,
|
|
175
|
+
* which differs from the injected CSS in its selector and in nothing else.
|
|
176
|
+
* tests/unit/react-tokens.test.ts enforces both halves, because a customer who imports the
|
|
177
|
+
* stylesheet and a customer who renders the component must get the same page.
|
|
178
|
+
*
|
|
179
|
+
* components/ServerAssemblyRenderer.tsx in the Spectare app is a deliberate mirror of the
|
|
180
|
+
* values below. It is not the same file: that renderer uses rem, this one uses px.
|
|
181
|
+
*/
|
|
182
|
+
/** The package default. `spectare.js` and the WordPress plugin default to #2563eb, which is
|
|
183
|
+
* a live inconsistency and a brand decision rather than a technical one, so it is left alone
|
|
184
|
+
* here. Pass `accent` to override on either path. */
|
|
185
|
+
declare const DEFAULT_ACCENT = "#60a5fa";
|
|
186
|
+
/** Class the tokens are scoped to. Applied by ComponentRenderer to its own wrapper. */
|
|
187
|
+
declare const SP_ROOT = "sp-root";
|
|
188
|
+
/**
|
|
189
|
+
* Returns the stylesheet a renderer injects.
|
|
190
|
+
*
|
|
191
|
+
* @param accent brand colour. Accepts anything CSS does; `--sp-accent-bg` and
|
|
192
|
+
* `--sp-accent-border` are derived from it so a customer sets one value
|
|
193
|
+
* rather than three. Defaults to DEFAULT_ACCENT.
|
|
194
|
+
* @param unit length unit for layout rules. 'px' for this package, 'rem' for the app's
|
|
195
|
+
* server renderer, which sizes in rem throughout.
|
|
196
|
+
* @param scope selector the custom properties are declared on. Defaults to `.sp-root`, which is
|
|
197
|
+
* what a renderer injecting this at runtime wants. `tokens.css` is generated with
|
|
198
|
+
* STYLESHEET_SCOPE instead, so importing it works without a wrapper.
|
|
199
|
+
*/
|
|
200
|
+
declare function buildTokenCss({ accent, unit, scope }?: {
|
|
201
|
+
accent?: string;
|
|
202
|
+
unit?: 'px' | 'rem';
|
|
203
|
+
scope?: string;
|
|
204
|
+
}): string;
|
|
43
205
|
|
|
44
|
-
export { type AssemblyZone, type ComponentAssembly, type ComponentName, ComponentRenderer, type ComponentRendererProps, PersonalisedSection, type PersonalisedSectionProps, filterAssemblyByZone };
|
|
206
|
+
export { AnnouncementBar, type AssemblyZone, AtomCard, CodeBlock, ComparisonTable, type ComponentAssembly, type ComponentName, ComponentRenderer, type ComponentRendererProps, CtaStrip, DEFAULT_ACCENT, FeatureList, HeroStatement, ImageCtaHero, PersonalisedSection, type PersonalisedSectionProps, SP_ROOT, StatGrid, TestimonialCard, buildTokenCss, filterAssemblyByZone };
|