@mdxui/services 0.1.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.
@@ -0,0 +1,615 @@
1
+ // src/components/HeroSplit.tsx
2
+ import Link from "next/link";
3
+ import { ChevronRight } from "lucide-react";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ function HeroSplit({
6
+ eyebrow,
7
+ headline,
8
+ body,
9
+ primary,
10
+ secondary,
11
+ showGlyph = true,
12
+ /* INTENTIONALLY UNDEFAULTED — the smart default below uses the
13
+ * undefined state to distinguish "explicitly unset" from
14
+ * "explicitly false" (the opt-out escape hatch). */
15
+ glyphOnMobile,
16
+ illustration
17
+ }) {
18
+ const effectiveGlyphOnMobile = glyphOnMobile ?? Boolean(illustration);
19
+ return /* @__PURE__ */ jsx("section", { className: "border-b border-line", children: /* @__PURE__ */ jsx("div", { className: "mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-28 lg:py-32", children: /* @__PURE__ */ jsxs("div", { className: showGlyph ? "lg:grid lg:grid-cols-[minmax(0,1fr)_360px] lg:items-center lg:gap-16" : "", children: [
20
+ /* @__PURE__ */ jsxs("div", { children: [
21
+ /* @__PURE__ */ jsx("p", { className: "text-[11px] uppercase tracking-[0.18em] text-ink3", children: eyebrow }),
22
+ /* @__PURE__ */ jsx("h1", { className: "mt-5 max-w-[18ch] font-display text-display-hero leading-[1.04] tracking-tighter2 text-ink", children: headline }),
23
+ /* @__PURE__ */ jsx("p", { className: "mt-6 max-w-[58ch] text-[16px] leading-relaxed text-ink2 sm:mt-7 sm:text-[17px]", children: body }),
24
+ /* @__PURE__ */ jsxs("div", { className: "mt-10 flex flex-col items-stretch gap-4 sm:flex-row sm:flex-wrap sm:items-center", children: [
25
+ /* @__PURE__ */ jsx(PrimaryAction, { action: primary }),
26
+ secondary && /* @__PURE__ */ jsx(SecondaryAction, { action: secondary })
27
+ ] })
28
+ ] }),
29
+ showGlyph && /* @__PURE__ */ jsx(
30
+ "div",
31
+ {
32
+ className: effectiveGlyphOnMobile ? "mt-12 lg:mt-0 lg:block" : "hidden lg:block",
33
+ "aria-hidden": "true",
34
+ children: illustration ?? /* @__PURE__ */ jsx(HeroGlyph, {})
35
+ }
36
+ )
37
+ ] }) }) });
38
+ }
39
+ function PrimaryAction({ action }) {
40
+ const className = "inline-flex w-full items-center justify-center gap-1.5 rounded-cta bg-cta px-5 py-3 text-[14px] font-medium tracking-tightish text-cta-fg transition-colors hover:bg-cta-hover sm:w-auto sm:justify-start";
41
+ if (action.external) {
42
+ return /* @__PURE__ */ jsxs(
43
+ "a",
44
+ {
45
+ href: action.href,
46
+ target: "_blank",
47
+ rel: "noopener noreferrer",
48
+ className,
49
+ children: [
50
+ action.label,
51
+ /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4", strokeWidth: 1.7 })
52
+ ]
53
+ }
54
+ );
55
+ }
56
+ return /* @__PURE__ */ jsxs(Link, { href: action.href, className, children: [
57
+ action.label,
58
+ /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4", strokeWidth: 1.7 })
59
+ ] });
60
+ }
61
+ function SecondaryAction({ action }) {
62
+ const className = "inline-flex items-center justify-center gap-1.5 text-[13px] font-medium tracking-tightish text-ink2 transition-colors hover:text-accentDeep sm:justify-start";
63
+ if (action.external) {
64
+ return /* @__PURE__ */ jsxs(
65
+ "a",
66
+ {
67
+ href: action.href,
68
+ target: "_blank",
69
+ rel: "noopener noreferrer",
70
+ className,
71
+ children: [
72
+ action.label,
73
+ /* @__PURE__ */ jsx(ChevronRight, { className: "h-3.5 w-3.5", strokeWidth: 1.7 })
74
+ ]
75
+ }
76
+ );
77
+ }
78
+ return /* @__PURE__ */ jsxs(Link, { href: action.href, className, children: [
79
+ action.label,
80
+ /* @__PURE__ */ jsx(ChevronRight, { className: "h-3.5 w-3.5", strokeWidth: 1.7 })
81
+ ] });
82
+ }
83
+ function HeroGlyph() {
84
+ return /* @__PURE__ */ jsxs(
85
+ "svg",
86
+ {
87
+ viewBox: "0 0 360 280",
88
+ className: "h-auto w-full",
89
+ fill: "none",
90
+ role: "presentation",
91
+ children: [
92
+ /* @__PURE__ */ jsxs(
93
+ "g",
94
+ {
95
+ stroke: "oklch(var(--ink3) / 0.55)",
96
+ strokeWidth: "1.5",
97
+ strokeLinecap: "round",
98
+ children: [
99
+ /* @__PURE__ */ jsx("line", { x1: "40", y1: "40", x2: "180", y2: "40" }),
100
+ /* @__PURE__ */ jsx("line", { x1: "60", y1: "78", x2: "220", y2: "78" }),
101
+ /* @__PURE__ */ jsx("line", { x1: "40", y1: "172", x2: "200", y2: "172" }),
102
+ /* @__PURE__ */ jsx("line", { x1: "80", y1: "210", x2: "260", y2: "210" }),
103
+ /* @__PURE__ */ jsx("line", { x1: "60", y1: "248", x2: "180", y2: "248" })
104
+ ]
105
+ }
106
+ ),
107
+ /* @__PURE__ */ jsx(
108
+ "line",
109
+ {
110
+ x1: "40",
111
+ y1: "135",
112
+ x2: "280",
113
+ y2: "135",
114
+ stroke: "oklch(var(--accent))",
115
+ strokeWidth: "2.75",
116
+ strokeLinecap: "round"
117
+ }
118
+ ),
119
+ /* @__PURE__ */ jsx("circle", { cx: "280", cy: "135", r: "4", fill: "oklch(var(--accent-deep))" }),
120
+ /* @__PURE__ */ jsxs(
121
+ "g",
122
+ {
123
+ stroke: "oklch(var(--accent-deep) / 0.85)",
124
+ strokeWidth: "1",
125
+ strokeLinecap: "round",
126
+ children: [
127
+ /* @__PURE__ */ jsx("line", { x1: "312", y1: "100", x2: "312", y2: "170" }),
128
+ /* @__PURE__ */ jsx("line", { x1: "306", y1: "100", x2: "318", y2: "100" }),
129
+ /* @__PURE__ */ jsx("line", { x1: "306", y1: "170", x2: "318", y2: "170" }),
130
+ /* @__PURE__ */ jsx("line", { x1: "308", y1: "135", x2: "316", y2: "135" })
131
+ ]
132
+ }
133
+ )
134
+ ]
135
+ }
136
+ );
137
+ }
138
+
139
+ // src/components/HeroStacked.tsx
140
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
141
+ function HeroStacked({
142
+ eyebrow,
143
+ headline,
144
+ body,
145
+ primary,
146
+ secondary,
147
+ illustration
148
+ }) {
149
+ return /* @__PURE__ */ jsx2("section", { className: "border-b border-line", children: /* @__PURE__ */ jsxs2("div", { className: "mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-28 lg:py-32", children: [
150
+ /* @__PURE__ */ jsxs2("div", { className: "text-center", children: [
151
+ /* @__PURE__ */ jsx2("p", { className: "text-[11px] uppercase tracking-[0.18em] text-ink3", children: eyebrow }),
152
+ /* @__PURE__ */ jsx2("h1", { className: "mx-auto mt-5 max-w-[22ch] font-display text-display-hero leading-[1.04] tracking-tighter2 text-ink", children: headline }),
153
+ /* @__PURE__ */ jsx2("p", { className: "mx-auto mt-6 max-w-[60ch] text-[16px] leading-relaxed text-ink2 sm:mt-7 sm:text-[17px]", children: body }),
154
+ /* @__PURE__ */ jsxs2("div", { className: "mt-10 flex flex-col items-stretch justify-center gap-4 sm:flex-row sm:flex-wrap sm:items-center", children: [
155
+ /* @__PURE__ */ jsx2(PrimaryAction, { action: primary }),
156
+ secondary && /* @__PURE__ */ jsx2(SecondaryAction, { action: secondary })
157
+ ] })
158
+ ] }),
159
+ /* @__PURE__ */ jsx2("div", { className: "mx-auto mt-14 max-w-[1080px] sm:mt-16", "aria-hidden": "true", children: illustration })
160
+ ] }) });
161
+ }
162
+
163
+ // src/components/Hero.tsx
164
+ import { jsx as jsx3 } from "react/jsx-runtime";
165
+ function Hero(props) {
166
+ if (props.variant === "stacked-illustration-below" && props.illustration) {
167
+ return /* @__PURE__ */ jsx3(HeroStacked, { ...props });
168
+ }
169
+ return /* @__PURE__ */ jsx3(HeroSplit, { ...props });
170
+ }
171
+
172
+ // src/shared/section-eyebrow.tsx
173
+ import { jsx as jsx4 } from "react/jsx-runtime";
174
+ function SectionEyebrow({ children }) {
175
+ return /* @__PURE__ */ jsx4("p", { className: "text-[11px] uppercase tracking-[0.18em] text-ink3", children });
176
+ }
177
+
178
+ // src/components/Problem.tsx
179
+ import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
180
+ function Problem({ eyebrow, heading, items }) {
181
+ return /* @__PURE__ */ jsx5("section", { className: "border-b border-line", children: /* @__PURE__ */ jsxs3("div", { className: "mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24", children: [
182
+ /* @__PURE__ */ jsx5(SectionEyebrow, { children: eyebrow }),
183
+ /* @__PURE__ */ jsx5("h2", { className: "mt-3 max-w-[22ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink", children: heading }),
184
+ /* @__PURE__ */ jsx5("div", { className: "mt-12 grid gap-8 md:grid-cols-3", children: items.map((item) => /* @__PURE__ */ jsx5(ProblemCard, { ...item }, item.label)) })
185
+ ] }) });
186
+ }
187
+ function ProblemCard({ label, cost, outcome, body }) {
188
+ return /* @__PURE__ */ jsxs3("article", { children: [
189
+ /* @__PURE__ */ jsx5("p", { className: "text-[10.5px] uppercase tracking-[0.16em] text-ink3", children: label }),
190
+ /* @__PURE__ */ jsx5("p", { className: "mt-3 font-display text-[24px] leading-tight tracking-tightish text-ink", children: cost }),
191
+ /* @__PURE__ */ jsx5("p", { className: "mt-4 text-body-sm font-medium leading-snug tracking-tightish text-accentDeep", children: outcome }),
192
+ /* @__PURE__ */ jsx5("p", { className: "mt-3 text-body-sm leading-relaxed text-ink2", children: body })
193
+ ] });
194
+ }
195
+
196
+ // src/components/WhatYouGet.tsx
197
+ import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
198
+ function WhatYouGet({ eyebrow, heading, sections }) {
199
+ if (sections.length === 0) return null;
200
+ return /* @__PURE__ */ jsx6("section", { className: "border-b border-line", children: /* @__PURE__ */ jsxs4("div", { className: "mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24", children: [
201
+ /* @__PURE__ */ jsx6(SectionEyebrow, { children: eyebrow }),
202
+ /* @__PURE__ */ jsx6("h2", { className: "mt-3 max-w-[22ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink", children: heading }),
203
+ /* @__PURE__ */ jsx6("ul", { className: "mt-12 grid gap-x-8 gap-y-7 md:grid-cols-2 lg:grid-cols-3", children: sections.map((s) => /* @__PURE__ */ jsxs4("li", { children: [
204
+ /* @__PURE__ */ jsx6("p", { className: "font-display text-[14px] tracking-tightish text-ink3", children: s.n }),
205
+ /* @__PURE__ */ jsx6("p", { className: "mt-1.5 text-[15px] font-medium tracking-tightish text-ink", children: s.title }),
206
+ /* @__PURE__ */ jsx6("p", { className: "mt-1.5 text-[13.5px] leading-relaxed text-ink2", children: s.body })
207
+ ] }, s.n)) })
208
+ ] }) });
209
+ }
210
+
211
+ // src/components/HowItWorks.tsx
212
+ import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
213
+ function HowItWorks({
214
+ eyebrow,
215
+ heading,
216
+ steps,
217
+ stepIllustrations
218
+ }) {
219
+ if (steps.length === 0) return null;
220
+ const hasIllustrations = stepIllustrations !== void 0 && stepIllustrations.length === steps.length;
221
+ return /* @__PURE__ */ jsx7("section", { className: "border-b border-line", children: /* @__PURE__ */ jsxs5("div", { className: "mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24", children: [
222
+ /* @__PURE__ */ jsx7(SectionEyebrow, { children: eyebrow }),
223
+ /* @__PURE__ */ jsx7("h2", { className: "mt-3 max-w-[22ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink", children: heading }),
224
+ /* @__PURE__ */ jsx7(
225
+ "ol",
226
+ {
227
+ itemScope: true,
228
+ itemType: "https://schema.org/HowTo",
229
+ className: "mt-12 grid gap-10 md:grid-cols-3",
230
+ children: steps.map((s, i) => /* @__PURE__ */ jsx7(
231
+ Step,
232
+ {
233
+ ...s,
234
+ illustration: hasIllustrations ? stepIllustrations[i] : void 0
235
+ },
236
+ s.n
237
+ ))
238
+ }
239
+ )
240
+ ] }) });
241
+ }
242
+ function Step({
243
+ n,
244
+ title,
245
+ body,
246
+ illustration: Illustration
247
+ }) {
248
+ return /* @__PURE__ */ jsxs5(
249
+ "li",
250
+ {
251
+ itemScope: true,
252
+ itemType: "https://schema.org/HowToStep",
253
+ className: Illustration ? "flex flex-col" : void 0,
254
+ children: [
255
+ Illustration && /* @__PURE__ */ jsx7("div", { className: "mb-6 w-full lg:max-w-[320px]", children: /* @__PURE__ */ jsx7(Illustration, {}) }),
256
+ /* @__PURE__ */ jsxs5("div", { className: Illustration ? "mt-auto" : void 0, children: [
257
+ /* @__PURE__ */ jsx7("p", { className: "font-display text-[36px] leading-none tracking-tighter2 text-ink3/60", children: n }),
258
+ /* @__PURE__ */ jsx7("p", { className: "mt-4 font-display text-[20px] leading-tight tracking-tightish text-ink", children: title }),
259
+ /* @__PURE__ */ jsx7("p", { className: "mt-3 text-body-sm leading-relaxed text-ink2", children: body })
260
+ ] })
261
+ ]
262
+ }
263
+ );
264
+ }
265
+
266
+ // src/components/Defensibility.tsx
267
+ import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
268
+ function Defensibility({
269
+ eyebrow,
270
+ heading,
271
+ columns,
272
+ caveat
273
+ }) {
274
+ return /* @__PURE__ */ jsx8("section", { className: "border-b border-line", children: /* @__PURE__ */ jsxs6("div", { className: "mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24", children: [
275
+ /* @__PURE__ */ jsx8(SectionEyebrow, { children: eyebrow }),
276
+ /* @__PURE__ */ jsx8("h2", { className: "mt-3 max-w-[22ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink", children: heading }),
277
+ /* @__PURE__ */ jsx8("div", { className: "mt-10 grid gap-10 lg:grid-cols-2", children: columns.map((col) => /* @__PURE__ */ jsx8(Column, { ...col }, col.heading)) }),
278
+ caveat && /* @__PURE__ */ jsx8("p", { className: "mt-12 max-w-[68ch] text-body-xs leading-relaxed text-ink3", children: caveat })
279
+ ] }) });
280
+ }
281
+ function Column({ heading, bullets }) {
282
+ return /* @__PURE__ */ jsxs6("div", { children: [
283
+ /* @__PURE__ */ jsx8("h3", { className: "font-display text-[18px] leading-tight tracking-tightish text-ink", children: heading }),
284
+ /* @__PURE__ */ jsx8("ul", { className: "mt-4 space-y-3 text-body-sm leading-relaxed text-ink2", children: bullets.map((b, i) => /* @__PURE__ */ jsxs6("li", { className: "flex gap-2.5", children: [
285
+ /* @__PURE__ */ jsx8("span", { className: "mt-2 h-1 w-1 shrink-0 rounded-full bg-ink3" }),
286
+ /* @__PURE__ */ jsx8("span", { children: b })
287
+ ] }, i)) })
288
+ ] });
289
+ }
290
+
291
+ // src/components/Pricing.tsx
292
+ import Link2 from "next/link";
293
+ import { ChevronRight as ChevronRight2 } from "lucide-react";
294
+ import { Fragment, jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
295
+ var GRID_COLS = {
296
+ 1: "max-w-[420px]",
297
+ 2: "max-w-[820px] md:grid-cols-2",
298
+ 3: "max-w-container md:grid-cols-3"
299
+ };
300
+ function Pricing(props) {
301
+ if ("kind" in props && props.kind === "unit") {
302
+ return /* @__PURE__ */ jsx9(UnitPricing, { ...props });
303
+ }
304
+ return /* @__PURE__ */ jsx9(TieredPricing, { ...props });
305
+ }
306
+ function TieredPricing({
307
+ eyebrow,
308
+ heading,
309
+ tiers,
310
+ footnote
311
+ }) {
312
+ if (tiers.length === 0) return null;
313
+ const count = tiers.length === 1 || tiers.length === 2 ? tiers.length : 3;
314
+ return /* @__PURE__ */ jsx9("section", { className: "border-b border-line bg-surface", children: /* @__PURE__ */ jsxs7("div", { className: "mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24", children: [
315
+ /* @__PURE__ */ jsx9(SectionEyebrow, { children: eyebrow }),
316
+ /* @__PURE__ */ jsx9("h2", { className: "mt-3 max-w-[22ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink", children: heading }),
317
+ /* @__PURE__ */ jsx9("div", { className: `mt-12 mx-auto grid gap-6 ${GRID_COLS[count]}`, children: tiers.map((t) => /* @__PURE__ */ jsx9(PriceCard, { ...t }, t.tier)) }),
318
+ footnote && /* @__PURE__ */ jsx9("p", { className: "mt-10 max-w-[64ch] text-[13px] text-ink3", children: footnote })
319
+ ] }) });
320
+ }
321
+ function formatPerUnit(perUnit, currency) {
322
+ const isWhole = Number.isInteger(perUnit);
323
+ return new Intl.NumberFormat("en-US", {
324
+ style: "currency",
325
+ currency: currency.toUpperCase(),
326
+ minimumFractionDigits: isWhole ? 0 : 2,
327
+ maximumFractionDigits: 2
328
+ }).format(perUnit);
329
+ }
330
+ function UnitPricing({
331
+ eyebrow,
332
+ heading,
333
+ footnote,
334
+ currency,
335
+ perUnit,
336
+ billingCadence
337
+ }) {
338
+ const formatted = formatPerUnit(perUnit, currency);
339
+ return /* @__PURE__ */ jsx9("section", { className: "border-b border-line bg-surface", children: /* @__PURE__ */ jsxs7("div", { className: "mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24", children: [
340
+ /* @__PURE__ */ jsx9(SectionEyebrow, { children: eyebrow }),
341
+ /* @__PURE__ */ jsx9("h2", { className: "mt-3 max-w-[22ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink", children: heading }),
342
+ /* @__PURE__ */ jsx9("div", { className: "mt-12 mx-auto max-w-[420px]", children: /* @__PURE__ */ jsxs7(
343
+ "article",
344
+ {
345
+ itemScope: true,
346
+ itemType: "https://schema.org/Offer",
347
+ "data-pricing-kind": "unit",
348
+ className: "flex flex-col rounded-card border border-line bg-paper p-7",
349
+ children: [
350
+ /* @__PURE__ */ jsx9("p", { className: "text-[10.5px] uppercase tracking-[0.16em] text-ink3", children: "Per call" }),
351
+ /* @__PURE__ */ jsxs7("p", { className: "mt-3 flex items-baseline gap-2", children: [
352
+ /* @__PURE__ */ jsx9("span", { className: "font-display text-[40px] leading-none tracking-tighter2 text-ink", children: formatted }),
353
+ /* @__PURE__ */ jsx9("span", { className: "text-[12px] text-ink3", children: billingCadence })
354
+ ] })
355
+ ]
356
+ }
357
+ ) }),
358
+ footnote && /* @__PURE__ */ jsx9("p", { className: "mt-10 max-w-[64ch] text-[13px] text-ink3", children: footnote })
359
+ ] }) });
360
+ }
361
+ function splitPrice(price) {
362
+ const i = price.indexOf("/");
363
+ if (i === -1) return { core: price, suffix: null };
364
+ return { core: price.slice(0, i).trim(), suffix: price.slice(i) };
365
+ }
366
+ function resolvePriceSuffix(price, override) {
367
+ if (override !== void 0) return override;
368
+ const { suffix } = splitPrice(price);
369
+ return suffix ?? "/ report";
370
+ }
371
+ function PriceCard({
372
+ tierKey,
373
+ tier,
374
+ price,
375
+ priceSuffix,
376
+ audience,
377
+ features,
378
+ featured,
379
+ cta
380
+ }) {
381
+ const isMailto = cta.href.startsWith("mailto:");
382
+ const { core } = splitPrice(price);
383
+ const suffix = resolvePriceSuffix(price, priceSuffix);
384
+ return /* @__PURE__ */ jsxs7(
385
+ "article",
386
+ {
387
+ itemScope: true,
388
+ itemType: "https://schema.org/Offer",
389
+ "data-tier-key": tierKey,
390
+ className: "flex flex-col rounded-card border bg-paper p-7 " + (featured ? "border-accent shadow-lift" : "border-line"),
391
+ children: [
392
+ /* @__PURE__ */ jsx9("p", { className: "text-[10.5px] uppercase tracking-[0.16em] text-ink3", children: tier }),
393
+ /* @__PURE__ */ jsxs7("p", { className: "mt-3 flex items-baseline gap-2", children: [
394
+ /* @__PURE__ */ jsx9("span", { className: "font-display text-[40px] leading-none tracking-tighter2 text-ink", children: core }),
395
+ suffix && /* @__PURE__ */ jsx9("span", { className: "text-[12px] text-ink3", children: suffix })
396
+ ] }),
397
+ /* @__PURE__ */ jsx9("p", { className: "mt-2 text-[13px] text-ink2", children: audience }),
398
+ /* @__PURE__ */ jsx9("ul", { className: "mt-6 flex-1 space-y-2.5 text-[13.5px] text-ink2", children: features.map((f) => /* @__PURE__ */ jsxs7("li", { className: "flex gap-2.5", children: [
399
+ /* @__PURE__ */ jsx9(
400
+ "span",
401
+ {
402
+ className: "mt-2 h-1 w-1 shrink-0 rounded-full " + (featured ? "bg-accent" : "bg-ink3")
403
+ }
404
+ ),
405
+ /* @__PURE__ */ jsx9("span", { children: f })
406
+ ] }, f)) }),
407
+ /* @__PURE__ */ jsx9(
408
+ PriceCardCta,
409
+ {
410
+ label: cta.label,
411
+ href: cta.href,
412
+ featured,
413
+ external: isMailto
414
+ }
415
+ )
416
+ ]
417
+ }
418
+ );
419
+ }
420
+ function PriceCardCta({
421
+ label,
422
+ href,
423
+ featured,
424
+ external
425
+ }) {
426
+ const baseClass = "mt-7 inline-flex w-full items-center justify-center gap-1.5 rounded-cta px-5 py-2.5 text-[13.5px] font-medium tracking-tightish transition-colors";
427
+ const variantClass = featured ? "bg-cta text-cta-fg hover:bg-cta-hover" : "border border-line2 bg-paper text-ink hover:border-ink hover:text-ink";
428
+ const className = `${baseClass} ${variantClass}`;
429
+ const body = /* @__PURE__ */ jsxs7(Fragment, { children: [
430
+ label,
431
+ /* @__PURE__ */ jsx9(ChevronRight2, { className: "h-3.5 w-3.5", strokeWidth: 1.7 })
432
+ ] });
433
+ if (external) {
434
+ return /* @__PURE__ */ jsx9("a", { className, href, "data-action": "buy", children: body });
435
+ }
436
+ return /* @__PURE__ */ jsx9(Link2, { className, href, "data-action": "buy", children: body });
437
+ }
438
+
439
+ // src/components/Faq.tsx
440
+ import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
441
+ function Faq({ eyebrow, heading, items }) {
442
+ if (items.length === 0) return null;
443
+ return /* @__PURE__ */ jsx10("section", { className: "border-b border-line", children: /* @__PURE__ */ jsxs8("div", { className: "mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24", children: [
444
+ /* @__PURE__ */ jsx10(SectionEyebrow, { children: eyebrow }),
445
+ /* @__PURE__ */ jsx10("h2", { className: "mt-3 max-w-[20ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink", children: heading }),
446
+ /* @__PURE__ */ jsx10("dl", { className: "mt-12 grid gap-x-12 gap-y-10 md:grid-cols-2", children: items.map((f) => /* @__PURE__ */ jsxs8("div", { itemScope: true, itemType: "https://schema.org/Question", children: [
447
+ /* @__PURE__ */ jsx10("dt", { className: "font-display text-body leading-snug tracking-tightish text-ink", children: f.q }),
448
+ /* @__PURE__ */ jsx10("dd", { className: "mt-2 text-body-sm leading-relaxed text-ink2", children: f.a })
449
+ ] }, f.q)) })
450
+ ] }) });
451
+ }
452
+
453
+ // src/components/FinalCta.tsx
454
+ import Link3 from "next/link";
455
+ import { ChevronRight as ChevronRight3 } from "lucide-react";
456
+ import { Fragment as Fragment2, jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
457
+ function FinalCta({
458
+ eyebrow,
459
+ headline,
460
+ primary,
461
+ secondary
462
+ }) {
463
+ return /* @__PURE__ */ jsx11("section", { children: /* @__PURE__ */ jsxs9("div", { className: "mx-auto max-w-container px-6 py-20 text-center sm:px-10 sm:py-32", children: [
464
+ /* @__PURE__ */ jsx11("p", { className: "text-[11px] uppercase tracking-[0.18em] text-ink3", children: eyebrow }),
465
+ /* @__PURE__ */ jsx11("h2", { className: "mx-auto mt-4 max-w-[22ch] font-display text-[36px] leading-[1.04] tracking-tighter2 text-ink sm:text-[52px]", children: headline }),
466
+ /* @__PURE__ */ jsxs9("div", { className: "mt-10 flex flex-col items-stretch gap-4 sm:flex-row sm:flex-wrap sm:items-center sm:justify-center", children: [
467
+ /* @__PURE__ */ jsx11(PrimaryButton, { action: primary }),
468
+ secondary && /* @__PURE__ */ jsx11(SecondaryLink, { action: secondary })
469
+ ] })
470
+ ] }) });
471
+ }
472
+ function PrimaryButton({ action }) {
473
+ const className = "inline-flex w-full items-center justify-center gap-1.5 rounded-cta bg-cta px-6 py-3 text-[14px] font-medium tracking-tightish text-cta-fg transition-colors hover:bg-cta-hover sm:w-auto";
474
+ const body = /* @__PURE__ */ jsxs9(Fragment2, { children: [
475
+ action.label,
476
+ /* @__PURE__ */ jsx11(ChevronRight3, { className: "h-4 w-4", strokeWidth: 1.7 })
477
+ ] });
478
+ if (action.external) {
479
+ return /* @__PURE__ */ jsx11(
480
+ "a",
481
+ {
482
+ href: action.href,
483
+ target: "_blank",
484
+ rel: "noopener noreferrer",
485
+ className,
486
+ children: body
487
+ }
488
+ );
489
+ }
490
+ return /* @__PURE__ */ jsx11(Link3, { href: action.href, className, children: body });
491
+ }
492
+ function SecondaryLink({ action }) {
493
+ const className = "inline-flex items-center justify-center gap-1.5 text-[13px] font-medium tracking-tightish text-ink3 transition-colors hover:text-ink";
494
+ if (action.external) {
495
+ return /* @__PURE__ */ jsx11(
496
+ "a",
497
+ {
498
+ href: action.href,
499
+ target: "_blank",
500
+ rel: "noopener noreferrer",
501
+ className,
502
+ children: action.label
503
+ }
504
+ );
505
+ }
506
+ return /* @__PURE__ */ jsx11(Link3, { href: action.href, className, children: action.label });
507
+ }
508
+
509
+ // src/components/Masthead.tsx
510
+ import Link4 from "next/link";
511
+ import { Fragment as Fragment3, jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
512
+ function Masthead({ brand, cta, eyebrow, narrow }) {
513
+ return /* @__PURE__ */ jsx12("header", { className: "border-b border-line", children: /* @__PURE__ */ jsxs10(
514
+ "div",
515
+ {
516
+ className: "mx-auto flex items-center justify-between gap-4 px-6 py-5 sm:px-10 " + (narrow ? "max-w-[900px]" : "max-w-container"),
517
+ children: [
518
+ /* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-3", children: [
519
+ /* @__PURE__ */ jsx12(
520
+ Link4,
521
+ {
522
+ href: brand.href,
523
+ className: "font-display text-[18px] tracking-tightish text-ink",
524
+ children: brand.primary
525
+ }
526
+ ),
527
+ brand.secondary && /* @__PURE__ */ jsxs10(Fragment3, { children: [
528
+ /* @__PURE__ */ jsx12("span", { className: "hidden h-4 w-px bg-line2 sm:inline-block" }),
529
+ /* @__PURE__ */ jsx12("span", { className: "hidden text-[11px] uppercase tracking-[0.18em] text-ink3 sm:inline", children: brand.secondary })
530
+ ] })
531
+ ] }),
532
+ cta ? /* @__PURE__ */ jsx12(
533
+ Link4,
534
+ {
535
+ href: cta.href,
536
+ className: "rounded-cta bg-cta px-4 py-2 text-[12px] font-medium tracking-tightish text-cta-fg transition-colors hover:bg-cta-hover",
537
+ children: cta.label
538
+ }
539
+ ) : eyebrow ? /* @__PURE__ */ jsx12("span", { className: "text-[10.5px] uppercase tracking-[0.18em] text-ink3", children: eyebrow }) : null
540
+ ]
541
+ }
542
+ ) });
543
+ }
544
+
545
+ // src/components/Footer.tsx
546
+ import Link5 from "next/link";
547
+ import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
548
+ function Footer({ text, links }) {
549
+ return /* @__PURE__ */ jsx13("footer", { className: "border-t border-line", children: /* @__PURE__ */ jsxs11("div", { className: "mx-auto flex max-w-container flex-col items-center gap-4 px-6 py-10 text-center text-[12px] text-ink3 sm:flex-row sm:justify-between sm:px-10 sm:text-left", children: [
550
+ /* @__PURE__ */ jsx13("p", { children: text }),
551
+ links && links.length > 0 && /* @__PURE__ */ jsx13("ul", { className: "flex flex-wrap items-center justify-center gap-x-5 gap-y-2 sm:justify-end", children: links.map((l) => /* @__PURE__ */ jsx13("li", { children: /* @__PURE__ */ jsx13(
552
+ Link5,
553
+ {
554
+ href: l.href,
555
+ className: "text-ink3 no-underline transition-colors hover:text-ink",
556
+ children: l.label
557
+ }
558
+ ) }, l.href)) })
559
+ ] }) });
560
+ }
561
+
562
+ // src/components/ScrollHeader.tsx
563
+ import { useEffect, useState } from "react";
564
+ import { jsx as jsx14 } from "react/jsx-runtime";
565
+ function ScrollHeader({
566
+ threshold = 480,
567
+ ...mastheadProps
568
+ }) {
569
+ const [visible, setVisible] = useState(false);
570
+ useEffect(() => {
571
+ let raf = 0;
572
+ const update = () => {
573
+ raf = 0;
574
+ setVisible(window.scrollY > threshold);
575
+ };
576
+ const onScroll = () => {
577
+ if (raf) return;
578
+ raf = requestAnimationFrame(update);
579
+ };
580
+ update();
581
+ window.addEventListener("scroll", onScroll, { passive: true });
582
+ return () => {
583
+ window.removeEventListener("scroll", onScroll);
584
+ if (raf) cancelAnimationFrame(raf);
585
+ };
586
+ }, [threshold]);
587
+ return /* @__PURE__ */ jsx14(
588
+ "div",
589
+ {
590
+ "aria-hidden": !visible,
591
+ className: "pointer-events-none fixed inset-x-0 top-0 z-40 transition-[transform,opacity] duration-[220ms] ease-out-quart " + (visible ? "translate-y-0 opacity-100" : "-translate-y-full opacity-0"),
592
+ children: /* @__PURE__ */ jsx14("div", { className: "pointer-events-auto bg-paper shadow-sheet", children: /* @__PURE__ */ jsx14(Masthead, { ...mastheadProps }) })
593
+ }
594
+ );
595
+ }
596
+ export {
597
+ Defensibility,
598
+ Faq,
599
+ FinalCta,
600
+ Footer,
601
+ Hero,
602
+ HeroSplit,
603
+ HeroStacked,
604
+ HowItWorks,
605
+ Masthead,
606
+ Pricing,
607
+ PrimaryAction,
608
+ Problem,
609
+ Pricing as ReportPricing,
610
+ ScrollHeader,
611
+ SecondaryAction,
612
+ Hero as ServiceHero,
613
+ WhatYouGet
614
+ };
615
+ //# sourceMappingURL=index.js.map