@prosophia/personal-cv 0.0.4 → 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.d.mts CHANGED
@@ -8,19 +8,43 @@ interface FooterProps {
8
8
  }
9
9
  declare function Footer({ footerText, email }: FooterProps): react_jsx_runtime.JSX.Element;
10
10
 
11
- interface NavLink {
11
+ interface NavLink$1 {
12
12
  label: string;
13
13
  href: string;
14
14
  }
15
15
  interface HeaderProps {
16
16
  siteName: string;
17
- navLinks: NavLink[];
17
+ navLinks: NavLink$1[];
18
18
  showContactButton?: boolean;
19
19
  contactButtonText?: string;
20
20
  contactEmail?: string;
21
21
  }
22
22
  declare function Header({ siteName, navLinks, showContactButton, contactButtonText, contactEmail, }: HeaderProps): react_jsx_runtime.JSX.Element;
23
23
 
24
+ interface NavLink {
25
+ label: string;
26
+ href: string;
27
+ }
28
+ interface SiteSettings$1 {
29
+ siteName?: string;
30
+ navLinks?: NavLink[];
31
+ showContactButton?: boolean;
32
+ contactButtonText?: string;
33
+ contactEmail?: string;
34
+ footerText?: string;
35
+ }
36
+ interface HomePageProps {
37
+ children?: React.ReactNode;
38
+ settings?: SiteSettings$1 | null;
39
+ header?: React.ReactNode;
40
+ footer?: React.ReactNode;
41
+ }
42
+ /**
43
+ * Main HomePage wrapper for personal-cv template
44
+ * Provides consistent header/footer with customizable main content
45
+ */
46
+ declare function HomePage({ children, settings, header, footer, }: HomePageProps): react_jsx_runtime.JSX.Element;
47
+
24
48
  interface Project$1 {
25
49
  _id: string;
26
50
  title: string;
@@ -147,4 +171,4 @@ declare function getAllPageData(): Promise<{
147
171
  declare function getProjectBySlug(slug: string): Promise<Project | null>;
148
172
  declare function getAllProjectSlugs(): Promise<string[]>;
149
173
 
150
- export { Footer, Header, Projects, ProsophiaConfig, Publications, ThemeProvider, defineConfig, getAbout, getAllPageData, getAllProjectSlugs, getCVSection, getNavigation, getProjectBySlug, getProjects, getPublications, getSiteSettings, useTheme };
174
+ export { Footer, Header, HomePage, type HomePageProps, Projects, ProsophiaConfig, Publications, ThemeProvider, defineConfig, getAbout, getAllPageData, getAllProjectSlugs, getCVSection, getNavigation, getProjectBySlug, getProjects, getPublications, getSiteSettings, useTheme };
package/dist/index.d.ts CHANGED
@@ -8,19 +8,43 @@ interface FooterProps {
8
8
  }
9
9
  declare function Footer({ footerText, email }: FooterProps): react_jsx_runtime.JSX.Element;
10
10
 
11
- interface NavLink {
11
+ interface NavLink$1 {
12
12
  label: string;
13
13
  href: string;
14
14
  }
15
15
  interface HeaderProps {
16
16
  siteName: string;
17
- navLinks: NavLink[];
17
+ navLinks: NavLink$1[];
18
18
  showContactButton?: boolean;
19
19
  contactButtonText?: string;
20
20
  contactEmail?: string;
21
21
  }
22
22
  declare function Header({ siteName, navLinks, showContactButton, contactButtonText, contactEmail, }: HeaderProps): react_jsx_runtime.JSX.Element;
23
23
 
24
+ interface NavLink {
25
+ label: string;
26
+ href: string;
27
+ }
28
+ interface SiteSettings$1 {
29
+ siteName?: string;
30
+ navLinks?: NavLink[];
31
+ showContactButton?: boolean;
32
+ contactButtonText?: string;
33
+ contactEmail?: string;
34
+ footerText?: string;
35
+ }
36
+ interface HomePageProps {
37
+ children?: React.ReactNode;
38
+ settings?: SiteSettings$1 | null;
39
+ header?: React.ReactNode;
40
+ footer?: React.ReactNode;
41
+ }
42
+ /**
43
+ * Main HomePage wrapper for personal-cv template
44
+ * Provides consistent header/footer with customizable main content
45
+ */
46
+ declare function HomePage({ children, settings, header, footer, }: HomePageProps): react_jsx_runtime.JSX.Element;
47
+
24
48
  interface Project$1 {
25
49
  _id: string;
26
50
  title: string;
@@ -147,4 +171,4 @@ declare function getAllPageData(): Promise<{
147
171
  declare function getProjectBySlug(slug: string): Promise<Project | null>;
148
172
  declare function getAllProjectSlugs(): Promise<string[]>;
149
173
 
150
- export { Footer, Header, Projects, ProsophiaConfig, Publications, ThemeProvider, defineConfig, getAbout, getAllPageData, getAllProjectSlugs, getCVSection, getNavigation, getProjectBySlug, getProjects, getPublications, getSiteSettings, useTheme };
174
+ export { Footer, Header, HomePage, type HomePageProps, Projects, ProsophiaConfig, Publications, ThemeProvider, defineConfig, getAbout, getAllPageData, getAllProjectSlugs, getCVSection, getNavigation, getProjectBySlug, getProjects, getPublications, getSiteSettings, useTheme };
package/dist/index.js CHANGED
@@ -34,6 +34,7 @@ __export(index_exports, {
34
34
  CVSection: () => CVSection,
35
35
  Footer: () => Footer,
36
36
  Header: () => Header,
37
+ HomePage: () => HomePage,
37
38
  Projects: () => Projects,
38
39
  Publications: () => Publications,
39
40
  ThemeProvider: () => ThemeProvider,
@@ -51,10 +52,8 @@ __export(index_exports, {
51
52
  });
52
53
  module.exports = __toCommonJS(index_exports);
53
54
 
54
- // src/styles/About.module.css
55
- var About_default = {};
56
-
57
55
  // src/components/About.tsx
56
+ var import_About = __toESM(require("./About.module.css"));
58
57
  var import_jsx_runtime = require("react/jsx-runtime");
59
58
  var socialIcons = {
60
59
  scholar: "school",
@@ -79,11 +78,11 @@ function About({
79
78
  profileImageUrl,
80
79
  socialLinks = []
81
80
  }) {
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)(
81
+ 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: [
82
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: import_About.default.imageWrapper, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
84
83
  "div",
85
84
  {
86
- className: About_default.profileImage,
85
+ className: import_About.default.profileImage,
87
86
  style: {
88
87
  backgroundImage: profileImageUrl ? `url("${profileImageUrl}")` : void 0,
89
88
  backgroundColor: profileImageUrl ? void 0 : "#e5e7eb"
@@ -92,19 +91,19 @@ function About({
92
91
  "aria-label": "Profile photo"
93
92
  }
94
93
  ) }),
95
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: About_default.content, children: [
94
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: import_About.default.content, children: [
96
95
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
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 })
96
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", { className: import_About.default.greeting, children: greeting }),
97
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: import_About.default.title, children: title }),
98
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: import_About.default.bio, children: bio })
100
99
  ] }),
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)(
100
+ 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)(
102
101
  "a",
103
102
  {
104
103
  href: link.url,
105
104
  target: "_blank",
106
105
  rel: "noopener noreferrer",
107
- className: About_default.socialLink,
106
+ className: import_About.default.socialLink,
108
107
  "aria-label": socialLabels[link.platform] || link.platform,
109
108
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "material-symbols-outlined", children: socialIcons[link.platform] || "link" })
110
109
  },
@@ -114,10 +113,8 @@ function About({
114
113
  ] }) });
