@prosophia/lab-classic 0.0.3 → 0.0.4

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.mjs CHANGED
@@ -2,6 +2,16 @@
2
2
  import { motion } from "framer-motion";
3
3
 
4
4
  // src/lib/animations.ts
5
+ var fadeIn = {
6
+ hidden: { opacity: 0 },
7
+ visible: {
8
+ opacity: 1,
9
+ transition: {
10
+ duration: 0.6,
11
+ ease: [0.65, 0, 0.35, 1]
12
+ }
13
+ }
14
+ };
5
15
  var fadeInUp = {
6
16
  hidden: { opacity: 0, y: 30 },
7
17
  visible: {
@@ -13,6 +23,17 @@ var fadeInUp = {
13
23
  }
14
24
  }
15
25
  };
26
+ var fadeInUpShort = {
27
+ hidden: { opacity: 0, y: 20 },
28
+ visible: {
29
+ opacity: 1,
30
+ y: 0,
31
+ transition: {
32
+ duration: 0.6,
33
+ ease: [0.4, 0, 0.2, 1]
34
+ }
35
+ }
36
+ };
16
37
  var scaleIn = {
17
38
  hidden: { opacity: 0, scale: 0.9 },
18
39
  visible: {
@@ -24,41 +45,588 @@ var scaleIn = {
24
45
  }
25
46
  }
26
47
  };
48
+ var slideInRight = {
49
+ hidden: { opacity: 0, x: 20 },
50
+ visible: {
51
+ opacity: 1,
52
+ x: 0,
53
+ transition: {
54
+ duration: 0.6,
55
+ ease: [0.4, 0, 0.2, 1]
56
+ }
57
+ }
58
+ };
59
+ var slideInLeft = {
60
+ hidden: { opacity: 0, x: -20 },
61
+ visible: {
62
+ opacity: 1,
63
+ x: 0,
64
+ transition: {
65
+ duration: 0.6,
66
+ ease: [0.4, 0, 0.2, 1]
67
+ }
68
+ }
69
+ };
70
+ var staggerContainer = {
71
+ hidden: { opacity: 0 },
72
+ visible: {
73
+ opacity: 1,
74
+ transition: {
75
+ staggerChildren: 0.1,
76
+ delayChildren: 0.2
77
+ }
78
+ }
79
+ };
80
+ var staggerItem = {
81
+ hidden: { opacity: 0, y: 20 },
82
+ visible: {
83
+ opacity: 1,
84
+ y: 0,
85
+ transition: {
86
+ duration: 0.5,
87
+ ease: [0.4, 0, 0.2, 1]
88
+ }
89
+ }
90
+ };
91
+ var cardHover = {
92
+ hover: {
93
+ y: -8,
94
+ transition: {
95
+ duration: 0.3,
96
+ ease: [0.4, 0, 0.2, 1]
97
+ }
98
+ }
99
+ };
100
+ var imageZoom = {
101
+ hover: {
102
+ scale: 1.08,
103
+ transition: {
104
+ duration: 0.5,
105
+ ease: [0.65, 0, 0.35, 1]
106
+ }
107
+ }
108
+ };
109
+ var pageTransition = {
110
+ hidden: { opacity: 0, y: 20 },
111
+ visible: {
112
+ opacity: 1,
113
+ y: 0,
114
+ transition: {
115
+ duration: 0.6,
116
+ ease: [0.4, 0, 0.2, 1]
117
+ }
118
+ },
119
+ exit: {
120
+ opacity: 0,
121
+ y: -20,
122
+ transition: {
123
+ duration: 0.4,
124
+ ease: [0.4, 0, 0.2, 1]
125
+ }
126
+ }
127
+ };
128
+ var viewportSettings = {
129
+ once: true,
130
+ amount: 0.3,
131
+ margin: "0px 0px -100px 0px"
132
+ };
133
+ var scrollReveal = {
134
+ hidden: { opacity: 0, y: 50 },
135
+ visible: {
136
+ opacity: 1,
137
+ y: 0,
138
+ transition: {
139
+ duration: 0.8,
140
+ ease: [0.65, 0, 0.35, 1]
141
+ }
142
+ }
143
+ };
144
+ var reducedMotion = {
145
+ hidden: { opacity: 0 },
146
+ visible: {
147
+ opacity: 1,
148
+ transition: {
149
+ duration: 0.01
150
+ }
151
+ }
152
+ };
27
153
 
28
154
  // src/components/AnimatedCard.tsx
29
155
  import { jsx } from "react/jsx-runtime";
156
+ function AnimatedCard({ children, className, delay = 0 }) {
157
+ return /* @__PURE__ */ jsx(
158
+ motion.div,
159
+ {
160
+ className,
161
+ initial: "hidden",
162
+ whileInView: "visible",
163
+ viewport: viewportSettings,
164
+ variants: {
165
+ hidden: { opacity: 0, y: 30 },
166
+ visible: {
167
+ opacity: 1,
168
+ y: 0,
169
+ transition: {
170
+ duration: 0.6,
171
+ delay,
172
+ ease: [0.4, 0, 0.2, 1]
173
+ }
174
+ }
175
+ },
176
+ whileHover: "hover",
177
+ children
178
+ }
179
+ );
180
+ }
181
+ function AnimatedImage({ children, className }) {
182
+ return /* @__PURE__ */ jsx(motion.div, { className, variants: imageZoom, children });
183
+ }
184
+ function AnimatedSection({ children, className }) {
185
+ return /* @__PURE__ */ jsx(
186
+ motion.section,
187
+ {
188
+ className,
189
+ initial: "hidden",
190
+ whileInView: "visible",
191
+ viewport: viewportSettings,
192
+ variants: fadeInUpShort,
193
+ children
194
+ }
195
+ );
196
+ }
30
197
 
31
198
  // src/components/AnimatedGallery.tsx
32
199
  import { motion as motion2 } from "framer-motion";
33
200
  import Image from "next/image";
34
201
  import { useState, useEffect } from "react";
35
- import styles from "./PicturesPage.module.css";
202
+
203
+ // src/components/PicturesPage.module.css
204
+ var PicturesPage_default = {};
205
+
206
+ // src/components/AnimatedGallery.tsx
36
207
  import { jsx as jsx2, jsxs } from "react/jsx-runtime";
