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