@prosophia/lab-techy 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/Footer.module.css +147 -0
- package/dist/Header.module.css +147 -0
- package/dist/ThemeToggle.module.css +34 -0
- package/dist/index-CSdV51Jq.d.mts +26 -0
- package/dist/index-CSdV51Jq.d.ts +26 -0
- package/dist/index.d.mts +296 -0
- package/dist/index.d.ts +296 -0
- package/dist/index.js +269 -6
- package/dist/index.mjs +250 -5
- package/dist/layouts/index.d.mts +13 -0
- package/dist/layouts/index.d.ts +13 -0
- package/dist/layouts/index.js +274 -0
- package/dist/layouts/index.mjs +238 -0
- package/dist/schemas/index.d.mts +461 -0
- package/dist/schemas/index.d.ts +461 -0
- package/dist/schemas/index.js +1318 -0
- package/dist/schemas/index.mjs +1278 -0
- package/package.json +16 -2
package/dist/index.mjs
CHANGED
|
@@ -111,11 +111,14 @@ import styles3 from "./Header.module.css";
|
|
|
111
111
|
|
|
112
112
|
// src/components/ThemeToggle.tsx
|
|
113
113
|
import { motion as motion2 } from "framer-motion";
|
|
114
|
-
import { useTheme } from "
|
|
114
|
+
import { useTheme } from "next-themes";
|
|
115
115
|
import styles2 from "./ThemeToggle.module.css";
|
|
116
116
|
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
117
117
|
function ThemeToggle() {
|
|
118
|
-
const {
|
|
118
|
+
const { resolvedTheme, setTheme } = useTheme();
|
|
119
|
+
const toggleTheme = () => {
|
|
120
|
+
setTheme(resolvedTheme === "light" ? "dark" : "light");
|
|
121
|
+
};
|
|
119
122
|
return /* @__PURE__ */ jsx2(
|
|
120
123
|
motion2.button,
|
|
121
124
|
{
|
|
@@ -123,8 +126,8 @@ function ThemeToggle() {
|
|
|
123
126
|
onClick: toggleTheme,
|
|
124
127
|
whileHover: { scale: 1.05 },
|
|
125
128
|
whileTap: { scale: 0.95 },
|
|
126
|
-
"aria-label": `Switch to ${
|
|
127
|
-
children: /* @__PURE__ */ jsx2("span", { className: "material-symbols-outlined", children:
|
|
129
|
+
"aria-label": `Switch to ${resolvedTheme === "light" ? "dark" : "light"} mode`,
|
|
130
|
+
children: /* @__PURE__ */ jsx2("span", { className: "material-symbols-outlined", children: resolvedTheme === "light" ? "dark_mode" : "light_mode" })
|
|
128
131
|
}
|
|
129
132
|
);
|
|
130
133
|
}
|
|
@@ -184,8 +187,250 @@ function Header({ navigationData }) {
|
|
|
184
187
|
}
|
|
185
188
|
);
|
|
186
189
|
}
|
|
190
|
+
|
|
191
|
+
// src/components/ClientLayout.tsx
|
|
192
|
+
import { useEffect } from "react";
|
|
193
|
+
import { ThemeProvider, useTheme as useTheme2 } from "next-themes";
|
|
194
|
+
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
195
|
+
function ThemeBodySync() {
|
|
196
|
+
const { resolvedTheme } = useTheme2();
|
|
197
|
+
useEffect(() => {
|
|
198
|
+
if (resolvedTheme === "dark") {
|
|
199
|
+
document.body.classList.add("dark-mode");
|
|
200
|
+
document.body.classList.remove("light-mode");
|
|
201
|
+
} else {
|
|
202
|
+
document.body.classList.add("light-mode");
|
|
203
|
+
document.body.classList.remove("dark-mode");
|
|
204
|
+
}
|
|
205
|
+
}, [resolvedTheme]);
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
function ClientLayout({ children, settings }) {
|
|
209
|
+
const navigationData = {
|
|
210
|
+
labName: settings.labName || "Prosophia Research Lab"
|
|
211
|
+
};
|
|
212
|
+
const footerData = {
|
|
213
|
+
labName: settings.labName || "Prosophia Research Lab",
|
|
214
|
+
footerText: settings.footerText
|
|
215
|
+
};
|
|
216
|
+
return /* @__PURE__ */ jsxs3(ThemeProvider, { attribute: "class", defaultTheme: "light", enableSystem: false, children: [
|
|
217
|
+
/* @__PURE__ */ jsx4(ThemeBodySync, {}),
|
|
218
|
+
/* @__PURE__ */ jsxs3("div", { className: "pageWrapper", children: [
|
|
219
|
+
/* @__PURE__ */ jsx4(Header, { navigationData }),
|
|
220
|
+
/* @__PURE__ */ jsx4("main", { children }),
|
|
221
|
+
/* @__PURE__ */ jsx4(Footer, { footerData })
|
|
222
|
+
] })
|
|
223
|
+
] });
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// src/components/HomePage.tsx
|
|
227
|
+
import { Fragment, jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
228
|
+
function HomePage({
|
|
229
|
+
children,
|
|
230
|
+
settings = null,
|
|
231
|
+
navigationData,
|
|
232
|
+
footerData,
|
|
233
|
+
header,
|
|
234
|
+
footer
|
|
235
|
+
}) {
|
|
236
|
+
const navData = navigationData ?? (settings ? {
|
|
237
|
+
labName: settings.labName || "Research Lab"
|
|
238
|
+
} : void 0);
|
|
239
|
+
const ftData = footerData ?? (settings ? {
|
|
240
|
+
labName: settings.labName || "Research Lab",
|
|
241
|
+
footerText: settings.footerText
|
|
242
|
+
} : void 0);
|
|
243
|
+
return /* @__PURE__ */ jsxs4(Fragment, { children: [
|
|
244
|
+
header ?? /* @__PURE__ */ jsx5(Header, { navigationData: navData }),
|
|
245
|
+
/* @__PURE__ */ jsx5("main", { children }),
|
|
246
|
+
footer ?? /* @__PURE__ */ jsx5(Footer, { footerData: ftData })
|
|
247
|
+
] });
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// src/config.ts
|
|
251
|
+
function defineConfig(config) {
|
|
252
|
+
return config;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// src/lib/motion.ts
|
|
256
|
+
var easeOutExpo = [0.16, 1, 0.3, 1];
|
|
257
|
+
var springStiff = {
|
|
258
|
+
type: "spring",
|
|
259
|
+
mass: 1,
|
|
260
|
+
stiffness: 100,
|
|
261
|
+
damping: 15
|
|
262
|
+
};
|
|
263
|
+
var timing = {
|
|
264
|
+
quick: 0.15,
|
|
265
|
+
standard: 0.35,
|
|
266
|
+
ambient: 0.8
|
|
267
|
+
};
|
|
268
|
+
var fadeInUp = {
|
|
269
|
+
hidden: { opacity: 0, y: 20 },
|
|
270
|
+
visible: {
|
|
271
|
+
opacity: 1,
|
|
272
|
+
y: 0,
|
|
273
|
+
transition: {
|
|
274
|
+
duration: timing.standard,
|
|
275
|
+
ease: easeOutExpo
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
var fadeInLeft = {
|
|
280
|
+
hidden: { opacity: 0, x: -20 },
|
|
281
|
+
visible: {
|
|
282
|
+
opacity: 1,
|
|
283
|
+
x: 0,
|
|
284
|
+
transition: {
|
|
285
|
+
duration: timing.standard,
|
|
286
|
+
ease: easeOutExpo
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
var fadeInRight = {
|
|
291
|
+
hidden: { opacity: 0, x: 20 },
|
|
292
|
+
visible: {
|
|
293
|
+
opacity: 1,
|
|
294
|
+
x: 0,
|
|
295
|
+
transition: {
|
|
296
|
+
duration: timing.standard,
|
|
297
|
+
ease: easeOutExpo
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
var scaleUp = {
|
|
302
|
+
hidden: { opacity: 0, scale: 0.95 },
|
|
303
|
+
visible: {
|
|
304
|
+
opacity: 1,
|
|
305
|
+
scale: 1,
|
|
306
|
+
transition: {
|
|
307
|
+
duration: timing.standard,
|
|
308
|
+
ease: easeOutExpo
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
var staggerContainer = {
|
|
313
|
+
hidden: { opacity: 0 },
|
|
314
|
+
visible: {
|
|
315
|
+
opacity: 1,
|
|
316
|
+
transition: {
|
|
317
|
+
staggerChildren: 0.05,
|
|
318
|
+
delayChildren: 0.1
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
var staggerItem = {
|
|
323
|
+
hidden: { opacity: 0, y: 20 },
|
|
324
|
+
visible: {
|
|
325
|
+
opacity: 1,
|
|
326
|
+
y: 0,
|
|
327
|
+
transition: {
|
|
328
|
+
duration: timing.standard,
|
|
329
|
+
ease: easeOutExpo
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
var cardHover = {
|
|
334
|
+
rest: {
|
|
335
|
+
y: 0,
|
|
336
|
+
boxShadow: "0 1px 2px 0 rgb(0 0 0 / 0.05)",
|
|
337
|
+
transition: {
|
|
338
|
+
duration: timing.quick,
|
|
339
|
+
ease: easeOutExpo
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
hover: {
|
|
343
|
+
y: -4,
|
|
344
|
+
boxShadow: "0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)",
|
|
345
|
+
transition: {
|
|
346
|
+
duration: timing.quick,
|
|
347
|
+
ease: easeOutExpo
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
var imageZoom = {
|
|
352
|
+
rest: {
|
|
353
|
+
scale: 1,
|
|
354
|
+
transition: {
|
|
355
|
+
duration: timing.ambient,
|
|
356
|
+
ease: easeOutExpo
|
|
357
|
+
}
|
|
358
|
+
},
|
|
359
|
+
hover: {
|
|
360
|
+
scale: 1.05,
|
|
361
|
+
transition: {
|
|
362
|
+
duration: timing.ambient,
|
|
363
|
+
ease: easeOutExpo
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
};
|
|
367
|
+
var buttonPress = {
|
|
368
|
+
tap: { scale: 0.95 },
|
|
369
|
+
hover: { scale: 1.02 }
|
|
370
|
+
};
|
|
371
|
+
var pageTransition = {
|
|
372
|
+
hidden: { opacity: 0 },
|
|
373
|
+
visible: {
|
|
374
|
+
opacity: 1,
|
|
375
|
+
transition: {
|
|
376
|
+
duration: timing.standard,
|
|
377
|
+
ease: easeOutExpo
|
|
378
|
+
}
|
|
379
|
+
},
|
|
380
|
+
exit: {
|
|
381
|
+
opacity: 0,
|
|
382
|
+
transition: {
|
|
383
|
+
duration: timing.quick,
|
|
384
|
+
ease: easeOutExpo
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
var revealRight = {
|
|
389
|
+
hidden: {
|
|
390
|
+
clipPath: "inset(0 100% 0 0)"
|
|
391
|
+
},
|
|
392
|
+
visible: {
|
|
393
|
+
clipPath: "inset(0 0% 0 0)",
|
|
394
|
+
transition: {
|
|
395
|
+
duration: timing.ambient,
|
|
396
|
+
ease: easeOutExpo
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
};
|
|
400
|
+
var blurFade = {
|
|
401
|
+
hidden: {
|
|
402
|
+
opacity: 0,
|
|
403
|
+
filter: "blur(10px)"
|
|
404
|
+
},
|
|
405
|
+
visible: {
|
|
406
|
+
opacity: 1,
|
|
407
|
+
filter: "blur(0px)",
|
|
408
|
+
transition: {
|
|
409
|
+
duration: timing.standard,
|
|
410
|
+
ease: easeOutExpo
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
};
|
|
187
414
|
export {
|
|
415
|
+
ClientLayout,
|
|
188
416
|
Footer,
|
|
189
417
|
Header,
|
|
190
|
-
|
|
418
|
+
HomePage,
|
|
419
|
+
ThemeToggle,
|
|
420
|
+
blurFade,
|
|
421
|
+
buttonPress,
|
|
422
|
+
cardHover,
|
|
423
|
+
defineConfig,
|
|
424
|
+
easeOutExpo,
|
|
425
|
+
fadeInLeft,
|
|
426
|
+
fadeInRight,
|
|
427
|
+
fadeInUp,
|
|
428
|
+
imageZoom,
|
|
429
|
+
pageTransition,
|
|
430
|
+
revealRight,
|
|
431
|
+
scaleUp,
|
|
432
|
+
springStiff,
|
|
433
|
+
staggerContainer,
|
|
434
|
+
staggerItem,
|
|
435
|
+
timing
|
|
191
436
|
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { S as SiteSettings } from '../index-CSdV51Jq.mjs';
|
|
3
|
+
|
|
4
|
+
interface RootLayoutProps {
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
settings?: SiteSettings | null;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Root layout component that wraps the application
|
|
10
|
+
*/
|
|
11
|
+
declare function RootLayout({ children, settings, }: RootLayoutProps): react_jsx_runtime.JSX.Element;
|
|
12
|
+
|
|
13
|
+
export { RootLayout, type RootLayoutProps };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { S as SiteSettings } from '../index-CSdV51Jq.js';
|
|
3
|
+
|
|
4
|
+
interface RootLayoutProps {
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
settings?: SiteSettings | null;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Root layout component that wraps the application
|
|
10
|
+
*/
|
|
11
|
+
declare function RootLayout({ children, settings, }: RootLayoutProps): react_jsx_runtime.JSX.Element;
|
|
12
|
+
|
|
13
|
+
export { RootLayout, type RootLayoutProps };
|
package/dist/layouts/index.js
CHANGED
|
@@ -1 +1,275 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/layouts/index.ts
|
|
31
|
+
var layouts_exports = {};
|
|
32
|
+
__export(layouts_exports, {
|
|
33
|
+
RootLayout: () => RootLayout
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(layouts_exports);
|
|
36
|
+
|
|
37
|
+
// src/components/ClientLayout.tsx
|
|
38
|
+
var import_react = require("react");
|
|
39
|
+
var import_next_themes2 = require("next-themes");
|
|
40
|
+
|
|
41
|
+
// src/components/Header.tsx
|
|
42
|
+
var import_link = __toESM(require("next/link"));
|
|
43
|
+
var import_navigation = require("next/navigation");
|
|
44
|
+
var import_framer_motion2 = require("framer-motion");
|
|
45
|
+
var import_Header = __toESM(require("./Header.module.css"));
|
|
46
|
+
|
|
47
|
+
// src/components/ThemeToggle.tsx
|
|
48
|
+
var import_framer_motion = require("framer-motion");
|
|
49
|
+
var import_next_themes = require("next-themes");
|
|
50
|
+
var import_ThemeToggle = __toESM(require("./ThemeToggle.module.css"));
|
|
51
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
52
|
+
function ThemeToggle() {
|
|
53
|
+
const { resolvedTheme, setTheme } = (0, import_next_themes.useTheme)();
|
|
54
|
+
const toggleTheme = () => {
|
|
55
|
+
setTheme(resolvedTheme === "light" ? "dark" : "light");
|
|
56
|
+
};
|
|
57
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
58
|
+
import_framer_motion.motion.button,
|
|
59
|
+
{
|
|
60
|
+
className: import_ThemeToggle.default.toggle,
|
|
61
|
+
onClick: toggleTheme,
|
|
62
|
+
whileHover: { scale: 1.05 },
|
|
63
|
+
whileTap: { scale: 0.95 },
|
|
64
|
+
"aria-label": `Switch to ${resolvedTheme === "light" ? "dark" : "light"} mode`,
|
|
65
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "material-symbols-outlined", children: resolvedTheme === "light" ? "dark_mode" : "light_mode" })
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// src/components/Header.tsx
|
|
71
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
72
|
+
var defaultNavItems = [
|
|
73
|
+
{ href: "/", label: "Home" },
|
|
74
|
+
{ href: "/gallery", label: "Gallery" },
|
|
75
|
+
{ href: "/team", label: "Team" },
|
|
76
|
+
{ href: "/publications", label: "Publications" },
|
|
77
|
+
{ href: "/news", label: "News" },
|
|
78
|
+
{ href: "/contact", label: "Contact" }
|
|
79
|
+
];
|
|
80
|
+
function Header({ navigationData }) {
|
|
81
|
+
const pathname = (0, import_navigation.usePathname)();
|
|
82
|
+
const labName = navigationData?.labName || "Prosophia Research Lab";
|
|
83
|
+
const navItems = navigationData?.mainNavigation?.length ? navigationData.mainNavigation : defaultNavItems;
|
|
84
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
85
|
+
import_framer_motion2.motion.header,
|
|
86
|
+
{
|
|
87
|
+
className: import_Header.default.header,
|
|
88
|
+
initial: { y: -100, opacity: 0 },
|
|
89
|
+
animate: { y: 0, opacity: 1 },
|
|
90
|
+
transition: { duration: 0.5, ease: [0.16, 1, 0.3, 1] },
|
|
91
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: import_Header.default.container, children: [
|
|
92
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_link.default, { href: "/", className: import_Header.default.logo, children: [
|
|
93
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: import_Header.default.logoIcon, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "material-symbols-outlined", children: "science" }) }),
|
|
94
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h1", { className: import_Header.default.logoText, children: labName })
|
|
95
|
+
] }),
|
|
96
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("nav", { className: import_Header.default.nav, children: [
|
|
97
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: import_Header.default.navLinks, children: navItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
98
|
+
import_link.default,
|
|
99
|
+
{
|
|
100
|
+
href: item.href,
|
|
101
|
+
className: `${import_Header.default.navLink} ${pathname === item.href ? import_Header.default.navLinkActive : ""}`,
|
|
102
|
+
children: item.label
|
|
103
|
+
},
|
|
104
|
+
item.href
|
|
105
|
+
)) }),
|
|
106
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ThemeToggle, {}),
|
|
107
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_link.default, { href: "/contact", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
108
|
+
import_framer_motion2.motion.button,
|
|
109
|
+
{
|
|
110
|
+
className: import_Header.default.ctaButton,
|
|
111
|
+
whileHover: { scale: 1.02 },
|
|
112
|
+
whileTap: { scale: 0.98 },
|
|
113
|
+
children: "Join the Lab"
|
|
114
|
+
}
|
|
115
|
+
) })
|
|
116
|
+
] }),
|
|
117
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: import_Header.default.mobileActions, children: [
|
|
118
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ThemeToggle, {}),
|
|
119
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { className: import_Header.default.mobileMenuBtn, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "material-symbols-outlined", children: "menu" }) })
|
|
120
|
+
] })
|
|
121
|
+
] })
|
|
122
|
+
}
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// src/components/Footer.tsx
|
|
127
|
+
var import_link2 = __toESM(require("next/link"));
|
|
128
|
+
var import_framer_motion3 = require("framer-motion");
|
|
129
|
+
var import_Footer = __toESM(require("./Footer.module.css"));
|
|
130
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
131
|
+
var footerVariants = {
|
|
132
|
+
hidden: { opacity: 0, y: 20 },
|
|
133
|
+
visible: {
|
|
134
|
+
opacity: 1,
|
|
135
|
+
y: 0,
|
|
136
|
+
transition: {
|
|
137
|
+
duration: 0.6,
|
|
138
|
+
ease: [0.16, 1, 0.3, 1]
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
function getSocialIcon(platform) {
|
|
143
|
+
switch (platform) {
|
|
144
|
+
case "twitter":
|
|
145
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: import_Footer.default.socialIcon, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M8.29 20.251c7.547 0 11.675-6.253 11.675-11.675 0-.178 0-.355-.012-.53A8.348 8.348 0 0022 5.92a8.19 8.19 0 01-2.357.646 4.118 4.118 0 001.804-2.27 8.224 8.224 0 01-2.605.996 4.107 4.107 0 00-6.993 3.743 11.65 11.65 0 01-8.457-4.287 4.106 4.106 0 001.27 5.477A4.072 4.072 0 012.8 9.713v.052a4.105 4.105 0 003.292 4.022 4.095 4.095 0 01-1.853.07 4.108 4.108 0 003.834 2.85A8.233 8.233 0 012 18.407a11.616 11.616 0 006.29 1.84" }) });
|
|
146
|
+
case "github":
|
|
147
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: import_Footer.default.socialIcon, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" }) });
|
|
148
|
+
case "linkedin":
|
|
149
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: import_Footer.default.socialIcon, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { fillRule: "evenodd", clipRule: "evenodd", 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" }) });
|
|
150
|
+
case "youtube":
|
|
151
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: import_Footer.default.socialIcon, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z" }) });
|
|
152
|
+
case "scholar":
|
|
153
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: import_Footer.default.socialIcon, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M5.242 13.769L0 9.5 12 0l12 9.5-5.242 4.269C17.548 11.249 14.978 9.5 12 9.5c-2.977 0-5.548 1.748-6.758 4.269zM12 10a7 7 0 1 0 0 14 7 7 0 0 0 0-14z" }) });
|
|
154
|
+
default:
|
|
155
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("svg", { "aria-hidden": "true", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", strokeWidth: "2", className: import_Footer.default.socialIcon, children: [
|
|
156
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("circle", { cx: "12", cy: "12", r: "10" }),
|
|
157
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "2", y1: "12", x2: "22", y2: "12" }),
|
|
158
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" })
|
|
159
|
+
] });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
var defaultSocialLinks = [
|
|
163
|
+
{ platform: "twitter", url: "#" },
|
|
164
|
+
{ platform: "github", url: "#" },
|
|
165
|
+
{ platform: "linkedin", url: "#" }
|
|
166
|
+
];
|
|
167
|
+
function Footer({ footerData }) {
|
|
168
|
+
const labName = footerData?.labName || "Prosophia Research Lab";
|
|
169
|
+
const footerText = footerData?.footerText || "Advancing the frontiers of human-computer interaction through interdisciplinary research and innovation.";
|
|
170
|
+
const socialLinks = footerData?.socialLinks?.length ? footerData.socialLinks : defaultSocialLinks;
|
|
171
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
172
|
+
import_framer_motion3.motion.footer,
|
|
173
|
+
{
|
|
174
|
+
className: import_Footer.default.footer,
|
|
175
|
+
initial: "hidden",
|
|
176
|
+
whileInView: "visible",
|
|
177
|
+
viewport: { once: true },
|
|
178
|
+
variants: footerVariants,
|
|
179
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Footer.default.container, children: [
|
|
180
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Footer.default.grid, children: [
|
|
181
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Footer.default.brandSection, children: [
|
|
182
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Footer.default.logo, children: [
|
|
183
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: import_Footer.default.logoIcon, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "material-symbols-outlined", children: "science" }) }),
|
|
184
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h2", { className: import_Footer.default.logoText, children: labName })
|
|
185
|
+
] }),
|
|
186
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: import_Footer.default.description, children: footerText }),
|
|
187
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: import_Footer.default.socialLinks, children: socialLinks.map((social, index) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
188
|
+
"a",
|
|
189
|
+
{
|
|
190
|
+
href: social.url,
|
|
191
|
+
className: import_Footer.default.socialLink,
|
|
192
|
+
"aria-label": social.platform,
|
|
193
|
+
target: "_blank",
|
|
194
|
+
rel: "noopener noreferrer",
|
|
195
|
+
children: getSocialIcon(social.platform)
|
|
196
|
+
},
|
|
197
|
+
index
|
|
198
|
+
)) })
|
|
199
|
+
] }),
|
|
200
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Footer.default.linksSection, children: [
|
|
201
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h3", { className: import_Footer.default.linksSectionTitle, children: "Research" }),
|
|
202
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("ul", { className: import_Footer.default.linksList, children: [
|
|
203
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/research", className: import_Footer.default.link, children: "Projects" }) }),
|
|
204
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/publications", className: import_Footer.default.link, children: "Publications" }) }),
|
|
205
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/publications", className: import_Footer.default.link, children: "Datasets" }) }),
|
|
206
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/publications", className: import_Footer.default.link, children: "Code" }) })
|
|
207
|
+
] })
|
|
208
|
+
] }),
|
|
209
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Footer.default.linksSection, children: [
|
|
210
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h3", { className: import_Footer.default.linksSectionTitle, children: "People" }),
|
|
211
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("ul", { className: import_Footer.default.linksList, children: [
|
|
212
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/team", className: import_Footer.default.link, children: "Faculty" }) }),
|
|
213
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/team", className: import_Footer.default.link, children: "Students" }) }),
|
|
214
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/team", className: import_Footer.default.link, children: "Alumni" }) }),
|
|
215
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/contact", className: import_Footer.default.link, children: "Join Us" }) })
|
|
216
|
+
] })
|
|
217
|
+
] })
|
|
218
|
+
] }),
|
|
219
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: import_Footer.default.bottom, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("p", { className: import_Footer.default.copyright, children: [
|
|
220
|
+
"\xA9 ",
|
|
221
|
+
(/* @__PURE__ */ new Date()).getFullYear(),
|
|
222
|
+
" ",
|
|
223
|
+
labName,
|
|
224
|
+
". All rights reserved."
|
|
225
|
+
] }) })
|
|
226
|
+
] })
|
|
227
|
+
}
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// src/components/ClientLayout.tsx
|
|
232
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
233
|
+
function ThemeBodySync() {
|
|
234
|
+
const { resolvedTheme } = (0, import_next_themes2.useTheme)();
|
|
235
|
+
(0, import_react.useEffect)(() => {
|
|
236
|
+
if (resolvedTheme === "dark") {
|
|
237
|
+
document.body.classList.add("dark-mode");
|
|
238
|
+
document.body.classList.remove("light-mode");
|
|
239
|
+
} else {
|
|
240
|
+
document.body.classList.add("light-mode");
|
|
241
|
+
document.body.classList.remove("dark-mode");
|
|
242
|
+
}
|
|
243
|
+
}, [resolvedTheme]);
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
function ClientLayout({ children, settings }) {
|
|
247
|
+
const navigationData = {
|
|
248
|
+
labName: settings.labName || "Prosophia Research Lab"
|
|
249
|
+
};
|
|
250
|
+
const footerData = {
|
|
251
|
+
labName: settings.labName || "Prosophia Research Lab",
|
|
252
|
+
footerText: settings.footerText
|
|
253
|
+
};
|
|
254
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_next_themes2.ThemeProvider, { attribute: "class", defaultTheme: "light", enableSystem: false, children: [
|
|
255
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ThemeBodySync, {}),
|
|
256
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "pageWrapper", children: [
|
|
257
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Header, { navigationData }),
|
|
258
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("main", { children }),
|
|
259
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Footer, { footerData })
|
|
260
|
+
] })
|
|
261
|
+
] });
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// src/layouts/RootLayout.tsx
|
|
265
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
266
|
+
function RootLayout({
|
|
267
|
+
children,
|
|
268
|
+
settings = null
|
|
269
|
+
}) {
|
|
270
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ClientLayout, { settings: settings || {}, children });
|
|
271
|
+
}
|
|
272
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
273
|
+
0 && (module.exports = {
|
|
274
|
+
RootLayout
|
|
275
|
+
});
|