@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.
- package/README.md +58 -0
- package/dist/components/index.d.ts +74 -0
- package/dist/components/index.js +615 -0
- package/dist/components/index.js.map +1 -0
- package/dist/index-D2nWoFGI.d.ts +1973 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.js +1322 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/index.d.ts +4 -0
- package/dist/schemas/index.js +591 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/shared/index.d.ts +54 -0
- package/dist/shared/index.js +63 -0
- package/dist/shared/index.js.map +1 -0
- package/package.json +109 -0
|
@@ -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
|