@spectare-personalisation/react 0.1.5 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +83 -60
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -4
- package/dist/index.d.ts +11 -4
- package/dist/index.js +83 -61
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -5,81 +5,101 @@ var marked = require('marked');
|
|
|
5
5
|
var jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
|
|
7
7
|
// src/PersonalisedSection.tsx
|
|
8
|
+
|
|
9
|
+
// src/types.ts
|
|
10
|
+
var COMPONENT_ZONES = {
|
|
11
|
+
HeroStatement: "hero",
|
|
12
|
+
ImageCtaHero: "hero",
|
|
13
|
+
AtomCard: "body",
|
|
14
|
+
StatGrid: "body",
|
|
15
|
+
CodeBlock: "body",
|
|
16
|
+
ComparisonTable: "body",
|
|
17
|
+
FeatureList: "body",
|
|
18
|
+
TestimonialCard: "proof",
|
|
19
|
+
CtaStrip: "cta"
|
|
20
|
+
};
|
|
21
|
+
function filterAssemblyByZone(assembly, zone) {
|
|
22
|
+
return assembly.filter((item) => {
|
|
23
|
+
var _a;
|
|
24
|
+
const effectiveZone = (_a = item.zone) != null ? _a : COMPONENT_ZONES[item.component];
|
|
25
|
+
return effectiveZone === zone;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
8
28
|
function renderMarkdown(content) {
|
|
9
29
|
return marked.marked.parse(content, { async: false });
|
|
10
30
|
}
|
|
11
31
|
var HALF_COMPONENTS = /* @__PURE__ */ new Set(["TestimonialCard"]);
|
|
12
32
|
function HeroStatement({ headline, subheading }) {
|
|
13
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { paddingTop: "
|
|
14
|
-
/* @__PURE__ */ jsxRuntime.jsx("h2", { style: { fontSize: "
|
|
15
|
-
subheading && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "
|
|
33
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { paddingTop: "24px", paddingBottom: "24px" }, children: [
|
|
34
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { style: { fontSize: "32px", fontWeight: 700, letterSpacing: "-0.025em", lineHeight: 1.2, color: "var(--sp-text)", margin: "0 0 12px" }, children: headline }),
|
|
35
|
+
subheading && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "18px", color: "var(--sp-text-sub)", lineHeight: 1.6, maxWidth: "672px", margin: 0 }, children: subheading })
|
|
16
36
|
] });
|
|
17
37
|
}
|
|
18
38
|
function AtomCard({ title, content }) {
|
|
19
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "
|
|
20
|
-
title && /* @__PURE__ */ jsxRuntime.jsx("h3", { style: { fontSize: "
|
|
39
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "12px", padding: "24px", height: "100%" }, children: [
|
|
40
|
+
title && /* @__PURE__ */ jsxRuntime.jsx("h3", { style: { fontSize: "16px", fontWeight: 600, color: "var(--sp-text)", margin: "0 0 12px" }, children: title }),
|
|
21
41
|
content && /* @__PURE__ */ jsxRuntime.jsx(
|
|
22
42
|
"div",
|
|
23
43
|
{
|
|
24
44
|
className: "sp-prose",
|
|
25
|
-
style: { fontSize: "
|
|
45
|
+
style: { fontSize: "15px", color: "var(--sp-text-sub)", lineHeight: 1.6 },
|
|
26
46
|
dangerouslySetInnerHTML: { __html: renderMarkdown(content) }
|
|
27
47
|
}
|
|
28
48
|
)
|
|
29
49
|
] });
|
|
30
50
|
}
|
|
31
|
-
function StatGrid({ stats, caption }) {
|
|
51
|
+
function StatGrid({ stats = [], caption }) {
|
|
32
52
|
const cols = stats.length === 2 ? 2 : stats.length === 3 ? 3 : 4;
|
|
33
53
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
34
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "grid", gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: "
|
|
35
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "
|
|
36
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "
|
|
54
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "grid", gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: "12px" }, children: stats.map(({ value, label }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "10px", padding: "16px 20px", display: "flex", flexDirection: "column", justifyContent: "space-between", minHeight: "88px" }, children: [
|
|
55
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "11px", color: "var(--sp-text-muted)", textTransform: "uppercase", letterSpacing: "0.06em", margin: "0 0 12px", lineHeight: 1.3 }, children: label }),
|
|
56
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "20px", fontWeight: 500, color: "var(--sp-text)", fontVariantNumeric: "tabular-nums", lineHeight: 1, margin: 0 }, children: value })
|
|
37
57
|
] }, label)) }),
|
|
38
|
-
caption && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "
|
|
58
|
+
caption && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "13px", color: "var(--sp-text-muted)", margin: "12px 0 0" }, children: caption })
|
|
39
59
|
] });
|
|
40
60
|
}
|
|
41
61
|
function CodeBlock({ code, lang = "typescript", caption }) {
|
|
42
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { borderRadius: "
|
|
43
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { background: "var(--sp-bg)", padding: "
|
|
44
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "
|
|
45
|
-
caption && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "
|
|
62
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { borderRadius: "12px", overflow: "hidden", border: "1px solid var(--sp-border)" }, children: [
|
|
63
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { background: "var(--sp-bg)", padding: "10px 16px", display: "flex", alignItems: "center", justifyContent: "space-between", borderBottom: "1px solid var(--sp-border)" }, children: [
|
|
64
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "12px", color: "var(--sp-text-muted)", fontFamily: "monospace" }, children: lang }),
|
|
65
|
+
caption && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "12px", color: "var(--sp-text-muted)" }, children: caption })
|
|
46
66
|
] }),
|
|
47
|
-
/* @__PURE__ */ jsxRuntime.jsx("pre", { style: { background: "var(--sp-surface)", padding: "
|
|
67
|
+
/* @__PURE__ */ jsxRuntime.jsx("pre", { style: { background: "var(--sp-surface)", padding: "20px", fontSize: "13px", color: "var(--sp-text-sub)", overflowX: "auto", lineHeight: 1.6, fontFamily: "monospace", whiteSpace: "pre", margin: 0 }, children: code })
|
|
48
68
|
] });
|
|
49
69
|
}
|
|
50
|
-
function ComparisonTable({ brand = "Us", competitor, rows }) {
|
|
51
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { border: "1px solid var(--sp-border)", borderRadius: "
|
|
70
|
+
function ComparisonTable({ brand = "Us", competitor, rows = [] }) {
|
|
71
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { border: "1px solid var(--sp-border)", borderRadius: "12px", overflow: "hidden" }, children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: { overflowX: "auto" }, children: /* @__PURE__ */ jsxRuntime.jsxs("table", { style: { width: "100%", fontSize: "14px", borderCollapse: "collapse" }, children: [
|
|
52
72
|
/* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { style: { borderBottom: "1px solid var(--sp-border)", background: "var(--sp-bg)" }, children: [
|
|
53
|
-
/* @__PURE__ */ jsxRuntime.jsx("th", { style: { textAlign: "left", padding: "
|
|
54
|
-
/* @__PURE__ */ jsxRuntime.jsx("th", { style: { textAlign: "left", padding: "
|
|
55
|
-
/* @__PURE__ */ jsxRuntime.jsx("th", { style: { textAlign: "left", padding: "
|
|
73
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { style: { textAlign: "left", padding: "12px 16px", color: "var(--sp-text-muted)", fontWeight: 500, fontSize: "12px", width: "33%" } }),
|
|
74
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { style: { textAlign: "left", padding: "12px 16px", fontWeight: 600, color: "var(--sp-accent)", fontSize: "12px" }, children: brand }),
|
|
75
|
+
/* @__PURE__ */ jsxRuntime.jsx("th", { style: { textAlign: "left", padding: "12px 16px", color: "var(--sp-text-muted)", fontWeight: 500, fontSize: "12px" }, children: competitor })
|
|
56
76
|
] }) }),
|
|
57
77
|
/* @__PURE__ */ jsxRuntime.jsx("tbody", { children: rows.map(({ label, spectare, them }) => /* @__PURE__ */ jsxRuntime.jsxs("tr", { style: { borderBottom: "1px solid var(--sp-border)" }, children: [
|
|
58
|
-
/* @__PURE__ */ jsxRuntime.jsx("td", { style: { padding: "
|
|
59
|
-
/* @__PURE__ */ jsxRuntime.jsx("td", { style: { padding: "
|
|
60
|
-
/* @__PURE__ */ jsxRuntime.jsx("td", { style: { padding: "
|
|
78
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { style: { padding: "12px 16px", fontSize: "13px", color: "var(--sp-text-muted)", fontWeight: 500 }, children: label }),
|
|
79
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { style: { padding: "12px 16px", fontSize: "13px", color: "var(--sp-positive)", fontWeight: 500 }, children: spectare }),
|
|
80
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { style: { padding: "12px 16px", fontSize: "13px", color: "var(--sp-text-muted)" }, children: them })
|
|
61
81
|
] }, label)) })
|
|
62
82
|
] }) }) });
|
|
63
83
|
}
|
|
64
|
-
function FeatureList({ items }) {
|
|
65
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "
|
|
66
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "var(--sp-accent)", flexShrink: 0, fontSize: "
|
|
84
|
+
function FeatureList({ items = [] }) {
|
|
85
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "12px", padding: "24px" }, children: /* @__PURE__ */ jsxRuntime.jsx("ul", { style: { listStyle: "none", margin: 0, padding: 0, display: "flex", flexDirection: "column", gap: "16px" }, children: items.map(({ text, sub }) => /* @__PURE__ */ jsxRuntime.jsxs("li", { style: { display: "flex", gap: "12px" }, children: [
|
|
86
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "var(--sp-accent)", flexShrink: 0, fontSize: "15px", marginTop: "2px" }, children: "\u2713" }),
|
|
67
87
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
68
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "
|
|
69
|
-
sub && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "
|
|
88
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "15px", fontWeight: 500, color: "var(--sp-text)", lineHeight: 1.4, margin: 0 }, children: text }),
|
|
89
|
+
sub && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "13px", color: "var(--sp-text-muted)", lineHeight: 1.5, margin: "4px 0 0" }, children: sub })
|
|
70
90
|
] })
|
|
71
91
|
] }, text)) }) });
|
|
72
92
|
}
|
|
73
93
|
function TestimonialCard({ quote, name, role, company }) {
|
|
74
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "
|
|
75
|
-
/* @__PURE__ */ jsxRuntime.jsxs("p", { style: { fontSize: "
|
|
76
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "var(--sp-text-dim)", fontSize: "
|
|
94
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "12px", padding: "24px", display: "flex", flexDirection: "column", gap: "20px", height: "100%" }, children: [
|
|
95
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { style: { fontSize: "15px", color: "var(--sp-text-sub)", lineHeight: 1.6, flex: 1, margin: 0 }, children: [
|
|
96
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "var(--sp-text-dim)", fontSize: "18px", lineHeight: 1, marginRight: "4px" }, children: '"' }),
|
|
77
97
|
quote,
|
|
78
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "var(--sp-text-dim)", fontSize: "
|
|
98
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "var(--sp-text-dim)", fontSize: "18px", lineHeight: 1, marginLeft: "4px" }, children: '"' })
|
|
79
99
|
] }),
|
|
80
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { borderTop: "1px solid var(--sp-border)", paddingTop: "
|
|
81
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "
|
|
82
|
-
/* @__PURE__ */ jsxRuntime.jsxs("p", { style: { fontSize: "
|
|
100
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { borderTop: "1px solid var(--sp-border)", paddingTop: "16px" }, children: [
|
|
101
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "14px", fontWeight: 600, color: "var(--sp-text)", margin: 0 }, children: name }),
|
|
102
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { style: { fontSize: "13px", color: "var(--sp-text-muted)", margin: "2px 0 0" }, children: [
|
|
83
103
|
role,
|
|
84
104
|
company ? `, ${company}` : ""
|
|
85
105
|
] })
|
|
@@ -88,22 +108,22 @@ function TestimonialCard({ quote, name, role, company }) {
|
|
|
88
108
|
}
|
|
89
109
|
function ImageCtaHero({ src, alt = "", headline, subheading, ctaLabel, ctaHref }) {
|
|
90
110
|
if (!src) return null;
|
|
91
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { borderRadius: "
|
|
111
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { borderRadius: "12px", overflow: "hidden", position: "relative", width: "100%", paddingBottom: "56.25%" }, children: [
|
|
92
112
|
/* @__PURE__ */ jsxRuntime.jsx("img", { src, alt, style: { position: "absolute", inset: 0, width: "100%", height: "100%", objectFit: "cover" } }),
|
|
93
113
|
/* @__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: "
|
|
95
|
-
headline && /* @__PURE__ */ jsxRuntime.jsx("h2", { style: { fontSize: "
|
|
96
|
-
subheading && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "
|
|
97
|
-
ctaHref && ctaLabel && /* @__PURE__ */ jsxRuntime.jsx("a", { href: ctaHref, style: { display: "inline-block", background: "#fff", color: "#09090b", padding: "
|
|
114
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { position: "absolute", bottom: 0, left: 0, right: 0, padding: "28px" }, children: [
|
|
115
|
+
headline && /* @__PURE__ */ jsxRuntime.jsx("h2", { style: { fontSize: "24px", fontWeight: 700, color: "#fff", lineHeight: 1.2, margin: "0 0 8px", letterSpacing: "-0.02em" }, children: headline }),
|
|
116
|
+
subheading && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "15px", color: "rgba(255,255,255,0.75)", lineHeight: 1.5, margin: "0 0 20px" }, children: subheading }),
|
|
117
|
+
ctaHref && ctaLabel && /* @__PURE__ */ jsxRuntime.jsx("a", { href: ctaHref, style: { display: "inline-block", background: "#fff", color: "#09090b", padding: "8px 20px", borderRadius: "8px", fontWeight: 600, fontSize: "14px", textDecoration: "none" }, children: ctaLabel })
|
|
98
118
|
] })
|
|
99
119
|
] });
|
|
100
120
|
}
|
|
101
121
|
function CtaStrip({ headline, primary, secondary }) {
|
|
102
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { border: "1px solid var(--sp-border)", borderRadius: "
|
|
103
|
-
/* @__PURE__ */ jsxRuntime.jsx("h3", { style: { fontSize: "
|
|
104
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", gap: "
|
|
105
|
-
/* @__PURE__ */ jsxRuntime.jsx("a", { href: primary.href, style: { background: "#fff", color: "#09090b", padding: "
|
|
106
|
-
secondary && /* @__PURE__ */ jsxRuntime.jsxs("a", { href: secondary.href, style: { fontSize: "
|
|
122
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { border: "1px solid var(--sp-border)", borderRadius: "12px", padding: "32px", textAlign: "center", background: "var(--sp-bg)" }, children: [
|
|
123
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { style: { fontSize: "24px", fontWeight: 700, color: "var(--sp-text)", margin: "0 0 24px" }, children: headline }),
|
|
124
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", gap: "16px", flexWrap: "wrap" }, children: [
|
|
125
|
+
/* @__PURE__ */ jsxRuntime.jsx("a", { href: primary.href, style: { background: "#fff", color: "#09090b", padding: "10px 24px", borderRadius: "12px", fontWeight: 600, fontSize: "15px", textDecoration: "none" }, children: primary.label }),
|
|
126
|
+
secondary && /* @__PURE__ */ jsxRuntime.jsxs("a", { href: secondary.href, style: { fontSize: "15px", color: "var(--sp-text-sub)", textDecoration: "none" }, children: [
|
|
107
127
|
secondary.label,
|
|
108
128
|
" \u2192"
|
|
109
129
|
] })
|
|
@@ -160,15 +180,16 @@ function buildLayout(assembly) {
|
|
|
160
180
|
return groups;
|
|
161
181
|
}
|
|
162
182
|
function XrayBadge({ name, size }) {
|
|
163
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { position: "absolute", top: "
|
|
164
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "
|
|
165
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "
|
|
183
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { position: "absolute", top: "8px", left: "8px", zIndex: 10, display: "flex", alignItems: "center", gap: "6px", pointerEvents: "none", userSelect: "none" }, children: [
|
|
184
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "10px", fontFamily: "monospace", background: "rgba(59,130,246,0.9)", color: "#fff", padding: "2px 6px", borderRadius: "4px", lineHeight: 1 }, children: name }),
|
|
185
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "10px", fontFamily: "monospace", color: "#71717a", lineHeight: 1 }, children: size })
|
|
166
186
|
] });
|
|
167
187
|
}
|
|
168
|
-
var PAIR_STYLE = ".sp-pair{display:grid;grid-template-columns:1fr 1fr;gap:
|
|
169
|
-
function ComponentRenderer({ assembly, brand, xray = false }) {
|
|
170
|
-
const
|
|
171
|
-
|
|
188
|
+
var PAIR_STYLE = ".sp-pair{display:grid;grid-template-columns:1fr 1fr;gap:20px}@media(max-width:640px){.sp-pair{grid-template-columns:1fr}}";
|
|
189
|
+
function ComponentRenderer({ assembly, brand, xray = false, zone }) {
|
|
190
|
+
const filtered = zone ? filterAssemblyByZone(assembly, zone) : assembly;
|
|
191
|
+
const layout = buildLayout(filtered);
|
|
192
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "20px", fontSize: "16px" }, children: [
|
|
172
193
|
/* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: PAIR_STYLE } }),
|
|
173
194
|
layout.map((group, i) => {
|
|
174
195
|
if (group.type === "full") {
|
|
@@ -218,11 +239,11 @@ function buildSummary(pageHint, orgSlug) {
|
|
|
218
239
|
return parts.filter(Boolean).join(". ");
|
|
219
240
|
}
|
|
220
241
|
function Shimmer() {
|
|
221
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "
|
|
222
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { height: "
|
|
223
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { height: "
|
|
224
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { height: "
|
|
225
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { height: "
|
|
242
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [
|
|
243
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { height: "20px", background: "rgba(39,39,42,0.6)", borderRadius: "8px", width: "75%", animation: "sp-pulse 1.5s ease-in-out infinite" } }),
|
|
244
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { height: "14px", background: "rgba(39,39,42,0.4)", borderRadius: "8px", width: "100%", animation: "sp-pulse 1.5s ease-in-out infinite" } }),
|
|
245
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { height: "14px", background: "rgba(39,39,42,0.4)", borderRadius: "8px", width: "83%", animation: "sp-pulse 1.5s ease-in-out infinite" } }),
|
|
246
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { height: "14px", background: "rgba(39,39,42,0.4)", borderRadius: "8px", width: "67%", animation: "sp-pulse 1.5s ease-in-out infinite" } })
|
|
226
247
|
] });
|
|
227
248
|
}
|
|
228
249
|
function PersonalisedSection({
|
|
@@ -233,7 +254,8 @@ function PersonalisedSection({
|
|
|
233
254
|
className,
|
|
234
255
|
style,
|
|
235
256
|
initialAssembly,
|
|
236
|
-
initialIntent
|
|
257
|
+
initialIntent,
|
|
258
|
+
zone
|
|
237
259
|
}) {
|
|
238
260
|
const [assembly, setAssembly] = react.useState(initialAssembly != null ? initialAssembly : []);
|
|
239
261
|
const [loading, setLoading] = react.useState(!initialAssembly);
|
|
@@ -413,11 +435,12 @@ function PersonalisedSection({
|
|
|
413
435
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
414
436
|
/* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: CSS_TOKENS } }),
|
|
415
437
|
/* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: "@keyframes sp-pulse{0%,100%{opacity:1}50%{opacity:0.4}}" } }),
|
|
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 }) })
|
|
438
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className, style, children: loading && assembly.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Shimmer, {}) : /* @__PURE__ */ jsxRuntime.jsx(ComponentRenderer, { assembly: zone ? filterAssemblyByZone(assembly, zone) : assembly, brand: brand != null ? brand : orgName }) })
|
|
417
439
|
] });
|
|
418
440
|
}
|
|
419
441
|
|
|
420
442
|
exports.ComponentRenderer = ComponentRenderer;
|
|
421
443
|
exports.PersonalisedSection = PersonalisedSection;
|
|
444
|
+
exports.filterAssemblyByZone = filterAssemblyByZone;
|
|
422
445
|
//# sourceMappingURL=index.cjs.map
|
|
423
446
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ComponentRenderer.tsx","../src/PersonalisedSection.tsx"],"names":["marked","jsxs","jsx","useState","useRef","useEffect","_a","res","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"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../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":["export type ComponentName =\n | 'HeroStatement'\n | 'AtomCard'\n | 'StatGrid'\n | 'CodeBlock'\n | 'ComparisonTable'\n | 'FeatureList'\n | 'TestimonialCard'\n | 'ImageCtaHero'\n | 'CtaStrip';\n\nexport type AssemblyZone = 'hero' | 'body' | 'proof' | 'cta';\n\nconst COMPONENT_ZONES: Record<ComponentName, AssemblyZone> = {\n HeroStatement: 'hero',\n ImageCtaHero: 'hero',\n AtomCard: 'body',\n StatGrid: 'body',\n CodeBlock: 'body',\n ComparisonTable: 'body',\n FeatureList: 'body',\n TestimonialCard: 'proof',\n CtaStrip: 'cta',\n};\n\nexport type ComponentAssembly = Array<{\n component: ComponentName;\n slots?: Record<string, unknown>;\n size?: 'full' | 'half';\n zone?: AssemblyZone;\n}>;\n\nexport function filterAssemblyByZone(assembly: ComponentAssembly, zone: AssemblyZone): ComponentAssembly {\n return assembly.filter(item => {\n const effectiveZone = item.zone ?? COMPONENT_ZONES[item.component];\n return effectiveZone === zone;\n });\n}\n","'use client';\n\nimport { marked } from 'marked';\nimport { filterAssemblyByZone } from './types';\nimport type { ComponentAssembly, ComponentName, AssemblyZone } 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: '24px', paddingBottom: '24px' }}>\n <h2 style={{ fontSize: '32px', fontWeight: 700, letterSpacing: '-0.025em', lineHeight: 1.2, color: 'var(--sp-text)', margin: '0 0 12px' }}>\n {headline}\n </h2>\n {subheading && (\n <p style={{ fontSize: '18px', color: 'var(--sp-text-sub)', lineHeight: 1.6, maxWidth: '672px', margin: 0 }}>{subheading}</p>\n )}\n </div>\n );\n}\n\nfunction AtomCard({ title, content }: { title?: string; content?: string }) {\n return (\n <div style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '12px', padding: '24px', height: '100%' }}>\n {title && <h3 style={{ fontSize: '16px', fontWeight: 600, color: 'var(--sp-text)', margin: '0 0 12px' }}>{title}</h3>}\n {content && (\n <div\n className=\"sp-prose\"\n style={{ fontSize: '15px', 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: '12px' }}>\n {stats.map(({ value, label }) => (\n <div key={label} style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '10px', padding: '16px 20px', display: 'flex', flexDirection: 'column', justifyContent: 'space-between', minHeight: '88px' }}>\n <p style={{ fontSize: '11px', color: 'var(--sp-text-muted)', textTransform: 'uppercase', letterSpacing: '0.06em', margin: '0 0 12px', lineHeight: 1.3 }}>{label}</p>\n <p style={{ fontSize: '20px', fontWeight: 500, color: 'var(--sp-text)', fontVariantNumeric: 'tabular-nums', lineHeight: 1, margin: 0 }}>{value}</p>\n </div>\n ))}\n </div>\n {caption && (\n <p style={{ fontSize: '13px', color: 'var(--sp-text-muted)', margin: '12px 0 0' }}>{caption}</p>\n )}\n </div>\n );\n}\n\nfunction CodeBlock({ code, lang = 'typescript', caption }: { code: string; lang?: string; caption?: string }) {\n return (\n <div style={{ borderRadius: '12px', overflow: 'hidden', border: '1px solid var(--sp-border)' }}>\n <div style={{ background: 'var(--sp-bg)', padding: '10px 16px', display: 'flex', alignItems: 'center', justifyContent: 'space-between', borderBottom: '1px solid var(--sp-border)' }}>\n <span style={{ fontSize: '12px', color: 'var(--sp-text-muted)', fontFamily: 'monospace' }}>{lang}</span>\n {caption && <span style={{ fontSize: '12px', color: 'var(--sp-text-muted)' }}>{caption}</span>}\n </div>\n <pre style={{ background: 'var(--sp-surface)', padding: '20px', fontSize: '13px', color: 'var(--sp-text-sub)', overflowX: 'auto', lineHeight: 1.6, fontFamily: 'monospace', whiteSpace: 'pre', margin: 0 }}>\n {code}\n </pre>\n </div>\n );\n}\n\nfunction ComparisonTable({ brand = 'Us', competitor, rows = [] }: { brand?: string; competitor: string; rows?: { label: string; spectare: string; them: string }[] }) {\n return (\n <div style={{ border: '1px solid var(--sp-border)', borderRadius: '12px', overflow: 'hidden' }}>\n <div style={{ overflowX: 'auto' }}>\n <table style={{ width: '100%', fontSize: '14px', borderCollapse: 'collapse' }}>\n <thead>\n <tr style={{ borderBottom: '1px solid var(--sp-border)', background: 'var(--sp-bg)' }}>\n <th style={{ textAlign: 'left', padding: '12px 16px', color: 'var(--sp-text-muted)', fontWeight: 500, fontSize: '12px', width: '33%' }} />\n <th style={{ textAlign: 'left', padding: '12px 16px', fontWeight: 600, color: 'var(--sp-accent)', fontSize: '12px' }}>{brand}</th>\n <th style={{ textAlign: 'left', padding: '12px 16px', color: 'var(--sp-text-muted)', fontWeight: 500, fontSize: '12px' }}>{competitor}</th>\n </tr>\n </thead>\n <tbody>\n {rows.map(({ label, spectare, them }) => (\n <tr key={label} style={{ borderBottom: '1px solid var(--sp-border)' }}>\n <td style={{ padding: '12px 16px', fontSize: '13px', color: 'var(--sp-text-muted)', fontWeight: 500 }}>{label}</td>\n <td style={{ padding: '12px 16px', fontSize: '13px', color: 'var(--sp-positive)', fontWeight: 500 }}>{spectare}</td>\n <td style={{ padding: '12px 16px', fontSize: '13px', color: 'var(--sp-text-muted)' }}>{them}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\nfunction FeatureList({ items = [] }: { items?: { text: string; sub?: string }[] }) {\n return (\n <div style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '12px', padding: '24px' }}>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0, display: 'flex', flexDirection: 'column', gap: '16px' }}>\n {items.map(({ text, sub }) => (\n <li key={text} style={{ display: 'flex', gap: '12px' }}>\n <span style={{ color: 'var(--sp-accent)', flexShrink: 0, fontSize: '15px', marginTop: '2px' }}>✓</span>\n <div>\n <p style={{ fontSize: '15px', fontWeight: 500, color: 'var(--sp-text)', lineHeight: 1.4, margin: 0 }}>{text}</p>\n {sub && <p style={{ fontSize: '13px', color: 'var(--sp-text-muted)', lineHeight: 1.5, margin: '4px 0 0' }}>{sub}</p>}\n </div>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\nfunction TestimonialCard({ quote, name, role, company }: { quote: string; name: string; role: string; company?: string }) {\n return (\n <div style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '12px', padding: '24px', display: 'flex', flexDirection: 'column', gap: '20px', height: '100%' }}>\n <p style={{ fontSize: '15px', color: 'var(--sp-text-sub)', lineHeight: 1.6, flex: 1, margin: 0 }}>\n <span style={{ color: 'var(--sp-text-dim)', fontSize: '18px', lineHeight: 1, marginRight: '4px' }}>\"</span>\n {quote}\n <span style={{ color: 'var(--sp-text-dim)', fontSize: '18px', lineHeight: 1, marginLeft: '4px' }}>\"</span>\n </p>\n <div style={{ borderTop: '1px solid var(--sp-border)', paddingTop: '16px' }}>\n <p style={{ fontSize: '14px', fontWeight: 600, color: 'var(--sp-text)', margin: 0 }}>{name}</p>\n <p style={{ fontSize: '13px', color: 'var(--sp-text-muted)', margin: '2px 0 0' }}>\n {role}{company ? `, ${company}` : ''}\n </p>\n </div>\n </div>\n );\n}\n\nfunction ImageCtaHero({ src, alt = '', headline, subheading, ctaLabel, ctaHref }: { src?: string; alt?: string; headline?: string; subheading?: string; ctaLabel?: string; ctaHref?: string }) {\n if (!src) return null;\n return (\n <div style={{ borderRadius: '12px', overflow: 'hidden', position: 'relative', width: '100%', paddingBottom: '56.25%' }}>\n <img src={src} alt={alt} style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', objectFit: 'cover' }} />\n <div style={{ position: 'absolute', inset: 0, background: '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: '28px' }}>\n {headline && (\n <h2 style={{ fontSize: '24px', fontWeight: 700, color: '#fff', lineHeight: 1.2, margin: '0 0 8px', letterSpacing: '-0.02em' }}>{headline}</h2>\n )}\n {subheading && (\n <p style={{ fontSize: '15px', color: 'rgba(255,255,255,0.75)', lineHeight: 1.5, margin: '0 0 20px' }}>{subheading}</p>\n )}\n {ctaHref && ctaLabel && (\n <a href={ctaHref} style={{ display: 'inline-block', background: '#fff', color: '#09090b', padding: '8px 20px', borderRadius: '8px', fontWeight: 600, fontSize: '14px', textDecoration: 'none' }}>\n {ctaLabel}\n </a>\n )}\n </div>\n </div>\n );\n}\n\nfunction CtaStrip({ headline, primary, secondary }: { headline: string; primary: { label: string; href: string }; secondary?: { label: string; href: string } }) {\n return (\n <div style={{ border: '1px solid var(--sp-border)', borderRadius: '12px', padding: '32px', textAlign: 'center', background: 'var(--sp-bg)' }}>\n <h3 style={{ fontSize: '24px', fontWeight: 700, color: 'var(--sp-text)', margin: '0 0 24px' }}>{headline}</h3>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '16px', flexWrap: 'wrap' }}>\n <a href={primary.href} style={{ background: '#fff', color: '#09090b', padding: '10px 24px', borderRadius: '12px', fontWeight: 600, fontSize: '15px', textDecoration: 'none' }}>\n {primary.label}\n </a>\n {secondary && (\n <a href={secondary.href} style={{ fontSize: '15px', color: 'var(--sp-text-sub)', textDecoration: 'none' }}>\n {secondary.label} →\n </a>\n )}\n </div>\n </div>\n );\n}\n\n// ── Dispatch ──────────────────────────────────────────────────────────────────\n\nfunction renderSingle(item: ComponentAssembly[0], brand?: string): React.ReactNode {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const s = item.slots as Record<string, any> ?? {};\n\n switch (item.component as ComponentName) {\n case 'HeroStatement': return <HeroStatement headline={s.headline} subheading={s.subheading} />;\n case 'AtomCard': return <AtomCard title={s.title} content={s.content} />;\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: '8px', left: '8px', zIndex: 10, display: 'flex', alignItems: 'center', gap: '6px', pointerEvents: 'none', userSelect: 'none' }}>\n <span style={{ fontSize: '10px', fontFamily: 'monospace', background: 'rgba(59,130,246,0.9)', color: '#fff', padding: '2px 6px', borderRadius: '4px', lineHeight: 1 }}>{name}</span>\n <span style={{ fontSize: '10px', fontFamily: 'monospace', color: '#71717a', lineHeight: 1 }}>{size}</span>\n </div>\n );\n}\n\n// ── Main export ───────────────────────────────────────────────────────────────\n\nexport interface ComponentRendererProps {\n assembly: ComponentAssembly;\n /** Your brand name, used as the left column header in ComparisonTable. Defaults to \"Us\". */\n brand?: string;\n /** Overlay a component name badge on each item. Useful for demos and debugging. */\n xray?: boolean;\n /** Render only components assigned to this zone. */\n zone?: AssemblyZone;\n}\n\nconst PAIR_STYLE = '.sp-pair{display:grid;grid-template-columns:1fr 1fr;gap:20px}@media(max-width:640px){.sp-pair{grid-template-columns:1fr}}';\n\nexport function ComponentRenderer({ assembly, brand, xray = false, zone }: ComponentRendererProps) {\n const filtered = zone ? filterAssemblyByZone(assembly, zone) : assembly;\n const layout = buildLayout(filtered);\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '20px', fontSize: '16px' }}>\n <style dangerouslySetInnerHTML={{ __html: PAIR_STYLE }} />\n {layout.map((group, i) => {\n if (group.type === 'full') {\n return (\n <div key={i} style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.item.component} size=\"full\" />}\n {renderSingle(group.item, brand)}\n </div>\n );\n }\n if (group.type === 'pair') {\n return (\n <div key={i} className=\"sp-pair\">\n <div style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.items[0].component} size=\"half\" />}\n {renderSingle(group.items[0], brand)}\n </div>\n <div style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.items[1].component} size=\"half\" />}\n {renderSingle(group.items[1], brand)}\n </div>\n </div>\n );\n }\n return (\n <div key={i} style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.item.component} size=\"full\" />}\n {renderSingle(group.item, brand)}\n </div>\n );\n })}\n </div>\n );\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { ComponentRenderer } from './ComponentRenderer';\nimport { filterAssemblyByZone } from './types';\nimport type { ComponentAssembly, AssemblyZone } from './types';\n\ntype ConversionCheckResult =\n | { matched: false }\n | { matched: true; goalName: string | null; goalType: string; valueSelector: string | null; currencySelector: string | null; defaultCurrency: string };\n\nconst CSS_TOKENS = `:root{--sp-accent:#60a5fa;--sp-accent-bg:rgba(96,165,250,0.1);--sp-accent-border:rgba(96,165,250,0.2);--sp-bg:#18181b;--sp-surface:#09090b;--sp-border:#27272a;--sp-text:#f4f4f5;--sp-text-sub:#d4d4d8;--sp-text-strong:#e4e4e7;--sp-text-muted:#71717a;--sp-text-dim:#52525b;--sp-text-body:#a1a1aa;--sp-positive:#6ee7b7;--sp-divider:rgba(255,255,255,0.06);--sp-code-bg:rgba(255,255,255,0.07);--sp-code-border:rgba(255,255,255,0.08);--sp-pre-bg:rgba(0,0,0,0.4)}.sp-prose p{margin-bottom:.625rem}.sp-prose p:last-child{margin-bottom:0}.sp-prose ul{list-style:disc;padding-left:1.25rem;margin-bottom:.625rem}.sp-prose ol{list-style:decimal;padding-left:1.25rem;margin-bottom:.625rem}.sp-prose li{margin-bottom:.25rem}.sp-prose strong{color:var(--sp-text-strong);font-weight:600}.sp-prose h2,.sp-prose h3{color:var(--sp-text);font-weight:600;margin:.875rem 0 .375rem;font-size:1rem}.sp-prose code{background:var(--sp-code-bg);border:1px solid var(--sp-code-border);padding:.1rem .35rem;border-radius:.25rem;font-size:.82em;color:var(--sp-text)}.sp-prose blockquote{border-left:3px solid var(--sp-border);padding-left:1rem;color:var(--sp-text-muted);margin:.75rem 0}`;\n\n\nfunction buildSummary(pageHint: string, orgSlug: string): string {\n const parts: string[] = [pageHint];\n const referrer = document.referrer;\n if (referrer) parts.push(`Arrived from: ${referrer}`);\n const p = new URLSearchParams(window.location.search);\n const source = p.get('utm_source');\n const medium = p.get('utm_medium');\n const campaign = p.get('utm_campaign');\n const term = p.get('utm_term');\n if (source) parts.push(`Source: ${source}`);\n if (medium) parts.push(`Medium: ${medium}`);\n if (campaign) parts.push(`Campaign: ${campaign}`);\n if (term) parts.push(`Search term: ${term}`);\n try {\n const history = localStorage.getItem(`_spectare_visits_${orgSlug}`);\n if (history) parts.push(`Previously visited: ${history}`);\n } catch { /* private browsing */ }\n return parts.filter(Boolean).join('. ');\n}\n\nfunction Shimmer() {\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>\n <div style={{ height: '20px', background: 'rgba(39,39,42,0.6)', borderRadius: '8px', width: '75%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '14px', background: 'rgba(39,39,42,0.4)', borderRadius: '8px', width: '100%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '14px', background: 'rgba(39,39,42,0.4)', borderRadius: '8px', width: '83%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '14px', background: 'rgba(39,39,42,0.4)', borderRadius: '8px', width: '67%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n </div>\n );\n}\n\nexport interface PersonalisedSectionProps {\n orgSlug: string;\n /** Base URL of your Spectare instance. Defaults to 'https://spectare.ai'. */\n baseUrl?: string;\n /** Your brand name, used in ComparisonTable column header. */\n brand?: string;\n pageHint?: string;\n className?: string;\n style?: React.CSSProperties;\n initialAssembly?: ComponentAssembly;\n initialIntent?: { audience: string; stage: string };\n /** Render only components assigned to this zone. */\n zone?: AssemblyZone;\n}\n\nexport function PersonalisedSection({\n orgSlug,\n baseUrl = 'https://spectare.ai',\n brand,\n pageHint,\n className,\n style,\n initialAssembly,\n initialIntent,\n zone,\n}: PersonalisedSectionProps) {\n const [assembly, setAssembly] = useState<ComponentAssembly>(initialAssembly ?? []);\n const [loading, setLoading] = useState(!initialAssembly);\n const [orgName, setOrgName] = useState<string | undefined>(undefined);\n const tokenRef = useRef<string | null>(null);\n const conversionFiredRef = useRef(false);\n\n useEffect(() => {\n let cancelled = false;\n\n async function load() {\n try {\n const p = new URLSearchParams(window.location.search);\n const utmSuffix = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term']\n .map(k => p.get(k) ?? '').filter(Boolean).join('_');\n const tokenKey = `_spectare_token_${orgSlug}${utmSuffix ? '_' + utmSuffix : ''}`;\n let token = sessionStorage.getItem(tokenKey);\n\n if (!token) {\n const summary = buildSummary(pageHint ?? `Visiting ${document.title}`, orgSlug);\n const res = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!res.ok || cancelled) { setLoading(false); return; }\n const data = await res.json();\n token = data.token as string | undefined ?? null;\n if (token) sessionStorage.setItem(tokenKey, token);\n if (data.orgName) setOrgName(data.orgName as string);\n }\n\n if (!token || cancelled) { setLoading(false); return; }\n\n tokenRef.current = token;\n let res = await fetch(`${baseUrl}/api/assemble/components`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token, orgSlug }),\n });\n\n if (res.status === 401 && !cancelled) {\n sessionStorage.removeItem(tokenKey);\n const summary = buildSummary(pageHint ?? `Visiting ${document.title}`, orgSlug);\n const qRes = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!qRes.ok || cancelled) { setLoading(false); return; }\n const qData = await qRes.json();\n token = qData.token as string | undefined ?? null;\n if (token) {\n sessionStorage.setItem(tokenKey, token);\n tokenRef.current = token;\n }\n if (!token || cancelled) { setLoading(false); return; }\n res = await fetch(`${baseUrl}/api/assemble/components`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token, orgSlug }),\n });\n }\n\n if (!res.ok || cancelled) { setLoading(false); return; }\n\n const contentType = res.headers.get('content-type') ?? '';\n\n if (contentType.includes('text/event-stream')) {\n // Cold path: stream components as Claude generates them.\n // Render progressively — shimmer shows until the first component arrives.\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let buf = '';\n let loadingCleared = false;\n try {\n while (!cancelled) {\n const { done, value } = await reader.read();\n if (done || cancelled) break;\n buf += decoder.decode(value, { stream: true });\n const lines = buf.split('\\n');\n buf = lines.pop() ?? '';\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const payload = line.slice(6).trim();\n if (payload === '[DONE]') break;\n try {\n const comp = JSON.parse(payload) as ComponentAssembly[0];\n if (!loadingCleared) { setLoading(false); loadingCleared = true; }\n setAssembly(prev => [...prev, comp]);\n } catch { /* malformed event — skip */ }\n }\n }\n } finally {\n reader.cancel().catch(() => {});\n }\n } else {\n // Warm path: cache hit returns full JSON immediately.\n const data = await res.json() as {\n assembly?: ComponentAssembly;\n intent?: { userContext?: { audience?: string; stage?: string } };\n };\n\n if (cancelled) return;\n\n const clientAudience = data.intent?.userContext?.audience;\n const clientStage = data.intent?.userContext?.stage;\n const ssrMatches =\n initialIntent &&\n clientAudience === initialIntent.audience &&\n clientStage === initialIntent.stage;\n\n if (!ssrMatches && Array.isArray(data.assembly) && data.assembly.length > 0) {\n setAssembly(data.assembly as ComponentAssembly);\n }\n }\n } catch {\n // fail silently\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n\n load();\n return () => { cancelled = true; };\n }, [orgSlug, baseUrl, pageHint, initialAssembly, initialIntent]);\n\n useEffect(() => {\n if (!assembly.length || conversionFiredRef.current) return;\n const token = tokenRef.current;\n if (!token) return;\n const url = window.location.href;\n fetch(`${baseUrl}/api/conversion-check`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ orgSlug, url }),\n }).then(r => r.json() as Promise<ConversionCheckResult>).then(data => {\n if (!data.matched) return;\n conversionFiredRef.current = true;\n let goalValue: number | null = null;\n let goalCurrency: string | null = data.defaultCurrency;\n if (data.valueSelector) {\n try {\n const el = document.querySelector(data.valueSelector);\n if (el) {\n const num = parseFloat((el.textContent ?? '').trim().replace(/[^0-9.]/g, ''));\n if (!isNaN(num)) goalValue = num;\n }\n } catch { /* skip */ }\n }\n if (data.currencySelector) {\n try {\n const el = document.querySelector(data.currencySelector);\n if (el) goalCurrency = (el.textContent ?? '').trim() || goalCurrency;\n } catch { /* skip */ }\n }\n 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={zone ? filterAssemblyByZone(assembly, zone) : assembly} brand={brand ?? orgName} />}\n </div>\n </>\n );\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
|
|
3
3
|
type ComponentName = 'HeroStatement' | 'AtomCard' | 'StatGrid' | 'CodeBlock' | 'ComparisonTable' | 'FeatureList' | 'TestimonialCard' | 'ImageCtaHero' | 'CtaStrip';
|
|
4
|
+
type AssemblyZone = 'hero' | 'body' | 'proof' | 'cta';
|
|
4
5
|
type ComponentAssembly = Array<{
|
|
5
6
|
component: ComponentName;
|
|
6
7
|
slots?: Record<string, unknown>;
|
|
7
8
|
size?: 'full' | 'half';
|
|
9
|
+
zone?: AssemblyZone;
|
|
8
10
|
}>;
|
|
11
|
+
declare function filterAssemblyByZone(assembly: ComponentAssembly, zone: AssemblyZone): ComponentAssembly;
|
|
9
12
|
|
|
10
13
|
interface PersonalisedSectionProps {
|
|
11
14
|
orgSlug: string;
|
|
@@ -21,8 +24,10 @@ interface PersonalisedSectionProps {
|
|
|
21
24
|
audience: string;
|
|
22
25
|
stage: string;
|
|
23
26
|
};
|
|
27
|
+
/** Render only components assigned to this zone. */
|
|
28
|
+
zone?: AssemblyZone;
|
|
24
29
|
}
|
|
25
|
-
declare function PersonalisedSection({ orgSlug, baseUrl, brand, pageHint, className, style, initialAssembly, initialIntent, }: PersonalisedSectionProps):
|
|
30
|
+
declare function PersonalisedSection({ orgSlug, baseUrl, brand, pageHint, className, style, initialAssembly, initialIntent, zone, }: PersonalisedSectionProps): react_jsx_runtime.JSX.Element | null;
|
|
26
31
|
|
|
27
32
|
interface ComponentRendererProps {
|
|
28
33
|
assembly: ComponentAssembly;
|
|
@@ -30,7 +35,9 @@ interface ComponentRendererProps {
|
|
|
30
35
|
brand?: string;
|
|
31
36
|
/** Overlay a component name badge on each item. Useful for demos and debugging. */
|
|
32
37
|
xray?: boolean;
|
|
38
|
+
/** Render only components assigned to this zone. */
|
|
39
|
+
zone?: AssemblyZone;
|
|
33
40
|
}
|
|
34
|
-
declare function ComponentRenderer({ assembly, brand, xray }: ComponentRendererProps):
|
|
41
|
+
declare function ComponentRenderer({ assembly, brand, xray, zone }: ComponentRendererProps): react_jsx_runtime.JSX.Element;
|
|
35
42
|
|
|
36
|
-
export { type ComponentAssembly, type ComponentName, ComponentRenderer, type ComponentRendererProps, PersonalisedSection, type PersonalisedSectionProps };
|
|
43
|
+
export { type AssemblyZone, type ComponentAssembly, type ComponentName, ComponentRenderer, type ComponentRendererProps, PersonalisedSection, type PersonalisedSectionProps, filterAssemblyByZone };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
|
|
3
3
|
type ComponentName = 'HeroStatement' | 'AtomCard' | 'StatGrid' | 'CodeBlock' | 'ComparisonTable' | 'FeatureList' | 'TestimonialCard' | 'ImageCtaHero' | 'CtaStrip';
|
|
4
|
+
type AssemblyZone = 'hero' | 'body' | 'proof' | 'cta';
|
|
4
5
|
type ComponentAssembly = Array<{
|
|
5
6
|
component: ComponentName;
|
|
6
7
|
slots?: Record<string, unknown>;
|
|
7
8
|
size?: 'full' | 'half';
|
|
9
|
+
zone?: AssemblyZone;
|
|
8
10
|
}>;
|
|
11
|
+
declare function filterAssemblyByZone(assembly: ComponentAssembly, zone: AssemblyZone): ComponentAssembly;
|
|
9
12
|
|
|
10
13
|
interface PersonalisedSectionProps {
|
|
11
14
|
orgSlug: string;
|
|
@@ -21,8 +24,10 @@ interface PersonalisedSectionProps {
|
|
|
21
24
|
audience: string;
|
|
22
25
|
stage: string;
|
|
23
26
|
};
|
|
27
|
+
/** Render only components assigned to this zone. */
|
|
28
|
+
zone?: AssemblyZone;
|
|
24
29
|
}
|
|
25
|
-
declare function PersonalisedSection({ orgSlug, baseUrl, brand, pageHint, className, style, initialAssembly, initialIntent, }: PersonalisedSectionProps):
|
|
30
|
+
declare function PersonalisedSection({ orgSlug, baseUrl, brand, pageHint, className, style, initialAssembly, initialIntent, zone, }: PersonalisedSectionProps): react_jsx_runtime.JSX.Element | null;
|
|
26
31
|
|
|
27
32
|
interface ComponentRendererProps {
|
|
28
33
|
assembly: ComponentAssembly;
|
|
@@ -30,7 +35,9 @@ interface ComponentRendererProps {
|
|
|
30
35
|
brand?: string;
|
|
31
36
|
/** Overlay a component name badge on each item. Useful for demos and debugging. */
|
|
32
37
|
xray?: boolean;
|
|
38
|
+
/** Render only components assigned to this zone. */
|
|
39
|
+
zone?: AssemblyZone;
|
|
33
40
|
}
|
|
34
|
-
declare function ComponentRenderer({ assembly, brand, xray }: ComponentRendererProps):
|
|
41
|
+
declare function ComponentRenderer({ assembly, brand, xray, zone }: ComponentRendererProps): react_jsx_runtime.JSX.Element;
|
|
35
42
|
|
|
36
|
-
export { type ComponentAssembly, type ComponentName, ComponentRenderer, type ComponentRendererProps, PersonalisedSection, type PersonalisedSectionProps };
|
|
43
|
+
export { type AssemblyZone, type ComponentAssembly, type ComponentName, ComponentRenderer, type ComponentRendererProps, PersonalisedSection, type PersonalisedSectionProps, filterAssemblyByZone };
|
package/dist/index.js
CHANGED
|
@@ -3,81 +3,101 @@ import { marked } from 'marked';
|
|
|
3
3
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
4
4
|
|
|
5
5
|
// src/PersonalisedSection.tsx
|
|
6
|
+
|
|
7
|
+
// src/types.ts
|
|
8
|
+
var COMPONENT_ZONES = {
|
|
9
|
+
HeroStatement: "hero",
|
|
10
|
+
ImageCtaHero: "hero",
|
|
11
|
+
AtomCard: "body",
|
|
12
|
+
StatGrid: "body",
|
|
13
|
+
CodeBlock: "body",
|
|
14
|
+
ComparisonTable: "body",
|
|
15
|
+
FeatureList: "body",
|
|
16
|
+
TestimonialCard: "proof",
|
|
17
|
+
CtaStrip: "cta"
|
|
18
|
+
};
|
|
19
|
+
function filterAssemblyByZone(assembly, zone) {
|
|
20
|
+
return assembly.filter((item) => {
|
|
21
|
+
var _a;
|
|
22
|
+
const effectiveZone = (_a = item.zone) != null ? _a : COMPONENT_ZONES[item.component];
|
|
23
|
+
return effectiveZone === zone;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
6
26
|
function renderMarkdown(content) {
|
|
7
27
|
return marked.parse(content, { async: false });
|
|
8
28
|
}
|
|
9
29
|
var HALF_COMPONENTS = /* @__PURE__ */ new Set(["TestimonialCard"]);
|
|
10
30
|
function HeroStatement({ headline, subheading }) {
|
|
11
|
-
return /* @__PURE__ */ jsxs("div", { style: { paddingTop: "
|
|
12
|
-
/* @__PURE__ */ jsx("h2", { style: { fontSize: "
|
|
13
|
-
subheading && /* @__PURE__ */ jsx("p", { style: { fontSize: "
|
|
31
|
+
return /* @__PURE__ */ jsxs("div", { style: { paddingTop: "24px", paddingBottom: "24px" }, children: [
|
|
32
|
+
/* @__PURE__ */ jsx("h2", { style: { fontSize: "32px", fontWeight: 700, letterSpacing: "-0.025em", lineHeight: 1.2, color: "var(--sp-text)", margin: "0 0 12px" }, children: headline }),
|
|
33
|
+
subheading && /* @__PURE__ */ jsx("p", { style: { fontSize: "18px", color: "var(--sp-text-sub)", lineHeight: 1.6, maxWidth: "672px", margin: 0 }, children: subheading })
|
|
14
34
|
] });
|
|
15
35
|
}
|
|
16
36
|
function AtomCard({ title, content }) {
|
|
17
|
-
return /* @__PURE__ */ jsxs("div", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "
|
|
18
|
-
title && /* @__PURE__ */ jsx("h3", { style: { fontSize: "
|
|
37
|
+
return /* @__PURE__ */ jsxs("div", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "12px", padding: "24px", height: "100%" }, children: [
|
|
38
|
+
title && /* @__PURE__ */ jsx("h3", { style: { fontSize: "16px", fontWeight: 600, color: "var(--sp-text)", margin: "0 0 12px" }, children: title }),
|
|
19
39
|
content && /* @__PURE__ */ jsx(
|
|
20
40
|
"div",
|
|
21
41
|
{
|
|
22
42
|
className: "sp-prose",
|
|
23
|
-
style: { fontSize: "
|
|
43
|
+
style: { fontSize: "15px", color: "var(--sp-text-sub)", lineHeight: 1.6 },
|
|
24
44
|
dangerouslySetInnerHTML: { __html: renderMarkdown(content) }
|
|
25
45
|
}
|
|
26
46
|
)
|
|
27
47
|
] });
|
|
28
48
|
}
|
|
29
|
-
function StatGrid({ stats, caption }) {
|
|
49
|
+
function StatGrid({ stats = [], caption }) {
|
|
30
50
|
const cols = stats.length === 2 ? 2 : stats.length === 3 ? 3 : 4;
|
|
31
51
|
return /* @__PURE__ */ jsxs("div", { children: [
|
|
32
|
-
/* @__PURE__ */ jsx("div", { style: { display: "grid", gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: "
|
|
33
|
-
/* @__PURE__ */ jsx("p", { style: { fontSize: "
|
|
34
|
-
/* @__PURE__ */ jsx("p", { style: { fontSize: "
|
|
52
|
+
/* @__PURE__ */ jsx("div", { style: { display: "grid", gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: "12px" }, children: stats.map(({ value, label }) => /* @__PURE__ */ jsxs("div", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "10px", padding: "16px 20px", display: "flex", flexDirection: "column", justifyContent: "space-between", minHeight: "88px" }, children: [
|
|
53
|
+
/* @__PURE__ */ jsx("p", { style: { fontSize: "11px", color: "var(--sp-text-muted)", textTransform: "uppercase", letterSpacing: "0.06em", margin: "0 0 12px", lineHeight: 1.3 }, children: label }),
|
|
54
|
+
/* @__PURE__ */ jsx("p", { style: { fontSize: "20px", fontWeight: 500, color: "var(--sp-text)", fontVariantNumeric: "tabular-nums", lineHeight: 1, margin: 0 }, children: value })
|
|
35
55
|
] }, label)) }),
|
|
36
|
-
caption && /* @__PURE__ */ jsx("p", { style: { fontSize: "
|
|
56
|
+
caption && /* @__PURE__ */ jsx("p", { style: { fontSize: "13px", color: "var(--sp-text-muted)", margin: "12px 0 0" }, children: caption })
|
|
37
57
|
] });
|
|
38
58
|
}
|
|
39
59
|
function CodeBlock({ code, lang = "typescript", caption }) {
|
|
40
|
-
return /* @__PURE__ */ jsxs("div", { style: { borderRadius: "
|
|
41
|
-
/* @__PURE__ */ jsxs("div", { style: { background: "var(--sp-bg)", padding: "
|
|
42
|
-
/* @__PURE__ */ jsx("span", { style: { fontSize: "
|
|
43
|
-
caption && /* @__PURE__ */ jsx("span", { style: { fontSize: "
|
|
60
|
+
return /* @__PURE__ */ jsxs("div", { style: { borderRadius: "12px", overflow: "hidden", border: "1px solid var(--sp-border)" }, children: [
|
|
61
|
+
/* @__PURE__ */ jsxs("div", { style: { background: "var(--sp-bg)", padding: "10px 16px", display: "flex", alignItems: "center", justifyContent: "space-between", borderBottom: "1px solid var(--sp-border)" }, children: [
|
|
62
|
+
/* @__PURE__ */ jsx("span", { style: { fontSize: "12px", color: "var(--sp-text-muted)", fontFamily: "monospace" }, children: lang }),
|
|
63
|
+
caption && /* @__PURE__ */ jsx("span", { style: { fontSize: "12px", color: "var(--sp-text-muted)" }, children: caption })
|
|
44
64
|
] }),
|
|
45
|
-
/* @__PURE__ */ jsx("pre", { style: { background: "var(--sp-surface)", padding: "
|
|
65
|
+
/* @__PURE__ */ jsx("pre", { style: { background: "var(--sp-surface)", padding: "20px", fontSize: "13px", color: "var(--sp-text-sub)", overflowX: "auto", lineHeight: 1.6, fontFamily: "monospace", whiteSpace: "pre", margin: 0 }, children: code })
|
|
46
66
|
] });
|
|
47
67
|
}
|
|
48
|
-
function ComparisonTable({ brand = "Us", competitor, rows }) {
|
|
49
|
-
return /* @__PURE__ */ jsx("div", { style: { border: "1px solid var(--sp-border)", borderRadius: "
|
|
68
|
+
function ComparisonTable({ brand = "Us", competitor, rows = [] }) {
|
|
69
|
+
return /* @__PURE__ */ jsx("div", { style: { border: "1px solid var(--sp-border)", borderRadius: "12px", overflow: "hidden" }, children: /* @__PURE__ */ jsx("div", { style: { overflowX: "auto" }, children: /* @__PURE__ */ jsxs("table", { style: { width: "100%", fontSize: "14px", borderCollapse: "collapse" }, children: [
|
|
50
70
|
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { style: { borderBottom: "1px solid var(--sp-border)", background: "var(--sp-bg)" }, children: [
|
|
51
|
-
/* @__PURE__ */ jsx("th", { style: { textAlign: "left", padding: "
|
|
52
|
-
/* @__PURE__ */ jsx("th", { style: { textAlign: "left", padding: "
|
|
53
|
-
/* @__PURE__ */ jsx("th", { style: { textAlign: "left", padding: "
|
|
71
|
+
/* @__PURE__ */ jsx("th", { style: { textAlign: "left", padding: "12px 16px", color: "var(--sp-text-muted)", fontWeight: 500, fontSize: "12px", width: "33%" } }),
|
|
72
|
+
/* @__PURE__ */ jsx("th", { style: { textAlign: "left", padding: "12px 16px", fontWeight: 600, color: "var(--sp-accent)", fontSize: "12px" }, children: brand }),
|
|
73
|
+
/* @__PURE__ */ jsx("th", { style: { textAlign: "left", padding: "12px 16px", color: "var(--sp-text-muted)", fontWeight: 500, fontSize: "12px" }, children: competitor })
|
|
54
74
|
] }) }),
|
|
55
75
|
/* @__PURE__ */ jsx("tbody", { children: rows.map(({ label, spectare, them }) => /* @__PURE__ */ jsxs("tr", { style: { borderBottom: "1px solid var(--sp-border)" }, children: [
|
|
56
|
-
/* @__PURE__ */ jsx("td", { style: { padding: "
|
|
57
|
-
/* @__PURE__ */ jsx("td", { style: { padding: "
|
|
58
|
-
/* @__PURE__ */ jsx("td", { style: { padding: "
|
|
76
|
+
/* @__PURE__ */ jsx("td", { style: { padding: "12px 16px", fontSize: "13px", color: "var(--sp-text-muted)", fontWeight: 500 }, children: label }),
|
|
77
|
+
/* @__PURE__ */ jsx("td", { style: { padding: "12px 16px", fontSize: "13px", color: "var(--sp-positive)", fontWeight: 500 }, children: spectare }),
|
|
78
|
+
/* @__PURE__ */ jsx("td", { style: { padding: "12px 16px", fontSize: "13px", color: "var(--sp-text-muted)" }, children: them })
|
|
59
79
|
] }, label)) })
|
|
60
80
|
] }) }) });
|
|
61
81
|
}
|
|
62
|
-
function FeatureList({ items }) {
|
|
63
|
-
return /* @__PURE__ */ jsx("div", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "
|
|
64
|
-
/* @__PURE__ */ jsx("span", { style: { color: "var(--sp-accent)", flexShrink: 0, fontSize: "
|
|
82
|
+
function FeatureList({ items = [] }) {
|
|
83
|
+
return /* @__PURE__ */ jsx("div", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "12px", padding: "24px" }, children: /* @__PURE__ */ jsx("ul", { style: { listStyle: "none", margin: 0, padding: 0, display: "flex", flexDirection: "column", gap: "16px" }, children: items.map(({ text, sub }) => /* @__PURE__ */ jsxs("li", { style: { display: "flex", gap: "12px" }, children: [
|
|
84
|
+
/* @__PURE__ */ jsx("span", { style: { color: "var(--sp-accent)", flexShrink: 0, fontSize: "15px", marginTop: "2px" }, children: "\u2713" }),
|
|
65
85
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
66
|
-
/* @__PURE__ */ jsx("p", { style: { fontSize: "
|
|
67
|
-
sub && /* @__PURE__ */ jsx("p", { style: { fontSize: "
|
|
86
|
+
/* @__PURE__ */ jsx("p", { style: { fontSize: "15px", fontWeight: 500, color: "var(--sp-text)", lineHeight: 1.4, margin: 0 }, children: text }),
|
|
87
|
+
sub && /* @__PURE__ */ jsx("p", { style: { fontSize: "13px", color: "var(--sp-text-muted)", lineHeight: 1.5, margin: "4px 0 0" }, children: sub })
|
|
68
88
|
] })
|
|
69
89
|
] }, text)) }) });
|
|
70
90
|
}
|
|
71
91
|
function TestimonialCard({ quote, name, role, company }) {
|
|
72
|
-
return /* @__PURE__ */ jsxs("div", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "
|
|
73
|
-
/* @__PURE__ */ jsxs("p", { style: { fontSize: "
|
|
74
|
-
/* @__PURE__ */ jsx("span", { style: { color: "var(--sp-text-dim)", fontSize: "
|
|
92
|
+
return /* @__PURE__ */ jsxs("div", { style: { background: "var(--sp-bg)", border: "1px solid var(--sp-border)", borderRadius: "12px", padding: "24px", display: "flex", flexDirection: "column", gap: "20px", height: "100%" }, children: [
|
|
93
|
+
/* @__PURE__ */ jsxs("p", { style: { fontSize: "15px", color: "var(--sp-text-sub)", lineHeight: 1.6, flex: 1, margin: 0 }, children: [
|
|
94
|
+
/* @__PURE__ */ jsx("span", { style: { color: "var(--sp-text-dim)", fontSize: "18px", lineHeight: 1, marginRight: "4px" }, children: '"' }),
|
|
75
95
|
quote,
|
|
76
|
-
/* @__PURE__ */ jsx("span", { style: { color: "var(--sp-text-dim)", fontSize: "
|
|
96
|
+
/* @__PURE__ */ jsx("span", { style: { color: "var(--sp-text-dim)", fontSize: "18px", lineHeight: 1, marginLeft: "4px" }, children: '"' })
|
|
77
97
|
] }),
|
|
78
|
-
/* @__PURE__ */ jsxs("div", { style: { borderTop: "1px solid var(--sp-border)", paddingTop: "
|
|
79
|
-
/* @__PURE__ */ jsx("p", { style: { fontSize: "
|
|
80
|
-
/* @__PURE__ */ jsxs("p", { style: { fontSize: "
|
|
98
|
+
/* @__PURE__ */ jsxs("div", { style: { borderTop: "1px solid var(--sp-border)", paddingTop: "16px" }, children: [
|
|
99
|
+
/* @__PURE__ */ jsx("p", { style: { fontSize: "14px", fontWeight: 600, color: "var(--sp-text)", margin: 0 }, children: name }),
|
|
100
|
+
/* @__PURE__ */ jsxs("p", { style: { fontSize: "13px", color: "var(--sp-text-muted)", margin: "2px 0 0" }, children: [
|
|
81
101
|
role,
|
|
82
102
|
company ? `, ${company}` : ""
|
|
83
103
|
] })
|
|
@@ -86,22 +106,22 @@ function TestimonialCard({ quote, name, role, company }) {
|
|
|
86
106
|
}
|
|
87
107
|
function ImageCtaHero({ src, alt = "", headline, subheading, ctaLabel, ctaHref }) {
|
|
88
108
|
if (!src) return null;
|
|
89
|
-
return /* @__PURE__ */ jsxs("div", { style: { borderRadius: "
|
|
109
|
+
return /* @__PURE__ */ jsxs("div", { style: { borderRadius: "12px", overflow: "hidden", position: "relative", width: "100%", paddingBottom: "56.25%" }, children: [
|
|
90
110
|
/* @__PURE__ */ jsx("img", { src, alt, style: { position: "absolute", inset: 0, width: "100%", height: "100%", objectFit: "cover" } }),
|
|
91
111
|
/* @__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: "
|
|
93
|
-
headline && /* @__PURE__ */ jsx("h2", { style: { fontSize: "
|
|
94
|
-
subheading && /* @__PURE__ */ jsx("p", { style: { fontSize: "
|
|
95
|
-
ctaHref && ctaLabel && /* @__PURE__ */ jsx("a", { href: ctaHref, style: { display: "inline-block", background: "#fff", color: "#09090b", padding: "
|
|
112
|
+
/* @__PURE__ */ jsxs("div", { style: { position: "absolute", bottom: 0, left: 0, right: 0, padding: "28px" }, children: [
|
|
113
|
+
headline && /* @__PURE__ */ jsx("h2", { style: { fontSize: "24px", fontWeight: 700, color: "#fff", lineHeight: 1.2, margin: "0 0 8px", letterSpacing: "-0.02em" }, children: headline }),
|
|
114
|
+
subheading && /* @__PURE__ */ jsx("p", { style: { fontSize: "15px", color: "rgba(255,255,255,0.75)", lineHeight: 1.5, margin: "0 0 20px" }, children: subheading }),
|
|
115
|
+
ctaHref && ctaLabel && /* @__PURE__ */ jsx("a", { href: ctaHref, style: { display: "inline-block", background: "#fff", color: "#09090b", padding: "8px 20px", borderRadius: "8px", fontWeight: 600, fontSize: "14px", textDecoration: "none" }, children: ctaLabel })
|
|
96
116
|
] })
|
|
97
117
|
] });
|
|
98
118
|
}
|
|
99
119
|
function CtaStrip({ headline, primary, secondary }) {
|
|
100
|
-
return /* @__PURE__ */ jsxs("div", { style: { border: "1px solid var(--sp-border)", borderRadius: "
|
|
101
|
-
/* @__PURE__ */ jsx("h3", { style: { fontSize: "
|
|
102
|
-
/* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", gap: "
|
|
103
|
-
/* @__PURE__ */ jsx("a", { href: primary.href, style: { background: "#fff", color: "#09090b", padding: "
|
|
104
|
-
secondary && /* @__PURE__ */ jsxs("a", { href: secondary.href, style: { fontSize: "
|
|
120
|
+
return /* @__PURE__ */ jsxs("div", { style: { border: "1px solid var(--sp-border)", borderRadius: "12px", padding: "32px", textAlign: "center", background: "var(--sp-bg)" }, children: [
|
|
121
|
+
/* @__PURE__ */ jsx("h3", { style: { fontSize: "24px", fontWeight: 700, color: "var(--sp-text)", margin: "0 0 24px" }, children: headline }),
|
|
122
|
+
/* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", gap: "16px", flexWrap: "wrap" }, children: [
|
|
123
|
+
/* @__PURE__ */ jsx("a", { href: primary.href, style: { background: "#fff", color: "#09090b", padding: "10px 24px", borderRadius: "12px", fontWeight: 600, fontSize: "15px", textDecoration: "none" }, children: primary.label }),
|
|
124
|
+
secondary && /* @__PURE__ */ jsxs("a", { href: secondary.href, style: { fontSize: "15px", color: "var(--sp-text-sub)", textDecoration: "none" }, children: [
|
|
105
125
|
secondary.label,
|
|
106
126
|
" \u2192"
|
|
107
127
|
] })
|
|
@@ -158,15 +178,16 @@ function buildLayout(assembly) {
|
|
|
158
178
|
return groups;
|
|
159
179
|
}
|
|
160
180
|
function XrayBadge({ name, size }) {
|
|
161
|
-
return /* @__PURE__ */ jsxs("div", { style: { position: "absolute", top: "
|
|
162
|
-
/* @__PURE__ */ jsx("span", { style: { fontSize: "
|
|
163
|
-
/* @__PURE__ */ jsx("span", { style: { fontSize: "
|
|
181
|
+
return /* @__PURE__ */ jsxs("div", { style: { position: "absolute", top: "8px", left: "8px", zIndex: 10, display: "flex", alignItems: "center", gap: "6px", pointerEvents: "none", userSelect: "none" }, children: [
|
|
182
|
+
/* @__PURE__ */ jsx("span", { style: { fontSize: "10px", fontFamily: "monospace", background: "rgba(59,130,246,0.9)", color: "#fff", padding: "2px 6px", borderRadius: "4px", lineHeight: 1 }, children: name }),
|
|
183
|
+
/* @__PURE__ */ jsx("span", { style: { fontSize: "10px", fontFamily: "monospace", color: "#71717a", lineHeight: 1 }, children: size })
|
|
164
184
|
] });
|
|
165
185
|
}
|
|
166
|
-
var PAIR_STYLE = ".sp-pair{display:grid;grid-template-columns:1fr 1fr;gap:
|
|
167
|
-
function ComponentRenderer({ assembly, brand, xray = false }) {
|
|
168
|
-
const
|
|
169
|
-
|
|
186
|
+
var PAIR_STYLE = ".sp-pair{display:grid;grid-template-columns:1fr 1fr;gap:20px}@media(max-width:640px){.sp-pair{grid-template-columns:1fr}}";
|
|
187
|
+
function ComponentRenderer({ assembly, brand, xray = false, zone }) {
|
|
188
|
+
const filtered = zone ? filterAssemblyByZone(assembly, zone) : assembly;
|
|
189
|
+
const layout = buildLayout(filtered);
|
|
190
|
+
return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "20px", fontSize: "16px" }, children: [
|
|
170
191
|
/* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: PAIR_STYLE } }),
|
|
171
192
|
layout.map((group, i) => {
|
|
172
193
|
if (group.type === "full") {
|
|
@@ -216,11 +237,11 @@ function buildSummary(pageHint, orgSlug) {
|
|
|
216
237
|
return parts.filter(Boolean).join(". ");
|
|
217
238
|
}
|
|
218
239
|
function Shimmer() {
|
|
219
|
-
return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "
|
|
220
|
-
/* @__PURE__ */ jsx("div", { style: { height: "
|
|
221
|
-
/* @__PURE__ */ jsx("div", { style: { height: "
|
|
222
|
-
/* @__PURE__ */ jsx("div", { style: { height: "
|
|
223
|
-
/* @__PURE__ */ jsx("div", { style: { height: "
|
|
240
|
+
return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [
|
|
241
|
+
/* @__PURE__ */ jsx("div", { style: { height: "20px", background: "rgba(39,39,42,0.6)", borderRadius: "8px", width: "75%", animation: "sp-pulse 1.5s ease-in-out infinite" } }),
|
|
242
|
+
/* @__PURE__ */ jsx("div", { style: { height: "14px", background: "rgba(39,39,42,0.4)", borderRadius: "8px", width: "100%", animation: "sp-pulse 1.5s ease-in-out infinite" } }),
|
|
243
|
+
/* @__PURE__ */ jsx("div", { style: { height: "14px", background: "rgba(39,39,42,0.4)", borderRadius: "8px", width: "83%", animation: "sp-pulse 1.5s ease-in-out infinite" } }),
|
|
244
|
+
/* @__PURE__ */ jsx("div", { style: { height: "14px", background: "rgba(39,39,42,0.4)", borderRadius: "8px", width: "67%", animation: "sp-pulse 1.5s ease-in-out infinite" } })
|
|
224
245
|
] });
|
|
225
246
|
}
|
|
226
247
|
function PersonalisedSection({
|
|
@@ -231,7 +252,8 @@ function PersonalisedSection({
|
|
|
231
252
|
className,
|
|
232
253
|
style,
|
|
233
254
|
initialAssembly,
|
|
234
|
-
initialIntent
|
|
255
|
+
initialIntent,
|
|
256
|
+
zone
|
|
235
257
|
}) {
|
|
236
258
|
const [assembly, setAssembly] = useState(initialAssembly != null ? initialAssembly : []);
|
|
237
259
|
const [loading, setLoading] = useState(!initialAssembly);
|
|
@@ -411,10 +433,10 @@ function PersonalisedSection({
|
|
|
411
433
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
412
434
|
/* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: CSS_TOKENS } }),
|
|
413
435
|
/* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: "@keyframes sp-pulse{0%,100%{opacity:1}50%{opacity:0.4}}" } }),
|
|
414
|
-
/* @__PURE__ */ jsx("div", { className, style, children: loading && assembly.length === 0 ? /* @__PURE__ */ jsx(Shimmer, {}) : /* @__PURE__ */ jsx(ComponentRenderer, { assembly, brand: brand != null ? brand : orgName }) })
|
|
436
|
+
/* @__PURE__ */ jsx("div", { className, style, children: loading && assembly.length === 0 ? /* @__PURE__ */ jsx(Shimmer, {}) : /* @__PURE__ */ jsx(ComponentRenderer, { assembly: zone ? filterAssemblyByZone(assembly, zone) : assembly, brand: brand != null ? brand : orgName }) })
|
|
415
437
|
] });
|
|
416
438
|
}
|
|
417
439
|
|
|
418
|
-
export { ComponentRenderer, PersonalisedSection };
|
|
440
|
+
export { ComponentRenderer, PersonalisedSection, filterAssemblyByZone };
|
|
419
441
|
//# sourceMappingURL=index.js.map
|
|
420
442
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ComponentRenderer.tsx","../src/PersonalisedSection.tsx"],"names":["jsxs","jsx","_a","res"],"mappings":";;;;;AAKA,SAAS,eAAe,OAAA,EAAyB;AAC/C,EAAA,OAAO,OAAO,KAAA,CAAM,OAAA,EAAS,EAAE,KAAA,EAAO,OAAO,CAAA;AAC/C;AAGA,IAAM,eAAA,mBAAkB,IAAI,GAAA,CAAmB,CAAC,iBAAiB,CAAC,CAAA;AAIlE,SAAS,aAAA,CAAc,EAAE,QAAA,EAAU,UAAA,EAAW,EAA8C;AAC1F,EAAA,uBACE,IAAA,CAAC,SAAI,KAAA,EAAO,EAAE,YAAY,QAAA,EAAU,aAAA,EAAe,UAAS,EAC1D,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,QAAG,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,YAAY,GAAA,EAAK,aAAA,EAAe,UAAA,EAAY,UAAA,EAAY,KAAK,KAAA,EAAO,gBAAA,EAAkB,MAAA,EAAQ,aAAA,IAC1H,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,IACC,8BACC,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,UAAU,UAAA,EAAY,KAAA,EAAO,oBAAA,EAAsB,UAAA,EAAY,KAAK,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,CAAA,IAAM,QAAA,EAAA,UAAA,EAAW;AAAA,GAAA,EAEhI,CAAA;AAEJ;AAEA,SAAS,QAAA,CAAS,EAAE,KAAA,EAAO,OAAA,EAAQ,EAAyC;AAC1E,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAY,cAAA,EAAgB,MAAA,EAAQ,4BAAA,EAA8B,YAAA,EAAc,SAAA,EAAW,OAAA,EAAS,QAAA,EAAU,MAAA,EAAQ,QAAO,EACxI,QAAA,EAAA;AAAA,IAAA,KAAA,oBAAS,GAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,gBAAA,EAAkB,MAAA,EAAQ,aAAA,IAAkB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAClH,OAAA,oBACC,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,UAAA;AAAA,QACV,OAAO,EAAE,QAAA,EAAU,YAAY,KAAA,EAAO,oBAAA,EAAsB,YAAY,GAAA,EAAI;AAAA,QAC5E,uBAAA,EAAyB,EAAE,MAAA,EAAQ,cAAA,CAAe,OAAO,CAAA;AAAE;AAAA;AAC7D,GAAA,EAEJ,CAAA;AAEJ;AAEA,SAAS,QAAA,CAAS,EAAE,KAAA,EAAO,OAAA,EAAQ,EAAoE;AACrG,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,KAAW,CAAA,GAAI,IAAI,KAAA,CAAM,MAAA,KAAW,IAAI,CAAA,GAAI,CAAA;AAC/D,EAAA,4BACG,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,SAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,qBAAqB,CAAA,OAAA,EAAU,IAAI,CAAA,MAAA,CAAA,EAAU,GAAA,EAAK,WAAU,EACxF,QAAA,EAAA,KAAA,CAAM,IAAI,CAAC,EAAE,OAAO,KAAA,EAAM,qBACzB,IAAA,CAAC,KAAA,EAAA,EAAgB,OAAO,EAAE,UAAA,EAAY,gBAAgB,MAAA,EAAQ,4BAAA,EAA8B,cAAc,UAAA,EAAY,OAAA,EAAS,cAAA,EAAgB,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,gBAAgB,eAAA,EAAiB,SAAA,EAAW,UAAS,EAC5O,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,OAAE,KAAA,EAAO,EAAE,QAAA,EAAU,WAAA,EAAa,OAAO,sBAAA,EAAwB,aAAA,EAAe,WAAA,EAAa,aAAA,EAAe,UAAU,MAAA,EAAQ,aAAA,EAAe,UAAA,EAAY,GAAA,IAAQ,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BACvK,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,WAAW,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,gBAAA,EAAkB,oBAAoB,cAAA,EAAgB,UAAA,EAAY,GAAG,MAAA,EAAQ,CAAA,IAAM,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EAAA,EAF1I,KAGV,CACD,CAAA,EACH,CAAA;AAAA,IACC,OAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,sBAAA,EAAwB,SAAA,EAAW,SAAA,EAAW,MAAA,EAAQ,aAAA,IAAkB,QAAA,EAAA,OAAA,EAAQ;AAAA,GAAA,EAE5H,CAAA;AAEJ;AAEA,SAAS,UAAU,EAAE,IAAA,EAAM,IAAA,GAAO,YAAA,EAAc,SAAQ,EAAsD;AAC5G,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EAAc,WAAW,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,4BAAA,EAA6B,EAC9F,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,UAAA,EAAY,gBAAgB,OAAA,EAAS,eAAA,EAAiB,OAAA,EAAS,MAAA,EAAQ,YAAY,QAAA,EAAU,cAAA,EAAgB,eAAA,EAAiB,YAAA,EAAc,8BAA6B,EACrL,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,SAAA,EAAW,OAAO,sBAAA,EAAwB,UAAA,EAAY,WAAA,EAAY,EAAI,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,MACnG,OAAA,oBAAW,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAU,SAAA,EAAW,KAAA,EAAO,sBAAA,EAAuB,EAAI,QAAA,EAAA,OAAA,EAAQ;AAAA,KAAA,EAC5F,CAAA;AAAA,oBACA,GAAA,CAAC,SAAI,KAAA,EAAO,EAAE,YAAY,mBAAA,EAAqB,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,sBAAsB,SAAA,EAAW,MAAA,EAAQ,UAAA,EAAY,GAAA,EAAK,UAAA,EAAY,WAAA,EAAa,YAAY,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAE,EAC5M,QAAA,EAAA,IAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,gBAAgB,EAAE,KAAA,GAAQ,IAAA,EAAM,UAAA,EAAY,MAAK,EAAsG;AAC9J,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,MAAA,EAAQ,4BAAA,EAA8B,YAAA,EAAc,SAAA,EAAW,QAAA,EAAU,QAAA,EAAS,EAC9F,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,EAAO,EAC9B,QAAA,kBAAA,IAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,UAAA,EAAY,cAAA,EAAgB,UAAA,EAAW,EAC9E,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,OAAA,EAAA,EACC,+BAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,YAAA,EAAc,4BAAA,EAA8B,UAAA,EAAY,cAAA,EAAe,EAClF,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,SAAA,EAAW,QAAQ,OAAA,EAAS,cAAA,EAAgB,KAAA,EAAO,sBAAA,EAAwB,YAAY,GAAA,EAAK,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,OAAM,EAAG,CAAA;AAAA,sBAC9I,GAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,WAAW,MAAA,EAAQ,OAAA,EAAS,cAAA,EAAgB,UAAA,EAAY,KAAK,KAAA,EAAO,kBAAA,EAAoB,QAAA,EAAU,SAAA,IAAc,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACnI,GAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,WAAW,MAAA,EAAQ,OAAA,EAAS,cAAA,EAAgB,KAAA,EAAO,wBAAwB,UAAA,EAAY,GAAA,EAAK,QAAA,EAAU,SAAA,IAAc,QAAA,EAAA,UAAA,EAAW;AAAA,KAAA,EAC9I,CAAA,EACF,CAAA;AAAA,wBACC,OAAA,EAAA,EACE,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,QAAA,EAAU,IAAA,EAAK,0BAChC,IAAA,EAAA,EAAe,KAAA,EAAO,EAAE,YAAA,EAAc,8BAA6B,EAClE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,OAAA,EAAS,cAAA,EAAgB,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,sBAAA,EAAwB,UAAA,EAAY,GAAA,EAAI,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACpH,GAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,OAAA,EAAS,cAAA,EAAgB,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,oBAAA,EAAsB,UAAA,EAAY,GAAA,IAAQ,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,sBACrH,GAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,OAAA,EAAS,cAAA,EAAgB,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,sBAAA,EAAuB,EAAI,QAAA,EAAA,IAAA,EAAK;AAAA,KAAA,EAAA,EAH3F,KAIT,CACD,CAAA,EACH;AAAA,GAAA,EACF,GACF,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,KAAA,EAAM,EAAgD;AAC3E,EAAA,uBACE,GAAA,CAAC,SAAI,KAAA,EAAO,EAAE,YAAY,cAAA,EAAgB,MAAA,EAAQ,8BAA8B,YAAA,EAAc,SAAA,EAAW,SAAS,QAAA,EAAS,EACzH,8BAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAQ,CAAA,EAAG,OAAA,EAAS,GAAG,OAAA,EAAS,MAAA,EAAQ,eAAe,QAAA,EAAU,GAAA,EAAK,QAAO,EAC1G,QAAA,EAAA,KAAA,CAAM,IAAI,CAAC,EAAE,MAAM,GAAA,EAAI,0BACrB,IAAA,EAAA,EAAc,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,SAAA,EAAU,EACtD,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,kBAAA,EAAoB,UAAA,EAAY,CAAA,EAAG,QAAA,EAAU,UAAA,EAAY,SAAA,EAAW,UAAA,EAAW,EAAG,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,yBACxG,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,YAAY,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,gBAAA,EAAkB,UAAA,EAAY,GAAA,EAAK,MAAA,EAAQ,CAAA,IAAM,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,MAC/G,uBAAO,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,UAAU,SAAA,EAAW,KAAA,EAAO,sBAAA,EAAwB,SAAA,EAAW,WAAW,UAAA,EAAY,GAAA,EAAK,MAAA,EAAQ,aAAA,IAAkB,QAAA,EAAA,GAAA,EAAI;AAAA,KAAA,EAC/I;AAAA,GAAA,EAAA,EALO,IAMT,CACD,CAAA,EACH,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,gBAAgB,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,SAAQ,EAAoE;AACxH,EAAA,uBACE,IAAA,CAAC,SAAI,KAAA,EAAO,EAAE,YAAY,cAAA,EAAgB,MAAA,EAAQ,8BAA8B,YAAA,EAAc,SAAA,EAAW,SAAS,QAAA,EAAU,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,KAAK,SAAA,EAAW,MAAA,EAAQ,QAAO,EACnM,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,oBAAA,EAAsB,UAAA,EAAY,GAAA,EAAK,IAAA,EAAM,CAAA,EAAG,MAAA,EAAQ,GAAE,EACjG,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,oBAAA,EAAsB,QAAA,EAAU,UAAA,EAAY,UAAA,EAAY,CAAA,EAAG,WAAA,EAAa,SAAA,EAAU,EAAG,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,MAC3G,KAAA;AAAA,sBACD,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,oBAAA,EAAsB,QAAA,EAAU,UAAA,EAAY,UAAA,EAAY,CAAA,EAAG,UAAA,EAAY,SAAA,IAAa,QAAA,EAAA,GAAA,EAAC;AAAA,KAAA,EAC7G,CAAA;AAAA,oBACA,IAAA,CAAC,SAAI,KAAA,EAAO,EAAE,WAAW,4BAAA,EAA8B,UAAA,EAAY,QAAO,EACxE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,gBAAA,EAAkB,MAAA,EAAQ,CAAA,EAAE,EAAI,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,sBAC/F,IAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,sBAAA,EAAwB,SAAA,EAAW,UAAA,EAAY,MAAA,EAAQ,cAAA,EAAe,EAC3G,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QAAM,OAAA,GAAU,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,GAAK;AAAA,OAAA,EACpC;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,YAAA,CAAa,EAAE,GAAA,EAAK,GAAA,GAAM,IAAI,QAAA,EAAU,UAAA,EAAY,QAAA,EAAU,OAAA,EAAQ,EAAgH;AAC7L,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,cAAc,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,MAAA,EAAQ,aAAA,EAAe,UAAS,EACtH,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,GAAA,EAAU,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,CAAA,EAAG,OAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,SAAQ,EAAG,CAAA;AAAA,oBACvH,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,YAAY,KAAA,EAAO,CAAA,EAAG,UAAA,EAAY,qFAAA,EAAsF,EAAG,CAAA;AAAA,oBACnJ,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,UAAU,UAAA,EAAY,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,WAAU,EAClF,QAAA,EAAA;AAAA,MAAA,QAAA,wBACE,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,QAAA,EAAU,UAAU,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,YAAY,GAAA,EAAK,MAAA,EAAQ,cAAc,aAAA,EAAe,SAAA,IAAc,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,MAE/I,UAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,wBAAA,EAA0B,UAAA,EAAY,GAAA,EAAK,MAAA,EAAQ,aAAA,IAAkB,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,MAE1H,OAAA,IAAW,QAAA,oBACV,GAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,SAAS,KAAA,EAAO,EAAE,OAAA,EAAS,cAAA,EAAgB,UAAA,EAAY,MAAA,EAAQ,OAAO,SAAA,EAAW,OAAA,EAAS,gBAAA,EAAkB,YAAA,EAAc,QAAA,EAAU,UAAA,EAAY,GAAA,EAAK,QAAA,EAAU,UAAA,EAAY,cAAA,EAAgB,MAAA,EAAO,EACxM,QAAA,EAAA,QAAA,EACH;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,QAAA,CAAS,EAAE,QAAA,EAAU,OAAA,EAAS,WAAU,EAAgH;AAC/J,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAQ,4BAAA,EAA8B,YAAA,EAAc,SAAA,EAAW,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,UAAA,EAAY,gBAAe,EAC5I,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,gBAAA,EAAkB,MAAA,EAAQ,YAAA,EAAa,EAAI,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,oBAC7G,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,QAAA,EAAU,GAAA,EAAK,MAAA,EAAQ,QAAA,EAAU,QAAO,EAC3G,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,MAAM,OAAA,CAAQ,IAAA,EAAM,OAAO,EAAE,UAAA,EAAY,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,mBAAmB,YAAA,EAAc,SAAA,EAAW,YAAY,GAAA,EAAK,QAAA,EAAU,YAAY,cAAA,EAAgB,MAAA,EAAO,EACtL,QAAA,EAAA,OAAA,CAAQ,KAAA,EACX,CAAA;AAAA,MACC,SAAA,oBACC,IAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,UAAU,IAAA,EAAM,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,oBAAA,EAAsB,cAAA,EAAgB,QAAO,EACzG,QAAA,EAAA;AAAA,QAAA,SAAA,CAAU,KAAA;AAAA,QAAM;AAAA,OAAA,EACnB;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AAIA,SAAS,YAAA,CAAa,MAA4B,KAAA,EAAiC;AArLnF,EAAA,IAAA,EAAA;AAuLE,EAAA,MAAM,CAAA,GAAA,CAAI,EAAA,GAAA,IAAA,CAAK,KAAA,KAAL,IAAA,GAAA,EAAA,GAAqC,EAAC;AAEhD,EAAA,QAAQ,KAAK,SAAA;AAA4B,IACvC,KAAK,eAAA;AAAmB,MAAA,2BAAQ,aAAA,EAAA,EAAc,QAAA,EAAU,EAAE,QAAA,EAAU,UAAA,EAAY,EAAE,UAAA,EAAY,CAAA;AAAA,IAC9F,KAAK,UAAA;AAAmB,MAAA,2BAAQ,QAAA,EAAA,EAAS,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA;AAAA,IAC7E,KAAK,UAAA;AAAmB,MAAA,2BAAQ,QAAA,EAAA,EAAS,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA;AAAA,IAC7E,KAAK,WAAA;AAAmB,MAAA,uBAAO,GAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,MAAM,CAAA,CAAE,IAAA,EAAM,OAAA,EAAS,CAAA,CAAE,OAAA,EAAS,CAAA;AAAA,IAC1F,KAAK,iBAAA;AAAmB,MAAA,uBAAO,GAAA,CAAC,mBAAgB,KAAA,EAAc,UAAA,EAAY,EAAE,UAAA,EAAY,IAAA,EAAM,EAAE,IAAA,EAAM,CAAA;AAAA,IACtG,KAAK,aAAA;AAAmB,MAAA,uBAAO,GAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,CAAA;AAAA,IAC5D,KAAK,iBAAA;AAAmB,MAAA,uBAAO,GAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA;AAAA,IAChH,KAAK,cAAA;AAAmB,MAAA,2BAAQ,YAAA,EAAA,EAAa,GAAA,EAAK,EAAE,GAAA,EAAK,GAAA,EAAK,EAAE,GAAA,EAAK,QAAA,EAAU,EAAE,QAAA,EAAU,UAAA,EAAY,EAAE,UAAA,EAAY,QAAA,EAAU,EAAE,QAAA,EAAU,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA;AAAA,IAC/J,KAAK,UAAA;AAAmB,MAAA,uBAAO,GAAA,CAAC,QAAA,EAAA,EAAS,QAAA,EAAU,CAAA,CAAE,QAAA,EAAU,SAAS,CAAA,CAAE,OAAA,EAAS,SAAA,EAAW,CAAA,CAAE,SAAA,EAAW,CAAA;AAAA,IAC3G;AAAwB,MAAA,OAAO,IAAA;AAAA;AAEnC;AAIA,SAAS,aAAa,IAAA,EAA6C;AACjE,EAAA,IAAI,IAAA,CAAK,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA;AAC3B,EAAA,OAAO,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,SAA0B,IAAI,MAAA,GAAS,MAAA;AACzE;AAOA,SAAS,YAAY,QAAA,EAA4C;AAC/D,EAAA,MAAM,SAAwB,EAAC;AAC/B,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA;AAC3B,IAAA,IAAI,YAAA,CAAa,GAAG,CAAA,KAAM,MAAA,IAAU,QAAQ,YAAA,CAAa,IAAI,MAAM,MAAA,EAAQ;AACzE,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAC,GAAA,EAAK,IAAI,CAAA,EAAG,CAAA;AAChD,MAAA,CAAA,IAAK,CAAA;AAAA,IACP,CAAA,MAAA,IAAW,YAAA,CAAa,GAAG,CAAA,KAAM,MAAA,EAAQ;AACvC,MAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,KAAK,CAAA;AAC5C,MAAA,CAAA,EAAA;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,KAAK,CAAA;AACvC,MAAA,CAAA,EAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAIA,SAAS,SAAA,CAAU,EAAE,IAAA,EAAM,IAAA,EAAK,EAAmC;AACjE,EAAA,uBACE,IAAA,CAAC,SAAI,KAAA,EAAO,EAAE,UAAU,UAAA,EAAY,GAAA,EAAK,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,IAAI,OAAA,EAAS,MAAA,EAAQ,YAAY,QAAA,EAAU,GAAA,EAAK,YAAY,aAAA,EAAe,MAAA,EAAQ,UAAA,EAAY,MAAA,EAAO,EAC/K,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAK,KAAA,EAAO,EAAE,UAAU,UAAA,EAAY,UAAA,EAAY,aAAa,UAAA,EAAY,sBAAA,EAAwB,KAAA,EAAO,MAAA,EAAQ,SAAS,mBAAA,EAAqB,YAAA,EAAc,WAAW,UAAA,EAAY,CAAA,IAAM,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,oBAC/L,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,UAAA,EAAY,WAAA,EAAa,KAAA,EAAO,SAAA,EAAW,UAAA,EAAY,CAAA,IAAM,QAAA,EAAA,IAAA,EAAK;AAAA,GAAA,EACzG,CAAA;AAEJ;AAYA,IAAM,UAAA,GAAa,8HAAA;AAEZ,SAAS,kBAAkB,EAAE,QAAA,EAAU,KAAA,EAAO,IAAA,GAAO,OAAM,EAA2B;AAC3F,EAAA,MAAM,MAAA,GAAS,YAAY,QAAQ,CAAA;AAEnC,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,SAAA,EAAU,EACrE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,OAAA,EAAA,EAAM,uBAAA,EAAyB,EAAE,MAAA,EAAQ,YAAW,EAAG,CAAA;AAAA,IACvD,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,KAAM;AACxB,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,uBACE,IAAA,CAAC,SAAY,KAAA,EAAO,IAAA,GAAO,EAAE,QAAA,EAAU,UAAA,KAAe,MAAA,EACnD,QAAA,EAAA;AAAA,UAAA,IAAA,wBAAS,SAAA,EAAA,EAAU,IAAA,EAAM,MAAM,IAAA,CAAK,SAAA,EAAW,MAAK,MAAA,EAAO,CAAA;AAAA,UAC3D,YAAA,CAAa,KAAA,CAAM,IAAA,EAAM,KAAK;AAAA,SAAA,EAAA,EAFvB,CAGV,CAAA;AAAA,MAEJ;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EACrB,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,SAAI,KAAA,EAAO,IAAA,GAAO,EAAE,QAAA,EAAU,UAAA,KAAe,MAAA,EAC3C,QAAA,EAAA;AAAA,YAAA,IAAA,oBAAQ,GAAA,CAAC,aAAU,IAAA,EAAM,KAAA,CAAM,MAAM,CAAC,CAAA,CAAE,SAAA,EAAW,IAAA,EAAK,MAAA,EAAO,CAAA;AAAA,YAC/D,YAAA,CAAa,KAAA,CAAM,KAAA,CAAM,CAAC,GAAG,KAAK;AAAA,WAAA,EACrC,CAAA;AAAA,0BACA,IAAA,CAAC,SAAI,KAAA,EAAO,IAAA,GAAO,EAAE,QAAA,EAAU,UAAA,KAAe,MAAA,EAC3C,QAAA,EAAA;AAAA,YAAA,IAAA,oBAAQ,GAAA,CAAC,aAAU,IAAA,EAAM,KAAA,CAAM,MAAM,CAAC,CAAA,CAAE,SAAA,EAAW,IAAA,EAAK,MAAA,EAAO,CAAA;AAAA,YAC/D,YAAA,CAAa,KAAA,CAAM,KAAA,CAAM,CAAC,GAAG,KAAK;AAAA,WAAA,EACrC;AAAA,SAAA,EAAA,EARQ,CASV,CAAA;AAAA,MAEJ;AACA,MAAA,uBACE,IAAA,CAAC,SAAY,KAAA,EAAO,IAAA,GAAO,EAAE,QAAA,EAAU,UAAA,KAAe,MAAA,EACnD,QAAA,EAAA;AAAA,QAAA,IAAA,wBAAS,SAAA,EAAA,EAAU,IAAA,EAAM,MAAM,IAAA,CAAK,SAAA,EAAW,MAAK,MAAA,EAAO,CAAA;AAAA,QAC3D,YAAA,CAAa,KAAA,CAAM,IAAA,EAAM,KAAK;AAAA,OAAA,EAAA,EAFvB,CAGV,CAAA;AAAA,IAEJ,CAAC;AAAA,GAAA,EACH,CAAA;AAEJ;AC1RA,IAAM,UAAA,GAAa,CAAA,ooCAAA,CAAA;AAGnB,SAAS,YAAA,CAAa,UAAkB,OAAA,EAAyB;AAC/D,EAAA,MAAM,KAAA,GAAkB,CAAC,QAAQ,CAAA;AACjC,EAAA,MAAM,WAAW,QAAA,CAAS,QAAA;AAC1B,EAAA,IAAI,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAE,CAAA;AACpD,EAAA,MAAM,CAAA,GAAI,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AACpD,EAAA,MAAM,MAAA,GAAW,CAAA,CAAE,GAAA,CAAI,YAAY,CAAA;AACnC,EAAA,MAAM,MAAA,GAAW,CAAA,CAAE,GAAA,CAAI,YAAY,CAAA;AACnC,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,GAAA,CAAI,cAAc,CAAA;AACrC,EAAA,MAAM,IAAA,GAAW,CAAA,CAAE,GAAA,CAAI,UAAU,CAAA;AACjC,EAAA,IAAI,MAAA,EAAU,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,MAAM,CAAA,CAAE,CAAA;AAC5C,EAAA,IAAI,MAAA,EAAU,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,MAAM,CAAA,CAAE,CAAA;AAC5C,EAAA,IAAI,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,QAAQ,CAAA,CAAE,CAAA;AAChD,EAAA,IAAI,IAAA,EAAU,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,IAAI,CAAA,CAAE,CAAA;AAC/C,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,OAAA,CAAQ,CAAA,iBAAA,EAAoB,OAAO,CAAA,CAAE,CAAA;AAClE,IAAA,IAAI,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,OAAO,CAAA,CAAE,CAAA;AAAA,EAC1D,CAAA,CAAA,OAAQ,CAAA,EAAA;AAAA,EAAyB;AACjC,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AACxC;AAEA,SAAS,OAAA,GAAU;AACjB,EAAA,uBACEA,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,SAAA,EAAU,EACrE,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAQ,SAAA,EAAW,UAAA,EAAY,oBAAA,EAAsB,YAAA,EAAc,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,sCAAqC,EAAG,CAAA;AAAA,oBAC5JA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,UAAA,EAAY,oBAAA,EAAsB,cAAc,QAAA,EAAU,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAW,sCAAqC,EAAG,CAAA;AAAA,oBAC9JA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,UAAA,EAAY,oBAAA,EAAsB,cAAc,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,sCAAqC,EAAG,CAAA;AAAA,oBAC7JA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,UAAA,EAAY,oBAAA,EAAsB,cAAc,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,sCAAqC,EAAG;AAAA,GAAA,EAC/J,CAAA;AAEJ;AAeO,SAAS,mBAAA,CAAoB;AAAA,EAClC,OAAA;AAAA,EACA,OAAA,GAAU,qBAAA;AAAA,EACV,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,IAAI,QAAA,CAA4B,eAAA,IAAA,IAAA,GAAA,eAAA,GAAmB,EAAE,CAAA;AACjF,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,QAAA,CAAS,CAAC,eAAe,CAAA;AACvD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAA6B,MAAS,CAAA;AACpE,EAAA,MAAM,QAAA,GAAW,OAAsB,IAAI,CAAA;AAC3C,EAAA,MAAM,kBAAA,GAAqB,OAAO,KAAK,CAAA;AAEvC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,eAAe,IAAA,GAAO;AA5E1B,MAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA6EM,MAAA,IAAI;AACF,QAAA,MAAM,CAAA,GAAI,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AACpD,QAAA,MAAM,SAAA,GAAY,CAAC,YAAA,EAAc,YAAA,EAAc,gBAAgB,UAAU,CAAA,CACtE,IAAI,CAAA,CAAA,KAAE;AAhFjB,UAAA,IAAAC,GAAAA;AAgFoB,UAAA,OAAA,CAAAA,MAAA,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAP,OAAAA,GAAAA,GAAY,EAAA;AAAA,QAAA,CAAE,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACpD,QAAA,MAAM,WAAW,CAAA,gBAAA,EAAmB,OAAO,GAAG,SAAA,GAAY,GAAA,GAAM,YAAY,EAAE,CAAA,CAAA;AAC9E,QAAA,IAAI,KAAA,GAAQ,cAAA,CAAe,OAAA,CAAQ,QAAQ,CAAA;AAE3C,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,MAAM,UAAU,YAAA,CAAa,QAAA,IAAA,IAAA,GAAA,QAAA,GAAY,YAAY,QAAA,CAAS,KAAK,IAAI,OAAO,CAAA;AAC9E,UAAA,MAAMC,OAAM,MAAM,KAAA,CAAM,GAAG,OAAO,CAAA,aAAA,EAAgB,OAAO,CAAA,CAAA,EAAI;AAAA,YAC3D,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,YAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,SAAS;AAAA,WACjC,CAAA;AACD,UAAA,IAAI,CAACA,IAAAA,CAAI,EAAA,IAAM,SAAA,EAAW;AAAE,YAAA,UAAA,CAAW,KAAK,CAAA;AAAG,YAAA;AAAA,UAAQ;AACvD,UAAA,MAAM,IAAA,GAAO,MAAMA,IAAAA,CAAI,IAAA,EAAK;AAC5B,UAAA,KAAA,GAAA,CAAQ,EAAA,GAAA,IAAA,CAAK,UAAL,IAAA,GAAA,EAAA,GAAoC,IAAA;AAC5C,UAAA,IAAI,KAAA,EAAO,cAAA,CAAe,OAAA,CAAQ,QAAA,EAAU,KAAK,CAAA;AACjD,UAAA,IAAI,IAAA,CAAK,OAAA,EAAS,UAAA,CAAW,IAAA,CAAK,OAAiB,CAAA;AAAA,QACrD;AAEA,QAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AAAE,UAAA,UAAA,CAAW,KAAK,CAAA;AAAG,UAAA;AAAA,QAAQ;AAEtD,QAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AACnB,QAAA,IAAI,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,wBAAA,CAAA,EAA4B;AAAA,UAC1D,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,UAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,SAAS;AAAA,SACxC,CAAA;AAED,QAAA,IAAI,GAAA,CAAI,MAAA,KAAW,GAAA,IAAO,CAAC,SAAA,EAAW;AACpC,UAAA,cAAA,CAAe,WAAW,QAAQ,CAAA;AAClC,UAAA,MAAM,UAAU,YAAA,CAAa,QAAA,IAAA,IAAA,GAAA,QAAA,GAAY,YAAY,QAAA,CAAS,KAAK,IAAI,OAAO,CAAA;AAC9E,UAAA,MAAM,OAAO,MAAM,KAAA,CAAM,GAAG,OAAO,CAAA,aAAA,EAAgB,OAAO,CAAA,CAAA,EAAI;AAAA,YAC5D,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,YAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,SAAS;AAAA,WACjC,CAAA;AACD,UAAA,IAAI,CAAC,IAAA,CAAK,EAAA,IAAM,SAAA,EAAW;AAAE,YAAA,UAAA,CAAW,KAAK,CAAA;AAAG,YAAA;AAAA,UAAQ;AACxD,UAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,EAAK;AAC9B,UAAA,KAAA,GAAA,CAAQ,EAAA,GAAA,KAAA,CAAM,UAAN,IAAA,GAAA,EAAA,GAAqC,IAAA;AAC7C,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,cAAA,CAAe,OAAA,CAAQ,UAAU,KAAK,CAAA;AACtC,YAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAAA,UACrB;AACA,UAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AAAE,YAAA,UAAA,CAAW,KAAK,CAAA;AAAG,YAAA;AAAA,UAAQ;AACtD,UAAA,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,wBAAA,CAAA,EAA4B;AAAA,YACtD,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,YAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,SAAS;AAAA,WACxC,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,CAAC,GAAA,CAAI,EAAA,IAAM,SAAA,EAAW;AAAE,UAAA,UAAA,CAAW,KAAK,CAAA;AAAG,UAAA;AAAA,QAAQ;AAEvD,QAAA,MAAM,eAAc,EAAA,GAAA,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,cAAc,MAA9B,IAAA,GAAA,EAAA,GAAmC,EAAA;AAEvD,QAAA,IAAI,WAAA,CAAY,QAAA,CAAS,mBAAmB,CAAA,EAAG;AAG7C,UAAA,MAAM,MAAA,GAAS,GAAA,CAAI,IAAA,CAAM,SAAA,EAAU;AACnC,UAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,UAAA,IAAI,GAAA,GAAM,EAAA;AACV,UAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,UAAA,IAAI;AACF,YAAA,OAAO,CAAC,SAAA,EAAW;AACjB,cAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,cAAA,IAAI,QAAQ,SAAA,EAAW;AACvB,cAAA,GAAA,IAAO,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAC7C,cAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC5B,cAAA,GAAA,GAAA,CAAM,EAAA,GAAA,KAAA,CAAM,GAAA,EAAI,KAAV,IAAA,GAAA,EAAA,GAAe,EAAA;AACrB,cAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,gBAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAChC,gBAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AACnC,gBAAA,IAAI,YAAY,QAAA,EAAU;AAC1B,gBAAA,IAAI;AACF,kBAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC/B,kBAAA,IAAI,CAAC,cAAA,EAAgB;AAAE,oBAAA,UAAA,CAAW,KAAK,CAAA;AAAG,oBAAA,cAAA,GAAiB,IAAA;AAAA,kBAAM;AACjE,kBAAA,WAAA,CAAY,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,gBACrC,CAAA,CAAA,OAAQ,CAAA,EAAA;AAAA,gBAA+B;AAAA,cACzC;AAAA,YACF;AAAA,UACF,CAAA,SAAE;AACA,YAAA,MAAA,CAAO,MAAA,EAAO,CAAE,KAAA,CAAM,MAAM;AAAA,YAAC,CAAC,CAAA;AAAA,UAChC;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAK5B,UAAA,IAAI,SAAA,EAAW;AAEf,UAAA,MAAM,cAAA,GAAA,CAAiB,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,MAAA,KAAL,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,gBAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA0B,QAAA;AACjD,UAAA,MAAM,WAAA,GAAA,CAAiB,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,MAAA,KAAL,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,gBAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA0B,KAAA;AACjD,UAAA,MAAM,aACJ,aAAA,IACA,cAAA,KAAmB,aAAA,CAAc,QAAA,IACjC,gBAAmB,aAAA,CAAc,KAAA;AAEnC,UAAA,IAAI,CAAC,UAAA,IAAc,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC3E,YAAA,WAAA,CAAY,KAAK,QAA6B,CAAA;AAAA,UAChD;AAAA,QACF;AAAA,MACF,CAAA,CAAA,OAAQ,CAAA,EAAA;AAAA,MAER,CAAA,SAAE;AACA,QAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA,MAClC;AAAA,IACF;AAEA,IAAA,IAAA,EAAK;AACL,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAM,CAAA;AAAA,EACnC,GAAG,CAAC,OAAA,EAAS,SAAS,QAAA,EAAU,eAAA,EAAiB,aAAa,CAAC,CAAA;AAE/D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,CAAS,MAAA,IAAU,kBAAA,CAAmB,OAAA,EAAS;AACpD,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,GAAA,GAAM,OAAO,QAAA,CAAS,IAAA;AAC5B,IAAA,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,qBAAA,CAAA,EAAyB;AAAA,MACvC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,KAAK;AAAA,KACtC,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,IAAA,EAAwC,CAAA,CAAE,IAAA,CAAK,CAAA,IAAA,KAAQ;AA1M1E,MAAA,IAAA,EAAA,EAAA,EAAA;AA2MM,MAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,MAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAC7B,MAAA,IAAI,SAAA,GAA2B,IAAA;AAC/B,MAAA,IAAI,eAA8B,IAAA,CAAK,eAAA;AACvC,MAAA,IAAI,KAAK,aAAA,EAAe;AACtB,QAAA,IAAI;AACF,UAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,IAAA,CAAK,aAAa,CAAA;AACpD,UAAA,IAAI,EAAA,EAAI;AACN,YAAA,MAAM,GAAA,GAAM,UAAA,CAAA,CAAA,CAAY,EAAA,GAAA,EAAA,CAAG,WAAA,KAAH,IAAA,GAAA,EAAA,GAAkB,EAAA,EAAI,IAAA,EAAK,CAAE,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAC,CAAA;AAC5E,YAAA,IAAI,CAAC,KAAA,CAAM,GAAG,CAAA,EAAG,SAAA,GAAY,GAAA;AAAA,UAC/B;AAAA,QACF,CAAA,CAAA,OAAQ,CAAA,EAAA;AAAA,QAAa;AAAA,MACvB;AACA,MAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,QAAA,IAAI;AACF,UAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,IAAA,CAAK,gBAAgB,CAAA;AACvD,UAAA,IAAI,IAAI,YAAA,GAAA,CAAA,CAAgB,EAAA,GAAA,EAAA,CAAG,gBAAH,IAAA,GAAA,EAAA,GAAkB,EAAA,EAAI,MAAK,IAAK,YAAA;AAAA,QAC1D,CAAA,CAAA,OAAQ,CAAA,EAAA;AAAA,QAAa;AAAA,MACvB;AACA,MAAA,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,eAAA,CAAA,EAAmB;AAAA,QACjC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,KAAA;AAAA,UACA,OAAA;AAAA,UACA,GAAA;AAAA,UACA,GAAI,KAAK,QAAA,GAAW,EAAE,UAAU,IAAA,CAAK,QAAA,KAAa,EAAC;AAAA,UACnD,GAAI,SAAA,KAAc,IAAA,GAAO,EAAE,SAAA,EAAW,YAAA,KAAiB;AAAC,SACzD;AAAA,OACF,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IACnB,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAC,CAAA;AAE/B,EAAA,IAAI,CAAC,OAAA,IAAW,QAAA,CAAS,MAAA,KAAW,GAAG,OAAO,IAAA;AAE9C,EAAA,uBACEH,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAC,IAAC,OAAA,EAAA,EAAM,uBAAA,EAAyB,EAAE,MAAA,EAAQ,YAAW,EAAG,CAAA;AAAA,oBACxDA,GAAAA,CAAC,OAAA,EAAA,EAAM,yBAAyB,EAAE,MAAA,EAAQ,2DAA0D,EAAG,CAAA;AAAA,oBACvGA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OACxB,QAAA,EAAA,OAAA,IAAW,QAAA,CAAS,WAAW,CAAA,mBAC5BA,IAAC,OAAA,EAAA,EAAQ,CAAA,mBACTA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,UAAoB,KAAA,EAAO,KAAA,IAAA,IAAA,GAAA,KAAA,GAAS,SAAS,CAAA,EACtE;AAAA,GAAA,EACF,CAAA;AAEJ","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"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/ComponentRenderer.tsx","../src/PersonalisedSection.tsx"],"names":["jsxs","jsx","_a","res"],"mappings":"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","file":"index.js","sourcesContent":["export type ComponentName =\n | 'HeroStatement'\n | 'AtomCard'\n | 'StatGrid'\n | 'CodeBlock'\n | 'ComparisonTable'\n | 'FeatureList'\n | 'TestimonialCard'\n | 'ImageCtaHero'\n | 'CtaStrip';\n\nexport type AssemblyZone = 'hero' | 'body' | 'proof' | 'cta';\n\nconst COMPONENT_ZONES: Record<ComponentName, AssemblyZone> = {\n HeroStatement: 'hero',\n ImageCtaHero: 'hero',\n AtomCard: 'body',\n StatGrid: 'body',\n CodeBlock: 'body',\n ComparisonTable: 'body',\n FeatureList: 'body',\n TestimonialCard: 'proof',\n CtaStrip: 'cta',\n};\n\nexport type ComponentAssembly = Array<{\n component: ComponentName;\n slots?: Record<string, unknown>;\n size?: 'full' | 'half';\n zone?: AssemblyZone;\n}>;\n\nexport function filterAssemblyByZone(assembly: ComponentAssembly, zone: AssemblyZone): ComponentAssembly {\n return assembly.filter(item => {\n const effectiveZone = item.zone ?? COMPONENT_ZONES[item.component];\n return effectiveZone === zone;\n });\n}\n","'use client';\n\nimport { marked } from 'marked';\nimport { filterAssemblyByZone } from './types';\nimport type { ComponentAssembly, ComponentName, AssemblyZone } 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: '24px', paddingBottom: '24px' }}>\n <h2 style={{ fontSize: '32px', fontWeight: 700, letterSpacing: '-0.025em', lineHeight: 1.2, color: 'var(--sp-text)', margin: '0 0 12px' }}>\n {headline}\n </h2>\n {subheading && (\n <p style={{ fontSize: '18px', color: 'var(--sp-text-sub)', lineHeight: 1.6, maxWidth: '672px', margin: 0 }}>{subheading}</p>\n )}\n </div>\n );\n}\n\nfunction AtomCard({ title, content }: { title?: string; content?: string }) {\n return (\n <div style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '12px', padding: '24px', height: '100%' }}>\n {title && <h3 style={{ fontSize: '16px', fontWeight: 600, color: 'var(--sp-text)', margin: '0 0 12px' }}>{title}</h3>}\n {content && (\n <div\n className=\"sp-prose\"\n style={{ fontSize: '15px', 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: '12px' }}>\n {stats.map(({ value, label }) => (\n <div key={label} style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '10px', padding: '16px 20px', display: 'flex', flexDirection: 'column', justifyContent: 'space-between', minHeight: '88px' }}>\n <p style={{ fontSize: '11px', color: 'var(--sp-text-muted)', textTransform: 'uppercase', letterSpacing: '0.06em', margin: '0 0 12px', lineHeight: 1.3 }}>{label}</p>\n <p style={{ fontSize: '20px', fontWeight: 500, color: 'var(--sp-text)', fontVariantNumeric: 'tabular-nums', lineHeight: 1, margin: 0 }}>{value}</p>\n </div>\n ))}\n </div>\n {caption && (\n <p style={{ fontSize: '13px', color: 'var(--sp-text-muted)', margin: '12px 0 0' }}>{caption}</p>\n )}\n </div>\n );\n}\n\nfunction CodeBlock({ code, lang = 'typescript', caption }: { code: string; lang?: string; caption?: string }) {\n return (\n <div style={{ borderRadius: '12px', overflow: 'hidden', border: '1px solid var(--sp-border)' }}>\n <div style={{ background: 'var(--sp-bg)', padding: '10px 16px', display: 'flex', alignItems: 'center', justifyContent: 'space-between', borderBottom: '1px solid var(--sp-border)' }}>\n <span style={{ fontSize: '12px', color: 'var(--sp-text-muted)', fontFamily: 'monospace' }}>{lang}</span>\n {caption && <span style={{ fontSize: '12px', color: 'var(--sp-text-muted)' }}>{caption}</span>}\n </div>\n <pre style={{ background: 'var(--sp-surface)', padding: '20px', fontSize: '13px', color: 'var(--sp-text-sub)', overflowX: 'auto', lineHeight: 1.6, fontFamily: 'monospace', whiteSpace: 'pre', margin: 0 }}>\n {code}\n </pre>\n </div>\n );\n}\n\nfunction ComparisonTable({ brand = 'Us', competitor, rows = [] }: { brand?: string; competitor: string; rows?: { label: string; spectare: string; them: string }[] }) {\n return (\n <div style={{ border: '1px solid var(--sp-border)', borderRadius: '12px', overflow: 'hidden' }}>\n <div style={{ overflowX: 'auto' }}>\n <table style={{ width: '100%', fontSize: '14px', borderCollapse: 'collapse' }}>\n <thead>\n <tr style={{ borderBottom: '1px solid var(--sp-border)', background: 'var(--sp-bg)' }}>\n <th style={{ textAlign: 'left', padding: '12px 16px', color: 'var(--sp-text-muted)', fontWeight: 500, fontSize: '12px', width: '33%' }} />\n <th style={{ textAlign: 'left', padding: '12px 16px', fontWeight: 600, color: 'var(--sp-accent)', fontSize: '12px' }}>{brand}</th>\n <th style={{ textAlign: 'left', padding: '12px 16px', color: 'var(--sp-text-muted)', fontWeight: 500, fontSize: '12px' }}>{competitor}</th>\n </tr>\n </thead>\n <tbody>\n {rows.map(({ label, spectare, them }) => (\n <tr key={label} style={{ borderBottom: '1px solid var(--sp-border)' }}>\n <td style={{ padding: '12px 16px', fontSize: '13px', color: 'var(--sp-text-muted)', fontWeight: 500 }}>{label}</td>\n <td style={{ padding: '12px 16px', fontSize: '13px', color: 'var(--sp-positive)', fontWeight: 500 }}>{spectare}</td>\n <td style={{ padding: '12px 16px', fontSize: '13px', color: 'var(--sp-text-muted)' }}>{them}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\nfunction FeatureList({ items = [] }: { items?: { text: string; sub?: string }[] }) {\n return (\n <div style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '12px', padding: '24px' }}>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0, display: 'flex', flexDirection: 'column', gap: '16px' }}>\n {items.map(({ text, sub }) => (\n <li key={text} style={{ display: 'flex', gap: '12px' }}>\n <span style={{ color: 'var(--sp-accent)', flexShrink: 0, fontSize: '15px', marginTop: '2px' }}>✓</span>\n <div>\n <p style={{ fontSize: '15px', fontWeight: 500, color: 'var(--sp-text)', lineHeight: 1.4, margin: 0 }}>{text}</p>\n {sub && <p style={{ fontSize: '13px', color: 'var(--sp-text-muted)', lineHeight: 1.5, margin: '4px 0 0' }}>{sub}</p>}\n </div>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\nfunction TestimonialCard({ quote, name, role, company }: { quote: string; name: string; role: string; company?: string }) {\n return (\n <div style={{ background: 'var(--sp-bg)', border: '1px solid var(--sp-border)', borderRadius: '12px', padding: '24px', display: 'flex', flexDirection: 'column', gap: '20px', height: '100%' }}>\n <p style={{ fontSize: '15px', color: 'var(--sp-text-sub)', lineHeight: 1.6, flex: 1, margin: 0 }}>\n <span style={{ color: 'var(--sp-text-dim)', fontSize: '18px', lineHeight: 1, marginRight: '4px' }}>\"</span>\n {quote}\n <span style={{ color: 'var(--sp-text-dim)', fontSize: '18px', lineHeight: 1, marginLeft: '4px' }}>\"</span>\n </p>\n <div style={{ borderTop: '1px solid var(--sp-border)', paddingTop: '16px' }}>\n <p style={{ fontSize: '14px', fontWeight: 600, color: 'var(--sp-text)', margin: 0 }}>{name}</p>\n <p style={{ fontSize: '13px', color: 'var(--sp-text-muted)', margin: '2px 0 0' }}>\n {role}{company ? `, ${company}` : ''}\n </p>\n </div>\n </div>\n );\n}\n\nfunction ImageCtaHero({ src, alt = '', headline, subheading, ctaLabel, ctaHref }: { src?: string; alt?: string; headline?: string; subheading?: string; ctaLabel?: string; ctaHref?: string }) {\n if (!src) return null;\n return (\n <div style={{ borderRadius: '12px', overflow: 'hidden', position: 'relative', width: '100%', paddingBottom: '56.25%' }}>\n <img src={src} alt={alt} style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', objectFit: 'cover' }} />\n <div style={{ position: 'absolute', inset: 0, background: '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: '28px' }}>\n {headline && (\n <h2 style={{ fontSize: '24px', fontWeight: 700, color: '#fff', lineHeight: 1.2, margin: '0 0 8px', letterSpacing: '-0.02em' }}>{headline}</h2>\n )}\n {subheading && (\n <p style={{ fontSize: '15px', color: 'rgba(255,255,255,0.75)', lineHeight: 1.5, margin: '0 0 20px' }}>{subheading}</p>\n )}\n {ctaHref && ctaLabel && (\n <a href={ctaHref} style={{ display: 'inline-block', background: '#fff', color: '#09090b', padding: '8px 20px', borderRadius: '8px', fontWeight: 600, fontSize: '14px', textDecoration: 'none' }}>\n {ctaLabel}\n </a>\n )}\n </div>\n </div>\n );\n}\n\nfunction CtaStrip({ headline, primary, secondary }: { headline: string; primary: { label: string; href: string }; secondary?: { label: string; href: string } }) {\n return (\n <div style={{ border: '1px solid var(--sp-border)', borderRadius: '12px', padding: '32px', textAlign: 'center', background: 'var(--sp-bg)' }}>\n <h3 style={{ fontSize: '24px', fontWeight: 700, color: 'var(--sp-text)', margin: '0 0 24px' }}>{headline}</h3>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '16px', flexWrap: 'wrap' }}>\n <a href={primary.href} style={{ background: '#fff', color: '#09090b', padding: '10px 24px', borderRadius: '12px', fontWeight: 600, fontSize: '15px', textDecoration: 'none' }}>\n {primary.label}\n </a>\n {secondary && (\n <a href={secondary.href} style={{ fontSize: '15px', color: 'var(--sp-text-sub)', textDecoration: 'none' }}>\n {secondary.label} →\n </a>\n )}\n </div>\n </div>\n );\n}\n\n// ── Dispatch ──────────────────────────────────────────────────────────────────\n\nfunction renderSingle(item: ComponentAssembly[0], brand?: string): React.ReactNode {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const s = item.slots as Record<string, any> ?? {};\n\n switch (item.component as ComponentName) {\n case 'HeroStatement': return <HeroStatement headline={s.headline} subheading={s.subheading} />;\n case 'AtomCard': return <AtomCard title={s.title} content={s.content} />;\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: '8px', left: '8px', zIndex: 10, display: 'flex', alignItems: 'center', gap: '6px', pointerEvents: 'none', userSelect: 'none' }}>\n <span style={{ fontSize: '10px', fontFamily: 'monospace', background: 'rgba(59,130,246,0.9)', color: '#fff', padding: '2px 6px', borderRadius: '4px', lineHeight: 1 }}>{name}</span>\n <span style={{ fontSize: '10px', fontFamily: 'monospace', color: '#71717a', lineHeight: 1 }}>{size}</span>\n </div>\n );\n}\n\n// ── Main export ───────────────────────────────────────────────────────────────\n\nexport interface ComponentRendererProps {\n assembly: ComponentAssembly;\n /** Your brand name, used as the left column header in ComparisonTable. Defaults to \"Us\". */\n brand?: string;\n /** Overlay a component name badge on each item. Useful for demos and debugging. */\n xray?: boolean;\n /** Render only components assigned to this zone. */\n zone?: AssemblyZone;\n}\n\nconst PAIR_STYLE = '.sp-pair{display:grid;grid-template-columns:1fr 1fr;gap:20px}@media(max-width:640px){.sp-pair{grid-template-columns:1fr}}';\n\nexport function ComponentRenderer({ assembly, brand, xray = false, zone }: ComponentRendererProps) {\n const filtered = zone ? filterAssemblyByZone(assembly, zone) : assembly;\n const layout = buildLayout(filtered);\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '20px', fontSize: '16px' }}>\n <style dangerouslySetInnerHTML={{ __html: PAIR_STYLE }} />\n {layout.map((group, i) => {\n if (group.type === 'full') {\n return (\n <div key={i} style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.item.component} size=\"full\" />}\n {renderSingle(group.item, brand)}\n </div>\n );\n }\n if (group.type === 'pair') {\n return (\n <div key={i} className=\"sp-pair\">\n <div style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.items[0].component} size=\"half\" />}\n {renderSingle(group.items[0], brand)}\n </div>\n <div style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.items[1].component} size=\"half\" />}\n {renderSingle(group.items[1], brand)}\n </div>\n </div>\n );\n }\n return (\n <div key={i} style={xray ? { position: 'relative' } : undefined}>\n {xray && <XrayBadge name={group.item.component} size=\"full\" />}\n {renderSingle(group.item, brand)}\n </div>\n );\n })}\n </div>\n );\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { ComponentRenderer } from './ComponentRenderer';\nimport { filterAssemblyByZone } from './types';\nimport type { ComponentAssembly, AssemblyZone } from './types';\n\ntype ConversionCheckResult =\n | { matched: false }\n | { matched: true; goalName: string | null; goalType: string; valueSelector: string | null; currencySelector: string | null; defaultCurrency: string };\n\nconst CSS_TOKENS = `:root{--sp-accent:#60a5fa;--sp-accent-bg:rgba(96,165,250,0.1);--sp-accent-border:rgba(96,165,250,0.2);--sp-bg:#18181b;--sp-surface:#09090b;--sp-border:#27272a;--sp-text:#f4f4f5;--sp-text-sub:#d4d4d8;--sp-text-strong:#e4e4e7;--sp-text-muted:#71717a;--sp-text-dim:#52525b;--sp-text-body:#a1a1aa;--sp-positive:#6ee7b7;--sp-divider:rgba(255,255,255,0.06);--sp-code-bg:rgba(255,255,255,0.07);--sp-code-border:rgba(255,255,255,0.08);--sp-pre-bg:rgba(0,0,0,0.4)}.sp-prose p{margin-bottom:.625rem}.sp-prose p:last-child{margin-bottom:0}.sp-prose ul{list-style:disc;padding-left:1.25rem;margin-bottom:.625rem}.sp-prose ol{list-style:decimal;padding-left:1.25rem;margin-bottom:.625rem}.sp-prose li{margin-bottom:.25rem}.sp-prose strong{color:var(--sp-text-strong);font-weight:600}.sp-prose h2,.sp-prose h3{color:var(--sp-text);font-weight:600;margin:.875rem 0 .375rem;font-size:1rem}.sp-prose code{background:var(--sp-code-bg);border:1px solid var(--sp-code-border);padding:.1rem .35rem;border-radius:.25rem;font-size:.82em;color:var(--sp-text)}.sp-prose blockquote{border-left:3px solid var(--sp-border);padding-left:1rem;color:var(--sp-text-muted);margin:.75rem 0}`;\n\n\nfunction buildSummary(pageHint: string, orgSlug: string): string {\n const parts: string[] = [pageHint];\n const referrer = document.referrer;\n if (referrer) parts.push(`Arrived from: ${referrer}`);\n const p = new URLSearchParams(window.location.search);\n const source = p.get('utm_source');\n const medium = p.get('utm_medium');\n const campaign = p.get('utm_campaign');\n const term = p.get('utm_term');\n if (source) parts.push(`Source: ${source}`);\n if (medium) parts.push(`Medium: ${medium}`);\n if (campaign) parts.push(`Campaign: ${campaign}`);\n if (term) parts.push(`Search term: ${term}`);\n try {\n const history = localStorage.getItem(`_spectare_visits_${orgSlug}`);\n if (history) parts.push(`Previously visited: ${history}`);\n } catch { /* private browsing */ }\n return parts.filter(Boolean).join('. ');\n}\n\nfunction Shimmer() {\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>\n <div style={{ height: '20px', background: 'rgba(39,39,42,0.6)', borderRadius: '8px', width: '75%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '14px', background: 'rgba(39,39,42,0.4)', borderRadius: '8px', width: '100%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '14px', background: 'rgba(39,39,42,0.4)', borderRadius: '8px', width: '83%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n <div style={{ height: '14px', background: 'rgba(39,39,42,0.4)', borderRadius: '8px', width: '67%', animation: 'sp-pulse 1.5s ease-in-out infinite' }} />\n </div>\n );\n}\n\nexport interface PersonalisedSectionProps {\n orgSlug: string;\n /** Base URL of your Spectare instance. Defaults to 'https://spectare.ai'. */\n baseUrl?: string;\n /** Your brand name, used in ComparisonTable column header. */\n brand?: string;\n pageHint?: string;\n className?: string;\n style?: React.CSSProperties;\n initialAssembly?: ComponentAssembly;\n initialIntent?: { audience: string; stage: string };\n /** Render only components assigned to this zone. */\n zone?: AssemblyZone;\n}\n\nexport function PersonalisedSection({\n orgSlug,\n baseUrl = 'https://spectare.ai',\n brand,\n pageHint,\n className,\n style,\n initialAssembly,\n initialIntent,\n zone,\n}: PersonalisedSectionProps) {\n const [assembly, setAssembly] = useState<ComponentAssembly>(initialAssembly ?? []);\n const [loading, setLoading] = useState(!initialAssembly);\n const [orgName, setOrgName] = useState<string | undefined>(undefined);\n const tokenRef = useRef<string | null>(null);\n const conversionFiredRef = useRef(false);\n\n useEffect(() => {\n let cancelled = false;\n\n async function load() {\n try {\n const p = new URLSearchParams(window.location.search);\n const utmSuffix = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term']\n .map(k => p.get(k) ?? '').filter(Boolean).join('_');\n const tokenKey = `_spectare_token_${orgSlug}${utmSuffix ? '_' + utmSuffix : ''}`;\n let token = sessionStorage.getItem(tokenKey);\n\n if (!token) {\n const summary = buildSummary(pageHint ?? `Visiting ${document.title}`, orgSlug);\n const res = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!res.ok || cancelled) { setLoading(false); return; }\n const data = await res.json();\n token = data.token as string | undefined ?? null;\n if (token) sessionStorage.setItem(tokenKey, token);\n if (data.orgName) setOrgName(data.orgName as string);\n }\n\n if (!token || cancelled) { setLoading(false); return; }\n\n tokenRef.current = token;\n let res = await fetch(`${baseUrl}/api/assemble/components`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token, orgSlug }),\n });\n\n if (res.status === 401 && !cancelled) {\n sessionStorage.removeItem(tokenKey);\n const summary = buildSummary(pageHint ?? `Visiting ${document.title}`, orgSlug);\n const qRes = await fetch(`${baseUrl}/api/qualify/${orgSlug}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ summary }),\n });\n if (!qRes.ok || cancelled) { setLoading(false); return; }\n const qData = await qRes.json();\n token = qData.token as string | undefined ?? null;\n if (token) {\n sessionStorage.setItem(tokenKey, token);\n tokenRef.current = token;\n }\n if (!token || cancelled) { setLoading(false); return; }\n res = await fetch(`${baseUrl}/api/assemble/components`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token, orgSlug }),\n });\n }\n\n if (!res.ok || cancelled) { setLoading(false); return; }\n\n const contentType = res.headers.get('content-type') ?? '';\n\n if (contentType.includes('text/event-stream')) {\n // Cold path: stream components as Claude generates them.\n // Render progressively — shimmer shows until the first component arrives.\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let buf = '';\n let loadingCleared = false;\n try {\n while (!cancelled) {\n const { done, value } = await reader.read();\n if (done || cancelled) break;\n buf += decoder.decode(value, { stream: true });\n const lines = buf.split('\\n');\n buf = lines.pop() ?? '';\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const payload = line.slice(6).trim();\n if (payload === '[DONE]') break;\n try {\n const comp = JSON.parse(payload) as ComponentAssembly[0];\n if (!loadingCleared) { setLoading(false); loadingCleared = true; }\n setAssembly(prev => [...prev, comp]);\n } catch { /* malformed event — skip */ }\n }\n }\n } finally {\n reader.cancel().catch(() => {});\n }\n } else {\n // Warm path: cache hit returns full JSON immediately.\n const data = await res.json() as {\n assembly?: ComponentAssembly;\n intent?: { userContext?: { audience?: string; stage?: string } };\n };\n\n if (cancelled) return;\n\n const clientAudience = data.intent?.userContext?.audience;\n const clientStage = data.intent?.userContext?.stage;\n const ssrMatches =\n initialIntent &&\n clientAudience === initialIntent.audience &&\n clientStage === initialIntent.stage;\n\n if (!ssrMatches && Array.isArray(data.assembly) && data.assembly.length > 0) {\n setAssembly(data.assembly as ComponentAssembly);\n }\n }\n } catch {\n // fail silently\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n\n load();\n return () => { cancelled = true; };\n }, [orgSlug, baseUrl, pageHint, initialAssembly, initialIntent]);\n\n useEffect(() => {\n if (!assembly.length || conversionFiredRef.current) return;\n const token = tokenRef.current;\n if (!token) return;\n const url = window.location.href;\n fetch(`${baseUrl}/api/conversion-check`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ orgSlug, url }),\n }).then(r => r.json() as Promise<ConversionCheckResult>).then(data => {\n if (!data.matched) return;\n conversionFiredRef.current = true;\n let goalValue: number | null = null;\n let goalCurrency: string | null = data.defaultCurrency;\n if (data.valueSelector) {\n try {\n const el = document.querySelector(data.valueSelector);\n if (el) {\n const num = parseFloat((el.textContent ?? '').trim().replace(/[^0-9.]/g, ''));\n if (!isNaN(num)) goalValue = num;\n }\n } catch { /* skip */ }\n }\n if (data.currencySelector) {\n try {\n const el = document.querySelector(data.currencySelector);\n if (el) goalCurrency = (el.textContent ?? '').trim() || goalCurrency;\n } catch { /* skip */ }\n }\n 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={zone ? filterAssemblyByZone(assembly, zone) : assembly} brand={brand ?? orgName} />}\n </div>\n </>\n );\n}\n"]}
|