@spectare-personalisation/react 0.1.4 → 0.1.5
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 +130 -66
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -4
- package/dist/index.d.ts +2 -4
- package/dist/index.js +131 -67
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -30,12 +30,12 @@ function AtomCard({ title, content }) {
|
|
|
30
30
|
}
|
|
31
31
|
function StatGrid({ stats, caption }) {
|
|
32
32
|
const cols = stats.length === 2 ? 2 : stats.length === 3 ? 3 : 4;
|
|
33
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", {
|
|
34
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "grid", gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: "
|
|
35
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "
|
|
36
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "
|
|
33
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
34
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "grid", gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: "0.75rem" }, children: stats.map(({ value, label }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "0.625rem", padding: "1rem 1.25rem", display: "flex", flexDirection: "column", justifyContent: "space-between", minHeight: "5.5rem" }, children: [
|
|
35
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "0.6875rem", color: "var(--sp-text-muted)", textTransform: "uppercase", letterSpacing: "0.06em", margin: "0 0 0.75rem", lineHeight: 1.3 }, children: label }),
|
|
36
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "1.25rem", fontWeight: 500, color: "var(--sp-text)", fontVariantNumeric: "tabular-nums", lineHeight: 1, margin: 0 }, children: value })
|
|
37
37
|
] }, label)) }),
|
|
38
|
-
caption && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "0.75rem", color: "var(--sp-text-muted)",
|
|
38
|
+
caption && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "0.75rem", color: "var(--sp-text-muted)", marginTop: "0.75rem", margin: "0.75rem 0 0" }, children: caption })
|
|
39
39
|
] });
|
|
40
40
|
}
|
|
41
41
|
function CodeBlock({ code, lang = "typescript", caption }) {
|
|
@@ -86,11 +86,17 @@ function TestimonialCard({ quote, name, role, company }) {
|
|
|
86
86
|
] })
|
|
87
87
|
] });
|
|
88
88
|
}
|
|
89
|
-
function
|
|
89
|
+
function ImageCtaHero({ src, alt = "", headline, subheading, ctaLabel, ctaHref }) {
|
|
90
90
|
if (!src) return null;
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { borderRadius: "0.75rem", overflow: "hidden", position: "relative", width: "100%", paddingBottom: "56.25%" }, children: [
|
|
92
|
+
/* @__PURE__ */ jsxRuntime.jsx("img", { src, alt, style: { position: "absolute", inset: 0, width: "100%", height: "100%", objectFit: "cover" } }),
|
|
93
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { position: "absolute", inset: 0, background: "linear-gradient(to top, rgba(0,0,0,0.85) 0%, rgba(0,0,0,0.3) 55%, transparent 100%)" } }),
|
|
94
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { position: "absolute", bottom: 0, left: 0, right: 0, padding: "1.75rem" }, children: [
|
|
95
|
+
headline && /* @__PURE__ */ jsxRuntime.jsx("h2", { style: { fontSize: "1.5rem", fontWeight: 700, color: "#fff", lineHeight: 1.2, margin: "0 0 0.5rem", letterSpacing: "-0.02em" }, children: headline }),
|
|
96
|
+
subheading && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "0.875rem", color: "rgba(255,255,255,0.75)", lineHeight: 1.5, margin: "0 0 1.25rem" }, children: subheading }),
|
|
97
|
+
ctaHref && ctaLabel && /* @__PURE__ */ jsxRuntime.jsx("a", { href: ctaHref, style: { display: "inline-block", background: "#fff", color: "#09090b", padding: "0.5rem 1.25rem", borderRadius: "0.5rem", fontWeight: 600, fontSize: "0.875rem", textDecoration: "none" }, children: ctaLabel })
|
|
98
|
+
] })
|
|
99
|
+
] });
|
|
94
100
|
}
|
|
95
101
|
function CtaStrip({ headline, primary, secondary }) {
|
|
96
102
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { border: "1px solid var(--sp-border)", borderRadius: "0.75rem", padding: "2rem", textAlign: "center", background: "var(--sp-bg)" }, children: [
|
|
@@ -122,8 +128,8 @@ function renderSingle(item, brand) {
|
|
|
122
128
|
return /* @__PURE__ */ jsxRuntime.jsx(FeatureList, { items: s.items });
|
|
123
129
|
case "TestimonialCard":
|
|
124
130
|
return /* @__PURE__ */ jsxRuntime.jsx(TestimonialCard, { quote: s.quote, name: s.name, role: s.role, company: s.company });
|
|
125
|
-
case "
|
|
126
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
131
|
+
case "ImageCtaHero":
|
|
132
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ImageCtaHero, { src: s.src, alt: s.alt, headline: s.headline, subheading: s.subheading, ctaLabel: s.ctaLabel, ctaHref: s.ctaHref });
|
|
127
133
|
case "CtaStrip":
|
|
128
134
|
return /* @__PURE__ */ jsxRuntime.jsx(CtaStrip, { headline: s.headline, primary: s.primary, secondary: s.secondary });
|
|
129
135
|
default:
|
|
@@ -159,43 +165,38 @@ function XrayBadge({ name, size }) {
|
|
|
159
165
|
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "0.625rem", fontFamily: "monospace", color: "#71717a", lineHeight: 1 }, children: size })
|
|
160
166
|
] });
|
|
161
167
|
}
|
|
168
|
+
var PAIR_STYLE = ".sp-pair{display:grid;grid-template-columns:1fr 1fr;gap:1.25rem}@media(max-width:640px){.sp-pair{grid-template-columns:1fr}}";
|
|
162
169
|
function ComponentRenderer({ assembly, brand, xray = false }) {
|
|
163
170
|
const layout = buildLayout(assembly);
|
|
164
|
-
return /* @__PURE__ */ jsxRuntime.
|
|
165
|
-
|
|
171
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "1.25rem" }, children: [
|
|
172
|
+
/* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: PAIR_STYLE } }),
|
|
173
|
+
layout.map((group, i) => {
|
|
174
|
+
if (group.type === "full") {
|
|
175
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: xray ? { position: "relative" } : void 0, children: [
|
|
176
|
+
xray && /* @__PURE__ */ jsxRuntime.jsx(XrayBadge, { name: group.item.component, size: "full" }),
|
|
177
|
+
renderSingle(group.item, brand)
|
|
178
|
+
] }, i);
|
|
179
|
+
}
|
|
180
|
+
if (group.type === "pair") {
|
|
181
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sp-pair", children: [
|
|
182
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: xray ? { position: "relative" } : void 0, children: [
|
|
183
|
+
xray && /* @__PURE__ */ jsxRuntime.jsx(XrayBadge, { name: group.items[0].component, size: "half" }),
|
|
184
|
+
renderSingle(group.items[0], brand)
|
|
185
|
+
] }),
|
|
186
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: xray ? { position: "relative" } : void 0, children: [
|
|
187
|
+
xray && /* @__PURE__ */ jsxRuntime.jsx(XrayBadge, { name: group.items[1].component, size: "half" }),
|
|
188
|
+
renderSingle(group.items[1], brand)
|
|
189
|
+
] })
|
|
190
|
+
] }, i);
|
|
191
|
+
}
|
|
166
192
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: xray ? { position: "relative" } : void 0, children: [
|
|
167
193
|
xray && /* @__PURE__ */ jsxRuntime.jsx(XrayBadge, { name: group.item.component, size: "full" }),
|
|
168
194
|
renderSingle(group.item, brand)
|
|
169
195
|
] }, i);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: "1.25rem" }, children: [
|
|
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
|
-
] })
|
|
181
|
-
] }, i);
|
|
182
|
-
}
|
|
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);
|
|
187
|
-
}) });
|
|
196
|
+
})
|
|
197
|
+
] });
|
|
188
198
|
}
|
|
189
199
|
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
|
-
}
|
|
199
200
|
function buildSummary(pageHint, orgSlug) {
|
|
200
201
|
const parts = [pageHint];
|
|
201
202
|
const referrer = document.referrer;
|
|
@@ -232,14 +233,13 @@ function PersonalisedSection({
|
|
|
232
233
|
className,
|
|
233
234
|
style,
|
|
234
235
|
initialAssembly,
|
|
235
|
-
initialIntent
|
|
236
|
-
conversionUrlPatterns
|
|
236
|
+
initialIntent
|
|
237
237
|
}) {
|
|
238
|
-
const [assembly, setAssembly] = react.useState(initialAssembly != null ? initialAssembly :
|
|
238
|
+
const [assembly, setAssembly] = react.useState(initialAssembly != null ? initialAssembly : []);
|
|
239
239
|
const [loading, setLoading] = react.useState(!initialAssembly);
|
|
240
|
+
const [orgName, setOrgName] = react.useState(void 0);
|
|
240
241
|
const tokenRef = react.useRef(null);
|
|
241
242
|
const conversionFiredRef = react.useRef(false);
|
|
242
|
-
const conversionPatternsRef = react.useRef(conversionUrlPatterns != null ? conversionUrlPatterns : []);
|
|
243
243
|
react.useEffect(() => {
|
|
244
244
|
let cancelled = false;
|
|
245
245
|
async function load() {
|
|
@@ -263,11 +263,10 @@ function PersonalisedSection({
|
|
|
263
263
|
setLoading(false);
|
|
264
264
|
return;
|
|
265
265
|
}
|
|
266
|
-
const
|
|
267
|
-
token = (_a =
|
|
266
|
+
const data = await res2.json();
|
|
267
|
+
token = (_a = data.token) != null ? _a : null;
|
|
268
268
|
if (token) sessionStorage.setItem(tokenKey, token);
|
|
269
|
-
|
|
270
|
-
conversionPatternsRef.current = [.../* @__PURE__ */ new Set([...conversionUrlPatterns != null ? conversionUrlPatterns : [], ...orgPatterns])];
|
|
269
|
+
if (data.orgName) setOrgName(data.orgName);
|
|
271
270
|
}
|
|
272
271
|
if (!token || cancelled) {
|
|
273
272
|
setLoading(false);
|
|
@@ -292,12 +291,10 @@ function PersonalisedSection({
|
|
|
292
291
|
return;
|
|
293
292
|
}
|
|
294
293
|
const qData = await qRes.json();
|
|
295
|
-
token = (
|
|
294
|
+
token = (_b = qData.token) != null ? _b : null;
|
|
296
295
|
if (token) {
|
|
297
296
|
sessionStorage.setItem(tokenKey, token);
|
|
298
297
|
tokenRef.current = token;
|
|
299
|
-
const orgPatterns = (_d = qData.conversionUrlPatterns) != null ? _d : [];
|
|
300
|
-
conversionPatternsRef.current = [.../* @__PURE__ */ new Set([...conversionUrlPatterns != null ? conversionUrlPatterns : [], ...orgPatterns])];
|
|
301
298
|
}
|
|
302
299
|
if (!token || cancelled) {
|
|
303
300
|
setLoading(false);
|
|
@@ -313,13 +310,47 @@ function PersonalisedSection({
|
|
|
313
310
|
setLoading(false);
|
|
314
311
|
return;
|
|
315
312
|
}
|
|
316
|
-
const
|
|
317
|
-
if (
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
313
|
+
const contentType = (_c = res.headers.get("content-type")) != null ? _c : "";
|
|
314
|
+
if (contentType.includes("text/event-stream")) {
|
|
315
|
+
const reader = res.body.getReader();
|
|
316
|
+
const decoder = new TextDecoder();
|
|
317
|
+
let buf = "";
|
|
318
|
+
let loadingCleared = false;
|
|
319
|
+
try {
|
|
320
|
+
while (!cancelled) {
|
|
321
|
+
const { done, value } = await reader.read();
|
|
322
|
+
if (done || cancelled) break;
|
|
323
|
+
buf += decoder.decode(value, { stream: true });
|
|
324
|
+
const lines = buf.split("\n");
|
|
325
|
+
buf = (_d = lines.pop()) != null ? _d : "";
|
|
326
|
+
for (const line of lines) {
|
|
327
|
+
if (!line.startsWith("data: ")) continue;
|
|
328
|
+
const payload = line.slice(6).trim();
|
|
329
|
+
if (payload === "[DONE]") break;
|
|
330
|
+
try {
|
|
331
|
+
const comp = JSON.parse(payload);
|
|
332
|
+
if (!loadingCleared) {
|
|
333
|
+
setLoading(false);
|
|
334
|
+
loadingCleared = true;
|
|
335
|
+
}
|
|
336
|
+
setAssembly((prev) => [...prev, comp]);
|
|
337
|
+
} catch (e) {
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
} finally {
|
|
342
|
+
reader.cancel().catch(() => {
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
} else {
|
|
346
|
+
const data = await res.json();
|
|
347
|
+
if (cancelled) return;
|
|
348
|
+
const clientAudience = (_f = (_e = data.intent) == null ? void 0 : _e.userContext) == null ? void 0 : _f.audience;
|
|
349
|
+
const clientStage = (_h = (_g = data.intent) == null ? void 0 : _g.userContext) == null ? void 0 : _h.stage;
|
|
350
|
+
const ssrMatches = initialIntent && clientAudience === initialIntent.audience && clientStage === initialIntent.stage;
|
|
351
|
+
if (!ssrMatches && Array.isArray(data.assembly) && data.assembly.length > 0) {
|
|
352
|
+
setAssembly(data.assembly);
|
|
353
|
+
}
|
|
323
354
|
}
|
|
324
355
|
} catch (e) {
|
|
325
356
|
} finally {
|
|
@@ -332,24 +363,57 @@ function PersonalisedSection({
|
|
|
332
363
|
};
|
|
333
364
|
}, [orgSlug, baseUrl, pageHint, initialAssembly, initialIntent]);
|
|
334
365
|
react.useEffect(() => {
|
|
335
|
-
if (!assembly
|
|
336
|
-
const url = window.location.href;
|
|
337
|
-
if (!conversionPatternsRef.current.some((p) => url.includes(p))) return;
|
|
338
|
-
conversionFiredRef.current = true;
|
|
366
|
+
if (!assembly.length || conversionFiredRef.current) return;
|
|
339
367
|
const token = tokenRef.current;
|
|
340
368
|
if (!token) return;
|
|
341
|
-
|
|
369
|
+
const url = window.location.href;
|
|
370
|
+
fetch(`${baseUrl}/api/conversion-check`, {
|
|
342
371
|
method: "POST",
|
|
343
372
|
headers: { "Content-Type": "application/json" },
|
|
344
|
-
body: JSON.stringify({
|
|
373
|
+
body: JSON.stringify({ orgSlug, url })
|
|
374
|
+
}).then((r) => r.json()).then((data) => {
|
|
375
|
+
var _a, _b;
|
|
376
|
+
if (!data.matched) return;
|
|
377
|
+
conversionFiredRef.current = true;
|
|
378
|
+
let goalValue = null;
|
|
379
|
+
let goalCurrency = data.defaultCurrency;
|
|
380
|
+
if (data.valueSelector) {
|
|
381
|
+
try {
|
|
382
|
+
const el = document.querySelector(data.valueSelector);
|
|
383
|
+
if (el) {
|
|
384
|
+
const num = parseFloat(((_a = el.textContent) != null ? _a : "").trim().replace(/[^0-9.]/g, ""));
|
|
385
|
+
if (!isNaN(num)) goalValue = num;
|
|
386
|
+
}
|
|
387
|
+
} catch (e) {
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
if (data.currencySelector) {
|
|
391
|
+
try {
|
|
392
|
+
const el = document.querySelector(data.currencySelector);
|
|
393
|
+
if (el) goalCurrency = ((_b = el.textContent) != null ? _b : "").trim() || goalCurrency;
|
|
394
|
+
} catch (e) {
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
fetch(`${baseUrl}/api/conversion`, {
|
|
398
|
+
method: "POST",
|
|
399
|
+
headers: { "Content-Type": "application/json" },
|
|
400
|
+
body: JSON.stringify({
|
|
401
|
+
token,
|
|
402
|
+
orgSlug,
|
|
403
|
+
url,
|
|
404
|
+
...data.goalName ? { goalName: data.goalName } : {},
|
|
405
|
+
...goalValue !== null ? { goalValue, goalCurrency } : {}
|
|
406
|
+
})
|
|
407
|
+
}).catch(() => {
|
|
408
|
+
});
|
|
345
409
|
}).catch(() => {
|
|
346
410
|
});
|
|
347
411
|
}, [assembly, orgSlug, baseUrl]);
|
|
348
|
-
if (!loading &&
|
|
412
|
+
if (!loading && assembly.length === 0) return null;
|
|
349
413
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
350
414
|
/* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: CSS_TOKENS } }),
|
|
351
415
|
/* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: "@keyframes sp-pulse{0%,100%{opacity:1}50%{opacity:0.4}}" } }),
|
|
352
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className, style, children: loading ? /* @__PURE__ */ jsxRuntime.jsx(Shimmer, {}) :
|
|
416
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className, style, children: loading && assembly.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Shimmer, {}) : /* @__PURE__ */ jsxRuntime.jsx(ComponentRenderer, { assembly, brand: brand != null ? brand : orgName }) })
|
|
353
417
|
] });
|
|
354
418
|
}
|
|
355
419
|
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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, orgSlug: string): string {\n const parts: string[] = [pageHint];\n const referrer = document.referrer;\n if (referrer) parts.push(`Arrived from: ${referrer}`);\n const p = new URLSearchParams(window.location.search);\n const source = p.get('utm_source');\n const medium = p.get('utm_medium');\n const campaign = p.get('utm_campaign');\n const term = p.get('utm_term');\n if (source) parts.push(`Source: ${source}`);\n if (medium) parts.push(`Medium: ${medium}`);\n if (campaign) parts.push(`Campaign: ${campaign}`);\n if (term) parts.push(`Search term: ${term}`);\n try {\n const history = localStorage.getItem(`_spectare_visits_${orgSlug}`);\n if (history) parts.push(`Previously visited: ${history}`);\n } catch { /* private browsing */ }\n return parts.filter(Boolean).join('. ');\n}\n\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}`, orgSlug);\n const res = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!res.ok || cancelled) { setLoading(false); return; }\n const data = await res.json();\n token = data.token as string | undefined ?? null;\n if (token) sessionStorage.setItem(tokenKey, token);\n 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}`, orgSlug);\n const qRes = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!qRes.ok || cancelled) { setLoading(false); return; }\n const qData = await qRes.json();\n token = qData.token as string | undefined ?? null;\n if (token) {\n sessionStorage.setItem(tokenKey, token);\n tokenRef.current = token;\n 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"]}
|
|
1
|
+
{"version":3,"sources":["../src/ComponentRenderer.tsx","../src/PersonalisedSection.tsx"],"names":["marked","jsxs","jsx","useState","useRef","useEffect","_a","res","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>\n <div style={{ display: 'grid', gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: '0.75rem' }}>\n {stats.map(({ value, label }) => (\n <div key={label} style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '0.625rem', padding: '1rem 1.25rem', display: 'flex', flexDirection: 'column', justifyContent: 'space-between', minHeight: '5.5rem' }}>\n <p style={{ fontSize: '0.6875rem', color: 'var(--sp-text-muted)', textTransform: 'uppercase', letterSpacing: '0.06em', margin: '0 0 0.75rem', lineHeight: 1.3 }}>{label}</p>\n <p style={{ fontSize: '1.25rem', fontWeight: 500, color: 'var(--sp-text)', fontVariantNumeric: 'tabular-nums', lineHeight: 1, margin: 0 }}>{value}</p>\n </div>\n ))}\n </div>\n {caption && (\n <p style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', marginTop: '0.75rem', margin: '0.75rem 0 0' }}>{caption}</p>\n )}\n </div>\n );\n}\n\nfunction CodeBlock({ code, lang = 'typescript', caption }: { code: string; lang?: string; caption?: string }) {\n return (\n <div style={{ borderRadius: '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 ImageCtaHero({ src, alt = '', headline, subheading, ctaLabel, ctaHref }: { src?: string; alt?: string; headline?: string; subheading?: string; ctaLabel?: string; ctaHref?: string }) {\n if (!src) return null;\n return (\n <div style={{ borderRadius: '0.75rem', overflow: 'hidden', position: 'relative', width: '100%', paddingBottom: '56.25%' }}>\n <img src={src} alt={alt} style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', objectFit: 'cover' }} />\n <div style={{ position: 'absolute', inset: 0, background: 'linear-gradient(to top, rgba(0,0,0,0.85) 0%, rgba(0,0,0,0.3) 55%, transparent 100%)' }} />\n <div style={{ position: 'absolute', bottom: 0, left: 0, right: 0, padding: '1.75rem' }}>\n {headline && (\n <h2 style={{ fontSize: '1.5rem', fontWeight: 700, color: '#fff', lineHeight: 1.2, margin: '0 0 0.5rem', letterSpacing: '-0.02em' }}>{headline}</h2>\n )}\n {subheading && (\n <p style={{ fontSize: '0.875rem', color: 'rgba(255,255,255,0.75)', lineHeight: 1.5, margin: '0 0 1.25rem' }}>{subheading}</p>\n )}\n {ctaHref && ctaLabel && (\n <a href={ctaHref} style={{ display: 'inline-block', background: '#fff', color: '#09090b', padding: '0.5rem 1.25rem', borderRadius: '0.5rem', fontWeight: 600, fontSize: '0.875rem', textDecoration: 'none' }}>\n {ctaLabel}\n </a>\n )}\n </div>\n </div>\n );\n}\n\nfunction CtaStrip({ headline, primary, secondary }: { headline: string; primary: { label: string; href: string }; secondary?: { label: string; href: string } }) {\n return (\n <div style={{ border: '1px solid var(--sp-border)', borderRadius: '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 'ImageCtaHero': return <ImageCtaHero src={s.src} alt={s.alt} headline={s.headline} subheading={s.subheading} ctaLabel={s.ctaLabel} ctaHref={s.ctaHref} />;\n case 'CtaStrip': return <CtaStrip headline={s.headline} primary={s.primary} secondary={s.secondary} />;\n default: return null;\n }\n}\n\n// ── Layout ────────────────────────────────────────────────────────────────────\n\nfunction resolvedSize(item: ComponentAssembly[0]): 'full' | 'half' {\n if (item.size) return item.size;\n return HALF_COMPONENTS.has(item.component as ComponentName) ? 'half' : 'full';\n}\n\ntype LayoutGroup =\n | { type: 'full'; item: ComponentAssembly[0] }\n | { type: 'pair'; items: [ComponentAssembly[0], ComponentAssembly[0]] }\n | { type: 'half-solo'; item: ComponentAssembly[0] };\n\nfunction buildLayout(assembly: ComponentAssembly): LayoutGroup[] {\n const groups: LayoutGroup[] = [];\n let i = 0;\n while (i < assembly.length) {\n const cur = assembly[i];\n const next = assembly[i + 1];\n if (resolvedSize(cur) === 'half' && next && resolvedSize(next) === 'half') {\n groups.push({ type: 'pair', items: [cur, next] });\n i += 2;\n } else if (resolvedSize(cur) === 'half') {\n groups.push({ type: 'half-solo', item: cur });\n i++;\n } else {\n groups.push({ type: 'full', item: cur });\n i++;\n }\n }\n return groups;\n}\n\n// ── X-ray badge ───────────────────────────────────────────────────────────────\n\nfunction XrayBadge({ name, size }: { name: string; size: string }) {\n return (\n <div style={{ position: 'absolute', top: '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\nconst PAIR_STYLE = '.sp-pair{display:grid;grid-template-columns:1fr 1fr;gap:1.25rem}@media(max-width:640px){.sp-pair{grid-template-columns:1fr}}';\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 <style dangerouslySetInnerHTML={{ __html: PAIR_STYLE }} />\n {layout.map((group, i) => {\n if (group.type === 'full') {\n return (\n <div key={i} style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.item.component} size=\"full\" />}\n {renderSingle(group.item, brand)}\n </div>\n );\n }\n if (group.type === 'pair') {\n return (\n <div key={i} className=\"sp-pair\">\n <div style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.items[0].component} size=\"half\" />}\n {renderSingle(group.items[0], brand)}\n </div>\n <div style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.items[1].component} size=\"half\" />}\n {renderSingle(group.items[1], brand)}\n </div>\n </div>\n );\n }\n return (\n <div key={i} style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.item.component} size=\"full\" />}\n {renderSingle(group.item, brand)}\n </div>\n );\n })}\n </div>\n );\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { ComponentRenderer } from './ComponentRenderer';\nimport type { ComponentAssembly } from './types';\n\ntype ConversionCheckResult =\n | { matched: false }\n | { matched: true; goalName: string | null; goalType: string; valueSelector: string | null; currencySelector: string | null; defaultCurrency: string };\n\nconst CSS_TOKENS = `:root{--sp-accent:#60a5fa;--sp-accent-bg:rgba(96,165,250,0.1);--sp-accent-border:rgba(96,165,250,0.2);--sp-bg:#18181b;--sp-surface:#09090b;--sp-border:#27272a;--sp-text:#f4f4f5;--sp-text-sub:#d4d4d8;--sp-text-strong:#e4e4e7;--sp-text-muted:#71717a;--sp-text-dim:#52525b;--sp-text-body:#a1a1aa;--sp-positive:#6ee7b7;--sp-divider:rgba(255,255,255,0.06);--sp-code-bg:rgba(255,255,255,0.07);--sp-code-border:rgba(255,255,255,0.08);--sp-pre-bg:rgba(0,0,0,0.4)}.sp-prose p{margin-bottom:.625rem}.sp-prose p:last-child{margin-bottom:0}.sp-prose ul{list-style:disc;padding-left:1.25rem;margin-bottom:.625rem}.sp-prose ol{list-style:decimal;padding-left:1.25rem;margin-bottom:.625rem}.sp-prose li{margin-bottom:.25rem}.sp-prose strong{color:var(--sp-text-strong);font-weight:600}.sp-prose h2,.sp-prose h3{color:var(--sp-text);font-weight:600;margin:.875rem 0 .375rem;font-size:1rem}.sp-prose code{background:var(--sp-code-bg);border:1px solid var(--sp-code-border);padding:.1rem .35rem;border-radius:.25rem;font-size:.82em;color:var(--sp-text)}.sp-prose blockquote{border-left:3px solid var(--sp-border);padding-left:1rem;color:var(--sp-text-muted);margin:.75rem 0}`;\n\n\nfunction buildSummary(pageHint: string, orgSlug: string): string {\n const parts: string[] = [pageHint];\n const referrer = document.referrer;\n if (referrer) parts.push(`Arrived from: ${referrer}`);\n const p = new URLSearchParams(window.location.search);\n const source = p.get('utm_source');\n const medium = p.get('utm_medium');\n const campaign = p.get('utm_campaign');\n const term = p.get('utm_term');\n if (source) parts.push(`Source: ${source}`);\n if (medium) parts.push(`Medium: ${medium}`);\n if (campaign) parts.push(`Campaign: ${campaign}`);\n if (term) parts.push(`Search term: ${term}`);\n try {\n const history = localStorage.getItem(`_spectare_visits_${orgSlug}`);\n if (history) parts.push(`Previously visited: ${history}`);\n } catch { /* private browsing */ }\n return parts.filter(Boolean).join('. ');\n}\n\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>(initialAssembly ?? []);\n const [loading, setLoading] = useState(!initialAssembly);\n const [orgName, setOrgName] = useState<string | undefined>(undefined);\n const tokenRef = useRef<string | null>(null);\n const conversionFiredRef = useRef(false);\n\n useEffect(() => {\n let cancelled = false;\n\n async function load() {\n try {\n const p = new URLSearchParams(window.location.search);\n const utmSuffix = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term']\n .map(k => p.get(k) ?? '').filter(Boolean).join('_');\n const tokenKey = `_spectare_token_${orgSlug}${utmSuffix ? '_' + utmSuffix : ''}`;\n let token = sessionStorage.getItem(tokenKey);\n\n if (!token) {\n const summary = buildSummary(pageHint ?? `Visiting ${document.title}`, orgSlug);\n const res = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!res.ok || cancelled) { setLoading(false); return; }\n const data = await res.json();\n token = data.token as string | undefined ?? null;\n if (token) sessionStorage.setItem(tokenKey, token);\n if (data.orgName) setOrgName(data.orgName as string);\n }\n\n if (!token || cancelled) { setLoading(false); return; }\n\n tokenRef.current = token;\n let res = await fetch(`${baseUrl}/api/assemble/components`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token, orgSlug }),\n });\n\n if (res.status === 401 && !cancelled) {\n sessionStorage.removeItem(tokenKey);\n const summary = buildSummary(pageHint ?? `Visiting ${document.title}`, orgSlug);\n const qRes = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!qRes.ok || cancelled) { setLoading(false); return; }\n const qData = await qRes.json();\n token = qData.token as string | undefined ?? null;\n if (token) {\n sessionStorage.setItem(tokenKey, token);\n tokenRef.current = token;\n }\n if (!token || cancelled) { setLoading(false); return; }\n res = await fetch(`${baseUrl}/api/assemble/components`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token, orgSlug }),\n });\n }\n\n if (!res.ok || cancelled) { setLoading(false); return; }\n\n const contentType = res.headers.get('content-type') ?? '';\n\n if (contentType.includes('text/event-stream')) {\n // Cold path: stream components as Claude generates them.\n // Render progressively — shimmer shows until the first component arrives.\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let buf = '';\n let loadingCleared = false;\n try {\n while (!cancelled) {\n const { done, value } = await reader.read();\n if (done || cancelled) break;\n buf += decoder.decode(value, { stream: true });\n const lines = buf.split('\\n');\n buf = lines.pop() ?? '';\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const payload = line.slice(6).trim();\n if (payload === '[DONE]') break;\n try {\n const comp = JSON.parse(payload) as ComponentAssembly[0];\n if (!loadingCleared) { setLoading(false); loadingCleared = true; }\n setAssembly(prev => [...prev, comp]);\n } catch { /* malformed event — skip */ }\n }\n }\n } finally {\n reader.cancel().catch(() => {});\n }\n } else {\n // Warm path: cache hit returns full JSON immediately.\n const data = await res.json() as {\n assembly?: ComponentAssembly;\n intent?: { userContext?: { audience?: string; stage?: string } };\n };\n\n if (cancelled) return;\n\n const clientAudience = data.intent?.userContext?.audience;\n const clientStage = data.intent?.userContext?.stage;\n const ssrMatches =\n initialIntent &&\n clientAudience === initialIntent.audience &&\n clientStage === initialIntent.stage;\n\n if (!ssrMatches && Array.isArray(data.assembly) && data.assembly.length > 0) {\n setAssembly(data.assembly as ComponentAssembly);\n }\n }\n } catch {\n // fail silently\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n\n load();\n return () => { cancelled = true; };\n }, [orgSlug, baseUrl, pageHint, initialAssembly, initialIntent]);\n\n useEffect(() => {\n if (!assembly.length || conversionFiredRef.current) return;\n const token = tokenRef.current;\n if (!token) return;\n const url = window.location.href;\n fetch(`${baseUrl}/api/conversion-check`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ orgSlug, url }),\n }).then(r => r.json() as Promise<ConversionCheckResult>).then(data => {\n if (!data.matched) return;\n conversionFiredRef.current = true;\n let goalValue: number | null = null;\n let goalCurrency: string | null = data.defaultCurrency;\n if (data.valueSelector) {\n try {\n const el = document.querySelector(data.valueSelector);\n if (el) {\n const num = parseFloat((el.textContent ?? '').trim().replace(/[^0-9.]/g, ''));\n if (!isNaN(num)) goalValue = num;\n }\n } catch { /* skip */ }\n }\n if (data.currencySelector) {\n try {\n const el = document.querySelector(data.currencySelector);\n if (el) goalCurrency = (el.textContent ?? '').trim() || goalCurrency;\n } catch { /* skip */ }\n }\n fetch(`${baseUrl}/api/conversion`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n token,\n orgSlug,\n url,\n ...(data.goalName ? { goalName: data.goalName } : {}),\n ...(goalValue !== null ? { goalValue, goalCurrency } : {}),\n }),\n }).catch(() => {});\n }).catch(() => {});\n }, [assembly, orgSlug, baseUrl]);\n\n if (!loading && assembly.length === 0) return null;\n\n return (\n <>\n <style dangerouslySetInnerHTML={{ __html: CSS_TOKENS }} />\n <style dangerouslySetInnerHTML={{ __html: '@keyframes sp-pulse{0%,100%{opacity:1}50%{opacity:0.4}}' }} />\n <div className={className} style={style}>\n {loading && assembly.length === 0\n ? <Shimmer />\n : <ComponentRenderer assembly={assembly} brand={brand ?? orgName} />}\n </div>\n </>\n );\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
|
|
3
|
-
type ComponentName = 'HeroStatement' | 'AtomCard' | 'StatGrid' | 'CodeBlock' | 'ComparisonTable' | 'FeatureList' | 'TestimonialCard' | '
|
|
3
|
+
type ComponentName = 'HeroStatement' | 'AtomCard' | 'StatGrid' | 'CodeBlock' | 'ComparisonTable' | 'FeatureList' | 'TestimonialCard' | 'ImageCtaHero' | 'CtaStrip';
|
|
4
4
|
type ComponentAssembly = Array<{
|
|
5
5
|
component: ComponentName;
|
|
6
6
|
slots?: Record<string, unknown>;
|
|
@@ -21,10 +21,8 @@ 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[];
|
|
26
24
|
}
|
|
27
|
-
declare function PersonalisedSection({ orgSlug, baseUrl, brand, pageHint, className, style, initialAssembly, initialIntent,
|
|
25
|
+
declare function PersonalisedSection({ orgSlug, baseUrl, brand, pageHint, className, style, initialAssembly, initialIntent, }: PersonalisedSectionProps): react.JSX.Element | null;
|
|
28
26
|
|
|
29
27
|
interface ComponentRendererProps {
|
|
30
28
|
assembly: ComponentAssembly;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
|
|
3
|
-
type ComponentName = 'HeroStatement' | 'AtomCard' | 'StatGrid' | 'CodeBlock' | 'ComparisonTable' | 'FeatureList' | 'TestimonialCard' | '
|
|
3
|
+
type ComponentName = 'HeroStatement' | 'AtomCard' | 'StatGrid' | 'CodeBlock' | 'ComparisonTable' | 'FeatureList' | 'TestimonialCard' | 'ImageCtaHero' | 'CtaStrip';
|
|
4
4
|
type ComponentAssembly = Array<{
|
|
5
5
|
component: ComponentName;
|
|
6
6
|
slots?: Record<string, unknown>;
|
|
@@ -21,10 +21,8 @@ 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[];
|
|
26
24
|
}
|
|
27
|
-
declare function PersonalisedSection({ orgSlug, baseUrl, brand, pageHint, className, style, initialAssembly, initialIntent,
|
|
25
|
+
declare function PersonalisedSection({ orgSlug, baseUrl, brand, pageHint, className, style, initialAssembly, initialIntent, }: PersonalisedSectionProps): react.JSX.Element | null;
|
|
28
26
|
|
|
29
27
|
interface ComponentRendererProps {
|
|
30
28
|
assembly: ComponentAssembly;
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useState, useRef, useEffect } from 'react';
|
|
2
2
|
import { marked } from 'marked';
|
|
3
|
-
import {
|
|
3
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
4
4
|
|
|
5
5
|
// src/PersonalisedSection.tsx
|
|
6
6
|
function renderMarkdown(content) {
|
|
@@ -28,12 +28,12 @@ function AtomCard({ title, content }) {
|
|
|
28
28
|
}
|
|
29
29
|
function StatGrid({ stats, caption }) {
|
|
30
30
|
const cols = stats.length === 2 ? 2 : stats.length === 3 ? 3 : 4;
|
|
31
|
-
return /* @__PURE__ */ jsxs("div", {
|
|
32
|
-
/* @__PURE__ */ jsx("div", { style: { display: "grid", gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: "
|
|
33
|
-
/* @__PURE__ */ jsx("p", { style: { fontSize: "
|
|
34
|
-
/* @__PURE__ */ jsx("p", { style: { fontSize: "
|
|
31
|
+
return /* @__PURE__ */ jsxs("div", { children: [
|
|
32
|
+
/* @__PURE__ */ jsx("div", { style: { display: "grid", gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: "0.75rem" }, children: stats.map(({ value, label }) => /* @__PURE__ */ jsxs("div", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "0.625rem", padding: "1rem 1.25rem", display: "flex", flexDirection: "column", justifyContent: "space-between", minHeight: "5.5rem" }, children: [
|
|
33
|
+
/* @__PURE__ */ jsx("p", { style: { fontSize: "0.6875rem", color: "var(--sp-text-muted)", textTransform: "uppercase", letterSpacing: "0.06em", margin: "0 0 0.75rem", lineHeight: 1.3 }, children: label }),
|
|
34
|
+
/* @__PURE__ */ jsx("p", { style: { fontSize: "1.25rem", fontWeight: 500, color: "var(--sp-text)", fontVariantNumeric: "tabular-nums", lineHeight: 1, margin: 0 }, children: value })
|
|
35
35
|
] }, label)) }),
|
|
36
|
-
caption && /* @__PURE__ */ jsx("p", { style: { fontSize: "0.75rem", color: "var(--sp-text-muted)",
|
|
36
|
+
caption && /* @__PURE__ */ jsx("p", { style: { fontSize: "0.75rem", color: "var(--sp-text-muted)", marginTop: "0.75rem", margin: "0.75rem 0 0" }, children: caption })
|
|
37
37
|
] });
|
|
38
38
|
}
|
|
39
39
|
function CodeBlock({ code, lang = "typescript", caption }) {
|
|
@@ -84,11 +84,17 @@ function TestimonialCard({ quote, name, role, company }) {
|
|
|
84
84
|
] })
|
|
85
85
|
] });
|
|
86
86
|
}
|
|
87
|
-
function
|
|
87
|
+
function ImageCtaHero({ src, alt = "", headline, subheading, ctaLabel, ctaHref }) {
|
|
88
88
|
if (!src) return null;
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
return /* @__PURE__ */ jsxs("div", { style: { borderRadius: "0.75rem", overflow: "hidden", position: "relative", width: "100%", paddingBottom: "56.25%" }, children: [
|
|
90
|
+
/* @__PURE__ */ jsx("img", { src, alt, style: { position: "absolute", inset: 0, width: "100%", height: "100%", objectFit: "cover" } }),
|
|
91
|
+
/* @__PURE__ */ jsx("div", { style: { position: "absolute", inset: 0, background: "linear-gradient(to top, rgba(0,0,0,0.85) 0%, rgba(0,0,0,0.3) 55%, transparent 100%)" } }),
|
|
92
|
+
/* @__PURE__ */ jsxs("div", { style: { position: "absolute", bottom: 0, left: 0, right: 0, padding: "1.75rem" }, children: [
|
|
93
|
+
headline && /* @__PURE__ */ jsx("h2", { style: { fontSize: "1.5rem", fontWeight: 700, color: "#fff", lineHeight: 1.2, margin: "0 0 0.5rem", letterSpacing: "-0.02em" }, children: headline }),
|
|
94
|
+
subheading && /* @__PURE__ */ jsx("p", { style: { fontSize: "0.875rem", color: "rgba(255,255,255,0.75)", lineHeight: 1.5, margin: "0 0 1.25rem" }, children: subheading }),
|
|
95
|
+
ctaHref && ctaLabel && /* @__PURE__ */ jsx("a", { href: ctaHref, style: { display: "inline-block", background: "#fff", color: "#09090b", padding: "0.5rem 1.25rem", borderRadius: "0.5rem", fontWeight: 600, fontSize: "0.875rem", textDecoration: "none" }, children: ctaLabel })
|
|
96
|
+
] })
|
|
97
|
+
] });
|
|
92
98
|
}
|
|
93
99
|
function CtaStrip({ headline, primary, secondary }) {
|
|
94
100
|
return /* @__PURE__ */ jsxs("div", { style: { border: "1px solid var(--sp-border)", borderRadius: "0.75rem", padding: "2rem", textAlign: "center", background: "var(--sp-bg)" }, children: [
|
|
@@ -120,8 +126,8 @@ function renderSingle(item, brand) {
|
|
|
120
126
|
return /* @__PURE__ */ jsx(FeatureList, { items: s.items });
|
|
121
127
|
case "TestimonialCard":
|
|
122
128
|
return /* @__PURE__ */ jsx(TestimonialCard, { quote: s.quote, name: s.name, role: s.role, company: s.company });
|
|
123
|
-
case "
|
|
124
|
-
return /* @__PURE__ */ jsx(
|
|
129
|
+
case "ImageCtaHero":
|
|
130
|
+
return /* @__PURE__ */ jsx(ImageCtaHero, { src: s.src, alt: s.alt, headline: s.headline, subheading: s.subheading, ctaLabel: s.ctaLabel, ctaHref: s.ctaHref });
|
|
125
131
|
case "CtaStrip":
|
|
126
132
|
return /* @__PURE__ */ jsx(CtaStrip, { headline: s.headline, primary: s.primary, secondary: s.secondary });
|
|
127
133
|
default:
|
|
@@ -157,43 +163,38 @@ function XrayBadge({ name, size }) {
|
|
|
157
163
|
/* @__PURE__ */ jsx("span", { style: { fontSize: "0.625rem", fontFamily: "monospace", color: "#71717a", lineHeight: 1 }, children: size })
|
|
158
164
|
] });
|
|
159
165
|
}
|
|
166
|
+
var PAIR_STYLE = ".sp-pair{display:grid;grid-template-columns:1fr 1fr;gap:1.25rem}@media(max-width:640px){.sp-pair{grid-template-columns:1fr}}";
|
|
160
167
|
function ComponentRenderer({ assembly, brand, xray = false }) {
|
|
161
168
|
const layout = buildLayout(assembly);
|
|
162
|
-
return /* @__PURE__ */
|
|
163
|
-
|
|
169
|
+
return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "1.25rem" }, children: [
|
|
170
|
+
/* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: PAIR_STYLE } }),
|
|
171
|
+
layout.map((group, i) => {
|
|
172
|
+
if (group.type === "full") {
|
|
173
|
+
return /* @__PURE__ */ jsxs("div", { style: xray ? { position: "relative" } : void 0, children: [
|
|
174
|
+
xray && /* @__PURE__ */ jsx(XrayBadge, { name: group.item.component, size: "full" }),
|
|
175
|
+
renderSingle(group.item, brand)
|
|
176
|
+
] }, i);
|
|
177
|
+
}
|
|
178
|
+
if (group.type === "pair") {
|
|
179
|
+
return /* @__PURE__ */ jsxs("div", { className: "sp-pair", children: [
|
|
180
|
+
/* @__PURE__ */ jsxs("div", { style: xray ? { position: "relative" } : void 0, children: [
|
|
181
|
+
xray && /* @__PURE__ */ jsx(XrayBadge, { name: group.items[0].component, size: "half" }),
|
|
182
|
+
renderSingle(group.items[0], brand)
|
|
183
|
+
] }),
|
|
184
|
+
/* @__PURE__ */ jsxs("div", { style: xray ? { position: "relative" } : void 0, children: [
|
|
185
|
+
xray && /* @__PURE__ */ jsx(XrayBadge, { name: group.items[1].component, size: "half" }),
|
|
186
|
+
renderSingle(group.items[1], brand)
|
|
187
|
+
] })
|
|
188
|
+
] }, i);
|
|
189
|
+
}
|
|
164
190
|
return /* @__PURE__ */ jsxs("div", { style: xray ? { position: "relative" } : void 0, children: [
|
|
165
191
|
xray && /* @__PURE__ */ jsx(XrayBadge, { name: group.item.component, size: "full" }),
|
|
166
192
|
renderSingle(group.item, brand)
|
|
167
193
|
] }, i);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
return /* @__PURE__ */ jsxs("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: "1.25rem" }, children: [
|
|
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
|
-
] })
|
|
179
|
-
] }, i);
|
|
180
|
-
}
|
|
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);
|
|
185
|
-
}) });
|
|
194
|
+
})
|
|
195
|
+
] });
|
|
186
196
|
}
|
|
187
197
|
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
|
-
}
|
|
197
198
|
function buildSummary(pageHint, orgSlug) {
|
|
198
199
|
const parts = [pageHint];
|
|
199
200
|
const referrer = document.referrer;
|
|
@@ -230,14 +231,13 @@ function PersonalisedSection({
|
|
|
230
231
|
className,
|
|
231
232
|
style,
|
|
232
233
|
initialAssembly,
|
|
233
|
-
initialIntent
|
|
234
|
-
conversionUrlPatterns
|
|
234
|
+
initialIntent
|
|
235
235
|
}) {
|
|
236
|
-
const [assembly, setAssembly] = useState(initialAssembly != null ? initialAssembly :
|
|
236
|
+
const [assembly, setAssembly] = useState(initialAssembly != null ? initialAssembly : []);
|
|
237
237
|
const [loading, setLoading] = useState(!initialAssembly);
|
|
238
|
+
const [orgName, setOrgName] = useState(void 0);
|
|
238
239
|
const tokenRef = useRef(null);
|
|
239
240
|
const conversionFiredRef = useRef(false);
|
|
240
|
-
const conversionPatternsRef = useRef(conversionUrlPatterns != null ? conversionUrlPatterns : []);
|
|
241
241
|
useEffect(() => {
|
|
242
242
|
let cancelled = false;
|
|
243
243
|
async function load() {
|
|
@@ -261,11 +261,10 @@ function PersonalisedSection({
|
|
|
261
261
|
setLoading(false);
|
|
262
262
|
return;
|
|
263
263
|
}
|
|
264
|
-
const
|
|
265
|
-
token = (_a =
|
|
264
|
+
const data = await res2.json();
|
|
265
|
+
token = (_a = data.token) != null ? _a : null;
|
|
266
266
|
if (token) sessionStorage.setItem(tokenKey, token);
|
|
267
|
-
|
|
268
|
-
conversionPatternsRef.current = [.../* @__PURE__ */ new Set([...conversionUrlPatterns != null ? conversionUrlPatterns : [], ...orgPatterns])];
|
|
267
|
+
if (data.orgName) setOrgName(data.orgName);
|
|
269
268
|
}
|
|
270
269
|
if (!token || cancelled) {
|
|
271
270
|
setLoading(false);
|
|
@@ -290,12 +289,10 @@ function PersonalisedSection({
|
|
|
290
289
|
return;
|
|
291
290
|
}
|
|
292
291
|
const qData = await qRes.json();
|
|
293
|
-
token = (
|
|
292
|
+
token = (_b = qData.token) != null ? _b : null;
|
|
294
293
|
if (token) {
|
|
295
294
|
sessionStorage.setItem(tokenKey, token);
|
|
296
295
|
tokenRef.current = token;
|
|
297
|
-
const orgPatterns = (_d = qData.conversionUrlPatterns) != null ? _d : [];
|
|
298
|
-
conversionPatternsRef.current = [.../* @__PURE__ */ new Set([...conversionUrlPatterns != null ? conversionUrlPatterns : [], ...orgPatterns])];
|
|
299
296
|
}
|
|
300
297
|
if (!token || cancelled) {
|
|
301
298
|
setLoading(false);
|
|
@@ -311,13 +308,47 @@ function PersonalisedSection({
|
|
|
311
308
|
setLoading(false);
|
|
312
309
|
return;
|
|
313
310
|
}
|
|
314
|
-
const
|
|
315
|
-
if (
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
311
|
+
const contentType = (_c = res.headers.get("content-type")) != null ? _c : "";
|
|
312
|
+
if (contentType.includes("text/event-stream")) {
|
|
313
|
+
const reader = res.body.getReader();
|
|
314
|
+
const decoder = new TextDecoder();
|
|
315
|
+
let buf = "";
|
|
316
|
+
let loadingCleared = false;
|
|
317
|
+
try {
|
|
318
|
+
while (!cancelled) {
|
|
319
|
+
const { done, value } = await reader.read();
|
|
320
|
+
if (done || cancelled) break;
|
|
321
|
+
buf += decoder.decode(value, { stream: true });
|
|
322
|
+
const lines = buf.split("\n");
|
|
323
|
+
buf = (_d = lines.pop()) != null ? _d : "";
|
|
324
|
+
for (const line of lines) {
|
|
325
|
+
if (!line.startsWith("data: ")) continue;
|
|
326
|
+
const payload = line.slice(6).trim();
|
|
327
|
+
if (payload === "[DONE]") break;
|
|
328
|
+
try {
|
|
329
|
+
const comp = JSON.parse(payload);
|
|
330
|
+
if (!loadingCleared) {
|
|
331
|
+
setLoading(false);
|
|
332
|
+
loadingCleared = true;
|
|
333
|
+
}
|
|
334
|
+
setAssembly((prev) => [...prev, comp]);
|
|
335
|
+
} catch (e) {
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
} finally {
|
|
340
|
+
reader.cancel().catch(() => {
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
} else {
|
|
344
|
+
const data = await res.json();
|
|
345
|
+
if (cancelled) return;
|
|
346
|
+
const clientAudience = (_f = (_e = data.intent) == null ? void 0 : _e.userContext) == null ? void 0 : _f.audience;
|
|
347
|
+
const clientStage = (_h = (_g = data.intent) == null ? void 0 : _g.userContext) == null ? void 0 : _h.stage;
|
|
348
|
+
const ssrMatches = initialIntent && clientAudience === initialIntent.audience && clientStage === initialIntent.stage;
|
|
349
|
+
if (!ssrMatches && Array.isArray(data.assembly) && data.assembly.length > 0) {
|
|
350
|
+
setAssembly(data.assembly);
|
|
351
|
+
}
|
|
321
352
|
}
|
|
322
353
|
} catch (e) {
|
|
323
354
|
} finally {
|
|
@@ -330,24 +361,57 @@ function PersonalisedSection({
|
|
|
330
361
|
};
|
|
331
362
|
}, [orgSlug, baseUrl, pageHint, initialAssembly, initialIntent]);
|
|
332
363
|
useEffect(() => {
|
|
333
|
-
if (!assembly
|
|
334
|
-
const url = window.location.href;
|
|
335
|
-
if (!conversionPatternsRef.current.some((p) => url.includes(p))) return;
|
|
336
|
-
conversionFiredRef.current = true;
|
|
364
|
+
if (!assembly.length || conversionFiredRef.current) return;
|
|
337
365
|
const token = tokenRef.current;
|
|
338
366
|
if (!token) return;
|
|
339
|
-
|
|
367
|
+
const url = window.location.href;
|
|
368
|
+
fetch(`${baseUrl}/api/conversion-check`, {
|
|
340
369
|
method: "POST",
|
|
341
370
|
headers: { "Content-Type": "application/json" },
|
|
342
|
-
body: JSON.stringify({
|
|
371
|
+
body: JSON.stringify({ orgSlug, url })
|
|
372
|
+
}).then((r) => r.json()).then((data) => {
|
|
373
|
+
var _a, _b;
|
|
374
|
+
if (!data.matched) return;
|
|
375
|
+
conversionFiredRef.current = true;
|
|
376
|
+
let goalValue = null;
|
|
377
|
+
let goalCurrency = data.defaultCurrency;
|
|
378
|
+
if (data.valueSelector) {
|
|
379
|
+
try {
|
|
380
|
+
const el = document.querySelector(data.valueSelector);
|
|
381
|
+
if (el) {
|
|
382
|
+
const num = parseFloat(((_a = el.textContent) != null ? _a : "").trim().replace(/[^0-9.]/g, ""));
|
|
383
|
+
if (!isNaN(num)) goalValue = num;
|
|
384
|
+
}
|
|
385
|
+
} catch (e) {
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
if (data.currencySelector) {
|
|
389
|
+
try {
|
|
390
|
+
const el = document.querySelector(data.currencySelector);
|
|
391
|
+
if (el) goalCurrency = ((_b = el.textContent) != null ? _b : "").trim() || goalCurrency;
|
|
392
|
+
} catch (e) {
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
fetch(`${baseUrl}/api/conversion`, {
|
|
396
|
+
method: "POST",
|
|
397
|
+
headers: { "Content-Type": "application/json" },
|
|
398
|
+
body: JSON.stringify({
|
|
399
|
+
token,
|
|
400
|
+
orgSlug,
|
|
401
|
+
url,
|
|
402
|
+
...data.goalName ? { goalName: data.goalName } : {},
|
|
403
|
+
...goalValue !== null ? { goalValue, goalCurrency } : {}
|
|
404
|
+
})
|
|
405
|
+
}).catch(() => {
|
|
406
|
+
});
|
|
343
407
|
}).catch(() => {
|
|
344
408
|
});
|
|
345
409
|
}, [assembly, orgSlug, baseUrl]);
|
|
346
|
-
if (!loading &&
|
|
410
|
+
if (!loading && assembly.length === 0) return null;
|
|
347
411
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
348
412
|
/* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: CSS_TOKENS } }),
|
|
349
413
|
/* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: "@keyframes sp-pulse{0%,100%{opacity:1}50%{opacity:0.4}}" } }),
|
|
350
|
-
/* @__PURE__ */ jsx("div", { className, style, children: loading ? /* @__PURE__ */ jsx(Shimmer, {}) :
|
|
414
|
+
/* @__PURE__ */ jsx("div", { className, style, children: loading && assembly.length === 0 ? /* @__PURE__ */ jsx(Shimmer, {}) : /* @__PURE__ */ jsx(ComponentRenderer, { assembly, brand: brand != null ? brand : orgName }) })
|
|
351
415
|
] });
|
|
352
416
|
}
|
|
353
417
|
|
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 { 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, orgSlug: string): string {\n const parts: string[] = [pageHint];\n const referrer = document.referrer;\n if (referrer) parts.push(`Arrived from: ${referrer}`);\n const p = new URLSearchParams(window.location.search);\n const source = p.get('utm_source');\n const medium = p.get('utm_medium');\n const campaign = p.get('utm_campaign');\n const term = p.get('utm_term');\n if (source) parts.push(`Source: ${source}`);\n if (medium) parts.push(`Medium: ${medium}`);\n if (campaign) parts.push(`Campaign: ${campaign}`);\n if (term) parts.push(`Search term: ${term}`);\n try {\n const history = localStorage.getItem(`_spectare_visits_${orgSlug}`);\n if (history) parts.push(`Previously visited: ${history}`);\n } catch { /* private browsing */ }\n return parts.filter(Boolean).join('. ');\n}\n\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}`, orgSlug);\n const res = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!res.ok || cancelled) { setLoading(false); return; }\n const data = await res.json();\n token = data.token as string | undefined ?? null;\n if (token) sessionStorage.setItem(tokenKey, token);\n 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}`, orgSlug);\n const qRes = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!qRes.ok || cancelled) { setLoading(false); return; }\n const qData = await qRes.json();\n token = qData.token as string | undefined ?? null;\n if (token) {\n sessionStorage.setItem(tokenKey, token);\n tokenRef.current = token;\n 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"]}
|
|
1
|
+
{"version":3,"sources":["../src/ComponentRenderer.tsx","../src/PersonalisedSection.tsx"],"names":["jsxs","jsx","_a","res"],"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>\n <div style={{ display: 'grid', gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: '0.75rem' }}>\n {stats.map(({ value, label }) => (\n <div key={label} style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '0.625rem', padding: '1rem 1.25rem', display: 'flex', flexDirection: 'column', justifyContent: 'space-between', minHeight: '5.5rem' }}>\n <p style={{ fontSize: '0.6875rem', color: 'var(--sp-text-muted)', textTransform: 'uppercase', letterSpacing: '0.06em', margin: '0 0 0.75rem', lineHeight: 1.3 }}>{label}</p>\n <p style={{ fontSize: '1.25rem', fontWeight: 500, color: 'var(--sp-text)', fontVariantNumeric: 'tabular-nums', lineHeight: 1, margin: 0 }}>{value}</p>\n </div>\n ))}\n </div>\n {caption && (\n <p style={{ fontSize: '0.75rem', color: 'var(--sp-text-muted)', marginTop: '0.75rem', margin: '0.75rem 0 0' }}>{caption}</p>\n )}\n </div>\n );\n}\n\nfunction CodeBlock({ code, lang = 'typescript', caption }: { code: string; lang?: string; caption?: string }) {\n return (\n <div style={{ borderRadius: '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 ImageCtaHero({ src, alt = '', headline, subheading, ctaLabel, ctaHref }: { src?: string; alt?: string; headline?: string; subheading?: string; ctaLabel?: string; ctaHref?: string }) {\n if (!src) return null;\n return (\n <div style={{ borderRadius: '0.75rem', overflow: 'hidden', position: 'relative', width: '100%', paddingBottom: '56.25%' }}>\n <img src={src} alt={alt} style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', objectFit: 'cover' }} />\n <div style={{ position: 'absolute', inset: 0, background: 'linear-gradient(to top, rgba(0,0,0,0.85) 0%, rgba(0,0,0,0.3) 55%, transparent 100%)' }} />\n <div style={{ position: 'absolute', bottom: 0, left: 0, right: 0, padding: '1.75rem' }}>\n {headline && (\n <h2 style={{ fontSize: '1.5rem', fontWeight: 700, color: '#fff', lineHeight: 1.2, margin: '0 0 0.5rem', letterSpacing: '-0.02em' }}>{headline}</h2>\n )}\n {subheading && (\n <p style={{ fontSize: '0.875rem', color: 'rgba(255,255,255,0.75)', lineHeight: 1.5, margin: '0 0 1.25rem' }}>{subheading}</p>\n )}\n {ctaHref && ctaLabel && (\n <a href={ctaHref} style={{ display: 'inline-block', background: '#fff', color: '#09090b', padding: '0.5rem 1.25rem', borderRadius: '0.5rem', fontWeight: 600, fontSize: '0.875rem', textDecoration: 'none' }}>\n {ctaLabel}\n </a>\n )}\n </div>\n </div>\n );\n}\n\nfunction CtaStrip({ headline, primary, secondary }: { headline: string; primary: { label: string; href: string }; secondary?: { label: string; href: string } }) {\n return (\n <div style={{ border: '1px solid var(--sp-border)', borderRadius: '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 'ImageCtaHero': return <ImageCtaHero src={s.src} alt={s.alt} headline={s.headline} subheading={s.subheading} ctaLabel={s.ctaLabel} ctaHref={s.ctaHref} />;\n case 'CtaStrip': return <CtaStrip headline={s.headline} primary={s.primary} secondary={s.secondary} />;\n default: return null;\n }\n}\n\n// ── Layout ────────────────────────────────────────────────────────────────────\n\nfunction resolvedSize(item: ComponentAssembly[0]): 'full' | 'half' {\n if (item.size) return item.size;\n return HALF_COMPONENTS.has(item.component as ComponentName) ? 'half' : 'full';\n}\n\ntype LayoutGroup =\n | { type: 'full'; item: ComponentAssembly[0] }\n | { type: 'pair'; items: [ComponentAssembly[0], ComponentAssembly[0]] }\n | { type: 'half-solo'; item: ComponentAssembly[0] };\n\nfunction buildLayout(assembly: ComponentAssembly): LayoutGroup[] {\n const groups: LayoutGroup[] = [];\n let i = 0;\n while (i < assembly.length) {\n const cur = assembly[i];\n const next = assembly[i + 1];\n if (resolvedSize(cur) === 'half' && next && resolvedSize(next) === 'half') {\n groups.push({ type: 'pair', items: [cur, next] });\n i += 2;\n } else if (resolvedSize(cur) === 'half') {\n groups.push({ type: 'half-solo', item: cur });\n i++;\n } else {\n groups.push({ type: 'full', item: cur });\n i++;\n }\n }\n return groups;\n}\n\n// ── X-ray badge ───────────────────────────────────────────────────────────────\n\nfunction XrayBadge({ name, size }: { name: string; size: string }) {\n return (\n <div style={{ position: 'absolute', top: '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\nconst PAIR_STYLE = '.sp-pair{display:grid;grid-template-columns:1fr 1fr;gap:1.25rem}@media(max-width:640px){.sp-pair{grid-template-columns:1fr}}';\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 <style dangerouslySetInnerHTML={{ __html: PAIR_STYLE }} />\n {layout.map((group, i) => {\n if (group.type === 'full') {\n return (\n <div key={i} style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.item.component} size=\"full\" />}\n {renderSingle(group.item, brand)}\n </div>\n );\n }\n if (group.type === 'pair') {\n return (\n <div key={i} className=\"sp-pair\">\n <div style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.items[0].component} size=\"half\" />}\n {renderSingle(group.items[0], brand)}\n </div>\n <div style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.items[1].component} size=\"half\" />}\n {renderSingle(group.items[1], brand)}\n </div>\n </div>\n );\n }\n return (\n <div key={i} style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.item.component} size=\"full\" />}\n {renderSingle(group.item, brand)}\n </div>\n );\n })}\n </div>\n );\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { ComponentRenderer } from './ComponentRenderer';\nimport type { ComponentAssembly } from './types';\n\ntype ConversionCheckResult =\n | { matched: false }\n | { matched: true; goalName: string | null; goalType: string; valueSelector: string | null; currencySelector: string | null; defaultCurrency: string };\n\nconst CSS_TOKENS = `:root{--sp-accent:#60a5fa;--sp-accent-bg:rgba(96,165,250,0.1);--sp-accent-border:rgba(96,165,250,0.2);--sp-bg:#18181b;--sp-surface:#09090b;--sp-border:#27272a;--sp-text:#f4f4f5;--sp-text-sub:#d4d4d8;--sp-text-strong:#e4e4e7;--sp-text-muted:#71717a;--sp-text-dim:#52525b;--sp-text-body:#a1a1aa;--sp-positive:#6ee7b7;--sp-divider:rgba(255,255,255,0.06);--sp-code-bg:rgba(255,255,255,0.07);--sp-code-border:rgba(255,255,255,0.08);--sp-pre-bg:rgba(0,0,0,0.4)}.sp-prose p{margin-bottom:.625rem}.sp-prose p:last-child{margin-bottom:0}.sp-prose ul{list-style:disc;padding-left:1.25rem;margin-bottom:.625rem}.sp-prose ol{list-style:decimal;padding-left:1.25rem;margin-bottom:.625rem}.sp-prose li{margin-bottom:.25rem}.sp-prose strong{color:var(--sp-text-strong);font-weight:600}.sp-prose h2,.sp-prose h3{color:var(--sp-text);font-weight:600;margin:.875rem 0 .375rem;font-size:1rem}.sp-prose code{background:var(--sp-code-bg);border:1px solid var(--sp-code-border);padding:.1rem .35rem;border-radius:.25rem;font-size:.82em;color:var(--sp-text)}.sp-prose blockquote{border-left:3px solid var(--sp-border);padding-left:1rem;color:var(--sp-text-muted);margin:.75rem 0}`;\n\n\nfunction buildSummary(pageHint: string, orgSlug: string): string {\n const parts: string[] = [pageHint];\n const referrer = document.referrer;\n if (referrer) parts.push(`Arrived from: ${referrer}`);\n const p = new URLSearchParams(window.location.search);\n const source = p.get('utm_source');\n const medium = p.get('utm_medium');\n const campaign = p.get('utm_campaign');\n const term = p.get('utm_term');\n if (source) parts.push(`Source: ${source}`);\n if (medium) parts.push(`Medium: ${medium}`);\n if (campaign) parts.push(`Campaign: ${campaign}`);\n if (term) parts.push(`Search term: ${term}`);\n try {\n const history = localStorage.getItem(`_spectare_visits_${orgSlug}`);\n if (history) parts.push(`Previously visited: ${history}`);\n } catch { /* private browsing */ }\n return parts.filter(Boolean).join('. ');\n}\n\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>(initialAssembly ?? []);\n const [loading, setLoading] = useState(!initialAssembly);\n const [orgName, setOrgName] = useState<string | undefined>(undefined);\n const tokenRef = useRef<string | null>(null);\n const conversionFiredRef = useRef(false);\n\n useEffect(() => {\n let cancelled = false;\n\n async function load() {\n try {\n const p = new URLSearchParams(window.location.search);\n const utmSuffix = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term']\n .map(k => p.get(k) ?? '').filter(Boolean).join('_');\n const tokenKey = `_spectare_token_${orgSlug}${utmSuffix ? '_' + utmSuffix : ''}`;\n let token = sessionStorage.getItem(tokenKey);\n\n if (!token) {\n const summary = buildSummary(pageHint ?? `Visiting ${document.title}`, orgSlug);\n const res = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!res.ok || cancelled) { setLoading(false); return; }\n const data = await res.json();\n token = data.token as string | undefined ?? null;\n if (token) sessionStorage.setItem(tokenKey, token);\n if (data.orgName) setOrgName(data.orgName as string);\n }\n\n if (!token || cancelled) { setLoading(false); return; }\n\n tokenRef.current = token;\n let res = await fetch(`${baseUrl}/api/assemble/components`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token, orgSlug }),\n });\n\n if (res.status === 401 && !cancelled) {\n sessionStorage.removeItem(tokenKey);\n const summary = buildSummary(pageHint ?? `Visiting ${document.title}`, orgSlug);\n const qRes = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!qRes.ok || cancelled) { setLoading(false); return; }\n const qData = await qRes.json();\n token = qData.token as string | undefined ?? null;\n if (token) {\n sessionStorage.setItem(tokenKey, token);\n tokenRef.current = token;\n }\n if (!token || cancelled) { setLoading(false); return; }\n res = await fetch(`${baseUrl}/api/assemble/components`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token, orgSlug }),\n });\n }\n\n if (!res.ok || cancelled) { setLoading(false); return; }\n\n const contentType = res.headers.get('content-type') ?? '';\n\n if (contentType.includes('text/event-stream')) {\n // Cold path: stream components as Claude generates them.\n // Render progressively — shimmer shows until the first component arrives.\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let buf = '';\n let loadingCleared = false;\n try {\n while (!cancelled) {\n const { done, value } = await reader.read();\n if (done || cancelled) break;\n buf += decoder.decode(value, { stream: true });\n const lines = buf.split('\\n');\n buf = lines.pop() ?? '';\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const payload = line.slice(6).trim();\n if (payload === '[DONE]') break;\n try {\n const comp = JSON.parse(payload) as ComponentAssembly[0];\n if (!loadingCleared) { setLoading(false); loadingCleared = true; }\n setAssembly(prev => [...prev, comp]);\n } catch { /* malformed event — skip */ }\n }\n }\n } finally {\n reader.cancel().catch(() => {});\n }\n } else {\n // Warm path: cache hit returns full JSON immediately.\n const data = await res.json() as {\n assembly?: ComponentAssembly;\n intent?: { userContext?: { audience?: string; stage?: string } };\n };\n\n if (cancelled) return;\n\n const clientAudience = data.intent?.userContext?.audience;\n const clientStage = data.intent?.userContext?.stage;\n const ssrMatches =\n initialIntent &&\n clientAudience === initialIntent.audience &&\n clientStage === initialIntent.stage;\n\n if (!ssrMatches && Array.isArray(data.assembly) && data.assembly.length > 0) {\n setAssembly(data.assembly as ComponentAssembly);\n }\n }\n } catch {\n // fail silently\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n\n load();\n return () => { cancelled = true; };\n }, [orgSlug, baseUrl, pageHint, initialAssembly, initialIntent]);\n\n useEffect(() => {\n if (!assembly.length || conversionFiredRef.current) return;\n const token = tokenRef.current;\n if (!token) return;\n const url = window.location.href;\n fetch(`${baseUrl}/api/conversion-check`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ orgSlug, url }),\n }).then(r => r.json() as Promise<ConversionCheckResult>).then(data => {\n if (!data.matched) return;\n conversionFiredRef.current = true;\n let goalValue: number | null = null;\n let goalCurrency: string | null = data.defaultCurrency;\n if (data.valueSelector) {\n try {\n const el = document.querySelector(data.valueSelector);\n if (el) {\n const num = parseFloat((el.textContent ?? '').trim().replace(/[^0-9.]/g, ''));\n if (!isNaN(num)) goalValue = num;\n }\n } catch { /* skip */ }\n }\n if (data.currencySelector) {\n try {\n const el = document.querySelector(data.currencySelector);\n if (el) goalCurrency = (el.textContent ?? '').trim() || goalCurrency;\n } catch { /* skip */ }\n }\n fetch(`${baseUrl}/api/conversion`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n token,\n orgSlug,\n url,\n ...(data.goalName ? { goalName: data.goalName } : {}),\n ...(goalValue !== null ? { goalValue, goalCurrency } : {}),\n }),\n }).catch(() => {});\n }).catch(() => {});\n }, [assembly, orgSlug, baseUrl]);\n\n if (!loading && assembly.length === 0) return null;\n\n return (\n <>\n <style dangerouslySetInnerHTML={{ __html: CSS_TOKENS }} />\n <style dangerouslySetInnerHTML={{ __html: '@keyframes sp-pulse{0%,100%{opacity:1}50%{opacity:0.4}}' }} />\n <div className={className} style={style}>\n {loading && assembly.length === 0\n ? <Shimmer />\n : <ComponentRenderer assembly={assembly} brand={brand ?? orgName} />}\n </div>\n </>\n );\n}\n"]}
|