@spectare-personalisation/react 0.1.1 → 0.1.3
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 +77 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -2
- package/dist/index.d.ts +6 -2
- package/dist/index.js +78 -14
- package/dist/index.js.map +1 -1
- package/package.json +5 -1
package/dist/index.cjs
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var react = require('react');
|
|
4
|
+
var marked = require('marked');
|
|
4
5
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
6
|
|
|
6
7
|
// src/PersonalisedSection.tsx
|
|
8
|
+
function renderMarkdown(content) {
|
|
9
|
+
return marked.marked.parse(content, { async: false });
|
|
10
|
+
}
|
|
7
11
|
var HALF_COMPONENTS = /* @__PURE__ */ new Set(["TestimonialCard"]);
|
|
8
12
|
function HeroStatement({ headline, subheading }) {
|
|
9
13
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { paddingTop: "1.5rem", paddingBottom: "1.5rem" }, children: [
|
|
@@ -14,7 +18,14 @@ function HeroStatement({ headline, subheading }) {
|
|
|
14
18
|
function AtomCard({ title, content }) {
|
|
15
19
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "0.75rem", padding: "1.5rem", height: "100%" }, children: [
|
|
16
20
|
title && /* @__PURE__ */ jsxRuntime.jsx("h3", { style: { fontSize: "1rem", fontWeight: 600, color: "var(--sp-text)", margin: "0 0 0.75rem" }, children: title }),
|
|
17
|
-
content && /* @__PURE__ */ jsxRuntime.jsx(
|
|
21
|
+
content && /* @__PURE__ */ jsxRuntime.jsx(
|
|
22
|
+
"div",
|
|
23
|
+
{
|
|
24
|
+
className: "sp-prose",
|
|
25
|
+
style: { fontSize: "0.875rem", color: "var(--sp-text-sub)", lineHeight: 1.6 },
|
|
26
|
+
dangerouslySetInnerHTML: { __html: renderMarkdown(content) }
|
|
27
|
+
}
|
|
28
|
+
)
|
|
18
29
|
] });
|
|
19
30
|
}
|
|
20
31
|
function StatGrid({ stats, caption }) {
|
|
@@ -142,22 +153,49 @@ function buildLayout(assembly) {
|
|
|
142
153
|
}
|
|
143
154
|
return groups;
|
|
144
155
|
}
|
|
145
|
-
function
|
|
156
|
+
function XrayBadge({ name, size }) {
|
|
157
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { position: "absolute", top: "0.5rem", left: "0.5rem", zIndex: 10, display: "flex", alignItems: "center", gap: "0.375rem", pointerEvents: "none", userSelect: "none" }, children: [
|
|
158
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "0.625rem", fontFamily: "monospace", background: "rgba(59,130,246,0.9)", color: "#fff", padding: "0.125rem 0.375rem", borderRadius: "0.25rem", lineHeight: 1 }, children: name }),
|
|
159
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "0.625rem", fontFamily: "monospace", color: "#71717a", lineHeight: 1 }, children: size })
|
|
160
|
+
] });
|
|
161
|
+
}
|
|
162
|
+
function ComponentRenderer({ assembly, brand, xray = false }) {
|
|
146
163
|
const layout = buildLayout(assembly);
|
|
147
164
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column", gap: "1.25rem" }, children: layout.map((group, i) => {
|
|
148
165
|
if (group.type === "full") {
|
|
149
|
-
return /* @__PURE__ */ jsxRuntime.
|
|
166
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: xray ? { position: "relative" } : void 0, children: [
|
|
167
|
+
xray && /* @__PURE__ */ jsxRuntime.jsx(XrayBadge, { name: group.item.component, size: "full" }),
|
|
168
|
+
renderSingle(group.item, brand)
|
|
169
|
+
] }, i);
|
|
150
170
|
}
|
|
151
171
|
if (group.type === "pair") {
|
|
152
172
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: "1.25rem" }, children: [
|
|
153
|
-
/* @__PURE__ */ jsxRuntime.
|
|
154
|
-
|
|
173
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: xray ? { position: "relative" } : void 0, children: [
|
|
174
|
+
xray && /* @__PURE__ */ jsxRuntime.jsx(XrayBadge, { name: group.items[0].component, size: "half" }),
|
|
175
|
+
renderSingle(group.items[0], brand)
|
|
176
|
+
] }),
|
|
177
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: xray ? { position: "relative" } : void 0, children: [
|
|
178
|
+
xray && /* @__PURE__ */ jsxRuntime.jsx(XrayBadge, { name: group.items[1].component, size: "half" }),
|
|
179
|
+
renderSingle(group.items[1], brand)
|
|
180
|
+
] })
|
|
155
181
|
] }, i);
|
|
156
182
|
}
|
|
157
|
-
return /* @__PURE__ */ jsxRuntime.
|
|
183
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: xray ? { position: "relative" } : void 0, children: [
|
|
184
|
+
xray && /* @__PURE__ */ jsxRuntime.jsx(XrayBadge, { name: group.item.component, size: "full" }),
|
|
185
|
+
renderSingle(group.item, brand)
|
|
186
|
+
] }, i);
|
|
158
187
|
}) });
|
|
159
188
|
}
|
|
160
|
-
var 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)}`;
|
|
189
|
+
var 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}`;
|
|
190
|
+
function extractAtomIds(assembly) {
|
|
191
|
+
var _a;
|
|
192
|
+
const ids = [];
|
|
193
|
+
for (const item of assembly) {
|
|
194
|
+
const id = (_a = item.slots) == null ? void 0 : _a.atomId;
|
|
195
|
+
if (typeof id === "number") ids.push(id);
|
|
196
|
+
}
|
|
197
|
+
return ids;
|
|
198
|
+
}
|
|
161
199
|
function buildSummary(pageHint) {
|
|
162
200
|
const parts = [pageHint];
|
|
163
201
|
const referrer = document.referrer;
|
|
@@ -194,14 +232,18 @@ function PersonalisedSection({
|
|
|
194
232
|
className,
|
|
195
233
|
style,
|
|
196
234
|
initialAssembly,
|
|
197
|
-
initialIntent
|
|
235
|
+
initialIntent,
|
|
236
|
+
conversionUrlPatterns
|
|
198
237
|
}) {
|
|
199
238
|
const [assembly, setAssembly] = react.useState(initialAssembly != null ? initialAssembly : null);
|
|
200
239
|
const [loading, setLoading] = react.useState(!initialAssembly);
|
|
240
|
+
const tokenRef = react.useRef(null);
|
|
241
|
+
const conversionFiredRef = react.useRef(false);
|
|
242
|
+
const conversionPatternsRef = react.useRef(conversionUrlPatterns != null ? conversionUrlPatterns : []);
|
|
201
243
|
react.useEffect(() => {
|
|
202
244
|
let cancelled = false;
|
|
203
245
|
async function load() {
|
|
204
|
-
var _a, _b, _c, _d, _e, _f;
|
|
246
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
205
247
|
try {
|
|
206
248
|
const p = new URLSearchParams(window.location.search);
|
|
207
249
|
const utmSuffix = ["utm_source", "utm_medium", "utm_campaign", "utm_term"].map((k) => {
|
|
@@ -224,11 +266,14 @@ function PersonalisedSection({
|
|
|
224
266
|
const data2 = await res2.json();
|
|
225
267
|
token = (_a = data2.token) != null ? _a : null;
|
|
226
268
|
if (token) sessionStorage.setItem(tokenKey, token);
|
|
269
|
+
const orgPatterns = (_b = data2.conversionUrlPatterns) != null ? _b : [];
|
|
270
|
+
conversionPatternsRef.current = [.../* @__PURE__ */ new Set([...conversionUrlPatterns != null ? conversionUrlPatterns : [], ...orgPatterns])];
|
|
227
271
|
}
|
|
228
272
|
if (!token || cancelled) {
|
|
229
273
|
setLoading(false);
|
|
230
274
|
return;
|
|
231
275
|
}
|
|
276
|
+
tokenRef.current = token;
|
|
232
277
|
let res = await fetch(`${baseUrl}/api/assemble/components`, {
|
|
233
278
|
method: "POST",
|
|
234
279
|
headers: { "Content-Type": "application/json" },
|
|
@@ -247,8 +292,13 @@ function PersonalisedSection({
|
|
|
247
292
|
return;
|
|
248
293
|
}
|
|
249
294
|
const qData = await qRes.json();
|
|
250
|
-
token = (
|
|
251
|
-
if (token)
|
|
295
|
+
token = (_c = qData.token) != null ? _c : null;
|
|
296
|
+
if (token) {
|
|
297
|
+
sessionStorage.setItem(tokenKey, token);
|
|
298
|
+
tokenRef.current = token;
|
|
299
|
+
const orgPatterns = (_d = qData.conversionUrlPatterns) != null ? _d : [];
|
|
300
|
+
conversionPatternsRef.current = [.../* @__PURE__ */ new Set([...conversionUrlPatterns != null ? conversionUrlPatterns : [], ...orgPatterns])];
|
|
301
|
+
}
|
|
252
302
|
if (!token || cancelled) {
|
|
253
303
|
setLoading(false);
|
|
254
304
|
return;
|
|
@@ -265,8 +315,8 @@ function PersonalisedSection({
|
|
|
265
315
|
}
|
|
266
316
|
const data = await res.json();
|
|
267
317
|
if (cancelled) return;
|
|
268
|
-
const clientAudience = (
|
|
269
|
-
const clientStage = (
|
|
318
|
+
const clientAudience = (_f = (_e = data.intent) == null ? void 0 : _e.userContext) == null ? void 0 : _f.audience;
|
|
319
|
+
const clientStage = (_h = (_g = data.intent) == null ? void 0 : _g.userContext) == null ? void 0 : _h.stage;
|
|
270
320
|
const ssrMatches = initialIntent && clientAudience === initialIntent.audience && clientStage === initialIntent.stage;
|
|
271
321
|
if (!ssrMatches && Array.isArray(data.assembly) && data.assembly.length > 0) {
|
|
272
322
|
setAssembly(data.assembly);
|
|
@@ -281,6 +331,20 @@ function PersonalisedSection({
|
|
|
281
331
|
cancelled = true;
|
|
282
332
|
};
|
|
283
333
|
}, [orgSlug, baseUrl, pageHint, initialAssembly, initialIntent]);
|
|
334
|
+
react.useEffect(() => {
|
|
335
|
+
if (!assembly || !conversionPatternsRef.current.length || conversionFiredRef.current) return;
|
|
336
|
+
const url = window.location.href;
|
|
337
|
+
if (!conversionPatternsRef.current.some((p) => url.includes(p))) return;
|
|
338
|
+
conversionFiredRef.current = true;
|
|
339
|
+
const token = tokenRef.current;
|
|
340
|
+
if (!token) return;
|
|
341
|
+
fetch(`${baseUrl}/api/conversion`, {
|
|
342
|
+
method: "POST",
|
|
343
|
+
headers: { "Content-Type": "application/json" },
|
|
344
|
+
body: JSON.stringify({ token, orgSlug, url, atomsShown: extractAtomIds(assembly) })
|
|
345
|
+
}).catch(() => {
|
|
346
|
+
});
|
|
347
|
+
}, [assembly, orgSlug, baseUrl]);
|
|
284
348
|
if (!loading && !assembly) return null;
|
|
285
349
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
286
350
|
/* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: CSS_TOKENS } }),
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ComponentRenderer.tsx","../src/PersonalisedSection.tsx"],"names":["jsxs","jsx","useState","useEffect","_a","res","data","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client';\n\nimport type { ComponentAssembly, ComponentName } from './types';\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: '1.5rem', paddingBottom: '1.5rem' }}>\n <h2 style={{ fontSize: '2rem', fontWeight: 700, letterSpacing: '-0.025em', lineHeight: 1.2, color: 'var(--sp-text)', margin: '0 0 0.75rem' }}>\n {headline}\n </h2>\n {subheading && (\n <p style={{ fontSize: '1.125rem', color: 'var(--sp-text-sub)', lineHeight: 1.6, maxWidth: '42rem', margin: 0 }}>{subheading}</p>\n )}\n </div>\n );\n}\n\nfunction AtomCard({ title, content }: { title?: string; content?: string }) {\n return (\n <div style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '0.75rem', padding: '1.5rem', height: '100%' }}>\n {title && <h3 style={{ fontSize: '1rem', fontWeight: 600, color: 'var(--sp-text)', margin: '0 0 0.75rem' }}>{title}</h3>}\n {content && <p style={{ fontSize: '0.875rem', color: 'var(--sp-text-sub)', lineHeight: 1.6, margin: 0 }}>{content}</p>}\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 style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '0.75rem', padding: '1.5rem' }}>\n <div style={{ display: 'grid', gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: '1.5rem' }}>\n {stats.map(({ value, label }) => (\n <div key={label} style={{ textAlign: 'center' }}>\n <p style={{ fontSize: '1.875rem', fontWeight: 700, color: 'var(--sp-text)', fontVariantNumeric: 'tabular-nums', margin: 0 }}>{value}</p>\n <p style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', marginTop: '0.375rem', textTransform: 'uppercase', letterSpacing: '0.05em' }}>{label}</p>\n </div>\n ))}\n </div>\n {caption && (\n <p style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', textAlign: 'center', marginTop: '1.25rem', borderTop: '1px solid var(--sp-border)', paddingTop: '1rem' }}>{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: '0.75rem', overflow: 'hidden', border: '1px solid var(--sp-border)' }}>\n <div style={{ background: 'var(--sp-bg)', padding: '0.625rem 1rem', display: 'flex', alignItems: 'center', justifyContent: 'space-between', borderBottom: '1px solid var(--sp-border)' }}>\n <span style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', fontFamily: 'monospace' }}>{lang}</span>\n {caption && <span style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)' }}>{caption}</span>}\n </div>\n <pre style={{ background: 'var(--sp-surface)', padding: '1.25rem', fontSize: '0.75rem', 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: '0.75rem', overflow: 'hidden' }}>\n <div style={{ overflowX: 'auto' }}>\n <table style={{ width: '100%', fontSize: '0.875rem', borderCollapse: 'collapse' }}>\n <thead>\n <tr style={{ borderBottom: '1px solid var(--sp-border)', background: 'var(--sp-bg)' }}>\n <th style={{ textAlign: 'left', padding: '0.75rem 1rem', color: 'var(--sp-text-muted)', fontWeight: 500, fontSize: '0.75rem', width: '33%' }} />\n <th style={{ textAlign: 'left', padding: '0.75rem 1rem', fontWeight: 600, color: 'var(--sp-accent)', fontSize: '0.75rem' }}>{brand}</th>\n <th style={{ textAlign: 'left', padding: '0.75rem 1rem', color: 'var(--sp-text-muted)', fontWeight: 500, fontSize: '0.75rem' }}>{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: '0.75rem 1rem', fontSize: '0.75rem', color: 'var(--sp-text-muted)', fontWeight: 500 }}>{label}</td>\n <td style={{ padding: '0.75rem 1rem', fontSize: '0.75rem', color: 'var(--sp-positive)', fontWeight: 500 }}>{spectare}</td>\n <td style={{ padding: '0.75rem 1rem', fontSize: '0.75rem', 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: '0.75rem', padding: '1.5rem' }}>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0, display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {items.map(({ text, sub }) => (\n <li key={text} style={{ display: 'flex', gap: '0.75rem' }}>\n <span style={{ color: 'var(--sp-accent)', flexShrink: 0, fontSize: '0.875rem', marginTop: '0.125rem' }}>✓</span>\n <div>\n <p style={{ fontSize: '0.875rem', fontWeight: 500, color: 'var(--sp-text)', lineHeight: 1.4, margin: 0 }}>{text}</p>\n {sub && <p style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', marginTop: '0.25rem', lineHeight: 1.5, margin: '0.25rem 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: '0.75rem', padding: '1.5rem', display: 'flex', flexDirection: 'column', gap: '1.25rem', height: '100%' }}>\n <p style={{ fontSize: '0.875rem', color: 'var(--sp-text-sub)', lineHeight: 1.6, flex: 1, margin: 0 }}>\n <span style={{ color: 'var(--sp-text-dim)', fontSize: '1.125rem', lineHeight: 1, marginRight: '0.25rem' }}>\"</span>\n {quote}\n <span style={{ color: 'var(--sp-text-dim)', fontSize: '1.125rem', lineHeight: 1, marginLeft: '0.25rem' }}>\"</span>\n </p>\n <div style={{ borderTop: '1px solid var(--sp-border)', paddingTop: '1rem' }}>\n <p style={{ fontSize: '0.875rem', fontWeight: 600, color: 'var(--sp-text)', margin: 0 }}>{name}</p>\n <p style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', marginTop: '0.125rem', margin: '0.125rem 0 0' }}>\n {role}{company ? `, ${company}` : ''}\n </p>\n </div>\n </div>\n );\n}\n\nfunction ImageHero({ src, alt = '', ratio = '16:9' }: { src?: string; alt?: string; ratio?: string }) {\n if (!src) return null;\n const [w, h] = ratio.split(':').map(Number);\n const paddingBottom = w && h ? `${(h / w) * 100}%` : '56.25%';\n return (\n <div style={{ borderRadius: '0.75rem', overflow: 'hidden', position: 'relative', width: '100%', paddingBottom }}>\n <img src={src} alt={alt} style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', objectFit: 'cover' }} />\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: '0.75rem', padding: '2rem', textAlign: 'center', background: 'var(--sp-bg)' }}>\n <h3 style={{ fontSize: '1.5rem', fontWeight: 700, color: 'var(--sp-text)', margin: '0 0 1.5rem' }}>{headline}</h3>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '1rem', flexWrap: 'wrap' }}>\n <a href={primary.href} style={{ background: '#fff', color: '#09090b', padding: '0.625rem 1.5rem', borderRadius: '0.75rem', fontWeight: 600, fontSize: '0.875rem', textDecoration: 'none' }}>\n {primary.label}\n </a>\n {secondary && (\n <a href={secondary.href} style={{ fontSize: '0.875rem', 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} />;\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={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 'ImageHero': return <ImageHero src={s.src} alt={s.alt} ratio={s.ratio} />;\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// ── 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}\n\nexport function ComponentRenderer({ assembly, brand }: ComponentRendererProps) {\n const layout = buildLayout(assembly);\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1.25rem' }}>\n {layout.map((group, i) => {\n if (group.type === 'full') {\n return <div key={i}>{renderSingle(group.item, brand)}</div>;\n }\n if (group.type === 'pair') {\n return (\n <div key={i} style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '1.25rem' }}>\n <div>{renderSingle(group.items[0], brand)}</div>\n <div>{renderSingle(group.items[1], brand)}</div>\n </div>\n );\n }\n return <div key={i}>{renderSingle(group.item, brand)}</div>;\n })}\n </div>\n );\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { ComponentRenderer } from './ComponentRenderer';\nimport type { ComponentAssembly } from './types';\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)}`;\n\nfunction buildSummary(pageHint: 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');\n if (history) parts.push(`Previously visited: ${history}`);\n } catch { /* private browsing */ }\n return parts.filter(Boolean).join('. ');\n}\n\nfunction Shimmer() {\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n <div style={{ height: '1.25rem', background: 'rgba(39,39,42,0.6)', borderRadius: '0.5rem', width: '75%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '0.875rem', background: 'rgba(39,39,42,0.4)', borderRadius: '0.5rem', width: '100%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '0.875rem', background: 'rgba(39,39,42,0.4)', borderRadius: '0.5rem', width: '83%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '0.875rem', background: 'rgba(39,39,42,0.4)', borderRadius: '0.5rem', 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\nexport function PersonalisedSection({\n orgSlug,\n baseUrl = 'https://spectare.ai',\n brand,\n pageHint,\n className,\n style,\n initialAssembly,\n initialIntent,\n}: PersonalisedSectionProps) {\n const [assembly, setAssembly] = useState<ComponentAssembly | null>(initialAssembly ?? null);\n const [loading, setLoading] = useState(!initialAssembly);\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}`);\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 }\n\n if (!token || cancelled) { setLoading(false); return; }\n\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}`);\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) sessionStorage.setItem(tokenKey, token);\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 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 } 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 if (!loading && !assembly) 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 ? <Shimmer /> : assembly && <ComponentRenderer assembly={assembly} brand={brand} />}\n </div>\n </>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ComponentRenderer.tsx","../src/PersonalisedSection.tsx"],"names":["marked","jsxs","jsx","useState","useRef","useEffect","_a","res","data","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client';\n\nimport { marked } from 'marked';\nimport type { ComponentAssembly, ComponentName } from './types';\n\nfunction renderMarkdown(content: string): string {\n return marked.parse(content, { async: false }) as string;\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: '1.5rem', paddingBottom: '1.5rem' }}>\n <h2 style={{ fontSize: '2rem', fontWeight: 700, letterSpacing: '-0.025em', lineHeight: 1.2, color: 'var(--sp-text)', margin: '0 0 0.75rem' }}>\n {headline}\n </h2>\n {subheading && (\n <p style={{ fontSize: '1.125rem', color: 'var(--sp-text-sub)', lineHeight: 1.6, maxWidth: '42rem', margin: 0 }}>{subheading}</p>\n )}\n </div>\n );\n}\n\nfunction AtomCard({ title, content }: { title?: string; content?: string }) {\n return (\n <div style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '0.75rem', padding: '1.5rem', height: '100%' }}>\n {title && <h3 style={{ fontSize: '1rem', fontWeight: 600, color: 'var(--sp-text)', margin: '0 0 0.75rem' }}>{title}</h3>}\n {content && (\n <div\n className=\"sp-prose\"\n style={{ fontSize: '0.875rem', color: 'var(--sp-text-sub)', lineHeight: 1.6 }}\n dangerouslySetInnerHTML={{ __html: renderMarkdown(content) }}\n />\n )}\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 style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '0.75rem', padding: '1.5rem' }}>\n <div style={{ display: 'grid', gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: '1.5rem' }}>\n {stats.map(({ value, label }) => (\n <div key={label} style={{ textAlign: 'center' }}>\n <p style={{ fontSize: '1.875rem', fontWeight: 700, color: 'var(--sp-text)', fontVariantNumeric: 'tabular-nums', margin: 0 }}>{value}</p>\n <p style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', marginTop: '0.375rem', textTransform: 'uppercase', letterSpacing: '0.05em' }}>{label}</p>\n </div>\n ))}\n </div>\n {caption && (\n <p style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', textAlign: 'center', marginTop: '1.25rem', borderTop: '1px solid var(--sp-border)', paddingTop: '1rem' }}>{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: '0.75rem', overflow: 'hidden', border: '1px solid var(--sp-border)' }}>\n <div style={{ background: 'var(--sp-bg)', padding: '0.625rem 1rem', display: 'flex', alignItems: 'center', justifyContent: 'space-between', borderBottom: '1px solid var(--sp-border)' }}>\n <span style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', fontFamily: 'monospace' }}>{lang}</span>\n {caption && <span style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)' }}>{caption}</span>}\n </div>\n <pre style={{ background: 'var(--sp-surface)', padding: '1.25rem', fontSize: '0.75rem', 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: '0.75rem', overflow: 'hidden' }}>\n <div style={{ overflowX: 'auto' }}>\n <table style={{ width: '100%', fontSize: '0.875rem', borderCollapse: 'collapse' }}>\n <thead>\n <tr style={{ borderBottom: '1px solid var(--sp-border)', background: 'var(--sp-bg)' }}>\n <th style={{ textAlign: 'left', padding: '0.75rem 1rem', color: 'var(--sp-text-muted)', fontWeight: 500, fontSize: '0.75rem', width: '33%' }} />\n <th style={{ textAlign: 'left', padding: '0.75rem 1rem', fontWeight: 600, color: 'var(--sp-accent)', fontSize: '0.75rem' }}>{brand}</th>\n <th style={{ textAlign: 'left', padding: '0.75rem 1rem', color: 'var(--sp-text-muted)', fontWeight: 500, fontSize: '0.75rem' }}>{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: '0.75rem 1rem', fontSize: '0.75rem', color: 'var(--sp-text-muted)', fontWeight: 500 }}>{label}</td>\n <td style={{ padding: '0.75rem 1rem', fontSize: '0.75rem', color: 'var(--sp-positive)', fontWeight: 500 }}>{spectare}</td>\n <td style={{ padding: '0.75rem 1rem', fontSize: '0.75rem', 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: '0.75rem', padding: '1.5rem' }}>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0, display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {items.map(({ text, sub }) => (\n <li key={text} style={{ display: 'flex', gap: '0.75rem' }}>\n <span style={{ color: 'var(--sp-accent)', flexShrink: 0, fontSize: '0.875rem', marginTop: '0.125rem' }}>✓</span>\n <div>\n <p style={{ fontSize: '0.875rem', fontWeight: 500, color: 'var(--sp-text)', lineHeight: 1.4, margin: 0 }}>{text}</p>\n {sub && <p style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', marginTop: '0.25rem', lineHeight: 1.5, margin: '0.25rem 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: '0.75rem', padding: '1.5rem', display: 'flex', flexDirection: 'column', gap: '1.25rem', height: '100%' }}>\n <p style={{ fontSize: '0.875rem', color: 'var(--sp-text-sub)', lineHeight: 1.6, flex: 1, margin: 0 }}>\n <span style={{ color: 'var(--sp-text-dim)', fontSize: '1.125rem', lineHeight: 1, marginRight: '0.25rem' }}>\"</span>\n {quote}\n <span style={{ color: 'var(--sp-text-dim)', fontSize: '1.125rem', lineHeight: 1, marginLeft: '0.25rem' }}>\"</span>\n </p>\n <div style={{ borderTop: '1px solid var(--sp-border)', paddingTop: '1rem' }}>\n <p style={{ fontSize: '0.875rem', fontWeight: 600, color: 'var(--sp-text)', margin: 0 }}>{name}</p>\n <p style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', marginTop: '0.125rem', margin: '0.125rem 0 0' }}>\n {role}{company ? `, ${company}` : ''}\n </p>\n </div>\n </div>\n );\n}\n\nfunction ImageHero({ src, alt = '', ratio = '16:9' }: { src?: string; alt?: string; ratio?: string }) {\n if (!src) return null;\n const [w, h] = ratio.split(':').map(Number);\n const paddingBottom = w && h ? `${(h / w) * 100}%` : '56.25%';\n return (\n <div style={{ borderRadius: '0.75rem', overflow: 'hidden', position: 'relative', width: '100%', paddingBottom }}>\n <img src={src} alt={alt} style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', objectFit: 'cover' }} />\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: '0.75rem', padding: '2rem', textAlign: 'center', background: 'var(--sp-bg)' }}>\n <h3 style={{ fontSize: '1.5rem', fontWeight: 700, color: 'var(--sp-text)', margin: '0 0 1.5rem' }}>{headline}</h3>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '1rem', flexWrap: 'wrap' }}>\n <a href={primary.href} style={{ background: '#fff', color: '#09090b', padding: '0.625rem 1.5rem', borderRadius: '0.75rem', fontWeight: 600, fontSize: '0.875rem', textDecoration: 'none' }}>\n {primary.label}\n </a>\n {secondary && (\n <a href={secondary.href} style={{ fontSize: '0.875rem', 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} />;\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={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 'ImageHero': return <ImageHero src={s.src} alt={s.alt} ratio={s.ratio} />;\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: '0.5rem', left: '0.5rem', zIndex: 10, display: 'flex', alignItems: 'center', gap: '0.375rem', pointerEvents: 'none', userSelect: 'none' }}>\n <span style={{ fontSize: '0.625rem', fontFamily: 'monospace', background: 'rgba(59,130,246,0.9)', color: '#fff', padding: '0.125rem 0.375rem', borderRadius: '0.25rem', lineHeight: 1 }}>{name}</span>\n <span style={{ fontSize: '0.625rem', 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}\n\nexport function ComponentRenderer({ assembly, brand, xray = false }: ComponentRendererProps) {\n const layout = buildLayout(assembly);\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1.25rem' }}>\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} style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '1.25rem' }}>\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 type { ComponentAssembly } from './types';\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\nfunction extractAtomIds(assembly: ComponentAssembly): number[] {\n const ids: number[] = [];\n for (const item of assembly) {\n const id = (item.slots as Record<string, unknown>)?.atomId;\n if (typeof id === 'number') ids.push(id);\n }\n return ids;\n}\n\nfunction buildSummary(pageHint: 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');\n if (history) parts.push(`Previously visited: ${history}`);\n } catch { /* private browsing */ }\n return parts.filter(Boolean).join('. ');\n}\n\nfunction Shimmer() {\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n <div style={{ height: '1.25rem', background: 'rgba(39,39,42,0.6)', borderRadius: '0.5rem', width: '75%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '0.875rem', background: 'rgba(39,39,42,0.4)', borderRadius: '0.5rem', width: '100%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '0.875rem', background: 'rgba(39,39,42,0.4)', borderRadius: '0.5rem', width: '83%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '0.875rem', background: 'rgba(39,39,42,0.4)', borderRadius: '0.5rem', 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 /** URL substrings that indicate a conversion (e.g. ['/thank-you', 'order-confirmed']). When the current URL matches, a conversion event is fired automatically. */\n conversionUrlPatterns?: 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 conversionUrlPatterns,\n}: PersonalisedSectionProps) {\n const [assembly, setAssembly] = useState<ComponentAssembly | null>(initialAssembly ?? null);\n const [loading, setLoading] = useState(!initialAssembly);\n const tokenRef = useRef<string | null>(null);\n const conversionFiredRef = useRef(false);\n // Populated from qualify response (org-level patterns) merged with prop overrides.\n const conversionPatternsRef = useRef<string[]>(conversionUrlPatterns ?? []);\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}`);\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 const orgPatterns = (data.conversionUrlPatterns as string[] | undefined) ?? [];\n conversionPatternsRef.current = [...new Set([...(conversionUrlPatterns ?? []), ...orgPatterns])];\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}`);\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 const orgPatterns = (qData.conversionUrlPatterns as string[] | undefined) ?? [];\n conversionPatternsRef.current = [...new Set([...(conversionUrlPatterns ?? []), ...orgPatterns])];\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 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 } 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 || !conversionPatternsRef.current.length || conversionFiredRef.current) return;\n const url = window.location.href;\n if (!conversionPatternsRef.current.some(p => url.includes(p))) return;\n conversionFiredRef.current = true;\n const token = tokenRef.current;\n if (!token) return;\n fetch(`${baseUrl}/api/conversion`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token, orgSlug, url, atomsShown: extractAtomIds(assembly) }),\n }).catch(() => {});\n }, [assembly, orgSlug, baseUrl]);\n\n if (!loading && !assembly) 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 ? <Shimmer /> : assembly && <ComponentRenderer assembly={assembly} brand={brand} />}\n </div>\n </>\n );\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -21,14 +21,18 @@ interface PersonalisedSectionProps {
|
|
|
21
21
|
audience: string;
|
|
22
22
|
stage: string;
|
|
23
23
|
};
|
|
24
|
+
/** URL substrings that indicate a conversion (e.g. ['/thank-you', 'order-confirmed']). When the current URL matches, a conversion event is fired automatically. */
|
|
25
|
+
conversionUrlPatterns?: string[];
|
|
24
26
|
}
|
|
25
|
-
declare function PersonalisedSection({ orgSlug, baseUrl, brand, pageHint, className, style, initialAssembly, initialIntent, }: PersonalisedSectionProps): react.JSX.Element | null;
|
|
27
|
+
declare function PersonalisedSection({ orgSlug, baseUrl, brand, pageHint, className, style, initialAssembly, initialIntent, conversionUrlPatterns, }: PersonalisedSectionProps): react.JSX.Element | null;
|
|
26
28
|
|
|
27
29
|
interface ComponentRendererProps {
|
|
28
30
|
assembly: ComponentAssembly;
|
|
29
31
|
/** Your brand name, used as the left column header in ComparisonTable. Defaults to "Us". */
|
|
30
32
|
brand?: string;
|
|
33
|
+
/** Overlay a component name badge on each item. Useful for demos and debugging. */
|
|
34
|
+
xray?: boolean;
|
|
31
35
|
}
|
|
32
|
-
declare function ComponentRenderer({ assembly, brand }: ComponentRendererProps): react.JSX.Element;
|
|
36
|
+
declare function ComponentRenderer({ assembly, brand, xray }: ComponentRendererProps): react.JSX.Element;
|
|
33
37
|
|
|
34
38
|
export { type ComponentAssembly, type ComponentName, ComponentRenderer, type ComponentRendererProps, PersonalisedSection, type PersonalisedSectionProps };
|
package/dist/index.d.ts
CHANGED
|
@@ -21,14 +21,18 @@ interface PersonalisedSectionProps {
|
|
|
21
21
|
audience: string;
|
|
22
22
|
stage: string;
|
|
23
23
|
};
|
|
24
|
+
/** URL substrings that indicate a conversion (e.g. ['/thank-you', 'order-confirmed']). When the current URL matches, a conversion event is fired automatically. */
|
|
25
|
+
conversionUrlPatterns?: string[];
|
|
24
26
|
}
|
|
25
|
-
declare function PersonalisedSection({ orgSlug, baseUrl, brand, pageHint, className, style, initialAssembly, initialIntent, }: PersonalisedSectionProps): react.JSX.Element | null;
|
|
27
|
+
declare function PersonalisedSection({ orgSlug, baseUrl, brand, pageHint, className, style, initialAssembly, initialIntent, conversionUrlPatterns, }: PersonalisedSectionProps): react.JSX.Element | null;
|
|
26
28
|
|
|
27
29
|
interface ComponentRendererProps {
|
|
28
30
|
assembly: ComponentAssembly;
|
|
29
31
|
/** Your brand name, used as the left column header in ComparisonTable. Defaults to "Us". */
|
|
30
32
|
brand?: string;
|
|
33
|
+
/** Overlay a component name badge on each item. Useful for demos and debugging. */
|
|
34
|
+
xray?: boolean;
|
|
31
35
|
}
|
|
32
|
-
declare function ComponentRenderer({ assembly, brand }: ComponentRendererProps): react.JSX.Element;
|
|
36
|
+
declare function ComponentRenderer({ assembly, brand, xray }: ComponentRendererProps): react.JSX.Element;
|
|
33
37
|
|
|
34
38
|
export { type ComponentAssembly, type ComponentName, ComponentRenderer, type ComponentRendererProps, PersonalisedSection, type PersonalisedSectionProps };
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import { useState, useEffect } from 'react';
|
|
1
|
+
import { useState, useRef, useEffect } from 'react';
|
|
2
|
+
import { marked } from 'marked';
|
|
2
3
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
3
4
|
|
|
4
5
|
// src/PersonalisedSection.tsx
|
|
6
|
+
function renderMarkdown(content) {
|
|
7
|
+
return marked.parse(content, { async: false });
|
|
8
|
+
}
|
|
5
9
|
var HALF_COMPONENTS = /* @__PURE__ */ new Set(["TestimonialCard"]);
|
|
6
10
|
function HeroStatement({ headline, subheading }) {
|
|
7
11
|
return /* @__PURE__ */ jsxs("div", { style: { paddingTop: "1.5rem", paddingBottom: "1.5rem" }, children: [
|
|
@@ -12,7 +16,14 @@ function HeroStatement({ headline, subheading }) {
|
|
|
12
16
|
function AtomCard({ title, content }) {
|
|
13
17
|
return /* @__PURE__ */ jsxs("div", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "0.75rem", padding: "1.5rem", height: "100%" }, children: [
|
|
14
18
|
title && /* @__PURE__ */ jsx("h3", { style: { fontSize: "1rem", fontWeight: 600, color: "var(--sp-text)", margin: "0 0 0.75rem" }, children: title }),
|
|
15
|
-
content && /* @__PURE__ */ jsx(
|
|
19
|
+
content && /* @__PURE__ */ jsx(
|
|
20
|
+
"div",
|
|
21
|
+
{
|
|
22
|
+
className: "sp-prose",
|
|
23
|
+
style: { fontSize: "0.875rem", color: "var(--sp-text-sub)", lineHeight: 1.6 },
|
|
24
|
+
dangerouslySetInnerHTML: { __html: renderMarkdown(content) }
|
|
25
|
+
}
|
|
26
|
+
)
|
|
16
27
|
] });
|
|
17
28
|
}
|
|
18
29
|
function StatGrid({ stats, caption }) {
|
|
@@ -140,22 +151,49 @@ function buildLayout(assembly) {
|
|
|
140
151
|
}
|
|
141
152
|
return groups;
|
|
142
153
|
}
|
|
143
|
-
function
|
|
154
|
+
function XrayBadge({ name, size }) {
|
|
155
|
+
return /* @__PURE__ */ jsxs("div", { style: { position: "absolute", top: "0.5rem", left: "0.5rem", zIndex: 10, display: "flex", alignItems: "center", gap: "0.375rem", pointerEvents: "none", userSelect: "none" }, children: [
|
|
156
|
+
/* @__PURE__ */ jsx("span", { style: { fontSize: "0.625rem", fontFamily: "monospace", background: "rgba(59,130,246,0.9)", color: "#fff", padding: "0.125rem 0.375rem", borderRadius: "0.25rem", lineHeight: 1 }, children: name }),
|
|
157
|
+
/* @__PURE__ */ jsx("span", { style: { fontSize: "0.625rem", fontFamily: "monospace", color: "#71717a", lineHeight: 1 }, children: size })
|
|
158
|
+
] });
|
|
159
|
+
}
|
|
160
|
+
function ComponentRenderer({ assembly, brand, xray = false }) {
|
|
144
161
|
const layout = buildLayout(assembly);
|
|
145
162
|
return /* @__PURE__ */ jsx("div", { style: { display: "flex", flexDirection: "column", gap: "1.25rem" }, children: layout.map((group, i) => {
|
|
146
163
|
if (group.type === "full") {
|
|
147
|
-
return /* @__PURE__ */
|
|
164
|
+
return /* @__PURE__ */ jsxs("div", { style: xray ? { position: "relative" } : void 0, children: [
|
|
165
|
+
xray && /* @__PURE__ */ jsx(XrayBadge, { name: group.item.component, size: "full" }),
|
|
166
|
+
renderSingle(group.item, brand)
|
|
167
|
+
] }, i);
|
|
148
168
|
}
|
|
149
169
|
if (group.type === "pair") {
|
|
150
170
|
return /* @__PURE__ */ jsxs("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: "1.25rem" }, children: [
|
|
151
|
-
/* @__PURE__ */
|
|
152
|
-
|
|
171
|
+
/* @__PURE__ */ jsxs("div", { style: xray ? { position: "relative" } : void 0, children: [
|
|
172
|
+
xray && /* @__PURE__ */ jsx(XrayBadge, { name: group.items[0].component, size: "half" }),
|
|
173
|
+
renderSingle(group.items[0], brand)
|
|
174
|
+
] }),
|
|
175
|
+
/* @__PURE__ */ jsxs("div", { style: xray ? { position: "relative" } : void 0, children: [
|
|
176
|
+
xray && /* @__PURE__ */ jsx(XrayBadge, { name: group.items[1].component, size: "half" }),
|
|
177
|
+
renderSingle(group.items[1], brand)
|
|
178
|
+
] })
|
|
153
179
|
] }, i);
|
|
154
180
|
}
|
|
155
|
-
return /* @__PURE__ */
|
|
181
|
+
return /* @__PURE__ */ jsxs("div", { style: xray ? { position: "relative" } : void 0, children: [
|
|
182
|
+
xray && /* @__PURE__ */ jsx(XrayBadge, { name: group.item.component, size: "full" }),
|
|
183
|
+
renderSingle(group.item, brand)
|
|
184
|
+
] }, i);
|
|
156
185
|
}) });
|
|
157
186
|
}
|
|
158
|
-
var 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)}`;
|
|
187
|
+
var 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}`;
|
|
188
|
+
function extractAtomIds(assembly) {
|
|
189
|
+
var _a;
|
|
190
|
+
const ids = [];
|
|
191
|
+
for (const item of assembly) {
|
|
192
|
+
const id = (_a = item.slots) == null ? void 0 : _a.atomId;
|
|
193
|
+
if (typeof id === "number") ids.push(id);
|
|
194
|
+
}
|
|
195
|
+
return ids;
|
|
196
|
+
}
|
|
159
197
|
function buildSummary(pageHint) {
|
|
160
198
|
const parts = [pageHint];
|
|
161
199
|
const referrer = document.referrer;
|
|
@@ -192,14 +230,18 @@ function PersonalisedSection({
|
|
|
192
230
|
className,
|
|
193
231
|
style,
|
|
194
232
|
initialAssembly,
|
|
195
|
-
initialIntent
|
|
233
|
+
initialIntent,
|
|
234
|
+
conversionUrlPatterns
|
|
196
235
|
}) {
|
|
197
236
|
const [assembly, setAssembly] = useState(initialAssembly != null ? initialAssembly : null);
|
|
198
237
|
const [loading, setLoading] = useState(!initialAssembly);
|
|
238
|
+
const tokenRef = useRef(null);
|
|
239
|
+
const conversionFiredRef = useRef(false);
|
|
240
|
+
const conversionPatternsRef = useRef(conversionUrlPatterns != null ? conversionUrlPatterns : []);
|
|
199
241
|
useEffect(() => {
|
|
200
242
|
let cancelled = false;
|
|
201
243
|
async function load() {
|
|
202
|
-
var _a, _b, _c, _d, _e, _f;
|
|
244
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
203
245
|
try {
|
|
204
246
|
const p = new URLSearchParams(window.location.search);
|
|
205
247
|
const utmSuffix = ["utm_source", "utm_medium", "utm_campaign", "utm_term"].map((k) => {
|
|
@@ -222,11 +264,14 @@ function PersonalisedSection({
|
|
|
222
264
|
const data2 = await res2.json();
|
|
223
265
|
token = (_a = data2.token) != null ? _a : null;
|
|
224
266
|
if (token) sessionStorage.setItem(tokenKey, token);
|
|
267
|
+
const orgPatterns = (_b = data2.conversionUrlPatterns) != null ? _b : [];
|
|
268
|
+
conversionPatternsRef.current = [.../* @__PURE__ */ new Set([...conversionUrlPatterns != null ? conversionUrlPatterns : [], ...orgPatterns])];
|
|
225
269
|
}
|
|
226
270
|
if (!token || cancelled) {
|
|
227
271
|
setLoading(false);
|
|
228
272
|
return;
|
|
229
273
|
}
|
|
274
|
+
tokenRef.current = token;
|
|
230
275
|
let res = await fetch(`${baseUrl}/api/assemble/components`, {
|
|
231
276
|
method: "POST",
|
|
232
277
|
headers: { "Content-Type": "application/json" },
|
|
@@ -245,8 +290,13 @@ function PersonalisedSection({
|
|
|
245
290
|
return;
|
|
246
291
|
}
|
|
247
292
|
const qData = await qRes.json();
|
|
248
|
-
token = (
|
|
249
|
-
if (token)
|
|
293
|
+
token = (_c = qData.token) != null ? _c : null;
|
|
294
|
+
if (token) {
|
|
295
|
+
sessionStorage.setItem(tokenKey, token);
|
|
296
|
+
tokenRef.current = token;
|
|
297
|
+
const orgPatterns = (_d = qData.conversionUrlPatterns) != null ? _d : [];
|
|
298
|
+
conversionPatternsRef.current = [.../* @__PURE__ */ new Set([...conversionUrlPatterns != null ? conversionUrlPatterns : [], ...orgPatterns])];
|
|
299
|
+
}
|
|
250
300
|
if (!token || cancelled) {
|
|
251
301
|
setLoading(false);
|
|
252
302
|
return;
|
|
@@ -263,8 +313,8 @@ function PersonalisedSection({
|
|
|
263
313
|
}
|
|
264
314
|
const data = await res.json();
|
|
265
315
|
if (cancelled) return;
|
|
266
|
-
const clientAudience = (
|
|
267
|
-
const clientStage = (
|
|
316
|
+
const clientAudience = (_f = (_e = data.intent) == null ? void 0 : _e.userContext) == null ? void 0 : _f.audience;
|
|
317
|
+
const clientStage = (_h = (_g = data.intent) == null ? void 0 : _g.userContext) == null ? void 0 : _h.stage;
|
|
268
318
|
const ssrMatches = initialIntent && clientAudience === initialIntent.audience && clientStage === initialIntent.stage;
|
|
269
319
|
if (!ssrMatches && Array.isArray(data.assembly) && data.assembly.length > 0) {
|
|
270
320
|
setAssembly(data.assembly);
|
|
@@ -279,6 +329,20 @@ function PersonalisedSection({
|
|
|
279
329
|
cancelled = true;
|
|
280
330
|
};
|
|
281
331
|
}, [orgSlug, baseUrl, pageHint, initialAssembly, initialIntent]);
|
|
332
|
+
useEffect(() => {
|
|
333
|
+
if (!assembly || !conversionPatternsRef.current.length || conversionFiredRef.current) return;
|
|
334
|
+
const url = window.location.href;
|
|
335
|
+
if (!conversionPatternsRef.current.some((p) => url.includes(p))) return;
|
|
336
|
+
conversionFiredRef.current = true;
|
|
337
|
+
const token = tokenRef.current;
|
|
338
|
+
if (!token) return;
|
|
339
|
+
fetch(`${baseUrl}/api/conversion`, {
|
|
340
|
+
method: "POST",
|
|
341
|
+
headers: { "Content-Type": "application/json" },
|
|
342
|
+
body: JSON.stringify({ token, orgSlug, url, atomsShown: extractAtomIds(assembly) })
|
|
343
|
+
}).catch(() => {
|
|
344
|
+
});
|
|
345
|
+
}, [assembly, orgSlug, baseUrl]);
|
|
282
346
|
if (!loading && !assembly) return null;
|
|
283
347
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
284
348
|
/* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: CSS_TOKENS } }),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ComponentRenderer.tsx","../src/PersonalisedSection.tsx"],"names":["jsxs","jsx","_a","res","data"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\nimport type { ComponentAssembly, ComponentName } from './types';\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: '1.5rem', paddingBottom: '1.5rem' }}>\n <h2 style={{ fontSize: '2rem', fontWeight: 700, letterSpacing: '-0.025em', lineHeight: 1.2, color: 'var(--sp-text)', margin: '0 0 0.75rem' }}>\n {headline}\n </h2>\n {subheading && (\n <p style={{ fontSize: '1.125rem', color: 'var(--sp-text-sub)', lineHeight: 1.6, maxWidth: '42rem', margin: 0 }}>{subheading}</p>\n )}\n </div>\n );\n}\n\nfunction AtomCard({ title, content }: { title?: string; content?: string }) {\n return (\n <div style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '0.75rem', padding: '1.5rem', height: '100%' }}>\n {title && <h3 style={{ fontSize: '1rem', fontWeight: 600, color: 'var(--sp-text)', margin: '0 0 0.75rem' }}>{title}</h3>}\n {content && <p style={{ fontSize: '0.875rem', color: 'var(--sp-text-sub)', lineHeight: 1.6, margin: 0 }}>{content}</p>}\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 style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '0.75rem', padding: '1.5rem' }}>\n <div style={{ display: 'grid', gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: '1.5rem' }}>\n {stats.map(({ value, label }) => (\n <div key={label} style={{ textAlign: 'center' }}>\n <p style={{ fontSize: '1.875rem', fontWeight: 700, color: 'var(--sp-text)', fontVariantNumeric: 'tabular-nums', margin: 0 }}>{value}</p>\n <p style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', marginTop: '0.375rem', textTransform: 'uppercase', letterSpacing: '0.05em' }}>{label}</p>\n </div>\n ))}\n </div>\n {caption && (\n <p style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', textAlign: 'center', marginTop: '1.25rem', borderTop: '1px solid var(--sp-border)', paddingTop: '1rem' }}>{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: '0.75rem', overflow: 'hidden', border: '1px solid var(--sp-border)' }}>\n <div style={{ background: 'var(--sp-bg)', padding: '0.625rem 1rem', display: 'flex', alignItems: 'center', justifyContent: 'space-between', borderBottom: '1px solid var(--sp-border)' }}>\n <span style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', fontFamily: 'monospace' }}>{lang}</span>\n {caption && <span style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)' }}>{caption}</span>}\n </div>\n <pre style={{ background: 'var(--sp-surface)', padding: '1.25rem', fontSize: '0.75rem', 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: '0.75rem', overflow: 'hidden' }}>\n <div style={{ overflowX: 'auto' }}>\n <table style={{ width: '100%', fontSize: '0.875rem', borderCollapse: 'collapse' }}>\n <thead>\n <tr style={{ borderBottom: '1px solid var(--sp-border)', background: 'var(--sp-bg)' }}>\n <th style={{ textAlign: 'left', padding: '0.75rem 1rem', color: 'var(--sp-text-muted)', fontWeight: 500, fontSize: '0.75rem', width: '33%' }} />\n <th style={{ textAlign: 'left', padding: '0.75rem 1rem', fontWeight: 600, color: 'var(--sp-accent)', fontSize: '0.75rem' }}>{brand}</th>\n <th style={{ textAlign: 'left', padding: '0.75rem 1rem', color: 'var(--sp-text-muted)', fontWeight: 500, fontSize: '0.75rem' }}>{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: '0.75rem 1rem', fontSize: '0.75rem', color: 'var(--sp-text-muted)', fontWeight: 500 }}>{label}</td>\n <td style={{ padding: '0.75rem 1rem', fontSize: '0.75rem', color: 'var(--sp-positive)', fontWeight: 500 }}>{spectare}</td>\n <td style={{ padding: '0.75rem 1rem', fontSize: '0.75rem', 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: '0.75rem', padding: '1.5rem' }}>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0, display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {items.map(({ text, sub }) => (\n <li key={text} style={{ display: 'flex', gap: '0.75rem' }}>\n <span style={{ color: 'var(--sp-accent)', flexShrink: 0, fontSize: '0.875rem', marginTop: '0.125rem' }}>✓</span>\n <div>\n <p style={{ fontSize: '0.875rem', fontWeight: 500, color: 'var(--sp-text)', lineHeight: 1.4, margin: 0 }}>{text}</p>\n {sub && <p style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', marginTop: '0.25rem', lineHeight: 1.5, margin: '0.25rem 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: '0.75rem', padding: '1.5rem', display: 'flex', flexDirection: 'column', gap: '1.25rem', height: '100%' }}>\n <p style={{ fontSize: '0.875rem', color: 'var(--sp-text-sub)', lineHeight: 1.6, flex: 1, margin: 0 }}>\n <span style={{ color: 'var(--sp-text-dim)', fontSize: '1.125rem', lineHeight: 1, marginRight: '0.25rem' }}>\"</span>\n {quote}\n <span style={{ color: 'var(--sp-text-dim)', fontSize: '1.125rem', lineHeight: 1, marginLeft: '0.25rem' }}>\"</span>\n </p>\n <div style={{ borderTop: '1px solid var(--sp-border)', paddingTop: '1rem' }}>\n <p style={{ fontSize: '0.875rem', fontWeight: 600, color: 'var(--sp-text)', margin: 0 }}>{name}</p>\n <p style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', marginTop: '0.125rem', margin: '0.125rem 0 0' }}>\n {role}{company ? `, ${company}` : ''}\n </p>\n </div>\n </div>\n );\n}\n\nfunction ImageHero({ src, alt = '', ratio = '16:9' }: { src?: string; alt?: string; ratio?: string }) {\n if (!src) return null;\n const [w, h] = ratio.split(':').map(Number);\n const paddingBottom = w && h ? `${(h / w) * 100}%` : '56.25%';\n return (\n <div style={{ borderRadius: '0.75rem', overflow: 'hidden', position: 'relative', width: '100%', paddingBottom }}>\n <img src={src} alt={alt} style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', objectFit: 'cover' }} />\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: '0.75rem', padding: '2rem', textAlign: 'center', background: 'var(--sp-bg)' }}>\n <h3 style={{ fontSize: '1.5rem', fontWeight: 700, color: 'var(--sp-text)', margin: '0 0 1.5rem' }}>{headline}</h3>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '1rem', flexWrap: 'wrap' }}>\n <a href={primary.href} style={{ background: '#fff', color: '#09090b', padding: '0.625rem 1.5rem', borderRadius: '0.75rem', fontWeight: 600, fontSize: '0.875rem', textDecoration: 'none' }}>\n {primary.label}\n </a>\n {secondary && (\n <a href={secondary.href} style={{ fontSize: '0.875rem', 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} />;\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={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 'ImageHero': return <ImageHero src={s.src} alt={s.alt} ratio={s.ratio} />;\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// ── 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}\n\nexport function ComponentRenderer({ assembly, brand }: ComponentRendererProps) {\n const layout = buildLayout(assembly);\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1.25rem' }}>\n {layout.map((group, i) => {\n if (group.type === 'full') {\n return <div key={i}>{renderSingle(group.item, brand)}</div>;\n }\n if (group.type === 'pair') {\n return (\n <div key={i} style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '1.25rem' }}>\n <div>{renderSingle(group.items[0], brand)}</div>\n <div>{renderSingle(group.items[1], brand)}</div>\n </div>\n );\n }\n return <div key={i}>{renderSingle(group.item, brand)}</div>;\n })}\n </div>\n );\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { ComponentRenderer } from './ComponentRenderer';\nimport type { ComponentAssembly } from './types';\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)}`;\n\nfunction buildSummary(pageHint: 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');\n if (history) parts.push(`Previously visited: ${history}`);\n } catch { /* private browsing */ }\n return parts.filter(Boolean).join('. ');\n}\n\nfunction Shimmer() {\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n <div style={{ height: '1.25rem', background: 'rgba(39,39,42,0.6)', borderRadius: '0.5rem', width: '75%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '0.875rem', background: 'rgba(39,39,42,0.4)', borderRadius: '0.5rem', width: '100%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '0.875rem', background: 'rgba(39,39,42,0.4)', borderRadius: '0.5rem', width: '83%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '0.875rem', background: 'rgba(39,39,42,0.4)', borderRadius: '0.5rem', 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\nexport function PersonalisedSection({\n orgSlug,\n baseUrl = 'https://spectare.ai',\n brand,\n pageHint,\n className,\n style,\n initialAssembly,\n initialIntent,\n}: PersonalisedSectionProps) {\n const [assembly, setAssembly] = useState<ComponentAssembly | null>(initialAssembly ?? null);\n const [loading, setLoading] = useState(!initialAssembly);\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}`);\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 }\n\n if (!token || cancelled) { setLoading(false); return; }\n\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}`);\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) sessionStorage.setItem(tokenKey, token);\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 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 } 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 if (!loading && !assembly) 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 ? <Shimmer /> : assembly && <ComponentRenderer assembly={assembly} brand={brand} />}\n </div>\n </>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ComponentRenderer.tsx","../src/PersonalisedSection.tsx"],"names":["jsxs","jsx","_a","res","data"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\nimport { marked } from 'marked';\nimport type { ComponentAssembly, ComponentName } from './types';\n\nfunction renderMarkdown(content: string): string {\n return marked.parse(content, { async: false }) as string;\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: '1.5rem', paddingBottom: '1.5rem' }}>\n <h2 style={{ fontSize: '2rem', fontWeight: 700, letterSpacing: '-0.025em', lineHeight: 1.2, color: 'var(--sp-text)', margin: '0 0 0.75rem' }}>\n {headline}\n </h2>\n {subheading && (\n <p style={{ fontSize: '1.125rem', color: 'var(--sp-text-sub)', lineHeight: 1.6, maxWidth: '42rem', margin: 0 }}>{subheading}</p>\n )}\n </div>\n );\n}\n\nfunction AtomCard({ title, content }: { title?: string; content?: string }) {\n return (\n <div style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '0.75rem', padding: '1.5rem', height: '100%' }}>\n {title && <h3 style={{ fontSize: '1rem', fontWeight: 600, color: 'var(--sp-text)', margin: '0 0 0.75rem' }}>{title}</h3>}\n {content && (\n <div\n className=\"sp-prose\"\n style={{ fontSize: '0.875rem', color: 'var(--sp-text-sub)', lineHeight: 1.6 }}\n dangerouslySetInnerHTML={{ __html: renderMarkdown(content) }}\n />\n )}\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 style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '0.75rem', padding: '1.5rem' }}>\n <div style={{ display: 'grid', gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: '1.5rem' }}>\n {stats.map(({ value, label }) => (\n <div key={label} style={{ textAlign: 'center' }}>\n <p style={{ fontSize: '1.875rem', fontWeight: 700, color: 'var(--sp-text)', fontVariantNumeric: 'tabular-nums', margin: 0 }}>{value}</p>\n <p style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', marginTop: '0.375rem', textTransform: 'uppercase', letterSpacing: '0.05em' }}>{label}</p>\n </div>\n ))}\n </div>\n {caption && (\n <p style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', textAlign: 'center', marginTop: '1.25rem', borderTop: '1px solid var(--sp-border)', paddingTop: '1rem' }}>{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: '0.75rem', overflow: 'hidden', border: '1px solid var(--sp-border)' }}>\n <div style={{ background: 'var(--sp-bg)', padding: '0.625rem 1rem', display: 'flex', alignItems: 'center', justifyContent: 'space-between', borderBottom: '1px solid var(--sp-border)' }}>\n <span style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', fontFamily: 'monospace' }}>{lang}</span>\n {caption && <span style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)' }}>{caption}</span>}\n </div>\n <pre style={{ background: 'var(--sp-surface)', padding: '1.25rem', fontSize: '0.75rem', 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: '0.75rem', overflow: 'hidden' }}>\n <div style={{ overflowX: 'auto' }}>\n <table style={{ width: '100%', fontSize: '0.875rem', borderCollapse: 'collapse' }}>\n <thead>\n <tr style={{ borderBottom: '1px solid var(--sp-border)', background: 'var(--sp-bg)' }}>\n <th style={{ textAlign: 'left', padding: '0.75rem 1rem', color: 'var(--sp-text-muted)', fontWeight: 500, fontSize: '0.75rem', width: '33%' }} />\n <th style={{ textAlign: 'left', padding: '0.75rem 1rem', fontWeight: 600, color: 'var(--sp-accent)', fontSize: '0.75rem' }}>{brand}</th>\n <th style={{ textAlign: 'left', padding: '0.75rem 1rem', color: 'var(--sp-text-muted)', fontWeight: 500, fontSize: '0.75rem' }}>{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: '0.75rem 1rem', fontSize: '0.75rem', color: 'var(--sp-text-muted)', fontWeight: 500 }}>{label}</td>\n <td style={{ padding: '0.75rem 1rem', fontSize: '0.75rem', color: 'var(--sp-positive)', fontWeight: 500 }}>{spectare}</td>\n <td style={{ padding: '0.75rem 1rem', fontSize: '0.75rem', 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: '0.75rem', padding: '1.5rem' }}>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0, display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {items.map(({ text, sub }) => (\n <li key={text} style={{ display: 'flex', gap: '0.75rem' }}>\n <span style={{ color: 'var(--sp-accent)', flexShrink: 0, fontSize: '0.875rem', marginTop: '0.125rem' }}>✓</span>\n <div>\n <p style={{ fontSize: '0.875rem', fontWeight: 500, color: 'var(--sp-text)', lineHeight: 1.4, margin: 0 }}>{text}</p>\n {sub && <p style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', marginTop: '0.25rem', lineHeight: 1.5, margin: '0.25rem 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: '0.75rem', padding: '1.5rem', display: 'flex', flexDirection: 'column', gap: '1.25rem', height: '100%' }}>\n <p style={{ fontSize: '0.875rem', color: 'var(--sp-text-sub)', lineHeight: 1.6, flex: 1, margin: 0 }}>\n <span style={{ color: 'var(--sp-text-dim)', fontSize: '1.125rem', lineHeight: 1, marginRight: '0.25rem' }}>\"</span>\n {quote}\n <span style={{ color: 'var(--sp-text-dim)', fontSize: '1.125rem', lineHeight: 1, marginLeft: '0.25rem' }}>\"</span>\n </p>\n <div style={{ borderTop: '1px solid var(--sp-border)', paddingTop: '1rem' }}>\n <p style={{ fontSize: '0.875rem', fontWeight: 600, color: 'var(--sp-text)', margin: 0 }}>{name}</p>\n <p style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', marginTop: '0.125rem', margin: '0.125rem 0 0' }}>\n {role}{company ? `, ${company}` : ''}\n </p>\n </div>\n </div>\n );\n}\n\nfunction ImageHero({ src, alt = '', ratio = '16:9' }: { src?: string; alt?: string; ratio?: string }) {\n if (!src) return null;\n const [w, h] = ratio.split(':').map(Number);\n const paddingBottom = w && h ? `${(h / w) * 100}%` : '56.25%';\n return (\n <div style={{ borderRadius: '0.75rem', overflow: 'hidden', position: 'relative', width: '100%', paddingBottom }}>\n <img src={src} alt={alt} style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', objectFit: 'cover' }} />\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: '0.75rem', padding: '2rem', textAlign: 'center', background: 'var(--sp-bg)' }}>\n <h3 style={{ fontSize: '1.5rem', fontWeight: 700, color: 'var(--sp-text)', margin: '0 0 1.5rem' }}>{headline}</h3>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '1rem', flexWrap: 'wrap' }}>\n <a href={primary.href} style={{ background: '#fff', color: '#09090b', padding: '0.625rem 1.5rem', borderRadius: '0.75rem', fontWeight: 600, fontSize: '0.875rem', textDecoration: 'none' }}>\n {primary.label}\n </a>\n {secondary && (\n <a href={secondary.href} style={{ fontSize: '0.875rem', 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} />;\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={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 'ImageHero': return <ImageHero src={s.src} alt={s.alt} ratio={s.ratio} />;\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: '0.5rem', left: '0.5rem', zIndex: 10, display: 'flex', alignItems: 'center', gap: '0.375rem', pointerEvents: 'none', userSelect: 'none' }}>\n <span style={{ fontSize: '0.625rem', fontFamily: 'monospace', background: 'rgba(59,130,246,0.9)', color: '#fff', padding: '0.125rem 0.375rem', borderRadius: '0.25rem', lineHeight: 1 }}>{name}</span>\n <span style={{ fontSize: '0.625rem', 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}\n\nexport function ComponentRenderer({ assembly, brand, xray = false }: ComponentRendererProps) {\n const layout = buildLayout(assembly);\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1.25rem' }}>\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} style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '1.25rem' }}>\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 type { ComponentAssembly } from './types';\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\nfunction extractAtomIds(assembly: ComponentAssembly): number[] {\n const ids: number[] = [];\n for (const item of assembly) {\n const id = (item.slots as Record<string, unknown>)?.atomId;\n if (typeof id === 'number') ids.push(id);\n }\n return ids;\n}\n\nfunction buildSummary(pageHint: 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');\n if (history) parts.push(`Previously visited: ${history}`);\n } catch { /* private browsing */ }\n return parts.filter(Boolean).join('. ');\n}\n\nfunction Shimmer() {\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n <div style={{ height: '1.25rem', background: 'rgba(39,39,42,0.6)', borderRadius: '0.5rem', width: '75%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '0.875rem', background: 'rgba(39,39,42,0.4)', borderRadius: '0.5rem', width: '100%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '0.875rem', background: 'rgba(39,39,42,0.4)', borderRadius: '0.5rem', width: '83%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '0.875rem', background: 'rgba(39,39,42,0.4)', borderRadius: '0.5rem', 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 /** URL substrings that indicate a conversion (e.g. ['/thank-you', 'order-confirmed']). When the current URL matches, a conversion event is fired automatically. */\n conversionUrlPatterns?: 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 conversionUrlPatterns,\n}: PersonalisedSectionProps) {\n const [assembly, setAssembly] = useState<ComponentAssembly | null>(initialAssembly ?? null);\n const [loading, setLoading] = useState(!initialAssembly);\n const tokenRef = useRef<string | null>(null);\n const conversionFiredRef = useRef(false);\n // Populated from qualify response (org-level patterns) merged with prop overrides.\n const conversionPatternsRef = useRef<string[]>(conversionUrlPatterns ?? []);\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}`);\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 const orgPatterns = (data.conversionUrlPatterns as string[] | undefined) ?? [];\n conversionPatternsRef.current = [...new Set([...(conversionUrlPatterns ?? []), ...orgPatterns])];\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}`);\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 const orgPatterns = (qData.conversionUrlPatterns as string[] | undefined) ?? [];\n conversionPatternsRef.current = [...new Set([...(conversionUrlPatterns ?? []), ...orgPatterns])];\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 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 } 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 || !conversionPatternsRef.current.length || conversionFiredRef.current) return;\n const url = window.location.href;\n if (!conversionPatternsRef.current.some(p => url.includes(p))) return;\n conversionFiredRef.current = true;\n const token = tokenRef.current;\n if (!token) return;\n fetch(`${baseUrl}/api/conversion`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token, orgSlug, url, atomsShown: extractAtomIds(assembly) }),\n }).catch(() => {});\n }, [assembly, orgSlug, baseUrl]);\n\n if (!loading && !assembly) 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 ? <Shimmer /> : assembly && <ComponentRenderer assembly={assembly} brand={brand} />}\n </div>\n </>\n );\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spectare-personalisation/react",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "React components for Spectare AI website personalisation",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"spectare",
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
],
|
|
12
12
|
"license": "MIT",
|
|
13
13
|
"type": "module",
|
|
14
|
+
"source": "./src/index.ts",
|
|
14
15
|
"main": "./dist/index.cjs",
|
|
15
16
|
"module": "./dist/index.js",
|
|
16
17
|
"types": "./dist/index.d.ts",
|
|
@@ -33,6 +34,9 @@
|
|
|
33
34
|
"react": ">=18",
|
|
34
35
|
"react-dom": ">=18"
|
|
35
36
|
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"marked": "^17.0.2"
|
|
39
|
+
},
|
|
36
40
|
"devDependencies": {
|
|
37
41
|
"@types/react": "^19",
|
|
38
42
|
"@types/react-dom": "^19",
|