@prosophia/lab-classic 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -30,12 +30,53 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
+ AnimatedCard: () => AnimatedCard,
34
+ AnimatedGalleryGrid: () => AnimatedGalleryGrid,
35
+ AnimatedGalleryHeader: () => AnimatedGalleryHeader,
36
+ AnimatedGrid: () => AnimatedGrid,
37
+ AnimatedHeader: () => AnimatedHeader,
33
38
  AnimatedHero: () => AnimatedHero,
39
+ AnimatedHeroContent: () => AnimatedHeroContent,
40
+ AnimatedImage: () => AnimatedImage,
41
+ AnimatedItem: () => AnimatedItem,
42
+ AnimatedList: () => AnimatedList,
43
+ AnimatedMain: () => AnimatedMain,
44
+ AnimatedPage: () => AnimatedPage,
45
+ AnimatedSection: () => AnimatedSection,
46
+ AnimatedSectionHeader: () => AnimatedSectionHeader,
47
+ AnimatedStats: () => AnimatedStats,
34
48
  ClientLayout: () => ClientLayout,
35
49
  ContactCTA: () => ContactCTA,
36
50
  Footer: () => Footer,
37
51
  Header: () => Header,
38
- ThemeToggle: () => ThemeToggle
52
+ HomePage: () => HomePage,
53
+ ScrollRevealSection: () => ScrollRevealSection,
54
+ StaggeredGrid: () => StaggeredGrid,
55
+ ThemeToggle: () => ThemeToggle,
56
+ cardHover: () => cardHover,
57
+ client: () => client,
58
+ defineConfig: () => defineConfig,
59
+ escapeHtml: () => escapeHtml,
60
+ fadeIn: () => fadeIn,
61
+ fadeInUp: () => fadeInUp,
62
+ fadeInUpShort: () => fadeInUpShort,
63
+ getClient: () => getClient,
64
+ imageZoom: () => imageZoom,
65
+ isValidEmail: () => isValidEmail,
66
+ isValidExternalUrl: () => isValidExternalUrl,
67
+ isValidGoogleMapsEmbedUrl: () => isValidGoogleMapsEmbedUrl,
68
+ isValidSlug: () => isValidSlug,
69
+ pageTransition: () => pageTransition,
70
+ reducedMotion: () => reducedMotion,
71
+ sanitizeUrl: () => sanitizeUrl,
72
+ scaleIn: () => scaleIn,
73
+ scrollReveal: () => scrollReveal,
74
+ slideInLeft: () => slideInLeft,
75
+ slideInRight: () => slideInRight,
76
+ staggerContainer: () => staggerContainer,
77
+ staggerItem: () => staggerItem,
78
+ urlFor: () => urlFor,
79
+ viewportSettings: () => viewportSettings
39
80
  });
40
81
  module.exports = __toCommonJS(index_exports);
41
82
 
@@ -43,6 +84,16 @@ module.exports = __toCommonJS(index_exports);
43
84
  var import_framer_motion = require("framer-motion");
44
85
 
45
86
  // src/lib/animations.ts
87
+ var fadeIn = {
88
+ hidden: { opacity: 0 },
89
+ visible: {
90
+ opacity: 1,
91
+ transition: {
92
+ duration: 0.6,
93
+ ease: [0.65, 0, 0.35, 1]
94
+ }
95
+ }
96
+ };
46
97
  var fadeInUp = {
47
98
  hidden: { opacity: 0, y: 30 },
48
99
  visible: {
@@ -54,6 +105,17 @@ var fadeInUp = {
54
105
  }
55
106
  }
56
107
  };
108
+ var fadeInUpShort = {
109
+ hidden: { opacity: 0, y: 20 },
110
+ visible: {
111
+ opacity: 1,
112
+ y: 0,
113
+ transition: {
114
+ duration: 0.6,
115
+ ease: [0.4, 0, 0.2, 1]
116
+ }
117
+ }
118
+ };
57
119
  var scaleIn = {
58
120
  hidden: { opacity: 0, scale: 0.9 },
59
121
  visible: {
@@ -65,9 +127,155 @@ var scaleIn = {
65
127
  }
66
128
  }
67
129
  };
