@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,248 @@
1
+ // src/components/ClientLayout.tsx
2
+ import { useEffect } from "react";
3
+ import { ThemeProvider, useTheme as useTheme2 } from "next-themes";
4
+
5
+ // src/components/Header.tsx
6
+ import Link from "next/link";
7
+ import { usePathname } from "next/navigation";
8
+ import { motion as motion2 } from "framer-motion";
9
+
10
+ // src/components/Header.module.css
11
+ var Header_default = {};
12
+
13
+ // src/components/ThemeToggle.tsx
14
+ import { motion } from "framer-motion";
15
+ import { useTheme } from "next-themes";
16
+
17
+ // src/components/ThemeToggle.module.css
18
+ var ThemeToggle_default = {};
19
+
20
+ // src/components/ThemeToggle.tsx
21
+ import { jsx } from "react/jsx-runtime";
22
+ function ThemeToggle() {
23
+ const { resolvedTheme, setTheme } = useTheme();
24
+ const toggleTheme = () => {
25
+ setTheme(resolvedTheme === "light" ? "dark" : "light");
26
+ };
27
+ return /* @__PURE__ */ jsx(
28
+ motion.button,
29
+ {
30
+ className: ThemeToggle_default.toggle,
31
+ onClick: toggleTheme,
32
+ whileHover: { scale: 1.05 },
33
+ whileTap: { scale: 0.95 },
34
+ "aria-label": `Switch to ${resolvedTheme === "light" ? "dark" : "light"} mode`,
35
+ children: /* @__PURE__ */ jsx("span", { className: "material-symbols-outlined", children: resolvedTheme === "light" ? "dark_mode" : "light_mode" })
36
+ }
37
+ );
38
+ }
39
+
40
+ // src/components/Header.tsx
41
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
42
+ var defaultNavItems = [
43
+ { href: "/", label: "Home" },
44
+ { href: "/gallery", label: "Gallery" },
45
+ { href: "/team", label: "Team" },
46
+ { href: "/publications", label: "Publications" },
47
+ { href: "/news", label: "News" },
48
+ { href: "/contact", label: "Contact" }
49
+ ];
50
+ function Header({ navigationData }) {
51
+ const pathname = usePathname();
52
+ const labName = navigationData?.labName || "Prosophia Research Lab";
53
+ const navItems = navigationData?.mainNavigation?.length ? navigationData.mainNavigation : defaultNavItems;
54
+ return /* @__PURE__ */ jsx2(
55
+ motion2.header,
56
+ {
57
+ className: Header_default.header,
58
+ initial: { y: -100, opacity: 0 },
59
+ animate: { y: 0, opacity: 1 },
60
+ transition: { duration: 0.5, ease: [0.16, 1, 0.3, 1] },
61
+ children: /* @__PURE__ */ jsxs("div", { className: Header_default.container, children: [
62
+ /* @__PURE__ */ jsxs(Link, { href: "/", className: Header_default.logo, children: [
63
+ /* @__PURE__ */ jsx2("div", { className: Header_default.logoIcon, children: /* @__PURE__ */ jsx2("span", { className: "material-symbols-outlined", children: "science" }) }),
64
+ /* @__PURE__ */ jsx2("h1", { className: Header_default.logoText, children: labName })
65
+ ] }),
66
+ /* @__PURE__ */ jsxs("nav", { className: Header_default.nav, children: [
67
+ /* @__PURE__ */ jsx2("div", { className: Header_default.navLinks, children: navItems.map((item) => /* @__PURE__ */ jsx2(
68
+ Link,
69
+ {
70
+ href: item.href,
71
+ className: `${Header_default.navLink} ${pathname === item.href ? Header_default.navLinkActive : ""}`,
72
+ children: item.label
73
+ },
74
+ item.href
75
+ )) }),
76
+ /* @__PURE__ */ jsx2(ThemeToggle, {}),
77
+ /* @__PURE__ */ jsx2(Link, { href: "/contact", children: /* @__PURE__ */ jsx2(
78
+ motion2.button,
79
+ {
80
+ className: Header_default.ctaButton,
81
+ whileHover: { scale: 1.02 },
82
+ whileTap: { scale: 0.98 },
83
+ children: "Join the Lab"
84
+ }
85
+ ) })
86
+ ] }),
87
+ /* @__PURE__ */ jsxs("div", { className: Header_default.mobileActions, children: [
88
+ /* @__PURE__ */ jsx2(ThemeToggle, {}),
89
+ /* @__PURE__ */ jsx2("button", { className: Header_default.mobileMenuBtn, children: /* @__PURE__ */ jsx2("span", { className: "material-symbols-outlined", children: "menu" }) })
90
+ ] })
91
+ ] })
92
+ }
93
+ );
94
+ }
95
+
96
+ // src/components/Footer.tsx
97
+ import Link2 from "next/link";
98
+ import { motion as motion3 } from "framer-motion";
99
+
100
+ // src/components/Footer.module.css
101
+ var Footer_default = {};
102
+
103
+ // src/components/Footer.tsx
104
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
105
+ var footerVariants = {
106
+ hidden: { opacity: 0, y: 20 },
107
+ visible: {
108
+ opacity: 1,
109
+ y: 0,
110
+ transition: {
111
+ duration: 0.6,
112
+ ease: [0.16, 1, 0.3, 1]
113
+ }
114
+ }
115
+ };
116
+ function getSocialIcon(platform) {
117
+ switch (platform) {
118
+ case "twitter":
119
+ return /* @__PURE__ */ jsx3("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: Footer_default.socialIcon, children: /* @__PURE__ */ jsx3("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" }) });
120
+ case "github":
121
+ return /* @__PURE__ */ jsx3("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: Footer_default.socialIcon, children: /* @__PURE__ */ jsx3("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" }) });
122
+ case "linkedin":
123
+ return /* @__PURE__ */ jsx3("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: Footer_default.socialIcon, children: /* @__PURE__ */ jsx3("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" }) });
124
+ case "youtube":
125
+ return /* @__PURE__ */ jsx3("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: Footer_default.socialIcon, children: /* @__PURE__ */ jsx3("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" }) });
126
+ case "scholar":
127
+ return /* @__PURE__ */ jsx3("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: Footer_default.socialIcon, children: /* @__PURE__ */ jsx3("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" }) });
128
+ default:
129
+ return /* @__PURE__ */ jsxs2("svg", { "aria-hidden": "true", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", strokeWidth: "2", className: Footer_default.socialIcon, children: [
130
+ /* @__PURE__ */ jsx3("circle", { cx: "12", cy: "12", r: "10" }),
131
+ /* @__PURE__ */ jsx3("line", { x1: "2", y1: "12", x2: "22", y2: "12" }),
132
+ /* @__PURE__ */ jsx3("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" })
133
+ ] });
134
+ }
135
+ }
136
+ var defaultSocialLinks = [
137
+ { platform: "twitter", url: "#" },
138
+ { platform: "github", url: "#" },
139
+ { platform: "linkedin", url: "#" }
140
+ ];
141
+ function Footer({ footerData }) {
142
+ const labName = footerData?.labName || "Prosophia Research Lab";
143
+ const footerText = footerData?.footerText || "Advancing the frontiers of human-computer interaction through interdisciplinary research and innovation.";
144
+ const socialLinks = footerData?.socialLinks?.length ? footerData.socialLinks : defaultSocialLinks;
145
+ return /* @__PURE__ */ jsx3(
146
+ motion3.footer,
147
+ {
148
+ className: Footer_default.footer,
149
+ initial: "hidden",
150
+ whileInView: "visible",
151
+ viewport: { once: true },
152
+ variants: footerVariants,
153
+ children: /* @__PURE__ */ jsxs2("div", { className: Footer_default.container, children: [
154
+ /* @__PURE__ */ jsxs2("div", { className: Footer_default.grid, children: [
155
+ /* @__PURE__ */ jsxs2("div", { className: Footer_default.brandSection, children: [
156
+ /* @__PURE__ */ jsxs2("div", { className: Footer_default.logo, children: [
157
+ /* @__PURE__ */ jsx3("div", { className: Footer_default.logoIcon, children: /* @__PURE__ */ jsx3("span", { className: "material-symbols-outlined", children: "science" }) }),
158
+ /* @__PURE__ */ jsx3("h2", { className: Footer_default.logoText, children: labName })
159
+ ] }),
160
+ /* @__PURE__ */ jsx3("p", { className: Footer_default.description, children: footerText }),
161
+ /* @__PURE__ */ jsx3("div", { className: Footer_default.socialLinks, children: socialLinks.map((social, index) => /* @__PURE__ */ jsx3(
162
+ "a",
163
+ {
164
+ href: social.url,
165
+ className: Footer_default.socialLink,
166
+ "aria-label": social.platform,
167
+ target: "_blank",
168
+ rel: "noopener noreferrer",
169
+ children: getSocialIcon(social.platform)
170
+ },
171
+ index
172
+ )) })
173
+ ] }),
174
+ /* @__PURE__ */ jsxs2("div", { className: Footer_default.linksSection, children: [
175
+ /* @__PURE__ */ jsx3("h3", { className: Footer_default.linksSectionTitle, children: "Research" }),
176
+ /* @__PURE__ */ jsxs2("ul", { className: Footer_default.linksList, children: [
177
+ /* @__PURE__ */ jsx3("li", { children: /* @__PURE__ */ jsx3(Link2, { href: "/research", className: Footer_default.link, children: "Projects" }) }),
178
+ /* @__PURE__ */ jsx3("li", { children: /* @__PURE__ */ jsx3(Link2, { href: "/publications", className: Footer_default.link, children: "Publications" }) }),
179
+ /* @__PURE__ */ jsx3("li", { children: /* @__PURE__ */ jsx3(Link2, { href: "/publications", className: Footer_default.link, children: "Datasets" }) }),
180
+ /* @__PURE__ */ jsx3("li", { children: /* @__PURE__ */ jsx3(Link2, { href: "/publications", className: Footer_default.link, children: "Code" }) })
181
+ ] })
182
+ ] }),
183
+ /* @__PURE__ */ jsxs2("div", { className: Footer_default.linksSection, children: [
184
+ /* @__PURE__ */ jsx3("h3", { className: Footer_default.linksSectionTitle, children: "People" }),
185
+ /* @__PURE__ */ jsxs2("ul", { className: Footer_default.linksList, children: [
186
+ /* @__PURE__ */ jsx3("li", { children: /* @__PURE__ */ jsx3(Link2, { href: "/team", className: Footer_default.link, children: "Faculty" }) }),
187
+ /* @__PURE__ */ jsx3("li", { children: /* @__PURE__ */ jsx3(Link2, { href: "/team", className: Footer_default.link, children: "Students" }) }),
188
+ /* @__PURE__ */ jsx3("li", { children: /* @__PURE__ */ jsx3(Link2, { href: "/team", className: Footer_default.link, children: "Alumni" }) }),
189
+ /* @__PURE__ */ jsx3("li", { children: /* @__PURE__ */ jsx3(Link2, { href: "/contact", className: Footer_default.link, children: "Join Us" }) })
190
+ ] })
191
+ ] })
192
+ ] }),
193
+ /* @__PURE__ */ jsx3("div", { className: Footer_default.bottom, children: /* @__PURE__ */ jsxs2("p", { className: Footer_default.copyright, children: [
194
+ "\xA9 ",
195
+ (/* @__PURE__ */ new Date()).getFullYear(),
196
+ " ",
197
+ labName,
198
+ ". All rights reserved."
199
+ ] }) })
200
+ ] })
201
+ }
202
+ );
203
+ }
204
+
205
+ // src/components/ClientLayout.tsx
206
+ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
207
+ function ThemeBodySync() {
208
+ const { resolvedTheme } = useTheme2();
209
+ useEffect(() => {
210
+ if (resolvedTheme === "dark") {
211
+ document.body.classList.add("dark-mode");
212
+ document.body.classList.remove("light-mode");
213
+ } else {
214
+ document.body.classList.add("light-mode");
215
+ document.body.classList.remove("dark-mode");
216
+ }
217
+ }, [resolvedTheme]);
218
+ return null;
219
+ }
220
+ function ClientLayout({ children, settings }) {
221
+ const navigationData = {
222
+ labName: settings.labName || "Prosophia Research Lab"
223
+ };
224
+ const footerData = {
225
+ labName: settings.labName || "Prosophia Research Lab",
226
+ footerText: settings.footerText
227
+ };
228
+ return /* @__PURE__ */ jsxs3(ThemeProvider, { attribute: "class", defaultTheme: "light", enableSystem: false, children: [
229
+ /* @__PURE__ */ jsx4(ThemeBodySync, {}),
230
+ /* @__PURE__ */ jsxs3("div", { className: "pageWrapper", children: [
231
+ /* @__PURE__ */ jsx4(Header, { navigationData }),
232
+ /* @__PURE__ */ jsx4("main", { children }),
233
+ /* @__PURE__ */ jsx4(Footer, { footerData })
234
+ ] })
235
+ ] });
236
+ }
237
+
238
+ // src/layouts/RootLayout.tsx
239
+ import { jsx as jsx5 } from "react/jsx-runtime";
240
+ function RootLayout({
241
+ children,
242
+ settings = null
243
+ }) {
244
+ return /* @__PURE__ */ jsx5(ClientLayout, { settings: settings || {}, children });
245
+ }
246
+ export {
247
+ RootLayout
248
+ };