@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 +27 -3
- package/dist/index.d.ts +27 -3
- package/dist/index.js +124 -97
- package/dist/index.mjs +123 -97
- package/package.json +1 -1
- package/dist/index.css +0 -648
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:
|
|
83
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className:
|
|
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:
|
|
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:
|
|
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:
|
|
98
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className:
|
|
99
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className:
|
|
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:
|
|
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:
|
|
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:
|
|
129
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className:
|
|
130
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className:
|
|
131
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className:
|
|
132
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h2", { className:
|
|
133
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
163
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className:
|
|
164
|
-
email && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className:
|
|
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:
|
|
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:
|
|
234
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_link.default, { href: "/", className:
|
|
235
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className:
|
|
236
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h2", { className:
|
|
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:
|
|
239
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("nav", { className:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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: `${
|
|
288
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("nav", { className:
|
|
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:
|
|
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:
|
|
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/
|
|
311
|
-
var
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
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
|
|
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,
|
|
324
|
-
/* @__PURE__ */ (0,
|
|
325
|
-
/* @__PURE__ */ (0,
|
|
326
|
-
showViewAll && /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
331
|
-
/* @__PURE__ */ (0,
|
|
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:
|
|
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,
|
|
344
|
-
/* @__PURE__ */ (0,
|
|
345
|
-
/* @__PURE__ */ (0,
|
|
346
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
381
|
+
return project.slug?.current ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
354
382
|
import_link2.default,
|
|
355
383
|
{
|
|
356
384
|
href: projectUrl,
|
|
357
|
-
className:
|
|
385
|
+
className: import_Projects.default.card,
|
|
358
386
|
children: CardContent
|
|
359
387
|
},
|
|
360
388
|
project._id
|
|
361
|
-
) : /* @__PURE__ */ (0,
|
|
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
|
|
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,
|
|
373
|
-
/* @__PURE__ */ (0,
|
|
374
|
-
/* @__PURE__ */ (0,
|
|
375
|
-
/* @__PURE__ */ (0,
|
|
376
|
-
/* @__PURE__ */ (0,
|
|
377
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
380
|
-
/* @__PURE__ */ (0,
|
|
381
|
-
/* @__PURE__ */ (0,
|
|
382
|
-
pub.pdfUrl && /* @__PURE__ */ (0,
|
|
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:
|
|
414
|
+
className: import_Publications.default.linkBtn,
|
|
389
415
|
children: [
|
|
390
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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:
|
|
427
|
+
className: import_Publications.default.linkBtn,
|
|
402
428
|
children: [
|
|
403
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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:
|
|
440
|
+
className: import_Publications.default.linkBtn,
|
|
415
441
|
children: [
|
|
416
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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:
|
|
454
|
+
className: import_Publications.default.linkBtn,
|
|
429
455
|
children: [
|
|
430
|
-
/* @__PURE__ */ (0,
|
|
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,
|