@yca-software/yca-react-core 0.0.1

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.
Files changed (87) hide show
  1. package/README.md +129 -0
  2. package/dist/admin/index.d.ts +10 -0
  3. package/dist/admin/index.js +3 -0
  4. package/dist/admin/index.js.map +1 -0
  5. package/dist/admin-BVYdWtEy.d.ts +3 -0
  6. package/dist/api/index.d.ts +68 -0
  7. package/dist/api/index.js +3 -0
  8. package/dist/api/index.js.map +1 -0
  9. package/dist/auth/index.d.ts +49 -0
  10. package/dist/auth/index.js +3 -0
  11. package/dist/auth/index.js.map +1 -0
  12. package/dist/chunk-2HJO2ICF.js +339 -0
  13. package/dist/chunk-2HJO2ICF.js.map +1 -0
  14. package/dist/chunk-3AYG73DK.js +174 -0
  15. package/dist/chunk-3AYG73DK.js.map +1 -0
  16. package/dist/chunk-3SCZ4Z6P.js +26 -0
  17. package/dist/chunk-3SCZ4Z6P.js.map +1 -0
  18. package/dist/chunk-3ZLODBRJ.js +21 -0
  19. package/dist/chunk-3ZLODBRJ.js.map +1 -0
  20. package/dist/chunk-6LO5O4G6.js +224 -0
  21. package/dist/chunk-6LO5O4G6.js.map +1 -0
  22. package/dist/chunk-APZVW5SW.js +75 -0
  23. package/dist/chunk-APZVW5SW.js.map +1 -0
  24. package/dist/chunk-EVZBADFR.js +583 -0
  25. package/dist/chunk-EVZBADFR.js.map +1 -0
  26. package/dist/chunk-GXWVFQCK.js +52 -0
  27. package/dist/chunk-GXWVFQCK.js.map +1 -0
  28. package/dist/chunk-KG4JVAKS.js +13 -0
  29. package/dist/chunk-KG4JVAKS.js.map +1 -0
  30. package/dist/chunk-KZH56VPP.js +183 -0
  31. package/dist/chunk-KZH56VPP.js.map +1 -0
  32. package/dist/chunk-LP7Q75C6.js +96 -0
  33. package/dist/chunk-LP7Q75C6.js.map +1 -0
  34. package/dist/chunk-NL4NAHXG.js +3 -0
  35. package/dist/chunk-NL4NAHXG.js.map +1 -0
  36. package/dist/chunk-PLSNCPEC.js +2507 -0
  37. package/dist/chunk-PLSNCPEC.js.map +1 -0
  38. package/dist/chunk-QFKVPVFC.js +1391 -0
  39. package/dist/chunk-QFKVPVFC.js.map +1 -0
  40. package/dist/chunk-TSXUUD64.js +64 -0
  41. package/dist/chunk-TSXUUD64.js.map +1 -0
  42. package/dist/chunk-UCJ76BEC.js +32 -0
  43. package/dist/chunk-UCJ76BEC.js.map +1 -0
  44. package/dist/chunk-WFTIYYII.js +3 -0
  45. package/dist/chunk-WFTIYYII.js.map +1 -0
  46. package/dist/components/forms/index.d.ts +101 -0
  47. package/dist/components/forms/index.js +7 -0
  48. package/dist/components/forms/index.js.map +1 -0
  49. package/dist/components/marketing/index.d.ts +473 -0
  50. package/dist/components/marketing/index.js +5 -0
  51. package/dist/components/marketing/index.js.map +1 -0
  52. package/dist/components/spa/index.d.ts +275 -0
  53. package/dist/components/spa/index.js +8 -0
  54. package/dist/components/spa/index.js.map +1 -0
  55. package/dist/components/ui/index.d.ts +420 -0
  56. package/dist/components/ui/index.js +6 -0
  57. package/dist/components/ui/index.js.map +1 -0
  58. package/dist/constants/index.d.ts +2 -0
  59. package/dist/constants/index.js +4 -0
  60. package/dist/constants/index.js.map +1 -0
  61. package/dist/cookies-ZS_QYOR7.d.ts +8 -0
  62. package/dist/dateRangePickerTranslations-B99F2WQA.d.ts +9 -0
  63. package/dist/errors/index.d.ts +48 -0
  64. package/dist/errors/index.js +3 -0
  65. package/dist/errors/index.js.map +1 -0
  66. package/dist/forms-VpLvEFob.d.ts +18 -0
  67. package/dist/hooks/index.d.ts +18 -0
  68. package/dist/hooks/index.js +4 -0
  69. package/dist/hooks/index.js.map +1 -0
  70. package/dist/index.d.ts +42 -0
  71. package/dist/index.js +19 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/lib/index.d.ts +49 -0
  74. package/dist/lib/index.js +7 -0
  75. package/dist/lib/index.js.map +1 -0
  76. package/dist/pagination-CFqoqiAG.d.ts +10 -0
  77. package/dist/radix-overlays-BlCr-uem.d.ts +10 -0
  78. package/dist/styles.css +9 -0
  79. package/dist/theme/marketing.css +750 -0
  80. package/dist/theme/tokens.css +115 -0
  81. package/dist/types/index.d.ts +2 -0
  82. package/dist/types/index.js +3 -0
  83. package/dist/types/index.js.map +1 -0
  84. package/dist/types-BuNHOJ1h.d.ts +58 -0
  85. package/dist/types-CN73TWSY.d.ts +51 -0
  86. package/dist/useAdminListPage-C4ZTTllP.d.ts +26 -0
  87. package/package.json +152 -0