130
+ var slideInRight = {
131
+ hidden: { opacity: 0, x: 20 },
132
+ visible: {
133
+ opacity: 1,
134
+ x: 0,
135
+ transition: {
136
+ duration: 0.6,
137
+ ease: [0.4, 0, 0.2, 1]
138
+ }
139
+ }
140
+ };
141
+ var slideInLeft = {
142
+ hidden: { opacity: 0, x: -20 },
143
+ visible: {
144
+ opacity: 1,
145
+ x: 0,
146
+ transition: {
147
+ duration: 0.6,
148
+ ease: [0.4, 0, 0.2, 1]
149
+ }
150
+ }
151
+ };
152
+ var staggerContainer = {
153
+ hidden: { opacity: 0 },
154
+ visible: {
155
+ opacity: 1,
156
+ transition: {
157
+ staggerChildren: 0.1,
158
+ delayChildren: 0.2
159
+ }
160
+ }
161
+ };
162
+ var staggerItem = {
163
+ hidden: { opacity: 0, y: 20 },
164
+ visible: {
165
+ opacity: 1,
166
+ y: 0,
167
+ transition: {
168
+ duration: 0.5,
169
+ ease: [0.4, 0, 0.2, 1]
170
+ }
171
+ }
172
+ };
173
+ var cardHover = {
174
+ hover: {
175
+ y: -8,
176
+ transition: {
177
+ duration: 0.3,
178
+ ease: [0.4, 0, 0.2, 1]
179
+ }
180
+ }
181
+ };
182
+ var imageZoom = {
183
+ hover: {
184
+ scale: 1.08,
185
+ transition: {
186
+ duration: 0.5,
187
+ ease: [0.65, 0, 0.35, 1]
188
+ }
189
+ }
190
+ };
191
+ var pageTransition = {
192
+ hidden: { opacity: 0, y: 20 },
193
+ visible: {
194
+ opacity: 1,
195
+ y: 0,
196
+ transition: {
197
+ duration: 0.6,
198
+ ease: [0.4, 0, 0.2, 1]
199
+ }
200
+ },
201
+ exit: {
202
+ opacity: 0,
203
+ y: -20,
204
+ transition: {
205
+ duration: 0.4,
206
+ ease: [0.4, 0, 0.2, 1]
207
+ }
208
+ }
209
+ };
210
+ var viewportSettings = {
211
+ once: true,
212
+ amount: 0.3,
213
+ margin: "0px 0px -100px 0px"
214
+ };
215
+ var scrollReveal = {
216
+ hidden: { opacity: 0, y: 50 },
217
+ visible: {
218
+ opacity: 1,
219
+ y: 0,
220
+ transition: {
221
+ duration: 0.8,
222
+ ease: [0.65, 0, 0.35, 1]
223
+ }
224
+ }
225
+ };
226
+ var reducedMotion = {
227
+ hidden: { opacity: 0 },
228
+ visible: {
229
+ opacity: 1,
230
+ transition: {
231
+ duration: 0.01
232
+ }
233
+ }
234
+ };
68
235
 
69
236
  // src/components/AnimatedCard.tsx
70
237
  var import_jsx_runtime = require("react/jsx-runtime");
238
+ function AnimatedCard({ children, className, delay = 0 }) {
239
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
240
+ import_framer_motion.motion.div,
241
+ {
242
+ className,
243
+ initial: "hidden",
244
+ whileInView: "visible",
245
+ viewport: viewportSettings,
246
+ variants: {
247
+ hidden: { opacity: 0, y: 30 },
248
+ visible: {
249
+ opacity: 1,
250
+ y: 0,
251
+ transition: {
252
+ duration: 0.6,
253
+ delay,
254
+ ease: [0.4, 0, 0.2, 1]
255
+ }
256
+ }
257
+ },
258
+ whileHover: "hover",
259
+ children
260
+ }
261
+ );
262
+ }
263
+ function AnimatedImage({ children, className }) {
264
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_framer_motion.motion.div, { className, variants: imageZoom, children });
265
+ }
266
+ function AnimatedSection({ children, className }) {
267
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
268
+ import_framer_motion.motion.section,
269
+ {
270
+ className,
271
+ initial: "hidden",
272
+ whileInView: "visible",
273
+ viewport: viewportSettings,
274
+ variants: fadeInUpShort,
275
+ children
276
+ }
277
+ );
278
+ }
71
279
 
72
280
  // src/components/AnimatedGallery.tsx
73
281
  var import_framer_motion2 = require("framer-motion");
