@spectare-personalisation/react 0.1.3 → 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 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", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "0.75rem", padding: "1.5rem" }, children: [
34
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "grid", gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: "1.5rem" }, children: stats.map(({ value, label }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { textAlign: "center" }, children: [
35
- /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "1.875rem", fontWeight: 700, color: "var(--sp-text)", fontVariantNumeric: "tabular-nums", margin: 0 }, children: value }),
36
- /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "0.75rem", color: "var(--sp-text-muted)", marginTop: "0.375rem", textTransform: "uppercase", letterSpacing: "0.05em" }, children: label })
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)", textAlign: "center", marginTop: "1.25rem", borderTop: "1px solid var(--sp-border)", paddingTop: "1rem" }, children: caption })
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 ImageHero({ src, alt = "", ratio = "16:9" }) {
89
+ function ImageCtaHero({ src, alt = "", headline, subheading, ctaLabel, ctaHref }) {
90
90
  if (!src) return null;
91
- const [w, h] = ratio.split(":").map(Number);
92
- const paddingBottom = w && h ? `${h / w * 100}%` : "56.25%";
93
- return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { borderRadius: "0.75rem", overflow: "hidden", position: "relative", width: "100%", paddingBottom }, children: /* @__PURE__ */ jsxRuntime.jsx("img", { src, alt, style: { position: "absolute", inset: 0, width: "100%", height: "100%", objectFit: "cover" } }) });
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 "ImageHero":
126
- return /* @__PURE__ */ jsxRuntime.jsx(ImageHero, { src: s.src, alt: s.alt, ratio: s.ratio });
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,44 +165,39 @@ 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.jsx("div", { style: { display: "flex", flexDirection: "column", gap: "1.25rem" }, children: layout.map((group, i) => {
165
- if (group.type === "full") {
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
- if (group.type === "pair") {
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
- function buildSummary(pageHint) {
200
+ function buildSummary(pageHint, orgSlug) {
200
201
  const parts = [pageHint];
201
202
  const referrer = document.referrer;
202
203
  if (referrer) parts.push(`Arrived from: ${referrer}`);
@@ -210,7 +211,7 @@ function buildSummary(pageHint) {
210
211
  if (campaign) parts.push(`Campaign: ${campaign}`);
211
212
  if (term) parts.push(`Search term: ${term}`);
212
213
  try {
213
- const history = localStorage.getItem("_spectare_visits");
214
+ const history = localStorage.getItem(`_spectare_visits_${orgSlug}`);
214
215
  if (history) parts.push(`Previously visited: ${history}`);
215
216
  } catch (e) {
216
217
  }
@@ -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 : null);
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() {
@@ -253,7 +253,7 @@ function PersonalisedSection({
253
253
  const tokenKey = `_spectare_token_${orgSlug}${utmSuffix ? "_" + utmSuffix : ""}`;
254
254
  let token = sessionStorage.getItem(tokenKey);
255
255
  if (!token) {
256
- const summary = buildSummary(pageHint != null ? pageHint : `Visiting ${document.title}`);
256
+ const summary = buildSummary(pageHint != null ? pageHint : `Visiting ${document.title}`, orgSlug);
257
257
  const res2 = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {
258
258
  method: "POST",
259
259
  headers: { "Content-Type": "application/json" },
@@ -263,11 +263,10 @@ function PersonalisedSection({
263
263
  setLoading(false);
264
264
  return;
265
265
  }
266
- const data2 = await res2.json();
267
- token = (_a = data2.token) != null ? _a : null;
266
+ const data = await res2.json();
267
+ token = (_a = data.token) != null ? _a : null;
268
268
  if (token) sessionStorage.setItem(tokenKey, token);
269
- const orgPatterns = (_b = data2.conversionUrlPatterns) != null ? _b : [];
270
- conversionPatternsRef.current = [.../* @__PURE__ */ new Set([...conversionUrlPatterns != null ? conversionUrlPatterns : [], ...orgPatterns])];
269
+ if (data.orgName) setOrgName(data.orgName);
271
270
  }
272
271
  if (!token || cancelled) {
273
272
  setLoading(false);
@@ -281,7 +280,7 @@ function PersonalisedSection({
281
280
  });
282
281
  if (res.status === 401 && !cancelled) {
283
282
  sessionStorage.removeItem(tokenKey);
284
- const summary = buildSummary(pageHint != null ? pageHint : `Visiting ${document.title}`);
283
+ const summary = buildSummary(pageHint != null ? pageHint : `Visiting ${document.title}`, orgSlug);
285
284
  const qRes = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {
286
285
  method: "POST",
287
286
  headers: { "Content-Type": "application/json" },
@@ -292,12 +291,10 @@ function PersonalisedSection({
292
291
  return;
293
292
  }
294
293
  const qData = await qRes.json();
295
- token = (_c = qData.token) != null ? _c : null;
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 data = await res.json();
317
- if (cancelled) return;
318
- const clientAudience = (_f = (_e = data.intent) == null ? void 0 : _e.userContext) == null ? void 0 : _f.audience;
319
- const clientStage = (_h = (_g = data.intent) == null ? void 0 : _g.userContext) == null ? void 0 : _h.stage;
320
- const ssrMatches = initialIntent && clientAudience === initialIntent.audience && clientStage === initialIntent.stage;
321
- if (!ssrMatches && Array.isArray(data.assembly) && data.assembly.length > 0) {
322
- setAssembly(data.assembly);
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 || !conversionPatternsRef.current.length || conversionFiredRef.current) return;
336
- const url = window.location.href;
337
- if (!conversionPatternsRef.current.some((p) => url.includes(p))) return;
338
- conversionFiredRef.current = true;
366
+ if (!assembly.length || conversionFiredRef.current) return;
339
367
  const token = tokenRef.current;
340
368
  if (!token) return;
341
- fetch(`${baseUrl}/api/conversion`, {
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({ token, orgSlug, url, atomsShown: extractAtomIds(assembly) })
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 && !assembly) return null;
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, {}) : assembly && /* @__PURE__ */ jsxRuntime.jsx(ComponentRenderer, { assembly, brand }) })
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
 
@@ -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): string {\n const parts: string[] = [pageHint];\n const referrer = document.referrer;\n if (referrer) parts.push(`Arrived from: ${referrer}`);\n const p = new URLSearchParams(window.location.search);\n const source = p.get('utm_source');\n const medium = p.get('utm_medium');\n const campaign = p.get('utm_campaign');\n const term = p.get('utm_term');\n if (source) parts.push(`Source: ${source}`);\n if (medium) parts.push(`Medium: ${medium}`);\n if (campaign) parts.push(`Campaign: ${campaign}`);\n if (term) parts.push(`Search term: ${term}`);\n try {\n const history = localStorage.getItem('_spectare_visits');\n if (history) parts.push(`Previously visited: ${history}`);\n } catch { /* private browsing */ }\n return parts.filter(Boolean).join('. ');\n}\n\nfunction Shimmer() {\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n <div style={{ height: '1.25rem', background: 'rgba(39,39,42,0.6)', borderRadius: '0.5rem', width: '75%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '0.875rem', background: 'rgba(39,39,42,0.4)', borderRadius: '0.5rem', width: '100%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '0.875rem', background: 'rgba(39,39,42,0.4)', borderRadius: '0.5rem', width: '83%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '0.875rem', background: 'rgba(39,39,42,0.4)', borderRadius: '0.5rem', width: '67%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n </div>\n );\n}\n\nexport interface PersonalisedSectionProps {\n orgSlug: string;\n /** Base URL of your Spectare instance. Defaults to 'https://spectare.ai'. */\n baseUrl?: string;\n /** Your brand name, used in ComparisonTable column header. */\n brand?: string;\n pageHint?: string;\n className?: string;\n style?: React.CSSProperties;\n initialAssembly?: ComponentAssembly;\n initialIntent?: { audience: string; stage: string };\n /** URL substrings that indicate a conversion (e.g. ['/thank-you', 'order-confirmed']). When the current URL matches, a conversion event is fired automatically. */\n conversionUrlPatterns?: string[];\n}\n\nexport function PersonalisedSection({\n orgSlug,\n baseUrl = 'https://spectare.ai',\n brand,\n pageHint,\n className,\n style,\n initialAssembly,\n initialIntent,\n conversionUrlPatterns,\n}: PersonalisedSectionProps) {\n const [assembly, setAssembly] = useState<ComponentAssembly | null>(initialAssembly ?? null);\n const [loading, setLoading] = useState(!initialAssembly);\n const tokenRef = useRef<string | null>(null);\n const conversionFiredRef = useRef(false);\n // Populated from qualify response (org-level patterns) merged with prop overrides.\n const conversionPatternsRef = useRef<string[]>(conversionUrlPatterns ?? []);\n\n useEffect(() => {\n let cancelled = false;\n\n async function load() {\n try {\n const p = new URLSearchParams(window.location.search);\n const utmSuffix = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term']\n .map(k => p.get(k) ?? '').filter(Boolean).join('_');\n const tokenKey = `_spectare_token_${orgSlug}${utmSuffix ? '_' + utmSuffix : ''}`;\n let token = sessionStorage.getItem(tokenKey);\n\n if (!token) {\n const summary = buildSummary(pageHint ?? `Visiting ${document.title}`);\n const res = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!res.ok || cancelled) { setLoading(false); return; }\n const data = await res.json();\n token = data.token as string | undefined ?? null;\n if (token) sessionStorage.setItem(tokenKey, token);\n const orgPatterns = (data.conversionUrlPatterns as string[] | undefined) ?? [];\n conversionPatternsRef.current = [...new Set([...(conversionUrlPatterns ?? []), ...orgPatterns])];\n }\n\n if (!token || cancelled) { setLoading(false); return; }\n\n tokenRef.current = token;\n let res = await fetch(`${baseUrl}/api/assemble/components`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token, orgSlug }),\n });\n\n if (res.status === 401 && !cancelled) {\n sessionStorage.removeItem(tokenKey);\n const summary = buildSummary(pageHint ?? `Visiting ${document.title}`);\n const qRes = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!qRes.ok || cancelled) { setLoading(false); return; }\n const qData = await qRes.json();\n token = qData.token as string | undefined ?? null;\n if (token) {\n sessionStorage.setItem(tokenKey, token);\n tokenRef.current = token;\n const orgPatterns = (qData.conversionUrlPatterns as string[] | undefined) ?? [];\n conversionPatternsRef.current = [...new Set([...(conversionUrlPatterns ?? []), ...orgPatterns])];\n }\n if (!token || cancelled) { setLoading(false); return; }\n res = await fetch(`${baseUrl}/api/assemble/components`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token, orgSlug }),\n });\n }\n\n if (!res.ok || cancelled) { setLoading(false); return; }\n\n const data = await res.json() as {\n assembly?: ComponentAssembly;\n intent?: { userContext?: { audience?: string; stage?: string } };\n };\n\n if (cancelled) return;\n\n const clientAudience = data.intent?.userContext?.audience;\n const clientStage = data.intent?.userContext?.stage;\n const ssrMatches =\n initialIntent &&\n clientAudience === initialIntent.audience &&\n clientStage === initialIntent.stage;\n\n if (!ssrMatches && Array.isArray(data.assembly) && data.assembly.length > 0) {\n setAssembly(data.assembly as ComponentAssembly);\n }\n } catch {\n // fail silently\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n\n load();\n return () => { cancelled = true; };\n }, [orgSlug, baseUrl, pageHint, initialAssembly, initialIntent]);\n\n useEffect(() => {\n if (!assembly || !conversionPatternsRef.current.length || conversionFiredRef.current) return;\n const url = window.location.href;\n if (!conversionPatternsRef.current.some(p => url.includes(p))) return;\n conversionFiredRef.current = true;\n const token = tokenRef.current;\n if (!token) return;\n fetch(`${baseUrl}/api/conversion`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token, orgSlug, url, atomsShown: extractAtomIds(assembly) }),\n }).catch(() => {});\n }, [assembly, orgSlug, baseUrl]);\n\n if (!loading && !assembly) return null;\n\n return (\n <>\n <style dangerouslySetInnerHTML={{ __html: CSS_TOKENS }} />\n <style dangerouslySetInnerHTML={{ __html: '@keyframes sp-pulse{0%,100%{opacity:1}50%{opacity:0.4}}' }} />\n <div className={className} style={style}>\n {loading ? <Shimmer /> : assembly && <ComponentRenderer assembly={assembly} brand={brand} />}\n </div>\n </>\n );\n}\n"]}
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' | 'ImageHero' | 'CtaStrip';
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, conversionUrlPatterns, }: PersonalisedSectionProps): react.JSX.Element | null;
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' | 'ImageHero' | 'CtaStrip';
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, conversionUrlPatterns, }: PersonalisedSectionProps): react.JSX.Element | null;
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 { jsx, jsxs, Fragment } from 'react/jsx-runtime';
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", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "0.75rem", padding: "1.5rem" }, children: [
32
- /* @__PURE__ */ jsx("div", { style: { display: "grid", gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: "1.5rem" }, children: stats.map(({ value, label }) => /* @__PURE__ */ jsxs("div", { style: { textAlign: "center" }, children: [
33
- /* @__PURE__ */ jsx("p", { style: { fontSize: "1.875rem", fontWeight: 700, color: "var(--sp-text)", fontVariantNumeric: "tabular-nums", margin: 0 }, children: value }),
34
- /* @__PURE__ */ jsx("p", { style: { fontSize: "0.75rem", color: "var(--sp-text-muted)", marginTop: "0.375rem", textTransform: "uppercase", letterSpacing: "0.05em" }, children: label })
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)", textAlign: "center", marginTop: "1.25rem", borderTop: "1px solid var(--sp-border)", paddingTop: "1rem" }, children: caption })
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 ImageHero({ src, alt = "", ratio = "16:9" }) {
87
+ function ImageCtaHero({ src, alt = "", headline, subheading, ctaLabel, ctaHref }) {
88
88
  if (!src) return null;
89
- const [w, h] = ratio.split(":").map(Number);
90
- const paddingBottom = w && h ? `${h / w * 100}%` : "56.25%";
91
- return /* @__PURE__ */ jsx("div", { style: { borderRadius: "0.75rem", overflow: "hidden", position: "relative", width: "100%", paddingBottom }, children: /* @__PURE__ */ jsx("img", { src, alt, style: { position: "absolute", inset: 0, width: "100%", height: "100%", objectFit: "cover" } }) });
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 "ImageHero":
124
- return /* @__PURE__ */ jsx(ImageHero, { src: s.src, alt: s.alt, ratio: s.ratio });
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,44 +163,39 @@ 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__ */ jsx("div", { style: { display: "flex", flexDirection: "column", gap: "1.25rem" }, children: layout.map((group, i) => {
163
- if (group.type === "full") {
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
- if (group.type === "pair") {
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
- function buildSummary(pageHint) {
198
+ function buildSummary(pageHint, orgSlug) {
198
199
  const parts = [pageHint];
199
200
  const referrer = document.referrer;
200
201
  if (referrer) parts.push(`Arrived from: ${referrer}`);
@@ -208,7 +209,7 @@ function buildSummary(pageHint) {
208
209
  if (campaign) parts.push(`Campaign: ${campaign}`);
209
210
  if (term) parts.push(`Search term: ${term}`);
210
211
  try {
211
- const history = localStorage.getItem("_spectare_visits");
212
+ const history = localStorage.getItem(`_spectare_visits_${orgSlug}`);
212
213
  if (history) parts.push(`Previously visited: ${history}`);
213
214
  } catch (e) {
214
215
  }
@@ -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 : null);
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() {
@@ -251,7 +251,7 @@ function PersonalisedSection({
251
251
  const tokenKey = `_spectare_token_${orgSlug}${utmSuffix ? "_" + utmSuffix : ""}`;
252
252
  let token = sessionStorage.getItem(tokenKey);
253
253
  if (!token) {
254
- const summary = buildSummary(pageHint != null ? pageHint : `Visiting ${document.title}`);
254
+ const summary = buildSummary(pageHint != null ? pageHint : `Visiting ${document.title}`, orgSlug);
255
255
  const res2 = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {
256
256
  method: "POST",
257
257
  headers: { "Content-Type": "application/json" },
@@ -261,11 +261,10 @@ function PersonalisedSection({
261
261
  setLoading(false);
262
262
  return;
263
263
  }
264
- const data2 = await res2.json();
265
- token = (_a = data2.token) != null ? _a : null;
264
+ const data = await res2.json();
265
+ token = (_a = data.token) != null ? _a : null;
266
266
  if (token) sessionStorage.setItem(tokenKey, token);
267
- const orgPatterns = (_b = data2.conversionUrlPatterns) != null ? _b : [];
268
- conversionPatternsRef.current = [.../* @__PURE__ */ new Set([...conversionUrlPatterns != null ? conversionUrlPatterns : [], ...orgPatterns])];
267
+ if (data.orgName) setOrgName(data.orgName);
269
268
  }
270
269
  if (!token || cancelled) {
271
270
  setLoading(false);
@@ -279,7 +278,7 @@ function PersonalisedSection({
279
278
  });
280
279
  if (res.status === 401 && !cancelled) {
281
280
  sessionStorage.removeItem(tokenKey);
282
- const summary = buildSummary(pageHint != null ? pageHint : `Visiting ${document.title}`);
281
+ const summary = buildSummary(pageHint != null ? pageHint : `Visiting ${document.title}`, orgSlug);
283
282
  const qRes = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {
284
283
  method: "POST",
285
284
  headers: { "Content-Type": "application/json" },
@@ -290,12 +289,10 @@ function PersonalisedSection({
290
289
  return;
291
290
  }
292
291
  const qData = await qRes.json();
293
- token = (_c = qData.token) != null ? _c : null;
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 data = await res.json();
315
- if (cancelled) return;
316
- const clientAudience = (_f = (_e = data.intent) == null ? void 0 : _e.userContext) == null ? void 0 : _f.audience;
317
- const clientStage = (_h = (_g = data.intent) == null ? void 0 : _g.userContext) == null ? void 0 : _h.stage;
318
- const ssrMatches = initialIntent && clientAudience === initialIntent.audience && clientStage === initialIntent.stage;
319
- if (!ssrMatches && Array.isArray(data.assembly) && data.assembly.length > 0) {
320
- setAssembly(data.assembly);
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 || !conversionPatternsRef.current.length || conversionFiredRef.current) return;
334
- const url = window.location.href;
335
- if (!conversionPatternsRef.current.some((p) => url.includes(p))) return;
336
- conversionFiredRef.current = true;
364
+ if (!assembly.length || conversionFiredRef.current) return;
337
365
  const token = tokenRef.current;
338
366
  if (!token) return;
339
- fetch(`${baseUrl}/api/conversion`, {
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({ token, orgSlug, url, atomsShown: extractAtomIds(assembly) })
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 && !assembly) return null;
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, {}) : assembly && /* @__PURE__ */ jsx(ComponentRenderer, { assembly, brand }) })
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): string {\n const parts: string[] = [pageHint];\n const referrer = document.referrer;\n if (referrer) parts.push(`Arrived from: ${referrer}`);\n const p = new URLSearchParams(window.location.search);\n const source = p.get('utm_source');\n const medium = p.get('utm_medium');\n const campaign = p.get('utm_campaign');\n const term = p.get('utm_term');\n if (source) parts.push(`Source: ${source}`);\n if (medium) parts.push(`Medium: ${medium}`);\n if (campaign) parts.push(`Campaign: ${campaign}`);\n if (term) parts.push(`Search term: ${term}`);\n try {\n const history = localStorage.getItem('_spectare_visits');\n if (history) parts.push(`Previously visited: ${history}`);\n } catch { /* private browsing */ }\n return parts.filter(Boolean).join('. ');\n}\n\nfunction Shimmer() {\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n <div style={{ height: '1.25rem', background: 'rgba(39,39,42,0.6)', borderRadius: '0.5rem', width: '75%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '0.875rem', background: 'rgba(39,39,42,0.4)', borderRadius: '0.5rem', width: '100%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '0.875rem', background: 'rgba(39,39,42,0.4)', borderRadius: '0.5rem', width: '83%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '0.875rem', background: 'rgba(39,39,42,0.4)', borderRadius: '0.5rem', width: '67%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n </div>\n );\n}\n\nexport interface PersonalisedSectionProps {\n orgSlug: string;\n /** Base URL of your Spectare instance. Defaults to 'https://spectare.ai'. */\n baseUrl?: string;\n /** Your brand name, used in ComparisonTable column header. */\n brand?: string;\n pageHint?: string;\n className?: string;\n style?: React.CSSProperties;\n initialAssembly?: ComponentAssembly;\n initialIntent?: { audience: string; stage: string };\n /** URL substrings that indicate a conversion (e.g. ['/thank-you', 'order-confirmed']). When the current URL matches, a conversion event is fired automatically. */\n conversionUrlPatterns?: string[];\n}\n\nexport function PersonalisedSection({\n orgSlug,\n baseUrl = 'https://spectare.ai',\n brand,\n pageHint,\n className,\n style,\n initialAssembly,\n initialIntent,\n conversionUrlPatterns,\n}: PersonalisedSectionProps) {\n const [assembly, setAssembly] = useState<ComponentAssembly | null>(initialAssembly ?? null);\n const [loading, setLoading] = useState(!initialAssembly);\n const tokenRef = useRef<string | null>(null);\n const conversionFiredRef = useRef(false);\n // Populated from qualify response (org-level patterns) merged with prop overrides.\n const conversionPatternsRef = useRef<string[]>(conversionUrlPatterns ?? []);\n\n useEffect(() => {\n let cancelled = false;\n\n async function load() {\n try {\n const p = new URLSearchParams(window.location.search);\n const utmSuffix = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term']\n .map(k => p.get(k) ?? '').filter(Boolean).join('_');\n const tokenKey = `_spectare_token_${orgSlug}${utmSuffix ? '_' + utmSuffix : ''}`;\n let token = sessionStorage.getItem(tokenKey);\n\n if (!token) {\n const summary = buildSummary(pageHint ?? `Visiting ${document.title}`);\n const res = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!res.ok || cancelled) { setLoading(false); return; }\n const data = await res.json();\n token = data.token as string | undefined ?? null;\n if (token) sessionStorage.setItem(tokenKey, token);\n const orgPatterns = (data.conversionUrlPatterns as string[] | undefined) ?? [];\n conversionPatternsRef.current = [...new Set([...(conversionUrlPatterns ?? []), ...orgPatterns])];\n }\n\n if (!token || cancelled) { setLoading(false); return; }\n\n tokenRef.current = token;\n let res = await fetch(`${baseUrl}/api/assemble/components`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token, orgSlug }),\n });\n\n if (res.status === 401 && !cancelled) {\n sessionStorage.removeItem(tokenKey);\n const summary = buildSummary(pageHint ?? `Visiting ${document.title}`);\n const qRes = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!qRes.ok || cancelled) { setLoading(false); return; }\n const qData = await qRes.json();\n token = qData.token as string | undefined ?? null;\n if (token) {\n sessionStorage.setItem(tokenKey, token);\n tokenRef.current = token;\n const orgPatterns = (qData.conversionUrlPatterns as string[] | undefined) ?? [];\n conversionPatternsRef.current = [...new Set([...(conversionUrlPatterns ?? []), ...orgPatterns])];\n }\n if (!token || cancelled) { setLoading(false); return; }\n res = await fetch(`${baseUrl}/api/assemble/components`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token, orgSlug }),\n });\n }\n\n if (!res.ok || cancelled) { setLoading(false); return; }\n\n const data = await res.json() as {\n assembly?: ComponentAssembly;\n intent?: { userContext?: { audience?: string; stage?: string } };\n };\n\n if (cancelled) return;\n\n const clientAudience = data.intent?.userContext?.audience;\n const clientStage = data.intent?.userContext?.stage;\n const ssrMatches =\n initialIntent &&\n clientAudience === initialIntent.audience &&\n clientStage === initialIntent.stage;\n\n if (!ssrMatches && Array.isArray(data.assembly) && data.assembly.length > 0) {\n setAssembly(data.assembly as ComponentAssembly);\n }\n } catch {\n // fail silently\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n\n load();\n return () => { cancelled = true; };\n }, [orgSlug, baseUrl, pageHint, initialAssembly, initialIntent]);\n\n useEffect(() => {\n if (!assembly || !conversionPatternsRef.current.length || conversionFiredRef.current) return;\n const url = window.location.href;\n if (!conversionPatternsRef.current.some(p => url.includes(p))) return;\n conversionFiredRef.current = true;\n const token = tokenRef.current;\n if (!token) return;\n fetch(`${baseUrl}/api/conversion`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token, orgSlug, url, atomsShown: extractAtomIds(assembly) }),\n }).catch(() => {});\n }, [assembly, orgSlug, baseUrl]);\n\n if (!loading && !assembly) return null;\n\n return (\n <>\n <style dangerouslySetInnerHTML={{ __html: CSS_TOKENS }} />\n <style dangerouslySetInnerHTML={{ __html: '@keyframes sp-pulse{0%,100%{opacity:1}50%{opacity:0.4}}' }} />\n <div className={className} style={style}>\n {loading ? <Shimmer /> : assembly && <ComponentRenderer assembly={assembly} brand={brand} />}\n </div>\n </>\n );\n}\n"]}
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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spectare-personalisation/react",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "React components for Spectare AI website personalisation",
5
5
  "keywords": [
6
6
  "spectare",