@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.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,9 +45,155 @@ 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";
@@ -34,29 +201,422 @@ import Image from "next/image";
34
201
  import { useState, useEffect } from "react";
35
202
  import styles from "./PicturesPage.module.css";
36
203
  import { jsx as jsx2, jsxs } from "react/jsx-runtime";
204
+ function useMounted() {
205
+ const [mounted, setMounted] = useState(false);
206
+ useEffect(() => {
207
+ setMounted(true);
208
+ }, []);
209
+ return mounted;
210
+ }
211
+ function AnimatedGalleryHeader({ children, className }) {
212
+ const mounted = useMounted();
213
+ if (!mounted) {
214
+ return /* @__PURE__ */ jsx2("header", { className, children });
215
+ }
216
+ return /* @__PURE__ */ jsx2(
217
+ motion2.header,
218
+ {
219
+ className,
220
+ initial: { opacity: 0, y: 30 },
221
+ animate: { opacity: 1, y: 0 },
222
+ transition: { duration: 0.8, ease: [0.4, 0, 0.2, 1] },
223
+ children
224
+ }
225
+ );
226
+ }
227
+ function AnimatedGalleryGrid({ images }) {
228
+ const mounted = useMounted();
229
+ if (!mounted) {
230
+ return /* @__PURE__ */ jsx2("div", { className: styles.photosGrid, children: images.map((pic) => /* @__PURE__ */ jsxs("div", { className: styles.photoCard, children: [
231
+ /* @__PURE__ */ jsx2("div", { className: styles.photoImageWrapper, children: /* @__PURE__ */ jsx2(
232
+ Image,
233
+ {
234
+ src: pic.imageUrl,
235
+ alt: pic.altText,
236
+ width: pic.width,
237
+ height: pic.height,
238
+ sizes: "(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw",
239
+ className: styles.photoImage
240
+ }
241
+ ) }),
242
+ pic.caption && /* @__PURE__ */ jsx2("p", { className: styles.photoCaption, children: pic.caption })
243
+ ] }, pic._id)) });
244
+ }
245
+ return /* @__PURE__ */ jsx2(
246
+ motion2.div,
247
+ {
248
+ className: styles.photosGrid,
249
+ initial: "hidden",
250
+ animate: "visible",
251
+ variants: {
252
+ hidden: { opacity: 0 },
253
+ visible: {
254
+ opacity: 1,
255
+ transition: {
256
+ staggerChildren: 0.08,
257
+ delayChildren: 0.2
258
+ }
259
+ }
260
+ },
261
+ children: images.map((pic) => /* @__PURE__ */ jsxs(
262
+ motion2.div,
263
+ {
264
+ className: styles.photoCard,
265
+ variants: {
266
+ hidden: { opacity: 0, y: 40, scale: 0.95 },
267
+ visible: {
268
+ opacity: 1,
269
+ y: 0,
270
+ scale: 1,
271
+ transition: {
272
+ duration: 0.6,
273
+ ease: [0.4, 0, 0.2, 1]
274
+ }
275
+ }
276
+ },
277
+ whileHover: {
278
+ scale: 1.05,
279
+ transition: { duration: 0.3 }
280
+ },
281
+ children: [
282
+ /* @__PURE__ */ jsx2("div", { className: styles.photoImageWrapper, children: /* @__PURE__ */ jsx2(
283
+ Image,
284
+ {
285
+ src: pic.imageUrl,
286
+ alt: pic.altText,
287
+ width: pic.width,
288
+ height: pic.height,
289
+ sizes: "(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw",
290
+ className: styles.photoImage
291
+ }
292
+ ) }),
293
+ pic.caption && /* @__PURE__ */ jsx2("p", { className: styles.photoCaption, children: pic.caption })
294
+ ]
295
+ },
296
+ pic._id
297
+ ))
298
+ }
299
+ );
300
+ }
301
+
302
+ // src/components/AnimatedPage.tsx
303
+ import { motion as motion3 } from "framer-motion";
304
+ import { useState as useState2, useEffect as useEffect2 } from "react";
305
+ import { jsx as jsx3 } from "react/jsx-runtime";
306
+ function useMounted2() {
307
+ const [mounted, setMounted] = useState2(false);
308
+ useEffect2(() => {
309
+ setMounted(true);
310
+ }, []);
311
+ return mounted;
312
+ }
313
+ function AnimatedPage({ children, className }) {
314
+ const mounted = useMounted2();
315
+ if (!mounted) {
316
+ return /* @__PURE__ */ jsx3("div", { className, children });
317
+ }
318
+ return /* @__PURE__ */ jsx3(
319
+ motion3.div,
320
+ {
321
+ className,
322
+ initial: { opacity: 0 },
323
+ animate: { opacity: 1 },
324
+ transition: { duration: 0.6, ease: [0.4, 0, 0.2, 1] },
325
+ children
326
+ }
327
+ );
328
+ }
329
+ function AnimatedHeader({ children, className }) {
330
+ const mounted = useMounted2();
331
+ if (!mounted) {
332
+ return /* @__PURE__ */ jsx3("header", { className, children });
333
+ }
334
+ return /* @__PURE__ */ jsx3(
335
+ motion3.header,
336
+ {
337
+ className,
338
+ initial: { opacity: 0, y: 30 },
339
+ animate: { opacity: 1, y: 0 },
340
+ transition: { duration: 0.8, ease: [0.4, 0, 0.2, 1] },
341
+ children
342
+ }
343
+ );
344
+ }
345
+ function AnimatedMain({ children, className }) {
346
+ const mounted = useMounted2();
347
+ if (!mounted) {
348
+ return /* @__PURE__ */ jsx3("main", { className, children });
349
+ }
350
+ return /* @__PURE__ */ jsx3(
351
+ motion3.main,
352
+ {
353
+ className,
354
+ initial: { opacity: 0, y: 20 },
355
+ animate: { opacity: 1, y: 0 },
356
+ transition: { duration: 0.6, delay: 0.2, ease: [0.4, 0, 0.2, 1] },
357
+ children
358
+ }
359
+ );
360
+ }
361
+ function StaggeredGrid({ children, className }) {
362
+ const mounted = useMounted2();
363
+ const childArray = Array.isArray(children) ? children : [children];
364
+ if (!mounted) {
365
+ return /* @__PURE__ */ jsx3("div", { className, children });
366
+ }
367
+ return /* @__PURE__ */ jsx3(
368
+ motion3.div,
369
+ {
370
+ className,
371
+ initial: "hidden",
372
+ whileInView: "visible",
373
+ viewport: { once: true, amount: 0.1 },
374
+ variants: {
375
+ hidden: { opacity: 0 },
376
+ visible: {
377
+ opacity: 1,
378
+ transition: {
379
+ staggerChildren: 0.1,
380
+ delayChildren: 0.1
381
+ }
382
+ }
383
+ },
384
+ children: childArray.map((child, index) => /* @__PURE__ */ jsx3(
385
+ motion3.div,
386
+ {
387
+ variants: {
388
+ hidden: { opacity: 0, y: 30 },
389
+ visible: {
390
+ opacity: 1,
391
+ y: 0,
392
+ transition: {
393
+ duration: 0.6,
394
+ ease: [0.4, 0, 0.2, 1]
395
+ }
396
+ }
397
+ },
398
+ children: child
399
+ },
400
+ index
401
+ ))
402
+ }
403
+ );
404
+ }
405
+ function AnimatedItem({ children, className, delay = 0, index = 0 }) {
406
+ const mounted = useMounted2();
407
+ if (!mounted) {
408
+ return /* @__PURE__ */ jsx3("div", { className, children });
409
+ }
410
+ return /* @__PURE__ */ jsx3(
411
+ motion3.div,
412
+ {
413
+ className,
414
+ initial: { opacity: 0, y: 30 },
415
+ whileInView: { opacity: 1, y: 0 },
416
+ viewport: { once: true, amount: 0.3 },
417
+ transition: {
418
+ duration: 0.6,
419
+ delay: delay || index * 0.1,
420
+ ease: [0.4, 0, 0.2, 1]
421
+ },
422
+ children
423
+ }
424
+ );
425
+ }
426
+ function ScrollRevealSection({ children, className }) {
427
+ const mounted = useMounted2();
428
+ if (!mounted) {
429
+ return /* @__PURE__ */ jsx3("section", { className, children });
430
+ }
431
+ return /* @__PURE__ */ jsx3(
432
+ motion3.section,
433
+ {
434
+ className,
435
+ initial: { opacity: 0, y: 40 },
436
+ whileInView: { opacity: 1, y: 0 },
437
+ viewport: { once: true, amount: 0.2 },
438
+ transition: { duration: 0.8, ease: [0.4, 0, 0.2, 1] },
439
+ children
440
+ }
441
+ );
442
+ }
443
+ function AnimatedHeroContent({ children, className }) {
444
+ const mounted = useMounted2();
445
+ const childArray = Array.isArray(children) ? children : [children];
446
+ if (!mounted) {
447
+ return /* @__PURE__ */ jsx3("div", { className, children });
448
+ }
449
+ return /* @__PURE__ */ jsx3(
450
+ motion3.div,
451
+ {
452
+ className,
453
+ initial: "hidden",
454
+ animate: "visible",
455
+ variants: {
456
+ hidden: { opacity: 0 },
457
+ visible: {
458
+ opacity: 1,
459
+ transition: {
460
+ staggerChildren: 0.15,
461
+ delayChildren: 0.1
462
+ }
463
+ }
464
+ },
465
+ children: childArray.map((child, index) => /* @__PURE__ */ jsx3(
466
+ motion3.div,
467
+ {
468
+ variants: {
469
+ hidden: { opacity: 0, y: 20 },
470
+ visible: {
471
+ opacity: 1,
472
+ y: 0,
473
+ transition: {
474
+ duration: 0.6,
475
+ ease: [0.4, 0, 0.2, 1]
476
+ }
477
+ }
478
+ },
479
+ children: child
480
+ },
481
+ index
482
+ ))
483
+ }
484
+ );
485
+ }
486
+
487
+ // src/components/AnimatedSections.tsx
488
+ import { motion as motion4 } from "framer-motion";
489
+ import { jsx as jsx4 } from "react/jsx-runtime";
490
+ function AnimatedGrid({ children, className }) {
491
+ const childArray = Array.isArray(children) ? children : [children];
492
+ return /* @__PURE__ */ jsx4(
493
+ motion4.div,
494
+ {
495
+ className,
496
+ initial: "hidden",
497
+ whileInView: "visible",
498
+ viewport: viewportSettings,
499
+ variants: staggerContainer,
500
+ children: childArray.map((child, index) => /* @__PURE__ */ jsx4(motion4.div, { variants: staggerItem, children: child }, index))
501
+ }
502
+ );
503
+ }
504
+ function AnimatedStats({ children, className }) {
505
+ const childArray = Array.isArray(children) ? children : [children];
506
+ return /* @__PURE__ */ jsx4(
507
+ motion4.div,
508
+ {
509
+ className,
510
+ initial: "hidden",
511
+ whileInView: "visible",
512
+ viewport: { once: true, amount: 0.3 },
513
+ variants: {
514
+ hidden: { opacity: 0 },
515
+ visible: {
516
+ opacity: 1,
517
+ transition: {
518
+ staggerChildren: 0.15,
519
+ delayChildren: 0.1
520
+ }
521
+ }
522
+ },
523
+ children: childArray.map((child, index) => /* @__PURE__ */ jsx4(
524
+ motion4.div,
525
+ {
526
+ variants: {
527
+ hidden: { opacity: 0, scale: 0.8 },
528
+ visible: {
529
+ opacity: 1,
530
+ scale: 1,
531
+ transition: {
532
+ duration: 0.5,
533
+ ease: [0.4, 0, 0.2, 1]
534
+ }
535
+ }
536
+ },
537
+ children: child
538
+ },
539
+ index
540
+ ))
541
+ }
542
+ );
543
+ }
544
+ function AnimatedSectionHeader({ children, className }) {
545
+ return /* @__PURE__ */ jsx4(
546
+ motion4.header,
547
+ {
548
+ className,
549
+ initial: "hidden",
550
+ whileInView: "visible",
551
+ viewport: viewportSettings,
552
+ variants: fadeInUpShort,
553
+ children
554
+ }
555
+ );
556
+ }
557
+ function AnimatedList({ children, className }) {
558
+ const childArray = Array.isArray(children) ? children : [children];
559
+ return /* @__PURE__ */ jsx4(
560
+ motion4.div,
561
+ {
562
+ className,
563
+ initial: "hidden",
564
+ whileInView: "visible",
565
+ viewport: viewportSettings,
566
+ variants: {
567
+ hidden: { opacity: 0 },
568
+ visible: {
569
+ opacity: 1,
570
+ transition: {
571
+ staggerChildren: 0.08,
572
+ delayChildren: 0.1
573
+ }
574
+ }
575
+ },
576
+ children: childArray.map((child, index) => /* @__PURE__ */ jsx4(
577
+ motion4.div,
578
+ {
579
+ variants: {
580
+ hidden: { opacity: 0, x: -20 },
581
+ visible: {
582
+ opacity: 1,
583
+ x: 0,
584
+ transition: {
585
+ duration: 0.5,
586
+ ease: [0.4, 0, 0.2, 1]
587
+ }
588
+ }
589
+ },
590
+ children: child
591
+ },
592
+ index
593
+ ))
594
+ }
595
+ );
596
+ }
37
597
 