208
+ function useMounted() {
209
+ const [mounted, setMounted] = useState(false);
210
+ useEffect(() => {
211
+ setMounted(true);
212
+ }, []);
213
+ return mounted;
214
+ }
215
+ function AnimatedGalleryHeader({ children, className }) {
216
+ const mounted = useMounted();
217
+ if (!mounted) {
218
+ return /* @__PURE__ */ jsx2("header", { className, children });
219
+ }
220
+ return /* @__PURE__ */ jsx2(
221
+ motion2.header,
222
+ {
223
+ className,
224
+ initial: { opacity: 0, y: 30 },
225
+ animate: { opacity: 1, y: 0 },
226
+ transition: { duration: 0.8, ease: [0.4, 0, 0.2, 1] },
227
+ children
228
+ }
229
+ );
230
+ }
231
+ function AnimatedGalleryGrid({ images }) {
232
+ const mounted = useMounted();
233
+ if (!mounted) {
234
+ return /* @__PURE__ */ jsx2("div", { className: PicturesPage_default.photosGrid, children: images.map((pic) => /* @__PURE__ */ jsxs("div", { className: PicturesPage_default.photoCard, children: [
235
+ /* @__PURE__ */ jsx2("div", { className: PicturesPage_default.photoImageWrapper, children: /* @__PURE__ */ jsx2(
236
+ Image,
237
+ {
238
+ src: pic.imageUrl,
239
+ alt: pic.altText,
240
+ width: pic.width,
241
+ height: pic.height,
242
+ sizes: "(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw",
243
+ className: PicturesPage_default.photoImage
244
+ }
245
+ ) }),
246
+ pic.caption && /* @__PURE__ */ jsx2("p", { className: PicturesPage_default.photoCaption, children: pic.caption })
247
+ ] }, pic._id)) });
248
+ }
249
+ return /* @__PURE__ */ jsx2(
250
+ motion2.div,
251
+ {
252
+ className: PicturesPage_default.photosGrid,
253
+ initial: "hidden",
254
+ animate: "visible",
255
+ variants: {
256
+ hidden: { opacity: 0 },
257
+ visible: {
258
+ opacity: 1,
259
+ transition: {
260
+ staggerChildren: 0.08,
261
+ delayChildren: 0.2
262
+ }
263
+ }
264
+ },
265
+ children: images.map((pic) => /* @__PURE__ */ jsxs(
266
+ motion2.div,
267
+ {
268
+ className: PicturesPage_default.photoCard,
269
+ variants: {
270
+ hidden: { opacity: 0, y: 40, scale: 0.95 },
271
+ visible: {
272
+ opacity: 1,
273
+ y: 0,
274
+ scale: 1,
275
+ transition: {
276
+ duration: 0.6,
277
+ ease: [0.4, 0, 0.2, 1]
278
+ }
279
+ }
280
+ },
281
+ whileHover: {
282
+ scale: 1.05,
283
+ transition: { duration: 0.3 }
284
+ },
285
+ children: [
286
+ /* @__PURE__ */ jsx2("div", { className: PicturesPage_default.photoImageWrapper, children: /* @__PURE__ */ jsx2(
287
+ Image,
288
+ {
289
+ src: pic.imageUrl,
290
+ alt: pic.altText,
291
+ width: pic.width,
292
+ height: pic.height,
293
+ sizes: "(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw",
294
+ className: PicturesPage_default.photoImage
295
+ }
296
+ ) }),
297
+ pic.caption && /* @__PURE__ */ jsx2("p", { className: PicturesPage_default.photoCaption, children: pic.caption })
298
+ ]
299
+ },
300
+ pic._id
301
+ ))
302
+ }
303
+ );
304
+ }
305
+
306
+ // src/components/AnimatedPage.tsx
307
+ import { motion as motion3 } from "framer-motion";
308
+ import { useState as useState2, useEffect as useEffect2 } from "react";
309
+ import { jsx as jsx3 } from "react/jsx-runtime";
310
+ function useMounted2() {
311
+ const [mounted, setMounted] = useState2(false);
312
+ useEffect2(() => {
313
+ setMounted(true);
314
+ }, []);
315
+ return mounted;
316
+ }
317
+ function AnimatedPage({ children, className }) {
318
+ const mounted = useMounted2();
319
+ if (!mounted) {
320
+ return /* @__PURE__ */ jsx3("div", { className, children });
321
+ }
322
+ return /* @__PURE__ */ jsx3(
323
+ motion3.div,
324
+ {
325
+ className,
326
+ initial: { opacity: 0 },
327
+ animate: { opacity: 1 },
328
+ transition: { duration: 0.6, ease: [0.4, 0, 0.2, 1] },
329
+ children
330
+ }
331
+ );
332
+ }
333
+ function AnimatedHeader({ children, className }) {
334
+ const mounted = useMounted2();
335
+ if (!mounted) {
336
+ return /* @__PURE__ */ jsx3("header", { className, children });
337
+ }
338
+ return /* @__PURE__ */ jsx3(
339
+ motion3.header,
340
+ {
341
+ className,
342
+ initial: { opacity: 0, y: 30 },
343
+ animate: { opacity: 1, y: 0 },
344
+ transition: { duration: 0.8, ease: [0.4, 0, 0.2, 1] },
345
+ children
346
+ }
347
+ );
348
+ }
349
+ function AnimatedMain({ children, className }) {
350
+ const mounted = useMounted2();
351
+ if (!mounted) {
352
+ return /* @__PURE__ */ jsx3("main", { className, children });
353
+ }
354
+ return /* @__PURE__ */ jsx3(
355
+ motion3.main,
356
+ {
357
+ className,
358
+ initial: { opacity: 0, y: 20 },
359
+ animate: { opacity: 1, y: 0 },
360
+ transition: { duration: 0.6, delay: 0.2, ease: [0.4, 0, 0.2, 1] },
361
+ children
362
+ }
363
+ );
364
+ }
365
+ function StaggeredGrid({ children, className }) {
366
+ const mounted = useMounted2();
367
+ const childArray = Array.isArray(children) ? children : [children];
368
+ if (!mounted) {
369
+ return /* @__PURE__ */ jsx3("div", { className, children });
370
+ }
371
+ return /* @__PURE__ */ jsx3(
372
+ motion3.div,
373
+ {
374
+ className,
375
+ initial: "hidden",
376
+ whileInView: "visible",
377
+ viewport: { once: true, amount: 0.1 },
378
+ variants: {
379
+ hidden: { opacity: 0 },
380
+ visible: {
381
+ opacity: 1,
382
+ transition: {
383
+ staggerChildren: 0.1,
384
+ delayChildren: 0.1
385
+ }
386
+ }
387
+ },
388
+ children: childArray.map((child, index) => /* @__PURE__ */ jsx3(
389
+ motion3.div,
390
+ {
391
+ variants: {
392
+ hidden: { opacity: 0, y: 30 },
393
+ visible: {
394
+ opacity: 1,
395
+ y: 0,
396
+ transition: {
397
+ duration: 0.6,
398
+ ease: [0.4, 0, 0.2, 1]
399
+ }
400
+ }
401
+ },
402
+ children: child
403
+ },
404
+ index
405
+ ))
406
+ }
407
+ );
408
+ }
409
+ function AnimatedItem({ children, className, delay = 0, index = 0 }) {
410
+ const mounted = useMounted2();
411
+ if (!mounted) {
412
+ return /* @__PURE__ */ jsx3("div", { className, children });
413
+ }
414
+ return /* @__PURE__ */ jsx3(
415
+ motion3.div,
416
+ {
417
+ className,
418
+ initial: { opacity: 0, y: 30 },
419
+ whileInView: { opacity: 1, y: 0 },
420
+ viewport: { once: true, amount: 0.3 },
421
+ transition: {
422
+ duration: 0.6,
423
+ delay: delay || index * 0.1,
424
+ ease: [0.4, 0, 0.2, 1]
425
+ },
426
+ children
427
+ }
428
+ );
429
+ }
430
+ function ScrollRevealSection({ children, className }) {
431
+ const mounted = useMounted2();
432
+ if (!mounted) {
433
+ return /* @__PURE__ */ jsx3("section", { className, children });
434
+ }
435
+ return /* @__PURE__ */ jsx3(
436
+ motion3.section,
437
+ {
438
+ className,
439
+ initial: { opacity: 0, y: 40 },
440
+ whileInView: { opacity: 1, y: 0 },
441
+ viewport: { once: true, amount: 0.2 },
442
+ transition: { duration: 0.8, ease: [0.4, 0, 0.2, 1] },
443
+ children
444
+ }
445
+ );
446
+ }
447
+ function AnimatedHeroContent({ children, className }) {
448
+ const mounted = useMounted2();
449
+ const childArray = Array.isArray(children) ? children : [children];
450
+ if (!mounted) {
451
+ return /* @__PURE__ */ jsx3("div", { className, children });
452
+ }
453
+ return /* @__PURE__ */ jsx3(
454
+ motion3.div,
455
+ {
456
+ className,
457
+ initial: "hidden",
458
+ animate: "visible",
459
+ variants: {
460
+ hidden: { opacity: 0 },
461
+ visible: {
462
+ opacity: 1,
463
+ transition: {
464
+ staggerChildren: 0.15,
465
+ delayChildren: 0.1
466
+ }
467
+ }
468
+ },
469
+ children: childArray.map((child, index) => /* @__PURE__ */ jsx3(
470
+ motion3.div,
471
+ {
472
+ variants: {
473
+ hidden: { opacity: 0, y: 20 },
474
+ visible: {
475
+ opacity: 1,
476
+ y: 0,
477
+ transition: {
478
+ duration: 0.6,
479
+ ease: [0.4, 0, 0.2, 1]
480
+ }
481
+ }
482
+ },
483
+ children: child
484
+ },
485
+ index
486
+ ))
487
+ }
488
+ );
489
+ }
490
+
491
+ // src/components/AnimatedSections.tsx
492
+ import { motion as motion4 } from "framer-motion";
493
+ import { jsx as jsx4 } from "react/jsx-runtime";
494
+ function AnimatedGrid({ children, className }) {
495
+ const childArray = Array.isArray(children) ? children : [children];
496
+ return /* @__PURE__ */ jsx4(
497
+ motion4.div,
498
+ {
499
+ className,
500
+ initial: "hidden",
501
+ whileInView: "visible",
502
+ viewport: viewportSettings,
503
+ variants: staggerContainer,
504
+ children: childArray.map((child, index) => /* @__PURE__ */ jsx4(motion4.div, { variants: staggerItem, children: child }, index))
505
+ }
506
+ );
507
+ }
508
+ function AnimatedStats({ children, className }) {
509
+ const childArray = Array.isArray(children) ? children : [children];
510
+ return /* @__PURE__ */ jsx4(
511
+ motion4.div,
512
+ {
513
+ className,
514
+ initial: "hidden",
515
+ whileInView: "visible",
516
+ viewport: { once: true, amount: 0.3 },
517
+ variants: {
518
+ hidden: { opacity: 0 },
519
+ visible: {
520
+ opacity: 1,
521
+ transition: {
522
+ staggerChildren: 0.15,
523
+ delayChildren: 0.1
524
+ }
525
+ }
526
+ },
527
+ children: childArray.map((child, index) => /* @__PURE__ */ jsx4(
528
+ motion4.div,
529
+ {
530
+ variants: {
531
+ hidden: { opacity: 0, scale: 0.8 },
532
+ visible: {
533
+ opacity: 1,
534
+ scale: 1,
535
+ transition: {
536
+ duration: 0.5,
537
+ ease: [0.4, 0, 0.2, 1]
538
+ }
539
+ }
540
+ },
541
+ children: child
542
+ },
543
+ index
544
+ ))
545
+ }
546
+ );
547
+ }
548
+ function AnimatedSectionHeader({ children, className }) {
549
+ return /* @__PURE__ */ jsx4(
550
+ motion4.header,
551
+ {
552
+ className,
553
+ initial: "hidden",
554
+ whileInView: "visible",
555
+ viewport: viewportSettings,
556
+ variants: fadeInUpShort,
557
+ children
558
+ }
559
+ );
560
+ }
561
+ function AnimatedList({ children, className }) {
562
+ const childArray = Array.isArray(children) ? children : [children];
563
+ return /* @__PURE__ */ jsx4(
564
+ motion4.div,
565
+ {
566
+ className,
567
+ initial: "hidden",
568
+ whileInView: "visible",
569
+ viewport: viewportSettings,
570
+ variants: {
571
+ hidden: { opacity: 0 },
572
+ visible: {
573
+ opacity: 1,
574
+ transition: {
575
+ staggerChildren: 0.08,
576
+ delayChildren: 0.1
577
+ }
578
+ }
579
+ },
580
+ children: childArray.map((child, index) => /* @__PURE__ */ jsx4(
581
+ motion4.div,
582
+ {
583
+ variants: {
584
+ hidden: { opacity: 0, x: -20 },
585
+ visible: {
586
+ opacity: 1,
587
+ x: 0,
588
+ transition: {
589
+ duration: 0.5,
590
+ ease: [0.4, 0, 0.2, 1]
591
+ }
592
+ }
593
+ },
594
+ children: child
595
+ },
596
+ index
597
+ ))
598
+ }
599
+ );
600
+ }
37
601
 
