@prosophia/personal-cv 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.
- package/dist/About.module.css +107 -0
- package/dist/CVSection.module.css +124 -0
- package/dist/Footer.module.css +41 -0
- package/dist/Header.module.css +226 -0
- package/dist/Projects.module.css +114 -0
- package/dist/Publications.module.css +118 -0
- package/dist/index-CZBtPfWB.d.mts +75 -0
- package/dist/index-CZBtPfWB.d.ts +75 -0
- package/dist/index.css +648 -0
- package/dist/index.d.mts +150 -0
- package/dist/index.d.ts +150 -0
- package/dist/index.js +333 -99
- package/dist/index.mjs +314 -92
- package/dist/layouts/index.d.mts +14 -0
- package/dist/layouts/index.d.ts +14 -0
- package/dist/layouts/index.js +72 -0
- package/dist/layouts/index.mjs +46 -0
- package/dist/schemas/index.d.mts +144 -0
- package/dist/schemas/index.d.ts +144 -0
- package/dist/schemas/index.js +581 -0
- package/dist/schemas/index.mjs +540 -0
- package/package.json +13 -2
package/dist/index.js
CHANGED
|
@@ -35,12 +35,26 @@ __export(index_exports, {
|
|
|
35
35
|
Footer: () => Footer,
|
|
36
36
|
Header: () => Header,
|
|
37
37
|
Projects: () => Projects,
|
|
38
|
-
Publications: () => Publications
|
|
38
|
+
Publications: () => Publications,
|
|
39
|
+
ThemeProvider: () => ThemeProvider,
|
|
40
|
+
defineConfig: () => defineConfig,
|
|
41
|
+
getAbout: () => getAbout,
|
|
42
|
+
getAllPageData: () => getAllPageData,
|
|
43
|
+
getAllProjectSlugs: () => getAllProjectSlugs,
|
|
44
|
+
getCVSection: () => getCVSection,
|
|
45
|
+
getNavigation: () => getNavigation,
|
|
46
|
+
getProjectBySlug: () => getProjectBySlug,
|
|
47
|
+
getProjects: () => getProjects,
|
|
48
|
+
getPublications: () => getPublications,
|
|
49
|
+
getSiteSettings: () => getSiteSettings,
|
|
50
|
+
useTheme: () => useTheme
|
|
39
51
|
});
|
|
40
52
|
module.exports = __toCommonJS(index_exports);
|
|
41
53
|
|
|
54
|
+
// src/styles/About.module.css
|
|
55
|
+
var About_default = {};
|
|
56
|
+
|
|
42
57
|
// src/components/About.tsx
|
|
43
|
-
var import_About = __toESM(require("@/styles/About.module.css"));
|
|
44
58
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
45
59
|
var socialIcons = {
|
|
46
60
|
scholar: "school",
|
|
@@ -65,11 +79,11 @@ function About({
|
|
|
65
79
|
profileImageUrl,
|
|
66
80
|
socialLinks = []
|
|
67
81
|
}) {
|
|
68
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("section", { className:
|
|
69
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className:
|
|
82
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("section", { className: About_default.about, id: "about", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: About_default.card, children: [
|
|
83
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: About_default.imageWrapper, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
70
84
|
"div",
|
|
71
85
|
{
|
|
72
|
-
className:
|
|
86
|
+
className: About_default.profileImage,
|
|
73
87
|
style: {
|
|
74
88
|
backgroundImage: profileImageUrl ? `url("${profileImageUrl}")` : void 0,
|
|
75
89
|
backgroundColor: profileImageUrl ? void 0 : "#e5e7eb"
|
|
@@ -78,19 +92,19 @@ function About({
|
|
|
78
92
|
"aria-label": "Profile photo"
|
|
79
93
|
}
|
|
80
94
|
) }),
|
|
81
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className:
|
|
95
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: About_default.content, children: [
|
|
82
96
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
|
|
83
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", { className:
|
|
84
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className:
|
|
85
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className:
|
|
97
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", { className: About_default.greeting, children: greeting }),
|
|
98
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: About_default.title, children: title }),
|
|
99
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: About_default.bio, children: bio })
|
|
86
100
|
] }),
|
|
87
|
-
socialLinks.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className:
|
|
101
|
+
socialLinks.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: About_default.socialLinks, children: socialLinks.map((link) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
88
102
|
"a",
|
|
89
103
|
{
|
|
90
104
|
href: link.url,
|
|
91
105
|
target: "_blank",
|
|
92
106
|
rel: "noopener noreferrer",
|
|
93
|
-
className:
|
|
107
|
+
className: About_default.socialLink,
|
|
94
108
|
"aria-label": socialLabels[link.platform] || link.platform,
|
|
95
109
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "material-symbols-outlined", children: socialIcons[link.platform] || "link" })
|
|
96
110
|
},
|
|
@@ -100,8 +114,10 @@ function About({
|
|
|
100
114
|
] }) });
|
|
101
115
|
}
|
|
102
116
|
|
|
117
|
+
// src/styles/CVSection.module.css
|
|
118
|
+
var CVSection_default = {};
|
|
119
|
+
|
|
103
120
|
// src/components/CVSection.tsx
|
|
104
|
-
var import_CVSection = __toESM(require("@/styles/CVSection.module.css"));
|
|
105
121
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
106
122
|
function CVSection({
|
|
107
123
|
heading,
|
|
@@ -109,12 +125,12 @@ function CVSection({
|
|
|
109
125
|
buttonText,
|
|
110
126
|
cvFileUrl
|
|
111
127
|
}) {
|
|
112
|
-
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("section", { className:
|
|
113
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className:
|
|
114
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className:
|
|
115
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className:
|
|
116
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h2", { className:
|
|
117
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className:
|
|
128
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("section", { className: CVSection_default.cv, id: "cv", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: CVSection_default.card, children: [
|
|
129
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: CVSection_default.content, children: [
|
|
130
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: CVSection_default.iconWrapper, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "material-symbols-outlined", children: "history_edu" }) }),
|
|
131
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: CVSection_default.textContent, children: [
|
|
132
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h2", { className: CVSection_default.title, children: heading }),
|
|
133
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: CVSection_default.description, children: description })
|
|
118
134
|
] }),
|
|
119
135
|
cvFileUrl ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
120
136
|
"a",
|
|
@@ -122,40 +138,82 @@ function CVSection({
|
|
|
122
138
|
href: cvFileUrl,
|
|
123
139
|
target: "_blank",
|
|
124
140
|
rel: "noopener noreferrer",
|
|
125
|
-
className:
|
|
141
|
+
className: CVSection_default.downloadBtn,
|
|
126
142
|
children: [
|
|
127
143
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "material-symbols-outlined", children: "download" }),
|
|
128
144
|
buttonText
|
|
129
145
|
]
|
|
130
146
|
}
|
|
131
|
-
) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { className:
|
|
147
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { className: CVSection_default.downloadBtn, disabled: true, children: [
|
|
132
148
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "material-symbols-outlined", children: "download" }),
|
|
133
149
|
buttonText
|
|
134
150
|
] })
|
|
135
151
|
] }),
|
|
136
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className:
|
|
152
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: CVSection_default.background })
|
|
137
153
|
] }) });
|
|
138
154
|
}
|
|
139
155
|
|
|
156
|
+
// src/styles/Footer.module.css
|
|
157
|
+
var Footer_default = {};
|
|
158
|
+
|
|
140
159
|
// src/components/Footer.tsx
|
|
141
|
-
var import_Footer = __toESM(require("@/styles/Footer.module.css"));
|
|
142
160
|
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
143
161
|
function Footer({ footerText, email }) {
|
|
144
|
-
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("footer", { className:
|
|
145
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className:
|
|
146
|
-
email && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className:
|
|
162
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("footer", { className: Footer_default.footer, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: Footer_default.content, children: [
|
|
163
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: Footer_default.copyright, children: footerText }),
|
|
164
|
+
email && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: Footer_default.emailWrapper, children: [
|
|
147
165
|
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "material-symbols-outlined", children: "mail" }),
|
|
148
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("a", { href: `mailto:${email}`, className:
|
|
166
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("a", { href: `mailto:${email}`, className: Footer_default.email, children: email })
|
|
149
167
|
] })
|
|
150
168
|
] }) });
|
|
151
169
|
}
|
|
152
170
|
|
|
153
171
|
// src/components/Header.tsx
|
|
154
|
-
var
|
|
172
|
+
var import_react2 = require("react");
|
|
155
173
|
var import_link = __toESM(require("next/link"));
|
|
156
|
-
|
|
157
|
-
|
|
174
|
+
|
|
175
|
+
// src/styles/Header.module.css
|
|
176
|
+
var Header_default = {};
|
|
177
|
+
|
|
178
|
+
// src/context/ThemeContext.tsx
|
|
179
|
+
var import_react = require("react");
|
|
158
180
|
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
181
|
+
var ThemeContext = (0, import_react.createContext)({
|
|
182
|
+
theme: "light",
|
|
183
|
+
toggleTheme: () => {
|
|
184
|
+
},
|
|
185
|
+
mounted: false
|
|
186
|
+
});
|
|
187
|
+
function ThemeProvider({ children }) {
|
|
188
|
+
const [theme, setTheme] = (0, import_react.useState)("light");
|
|
189
|
+
const [mounted, setMounted] = (0, import_react.useState)(false);
|
|
190
|
+
(0, import_react.useEffect)(() => {
|
|
191
|
+
setMounted(true);
|
|
192
|
+
const savedTheme = localStorage.getItem("theme");
|
|
193
|
+
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
194
|
+
if (savedTheme) {
|
|
195
|
+
setTheme(savedTheme);
|
|
196
|
+
} else if (prefersDark) {
|
|
197
|
+
setTheme("dark");
|
|
198
|
+
}
|
|
199
|
+
}, []);
|
|
200
|
+
(0, import_react.useEffect)(() => {
|
|
201
|
+
if (mounted) {
|
|
202
|
+
document.documentElement.setAttribute("data-theme", theme);
|
|
203
|
+
localStorage.setItem("theme", theme);
|
|
204
|
+
}
|
|
205
|
+
}, [theme, mounted]);
|
|
206
|
+
const toggleTheme = () => {
|
|
207
|
+
setTheme((prev) => prev === "light" ? "dark" : "light");
|
|
208
|
+
};
|
|
209
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ThemeContext.Provider, { value: { theme, toggleTheme, mounted }, children });
|
|
210
|
+
}
|
|
211
|
+
function useTheme() {
|
|
212
|
+
return (0, import_react.useContext)(ThemeContext);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// src/components/Header.tsx
|
|
216
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
159
217
|
function Header({
|
|
160
218
|
siteName,
|
|
161
219
|
navLinks,
|
|
@@ -163,85 +221,85 @@ function Header({
|
|
|
163
221
|
contactButtonText = "Contact",
|
|
164
222
|
contactEmail = ""
|
|
165
223
|
}) {
|
|
166
|
-
const [mobileMenuOpen, setMobileMenuOpen] = (0,
|
|
167
|
-
const { theme, toggleTheme, mounted } =
|
|
224
|
+
const [mobileMenuOpen, setMobileMenuOpen] = (0, import_react2.useState)(false);
|
|
225
|
+
const { theme, toggleTheme, mounted } = useTheme();
|
|
168
226
|
const toggleMobileMenu = () => {
|
|
169
227
|
setMobileMenuOpen(!mobileMenuOpen);
|
|
170
228
|
};
|
|
171
229
|
const closeMobileMenu = () => {
|
|
172
230
|
setMobileMenuOpen(false);
|
|
173
231
|
};
|
|
174
|
-
return /* @__PURE__ */ (0,
|
|
175
|
-
/* @__PURE__ */ (0,
|
|
176
|
-
/* @__PURE__ */ (0,
|
|
177
|
-
/* @__PURE__ */ (0,
|
|
178
|
-
/* @__PURE__ */ (0,
|
|
232
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
|
|
233
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("header", { className: Header_default.header, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: Header_default.headerInner, children: [
|
|
234
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_link.default, { href: "/", className: Header_default.logo, children: [
|
|
235
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: Header_default.logoIcon, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "material-symbols-outlined", children: "hexagon" }) }),
|
|
236
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h2", { className: Header_default.siteName, children: siteName })
|
|
179
237
|
] }),
|
|
180
|
-
/* @__PURE__ */ (0,
|
|
181
|
-
/* @__PURE__ */ (0,
|
|
238
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: Header_default.desktopNav, children: [
|
|
239
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("nav", { className: Header_default.navLinks, children: navLinks.map((link) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
182
240
|
import_link.default,
|
|
183
241
|
{
|
|
184
242
|
href: link.href,
|
|
185
|
-
className:
|
|
243
|
+
className: Header_default.navLink,
|
|
186
244
|
children: link.label
|
|
187
245
|
},
|
|
188
246
|
link.href
|
|
189
247
|
)) }),
|
|
190
|
-
mounted && /* @__PURE__ */ (0,
|
|
248
|
+
mounted && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
191
249
|
"button",
|
|
192
250
|
{
|
|
193
|
-
className:
|
|
251
|
+
className: Header_default.themeToggle,
|
|
194
252
|
onClick: toggleTheme,
|
|
195
253
|
"aria-label": `Switch to ${theme === "light" ? "dark" : "light"} mode`,
|
|
196
|
-
children: /* @__PURE__ */ (0,
|
|
254
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "material-symbols-outlined", children: theme === "light" ? "dark_mode" : "light_mode" })
|
|
197
255
|
}
|
|
198
256
|
),
|
|
199
|
-
showContactButton && contactEmail && /* @__PURE__ */ (0,
|
|
257
|
+
showContactButton && contactEmail && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
200
258
|
"a",
|
|
201
259
|
{
|
|
202
260
|
href: `mailto:${contactEmail}`,
|
|
203
|
-
className:
|
|
204
|
-
children: /* @__PURE__ */ (0,
|
|
261
|
+
className: Header_default.contactBtn,
|
|
262
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { children: contactButtonText })
|
|
205
263
|
}
|
|
206
264
|
)
|
|
207
265
|
] }),
|
|
208
|
-
/* @__PURE__ */ (0,
|
|
209
|
-
mounted && /* @__PURE__ */ (0,
|
|
266
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: Header_default.mobileActions, children: [
|
|
267
|
+
mounted && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
210
268
|
"button",
|
|
211
269
|
{
|
|
212
|
-
className:
|
|
270
|
+
className: Header_default.mobileThemeToggle,
|
|
213
271
|
onClick: toggleTheme,
|
|
214
272
|
"aria-label": `Switch to ${theme === "light" ? "dark" : "light"} mode`,
|
|
215
|
-
children: /* @__PURE__ */ (0,
|
|
273
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "material-symbols-outlined", children: theme === "light" ? "dark_mode" : "light_mode" })
|
|
216
274
|
}
|
|
217
275
|
),
|
|
218
|
-
/* @__PURE__ */ (0,
|
|
276
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
219
277
|
"button",
|
|
220
278
|
{
|
|
221
|
-
className:
|
|
279
|
+
className: Header_default.mobileMenuBtn,
|
|
222
280
|
onClick: toggleMobileMenu,
|
|
223
281
|
"aria-label": "Toggle menu",
|
|
224
|
-
children: /* @__PURE__ */ (0,
|
|
282
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "material-symbols-outlined", children: mobileMenuOpen ? "close" : "menu" })
|
|
225
283
|
}
|
|
226
284
|
)
|
|
227
285
|
] })
|
|
228
286
|
] }) }),
|
|
229
|
-
/* @__PURE__ */ (0,
|
|
230
|
-
/* @__PURE__ */ (0,
|
|
287
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: `${Header_default.mobileMenu} ${mobileMenuOpen ? Header_default.open : ""}`, children: [
|
|
288
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("nav", { className: Header_default.mobileNavLinks, children: navLinks.map((link) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
231
289
|
import_link.default,
|
|
232
290
|
{
|
|
233
291
|
href: link.href,
|
|
234
|
-
className:
|
|
292
|
+
className: Header_default.mobileNavLink,
|
|
235
293
|
onClick: closeMobileMenu,
|
|
236
294
|
children: link.label
|
|
237
295
|
},
|
|
238
296
|
link.href
|
|
239
297
|
)) }),
|
|
240
|
-
showContactButton && contactEmail && /* @__PURE__ */ (0,
|
|
298
|
+
showContactButton && contactEmail && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
241
299
|
"a",
|
|
242
300
|
{
|
|
243
301
|
href: `mailto:${contactEmail}`,
|
|
244
|
-
className:
|
|
302
|
+
className: Header_default.mobileContactBtn,
|
|
245
303
|
children: contactButtonText
|
|
246
304
|
}
|
|
247
305
|
)
|
|
@@ -251,25 +309,29 @@ function Header({
|
|
|
251
309
|
|
|
252
310
|
// src/components/Projects.tsx
|
|
253
311
|
var import_link2 = __toESM(require("next/link"));
|
|
254
|
-
|
|
255
|
-
|
|
312
|
+
|
|
313
|
+
// src/styles/Projects.module.css
|
|
314
|
+
var Projects_default = {};
|
|
315
|
+
|
|
316
|
+
// src/components/Projects.tsx
|
|
317
|
+
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
256
318
|
function Projects({
|
|
257
319
|
projects,
|
|
258
320
|
showViewAll = true,
|
|
259
321
|
viewAllUrl = "#"
|
|
260
322
|
}) {
|
|
261
|
-
return /* @__PURE__ */ (0,
|
|
262
|
-
/* @__PURE__ */ (0,
|
|
263
|
-
/* @__PURE__ */ (0,
|
|
264
|
-
showViewAll && /* @__PURE__ */ (0,
|
|
323
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: Projects_default.projects, id: "projects", children: [
|
|
324
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: Projects_default.header, children: [
|
|
325
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h2", { className: Projects_default.title, children: "Selected Projects" }),
|
|
326
|
+
showViewAll && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_link2.default, { href: viewAllUrl, className: Projects_default.viewAllLink, children: "View all projects" })
|
|
265
327
|
] }),
|
|
266
|
-
/* @__PURE__ */ (0,
|
|
328
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: Projects_default.grid, children: projects.map((project) => {
|
|
267
329
|
const projectUrl = project.slug?.current ? `/projects/${project.slug.current}` : project.caseStudyUrl;
|
|
268
|
-
const CardContent = /* @__PURE__ */ (0,
|
|
269
|
-
/* @__PURE__ */ (0,
|
|
330
|
+
const CardContent = /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
|
|
331
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: Projects_default.imageWrapper, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
270
332
|
"div",
|
|
271
333
|
{
|
|
272
|
-
className:
|
|
334
|
+
className: Projects_default.image,
|
|
273
335
|
style: {
|
|
274
336
|
backgroundImage: project.imageUrl ? `url("${project.imageUrl}")` : void 0,
|
|
275
337
|
backgroundColor: project.imageUrl ? void 0 : "#e5e7eb"
|
|
@@ -278,92 +340,94 @@ function Projects({
|
|
|
278
340
|
"aria-label": project.imageAlt || project.title
|
|
279
341
|
}
|
|
280
342
|
) }),
|
|
281
|
-
/* @__PURE__ */ (0,
|
|
282
|
-
/* @__PURE__ */ (0,
|
|
283
|
-
/* @__PURE__ */ (0,
|
|
284
|
-
/* @__PURE__ */ (0,
|
|
343
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: Projects_default.content, children: [
|
|
344
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h3", { className: Projects_default.projectTitle, children: project.title }),
|
|
345
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: Projects_default.description, children: project.description }),
|
|
346
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: Projects_default.caseStudyLink, children: [
|
|
285
347
|
"View Project",
|
|
286
348
|
" ",
|
|
287
|
-
/* @__PURE__ */ (0,
|
|
349
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "material-symbols-outlined", children: "arrow_forward" })
|
|
288
350
|
] })
|
|
289
351
|
] })
|
|
290
352
|
] });
|
|
291
|
-
return project.slug?.current ? /* @__PURE__ */ (0,
|
|
353
|
+
return project.slug?.current ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
292
354
|
import_link2.default,
|
|
293
355
|
{
|
|
294
356
|
href: projectUrl,
|
|
295
|
-
className:
|
|
357
|
+
className: Projects_default.card,
|
|
296
358
|
children: CardContent
|
|
297
359
|
},
|
|
298
360
|
project._id
|
|
299
|
-
) : /* @__PURE__ */ (0,
|
|
361
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: Projects_default.card, children: CardContent }, project._id);
|
|
300
362
|
}) })
|
|
301
363
|
] });
|
|
302
364
|
}
|
|
303
365
|
|
|
366
|
+
// src/styles/Publications.module.css
|
|
367
|
+
var Publications_default = {};
|
|
368
|
+
|
|
304
369
|
// src/components/Publications.tsx
|
|
305
|
-
var
|
|
306
|
-
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
370
|
+
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
307
371
|
function Publications({ publications }) {
|
|
308
|
-
return /* @__PURE__ */ (0,
|
|
309
|
-
/* @__PURE__ */ (0,
|
|
310
|
-
/* @__PURE__ */ (0,
|
|
311
|
-
/* @__PURE__ */ (0,
|
|
312
|
-
/* @__PURE__ */ (0,
|
|
313
|
-
/* @__PURE__ */ (0,
|
|
372
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("section", { className: Publications_default.publications, id: "publications", children: [
|
|
373
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: Publications_default.header, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h2", { className: Publications_default.title, children: "Recent Publications" }) }),
|
|
374
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: Publications_default.list, children: publications.map((pub) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: Publications_default.item, children: [
|
|
375
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: Publications_default.itemHeader, children: [
|
|
376
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h3", { className: Publications_default.pubTitle, children: pub.title }),
|
|
377
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: Publications_default.year, children: pub.year })
|
|
314
378
|
] }),
|
|
315
|
-
/* @__PURE__ */ (0,
|
|
316
|
-
/* @__PURE__ */ (0,
|
|
317
|
-
/* @__PURE__ */ (0,
|
|
318
|
-
pub.pdfUrl && /* @__PURE__ */ (0,
|
|
379
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: Publications_default.authors, children: pub.authors }),
|
|
380
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: Publications_default.venue, children: pub.venue }),
|
|
381
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: Publications_default.links, children: [
|
|
382
|
+
pub.pdfUrl && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
|
|
319
383
|
"a",
|
|
320
384
|
{
|
|
321
385
|
href: pub.pdfUrl,
|
|
322
386
|
target: "_blank",
|
|
323
387
|
rel: "noopener noreferrer",
|
|
324
|
-
className:
|
|
388
|
+
className: Publications_default.linkBtn,
|
|
325
389
|
children: [
|
|
326
|
-
/* @__PURE__ */ (0,
|
|
390
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "material-symbols-outlined", children: "description" }),
|
|
327
391
|
"PDF"
|
|
328
392
|
]
|
|
329
393
|
}
|
|
330
394
|
),
|
|
331
|
-
pub.codeUrl && /* @__PURE__ */ (0,
|
|
395
|
+
pub.codeUrl && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
|
|
332
396
|
"a",
|
|
333
397
|
{
|
|
334
398
|
href: pub.codeUrl,
|
|
335
399
|
target: "_blank",
|
|
336
400
|
rel: "noopener noreferrer",
|
|
337
|
-
className:
|
|
401
|
+
className: Publications_default.linkBtn,
|
|
338
402
|
children: [
|
|
339
|
-
/* @__PURE__ */ (0,
|
|
403
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "material-symbols-outlined", children: "code" }),
|
|
340
404
|
"Code"
|
|
341
405
|
]
|
|
342
406
|
}
|
|
343
407
|
),
|
|
344
|
-
pub.videoUrl && /* @__PURE__ */ (0,
|
|
408
|
+
pub.videoUrl && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
|
|
345
409
|
"a",
|
|
346
410
|
{
|
|
347
411
|
href: pub.videoUrl,
|
|
348
412
|
target: "_blank",
|
|
349
413
|
rel: "noopener noreferrer",
|
|
350
|
-
className:
|
|
414
|
+
className: Publications_default.linkBtn,
|
|
351
415
|
children: [
|
|
352
|
-
/* @__PURE__ */ (0,
|
|
416
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "material-symbols-outlined", children: "videocam" }),
|
|
353
417
|
"Video"
|
|
354
418
|
]
|
|
355
419
|
}
|
|
356
420
|
),
|
|
357
|
-
pub.bibtex && /* @__PURE__ */ (0,
|
|
421
|
+
pub.bibtex && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
|
|
358
422
|
"button",
|
|
359
423
|
{
|
|
360
424
|
onClick: () => {
|
|
361
425
|
navigator.clipboard.writeText(pub.bibtex || "");
|
|
362
426
|
alert("BibTeX copied to clipboard!");
|
|
363
427
|
},
|
|
364
|
-
className:
|
|
428
|
+
className: Publications_default.linkBtn,
|
|
365
429
|
children: [
|
|
366
|
-
/* @__PURE__ */ (0,
|
|
430
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "material-symbols-outlined", children: "format_quote" }),
|
|
367
431
|
"BibTeX"
|
|
368
432
|
]
|
|
369
433
|
}
|
|
@@ -372,6 +436,164 @@ function Publications({ publications }) {
|
|
|
372
436
|
] }, pub._id)) })
|
|
373
437
|
] });
|
|
374
438
|
}
|
|
439
|
+
|
|
440
|
+
// src/config.ts
|
|
441
|
+
function defineConfig(config) {
|
|
442
|
+
return config;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// src/schemas/client.ts
|
|
446
|
+
var import_next_sanity = require("next-sanity");
|
|
447
|
+
|
|
448
|
+
// src/schemas/env.ts
|
|
449
|
+
var apiVersion = process.env.NEXT_PUBLIC_SANITY_API_VERSION || "2024-01-01";
|
|
450
|
+
var dataset = process.env.NEXT_PUBLIC_SANITY_DATASET || "production";
|
|
451
|
+
var projectId = process.env.NEXT_PUBLIC_SANITY_PROJECT_ID || "";
|
|
452
|
+
var useCdn = false;
|
|
453
|
+
|
|
454
|
+
// src/schemas/client.ts
|
|
455
|
+
var client = projectId ? (0, import_next_sanity.createClient)({
|
|
456
|
+
projectId,
|
|
457
|
+
dataset,
|
|
458
|
+
apiVersion,
|
|
459
|
+
useCdn
|
|
460
|
+
}) : null;
|
|
461
|
+
|
|
462
|
+
// src/schemas/queries.ts
|
|
463
|
+
var import_next_sanity2 = require("next-sanity");
|
|
464
|
+
var siteSettingsQuery = import_next_sanity2.groq`
|
|
465
|
+
*[_type == "siteSettings"][0] {
|
|
466
|
+
siteName,
|
|
467
|
+
siteTitle,
|
|
468
|
+
primaryColor,
|
|
469
|
+
backgroundColor,
|
|
470
|
+
textColor,
|
|
471
|
+
secondaryTextColor,
|
|
472
|
+
contactEmail,
|
|
473
|
+
footerText
|
|
474
|
+
}
|
|
475
|
+
`;
|
|
476
|
+
var navigationQuery = import_next_sanity2.groq`
|
|
477
|
+
*[_type == "navigation"][0] {
|
|
478
|
+
links[] {
|
|
479
|
+
label,
|
|
480
|
+
href
|
|
481
|
+
},
|
|
482
|
+
showContactButton,
|
|
483
|
+
contactButtonText
|
|
484
|
+
}
|
|
485
|
+
`;
|
|
486
|
+
var aboutQuery = import_next_sanity2.groq`
|
|
487
|
+
*[_type == "about"][0] {
|
|
488
|
+
name,
|
|
489
|
+
greeting,
|
|
490
|
+
title,
|
|
491
|
+
bio,
|
|
492
|
+
"profileImageUrl": profileImage.asset->url,
|
|
493
|
+
socialLinks[] {
|
|
494
|
+
platform,
|
|
495
|
+
url
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
`;
|
|
499
|
+
var projectsQuery = import_next_sanity2.groq`
|
|
500
|
+
*[_type == "project" && featured == true] | order(order asc) {
|
|
501
|
+
_id,
|
|
502
|
+
title,
|
|
503
|
+
description,
|
|
504
|
+
"imageUrl": image.asset->url,
|
|
505
|
+
imageAlt,
|
|
506
|
+
caseStudyUrl,
|
|
507
|
+
slug
|
|
508
|
+
}
|
|
509
|
+
`;
|
|
510
|
+
var publicationsQuery = import_next_sanity2.groq`
|
|
511
|
+
*[_type == "publication"] | order(year desc, order asc) {
|
|
512
|
+
_id,
|
|
513
|
+
title,
|
|
514
|
+
authors,
|
|
515
|
+
venue,
|
|
516
|
+
year,
|
|
517
|
+
pdfUrl,
|
|
518
|
+
codeUrl,
|
|
519
|
+
videoUrl,
|
|
520
|
+
bibtex
|
|
521
|
+
}
|
|
522
|
+
`;
|
|
523
|
+
var cvSectionQuery = import_next_sanity2.groq`
|
|
524
|
+
*[_type == "cvSection"][0] {
|
|
525
|
+
heading,
|
|
526
|
+
description,
|
|
527
|
+
buttonText,
|
|
528
|
+
"cvFileUrl": cvFile.asset->url
|
|
529
|
+
}
|
|
530
|
+
`;
|
|
531
|
+
var projectBySlugQuery = import_next_sanity2.groq`
|
|
532
|
+
*[_type == "project" && slug.current == $slug][0] {
|
|
533
|
+
_id,
|
|
534
|
+
title,
|
|
535
|
+
description,
|
|
536
|
+
"imageUrl": image.asset->url,
|
|
537
|
+
imageAlt,
|
|
538
|
+
caseStudyUrl,
|
|
539
|
+
slug
|
|
540
|
+
}
|
|
541
|
+
`;
|
|
542
|
+
var allProjectSlugsQuery = import_next_sanity2.groq`
|
|
543
|
+
*[_type == "project" && defined(slug.current)][].slug.current
|
|
544
|
+
`;
|
|
545
|
+
|
|
546
|
+
// src/lib/sanity.ts
|
|
547
|
+
async function getSiteSettings() {
|
|
548
|
+
if (!client) return null;
|
|
549
|
+
return client.fetch(siteSettingsQuery);
|
|
550
|
+
}
|
|
551
|
+
async function getNavigation() {
|
|
552
|
+
if (!client) return null;
|
|
553
|
+
return client.fetch(navigationQuery);
|
|
554
|
+
}
|
|
555
|
+
async function getAbout() {
|
|
556
|
+
if (!client) return null;
|
|
557
|
+
return client.fetch(aboutQuery);
|
|
558
|
+
}
|
|
559
|
+
async function getProjects() {
|
|
560
|
+
if (!client) return [];
|
|
561
|
+
return client.fetch(projectsQuery);
|
|
562
|
+
}
|
|
563
|
+
async function getPublications() {
|
|
564
|
+
if (!client) return [];
|
|
565
|
+
return client.fetch(publicationsQuery);
|
|
566
|
+
}
|
|
567
|
+
async function getCVSection() {
|
|
568
|
+
if (!client) return null;
|
|
569
|
+
return client.fetch(cvSectionQuery);
|
|
570
|
+
}
|
|
571
|
+
async function getAllPageData() {
|
|
572
|
+
const [siteSettings, navigation, about, projects, publications, cvSection] = await Promise.all([
|
|
573
|
+
getSiteSettings(),
|
|
574
|
+
getNavigation(),
|
|
575
|
+
getAbout(),
|
|
576
|
+
getProjects(),
|
|
577
|
+
getPublications(),
|
|
578
|
+
getCVSection()
|
|
579
|
+
]);
|
|
580
|
+
return {
|
|
581
|
+
siteSettings,
|
|
582
|
+
navigation,
|
|
583
|
+
about,
|
|
584
|
+
projects,
|
|
585
|
+
publications,
|
|
586
|
+
cvSection
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
async function getProjectBySlug(slug) {
|
|
590
|
+
if (!client) return null;
|
|
591
|
+
return client.fetch(projectBySlugQuery, { slug });
|
|
592
|
+
}
|
|
593
|
+
async function getAllProjectSlugs() {
|
|
594
|
+
if (!client) return [];
|
|
595
|
+
return client.fetch(allProjectSlugsQuery);
|
|
596
|
+
}
|
|
375
597
|
// Annotate the CommonJS export names for ESM import in node:
|
|
376
598
|
0 && (module.exports = {
|
|
377
599
|
About,
|
|
@@ -379,5 +601,17 @@ function Publications({ publications }) {
|
|
|
379
601
|
Footer,
|
|
380
602
|
Header,
|
|
381
603
|
Projects,
|
|
382
|
-
Publications
|
|
604
|
+
Publications,
|
|
605
|
+
ThemeProvider,
|
|
606
|
+
defineConfig,
|
|
607
|
+
getAbout,
|
|
608
|
+
getAllPageData,
|
|
609
|
+
getAllProjectSlugs,
|
|
610
|
+
getCVSection,
|
|
611
|
+
getNavigation,
|
|
612
|
+
getProjectBySlug,
|
|
613
|
+
getProjects,
|
|
614
|
+
getPublications,
|
|
615
|
+
getSiteSettings,
|
|
616
|
+
useTheme
|
|
383
617
|
});
|