@prosophia/lab-classic 0.0.2 → 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/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.css +1587 -0
- package/dist/index.d.mts +279 -0
- package/dist/index.d.ts +279 -0
- package/dist/index.js +854 -94
- package/dist/index.mjs +805 -86
- package/dist/layouts/index.css +594 -0
- package/dist/layouts/index.d.mts +13 -0
- package/dist/layouts/index.d.ts +13 -0
- package/dist/layouts/index.js +389 -0
- package/dist/layouts/index.mjs +352 -0
- package/dist/schemas/index.d.mts +182 -0
- package/dist/schemas/index.d.ts +182 -0
- package/dist/schemas/index.js +1026 -0
- package/dist/schemas/index.mjs +987 -0
- package/dist/styles/globals.css +1169 -0
- package/package.json +24 -9
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
|
-
|
|
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
|
|
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
|
-
|
|
44
|
-
|
|
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__ */
|
|
617
|
+
return /* @__PURE__ */ jsx5("section", { className: HomePage_default.heroSection, ref, children: /* @__PURE__ */ jsxs2("div", { className: HomePage_default.heroContainer, children: [
|
|
50
618
|
/* @__PURE__ */ jsxs2(
|
|
51
|
-
|
|
619
|
+
motion5.div,
|
|
52
620
|
{
|
|
53
|
-
className:
|
|
621
|
+
className: HomePage_default.heroContent,
|
|
54
622
|
initial: "hidden",
|
|
55
623
|
animate: "visible",
|
|
56
624
|
variants: fadeInUp,
|
|
57
625
|
children: [
|
|
58
|
-
/* @__PURE__ */
|
|
59
|
-
|
|
626
|
+
/* @__PURE__ */ jsx5(
|
|
627
|
+
motion5.span,
|
|
60
628
|
{
|
|
61
|
-
className:
|
|
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
|
-
|
|
637
|
+
motion5.h1,
|
|
70
638
|
{
|
|
71
|
-
className:
|
|
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__ */
|
|
646
|
+
/* @__PURE__ */ jsx5("span", { className: HomePage_default.heroHeadingAccent, children: heroData.headingAccent })
|
|
79
647
|
]
|
|
80
648
|
}
|
|
81
649
|
),
|
|
82
|
-
/* @__PURE__ */
|
|
83
|
-
|
|
650
|
+
/* @__PURE__ */ jsx5(
|
|
651
|
+
motion5.p,
|
|
84
652
|
{
|
|
85
|
-
className:
|
|
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
|
-
|
|
661
|
+
motion5.div,
|
|
94
662
|
{
|
|
95
|
-
className:
|
|
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:
|
|
668
|
+
/* @__PURE__ */ jsxs2(Link, { href: heroData.ctaLink, className: HomePage_default.heroPrimaryCta, children: [
|
|
101
669
|
heroData.ctaText,
|
|
102
|
-
/* @__PURE__ */
|
|
670
|
+
/* @__PURE__ */ jsx5(ArrowRightIcon, {})
|
|
103
671
|
] }),
|
|
104
|
-
/* @__PURE__ */
|
|
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__ */
|
|
112
|
-
|
|
679
|
+
/* @__PURE__ */ jsx5(
|
|
680
|
+
motion5.div,
|
|
113
681
|
{
|
|
114
|
-
className:
|
|
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__ */
|
|
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:
|
|
696
|
+
className: HomePage_default.heroImage,
|
|
129
697
|
priority: true
|
|
130
698
|
}
|
|
131
699
|
),
|
|
132
|
-
/* @__PURE__ */
|
|
133
|
-
] }) : /* @__PURE__ */
|
|
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__ */
|
|
144
|
-
/* @__PURE__ */
|
|
145
|
-
/* @__PURE__ */
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
200
|
-
/* @__PURE__ */ jsx6("span", { className: `${
|
|
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:
|
|
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: `${
|
|
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: `${
|
|
272
|
-
/* @__PURE__ */ jsxs4(Link2, { href: "/", className:
|
|
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:
|
|
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:
|
|
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: `${
|
|
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:
|
|
898
|
+
/* @__PURE__ */ jsxs4("div", { className: Layout_default.navActions, children: [
|
|
334
899
|
/* @__PURE__ */ jsx7(ThemeToggle, {}),
|
|
335
|
-
/* @__PURE__ */ jsx7(Link2, { href: "/contact", className:
|
|
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:
|
|
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:
|
|
346
|
-
/* @__PURE__ */ jsx7("span", { className: `${
|
|
347
|
-
/* @__PURE__ */ jsx7("span", { className: `${
|
|
348
|
-
/* @__PURE__ */ jsx7("span", { className: `${
|
|
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: `${
|
|
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:
|
|
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:
|
|
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: `${
|
|
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:
|
|
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
|
-
|
|
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
|
+
"&": "&",
|
|
1012
|
+
"<": "<",
|
|
1013
|
+
">": ">",
|
|
1014
|
+
'"': """,
|
|
1015
|
+
"'": "'"
|
|
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:
|
|
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:
|
|
427
|
-
/* @__PURE__ */ jsxs5("div", { className:
|
|
428
|
-
/* @__PURE__ */ jsxs5("div", { className:
|
|
429
|
-
/* @__PURE__ */ jsxs5(Link3, { href: "/", className:
|
|
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:
|
|
1039
|
+
/* @__PURE__ */ jsx8("span", { className: Footer_default.logoAccent, children: settings?.labNameAccent || "Lab" })
|
|
433
1040
|
] }),
|
|
434
|
-
/* @__PURE__ */ jsx8("p", { className:
|
|
435
|
-
/* @__PURE__ */ jsxs5("div", { className:
|
|
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:
|
|
441
|
-
/* @__PURE__ */ jsxs5("div", { className:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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:
|
|
502
|
-
/* @__PURE__ */ jsx10("h2", { className:
|
|
503
|
-
/* @__PURE__ */ jsx10("p", { className:
|
|
504
|
-
/* @__PURE__ */ jsx10(Link4, { href: "/contact", className:
|
|
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
|
-
|
|
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
|
};
|