@@ -75,29 +283,422 @@ var import_image = __toESM(require("next/image"));
75
283
  var import_react = require("react");
76
284
  var import_PicturesPage = __toESM(require("./PicturesPage.module.css"));
77
285
  var import_jsx_runtime2 = require("react/jsx-runtime");
286
+ function useMounted() {
287
+ const [mounted, setMounted] = (0, import_react.useState)(false);
288
+ (0, import_react.useEffect)(() => {
289
+ setMounted(true);
290
+ }, []);
291
+ return mounted;
292
+ }
293
+ function AnimatedGalleryHeader({ children, className }) {
294
+ const mounted = useMounted();
295
+ if (!mounted) {
296
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("header", { className, children });
297
+ }
298
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
299
+ import_framer_motion2.motion.header,
300
+ {
301
+ className,
302
+ initial: { opacity: 0, y: 30 },
303
+ animate: { opacity: 1, y: 0 },
304
+ transition: { duration: 0.8, ease: [0.4, 0, 0.2, 1] },
305
+ children
306
+ }
307
+ );
308
+ }
309
+ function AnimatedGalleryGrid({ images }) {
310
+ const mounted = useMounted();
311
+ if (!mounted) {
312
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: import_PicturesPage.default.photosGrid, children: images.map((pic) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: import_PicturesPage.default.photoCard, children: [
313
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: import_PicturesPage.default.photoImageWrapper, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
314
+ import_image.default,
315
+ {
316
+ src: pic.imageUrl,
317
+ alt: pic.altText,
318
+ width: pic.width,
319
+ height: pic.height,
320
+ sizes: "(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw",
321
+ className: import_PicturesPage.default.photoImage
322
+ }
323
+ ) }),
324
+ pic.caption && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: import_PicturesPage.default.photoCaption, children: pic.caption })
325
+ ] }, pic._id)) });
326
+ }
327
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
328
+ import_framer_motion2.motion.div,
329
+ {
330
+ className: import_PicturesPage.default.photosGrid,
331
+ initial: "hidden",
332
+ animate: "visible",
333
+ variants: {
334
+ hidden: { opacity: 0 },
335
+ visible: {
336
+ opacity: 1,
337
+ transition: {
338
+ staggerChildren: 0.08,
339
+ delayChildren: 0.2
340
+ }
341
+ }
342
+ },
343
+ children: images.map((pic) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
344
+ import_framer_motion2.motion.div,
345
+ {
346
+ className: import_PicturesPage.default.photoCard,
347
+ variants: {
348
+ hidden: { opacity: 0, y: 40, scale: 0.95 },
349
+ visible: {
350
+ opacity: 1,
351
+ y: 0,
352
+ scale: 1,
353
+ transition: {
354
+ duration: 0.6,
355
+ ease: [0.4, 0, 0.2, 1]
356
+ }
357
+ }
358
+ },
359
+ whileHover: {
360
+ scale: 1.05,
361
+ transition: { duration: 0.3 }
362
+ },
363
+ children: [
364
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: import_PicturesPage.default.photoImageWrapper, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
365
+ import_image.default,
366
+ {
367
+ src: pic.imageUrl,
368
+ alt: pic.altText,
369
+ width: pic.width,
370
+ height: pic.height,
371
+ sizes: "(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw",
372
+ className: import_PicturesPage.default.photoImage
373
+ }
374
+ ) }),
375
+ pic.caption && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: import_PicturesPage.default.photoCaption, children: pic.caption })
376
+ ]
377
+ },
378
+ pic._id
379
+ ))
380
+ }
381
+ );
382
+ }
78
383
 
79
- // src/components/AnimatedHero.tsx
384
+ // src/components/AnimatedPage.tsx
80
385
  var import_framer_motion3 = require("framer-motion");
81
386
  var import_react2 = require("react");