38
602
  // src/components/AnimatedHero.tsx
39
- import { motion as motion3, useScroll, useTransform } from "framer-motion";
603
+ import { motion as motion5, useScroll, useTransform } from "framer-motion";
40
604
  import { useRef } from "react";
41
605
  import Image2 from "next/image";
42
606
  import Link from "next/link";
43
- import styles2 from "./HomePage.module.css";
44
- import { Fragment, jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
607
+
608
+ // src/components/HomePage.module.css
609
+ var HomePage_default = {};
610
+
611
+ // src/components/AnimatedHero.tsx
612
+ import { Fragment, jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
45
613
  function AnimatedHero({ heroData, ArrowRightIcon }) {
46
614
  const ref = useRef(null);
47
615
  const { scrollY } = useScroll();
48
616
  const y = useTransform(scrollY, [0, 500], [0, 150]);
49
- return /* @__PURE__ */ jsx3("section", { className: styles2.heroSection, ref, children: /* @__PURE__ */ jsxs2("div", { className: styles2.heroContainer, children: [
617
+ return /* @__PURE__ */ jsx5("section", { className: HomePage_default.heroSection, ref, children: /* @__PURE__ */ jsxs2("div", { className: HomePage_default.heroContainer, children: [
50
618
  /* @__PURE__ */ jsxs2(
51
- motion3.div,
619
+ motion5.div,
52
620
  {
53
- className: styles2.heroContent,
621
+ className: HomePage_default.heroContent,
54
622
  initial: "hidden",
55
623
  animate: "visible",
56
624
  variants: fadeInUp,
57
625
  children: [
58
- /* @__PURE__ */ jsx3(
59
- motion3.span,
626
+ /* @__PURE__ */ jsx5(
627
+ motion5.span,
60
628
  {
61
- className: styles2.heroTagline,
629
+ className: HomePage_default.heroTagline,
62
630
  initial: { opacity: 0 },
63
631
  animate: { opacity: 1 },
64
632
  transition: { duration: 0.6, delay: 0.2 },
@@ -66,23 +634,23 @@ function AnimatedHero({ heroData, ArrowRightIcon }) {
66
634
  }
67
635
  ),
68
636
  /* @__PURE__ */ jsxs2(
69
- motion3.h1,
637
+ motion5.h1,
70
638
  {
71
- className: styles2.heroHeading,
639
+ className: HomePage_default.heroHeading,
72
640
  initial: { opacity: 0, y: 20 },
73
641
  animate: { opacity: 1, y: 0 },
74
642
  transition: { duration: 0.8, delay: 0.3 },
75
643
  children: [
76
644
  heroData.heading,
77
645
  " ",
78
- /* @__PURE__ */ jsx3("span", { className: styles2.heroHeadingAccent, children: heroData.headingAccent })
646
+ /* @__PURE__ */ jsx5("span", { className: HomePage_default.heroHeadingAccent, children: heroData.headingAccent })
79
647
  ]
80
648
  }
81
649
  ),
82
- /* @__PURE__ */ jsx3(
83
- motion3.p,
650
+ /* @__PURE__ */ jsx5(
651
+ motion5.p,
84
652
  {
85
- className: styles2.heroDescription,
653
+ className: HomePage_default.heroDescription,
86
654
  initial: { opacity: 0, y: 20 },
87
655
  animate: { opacity: 1, y: 0 },
88
656
  transition: { duration: 0.8, delay: 0.4 },
@@ -90,47 +658,47 @@ function AnimatedHero({ heroData, ArrowRightIcon }) {
90
658
  }
91
659
  ),
92
660
  /* @__PURE__ */ jsxs2(
93
- motion3.div,
661
+ motion5.div,
94
662
  {
95
- className: styles2.heroCtas,
663
+ className: HomePage_default.heroCtas,
96
664
  initial: { opacity: 0, y: 20 },
97
665
  animate: { opacity: 1, y: 0 },
98
666
  transition: { duration: 0.8, delay: 0.5 },
99
667
  children: [
100
- /* @__PURE__ */ jsxs2(Link, { href: heroData.ctaLink, className: styles2.heroPrimaryCta, children: [
668
+ /* @__PURE__ */ jsxs2(Link, { href: heroData.ctaLink, className: HomePage_default.heroPrimaryCta, children: [
101
669
  heroData.ctaText,
102
- /* @__PURE__ */ jsx3(ArrowRightIcon, {})
670
+ /* @__PURE__ */ jsx5(ArrowRightIcon, {})
103
671
  ] }),
104
- /* @__PURE__ */ jsx3(Link, { href: "/publications", className: styles2.heroSecondaryCta, children: "View Publications" })
672
+ /* @__PURE__ */ jsx5(Link, { href: "/publications", className: HomePage_default.heroSecondaryCta, children: "View Publications" })
105
673
  ]
106
674
  }
107
675
  )
108
676
  ]
109
677
  }
110
678
  ),
111
- /* @__PURE__ */ jsx3(
112
- motion3.div,
679
+ /* @__PURE__ */ jsx5(
680
+ motion5.div,
113
681
  {
114
- className: styles2.heroImageWrapper,
682
+ className: HomePage_default.heroImageWrapper,
115
683
  style: { y },
116
684
  initial: "hidden",
117
685
  animate: "visible",
118
686
  variants: scaleIn,
119
687
  transition: { duration: 0.8, delay: 0.6 },
120
688
  children: heroData.image ? /* @__PURE__ */ jsxs2(Fragment, { children: [
121
- /* @__PURE__ */ jsx3(
689
+ /* @__PURE__ */ jsx5(
122
690
  Image2,
123
691
  {
124
692
  src: heroData.image,
125
693
  alt: "Research lab",
126
694
  width: 800,
127
695
  height: 600,
128
- className: styles2.heroImage,
696
+ className: HomePage_default.heroImage,
129
697
  priority: true
130
698
  }
131
699
  ),
132
- /* @__PURE__ */ jsx3("div", { className: styles2.heroImageOverlay })
133
- ] }) : /* @__PURE__ */ jsx3("div", { className: styles2.heroImagePlaceholder, children: /* @__PURE__ */ jsxs2(
700
+ /* @__PURE__ */ jsx5("div", { className: HomePage_default.heroImageOverlay })
701
+ ] }) : /* @__PURE__ */ jsx5("div", { className: HomePage_default.heroImagePlaceholder, children: /* @__PURE__ */ jsxs2(
134
702
  "svg",
135
703
  {
136
704
  width: "120",
@@ -140,9 +708,9 @@ function AnimatedHero({ heroData, ArrowRightIcon }) {
140
708
  stroke: "currentColor",
141
709
  strokeWidth: "1",
142
710
  children: [
143
- /* @__PURE__ */ jsx3("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", ry: "2" }),
144
- /* @__PURE__ */ jsx3("circle", { cx: "8.5", cy: "8.5", r: "1.5" }),
145
- /* @__PURE__ */ jsx3("path", { d: "M21 15l-5-5L5 21" })
711
+ /* @__PURE__ */ jsx5("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", ry: "2" }),
712
+ /* @__PURE__ */ jsx5("circle", { cx: "8.5", cy: "8.5", r: "1.5" }),
713
+ /* @__PURE__ */ jsx5("path", { d: "M21 15l-5-5L5 21" })
146
714
  ]
147
715
  }
148
716
  ) })
@@ -151,15 +719,6 @@ function AnimatedHero({ heroData, ArrowRightIcon }) {
151
719
  ] }) });
152
720
  }
153
721
 
154
- // src/components/AnimatedPage.tsx
155
- import { motion as motion4 } from "framer-motion";
156
- import { useState as useState2, useEffect as useEffect2 } from "react";
157
- import { jsx as jsx4 } from "react/jsx-runtime";
158
-
159
- // src/components/AnimatedSections.tsx
160
- import { motion as motion5 } from "framer-motion";
161
- import { jsx as jsx5 } from "react/jsx-runtime";
162
-
163
722
  // src/components/ClientLayout.tsx
164
723
  import { useEffect as useEffect5 } from "react";
165
724
  import { ThemeProvider, useTheme as useTheme2 } from "next-themes";
@@ -168,13 +727,19 @@ import { ThemeProvider, useTheme as useTheme2 } from "next-themes";
168
727
  import Link2 from "next/link";
169
728
  import { useState as useState4, useEffect as useEffect4, useCallback } from "react";
170
729
  import { usePathname } from "next/navigation";
171
- import styles4 from "./Layout.module.css";
730
+
731
+ // src/components/Layout.module.css
732
+ var Layout_default = {};
172
733
 
173
734
  // src/components/ThemeToggle.tsx
174
735
  import { useTheme } from "next-themes";
175
736
  import { useEffect as useEffect3, useState as useState3 } from "react";
176
737
  import { motion as motion6 } from "framer-motion";
177
- import styles3 from "./ThemeToggle.module.css";
738
+
739
+ // src/components/ThemeToggle.module.css
740
+ var ThemeToggle_default = {};
741
+
742
+ // src/components/ThemeToggle.tsx
178
743
  import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
179
744
  function ThemeToggle() {
180
745
  const { theme, setTheme, resolvedTheme } = useTheme();
@@ -183,7 +748,7 @@ function ThemeToggle() {
183
748
  setMounted(true);
184
749
  }, []);
185
750
  if (!mounted) {
186
- return /* @__PURE__ */ jsx6("div", { className: styles3.togglePlaceholder });
751
+ return /* @__PURE__ */ jsx6("div", { className: ThemeToggle_default.togglePlaceholder });
187
752
  }
188
753
  const isDark = resolvedTheme === "dark";
189
754
  const toggleTheme = () => {
@@ -192,12 +757,12 @@ function ThemeToggle() {
192
757
  return /* @__PURE__ */ jsx6(
193
758
  motion6.button,
194
759
  {
195
- className: styles3.toggle,
760
+ className: ThemeToggle_default.toggle,
196
761
  onClick: toggleTheme,
197
762
  "aria-label": `Switch to ${isDark ? "light" : "dark"} mode`,
198
763
  whileTap: { scale: 0.95 },
199
- children: /* @__PURE__ */ jsxs3("span", { className: styles3.track, children: [
200
- /* @__PURE__ */ jsx6("span", { className: `${styles3.icon} ${styles3.sunIcon} ${!isDark ? styles3.iconActive : ""}`, children: /* @__PURE__ */ jsxs3("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
764
+ children: /* @__PURE__ */ jsxs3("span", { className: ThemeToggle_default.track, children: [
765
+ /* @__PURE__ */ jsx6("span", { className: `${ThemeToggle_default.icon} ${ThemeToggle_default.sunIcon} ${!isDark ? ThemeToggle_default.iconActive : ""}`, children: /* @__PURE__ */ jsxs3("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
201
766
  /* @__PURE__ */ jsx6("circle", { cx: "12", cy: "12", r: "5" }),
202
767
  /* @__PURE__ */ jsx6("line", { x1: "12", y1: "1", x2: "12", y2: "3" }),
203
768
  /* @__PURE__ */ jsx6("line", { x1: "12", y1: "21", x2: "12", y2: "23" }),
@@ -211,12 +776,12 @@ function ThemeToggle() {
211
776
  /* @__PURE__ */ jsx6(
212
777
  motion6.span,
213
778
  {
214
- className: styles3.thumb,
779
+ className: ThemeToggle_default.thumb,
215
780
  animate: { x: isDark ? 26 : 0 },
216
781
  transition: { type: "spring", stiffness: 500, damping: 30 }
217
782
  }
218
783
  ),
219
- /* @__PURE__ */ jsx6("span", { className: `${styles3.icon} ${styles3.moonIcon} ${isDark ? styles3.iconActive : ""}`, children: /* @__PURE__ */ jsx6("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx6("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }) }) })
784
+ /* @__PURE__ */ jsx6("span", { className: `${ThemeToggle_default.icon} ${ThemeToggle_default.moonIcon} ${isDark ? ThemeToggle_default.iconActive : ""}`, children: /* @__PURE__ */ jsx6("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx6("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }) }) })
220
785
  ] })
221
786
  }
222
787
  );
@@ -268,8 +833,8 @@ function Header({ settings }) {
268
833
  if (href === "/") return pathname === "/";
269
834
  return pathname.startsWith(href);
270
835
  };
271
- return /* @__PURE__ */ jsx7("header", { className: `${styles4.header} ${scrolled ? styles4.headerScrolled : ""}`, children: /* @__PURE__ */ jsxs4("div", { className: styles4.navContainer, children: [
272
- /* @__PURE__ */ jsxs4(Link2, { href: "/", className: styles4.navLogo, "aria-label": "Go to homepage", children: [
836
+ return /* @__PURE__ */ jsx7("header", { className: `${Layout_default.header} ${scrolled ? Layout_default.headerScrolled : ""}`, children: /* @__PURE__ */ jsxs4("div", { className: Layout_default.navContainer, children: [
837
+ /* @__PURE__ */ jsxs4(Link2, { href: "/", className: Layout_default.navLogo, "aria-label": "Go to homepage", children: [
273
838
  /* @__PURE__ */ jsxs4(
274
839
  "svg",
275
840
  {
@@ -315,37 +880,37 @@ function Header({ settings }) {
315
880
  ),
316
881
  /* @__PURE__ */ jsxs4("span", { children: [
317
882
  settings.labName || "Research",
318
- settings.labNameAccent && /* @__PURE__ */ jsxs4("span", { className: styles4.navLogoAccent, children: [
883
+ settings.labNameAccent && /* @__PURE__ */ jsxs4("span", { className: Layout_default.navLogoAccent, children: [
319
884
  " ",
320
885
  settings.labNameAccent
321
886
  ] })
322
887
  ] })
323
888
  ] }),
324
- /* @__PURE__ */ jsx7("nav", { className: styles4.desktopNav, "aria-label": "Main navigation", children: navLinks.map((link) => /* @__PURE__ */ jsx7(
889
+ /* @__PURE__ */ jsx7("nav", { className: Layout_default.desktopNav, "aria-label": "Main navigation", children: navLinks.map((link) => /* @__PURE__ */ jsx7(
325
890
  Link2,
326
891
  {
327
892
  href: link.href,
328
- className: `${styles4.navLink} ${isActive(link.href) ? styles4.navLinkActive : ""}`,
893
+ className: `${Layout_default.navLink} ${isActive(link.href) ? Layout_default.navLinkActive : ""}`,
329
894
  children: link.label
330
895
  },
331
896
  link.href
332
897
  )) }),
333
- /* @__PURE__ */ jsxs4("div", { className: styles4.navActions, children: [
898
+ /* @__PURE__ */ jsxs4("div", { className: Layout_default.navActions, children: [
334
899
  /* @__PURE__ */ jsx7(ThemeToggle, {}),
335
- /* @__PURE__ */ jsx7(Link2, { href: "/contact", className: styles4.navCta, children: "Contact Us" })
900
+ /* @__PURE__ */ jsx7(Link2, { href: "/contact", className: Layout_default.navCta, children: "Contact Us" })
336
901
  ] }),
337
902
  /* @__PURE__ */ jsx7(
338
903
  "button",
339
904
  {
340
- className: styles4.menuButton,
905
+ className: Layout_default.menuButton,
341
906
  onClick: () => setMenuOpen(!menuOpen),
342
907
  "aria-label": menuOpen ? "Close menu" : "Open menu",
343
908
  "aria-expanded": menuOpen,
344
909
  "aria-controls": "mobile-menu",
345
- children: /* @__PURE__ */ jsxs4("span", { className: styles4.menuButtonLines, children: [
346
- /* @__PURE__ */ jsx7("span", { className: `${styles4.menuLine} ${menuOpen ? styles4.menuLineOpen1 : ""}` }),
347
- /* @__PURE__ */ jsx7("span", { className: `${styles4.menuLine} ${menuOpen ? styles4.menuLineOpen2 : ""}` }),
348
- /* @__PURE__ */ jsx7("span", { className: `${styles4.menuLine} ${menuOpen ? styles4.menuLineOpen3 : ""}` })
910
+ children: /* @__PURE__ */ jsxs4("span", { className: Layout_default.menuButtonLines, children: [
911
+ /* @__PURE__ */ jsx7("span", { className: `${Layout_default.menuLine} ${menuOpen ? Layout_default.menuLineOpen1 : ""}` }),
912
+ /* @__PURE__ */ jsx7("span", { className: `${Layout_default.menuLine} ${menuOpen ? Layout_default.menuLineOpen2 : ""}` }),
913
+ /* @__PURE__ */ jsx7("span", { className: `${Layout_default.menuLine} ${menuOpen ? Layout_default.menuLineOpen3 : ""}` })
349
914
  ] })
350
915
  }
351
916
  ),
@@ -353,13 +918,13 @@ function Header({ settings }) {
353
918
  "div",
354
919
  {
355
920
  id: "mobile-menu",
356
- className: `${styles4.mobileMenu} ${menuOpen ? styles4.mobileMenuOpen : ""}`,
921
+ className: `${Layout_default.mobileMenu} ${menuOpen ? Layout_default.mobileMenuOpen : ""}`,
357
922
  "aria-hidden": !menuOpen,
358
923
  children: [
359
924
  /* @__PURE__ */ jsx7(
360
925
  "div",
361
926
  {
362
- className: styles4.mobileMenuOverlay,
927
+ className: Layout_default.mobileMenuOverlay,
363
928
  onClick: () => setMenuOpen(false),
364
929
  "aria-hidden": "true"
365
930
  }
@@ -367,14 +932,14 @@ function Header({ settings }) {
367
932
  /* @__PURE__ */ jsxs4(
368
933
  "nav",
369
934
  {
370
- className: styles4.mobileMenuContent,
935
+ className: Layout_default.mobileMenuContent,
371
936
  "aria-label": "Mobile navigation",
372
937
  children: [
373
938
  navLinks.map((link, index) => /* @__PURE__ */ jsx7(
374
939
  Link2,
375
940
  {
376
941
  href: link.href,
377
- className: `${styles4.mobileNavLink} ${isActive(link.href) ? styles4.mobileNavLinkActive : ""}`,
942
+ className: `${Layout_default.mobileNavLink} ${isActive(link.href) ? Layout_default.mobileNavLinkActive : ""}`,
378
943
  style: { animationDelay: `${index * 50}ms` },
379
944
  tabIndex: menuOpen ? 0 : -1,
380
945
  children: link.label
@@ -385,7 +950,7 @@ function Header({ settings }) {
385
950
  Link2,
386
951
  {
387
952
  href: "/contact",
388
- className: styles4.mobileNavCta,
953
+ className: Layout_default.mobileNavCta,
389
954
  style: { animationDelay: `${navLinks.length * 50}ms` },
390
955
  tabIndex: menuOpen ? 0 : -1,
391
956
  children: "Contact Us"
@@ -402,7 +967,9 @@ function Header({ settings }) {
402
967
 
403
968
  // src/components/Footer.tsx
404
969
  import Link3 from "next/link";
405
- import styles5 from "./Footer.module.css";
970
+
971
+ // src/components/Footer.module.css
972
+ var Footer_default = {};
406
973
 
407
974
  // src/lib/utils.ts
408
975
  function isValidExternalUrl(url) {
@@ -414,52 +981,92 @@ function isValidExternalUrl(url) {
414
981
  return false;
415
982
  }
416
983
  }
984
+ function isValidGoogleMapsEmbedUrl(url) {
985
+ if (!url || typeof url !== "string") return false;
986
+ try {
987
+ const parsed = new URL(url);
988
+ const allowedHosts = [
989
+ "www.google.com",
990
+ "google.com",
991
+ "maps.google.com"
992
+ ];
993
+ return parsed.protocol === "https:" && allowedHosts.includes(parsed.hostname) && parsed.pathname.startsWith("/maps/embed");
994
+ } catch {
995
+ return false;
996
+ }
997
+ }
998
+ function sanitizeUrl(url) {
999
+ if (isValidExternalUrl(url)) {
1000
+ return url;
1001
+ }
1002
+ return void 0;
1003
+ }
1004
+ function isValidEmail(email) {
1005
+ if (!email || typeof email !== "string") return false;
1006
+ const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
1007
+ return emailPattern.test(email) && email.length <= 254;
1008
+ }
1009
+ function escapeHtml(text) {
1010
+ const htmlEntities = {
1011
+ "&": "&amp;",
1012
+ "<": "&lt;",
1013
+ ">": "&gt;",
1014
+ '"': "&quot;",
1015
+ "'": "&#39;"
1016
+ };
1017
+ return text.replace(/[&<>"']/g, (char) => htmlEntities[char]);
1018
+ }
1019
+ function isValidSlug(slug) {
1020
+ if (!slug || typeof slug !== "string") return false;
1021
+ const slugPattern = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
1022
+ return slugPattern.test(slug) && slug.length <= 200;
1023
+ }
417
1024
 
418
1025
  // src/components/Footer.tsx
419
1026
  import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
420
- var SocialIcon = ({ href, children }) => /* @__PURE__ */ jsx8("a", { href, target: "_blank", rel: "noopener noreferrer", className: styles5.socialIcon, children });
1027
+ var SocialIcon = ({ href, children }) => /* @__PURE__ */ jsx8("a", { href, target: "_blank", rel: "noopener noreferrer", className: Footer_default.socialIcon, children });
421
1028
  function Footer({ settings }) {
422
1029
  const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
423
1030
  const showPrivacy = settings?.showPrivacyPolicy !== false;
424
1031
  const showTerms = settings?.showTerms !== false;
425
1032
  const hasLegalLinks = showPrivacy || showTerms;
426
- return /* @__PURE__ */ jsx8("footer", { className: styles5.footerWrapper, children: /* @__PURE__ */ jsxs5("div", { className: styles5.footerContainer, children: [
427
- /* @__PURE__ */ jsxs5("div", { className: styles5.mainFooter, children: [
428
- /* @__PURE__ */ jsxs5("div", { className: styles5.footerAbout, children: [
429
- /* @__PURE__ */ jsxs5(Link3, { href: "/", className: styles5.footerLogo, children: [
1033
+ return /* @__PURE__ */ jsx8("footer", { className: Footer_default.footerWrapper, children: /* @__PURE__ */ jsxs5("div", { className: Footer_default.footerContainer, children: [
1034
+ /* @__PURE__ */ jsxs5("div", { className: Footer_default.mainFooter, children: [
1035
+ /* @__PURE__ */ jsxs5("div", { className: Footer_default.footerAbout, children: [
1036
+ /* @__PURE__ */ jsxs5(Link3, { href: "/", className: Footer_default.footerLogo, children: [
430
1037
  settings?.labName || "Cavendish",
431
1038
  " ",
432
- /* @__PURE__ */ jsx8("span", { className: styles5.logoAccent, children: settings?.labNameAccent || "Lab" })
1039
+ /* @__PURE__ */ jsx8("span", { className: Footer_default.logoAccent, children: settings?.labNameAccent || "Lab" })
433
1040
  ] }),
434
- /* @__PURE__ */ jsx8("p", { className: styles5.footerDescription, children: settings?.labNameDescription || "Advancing the frontiers of physics and our understanding of the universe." }),
435
- /* @__PURE__ */ jsxs5("div", { className: styles5.socials, children: [
1041
+ /* @__PURE__ */ jsx8("p", { className: Footer_default.footerDescription, children: settings?.labNameDescription || "Advancing the frontiers of physics and our understanding of the universe." }),
1042
+ /* @__PURE__ */ jsxs5("div", { className: Footer_default.socials, children: [
436
1043
  /* @__PURE__ */ jsx8(SocialIcon, { href: "#", children: /* @__PURE__ */ jsx8("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx8("path", { d: "M19 0h-14c-2.761 0-5 2.239-5 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5v-14c0-2.761-2.238-5-5-5zm-11 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.396-2.586 7-2.777 7 2.476v6.759z" }) }) }),
437
1044
  /* @__PURE__ */ jsx8(SocialIcon, { href: "#", children: /* @__PURE__ */ jsx8("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx8("path", { d: "M18.244 2.25h3.308l-7.227 8.26 8.502 11.24h-6.617l-5.21-6.817-6.044 6.817h-3.308l7.73-8.835-7.73-10.668h6.78l4.522 6.312 5.59-6.312z" }) }) })
438
1045
  ] })
439
1046
  ] }),
440
- /* @__PURE__ */ jsxs5("div", { className: styles5.footerLinksGrid, children: [
441
- /* @__PURE__ */ jsxs5("div", { className: styles5.footerColumn, children: [
1047
+ /* @__PURE__ */ jsxs5("div", { className: Footer_default.footerLinksGrid, children: [
1048
+ /* @__PURE__ */ jsxs5("div", { className: Footer_default.footerColumn, children: [
442
1049
  /* @__PURE__ */ jsx8("h4", { children: "Quick Links" }),
443
1050
  /* @__PURE__ */ jsx8(Link3, { href: "/research", children: "Research" }),
444
1051
  /* @__PURE__ */ jsx8(Link3, { href: "/publications", children: "Publications" }),
445
1052
  /* @__PURE__ */ jsx8(Link3, { href: "/pictures", children: "Gallery" })
446
1053
  ] }),
447
- /* @__PURE__ */ jsxs5("div", { className: styles5.footerColumn, children: [
1054
+ /* @__PURE__ */ jsxs5("div", { className: Footer_default.footerColumn, children: [
448
1055
  /* @__PURE__ */ jsx8("h4", { children: "About" }),
449
1056
  /* @__PURE__ */ jsx8(Link3, { href: "/news", children: "News" }),
450
1057
  /* @__PURE__ */ jsx8(Link3, { href: "/people", children: "Our Team" }),
451
1058
  /* @__PURE__ */ jsx8(Link3, { href: "/contact", children: "Contact" })
452
1059
  ] }),
453
- /* @__PURE__ */ jsxs5("div", { className: styles5.footerColumn, children: [
1060
+ /* @__PURE__ */ jsxs5("div", { className: Footer_default.footerColumn, children: [
454
1061
  /* @__PURE__ */ jsx8("h4", { children: "Resources" }),
455
1062
  /* @__PURE__ */ jsx8(Link3, { href: "https://www.cam.ac.uk/", children: "University" }),
456
1063
  /* @__PURE__ */ jsx8(Link3, { href: "#", children: "Careers" })
457
1064
  ] })
458
1065
  ] })
459
1066
  ] }),
460
- /* @__PURE__ */ jsxs5("div", { className: styles5.footerBottomBar, children: [
1067
+ /* @__PURE__ */ jsxs5("div", { className: Footer_default.footerBottomBar, children: [
461
1068
  /* @__PURE__ */ jsx8("p", { children: settings?.footerText || `\xA9 ${currentYear} The Research Group. All Rights Reserved.` }),
462
- hasLegalLinks && /* @__PURE__ */ jsxs5("div", { className: styles5.legalLinks, children: [
1069
+ hasLegalLinks && /* @__PURE__ */ jsxs5("div", { className: Footer_default.legalLinks, children: [
463
1070
  showPrivacy && (settings?.privacyPolicyUrl && isValidExternalUrl(settings.privacyPolicyUrl) ? /* @__PURE__ */ jsx8("a", { href: settings.privacyPolicyUrl, target: "_blank", rel: "noopener noreferrer", children: "Privacy Policy" }) : /* @__PURE__ */ jsx8(Link3, { href: "/privacy", children: "Privacy Policy" })),
464
1071
  showTerms && (settings?.termsUrl && isValidExternalUrl(settings.termsUrl) ? /* @__PURE__ */ jsx8("a", { href: settings.termsUrl, target: "_blank", rel: "noopener noreferrer", children: "Terms & Conditions" }) : /* @__PURE__ */ jsx8(Link3, { href: "/terms", children: "Terms & Conditions" }))
465
1072
  ] })
@@ -495,20 +1102,132 @@ function ClientLayout({ children, settings }) {
495
1102
 
496
1103
  // src/components/ContactCTA.tsx
497
1104
  import Link4 from "next/link";
498
- import styles6 from "./ContactCTA.module.css";
1105
+
1106
+ // src/components/ContactCTA.module.css
1107
+ var ContactCTA_default = {};
1108
+
1109
+ // src/components/ContactCTA.tsx
499
1110
  import { jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
500
1111
  function ContactCTA() {
501
- return /* @__PURE__ */ jsx10("section", { className: styles6.ctaContainer, children: /* @__PURE__ */ jsxs7("div", { className: styles6.ctaContent, children: [
502
- /* @__PURE__ */ jsx10("h2", { className: styles6.ctaHeading, children: "Interested in Our Research?" }),
503
- /* @__PURE__ */ jsx10("p", { className: styles6.ctaText, children: "Follow our work, explore our publications, or get in touch to discuss potential collaborations." }),
504
- /* @__PURE__ */ jsx10(Link4, { href: "/contact", className: styles6.ctaButton, children: "Contact Us" })
1112
+ return /* @__PURE__ */ jsx10("section", { className: ContactCTA_default.ctaContainer, children: /* @__PURE__ */ jsxs7("div", { className: ContactCTA_default.ctaContent, children: [
1113
+ /* @__PURE__ */ jsx10("h2", { className: ContactCTA_default.ctaHeading, children: "Interested in Our Research?" }),
1114
+ /* @__PURE__ */ jsx10("p", { className: ContactCTA_default.ctaText, children: "Follow our work, explore our publications, or get in touch to discuss potential collaborations." }),
1115
+ /* @__PURE__ */ jsx10(Link4, { href: "/contact", className: ContactCTA_default.ctaButton, children: "Contact Us" })
505
1116
  ] }) });
506
1117
  }
1118
+
1119
+ // src/components/HomePage.tsx
1120
+ import { Fragment as Fragment2, jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
1121
+ function HomePage({
1122
+ children,
1123
+ settings = null,
1124
+ header,
1125
+ footer
1126
+ }) {
1127
+ return /* @__PURE__ */ jsxs8(Fragment2, { children: [
1128
+ header ?? /* @__PURE__ */ jsx11(Header, { settings: settings || {} }),
1129
+ /* @__PURE__ */ jsx11("main", { children }),
1130
+ footer ?? /* @__PURE__ */ jsx11(Footer, { settings: settings || {} })
1131
+ ] });
1132
+ }
1133
+
1134
+ // src/config.ts
1135
+ function defineConfig(config) {
1136
+ return config;
1137
+ }
1138
+
1139
+ // src/lib/sanity.ts
1140
+ import { createClient } from "next-sanity";
1141
+ import imageUrlBuilder from "@sanity/image-url";
1142
+ var projectId = process.env.NEXT_PUBLIC_SANITY_PROJECT_ID;
1143
+ var dataset = process.env.NEXT_PUBLIC_SANITY_DATASET || "production";
1144
+ var apiVersion = "2023-05-03";
1145
+ var _client = null;
1146
+ function getClient() {
1147
+ if (!_client) {
1148
+ if (!projectId) {
1149
+ throw new Error(
1150
+ "Sanity Project ID is not defined. Please set NEXT_PUBLIC_SANITY_PROJECT_ID in your environment."
1151
+ );
1152
+ }
1153
+ _client = createClient({
1154
+ projectId,
1155
+ dataset,
1156
+ apiVersion,
1157
+ useCdn: process.env.NODE_ENV === "production"
1158
+ });
1159
+ }
1160
+ return _client;
1161
+ }
1162
+ var client = {
1163
+ get projectId() {
1164
+ return projectId;
1165
+ },
1166
+ get dataset() {
1167
+ return dataset;
1168
+ },
1169
+ fetch: (...args) => getClient().fetch(...args)
1170
+ };
1171
+ var _builder = null;
1172
+ function urlFor(source) {
1173
+ if (!_builder) {
1174
+ if (!projectId) {
1175
+ return {
1176
+ width: () => ({ height: () => ({ url: () => "" }), url: () => "" }),
1177
+ height: () => ({ width: () => ({ url: () => "" }), url: () => "" }),
1178
+ url: () => ""
1179
+ };
1180
+ }
1181
+ _builder = imageUrlBuilder({ projectId, dataset });
1182
+ }
1183
+ return _builder.image(source);
1184
+ }
507
1185
  export {
1186
+ AnimatedCard,
1187
+ AnimatedGalleryGrid,
1188
+ AnimatedGalleryHeader,
1189
+ AnimatedGrid,
1190
+ AnimatedHeader,
508
1191
  AnimatedHero,
1192
+ AnimatedHeroContent,
1193
+ AnimatedImage,
1194
+ AnimatedItem,
1195
+ AnimatedList,
1196
+ AnimatedMain,
1197
+ AnimatedPage,
1198
+ AnimatedSection,
1199
+ AnimatedSectionHeader,
1200
+ AnimatedStats,
509
1201
  ClientLayout,
510
1202
  ContactCTA,
511
1203
  Footer,
512
1204
  Header,
513
- ThemeToggle
1205
+ HomePage,
1206
+ ScrollRevealSection,
1207
+ StaggeredGrid,
1208
+ ThemeToggle,
1209
+ cardHover,
1210
+ client,
1211
+ defineConfig,
1212
+ escapeHtml,
1213
+ fadeIn,
1214
+ fadeInUp,
1215
+ fadeInUpShort,
1216
+ getClient,
1217
+ imageZoom,
1218
+ isValidEmail,
1219
+ isValidExternalUrl,
1220
+ isValidGoogleMapsEmbedUrl,
1221
+ isValidSlug,
1222
+ pageTransition,
1223
+ reducedMotion,
1224
+ sanitizeUrl,
1225
+ scaleIn,
1226
+ scrollReveal,
1227
+ slideInLeft,
1228
+ slideInRight,
1229
+ staggerContainer,
1230
+ staggerItem,
1231
+ urlFor,
1232
+ viewportSettings
514
1233
  };