@web-my-money/blocks 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2205 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-PJO7WJ4G.mjs";
4
+
5
+ // src/fade-up/index.tsx
6
+ import { motion } from "framer-motion";
7
+ import { jsx } from "react/jsx-runtime";
8
+ var SPRING_EASE = [0.22, 1, 0.36, 1];
9
+ function FadeUp({
10
+ children,
11
+ className,
12
+ delay = 0
13
+ }) {
14
+ return /* @__PURE__ */ jsx(
15
+ motion.div,
16
+ {
17
+ className,
18
+ initial: { opacity: 0, y: 30 },
19
+ whileInView: { opacity: 1, y: 0 },
20
+ viewport: { once: true, amount: 0.2 },
21
+ transition: { duration: 0.7, delay, ease: SPRING_EASE },
22
+ style: { willChange: "transform, opacity" },
23
+ children
24
+ }
25
+ );
26
+ }
27
+
28
+ // src/scroll-reveal/index.tsx
29
+ import * as React from "react";
30
+ import { motion as motion2, useInView } from "framer-motion";
31
+ import { jsx as jsx2 } from "react/jsx-runtime";
32
+ var offset = { up: { y: 24 }, down: { y: -24 }, left: { x: 24 }, right: { x: -24 }, none: {} };
33
+ function ScrollReveal({
34
+ children,
35
+ className,
36
+ direction = "up",
37
+ delay = 0,
38
+ once = true,
39
+ amount = 0.3
40
+ }) {
41
+ const ref = React.useRef(null);
42
+ const inView = useInView(ref, { once, amount });
43
+ return /* @__PURE__ */ jsx2(
44
+ motion2.div,
45
+ {
46
+ ref,
47
+ "data-wmm-fx": true,
48
+ className: cn(className),
49
+ initial: { opacity: 0, ...offset[direction] },
50
+ animate: inView ? { opacity: 1, x: 0, y: 0 } : {},
51
+ transition: { duration: 0.5, delay, ease: [0.22, 1, 0.36, 1] },
52
+ children
53
+ }
54
+ );
55
+ }
56
+
57
+ // src/section-label/index.tsx
58
+ import { jsx as jsx3, jsxs } from "react/jsx-runtime";
59
+ function SectionLabel({
60
+ children,
61
+ variant = "pill",
62
+ index,
63
+ dotColor = "var(--primary)",
64
+ className
65
+ }) {
66
+ if (variant === "rule") {
67
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-3", className), children: [
68
+ /* @__PURE__ */ jsx3("div", { className: "h-px flex-1 bg-border" }),
69
+ /* @__PURE__ */ jsx3("span", { className: "text-xs font-semibold uppercase tracking-widest text-muted-foreground", children }),
70
+ /* @__PURE__ */ jsx3("div", { className: "h-px flex-1 bg-border" })
71
+ ] });
72
+ }
73
+ if (variant === "indexed") {
74
+ return /* @__PURE__ */ jsxs("div", { className: cn("inline-flex items-center gap-2.5", className), children: [
75
+ /* @__PURE__ */ jsx3(
76
+ "span",
77
+ {
78
+ className: "flex h-5 w-5 items-center justify-center rounded-full text-[10px] font-bold",
79
+ style: { background: "var(--primary)", color: "var(--primary-foreground)" },
80
+ children: index ?? "\xB7"
81
+ }
82
+ ),
83
+ /* @__PURE__ */ jsx3("span", { className: "text-xs font-semibold uppercase tracking-widest text-muted-foreground", children })
84
+ ] });
85
+ }
86
+ if (variant === "flanked") {
87
+ return /* @__PURE__ */ jsxs("div", { className: cn("inline-flex items-center gap-2 text-muted-foreground", className), children: [
88
+ /* @__PURE__ */ jsx3("span", { className: "text-primary select-none", children: "\u2014" }),
89
+ /* @__PURE__ */ jsx3("span", { className: "text-xs font-semibold uppercase tracking-widest", children }),
90
+ /* @__PURE__ */ jsx3("span", { className: "text-primary select-none", children: "\u2014" })
91
+ ] });
92
+ }
93
+ return /* @__PURE__ */ jsxs(
94
+ "div",
95
+ {
96
+ className: cn(
97
+ "inline-flex items-center gap-2 rounded-full border border-border bg-foreground/[0.06] px-4 py-1.5 backdrop-blur-md",
98
+ className
99
+ ),
100
+ children: [
101
+ /* @__PURE__ */ jsx3(
102
+ "div",
103
+ {
104
+ className: "h-1.5 w-1.5 rounded-full shrink-0",
105
+ style: { backgroundColor: dotColor }
106
+ }
107
+ ),
108
+ /* @__PURE__ */ jsx3("span", { className: "text-xs font-medium uppercase tracking-[0.15em] text-muted-foreground", children })
109
+ ]
110
+ }
111
+ );
112
+ }
113
+
114
+ // src/section-glow/index.tsx
115
+ import { motion as motion3, useReducedMotion } from "framer-motion";
116
+ import { jsx as jsx4 } from "react/jsx-runtime";
117
+ function SectionGlow({ variant = "primary", className }) {
118
+ const reduce = useReducedMotion();
119
+ const color = variant === "secondary" ? "color-mix(in srgb, var(--secondary, #1f2d56) 18%, transparent)" : "color-mix(in srgb, var(--primary, #8fccb6) 16%, transparent)";
120
+ return /* @__PURE__ */ jsx4(
121
+ "div",
122
+ {
123
+ "aria-hidden": true,
124
+ className: cn(
125
+ "pointer-events-none absolute left-1/2 -top-40 -translate-x-1/2",
126
+ className
127
+ ),
128
+ children: /* @__PURE__ */ jsx4(
129
+ motion3.div,
130
+ {
131
+ className: "h-[460px] w-[min(820px,94vw)] rounded-full blur-[60px]",
132
+ style: {
133
+ background: `radial-gradient(circle at 50% 50%, ${color}, transparent 70%)`
134
+ },
135
+ initial: reduce ? false : { opacity: 0, scale: 0.92 },
136
+ whileInView: { opacity: 1, scale: 1 },
137
+ viewport: { once: true, margin: "-8% 0px -8% 0px" },
138
+ transition: { duration: 1, ease: [0.22, 0.61, 0.36, 1] }
139
+ }
140
+ )
141
+ }
142
+ );
143
+ }
144
+
145
+ // src/section-intro/index.tsx
146
+ import { jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
147
+ function SectionIntro({
148
+ label,
149
+ title,
150
+ body,
151
+ centered = false
152
+ }) {
153
+ return /* @__PURE__ */ jsxs2(
154
+ "div",
155
+ {
156
+ className: cn(
157
+ "relative z-10 max-w-3xl",
158
+ centered && "mx-auto text-center"
159
+ ),
160
+ children: [
161
+ /* @__PURE__ */ jsx5(SectionLabel, { children: label }),
162
+ /* @__PURE__ */ jsx5(
163
+ "h2",
164
+ {
165
+ className: "mt-6 font-display text-4xl font-black tracking-[-0.04em] text-foreground sm:text-5xl md:text-6xl",
166
+ style: { textShadow: "0 18px 60px rgba(0,0,0,0.24)" },
167
+ children: title
168
+ }
169
+ ),
170
+ body ? /* @__PURE__ */ jsx5(
171
+ "p",
172
+ {
173
+ className: cn(
174
+ "mt-6 max-w-2xl text-base leading-8 text-muted-foreground md:text-lg",
175
+ centered && "mx-auto"
176
+ ),
177
+ children: body
178
+ }
179
+ ) : null
180
+ ]
181
+ }
182
+ );
183
+ }
184
+
185
+ // src/text-rotator/index.tsx
186
+ import * as React2 from "react";
187
+ import { AnimatePresence, motion as motion4 } from "framer-motion";
188
+ import { jsx as jsx6 } from "react/jsx-runtime";
189
+ var SPRING = [0.16, 1, 0.3, 1];
190
+ function TextRotator({
191
+ phrases,
192
+ interval = 2800,
193
+ className,
194
+ phraseClassName
195
+ }) {
196
+ const [index, setIndex] = React2.useState(0);
197
+ React2.useEffect(() => {
198
+ const id = setInterval(
199
+ () => setIndex((i) => (i + 1) % phrases.length),
200
+ interval
201
+ );
202
+ return () => clearInterval(id);
203
+ }, [phrases.length, interval]);
204
+ return (
205
+ /* clip container so exiting phrase doesn't overflow */
206
+ /* @__PURE__ */ jsx6(
207
+ "span",
208
+ {
209
+ className: cn("relative inline-flex overflow-hidden align-bottom", className),
210
+ style: { minWidth: "1ch" },
211
+ children: /* @__PURE__ */ jsx6(AnimatePresence, { mode: "popLayout", initial: false, children: /* @__PURE__ */ jsx6(
212
+ motion4.span,
213
+ {
214
+ initial: { y: "100%", opacity: 0 },
215
+ animate: { y: 0, opacity: 1 },
216
+ exit: { y: "-100%", opacity: 0 },
217
+ transition: { duration: 0.55, ease: SPRING },
218
+ className: cn("inline-block", phraseClassName),
219
+ children: phrases[index]
220
+ },
221
+ phrases[index]
222
+ ) })
223
+ }
224
+ )
225
+ );
226
+ }
227
+
228
+ // src/avatar-group/index.tsx
229
+ import { jsx as jsx7, jsxs as jsxs3 } from "react/jsx-runtime";
230
+ var sizePx = {
231
+ sm: "h-7 w-7 text-[10px]",
232
+ md: "h-9 w-9 text-xs",
233
+ lg: "h-11 w-11 text-sm"
234
+ };
235
+ var overlapPx = {
236
+ sm: "-ml-2",
237
+ md: "-ml-2.5",
238
+ lg: "-ml-3"
239
+ };
240
+ function AvatarGroup({
241
+ avatars,
242
+ max = 5,
243
+ label,
244
+ size = "md",
245
+ className
246
+ }) {
247
+ const shown = avatars.slice(0, max);
248
+ const overflow = avatars.length - max;
249
+ return /* @__PURE__ */ jsxs3("div", { className: cn("flex items-center gap-3", className), children: [
250
+ /* @__PURE__ */ jsxs3("div", { className: "flex items-center", children: [
251
+ shown.map((av, i) => /* @__PURE__ */ jsx7(
252
+ "div",
253
+ {
254
+ title: av.name,
255
+ className: cn(
256
+ "relative rounded-full ring-2 ring-background overflow-hidden shrink-0",
257
+ sizePx[size],
258
+ i > 0 && overlapPx[size]
259
+ ),
260
+ children: av.src ? (
261
+ // eslint-disable-next-line @next/next/no-img-element
262
+ /* @__PURE__ */ jsx7(
263
+ "img",
264
+ {
265
+ src: av.src,
266
+ alt: av.name,
267
+ className: "h-full w-full object-cover"
268
+ }
269
+ )
270
+ ) : /* @__PURE__ */ jsx7(
271
+ "span",
272
+ {
273
+ className: "flex h-full w-full items-center justify-center font-semibold bg-primary/20 text-primary",
274
+ children: av.initials ?? av.name.slice(0, 2).toUpperCase()
275
+ }
276
+ )
277
+ },
278
+ i
279
+ )),
280
+ overflow > 0 && /* @__PURE__ */ jsxs3(
281
+ "div",
282
+ {
283
+ className: cn(
284
+ "relative rounded-full ring-2 ring-background shrink-0",
285
+ "flex items-center justify-center font-semibold",
286
+ "bg-muted text-muted-foreground",
287
+ sizePx[size],
288
+ overlapPx[size]
289
+ ),
290
+ children: [
291
+ "+",
292
+ overflow
293
+ ]
294
+ }
295
+ )
296
+ ] }),
297
+ label && /* @__PURE__ */ jsx7("p", { className: "text-sm text-muted-foreground", children: label })
298
+ ] });
299
+ }
300
+
301
+ // src/marquee/index.tsx
302
+ import * as React3 from "react";
303
+ import { motion as motion5 } from "framer-motion";
304
+ import { Fragment, jsx as jsx8, jsxs as jsxs4 } from "react/jsx-runtime";
305
+ function Marquee({
306
+ children,
307
+ reverse = false,
308
+ speed = 30,
309
+ gap = "2rem",
310
+ pauseOnHover = true,
311
+ fadeWidth = "6rem",
312
+ className
313
+ }) {
314
+ const [paused, setPaused] = React3.useState(false);
315
+ const doubled = [...children, ...children];
316
+ return /* @__PURE__ */ jsxs4(
317
+ "div",
318
+ {
319
+ className: cn("relative overflow-hidden", className),
320
+ onMouseEnter: () => pauseOnHover && setPaused(true),
321
+ onMouseLeave: () => pauseOnHover && setPaused(false),
322
+ children: [
323
+ fadeWidth !== "0" && /* @__PURE__ */ jsxs4(Fragment, { children: [
324
+ /* @__PURE__ */ jsx8(
325
+ "div",
326
+ {
327
+ "aria-hidden": true,
328
+ className: "pointer-events-none absolute inset-y-0 left-0 z-10",
329
+ style: {
330
+ width: fadeWidth,
331
+ background: "linear-gradient(to right, var(--background), transparent)"
332
+ }
333
+ }
334
+ ),
335
+ /* @__PURE__ */ jsx8(
336
+ "div",
337
+ {
338
+ "aria-hidden": true,
339
+ className: "pointer-events-none absolute inset-y-0 right-0 z-10",
340
+ style: {
341
+ width: fadeWidth,
342
+ background: "linear-gradient(to left, var(--background), transparent)"
343
+ }
344
+ }
345
+ )
346
+ ] }),
347
+ /* @__PURE__ */ jsx8(
348
+ motion5.div,
349
+ {
350
+ className: "flex",
351
+ style: { gap },
352
+ animate: { x: reverse ? ["-50%", "0%"] : ["0%", "-50%"] },
353
+ transition: {
354
+ duration: speed,
355
+ ease: "linear",
356
+ repeat: Infinity
357
+ },
358
+ ...paused && { animate: { x: reverse ? "-50%" : "0%" } },
359
+ children: doubled.map((child, i) => /* @__PURE__ */ jsx8("div", { className: "shrink-0", children: child }, i))
360
+ }
361
+ )
362
+ ]
363
+ }
364
+ );
365
+ }
366
+
367
+ // src/layered-button/index.tsx
368
+ import { motion as motion6 } from "framer-motion";
369
+ import { ArrowRight } from "lucide-react";
370
+ import { Fragment as Fragment2, jsx as jsx9, jsxs as jsxs5 } from "react/jsx-runtime";
371
+ function LayeredButton({
372
+ href,
373
+ children,
374
+ variant = "solid",
375
+ className,
376
+ disabled = false,
377
+ icon,
378
+ onClick,
379
+ type = "button"
380
+ }) {
381
+ const innerClassName = variant === "solid" ? "bg-cta-gradient text-white shadow-glow" : "bg-white/[0.06] text-white/88";
382
+ const iconNode = icon ?? /* @__PURE__ */ jsx9(ArrowRight, { className: "h-4 w-4 transition-transform duration-300 group-hover:translate-x-1" });
383
+ const wrapperClassName = cn(
384
+ "group relative inline-flex translate-gpu disabled:pointer-events-none disabled:opacity-60",
385
+ disabled && "pointer-events-none opacity-60",
386
+ className
387
+ );
388
+ const buttonChrome = /* @__PURE__ */ jsxs5(Fragment2, { children: [
389
+ variant === "solid" && /* @__PURE__ */ jsx9("div", { className: "absolute -inset-1 animate-pulse rounded-full bg-cta-gradient opacity-50 blur-xl transition duration-500 group-hover:opacity-80" }),
390
+ /* @__PURE__ */ jsxs5(
391
+ "div",
392
+ {
393
+ className: cn(
394
+ "relative w-full rounded-full p-px",
395
+ variant === "solid" ? "border border-white/60" : "border border-white/20"
396
+ ),
397
+ children: [
398
+ /* @__PURE__ */ jsx9("div", { className: "absolute left-1/4 top-0 h-3 w-1/2 rounded-full bg-white/40 blur-md" }),
399
+ /* @__PURE__ */ jsxs5(
400
+ "div",
401
+ {
402
+ className: cn(
403
+ "relative flex w-full items-center justify-center gap-2 overflow-hidden rounded-full px-7 py-3 text-sm font-medium transition duration-300 group-hover:shadow-glow-strong",
404
+ innerClassName
405
+ ),
406
+ children: [
407
+ /* @__PURE__ */ jsx9("span", { className: "pointer-events-none absolute inset-y-0 -left-1/3 w-1/3 -skew-x-12 bg-[linear-gradient(90deg,transparent,rgba(255,255,255,0.24),transparent)] opacity-0 transition-all duration-700 group-hover:left-[120%] group-hover:opacity-100" }),
408
+ /* @__PURE__ */ jsx9("span", { children }),
409
+ iconNode
410
+ ]
411
+ }
412
+ )
413
+ ]
414
+ }
415
+ )
416
+ ] });
417
+ if (href) {
418
+ const handleClick = (event) => {
419
+ onClick?.(event);
420
+ if (event.defaultPrevented || disabled) return;
421
+ };
422
+ return /* @__PURE__ */ jsx9(
423
+ motion6.a,
424
+ {
425
+ href,
426
+ onClick: handleClick,
427
+ whileHover: disabled ? void 0 : { scale: 1.02, y: -2 },
428
+ whileTap: disabled ? void 0 : { scale: 0.99 },
429
+ className: wrapperClassName,
430
+ style: { willChange: "transform" },
431
+ "aria-disabled": disabled,
432
+ children: buttonChrome
433
+ }
434
+ );
435
+ }
436
+ return /* @__PURE__ */ jsx9(
437
+ motion6.button,
438
+ {
439
+ type,
440
+ onClick,
441
+ whileHover: disabled ? void 0 : { scale: 1.02, y: -2 },
442
+ whileTap: disabled ? void 0 : { scale: 0.99 },
443
+ className: wrapperClassName,
444
+ style: { willChange: "transform" },
445
+ disabled,
446
+ children: buttonChrome
447
+ }
448
+ );
449
+ }
450
+
451
+ // src/nav-bar/index.tsx
452
+ import * as React4 from "react";
453
+ import { motion as motion7, AnimatePresence as AnimatePresence2 } from "framer-motion";
454
+ import { Menu, X } from "lucide-react";
455
+ import { jsx as jsx10, jsxs as jsxs6 } from "react/jsx-runtime";
456
+ function NavBar({ data, logo, className }) {
457
+ const [open, setOpen] = React4.useState(false);
458
+ const [scrolled, setScrolled] = React4.useState(false);
459
+ React4.useEffect(() => {
460
+ const update = () => setScrolled(window.scrollY > 12);
461
+ window.addEventListener("scroll", update, { passive: true });
462
+ update();
463
+ return () => window.removeEventListener("scroll", update);
464
+ }, []);
465
+ return /* @__PURE__ */ jsxs6(
466
+ "header",
467
+ {
468
+ className: cn(
469
+ "fixed inset-x-0 top-0 z-50 transition-all duration-300",
470
+ scrolled ? "border-b border-border/60 backdrop-blur-xl" : "border-b border-transparent",
471
+ className
472
+ ),
473
+ style: scrolled ? { background: "var(--glass-bg-strong, rgba(255,255,255,0.08))" } : void 0,
474
+ children: [
475
+ /* @__PURE__ */ jsxs6("nav", { className: "container mx-auto flex h-16 items-center justify-between px-4 md:px-6", children: [
476
+ logo && /* @__PURE__ */ jsx10("a", { href: "/", "aria-label": "Home", className: "inline-flex shrink-0 items-center", children: logo }),
477
+ /* @__PURE__ */ jsx10("ul", { className: "hidden md:flex items-center gap-7", children: data.links.map((link) => /* @__PURE__ */ jsx10("li", { children: /* @__PURE__ */ jsx10(
478
+ "a",
479
+ {
480
+ href: link.href,
481
+ className: "text-sm text-muted-foreground transition-colors hover:text-foreground",
482
+ children: link.label
483
+ }
484
+ ) }, link.href)) }),
485
+ /* @__PURE__ */ jsxs6("div", { className: "flex items-center gap-3", children: [
486
+ data.cta && /* @__PURE__ */ jsx10(
487
+ "a",
488
+ {
489
+ href: data.cta.href,
490
+ className: "hidden md:inline-flex items-center justify-center rounded-full px-5 py-2 text-sm font-semibold bg-primary text-primary-foreground transition-all hover:opacity-90 active:scale-[0.97]",
491
+ children: data.cta.label
492
+ }
493
+ ),
494
+ /* @__PURE__ */ jsx10(
495
+ "button",
496
+ {
497
+ "aria-label": open ? "Close menu" : "Open menu",
498
+ onClick: () => setOpen((v) => !v),
499
+ className: "md:hidden rounded-lg p-2 text-muted-foreground hover:text-foreground hover:bg-accent transition-colors",
500
+ children: open ? /* @__PURE__ */ jsx10(X, { size: 20 }) : /* @__PURE__ */ jsx10(Menu, { size: 20 })
501
+ }
502
+ )
503
+ ] })
504
+ ] }),
505
+ /* @__PURE__ */ jsx10(AnimatePresence2, { children: open && /* @__PURE__ */ jsx10(
506
+ motion7.div,
507
+ {
508
+ initial: { opacity: 0, height: 0 },
509
+ animate: { opacity: 1, height: "auto" },
510
+ exit: { opacity: 0, height: 0 },
511
+ transition: { duration: 0.22, ease: "easeInOut" },
512
+ className: "md:hidden overflow-hidden border-b border-border backdrop-blur-xl",
513
+ style: { background: "var(--glass-bg-strong, var(--background))" },
514
+ children: /* @__PURE__ */ jsxs6("ul", { className: "container mx-auto flex flex-col px-4 pb-5 pt-1 gap-0.5", children: [
515
+ data.links.map((link) => /* @__PURE__ */ jsx10("li", { children: /* @__PURE__ */ jsx10(
516
+ "a",
517
+ {
518
+ href: link.href,
519
+ onClick: () => setOpen(false),
520
+ className: "block rounded-lg px-3 py-2.5 text-sm text-muted-foreground hover:text-foreground hover:bg-accent transition-colors",
521
+ children: link.label
522
+ }
523
+ ) }, link.href)),
524
+ data.cta && /* @__PURE__ */ jsx10("li", { className: "mt-3 pt-3 border-t border-border", children: /* @__PURE__ */ jsx10(
525
+ "a",
526
+ {
527
+ href: data.cta.href,
528
+ onClick: () => setOpen(false),
529
+ className: "block rounded-full px-5 py-2.5 text-sm font-semibold text-center bg-primary text-primary-foreground hover:opacity-90 transition-opacity",
530
+ children: data.cta.label
531
+ }
532
+ ) })
533
+ ] })
534
+ },
535
+ "mobile-menu"
536
+ ) })
537
+ ]
538
+ }
539
+ );
540
+ }
541
+
542
+ // src/cta-banner/index.tsx
543
+ import { motion as motion8 } from "framer-motion";
544
+ import { jsx as jsx11, jsxs as jsxs7 } from "react/jsx-runtime";
545
+ function CTABanner({ data, className }) {
546
+ return /* @__PURE__ */ jsxs7(
547
+ "section",
548
+ {
549
+ className: cn("relative w-full py-24 lg:py-36 overflow-hidden", className),
550
+ children: [
551
+ /* @__PURE__ */ jsx11(
552
+ "div",
553
+ {
554
+ "aria-hidden": true,
555
+ className: "absolute inset-0",
556
+ style: {
557
+ background: "var(--gradient-cta, linear-gradient(135deg, var(--primary) 0%, var(--ring) 100%))"
558
+ }
559
+ }
560
+ ),
561
+ /* @__PURE__ */ jsx11(
562
+ "div",
563
+ {
564
+ "aria-hidden": true,
565
+ className: "absolute -top-32 left-1/3 w-96 h-96 rounded-full blur-3xl opacity-30 pointer-events-none",
566
+ style: { background: "var(--primary, #8fccb6)" }
567
+ }
568
+ ),
569
+ /* @__PURE__ */ jsx11(
570
+ "div",
571
+ {
572
+ "aria-hidden": true,
573
+ className: "absolute -bottom-32 right-1/4 w-96 h-96 rounded-full blur-3xl opacity-20 pointer-events-none",
574
+ style: { background: "var(--wmm-violet, #869ce2)" }
575
+ }
576
+ ),
577
+ /* @__PURE__ */ jsxs7("div", { className: "relative container mx-auto px-4 md:px-6 text-center max-w-3xl", children: [
578
+ data.badge && /* @__PURE__ */ jsx11(
579
+ motion8.div,
580
+ {
581
+ initial: { opacity: 0, y: 12 },
582
+ whileInView: { opacity: 1, y: 0 },
583
+ viewport: { once: true },
584
+ transition: { duration: 0.5 },
585
+ className: "flex justify-center mb-5",
586
+ children: /* @__PURE__ */ jsx11(SectionLabel, { className: "border-white/20 text-white/90", children: data.badge })
587
+ }
588
+ ),
589
+ /* @__PURE__ */ jsx11(
590
+ motion8.h2,
591
+ {
592
+ initial: { opacity: 0, y: 24 },
593
+ whileInView: { opacity: 1, y: 0 },
594
+ viewport: { once: true },
595
+ transition: { duration: 0.6, delay: data.badge ? 0.08 : 0 },
596
+ className: "text-4xl md:text-5xl lg:text-6xl font-bold tracking-tight text-white mb-5",
597
+ children: data.heading
598
+ }
599
+ ),
600
+ data.subheading && /* @__PURE__ */ jsx11(
601
+ motion8.p,
602
+ {
603
+ initial: { opacity: 0, y: 16 },
604
+ whileInView: { opacity: 1, y: 0 },
605
+ viewport: { once: true },
606
+ transition: { duration: 0.6, delay: 0.12 },
607
+ className: "text-lg md:text-xl text-white/75 max-w-xl mx-auto mb-10",
608
+ children: data.subheading
609
+ }
610
+ ),
611
+ /* @__PURE__ */ jsxs7(
612
+ motion8.div,
613
+ {
614
+ initial: { opacity: 0, y: 16 },
615
+ whileInView: { opacity: 1, y: 0 },
616
+ viewport: { once: true },
617
+ transition: { duration: 0.5, delay: 0.2 },
618
+ className: "flex flex-col sm:flex-row items-center justify-center gap-3",
619
+ children: [
620
+ /* @__PURE__ */ jsx11(
621
+ "a",
622
+ {
623
+ href: data.primaryCta.href,
624
+ className: "inline-flex items-center justify-center rounded-full px-8 py-3.5 text-sm font-semibold bg-white text-foreground shadow-lg hover:bg-white/92 transition-all active:scale-[0.97]",
625
+ children: data.primaryCta.label
626
+ }
627
+ ),
628
+ data.secondaryCta && /* @__PURE__ */ jsx11(
629
+ "a",
630
+ {
631
+ href: data.secondaryCta.href,
632
+ className: "inline-flex items-center justify-center rounded-full px-8 py-3.5 text-sm font-semibold text-white border border-white/30 hover:bg-white/10 transition-all",
633
+ children: data.secondaryCta.label
634
+ }
635
+ )
636
+ ]
637
+ }
638
+ )
639
+ ] })
640
+ ]
641
+ }
642
+ );
643
+ }
644
+
645
+ // src/process-steps/index.tsx
646
+ import { motion as motion9 } from "framer-motion";
647
+ import { jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
648
+ function ProcessSteps({
649
+ label,
650
+ heading,
651
+ subheading,
652
+ steps,
653
+ layout = "horizontal",
654
+ className
655
+ }) {
656
+ return /* @__PURE__ */ jsx12("section", { className: cn("w-full py-16 lg:py-28", className), children: /* @__PURE__ */ jsxs8("div", { className: "container px-4 md:px-6 max-w-5xl mx-auto", children: [
657
+ (label || heading || subheading) && /* @__PURE__ */ jsxs8("div", { className: "text-center mb-14 space-y-4", children: [
658
+ label && /* @__PURE__ */ jsx12("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx12(SectionLabel, { children: label }) }),
659
+ heading && /* @__PURE__ */ jsx12("h2", { className: "text-3xl md:text-4xl font-bold tracking-tight text-foreground", children: heading }),
660
+ subheading && /* @__PURE__ */ jsx12("p", { className: "text-muted-foreground max-w-xl mx-auto", children: subheading })
661
+ ] }),
662
+ layout === "horizontal" ? /* @__PURE__ */ jsx12(
663
+ "div",
664
+ {
665
+ className: cn(
666
+ "grid gap-8",
667
+ steps.length <= 3 ? "md:grid-cols-3" : "md:grid-cols-2 lg:grid-cols-4"
668
+ ),
669
+ children: steps.map((step, i) => /* @__PURE__ */ jsxs8(
670
+ motion9.div,
671
+ {
672
+ initial: { opacity: 0, y: 20 },
673
+ whileInView: { opacity: 1, y: 0 },
674
+ viewport: { once: true },
675
+ transition: { duration: 0.5, delay: i * 0.1 },
676
+ className: "relative flex flex-col gap-4",
677
+ children: [
678
+ i < steps.length - 1 && /* @__PURE__ */ jsx12(
679
+ "div",
680
+ {
681
+ "aria-hidden": true,
682
+ className: "hidden md:block absolute top-5 left-[calc(50%+24px)] right-0 h-px",
683
+ style: { background: "var(--gradient-primary, var(--primary))", opacity: 0.25 }
684
+ }
685
+ ),
686
+ /* @__PURE__ */ jsx12(
687
+ "div",
688
+ {
689
+ className: "flex h-10 w-10 items-center justify-center rounded-xl border border-primary/30 bg-primary/10 shrink-0",
690
+ children: step.icon ?? /* @__PURE__ */ jsx12("span", { className: "text-sm font-bold text-primary", children: String(i + 1).padStart(2, "0") })
691
+ }
692
+ ),
693
+ /* @__PURE__ */ jsxs8("div", { children: [
694
+ /* @__PURE__ */ jsx12("p", { className: "text-sm font-semibold text-foreground mb-1", children: step.title }),
695
+ /* @__PURE__ */ jsx12("p", { className: "text-sm text-muted-foreground", children: step.description })
696
+ ] })
697
+ ]
698
+ },
699
+ i
700
+ ))
701
+ }
702
+ ) : (
703
+ /* Vertical layout */
704
+ /* @__PURE__ */ jsx12("div", { className: "max-w-2xl mx-auto space-y-0", children: steps.map((step, i) => /* @__PURE__ */ jsxs8(
705
+ motion9.div,
706
+ {
707
+ initial: { opacity: 0, x: -16 },
708
+ whileInView: { opacity: 1, x: 0 },
709
+ viewport: { once: true },
710
+ transition: { duration: 0.5, delay: i * 0.08 },
711
+ className: "relative flex gap-6 pb-10 last:pb-0",
712
+ children: [
713
+ i < steps.length - 1 && /* @__PURE__ */ jsx12(
714
+ "div",
715
+ {
716
+ "aria-hidden": true,
717
+ className: "absolute left-5 top-10 bottom-0 w-px",
718
+ style: { background: "var(--border)" }
719
+ }
720
+ ),
721
+ /* @__PURE__ */ jsx12("div", { className: "shrink-0 flex h-10 w-10 items-center justify-center rounded-xl border border-primary/30 bg-primary/10 z-10", children: step.icon ?? /* @__PURE__ */ jsx12("span", { className: "text-sm font-bold text-primary", children: String(i + 1).padStart(2, "0") }) }),
722
+ /* @__PURE__ */ jsxs8("div", { className: "pt-1.5", children: [
723
+ /* @__PURE__ */ jsx12("p", { className: "text-sm font-semibold text-foreground mb-1", children: step.title }),
724
+ /* @__PURE__ */ jsx12("p", { className: "text-sm text-muted-foreground", children: step.description })
725
+ ] })
726
+ ]
727
+ },
728
+ i
729
+ )) })
730
+ )
731
+ ] }) });
732
+ }
733
+
734
+ // src/contact-form/index.tsx
735
+ import * as React5 from "react";
736
+ import { jsx as jsx13, jsxs as jsxs9 } from "react/jsx-runtime";
737
+ function ContactForm({ data, onSubmit, className }) {
738
+ const [values, setValues] = React5.useState({});
739
+ const [loading, setLoading] = React5.useState(false);
740
+ const [sent, setSent] = React5.useState(false);
741
+ const set = (name, val) => setValues((prev) => ({ ...prev, [name]: val }));
742
+ const handleSubmit = async (e) => {
743
+ e.preventDefault();
744
+ if (!onSubmit) {
745
+ setSent(true);
746
+ return;
747
+ }
748
+ setLoading(true);
749
+ try {
750
+ await onSubmit(values);
751
+ setSent(true);
752
+ } finally {
753
+ setLoading(false);
754
+ }
755
+ };
756
+ const inputBase = "w-full rounded-lg border border-input bg-background px-3.5 py-2.5 text-sm text-foreground placeholder:text-muted-foreground/60 transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent disabled:opacity-50";
757
+ return /* @__PURE__ */ jsx13("section", { className: cn("w-full py-16 lg:py-28", className), children: /* @__PURE__ */ jsxs9("div", { className: "container px-4 md:px-6 max-w-5xl mx-auto", children: [
758
+ (data.label || data.heading || data.subheading) && /* @__PURE__ */ jsxs9("div", { className: "text-center mb-12 space-y-4", children: [
759
+ data.label && /* @__PURE__ */ jsx13("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx13(SectionLabel, { children: data.label }) }),
760
+ data.heading && /* @__PURE__ */ jsx13("h2", { className: "text-3xl md:text-4xl font-bold tracking-tight text-foreground", children: data.heading }),
761
+ data.subheading && /* @__PURE__ */ jsx13("p", { className: "text-muted-foreground max-w-xl mx-auto", children: data.subheading })
762
+ ] }),
763
+ /* @__PURE__ */ jsxs9("div", { className: cn("grid gap-12", data.aside ? "md:grid-cols-[1fr_2fr]" : "max-w-2xl mx-auto"), children: [
764
+ data.aside && /* @__PURE__ */ jsx13("div", { children: data.aside }),
765
+ sent ? /* @__PURE__ */ jsxs9("div", { className: "flex flex-col items-center justify-center text-center gap-4 rounded-2xl border border-border bg-card p-12", children: [
766
+ /* @__PURE__ */ jsx13("div", { className: "flex h-14 w-14 items-center justify-center rounded-full bg-primary/10 text-primary", children: /* @__PURE__ */ jsx13("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx13("path", { d: "M20 6 9 17l-5-5" }) }) }),
767
+ /* @__PURE__ */ jsx13("p", { className: "text-lg font-semibold text-foreground", children: "Message sent!" }),
768
+ /* @__PURE__ */ jsx13("p", { className: "text-sm text-muted-foreground", children: "We'll be in touch shortly." })
769
+ ] }) : /* @__PURE__ */ jsxs9(
770
+ "form",
771
+ {
772
+ onSubmit: handleSubmit,
773
+ className: "grid grid-cols-2 gap-5 rounded-2xl border border-border bg-card p-6 md:p-8",
774
+ style: { boxShadow: "var(--shadow-card)" },
775
+ children: [
776
+ data.fields.map((field) => /* @__PURE__ */ jsxs9(
777
+ "div",
778
+ {
779
+ className: cn(
780
+ "flex flex-col gap-1.5",
781
+ field.colSpan === 2 || field.type === "textarea" ? "col-span-2" : "col-span-2 sm:col-span-1"
782
+ ),
783
+ children: [
784
+ /* @__PURE__ */ jsxs9(
785
+ "label",
786
+ {
787
+ htmlFor: field.name,
788
+ className: "text-xs font-medium text-foreground",
789
+ children: [
790
+ field.label,
791
+ field.required && /* @__PURE__ */ jsx13("span", { className: "text-primary ml-0.5", children: "*" })
792
+ ]
793
+ }
794
+ ),
795
+ field.type === "textarea" ? /* @__PURE__ */ jsx13(
796
+ "textarea",
797
+ {
798
+ id: field.name,
799
+ name: field.name,
800
+ rows: 5,
801
+ required: field.required,
802
+ placeholder: field.placeholder,
803
+ value: values[field.name] ?? "",
804
+ onChange: (e) => set(field.name, e.target.value),
805
+ className: cn(inputBase, "resize-none")
806
+ }
807
+ ) : field.type === "select" ? /* @__PURE__ */ jsxs9(
808
+ "select",
809
+ {
810
+ id: field.name,
811
+ name: field.name,
812
+ required: field.required,
813
+ value: values[field.name] ?? "",
814
+ onChange: (e) => set(field.name, e.target.value),
815
+ className: inputBase,
816
+ children: [
817
+ /* @__PURE__ */ jsx13("option", { value: "", children: field.placeholder ?? "Select\u2026" }),
818
+ field.options?.map((opt) => /* @__PURE__ */ jsx13("option", { value: opt, children: opt }, opt))
819
+ ]
820
+ }
821
+ ) : /* @__PURE__ */ jsx13(
822
+ "input",
823
+ {
824
+ id: field.name,
825
+ name: field.name,
826
+ type: field.type ?? "text",
827
+ required: field.required,
828
+ placeholder: field.placeholder,
829
+ value: values[field.name] ?? "",
830
+ onChange: (e) => set(field.name, e.target.value),
831
+ className: inputBase
832
+ }
833
+ )
834
+ ]
835
+ },
836
+ field.name
837
+ )),
838
+ /* @__PURE__ */ jsx13("div", { className: "col-span-2 mt-2", children: /* @__PURE__ */ jsx13(
839
+ "button",
840
+ {
841
+ type: "submit",
842
+ disabled: loading,
843
+ className: "w-full flex items-center justify-center rounded-full px-6 py-3 text-sm font-semibold bg-primary text-primary-foreground hover:opacity-90 disabled:opacity-60 transition-all active:scale-[0.98]",
844
+ children: loading ? "Sending\u2026" : data.submitLabel ?? "Send Message"
845
+ }
846
+ ) })
847
+ ]
848
+ }
849
+ )
850
+ ] })
851
+ ] }) });
852
+ }
853
+
854
+ // src/case-studies-section/index.tsx
855
+ import { motion as motion10 } from "framer-motion";
856
+ import { jsx as jsx14, jsxs as jsxs10 } from "react/jsx-runtime";
857
+ function CaseStudiesSection({
858
+ label,
859
+ heading,
860
+ subheading,
861
+ items,
862
+ className
863
+ }) {
864
+ return /* @__PURE__ */ jsx14("section", { className: cn("w-full py-16 lg:py-28", className), children: /* @__PURE__ */ jsxs10("div", { className: "container px-4 md:px-6 max-w-6xl mx-auto", children: [
865
+ (label || heading || subheading) && /* @__PURE__ */ jsxs10("div", { className: "text-center mb-14 space-y-4", children: [
866
+ label && /* @__PURE__ */ jsx14("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx14(SectionLabel, { children: label }) }),
867
+ heading && /* @__PURE__ */ jsx14("h2", { className: "text-3xl md:text-4xl font-bold tracking-tight text-foreground", children: heading }),
868
+ subheading && /* @__PURE__ */ jsx14("p", { className: "text-muted-foreground max-w-xl mx-auto", children: subheading })
869
+ ] }),
870
+ /* @__PURE__ */ jsx14("div", { className: "grid gap-6 md:grid-cols-2", children: items.map((cs, i) => /* @__PURE__ */ jsxs10(
871
+ motion10.article,
872
+ {
873
+ initial: { opacity: 0, y: 24 },
874
+ whileInView: { opacity: 1, y: 0 },
875
+ whileHover: { y: -4 },
876
+ viewport: { once: true },
877
+ transition: { duration: 0.5, delay: i * 0.08 },
878
+ className: cn(
879
+ "relative flex flex-col rounded-2xl border border-border bg-card overflow-hidden"
880
+ ),
881
+ style: { boxShadow: "var(--shadow-card)" },
882
+ children: [
883
+ /* @__PURE__ */ jsx14(
884
+ "div",
885
+ {
886
+ "aria-hidden": true,
887
+ className: "absolute inset-x-8 top-0 h-px",
888
+ style: { background: "var(--gradient-primary, var(--primary))", opacity: 0.4 }
889
+ }
890
+ ),
891
+ cs.image && /* @__PURE__ */ jsx14("div", { className: "w-full border-b border-border overflow-hidden max-h-48", children: cs.image }),
892
+ /* @__PURE__ */ jsxs10("div", { className: "flex flex-col flex-1 p-6 gap-5", children: [
893
+ /* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-2 flex-wrap", children: [
894
+ /* @__PURE__ */ jsx14("span", { className: "inline-flex items-center rounded-full px-2.5 py-1 text-xs font-semibold bg-primary/12 text-primary", children: cs.client }),
895
+ cs.vertical && /* @__PURE__ */ jsx14("span", { className: "inline-flex items-center rounded-full px-2.5 py-1 text-xs font-medium bg-muted text-muted-foreground", children: cs.vertical })
896
+ ] }),
897
+ /* @__PURE__ */ jsxs10("dl", { className: "space-y-3", children: [
898
+ /* @__PURE__ */ jsxs10("div", { className: "flex gap-2 items-start", children: [
899
+ /* @__PURE__ */ jsx14("dt", { className: "shrink-0 text-xs font-semibold text-muted-foreground uppercase tracking-widest w-16 pt-0.5", children: "Before" }),
900
+ /* @__PURE__ */ jsx14("dd", { className: "text-sm text-muted-foreground", children: cs.before })
901
+ ] }),
902
+ /* @__PURE__ */ jsxs10("div", { className: "flex gap-2 items-start", children: [
903
+ /* @__PURE__ */ jsx14("dt", { className: "shrink-0 text-xs font-semibold text-primary uppercase tracking-widest w-16 pt-0.5", children: "Built" }),
904
+ /* @__PURE__ */ jsx14("dd", { className: "text-sm text-foreground", children: cs.built })
905
+ ] }),
906
+ /* @__PURE__ */ jsxs10("div", { className: "flex gap-2 items-start", children: [
907
+ /* @__PURE__ */ jsx14("dt", { className: "shrink-0 text-xs font-semibold text-emerald-500 uppercase tracking-widest w-16 pt-0.5", children: "Result" }),
908
+ /* @__PURE__ */ jsx14("dd", { className: "text-sm font-medium text-foreground", children: cs.result })
909
+ ] })
910
+ ] }),
911
+ cs.stats && cs.stats.length > 0 && /* @__PURE__ */ jsx14("div", { className: "flex gap-4 flex-wrap border-t border-border pt-4", children: cs.stats.map((s, j) => /* @__PURE__ */ jsxs10("div", { className: "flex flex-col gap-0.5", children: [
912
+ /* @__PURE__ */ jsx14("span", { className: "text-xl font-bold text-foreground", children: s.value }),
913
+ /* @__PURE__ */ jsx14("span", { className: "text-xs text-muted-foreground", children: s.label })
914
+ ] }, j)) }),
915
+ cs.quote && /* @__PURE__ */ jsxs10("blockquote", { className: "border-l-2 border-primary/40 pl-4 mt-auto", children: [
916
+ /* @__PURE__ */ jsxs10("p", { className: "text-sm italic text-muted-foreground", children: [
917
+ '"',
918
+ cs.quote,
919
+ '"'
920
+ ] }),
921
+ cs.quoteAuthor && /* @__PURE__ */ jsxs10("cite", { className: "text-xs text-muted-foreground/70 not-italic mt-1 block", children: [
922
+ "\u2014 ",
923
+ cs.quoteAuthor
924
+ ] })
925
+ ] }),
926
+ cs.href && /* @__PURE__ */ jsx14(
927
+ "a",
928
+ {
929
+ href: cs.href,
930
+ className: "mt-auto self-start text-xs font-semibold text-primary hover:text-primary/80 underline-offset-2 hover:underline transition-colors",
931
+ children: "Read full case study \u2192"
932
+ }
933
+ )
934
+ ] })
935
+ ]
936
+ },
937
+ i
938
+ )) })
939
+ ] }) });
940
+ }
941
+
942
+ // src/bento-grid/index.tsx
943
+ import { motion as motion11 } from "framer-motion";
944
+ import { jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
945
+ var spanCols = {
946
+ 1: "md:col-span-1",
947
+ 2: "md:col-span-2",
948
+ 3: "md:col-span-3"
949
+ };
950
+ var spanRows = {
951
+ 1: "",
952
+ 2: "md:row-span-2"
953
+ };
954
+ function BentoGrid({
955
+ label,
956
+ heading,
957
+ subheading,
958
+ cells,
959
+ className
960
+ }) {
961
+ return /* @__PURE__ */ jsx15("section", { className: cn("w-full py-16 lg:py-28", className), children: /* @__PURE__ */ jsxs11("div", { className: "container px-4 md:px-6 max-w-6xl mx-auto", children: [
962
+ (label || heading || subheading) && /* @__PURE__ */ jsxs11("div", { className: "text-center mb-12 space-y-4", children: [
963
+ label && /* @__PURE__ */ jsx15("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx15(SectionLabel, { children: label }) }),
964
+ heading && /* @__PURE__ */ jsx15("h2", { className: "text-3xl md:text-4xl font-bold tracking-tight text-foreground", children: heading }),
965
+ subheading && /* @__PURE__ */ jsx15("p", { className: "text-muted-foreground max-w-xl mx-auto", children: subheading })
966
+ ] }),
967
+ /* @__PURE__ */ jsx15("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-4 auto-rows-fr", children: cells.map((cell, i) => /* @__PURE__ */ jsxs11(
968
+ motion11.div,
969
+ {
970
+ initial: { opacity: 0, y: 20 },
971
+ whileInView: { opacity: 1, y: 0 },
972
+ viewport: { once: true },
973
+ transition: { duration: 0.5, delay: i * 0.07 },
974
+ className: cn(
975
+ "relative flex flex-col rounded-2xl border overflow-hidden p-6 min-h-[180px]",
976
+ spanCols[cell.colSpan ?? 1],
977
+ spanRows[cell.rowSpan ?? 1],
978
+ cell.highlight ? "border-primary/50 bg-card" : "border-border bg-card",
979
+ cell.className
980
+ ),
981
+ style: cell.highlight ? { boxShadow: "var(--shadow-glow, none)" } : { boxShadow: "var(--shadow-card)" },
982
+ children: [
983
+ cell.highlight && /* @__PURE__ */ jsx15(
984
+ "div",
985
+ {
986
+ "aria-hidden": true,
987
+ className: "absolute inset-x-0 top-0 h-px",
988
+ style: { background: "var(--gradient-primary, var(--primary))" }
989
+ }
990
+ ),
991
+ cell.tag && /* @__PURE__ */ jsx15(
992
+ "span",
993
+ {
994
+ className: cn(
995
+ "self-start inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium mb-4",
996
+ cell.highlight ? "bg-primary/15 text-primary" : "bg-muted text-muted-foreground"
997
+ ),
998
+ children: cell.tag
999
+ }
1000
+ ),
1001
+ cell.visual && /* @__PURE__ */ jsx15("div", { className: "mb-4 flex-1 flex items-start", children: cell.visual }),
1002
+ /* @__PURE__ */ jsxs11("div", { className: "mt-auto", children: [
1003
+ /* @__PURE__ */ jsx15("p", { className: "text-base font-semibold text-foreground mb-1", children: cell.title }),
1004
+ cell.description && /* @__PURE__ */ jsx15("p", { className: "text-sm text-muted-foreground", children: cell.description })
1005
+ ] })
1006
+ ]
1007
+ },
1008
+ i
1009
+ )) })
1010
+ ] }) });
1011
+ }
1012
+
1013
+ // src/stats-section/index.tsx
1014
+ import * as React6 from "react";
1015
+ import { motion as motion12, useInView as useInView2, useMotionValue, useTransform, animate } from "framer-motion";
1016
+ import { jsx as jsx16, jsxs as jsxs12 } from "react/jsx-runtime";
1017
+ function CountUp({ value, animate: shouldAnimate = true }) {
1018
+ const ref = React6.useRef(null);
1019
+ const inView = useInView2(ref, { once: true, margin: "-80px" });
1020
+ const motionVal = useMotionValue(0);
1021
+ const rounded = useTransform(motionVal, (v) => Math.round(v));
1022
+ const [display, setDisplay] = React6.useState(shouldAnimate ? 0 : value);
1023
+ React6.useEffect(() => {
1024
+ if (!shouldAnimate) {
1025
+ setDisplay(value);
1026
+ return;
1027
+ }
1028
+ if (!inView) return;
1029
+ const controls = animate(motionVal, value, { duration: 1.8, ease: "easeOut" });
1030
+ const unsub = rounded.on("change", (v) => setDisplay(v));
1031
+ return () => {
1032
+ controls.stop();
1033
+ unsub();
1034
+ };
1035
+ }, [inView, value, shouldAnimate]);
1036
+ return /* @__PURE__ */ jsx16("span", { ref, children: display.toLocaleString() });
1037
+ }
1038
+ function StatsSection({
1039
+ label,
1040
+ heading,
1041
+ subheading,
1042
+ stats,
1043
+ animate: shouldAnimate = true,
1044
+ className
1045
+ }) {
1046
+ return /* @__PURE__ */ jsxs12(
1047
+ "section",
1048
+ {
1049
+ className: cn("w-full py-16 lg:py-24 relative overflow-hidden", className),
1050
+ children: [
1051
+ /* @__PURE__ */ jsx16(
1052
+ "div",
1053
+ {
1054
+ "aria-hidden": true,
1055
+ className: "absolute inset-0 pointer-events-none",
1056
+ style: { background: "var(--gradient-teal-glow, none)" }
1057
+ }
1058
+ ),
1059
+ /* @__PURE__ */ jsxs12("div", { className: "relative container px-4 md:px-6 max-w-5xl mx-auto", children: [
1060
+ (label || heading || subheading) && /* @__PURE__ */ jsxs12("div", { className: "text-center mb-14 space-y-4", children: [
1061
+ label && /* @__PURE__ */ jsx16("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx16(SectionLabel, { children: label }) }),
1062
+ heading && /* @__PURE__ */ jsx16("h2", { className: "text-3xl md:text-4xl font-bold tracking-tight text-foreground", children: heading }),
1063
+ subheading && /* @__PURE__ */ jsx16("p", { className: "text-muted-foreground max-w-xl mx-auto", children: subheading })
1064
+ ] }),
1065
+ /* @__PURE__ */ jsx16(
1066
+ "div",
1067
+ {
1068
+ className: cn(
1069
+ "grid gap-8 sm:gap-12",
1070
+ stats.length === 2 && "sm:grid-cols-2",
1071
+ stats.length === 3 && "sm:grid-cols-3",
1072
+ stats.length >= 4 && "sm:grid-cols-2 lg:grid-cols-4"
1073
+ ),
1074
+ children: stats.map((stat, i) => /* @__PURE__ */ jsxs12(
1075
+ motion12.div,
1076
+ {
1077
+ initial: { opacity: 0, y: 24 },
1078
+ whileInView: { opacity: 1, y: 0 },
1079
+ viewport: { once: true },
1080
+ transition: { duration: 0.5, delay: i * 0.1 },
1081
+ className: "flex flex-col items-center text-center gap-2",
1082
+ children: [
1083
+ i > 0 && /* @__PURE__ */ jsx16(
1084
+ "div",
1085
+ {
1086
+ "aria-hidden": true,
1087
+ className: "hidden sm:block absolute h-16 w-px bg-border/60 left-0 top-1/2 -translate-y-1/2"
1088
+ }
1089
+ ),
1090
+ /* @__PURE__ */ jsxs12("p", { className: "text-5xl md:text-6xl font-black tracking-tight text-foreground tabular-nums", children: [
1091
+ stat.prefix && /* @__PURE__ */ jsx16("span", { className: "text-primary", children: stat.prefix }),
1092
+ /* @__PURE__ */ jsx16(CountUp, { value: stat.value, animate: shouldAnimate }),
1093
+ stat.suffix && /* @__PURE__ */ jsx16("span", { className: "text-primary", children: stat.suffix })
1094
+ ] }),
1095
+ /* @__PURE__ */ jsx16("p", { className: "text-sm font-semibold text-foreground", children: stat.label }),
1096
+ stat.description && /* @__PURE__ */ jsx16("p", { className: "text-xs text-muted-foreground max-w-[140px]", children: stat.description })
1097
+ ]
1098
+ },
1099
+ i
1100
+ ))
1101
+ }
1102
+ )
1103
+ ] })
1104
+ ]
1105
+ }
1106
+ );
1107
+ }
1108
+
1109
+ // src/logo-cloud/index.tsx
1110
+ import { motion as motion13 } from "framer-motion";
1111
+ import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
1112
+ function LogoCloud({
1113
+ eyebrow,
1114
+ items,
1115
+ variant = "marquee",
1116
+ speed = 32,
1117
+ className
1118
+ }) {
1119
+ const doubled = [...items, ...items];
1120
+ return /* @__PURE__ */ jsx17("section", { className: cn("w-full py-10 lg:py-16", className), children: /* @__PURE__ */ jsxs13("div", { className: "container px-4 md:px-6 max-w-6xl mx-auto", children: [
1121
+ eyebrow && /* @__PURE__ */ jsx17("p", { className: "text-center text-xs font-medium uppercase tracking-widest text-muted-foreground mb-8", children: eyebrow }),
1122
+ variant === "static" ? /* @__PURE__ */ jsx17("div", { className: "flex flex-wrap items-center justify-center gap-8 md:gap-12", children: items.map((item, i) => /* @__PURE__ */ jsx17(
1123
+ motion13.div,
1124
+ {
1125
+ initial: { opacity: 0 },
1126
+ whileInView: { opacity: 1 },
1127
+ viewport: { once: true },
1128
+ transition: { duration: 0.4, delay: i * 0.06 },
1129
+ title: item.name,
1130
+ className: "opacity-50 hover:opacity-80 transition-opacity grayscale hover:grayscale-0",
1131
+ children: item.logo
1132
+ },
1133
+ i
1134
+ )) }) : (
1135
+ /* Marquee */
1136
+ /* @__PURE__ */ jsxs13("div", { className: "relative overflow-hidden", children: [
1137
+ /* @__PURE__ */ jsx17(
1138
+ "div",
1139
+ {
1140
+ "aria-hidden": true,
1141
+ className: "pointer-events-none absolute inset-y-0 left-0 w-20 z-10",
1142
+ style: { background: "linear-gradient(to right, var(--background), transparent)" }
1143
+ }
1144
+ ),
1145
+ /* @__PURE__ */ jsx17(
1146
+ "div",
1147
+ {
1148
+ "aria-hidden": true,
1149
+ className: "pointer-events-none absolute inset-y-0 right-0 w-20 z-10",
1150
+ style: { background: "linear-gradient(to left, var(--background), transparent)" }
1151
+ }
1152
+ ),
1153
+ /* @__PURE__ */ jsx17(
1154
+ motion13.div,
1155
+ {
1156
+ className: "flex gap-12 items-center",
1157
+ animate: { x: ["0%", "-50%"] },
1158
+ transition: { duration: speed, ease: "linear", repeat: Infinity },
1159
+ children: doubled.map((item, i) => /* @__PURE__ */ jsx17(
1160
+ "div",
1161
+ {
1162
+ title: item.name,
1163
+ className: "shrink-0 opacity-40 hover:opacity-75 transition-opacity grayscale hover:grayscale-0",
1164
+ children: item.logo
1165
+ },
1166
+ i
1167
+ ))
1168
+ }
1169
+ )
1170
+ ] })
1171
+ )
1172
+ ] }) });
1173
+ }
1174
+
1175
+ // src/hero-section/index.tsx
1176
+ import { jsx as jsx18, jsxs as jsxs14 } from "react/jsx-runtime";
1177
+ function HeroSection({
1178
+ headline,
1179
+ subheadline,
1180
+ primaryCta,
1181
+ secondaryCta,
1182
+ className,
1183
+ children
1184
+ }) {
1185
+ return /* @__PURE__ */ jsx18(
1186
+ "section",
1187
+ {
1188
+ className: cn(
1189
+ "w-full py-12 md:py-24 lg:py-32 xl:py-48 bg-muted/50 border-b",
1190
+ className
1191
+ ),
1192
+ children: /* @__PURE__ */ jsx18("div", { className: "container px-4 md:px-6", children: /* @__PURE__ */ jsxs14("div", { className: "flex flex-col items-center space-y-4 text-center", children: [
1193
+ /* @__PURE__ */ jsxs14("div", { className: "space-y-2", children: [
1194
+ /* @__PURE__ */ jsx18("h1", { className: "text-3xl font-bold tracking-tighter sm:text-4xl md:text-5xl lg:text-6xl/none", children: headline }),
1195
+ /* @__PURE__ */ jsx18("p", { className: "mx-auto max-w-[700px] text-muted-foreground md:text-xl", children: subheadline })
1196
+ ] }),
1197
+ (primaryCta || secondaryCta) && /* @__PURE__ */ jsxs14("div", { className: "flex gap-4", children: [
1198
+ primaryCta,
1199
+ secondaryCta
1200
+ ] }),
1201
+ children
1202
+ ] }) })
1203
+ }
1204
+ );
1205
+ }
1206
+
1207
+ // src/feature-grid/index.tsx
1208
+ import { jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
1209
+ function FeatureGrid({
1210
+ sectionTitle,
1211
+ features,
1212
+ columns = 3,
1213
+ className
1214
+ }) {
1215
+ const gridCols = {
1216
+ 2: "md:grid-cols-2",
1217
+ 3: "md:grid-cols-3",
1218
+ 4: "md:grid-cols-2 lg:grid-cols-4"
1219
+ };
1220
+ return /* @__PURE__ */ jsx19("section", { className: cn("w-full py-12 lg:py-24", className), children: /* @__PURE__ */ jsxs15("div", { className: "container px-4 md:px-6", children: [
1221
+ /* @__PURE__ */ jsx19("h2", { className: "text-3xl font-bold tracking-tighter text-center mb-8", children: sectionTitle }),
1222
+ /* @__PURE__ */ jsx19("div", { className: cn("grid grid-cols-1 gap-6", gridCols[columns]), children: features.map((feature, i) => /* @__PURE__ */ jsxs15(
1223
+ "div",
1224
+ {
1225
+ className: "flex flex-col items-center p-6 border rounded-lg bg-card text-card-foreground shadow-sm",
1226
+ children: [
1227
+ feature.icon ? /* @__PURE__ */ jsx19("div", { className: "mb-4", children: feature.icon }) : /* @__PURE__ */ jsx19("div", { className: "h-12 w-12 rounded-full bg-muted mb-4" }),
1228
+ /* @__PURE__ */ jsx19("h3", { className: "text-xl font-bold mb-2", children: feature.title }),
1229
+ /* @__PURE__ */ jsx19("p", { className: "text-sm text-muted-foreground text-center", children: feature.description })
1230
+ ]
1231
+ },
1232
+ i
1233
+ )) })
1234
+ ] }) });
1235
+ }
1236
+
1237
+ // src/pricing-table/index.tsx
1238
+ import * as React7 from "react";
1239
+ import { motion as motion14 } from "framer-motion";
1240
+ import { Check } from "lucide-react";
1241
+ import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
1242
+ function formatPrice(p, billing, annualPrice) {
1243
+ if (typeof p === "string") return p;
1244
+ if (billing === "annual" && annualPrice !== void 0) {
1245
+ return typeof annualPrice === "number" ? String(annualPrice) : annualPrice;
1246
+ }
1247
+ return String(p);
1248
+ }
1249
+ function PricingTable({
1250
+ sectionTitle,
1251
+ label,
1252
+ heading,
1253
+ subheading,
1254
+ plans,
1255
+ priceSuffix = "/mo",
1256
+ showToggle = true,
1257
+ annualSavingsLabel = "Save 20%",
1258
+ className
1259
+ }) {
1260
+ const [billing, setBilling] = React7.useState("monthly");
1261
+ const hasAnnual = plans.some((p) => p.annualPrice !== void 0);
1262
+ const title = heading ?? sectionTitle ?? "";
1263
+ return /* @__PURE__ */ jsx20("section", { className: cn("w-full py-16 lg:py-28", className), children: /* @__PURE__ */ jsxs16("div", { className: "container px-4 md:px-6 max-w-6xl mx-auto", children: [
1264
+ (label || title || subheading) && /* @__PURE__ */ jsxs16("div", { className: "text-center mb-10 space-y-4", children: [
1265
+ label && /* @__PURE__ */ jsx20("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx20(SectionLabel, { children: label }) }),
1266
+ title && /* @__PURE__ */ jsx20("h2", { className: "text-3xl md:text-4xl font-bold tracking-tight text-foreground", children: title }),
1267
+ subheading && /* @__PURE__ */ jsx20("p", { className: "text-muted-foreground max-w-xl mx-auto", children: subheading })
1268
+ ] }),
1269
+ showToggle && hasAnnual && /* @__PURE__ */ jsxs16("div", { className: "flex items-center justify-center gap-3 mb-10", children: [
1270
+ /* @__PURE__ */ jsx20(
1271
+ "span",
1272
+ {
1273
+ className: cn(
1274
+ "text-sm font-medium transition-colors",
1275
+ billing === "monthly" ? "text-foreground" : "text-muted-foreground"
1276
+ ),
1277
+ children: "Monthly"
1278
+ }
1279
+ ),
1280
+ /* @__PURE__ */ jsx20(
1281
+ "button",
1282
+ {
1283
+ role: "switch",
1284
+ "aria-checked": billing === "annual",
1285
+ onClick: () => setBilling((b) => b === "monthly" ? "annual" : "monthly"),
1286
+ className: cn(
1287
+ "relative inline-flex h-6 w-11 cursor-pointer rounded-full border-2 border-transparent transition-colors",
1288
+ billing === "annual" ? "bg-primary" : "bg-muted-foreground/30"
1289
+ ),
1290
+ children: /* @__PURE__ */ jsx20(
1291
+ "span",
1292
+ {
1293
+ className: cn(
1294
+ "pointer-events-none inline-block h-5 w-5 rounded-full bg-white shadow-sm transition-transform",
1295
+ billing === "annual" ? "translate-x-5" : "translate-x-0"
1296
+ )
1297
+ }
1298
+ )
1299
+ }
1300
+ ),
1301
+ /* @__PURE__ */ jsxs16(
1302
+ "span",
1303
+ {
1304
+ className: cn(
1305
+ "text-sm font-medium transition-colors",
1306
+ billing === "annual" ? "text-foreground" : "text-muted-foreground"
1307
+ ),
1308
+ children: [
1309
+ "Annual",
1310
+ annualSavingsLabel && /* @__PURE__ */ jsx20("span", { className: "ml-1.5 inline-flex items-center rounded-full px-2 py-0.5 text-xs font-semibold bg-primary/15 text-primary", children: annualSavingsLabel })
1311
+ ]
1312
+ }
1313
+ )
1314
+ ] }),
1315
+ /* @__PURE__ */ jsx20(
1316
+ "div",
1317
+ {
1318
+ className: cn(
1319
+ "grid gap-6",
1320
+ plans.length === 2 && "md:grid-cols-2 max-w-3xl mx-auto",
1321
+ plans.length === 3 && "md:grid-cols-2 lg:grid-cols-3",
1322
+ plans.length >= 4 && "md:grid-cols-2 lg:grid-cols-4"
1323
+ ),
1324
+ children: plans.map((plan, i) => {
1325
+ const isFeatured = plan.isPrimary ?? plan.featured ?? false;
1326
+ const displayPrice = formatPrice(plan.price, billing, plan.annualPrice);
1327
+ const suffix = plan.priceSuffix ?? priceSuffix;
1328
+ return /* @__PURE__ */ jsxs16(
1329
+ motion14.div,
1330
+ {
1331
+ initial: { opacity: 0, y: 24 },
1332
+ whileInView: { opacity: 1, y: 0 },
1333
+ viewport: { once: true },
1334
+ transition: { duration: 0.5, delay: i * 0.08 },
1335
+ className: cn(
1336
+ "relative flex flex-col rounded-2xl border overflow-hidden transition-shadow",
1337
+ isFeatured ? "border-primary/60 bg-card" : "border-border bg-card"
1338
+ ),
1339
+ style: isFeatured ? { boxShadow: "var(--shadow-glow, 0 4px 24px oklch(0.58 0.15 175 / 22%))" } : { boxShadow: "var(--shadow-card)" },
1340
+ children: [
1341
+ isFeatured && /* @__PURE__ */ jsx20(
1342
+ "div",
1343
+ {
1344
+ "aria-hidden": true,
1345
+ className: "absolute inset-x-0 top-0 h-px",
1346
+ style: { background: "var(--gradient-primary, var(--primary))" }
1347
+ }
1348
+ ),
1349
+ plan.badge && /* @__PURE__ */ jsx20("div", { className: "absolute top-4 right-4", children: /* @__PURE__ */ jsx20("span", { className: "inline-flex items-center rounded-full px-2.5 py-1 text-xs font-semibold bg-primary text-primary-foreground", children: plan.badge }) }),
1350
+ /* @__PURE__ */ jsxs16("div", { className: "p-6 pb-0", children: [
1351
+ /* @__PURE__ */ jsx20("p", { className: "text-sm font-medium text-muted-foreground mb-1", children: plan.name }),
1352
+ /* @__PURE__ */ jsx20("p", { className: "text-xs text-muted-foreground/70 mb-5", children: plan.target }),
1353
+ /* @__PURE__ */ jsxs16("div", { className: "flex items-end gap-1 mb-6", children: [
1354
+ /* @__PURE__ */ jsx20("span", { className: "text-4xl font-bold text-foreground tracking-tight", children: typeof displayPrice === "number" ? `$${displayPrice}` : displayPrice }),
1355
+ typeof plan.price === "number" && /* @__PURE__ */ jsx20("span", { className: "text-sm text-muted-foreground mb-1.5", children: suffix })
1356
+ ] })
1357
+ ] }),
1358
+ /* @__PURE__ */ jsx20("div", { className: "flex-1 px-6 pb-6", children: /* @__PURE__ */ jsx20("ul", { className: "space-y-3", children: plan.features.map((feature, j) => /* @__PURE__ */ jsxs16("li", { className: "flex items-start gap-2.5 text-sm text-muted-foreground", children: [
1359
+ /* @__PURE__ */ jsx20(
1360
+ Check,
1361
+ {
1362
+ size: 15,
1363
+ className: "shrink-0 mt-0.5 text-primary",
1364
+ strokeWidth: 2.5
1365
+ }
1366
+ ),
1367
+ feature
1368
+ ] }, j)) }) }),
1369
+ /* @__PURE__ */ jsx20("div", { className: "px-6 pb-6", children: plan.cta ?? /* @__PURE__ */ jsx20(
1370
+ "a",
1371
+ {
1372
+ href: plan.ctaHref ?? "#",
1373
+ className: cn(
1374
+ "flex w-full items-center justify-center rounded-full px-4 py-2.5 text-sm font-semibold transition-all active:scale-[0.97]",
1375
+ isFeatured ? "bg-primary text-primary-foreground hover:opacity-90" : "border border-border bg-background text-foreground hover:bg-accent"
1376
+ ),
1377
+ children: plan.ctaText
1378
+ }
1379
+ ) })
1380
+ ]
1381
+ },
1382
+ i
1383
+ );
1384
+ })
1385
+ }
1386
+ )
1387
+ ] }) });
1388
+ }
1389
+
1390
+ // src/testimonial-carousel/index.tsx
1391
+ import { useEffect as useEffect4, useMemo, useState as useState7 } from "react";
1392
+ import { AnimatePresence as AnimatePresence3, motion as motion15 } from "framer-motion";
1393
+ import { ChevronLeft, ChevronRight, Quote, Star } from "lucide-react";
1394
+ import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
1395
+ var SPRING_EASE2 = [0.22, 1, 0.36, 1];
1396
+ function isPlaceholderCompany(company) {
1397
+ return /^TBD\b/i.test(company.trim());
1398
+ }
1399
+ function TestimonialsCarousel({
1400
+ data,
1401
+ filterByVertical,
1402
+ className
1403
+ }) {
1404
+ const reviews = useMemo(() => {
1405
+ const visible = data.reviews.filter((r) => !r.hidden);
1406
+ if (!filterByVertical) return visible;
1407
+ const filtered = visible.filter((r) => r.vertical === filterByVertical);
1408
+ return filtered.length > 0 ? filtered : visible;
1409
+ }, [data.reviews, filterByVertical]);
1410
+ const verticalLabels = data.vertical_labels ?? {};
1411
+ const [{ index, direction }, setCarouselState] = useState7({ index: 0, direction: 1 });
1412
+ const [isPaused, setIsPaused] = useState7(false);
1413
+ useEffect4(() => {
1414
+ if (isPaused || reviews.length === 0) return;
1415
+ const id = window.setInterval(() => {
1416
+ setCarouselState((s) => ({ index: (s.index + 1) % reviews.length, direction: 1 }));
1417
+ }, 5e3);
1418
+ return () => window.clearInterval(id);
1419
+ }, [isPaused, reviews.length]);
1420
+ const paginate = (dir) => {
1421
+ if (reviews.length === 0) return;
1422
+ setCarouselState((s) => ({
1423
+ index: (s.index + dir + reviews.length) % reviews.length,
1424
+ direction: dir
1425
+ }));
1426
+ };
1427
+ if (reviews.length === 0) return null;
1428
+ const safeIndex = Math.min(index, reviews.length - 1);
1429
+ const active = reviews[safeIndex];
1430
+ const hasMedia = Boolean(active.video);
1431
+ return /* @__PURE__ */ jsx21("div", { className: cn("mt-14", className), children: /* @__PURE__ */ jsxs17(
1432
+ "div",
1433
+ {
1434
+ className: "relative overflow-hidden rounded-[36px] border border-border bg-[linear-gradient(180deg,color-mix(in_srgb,var(--foreground)_6%,transparent),color-mix(in_srgb,var(--foreground)_2%,transparent))] p-4 shadow-panel md:p-6",
1435
+ onMouseEnter: () => setIsPaused(true),
1436
+ onMouseLeave: () => setIsPaused(false),
1437
+ children: [
1438
+ /* @__PURE__ */ jsx21("div", { className: "pointer-events-none absolute inset-0 opacity-[0.05]" }),
1439
+ /* @__PURE__ */ jsx21("div", { className: "pointer-events-none absolute left-[8%] top-0 h-24 w-1/3 rounded-full bg-primary/12 blur-3xl" }),
1440
+ /* @__PURE__ */ jsx21("div", { className: "pointer-events-none absolute bottom-0 right-[8%] h-28 w-1/3 rounded-full bg-secondary/10 blur-3xl" }),
1441
+ /* @__PURE__ */ jsx21("div", { className: "pointer-events-none absolute inset-x-10 bottom-0 h-px bg-gradient-to-r from-transparent via-foreground/15 to-transparent" }),
1442
+ /* @__PURE__ */ jsx21("div", { className: "relative z-10 overflow-hidden rounded-[30px]", children: /* @__PURE__ */ jsx21(AnimatePresence3, { initial: false, mode: "wait", custom: direction, children: /* @__PURE__ */ jsxs17(
1443
+ motion15.div,
1444
+ {
1445
+ custom: direction,
1446
+ initial: { opacity: 0, x: direction > 0 ? 72 : -72, scale: 0.98 },
1447
+ animate: { opacity: 1, x: 0, scale: 1 },
1448
+ exit: { opacity: 0, x: direction > 0 ? -72 : 72, scale: 0.98 },
1449
+ transition: { duration: 0.45, ease: SPRING_EASE2 },
1450
+ className: cn(
1451
+ "glass-panel rounded-[30px] p-6 md:p-8",
1452
+ hasMedia ? "grid gap-8 lg:grid-cols-[0.95fr_1.05fr] lg:items-center lg:gap-10" : "relative overflow-hidden md:p-12"
1453
+ ),
1454
+ style: { willChange: "transform, opacity" },
1455
+ children: [
1456
+ hasMedia && /* @__PURE__ */ jsxs17("div", { className: "relative overflow-hidden rounded-[28px] border border-border bg-[radial-gradient(circle_at_top,color-mix(in_srgb,var(--foreground)_10%,transparent),transparent_40%),linear-gradient(180deg,color-mix(in_srgb,var(--foreground)_5%,transparent),rgba(8,11,20,0.6))]", children: [
1457
+ /* @__PURE__ */ jsx21("div", { className: "aspect-[9/16] w-full" }),
1458
+ /* @__PURE__ */ jsx21(
1459
+ "video",
1460
+ {
1461
+ src: active.thumbnail ? active.video : `${active.video}#t=0.1`,
1462
+ poster: active.thumbnail,
1463
+ preload: "metadata",
1464
+ playsInline: true,
1465
+ controls: true,
1466
+ className: "absolute inset-0 h-full w-full object-cover"
1467
+ }
1468
+ )
1469
+ ] }),
1470
+ hasMedia ? /* @__PURE__ */ jsxs17("div", { children: [
1471
+ /* @__PURE__ */ jsx21("div", { className: "flex items-center gap-1.5 text-[color:var(--rating-star,#F5C451)]", children: Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ jsx21(Star, { className: "h-4 w-4 fill-current" }, i)) }),
1472
+ /* @__PURE__ */ jsx21(Quote, { className: "mt-6 h-8 w-8 text-primary" }),
1473
+ /* @__PURE__ */ jsx21("p", { className: "mt-6 text-xl leading-9 text-foreground md:text-[1.75rem] md:leading-[1.65] lg:max-w-[18ch]", children: active.quote }),
1474
+ /* @__PURE__ */ jsxs17("div", { className: "mt-8 border-t border-border pt-6", children: [
1475
+ /* @__PURE__ */ jsx21("p", { className: "text-sm font-semibold uppercase tracking-[0.12em] text-foreground", children: active.author }),
1476
+ /* @__PURE__ */ jsx21(
1477
+ "p",
1478
+ {
1479
+ className: cn(
1480
+ "mt-2 text-sm",
1481
+ isPlaceholderCompany(active.company) ? "text-amber-300/80" : "text-muted-foreground"
1482
+ ),
1483
+ children: isPlaceholderCompany(active.company) ? "Company TBD" : active.company
1484
+ }
1485
+ ),
1486
+ active.vertical && verticalLabels[active.vertical] && /* @__PURE__ */ jsx21("p", { className: "mt-2 inline-block rounded-full border border-border bg-foreground/[0.05] px-2.5 py-0.5 text-[10px] font-semibold uppercase tracking-[0.14em] text-primary/90", children: verticalLabels[active.vertical] })
1487
+ ] })
1488
+ ] }) : /* @__PURE__ */ jsxs17("div", { className: "relative mx-auto max-w-3xl text-center", children: [
1489
+ /* @__PURE__ */ jsx21("div", { className: "pointer-events-none absolute left-1/2 top-0 h-40 w-40 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary/12 blur-3xl" }),
1490
+ /* @__PURE__ */ jsxs17("div", { className: "relative flex flex-col items-center gap-4", children: [
1491
+ /* @__PURE__ */ jsx21(Quote, { className: "h-10 w-10 text-primary" }),
1492
+ /* @__PURE__ */ jsx21("div", { className: "flex items-center gap-1.5 text-[color:var(--rating-star,#F5C451)]", children: Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ jsx21(Star, { className: "h-4 w-4 fill-current" }, i)) })
1493
+ ] }),
1494
+ /* @__PURE__ */ jsxs17("p", { className: "relative mt-6 font-display text-2xl font-black leading-[1.35] tracking-[-0.02em] text-foreground md:text-3xl md:leading-[1.4]", children: [
1495
+ "\u201C",
1496
+ active.quote,
1497
+ "\u201D"
1498
+ ] }),
1499
+ /* @__PURE__ */ jsx21("div", { className: "relative mx-auto mt-8 h-px w-24 bg-gradient-to-r from-transparent via-primary/50 to-transparent" }),
1500
+ /* @__PURE__ */ jsxs17("div", { className: "relative mt-6", children: [
1501
+ /* @__PURE__ */ jsx21("p", { className: "text-sm font-semibold uppercase tracking-[0.16em] text-foreground", children: active.author }),
1502
+ /* @__PURE__ */ jsx21(
1503
+ "p",
1504
+ {
1505
+ className: cn(
1506
+ "mt-2 text-sm",
1507
+ isPlaceholderCompany(active.company) ? "text-amber-300/80" : "text-muted-foreground"
1508
+ ),
1509
+ children: isPlaceholderCompany(active.company) ? "Company TBD" : active.company
1510
+ }
1511
+ ),
1512
+ active.vertical && verticalLabels[active.vertical] && /* @__PURE__ */ jsx21("p", { className: "mt-3 inline-block rounded-full border border-border bg-foreground/[0.05] px-2.5 py-0.5 text-[10px] font-semibold uppercase tracking-[0.14em] text-primary/90", children: verticalLabels[active.vertical] })
1513
+ ] })
1514
+ ] })
1515
+ ]
1516
+ },
1517
+ `${active.author}-${active.company}`
1518
+ ) }) }),
1519
+ /* @__PURE__ */ jsxs17("div", { className: "relative z-10 mt-5 flex items-center justify-between gap-4", children: [
1520
+ /* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-2", children: [
1521
+ /* @__PURE__ */ jsx21(
1522
+ "button",
1523
+ {
1524
+ type: "button",
1525
+ onClick: () => paginate(-1),
1526
+ className: "inline-flex h-11 w-11 items-center justify-center rounded-full border border-border bg-foreground/[0.05] text-foreground transition-colors hover:border-border hover:bg-foreground/[0.08]",
1527
+ "aria-label": "Previous testimonial",
1528
+ children: /* @__PURE__ */ jsx21(ChevronLeft, { className: "h-5 w-5" })
1529
+ }
1530
+ ),
1531
+ /* @__PURE__ */ jsx21(
1532
+ "button",
1533
+ {
1534
+ type: "button",
1535
+ onClick: () => paginate(1),
1536
+ className: "inline-flex h-11 w-11 items-center justify-center rounded-full border border-border bg-foreground/[0.05] text-foreground transition-colors hover:border-border hover:bg-foreground/[0.08]",
1537
+ "aria-label": "Next testimonial",
1538
+ children: /* @__PURE__ */ jsx21(ChevronRight, { className: "h-5 w-5" })
1539
+ }
1540
+ )
1541
+ ] }),
1542
+ /* @__PURE__ */ jsxs17(
1543
+ "div",
1544
+ {
1545
+ className: "font-label text-sm tabular-nums text-muted-foreground",
1546
+ "aria-live": "polite",
1547
+ "aria-label": `Testimonial ${safeIndex + 1} of ${reviews.length}`,
1548
+ children: [
1549
+ /* @__PURE__ */ jsx21("span", { className: "text-foreground", children: safeIndex + 1 }),
1550
+ " / ",
1551
+ reviews.length
1552
+ ]
1553
+ }
1554
+ )
1555
+ ] })
1556
+ ]
1557
+ }
1558
+ ) });
1559
+ }
1560
+ function TestimonialsSection({ data, filterByVertical }) {
1561
+ return /* @__PURE__ */ jsxs17("section", { id: "testimonials", className: "section-shell", children: [
1562
+ /* @__PURE__ */ jsx21(SectionGlow, { variant: "primary" }),
1563
+ /* @__PURE__ */ jsx21("div", { className: "pointer-events-none absolute inset-x-0 top-0 h-24 bg-gradient-to-b from-foreground/[0.05] to-transparent" }),
1564
+ /* @__PURE__ */ jsxs17("div", { className: "container", children: [
1565
+ /* @__PURE__ */ jsx21(FadeUp, { className: "max-w-3xl", children: /* @__PURE__ */ jsx21(SectionIntro, { label: data.label, title: data.title, body: data.description }) }),
1566
+ /* @__PURE__ */ jsx21(TestimonialsCarousel, { data, filterByVertical })
1567
+ ] })
1568
+ ] });
1569
+ }
1570
+ var TestimonialCarousel = TestimonialsCarousel;
1571
+
1572
+ // src/use-cases/index.tsx
1573
+ import { Lightbulb, PhoneCall, Settings, ShoppingBag, Store } from "lucide-react";
1574
+ import { jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
1575
+ var DEFAULT_ICONS = {
1576
+ Settings,
1577
+ ShoppingBag,
1578
+ PhoneCall,
1579
+ Lightbulb,
1580
+ Store
1581
+ };
1582
+ function UseCasesSection({ data, iconMap }) {
1583
+ const icons = { ...DEFAULT_ICONS, ...iconMap };
1584
+ return /* @__PURE__ */ jsxs18("section", { id: "use-cases", className: "section-shell overflow-x-clip pb-12 md:pb-24", children: [
1585
+ /* @__PURE__ */ jsx22(SectionGlow, { variant: "primary" }),
1586
+ /* @__PURE__ */ jsx22("div", { className: "pointer-events-none absolute inset-0 opacity-[0.03]" }),
1587
+ /* @__PURE__ */ jsx22("div", { className: "pointer-events-none absolute left-[-10%] top-1/4 h-96 w-96 rounded-full bg-secondary/[0.18] blur-[100px]" }),
1588
+ /* @__PURE__ */ jsx22("div", { className: "pointer-events-none absolute right-[-10%] top-2/3 h-96 w-96 rounded-full bg-accent/10 blur-[100px]" }),
1589
+ /* @__PURE__ */ jsxs18("div", { className: "container relative z-10", children: [
1590
+ /* @__PURE__ */ jsx22(FadeUp, { className: "mx-auto max-w-3xl text-center", children: /* @__PURE__ */ jsx22(SectionIntro, { label: data.label, title: data.title, centered: true }) }),
1591
+ /* @__PURE__ */ jsx22(FadeUp, { className: "mt-11 md:mt-14", delay: 0.2, children: /* @__PURE__ */ jsx22("div", { className: "relative mx-auto grid max-w-6xl grid-cols-2 gap-px lg:grid-cols-6", children: data.cards.map((card, idx) => {
1592
+ const Icon = icons[card.icon] ?? Settings;
1593
+ const colClass = data.cards.length === 5 ? idx < 2 ? "lg:col-span-2" : idx === 2 ? "col-span-2 lg:col-span-2" : "col-span-2 lg:col-span-3" : "";
1594
+ return /* @__PURE__ */ jsxs18(
1595
+ "div",
1596
+ {
1597
+ className: cn(
1598
+ "group relative flex flex-col border border-border bg-foreground/[0.04] p-4 transition-colors duration-500 hover:border-border hover:bg-foreground/[0.05] md:p-7",
1599
+ colClass
1600
+ ),
1601
+ children: [
1602
+ /* @__PURE__ */ jsx22("div", { className: "pointer-events-none absolute -right-4 -top-4 h-24 w-24 rounded-full bg-foreground/[0.05] blur-2xl transition-all duration-500 group-hover:bg-foreground/10" }),
1603
+ /* @__PURE__ */ jsx22("div", { className: "flex h-10 w-10 items-center justify-center rounded-xl border border-border bg-foreground/[0.05] text-primary shadow-sm transition-transform duration-500 group-hover:scale-110 group-hover:border-border group-hover:bg-foreground/[0.07] md:h-12 md:w-12", children: /* @__PURE__ */ jsx22(Icon, { className: "h-4 w-4 md:h-5 md:w-5" }) }),
1604
+ /* @__PURE__ */ jsxs18("div", { className: "mt-4 flex flex-1 flex-col md:mt-6", children: [
1605
+ /* @__PURE__ */ jsx22("h3", { className: "font-display text-lg font-bold leading-tight tracking-tight text-foreground md:text-2xl", children: card.title }),
1606
+ /* @__PURE__ */ jsx22("p", { className: "mt-2 text-xs font-medium text-muted-foreground md:text-sm", children: card.subtitle }),
1607
+ /* @__PURE__ */ jsx22("div", { className: "mt-auto pt-4 md:pt-6", children: /* @__PURE__ */ jsx22("p", { className: "text-[10px] leading-relaxed text-muted-foreground md:text-xs", children: card.tracking }) })
1608
+ ] })
1609
+ ]
1610
+ },
1611
+ card.title
1612
+ );
1613
+ }) }) })
1614
+ ] })
1615
+ ] });
1616
+ }
1617
+
1618
+ // src/value-stack/index.tsx
1619
+ import { jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
1620
+ function StackRows({ rows }) {
1621
+ return /* @__PURE__ */ jsx23("ul", { className: "divide-y divide-border", children: rows.map((row) => /* @__PURE__ */ jsxs19(
1622
+ "li",
1623
+ {
1624
+ className: "grid grid-cols-[1fr_auto] items-baseline gap-4 py-2 md:gap-6 md:py-3",
1625
+ children: [
1626
+ /* @__PURE__ */ jsxs19("div", { className: "min-w-0", children: [
1627
+ /* @__PURE__ */ jsx23("span", { className: "text-sm text-foreground/90 md:text-base", children: row.deliverable }),
1628
+ row.note && /* @__PURE__ */ jsx23("div", { className: "mt-0.5 text-[11px] leading-snug text-muted-foreground", children: row.note })
1629
+ ] }),
1630
+ /* @__PURE__ */ jsx23("div", { className: "shrink-0 font-display text-sm font-black tracking-[-0.02em] text-foreground md:text-base", children: row.value })
1631
+ ]
1632
+ },
1633
+ row.deliverable
1634
+ )) });
1635
+ }
1636
+ function ValueStackSection({ data }) {
1637
+ return /* @__PURE__ */ jsxs19("section", { id: "value-stack", className: "section-shell relative overflow-x-clip", children: [
1638
+ /* @__PURE__ */ jsx23(SectionGlow, { variant: "primary" }),
1639
+ /* @__PURE__ */ jsx23("div", { className: "pointer-events-none absolute -left-20 top-1/3 h-72 w-72 rounded-full bg-accent/10 blur-3xl" }),
1640
+ /* @__PURE__ */ jsx23("div", { className: "pointer-events-none absolute -right-20 bottom-0 h-80 w-80 rounded-full bg-secondary/[0.08] blur-3xl" }),
1641
+ /* @__PURE__ */ jsxs19("div", { className: "container", children: [
1642
+ /* @__PURE__ */ jsx23(FadeUp, { className: "max-w-3xl", children: /* @__PURE__ */ jsx23(SectionIntro, { label: data.label, title: data.title, body: data.body }) }),
1643
+ /* @__PURE__ */ jsx23(FadeUp, { children: /* @__PURE__ */ jsx23("div", { className: "mt-12 overflow-hidden rounded-[28px] border border-border bg-[linear-gradient(180deg,color-mix(in_srgb,var(--foreground)_5%,transparent),color-mix(in_srgb,var(--foreground)_2%,transparent))] shadow-panel", children: /* @__PURE__ */ jsx23("div", { className: "grid divide-border lg:grid-cols-2 lg:divide-x", children: ["setup_block", "ongoing_block"].map((blockKey, i) => {
1644
+ const block = data[blockKey];
1645
+ return /* @__PURE__ */ jsxs19(
1646
+ "div",
1647
+ {
1648
+ className: cn(
1649
+ "relative p-6 md:p-8",
1650
+ i === 1 && "border-t border-border lg:border-t-0"
1651
+ ),
1652
+ children: [
1653
+ /* @__PURE__ */ jsx23("h3", { className: "text-xs uppercase tracking-[0.18em] text-primary", children: block.title }),
1654
+ block.subtitle && /* @__PURE__ */ jsx23("p", { className: "mt-1 text-sm text-muted-foreground", children: block.subtitle }),
1655
+ /* @__PURE__ */ jsx23("div", { className: "mt-5", children: /* @__PURE__ */ jsx23(StackRows, { rows: block.rows }) })
1656
+ ]
1657
+ },
1658
+ blockKey
1659
+ );
1660
+ }) }) }) }),
1661
+ /* @__PURE__ */ jsx23(FadeUp, { children: /* @__PURE__ */ jsxs19("div", { className: "mt-8 mx-auto max-w-3xl rounded-[28px] border border-accent/30 bg-[radial-gradient(circle_at_top,rgba(115,136,207,0.14),transparent_55%),linear-gradient(180deg,color-mix(in_srgb,var(--foreground)_5%,transparent),color-mix(in_srgb,var(--foreground)_2%,transparent))] p-6 shadow-panel md:p-8", children: [
1662
+ /* @__PURE__ */ jsx23("div", { className: "mb-2 text-[10px] uppercase tracking-[0.22em] text-muted-foreground", children: "If you hire it out" }),
1663
+ /* @__PURE__ */ jsxs19("div", { className: "grid gap-3 md:grid-cols-[1fr_auto] md:items-center md:gap-6", children: [
1664
+ /* @__PURE__ */ jsx23("div", { className: "text-sm text-muted-foreground md:text-base", children: data.totals.monthly_label }),
1665
+ /* @__PURE__ */ jsx23("div", { className: "font-display text-xl font-black tracking-[-0.02em] text-foreground/80 md:text-2xl", children: data.totals.monthly_value })
1666
+ ] }),
1667
+ /* @__PURE__ */ jsxs19("div", { className: "mt-2 grid gap-3 md:grid-cols-[1fr_auto] md:items-center md:gap-6", children: [
1668
+ /* @__PURE__ */ jsx23("div", { className: "text-sm text-muted-foreground md:text-base", children: data.totals.setup_label }),
1669
+ /* @__PURE__ */ jsx23("div", { className: "font-display text-xl font-black tracking-[-0.02em] text-foreground/80 md:text-2xl", children: data.totals.setup_value })
1670
+ ] }),
1671
+ /* @__PURE__ */ jsx23("div", { className: "my-6 h-px bg-gradient-to-r from-transparent via-primary/40 to-transparent" }),
1672
+ /* @__PURE__ */ jsxs19("div", { className: "grid gap-4 md:grid-cols-[1fr_auto] md:items-center md:gap-6", children: [
1673
+ /* @__PURE__ */ jsxs19("div", { children: [
1674
+ /* @__PURE__ */ jsx23("div", { className: "text-[11px] uppercase tracking-[0.22em] text-accent", children: data.investment.label }),
1675
+ data.investment.note && /* @__PURE__ */ jsx23("div", { className: "mt-2 text-xs leading-relaxed text-muted-foreground", children: data.investment.note })
1676
+ ] }),
1677
+ /* @__PURE__ */ jsx23("div", { className: "font-display text-xl font-black leading-tight tracking-[-0.03em] text-foreground md:text-2xl", children: data.investment.value })
1678
+ ] })
1679
+ ] }) })
1680
+ ] })
1681
+ ] });
1682
+ }
1683
+
1684
+ // src/tech-carousel/index.tsx
1685
+ import { jsx as jsx24, jsxs as jsxs20 } from "react/jsx-runtime";
1686
+ function TechCarousel({
1687
+ items,
1688
+ className,
1689
+ speed = "normal",
1690
+ reverse = false,
1691
+ hoverColor = "text-teal"
1692
+ }) {
1693
+ const doubled = [...items, ...items];
1694
+ const animClass = reverse ? speed === "slow" ? "animate-marquee-reverse" : "animate-marquee-reverse" : speed === "slow" ? "animate-marquee-slow" : "animate-marquee";
1695
+ return /* @__PURE__ */ jsx24(
1696
+ "div",
1697
+ {
1698
+ className: cn(
1699
+ "relative overflow-hidden mask-fade-horizontal",
1700
+ className
1701
+ ),
1702
+ children: /* @__PURE__ */ jsx24("div", { className: cn("flex w-max gap-10 py-4 translate-gpu", animClass), children: doubled.map((item, i) => /* @__PURE__ */ jsxs20(
1703
+ "div",
1704
+ {
1705
+ className: cn(
1706
+ "flex shrink-0 items-center gap-2 text-muted transition-colors duration-300",
1707
+ `hover:${hoverColor}`
1708
+ ),
1709
+ children: [
1710
+ item.icon,
1711
+ /* @__PURE__ */ jsx24("span", { className: "text-sm font-medium whitespace-nowrap", children: item.name })
1712
+ ]
1713
+ },
1714
+ i
1715
+ )) })
1716
+ }
1717
+ );
1718
+ }
1719
+
1720
+ // src/footer/index.tsx
1721
+ import { jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
1722
+ function Footer({
1723
+ copyrightText,
1724
+ links,
1725
+ className,
1726
+ children
1727
+ }) {
1728
+ return /* @__PURE__ */ jsx25("footer", { className: cn("w-full py-6 bg-background border-t", className), children: /* @__PURE__ */ jsxs21("div", { className: "container px-4 md:px-6 flex flex-col md:flex-row items-center justify-between", children: [
1729
+ /* @__PURE__ */ jsx25("div", { className: "text-sm text-muted-foreground", children: copyrightText }),
1730
+ /* @__PURE__ */ jsx25("nav", { className: "flex gap-4 sm:gap-6 mt-4 md:mt-0", children: links.map((link, i) => /* @__PURE__ */ jsx25(
1731
+ "a",
1732
+ {
1733
+ href: link.href,
1734
+ className: "text-sm hover:underline cursor-pointer",
1735
+ children: link.label
1736
+ },
1737
+ i
1738
+ )) }),
1739
+ children
1740
+ ] }) });
1741
+ }
1742
+
1743
+ // src/social-proof/index.tsx
1744
+ import { motion as motion16 } from "framer-motion";
1745
+ import { jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
1746
+ function SocialProof({ items, logos, className }) {
1747
+ return /* @__PURE__ */ jsx26("section", { className: cn("w-full py-8 border-y bg-muted/20", className), children: /* @__PURE__ */ jsxs22("div", { className: "container px-4 md:px-6", children: [
1748
+ logos && logos.length > 0 && /* @__PURE__ */ jsx26("div", { className: "flex flex-wrap items-center justify-center gap-8 mb-8 opacity-60", children: logos.map((logo, i) => /* @__PURE__ */ jsx26("div", { children: logo }, i)) }),
1749
+ /* @__PURE__ */ jsx26("div", { className: "grid grid-cols-2 md:grid-cols-4 gap-6 text-center", children: items.map((item, i) => /* @__PURE__ */ jsxs22(
1750
+ motion16.div,
1751
+ {
1752
+ initial: { opacity: 0, y: 20 },
1753
+ whileInView: { opacity: 1, y: 0 },
1754
+ viewport: { once: true },
1755
+ transition: { delay: i * 0.1 },
1756
+ children: [
1757
+ /* @__PURE__ */ jsx26("div", { className: "text-3xl font-bold", children: item.value }),
1758
+ /* @__PURE__ */ jsx26("div", { className: "text-sm text-muted-foreground", children: item.label })
1759
+ ]
1760
+ },
1761
+ i
1762
+ )) })
1763
+ ] }) });
1764
+ }
1765
+
1766
+ // src/faq/index.tsx
1767
+ import * as React8 from "react";
1768
+ import { motion as motion17, AnimatePresence as AnimatePresence4 } from "framer-motion";
1769
+ import { Plus, Minus } from "lucide-react";
1770
+ import { jsx as jsx27, jsxs as jsxs23 } from "react/jsx-runtime";
1771
+ function Faq({
1772
+ sectionTitle,
1773
+ label,
1774
+ heading,
1775
+ subheading,
1776
+ items,
1777
+ mode = "single",
1778
+ className
1779
+ }) {
1780
+ const [openSet, setOpenSet] = React8.useState(/* @__PURE__ */ new Set());
1781
+ const title = heading ?? sectionTitle ?? "";
1782
+ const toggle = (i) => {
1783
+ setOpenSet((prev) => {
1784
+ const next = new Set(mode === "multi" ? prev : /* @__PURE__ */ new Set());
1785
+ if (prev.has(i)) next.delete(i);
1786
+ else next.add(i);
1787
+ return next;
1788
+ });
1789
+ };
1790
+ return /* @__PURE__ */ jsx27("section", { className: cn("w-full py-16 lg:py-28", className), children: /* @__PURE__ */ jsxs23("div", { className: "container px-4 md:px-6 max-w-3xl mx-auto", children: [
1791
+ (label || title || subheading) && /* @__PURE__ */ jsxs23("div", { className: "text-center mb-12 space-y-4", children: [
1792
+ label && /* @__PURE__ */ jsx27("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx27(SectionLabel, { children: label }) }),
1793
+ title && /* @__PURE__ */ jsx27("h2", { className: "text-3xl md:text-4xl font-bold tracking-tight text-foreground", children: title }),
1794
+ subheading && /* @__PURE__ */ jsx27("p", { className: "text-muted-foreground max-w-xl mx-auto", children: subheading })
1795
+ ] }),
1796
+ /* @__PURE__ */ jsx27("div", { className: "space-y-2", children: items.map((item, i) => {
1797
+ const isOpen = openSet.has(i);
1798
+ return /* @__PURE__ */ jsxs23(
1799
+ motion17.div,
1800
+ {
1801
+ initial: false,
1802
+ className: cn(
1803
+ "rounded-xl border overflow-hidden transition-colors",
1804
+ isOpen ? "border-primary/40 bg-card" : "border-border bg-card/50"
1805
+ ),
1806
+ style: isOpen ? { boxShadow: "var(--glow-primary-sm, none)" } : void 0,
1807
+ children: [
1808
+ /* @__PURE__ */ jsxs23(
1809
+ "button",
1810
+ {
1811
+ className: "flex w-full items-center justify-between gap-4 px-5 py-4 text-left",
1812
+ onClick: () => toggle(i),
1813
+ "aria-expanded": isOpen,
1814
+ children: [
1815
+ /* @__PURE__ */ jsx27(
1816
+ "span",
1817
+ {
1818
+ className: cn(
1819
+ "text-sm font-medium transition-colors",
1820
+ isOpen ? "text-foreground" : "text-foreground/80"
1821
+ ),
1822
+ children: item.question
1823
+ }
1824
+ ),
1825
+ /* @__PURE__ */ jsx27(
1826
+ "span",
1827
+ {
1828
+ className: cn(
1829
+ "shrink-0 rounded-full p-0.5 border transition-all",
1830
+ isOpen ? "border-primary/50 text-primary" : "border-border text-muted-foreground"
1831
+ ),
1832
+ children: isOpen ? /* @__PURE__ */ jsx27(Minus, { size: 14 }) : /* @__PURE__ */ jsx27(Plus, { size: 14 })
1833
+ }
1834
+ )
1835
+ ]
1836
+ }
1837
+ ),
1838
+ /* @__PURE__ */ jsx27(AnimatePresence4, { initial: false, children: isOpen && /* @__PURE__ */ jsx27(
1839
+ motion17.div,
1840
+ {
1841
+ initial: { height: 0, opacity: 0 },
1842
+ animate: { height: "auto", opacity: 1 },
1843
+ exit: { height: 0, opacity: 0 },
1844
+ transition: { duration: 0.25, ease: "easeInOut" },
1845
+ className: "overflow-hidden",
1846
+ children: /* @__PURE__ */ jsx27("p", { className: "px-5 pb-5 text-sm text-muted-foreground leading-relaxed", children: item.answer })
1847
+ },
1848
+ "answer"
1849
+ ) })
1850
+ ]
1851
+ },
1852
+ i
1853
+ );
1854
+ }) })
1855
+ ] }) });
1856
+ }
1857
+
1858
+ // src/comparison-table/index.tsx
1859
+ import { CheckIcon, XIcon } from "lucide-react";
1860
+ import { jsx as jsx28, jsxs as jsxs24 } from "react/jsx-runtime";
1861
+ function ComparisonTable({
1862
+ columns,
1863
+ rows,
1864
+ highlightColumn,
1865
+ className
1866
+ }) {
1867
+ return /* @__PURE__ */ jsx28("div", { className: cn("w-full overflow-x-auto", className), children: /* @__PURE__ */ jsxs24("table", { className: "w-full text-sm", children: [
1868
+ /* @__PURE__ */ jsx28("thead", { children: /* @__PURE__ */ jsxs24("tr", { className: "border-b", children: [
1869
+ /* @__PURE__ */ jsx28("th", { className: "p-4 text-left font-medium text-muted-foreground", children: "Feature" }),
1870
+ columns.map((col, i) => /* @__PURE__ */ jsx28(
1871
+ "th",
1872
+ {
1873
+ className: cn(
1874
+ "p-4 text-center font-bold",
1875
+ highlightColumn === i && "bg-primary/5 text-primary"
1876
+ ),
1877
+ children: col
1878
+ },
1879
+ i
1880
+ ))
1881
+ ] }) }),
1882
+ /* @__PURE__ */ jsx28("tbody", { children: rows.map((row, i) => /* @__PURE__ */ jsxs24("tr", { className: "border-b last:border-0", children: [
1883
+ /* @__PURE__ */ jsx28("td", { className: "p-4 font-medium", children: row.feature }),
1884
+ row.values.map((val, j) => /* @__PURE__ */ jsx28(
1885
+ "td",
1886
+ {
1887
+ className: cn(
1888
+ "p-4 text-center",
1889
+ highlightColumn === j && "bg-primary/5"
1890
+ ),
1891
+ children: typeof val === "boolean" ? val ? /* @__PURE__ */ jsx28(CheckIcon, { className: "mx-auto h-4 w-4 text-primary" }) : /* @__PURE__ */ jsx28(XIcon, { className: "mx-auto h-4 w-4 text-muted-foreground/40" }) : val
1892
+ },
1893
+ j
1894
+ ))
1895
+ ] }, i)) })
1896
+ ] }) });
1897
+ }
1898
+
1899
+ // src/hero-canvas/index.tsx
1900
+ import { Canvas, useFrame } from "@react-three/fiber";
1901
+ import { createNoise3D } from "simplex-noise";
1902
+ import { AdditiveBlending, BufferAttribute, Color } from "three";
1903
+ import { useEffect as useEffect5, useMemo as useMemo2, useRef as useRef3, useState as useState9 } from "react";
1904
+ import { useInView as useInView3 } from "framer-motion";
1905
+ import { jsx as jsx29, jsxs as jsxs25 } from "react/jsx-runtime";
1906
+ function buildNodes(count) {
1907
+ const accentEvery = Math.max(1, Math.floor(count / 15));
1908
+ const nodes = [];
1909
+ for (let index = 0; index < count; index += 1) {
1910
+ const angle = Math.random() * Math.PI * 2;
1911
+ const radius = 1.5 + Math.random() * 5.75;
1912
+ const spread = Math.random() * 1.2;
1913
+ nodes.push({
1914
+ accent: index % accentEvery === 0,
1915
+ baseX: Math.cos(angle) * radius * 1.5,
1916
+ baseY: (Math.random() - 0.5) * 16 + spread,
1917
+ baseZ: (Math.random() - 0.5) * 6,
1918
+ driftX: Math.random() * 100,
1919
+ driftY: Math.random() * 100,
1920
+ driftZ: Math.random() * 100
1921
+ });
1922
+ }
1923
+ return nodes;
1924
+ }
1925
+ function ParticleNetwork({
1926
+ count,
1927
+ accentColor,
1928
+ baseColor
1929
+ }) {
1930
+ const groupRef = useRef3(null);
1931
+ const pointsRef = useRef3(null);
1932
+ const linesRef = useRef3(null);
1933
+ const cursorRef = useRef3({ x: 0, y: 0 });
1934
+ const nodes = useMemo2(() => buildNodes(count), [count]);
1935
+ const noise3D = useMemo2(() => createNoise3D(), []);
1936
+ const pointPositions = useMemo2(() => new Float32Array(count * 3), [count]);
1937
+ const pointColors = useMemo2(() => new Float32Array(count * 3), [count]);
1938
+ const cursorOffsetsX = useMemo2(() => new Float32Array(count), [count]);
1939
+ const cursorOffsetsY = useMemo2(() => new Float32Array(count), [count]);
1940
+ const accent = useMemo2(() => new Color(accentColor), [accentColor]);
1941
+ const base = useMemo2(() => new Color(baseColor), [baseColor]);
1942
+ useEffect5(() => {
1943
+ const handleMouseMove = (event) => {
1944
+ cursorRef.current.x = event.clientX / window.innerWidth * 2 - 1;
1945
+ cursorRef.current.y = -(event.clientY / window.innerHeight * 2 - 1);
1946
+ };
1947
+ window.addEventListener("mousemove", handleMouseMove);
1948
+ return () => window.removeEventListener("mousemove", handleMouseMove);
1949
+ }, []);
1950
+ useEffect5(() => {
1951
+ nodes.forEach((node, index) => {
1952
+ const pointIndex = index * 3;
1953
+ pointPositions[pointIndex] = node.baseX;
1954
+ pointPositions[pointIndex + 1] = node.baseY;
1955
+ pointPositions[pointIndex + 2] = node.baseZ;
1956
+ const color = node.accent ? accent : base;
1957
+ pointColors[pointIndex] = color.r;
1958
+ pointColors[pointIndex + 1] = color.g;
1959
+ pointColors[pointIndex + 2] = color.b;
1960
+ });
1961
+ const geometry = pointsRef.current?.geometry;
1962
+ if (!geometry) return;
1963
+ geometry.setAttribute("position", new BufferAttribute(pointPositions, 3));
1964
+ geometry.setAttribute("color", new BufferAttribute(pointColors, 3));
1965
+ }, [nodes, pointColors, pointPositions, accent, base]);
1966
+ useFrame(({ clock, pointer }) => {
1967
+ const time = clock.elapsedTime * 0.16;
1968
+ const cursorWorldX = cursorRef.current.x * 9;
1969
+ const cursorWorldY = cursorRef.current.y * 5.5;
1970
+ const attractRadius = 3.2;
1971
+ const attractStrength = 1.4;
1972
+ const lerpFactor = 0.06;
1973
+ for (let index = 0; index < nodes.length; index += 1) {
1974
+ const node = nodes[index];
1975
+ const positionIndex = index * 3;
1976
+ pointPositions[positionIndex] = node.baseX + noise3D(node.driftX, time, node.driftZ) * 0.85;
1977
+ pointPositions[positionIndex + 1] = node.baseY + noise3D(node.driftY, node.driftX, time) * 0.7;
1978
+ pointPositions[positionIndex + 2] = node.baseZ + noise3D(time, node.driftZ, node.driftY) * 0.55;
1979
+ }
1980
+ for (let index = 0; index < nodes.length; index += 1) {
1981
+ const positionIndex = index * 3;
1982
+ const dx = cursorWorldX - pointPositions[positionIndex];
1983
+ const dy = cursorWorldY - pointPositions[positionIndex + 1];
1984
+ const distance = Math.hypot(dx, dy);
1985
+ let targetOffsetX = 0;
1986
+ let targetOffsetY = 0;
1987
+ if (distance < attractRadius) {
1988
+ const influence = 1 - distance / attractRadius;
1989
+ targetOffsetX = dx * influence * attractStrength;
1990
+ targetOffsetY = dy * influence * attractStrength;
1991
+ }
1992
+ cursorOffsetsX[index] += (targetOffsetX - cursorOffsetsX[index]) * lerpFactor;
1993
+ cursorOffsetsY[index] += (targetOffsetY - cursorOffsetsY[index]) * lerpFactor;
1994
+ pointPositions[positionIndex] += cursorOffsetsX[index];
1995
+ pointPositions[positionIndex + 1] += cursorOffsetsY[index];
1996
+ }
1997
+ const pointGeometry = pointsRef.current?.geometry;
1998
+ const lineGeometry = linesRef.current?.geometry;
1999
+ if (pointGeometry?.attributes.position) {
2000
+ pointGeometry.attributes.position.needsUpdate = true;
2001
+ }
2002
+ if (lineGeometry) {
2003
+ const segments = [];
2004
+ const maxSegments = count < 400 ? 540 : 1200;
2005
+ const threshold = count < 400 ? 2.3 : 2.5;
2006
+ const thresholdSq = threshold * threshold;
2007
+ for (let index = 0; index < nodes.length; index += 1) {
2008
+ for (let nextIndex = index + 1; nextIndex < nodes.length; nextIndex += 1) {
2009
+ const offsetA = index * 3;
2010
+ const offsetB = nextIndex * 3;
2011
+ const dx = pointPositions[offsetA] - pointPositions[offsetB];
2012
+ const dy = pointPositions[offsetA + 1] - pointPositions[offsetB + 1];
2013
+ const dz = pointPositions[offsetA + 2] - pointPositions[offsetB + 2];
2014
+ if (dx * dx + dy * dy + dz * dz > thresholdSq) continue;
2015
+ segments.push(
2016
+ pointPositions[offsetA],
2017
+ pointPositions[offsetA + 1],
2018
+ pointPositions[offsetA + 2],
2019
+ pointPositions[offsetB],
2020
+ pointPositions[offsetB + 1],
2021
+ pointPositions[offsetB + 2]
2022
+ );
2023
+ if (segments.length / 6 >= maxSegments) break;
2024
+ }
2025
+ if (segments.length / 6 >= maxSegments) break;
2026
+ }
2027
+ lineGeometry.setAttribute("position", new BufferAttribute(new Float32Array(segments), 3));
2028
+ }
2029
+ if (groupRef.current) {
2030
+ const baseOffsetX = count < 300 ? 2.1 : 2.75;
2031
+ const baseOffsetY = count < 300 ? 0.1 : -0.15;
2032
+ groupRef.current.position.x += (baseOffsetX + pointer.x * 0.45 - groupRef.current.position.x) * 0.045;
2033
+ groupRef.current.position.y += (baseOffsetY + pointer.y * 0.32 - groupRef.current.position.y) * 0.045;
2034
+ groupRef.current.rotation.y += (pointer.x * 0.06 - groupRef.current.rotation.y) * 0.035;
2035
+ groupRef.current.rotation.x += (-pointer.y * 0.04 - groupRef.current.rotation.x) * 0.035;
2036
+ }
2037
+ });
2038
+ return /* @__PURE__ */ jsxs25("group", { ref: groupRef, children: [
2039
+ /* @__PURE__ */ jsxs25("points", { ref: pointsRef, children: [
2040
+ /* @__PURE__ */ jsx29("bufferGeometry", {}),
2041
+ /* @__PURE__ */ jsx29(
2042
+ "pointsMaterial",
2043
+ {
2044
+ size: count < 400 ? 0.048 : 0.045,
2045
+ sizeAttenuation: true,
2046
+ transparent: true,
2047
+ opacity: 0.92,
2048
+ depthWrite: false,
2049
+ vertexColors: true,
2050
+ blending: AdditiveBlending
2051
+ }
2052
+ )
2053
+ ] }),
2054
+ /* @__PURE__ */ jsxs25("lineSegments", { ref: linesRef, children: [
2055
+ /* @__PURE__ */ jsx29("bufferGeometry", {}),
2056
+ /* @__PURE__ */ jsx29(
2057
+ "lineBasicMaterial",
2058
+ {
2059
+ color: baseColor,
2060
+ transparent: true,
2061
+ opacity: count < 400 ? 0.25 : 0.2,
2062
+ depthWrite: false,
2063
+ blending: AdditiveBlending
2064
+ }
2065
+ )
2066
+ ] })
2067
+ ] });
2068
+ }
2069
+ function HeroCanvas({
2070
+ accentColor = "#8fccb6",
2071
+ baseColor = "#7388cf",
2072
+ density,
2073
+ className = "pointer-events-none absolute inset-0 z-[2] translate-gpu opacity-60 md:opacity-100"
2074
+ }) {
2075
+ const [count, setCount] = useState9(density ?? 400);
2076
+ const containerRef = useRef3(null);
2077
+ const isInView = useInView3(containerRef);
2078
+ useEffect5(() => {
2079
+ if (density != null) {
2080
+ setCount(density);
2081
+ return;
2082
+ }
2083
+ const media = window.matchMedia("(max-width: 767px)");
2084
+ const updateCount = () => setCount(media.matches ? 350 : 800);
2085
+ updateCount();
2086
+ media.addEventListener("change", updateCount);
2087
+ return () => media.removeEventListener("change", updateCount);
2088
+ }, [density]);
2089
+ return /* @__PURE__ */ jsx29("div", { ref: containerRef, className, style: { willChange: "transform" }, children: /* @__PURE__ */ jsx29(
2090
+ Canvas,
2091
+ {
2092
+ frameloop: isInView ? "always" : "demand",
2093
+ camera: { fov: 50, position: [0, 0, 12] },
2094
+ dpr: [1, 1.5],
2095
+ gl: { alpha: true, antialias: false, powerPreference: "high-performance" },
2096
+ children: /* @__PURE__ */ jsx29(ParticleNetwork, { count, accentColor, baseColor })
2097
+ }
2098
+ ) });
2099
+ }
2100
+
2101
+ // src/wave-canvas/index.tsx
2102
+ import { Canvas as Canvas2, useFrame as useFrame2 } from "@react-three/fiber";
2103
+ import { createNoise2D } from "simplex-noise";
2104
+ import { AdditiveBlending as AdditiveBlending2, BufferAttribute as BufferAttribute2, BufferGeometry, Color as Color2, Line, LineBasicMaterial } from "three";
2105
+ import { useMemo as useMemo3, useRef as useRef4 } from "react";
2106
+ import { useInView as useInView4 } from "framer-motion";
2107
+ import { jsx as jsx30 } from "react/jsx-runtime";
2108
+ var DEFAULT_WAVES = [
2109
+ { yOffset: 0.55, amplitude: 0.26, freq: 1.4, speed: 0.38, color: "#8fccb6", opacity: 0.9 },
2110
+ { yOffset: 0.18, amplitude: 0.2, freq: 2.1, speed: 0.55, color: "#5aaa94", opacity: 0.72 },
2111
+ { yOffset: -0.18, amplitude: 0.28, freq: 1.7, speed: 0.44, color: "#4F72D8", opacity: 0.55 },
2112
+ { yOffset: -0.55, amplitude: 0.16, freq: 2.6, speed: 0.62, color: "#1f2d56", opacity: 0.42 }
2113
+ ];
2114
+ var SEGMENTS = 220;
2115
+ function SineWave({ yOffset, amplitude, freq, speed, color, opacity }) {
2116
+ const noise2D = useMemo3(() => createNoise2D(), []);
2117
+ const geo = useMemo3(() => {
2118
+ const g = new BufferGeometry();
2119
+ g.setAttribute("position", new BufferAttribute2(new Float32Array((SEGMENTS + 1) * 3), 3));
2120
+ return g;
2121
+ }, []);
2122
+ const mat = useMemo3(
2123
+ () => new LineBasicMaterial({
2124
+ color: new Color2(color),
2125
+ transparent: true,
2126
+ opacity,
2127
+ blending: AdditiveBlending2,
2128
+ depthWrite: false
2129
+ }),
2130
+ [color, opacity]
2131
+ );
2132
+ const lineRef = useRef4(new Line(geo, mat));
2133
+ useFrame2(({ clock }) => {
2134
+ const t = clock.getElapsedTime() * speed;
2135
+ const pos = geo.attributes.position.array;
2136
+ for (let i = 0; i <= SEGMENTS; i++) {
2137
+ const x = i / SEGMENTS * 4 - 2;
2138
+ const n = noise2D(x * freq * 0.4, t);
2139
+ pos[i * 3] = x;
2140
+ pos[i * 3 + 1] = yOffset + n * amplitude;
2141
+ pos[i * 3 + 2] = 0;
2142
+ }
2143
+ geo.attributes.position.needsUpdate = true;
2144
+ });
2145
+ return /* @__PURE__ */ jsx30("primitive", { object: lineRef.current });
2146
+ }
2147
+ function WaveCanvas({ waves = DEFAULT_WAVES, className }) {
2148
+ const containerRef = useRef4(null);
2149
+ const isInView = useInView4(containerRef);
2150
+ return /* @__PURE__ */ jsx30(
2151
+ "div",
2152
+ {
2153
+ ref: containerRef,
2154
+ className,
2155
+ style: { width: "100%", height: "100%", position: "relative" },
2156
+ children: /* @__PURE__ */ jsx30(
2157
+ Canvas2,
2158
+ {
2159
+ frameloop: isInView ? "always" : "demand",
2160
+ orthographic: true,
2161
+ camera: { zoom: 120, position: [0, 0, 10] },
2162
+ style: { width: "100%", height: "100%" },
2163
+ gl: { antialias: true, alpha: true },
2164
+ children: waves.map((w, i) => /* @__PURE__ */ jsx30(SineWave, { ...w }, i))
2165
+ }
2166
+ )
2167
+ }
2168
+ );
2169
+ }
2170
+
2171
+ export {
2172
+ FadeUp,
2173
+ ScrollReveal,
2174
+ SectionLabel,
2175
+ SectionGlow,
2176
+ SectionIntro,
2177
+ TextRotator,
2178
+ AvatarGroup,
2179
+ Marquee,
2180
+ LayeredButton,
2181
+ NavBar,
2182
+ CTABanner,
2183
+ ProcessSteps,
2184
+ ContactForm,
2185
+ CaseStudiesSection,
2186
+ BentoGrid,
2187
+ StatsSection,
2188
+ LogoCloud,
2189
+ HeroSection,
2190
+ FeatureGrid,
2191
+ PricingTable,
2192
+ TestimonialsCarousel,
2193
+ TestimonialsSection,
2194
+ TestimonialCarousel,
2195
+ UseCasesSection,
2196
+ ValueStackSection,
2197
+ TechCarousel,
2198
+ Footer,
2199
+ SocialProof,
2200
+ Faq,
2201
+ ComparisonTable,
2202
+ HeroCanvas,
2203
+ DEFAULT_WAVES,
2204
+ WaveCanvas
2205
+ };