387
+ var import_jsx_runtime3 = require("react/jsx-runtime");
388
+ function useMounted2() {
389
+ const [mounted, setMounted] = (0, import_react2.useState)(false);
390
+ (0, import_react2.useEffect)(() => {
391
+ setMounted(true);
392
+ }, []);
393
+ return mounted;
394
+ }
395
+ function AnimatedPage({ children, className }) {
396
+ const mounted = useMounted2();
397
+ if (!mounted) {
398
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className, children });
399
+ }
400
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
401
+ import_framer_motion3.motion.div,
402
+ {
403
+ className,
404
+ initial: { opacity: 0 },
405
+ animate: { opacity: 1 },
406
+ transition: { duration: 0.6, ease: [0.4, 0, 0.2, 1] },
407
+ children
408
+ }
409
+ );
410
+ }
411
+ function AnimatedHeader({ children, className }) {
412
+ const mounted = useMounted2();
413
+ if (!mounted) {
414
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("header", { className, children });
415
+ }
416
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
417
+ import_framer_motion3.motion.header,
418
+ {
419
+ className,
420
+ initial: { opacity: 0, y: 30 },
421
+ animate: { opacity: 1, y: 0 },
422
+ transition: { duration: 0.8, ease: [0.4, 0, 0.2, 1] },
423
+ children
424
+ }
425
+ );
426
+ }
427
+ function AnimatedMain({ children, className }) {
428
+ const mounted = useMounted2();
429
+ if (!mounted) {
430
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("main", { className, children });
431
+ }
432
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
433
+ import_framer_motion3.motion.main,
434
+ {
435
+ className,
436
+ initial: { opacity: 0, y: 20 },
437
+ animate: { opacity: 1, y: 0 },
438
+ transition: { duration: 0.6, delay: 0.2, ease: [0.4, 0, 0.2, 1] },
439
+ children
440
+ }
441
+ );
442
+ }
443
+ function StaggeredGrid({ children, className }) {
444
+ const mounted = useMounted2();
445
+ const childArray = Array.isArray(children) ? children : [children];
446
+ if (!mounted) {
447
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className, children });
448
+ }
449
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
450
+ import_framer_motion3.motion.div,
451
+ {
452
+ className,
453
+ initial: "hidden",
454
+ whileInView: "visible",
455
+ viewport: { once: true, amount: 0.1 },
456
+ variants: {
457
+ hidden: { opacity: 0 },
458
+ visible: {
459
+ opacity: 1,
460
+ transition: {
461
+ staggerChildren: 0.1,
462
+ delayChildren: 0.1
463
+ }
464
+ }
465
+ },
466
+ children: childArray.map((child, index) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
467
+ import_framer_motion3.motion.div,
468
+ {
469
+ variants: {
470
+ hidden: { opacity: 0, y: 30 },
471
+ visible: {
472
+ opacity: 1,
473
+ y: 0,
474
+ transition: {
475
+ duration: 0.6,
476
+ ease: [0.4, 0, 0.2, 1]
477
+ }
478
+ }
479
+ },
480
+ children: child
481
+ },
482
+ index
483
+ ))
484
+ }
485
+ );
486
+ }
487
+ function AnimatedItem({ children, className, delay = 0, index = 0 }) {
488
+ const mounted = useMounted2();
489
+ if (!mounted) {
490
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className, children });
491
+ }
492
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
493
+ import_framer_motion3.motion.div,
494
+ {
495
+ className,
496
+ initial: { opacity: 0, y: 30 },
497
+ whileInView: { opacity: 1, y: 0 },
498
+ viewport: { once: true, amount: 0.3 },
499
+ transition: {
500
+ duration: 0.6,
501
+ delay: delay || index * 0.1,
502
+ ease: [0.4, 0, 0.2, 1]
503
+ },
504
+ children
505
+ }
506
+ );
507
+ }
508
+ function ScrollRevealSection({ children, className }) {
509
+ const mounted = useMounted2();
510
+ if (!mounted) {
511
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("section", { className, children });
512
+ }
513
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
514
+ import_framer_motion3.motion.section,
515
+ {
516
+ className,
517
+ initial: { opacity: 0, y: 40 },
518
+ whileInView: { opacity: 1, y: 0 },
519
+ viewport: { once: true, amount: 0.2 },
520
+ transition: { duration: 0.8, ease: [0.4, 0, 0.2, 1] },
521
+ children
522
+ }
523
+ );
524
+ }
525
+ function AnimatedHeroContent({ children, className }) {
526
+ const mounted = useMounted2();
527
+ const childArray = Array.isArray(children) ? children : [children];
528
+ if (!mounted) {
529
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className, children });
530
+ }
531
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
532
+ import_framer_motion3.motion.div,
533
+ {
534
+ className,
535
+ initial: "hidden",
536
+ animate: "visible",
537
+ variants: {
538
+ hidden: { opacity: 0 },
539
+ visible: {
540
+ opacity: 1,
541
+ transition: {
542
+ staggerChildren: 0.15,
543
+ delayChildren: 0.1
544
+ }
545
+ }
546
+ },
547
+ children: childArray.map((child, index) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
548
+ import_framer_motion3.motion.div,
549
+ {
550
+ variants: {
551
+ hidden: { opacity: 0, y: 20 },
552
+ visible: {
553
+ opacity: 1,
554
+ y: 0,
555
+ transition: {
556
+ duration: 0.6,
557
+ ease: [0.4, 0, 0.2, 1]
558
+ }
559
+ }
560
+ },
561
+ children: child
562
+ },
563
+ index
564
+ ))
565
+ }
566
+ );
567
+ }
568
+
569
+ // src/components/AnimatedSections.tsx
570
+ var import_framer_motion4 = require("framer-motion");
571
+ var import_jsx_runtime4 = require("react/jsx-runtime");
572
+ function AnimatedGrid({ children, className }) {
573
+ const childArray = Array.isArray(children) ? children : [children];
574
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
575
+ import_framer_motion4.motion.div,
576
+ {
577
+ className,
578
+ initial: "hidden",
579
+ whileInView: "visible",
580
+ viewport: viewportSettings,
581
+ variants: staggerContainer,
582
+ children: childArray.map((child, index) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_framer_motion4.motion.div, { variants: staggerItem, children: child }, index))
583
+ }
584
+ );
585
+ }
586
+ function AnimatedStats({ children, className }) {
587
+ const childArray = Array.isArray(children) ? children : [children];
588
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
589
+ import_framer_motion4.motion.div,
590
+ {
591
+ className,
592
+ initial: "hidden",
593
+ whileInView: "visible",
594
+ viewport: { once: true, amount: 0.3 },
595
+ variants: {
596
+ hidden: { opacity: 0 },
597
+ visible: {
598
+ opacity: 1,
599
+ transition: {
600
+ staggerChildren: 0.15,
601
+ delayChildren: 0.1
602
+ }
603
+ }
604
+ },
605
+ children: childArray.map((child, index) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
606
+ import_framer_motion4.motion.div,
607
+ {
608
+ variants: {
609
+ hidden: { opacity: 0, scale: 0.8 },
610
+ visible: {
611
+ opacity: 1,
612
+ scale: 1,
613
+ transition: {
614
+ duration: 0.5,
615
+ ease: [0.4, 0, 0.2, 1]
616
+ }
617
+ }
618
+ },
619
+ children: child
620
+ },
621
+ index
622
+ ))
623
+ }
624
+ );
625
+ }
626
+ function AnimatedSectionHeader({ children, className }) {
627
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
628
+ import_framer_motion4.motion.header,
629
+ {
630
+ className,
631
+ initial: "hidden",
632
+ whileInView: "visible",
633
+ viewport: viewportSettings,
634
+ variants: fadeInUpShort,
635
+ children
636
+ }
637
+ );
638
+ }
639
+ function AnimatedList({ children, className }) {
640
+ const childArray = Array.isArray(children) ? children : [children];
641
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
642
+ import_framer_motion4.motion.div,
643
+ {
644
+ className,
645
+ initial: "hidden",
646
+ whileInView: "visible",
647
+ viewport: viewportSettings,
648
+ variants: {
649
+ hidden: { opacity: 0 },
650
+ visible: {
651
+ opacity: 1,
652
+ transition: {
653
+ staggerChildren: 0.08,
654
+ delayChildren: 0.1
655
+ }
656
+ }
657
+ },
658
+ children: childArray.map((child, index) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
659
+ import_framer_motion4.motion.div,
660
+ {
661
+ variants: {
662
+ hidden: { opacity: 0, x: -20 },
663
+ visible: {
664
+ opacity: 1,
665
+ x: 0,
666
+ transition: {
667
+ duration: 0.5,
668
+ ease: [0.4, 0, 0.2, 1]
669
+ }
670
+ }
671
+ },
672
+ children: child
673
+ },
674
+ index
675
+ ))
676
+ }
677
+ );
678
+ }
679
+
680
+ // src/components/AnimatedHero.tsx
681
+ var import_framer_motion5 = require("framer-motion");
682
+ var import_react3 = require("react");
82
683
  var import_image2 = __toESM(require("next/image"));
