@nimblegiant/stilts 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,2434 @@
1
+ import { useState, useEffect, useCallback, useRef } from 'react';
2
+ import { Moon, Sun, X, Menu, ArrowRight } from 'lucide-react';
3
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
4
+
5
+ var __defProp = Object.defineProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+
11
+ // src/components/layout/index.ts
12
+ var layout_exports = {};
13
+ __export(layout_exports, {
14
+ MainNav: () => MainNav
15
+ });
16
+ function MainNav({ currentPath, isPortfolioPage = false }) {
17
+ const [theme, setTheme] = useState(() => {
18
+ if (typeof document !== "undefined") {
19
+ return document.documentElement.getAttribute("data-theme") || "light";
20
+ }
21
+ return "light";
22
+ });
23
+ const [isMenuOpen, setIsMenuOpen] = useState(false);
24
+ const [isScrolled, setIsScrolled] = useState(false);
25
+ useEffect(() => {
26
+ let ticking = false;
27
+ const handleScroll = () => {
28
+ if (!ticking) {
29
+ window.requestAnimationFrame(() => {
30
+ setIsScrolled(window.scrollY > 50);
31
+ ticking = false;
32
+ });
33
+ ticking = true;
34
+ }
35
+ };
36
+ window.addEventListener("scroll", handleScroll, { passive: true });
37
+ return () => window.removeEventListener("scroll", handleScroll);
38
+ }, []);
39
+ useEffect(() => {
40
+ if (isMenuOpen) {
41
+ document.body.style.overflow = "hidden";
42
+ } else {
43
+ document.body.style.overflow = "";
44
+ }
45
+ return () => {
46
+ document.body.style.overflow = "";
47
+ };
48
+ }, [isMenuOpen]);
49
+ useEffect(() => {
50
+ const handleEscape = (e) => {
51
+ if (e.key === "Escape" && isMenuOpen) {
52
+ setIsMenuOpen(false);
53
+ }
54
+ };
55
+ window.addEventListener("keydown", handleEscape);
56
+ return () => window.removeEventListener("keydown", handleEscape);
57
+ }, [isMenuOpen]);
58
+ const toggleTheme = useCallback(() => {
59
+ const newTheme = theme === "light" ? "dark" : "light";
60
+ setTheme(newTheme);
61
+ document.documentElement.setAttribute("data-theme", newTheme);
62
+ localStorage.setItem("theme", newTheme);
63
+ }, [theme]);
64
+ const navLinks = [
65
+ { href: "/", label: "HOME" },
66
+ { href: "/about", label: "ABOUT" },
67
+ { href: "/services", label: "SERVICES" },
68
+ { href: "/contact", label: "CONTACT" }
69
+ ];
70
+ const isActive = (href) => {
71
+ if (href === "/") return currentPath === "/";
72
+ return currentPath.startsWith(href);
73
+ };
74
+ const showLightText = isPortfolioPage && !isScrolled || theme === "dark";
75
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
76
+ /* @__PURE__ */ jsx("a", { href: "#main-content", className: "skip-link", children: "Skip to main content" }),
77
+ /* @__PURE__ */ jsx(
78
+ "nav",
79
+ {
80
+ role: "navigation",
81
+ "aria-label": "Main navigation",
82
+ className: `fixed top-0 right-0 left-0 z-[var(--z-nav)] border-b border-[var(--color-border)]/0 transition-all duration-300 ease-out ${isScrolled ? "bg-[var(--color-surface-overlay)]/0 backdrop-blur-sm" : "bg-transparent"} `,
83
+ children: /* @__PURE__ */ jsxs("div", { className: "container-xl container flex h-20 items-center justify-between sm:p-6 lg:p-14", children: [
84
+ /* @__PURE__ */ jsx(
85
+ "a",
86
+ {
87
+ href: "/",
88
+ className: "flex-shrink-0 transition-opacity duration-200 hover:opacity-70",
89
+ "aria-label": "Nimble Giant - Home",
90
+ children: /* @__PURE__ */ jsx(
91
+ "img",
92
+ {
93
+ src: showLightText ? "/images/logo-light.svg" : "/images/logo-dark.svg",
94
+ alt: "",
95
+ "aria-hidden": "true",
96
+ className: "h-10 w-auto"
97
+ }
98
+ )
99
+ }
100
+ ),
101
+ /* @__PURE__ */ jsxs("div", { className: "hidden items-center gap-12 md:flex", children: [
102
+ /* @__PURE__ */ jsx("ul", { className: "flex items-center gap-10", role: "list", children: navLinks.map((link) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
103
+ "a",
104
+ {
105
+ href: link.href,
106
+ className: `relative py-2 text-sm font-medium tracking-wider transition-colors duration-200 focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-2 focus-visible:ring-offset-transparent focus-visible:outline-none ${showLightText ? "text-white/70 hover:text-white" : "text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)]"} ${isActive(link.href) ? showLightText ? "!text-white" : "!text-[var(--color-text-primary)]" : ""} `,
107
+ "aria-current": isActive(link.href) ? "page" : void 0,
108
+ children: [
109
+ link.label,
110
+ /* @__PURE__ */ jsx(
111
+ "span",
112
+ {
113
+ className: `absolute right-0 -bottom-1 left-0 h-0.5 rounded-full transition-all duration-200 ${isActive(link.href) ? showLightText ? "bg-gradient-to-r from-[var(--color-dot-magenta)] via-[var(--color-dot-purple)] to-[var(--color-dot-turquoise)]" : "bg-gradient-to-r from-[var(--color-dot-magenta)] via-[var(--color-dot-purple)] to-[var(--color-dot-turquoise)]" : "bg-transparent"} `,
114
+ "aria-hidden": "true"
115
+ }
116
+ )
117
+ ]
118
+ }
119
+ ) }, link.href)) }),
120
+ /* @__PURE__ */ jsx(
121
+ "button",
122
+ {
123
+ onClick: toggleTheme,
124
+ className: `p-1 transition-all duration-200 focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-2 focus-visible:outline-none ${showLightText ? "text-white/70 hover:text-white" : "text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)]"} `,
125
+ "aria-label": `Switch to ${theme === "light" ? "dark" : "light"} mode`,
126
+ title: `Switch to ${theme === "light" ? "dark" : "light"} mode`,
127
+ children: theme === "light" ? /* @__PURE__ */ jsx(Moon, { className: "h-5 w-5", "aria-hidden": "true" }) : /* @__PURE__ */ jsx(Sun, { className: "h-5 w-5", "aria-hidden": "true" })
128
+ }
129
+ )
130
+ ] }),
131
+ /* @__PURE__ */ jsx(
132
+ "button",
133
+ {
134
+ onClick: () => setIsMenuOpen(!isMenuOpen),
135
+ className: `p-2 transition-colors duration-200 focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:outline-none md:hidden ${showLightText ? "text-white/70 hover:text-white" : "text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)]"} `,
136
+ "aria-label": isMenuOpen ? "Close navigation menu" : "Open navigation menu",
137
+ "aria-expanded": isMenuOpen,
138
+ "aria-controls": "mobile-menu",
139
+ children: isMenuOpen ? /* @__PURE__ */ jsx(X, { className: "h-6 w-6", "aria-hidden": "true" }) : /* @__PURE__ */ jsx(Menu, { className: "h-6 w-6", "aria-hidden": "true" })
140
+ }
141
+ )
142
+ ] })
143
+ }
144
+ ),
145
+ /* @__PURE__ */ jsxs(
146
+ "div",
147
+ {
148
+ id: "mobile-menu",
149
+ role: "dialog",
150
+ "aria-modal": "true",
151
+ "aria-label": "Navigation menu",
152
+ className: `fixed inset-0 z-[calc(var(--z-nav)-1)] transition-all duration-300 ease-out md:hidden ${isMenuOpen ? "pointer-events-auto opacity-100" : "pointer-events-none opacity-0"} `,
153
+ children: [
154
+ /* @__PURE__ */ jsx(
155
+ "div",
156
+ {
157
+ className: `absolute inset-0 bg-black/50 backdrop-blur-sm transition-opacity duration-300 ${isMenuOpen ? "opacity-100" : "opacity-0"} `,
158
+ onClick: () => setIsMenuOpen(false),
159
+ "aria-hidden": "true"
160
+ }
161
+ ),
162
+ /* @__PURE__ */ jsx(
163
+ "div",
164
+ {
165
+ className: `absolute top-0 right-0 h-full w-full max-w-sm border-l border-[var(--color-border)] bg-[var(--color-background)] transition-transform duration-300 ease-out ${isMenuOpen ? "translate-x-0" : "translate-x-full"} `,
166
+ children: /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col px-6 pt-24 pb-8", children: [
167
+ /* @__PURE__ */ jsx("nav", { className: "flex-1", children: /* @__PURE__ */ jsx("ul", { className: "space-y-1", role: "list", children: navLinks.map((link, index) => /* @__PURE__ */ jsx(
168
+ "li",
169
+ {
170
+ className: `transition-all duration-300 ${isMenuOpen ? "translate-x-0 opacity-100" : "translate-x-8 opacity-0"} `,
171
+ style: { transitionDelay: isMenuOpen ? `${index * 50 + 100}ms` : "0ms" },
172
+ children: /* @__PURE__ */ jsxs(
173
+ "a",
174
+ {
175
+ href: link.href,
176
+ onClick: () => setIsMenuOpen(false),
177
+ className: `group flex items-center justify-between rounded-lg px-4 py-3 text-base font-medium tracking-wide transition-colors duration-200 hover:bg-[var(--color-background-muted)] focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:outline-none ${isActive(link.href) ? "bg-[var(--color-background-muted)] text-[var(--color-text-primary)]" : "text-[var(--color-text-muted)]"} `,
178
+ "aria-current": isActive(link.href) ? "page" : void 0,
179
+ children: [
180
+ link.label,
181
+ /* @__PURE__ */ jsx(
182
+ ArrowRight,
183
+ {
184
+ className: `h-4 w-4 transition-all duration-200 ${isActive(link.href) ? "opacity-50" : "opacity-0 group-hover:opacity-30"} `,
185
+ "aria-hidden": "true"
186
+ }
187
+ )
188
+ ]
189
+ }
190
+ )
191
+ },
192
+ link.href
193
+ )) }) }),
194
+ /* @__PURE__ */ jsx(
195
+ "div",
196
+ {
197
+ className: `border-t border-[var(--color-border)] pt-6 transition-all duration-300 ${isMenuOpen ? "translate-y-0 opacity-100" : "translate-y-4 opacity-0"} `,
198
+ style: { transitionDelay: isMenuOpen ? "300ms" : "0ms" },
199
+ children: /* @__PURE__ */ jsx(
200
+ "button",
201
+ {
202
+ onClick: toggleTheme,
203
+ className: "flex w-full items-center justify-between rounded-lg px-4 py-3 text-[var(--color-text-muted)] transition-colors duration-200 hover:bg-[var(--color-background-muted)] hover:text-[var(--color-text-primary)] focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:outline-none",
204
+ "aria-label": `Switch to ${theme === "light" ? "dark" : "light"} mode`,
205
+ children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-3", children: [
206
+ theme === "light" ? /* @__PURE__ */ jsx(Moon, { className: "h-5 w-5", "aria-hidden": "true" }) : /* @__PURE__ */ jsx(Sun, { className: "h-5 w-5", "aria-hidden": "true" }),
207
+ /* @__PURE__ */ jsx("span", { className: "font-medium tracking-wide", children: theme === "light" ? "DARK MODE" : "LIGHT MODE" })
208
+ ] })
209
+ }
210
+ )
211
+ }
212
+ )
213
+ ] })
214
+ }
215
+ )
216
+ ]
217
+ }
218
+ )
219
+ ] });
220
+ }
221
+
222
+ // src/components/ui/index.ts
223
+ var ui_exports = {};
224
+ __export(ui_exports, {
225
+ Toast: () => ToastContainer
226
+ });
227
+ var icons = {
228
+ success: /* @__PURE__ */ jsx("svg", { className: "h-5 w-5 text-green-500", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }),
229
+ error: /* @__PURE__ */ jsx("svg", { className: "h-5 w-5 text-red-500", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }),
230
+ info: /* @__PURE__ */ jsx("svg", { className: "h-5 w-5 text-blue-500", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx(
231
+ "path",
232
+ {
233
+ strokeLinecap: "round",
234
+ strokeLinejoin: "round",
235
+ strokeWidth: 2,
236
+ d: "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"
237
+ }
238
+ ) }),
239
+ warning: /* @__PURE__ */ jsx("svg", { className: "h-5 w-5 text-yellow-500", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx(
240
+ "path",
241
+ {
242
+ strokeLinecap: "round",
243
+ strokeLinejoin: "round",
244
+ strokeWidth: 2,
245
+ d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"
246
+ }
247
+ ) })
248
+ };
249
+ var typeStyles = {
250
+ success: "border-green-500/30 bg-green-500/10",
251
+ error: "border-red-500/30 bg-red-500/10",
252
+ info: "border-blue-500/30 bg-blue-500/10",
253
+ warning: "border-yellow-500/30 bg-yellow-500/10"
254
+ };
255
+ function ToastContainer() {
256
+ const [toasts, setToasts] = useState([]);
257
+ const removeToast = useCallback((id) => {
258
+ setToasts((prev) => prev.filter((t) => t.id !== id));
259
+ }, []);
260
+ const addToast = useCallback(
261
+ (options) => {
262
+ const id = Math.random().toString(36).substring(2, 9);
263
+ const toast = {
264
+ id,
265
+ type: options.type || "info",
266
+ title: options.title,
267
+ message: options.message,
268
+ duration: options.duration !== void 0 ? options.duration : 5e3
269
+ };
270
+ setToasts((prev) => [...prev, toast]);
271
+ if (toast.duration && toast.duration > 0) {
272
+ setTimeout(() => removeToast(id), toast.duration);
273
+ }
274
+ },
275
+ [removeToast]
276
+ );
277
+ useEffect(() => {
278
+ window.showToast = addToast;
279
+ return () => {
280
+ delete window.showToast;
281
+ };
282
+ }, [addToast, removeToast]);
283
+ return /* @__PURE__ */ jsx(
284
+ "div",
285
+ {
286
+ id: "toast-container",
287
+ className: "fixed right-4 bottom-4 z-[var(--z-toast)] flex flex-col gap-2 backdrop-blur-md",
288
+ "aria-live": "polite",
289
+ "aria-atomic": "true",
290
+ children: toasts.map((toast) => /* @__PURE__ */ jsxs(
291
+ "div",
292
+ {
293
+ className: `animate-in slide-in-from-right flex max-w-md min-w-[300px] items-start gap-3 rounded-lg border px-4 py-3 text-[var(--color-text-primary)] shadow-lg transition-all duration-300 ${typeStyles[toast.type || "info"]}`,
294
+ role: "alert",
295
+ children: [
296
+ /* @__PURE__ */ jsx("span", { className: "mt-0.5 shrink-0", children: icons[toast.type || "info"] }),
297
+ /* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
298
+ toast.title && /* @__PURE__ */ jsx("p", { className: "font-medium", children: toast.title }),
299
+ toast.message && /* @__PURE__ */ jsx("p", { className: "mt-1 text-sm opacity-80", children: toast.message })
300
+ ] }),
301
+ /* @__PURE__ */ jsx(
302
+ "button",
303
+ {
304
+ type: "button",
305
+ onClick: () => removeToast(toast.id),
306
+ className: "-mt-1 -mr-1 shrink-0 cursor-pointer rounded p-1 opacity-60 transition-opacity hover:opacity-100",
307
+ "aria-label": "Dismiss",
308
+ children: /* @__PURE__ */ jsx("svg", { className: "h-4 w-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx(
309
+ "path",
310
+ {
311
+ strokeLinecap: "round",
312
+ strokeLinejoin: "round",
313
+ strokeWidth: 2,
314
+ d: "M6 18L18 6M6 6l12 12"
315
+ }
316
+ ) })
317
+ }
318
+ )
319
+ ]
320
+ },
321
+ toast.id
322
+ ))
323
+ }
324
+ );
325
+ }
326
+
327
+ // src/components/patterns/index.ts
328
+ var patterns_exports = {};
329
+ __export(patterns_exports, {
330
+ ContentPage: () => ContentPage,
331
+ IndustryGrid: () => IndustryGrid,
332
+ PageHero: () => PageHero,
333
+ ProcessSteps: () => ProcessSteps,
334
+ ServiceSection: () => ServiceSection,
335
+ StatBar: () => StatBar,
336
+ TeamGrid: () => TeamGrid,
337
+ VideoHero: () => VideoHero
338
+ });
339
+ function PageHero({
340
+ title,
341
+ subtitle,
342
+ eyebrow,
343
+ description,
344
+ backgroundImage,
345
+ align = "left",
346
+ children
347
+ }) {
348
+ const alignClasses = {
349
+ left: "",
350
+ center: "text-center mx-auto",
351
+ right: "text-right ml-auto"
352
+ };
353
+ return /* @__PURE__ */ jsxs("section", { className: "hero-container relative pt-32 pb-20", children: [
354
+ backgroundImage && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 z-0", children: /* @__PURE__ */ jsx(
355
+ "img",
356
+ {
357
+ src: backgroundImage,
358
+ alt: "",
359
+ className: "h-full w-full object-cover opacity-25",
360
+ "aria-hidden": "true"
361
+ }
362
+ ) }),
363
+ /* @__PURE__ */ jsx("div", { className: "container-xl relative z-10 container", children: /* @__PURE__ */ jsxs("div", { className: `${align !== "left" ? "max-w-4xl" : ""} ${alignClasses[align]}`, children: [
364
+ eyebrow && /* @__PURE__ */ jsx(
365
+ "p",
366
+ {
367
+ className: "hero-animate mb-6 inline-flex gap-2 bg-gradient-to-r from-[var(--color-dot-magenta)] via-[var(--color-dot-purple)] to-[var(--color-dot-turquoise)] bg-clip-text py-2 text-sm font-bold tracking-widest text-[var(--color-text-primary)] text-transparent uppercase opacity-0",
368
+ style: { animationDelay: "0.1s" },
369
+ children: eyebrow
370
+ }
371
+ ),
372
+ /* @__PURE__ */ jsx(
373
+ "h1",
374
+ {
375
+ className: "hero-animate mb-6 w-full text-5xl leading-[1] font-medium tracking-tight text-[var(--color-text-primary)] opacity-0 lg:max-w-3/4",
376
+ style: { animationDelay: "0.2s" },
377
+ children: title
378
+ }
379
+ ),
380
+ subtitle && /* @__PURE__ */ jsx(
381
+ "h2",
382
+ {
383
+ className: "hero-animate mb-4 w-full text-xl font-light text-[var(--color-text-primary)] md:text-2xl lg:max-w-3/4",
384
+ style: { animationDelay: "0.4s" },
385
+ children: subtitle
386
+ }
387
+ ),
388
+ description && /* @__PURE__ */ jsx(
389
+ "p",
390
+ {
391
+ className: "hero-animate mb-12 w-full text-lg leading-relaxed font-light text-[var(--color-text-primary)] lg:max-w-3/4",
392
+ style: { animationDelay: "0.5s" },
393
+ children: description
394
+ }
395
+ ),
396
+ children
397
+ ] }) })
398
+ ] });
399
+ }
400
+ function VideoHero({
401
+ videoSrc,
402
+ fallbackImage,
403
+ eyebrow,
404
+ title,
405
+ subtitle,
406
+ description,
407
+ serviceCards = [],
408
+ showScrollIndicator = true,
409
+ scrollTarget = "#work",
410
+ children
411
+ }) {
412
+ return /* @__PURE__ */ jsxs(
413
+ "section",
414
+ {
415
+ id: "main-content",
416
+ className: "relative flex min-h-screen items-center justify-center overflow-hidden",
417
+ "aria-label": "Hero section",
418
+ children: [
419
+ /* @__PURE__ */ jsxs("div", { className: "video-bg absolute inset-0 z-0", children: [
420
+ videoSrc && /* @__PURE__ */ jsx(
421
+ "video",
422
+ {
423
+ className: "h-full w-full object-cover",
424
+ autoPlay: true,
425
+ muted: true,
426
+ loop: true,
427
+ playsInline: true,
428
+ "aria-hidden": "true",
429
+ children: /* @__PURE__ */ jsx("source", { src: videoSrc, type: "video/mp4" })
430
+ }
431
+ ),
432
+ fallbackImage && /* @__PURE__ */ jsx(
433
+ "img",
434
+ {
435
+ src: fallbackImage,
436
+ alt: "",
437
+ className: `h-full w-full object-cover ${videoSrc ? "absolute inset-0" : ""}`,
438
+ loading: "eager",
439
+ "aria-hidden": "true"
440
+ }
441
+ )
442
+ ] }),
443
+ /* @__PURE__ */ jsx("div", { className: "container-xl relative z-20 container pt-28 pb-36", children: /* @__PURE__ */ jsxs("div", { className: "max-w-8xl", children: [
444
+ eyebrow && /* @__PURE__ */ jsx(
445
+ "p",
446
+ {
447
+ className: "hero-animate mb-6 inline-flex gap-2 bg-gradient-to-r from-[var(--color-dot-magenta)] via-[var(--color-dot-purple)] to-[var(--color-dot-turquoise)] bg-clip-text py-2 text-sm font-bold tracking-widest text-[var(--color-text-primary)] text-transparent uppercase opacity-0",
448
+ style: { animationDelay: "0.1s" },
449
+ children: eyebrow
450
+ }
451
+ ),
452
+ /* @__PURE__ */ jsx(
453
+ "h1",
454
+ {
455
+ className: "hero-animate mb-6 w-full text-5xl leading-[1] font-medium tracking-tight text-[var(--color-text-primary)] opacity-0 lg:max-w-3/4",
456
+ style: { animationDelay: "0.2s" },
457
+ children: title
458
+ }
459
+ ),
460
+ subtitle && /* @__PURE__ */ jsx(
461
+ "h2",
462
+ {
463
+ className: "hero-animate mb-4 w-full text-xl font-light text-[var(--color-text-primary)] md:text-2xl lg:max-w-3/4",
464
+ style: { animationDelay: "0.4s" },
465
+ children: subtitle
466
+ }
467
+ ),
468
+ description && /* @__PURE__ */ jsx(
469
+ "p",
470
+ {
471
+ className: "hero-animate mb-12 w-full text-lg leading-relaxed font-light text-[var(--color-text-primary)]/90 lg:max-w-3/4",
472
+ style: { animationDelay: "0.5s" },
473
+ children: description
474
+ }
475
+ ),
476
+ serviceCards.length > 0 && /* @__PURE__ */ jsx("nav", { className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-4", "aria-label": "Our services", children: serviceCards.map((card, index) => /* @__PURE__ */ jsxs(
477
+ "a",
478
+ {
479
+ href: card.href,
480
+ className: "service-card group hero-animate rounded-2xl border border-[var(--color-text-secondary)]/20 bg-white/5 p-6 opacity-0 backdrop-blur-md transition-all duration-300 hover:border-[var(--color-text-secondary)]/20 hover:bg-[var(--color-text-primary)]/98 hover:shadow-lg",
481
+ style: { animationDelay: `${0.6 + index * 0.1}s` },
482
+ children: [
483
+ /* @__PURE__ */ jsx(
484
+ "div",
485
+ {
486
+ className: "hero-animate mb-4 flex h-10 w-10 items-center justify-center rounded-xl border border-[var(--color-text-primary)]/20 from-[var(--color-dot-magenta)] via-[var(--color-dot-purple)] to-[var(--color-dot-turquoise)] opacity-0 transition-all duration-300 group-hover:border-[var(--color-text-primary)]/95 group-hover:bg-gradient-to-r",
487
+ dangerouslySetInnerHTML: { __html: card.icon }
488
+ }
489
+ ),
490
+ /* @__PURE__ */ jsx("h3", { className: "mb-1 text-lg font-semibold text-[var(--color-text-primary)] transition-colors group-hover:text-[var(--color-dot-turquoise)]", children: card.title }),
491
+ /* @__PURE__ */ jsxs("p", { className: "[var(--color-text-primary)] text-sm transition-colors group-hover:text-[var(--color-dot-magenta)]", children: [
492
+ card.description,
493
+ /* @__PURE__ */ jsx("span", { className: "ml-2 transform font-bold opacity-0 transition-all duration-300 group-hover:opacity-100", children: "\u2192" })
494
+ ] })
495
+ ]
496
+ },
497
+ index
498
+ )) }),
499
+ children
500
+ ] }) }),
501
+ showScrollIndicator && /* @__PURE__ */ jsx(
502
+ "div",
503
+ {
504
+ className: "hero-animate absolute bottom-8 left-1/2 z-20 -translate-x-1/2 opacity-0",
505
+ style: { animationDelay: "1.2s" },
506
+ children: /* @__PURE__ */ jsxs(
507
+ "a",
508
+ {
509
+ href: scrollTarget,
510
+ className: "group flex flex-col items-center gap-2",
511
+ "aria-label": "Scroll to see our work",
512
+ children: [
513
+ /* @__PURE__ */ jsx("span", { className: "text-xs font-medium tracking-wider text-white/60 uppercase transition-colors group-hover:text-white/80", children: "Scroll" }),
514
+ /* @__PURE__ */ jsx("div", { className: "relative h-10 w-6 rounded-full border-2 border-white/30 transition-colors group-hover:border-white/50", children: /* @__PURE__ */ jsx("div", { className: "absolute top-2 left-1/2 h-2 w-1 -translate-x-1/2 animate-bounce rounded-full bg-white/80" }) })
515
+ ]
516
+ }
517
+ )
518
+ }
519
+ )
520
+ ]
521
+ }
522
+ );
523
+ }
524
+ function TeamGrid({ members, cols = 3, title }) {
525
+ const colsClasses = {
526
+ 2: "md:grid-cols-2",
527
+ 3: "md:grid-cols-2 lg:grid-cols-3",
528
+ 4: "md:grid-cols-2 lg:grid-cols-4"
529
+ };
530
+ return /* @__PURE__ */ jsx("section", { className: "py-20 pt-10", children: /* @__PURE__ */ jsxs("div", { className: "container-xl container", children: [
531
+ title && /* @__PURE__ */ jsx(
532
+ "h2",
533
+ {
534
+ className: "hero-animate mb-12 text-3xl font-medium text-[var(--color-text-primary)] opacity-0 md:text-4xl",
535
+ style: { animationDelay: ".75s" },
536
+ children: title
537
+ }
538
+ ),
539
+ /* @__PURE__ */ jsx("div", { className: `grid gap-8 ${colsClasses[cols]}`, children: members.map((member, index) => /* @__PURE__ */ jsxs(
540
+ "div",
541
+ {
542
+ className: "profile-card scale-99 overflow-hidden rounded-xl border border-[var(--color-border)]/10 bg-[var(--color-surface)] transition-all duration-300 hover:scale-100 hover:border-[var(--color-border-strong)] hover:shadow-lg",
543
+ children: [
544
+ /* @__PURE__ */ jsx("div", { className: "aspect-square overflow-hidden transition-all duration-300", children: /* @__PURE__ */ jsx(
545
+ "img",
546
+ {
547
+ src: member.image,
548
+ alt: member.name,
549
+ className: "profile-img object-cover transition-all duration-1000 hover:scale-102",
550
+ loading: "lazy"
551
+ }
552
+ ) }),
553
+ /* @__PURE__ */ jsxs("div", { className: "p-6", children: [
554
+ /* @__PURE__ */ jsx("h3", { className: "mb-1 text-xl font-semibold text-[var(--color-text-primary)]", children: member.name }),
555
+ /* @__PURE__ */ jsxs("p", { className: "mb-3 text-sm leading-[1.5] font-bold tracking-wide text-[var(--color-primary)] uppercase", children: [
556
+ /* @__PURE__ */ jsx("span", { className: "text-[var(--color-dot-magenta)]", children: member.role }),
557
+ member.title && /* @__PURE__ */ jsxs(Fragment, { children: [
558
+ /* @__PURE__ */ jsx("br", {}),
559
+ member.title
560
+ ] })
561
+ ] }),
562
+ /* @__PURE__ */ jsx("p", { className: "text-med mb-4 text-[var(--color-text-secondary)]", children: member.bio }),
563
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-3", children: [
564
+ member.linkedin && /* @__PURE__ */ jsx(
565
+ "a",
566
+ {
567
+ href: member.linkedin,
568
+ target: "_blank",
569
+ rel: "noopener noreferrer",
570
+ className: "text-med font-medium text-[var(--color-primary)] hover:underline",
571
+ children: "LinkedIn"
572
+ }
573
+ ),
574
+ member.twitter && /* @__PURE__ */ jsx(
575
+ "a",
576
+ {
577
+ href: member.twitter,
578
+ target: "_blank",
579
+ rel: "noopener noreferrer",
580
+ className: "text-med font-medium text-[var(--color-primary)] hover:underline",
581
+ children: "Twitter"
582
+ }
583
+ ),
584
+ member.email && /* @__PURE__ */ jsx(
585
+ "a",
586
+ {
587
+ href: `mailto:${member.email}`,
588
+ className: "text-med font-medium text-[var(--color-primary)] hover:underline",
589
+ children: "Email"
590
+ }
591
+ )
592
+ ] })
593
+ ] })
594
+ ]
595
+ },
596
+ index
597
+ )) })
598
+ ] }) });
599
+ }
600
+ function ServiceSection({ id, title, description, features }) {
601
+ return /* @__PURE__ */ jsx(
602
+ "section",
603
+ {
604
+ id,
605
+ className: "-mt-10 border-b border-[var(--color-border)]/10 py-20 lg:-mt-20 lg:py-40",
606
+ children: /* @__PURE__ */ jsxs("div", { className: "container-xl container", children: [
607
+ /* @__PURE__ */ jsx(
608
+ "h2",
609
+ {
610
+ className: "hero-animate mb-4 w-full text-3xl font-medium text-[var(--color-text-primary)] opacity-0 md:text-4xl lg:max-w-3/4",
611
+ style: { animationDelay: ".75s" },
612
+ children: title
613
+ }
614
+ ),
615
+ /* @__PURE__ */ jsx(
616
+ "p",
617
+ {
618
+ className: "hero-animate mb-12 text-lg text-[var(--color-text-secondary)] opacity-0 lg:max-w-3/4",
619
+ style: { animationDelay: ".8s" },
620
+ children: description
621
+ }
622
+ ),
623
+ /* @__PURE__ */ jsx(
624
+ "div",
625
+ {
626
+ className: "hero-animate grid gap-6 opacity-0 sm:grid-cols-2 lg:grid-cols-3",
627
+ style: { animationDelay: ".85s" },
628
+ children: features.map((feature, index) => /* @__PURE__ */ jsxs(
629
+ "div",
630
+ {
631
+ className: "rounded-xl border border-[var(--color-border)]/10 bg-[var(--color-surface)] p-6 transition-colors hover:bg-[var(--color-surface)]",
632
+ children: [
633
+ /* @__PURE__ */ jsx("h4", { className: "mb-2 text-lg font-semibold text-[var(--color-text-primary)]", children: feature.title }),
634
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--color-text-secondary)]", children: feature.description })
635
+ ]
636
+ },
637
+ index
638
+ ))
639
+ }
640
+ )
641
+ ] })
642
+ }
643
+ );
644
+ }
645
+ function ProcessSteps({
646
+ steps,
647
+ title,
648
+ variant = "horizontal",
649
+ background = "muted"
650
+ }) {
651
+ const bgClasses = {
652
+ default: "",
653
+ muted: "bg-[var(--color-background-light)]"
654
+ };
655
+ return /* @__PURE__ */ jsx("section", { className: `py-20 ${bgClasses[background]}`, children: /* @__PURE__ */ jsxs("div", { className: "container-xl container", children: [
656
+ title && /* @__PURE__ */ jsx("h2", { className: "mb-12 text-3xl font-medium text-[var(--color-text-primary)] md:text-4xl", children: title }),
657
+ variant === "horizontal" ? /* @__PURE__ */ jsx("div", { className: "grid gap-8 md:grid-cols-2 lg:grid-cols-4", children: steps.map((step, index) => /* @__PURE__ */ jsxs("div", { className: "relative", children: [
658
+ /* @__PURE__ */ jsx("div", { className: "mb-4 flex h-12 w-12 items-center justify-center rounded-full border border-[var(--color-text-primary)]/90 bg-[var(--color-text-primary)]/0 text-xl font-medium", children: step.number ?? index + 1 }),
659
+ /* @__PURE__ */ jsx("h3", { className: "mb-2 text-xl font-semibold text-[var(--color-text-primary)]", children: step.title }),
660
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--color-text-secondary)]", children: step.description })
661
+ ] }, index)) }) : /* @__PURE__ */ jsxs("div", { className: "relative pl-8", children: [
662
+ /* @__PURE__ */ jsx(
663
+ "div",
664
+ {
665
+ className: "absolute top-0 bottom-0 left-6 w-0.5 bg-[var(--color-border)]",
666
+ "aria-hidden": "true"
667
+ }
668
+ ),
669
+ /* @__PURE__ */ jsx("div", { className: "space-y-8", children: steps.map((step, index) => /* @__PURE__ */ jsxs("div", { className: "relative flex gap-6", children: [
670
+ /* @__PURE__ */ jsx("div", { className: "relative z-10 -ml-6 flex h-12 w-12 flex-shrink-0 items-center justify-center rounded-full bg-[var(--color-primary)] text-lg font-medium text-white", children: step.number ?? index + 1 }),
671
+ /* @__PURE__ */ jsxs("div", { className: "pt-2", children: [
672
+ /* @__PURE__ */ jsx("h3", { className: "mb-1 text-lg font-semibold text-[var(--color-text-primary)]", children: step.title }),
673
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--color-text-secondary)]", children: step.description })
674
+ ] })
675
+ ] }, index)) })
676
+ ] })
677
+ ] }) });
678
+ }
679
+ function StatBar({
680
+ stats,
681
+ title,
682
+ description,
683
+ centered = true,
684
+ background = "muted"
685
+ }) {
686
+ const descriptions = Array.isArray(description) ? description : description ? [description] : [];
687
+ const bgClasses = {
688
+ default: "",
689
+ muted: "bg-[var(--color-background-light)]"
690
+ };
691
+ return /* @__PURE__ */ jsx("section", { className: `py-20 ${bgClasses[background]}`, children: /* @__PURE__ */ jsxs("div", { className: "container-xl container", children: [
692
+ (title || descriptions.length > 0) && /* @__PURE__ */ jsxs("div", { className: `mb-12 ${centered ? "mx-auto max-w-2xl text-center" : ""}`, children: [
693
+ title && /* @__PURE__ */ jsx("h2", { className: "mb-4 text-3xl font-medium text-[var(--color-text-primary)] md:text-4xl", children: title }),
694
+ descriptions.map((desc, index) => /* @__PURE__ */ jsx(
695
+ "p",
696
+ {
697
+ className: "centered mx-auto mb-4 max-w-3/4 text-lg text-[var(--color-text-secondary)] last:mb-0",
698
+ children: desc
699
+ },
700
+ index
701
+ ))
702
+ ] }),
703
+ /* @__PURE__ */ jsx(
704
+ "div",
705
+ {
706
+ className: `grid max-w-3xl gap-8 ${centered ? "mx-auto" : ""} sm:grid-cols-${stats.length}`,
707
+ children: stats.map((stat, index) => /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
708
+ /* @__PURE__ */ jsxs("div", { className: "mb-2 bg-clip-text text-4xl font-bold text-[var(--color-text-primary)] md:text-5xl", children: [
709
+ stat.prefix,
710
+ stat.value,
711
+ stat.suffix
712
+ ] }),
713
+ /* @__PURE__ */ jsx("div", { className: "text-sm text-[var(--color-dot-magenta)]", children: stat.label })
714
+ ] }, index))
715
+ }
716
+ )
717
+ ] }) });
718
+ }
719
+ function IndustryGrid({ industries, title, cols = 3 }) {
720
+ const colsClasses = {
721
+ 2: "sm:grid-cols-2",
722
+ 3: "sm:grid-cols-2 lg:grid-cols-3"
723
+ };
724
+ return /* @__PURE__ */ jsx("section", { className: "py-20", children: /* @__PURE__ */ jsxs("div", { className: "container-xl container", children: [
725
+ title && /* @__PURE__ */ jsx("h2", { className: "mb-12 text-3xl font-medium text-[var(--color-text-primary)] md:text-4xl", children: title }),
726
+ /* @__PURE__ */ jsx("div", { className: `grid gap-6 ${colsClasses[cols]}`, children: industries.map((industry, index) => /* @__PURE__ */ jsxs(
727
+ "div",
728
+ {
729
+ className: "rounded-xl border border-[var(--color-border)]/10 bg-[var(--color-surface)] p-6 transition-all duration-200",
730
+ children: [
731
+ /* @__PURE__ */ jsx("h3", { className: "mb-2 text-lg font-semibold text-[var(--color-text-primary)]", children: industry.title }),
732
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--color-text-secondary)]", children: industry.description })
733
+ ]
734
+ },
735
+ index
736
+ )) })
737
+ ] }) });
738
+ }
739
+ function ContentPage({ title, subtitle, lastUpdated, children }) {
740
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
741
+ /* @__PURE__ */ jsx("section", { className: "pt-32 pb-12", children: /* @__PURE__ */ jsxs("div", { className: "container-xl container", children: [
742
+ /* @__PURE__ */ jsx("h1", { className: "mb-4 text-4xl font-bold text-[var(--color-text-primary)] md:text-5xl", children: title }),
743
+ subtitle && /* @__PURE__ */ jsx("h2", { className: "mb-2 text-xl text-[var(--color-text-secondary)]", children: subtitle }),
744
+ lastUpdated && /* @__PURE__ */ jsxs("p", { className: "text-[var(--color-text-muted)]", children: [
745
+ "Last updated: ",
746
+ lastUpdated
747
+ ] })
748
+ ] }) }),
749
+ /* @__PURE__ */ jsx("section", { className: "py-12", children: /* @__PURE__ */ jsx("div", { className: "container-xl container", children: /* @__PURE__ */ jsx("div", { className: "prose prose-lg lg:max-w-3/4", children }) }) })
750
+ ] });
751
+ }
752
+ function BeforeAfter({ data }) {
753
+ const [sliderPosition, setSliderPosition] = useState(data.default_offset || 0.5);
754
+ const [isDragging, setIsDragging] = useState(false);
755
+ const containerRef = useRef(null);
756
+ const handleMove = (clientX) => {
757
+ if (!containerRef.current) return;
758
+ const rect = containerRef.current.getBoundingClientRect();
759
+ const x = Math.max(0, Math.min(clientX - rect.left, rect.width));
760
+ const percentage = x / rect.width;
761
+ setSliderPosition(percentage);
762
+ };
763
+ const handleMouseDown = () => setIsDragging(true);
764
+ const handleMouseUp = () => setIsDragging(false);
765
+ useEffect(() => {
766
+ const handleMouseMove = (e) => {
767
+ if (isDragging) handleMove(e.clientX);
768
+ };
769
+ const handleTouchMove = (e) => {
770
+ if (isDragging) handleMove(e.touches[0].clientX);
771
+ };
772
+ if (isDragging) {
773
+ window.addEventListener("mousemove", handleMouseMove);
774
+ window.addEventListener("mouseup", handleMouseUp);
775
+ window.addEventListener("touchmove", handleTouchMove);
776
+ window.addEventListener("touchend", handleMouseUp);
777
+ }
778
+ return () => {
779
+ window.removeEventListener("mousemove", handleMouseMove);
780
+ window.removeEventListener("mouseup", handleMouseUp);
781
+ window.removeEventListener("touchmove", handleTouchMove);
782
+ window.removeEventListener("touchend", handleMouseUp);
783
+ };
784
+ }, [isDragging]);
785
+ return /* @__PURE__ */ jsx("section", { className: "py-20", children: /* @__PURE__ */ jsxs("div", { className: "wrapper", children: [
786
+ /* @__PURE__ */ jsxs("div", { className: "mb-8 max-w-2xl", children: [
787
+ /* @__PURE__ */ jsx("h4", { className: "mb-4 text-2xl font-bold text-[var(--color-text-primary)]", children: data.title }),
788
+ /* @__PURE__ */ jsx(
789
+ "p",
790
+ {
791
+ className: "text-lg text-[var(--color-text-secondary)]",
792
+ dangerouslySetInnerHTML: { __html: data.content }
793
+ }
794
+ )
795
+ ] }),
796
+ /* @__PURE__ */ jsxs(
797
+ "div",
798
+ {
799
+ ref: containerRef,
800
+ className: "relative w-full cursor-ew-resize overflow-hidden rounded-xl select-none",
801
+ onMouseDown: handleMouseDown,
802
+ onTouchStart: handleMouseDown,
803
+ children: [
804
+ /* @__PURE__ */ jsx(
805
+ "img",
806
+ {
807
+ src: data.after_image,
808
+ alt: data.after_label || "After",
809
+ className: "h-auto w-full",
810
+ draggable: false
811
+ }
812
+ ),
813
+ /* @__PURE__ */ jsx(
814
+ "div",
815
+ {
816
+ className: "absolute inset-0 overflow-hidden",
817
+ style: { clipPath: `inset(0 ${100 - sliderPosition * 100}% 0 0)` },
818
+ children: /* @__PURE__ */ jsx(
819
+ "img",
820
+ {
821
+ src: data.before_image,
822
+ alt: data.before_label || "Before",
823
+ className: "h-full w-full object-cover",
824
+ draggable: false
825
+ }
826
+ )
827
+ }
828
+ ),
829
+ /* @__PURE__ */ jsx(
830
+ "div",
831
+ {
832
+ className: "absolute top-0 bottom-0 w-1 bg-white shadow-lg",
833
+ style: { left: `${sliderPosition * 100}%`, transform: "translateX(-50%)" },
834
+ children: /* @__PURE__ */ jsx("div", { className: "absolute top-1/2 left-1/2 flex h-10 w-10 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full bg-white shadow-lg", children: /* @__PURE__ */ jsx(
835
+ "svg",
836
+ {
837
+ className: "h-5 w-5 text-[var(--color-text-primary)]",
838
+ fill: "none",
839
+ stroke: "currentColor",
840
+ viewBox: "0 0 24 24",
841
+ children: /* @__PURE__ */ jsx(
842
+ "path",
843
+ {
844
+ strokeLinecap: "round",
845
+ strokeLinejoin: "round",
846
+ strokeWidth: 2,
847
+ d: "M8 9l4-4 4 4m0 6l-4 4-4-4"
848
+ }
849
+ )
850
+ }
851
+ ) })
852
+ }
853
+ ),
854
+ /* @__PURE__ */ jsx("div", { className: "absolute bottom-4 left-4 rounded bg-black/70 px-3 py-1 text-sm text-white", children: data.before_label || "Before" }),
855
+ /* @__PURE__ */ jsx("div", { className: "absolute right-4 bottom-4 rounded bg-black/70 px-3 py-1 text-sm text-white", children: data.after_label || "After" })
856
+ ]
857
+ }
858
+ ),
859
+ data.caption && /* @__PURE__ */ jsx(
860
+ "p",
861
+ {
862
+ className: "mt-4 text-center text-sm text-[var(--color-text-muted)]",
863
+ dangerouslySetInnerHTML: { __html: data.caption }
864
+ }
865
+ )
866
+ ] }) });
867
+ }
868
+ function CaseStudyBreakdown({ data }) {
869
+ return /* @__PURE__ */ jsx("section", { className: "bg-[var(--color-background-light)] py-20", children: /* @__PURE__ */ jsxs("div", { className: "wrapper", children: [
870
+ /* @__PURE__ */ jsx("h2", { className: "mb-8 text-3xl font-bold text-[var(--color-text-primary)]", children: data.title }),
871
+ /* @__PURE__ */ jsxs("div", { className: "mb-12 grid gap-8 lg:grid-cols-3", children: [
872
+ /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-[var(--color-border)] bg-[var(--color-surface)] p-6", children: [
873
+ /* @__PURE__ */ jsx("h5", { className: "mb-3 text-lg font-semibold text-[var(--color-text-primary)]", children: "What We Did" }),
874
+ /* @__PURE__ */ jsx(
875
+ "p",
876
+ {
877
+ className: "text-[var(--color-text-secondary)]",
878
+ dangerouslySetInnerHTML: { __html: data.what_we_did }
879
+ }
880
+ )
881
+ ] }),
882
+ /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-[var(--color-border)] bg-[var(--color-surface)] p-6", children: [
883
+ /* @__PURE__ */ jsx("h5", { className: "mb-3 text-lg font-semibold text-[var(--color-text-primary)]", children: "How We Did It" }),
884
+ /* @__PURE__ */ jsx(
885
+ "p",
886
+ {
887
+ className: "text-[var(--color-text-secondary)]",
888
+ dangerouslySetInnerHTML: { __html: data.how_we_did_it }
889
+ }
890
+ )
891
+ ] }),
892
+ /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-[var(--color-border)] bg-[var(--color-surface)] p-6", children: [
893
+ /* @__PURE__ */ jsx("h5", { className: "mb-3 text-lg font-semibold text-[var(--color-text-primary)]", children: "Services Used" }),
894
+ /* @__PURE__ */ jsx("ul", { className: "space-y-2", children: data.services_used.map((service, index) => /* @__PURE__ */ jsxs(
895
+ "li",
896
+ {
897
+ className: "flex items-center gap-2 text-[var(--color-text-secondary)]",
898
+ children: [
899
+ /* @__PURE__ */ jsx(
900
+ "svg",
901
+ {
902
+ className: "h-4 w-4 flex-shrink-0 text-[var(--color-primary)]",
903
+ fill: "currentColor",
904
+ viewBox: "0 0 20 20",
905
+ children: /* @__PURE__ */ jsx(
906
+ "path",
907
+ {
908
+ fillRule: "evenodd",
909
+ d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",
910
+ clipRule: "evenodd"
911
+ }
912
+ )
913
+ }
914
+ ),
915
+ /* @__PURE__ */ jsx("span", { children: service })
916
+ ]
917
+ },
918
+ index
919
+ )) })
920
+ ] })
921
+ ] }),
922
+ data.results && /* @__PURE__ */ jsxs("div", { className: "mb-12", children: [
923
+ /* @__PURE__ */ jsx("h5", { className: "mb-3 text-xl font-semibold text-[var(--color-text-primary)]", children: "Results" }),
924
+ /* @__PURE__ */ jsx(
925
+ "p",
926
+ {
927
+ className: "text-lg text-[var(--color-text-secondary)]",
928
+ dangerouslySetInnerHTML: { __html: data.results }
929
+ }
930
+ )
931
+ ] }),
932
+ data.metrics && data.metrics.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
933
+ /* @__PURE__ */ jsx("h5", { className: "mb-6 text-xl font-semibold text-[var(--color-text-primary)]", children: "Key Metrics" }),
934
+ /* @__PURE__ */ jsx("div", { className: "grid gap-6 sm:grid-cols-2 lg:grid-cols-3", children: data.metrics.map((metric, index) => /* @__PURE__ */ jsxs(
935
+ "div",
936
+ {
937
+ className: "rounded-xl border border-[var(--color-border)] bg-[var(--color-surface)] p-6 text-center",
938
+ children: [
939
+ /* @__PURE__ */ jsxs("div", { className: "mb-2 flex items-center justify-center gap-2", children: [
940
+ /* @__PURE__ */ jsxs("span", { className: "text-4xl font-bold text-[var(--color-primary)]", children: [
941
+ metric.value,
942
+ metric.suffix && /* @__PURE__ */ jsx("span", { className: "text-2xl", children: metric.suffix })
943
+ ] }),
944
+ metric.trend && /* @__PURE__ */ jsx(
945
+ "svg",
946
+ {
947
+ className: `h-5 w-5 ${metric.trend === "up" ? "text-green-500" : "text-red-500"}`,
948
+ fill: "none",
949
+ stroke: "currentColor",
950
+ viewBox: "0 0 24 24",
951
+ children: metric.trend === "up" ? /* @__PURE__ */ jsx(
952
+ "path",
953
+ {
954
+ strokeLinecap: "round",
955
+ strokeLinejoin: "round",
956
+ strokeWidth: 2,
957
+ d: "M5 10l7-7m0 0l7 7m-7-7v18"
958
+ }
959
+ ) : /* @__PURE__ */ jsx(
960
+ "path",
961
+ {
962
+ strokeLinecap: "round",
963
+ strokeLinejoin: "round",
964
+ strokeWidth: 2,
965
+ d: "M19 14l-7 7m0 0l-7-7m7 7V3"
966
+ }
967
+ )
968
+ }
969
+ )
970
+ ] }),
971
+ /* @__PURE__ */ jsx("div", { className: "mb-1 text-sm font-medium text-[var(--color-text-primary)]", children: metric.label }),
972
+ metric.description && /* @__PURE__ */ jsx("div", { className: "text-xs text-[var(--color-text-muted)]", children: metric.description })
973
+ ]
974
+ },
975
+ index
976
+ )) })
977
+ ] })
978
+ ] }) });
979
+ }
980
+ async function submitToHubSpot(data, config) {
981
+ const { portalId, formId, region = "na1" } = config;
982
+ const apiDomain = region.startsWith("eu") ? "api.hubspot.eu" : "api.hsforms.com";
983
+ const response = await fetch(
984
+ `https://${apiDomain}/submissions/v3/integration/submit/${portalId}/${formId}`,
985
+ {
986
+ method: "POST",
987
+ headers: {
988
+ "Content-Type": "application/json"
989
+ },
990
+ body: JSON.stringify({
991
+ fields: [
992
+ { name: "firstname", value: data.firstname },
993
+ { name: "email", value: data.email }
994
+ ],
995
+ context: {
996
+ pageUri: window.location.href,
997
+ pageName: document.title
998
+ }
999
+ })
1000
+ }
1001
+ );
1002
+ if (!response.ok) {
1003
+ const responseData = await response.json();
1004
+ throw new Error(responseData.message || "Form submission failed");
1005
+ }
1006
+ return response.json();
1007
+ }
1008
+ function CompactContactForm({
1009
+ portalId,
1010
+ formId,
1011
+ region = "na1",
1012
+ onSubmit,
1013
+ onSuccess,
1014
+ onError,
1015
+ submitButtonText = "Help us!",
1016
+ loadingText = "Sending...",
1017
+ namePlaceholder = "Your Name",
1018
+ emailPlaceholder = "Your Email"
1019
+ }) {
1020
+ const [isLoading, setIsLoading] = useState(false);
1021
+ const [firstname, setFirstname] = useState("");
1022
+ const [email, setEmail] = useState("");
1023
+ const handleSubmit = async (e) => {
1024
+ e.preventDefault();
1025
+ setIsLoading(true);
1026
+ const formData = { firstname, email };
1027
+ try {
1028
+ if (onSubmit) {
1029
+ await onSubmit(formData);
1030
+ } else if (portalId && formId) {
1031
+ await submitToHubSpot(formData, { portalId, formId, region });
1032
+ } else {
1033
+ throw new Error("Either onSubmit callback or HubSpot config (portalId, formId) is required");
1034
+ }
1035
+ onSuccess?.(formData);
1036
+ setFirstname("");
1037
+ setEmail("");
1038
+ } catch (error) {
1039
+ onError?.(error instanceof Error ? error : new Error("Form submission failed"));
1040
+ } finally {
1041
+ setIsLoading(false);
1042
+ }
1043
+ };
1044
+ return /* @__PURE__ */ jsx("form", { className: "group w-full", onSubmit: handleSubmit, children: /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-stretch gap-2", children: [
1045
+ /* @__PURE__ */ jsxs("div", { className: "min-w-[180px] flex-1", children: [
1046
+ /* @__PURE__ */ jsx("label", { htmlFor: "compact-contact-name", className: "sr-only", children: namePlaceholder }),
1047
+ /* @__PURE__ */ jsx(
1048
+ "input",
1049
+ {
1050
+ type: "text",
1051
+ id: "compact-contact-name",
1052
+ name: "firstname",
1053
+ placeholder: namePlaceholder,
1054
+ required: true,
1055
+ value: firstname,
1056
+ onChange: (e) => setFirstname(e.target.value),
1057
+ className: "w-full rounded-lg border border-[var(--color-border)] bg-[var(--color-background)] px-4 py-3 text-base text-[var(--color-text-primary)] transition-colors placeholder:text-[var(--color-text-muted)] focus:border-[var(--color-primary)] focus:outline-none"
1058
+ }
1059
+ )
1060
+ ] }),
1061
+ /* @__PURE__ */ jsxs("div", { className: "min-w-[180px] flex-1", children: [
1062
+ /* @__PURE__ */ jsx("label", { htmlFor: "compact-contact-email", className: "sr-only", children: emailPlaceholder }),
1063
+ /* @__PURE__ */ jsx(
1064
+ "input",
1065
+ {
1066
+ type: "email",
1067
+ id: "compact-contact-email",
1068
+ name: "email",
1069
+ placeholder: emailPlaceholder,
1070
+ required: true,
1071
+ value: email,
1072
+ onChange: (e) => setEmail(e.target.value),
1073
+ className: "w-full rounded-lg border border-[var(--color-border)] bg-[var(--color-background)] px-4 py-3 text-base text-[var(--color-text-primary)] transition-colors placeholder:text-[var(--color-text-muted)] focus:border-[var(--color-primary)] focus:outline-none"
1074
+ }
1075
+ )
1076
+ ] }),
1077
+ /* @__PURE__ */ jsx(
1078
+ "button",
1079
+ {
1080
+ type: "submit",
1081
+ disabled: isLoading,
1082
+ className: "shrink-0 cursor-pointer rounded-lg border-none bg-linear-to-r from-[var(--color-dot-magenta)] via-[var(--color-dot-purple)] to-[var(--color-dot-turquoise)] px-6 py-3 text-base font-medium text-white transition-opacity hover:bg-black hover:opacity-90 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--color-primary)] disabled:cursor-wait disabled:opacity-70",
1083
+ children: isLoading ? loadingText : submitButtonText
1084
+ }
1085
+ )
1086
+ ] }) });
1087
+ }
1088
+ var DEFAULT_SERVICE_OPTIONS = [
1089
+ { value: "Development", label: "Development" },
1090
+ { value: "AI Adoption", label: "AI Adoption" },
1091
+ { value: "Product Design", label: "Product Design" },
1092
+ { value: "Culture & Transformation", label: "Culture & Transformation" }
1093
+ ];
1094
+ var DEFAULT_BUDGET_OPTIONS = [
1095
+ { value: "$5k-15k", label: "$5K-15K" },
1096
+ { value: "$15K-50K", label: "$15K-50K" },
1097
+ { value: "$50K-100K+", label: "$50K-100K+" }
1098
+ ];
1099
+ async function submitToHubSpot2(data, config) {
1100
+ const { portalId, formId, region = "na1" } = config;
1101
+ const fields = [
1102
+ { name: "firstname", value: data.firstname },
1103
+ { name: "email", value: data.email },
1104
+ { name: "company", value: data.company },
1105
+ { name: "project_budget", value: data.project_budget },
1106
+ { name: "project_description", value: data.project_description }
1107
+ ];
1108
+ if (data.services.length > 0) {
1109
+ fields.push({ name: "services", value: data.services.join(",") });
1110
+ }
1111
+ const apiDomain = region.startsWith("eu") ? "api.hubspot.eu" : "api.hsforms.com";
1112
+ const response = await fetch(
1113
+ `https://${apiDomain}/submissions/v3/integration/submit/${portalId}/${formId}`,
1114
+ {
1115
+ method: "POST",
1116
+ headers: {
1117
+ "Content-Type": "application/json"
1118
+ },
1119
+ body: JSON.stringify({
1120
+ fields,
1121
+ context: {
1122
+ pageUri: window.location.href,
1123
+ pageName: document.title
1124
+ }
1125
+ })
1126
+ }
1127
+ );
1128
+ if (!response.ok) {
1129
+ const data2 = await response.json();
1130
+ throw new Error(data2.message || "Form submission failed");
1131
+ }
1132
+ return response.json();
1133
+ }
1134
+ function ContactForm({
1135
+ portalId,
1136
+ formId,
1137
+ region = "na1",
1138
+ onSubmit,
1139
+ onSuccess,
1140
+ onError,
1141
+ submitButtonText = "Send Message",
1142
+ loadingText = "Sending...",
1143
+ serviceOptions = DEFAULT_SERVICE_OPTIONS,
1144
+ budgetOptions = DEFAULT_BUDGET_OPTIONS
1145
+ }) {
1146
+ const [isLoading, setIsLoading] = useState(false);
1147
+ const [formData, setFormData] = useState({
1148
+ firstname: "",
1149
+ email: "",
1150
+ company: "",
1151
+ services: [],
1152
+ project_budget: budgetOptions[0]?.value || "$5K-15K",
1153
+ project_description: ""
1154
+ });
1155
+ const handleChange = (e) => {
1156
+ const { name, value } = e.target;
1157
+ setFormData((prev) => ({ ...prev, [name]: value }));
1158
+ };
1159
+ const handleServiceChange = (value, checked) => {
1160
+ setFormData((prev) => ({
1161
+ ...prev,
1162
+ services: checked ? [...prev.services, value] : prev.services.filter((s) => s !== value)
1163
+ }));
1164
+ };
1165
+ const handleSubmit = async (e) => {
1166
+ e.preventDefault();
1167
+ setIsLoading(true);
1168
+ try {
1169
+ if (onSubmit) {
1170
+ await onSubmit(formData);
1171
+ } else if (portalId && formId) {
1172
+ await submitToHubSpot2(formData, { portalId, formId, region });
1173
+ } else {
1174
+ throw new Error("Either onSubmit callback or HubSpot config (portalId, formId) is required");
1175
+ }
1176
+ onSuccess?.(formData);
1177
+ setFormData({
1178
+ firstname: "",
1179
+ email: "",
1180
+ company: "",
1181
+ services: [],
1182
+ project_budget: budgetOptions[0]?.value || "$5K-15K",
1183
+ project_description: ""
1184
+ });
1185
+ } catch (error) {
1186
+ onError?.(error instanceof Error ? error : new Error("Form submission failed"));
1187
+ } finally {
1188
+ setIsLoading(false);
1189
+ }
1190
+ };
1191
+ const inputClassName = "w-full rounded-lg border border-[var(--color-border)] bg-[var(--color-background)] px-4 py-3 text-[var(--color-text-primary)] transition-colors placeholder:text-[var(--color-text-muted)] focus:border-[var(--color-primary)] focus:outline-none";
1192
+ return /* @__PURE__ */ jsxs("form", { className: "space-y-6", onSubmit: handleSubmit, children: [
1193
+ /* @__PURE__ */ jsxs("div", { className: "grid gap-6 sm:grid-cols-2", children: [
1194
+ /* @__PURE__ */ jsxs("div", { children: [
1195
+ /* @__PURE__ */ jsxs(
1196
+ "label",
1197
+ {
1198
+ htmlFor: "full-name",
1199
+ className: "mb-2 block text-sm font-medium text-[var(--color-text-primary)]",
1200
+ children: [
1201
+ "Name ",
1202
+ /* @__PURE__ */ jsx("span", { className: "text-[var(--color-primary)]", children: "*" })
1203
+ ]
1204
+ }
1205
+ ),
1206
+ /* @__PURE__ */ jsx(
1207
+ "input",
1208
+ {
1209
+ type: "text",
1210
+ id: "full-name",
1211
+ name: "firstname",
1212
+ required: true,
1213
+ value: formData.firstname,
1214
+ onChange: handleChange,
1215
+ className: inputClassName
1216
+ }
1217
+ ),
1218
+ /* @__PURE__ */ jsx("span", { className: "mt-1 text-xs text-[var(--color-text-muted)]", children: "What should we call you?" })
1219
+ ] }),
1220
+ /* @__PURE__ */ jsxs("div", { children: [
1221
+ /* @__PURE__ */ jsxs(
1222
+ "label",
1223
+ {
1224
+ htmlFor: "full-email",
1225
+ className: "mb-2 block text-sm font-medium text-[var(--color-text-primary)]",
1226
+ children: [
1227
+ "Email ",
1228
+ /* @__PURE__ */ jsx("span", { className: "text-[var(--color-primary)]", children: "*" })
1229
+ ]
1230
+ }
1231
+ ),
1232
+ /* @__PURE__ */ jsx(
1233
+ "input",
1234
+ {
1235
+ type: "email",
1236
+ id: "full-email",
1237
+ name: "email",
1238
+ required: true,
1239
+ value: formData.email,
1240
+ onChange: handleChange,
1241
+ className: inputClassName
1242
+ }
1243
+ ),
1244
+ /* @__PURE__ */ jsx("span", { className: "mt-1 text-xs text-[var(--color-text-muted)]", children: "We'll use this to get back to you" })
1245
+ ] })
1246
+ ] }),
1247
+ /* @__PURE__ */ jsxs("div", { children: [
1248
+ /* @__PURE__ */ jsx(
1249
+ "label",
1250
+ {
1251
+ htmlFor: "full-company",
1252
+ className: "mb-2 block text-sm font-medium text-[var(--color-text-primary)]",
1253
+ children: "Company"
1254
+ }
1255
+ ),
1256
+ /* @__PURE__ */ jsx(
1257
+ "input",
1258
+ {
1259
+ type: "text",
1260
+ id: "full-company",
1261
+ name: "company",
1262
+ value: formData.company,
1263
+ onChange: handleChange,
1264
+ className: inputClassName
1265
+ }
1266
+ ),
1267
+ /* @__PURE__ */ jsx("span", { className: "mt-1 text-xs text-[var(--color-text-muted)]", children: "Optional - but we'd love to know!" })
1268
+ ] }),
1269
+ /* @__PURE__ */ jsxs("div", { children: [
1270
+ /* @__PURE__ */ jsxs("label", { className: "mb-2 block text-sm font-medium text-[var(--color-text-primary)]", children: [
1271
+ "What can we help you with?",
1272
+ " ",
1273
+ /* @__PURE__ */ jsx("span", { className: "text-[var(--color-text-muted)]", children: "(Select all that apply)" })
1274
+ ] }),
1275
+ /* @__PURE__ */ jsx("div", { className: "grid gap-4 sm:grid-cols-2", children: serviceOptions.map((option) => /* @__PURE__ */ jsxs("label", { className: "flex cursor-pointer items-center gap-3", children: [
1276
+ /* @__PURE__ */ jsx(
1277
+ "input",
1278
+ {
1279
+ type: "checkbox",
1280
+ checked: formData.services.includes(option.value),
1281
+ onChange: (e) => handleServiceChange(option.value, e.target.checked),
1282
+ className: "rounded border-[var(--color-border)]"
1283
+ }
1284
+ ),
1285
+ /* @__PURE__ */ jsx("span", { className: "text-[var(--color-text-secondary)]", children: option.label })
1286
+ ] }, option.value)) })
1287
+ ] }),
1288
+ /* @__PURE__ */ jsxs("div", { children: [
1289
+ /* @__PURE__ */ jsx(
1290
+ "label",
1291
+ {
1292
+ htmlFor: "full-project_budget",
1293
+ className: "mb-2 block text-sm font-medium text-[var(--color-text-primary)]",
1294
+ children: "Project Budget"
1295
+ }
1296
+ ),
1297
+ /* @__PURE__ */ jsx(
1298
+ "select",
1299
+ {
1300
+ id: "full-project_budget",
1301
+ name: "project_budget",
1302
+ value: formData.project_budget,
1303
+ onChange: handleChange,
1304
+ className: inputClassName,
1305
+ children: budgetOptions.map((option) => /* @__PURE__ */ jsx("option", { value: option.value, children: option.label }, option.value))
1306
+ }
1307
+ ),
1308
+ /* @__PURE__ */ jsx("span", { className: "mt-1 text-xs text-[var(--color-text-muted)]", children: "This helps us recommend the right approach" })
1309
+ ] }),
1310
+ /* @__PURE__ */ jsxs("div", { children: [
1311
+ /* @__PURE__ */ jsx(
1312
+ "label",
1313
+ {
1314
+ htmlFor: "project-description",
1315
+ className: "mb-2 block text-sm font-medium text-[var(--color-text-primary)]",
1316
+ children: "Tell us about your project"
1317
+ }
1318
+ ),
1319
+ /* @__PURE__ */ jsx(
1320
+ "textarea",
1321
+ {
1322
+ id: "project-description",
1323
+ name: "project_description",
1324
+ rows: 6,
1325
+ value: formData.project_description,
1326
+ onChange: handleChange,
1327
+ placeholder: "What challenge are you trying to solve? Who is your target audience? What does success look like for this project?",
1328
+ className: `${inputClassName} resize-none`
1329
+ }
1330
+ ),
1331
+ /* @__PURE__ */ jsx("span", { className: "mt-1 text-xs text-[var(--color-text-muted)]", children: "The more context you provide, the better we can help" })
1332
+ ] }),
1333
+ /* @__PURE__ */ jsxs("div", { children: [
1334
+ /* @__PURE__ */ jsx(
1335
+ "button",
1336
+ {
1337
+ type: "submit",
1338
+ disabled: isLoading,
1339
+ className: "shrink-0 cursor-pointer rounded-lg border-none bg-linear-to-r from-[var(--color-dot-magenta)] via-[var(--color-dot-purple)] to-[var(--color-dot-turquoise)] px-6 py-3 text-base font-medium text-white transition-opacity hover:opacity-90 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--color-primary)] disabled:cursor-wait disabled:opacity-70",
1340
+ children: isLoading ? loadingText : submitButtonText
1341
+ }
1342
+ ),
1343
+ /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm text-[var(--color-text-muted)]", children: "We'll get back to you within 24 hours. Usually much sooner!" })
1344
+ ] })
1345
+ ] });
1346
+ }
1347
+ function FullWidthImage({ data }) {
1348
+ return /* @__PURE__ */ jsxs("section", { className: "py-20", children: [
1349
+ (data.title || data.content) && /* @__PURE__ */ jsxs("div", { className: "wrapper mb-8", children: [
1350
+ data.title && /* @__PURE__ */ jsx("h4", { className: "mb-4 text-2xl font-bold text-[var(--color-text-primary)]", children: data.title }),
1351
+ data.content && /* @__PURE__ */ jsx(
1352
+ "p",
1353
+ {
1354
+ className: "max-w-2xl text-lg text-[var(--color-text-secondary)]",
1355
+ dangerouslySetInnerHTML: { __html: data.content }
1356
+ }
1357
+ )
1358
+ ] }),
1359
+ /* @__PURE__ */ jsxs("div", { className: `relative ${data.overlay ? "has-overlay" : ""}`, children: [
1360
+ data.overlay && /* @__PURE__ */ jsx(
1361
+ "div",
1362
+ {
1363
+ className: `absolute inset-0 z-10 flex items-center justify-center ${data.overlay_type === "gradient" ? "bg-gradient-to-t from-black/70 via-black/30 to-transparent" : "bg-black/50"}`,
1364
+ children: data.overlay_content && /* @__PURE__ */ jsx(
1365
+ "div",
1366
+ {
1367
+ className: "max-w-2xl p-8 text-center text-white",
1368
+ dangerouslySetInnerHTML: { __html: data.overlay_content }
1369
+ }
1370
+ )
1371
+ }
1372
+ ),
1373
+ /* @__PURE__ */ jsx("img", { src: data.image, alt: data.alt, className: "h-auto w-full", loading: "lazy" })
1374
+ ] }),
1375
+ data.caption && /* @__PURE__ */ jsx("div", { className: "wrapper", children: /* @__PURE__ */ jsx(
1376
+ "p",
1377
+ {
1378
+ className: "mt-4 text-center text-sm text-[var(--color-text-muted)]",
1379
+ dangerouslySetInnerHTML: { __html: data.caption }
1380
+ }
1381
+ ) })
1382
+ ] });
1383
+ }
1384
+ function ImageGrid({ data }) {
1385
+ const gridClasses = {
1386
+ "50-50": "grid-cols-1 md:grid-cols-2",
1387
+ "2x2": "grid-cols-2",
1388
+ "3x3": "grid-cols-2 md:grid-cols-3"
1389
+ };
1390
+ const getImageData = (image) => {
1391
+ if (typeof image === "string") {
1392
+ return { src: image, alt: "", caption: void 0 };
1393
+ }
1394
+ return image;
1395
+ };
1396
+ return /* @__PURE__ */ jsxs("section", { className: "py-20", children: [
1397
+ (data.title || data.content) && /* @__PURE__ */ jsxs("div", { className: "wrapper mb-8", children: [
1398
+ data.title && /* @__PURE__ */ jsx("h4", { className: "mb-4 text-2xl font-bold text-[var(--color-text-primary)]", children: data.title }),
1399
+ data.content && /* @__PURE__ */ jsx(
1400
+ "p",
1401
+ {
1402
+ className: "max-w-2xl text-lg text-[var(--color-text-secondary)]",
1403
+ dangerouslySetInnerHTML: { __html: data.content }
1404
+ }
1405
+ )
1406
+ ] }),
1407
+ /* @__PURE__ */ jsx("div", { className: data.full_width ? "px-4" : "wrapper", children: /* @__PURE__ */ jsx("div", { className: `grid gap-4 ${gridClasses[data.grid_type] || gridClasses["50-50"]}`, children: data.images.map((image, index) => {
1408
+ const { src, alt, caption } = getImageData(image);
1409
+ return /* @__PURE__ */ jsxs("div", { className: "relative overflow-hidden rounded-lg", children: [
1410
+ /* @__PURE__ */ jsx(
1411
+ "img",
1412
+ {
1413
+ src,
1414
+ alt: alt || `Image ${index + 1}`,
1415
+ className: "h-full w-full object-cover",
1416
+ loading: "lazy"
1417
+ }
1418
+ ),
1419
+ caption && /* @__PURE__ */ jsx("div", { className: "absolute right-0 bottom-0 left-0 bg-gradient-to-t from-black/70 to-transparent p-4", children: /* @__PURE__ */ jsx("p", { className: "text-sm text-white", children: caption }) })
1420
+ ] }, index);
1421
+ }) }) }),
1422
+ data.grid_caption && /* @__PURE__ */ jsx("div", { className: "wrapper", children: /* @__PURE__ */ jsx("p", { className: "mt-4 text-center text-sm text-[var(--color-text-muted)]", children: data.grid_caption }) })
1423
+ ] });
1424
+ }
1425
+ function ImageGridModal({ data }) {
1426
+ const [modalOpen, setModalOpen] = useState(false);
1427
+ const [currentIndex, setCurrentIndex] = useState(0);
1428
+ useEffect(() => {
1429
+ if (modalOpen) {
1430
+ document.body.style.overflow = "hidden";
1431
+ } else {
1432
+ document.body.style.overflow = "";
1433
+ }
1434
+ return () => {
1435
+ document.body.style.overflow = "";
1436
+ };
1437
+ }, [modalOpen]);
1438
+ const openModal = (index) => {
1439
+ setCurrentIndex(index);
1440
+ setModalOpen(true);
1441
+ };
1442
+ const closeModal = () => {
1443
+ setModalOpen(false);
1444
+ };
1445
+ const navigate = (direction) => {
1446
+ if (direction === "prev") {
1447
+ setCurrentIndex((prev) => prev === 0 ? data.images.length - 1 : prev - 1);
1448
+ } else {
1449
+ setCurrentIndex((prev) => prev === data.images.length - 1 ? 0 : prev + 1);
1450
+ }
1451
+ };
1452
+ const layoutClasses = {
1453
+ square: "aspect-square",
1454
+ landscape: "aspect-video",
1455
+ portrait: "aspect-[3/4]",
1456
+ wide: "aspect-[21/9]"
1457
+ };
1458
+ return /* @__PURE__ */ jsxs("section", { className: "py-20", children: [
1459
+ /* @__PURE__ */ jsxs("div", { className: "wrapper", children: [
1460
+ /* @__PURE__ */ jsxs("div", { className: "mb-8", children: [
1461
+ /* @__PURE__ */ jsx("h3", { className: "mb-2 text-3xl font-bold text-[var(--color-text-primary)]", children: data.title }),
1462
+ data.subtitle && /* @__PURE__ */ jsx("p", { className: "text-lg text-[var(--color-text-secondary)]", children: data.subtitle })
1463
+ ] }),
1464
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-4 md:grid-cols-3", children: data.images.map((image, index) => /* @__PURE__ */ jsxs(
1465
+ "button",
1466
+ {
1467
+ onClick: () => openModal(index),
1468
+ className: `group relative cursor-pointer overflow-hidden rounded-lg ${layoutClasses[image.layout || "landscape"]}`,
1469
+ children: [
1470
+ /* @__PURE__ */ jsx(
1471
+ "img",
1472
+ {
1473
+ src: image.src,
1474
+ alt: image.alt,
1475
+ className: "h-full w-full object-cover transition-transform duration-300 group-hover:scale-105",
1476
+ loading: "lazy"
1477
+ }
1478
+ ),
1479
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-black/0 transition-colors group-hover:bg-black/30", children: /* @__PURE__ */ jsx(
1480
+ "svg",
1481
+ {
1482
+ className: "h-10 w-10 text-white opacity-0 transition-opacity group-hover:opacity-100",
1483
+ fill: "none",
1484
+ stroke: "currentColor",
1485
+ viewBox: "0 0 24 24",
1486
+ children: /* @__PURE__ */ jsx(
1487
+ "path",
1488
+ {
1489
+ strokeLinecap: "round",
1490
+ strokeLinejoin: "round",
1491
+ strokeWidth: 2,
1492
+ d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0zM10 7v3m0 0v3m0-3h3m-3 0H7"
1493
+ }
1494
+ )
1495
+ }
1496
+ ) }),
1497
+ image.caption && /* @__PURE__ */ jsx("div", { className: "absolute right-0 bottom-0 left-0 bg-gradient-to-t from-black/70 to-transparent p-3", children: /* @__PURE__ */ jsx("p", { className: "text-sm text-white", children: image.caption }) })
1498
+ ]
1499
+ },
1500
+ index
1501
+ )) }),
1502
+ data.description && /* @__PURE__ */ jsx("p", { className: "mt-6 text-[var(--color-text-secondary)]", children: data.description })
1503
+ ] }),
1504
+ modalOpen && /* @__PURE__ */ jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center", children: [
1505
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-black/90", onClick: closeModal }),
1506
+ /* @__PURE__ */ jsxs("div", { className: "relative z-10 mx-4 max-h-[90vh] w-full max-w-5xl", children: [
1507
+ /* @__PURE__ */ jsx(
1508
+ "button",
1509
+ {
1510
+ onClick: closeModal,
1511
+ className: "absolute -top-12 right-0 text-white hover:text-gray-300",
1512
+ children: /* @__PURE__ */ jsx("svg", { className: "h-8 w-8", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx(
1513
+ "path",
1514
+ {
1515
+ strokeLinecap: "round",
1516
+ strokeLinejoin: "round",
1517
+ strokeWidth: 2,
1518
+ d: "M6 18L18 6M6 6l12 12"
1519
+ }
1520
+ ) })
1521
+ }
1522
+ ),
1523
+ /* @__PURE__ */ jsx(
1524
+ "img",
1525
+ {
1526
+ src: data.images[currentIndex].src,
1527
+ alt: data.images[currentIndex].alt,
1528
+ className: "mx-auto max-h-[80vh] max-w-full rounded-lg object-contain"
1529
+ }
1530
+ ),
1531
+ data.images[currentIndex].caption && /* @__PURE__ */ jsx("p", { className: "mt-4 text-center text-white", children: data.images[currentIndex].caption }),
1532
+ /* @__PURE__ */ jsxs("div", { className: "mt-4 flex items-center justify-center gap-4", children: [
1533
+ /* @__PURE__ */ jsx(
1534
+ "button",
1535
+ {
1536
+ onClick: () => navigate("prev"),
1537
+ className: "p-2 text-white transition-colors hover:text-gray-300",
1538
+ children: /* @__PURE__ */ jsx("svg", { className: "h-8 w-8", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx(
1539
+ "path",
1540
+ {
1541
+ strokeLinecap: "round",
1542
+ strokeLinejoin: "round",
1543
+ strokeWidth: 2,
1544
+ d: "M15 19l-7-7 7-7"
1545
+ }
1546
+ ) })
1547
+ }
1548
+ ),
1549
+ /* @__PURE__ */ jsxs("span", { className: "text-white", children: [
1550
+ currentIndex + 1,
1551
+ " / ",
1552
+ data.images.length
1553
+ ] }),
1554
+ /* @__PURE__ */ jsx(
1555
+ "button",
1556
+ {
1557
+ onClick: () => navigate("next"),
1558
+ className: "p-2 text-white transition-colors hover:text-gray-300",
1559
+ children: /* @__PURE__ */ jsx("svg", { className: "h-8 w-8", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx(
1560
+ "path",
1561
+ {
1562
+ strokeLinecap: "round",
1563
+ strokeLinejoin: "round",
1564
+ strokeWidth: 2,
1565
+ d: "M9 5l7 7-7 7"
1566
+ }
1567
+ ) })
1568
+ }
1569
+ )
1570
+ ] })
1571
+ ] })
1572
+ ] })
1573
+ ] });
1574
+ }
1575
+ function ProblemStatement({ data }) {
1576
+ return /* @__PURE__ */ jsx("section", { className: "py-20", children: /* @__PURE__ */ jsxs("div", { className: "wrapper", children: [
1577
+ /* @__PURE__ */ jsxs("div", { className: "mb-8", children: [
1578
+ /* @__PURE__ */ jsx("div", { className: "mb-4 h-1 w-12 bg-[var(--color-primary)]" }),
1579
+ /* @__PURE__ */ jsx("h3", { className: "mb-2 text-3xl font-bold text-[var(--color-text-primary)]", children: data.title }),
1580
+ data.subtitle && /* @__PURE__ */ jsx("p", { className: "text-lg text-[var(--color-text-secondary)]", children: data.subtitle })
1581
+ ] }),
1582
+ /* @__PURE__ */ jsxs("div", { className: "mb-12 grid gap-8 lg:grid-cols-3", children: [
1583
+ /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-[var(--color-border)] bg-[var(--color-surface)] p-6", children: [
1584
+ /* @__PURE__ */ jsx("div", { className: "mb-4 flex h-10 w-10 items-center justify-center rounded-lg bg-[var(--color-primary)]/10", children: /* @__PURE__ */ jsx(
1585
+ "svg",
1586
+ {
1587
+ className: "h-5 w-5 text-[var(--color-primary)]",
1588
+ fill: "none",
1589
+ stroke: "currentColor",
1590
+ viewBox: "0 0 24 24",
1591
+ children: /* @__PURE__ */ jsx(
1592
+ "path",
1593
+ {
1594
+ strokeLinecap: "round",
1595
+ strokeLinejoin: "round",
1596
+ strokeWidth: 2,
1597
+ d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"
1598
+ }
1599
+ )
1600
+ }
1601
+ ) }),
1602
+ /* @__PURE__ */ jsx("h4", { className: "mb-2 text-lg font-semibold text-[var(--color-text-primary)]", children: "The Challenge" }),
1603
+ /* @__PURE__ */ jsx(
1604
+ "p",
1605
+ {
1606
+ className: "text-[var(--color-text-secondary)]",
1607
+ dangerouslySetInnerHTML: { __html: data.problem }
1608
+ }
1609
+ )
1610
+ ] }),
1611
+ /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-[var(--color-border)] bg-[var(--color-surface)] p-6", children: [
1612
+ /* @__PURE__ */ jsx("div", { className: "mb-4 flex h-10 w-10 items-center justify-center rounded-lg bg-[var(--color-primary)]/10", children: /* @__PURE__ */ jsx(
1613
+ "svg",
1614
+ {
1615
+ className: "h-5 w-5 text-[var(--color-primary)]",
1616
+ fill: "none",
1617
+ stroke: "currentColor",
1618
+ viewBox: "0 0 24 24",
1619
+ children: /* @__PURE__ */ jsx(
1620
+ "path",
1621
+ {
1622
+ strokeLinecap: "round",
1623
+ strokeLinejoin: "round",
1624
+ strokeWidth: 2,
1625
+ d: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"
1626
+ }
1627
+ )
1628
+ }
1629
+ ) }),
1630
+ /* @__PURE__ */ jsx("h4", { className: "mb-2 text-lg font-semibold text-[var(--color-text-primary)]", children: "Background" }),
1631
+ /* @__PURE__ */ jsx(
1632
+ "p",
1633
+ {
1634
+ className: "text-[var(--color-text-secondary)]",
1635
+ dangerouslySetInnerHTML: { __html: data.context }
1636
+ }
1637
+ )
1638
+ ] }),
1639
+ /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-[var(--color-border)] bg-[var(--color-surface)] p-6", children: [
1640
+ /* @__PURE__ */ jsx("div", { className: "mb-4 flex h-10 w-10 items-center justify-center rounded-lg bg-[var(--color-primary)]/10", children: /* @__PURE__ */ jsx(
1641
+ "svg",
1642
+ {
1643
+ className: "h-5 w-5 text-[var(--color-primary)]",
1644
+ fill: "none",
1645
+ stroke: "currentColor",
1646
+ viewBox: "0 0 24 24",
1647
+ children: /* @__PURE__ */ jsx(
1648
+ "path",
1649
+ {
1650
+ strokeLinecap: "round",
1651
+ strokeLinejoin: "round",
1652
+ strokeWidth: 2,
1653
+ d: "M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"
1654
+ }
1655
+ )
1656
+ }
1657
+ ) }),
1658
+ /* @__PURE__ */ jsx("h4", { className: "mb-2 text-lg font-semibold text-[var(--color-text-primary)]", children: "Project Goals" }),
1659
+ /* @__PURE__ */ jsx("ul", { className: "space-y-2", children: data.goals.map((goal, index) => /* @__PURE__ */ jsxs(
1660
+ "li",
1661
+ {
1662
+ className: "flex items-start gap-2 text-[var(--color-text-secondary)]",
1663
+ children: [
1664
+ /* @__PURE__ */ jsx(
1665
+ "svg",
1666
+ {
1667
+ className: "mt-1 h-4 w-4 flex-shrink-0 text-[var(--color-primary)]",
1668
+ fill: "currentColor",
1669
+ viewBox: "0 0 20 20",
1670
+ children: /* @__PURE__ */ jsx(
1671
+ "path",
1672
+ {
1673
+ fillRule: "evenodd",
1674
+ d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",
1675
+ clipRule: "evenodd"
1676
+ }
1677
+ )
1678
+ }
1679
+ ),
1680
+ /* @__PURE__ */ jsx("span", { children: goal })
1681
+ ]
1682
+ },
1683
+ index
1684
+ )) })
1685
+ ] })
1686
+ ] }),
1687
+ data.stakeholders && data.stakeholders.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
1688
+ /* @__PURE__ */ jsx("h4", { className: "mb-6 text-xl font-semibold text-[var(--color-text-primary)]", children: "Key Stakeholders" }),
1689
+ /* @__PURE__ */ jsx("div", { className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3", children: data.stakeholders.map((stakeholder, index) => /* @__PURE__ */ jsxs("div", { className: "rounded-lg bg-[var(--color-background-light)] p-4", children: [
1690
+ /* @__PURE__ */ jsx("h5", { className: "mb-1 font-medium text-[var(--color-text-primary)]", children: stakeholder.role }),
1691
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--color-text-secondary)]", children: stakeholder.description })
1692
+ ] }, index)) })
1693
+ ] })
1694
+ ] }) });
1695
+ }
1696
+ function ProcessTimeline({ data }) {
1697
+ const isHorizontal = data.layout === "horizontal";
1698
+ return /* @__PURE__ */ jsx("section", { className: "bg-[var(--color-background-light)] py-20", children: /* @__PURE__ */ jsxs("div", { className: "wrapper", children: [
1699
+ /* @__PURE__ */ jsxs("div", { className: "mb-12 text-center", children: [
1700
+ /* @__PURE__ */ jsx("h2", { className: "mb-2 text-3xl font-bold text-[var(--color-text-primary)]", children: data.title }),
1701
+ data.subtitle && /* @__PURE__ */ jsx("p", { className: "mx-auto max-w-2xl text-lg text-[var(--color-text-secondary)]", children: data.subtitle })
1702
+ ] }),
1703
+ /* @__PURE__ */ jsxs("div", { className: `relative ${isHorizontal ? "overflow-x-auto" : ""}`, children: [
1704
+ !isHorizontal && /* @__PURE__ */ jsx("div", { className: "absolute top-0 bottom-0 left-8 w-0.5 bg-[var(--color-border)]" }),
1705
+ /* @__PURE__ */ jsx("div", { className: isHorizontal ? "flex min-w-max gap-8 pb-4" : "space-y-8", children: data.steps.map((step, index) => /* @__PURE__ */ jsxs(
1706
+ "div",
1707
+ {
1708
+ className: `relative ${isHorizontal ? "min-w-[280px] flex-1" : "pl-20"}`,
1709
+ "data-step": index + 1,
1710
+ children: [
1711
+ /* @__PURE__ */ jsx(
1712
+ "div",
1713
+ {
1714
+ className: `${isHorizontal ? "mx-auto mb-4 h-12 w-12" : "absolute top-0 left-0 h-16 w-16"} z-10 flex items-center justify-center rounded-full bg-[var(--color-primary)] text-lg font-bold text-white`,
1715
+ children: step.icon ? /* @__PURE__ */ jsx("span", { dangerouslySetInnerHTML: { __html: step.icon } }) : index + 1
1716
+ }
1717
+ ),
1718
+ /* @__PURE__ */ jsxs(
1719
+ "div",
1720
+ {
1721
+ className: `${data.style === "cards" ? "rounded-xl border border-[var(--color-border)] bg-[var(--color-surface)] p-6" : ""}`,
1722
+ children: [
1723
+ step.phase && /* @__PURE__ */ jsx("span", { className: "text-xs font-semibold tracking-wider text-[var(--color-primary)] uppercase", children: step.phase }),
1724
+ /* @__PURE__ */ jsx("h3", { className: "mt-1 mb-2 text-xl font-semibold text-[var(--color-text-primary)]", children: step.title }),
1725
+ /* @__PURE__ */ jsx(
1726
+ "p",
1727
+ {
1728
+ className: "text-[var(--color-text-secondary)]",
1729
+ dangerouslySetInnerHTML: { __html: step.description }
1730
+ }
1731
+ ),
1732
+ step.deliverables && step.deliverables.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mt-4", children: [
1733
+ /* @__PURE__ */ jsx("h4", { className: "mb-2 text-sm font-semibold text-[var(--color-text-primary)]", children: "Deliverables" }),
1734
+ /* @__PURE__ */ jsx("ul", { className: "space-y-1", children: step.deliverables.map((deliverable, dIndex) => /* @__PURE__ */ jsxs(
1735
+ "li",
1736
+ {
1737
+ className: "flex items-center gap-2 text-sm text-[var(--color-text-secondary)]",
1738
+ children: [
1739
+ /* @__PURE__ */ jsx(
1740
+ "svg",
1741
+ {
1742
+ className: "h-4 w-4 flex-shrink-0 text-[var(--color-primary)]",
1743
+ fill: "currentColor",
1744
+ viewBox: "0 0 20 20",
1745
+ children: /* @__PURE__ */ jsx(
1746
+ "path",
1747
+ {
1748
+ fillRule: "evenodd",
1749
+ d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",
1750
+ clipRule: "evenodd"
1751
+ }
1752
+ )
1753
+ }
1754
+ ),
1755
+ deliverable
1756
+ ]
1757
+ },
1758
+ dIndex
1759
+ )) })
1760
+ ] }),
1761
+ step.duration && /* @__PURE__ */ jsxs("div", { className: "mt-4 flex items-center gap-2 text-sm", children: [
1762
+ /* @__PURE__ */ jsx("span", { className: "text-[var(--color-text-muted)]", children: "Duration:" }),
1763
+ /* @__PURE__ */ jsx("span", { className: "font-medium text-[var(--color-text-secondary)]", children: step.duration })
1764
+ ] })
1765
+ ]
1766
+ }
1767
+ )
1768
+ ]
1769
+ },
1770
+ index
1771
+ )) })
1772
+ ] }),
1773
+ data.summary && /* @__PURE__ */ jsx(
1774
+ "p",
1775
+ {
1776
+ className: "mx-auto mt-12 max-w-2xl text-center text-[var(--color-text-secondary)]",
1777
+ dangerouslySetInnerHTML: { __html: data.summary }
1778
+ }
1779
+ )
1780
+ ] }) });
1781
+ }
1782
+ function RelatedProjects({ data, allProjects }) {
1783
+ if (!data.projects || data.projects.length === 0) return null;
1784
+ const layoutClasses = {
1785
+ grid: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",
1786
+ list: "space-y-6",
1787
+ carousel: "flex gap-6 overflow-x-auto pb-4"
1788
+ };
1789
+ const relatedProjects = data.projects.map((slug) => ({ slug, project: allProjects[slug] })).filter(({ project }) => project);
1790
+ return /* @__PURE__ */ jsx("section", { className: "bg-[var(--color-background-light)] py-20", children: /* @__PURE__ */ jsxs("div", { className: "wrapper", children: [
1791
+ /* @__PURE__ */ jsxs("div", { className: "mb-12 text-center", children: [
1792
+ /* @__PURE__ */ jsx("h2", { className: "mb-2 text-3xl font-bold text-[var(--color-text-primary)]", children: data.title }),
1793
+ data.subtitle && /* @__PURE__ */ jsx("p", { className: "text-lg text-[var(--color-text-secondary)]", children: data.subtitle })
1794
+ ] }),
1795
+ /* @__PURE__ */ jsx("div", { className: layoutClasses[data.layout], children: relatedProjects.map(({ slug, project }) => /* @__PURE__ */ jsx(
1796
+ "article",
1797
+ {
1798
+ className: `group ${data.layout === "carousel" ? "w-80 flex-shrink-0" : ""}`,
1799
+ children: /* @__PURE__ */ jsxs("a", { href: `/projects/${slug}`, className: "block", children: [
1800
+ /* @__PURE__ */ jsxs("div", { className: "relative mb-4 overflow-hidden rounded-xl", children: [
1801
+ /* @__PURE__ */ jsx(
1802
+ "img",
1803
+ {
1804
+ src: project.thumbnail,
1805
+ alt: project.title,
1806
+ className: "aspect-video w-full object-cover transition-transform duration-300 group-hover:scale-105",
1807
+ loading: "lazy"
1808
+ }
1809
+ ),
1810
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-black/0 transition-colors group-hover:bg-black/20", children: /* @__PURE__ */ jsx("span", { className: "font-medium text-white opacity-0 transition-opacity group-hover:opacity-100", children: "View Project" }) })
1811
+ ] }),
1812
+ /* @__PURE__ */ jsxs("div", { children: [
1813
+ /* @__PURE__ */ jsx("h3", { className: "text-xl font-semibold text-[var(--color-text-primary)] transition-colors group-hover:text-[var(--color-primary)]", children: project.title }),
1814
+ (data.show_role !== false || data.show_year !== false) && /* @__PURE__ */ jsxs("div", { className: "mt-1 flex items-center gap-2 text-sm text-[var(--color-text-muted)]", children: [
1815
+ data.show_role !== false && /* @__PURE__ */ jsx("span", { dangerouslySetInnerHTML: { __html: project.role.split("<br")[0] } }),
1816
+ data.show_role !== false && data.show_year !== false && /* @__PURE__ */ jsx("span", { children: "\u2022" }),
1817
+ data.show_year !== false && /* @__PURE__ */ jsx("span", { children: project.year })
1818
+ ] }),
1819
+ data.show_description !== false && /* @__PURE__ */ jsx("p", { className: "mt-2 line-clamp-2 text-sm text-[var(--color-text-secondary)]", children: project.meta_description })
1820
+ ] })
1821
+ ] })
1822
+ },
1823
+ slug
1824
+ )) }),
1825
+ data.cta && /* @__PURE__ */ jsx("div", { className: "mt-12 text-center", children: /* @__PURE__ */ jsx(
1826
+ "a",
1827
+ {
1828
+ href: data.cta.url,
1829
+ className: `btn ${data.cta.style === "primary" ? "btn-primary" : "btn-outline"}`,
1830
+ children: data.cta.text
1831
+ }
1832
+ ) })
1833
+ ] }) });
1834
+ }
1835
+ function SolutionSummary({ data }) {
1836
+ return /* @__PURE__ */ jsx("section", { className: "bg-[var(--color-background-light)] py-20", children: /* @__PURE__ */ jsxs("div", { className: "wrapper", children: [
1837
+ /* @__PURE__ */ jsxs("div", { className: "mb-8", children: [
1838
+ /* @__PURE__ */ jsx("div", { className: "mb-4 h-1 w-12 bg-[var(--color-primary)]" }),
1839
+ /* @__PURE__ */ jsx("h3", { className: "mb-2 text-3xl font-bold text-[var(--color-text-primary)]", children: data.title }),
1840
+ data.subtitle && /* @__PURE__ */ jsx("p", { className: "text-lg text-[var(--color-text-secondary)]", children: data.subtitle })
1841
+ ] }),
1842
+ /* @__PURE__ */ jsx("div", { className: "mb-12", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-4", children: [
1843
+ /* @__PURE__ */ jsx("div", { className: "flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-lg bg-[var(--color-primary)]/10", children: /* @__PURE__ */ jsx(
1844
+ "svg",
1845
+ {
1846
+ className: "h-5 w-5 text-[var(--color-primary)]",
1847
+ fill: "none",
1848
+ stroke: "currentColor",
1849
+ viewBox: "0 0 24 24",
1850
+ children: /* @__PURE__ */ jsx(
1851
+ "path",
1852
+ {
1853
+ strokeLinecap: "round",
1854
+ strokeLinejoin: "round",
1855
+ strokeWidth: 2,
1856
+ d: "M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"
1857
+ }
1858
+ )
1859
+ }
1860
+ ) }),
1861
+ /* @__PURE__ */ jsxs("div", { children: [
1862
+ /* @__PURE__ */ jsx("h4", { className: "mb-2 text-xl font-semibold text-[var(--color-text-primary)]", children: "Our Solution" }),
1863
+ /* @__PURE__ */ jsx(
1864
+ "p",
1865
+ {
1866
+ className: "text-lg text-[var(--color-text-secondary)]",
1867
+ dangerouslySetInnerHTML: { __html: data.overview }
1868
+ }
1869
+ )
1870
+ ] })
1871
+ ] }) }),
1872
+ data.approach && data.approach.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mb-12", children: [
1873
+ /* @__PURE__ */ jsx("h4", { className: "mb-6 text-xl font-semibold text-[var(--color-text-primary)]", children: "Our Approach" }),
1874
+ /* @__PURE__ */ jsx("div", { className: "grid gap-4 md:grid-cols-2", children: data.approach.map((step, index) => /* @__PURE__ */ jsxs(
1875
+ "div",
1876
+ {
1877
+ className: "flex gap-4 rounded-lg border border-[var(--color-border)] bg-[var(--color-surface)] p-4",
1878
+ children: [
1879
+ /* @__PURE__ */ jsx("div", { className: "flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-full bg-[var(--color-primary)] text-sm font-semibold text-white", children: index + 1 }),
1880
+ /* @__PURE__ */ jsxs("div", { children: [
1881
+ /* @__PURE__ */ jsx("h5", { className: "mb-1 font-medium text-[var(--color-text-primary)]", children: step.title }),
1882
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--color-text-secondary)]", children: step.description })
1883
+ ] })
1884
+ ]
1885
+ },
1886
+ index
1887
+ )) })
1888
+ ] }),
1889
+ data.key_features && data.key_features.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mb-12", children: [
1890
+ /* @__PURE__ */ jsx("h4", { className: "mb-6 text-xl font-semibold text-[var(--color-text-primary)]", children: "Key Features Delivered" }),
1891
+ /* @__PURE__ */ jsx("div", { className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-4", children: data.key_features.map((feature, index) => /* @__PURE__ */ jsxs(
1892
+ "div",
1893
+ {
1894
+ className: "rounded-lg border border-[var(--color-border)] bg-[var(--color-surface)] p-4",
1895
+ children: [
1896
+ /* @__PURE__ */ jsx("div", { className: "mb-3 flex h-8 w-8 items-center justify-center rounded-lg bg-[var(--color-primary)]/10", children: /* @__PURE__ */ jsx(
1897
+ "svg",
1898
+ {
1899
+ className: "h-4 w-4 text-[var(--color-primary)]",
1900
+ fill: "currentColor",
1901
+ viewBox: "0 0 20 20",
1902
+ children: /* @__PURE__ */ jsx(
1903
+ "path",
1904
+ {
1905
+ fillRule: "evenodd",
1906
+ d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",
1907
+ clipRule: "evenodd"
1908
+ }
1909
+ )
1910
+ }
1911
+ ) }),
1912
+ /* @__PURE__ */ jsx("h5", { className: "mb-1 font-medium text-[var(--color-text-primary)]", children: feature.title }),
1913
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--color-text-secondary)]", children: feature.description })
1914
+ ]
1915
+ },
1916
+ index
1917
+ )) })
1918
+ ] }),
1919
+ data.technologies && data.technologies.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mb-12", children: [
1920
+ /* @__PURE__ */ jsx("h4", { className: "mb-4 text-xl font-semibold text-[var(--color-text-primary)]", children: "Technologies & Tools" }),
1921
+ /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: data.technologies.map((tech, index) => /* @__PURE__ */ jsx(
1922
+ "span",
1923
+ {
1924
+ className: "rounded-full border border-[var(--color-border)] bg-[var(--color-surface)] px-3 py-1 text-sm text-[var(--color-text-secondary)]",
1925
+ children: tech
1926
+ },
1927
+ index
1928
+ )) })
1929
+ ] }),
1930
+ data.quote && /* @__PURE__ */ jsxs("blockquote", { className: "border-l-4 border-[var(--color-primary)] py-2 pl-6", children: [
1931
+ /* @__PURE__ */ jsxs("p", { className: "mb-2 text-xl text-[var(--color-text-primary)] italic", children: [
1932
+ '"',
1933
+ data.quote.text,
1934
+ '"'
1935
+ ] }),
1936
+ /* @__PURE__ */ jsxs("cite", { className: "text-[var(--color-text-secondary)] not-italic", children: [
1937
+ "\u2014 ",
1938
+ data.quote.author,
1939
+ data.quote.title && /* @__PURE__ */ jsxs("span", { className: "text-[var(--color-text-muted)]", children: [
1940
+ ", ",
1941
+ data.quote.title
1942
+ ] })
1943
+ ] })
1944
+ ] })
1945
+ ] }) });
1946
+ }
1947
+ var socialIcons = {
1948
+ linkedin: /* @__PURE__ */ jsx("svg", { className: "h-5 w-5", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z" }) }),
1949
+ twitter: /* @__PURE__ */ jsx("svg", { className: "h-5 w-5", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z" }) }),
1950
+ github: /* @__PURE__ */ jsx("svg", { className: "h-5 w-5", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" }) }),
1951
+ dribbble: /* @__PURE__ */ jsx("svg", { className: "h-5 w-5", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M12 24C5.385 24 0 18.615 0 12S5.385 0 12 0s12 5.385 12 12-5.385 12-12 12zm10.12-10.358c-.35-.11-3.17-.953-6.384-.438 1.34 3.684 1.887 6.684 1.992 7.308 2.3-1.555 3.936-4.02 4.395-6.87zm-6.115 7.808c-.153-.9-.75-4.032-2.19-7.77l-.066.02c-5.79 2.015-7.86 6.025-8.04 6.4 1.73 1.358 3.92 2.166 6.29 2.166 1.42 0 2.77-.29 4-.814zm-11.62-2.58c.232-.4 3.045-5.055 8.332-6.765.135-.045.27-.084.405-.12-.26-.585-.54-1.167-.832-1.74C7.17 11.775 2.206 11.71 1.756 11.7l-.004.312c0 2.633.998 5.037 2.634 6.855zm-2.42-8.955c.46.008 4.683.026 9.477-1.248-1.698-3.018-3.53-5.558-3.8-5.928-2.868 1.35-5.01 3.99-5.676 7.17zM9.6 2.052c.282.38 2.145 2.914 3.822 6 3.645-1.365 5.19-3.44 5.373-3.702-1.81-1.61-4.19-2.586-6.795-2.586-.825 0-1.63.1-2.4.285zm10.335 3.483c-.218.29-1.935 2.493-5.724 4.04.24.49.47.985.68 1.486.08.18.15.36.22.53 3.41-.43 6.8.26 7.14.33-.02-2.42-.88-4.64-2.31-6.38z" }) }),
1952
+ behance: /* @__PURE__ */ jsx("svg", { className: "h-5 w-5", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M6.938 4.503c.702 0 1.34.06 1.92.188.577.13 1.07.33 1.485.61.41.28.733.65.96 1.12.225.47.34 1.05.34 1.73 0 .74-.17 1.36-.507 1.86-.338.5-.837.9-1.502 1.22.906.26 1.576.72 2.022 1.37.448.66.665 1.45.665 2.36 0 .75-.13 1.39-.41 1.93-.28.55-.67 1-1.16 1.35-.48.348-1.05.6-1.67.767-.61.165-1.252.254-1.91.254H0V4.51h6.938v-.007zM6.545 9.67c.56 0 1.01-.13 1.36-.404.35-.27.52-.678.52-1.22 0-.31-.06-.56-.18-.76-.12-.2-.28-.35-.48-.45-.2-.1-.42-.17-.65-.2-.23-.03-.46-.04-.7-.04H2.91v3.07h3.64zm.18 5.27c.27 0 .52-.02.76-.07.24-.05.46-.13.64-.25.18-.12.33-.29.44-.5.11-.22.16-.49.16-.82 0-.65-.18-1.12-.54-1.4-.36-.28-.85-.42-1.48-.42H2.91v3.46h3.82zM15.47 14.15c.36.42.85.63 1.48.63.45 0 .84-.11 1.17-.33.33-.22.55-.46.67-.7h2.21c-.35 1.06-.87 1.83-1.56 2.3-.7.47-1.54.71-2.54.71-.69 0-1.31-.12-1.87-.36-.56-.24-1.04-.58-1.43-1.01-.39-.43-.7-.94-.9-1.53-.21-.59-.31-1.23-.31-1.92 0-.67.11-1.3.33-1.88.22-.58.53-1.09.93-1.52.4-.43.88-.77 1.43-1.01.56-.24 1.16-.36 1.82-.36.72 0 1.35.14 1.89.42.54.28.99.66 1.36 1.13.37.47.64 1.01.82 1.62.18.61.26 1.25.23 1.92h-6.6c0 .68.17 1.25.53 1.68zm2.49-4.91c-.32-.36-.77-.54-1.35-.54-.38 0-.7.07-.95.2-.25.14-.45.3-.61.5-.16.2-.27.4-.35.62-.08.21-.13.41-.15.58h4.23c-.11-.57-.34-1.01-.65-1.36h-.17zM14.04 4.75h5.27v1.41h-5.27V4.75z" }) })
1953
+ };
1954
+ function TeamCredits({ data }) {
1955
+ if (!data.members || data.members.length === 0) return null;
1956
+ const layoutClasses = {
1957
+ grid: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",
1958
+ list: "space-y-6",
1959
+ carousel: "flex gap-6 overflow-x-auto pb-4"
1960
+ };
1961
+ return /* @__PURE__ */ jsx("section", { className: "py-20", children: /* @__PURE__ */ jsxs("div", { className: "wrapper", children: [
1962
+ /* @__PURE__ */ jsxs("div", { className: "mb-12 text-center", children: [
1963
+ /* @__PURE__ */ jsx("h2", { className: "mb-2 text-3xl font-bold text-[var(--color-text-primary)]", children: data.title }),
1964
+ data.subtitle && /* @__PURE__ */ jsx("p", { className: "text-lg text-[var(--color-text-secondary)]", children: data.subtitle })
1965
+ ] }),
1966
+ /* @__PURE__ */ jsx("div", { className: layoutClasses[data.layout], children: data.members.map((member, index) => /* @__PURE__ */ jsxs(
1967
+ "div",
1968
+ {
1969
+ className: `overflow-hidden rounded-xl border border-[var(--color-border)] bg-[var(--color-surface)] ${data.layout === "carousel" ? "w-80 flex-shrink-0" : ""}`,
1970
+ children: [
1971
+ member.photo && /* @__PURE__ */ jsxs("div", { className: "relative", children: [
1972
+ /* @__PURE__ */ jsx(
1973
+ "img",
1974
+ {
1975
+ src: member.photo,
1976
+ alt: member.name,
1977
+ className: "aspect-square w-full object-cover",
1978
+ loading: "lazy"
1979
+ }
1980
+ ),
1981
+ member.company_logo && /* @__PURE__ */ jsx("div", { className: "absolute right-4 bottom-4 rounded-lg bg-white p-2 shadow-md", children: /* @__PURE__ */ jsx(
1982
+ "img",
1983
+ {
1984
+ src: member.company_logo,
1985
+ alt: member.company || "",
1986
+ className: "h-6 w-auto"
1987
+ }
1988
+ ) })
1989
+ ] }),
1990
+ /* @__PURE__ */ jsxs("div", { className: "p-6", children: [
1991
+ /* @__PURE__ */ jsx("h3", { className: "text-xl font-semibold text-[var(--color-text-primary)]", children: member.name }),
1992
+ /* @__PURE__ */ jsx("p", { className: "mb-1 text-[var(--color-primary)]", children: member.role }),
1993
+ member.company && /* @__PURE__ */ jsx("p", { className: "mb-3 text-sm text-[var(--color-text-muted)]", children: member.company }),
1994
+ member.contribution && /* @__PURE__ */ jsx(
1995
+ "p",
1996
+ {
1997
+ className: "mb-4 text-sm text-[var(--color-text-secondary)]",
1998
+ dangerouslySetInnerHTML: { __html: member.contribution }
1999
+ }
2000
+ ),
2001
+ member.quote && /* @__PURE__ */ jsxs("blockquote", { className: "mb-4 border-l-2 border-[var(--color-primary)] pl-3 text-sm text-[var(--color-text-secondary)] italic", children: [
2002
+ '"',
2003
+ member.quote,
2004
+ '"'
2005
+ ] }),
2006
+ member.social && Object.keys(member.social).length > 0 && /* @__PURE__ */ jsx("div", { className: "flex gap-3", children: Object.entries(member.social).map(([platform, url]) => /* @__PURE__ */ jsx(
2007
+ "a",
2008
+ {
2009
+ href: url,
2010
+ target: "_blank",
2011
+ rel: "noopener noreferrer",
2012
+ className: "text-[var(--color-text-muted)] transition-colors hover:text-[var(--color-primary)]",
2013
+ "aria-label": platform,
2014
+ children: socialIcons[platform] || platform
2015
+ },
2016
+ platform
2017
+ )) })
2018
+ ] })
2019
+ ]
2020
+ },
2021
+ index
2022
+ )) }),
2023
+ data.note && /* @__PURE__ */ jsx("p", { className: "mt-8 text-center text-sm text-[var(--color-text-muted)]", children: data.note })
2024
+ ] }) });
2025
+ }
2026
+ function StarRating({ rating }) {
2027
+ return /* @__PURE__ */ jsx("div", { className: "flex gap-1", children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsx(
2028
+ "svg",
2029
+ {
2030
+ className: `h-4 w-4 ${star <= rating ? "text-yellow-400" : "text-gray-300"}`,
2031
+ fill: "currentColor",
2032
+ viewBox: "0 0 20 20",
2033
+ children: /* @__PURE__ */ jsx("path", { d: "M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" })
2034
+ },
2035
+ star
2036
+ )) });
2037
+ }
2038
+ function Testimonial({ data }) {
2039
+ if (data.single_quote) {
2040
+ return /* @__PURE__ */ jsx("section", { className: "bg-[var(--color-background-light)] py-20", children: /* @__PURE__ */ jsx("div", { className: "wrapper", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-3xl text-center", children: [
2041
+ /* @__PURE__ */ jsx(
2042
+ "svg",
2043
+ {
2044
+ className: "mx-auto mb-6 h-12 w-12 text-[var(--color-primary)]",
2045
+ fill: "currentColor",
2046
+ viewBox: "0 0 24 24",
2047
+ children: /* @__PURE__ */ jsx("path", { d: "M14.017 21v-7.391c0-5.704 3.731-9.57 8.983-10.609l.995 2.151c-2.432.917-3.995 3.638-3.995 5.849h4v10h-9.983zm-14.017 0v-7.391c0-5.704 3.748-9.57 9-10.609l.996 2.151c-2.433.917-3.996 3.638-3.996 5.849h3.983v10h-9.983z" })
2048
+ }
2049
+ ),
2050
+ /* @__PURE__ */ jsxs("blockquote", { children: [
2051
+ /* @__PURE__ */ jsxs("p", { className: "mb-6 text-2xl font-medium text-[var(--color-text-primary)] md:text-3xl", children: [
2052
+ '"',
2053
+ data.single_quote.text,
2054
+ '"'
2055
+ ] }),
2056
+ /* @__PURE__ */ jsx("footer", { children: /* @__PURE__ */ jsxs("cite", { className: "not-italic", children: [
2057
+ /* @__PURE__ */ jsx("strong", { className: "text-lg text-[var(--color-text-primary)]", children: data.single_quote.author }),
2058
+ data.single_quote.title && /* @__PURE__ */ jsx("span", { className: "block text-[var(--color-text-secondary)]", children: data.single_quote.title }),
2059
+ data.single_quote.company && /* @__PURE__ */ jsx("span", { className: "block text-[var(--color-text-muted)]", children: data.single_quote.company })
2060
+ ] }) })
2061
+ ] })
2062
+ ] }) }) });
2063
+ }
2064
+ if (!data.testimonials || data.testimonials.length === 0) return null;
2065
+ return /* @__PURE__ */ jsx("section", { className: "py-20", children: /* @__PURE__ */ jsxs("div", { className: "wrapper", children: [
2066
+ /* @__PURE__ */ jsxs("div", { className: "mb-12 text-center", children: [
2067
+ /* @__PURE__ */ jsx("h3", { className: "mb-2 text-3xl font-bold text-[var(--color-text-primary)]", children: data.title }),
2068
+ data.subtitle && /* @__PURE__ */ jsx("p", { className: "text-lg text-[var(--color-text-secondary)]", children: data.subtitle })
2069
+ ] }),
2070
+ /* @__PURE__ */ jsx("div", { className: "grid gap-6 md:grid-cols-2 lg:grid-cols-3", children: data.testimonials.map((testimonial, index) => /* @__PURE__ */ jsxs(
2071
+ "div",
2072
+ {
2073
+ className: "rounded-xl border border-[var(--color-border)] bg-[var(--color-surface)] p-6",
2074
+ children: [
2075
+ /* @__PURE__ */ jsx(
2076
+ "svg",
2077
+ {
2078
+ className: "mb-4 h-8 w-8 text-[var(--color-primary)]/30",
2079
+ fill: "currentColor",
2080
+ viewBox: "0 0 24 24",
2081
+ children: /* @__PURE__ */ jsx("path", { d: "M14.017 21v-7.391c0-5.704 3.731-9.57 8.983-10.609l.995 2.151c-2.432.917-3.995 3.638-3.995 5.849h4v10h-9.983zm-14.017 0v-7.391c0-5.704 3.748-9.57 9-10.609l.996 2.151c-2.433.917-3.996 3.638-3.996 5.849h3.983v10h-9.983z" })
2082
+ }
2083
+ ),
2084
+ /* @__PURE__ */ jsx("blockquote", { className: "mb-4", children: /* @__PURE__ */ jsxs("p", { className: "text-[var(--color-text-secondary)]", children: [
2085
+ '"',
2086
+ testimonial.quote,
2087
+ '"'
2088
+ ] }) }),
2089
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
2090
+ testimonial.photo && /* @__PURE__ */ jsx(
2091
+ "img",
2092
+ {
2093
+ src: testimonial.photo,
2094
+ alt: testimonial.name,
2095
+ className: "h-12 w-12 rounded-full object-cover",
2096
+ loading: "lazy"
2097
+ }
2098
+ ),
2099
+ /* @__PURE__ */ jsxs("div", { children: [
2100
+ /* @__PURE__ */ jsx("cite", { className: "font-medium text-[var(--color-text-primary)] not-italic", children: testimonial.name }),
2101
+ testimonial.title && /* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--color-text-muted)]", children: testimonial.title }),
2102
+ testimonial.company && /* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--color-text-muted)]", children: testimonial.company })
2103
+ ] })
2104
+ ] }),
2105
+ testimonial.rating && /* @__PURE__ */ jsx("div", { className: "mt-4", children: /* @__PURE__ */ jsx(StarRating, { rating: testimonial.rating }) }),
2106
+ testimonial.context && /* @__PURE__ */ jsx("p", { className: "mt-4 text-sm text-[var(--color-text-muted)] italic", children: testimonial.context })
2107
+ ]
2108
+ },
2109
+ index
2110
+ )) })
2111
+ ] }) });
2112
+ }
2113
+ function TextBlock({ data }) {
2114
+ const layoutClasses = {
2115
+ standard: "max-w-3xl",
2116
+ wide: "max-w-5xl",
2117
+ centered: "max-w-2xl mx-auto text-center"
2118
+ };
2119
+ const textSizeClasses = {
2120
+ normal: "text-base",
2121
+ large: "text-lg",
2122
+ small: "text-sm"
2123
+ };
2124
+ const alignClasses = {
2125
+ left: "text-left",
2126
+ center: "text-center",
2127
+ right: "text-right"
2128
+ };
2129
+ return /* @__PURE__ */ jsx("section", { className: "py-20", children: /* @__PURE__ */ jsx("div", { className: "wrapper", children: /* @__PURE__ */ jsxs("div", { className: `${layoutClasses[data.layout]} ${alignClasses[data.text_align || "left"]}`, children: [
2130
+ data.title && /* @__PURE__ */ jsx("h4", { className: "mb-4 text-2xl font-bold text-[var(--color-text-primary)]", children: data.title }),
2131
+ /* @__PURE__ */ jsx(
2132
+ "div",
2133
+ {
2134
+ className: `text-[var(--color-text-secondary)] ${textSizeClasses[data.text_size || "normal"]} prose prose-lg mb-6 max-w-none`,
2135
+ dangerouslySetInnerHTML: { __html: data.content }
2136
+ }
2137
+ ),
2138
+ data.quote && /* @__PURE__ */ jsxs("blockquote", { className: "my-8 border-l-4 border-[var(--color-primary)] py-2 pl-6", children: [
2139
+ /* @__PURE__ */ jsxs("p", { className: "mb-2 text-xl text-[var(--color-text-primary)] italic", children: [
2140
+ '"',
2141
+ data.quote,
2142
+ '"'
2143
+ ] }),
2144
+ data.quote_author && /* @__PURE__ */ jsxs("cite", { className: "text-[var(--color-text-secondary)] not-italic", children: [
2145
+ "\u2014 ",
2146
+ data.quote_author
2147
+ ] })
2148
+ ] }),
2149
+ data.lists && data.lists.length > 0 && /* @__PURE__ */ jsx("div", { className: "my-8 space-y-8", children: data.lists.map((list, listIndex) => /* @__PURE__ */ jsxs("div", { children: [
2150
+ list.title && /* @__PURE__ */ jsx("h5", { className: "mb-3 text-lg font-semibold text-[var(--color-text-primary)]", children: list.title }),
2151
+ /* @__PURE__ */ jsx(
2152
+ "ul",
2153
+ {
2154
+ className: `space-y-2 ${list.style === "numbered" ? "list-inside list-decimal" : ""}`,
2155
+ children: list.items.map((item, itemIndex) => /* @__PURE__ */ jsxs(
2156
+ "li",
2157
+ {
2158
+ className: "flex items-start gap-2 text-[var(--color-text-secondary)]",
2159
+ children: [
2160
+ list.style === "checkmarks" && /* @__PURE__ */ jsx(
2161
+ "svg",
2162
+ {
2163
+ className: "mt-0.5 h-5 w-5 flex-shrink-0 text-[var(--color-primary)]",
2164
+ fill: "currentColor",
2165
+ viewBox: "0 0 20 20",
2166
+ children: /* @__PURE__ */ jsx(
2167
+ "path",
2168
+ {
2169
+ fillRule: "evenodd",
2170
+ d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",
2171
+ clipRule: "evenodd"
2172
+ }
2173
+ )
2174
+ }
2175
+ ),
2176
+ list.style === "bullets" && /* @__PURE__ */ jsx("span", { className: "mt-2 h-1.5 w-1.5 flex-shrink-0 rounded-full bg-[var(--color-primary)]" }),
2177
+ /* @__PURE__ */ jsx("span", { children: item })
2178
+ ]
2179
+ },
2180
+ itemIndex
2181
+ ))
2182
+ }
2183
+ )
2184
+ ] }, listIndex)) }),
2185
+ data.cta && /* @__PURE__ */ jsx("div", { className: "mt-8", children: /* @__PURE__ */ jsx(
2186
+ "a",
2187
+ {
2188
+ href: data.cta.url,
2189
+ className: `btn ${data.cta.style === "primary" ? "btn-primary" : "btn-outline"}`,
2190
+ children: data.cta.text
2191
+ }
2192
+ ) })
2193
+ ] }) }) });
2194
+ }
2195
+ function VideoSection({ data }) {
2196
+ return /* @__PURE__ */ jsxs("section", { className: "py-20", children: [
2197
+ /* @__PURE__ */ jsx("div", { className: "wrapper", children: /* @__PURE__ */ jsxs("div", { className: "mb-8 max-w-2xl", children: [
2198
+ /* @__PURE__ */ jsx("h4", { className: "mb-4 text-2xl font-bold text-[var(--color-text-primary)]", children: data.title }),
2199
+ /* @__PURE__ */ jsx(
2200
+ "p",
2201
+ {
2202
+ className: "text-lg text-[var(--color-text-secondary)]",
2203
+ dangerouslySetInnerHTML: { __html: data.content }
2204
+ }
2205
+ )
2206
+ ] }) }),
2207
+ /* @__PURE__ */ jsxs("div", { className: `relative ${data.overlay ? "has-overlay" : ""}`, children: [
2208
+ data.overlay && data.overlay_content && /* @__PURE__ */ jsx(
2209
+ "div",
2210
+ {
2211
+ className: `absolute inset-0 z-10 flex bg-black/50 items-${data.overlay_position || "center"} justify-center`,
2212
+ children: /* @__PURE__ */ jsx(
2213
+ "div",
2214
+ {
2215
+ className: "p-8 text-center text-white",
2216
+ dangerouslySetInnerHTML: { __html: data.overlay_content }
2217
+ }
2218
+ )
2219
+ }
2220
+ ),
2221
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
2222
+ /* @__PURE__ */ jsx(
2223
+ "video",
2224
+ {
2225
+ className: "w-full rounded-xl shadow-xl",
2226
+ autoPlay: data.autoplay !== false,
2227
+ muted: data.muted !== false,
2228
+ loop: data.loop !== false,
2229
+ playsInline: true,
2230
+ children: /* @__PURE__ */ jsx("source", { src: data.video, type: "video/mp4" })
2231
+ }
2232
+ ),
2233
+ data.device_frame && /* @__PURE__ */ jsx(
2234
+ "img",
2235
+ {
2236
+ src: data.device_frame,
2237
+ alt: "",
2238
+ className: "pointer-events-none absolute inset-0 h-full w-full object-contain"
2239
+ }
2240
+ )
2241
+ ] })
2242
+ ] }),
2243
+ data.caption && /* @__PURE__ */ jsx("div", { className: "wrapper", children: /* @__PURE__ */ jsx(
2244
+ "p",
2245
+ {
2246
+ className: "mt-4 text-center text-sm text-[var(--color-text-muted)]",
2247
+ dangerouslySetInnerHTML: { __html: data.caption }
2248
+ }
2249
+ ) })
2250
+ ] });
2251
+ }
2252
+
2253
+ // src/tokens/colors.ts
2254
+ var colors = {
2255
+ primary: {
2256
+ 50: "#e6f9fb",
2257
+ 100: "#b3eef3",
2258
+ 200: "#80e3eb",
2259
+ 300: "#4dd8e3",
2260
+ 400: "#26cfdc",
2261
+ DEFAULT: "#02aec2",
2262
+ 600: "#029aad",
2263
+ 700: "#017d8c",
2264
+ 800: "#01606b",
2265
+ 900: "#00434a"
2266
+ },
2267
+ accent: {
2268
+ warm: {
2269
+ DEFAULT: "#f59e0b",
2270
+ light: "#fcd34d",
2271
+ dark: "#d97706"
2272
+ },
2273
+ violet: {
2274
+ DEFAULT: "#8b5cf6",
2275
+ light: "#a78bfa",
2276
+ dark: "#7c3aed"
2277
+ },
2278
+ emerald: {
2279
+ DEFAULT: "#10b981",
2280
+ light: "#34d399",
2281
+ dark: "#059669"
2282
+ },
2283
+ rose: {
2284
+ DEFAULT: "#f43f5e",
2285
+ light: "#fb7185",
2286
+ dark: "#e11d48"
2287
+ }
2288
+ },
2289
+ dot: {
2290
+ red: "#ed3125",
2291
+ yellow: "#f8be1a",
2292
+ blue: "#0066d5",
2293
+ magenta: "#ef4467",
2294
+ purple: "#8863f3",
2295
+ turquoise: "#02afc2"
2296
+ },
2297
+ semantic: {
2298
+ success: {
2299
+ DEFAULT: "#10b981",
2300
+ light: "#d1fae5",
2301
+ dark: "#059669"
2302
+ },
2303
+ warning: {
2304
+ DEFAULT: "#f59e0b",
2305
+ light: "#fef3c7",
2306
+ dark: "#d97706"
2307
+ },
2308
+ error: {
2309
+ DEFAULT: "#ef4444",
2310
+ light: "#fee2e2",
2311
+ dark: "#dc2626"
2312
+ },
2313
+ info: {
2314
+ DEFAULT: "#3b82f6",
2315
+ light: "#dbeafe",
2316
+ dark: "#2563eb"
2317
+ }
2318
+ },
2319
+ gray: {
2320
+ 50: "#f9fafb",
2321
+ 100: "#f3f4f6",
2322
+ 200: "#e5e7eb",
2323
+ 300: "#d1d5db",
2324
+ 400: "#9ca3af",
2325
+ 500: "#6b7280",
2326
+ 600: "#4b5563",
2327
+ 700: "#374151",
2328
+ 800: "#1f2937",
2329
+ 900: "#111827",
2330
+ 950: "#030712"
2331
+ },
2332
+ white: "#ffffff",
2333
+ black: "#000000"
2334
+ };
2335
+
2336
+ // src/tokens/spacing.ts
2337
+ var spacing = {
2338
+ px: "1px",
2339
+ 0: "0",
2340
+ 0.5: "0.125rem",
2341
+ // 2px
2342
+ 1: "0.25rem",
2343
+ // 4px
2344
+ 1.5: "0.375rem",
2345
+ // 6px
2346
+ 2: "0.5rem",
2347
+ // 8px
2348
+ 2.5: "0.625rem",
2349
+ // 10px
2350
+ 3: "0.75rem",
2351
+ // 12px
2352
+ 3.5: "0.875rem",
2353
+ // 14px
2354
+ 4: "1rem",
2355
+ // 16px
2356
+ 5: "1.25rem",
2357
+ // 20px
2358
+ 6: "1.5rem",
2359
+ // 24px
2360
+ 7: "1.75rem",
2361
+ // 28px
2362
+ 8: "2rem",
2363
+ // 32px
2364
+ 9: "2.25rem",
2365
+ // 36px
2366
+ 10: "2.5rem",
2367
+ // 40px
2368
+ 11: "2.75rem",
2369
+ // 44px
2370
+ 12: "3rem",
2371
+ // 48px
2372
+ 14: "3.5rem",
2373
+ // 56px
2374
+ 16: "4rem",
2375
+ // 64px
2376
+ 20: "5rem",
2377
+ // 80px
2378
+ 24: "6rem",
2379
+ // 96px
2380
+ 28: "7rem",
2381
+ // 112px
2382
+ 32: "8rem",
2383
+ // 128px
2384
+ 36: "9rem",
2385
+ // 144px
2386
+ 40: "10rem",
2387
+ // 160px
2388
+ 44: "11rem",
2389
+ // 176px
2390
+ 48: "12rem",
2391
+ // 192px
2392
+ 52: "13rem",
2393
+ // 208px
2394
+ 56: "14rem",
2395
+ // 224px
2396
+ 60: "15rem",
2397
+ // 240px
2398
+ 64: "16rem"
2399
+ // 256px
2400
+ };
2401
+ var sectionPadding = {
2402
+ sm: "var(--section-padding-sm)",
2403
+ md: "var(--section-padding-md)",
2404
+ lg: "var(--section-padding-lg)"
2405
+ };
2406
+
2407
+ // src/tokens/animations.ts
2408
+ var durations = {
2409
+ instant: "0ms",
2410
+ fast: "100ms",
2411
+ normal: "200ms",
2412
+ moderate: "300ms",
2413
+ slow: "400ms",
2414
+ slower: "500ms",
2415
+ slowest: "700ms",
2416
+ glacial: "1000ms"
2417
+ };
2418
+ var easings = {
2419
+ linear: "linear",
2420
+ in: "cubic-bezier(0.4, 0, 1, 1)",
2421
+ out: "cubic-bezier(0, 0, 0.2, 1)",
2422
+ inOut: "cubic-bezier(0.4, 0, 0.2, 1)",
2423
+ // Expressive easings for whimsy and delight
2424
+ spring: "cubic-bezier(0.175, 0.885, 0.32, 1.275)",
2425
+ bounce: "cubic-bezier(0.68, -0.55, 0.265, 1.55)",
2426
+ smooth: "cubic-bezier(0.25, 0.1, 0.25, 1)",
2427
+ snappy: "cubic-bezier(0.2, 0, 0, 1)",
2428
+ enter: "cubic-bezier(0, 0, 0.2, 1)",
2429
+ exit: "cubic-bezier(0.4, 0, 1, 1)"
2430
+ };
2431
+
2432
+ export { BeforeAfter, CaseStudyBreakdown, CompactContactForm, ContactForm, ContentPage, FullWidthImage, ImageGrid, ImageGridModal, IndustryGrid, layout_exports as Layout, MainNav, PageHero, patterns_exports as Patterns, ProblemStatement, ProcessSteps, ProcessTimeline, RelatedProjects, ServiceSection, SolutionSummary, StatBar, TeamCredits, TeamGrid, Testimonial, TextBlock, ToastContainer as Toast, ui_exports as UI, VideoHero, VideoSection, colors, durations, easings, sectionPadding, spacing };
2433
+ //# sourceMappingURL=index.js.map
2434
+ //# sourceMappingURL=index.js.map