@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/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 "@/context/ThemeContext";
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 { theme, toggleTheme } = useTheme();
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 ${theme === "light" ? "dark" : "light"} mode`,
127
- children: /* @__PURE__ */ jsx2("span", { className: "material-symbols-outlined", children: theme === "light" ? "dark_mode" : "light_mode" })
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
- ThemeToggle
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 };
@@ -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
+ });