83
684
  var import_link = __toESM(require("next/link"));
84
685
  var import_HomePage = __toESM(require("./HomePage.module.css"));
85
- var import_jsx_runtime3 = require("react/jsx-runtime");
686
+ var import_jsx_runtime5 = require("react/jsx-runtime");
86
687
  function AnimatedHero({ heroData, ArrowRightIcon }) {
87
- const ref = (0, import_react2.useRef)(null);
88
- const { scrollY } = (0, import_framer_motion3.useScroll)();
89
- const y = (0, import_framer_motion3.useTransform)(scrollY, [0, 500], [0, 150]);
90
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("section", { className: import_HomePage.default.heroSection, ref, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_HomePage.default.heroContainer, children: [
91
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
92
- import_framer_motion3.motion.div,
688
+ const ref = (0, import_react3.useRef)(null);
689
+ const { scrollY } = (0, import_framer_motion5.useScroll)();
690
+ const y = (0, import_framer_motion5.useTransform)(scrollY, [0, 500], [0, 150]);
691
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("section", { className: import_HomePage.default.heroSection, ref, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: import_HomePage.default.heroContainer, children: [
692
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
693
+ import_framer_motion5.motion.div,
93
694
  {
94
695
  className: import_HomePage.default.heroContent,
95
696
  initial: "hidden",
96
697
  animate: "visible",
97
698
  variants: fadeInUp,
98
699
  children: [
99
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
100
- import_framer_motion3.motion.span,
700
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
701
+ import_framer_motion5.motion.span,
101
702
  {
102
703
  className: import_HomePage.default.heroTagline,
103
704
  initial: { opacity: 0 },
@@ -106,8 +707,8 @@ function AnimatedHero({ heroData, ArrowRightIcon }) {
106
707
  children: heroData.tagline
107
708
  }
108
709
  ),
109
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
110
- import_framer_motion3.motion.h1,
710
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
711
+ import_framer_motion5.motion.h1,
111
712
  {
112
713
  className: import_HomePage.default.heroHeading,
113
714
  initial: { opacity: 0, y: 20 },
@@ -116,12 +717,12 @@ function AnimatedHero({ heroData, ArrowRightIcon }) {
116
717
  children: [
117
718
  heroData.heading,
118
719
  " ",
119
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: import_HomePage.default.heroHeadingAccent, children: heroData.headingAccent })
720
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: import_HomePage.default.heroHeadingAccent, children: heroData.headingAccent })
120
721
  ]
121
722
  }
122
723
  ),
123
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
124
- import_framer_motion3.motion.p,
724
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
725
+ import_framer_motion5.motion.p,
125
726
  {
126
727
  className: import_HomePage.default.heroDescription,
127
728
  initial: { opacity: 0, y: 20 },
@@ -130,27 +731,27 @@ function AnimatedHero({ heroData, ArrowRightIcon }) {
130
731
  children: heroData.description
131
732
  }
132
733
  ),
133
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
134
- import_framer_motion3.motion.div,
734
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
735
+ import_framer_motion5.motion.div,
135
736
  {
136
737
  className: import_HomePage.default.heroCtas,
137
738
  initial: { opacity: 0, y: 20 },
138
739
  animate: { opacity: 1, y: 0 },
139
740
  transition: { duration: 0.8, delay: 0.5 },
140
741
  children: [
141
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_link.default, { href: heroData.ctaLink, className: import_HomePage.default.heroPrimaryCta, children: [
742
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_link.default, { href: heroData.ctaLink, className: import_HomePage.default.heroPrimaryCta, children: [
142
743
  heroData.ctaText,
143
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ArrowRightIcon, {})
744
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ArrowRightIcon, {})
144
745
  ] }),
145
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link.default, { href: "/publications", className: import_HomePage.default.heroSecondaryCta, children: "View Publications" })
746
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_link.default, { href: "/publications", className: import_HomePage.default.heroSecondaryCta, children: "View Publications" })
146
747
  ]
147
748
  }
148
749
  )
149
750
  ]
