@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/BookPage.module.css +314 -0
- package/dist/ContactCTA.module.css +99 -0
- package/dist/ContactPage.module.css +259 -0
- package/dist/Footer.module.css +240 -0
- package/dist/HomePage.module.css +879 -0
- package/dist/Layout.module.css +368 -0
- package/dist/LegalPage.module.css +239 -0
- package/dist/NewsArticlePage.module.css +214 -0
- package/dist/NewsPage.module.css +189 -0
- package/dist/PastMembersPage.module.css +236 -0
- package/dist/PeoplePage.module.css +465 -0
- package/dist/PicturesPage.module.css +196 -0
- package/dist/PublicationDetailPage.module.css +213 -0
- package/dist/PublicationsPage.module.css +181 -0
- package/dist/ResearchPage.module.css +173 -0
- package/dist/ThemeToggle.module.css +114 -0
- package/dist/index-CSdV51Jq.d.mts +26 -0
- package/dist/index-CSdV51Jq.d.ts +26 -0
- package/dist/index.d.mts +279 -0
- package/dist/index.d.ts +279 -0
- package/dist/index.js +780 -40
- package/dist/index.mjs +730 -31
- package/dist/layouts/index.d.mts +13 -0
- package/dist/layouts/index.d.ts +13 -0
- package/dist/layouts/index.js +380 -0
- package/dist/layouts/index.mjs +344 -0
- package/dist/schemas/index.d.mts +182 -0
- package/dist/schemas/index.d.ts +182 -0
- package/dist/schemas/index.js +1025 -0
- package/dist/schemas/index.mjs +987 -0
- package/package.json +14 -3
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
|
|
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
|
|
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__ */
|
|
609
|
+
return /* @__PURE__ */ jsx5("section", { className: styles2.heroSection, ref, children: /* @__PURE__ */ jsxs2("div", { className: styles2.heroContainer, children: [
|
|
50
610
|
/* @__PURE__ */ jsxs2(
|
|
51
|
-
|
|
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__ */
|
|
59
|
-
|
|
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
|
-
|
|
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__ */
|
|
638
|
+
/* @__PURE__ */ jsx5("span", { className: styles2.heroHeadingAccent, children: heroData.headingAccent })
|
|
79
639
|
]
|
|
80
640
|
}
|
|
81
641
|
),
|
|
82
|
-
/* @__PURE__ */
|
|
83
|
-
|
|
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
|
-
|
|
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__ */
|
|
662
|
+
/* @__PURE__ */ jsx5(ArrowRightIcon, {})
|
|
103
663
|
] }),
|
|
104
|
-
/* @__PURE__ */
|
|
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__ */
|
|
112
|
-
|
|
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__ */
|
|
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__ */
|
|
133
|
-
] }) : /* @__PURE__ */
|
|
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__ */
|
|
144
|
-
/* @__PURE__ */
|
|
145
|
-
/* @__PURE__ */
|
|
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
|
+
"&": "&",
|
|
996
|
+
"<": "<",
|
|
997
|
+
">": ">",
|
|
998
|
+
'"': """,
|
|
999
|
+
"'": "'"
|
|
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
|
-
|
|
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
|
};
|