@prosophia/personal-cv 0.0.2 → 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/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: import_About.default.about, id: "about", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: import_About.default.card, children: [
69
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: import_About.default.imageWrapper, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
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: import_About.default.profileImage,
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: import_About.default.content, children: [
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: import_About.default.greeting, children: greeting }),
84
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: import_About.default.title, children: title }),
85
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: import_About.default.bio, children: bio })
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: import_About.default.socialLinks, children: socialLinks.map((link) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
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: import_About.default.socialLink,
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: import_CVSection.default.cv, id: "cv", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: import_CVSection.default.card, children: [
113
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: import_CVSection.default.content, children: [
114
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: import_CVSection.default.iconWrapper, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "material-symbols-outlined", children: "history_edu" }) }),
115
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: import_CVSection.default.textContent, children: [
116
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h2", { className: import_CVSection.default.title, children: heading }),
117
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: import_CVSection.default.description, children: description })
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: import_CVSection.default.downloadBtn,
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: import_CVSection.default.downloadBtn, disabled: true, children: [
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: import_CVSection.default.background })
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: import_Footer.default.footer, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Footer.default.content, children: [
145
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: import_Footer.default.copyright, children: footerText }),
146
- email && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Footer.default.emailWrapper, children: [
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: import_Footer.default.email, children: email })
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 import_react = require("react");
172
+ var import_react2 = require("react");
155
173
  var import_link = __toESM(require("next/link"));
156
- var import_Header = __toESM(require("@/styles/Header.module.css"));
157
- var import_ThemeContext = require("@/context/ThemeContext");
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, import_react.useState)(false);
167
- const { theme, toggleTheme, mounted } = (0, import_ThemeContext.useTheme)();
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, 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 })
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, 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)(
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: import_Header.default.navLink,
243
+ className: Header_default.navLink,
186
244
  children: link.label
187
245
  },
188
246
  link.href
189
247
  )) }),
190
- mounted && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
248
+ mounted && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
191
249
  "button",
192
250
  {
193
- className: import_Header.default.themeToggle,
251
+ className: Header_default.themeToggle,
194
252
  onClick: toggleTheme,
195
253
  "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" })
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, import_jsx_runtime4.jsx)(
257
+ showContactButton && contactEmail && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
200
258
  "a",
201
259
  {
202
260
  href: `mailto:${contactEmail}`,
203
- className: import_Header.default.contactBtn,
204
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: contactButtonText })
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, import_jsx_runtime4.jsxs)("div", { className: import_Header.default.mobileActions, children: [
209
- mounted && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
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: import_Header.default.mobileThemeToggle,
270
+ className: Header_default.mobileThemeToggle,
213
271
  onClick: toggleTheme,
214
272
  "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" })
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, import_jsx_runtime4.jsx)(
276
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
219
277
  "button",
220
278
  {
221
- className: import_Header.default.mobileMenuBtn,
279
+ className: Header_default.mobileMenuBtn,
222
280
  onClick: toggleMobileMenu,
223
281
  "aria-label": "Toggle menu",
224
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "material-symbols-outlined", children: mobileMenuOpen ? "close" : "menu" })
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, 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)(
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: import_Header.default.mobileNavLink,
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, import_jsx_runtime4.jsx)(
298
+ showContactButton && contactEmail && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
241
299
  "a",
242
300
  {
243
301
  href: `mailto:${contactEmail}`,
244
- className: import_Header.default.mobileContactBtn,
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
- var import_Projects = __toESM(require("@/styles/Projects.module.css"));
255
- var import_jsx_runtime5 = require("react/jsx-runtime");
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, 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" })
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, import_jsx_runtime5.jsx)("div", { className: import_Projects.default.grid, children: projects.map((project) => {
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, 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)(
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: import_Projects.default.image,
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, 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: [
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, import_jsx_runtime5.jsx)("span", { className: "material-symbols-outlined", children: "arrow_forward" })
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, import_jsx_runtime5.jsx)(
353
+ return project.slug?.current ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
292
354
  import_link2.default,
293
355
  {
294
356
  href: projectUrl,
295
- className: import_Projects.default.card,
357
+ className: Projects_default.card,
296
358
  children: CardContent
297
359
  },
298
360
  project._id
299
- ) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: import_Projects.default.card, children: CardContent }, project._id);
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 import_Publications = __toESM(require("@/styles/Publications.module.css"));
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, 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 })
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, 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)(
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: import_Publications.default.linkBtn,
388
+ className: Publications_default.linkBtn,
325
389
  children: [
326
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "material-symbols-outlined", children: "description" }),
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, import_jsx_runtime6.jsxs)(
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: import_Publications.default.linkBtn,
401
+ className: Publications_default.linkBtn,
338
402
  children: [
339
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "material-symbols-outlined", children: "code" }),
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, import_jsx_runtime6.jsxs)(
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: import_Publications.default.linkBtn,
414
+ className: Publications_default.linkBtn,
351
415
  children: [
352
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "material-symbols-outlined", children: "videocam" }),
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, import_jsx_runtime6.jsxs)(
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: import_Publications.default.linkBtn,
428
+ className: Publications_default.linkBtn,
365
429
  children: [
366
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "material-symbols-outlined", children: "format_quote" }),
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
  });