150
751
  }
151
752
  ),
152
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
153
- import_framer_motion3.motion.div,
753
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
754
+ import_framer_motion5.motion.div,
154
755
  {
155
756
  className: import_HomePage.default.heroImageWrapper,
156
757
  style: { y },
@@ -158,8 +759,8 @@ function AnimatedHero({ heroData, ArrowRightIcon }) {
158
759
  animate: "visible",
159
760
  variants: scaleIn,
160
761
  transition: { duration: 0.8, delay: 0.6 },
161
- children: heroData.image ? /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
162
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
762
+ children: heroData.image ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
763
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
163
764
  import_image2.default,
164
765
  {
165
766
  src: heroData.image,
@@ -170,8 +771,8 @@ function AnimatedHero({ heroData, ArrowRightIcon }) {
170
771
  priority: true
171
772
  }
172
773
  ),
173
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: import_HomePage.default.heroImageOverlay })
174
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: import_HomePage.default.heroImagePlaceholder, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
774
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: import_HomePage.default.heroImageOverlay })
775
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: import_HomePage.default.heroImagePlaceholder, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
175
776
  "svg",
176
777
  {
177
778
  width: "120",
@@ -181,9 +782,9 @@ function AnimatedHero({ heroData, ArrowRightIcon }) {
181
782
  stroke: "currentColor",
182
783
  strokeWidth: "1",
183
784
  children: [
184
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", ry: "2" }),
185
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("circle", { cx: "8.5", cy: "8.5", r: "1.5" }),
186
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M21 15l-5-5L5 21" })
785
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", ry: "2" }),
786
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("circle", { cx: "8.5", cy: "8.5", r: "1.5" }),
787
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("path", { d: "M21 15l-5-5L5 21" })
187
788
  ]
188
789
  }
189
790
  ) })
