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