@prosophia/lab-techy 0.0.3 → 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.
@@ -0,0 +1,281 @@
1
+ /* src/components/Header.module.css */
2
+ .header {
3
+ position: sticky;
4
+ top: 0;
5
+ z-index: 50;
6
+ width: 100%;
7
+ border-bottom: 1px solid var(--slate-200);
8
+ background-color: rgba(246, 246, 248, 0.8);
9
+ backdrop-filter: blur(12px);
10
+ }
11
+ .container {
12
+ max-width: var(--container-max);
13
+ margin: 0 auto;
14
+ display: flex;
15
+ height: 4rem;
16
+ align-items: center;
17
+ justify-content: space-between;
18
+ padding: 0 1rem;
19
+ }
20
+ @media (min-width: 640px) {
21
+ .container {
22
+ padding: 0 1.5rem;
23
+ }
24
+ }
25
+ @media (min-width: 1024px) {
26
+ .container {
27
+ padding: 0 2rem;
28
+ }
29
+ }
30
+ .logo {
31
+ display: flex;
32
+ align-items: center;
33
+ gap: 1rem;
34
+ text-decoration: none;
35
+ }
36
+ .logoIcon {
37
+ display: flex;
38
+ width: 2rem;
39
+ height: 2rem;
40
+ align-items: center;
41
+ justify-content: center;
42
+ border-radius: var(--radius-sm);
43
+ background-color: var(--primary);
44
+ color: var(--white);
45
+ }
46
+ .logoIcon span {
47
+ font-size: 20px;
48
+ }
49
+ .logoText {
50
+ font-size: 1.125rem;
51
+ font-weight: 700;
52
+ letter-spacing: -0.025em;
53
+ color: var(--slate-900);
54
+ }
55
+ .nav {
56
+ display: none;
57
+ flex: 1;
58
+ align-items: center;
59
+ justify-content: flex-end;
60
+ gap: 2rem;
61
+ }
62
+ @media (min-width: 768px) {
63
+ .nav {
64
+ display: flex;
65
+ }
66
+ }
67
+ .navLinks {
68
+ display: flex;
69
+ align-items: center;
70
+ gap: 1.5rem;
71
+ }
72
+ .navLink {
73
+ font-size: 0.875rem;
74
+ font-weight: 500;
75
+ color: var(--slate-600);
76
+ transition: color var(--timing-quick) var(--ease-out-expo);
77
+ }
78
+ .navLink:hover {
79
+ color: var(--primary);
80
+ }
81
+ .navLinkActive {
82
+ color: var(--primary);
83
+ font-weight: 600;
84
+ }
85
+ .ctaButton {
86
+ display: inline-flex;
87
+ height: 2.25rem;
88
+ align-items: center;
89
+ justify-content: center;
90
+ border-radius: var(--radius-lg);
91
+ background-color: var(--primary);
92
+ padding: 0 1rem;
93
+ font-size: 0.875rem;
94
+ font-weight: 700;
95
+ color: var(--white);
96
+ box-shadow: var(--shadow-sm);
97
+ transition: background-color var(--timing-quick) var(--ease-out-expo);
98
+ }
99
+ .ctaButton:hover {
100
+ background-color: var(--primary-dark);
101
+ }
102
+ .mobileActions {
103
+ display: flex;
104
+ align-items: center;
105
+ gap: 0.5rem;
106
+ }
107
+ @media (min-width: 768px) {
108
+ .mobileActions {
109
+ display: none;
110
+ }
111
+ }
112
+ .mobileMenuBtn {
113
+ display: block;
114
+ padding: 0.5rem;
115
+ color: var(--slate-600);
116
+ }
117
+ [data-theme=dark] .header {
118
+ background-color: rgba(15, 23, 42, 0.9);
119
+ border-bottom-color: var(--slate-200);
120
+ }
121
+ [data-theme=dark] .logoIcon {
122
+ color: var(--slate-900);
123
+ }
124
+ [data-theme=dark] .ctaButton {
125
+ color: var(--slate-900);
126
+ }
127
+
128
+ /* src/components/ThemeToggle.module.css */
129
+ .toggle {
130
+ display: flex;
131
+ align-items: center;
132
+ justify-content: center;
133
+ width: 2.5rem;
134
+ height: 2.5rem;
135
+ border-radius: var(--radius-full);
136
+ background-color: var(--slate-100);
137
+ color: var(--slate-600);
138
+ border: 1px solid var(--slate-200);
139
+ cursor: pointer;
140
+ transition: all var(--timing-quick) var(--ease-out-expo);
141
+ }
142
+ .toggle:hover {
143
+ background-color: var(--slate-200);
144
+ color: var(--primary);
145
+ }
146
+ .toggle span {
147
+ font-size: 1.25rem;
148
+ }
149
+ [data-theme=dark] .toggle {
150
+ background-color: var(--slate-800);
151
+ border-color: var(--slate-700);
152
+ color: var(--slate-300);
153
+ }
154
+ [data-theme=dark] .toggle:hover {
155
+ background-color: var(--slate-700);
156
+ color: var(--primary);
157
+ }
158
+
159
+ /* src/components/Footer.module.css */
160
+ .footer {
161
+ border-top: 1px solid var(--slate-200);
162
+ background-color: var(--white);
163
+ padding: 3rem 0;
164
+ }
165
+ .container {
166
+ max-width: var(--container-max);
167
+ margin: 0 auto;
168
+ padding: 0 1rem;
169
+ }
170
+ @media (min-width: 640px) {
171
+ .container {
172
+ padding: 0 1.5rem;
173
+ }
174
+ }
175
+ @media (min-width: 1024px) {
176
+ .container {
177
+ padding: 0 2rem;
178
+ }
179
+ }
180
+ .grid {
181
+ display: grid;
182
+ gap: 2rem;
183
+ }
184
+ @media (min-width: 768px) {
185
+ .grid {
186
+ grid-template-columns: 2fr 1fr 1fr;
187
+ gap: 3rem;
188
+ }
189
+ }
190
+ .brandSection {
191
+ grid-column: span 1;
192
+ }
193
+ @media (min-width: 768px) {
194
+ .brandSection {
195
+ grid-column: span 1;
196
+ }
197
+ }
198
+ .logo {
199
+ display: flex;
200
+ align-items: center;
201
+ gap: 0.75rem;
202
+ }
203
+ .logoIcon {
204
+ display: flex;
205
+ width: 2rem;
206
+ height: 2rem;
207
+ align-items: center;
208
+ justify-content: center;
209
+ border-radius: var(--radius-sm);
210
+ background-color: var(--primary);
211
+ color: var(--white);
212
+ }
213
+ .logoIcon span {
214
+ font-size: 20px;
215
+ }
216
+ .logoText {
217
+ font-size: 1.25rem;
218
+ font-weight: 700;
219
+ color: var(--slate-900);
220
+ }
221
+ .description {
222
+ margin-top: 1rem;
223
+ max-width: 24rem;
224
+ font-size: 0.875rem;
225
+ color: var(--slate-600);
226
+ line-height: 1.6;
227
+ }
228
+ .socialLinks {
229
+ display: flex;
230
+ gap: 1rem;
231
+ margin-top: 1.5rem;
232
+ }
233
+ .socialLink {
234
+ color: var(--slate-400);
235
+ transition: color var(--timing-quick) var(--ease-out-expo);
236
+ }
237
+ .socialLink:hover {
238
+ color: var(--primary);
239
+ }
240
+ .socialIcon {
241
+ width: 1.25rem;
242
+ height: 1.25rem;
243
+ }
244
+ .linksSection {
245
+ display: flex;
246
+ flex-direction: column;
247
+ }
248
+ .linksSectionTitle {
249
+ font-size: 0.875rem;
250
+ font-weight: 600;
251
+ text-transform: uppercase;
252
+ color: var(--slate-900);
253
+ margin-bottom: 1rem;
254
+ }
255
+ .linksList {
256
+ list-style: none;
257
+ display: flex;
258
+ flex-direction: column;
259
+ gap: 0.75rem;
260
+ }
261
+ .link {
262
+ font-size: 0.875rem;
263
+ color: var(--slate-600);
264
+ transition: color var(--timing-quick) var(--ease-out-expo);
265
+ }
266
+ .link:hover {
267
+ color: var(--primary);
268
+ }
269
+ .bottom {
270
+ margin-top: 3rem;
271
+ padding-top: 2rem;
272
+ border-top: 1px solid var(--slate-200);
273
+ }
274
+ .copyright {
275
+ text-align: center;
276
+ font-size: 0.875rem;
277
+ color: var(--slate-500);
278
+ }
279
+ [data-theme=dark] .logoIcon {
280
+ color: var(--slate-900);
281
+ }
@@ -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,285 @@
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
+
46
+ // src/components/Header.module.css
47
+ var Header_default = {};
48
+
49
+ // src/components/ThemeToggle.tsx
50
+ var import_framer_motion = require("framer-motion");
51
+ var import_next_themes = require("next-themes");
52
+
53
+ // src/components/ThemeToggle.module.css
54
+ var ThemeToggle_default = {};
55
+
56
+ // src/components/ThemeToggle.tsx
57
+ var import_jsx_runtime = require("react/jsx-runtime");
58
+ function ThemeToggle() {
59
+ const { resolvedTheme, setTheme } = (0, import_next_themes.useTheme)();
60
+ const toggleTheme = () => {
61
+ setTheme(resolvedTheme === "light" ? "dark" : "light");
62
+ };
63
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
64
+ import_framer_motion.motion.button,
65
+ {
66
+ className: ThemeToggle_default.toggle,
67
+ onClick: toggleTheme,
68
+ whileHover: { scale: 1.05 },
69
+ whileTap: { scale: 0.95 },
70
+ "aria-label": `Switch to ${resolvedTheme === "light" ? "dark" : "light"} mode`,
71
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "material-symbols-outlined", children: resolvedTheme === "light" ? "dark_mode" : "light_mode" })
72
+ }
73
+ );
74
+ }
75
+
76
+ // src/components/Header.tsx
77
+ var import_jsx_runtime2 = require("react/jsx-runtime");
78
+ var defaultNavItems = [
79
+ { href: "/", label: "Home" },
80
+ { href: "/gallery", label: "Gallery" },
81
+ { href: "/team", label: "Team" },
82
+ { href: "/publications", label: "Publications" },
83
+ { href: "/news", label: "News" },
84
+ { href: "/contact", label: "Contact" }
85
+ ];
86
+ function Header({ navigationData }) {
87
+ const pathname = (0, import_navigation.usePathname)();
88
+ const labName = navigationData?.labName || "Prosophia Research Lab";
89
+ const navItems = navigationData?.mainNavigation?.length ? navigationData.mainNavigation : defaultNavItems;
90
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
91
+ import_framer_motion2.motion.header,
92
+ {
93
+ className: Header_default.header,
94
+ initial: { y: -100, opacity: 0 },
95
+ animate: { y: 0, opacity: 1 },
96
+ transition: { duration: 0.5, ease: [0.16, 1, 0.3, 1] },
97
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: Header_default.container, children: [
98
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_link.default, { href: "/", className: Header_default.logo, children: [
99
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: Header_default.logoIcon, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "material-symbols-outlined", children: "science" }) }),
100
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h1", { className: Header_default.logoText, children: labName })
101
+ ] }),
102
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("nav", { className: Header_default.nav, children: [
103
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: Header_default.navLinks, children: navItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
104
+ import_link.default,
105
+ {
106
+ href: item.href,
107
+ className: `${Header_default.navLink} ${pathname === item.href ? Header_default.navLinkActive : ""}`,
108
+ children: item.label
109
+ },
110
+ item.href
111
+ )) }),
112
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ThemeToggle, {}),
113
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_link.default, { href: "/contact", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
114
+ import_framer_motion2.motion.button,
115
+ {
116
+ className: Header_default.ctaButton,
117
+ whileHover: { scale: 1.02 },
118
+ whileTap: { scale: 0.98 },
119
+ children: "Join the Lab"
120
+ }
121
+ ) })
122
+ ] }),
123
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: Header_default.mobileActions, children: [
124
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ThemeToggle, {}),
125
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { className: Header_default.mobileMenuBtn, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "material-symbols-outlined", children: "menu" }) })
126
+ ] })
127
+ ] })
128
+ }
129
+ );
130
+ }
131
+
132
+ // src/components/Footer.tsx
133
+ var import_link2 = __toESM(require("next/link"));
134
+ var import_framer_motion3 = require("framer-motion");
135
+
136
+ // src/components/Footer.module.css
137
+ var Footer_default = {};
138
+
139
+ // src/components/Footer.tsx
140
+ var import_jsx_runtime3 = require("react/jsx-runtime");
141
+ var footerVariants = {
142
+ hidden: { opacity: 0, y: 20 },
143
+ visible: {
144
+ opacity: 1,
145
+ y: 0,
146
+ transition: {
147
+ duration: 0.6,
148
+ ease: [0.16, 1, 0.3, 1]
149
+ }
150
+ }
151
+ };
152
+ function getSocialIcon(platform) {
153
+ switch (platform) {
154
+ case "twitter":
155
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: 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" }) });
156
+ case "github":
157
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: 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" }) });
158
+ case "linkedin":
159
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: 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" }) });
160
+ case "youtube":
161
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: 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" }) });
162
+ case "scholar":
163
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: 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" }) });
164
+ default:
165
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("svg", { "aria-hidden": "true", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", strokeWidth: "2", className: Footer_default.socialIcon, children: [
166
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("circle", { cx: "12", cy: "12", r: "10" }),
167
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "2", y1: "12", x2: "22", y2: "12" }),
168
+ /* @__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" })
169
+ ] });
170
+ }
171
+ }
172
+ var defaultSocialLinks = [
173
+ { platform: "twitter", url: "#" },
174
+ { platform: "github", url: "#" },
175
+ { platform: "linkedin", url: "#" }
176
+ ];
177
+ function Footer({ footerData }) {
178
+ const labName = footerData?.labName || "Prosophia Research Lab";
179
+ const footerText = footerData?.footerText || "Advancing the frontiers of human-computer interaction through interdisciplinary research and innovation.";
180
+ const socialLinks = footerData?.socialLinks?.length ? footerData.socialLinks : defaultSocialLinks;
181
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
182
+ import_framer_motion3.motion.footer,
183
+ {
184
+ className: Footer_default.footer,
185
+ initial: "hidden",
186
+ whileInView: "visible",
187
+ viewport: { once: true },
188
+ variants: footerVariants,
189
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: Footer_default.container, children: [
190
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: Footer_default.grid, children: [
191
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: Footer_default.brandSection, children: [
192
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: Footer_default.logo, children: [
193
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: Footer_default.logoIcon, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "material-symbols-outlined", children: "science" }) }),
194
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h2", { className: Footer_default.logoText, children: labName })
195
+ ] }),
196
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: Footer_default.description, children: footerText }),
197
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: Footer_default.socialLinks, children: socialLinks.map((social, index) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
198
+ "a",
199
+ {
200
+ href: social.url,
201
+ className: Footer_default.socialLink,
202
+ "aria-label": social.platform,
203
+ target: "_blank",
204
+ rel: "noopener noreferrer",
205
+ children: getSocialIcon(social.platform)
206
+ },
207
+ index
208
+ )) })
209
+ ] }),
210
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: Footer_default.linksSection, children: [
211
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h3", { className: Footer_default.linksSectionTitle, children: "Research" }),
212
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("ul", { className: Footer_default.linksList, children: [
213
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/research", className: Footer_default.link, children: "Projects" }) }),
214
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/publications", className: Footer_default.link, children: "Publications" }) }),
215
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/publications", className: Footer_default.link, children: "Datasets" }) }),
216
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/publications", className: Footer_default.link, children: "Code" }) })
217
+ ] })
218
+ ] }),
219
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: Footer_default.linksSection, children: [
220
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h3", { className: Footer_default.linksSectionTitle, children: "People" }),
221
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("ul", { className: Footer_default.linksList, children: [
222
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/team", className: Footer_default.link, children: "Faculty" }) }),
223
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/team", className: Footer_default.link, children: "Students" }) }),
224
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/team", className: Footer_default.link, children: "Alumni" }) }),
225
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/contact", className: Footer_default.link, children: "Join Us" }) })
226
+ ] })
227
+ ] })
228
+ ] }),
229
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: Footer_default.bottom, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("p", { className: Footer_default.copyright, children: [
230
+ "\xA9 ",
231
+ (/* @__PURE__ */ new Date()).getFullYear(),
232
+ " ",
233
+ labName,
234
+ ". All rights reserved."
235
+ ] }) })
236
+ ] })
237
+ }
238
+ );
239
+ }
240
+
241
+ // src/components/ClientLayout.tsx
242
+ var import_jsx_runtime4 = require("react/jsx-runtime");
243
+ function ThemeBodySync() {
244
+ const { resolvedTheme } = (0, import_next_themes2.useTheme)();
245
+ (0, import_react.useEffect)(() => {
246
+ if (resolvedTheme === "dark") {
247
+ document.body.classList.add("dark-mode");
248
+ document.body.classList.remove("light-mode");
249
+ } else {
250
+ document.body.classList.add("light-mode");
251
+ document.body.classList.remove("dark-mode");
252
+ }
253
+ }, [resolvedTheme]);
254
+ return null;
255
+ }
256
+ function ClientLayout({ children, settings }) {
257
+ const navigationData = {
258
+ labName: settings.labName || "Prosophia Research Lab"
259
+ };
260
+ const footerData = {
261
+ labName: settings.labName || "Prosophia Research Lab",
262
+ footerText: settings.footerText
263
+ };
264
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_next_themes2.ThemeProvider, { attribute: "class", defaultTheme: "light", enableSystem: false, children: [
265
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ThemeBodySync, {}),
266
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "pageWrapper", children: [
267
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Header, { navigationData }),
268
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("main", { children }),
269
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Footer, { footerData })
270
+ ] })
271
+ ] });
272
+ }
273
+
274
+ // src/layouts/RootLayout.tsx
275
+ var import_jsx_runtime5 = require("react/jsx-runtime");
276
+ function RootLayout({
277
+ children,
278
+ settings = null
279
+ }) {
280
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ClientLayout, { settings: settings || {}, children });
281
+ }
282
+ // Annotate the CommonJS export names for ESM import in node:
283
+ 0 && (module.exports = {
284
+ RootLayout
285
+ });