@@ -192,15 +793,6 @@ function AnimatedHero({ heroData, ArrowRightIcon }) {
192
793
  ] }) });
193
794
  }
194
795
 
195
- // src/components/AnimatedPage.tsx
196
- var import_framer_motion4 = require("framer-motion");
197
- var import_react3 = require("react");
198
- var import_jsx_runtime4 = require("react/jsx-runtime");
199
-
200
- // src/components/AnimatedSections.tsx
201
- var import_framer_motion5 = require("framer-motion");
202
- var import_jsx_runtime5 = require("react/jsx-runtime");
203
-
204
796
  // src/components/ClientLayout.tsx
205
797
  var import_react6 = require("react");
206
798
  var import_next_themes2 = require("next-themes");
@@ -455,6 +1047,46 @@ function isValidExternalUrl(url) {
455
1047
  return false;
456
1048
  }
457
1049
  }
1050
+ function isValidGoogleMapsEmbedUrl(url) {
1051
+ if (!url || typeof url !== "string") return false;
1052
+ try {
1053
+ const parsed = new URL(url);
1054
+ const allowedHosts = [
1055
+ "www.google.com",
1056
+ "google.com",
1057
+ "maps.google.com"
1058
+ ];
1059
+ return parsed.protocol === "https:" && allowedHosts.includes(parsed.hostname) && parsed.pathname.startsWith("/maps/embed");
1060
+ } catch {
1061
+ return false;
1062
+ }
1063
+ }
1064
+ function sanitizeUrl(url) {
1065
+ if (isValidExternalUrl(url)) {
1066
+ return url;
1067
+ }
1068
+ return void 0;
1069
+ }
1070
+ function isValidEmail(email) {
1071
+ if (!email || typeof email !== "string") return false;
1072
+ const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
1073
+ return emailPattern.test(email) && email.length <= 254;
1074
+ }
1075
+ function escapeHtml(text) {
1076
+ const htmlEntities = {
1077
+ "&": "&amp;",
1078
+ "<": "&lt;",
1079
+ ">": "&gt;",
1080
+ '"': "&quot;",
1081
+ "'": "&#39;"
1082
+ };
1083
+ return text.replace(/[&<>"']/g, (char) => htmlEntities[char]);
1084
+ }
1085
+ function isValidSlug(slug) {
1086
+ if (!slug || typeof slug !== "string") return false;
1087
+ const slugPattern = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
1088
+ return slugPattern.test(slug) && slug.length <= 200;
1089
+ }
458
1090
 
459
1091
  // src/components/Footer.tsx
460
1092
  var import_jsx_runtime8 = require("react/jsx-runtime");
@@ -545,12 +1177,120 @@ function ContactCTA() {
545
1177
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_link4.default, { href: "/contact", className: import_ContactCTA.default.ctaButton, children: "Contact Us" })
546
1178
  ] }) });