@@ -0,0 +1,1391 @@
1
+ import { Card, CardHeader, CardTitle, CardContent, CardDescription, Button, Input } from './chunk-3AYG73DK.js';
2
+ import { cn } from './chunk-GXWVFQCK.js';
3
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
+ import { ArrowUpRight, Mail, Phone, MapPin, ChevronDown, Globe, Menu, X, Check } from 'lucide-react';
5
+ import * as React from 'react';
6
+
7
+ function BentoFeatures({
8
+ id,
9
+ eyebrow,
10
+ title,
11
+ description,
12
+ cells,
13
+ className
14
+ }) {
15
+ return /* @__PURE__ */ jsx("section", { id, className: cn("ds-mkt-section-soft px-4 py-20 sm:py-24", className), children: /* @__PURE__ */ jsxs("div", { className: "container mx-auto max-w-6xl", children: [
16
+ (eyebrow || title || description) && /* @__PURE__ */ jsxs("div", { className: "mb-14 text-center", children: [
17
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "text-sm font-semibold uppercase tracking-wider text-primary", children: eyebrow }),
18
+ title && /* @__PURE__ */ jsx("h2", { className: "mt-2 text-3xl font-bold tracking-tight sm:text-4xl", children: title }),
19
+ description && /* @__PURE__ */ jsx("p", { className: "mx-auto mt-4 max-w-2xl text-lg text-muted-foreground", children: description })
20
+ ] }),
21
+ /* @__PURE__ */ jsx("div", { className: "grid auto-rows-fr grid-cols-1 gap-5 md:grid-cols-2 lg:grid-cols-3 lg:gap-7", children: cells.map((cell) => /* @__PURE__ */ jsxs(
22
+ Card,
23
+ {
24
+ className: cn(
25
+ "ds-mkt-bento-tile flex h-full flex-col rounded-none border-0 bg-transparent p-0 shadow-none",
26
+ cell.className
27
+ ),
28
+ children: [
29
+ /* @__PURE__ */ jsxs(CardHeader, { className: "gap-4 px-6 pb-2 pt-7 sm:px-7", children: [
30
+ cell.icon && /* @__PURE__ */ jsx("div", { className: "ds-mkt-bento-icon-wrap [&_svg]:size-5", children: cell.icon }),
31
+ /* @__PURE__ */ jsx(CardTitle, { className: "text-xl leading-snug", children: cell.title })
32
+ ] }),
33
+ /* @__PURE__ */ jsx(CardContent, { className: "flex-1 px-6 pb-7 pt-0 sm:px-7", children: /* @__PURE__ */ jsx(CardDescription, { className: "text-base leading-relaxed", children: cell.description }) })
34
+ ]
35
+ },
36
+ cell.title
37
+ )) })
38
+ ] }) });
39
+ }
40
+ function BlogTeaser({ id, eyebrow, title, description, posts, className }) {
41
+ return /* @__PURE__ */ jsx("section", { id, className: cn("px-4 py-20", className), children: /* @__PURE__ */ jsxs("div", { className: "container mx-auto max-w-6xl", children: [
42
+ (eyebrow || title || description) && /* @__PURE__ */ jsxs("div", { className: "mb-12 text-center", children: [
43
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-primary", children: eyebrow }),
44
+ title && /* @__PURE__ */ jsx("h2", { className: "mt-2 text-3xl font-bold tracking-tight sm:text-4xl", children: title }),
45
+ description && /* @__PURE__ */ jsx("p", { className: "mx-auto mt-4 max-w-2xl text-lg text-muted-foreground", children: description })
46
+ ] }),
47
+ /* @__PURE__ */ jsx("div", { className: "grid gap-8 md:grid-cols-2 lg:grid-cols-3", children: posts.map((post) => /* @__PURE__ */ jsxs(
48
+ "a",
49
+ {
50
+ href: post.href,
51
+ className: cn(
52
+ "group ds-mkt-surface-elevated flex flex-col overflow-hidden rounded-2xl border-0 transition duration-300",
53
+ "hover:-translate-y-1 hover:shadow-2xl"
54
+ ),
55
+ children: [
56
+ post.image ? /* @__PURE__ */ jsxs("div", { className: "relative aspect-[16/10] overflow-hidden", children: [
57
+ /* @__PURE__ */ jsx(
58
+ "img",
59
+ {
60
+ src: post.image.src,
61
+ alt: post.image.alt,
62
+ className: "h-full w-full object-cover transition duration-500 group-hover:scale-105",
63
+ loading: "lazy"
64
+ }
65
+ ),
66
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-background/80 via-transparent to-transparent opacity-0 transition group-hover:opacity-100" })
67
+ ] }) : /* @__PURE__ */ jsx("div", { className: "aspect-[16/10] bg-gradient-to-br from-primary/15 via-muted to-accent/20" }),
68
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-col p-6", children: [
69
+ /* @__PURE__ */ jsx(
70
+ "time",
71
+ {
72
+ dateTime: post.date,
73
+ className: "text-xs font-medium uppercase tracking-wide text-muted-foreground",
74
+ children: post.date
75
+ }
76
+ ),
77
+ /* @__PURE__ */ jsx("h3", { className: "mt-2 text-lg font-semibold leading-snug text-foreground group-hover:text-primary", children: post.title }),
78
+ /* @__PURE__ */ jsx("p", { className: "mt-2 line-clamp-3 flex-1 text-sm text-muted-foreground", children: post.excerpt }),
79
+ /* @__PURE__ */ jsxs("span", { className: "mt-4 inline-flex items-center gap-1 text-sm font-medium text-primary", children: [
80
+ "Read more",
81
+ /* @__PURE__ */ jsx(ArrowUpRight, { className: "size-4 transition group-hover:translate-x-0.5 group-hover:-translate-y-0.5" })
82
+ ] })
83
+ ] })
84
+ ]
85
+ },
86
+ post.href
87
+ )) })
88
+ ] }) });
89
+ }
90
+ function ContactSection({
91
+ id,
92
+ eyebrow,
93
+ title,
94
+ description,
95
+ email,
96
+ phone,
97
+ address,
98
+ children,
99
+ className
100
+ }) {
101
+ return /* @__PURE__ */ jsx("section", { id, className: cn("ds-mkt-section-soft px-4 py-20", className), children: /* @__PURE__ */ jsx("div", { className: "container mx-auto max-w-6xl", children: /* @__PURE__ */ jsxs("div", { className: "grid gap-12 lg:grid-cols-2 lg:gap-16", children: [
102
+ /* @__PURE__ */ jsxs("div", { children: [
103
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-primary", children: eyebrow }),
104
+ /* @__PURE__ */ jsx("h2", { className: "mt-2 text-3xl font-bold tracking-tight sm:text-4xl", children: title }),
105
+ description && /* @__PURE__ */ jsx("p", { className: "mt-4 text-lg text-muted-foreground", children: description }),
106
+ /* @__PURE__ */ jsxs("ul", { className: "mt-10 space-y-6 text-sm", children: [
107
+ email && /* @__PURE__ */ jsxs("li", { className: "flex gap-4", children: [
108
+ /* @__PURE__ */ jsx("span", { className: "flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-primary/10 text-primary shadow-sm", children: /* @__PURE__ */ jsx(Mail, { className: "size-5", "aria-hidden": true }) }),
109
+ /* @__PURE__ */ jsxs("div", { children: [
110
+ /* @__PURE__ */ jsx("p", { className: "font-medium text-foreground", children: "Email" }),
111
+ /* @__PURE__ */ jsx(
112
+ "a",
113
+ {
114
+ href: `mailto:${email}`,
115
+ className: "text-muted-foreground underline-offset-4 transition-colors hover:text-foreground hover:underline",
116
+ children: email
117
+ }
118
+ )
119
+ ] })
120
+ ] }),
121
+ phone && /* @__PURE__ */ jsxs("li", { className: "flex gap-4", children: [
122
+ /* @__PURE__ */ jsx("span", { className: "flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-primary/10 text-primary shadow-sm", children: /* @__PURE__ */ jsx(Phone, { className: "size-5", "aria-hidden": true }) }),
123
+ /* @__PURE__ */ jsxs("div", { children: [
124
+ /* @__PURE__ */ jsx("p", { className: "font-medium text-foreground", children: "Phone" }),
125
+ /* @__PURE__ */ jsx(
126
+ "a",
127
+ {
128
+ href: `tel:${phone.replace(/\s/g, "")}`,
129
+ className: "text-muted-foreground underline-offset-4 transition-colors hover:text-foreground hover:underline",
130
+ children: phone
131
+ }
132
+ )
133
+ ] })
134
+ ] }),
135
+ address && /* @__PURE__ */ jsxs("li", { className: "flex gap-4", children: [
136
+ /* @__PURE__ */ jsx("span", { className: "flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-primary/10 text-primary shadow-sm", children: /* @__PURE__ */ jsx(MapPin, { className: "size-5", "aria-hidden": true }) }),
137
+ /* @__PURE__ */ jsxs("div", { children: [
138
+ /* @__PURE__ */ jsx("p", { className: "font-medium text-foreground", children: "Studio" }),
139
+ /* @__PURE__ */ jsx("p", { className: "text-muted-foreground whitespace-pre-line", children: address })
140
+ ] })
141
+ ] })
142
+ ] })
143
+ ] }),
144
+ children && /* @__PURE__ */ jsx("div", { className: "ds-mkt-surface-elevated rounded-3xl border-0 p-6 sm:p-8 lg:p-10", children })
145
+ ] }) }) });
146
+ }
147
+ function CtaBanner({
148
+ id,
149
+ title,
150
+ description,
151
+ primaryAction,
152
+ secondaryAction,
153
+ variant = "gradient",
154
+ className
155
+ }) {
156
+ const isGradient = variant === "gradient";
157
+ return /* @__PURE__ */ jsx(
158
+ "section",
159
+ {
160
+ id,
161
+ className: cn(
162
+ "px-4 py-20 sm:py-24",
163
+ isGradient && "ds-mkt-cta-shell",
164
+ variant === "solid" && "ds-mkt-cta-solid-shell text-primary-foreground",
165
+ className
166
+ ),
167
+ children: /* @__PURE__ */ jsxs(
168
+ "div",
169
+ {
170
+ className: cn(
171
+ "container mx-auto max-w-3xl text-center",
172
+ isGradient && "ds-mkt-cta-panel px-6 py-10 sm:px-12 sm:py-12",
173
+ variant === "solid" && "ds-mkt-cta-solid-panel px-6 py-10 sm:px-12 sm:py-12"
174
+ ),
175
+ children: [
176
+ /* @__PURE__ */ jsx(
177
+ "h2",
178
+ {
179
+ className: cn(
180
+ "text-2xl font-bold tracking-tight sm:text-3xl",
181
+ isGradient && "text-foreground",
182
+ variant === "solid" && "text-primary-foreground"
183
+ ),
184
+ children: title
185
+ }
186
+ ),
187
+ description && /* @__PURE__ */ jsx(
188
+ "p",
189
+ {
190
+ className: cn(
191
+ "mx-auto mt-4 max-w-xl text-lg leading-relaxed",
192
+ isGradient && "text-muted-foreground",
193
+ variant === "solid" && "text-primary-foreground/90"
194
+ ),
195
+ children: description
196
+ }
197
+ ),
198
+ (primaryAction || secondaryAction) && /* @__PURE__ */ jsxs("div", { className: "mt-10 flex flex-col items-center justify-center gap-4 sm:flex-row sm:gap-5", children: [
199
+ primaryAction && /* @__PURE__ */ jsx(
200
+ Button,
201
+ {
202
+ asChild: true,
203
+ size: "lg",
204
+ variant: variant === "solid" ? "secondary" : "default",
205
+ className: cn(
206
+ "min-h-12 px-8 text-base font-semibold",
207
+ isGradient && "ds-mkt-hero-cta-primary",
208
+ variant === "solid" && "!bg-primary-foreground !text-primary shadow-lg shadow-black/10"
209
+ ),
210
+ children: /* @__PURE__ */ jsx("a", { href: primaryAction.href, children: primaryAction.label })
211
+ }
212
+ ),
213
+ secondaryAction && /* @__PURE__ */ jsx(
214
+ Button,
215
+ {
216
+ asChild: true,
217
+ size: "lg",
218
+ variant: "outline",
219
+ className: cn(
220
+ "min-h-12 border-0 px-8 text-base font-semibold shadow-none",
221
+ isGradient && "ds-mkt-hero-cta-secondary bg-transparent hover:bg-transparent",
222
+ variant === "solid" && "border-2 !border-primary-foreground/35 !bg-transparent !text-primary-foreground hover:!bg-primary-foreground/10"
223
+ ),
224
+ children: /* @__PURE__ */ jsx("a", { href: secondaryAction.href, children: secondaryAction.label })
225
+ }
226
+ )
227
+ ] })
228
+ ]
229
+ }
230
+ )
231
+ }
232
+ );
233
+ }
234
+ var DEFAULT_PALETTE = "@%#*+=-:.";
235
+ function DefaultCenterMark() {
236
+ return /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", className: "h-7 w-7 text-white", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M12 3 21 19H3L12 3Z" }) });
237
+ }
238
+ function beamIntensity(px, py, ox, oy, cx, cy, beamWidth) {
239
+ const vx = cx - ox;
240
+ const vy = cy - oy;
241
+ const len = Math.hypot(vx, vy) || 1;
242
+ const ux = vx / len;
243
+ const uy = vy / len;
244
+ const wx = px - ox;
245
+ const wy = py - oy;
246
+ const t = wx * ux + wy * uy;
247
+ const clampedT = Math.max(-len * 0.15, Math.min(len * 1.25, t));
248
+ const projX = ox + ux * clampedT;
249
+ const projY = oy + uy * clampedT;
250
+ const dist = Math.hypot(px - projX, py - projY);
251
+ const along = t / len;
252
+ const cone = Math.max(0, 1 - along * 0.35);
253
+ const gauss = Math.exp(-(dist * dist) / (beamWidth * beamWidth * cone * cone + 1e-6));
254
+ const edgeFade = Math.min(1, Math.max(0, 1.12 - along));
255
+ return (gauss * edgeFade * cone) ** 1.35;
256
+ }
257
+ function ErrorSpotlight({
258
+ title = "Something went wrong",
259
+ description,
260
+ centerContent,
261
+ symbolPalette = DEFAULT_PALETTE,
262
+ cellSize = 11,
263
+ className
264
+ }) {
265
+ const wrapRef = React.useRef(null);
266
+ const canvasRef = React.useRef(null);
267
+ const cursorRef = React.useRef({ x: 0.5, y: 0.35 });
268
+ const rafRef = React.useRef(0);
269
+ const palette = React.useMemo(() => {
270
+ const chars = [...symbolPalette.replace(/\s+/g, "")];
271
+ return chars.length > 0 ? chars : [...DEFAULT_PALETTE.replace(/\s+/g, "")];
272
+ }, [symbolPalette]);
273
+ const draw = React.useCallback(() => {
274
+ const canvas = canvasRef.current;
275
+ const section = wrapRef.current;
276
+ if (!canvas || !section) return;
277
+ const dpr = Math.min(2, typeof window !== "undefined" ? window.devicePixelRatio || 1 : 1);
278
+ const w = section.clientWidth;
279
+ const h = section.clientHeight;
280
+ if (w < 1 || h < 1) return;
281
+ canvas.width = Math.floor(w * dpr);
282
+ canvas.height = Math.floor(h * dpr);
283
+ canvas.style.width = `${w}px`;
284
+ canvas.style.height = `${h}px`;
285
+ const ctx = canvas.getContext("2d");
286
+ if (!ctx) return;
287
+ ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
288
+ ctx.fillStyle = "#000000";
289
+ ctx.fillRect(0, 0, w, h);
290
+ const ox = w * 0.5;
291
+ const oy = h - 56;
292
+ const cx = cursorRef.current.x * w;
293
+ const cy = cursorRef.current.y * h;
294
+ const beamW = Math.max(28, Math.min(w, h) * 0.09);
295
+ ctx.textBaseline = "middle";
296
+ ctx.textAlign = "center";
297
+ ctx.font = `${Math.max(8, cellSize - 2)}px ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace`;
298
+ const step = Math.max(6, cellSize);
299
+ const cutoff = 0.045;
300
+ for (let py = step * 0.5; py < h; py += step) {
301
+ for (let px = step * 0.5; px < w; px += step) {
302
+ const raw = beamIntensity(px, py, ox, oy, cx, cy, beamW);
303
+ if (raw < cutoff) continue;
304
+ const intensity = Math.min(1, (raw - cutoff) / (1 - cutoff));
305
+ const idx = Math.floor((1 - intensity) * (palette.length - 1));
306
+ const ch = palette[Math.max(0, Math.min(palette.length - 1, idx))];
307
+ const alpha = 0.08 + intensity ** 1.15 * 0.92;
308
+ ctx.fillStyle = `rgba(255,255,255,${alpha})`;
309
+ ctx.fillText(ch, px, py);
310
+ }
311
+ }
312
+ }, [cellSize, palette]);
313
+ const scheduleDraw = React.useCallback(() => {
314
+ if (rafRef.current) cancelAnimationFrame(rafRef.current);
315
+ rafRef.current = requestAnimationFrame(() => {
316
+ rafRef.current = 0;
317
+ draw();
318
+ });
319
+ }, [draw]);
320
+ React.useEffect(() => {
321
+ const section = wrapRef.current;
322
+ if (!section) return;
323
+ const ro = new ResizeObserver(() => scheduleDraw());
324
+ ro.observe(section);
325
+ scheduleDraw();
326
+ return () => {
327
+ ro.disconnect();
328
+ if (rafRef.current) cancelAnimationFrame(rafRef.current);
329
+ };
330
+ }, [scheduleDraw]);
331
+ const onPointerMove = (event) => {
332
+ const el = event.currentTarget;
333
+ const rect = el.getBoundingClientRect();
334
+ cursorRef.current = {
335
+ x: (event.clientX - rect.left) / rect.width,
336
+ y: (event.clientY - rect.top) / rect.height
337
+ };
338
+ scheduleDraw();
339
+ };
340
+ return /* @__PURE__ */ jsxs(
341
+ "section",
342
+ {
343
+ ref: wrapRef,
344
+ className: cn(
345
+ "relative isolate min-h-screen w-full cursor-crosshair overflow-hidden bg-black text-white",
346
+ className
347
+ ),
348
+ onPointerMove,
349
+ children: [
350
+ /* @__PURE__ */ jsx(
351
+ "canvas",
352
+ {
353
+ ref: canvasRef,
354
+ "aria-hidden": "true",
355
+ className: "pointer-events-none absolute inset-0 h-full w-full"
356
+ }
357
+ ),
358
+ /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-x-0 top-[38%] flex justify-center px-6 text-center", children: /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
359
+ /* @__PURE__ */ jsx("h1", { className: "text-3xl font-semibold tracking-tight text-white/90 md:text-4xl", children: title }),
360
+ description && /* @__PURE__ */ jsx("p", { className: "mx-auto max-w-xl text-sm text-white/55 md:text-base", children: description })
361
+ ] }) }),
362
+ /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 flex items-end justify-center pb-14", children: /* @__PURE__ */ jsx("div", { className: "relative flex flex-col items-center", children: /* @__PURE__ */ jsx("div", { className: "grid place-items-center rounded-full border border-white/20 bg-black/40 p-2.5 backdrop-blur-[2px]", children: centerContent ?? /* @__PURE__ */ jsx(DefaultCenterMark, {}) }) }) })
363
+ ]
364
+ }
365
+ );
366
+ }
367
+ function FaqSection({ id, eyebrow, title, description, items, className }) {
368
+ return /* @__PURE__ */ jsx("section", { id, className: cn("px-4 py-20", className), children: /* @__PURE__ */ jsxs("div", { className: "container mx-auto max-w-3xl", children: [
369
+ (eyebrow || title || description) && /* @__PURE__ */ jsxs("div", { className: "mb-12 text-center", children: [
370
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-primary", children: eyebrow }),
371
+ title && /* @__PURE__ */ jsx("h2", { className: "mt-2 text-3xl font-bold tracking-tight sm:text-4xl", children: title }),
372
+ description && /* @__PURE__ */ jsx("p", { className: "mx-auto mt-4 max-w-xl text-lg text-muted-foreground", children: description })
373
+ ] }),
374
+ /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-4", children: items.map((item) => /* @__PURE__ */ jsxs(
375
+ "details",
376
+ {
377
+ className: "group ds-mkt-surface-elevated rounded-2xl border-0 px-6 py-2 transition-colors open:bg-card/80",
378
+ children: [
379
+ /* @__PURE__ */ jsxs("summary", { className: "flex cursor-pointer list-none items-center justify-between gap-4 py-4 font-medium text-foreground [&::-webkit-details-marker]:hidden", children: [
380
+ item.question,
381
+ /* @__PURE__ */ jsx(
382
+ ChevronDown,
383
+ {
384
+ className: "size-5 shrink-0 text-muted-foreground transition-transform duration-300 group-open:rotate-180",
385
+ "aria-hidden": true
386
+ }
387
+ )
388
+ ] }),
389
+ /* @__PURE__ */ jsx("div", { className: "border-t border-border/40 pb-4 pt-0 text-muted-foreground leading-relaxed", children: item.answer })
390
+ ]
391
+ },
392
+ item.question
393
+ )) })
394
+ ] }) });
395
+ }
396
+ function FeatureMedia({
397
+ id,
398
+ title,
399
+ description,
400
+ eyebrow,
401
+ image,
402
+ media,
403
+ imagePosition = "left",
404
+ className
405
+ }) {
406
+ const mediaBlock = media ?? (image ? /* @__PURE__ */ jsx(
407
+ "img",
408
+ {
409
+ src: image.src,
410
+ alt: image.alt,
411
+ className: cn(
412
+ "h-full w-full object-cover transition-transform duration-500 hover:scale-[1.02]",
413
+ image.className
414
+ ),
415
+ width: 640,
416
+ height: 480,
417
+ loading: "lazy",
418
+ decoding: "async"
419
+ }
420
+ ) : null);
421
+ const textBlock = /* @__PURE__ */ jsxs("div", { className: "flex flex-col justify-center space-y-4", children: [
422
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-primary", children: eyebrow }),
423
+ /* @__PURE__ */ jsx("h3", { className: "text-2xl font-bold tracking-tight sm:text-3xl", children: title }),
424
+ /* @__PURE__ */ jsx("p", { className: "text-lg text-muted-foreground", children: description })
425
+ ] });
426
+ const isLeft = imagePosition === "left";
427
+ return /* @__PURE__ */ jsx(
428
+ "div",
429
+ {
430
+ id,
431
+ className: cn("grid items-center gap-10 py-12 md:gap-16 md:py-16 lg:grid-cols-2", className),
432
+ children: isLeft ? /* @__PURE__ */ jsxs(Fragment, { children: [
433
+ mediaBlock && /* @__PURE__ */ jsx("div", { className: "ds-mkt-media-frame w-full lg:order-none", children: /* @__PURE__ */ jsx("div", { className: "ds-mkt-media-frame-inner relative aspect-[4/3] w-full overflow-hidden bg-muted/30", children: /* @__PURE__ */ jsx("div", { className: "absolute inset-0 [&_img]:h-full [&_img]:w-full [&_img]:object-cover", children: mediaBlock }) }) }),
434
+ textBlock
435
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
436
+ textBlock,
437
+ mediaBlock && /* @__PURE__ */ jsx("div", { className: "ds-mkt-media-frame w-full", children: /* @__PURE__ */ jsx("div", { className: "ds-mkt-media-frame-inner relative aspect-[4/3] w-full overflow-hidden bg-muted/30", children: /* @__PURE__ */ jsx("div", { className: "absolute inset-0 [&_img]:h-full [&_img]:w-full [&_img]:object-cover", children: mediaBlock }) }) })
438
+ ] })
439
+ }
440
+ );
441
+ }
442
+ function Footer({ logo, description, contact, links, attribution, className }) {
443
+ return /* @__PURE__ */ jsx(
444
+ "footer",
445
+ {
446
+ className: cn(
447
+ "ds-mkt-footer-depth w-full border-t border-border/60 text-foreground",
448
+ className
449
+ ),
450
+ children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-7xl px-4 py-12 sm:px-6 lg:px-8", children: [
451
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-10 md:grid-cols-3", children: [
452
+ /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
453
+ /* @__PURE__ */ jsx("div", { className: "flex items-center", children: typeof logo === "string" ? /* @__PURE__ */ jsx("span", { className: "text-lg font-extrabold tracking-tight text-foreground", children: logo }) : logo }),
454
+ description && /* @__PURE__ */ jsx("p", { className: "max-w-xs text-sm leading-relaxed text-muted-foreground", children: description })
455
+ ] }),
456
+ links && links.length > 0 && /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
457
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-foreground", children: "Navigation" }),
458
+ /* @__PURE__ */ jsx("ul", { className: "space-y-2 text-sm text-muted-foreground", children: links.map((link) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
459
+ "a",
460
+ {
461
+ href: link.href,
462
+ className: "inline-flex min-h-[24px] items-center py-0.5 pl-0 hover:text-foreground transition-colors",
463
+ children: link.label
464
+ }
465
+ ) }, link.href)) })
466
+ ] }),
467
+ contact && /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
468
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-foreground", children: "Contact" }),
469
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2 text-sm text-muted-foreground", children: [
470
+ contact.address && /* @__PURE__ */ jsx("p", { className: "leading-relaxed", children: contact.address }),
471
+ contact.phone && /* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx(
472
+ "a",
473
+ {
474
+ href: `tel:${contact.phone}`,
475
+ className: "hover:text-foreground transition-colors",
476
+ children: contact.phone
477
+ }
478
+ ) }),
479
+ contact.email && /* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx(
480
+ "a",
481
+ {
482
+ href: `mailto:${contact.email}`,
483
+ className: "inline-flex min-h-[24px] items-center hover:text-foreground transition-colors",
484
+ children: contact.email
485
+ }
486
+ ) })
487
+ ] })
488
+ ] })
489
+ ] }),
490
+ /* @__PURE__ */ jsxs("div", { className: "mt-10 border-t border-border pt-8 text-center text-sm text-muted-foreground", children: [
491
+ /* @__PURE__ */ jsxs("p", { children: [
492
+ "\xA9 ",
493
+ (/* @__PURE__ */ new Date()).getFullYear(),
494
+ " All rights reserved."
495
+ ] }),
496
+ attribution && /* @__PURE__ */ jsx("p", { className: "mt-2 text-xs text-muted-foreground/90", children: attribution })
497
+ ] })
498
+ ] })
499
+ }
500
+ );
501
+ }
502
+ function Hero({
503
+ id,
504
+ subtitle,
505
+ title,
506
+ description,
507
+ primaryAction,
508
+ secondaryAction,
509
+ className
510
+ }) {
511
+ return /* @__PURE__ */ jsx(
512
+ "section",
513
+ {
514
+ id,
515
+ className: cn(
516
+ "ds-mkt-hero-mesh flex min-h-[80vh] flex-col items-center justify-center px-4 py-20 text-center",
517
+ className
518
+ ),
519
+ children: /* @__PURE__ */ jsxs("div", { className: "container mx-auto max-w-4xl space-y-6", children: [
520
+ subtitle && /* @__PURE__ */ jsx("p", { className: "text-lg font-medium text-muted-foreground", children: subtitle }),
521
+ /* @__PURE__ */ jsx("h1", { className: "text-4xl font-bold tracking-tight sm:text-5xl md:text-6xl lg:text-7xl", children: title }),
522
+ description && /* @__PURE__ */ jsx("p", { className: "mx-auto max-w-2xl text-lg text-muted-foreground sm:text-xl", children: description }),
523
+ (primaryAction || secondaryAction) && /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center gap-4 sm:flex-row", children: [
524
+ primaryAction && /* @__PURE__ */ jsx(
525
+ Button,
526
+ {
527
+ asChild: true,
528
+ size: "lg",
529
+ className: "ds-mkt-hero-cta-primary min-h-12 px-8 text-base font-semibold",
530
+ children: /* @__PURE__ */ jsx("a", { href: primaryAction.href, children: primaryAction.label })
531
+ }
532
+ ),
533
+ secondaryAction && /* @__PURE__ */ jsx(
534
+ Button,
535
+ {
536
+ asChild: true,
537
+ variant: "outline",
538
+ size: "lg",
539
+ className: "ds-mkt-hero-cta-secondary min-h-12 border-0 px-8 text-base font-semibold bg-transparent shadow-none hover:bg-transparent",
540
+ children: /* @__PURE__ */ jsx("a", { href: secondaryAction.href, children: secondaryAction.label })
541
+ }
542
+ )
543
+ ] })
544
+ ] })
545
+ }
546
+ );
547
+ }
548
+ function HeroSplit({
549
+ id,
550
+ subtitle,
551
+ title,
552
+ description,
553
+ primaryAction,
554
+ secondaryAction,
555
+ image,
556
+ media,
557
+ decorative = true,
558
+ className
559
+ }) {
560
+ const mediaContent = media ?? (image ? /* @__PURE__ */ jsx(
561
+ "img",
562
+ {
563
+ src: image.src,
564
+ alt: image.alt,
565
+ className: cn(
566
+ "absolute inset-0 h-full w-full object-cover",
567
+ decorative && "ds-mkt-media-float",
568
+ image.className
569
+ ),
570
+ width: 800,
571
+ height: 600,
572
+ loading: "eager",
573
+ decoding: "async"
574
+ }
575
+ ) : null);
576
+ return /* @__PURE__ */ jsx(
577
+ "section",
578
+ {
579
+ id,
580
+ className: cn(
581
+ "relative overflow-hidden px-4 py-16 sm:py-24 lg:py-28",
582
+ decorative && "ds-mkt-gradient-bg ds-mkt-hero-split-stage",
583
+ className
584
+ ),
585
+ children: /* @__PURE__ */ jsx("div", { className: "ds-mkt-hero-split-content container mx-auto max-w-7xl", children: /* @__PURE__ */ jsxs("div", { className: "grid items-center gap-12 lg:grid-cols-2 lg:gap-16", children: [
586
+ /* @__PURE__ */ jsxs("div", { className: "space-y-6 text-center lg:text-left", children: [
587
+ subtitle && /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-muted-foreground", children: subtitle }),
588
+ /* @__PURE__ */ jsx("h1", { className: "text-4xl font-bold tracking-tight sm:text-5xl lg:text-6xl", children: title }),
589
+ description && /* @__PURE__ */ jsx("p", { className: "mx-auto max-w-xl text-lg text-muted-foreground lg:mx-0", children: description }),
590
+ (primaryAction || secondaryAction) && /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center gap-4 sm:flex-row lg:justify-start", children: [
591
+ primaryAction && /* @__PURE__ */ jsx(
592
+ Button,
593
+ {
594
+ asChild: true,
595
+ size: "lg",
596
+ className: "ds-mkt-hero-cta-primary min-h-12 px-8 text-base font-semibold",
597
+ children: /* @__PURE__ */ jsx("a", { href: primaryAction.href, children: primaryAction.label })
598
+ }
599
+ ),
600
+ secondaryAction && /* @__PURE__ */ jsx(
601
+ Button,
602
+ {
603
+ asChild: true,
604
+ variant: "outline",
605
+ size: "lg",
606
+ className: "ds-mkt-hero-cta-secondary min-h-12 border-0 px-8 text-base font-semibold bg-transparent shadow-none hover:bg-transparent",
607
+ children: /* @__PURE__ */ jsx("a", { href: secondaryAction.href, children: secondaryAction.label })
608
+ }
609
+ )
610
+ ] })
611
+ ] }),
612
+ mediaContent && /* @__PURE__ */ jsx(
613
+ "div",
614
+ {
615
+ className: cn(
616
+ "relative mx-auto w-full max-w-lg lg:max-w-none",
617
+ decorative && "ds-mkt-fade-up"
618
+ ),
619
+ children: /* @__PURE__ */ jsx("div", { className: "ds-mkt-media-frame", children: /* @__PURE__ */ jsx("div", { className: "ds-mkt-media-frame-inner relative aspect-[4/3] w-full overflow-hidden", children: /* @__PURE__ */ jsx("div", { className: "absolute inset-0 [&_iframe]:h-full [&_iframe]:w-full [&_iframe]:border-0 [&_video]:h-full [&_video]:w-full [&_video]:object-cover", children: mediaContent }) }) })
620
+ }
621
+ )
622
+ ] }) })
623
+ }
624
+ );
625
+ }
626
+ function LogoCloud({ id, title, logos, className }) {
627
+ return /* @__PURE__ */ jsx("section", { id, className: cn("border-y border-border/40 bg-muted/15 px-4 py-14", className), children: /* @__PURE__ */ jsxs("div", { className: "container mx-auto max-w-6xl", children: [
628
+ title && /* @__PURE__ */ jsx("p", { className: "mb-10 text-center text-sm font-medium text-muted-foreground", children: title }),
629
+ /* @__PURE__ */ jsx("div", { className: "ds-mkt-logo-rail flex flex-wrap items-center justify-center gap-x-10 gap-y-8 px-8 py-10 md:gap-x-14", children: logos.map((logo) => {
630
+ const img = /* @__PURE__ */ jsx(
631
+ "img",
632
+ {
633
+ src: logo.src,
634
+ alt: logo.alt,
635
+ className: "h-8 w-auto max-w-[120px] object-contain opacity-60 grayscale transition-opacity hover:opacity-100 md:h-9",
636
+ loading: "lazy",
637
+ decoding: "async"
638
+ }
639
+ );
640
+ return /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center", children: logo.href ? /* @__PURE__ */ jsx(
641
+ "a",
642
+ {
643
+ href: logo.href,
644
+ className: "inline-flex focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded",
645
+ rel: "noopener noreferrer",
646
+ target: "_blank",
647
+ children: img
648
+ }
649
+ ) : img }, `${logo.src}-${logo.alt}`);
650
+ }) })
651
+ ] }) });
652
+ }
653
+ function Navigation({
654
+ logo,
655
+ logoHref,
656
+ links,
657
+ cta,
658
+ languageSwitcher,
659
+ className
660
+ }) {
661
+ const [mobileMenuOpen, setMobileMenuOpen] = React.useState(false);
662
+ const [languageMenuOpen, setLanguageMenuOpen] = React.useState(false);
663
+ const languageMenuRef = React.useRef(null);
664
+ React.useEffect(() => {
665
+ const handlePointerDown = (event) => {
666
+ if (!languageMenuRef.current) return;
667
+ const target = event.target;
668
+ if (!languageMenuRef.current.contains(target)) {
669
+ setLanguageMenuOpen(false);
670
+ }
671
+ };
672
+ const handleEscape = (event) => {
673
+ if (event.key === "Escape") {
674
+ setLanguageMenuOpen(false);
675
+ }
676
+ };
677
+ document.addEventListener("pointerdown", handlePointerDown);
678
+ document.addEventListener("keydown", handleEscape);
679
+ return () => {
680
+ document.removeEventListener("pointerdown", handlePointerDown);
681
+ document.removeEventListener("keydown", handleEscape);
682
+ };
683
+ }, []);
684
+ React.useEffect(() => {
685
+ const previousOverflow = document.body.style.overflow;
686
+ document.body.style.overflow = mobileMenuOpen ? "hidden" : "";
687
+ return () => {
688
+ document.body.style.overflow = previousOverflow;
689
+ };
690
+ }, [mobileMenuOpen]);
691
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
692
+ /* @__PURE__ */ jsx(
693
+ "nav",
694
+ {
695
+ className: cn(
696
+ "fixed top-0 left-0 right-0 z-50 w-full border-b border-border/60 bg-background/90 shadow-[0_8px_30px_-12px_color-mix(in_oklch,var(--foreground)_12%,transparent)] backdrop-blur-md supports-backdrop-filter:bg-background/55",
697
+ className
698
+ ),
699
+ children: /* @__PURE__ */ jsxs("div", { className: "mx-auto flex h-16 w-full max-w-full items-center justify-between gap-8 px-4 sm:px-6 lg:px-8", children: [
700
+ /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center", children: typeof logo === "string" ? logoHref ? /* @__PURE__ */ jsx(
701
+ "a",
702
+ {
703
+ href: logoHref,
704
+ "aria-label": "Go to top",
705
+ className: "text-xl font-bold tracking-tight text-foreground sm:text-2xl",
706
+ children: logo
707
+ }
708
+ ) : /* @__PURE__ */ jsx("span", { className: "text-xl font-bold tracking-tight text-foreground sm:text-2xl", children: logo }) : logo }),
709
+ /* @__PURE__ */ jsx("div", { className: "hidden flex-1 items-center justify-center gap-6 md:flex", children: links.map((link) => /* @__PURE__ */ jsx(
710
+ "a",
711
+ {
712
+ href: link.href,
713
+ className: "text-sm font-medium text-muted-foreground transition-colors hover:text-foreground",
714
+ children: link.label
715
+ },
716
+ link.href
717
+ )) }),
718
+ /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-3", children: [
719
+ languageSwitcher && /* @__PURE__ */ jsxs("div", { className: "relative", ref: languageMenuRef, children: [
720
+ /* @__PURE__ */ jsx(
721
+ Button,
722
+ {
723
+ type: "button",
724
+ variant: "outline",
725
+ size: "icon",
726
+ className: "size-9 border-border/60 bg-background/80 backdrop-blur-sm",
727
+ onClick: () => setLanguageMenuOpen((open) => !open),
728
+ "aria-label": languageSwitcher.ariaLabel ?? "Select language",
729
+ "aria-expanded": languageMenuOpen,
730
+ "aria-haspopup": "menu",
731
+ children: /* @__PURE__ */ jsx(Globe, { className: "h-4 w-4" })
732
+ }
733
+ ),
734
+ /* @__PURE__ */ jsx(
735
+ "div",
736
+ {
737
+ role: "menu",
738
+ "aria-label": languageSwitcher.ariaLabel,
739
+ className: cn(
740
+ "absolute right-0 top-full z-120 mt-2 flex min-w-36 flex-col gap-1 rounded-md border border-border bg-popover p-1 shadow-md",
741
+ languageMenuOpen ? "flex" : "hidden"
742
+ ),
743
+ children: languageSwitcher.options.map((option) => {
744
+ const isActive = option.code === languageSwitcher.currentCode;
745
+ return /* @__PURE__ */ jsx(
746
+ "a",
747
+ {
748
+ href: option.href,
749
+ role: "menuitem",
750
+ className: cn(
751
+ "block w-full rounded-sm px-2 py-1.5 text-sm transition-colors hover:bg-accent hover:text-accent-foreground",
752
+ isActive && "bg-accent/80 font-semibold text-foreground"
753
+ ),
754
+ onClick: () => setLanguageMenuOpen(false),
755
+ children: option.label
756
+ },
757
+ option.code
758
+ );
759
+ })
760
+ }
761
+ )
762
+ ] }),
763
+ cta && /* @__PURE__ */ jsx("div", { className: "hidden md:flex", children: /* @__PURE__ */ jsx(Button, { asChild: true, variant: "default", size: "sm", className: "ds-mkt-btn-primary", children: /* @__PURE__ */ jsx("a", { href: cta.href, children: cta.label }) }) }),
764
+ /* @__PURE__ */ jsx(
765
+ Button,
766
+ {
767
+ type: "button",
768
+ variant: "ghost",
769
+ size: "icon",
770
+ className: "md:hidden min-h-[44px] min-w-[44px]",
771
+ onClick: () => setMobileMenuOpen(true),
772
+ "aria-label": "Open menu",
773
+ "aria-expanded": mobileMenuOpen,
774
+ children: /* @__PURE__ */ jsx(Menu, { className: "h-5 w-5" })
775
+ }
776
+ )
777
+ ] })
778
+ ] })
779
+ }
780
+ ),
781
+ /* @__PURE__ */ jsxs(
782
+ "div",
783
+ {
784
+ role: "dialog",
785
+ "aria-modal": "true",
786
+ "aria-label": "Menu",
787
+ className: cn(
788
+ "fixed inset-0 top-0 z-100 md:hidden",
789
+ mobileMenuOpen ? "pointer-events-auto" : "pointer-events-none"
790
+ ),
791
+ children: [
792
+ /* @__PURE__ */ jsx(
793
+ "div",
794
+ {
795
+ className: cn(
796
+ "fixed inset-0 bg-foreground/20 backdrop-blur-sm transition-opacity duration-300",
797
+ mobileMenuOpen ? "opacity-100" : "opacity-0"
798
+ ),
799
+ onClick: () => setMobileMenuOpen(false),
800
+ "aria-hidden": "true"
801
+ }
802
+ ),
803
+ /* @__PURE__ */ jsxs(
804
+ "div",
805
+ {
806
+ className: cn(
807
+ "fixed inset-y-0 right-0 top-0 z-101 flex h-full w-[min(320px,85vw)] max-w-full flex-col shadow-2xl transition-transform duration-300 ease-out",
808
+ "bg-[linear-gradient(180deg,hsl(0_0%_100%)_0%,hsl(199_50%_97%)_50%,hsl(199_60%_94%)_100%)]",
809
+ mobileMenuOpen ? "translate-x-0" : "translate-x-full"
810
+ ),
811
+ children: [
812
+ /* @__PURE__ */ jsxs("div", { className: "flex h-16 shrink-0 items-center justify-between border-b border-border/60 px-5", children: [
813
+ /* @__PURE__ */ jsx("div", { onClick: () => setMobileMenuOpen(false), children: typeof logo === "string" ? logoHref ? /* @__PURE__ */ jsx(
814
+ "a",
815
+ {
816
+ href: logoHref,
817
+ "aria-label": "Go to top",
818
+ className: "text-xl font-bold tracking-tight text-foreground",
819
+ children: logo
820
+ }
821
+ ) : /* @__PURE__ */ jsx("span", { className: "text-xl font-bold tracking-tight text-foreground", children: logo }) : logo }),
822
+ /* @__PURE__ */ jsx(
823
+ Button,
824
+ {
825
+ type: "button",
826
+ variant: "ghost",
827
+ size: "icon",
828
+ className: "min-h-[44px] min-w-[44px] rounded-full text-muted-foreground hover:bg-muted hover:text-foreground",
829
+ onClick: () => setMobileMenuOpen(false),
830
+ "aria-label": "Close menu",
831
+ children: /* @__PURE__ */ jsx(X, { className: "h-5 w-5" })
832
+ }
833
+ )
834
+ ] }),
835
+ /* @__PURE__ */ jsxs("nav", { className: "flex flex-1 flex-col gap-0.5 overflow-y-auto px-4 py-5", children: [
836
+ links.map((link) => /* @__PURE__ */ jsx(
837
+ "a",
838
+ {
839
+ href: link.href,
840
+ className: "rounded-lg px-4 py-3.5 text-base font-medium text-foreground transition-colors hover:bg-muted hover:text-primary",
841
+ onClick: () => setMobileMenuOpen(false),
842
+ children: link.label
843
+ },
844
+ link.href
845
+ )),
846
+ cta && /* @__PURE__ */ jsx("div", { className: "mt-6 px-4", children: /* @__PURE__ */ jsx(
847
+ Button,
848
+ {
849
+ asChild: true,
850
+ variant: "default",
851
+ className: "ds-mkt-btn-primary w-full min-h-[48px]",
852
+ size: "lg",
853
+ children: /* @__PURE__ */ jsx("a", { href: cta.href, onClick: () => setMobileMenuOpen(false), children: cta.label })
854
+ }
855
+ ) })
856
+ ] })
857
+ ]
858
+ }
859
+ )
860
+ ]
861
+ }
862
+ )
863
+ ] });
864
+ }
865
+ function Newsletter({
866
+ id,
867
+ title,
868
+ description,
869
+ placeholder = "you@company.com",
870
+ buttonLabel = "Subscribe",
871
+ formAction,
872
+ formMethod = "post",
873
+ inputName = "email",
874
+ children,
875
+ className
876
+ }) {
877
+ return /* @__PURE__ */ jsx("section", { id, className: cn("px-4 py-16", className), children: /* @__PURE__ */ jsx("div", { className: "container mx-auto max-w-2xl", children: /* @__PURE__ */ jsxs(
878
+ "div",
879
+ {
880
+ className: cn(
881
+ "ds-mkt-surface-elevated overflow-hidden rounded-3xl p-8 sm:p-10",
882
+ "bg-gradient-to-br from-card via-card to-primary/5"
883
+ ),
884
+ children: [
885
+ /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
886
+ /* @__PURE__ */ jsx("h2", { className: "text-2xl font-bold tracking-tight sm:text-3xl", children: title }),
887
+ description && /* @__PURE__ */ jsx("p", { className: "mt-3 text-muted-foreground", children: description })
888
+ ] }),
889
+ /* @__PURE__ */ jsx("div", { className: "mt-8", children: children ? children : formAction ? /* @__PURE__ */ jsxs(
890
+ "form",
891
+ {
892
+ action: formAction,
893
+ method: formMethod,
894
+ className: "flex flex-col gap-3 sm:flex-row sm:items-stretch",
895
+ children: [
896
+ /* @__PURE__ */ jsx(
897
+ Input,
898
+ {
899
+ type: "email",
900
+ name: inputName,
901
+ required: true,
902
+ placeholder,
903
+ autoComplete: "email",
904
+ className: "h-11 flex-1 border-border/60 bg-background/80 shadow-inner"
905
+ }
906
+ ),
907
+ /* @__PURE__ */ jsx(Button, { type: "submit", size: "lg", className: "ds-mkt-btn-primary shrink-0 sm:px-8", children: buttonLabel })
908
+ ]
909
+ }
910
+ ) : /* @__PURE__ */ jsx("p", { className: "text-center text-sm text-muted-foreground", children: "Provide a formAction URL or custom children to wire email capture." }) })
911
+ ]
912
+ }
913
+ ) }) });
914
+ }
915
+ function tierUsesBillingToggle(t) {
916
+ return t.priceMonthly != null && t.priceAnnual != null;
917
+ }
918
+ function resolveTierPrice(tier, interval) {
919
+ if (tierUsesBillingToggle(tier)) {
920
+ return interval === "annual" ? {
921
+ amount: tier.priceAnnual,
922
+ period: tier.periodAnnual ?? "/year"
923
+ } : {
924
+ amount: tier.priceMonthly,
925
+ period: tier.periodMonthly ?? "/mo"
926
+ };
927
+ }
928
+ return { amount: tier.price, period: tier.period };
929
+ }
930
+ function PricingSection({
931
+ id,
932
+ eyebrow,
933
+ title,
934
+ description,
935
+ tiers,
936
+ comparisonRows,
937
+ annualDiscountPercent = 15,
938
+ className
939
+ }) {
940
+ const showBillingToggle = tiers.some(tierUsesBillingToggle);
941
+ const [interval, setInterval] = React.useState("monthly");
942
+ return /* @__PURE__ */ jsx("section", { id, className: cn("ds-mkt-section-soft px-4 py-20 sm:py-24", className), children: /* @__PURE__ */ jsxs("div", { className: "container mx-auto max-w-6xl", children: [
943
+ (eyebrow || title || description) && /* @__PURE__ */ jsxs("div", { className: "mb-12 text-center sm:mb-14", children: [
944
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "text-sm font-semibold uppercase tracking-wider text-primary", children: eyebrow }),
945
+ title && /* @__PURE__ */ jsx("h2", { className: "mt-2 text-3xl font-bold tracking-tight sm:text-4xl", children: title }),
946
+ description && /* @__PURE__ */ jsx("p", { className: "mx-auto mt-4 max-w-2xl text-lg text-muted-foreground", children: description })
947
+ ] }),
948
+ showBillingToggle && /* @__PURE__ */ jsxs("div", { className: "mb-10 flex flex-col items-center gap-3", children: [
949
+ /* @__PURE__ */ jsxs("div", { className: "inline-flex items-center gap-1 rounded-full border border-border/80 bg-background/80 p-1 shadow-sm backdrop-blur-sm", children: [
950
+ /* @__PURE__ */ jsx(
951
+ "button",
952
+ {
953
+ type: "button",
954
+ className: cn(
955
+ "cursor-pointer rounded-full px-4 py-2 text-sm font-medium transition-colors",
956
+ interval === "monthly" ? "bg-primary text-primary-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"
957
+ ),
958
+ onClick: () => setInterval("monthly"),
959
+ children: "Monthly"
960
+ }
961
+ ),
962
+ /* @__PURE__ */ jsx("span", { className: "hidden h-4 w-px bg-border sm:block", "aria-hidden": true }),
963
+ /* @__PURE__ */ jsx(
964
+ "button",
965
+ {
966
+ type: "button",
967
+ className: cn(
968
+ "cursor-pointer rounded-full px-4 py-2 text-sm font-medium transition-colors",
969
+ interval === "annual" ? "bg-primary text-primary-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"
970
+ ),
971
+ onClick: () => setInterval("annual"),
972
+ children: "Annual"
973
+ }
974
+ )
975
+ ] }),
976
+ annualDiscountPercent > 0 && /* @__PURE__ */ jsxs("div", { className: "rounded-full border border-primary/35 bg-primary/10 px-4 py-1.5 text-sm font-semibold text-primary", children: [
977
+ "Save ",
978
+ annualDiscountPercent,
979
+ "% on annual billing"
980
+ ] })
981
+ ] }),
982
+ /* @__PURE__ */ jsx(
983
+ "div",
984
+ {
985
+ className: cn(
986
+ "grid gap-6 lg:gap-8",
987
+ tiers.length === 2 && "md:grid-cols-2",
988
+ tiers.length >= 3 && "md:grid-cols-2 lg:grid-cols-3"
989
+ ),
990
+ children: tiers.map((tier) => {
991
+ const { amount, period } = resolveTierPrice(tier, interval);
992
+ return /* @__PURE__ */ jsxs(
993
+ "div",
994
+ {
995
+ className: cn(
996
+ "ds-mkt-pricing-tier relative flex flex-col overflow-hidden rounded-2xl border border-border/50 bg-gradient-to-b from-card to-muted/25 p-8 shadow-lg transition duration-300",
997
+ tier.highlighted && "z-[1] border-primary/35 shadow-xl ring-2 ring-primary/40 ring-offset-2 ring-offset-background lg:scale-[1.02]"
998
+ ),
999
+ children: [
1000
+ tier.highlighted && /* @__PURE__ */ jsx("span", { className: "absolute -top-px left-1/2 -translate-x-1/2 rounded-b-lg bg-primary px-4 py-1 text-xs font-semibold text-primary-foreground shadow-md", children: "Popular" }),
1001
+ /* @__PURE__ */ jsxs("div", { className: "min-h-[3.25rem]", children: [
1002
+ /* @__PURE__ */ jsx("h3", { className: "text-xl font-bold tracking-tight", children: tier.name }),
1003
+ tier.badge && /* @__PURE__ */ jsx("span", { className: "mt-2 inline-block rounded-full bg-primary/10 px-2.5 py-0.5 text-xs font-medium text-primary", children: tier.badge })
1004
+ ] }),
1005
+ /* @__PURE__ */ jsxs("div", { className: "mt-5", children: [
1006
+ tier.originalPrice && /* @__PURE__ */ jsx("div", { className: "mb-1 text-sm font-medium text-muted-foreground line-through", children: tier.originalPrice }),
1007
+ /* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-1.5", children: [
1008
+ /* @__PURE__ */ jsx("span", { className: "text-4xl font-bold tracking-tight text-foreground", children: amount }),
1009
+ period && /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: period })
1010
+ ] })
1011
+ ] }),
1012
+ tier.description && /* @__PURE__ */ jsx("p", { className: "mt-3 text-sm leading-relaxed text-muted-foreground", children: tier.description }),
1013
+ /* @__PURE__ */ jsx("ul", { className: "mt-8 flex flex-1 flex-col gap-3 text-sm", children: tier.features.map((f) => /* @__PURE__ */ jsxs("li", { className: "flex gap-3", children: [
1014
+ /* @__PURE__ */ jsx("span", { className: "mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-primary/12 text-primary", children: /* @__PURE__ */ jsx(Check, { className: "size-3.5", "aria-hidden": true }) }),
1015
+ /* @__PURE__ */ jsx("span", { className: "leading-snug", children: f })
1016
+ ] }, f)) }),
1017
+ /* @__PURE__ */ jsx(
1018
+ Button,
1019
+ {
1020
+ asChild: true,
1021
+ className: cn(
1022
+ "mt-10 w-full",
1023
+ tier.highlighted ? "ds-mkt-hero-cta-primary min-h-11 font-semibold" : "ds-mkt-btn-secondary min-h-11 font-semibold"
1024
+ ),
1025
+ size: "lg",
1026
+ variant: tier.highlighted ? "default" : "outline",
1027
+ children: /* @__PURE__ */ jsx("a", { href: tier.cta.href, children: tier.cta.label })
1028
+ }
1029
+ )
1030
+ ]
1031
+ },
1032
+ tier.name
1033
+ );
1034
+ })
1035
+ }
1036
+ ),
1037
+ comparisonRows && comparisonRows.length > 0 && /* @__PURE__ */ jsx("div", { className: "mt-16 overflow-x-auto sm:mt-20", children: /* @__PURE__ */ jsxs("div", { className: "ds-mkt-pricing-table min-w-[640px] overflow-hidden rounded-xl border border-border/60 bg-card/50 shadow-sm", children: [
1038
+ /* @__PURE__ */ jsxs(
1039
+ "div",
1040
+ {
1041
+ className: "grid border-b border-border/60 bg-muted/50 text-sm font-medium",
1042
+ style: {
1043
+ gridTemplateColumns: `minmax(10rem,2fr) repeat(${tiers.length}, minmax(0,1fr))`
1044
+ },
1045
+ children: [
1046
+ /* @__PURE__ */ jsx("div", { className: "px-4 py-3 text-left text-muted-foreground", children: "\xA0" }),
1047
+ tiers.map((t) => /* @__PURE__ */ jsx(
1048
+ "div",
1049
+ {
1050
+ className: "border-l border-border/40 px-3 py-3 text-center sm:px-4",
1051
+ children: t.name
1052
+ },
1053
+ t.name
1054
+ ))
1055
+ ]
1056
+ }
1057
+ ),
1058
+ comparisonRows.map((row) => /* @__PURE__ */ jsxs(
1059
+ "div",
1060
+ {
1061
+ className: "grid border-t border-border/50 text-sm",
1062
+ style: {
1063
+ gridTemplateColumns: `minmax(10rem,2fr) repeat(${tiers.length}, minmax(0,1fr))`
1064
+ },
1065
+ children: [
1066
+ /* @__PURE__ */ jsx("div", { className: "px-4 py-3 text-left leading-snug text-foreground", children: row.label }),
1067
+ tiers.map((_, i) => {
1068
+ const cell = row.values[i];
1069
+ return /* @__PURE__ */ jsx(
1070
+ "div",
1071
+ {
1072
+ className: "flex items-center justify-center border-l border-border/40 px-3 py-3 sm:px-4",
1073
+ children: cell === void 0 ? /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "\u2014" }) : typeof cell === "string" ? /* @__PURE__ */ jsx("span", { className: "text-center text-muted-foreground", children: cell }) : cell ? /* @__PURE__ */ jsx(Check, { className: "size-4 shrink-0 text-primary", "aria-label": "Included" }) : /* @__PURE__ */ jsx(
1074
+ "span",
1075
+ {
1076
+ className: "inline-block size-1.5 rounded-full bg-muted-foreground/35",
1077
+ "aria-label": "Not included"
1078
+ }
1079
+ )
1080
+ },
1081
+ `${row.label}-${i}`
1082
+ );
1083
+ })
1084
+ ]
1085
+ },
1086
+ row.label
1087
+ ))
1088
+ ] }) })
1089
+ ] }) });
1090
+ }
1091
+ function ProjectLaunches({
1092
+ id = "projects",
1093
+ eyebrow,
1094
+ title,
1095
+ liveLabel,
1096
+ comingSoonLabel,
1097
+ projects,
1098
+ className
1099
+ }) {
1100
+ return /* @__PURE__ */ jsx("section", { id, className: cn("px-4 py-20 sm:py-24", className), children: /* @__PURE__ */ jsxs("div", { className: "container mx-auto max-w-6xl", children: [
1101
+ /* @__PURE__ */ jsxs("div", { className: "mb-10 text-center sm:mb-12", children: [
1102
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-semibold uppercase tracking-wider text-primary", children: eyebrow }),
1103
+ /* @__PURE__ */ jsx("h2", { className: "mt-2 text-3xl font-bold tracking-tight sm:text-4xl", children: title })
1104
+ ] }),
1105
+ /* @__PURE__ */ jsx("div", { className: "grid gap-5 md:grid-cols-2 lg:grid-cols-3 lg:gap-6", children: projects.map((project) => /* @__PURE__ */ jsxs(
1106
+ "a",
1107
+ {
1108
+ href: project.href,
1109
+ className: "ds-mkt-surface-elevated group flex flex-col rounded-2xl border-0 p-6 transition duration-300 hover:-translate-y-1 hover:shadow-lg",
1110
+ children: [
1111
+ /* @__PURE__ */ jsx(
1112
+ "div",
1113
+ {
1114
+ className: cn(
1115
+ "mb-4 inline-flex w-fit rounded-full px-2.5 py-1 text-xs font-semibold uppercase tracking-wide",
1116
+ project.status === "live" ? "bg-primary/12 text-primary" : "bg-muted text-muted-foreground"
1117
+ ),
1118
+ children: project.status === "live" ? liveLabel : comingSoonLabel
1119
+ }
1120
+ ),
1121
+ /* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold text-foreground group-hover:text-primary", children: project.name }),
1122
+ /* @__PURE__ */ jsx("p", { className: "mt-2 flex-1 text-sm leading-relaxed text-muted-foreground", children: project.description })
1123
+ ]
1124
+ },
1125
+ project.name
1126
+ )) })
1127
+ ] }) });
1128
+ }
1129
+ function PromoBanner({
1130
+ children,
1131
+ href,
1132
+ linkLabel = "Learn more",
1133
+ dismissible = false,
1134
+ className
1135
+ }) {
1136
+ const [open, setOpen] = React.useState(true);
1137
+ if (!open) return null;
1138
+ return /* @__PURE__ */ jsx(
1139
+ "div",
1140
+ {
1141
+ className: cn(
1142
+ "relative z-[60] w-full border-b border-primary/20",
1143
+ "bg-gradient-to-r from-primary/90 via-primary to-primary/85",
1144
+ "text-primary-foreground shadow-md shadow-primary/25",
1145
+ className
1146
+ ),
1147
+ children: /* @__PURE__ */ jsxs(
1148
+ "div",
1149
+ {
1150
+ className: cn(
1151
+ "mx-auto flex max-w-7xl flex-col items-center justify-center gap-3 px-4 py-3 sm:flex-row sm:gap-6 sm:px-6",
1152
+ dismissible && "pr-12 sm:pr-14"
1153
+ ),
1154
+ children: [
1155
+ /* @__PURE__ */ jsx("p", { className: "text-center text-sm font-medium sm:text-base", children }),
1156
+ href && /* @__PURE__ */ jsx(
1157
+ "a",
1158
+ {
1159
+ href,
1160
+ className: "shrink-0 rounded-md bg-primary-foreground/15 px-3 py-1.5 text-sm font-semibold underline-offset-4 transition hover:bg-primary-foreground/25 hover:underline",
1161
+ children: linkLabel
1162
+ }
1163
+ ),
1164
+ dismissible && /* @__PURE__ */ jsx(
1165
+ Button,
1166
+ {
1167
+ type: "button",
1168
+ variant: "ghost",
1169
+ size: "icon",
1170
+ className: "absolute right-2 top-1/2 h-9 w-9 -translate-y-1/2 text-primary-foreground hover:bg-primary-foreground/15",
1171
+ onClick: () => setOpen(false),
1172
+ "aria-label": "Dismiss",
1173
+ children: /* @__PURE__ */ jsx(X, { className: "size-4" })
1174
+ }
1175
+ )
1176
+ ]
1177
+ }
1178
+ )
1179
+ }
1180
+ );
1181
+ }
1182
+ function Section({
1183
+ id,
1184
+ title,
1185
+ subtitle,
1186
+ description,
1187
+ children,
1188
+ variant = "default",
1189
+ className
1190
+ }) {
1191
+ return /* @__PURE__ */ jsx(
1192
+ "section",
1193
+ {
1194
+ id,
1195
+ className: cn(
1196
+ "px-4 py-20",
1197
+ variant === "soft" && "ds-mkt-section-soft",
1198
+ variant === "spotlight" && "ds-mkt-section-spotlight",
1199
+ className
1200
+ ),
1201
+ children: /* @__PURE__ */ jsxs("div", { className: "container mx-auto", children: [
1202
+ (title || subtitle || description) && /* @__PURE__ */ jsxs("div", { className: "mb-12 text-center", children: [
1203
+ subtitle && /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-muted-foreground", children: subtitle }),
1204
+ title && /* @__PURE__ */ jsx("h2", { className: "mt-2 text-3xl font-bold tracking-tight sm:text-4xl", children: title }),
1205
+ description && /* @__PURE__ */ jsx("p", { className: "mx-auto mt-4 max-w-2xl text-lg text-muted-foreground", children: description })
1206
+ ] }),
1207
+ children
1208
+ ] })
1209
+ }
1210
+ );
1211
+ }
1212
+ function ServiceCard({ title, description, icon, className }) {
1213
+ return /* @__PURE__ */ jsxs(
1214
+ Card,
1215
+ {
1216
+ className: cn(
1217
+ "h-full border-0 bg-transparent shadow-none",
1218
+ "ds-mkt-surface-elevated transition duration-300 hover:-translate-y-1",
1219
+ className
1220
+ ),
1221
+ children: [
1222
+ /* @__PURE__ */ jsxs(CardHeader, { children: [
1223
+ icon && /* @__PURE__ */ jsx("div", { className: "mb-4 flex h-12 w-12 items-center justify-center rounded-lg bg-primary/10 text-primary", children: icon }),
1224
+ /* @__PURE__ */ jsx(CardTitle, { children: title })
1225
+ ] }),
1226
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(CardDescription, { className: "text-base", children: description }) })
1227
+ ]
1228
+ }
1229
+ );
1230
+ }
1231
+ function StatsStrip({ id, stats, className }) {
1232
+ return /* @__PURE__ */ jsx("section", { id, className: cn("px-4 py-16", className), children: /* @__PURE__ */ jsx("div", { className: "container mx-auto max-w-6xl", children: /* @__PURE__ */ jsx("dl", { className: "grid grid-cols-2 gap-8 md:grid-cols-4 md:gap-12", children: stats.map((stat) => /* @__PURE__ */ jsxs("div", { className: "text-center ds-mkt-stat-pop", children: [
1233
+ /* @__PURE__ */ jsx("dt", { className: "ds-mkt-stat-value text-3xl font-bold tracking-tight sm:text-4xl", children: stat.value }),
1234
+ /* @__PURE__ */ jsx("dd", { className: "mt-2 text-sm text-muted-foreground", children: stat.label })
1235
+ ] }, stat.label)) }) }) });
1236
+ }
1237
+ function TeamGrid({ id, eyebrow, title, description, members, className }) {
1238
+ return /* @__PURE__ */ jsx("section", { id, className: cn("ds-mkt-section-spotlight px-4 py-20", className), children: /* @__PURE__ */ jsxs("div", { className: "container mx-auto max-w-6xl", children: [
1239
+ (eyebrow || title || description) && /* @__PURE__ */ jsxs("div", { className: "mb-14 text-center", children: [
1240
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-primary", children: eyebrow }),
1241
+ title && /* @__PURE__ */ jsx("h2", { className: "mt-2 text-3xl font-bold tracking-tight sm:text-4xl", children: title }),
1242
+ description && /* @__PURE__ */ jsx("p", { className: "mx-auto mt-4 max-w-2xl text-lg text-muted-foreground", children: description })
1243
+ ] }),
1244
+ /* @__PURE__ */ jsx("div", { className: "grid gap-8 sm:grid-cols-2 lg:grid-cols-3 lg:gap-10", children: members.map((m) => {
1245
+ const body = /* @__PURE__ */ jsxs(Fragment, { children: [
1246
+ /* @__PURE__ */ jsx("div", { className: "ds-mkt-media-frame w-full", children: /* @__PURE__ */ jsx("div", { className: "ds-mkt-media-frame-inner relative aspect-[4/5] w-full overflow-hidden bg-muted", children: m.image ? /* @__PURE__ */ jsx(
1247
+ "img",
1248
+ {
1249
+ src: m.image.src,
1250
+ alt: m.image.alt,
1251
+ className: "absolute inset-0 h-full w-full object-cover",
1252
+ loading: "lazy"
1253
+ }
1254
+ ) : /* @__PURE__ */ jsx("div", { className: "flex h-full min-h-[200px] w-full items-center justify-center bg-gradient-to-br from-primary/20 to-muted text-4xl font-bold text-muted-foreground", children: m.name.slice(0, 1) }) }) }),
1255
+ /* @__PURE__ */ jsxs("div", { className: "mt-5 text-center", children: [
1256
+ /* @__PURE__ */ jsx("p", { className: "font-semibold text-foreground", children: m.name }),
1257
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: m.role })
1258
+ ] })
1259
+ ] });
1260
+ return /* @__PURE__ */ jsx(
1261
+ "div",
1262
+ {
1263
+ className: "ds-mkt-surface-elevated rounded-2xl border-0 p-5 transition duration-300 hover:-translate-y-1",
1264
+ children: m.href ? /* @__PURE__ */ jsx(
1265
+ "a",
1266
+ {
1267
+ href: m.href,
1268
+ className: "block focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-xl",
1269
+ children: body
1270
+ }
1271
+ ) : body
1272
+ },
1273
+ `${m.name}-${m.role}`
1274
+ );
1275
+ }) })
1276
+ ] }) });
1277
+ }
1278
+ function Testimonial({
1279
+ id,
1280
+ quote,
1281
+ attribution,
1282
+ role,
1283
+ avatar,
1284
+ logo,
1285
+ className
1286
+ }) {
1287
+ return /* @__PURE__ */ jsx("section", { id, className: cn("px-4 py-16", className), children: /* @__PURE__ */ jsx("div", { className: "container mx-auto max-w-3xl", children: /* @__PURE__ */ jsxs("div", { className: "ds-mkt-glass-panel px-8 py-12 text-center sm:px-12 sm:py-14", children: [
1288
+ logo && /* @__PURE__ */ jsx("div", { className: "mb-8 flex justify-center", children: /* @__PURE__ */ jsx(
1289
+ "img",
1290
+ {
1291
+ src: logo.src,
1292
+ alt: logo.alt,
1293
+ className: "h-8 w-auto object-contain opacity-90",
1294
+ loading: "lazy"
1295
+ }
1296
+ ) }),
1297
+ /* @__PURE__ */ jsxs("blockquote", { className: "text-xl font-medium leading-relaxed text-foreground sm:text-2xl", children: [
1298
+ "\u201C",
1299
+ quote,
1300
+ "\u201D"
1301
+ ] }),
1302
+ /* @__PURE__ */ jsxs("footer", { className: "mt-8 flex flex-col items-center gap-3 sm:flex-row sm:justify-center", children: [
1303
+ avatar && /* @__PURE__ */ jsx(
1304
+ "img",
1305
+ {
1306
+ src: avatar.src,
1307
+ alt: avatar.alt,
1308
+ className: "h-12 w-12 rounded-full border-2 border-primary/20 object-cover shadow-md",
1309
+ width: 48,
1310
+ height: 48,
1311
+ loading: "lazy"
1312
+ }
1313
+ ),
1314
+ /* @__PURE__ */ jsxs("div", { className: "text-left sm:text-center", children: [
1315
+ /* @__PURE__ */ jsx("cite", { className: "not-italic font-semibold text-foreground", children: attribution }),
1316
+ role && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: role })
1317
+ ] })
1318
+ ] })
1319
+ ] }) }) });
1320
+ }
1321
+ function TrustBadges({ id, title, items, className }) {
1322
+ return /* @__PURE__ */ jsx("section", { id, className: cn("px-4 py-10", className), children: /* @__PURE__ */ jsxs("div", { className: "container mx-auto max-w-5xl", children: [
1323
+ title && /* @__PURE__ */ jsx("p", { className: "mb-6 text-center text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: title }),
1324
+ /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center justify-center gap-3", children: items.map((item) => /* @__PURE__ */ jsxs(
1325
+ "div",
1326
+ {
1327
+ className: cn(
1328
+ "inline-flex items-center gap-2 rounded-full border border-border/60",
1329
+ "bg-gradient-to-b from-card to-muted/30 px-4 py-2 text-sm font-medium text-foreground shadow-sm",
1330
+ "ring-1 ring-border/40 transition hover:border-primary/30 hover:shadow-md"
1331
+ ),
1332
+ children: [
1333
+ item.icon && /* @__PURE__ */ jsx("span", { className: "text-primary [&_svg]:size-4", children: item.icon }),
1334
+ item.label
1335
+ ]
1336
+ },
1337
+ item.label
1338
+ )) })
1339
+ ] }) });
1340
+ }
1341
+ function VideoShowcase({
1342
+ id,
1343
+ title,
1344
+ description,
1345
+ embedUrl,
1346
+ video,
1347
+ titleAttr = "Video",
1348
+ className
1349
+ }) {
1350
+ return /* @__PURE__ */ jsx("section", { id, className: cn("px-4 py-12", className), children: /* @__PURE__ */ jsxs("div", { className: "container mx-auto max-w-5xl", children: [
1351
+ (title || description) && /* @__PURE__ */ jsxs("div", { className: "mb-8 text-center", children: [
1352
+ title && /* @__PURE__ */ jsx("h2", { className: "text-2xl font-bold tracking-tight sm:text-3xl", children: title }),
1353
+ description && /* @__PURE__ */ jsx("p", { className: "mt-3 text-lg text-muted-foreground", children: description })
1354
+ ] }),
1355
+ /* @__PURE__ */ jsx(
1356
+ "div",
1357
+ {
1358
+ className: cn(
1359
+ "relative aspect-video w-full overflow-hidden rounded-xl border border-border/60 bg-muted/40 shadow-lg",
1360
+ "ds-mkt-video-glow"
1361
+ ),
1362
+ children: embedUrl ? /* @__PURE__ */ jsx(
1363
+ "iframe",
1364
+ {
1365
+ title: titleAttr,
1366
+ src: embedUrl,
1367
+ className: "absolute inset-0 h-full w-full",
1368
+ allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
1369
+ allowFullScreen: true
1370
+ }
1371
+ ) : video ? /* @__PURE__ */ jsx(
1372
+ "video",
1373
+ {
1374
+ className: "absolute inset-0 h-full w-full object-cover",
1375
+ controls: video.controls ?? true,
1376
+ playsInline: video.playsInline ?? true,
1377
+ loop: video.loop,
1378
+ muted: video.muted,
1379
+ poster: video.poster,
1380
+ preload: "metadata",
1381
+ children: /* @__PURE__ */ jsx("source", { src: video.src })
1382
+ }
1383
+ ) : null
1384
+ }
1385
+ )
1386
+ ] }) });
1387
+ }
1388
+
1389
+ export { BentoFeatures, BlogTeaser, ContactSection, CtaBanner, ErrorSpotlight, FaqSection, FeatureMedia, Footer, Hero, HeroSplit, LogoCloud, Navigation, Newsletter, PricingSection, ProjectLaunches, PromoBanner, Section, ServiceCard, StatsStrip, TeamGrid, Testimonial, TrustBadges, VideoShowcase };
1390
+ //# sourceMappingURL=chunk-QFKVPVFC.js.map
1391
+ //# sourceMappingURL=chunk-QFKVPVFC.js.map