38
598
  // src/components/AnimatedHero.tsx
39
- import { motion as motion3, useScroll, useTransform } from "framer-motion";
599
+ import { motion as motion5, useScroll, useTransform } from "framer-motion";
40
600
  import { useRef } from "react";
41
601
  import Image2 from "next/image";
42
602
  import Link from "next/link";
43
603
  import styles2 from "./HomePage.module.css";
44
- import { Fragment, jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
604
+ import { Fragment, jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
45
605
  function AnimatedHero({ heroData, ArrowRightIcon }) {
46
606
  const ref = useRef(null);
47
607
  const { scrollY } = useScroll();
48
608
  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: [
609
+ return /* @__PURE__ */ jsx5("section", { className: styles2.heroSection, ref, children: /* @__PURE__ */ jsxs2("div", { className: styles2.heroContainer, children: [
50
610
  /* @__PURE__ */ jsxs2(
51
- motion3.div,
611
+ motion5.div,
52
612
  {
53
613
  className: styles2.heroContent,
54
614
  initial: "hidden",
55
615
  animate: "visible",
56
616
  variants: fadeInUp,
57
617
  children: [
58
- /* @__PURE__ */ jsx3(
59
- motion3.span,
618
+ /* @__PURE__ */ jsx5(
619
+ motion5.span,
60
620
  {
61
621
  className: styles2.heroTagline,
62
622
  initial: { opacity: 0 },
@@ -66,7 +626,7 @@ function AnimatedHero({ heroData, ArrowRightIcon }) {
66
626
  }
67
627
  ),
68
628
  /* @__PURE__ */ jsxs2(
69
- motion3.h1,
629
+ motion5.h1,
70
630
  {
71
631
  className: styles2.heroHeading,
72
632
  initial: { opacity: 0, y: 20 },
@@ -75,12 +635,12 @@ function AnimatedHero({ heroData, ArrowRightIcon }) {
75
635
  children: [
76
636
  heroData.heading,
77
637
  " ",
78
- /* @__PURE__ */ jsx3("span", { className: styles2.heroHeadingAccent, children: heroData.headingAccent })
638
+ /* @__PURE__ */ jsx5("span", { className: styles2.heroHeadingAccent, children: heroData.headingAccent })
79
639
  ]
80
640
  }
81
641
  ),
82
- /* @__PURE__ */ jsx3(
83
- motion3.p,
642
+ /* @__PURE__ */ jsx5(
643
+ motion5.p,
84
644
  {
85
645
  className: styles2.heroDescription,
86
646
  initial: { opacity: 0, y: 20 },
@@ -90,7 +650,7 @@ function AnimatedHero({ heroData, ArrowRightIcon }) {
90
650
  }
91
651
  ),
92
652
  /* @__PURE__ */ jsxs2(
93
- motion3.div,
653
+ motion5.div,
94
654
  {
95
655
  className: styles2.heroCtas,
96
656
  initial: { opacity: 0, y: 20 },
@@ -99,17 +659,17 @@ function AnimatedHero({ heroData, ArrowRightIcon }) {
99
659
  children: [
100
660
  /* @__PURE__ */ jsxs2(Link, { href: heroData.ctaLink, className: styles2.heroPrimaryCta, children: [
101
661
  heroData.ctaText,
102
- /* @__PURE__ */ jsx3(ArrowRightIcon, {})
662
+ /* @__PURE__ */ jsx5(ArrowRightIcon, {})
103
663
  ] }),
104
- /* @__PURE__ */ jsx3(Link, { href: "/publications", className: styles2.heroSecondaryCta, children: "View Publications" })
664
+ /* @__PURE__ */ jsx5(Link, { href: "/publications", className: styles2.heroSecondaryCta, children: "View Publications" })
105
665
  ]
106
666
  }
107
667
  )
108
668
  ]
109
669
  }
110
670
  ),
111
- /* @__PURE__ */ jsx3(
112
- motion3.div,
671
+ /* @__PURE__ */ jsx5(
672
+ motion5.div,
113
673
  {
114
674
  className: styles2.heroImageWrapper,
115
675
  style: { y },
@@ -118,7 +678,7 @@ function AnimatedHero({ heroData, ArrowRightIcon }) {
118
678
  variants: scaleIn,
119
679
  transition: { duration: 0.8, delay: 0.6 },
120
680
  children: heroData.image ? /* @__PURE__ */ jsxs2(Fragment, { children: [
121
- /* @__PURE__ */ jsx3(
681
+ /* @__PURE__ */ jsx5(
122
682
  Image2,
123
683
  {
124
684
  src: heroData.image,
@@ -129,8 +689,8 @@ function AnimatedHero({ heroData, ArrowRightIcon }) {
129
689
  priority: true
130
690
  }
131
691
  ),
132
- /* @__PURE__ */ jsx3("div", { className: styles2.heroImageOverlay })
133
- ] }) : /* @__PURE__ */ jsx3("div", { className: styles2.heroImagePlaceholder, children: /* @__PURE__ */ jsxs2(
692
+ /* @__PURE__ */ jsx5("div", { className: styles2.heroImageOverlay })
693
+ ] }) : /* @__PURE__ */ jsx5("div", { className: styles2.heroImagePlaceholder, children: /* @__PURE__ */ jsxs2(
134
694
  "svg",
135
695
  {
136
696
  width: "120",
@@ -140,9 +700,9 @@ function AnimatedHero({ heroData, ArrowRightIcon }) {
140
700
  stroke: "currentColor",
141
701
  strokeWidth: "1",
142
702
  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" })
703
+ /* @__PURE__ */ jsx5("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", ry: "2" }),
704
+ /* @__PURE__ */ jsx5("circle", { cx: "8.5", cy: "8.5", r: "1.5" }),
705
+ /* @__PURE__ */ jsx5("path", { d: "M21 15l-5-5L5 21" })
146
706
  ]
147
707
  }
148
708
  ) })
@@ -151,15 +711,6 @@ function AnimatedHero({ heroData, ArrowRightIcon }) {
151
711
  ] }) });
152
712
  }
153
713
 
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
714
  // src/components/ClientLayout.tsx
164
715
  import { useEffect as useEffect5 } from "react";
165
716
  import { ThemeProvider, useTheme as useTheme2 } from "next-themes";
@@ -414,6 +965,46 @@ function isValidExternalUrl(url) {
414
965
  return false;
415
966
  }
416
967
  }
968
+ function isValidGoogleMapsEmbedUrl(url) {
969
+ if (!url || typeof url !== "string") return false;
970
+ try {
971
+ const parsed = new URL(url);
972
+ const allowedHosts = [
973
+ "www.google.com",
974
+ "google.com",
975
+ "maps.google.com"
976
+ ];
977
+ return parsed.protocol === "https:" && allowedHosts.includes(parsed.hostname) && parsed.pathname.startsWith("/maps/embed");
978
+ } catch {
979
+ return false;
980
+ }
981
+ }
982
+ function sanitizeUrl(url) {
983
+ if (isValidExternalUrl(url)) {
984
+ return url;
985
+ }
986
+ return void 0;
987
+ }
988
+ function isValidEmail(email) {
989
+ if (!email || typeof email !== "string") return false;
990
+ const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
991
+ return emailPattern.test(email) && email.length <= 254;
992
+ }
993
+ function escapeHtml(text) {
994
+ const htmlEntities = {
995
+ "&": "&amp;",
996
+ "<": "&lt;",
997
+ ">": "&gt;",
998
+ '"': "&quot;",
999
+ "'": "&#39;"
1000
+ };
1001
+ return text.replace(/[&<>"']/g, (char) => htmlEntities[char]);
1002
+ }
1003
+ function isValidSlug(slug) {
1004
+ if (!slug || typeof slug !== "string") return false;
1005
+ const slugPattern = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
1006
+ return slugPattern.test(slug) && slug.length <= 200;
1007
+ }
417
1008
 
418
1009
  // src/components/Footer.tsx
419
1010
  import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
@@ -504,11 +1095,119 @@ function ContactCTA() {
504
1095
  /* @__PURE__ */ jsx10(Link4, { href: "/contact", className: styles6.ctaButton, children: "Contact Us" })
505
1096
  ] }) });
506
1097
  }
1098
+
1099
+ // src/components/HomePage.tsx
1100
+ import { Fragment as Fragment2, jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
1101
+ function HomePage({
1102
+ children,
1103
+ settings = null,
1104
+ header,
1105
+ footer
1106
+ }) {
1107
+ return /* @__PURE__ */ jsxs8(Fragment2, { children: [
1108
+ header ?? /* @__PURE__ */ jsx11(Header, { settings: settings || {} }),
1109
+ /* @__PURE__ */ jsx11("main", { children }),
1110
+ footer ?? /* @__PURE__ */ jsx11(Footer, { settings: settings || {} })
1111
+ ] });
1112
+ }
1113
+
1114
+ // src/config.ts
1115
+ function defineConfig(config) {
1116
+ return config;
1117
+ }
1118
+
1119
+ // src/lib/sanity.ts
1120
+ import { createClient } from "next-sanity";
1121
+ import imageUrlBuilder from "@sanity/image-url";
1122
+ var projectId = process.env.NEXT_PUBLIC_SANITY_PROJECT_ID;
1123
+ var dataset = process.env.NEXT_PUBLIC_SANITY_DATASET || "production";
1124
+ var apiVersion = "2023-05-03";
1125
+ var _client = null;
1126
+ function getClient() {
1127
+ if (!_client) {
1128
+ if (!projectId) {
1129
+ throw new Error(
1130
+ "Sanity Project ID is not defined. Please set NEXT_PUBLIC_SANITY_PROJECT_ID in your environment."
1131
+ );
1132
+ }
1133
+ _client = createClient({
1134
+ projectId,
1135
+ dataset,
1136
+ apiVersion,
1137
+ useCdn: process.env.NODE_ENV === "production"
1138
+ });
1139
+ }
1140
+ return _client;
1141
+ }
1142
+ var client = {
1143
+ get projectId() {
1144
+ return projectId;
1145
+ },
1146
+ get dataset() {
1147
+ return dataset;
1148
+ },
1149
+ fetch: (...args) => getClient().fetch(...args)
1150
+ };
1151
+ var _builder = null;
1152
+ function urlFor(source) {
1153
+ if (!_builder) {
1154
+ if (!projectId) {
1155
+ return {
1156
+ width: () => ({ height: () => ({ url: () => "" }), url: () => "" }),
1157
+ height: () => ({ width: () => ({ url: () => "" }), url: () => "" }),
1158
+ url: () => ""
1159
+ };
1160
+ }
1161
+ _builder = imageUrlBuilder({ projectId, dataset });
1162
+ }
1163
+ return _builder.image(source);
1164
+ }
507
1165
  export {
1166
+ AnimatedCard,
1167
+ AnimatedGalleryGrid,
1168
+ AnimatedGalleryHeader,
1169
+ AnimatedGrid,
1170
+ AnimatedHeader,
508
1171
  AnimatedHero,
1172
+ AnimatedHeroContent,
1173
+ AnimatedImage,
1174
+ AnimatedItem,
1175
+ AnimatedList,
1176
+ AnimatedMain,
1177
+ AnimatedPage,
1178
+ AnimatedSection,
1179
+ AnimatedSectionHeader,
1180
+ AnimatedStats,
509
1181
  ClientLayout,
510
1182
  ContactCTA,
511
1183
  Footer,
512
1184
  Header,
513
- ThemeToggle
1185
+ HomePage,
1186
+ ScrollRevealSection,
1187
+ StaggeredGrid,
1188
+ ThemeToggle,
1189
+ cardHover,
1190
+ client,
1191
+ defineConfig,
1192
+ escapeHtml,
1193
+ fadeIn,
1194
+ fadeInUp,
1195
+ fadeInUpShort,
1196
+ getClient,
1197
+ imageZoom,
1198
+ isValidEmail,
1199
+ isValidExternalUrl,
1200
+ isValidGoogleMapsEmbedUrl,
1201
+ isValidSlug,
1202
+ pageTransition,
1203
+ reducedMotion,
1204
+ sanitizeUrl,
1205
+ scaleIn,
1206
+ scrollReveal,
1207
+ slideInLeft,
1208
+ slideInRight,
1209
+ staggerContainer,
1210
+ staggerItem,
1211
+ urlFor,
1212
+ viewportSettings
514
1213
  };