547
1179
  }
1180
+
1181
+ // src/components/HomePage.tsx
1182
+ var import_jsx_runtime11 = require("react/jsx-runtime");
1183
+ function HomePage({
1184
+ children,
1185
+ settings = null,
1186
+ header,
1187
+ footer
1188
+ }) {
1189
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [
1190
+ header ?? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Header, { settings: settings || {} }),
1191
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("main", { children }),
1192
+ footer ?? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Footer, { settings: settings || {} })
1193
+ ] });
1194
+ }
1195
+
1196
+ // src/config.ts
1197
+ function defineConfig(config) {
1198
+ return config;
1199
+ }
1200
+
1201
+ // src/lib/sanity.ts
1202
+ var import_next_sanity = require("next-sanity");
1203
+ var import_image_url = __toESM(require("@sanity/image-url"));
1204
+ var projectId = process.env.NEXT_PUBLIC_SANITY_PROJECT_ID;
1205
+ var dataset = process.env.NEXT_PUBLIC_SANITY_DATASET || "production";
1206
+ var apiVersion = "2023-05-03";
1207
+ var _client = null;
1208
+ function getClient() {
1209
+ if (!_client) {
1210
+ if (!projectId) {
1211
+ throw new Error(
1212
+ "Sanity Project ID is not defined. Please set NEXT_PUBLIC_SANITY_PROJECT_ID in your environment."
1213
+ );
1214
+ }
1215
+ _client = (0, import_next_sanity.createClient)({
1216
+ projectId,
1217
+ dataset,
1218
+ apiVersion,
1219
+ useCdn: process.env.NODE_ENV === "production"
1220
+ });
1221
+ }
1222
+ return _client;
1223
+ }
1224
+ var client = {
1225
+ get projectId() {
1226
+ return projectId;
1227
+ },
1228
+ get dataset() {
1229
+ return dataset;
1230
+ },
1231
+ fetch: (...args) => getClient().fetch(...args)
1232
+ };
1233
+ var _builder = null;
1234
+ function urlFor(source) {
1235
+ if (!_builder) {
1236
+ if (!projectId) {
1237
+ return {
1238
+ width: () => ({ height: () => ({ url: () => "" }), url: () => "" }),
1239
+ height: () => ({ width: () => ({ url: () => "" }), url: () => "" }),
1240
+ url: () => ""
1241
+ };
1242
+ }
1243
+ _builder = (0, import_image_url.default)({ projectId, dataset });
1244
+ }
1245
+ return _builder.image(source);
1246
+ }
548
1247
  // Annotate the CommonJS export names for ESM import in node:
549
1248
  0 && (module.exports = {
1249
+ AnimatedCard,
1250
+ AnimatedGalleryGrid,
1251
+ AnimatedGalleryHeader,
1252
+ AnimatedGrid,
1253
+ AnimatedHeader,
550
1254
  AnimatedHero,
1255
+ AnimatedHeroContent,
1256
+ AnimatedImage,
1257
+ AnimatedItem,
1258
+ AnimatedList,
1259
+ AnimatedMain,
1260
+ AnimatedPage,
1261
+ AnimatedSection,
1262
+ AnimatedSectionHeader,
1263
+ AnimatedStats,
551
1264
  ClientLayout,
552
1265
  ContactCTA,
553
1266
  Footer,
554
1267
  Header,
555
- ThemeToggle
1268
+ HomePage,
1269
+ ScrollRevealSection,
1270
+ StaggeredGrid,
1271
+ ThemeToggle,
1272
+ cardHover,
1273
+ client,
1274
+ defineConfig,
1275
+ escapeHtml,
1276
+ fadeIn,
1277
+ fadeInUp,
1278
+ fadeInUpShort,
1279
+ getClient,
1280
+ imageZoom,
1281
+ isValidEmail,
1282
+ isValidExternalUrl,
1283
+ isValidGoogleMapsEmbedUrl,
1284
+ isValidSlug,
1285
+ pageTransition,
1286
+ reducedMotion,
1287
+ sanitizeUrl,
1288
+ scaleIn,
1289
+ scrollReveal,
1290
+ slideInLeft,
1291
+ slideInRight,
1292
+ staggerContainer,
1293
+ staggerItem,
1294
+ urlFor,
1295
+ viewportSettings
556
1296
  });