@prosophia/lab-minimal 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.
@@ -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,381 @@
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_react3 = 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_react2 = require("react");
44
+ var import_navigation = require("next/navigation");
45
+ var import_Layout = __toESM(require("./Layout.module.css"));
46
+
47
+ // src/components/ThemeToggle.tsx
48
+ var import_next_themes = require("next-themes");
49
+ var import_react = require("react");
50
+ var import_framer_motion = require("framer-motion");
51
+ var import_ThemeToggle = __toESM(require("./ThemeToggle.module.css"));
52
+ var import_jsx_runtime = require("react/jsx-runtime");
53
+ function ThemeToggle() {
54
+ const { theme, setTheme, resolvedTheme } = (0, import_next_themes.useTheme)();
55
+ const [mounted, setMounted] = (0, import_react.useState)(false);
56
+ (0, import_react.useEffect)(() => {
57
+ setMounted(true);
58
+ }, []);
59
+ if (!mounted) {
60
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: import_ThemeToggle.default.togglePlaceholder });
61
+ }
62
+ const isDark = resolvedTheme === "dark";
63
+ const toggleTheme = () => {
64
+ setTheme(isDark ? "light" : "dark");
65
+ };
66
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
67
+ import_framer_motion.motion.button,
68
+ {
69
+ className: import_ThemeToggle.default.toggle,
70
+ onClick: toggleTheme,
71
+ "aria-label": `Switch to ${isDark ? "light" : "dark"} mode`,
72
+ whileTap: { scale: 0.95 },
73
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: import_ThemeToggle.default.track, children: [
74
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: `${import_ThemeToggle.default.icon} ${import_ThemeToggle.default.sunIcon} ${!isDark ? import_ThemeToggle.default.iconActive : ""}`, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
75
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "5" }),
76
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "12", y1: "1", x2: "12", y2: "3" }),
77
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "12", y1: "21", x2: "12", y2: "23" }),
78
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "4.22", y1: "4.22", x2: "5.64", y2: "5.64" }),
79
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "18.36", y1: "18.36", x2: "19.78", y2: "19.78" }),
80
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "1", y1: "12", x2: "3", y2: "12" }),
81
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "21", y1: "12", x2: "23", y2: "12" }),
82
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "4.22", y1: "19.78", x2: "5.64", y2: "18.36" }),
83
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "18.36", y1: "5.64", x2: "19.78", y2: "4.22" })
84
+ ] }) }),
85
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
86
+ import_framer_motion.motion.span,
87
+ {
88
+ className: import_ThemeToggle.default.thumb,
89
+ animate: { x: isDark ? 26 : 0 },
90
+ transition: { type: "spring", stiffness: 500, damping: 30 }
91
+ }
92
+ ),
93
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: `${import_ThemeToggle.default.icon} ${import_ThemeToggle.default.moonIcon} ${isDark ? import_ThemeToggle.default.iconActive : ""}`, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }) }) })
94
+ ] })
95
+ }
96
+ );
97
+ }
98
+
99
+ // src/components/Header.tsx
100
+ var import_jsx_runtime2 = require("react/jsx-runtime");
101
+ var navLinks = [
102
+ { href: "/research", label: "Research" },
103
+ { href: "/publications", label: "Publications" },
104
+ { href: "/people", label: "People" },
105
+ { href: "/news", label: "News" },
106
+ { href: "/pictures", label: "Gallery" }
107
+ ];
108
+ function Header({ settings }) {
109
+ const [menuOpen, setMenuOpen] = (0, import_react2.useState)(false);
110
+ const [scrolled, setScrolled] = (0, import_react2.useState)(false);
111
+ const pathname = (0, import_navigation.usePathname)();
112
+ (0, import_react2.useEffect)(() => {
113
+ const handleScroll = () => {
114
+ setScrolled(window.scrollY > 20);
115
+ };
116
+ window.addEventListener("scroll", handleScroll, { passive: true });
117
+ return () => window.removeEventListener("scroll", handleScroll);
118
+ }, []);
119
+ (0, import_react2.useEffect)(() => {
120
+ if (menuOpen) {
121
+ document.body.style.overflow = "hidden";
122
+ } else {
123
+ document.body.style.overflow = "";
124
+ }
125
+ return () => {
126
+ document.body.style.overflow = "";
127
+ };
128
+ }, [menuOpen]);
129
+ (0, import_react2.useEffect)(() => {
130
+ setMenuOpen(false);
131
+ }, [pathname]);
132
+ const handleKeyDown = (0, import_react2.useCallback)((e) => {
133
+ if (e.key === "Escape" && menuOpen) {
134
+ setMenuOpen(false);
135
+ }
136
+ }, [menuOpen]);
137
+ (0, import_react2.useEffect)(() => {
138
+ document.addEventListener("keydown", handleKeyDown);
139
+ return () => document.removeEventListener("keydown", handleKeyDown);
140
+ }, [handleKeyDown]);
141
+ const isActive = (href) => {
142
+ if (href === "/") return pathname === "/";
143
+ return pathname.startsWith(href);
144
+ };
145
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("header", { className: `${import_Layout.default.header} ${scrolled ? import_Layout.default.headerScrolled : ""}`, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: import_Layout.default.navContainer, children: [
146
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_link.default, { href: "/", className: import_Layout.default.navLogo, "aria-label": "Go to homepage", children: [
147
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
148
+ "svg",
149
+ {
150
+ width: "32",
151
+ height: "32",
152
+ viewBox: "0 0 24 24",
153
+ fill: "none",
154
+ xmlns: "http://www.w3.org/2000/svg",
155
+ "aria-hidden": "true",
156
+ children: [
157
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
158
+ "path",
159
+ {
160
+ d: "M12 2L2 7L12 12L22 7L12 2Z",
161
+ stroke: "currentColor",
162
+ strokeWidth: "2",
163
+ strokeLinecap: "round",
164
+ strokeLinejoin: "round"
165
+ }
166
+ ),
167
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
168
+ "path",
169
+ {
170
+ d: "M2 17L12 22L22 17",
171
+ stroke: "currentColor",
172
+ strokeWidth: "2",
173
+ strokeLinecap: "round",
174
+ strokeLinejoin: "round"
175
+ }
176
+ ),
177
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
178
+ "path",
179
+ {
180
+ d: "M2 12L12 17L22 12",
181
+ stroke: "currentColor",
182
+ strokeWidth: "2",
183
+ strokeLinecap: "round",
184
+ strokeLinejoin: "round"
185
+ }
186
+ )
187
+ ]
188
+ }
189
+ ),
190
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
191
+ settings.labName || "Research",
192
+ settings.labNameAccent && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: import_Layout.default.navLogoAccent, children: [
193
+ " ",
194
+ settings.labNameAccent
195
+ ] })
196
+ ] })
197
+ ] }),
198
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("nav", { className: import_Layout.default.desktopNav, "aria-label": "Main navigation", children: navLinks.map((link) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
199
+ import_link.default,
200
+ {
201
+ href: link.href,
202
+ className: `${import_Layout.default.navLink} ${isActive(link.href) ? import_Layout.default.navLinkActive : ""}`,
203
+ children: link.label
204
+ },
205
+ link.href
206
+ )) }),
207
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: import_Layout.default.navActions, children: [
208
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ThemeToggle, {}),
209
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_link.default, { href: "/contact", className: import_Layout.default.navCta, children: "Contact Us" })
210
+ ] }),
211
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
212
+ "button",
213
+ {
214
+ className: import_Layout.default.menuButton,
215
+ onClick: () => setMenuOpen(!menuOpen),
216
+ "aria-label": menuOpen ? "Close menu" : "Open menu",
217
+ "aria-expanded": menuOpen,
218
+ "aria-controls": "mobile-menu",
219
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: import_Layout.default.menuButtonLines, children: [
220
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `${import_Layout.default.menuLine} ${menuOpen ? import_Layout.default.menuLineOpen1 : ""}` }),
221
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `${import_Layout.default.menuLine} ${menuOpen ? import_Layout.default.menuLineOpen2 : ""}` }),
222
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `${import_Layout.default.menuLine} ${menuOpen ? import_Layout.default.menuLineOpen3 : ""}` })
223
+ ] })
224
+ }
225
+ ),
226
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
227
+ "div",
228
+ {
229
+ id: "mobile-menu",
230
+ className: `${import_Layout.default.mobileMenu} ${menuOpen ? import_Layout.default.mobileMenuOpen : ""}`,
231
+ "aria-hidden": !menuOpen,
232
+ children: [
233
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
234
+ "div",
235
+ {
236
+ className: import_Layout.default.mobileMenuOverlay,
237
+ onClick: () => setMenuOpen(false),
238
+ "aria-hidden": "true"
239
+ }
240
+ ),
241
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
242
+ "nav",
243
+ {
244
+ className: import_Layout.default.mobileMenuContent,
245
+ "aria-label": "Mobile navigation",
246
+ children: [
247
+ navLinks.map((link, index) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
248
+ import_link.default,
249
+ {
250
+ href: link.href,
251
+ className: `${import_Layout.default.mobileNavLink} ${isActive(link.href) ? import_Layout.default.mobileNavLinkActive : ""}`,
252
+ style: { animationDelay: `${index * 50}ms` },
253
+ tabIndex: menuOpen ? 0 : -1,
254
+ children: link.label
255
+ },
256
+ link.href
257
+ )),
258
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
259
+ import_link.default,
260
+ {
261
+ href: "/contact",
262
+ className: import_Layout.default.mobileNavCta,
263
+ style: { animationDelay: `${navLinks.length * 50}ms` },
264
+ tabIndex: menuOpen ? 0 : -1,
265
+ children: "Contact Us"
266
+ }
267
+ )
268
+ ]
269
+ }
270
+ )
271
+ ]
272
+ }
273
+ )
274
+ ] }) });
275
+ }
276
+
277
+ // src/components/Footer.tsx
278
+ var import_link2 = __toESM(require("next/link"));
279
+ var import_Footer = __toESM(require("./Footer.module.css"));
280
+
281
+ // src/lib/utils.ts
282
+ function isValidExternalUrl(url) {
283
+ if (!url || typeof url !== "string") return false;
284
+ try {
285
+ const parsed = new URL(url);
286
+ return parsed.protocol === "https:" || parsed.protocol === "http:";
287
+ } catch {
288
+ return false;
289
+ }
290
+ }
291
+
292
+ // src/components/Footer.tsx
293
+ var import_jsx_runtime3 = require("react/jsx-runtime");
294
+ var SocialIcon = ({ href, children }) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("a", { href, target: "_blank", rel: "noopener noreferrer", className: import_Footer.default.socialIcon, children });
295
+ function Footer({ settings }) {
296
+ const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
297
+ const showPrivacy = settings?.showPrivacyPolicy !== false;
298
+ const showTerms = settings?.showTerms !== false;
299
+ const hasLegalLinks = showPrivacy || showTerms;
300
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("footer", { className: import_Footer.default.footerWrapper, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Footer.default.footerContainer, children: [
301
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Footer.default.mainFooter, children: [
302
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Footer.default.footerAbout, children: [
303
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_link2.default, { href: "/", className: import_Footer.default.footerLogo, children: [
304
+ settings?.labName || "Cavendish",
305
+ " ",
306
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: import_Footer.default.logoAccent, children: settings?.labNameAccent || "Lab" })
307
+ ] }),
308
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: import_Footer.default.footerDescription, children: settings?.labNameDescription || "Advancing the frontiers of physics and our understanding of the universe." }),
309
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Footer.default.socials, children: [
310
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SocialIcon, { href: "#", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("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" }) }) }),
311
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SocialIcon, { href: "#", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("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" }) }) })
312
+ ] })
313
+ ] }),
314
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Footer.default.footerLinksGrid, children: [
315
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Footer.default.footerColumn, children: [
316
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h4", { children: "Quick Links" }),
317
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/research", children: "Research" }),
318
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/publications", children: "Publications" }),
319
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/pictures", children: "Gallery" })
320
+ ] }),
321
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Footer.default.footerColumn, children: [
322
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h4", { children: "About" }),
323
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/news", children: "News" }),
324
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/people", children: "Our Team" }),
325
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/contact", children: "Contact" })
326
+ ] }),
327
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Footer.default.footerColumn, children: [
328
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h4", { children: "Resources" }),
329
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "https://www.cam.ac.uk/", children: "University" }),
330
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "#", children: "Careers" })
331
+ ] })
332
+ ] })
333
+ ] }),
334
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Footer.default.footerBottomBar, children: [
335
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { children: settings?.footerText || `\xA9 ${currentYear} The Research Group. All Rights Reserved.` }),
336
+ hasLegalLinks && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Footer.default.legalLinks, children: [
337
+ showPrivacy && (settings?.privacyPolicyUrl && isValidExternalUrl(settings.privacyPolicyUrl) ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("a", { href: settings.privacyPolicyUrl, target: "_blank", rel: "noopener noreferrer", children: "Privacy Policy" }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/privacy", children: "Privacy Policy" })),
338
+ showTerms && (settings?.termsUrl && isValidExternalUrl(settings.termsUrl) ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("a", { href: settings.termsUrl, target: "_blank", rel: "noopener noreferrer", children: "Terms & Conditions" }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/terms", children: "Terms & Conditions" }))
339
+ ] })
340
+ ] })
341
+ ] }) });
342
+ }
343
+
344
+ // src/components/ClientLayout.tsx
345
+ var import_jsx_runtime4 = require("react/jsx-runtime");
346
+ function ThemeBodySync() {
347
+ const { resolvedTheme } = (0, import_next_themes2.useTheme)();
348
+ (0, import_react3.useEffect)(() => {
349
+ if (resolvedTheme === "dark") {
350
+ document.body.classList.add("dark-mode");
351
+ document.body.classList.remove("light-mode");
352
+ } else {
353
+ document.body.classList.add("light-mode");
354
+ document.body.classList.remove("dark-mode");
355
+ }
356
+ }, [resolvedTheme]);
357
+ return null;
358
+ }
359
+ function ClientLayout({ children, settings }) {
360
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_next_themes2.ThemeProvider, { attribute: "class", defaultTheme: "light", enableSystem: false, children: [
361
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ThemeBodySync, {}),
362
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "pageWrapper", children: [
363
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Header, { settings }),
364
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("main", { children }),
365
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Footer, { settings })
366
+ ] })
367
+ ] });
368
+ }
369
+
370
+ // src/layouts/RootLayout.tsx
371
+ var import_jsx_runtime5 = require("react/jsx-runtime");
372
+ function RootLayout({
373
+ children,
374
+ settings = null
375
+ }) {
376
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ClientLayout, { settings: settings || {}, children });
377
+ }
378
+ // Annotate the CommonJS export names for ESM import in node:
379
+ 0 && (module.exports = {
380
+ RootLayout
381
+ });