@prosophia/lab-techy 0.0.1

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.js ADDED
@@ -0,0 +1,230 @@
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/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ Footer: () => Footer,
34
+ Header: () => Header,
35
+ ThemeToggle: () => ThemeToggle
36
+ });
37
+ module.exports = __toCommonJS(index_exports);
38
+
39
+ // src/components/Footer.tsx
40
+ var import_link = __toESM(require("next/link"));
41
+ var import_framer_motion = require("framer-motion");
42
+ var import_Footer = __toESM(require("./Footer.module.css"));
43
+ var import_jsx_runtime = require("react/jsx-runtime");
44
+ var footerVariants = {
45
+ hidden: { opacity: 0, y: 20 },
46
+ visible: {
47
+ opacity: 1,
48
+ y: 0,
49
+ transition: {
50
+ duration: 0.6,
51
+ ease: [0.16, 1, 0.3, 1]
52
+ }
53
+ }
54
+ };
55
+ function getSocialIcon(platform) {
56
+ switch (platform) {
57
+ case "twitter":
58
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: import_Footer.default.socialIcon, children: /* @__PURE__ */ (0, import_jsx_runtime.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" }) });
59
+ case "github":
60
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: import_Footer.default.socialIcon, children: /* @__PURE__ */ (0, import_jsx_runtime.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" }) });
61
+ case "linkedin":
62
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: import_Footer.default.socialIcon, children: /* @__PURE__ */ (0, import_jsx_runtime.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" }) });
63
+ case "youtube":
64
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: import_Footer.default.socialIcon, children: /* @__PURE__ */ (0, import_jsx_runtime.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" }) });
65
+ case "scholar":
66
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: import_Footer.default.socialIcon, children: /* @__PURE__ */ (0, import_jsx_runtime.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" }) });
67
+ default:
68
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { "aria-hidden": "true", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", strokeWidth: "2", className: import_Footer.default.socialIcon, children: [
69
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "10" }),
70
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "2", y1: "12", x2: "22", y2: "12" }),
71
+ /* @__PURE__ */ (0, import_jsx_runtime.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" })
72
+ ] });
73
+ }
74
+ }
75
+ var defaultSocialLinks = [
76
+ { platform: "twitter", url: "#" },
77
+ { platform: "github", url: "#" },
78
+ { platform: "linkedin", url: "#" }
79
+ ];
80
+ function Footer({ footerData }) {
81
+ const labName = footerData?.labName || "Prosophia Research Lab";
82
+ const footerText = footerData?.footerText || "Advancing the frontiers of human-computer interaction through interdisciplinary research and innovation.";
83
+ const socialLinks = footerData?.socialLinks?.length ? footerData.socialLinks : defaultSocialLinks;
84
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
85
+ import_framer_motion.motion.footer,
86
+ {
87
+ className: import_Footer.default.footer,
88
+ initial: "hidden",
89
+ whileInView: "visible",
90
+ viewport: { once: true },
91
+ variants: footerVariants,
92
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: import_Footer.default.container, children: [
93
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: import_Footer.default.grid, children: [
94
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: import_Footer.default.brandSection, children: [
95
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: import_Footer.default.logo, children: [
96
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: import_Footer.default.logoIcon, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "material-symbols-outlined", children: "science" }) }),
97
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: import_Footer.default.logoText, children: labName })
98
+ ] }),
99
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: import_Footer.default.description, children: footerText }),
100
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: import_Footer.default.socialLinks, children: socialLinks.map((social, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
101
+ "a",
102
+ {
103
+ href: social.url,
104
+ className: import_Footer.default.socialLink,
105
+ "aria-label": social.platform,
106
+ target: "_blank",
107
+ rel: "noopener noreferrer",
108
+ children: getSocialIcon(social.platform)
109
+ },
110
+ index
111
+ )) })
112
+ ] }),
113
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: import_Footer.default.linksSection, children: [
114
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: import_Footer.default.linksSectionTitle, children: "Research" }),
115
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("ul", { className: import_Footer.default.linksList, children: [
116
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: "/research", className: import_Footer.default.link, children: "Projects" }) }),
117
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: "/publications", className: import_Footer.default.link, children: "Publications" }) }),
118
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: "/publications", className: import_Footer.default.link, children: "Datasets" }) }),
119
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: "/publications", className: import_Footer.default.link, children: "Code" }) })
120
+ ] })
121
+ ] }),
122
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: import_Footer.default.linksSection, children: [
123
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: import_Footer.default.linksSectionTitle, children: "People" }),
124
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("ul", { className: import_Footer.default.linksList, children: [
125
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: "/team", className: import_Footer.default.link, children: "Faculty" }) }),
126
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: "/team", className: import_Footer.default.link, children: "Students" }) }),
127
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: "/team", className: import_Footer.default.link, children: "Alumni" }) }),
128
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: "/contact", className: import_Footer.default.link, children: "Join Us" }) })
129
+ ] })
130
+ ] })
131
+ ] }),
132
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: import_Footer.default.bottom, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: import_Footer.default.copyright, children: [
133
+ "\xA9 ",
134
+ (/* @__PURE__ */ new Date()).getFullYear(),
135
+ " ",
136
+ labName,
137
+ ". All rights reserved."
138
+ ] }) })
139
+ ] })
140
+ }
141
+ );
142
+ }
143
+
144
+ // src/components/Header.tsx
145
+ var import_link2 = __toESM(require("next/link"));
146
+ var import_navigation = require("next/navigation");
147
+ var import_framer_motion3 = require("framer-motion");
148
+ var import_Header = __toESM(require("./Header.module.css"));
149
+
150
+ // src/components/ThemeToggle.tsx
151
+ var import_framer_motion2 = require("framer-motion");
152
+ var import_ThemeContext = require("@/context/ThemeContext");
153
+ var import_ThemeToggle = __toESM(require("./ThemeToggle.module.css"));
154
+ var import_jsx_runtime2 = require("react/jsx-runtime");
155
+ function ThemeToggle() {
156
+ const { theme, toggleTheme } = (0, import_ThemeContext.useTheme)();
157
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
158
+ import_framer_motion2.motion.button,
159
+ {
160
+ className: import_ThemeToggle.default.toggle,
161
+ onClick: toggleTheme,
162
+ whileHover: { scale: 1.05 },
163
+ whileTap: { scale: 0.95 },
164
+ "aria-label": `Switch to ${theme === "light" ? "dark" : "light"} mode`,
165
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "material-symbols-outlined", children: theme === "light" ? "dark_mode" : "light_mode" })
166
+ }
167
+ );
168
+ }
169
+
170
+ // src/components/Header.tsx
171
+ var import_jsx_runtime3 = require("react/jsx-runtime");
172
+ var defaultNavItems = [
173
+ { href: "/", label: "Home" },
174
+ { href: "/gallery", label: "Gallery" },
175
+ { href: "/team", label: "Team" },
176
+ { href: "/publications", label: "Publications" },
177
+ { href: "/news", label: "News" },
178
+ { href: "/contact", label: "Contact" }
179
+ ];
180
+ function Header({ navigationData }) {
181
+ const pathname = (0, import_navigation.usePathname)();
182
+ const labName = navigationData?.labName || "Prosophia Research Lab";
183
+ const navItems = navigationData?.mainNavigation?.length ? navigationData.mainNavigation : defaultNavItems;
184
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
185
+ import_framer_motion3.motion.header,
186
+ {
187
+ className: import_Header.default.header,
188
+ initial: { y: -100, opacity: 0 },
189
+ animate: { y: 0, opacity: 1 },
190
+ transition: { duration: 0.5, ease: [0.16, 1, 0.3, 1] },
191
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Header.default.container, children: [
192
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_link2.default, { href: "/", className: import_Header.default.logo, children: [
193
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: import_Header.default.logoIcon, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "material-symbols-outlined", children: "science" }) }),
194
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h1", { className: import_Header.default.logoText, children: labName })
195
+ ] }),
196
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("nav", { className: import_Header.default.nav, children: [
197
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: import_Header.default.navLinks, children: navItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
198
+ import_link2.default,
199
+ {
200
+ href: item.href,
201
+ className: `${import_Header.default.navLink} ${pathname === item.href ? import_Header.default.navLinkActive : ""}`,
202
+ children: item.label
203
+ },
204
+ item.href
205
+ )) }),
206
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ThemeToggle, {}),
207
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_link2.default, { href: "/contact", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
208
+ import_framer_motion3.motion.button,
209
+ {
210
+ className: import_Header.default.ctaButton,
211
+ whileHover: { scale: 1.02 },
212
+ whileTap: { scale: 0.98 },
213
+ children: "Join the Lab"
214
+ }
215
+ ) })
216
+ ] }),
217
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Header.default.mobileActions, children: [
218
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ThemeToggle, {}),
219
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: import_Header.default.mobileMenuBtn, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "material-symbols-outlined", children: "menu" }) })
220
+ ] })
221
+ ] })
222
+ }
223
+ );
224
+ }
225
+ // Annotate the CommonJS export names for ESM import in node:
226
+ 0 && (module.exports = {
227
+ Footer,
228
+ Header,
229
+ ThemeToggle
230
+ });
package/dist/index.mjs ADDED
@@ -0,0 +1,191 @@
1
+ // src/components/Footer.tsx
2
+ import Link from "next/link";
3
+ import { motion } from "framer-motion";
4
+ import styles from "./Footer.module.css";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ var footerVariants = {
7
+ hidden: { opacity: 0, y: 20 },
8
+ visible: {
9
+ opacity: 1,
10
+ y: 0,
11
+ transition: {
12
+ duration: 0.6,
13
+ ease: [0.16, 1, 0.3, 1]
14
+ }
15
+ }
16
+ };
17
+ function getSocialIcon(platform) {
18
+ switch (platform) {
19
+ case "twitter":
20
+ return /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: styles.socialIcon, children: /* @__PURE__ */ 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" }) });
21
+ case "github":
22
+ return /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: styles.socialIcon, children: /* @__PURE__ */ 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" }) });
23
+ case "linkedin":
24
+ return /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: styles.socialIcon, children: /* @__PURE__ */ 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" }) });
25
+ case "youtube":
26
+ return /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: styles.socialIcon, children: /* @__PURE__ */ 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" }) });
27
+ case "scholar":
28
+ return /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", fill: "currentColor", viewBox: "0 0 24 24", className: styles.socialIcon, children: /* @__PURE__ */ 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" }) });
29
+ default:
30
+ return /* @__PURE__ */ jsxs("svg", { "aria-hidden": "true", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", strokeWidth: "2", className: styles.socialIcon, children: [
31
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }),
32
+ /* @__PURE__ */ jsx("line", { x1: "2", y1: "12", x2: "22", y2: "12" }),
33
+ /* @__PURE__ */ 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" })
34
+ ] });
35
+ }
36
+ }
37
+ var defaultSocialLinks = [
38
+ { platform: "twitter", url: "#" },
39
+ { platform: "github", url: "#" },
40
+ { platform: "linkedin", url: "#" }
41
+ ];
42
+ function Footer({ footerData }) {
43
+ const labName = footerData?.labName || "Prosophia Research Lab";
44
+ const footerText = footerData?.footerText || "Advancing the frontiers of human-computer interaction through interdisciplinary research and innovation.";
45
+ const socialLinks = footerData?.socialLinks?.length ? footerData.socialLinks : defaultSocialLinks;
46
+ return /* @__PURE__ */ jsx(
47
+ motion.footer,
48
+ {
49
+ className: styles.footer,
50
+ initial: "hidden",
51
+ whileInView: "visible",
52
+ viewport: { once: true },
53
+ variants: footerVariants,
54
+ children: /* @__PURE__ */ jsxs("div", { className: styles.container, children: [
55
+ /* @__PURE__ */ jsxs("div", { className: styles.grid, children: [
56
+ /* @__PURE__ */ jsxs("div", { className: styles.brandSection, children: [
57
+ /* @__PURE__ */ jsxs("div", { className: styles.logo, children: [
58
+ /* @__PURE__ */ jsx("div", { className: styles.logoIcon, children: /* @__PURE__ */ jsx("span", { className: "material-symbols-outlined", children: "science" }) }),
59
+ /* @__PURE__ */ jsx("h2", { className: styles.logoText, children: labName })
60
+ ] }),
61
+ /* @__PURE__ */ jsx("p", { className: styles.description, children: footerText }),
62
+ /* @__PURE__ */ jsx("div", { className: styles.socialLinks, children: socialLinks.map((social, index) => /* @__PURE__ */ jsx(
63
+ "a",
64
+ {
65
+ href: social.url,
66
+ className: styles.socialLink,
67
+ "aria-label": social.platform,
68
+ target: "_blank",
69
+ rel: "noopener noreferrer",
70
+ children: getSocialIcon(social.platform)
71
+ },
72
+ index
73
+ )) })
74
+ ] }),
75
+ /* @__PURE__ */ jsxs("div", { className: styles.linksSection, children: [
76
+ /* @__PURE__ */ jsx("h3", { className: styles.linksSectionTitle, children: "Research" }),
77
+ /* @__PURE__ */ jsxs("ul", { className: styles.linksList, children: [
78
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, { href: "/research", className: styles.link, children: "Projects" }) }),
79
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, { href: "/publications", className: styles.link, children: "Publications" }) }),
80
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, { href: "/publications", className: styles.link, children: "Datasets" }) }),
81
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, { href: "/publications", className: styles.link, children: "Code" }) })
82
+ ] })
83
+ ] }),
84
+ /* @__PURE__ */ jsxs("div", { className: styles.linksSection, children: [
85
+ /* @__PURE__ */ jsx("h3", { className: styles.linksSectionTitle, children: "People" }),
86
+ /* @__PURE__ */ jsxs("ul", { className: styles.linksList, children: [
87
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, { href: "/team", className: styles.link, children: "Faculty" }) }),
88
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, { href: "/team", className: styles.link, children: "Students" }) }),
89
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, { href: "/team", className: styles.link, children: "Alumni" }) }),
90
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, { href: "/contact", className: styles.link, children: "Join Us" }) })
91
+ ] })
92
+ ] })
93
+ ] }),
94
+ /* @__PURE__ */ jsx("div", { className: styles.bottom, children: /* @__PURE__ */ jsxs("p", { className: styles.copyright, children: [
95
+ "\xA9 ",
96
+ (/* @__PURE__ */ new Date()).getFullYear(),
97
+ " ",
98
+ labName,
99
+ ". All rights reserved."
100
+ ] }) })
101
+ ] })
102
+ }
103
+ );
104
+ }
105
+
106
+ // src/components/Header.tsx
107
+ import Link2 from "next/link";
108
+ import { usePathname } from "next/navigation";
109
+ import { motion as motion3 } from "framer-motion";
110
+ import styles3 from "./Header.module.css";
111
+
112
+ // src/components/ThemeToggle.tsx
113
+ import { motion as motion2 } from "framer-motion";
114
+ import { useTheme } from "@/context/ThemeContext";
115
+ import styles2 from "./ThemeToggle.module.css";
116
+ import { jsx as jsx2 } from "react/jsx-runtime";
117
+ function ThemeToggle() {
118
+ const { theme, toggleTheme } = useTheme();
119
+ return /* @__PURE__ */ jsx2(
120
+ motion2.button,
121
+ {
122
+ className: styles2.toggle,
123
+ onClick: toggleTheme,
124
+ whileHover: { scale: 1.05 },
125
+ 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" })
128
+ }
129
+ );
130
+ }
131
+
132
+ // src/components/Header.tsx
133
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
134
+ var defaultNavItems = [
135
+ { href: "/", label: "Home" },
136
+ { href: "/gallery", label: "Gallery" },
137
+ { href: "/team", label: "Team" },
138
+ { href: "/publications", label: "Publications" },
139
+ { href: "/news", label: "News" },
140
+ { href: "/contact", label: "Contact" }
141
+ ];
142
+ function Header({ navigationData }) {
143
+ const pathname = usePathname();
144
+ const labName = navigationData?.labName || "Prosophia Research Lab";
145
+ const navItems = navigationData?.mainNavigation?.length ? navigationData.mainNavigation : defaultNavItems;
146
+ return /* @__PURE__ */ jsx3(
147
+ motion3.header,
148
+ {
149
+ className: styles3.header,
150
+ initial: { y: -100, opacity: 0 },
151
+ animate: { y: 0, opacity: 1 },
152
+ transition: { duration: 0.5, ease: [0.16, 1, 0.3, 1] },
153
+ children: /* @__PURE__ */ jsxs2("div", { className: styles3.container, children: [
154
+ /* @__PURE__ */ jsxs2(Link2, { href: "/", className: styles3.logo, children: [
155
+ /* @__PURE__ */ jsx3("div", { className: styles3.logoIcon, children: /* @__PURE__ */ jsx3("span", { className: "material-symbols-outlined", children: "science" }) }),
156
+ /* @__PURE__ */ jsx3("h1", { className: styles3.logoText, children: labName })
157
+ ] }),
158
+ /* @__PURE__ */ jsxs2("nav", { className: styles3.nav, children: [
159
+ /* @__PURE__ */ jsx3("div", { className: styles3.navLinks, children: navItems.map((item) => /* @__PURE__ */ jsx3(
160
+ Link2,
161
+ {
162
+ href: item.href,
163
+ className: `${styles3.navLink} ${pathname === item.href ? styles3.navLinkActive : ""}`,
164
+ children: item.label
165
+ },
166
+ item.href
167
+ )) }),
168
+ /* @__PURE__ */ jsx3(ThemeToggle, {}),
169
+ /* @__PURE__ */ jsx3(Link2, { href: "/contact", children: /* @__PURE__ */ jsx3(
170
+ motion3.button,
171
+ {
172
+ className: styles3.ctaButton,
173
+ whileHover: { scale: 1.02 },
174
+ whileTap: { scale: 0.98 },
175
+ children: "Join the Lab"
176
+ }
177
+ ) })
178
+ ] }),
179
+ /* @__PURE__ */ jsxs2("div", { className: styles3.mobileActions, children: [
180
+ /* @__PURE__ */ jsx3(ThemeToggle, {}),
181
+ /* @__PURE__ */ jsx3("button", { className: styles3.mobileMenuBtn, children: /* @__PURE__ */ jsx3("span", { className: "material-symbols-outlined", children: "menu" }) })
182
+ ] })
183
+ ] })
184
+ }
185
+ );
186
+ }
187
+ export {
188
+ Footer,
189
+ Header,
190
+ ThemeToggle
191
+ };
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@prosophia/lab-techy",
3
+ "version": "0.0.1",
4
+ "description": "Techy lab website template with Sanity CMS for Prosophia",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.mjs",
11
+ "require": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ },
14
+ "./styles": "./dist/styles/index.css"
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsup",
21
+ "dev": "tsup --watch",
22
+ "lint": "eslint src/"
23
+ },
24
+ "peerDependencies": {
25
+ "next": "^14.0.0",
26
+ "react": "^18.0.0",
27
+ "react-dom": "^18.0.0"
28
+ },
29
+ "devDependencies": {
30
+ "@types/react": "^18.0.0",
31
+ "@types/react-dom": "^18.0.0",
32
+ "tsup": "^8.0.0",
33
+ "typescript": "^5.0.0"
34
+ },
35
+ "publishConfig": {
36
+ "access": "public"
37
+ },
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "https://github.com/prosophia/prosophia-templates.git",
41
+ "directory": "packages/lab-techy"
42
+ },
43
+ "license": "MIT"
44
+ }