115
114
  }
116
115
 
117
- // src/styles/CVSection.module.css
118
- var CVSection_default = {};
119
-
120
116
  // src/components/CVSection.tsx
117
+ var import_CVSection = __toESM(require("./CVSection.module.css"));
121
118
  var import_jsx_runtime2 = require("react/jsx-runtime");
122
119
  function CVSection({
123
120
  heading,
@@ -125,12 +122,12 @@ function CVSection({
125
122
  buttonText,
126
123
  cvFileUrl
127
124
  }) {
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 })
125
+ 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: [
126
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: import_CVSection.default.content, children: [
127
+ /* @__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" }) }),
128
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: import_CVSection.default.textContent, children: [
129
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h2", { className: import_CVSection.default.title, children: heading }),
130
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: import_CVSection.default.description, children: description })
134
131
  ] }),
135
132
  cvFileUrl ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
136
133
  "a",
@@ -138,32 +135,30 @@ function CVSection({
138
135
  href: cvFileUrl,
139
136
  target: "_blank",
140
137
  rel: "noopener noreferrer",
141
- className: CVSection_default.downloadBtn,
138
+ className: import_CVSection.default.downloadBtn,
142
139
  children: [
143
140
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "material-symbols-outlined", children: "download" }),
144
141
  buttonText
145
142
  ]
146
143
  }
147
- ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { className: CVSection_default.downloadBtn, disabled: true, children: [
144
+ ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { className: import_CVSection.default.downloadBtn, disabled: true, children: [
148
145
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "material-symbols-outlined", children: "download" }),
149
146
  buttonText
150
147
  ] })
151
148
  ] }),
152
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: CVSection_default.background })
149
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: import_CVSection.default.background })
153
150
  ] }) });
154
151
  }
155
152
 
156
- // src/styles/Footer.module.css
157
- var Footer_default = {};
158
-
159
153
  // src/components/Footer.tsx
154
+ var import_Footer = __toESM(require("./Footer.module.css"));
160
155
  var import_jsx_runtime3 = require("react/jsx-runtime");
161
156
  function Footer({ footerText, email }) {
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: [
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: [
158
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: import_Footer.default.copyright, children: footerText }),
159
+ email && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: import_Footer.default.emailWrapper, children: [
165
160
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "material-symbols-outlined", children: "mail" }),
166
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("a", { href: `mailto:${email}`, className: Footer_default.email, children: email })
161
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("a", { href: `mailto:${email}`, className: import_Footer.default.email, children: email })
167
162
  ] })
168
163
  ] }) });
169
164
  }
@@ -171,9 +166,7 @@ function Footer({ footerText, email }) {
171
166
  // src/components/Header.tsx
172
167
  var import_react2 = require("react");
173
168
  var import_link = __toESM(require("next/link"));
174
-
175
- // src/styles/Header.module.css
176
- var Header_default = {};
169
+ var import_Header = __toESM(require("./Header.module.css"));
177
170
 
178
171
  // src/context/ThemeContext.tsx
179
172
  var import_react = require("react");
@@ -230,17 +223,17 @@ function Header({
230
223
  setMobileMenuOpen(false);
231
224
  };
232
225
  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 })
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 })
237
230
  ] }),
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)(
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)(
240
233
  import_link.default,
241
234
  {
242
235
  href: link.href,
243
- className: Header_default.navLink,
236
+ className: import_Header.default.navLink,
244
237
  children: link.label
245
238
  },
246
239
  link.href
@@ -248,7 +241,7 @@ function Header({
248
241
  mounted && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
249
242
  "button",
250
243
  {
251
- className: Header_default.themeToggle,
244
+ className: import_Header.default.themeToggle,
252
245
  onClick: toggleTheme,
253
246
  "aria-label": `Switch to ${theme === "light" ? "dark" : "light"} mode`,
254
247
  children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "material-symbols-outlined", children: theme === "light" ? "dark_mode" : "light_mode" })
@@ -258,16 +251,16 @@ function Header({
258
251
  "a",
259
252
  {
260
253
  href: `mailto:${contactEmail}`,
261
- className: Header_default.contactBtn,
254
+ className: import_Header.default.contactBtn,
262
255
  children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { children: contactButtonText })
263
256
  }
264
257
  )
265
258
  ] }),
266
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: Header_default.mobileActions, children: [
259
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: import_Header.default.mobileActions, children: [
267
260
  mounted && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
268
261
  "button",
269
262
  {
270
- className: Header_default.mobileThemeToggle,
263
+ className: import_Header.default.mobileThemeToggle,
271
264
  onClick: toggleTheme,
272
265
  "aria-label": `Switch to ${theme === "light" ? "dark" : "light"} mode`,
273
266
  children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "material-symbols-outlined", children: theme === "light" ? "dark_mode" : "light_mode" })
@@ -276,7 +269,7 @@ function Header({
276
269
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
277
270
  "button",
278
271
  {
279
- className: Header_default.mobileMenuBtn,
272
+ className: import_Header.default.mobileMenuBtn,
280
273
  onClick: toggleMobileMenu,
281
274
  "aria-label": "Toggle menu",
282
275
  children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "material-symbols-outlined", children: mobileMenuOpen ? "close" : "menu" })
@@ -284,12 +277,12 @@ function Header({
284
277
  )
285
278
  ] })
286
279
  ] }) }),
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)(
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)(
289
282
  import_link.default,
290
283
  {
291
284
  href: link.href,
292
- className: Header_default.mobileNavLink,
285
+ className: import_Header.default.mobileNavLink,
293
286
  onClick: closeMobileMenu,
294
287
  children: link.label
295
288
  },
@@ -299,7 +292,7 @@ function Header({
299
292
  "a",
300
293
  {
301
294
  href: `mailto:${contactEmail}`,
302
- className: Header_default.mobileContactBtn,
295
+ className: import_Header.default.mobileContactBtn,
303
296
  children: contactButtonText
304
297
  }
305
298
  )
@@ -307,31 +300,66 @@ function Header({
307
300
  ] });
308
301
  }
309
302
 
310
- // src/components/Projects.tsx
311
- var import_link2 = __toESM(require("next/link"));
312
-
313
- // src/styles/Projects.module.css
314
- var Projects_default = {};
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
+ }
315
341
 
316
342
  // src/components/Projects.tsx
317
- var import_jsx_runtime6 = require("react/jsx-runtime");
343
+ var import_link2 = __toESM(require("next/link"));
344
+ var import_Projects = __toESM(require("./Projects.module.css"));
345
+ var import_jsx_runtime7 = require("react/jsx-runtime");
318
346
  function Projects({
319
347
  projects,
320
348
  showViewAll = true,
321
349
  viewAllUrl = "#"
322
350
  }) {
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" })
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" })
327
355
  ] }),
328
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: Projects_default.grid, children: projects.map((project) => {
356
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: import_Projects.default.grid, children: projects.map((project) => {
329
357
  const projectUrl = project.slug?.current ? `/projects/${project.slug.current}` : project.caseStudyUrl;
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)(
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)(
332
360
  "div",
333
361
  {
334
- className: Projects_default.image,
362
+ className: import_Projects.default.image,
335
363
  style: {
336
364
  backgroundImage: project.imageUrl ? `url("${project.imageUrl}")` : void 0,
337
365
  backgroundColor: project.imageUrl ? void 0 : "#e5e7eb"
@@ -340,94 +368,92 @@ function Projects({
340
368
  "aria-label": project.imageAlt || project.title
341
369
  }
342
370
  ) }),
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: [
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: [
347
375
  "View Project",
348
376
  " ",
349
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "material-symbols-outlined", children: "arrow_forward" })
377
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "material-symbols-outlined", children: "arrow_forward" })
350
378
  ] })
351
379
  ] })
352
380
  ] });
353
- return project.slug?.current ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
381
+ return project.slug?.current ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
354
382
  import_link2.default,
355
383
  {
356
384
  href: projectUrl,
357
- className: Projects_default.card,
385
+ className: import_Projects.default.card,
358
386
  children: CardContent
359
387
  },
360
388
  project._id
361
- ) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: Projects_default.card, children: CardContent }, project._id);
389
+ ) : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: import_Projects.default.card, children: CardContent }, project._id);
362
390
  }) })
363
391
  ] });
364
392
  }
365
393
 
366
- // src/styles/Publications.module.css
367
- var Publications_default = {};
368
-
369
394
  // src/components/Publications.tsx
370
- var import_jsx_runtime7 = require("react/jsx-runtime");
395
+ var import_Publications = __toESM(require("./Publications.module.css"));
396
+ var import_jsx_runtime8 = require("react/jsx-runtime");
371
397
  function Publications({ publications }) {
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 })
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 })
378
404
  ] }),
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)(
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)(
383
409
  "a",
384
410
  {
385
411
  href: pub.pdfUrl,
386
412
  target: "_blank",
387
413
  rel: "noopener noreferrer",
388
- className: Publications_default.linkBtn,
414
+ className: import_Publications.default.linkBtn,
389
415
  children: [
390
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "material-symbols-outlined", children: "description" }),
416
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "material-symbols-outlined", children: "description" }),
391
417
  "PDF"
392
418
  ]
393
419
  }
394
420
  ),
395
- pub.codeUrl && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
421
+ pub.codeUrl && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
396
422
  "a",
397
423
  {
398
424
  href: pub.codeUrl,
399
425
  target: "_blank",
400
426
  rel: "noopener noreferrer",
401
- className: Publications_default.linkBtn,
427
+ className: import_Publications.default.linkBtn,
402
428
  children: [
403
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "material-symbols-outlined", children: "code" }),
429
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "material-symbols-outlined", children: "code" }),
404
430
  "Code"
405
431
  ]
406
432
  }
407
433
  ),
408
- pub.videoUrl && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
434
+ pub.videoUrl && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
409
435
  "a",
410
436
  {
411
437
  href: pub.videoUrl,
412
438
  target: "_blank",
413
439
  rel: "noopener noreferrer",
414
- className: Publications_default.linkBtn,
440
+ className: import_Publications.default.linkBtn,
415
441
  children: [
416
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "material-symbols-outlined", children: "videocam" }),
442
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "material-symbols-outlined", children: "videocam" }),
417
443
  "Video"
418
444
  ]
419
445
  }
420
446
  ),
421
- pub.bibtex && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
447
+ pub.bibtex && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
422
448
  "button",
423
449
  {
424
450
  onClick: () => {
425
451
  navigator.clipboard.writeText(pub.bibtex || "");
426
452
  alert("BibTeX copied to clipboard!");
427
453
  },
428
- className: Publications_default.linkBtn,
454
+ className: import_Publications.default.linkBtn,
429
455
  children: [
430
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "material-symbols-outlined", children: "format_quote" }),
456
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "material-symbols-outlined", children: "format_quote" }),
431
457
  "BibTeX"
432
458
  ]
433
459
  }
@@ -600,6 +626,7 @@ async function getAllProjectSlugs() {
600
626
  CVSection,
601
627
  Footer,
602
628
  Header,
629
+ HomePage,
603
630
  Projects,
604
631
  Publications,
605
632
  ThemeProvider,