@prosophia/personal-portfolio 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/Divider.module.css +11 -0
- package/dist/Experience.module.css +122 -0
- package/dist/Footer.module.css +36 -0
- package/dist/Header.module.css +242 -0
- package/dist/Hero.module.css +239 -0
- package/dist/Projects.module.css +113 -0
- package/dist/Publications.module.css +154 -0
- package/dist/index-dczHpph_.d.mts +106 -0
- package/dist/index-dczHpph_.d.ts +106 -0
- package/dist/index.css +795 -0
- package/dist/index.d.mts +130 -0
- package/dist/index.d.ts +130 -0
- package/dist/index.js +737 -206
- package/dist/index.mjs +697 -180
- package/dist/layouts/index.d.mts +14 -0
- package/dist/layouts/index.d.ts +14 -0
- package/dist/layouts/index.js +331 -0
- package/dist/layouts/index.mjs +304 -0
- package/dist/schemas/index.d.mts +433 -0
- package/dist/schemas/index.d.ts +433 -0
- package/dist/schemas/index.js +457 -0
- package/dist/schemas/index.mjs +424 -0
- package/dist/styles/globals.css +1 -0
- package/package.json +19 -7
package/dist/index.js
CHANGED
|
@@ -35,24 +35,471 @@ __export(index_exports, {
|
|
|
35
35
|
Footer: () => Footer,
|
|
36
36
|
Header: () => Header,
|
|
37
37
|
Hero: () => Hero,
|
|
38
|
+
HomePage: () => HomePage,
|
|
38
39
|
Projects: () => Projects,
|
|
39
|
-
Publications: () => Publications
|
|
40
|
+
Publications: () => Publications,
|
|
41
|
+
SiteSettingsProvider: () => SiteSettingsProvider,
|
|
42
|
+
ThemeProvider: () => ThemeProvider,
|
|
43
|
+
applyFonts: () => applyFonts,
|
|
44
|
+
applyThemeColors: () => applyThemeColors,
|
|
45
|
+
colorPresets: () => colorPresets,
|
|
46
|
+
configureSanityClient: () => configureSanityClient,
|
|
47
|
+
defineConfig: () => defineConfig,
|
|
48
|
+
fontPresets: () => fontPresets,
|
|
49
|
+
getColorConfig: () => getColorConfig,
|
|
50
|
+
getFontFamily: () => getFontFamily,
|
|
51
|
+
urlFor: () => urlFor,
|
|
52
|
+
useSiteSettings: () => useSiteSettings,
|
|
53
|
+
useTheme: () => useTheme
|
|
40
54
|
});
|
|
41
55
|
module.exports = __toCommonJS(index_exports);
|
|
42
56
|
|
|
57
|
+
// src/components/Divider.module.css
|
|
58
|
+
var Divider_default = {};
|
|
59
|
+
|
|
43
60
|
// src/components/Divider.tsx
|
|
44
|
-
var import_Divider = __toESM(require("./Divider.module.css"));
|
|
45
61
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
46
62
|
function Divider() {
|
|
47
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("hr", { className:
|
|
63
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("hr", { className: Divider_default.divider });
|
|
48
64
|
}
|
|
49
65
|
|
|
50
66
|
// src/components/Experience.tsx
|
|
51
67
|
var import_framer_motion = require("framer-motion");
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
var
|
|
68
|
+
|
|
69
|
+
// src/components/Experience.module.css
|
|
70
|
+
var Experience_default = {};
|
|
71
|
+
|
|
72
|
+
// src/styles/motion.ts
|
|
73
|
+
var easeOutExpo = [0.16, 1, 0.3, 1];
|
|
74
|
+
var springStiff = {
|
|
75
|
+
mass: 1,
|
|
76
|
+
stiffness: 100,
|
|
77
|
+
damping: 15
|
|
78
|
+
};
|
|
79
|
+
var timing = {
|
|
80
|
+
quick: 0.15,
|
|
81
|
+
standard: 0.35,
|
|
82
|
+
ambient: 0.8
|
|
83
|
+
};
|
|
84
|
+
var fadeInUp = {
|
|
85
|
+
hidden: {
|
|
86
|
+
opacity: 0,
|
|
87
|
+
y: 20
|
|
88
|
+
},
|
|
89
|
+
visible: {
|
|
90
|
+
opacity: 1,
|
|
91
|
+
y: 0,
|
|
92
|
+
transition: {
|
|
93
|
+
duration: timing.standard,
|
|
94
|
+
ease: easeOutExpo
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
var fadeIn = {
|
|
99
|
+
hidden: {
|
|
100
|
+
opacity: 0
|
|
101
|
+
},
|
|
102
|
+
visible: {
|
|
103
|
+
opacity: 1,
|
|
104
|
+
transition: {
|
|
105
|
+
duration: timing.standard,
|
|
106
|
+
ease: easeOutExpo
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
var blurFade = {
|
|
111
|
+
hidden: {
|
|
112
|
+
opacity: 0,
|
|
113
|
+
filter: "blur(10px)"
|
|
114
|
+
},
|
|
115
|
+
visible: {
|
|
116
|
+
opacity: 1,
|
|
117
|
+
filter: "blur(0px)",
|
|
118
|
+
transition: {
|
|
119
|
+
duration: timing.standard,
|
|
120
|
+
ease: easeOutExpo
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
var staggerContainer = {
|
|
125
|
+
hidden: { opacity: 1 },
|
|
126
|
+
visible: {
|
|
127
|
+
opacity: 1,
|
|
128
|
+
transition: {
|
|
129
|
+
staggerChildren: 0.05,
|
|
130
|
+
delayChildren: 0.1
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
var slideInLeft = {
|
|
135
|
+
hidden: {
|
|
136
|
+
opacity: 0,
|
|
137
|
+
x: -20
|
|
138
|
+
},
|
|
139
|
+
visible: {
|
|
140
|
+
opacity: 1,
|
|
141
|
+
x: 0,
|
|
142
|
+
transition: {
|
|
143
|
+
duration: timing.standard,
|
|
144
|
+
ease: easeOutExpo
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
var scaleUp = {
|
|
149
|
+
hidden: {
|
|
150
|
+
opacity: 0,
|
|
151
|
+
scale: 0.95
|
|
152
|
+
},
|
|
153
|
+
visible: {
|
|
154
|
+
opacity: 1,
|
|
155
|
+
scale: 1,
|
|
156
|
+
transition: {
|
|
157
|
+
duration: timing.standard,
|
|
158
|
+
ease: easeOutExpo
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
var hoverLift = {
|
|
163
|
+
y: -5,
|
|
164
|
+
transition: {
|
|
165
|
+
type: "spring",
|
|
166
|
+
mass: springStiff.mass,
|
|
167
|
+
stiffness: springStiff.stiffness,
|
|
168
|
+
damping: springStiff.damping
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
var tapScale = {
|
|
172
|
+
scale: 0.95
|
|
173
|
+
};
|
|
174
|
+
var cardHover = {
|
|
175
|
+
scale: 1.02,
|
|
176
|
+
transition: {
|
|
177
|
+
type: "spring",
|
|
178
|
+
mass: springStiff.mass,
|
|
179
|
+
stiffness: springStiff.stiffness,
|
|
180
|
+
damping: springStiff.damping
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
var pageTransition = {
|
|
184
|
+
initial: {
|
|
185
|
+
opacity: 0,
|
|
186
|
+
x: -20
|
|
187
|
+
},
|
|
188
|
+
animate: {
|
|
189
|
+
opacity: 1,
|
|
190
|
+
x: 0,
|
|
191
|
+
transition: {
|
|
192
|
+
duration: timing.standard,
|
|
193
|
+
ease: easeOutExpo
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
exit: {
|
|
197
|
+
opacity: 0,
|
|
198
|
+
x: 20,
|
|
199
|
+
transition: {
|
|
200
|
+
duration: timing.quick,
|
|
201
|
+
ease: easeOutExpo
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
// src/context/SiteSettingsContext.tsx
|
|
207
|
+
var import_react2 = require("react");
|
|
208
|
+
|
|
209
|
+
// src/context/ThemeContext.tsx
|
|
210
|
+
var import_react = require("react");
|
|
55
211
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
212
|
+
var ThemeContext = (0, import_react.createContext)({
|
|
213
|
+
theme: "dark",
|
|
214
|
+
toggleTheme: () => {
|
|
215
|
+
},
|
|
216
|
+
mounted: false
|
|
217
|
+
});
|
|
218
|
+
function ThemeProvider({ children }) {
|
|
219
|
+
const [theme, setTheme] = (0, import_react.useState)("dark");
|
|
220
|
+
const [mounted, setMounted] = (0, import_react.useState)(false);
|
|
221
|
+
(0, import_react.useEffect)(() => {
|
|
222
|
+
setMounted(true);
|
|
223
|
+
const stored = localStorage.getItem("theme");
|
|
224
|
+
if (stored) {
|
|
225
|
+
setTheme(stored);
|
|
226
|
+
} else if (window.matchMedia("(prefers-color-scheme: light)").matches) {
|
|
227
|
+
setTheme("light");
|
|
228
|
+
}
|
|
229
|
+
}, []);
|
|
230
|
+
(0, import_react.useEffect)(() => {
|
|
231
|
+
if (mounted) {
|
|
232
|
+
document.documentElement.setAttribute("data-theme", theme);
|
|
233
|
+
localStorage.setItem("theme", theme);
|
|
234
|
+
}
|
|
235
|
+
}, [theme, mounted]);
|
|
236
|
+
const toggleTheme = () => {
|
|
237
|
+
setTheme((prev) => prev === "dark" ? "light" : "dark");
|
|
238
|
+
};
|
|
239
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ThemeContext.Provider, { value: { theme, toggleTheme, mounted }, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { "data-theme": theme, children }) });
|
|
240
|
+
}
|
|
241
|
+
function useTheme() {
|
|
242
|
+
const context = (0, import_react.useContext)(ThemeContext);
|
|
243
|
+
return context;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// src/lib/themeColors.ts
|
|
247
|
+
var colorPresets = {
|
|
248
|
+
violet: {
|
|
249
|
+
light: {
|
|
250
|
+
primary: "#8b5cf6",
|
|
251
|
+
primaryHover: "#7c3aed",
|
|
252
|
+
primaryLight: "#a78bfa",
|
|
253
|
+
tagBg: "rgba(139, 92, 246, 0.1)",
|
|
254
|
+
shadow: "rgba(139, 92, 246, 0.15)",
|
|
255
|
+
borderHighlight: "rgba(139, 92, 246, 0.2)",
|
|
256
|
+
glassBorder: "rgba(139, 92, 246, 0.1)"
|
|
257
|
+
},
|
|
258
|
+
dark: {
|
|
259
|
+
primary: "#a78bfa",
|
|
260
|
+
primaryHover: "#8b5cf6",
|
|
261
|
+
primaryLight: "#c4b5fd",
|
|
262
|
+
tagBg: "rgba(167, 139, 250, 0.15)",
|
|
263
|
+
shadow: "rgba(139, 92, 246, 0.2)",
|
|
264
|
+
borderHighlight: "rgba(167, 139, 250, 0.2)",
|
|
265
|
+
glassBorder: "rgba(167, 139, 250, 0.1)"
|
|
266
|
+
}
|
|
267
|
+
},
|
|
268
|
+
blue: {
|
|
269
|
+
light: {
|
|
270
|
+
primary: "#3b82f6",
|
|
271
|
+
primaryHover: "#2563eb",
|
|
272
|
+
primaryLight: "#60a5fa",
|
|
273
|
+
tagBg: "rgba(59, 130, 246, 0.1)",
|
|
274
|
+
shadow: "rgba(59, 130, 246, 0.15)",
|
|
275
|
+
borderHighlight: "rgba(59, 130, 246, 0.2)",
|
|
276
|
+
glassBorder: "rgba(59, 130, 246, 0.1)"
|
|
277
|
+
},
|
|
278
|
+
dark: {
|
|
279
|
+
primary: "#60a5fa",
|
|
280
|
+
primaryHover: "#3b82f6",
|
|
281
|
+
primaryLight: "#93c5fd",
|
|
282
|
+
tagBg: "rgba(96, 165, 250, 0.15)",
|
|
283
|
+
shadow: "rgba(59, 130, 246, 0.2)",
|
|
284
|
+
borderHighlight: "rgba(96, 165, 250, 0.2)",
|
|
285
|
+
glassBorder: "rgba(96, 165, 250, 0.1)"
|
|
286
|
+
}
|
|
287
|
+
},
|
|
288
|
+
emerald: {
|
|
289
|
+
light: {
|
|
290
|
+
primary: "#10b981",
|
|
291
|
+
primaryHover: "#059669",
|
|
292
|
+
primaryLight: "#34d399",
|
|
293
|
+
tagBg: "rgba(16, 185, 129, 0.1)",
|
|
294
|
+
shadow: "rgba(16, 185, 129, 0.15)",
|
|
295
|
+
borderHighlight: "rgba(16, 185, 129, 0.2)",
|
|
296
|
+
glassBorder: "rgba(16, 185, 129, 0.1)"
|
|
297
|
+
},
|
|
298
|
+
dark: {
|
|
299
|
+
primary: "#34d399",
|
|
300
|
+
primaryHover: "#10b981",
|
|
301
|
+
primaryLight: "#6ee7b7",
|
|
302
|
+
tagBg: "rgba(52, 211, 153, 0.15)",
|
|
303
|
+
shadow: "rgba(16, 185, 129, 0.2)",
|
|
304
|
+
borderHighlight: "rgba(52, 211, 153, 0.2)",
|
|
305
|
+
glassBorder: "rgba(52, 211, 153, 0.1)"
|
|
306
|
+
}
|
|
307
|
+
},
|
|
308
|
+
rose: {
|
|
309
|
+
light: {
|
|
310
|
+
primary: "#f43f5e",
|
|
311
|
+
primaryHover: "#e11d48",
|
|
312
|
+
primaryLight: "#fb7185",
|
|
313
|
+
tagBg: "rgba(244, 63, 94, 0.1)",
|
|
314
|
+
shadow: "rgba(244, 63, 94, 0.15)",
|
|
315
|
+
borderHighlight: "rgba(244, 63, 94, 0.2)",
|
|
316
|
+
glassBorder: "rgba(244, 63, 94, 0.1)"
|
|
317
|
+
},
|
|
318
|
+
dark: {
|
|
319
|
+
primary: "#fb7185",
|
|
320
|
+
primaryHover: "#f43f5e",
|
|
321
|
+
primaryLight: "#fda4af",
|
|
322
|
+
tagBg: "rgba(251, 113, 133, 0.15)",
|
|
323
|
+
shadow: "rgba(244, 63, 94, 0.2)",
|
|
324
|
+
borderHighlight: "rgba(251, 113, 133, 0.2)",
|
|
325
|
+
glassBorder: "rgba(251, 113, 133, 0.1)"
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
amber: {
|
|
329
|
+
light: {
|
|
330
|
+
primary: "#f59e0b",
|
|
331
|
+
primaryHover: "#d97706",
|
|
332
|
+
primaryLight: "#fbbf24",
|
|
333
|
+
tagBg: "rgba(245, 158, 11, 0.1)",
|
|
334
|
+
shadow: "rgba(245, 158, 11, 0.15)",
|
|
335
|
+
borderHighlight: "rgba(245, 158, 11, 0.2)",
|
|
336
|
+
glassBorder: "rgba(245, 158, 11, 0.1)"
|
|
337
|
+
},
|
|
338
|
+
dark: {
|
|
339
|
+
primary: "#fbbf24",
|
|
340
|
+
primaryHover: "#f59e0b",
|
|
341
|
+
primaryLight: "#fcd34d",
|
|
342
|
+
tagBg: "rgba(251, 191, 36, 0.15)",
|
|
343
|
+
shadow: "rgba(245, 158, 11, 0.2)",
|
|
344
|
+
borderHighlight: "rgba(251, 191, 36, 0.2)",
|
|
345
|
+
glassBorder: "rgba(251, 191, 36, 0.1)"
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
cyan: {
|
|
349
|
+
light: {
|
|
350
|
+
primary: "#06b6d4",
|
|
351
|
+
primaryHover: "#0891b2",
|
|
352
|
+
primaryLight: "#22d3ee",
|
|
353
|
+
tagBg: "rgba(6, 182, 212, 0.1)",
|
|
354
|
+
shadow: "rgba(6, 182, 212, 0.15)",
|
|
355
|
+
borderHighlight: "rgba(6, 182, 212, 0.2)",
|
|
356
|
+
glassBorder: "rgba(6, 182, 212, 0.1)"
|
|
357
|
+
},
|
|
358
|
+
dark: {
|
|
359
|
+
primary: "#22d3ee",
|
|
360
|
+
primaryHover: "#06b6d4",
|
|
361
|
+
primaryLight: "#67e8f9",
|
|
362
|
+
tagBg: "rgba(34, 211, 238, 0.15)",
|
|
363
|
+
shadow: "rgba(6, 182, 212, 0.2)",
|
|
364
|
+
borderHighlight: "rgba(34, 211, 238, 0.2)",
|
|
365
|
+
glassBorder: "rgba(34, 211, 238, 0.1)"
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
function getColorConfig(preset, customColor) {
|
|
370
|
+
if (preset === "custom" && customColor) {
|
|
371
|
+
const hex = customColor.replace("#", "");
|
|
372
|
+
const r = parseInt(hex.substring(0, 2), 16);
|
|
373
|
+
const g = parseInt(hex.substring(2, 4), 16);
|
|
374
|
+
const b = parseInt(hex.substring(4, 6), 16);
|
|
375
|
+
const lighterR = Math.min(255, r + 40);
|
|
376
|
+
const lighterG = Math.min(255, g + 40);
|
|
377
|
+
const lighterB = Math.min(255, b + 40);
|
|
378
|
+
const lighter = `#${lighterR.toString(16).padStart(2, "0")}${lighterG.toString(16).padStart(2, "0")}${lighterB.toString(16).padStart(2, "0")}`;
|
|
379
|
+
const darkerR = Math.max(0, r - 20);
|
|
380
|
+
const darkerG = Math.max(0, g - 20);
|
|
381
|
+
const darkerB = Math.max(0, b - 20);
|
|
382
|
+
const darker = `#${darkerR.toString(16).padStart(2, "0")}${darkerG.toString(16).padStart(2, "0")}${darkerB.toString(16).padStart(2, "0")}`;
|
|
383
|
+
return {
|
|
384
|
+
light: {
|
|
385
|
+
primary: customColor,
|
|
386
|
+
primaryHover: darker,
|
|
387
|
+
primaryLight: lighter,
|
|
388
|
+
tagBg: `rgba(${r}, ${g}, ${b}, 0.1)`,
|
|
389
|
+
shadow: `rgba(${r}, ${g}, ${b}, 0.15)`,
|
|
390
|
+
borderHighlight: `rgba(${r}, ${g}, ${b}, 0.2)`,
|
|
391
|
+
glassBorder: `rgba(${r}, ${g}, ${b}, 0.1)`
|
|
392
|
+
},
|
|
393
|
+
dark: {
|
|
394
|
+
primary: lighter,
|
|
395
|
+
primaryHover: customColor,
|
|
396
|
+
primaryLight: lighter,
|
|
397
|
+
tagBg: `rgba(${lighterR}, ${lighterG}, ${lighterB}, 0.15)`,
|
|
398
|
+
shadow: `rgba(${r}, ${g}, ${b}, 0.2)`,
|
|
399
|
+
borderHighlight: `rgba(${lighterR}, ${lighterG}, ${lighterB}, 0.2)`,
|
|
400
|
+
glassBorder: `rgba(${lighterR}, ${lighterG}, ${lighterB}, 0.1)`
|
|
401
|
+
}
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
return colorPresets[preset] || colorPresets.violet;
|
|
405
|
+
}
|
|
406
|
+
function applyThemeColors(preset, customColor, isDark = false) {
|
|
407
|
+
const config = getColorConfig(preset, customColor);
|
|
408
|
+
const colors = isDark ? config.dark : config.light;
|
|
409
|
+
document.documentElement.style.setProperty("--primary", colors.primary);
|
|
410
|
+
document.documentElement.style.setProperty("--primary-hover", colors.primaryHover);
|
|
411
|
+
document.documentElement.style.setProperty("--primary-light", colors.primaryLight);
|
|
412
|
+
document.documentElement.style.setProperty("--tag-bg", colors.tagBg);
|
|
413
|
+
document.documentElement.style.setProperty("--shadow", colors.shadow);
|
|
414
|
+
document.documentElement.style.setProperty("--border-highlight", colors.borderHighlight);
|
|
415
|
+
document.documentElement.style.setProperty("--glass-border", colors.glassBorder);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// src/lib/fonts.ts
|
|
419
|
+
var fontPresets = {
|
|
420
|
+
"inter": {
|
|
421
|
+
family: "Inter",
|
|
422
|
+
fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
|
|
423
|
+
},
|
|
424
|
+
"roboto": {
|
|
425
|
+
family: "Roboto",
|
|
426
|
+
fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
|
|
427
|
+
},
|
|
428
|
+
"open-sans": {
|
|
429
|
+
family: "Open Sans",
|
|
430
|
+
fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
|
|
431
|
+
},
|
|
432
|
+
"lato": {
|
|
433
|
+
family: "Lato",
|
|
434
|
+
fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
|
|
435
|
+
},
|
|
436
|
+
"poppins": {
|
|
437
|
+
family: "Poppins",
|
|
438
|
+
fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
|
|
439
|
+
},
|
|
440
|
+
"montserrat": {
|
|
441
|
+
family: "Montserrat",
|
|
442
|
+
fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
|
|
443
|
+
},
|
|
444
|
+
"playfair-display": {
|
|
445
|
+
family: "Playfair Display",
|
|
446
|
+
fallback: "Georgia, 'Times New Roman', serif"
|
|
447
|
+
},
|
|
448
|
+
"source-sans-pro": {
|
|
449
|
+
family: "Source Sans 3",
|
|
450
|
+
fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
|
|
451
|
+
},
|
|
452
|
+
"merriweather": {
|
|
453
|
+
family: "Merriweather",
|
|
454
|
+
fallback: "Georgia, 'Times New Roman', serif"
|
|
455
|
+
}
|
|
456
|
+
};
|
|
457
|
+
function getFontFamily(preset) {
|
|
458
|
+
const config = fontPresets[preset] || fontPresets["inter"];
|
|
459
|
+
return `'${config.family}', ${config.fallback}`;
|
|
460
|
+
}
|
|
461
|
+
function applyFonts(headingFont, bodyFont) {
|
|
462
|
+
const heading = headingFont || "inter";
|
|
463
|
+
const body = bodyFont || "inter";
|
|
464
|
+
document.documentElement.style.setProperty("--font-heading", getFontFamily(heading));
|
|
465
|
+
document.documentElement.style.setProperty("--font-body", getFontFamily(body));
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
// src/context/SiteSettingsContext.tsx
|
|
469
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
470
|
+
var SiteSettingsContext = (0, import_react2.createContext)({
|
|
471
|
+
settings: null,
|
|
472
|
+
profile: null
|
|
473
|
+
});
|
|
474
|
+
function SiteSettingsProvider({
|
|
475
|
+
children,
|
|
476
|
+
settings,
|
|
477
|
+
profile
|
|
478
|
+
}) {
|
|
479
|
+
const { theme } = useTheme();
|
|
480
|
+
(0, import_react2.useEffect)(() => {
|
|
481
|
+
if (settings?.themeColor) {
|
|
482
|
+
applyThemeColors(
|
|
483
|
+
settings.themeColor.preset,
|
|
484
|
+
settings.themeColor.customColor,
|
|
485
|
+
theme === "dark"
|
|
486
|
+
);
|
|
487
|
+
}
|
|
488
|
+
}, [settings, theme]);
|
|
489
|
+
(0, import_react2.useEffect)(() => {
|
|
490
|
+
applyFonts(
|
|
491
|
+
settings?.fontFamily?.heading,
|
|
492
|
+
settings?.fontFamily?.body
|
|
493
|
+
);
|
|
494
|
+
}, [settings]);
|
|
495
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SiteSettingsContext.Provider, { value: { settings, profile }, children });
|
|
496
|
+
}
|
|
497
|
+
function useSiteSettings() {
|
|
498
|
+
return (0, import_react2.useContext)(SiteSettingsContext);
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// src/components/Experience.tsx
|
|
502
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
56
503
|
var defaultExperiences = [
|
|
57
504
|
{
|
|
58
505
|
_id: "1",
|
|
@@ -89,52 +536,52 @@ var defaultExperiences = [
|
|
|
89
536
|
}
|
|
90
537
|
];
|
|
91
538
|
function ExperienceSection({ experiences }) {
|
|
92
|
-
const { settings } =
|
|
539
|
+
const { settings } = useSiteSettings();
|
|
93
540
|
const displayExperiences = experiences.length > 0 ? experiences : defaultExperiences;
|
|
94
|
-
return /* @__PURE__ */ (0,
|
|
541
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
95
542
|
import_framer_motion.motion.section,
|
|
96
543
|
{
|
|
97
544
|
id: "cv",
|
|
98
|
-
className:
|
|
545
|
+
className: Experience_default.section,
|
|
99
546
|
initial: "hidden",
|
|
100
547
|
whileInView: "visible",
|
|
101
548
|
viewport: { once: true, amount: 0.1 },
|
|
102
|
-
variants:
|
|
549
|
+
variants: staggerContainer,
|
|
103
550
|
children: [
|
|
104
|
-
/* @__PURE__ */ (0,
|
|
105
|
-
/* @__PURE__ */ (0,
|
|
106
|
-
/* @__PURE__ */ (0,
|
|
551
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_framer_motion.motion.div, { className: Experience_default.header, variants: fadeInUp, children: [
|
|
552
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("h2", { className: Experience_default.title, children: "Experience & Education" }),
|
|
553
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
107
554
|
import_framer_motion.motion.a,
|
|
108
555
|
{
|
|
109
556
|
href: settings?.resumeUrl || "#",
|
|
110
|
-
className:
|
|
111
|
-
whileHover:
|
|
112
|
-
whileTap:
|
|
557
|
+
className: Experience_default.downloadButton,
|
|
558
|
+
whileHover: hoverLift,
|
|
559
|
+
whileTap: tapScale,
|
|
113
560
|
children: [
|
|
114
|
-
/* @__PURE__ */ (0,
|
|
561
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "material-symbols-outlined", children: "download" }),
|
|
115
562
|
"Download Resume"
|
|
116
563
|
]
|
|
117
564
|
}
|
|
118
565
|
)
|
|
119
566
|
] }),
|
|
120
|
-
/* @__PURE__ */ (0,
|
|
567
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: Experience_default.timeline, children: displayExperiences.map((exp) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
121
568
|
import_framer_motion.motion.div,
|
|
122
569
|
{
|
|
123
|
-
className:
|
|
124
|
-
variants:
|
|
570
|
+
className: Experience_default.timelineItem,
|
|
571
|
+
variants: fadeInUp,
|
|
125
572
|
children: [
|
|
126
|
-
/* @__PURE__ */ (0,
|
|
573
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
127
574
|
"div",
|
|
128
575
|
{
|
|
129
|
-
className: `${
|
|
576
|
+
className: `${Experience_default.timelineDot} ${exp.isCurrent ? Experience_default.timelineDotCurrent : ""}`
|
|
130
577
|
}
|
|
131
578
|
),
|
|
132
|
-
/* @__PURE__ */ (0,
|
|
133
|
-
/* @__PURE__ */ (0,
|
|
134
|
-
/* @__PURE__ */ (0,
|
|
579
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: Experience_default.timelineHeader, children: [
|
|
580
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("h3", { className: Experience_default.timelineTitle, children: exp.title }),
|
|
581
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: Experience_default.timelinePeriod, children: exp.period })
|
|
135
582
|
] }),
|
|
136
|
-
/* @__PURE__ */ (0,
|
|
137
|
-
exp.description && /* @__PURE__ */ (0,
|
|
583
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: Experience_default.timelineOrg, children: exp.organization }),
|
|
584
|
+
exp.description && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: Experience_default.timelineDescription, children: exp.description })
|
|
138
585
|
]
|
|
139
586
|
},
|
|
140
587
|
exp._id
|
|
@@ -146,22 +593,24 @@ function ExperienceSection({ experiences }) {
|
|
|
146
593
|
|
|
147
594
|
// src/components/Footer.tsx
|
|
148
595
|
var import_framer_motion2 = require("framer-motion");
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
var
|
|
152
|
-
|
|
596
|
+
|
|
597
|
+
// src/components/Footer.module.css
|
|
598
|
+
var Footer_default = {};
|
|
599
|
+
|
|
600
|
+
// src/components/Footer.tsx
|
|
601
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
153
602
|
function Footer() {
|
|
154
|
-
const { settings, profile } =
|
|
155
|
-
return /* @__PURE__ */ (0,
|
|
603
|
+
const { settings, profile } = useSiteSettings();
|
|
604
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
156
605
|
import_framer_motion2.motion.footer,
|
|
157
606
|
{
|
|
158
|
-
className:
|
|
607
|
+
className: Footer_default.footer,
|
|
159
608
|
initial: "hidden",
|
|
160
609
|
whileInView: "visible",
|
|
161
610
|
viewport: { once: true },
|
|
162
|
-
variants:
|
|
611
|
+
variants: fadeInUp,
|
|
163
612
|
children: [
|
|
164
|
-
/* @__PURE__ */ (0,
|
|
613
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: Footer_default.copyright, children: [
|
|
165
614
|
"\xA9 ",
|
|
166
615
|
(/* @__PURE__ */ new Date()).getFullYear(),
|
|
167
616
|
" ",
|
|
@@ -170,7 +619,7 @@ function Footer() {
|
|
|
170
619
|
" ",
|
|
171
620
|
settings?.footerText || "Built with Passion."
|
|
172
621
|
] }),
|
|
173
|
-
/* @__PURE__ */ (0,
|
|
622
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: Footer_default.updated, children: [
|
|
174
623
|
"Last updated: ",
|
|
175
624
|
(/* @__PURE__ */ new Date()).toLocaleDateString("en-US", { month: "long", day: "numeric", year: "numeric" })
|
|
176
625
|
] })
|
|
@@ -180,14 +629,15 @@ function Footer() {
|
|
|
180
629
|
}
|
|
181
630
|
|
|
182
631
|
// src/components/Header.tsx
|
|
183
|
-
var
|
|
632
|
+
var import_react3 = require("react");
|
|
184
633
|
var import_link = __toESM(require("next/link"));
|
|
185
634
|
var import_framer_motion3 = require("framer-motion");
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
var
|
|
189
|
-
|
|
190
|
-
|
|
635
|
+
|
|
636
|
+
// src/components/Header.module.css
|
|
637
|
+
var Header_default = {};
|
|
638
|
+
|
|
639
|
+
// src/components/Header.tsx
|
|
640
|
+
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
191
641
|
var navLinks = [
|
|
192
642
|
{ href: "#about", label: "About" },
|
|
193
643
|
{ href: "#publications", label: "Publications" },
|
|
@@ -195,43 +645,43 @@ var navLinks = [
|
|
|
195
645
|
{ href: "#cv", label: "CV / Resume" }
|
|
196
646
|
];
|
|
197
647
|
function Header() {
|
|
198
|
-
const { theme, toggleTheme } =
|
|
199
|
-
const { settings, profile } =
|
|
200
|
-
const [mobileMenuOpen, setMobileMenuOpen] = (0,
|
|
648
|
+
const { theme, toggleTheme } = useTheme();
|
|
649
|
+
const { settings, profile } = useSiteSettings();
|
|
650
|
+
const [mobileMenuOpen, setMobileMenuOpen] = (0, import_react3.useState)(false);
|
|
201
651
|
const socialLinks = settings?.socialLinks;
|
|
202
652
|
const contactEmail = settings?.contactEmail;
|
|
203
|
-
return /* @__PURE__ */ (0,
|
|
204
|
-
/* @__PURE__ */ (0,
|
|
205
|
-
/* @__PURE__ */ (0,
|
|
206
|
-
/* @__PURE__ */ (0,
|
|
207
|
-
/* @__PURE__ */ (0,
|
|
653
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("header", { className: Header_default.header, children: [
|
|
654
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: Header_default.container, children: [
|
|
655
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_link.default, { href: "/", className: Header_default.logo, children: [
|
|
656
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: Header_default.logoName, children: profile?.name || "David" }),
|
|
657
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: Header_default.logoTitle, children: profile?.title || "PhD Candidate" })
|
|
208
658
|
] }),
|
|
209
|
-
/* @__PURE__ */ (0,
|
|
659
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("nav", { className: Header_default.nav, children: navLinks.map((link) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_link.default, { href: link.href, className: Header_default.navLink, children: [
|
|
210
660
|
link.label,
|
|
211
|
-
/* @__PURE__ */ (0,
|
|
661
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: Header_default.navLinkUnderline })
|
|
212
662
|
] }, link.href)) }),
|
|
213
|
-
/* @__PURE__ */ (0,
|
|
214
|
-
/* @__PURE__ */ (0,
|
|
215
|
-
(socialLinks?.twitter || !settings) && /* @__PURE__ */ (0,
|
|
663
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: Header_default.actions, children: [
|
|
664
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: Header_default.socialLinks, children: [
|
|
665
|
+
(socialLinks?.twitter || !settings) && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
216
666
|
"a",
|
|
217
667
|
{
|
|
218
668
|
href: socialLinks?.twitter || "https://twitter.com",
|
|
219
669
|
target: "_blank",
|
|
220
670
|
rel: "noopener noreferrer",
|
|
221
|
-
className:
|
|
671
|
+
className: Header_default.socialLink,
|
|
222
672
|
"aria-label": "Twitter",
|
|
223
|
-
children: /* @__PURE__ */ (0,
|
|
673
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("svg", { fill: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("path", { d: "M8.29 20.251c7.547 0 11.675-6.253 11.675-11.675 0-.178 0-.355-.012-.53A8.348 8.348 0 0022 5.92a8.19 8.19 0 01-2.357.646 4.118 4.118 0 001.804-2.27 8.224 8.224 0 01-2.605.996 4.107 4.107 0 00-6.993 3.743 11.65 11.65 0 01-8.457-4.287 4.106 4.106 0 001.27 5.477A4.072 4.072 0 012.8 9.713v.052a4.105 4.105 0 003.292 4.022 4.095 4.095 0 01-1.853.07 4.108 4.108 0 003.834 2.85A8.233 8.233 0 012 18.407a11.616 11.616 0 006.29 1.84" }) })
|
|
224
674
|
}
|
|
225
675
|
),
|
|
226
|
-
(socialLinks?.github || !settings) && /* @__PURE__ */ (0,
|
|
676
|
+
(socialLinks?.github || !settings) && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
227
677
|
"a",
|
|
228
678
|
{
|
|
229
679
|
href: socialLinks?.github || "https://github.com",
|
|
230
680
|
target: "_blank",
|
|
231
681
|
rel: "noopener noreferrer",
|
|
232
|
-
className:
|
|
682
|
+
className: Header_default.socialLink,
|
|
233
683
|
"aria-label": "GitHub",
|
|
234
|
-
children: /* @__PURE__ */ (0,
|
|
684
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("svg", { fill: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
235
685
|
"path",
|
|
236
686
|
{
|
|
237
687
|
fillRule: "evenodd",
|
|
@@ -241,15 +691,15 @@ function Header() {
|
|
|
241
691
|
) })
|
|
242
692
|
}
|
|
243
693
|
),
|
|
244
|
-
(socialLinks?.linkedin || !settings) && /* @__PURE__ */ (0,
|
|
694
|
+
(socialLinks?.linkedin || !settings) && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
245
695
|
"a",
|
|
246
696
|
{
|
|
247
697
|
href: socialLinks?.linkedin || "https://linkedin.com",
|
|
248
698
|
target: "_blank",
|
|
249
699
|
rel: "noopener noreferrer",
|
|
250
|
-
className:
|
|
700
|
+
className: Header_default.socialLink,
|
|
251
701
|
"aria-label": "LinkedIn",
|
|
252
|
-
children: /* @__PURE__ */ (0,
|
|
702
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("svg", { fill: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
253
703
|
"path",
|
|
254
704
|
{
|
|
255
705
|
fillRule: "evenodd",
|
|
@@ -260,15 +710,15 @@ function Header() {
|
|
|
260
710
|
}
|
|
261
711
|
)
|
|
262
712
|
] }),
|
|
263
|
-
/* @__PURE__ */ (0,
|
|
713
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
264
714
|
import_framer_motion3.motion.button,
|
|
265
715
|
{
|
|
266
|
-
className:
|
|
716
|
+
className: Header_default.themeToggle,
|
|
267
717
|
onClick: toggleTheme,
|
|
268
|
-
whileHover:
|
|
269
|
-
whileTap:
|
|
718
|
+
whileHover: hoverLift,
|
|
719
|
+
whileTap: tapScale,
|
|
270
720
|
"aria-label": `Switch to ${theme === "dark" ? "light" : "dark"} mode`,
|
|
271
|
-
children: theme === "dark" ? /* @__PURE__ */ (0,
|
|
721
|
+
children: theme === "dark" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
272
722
|
"svg",
|
|
273
723
|
{
|
|
274
724
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -281,18 +731,18 @@ function Header() {
|
|
|
281
731
|
strokeLinecap: "round",
|
|
282
732
|
strokeLinejoin: "round",
|
|
283
733
|
children: [
|
|
284
|
-
/* @__PURE__ */ (0,
|
|
285
|
-
/* @__PURE__ */ (0,
|
|
286
|
-
/* @__PURE__ */ (0,
|
|
287
|
-
/* @__PURE__ */ (0,
|
|
288
|
-
/* @__PURE__ */ (0,
|
|
289
|
-
/* @__PURE__ */ (0,
|
|
290
|
-
/* @__PURE__ */ (0,
|
|
291
|
-
/* @__PURE__ */ (0,
|
|
292
|
-
/* @__PURE__ */ (0,
|
|
734
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("circle", { cx: "12", cy: "12", r: "5" }),
|
|
735
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("line", { x1: "12", y1: "1", x2: "12", y2: "3" }),
|
|
736
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("line", { x1: "12", y1: "21", x2: "12", y2: "23" }),
|
|
737
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("line", { x1: "4.22", y1: "4.22", x2: "5.64", y2: "5.64" }),
|
|
738
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("line", { x1: "18.36", y1: "18.36", x2: "19.78", y2: "19.78" }),
|
|
739
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("line", { x1: "1", y1: "12", x2: "3", y2: "12" }),
|
|
740
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("line", { x1: "21", y1: "12", x2: "23", y2: "12" }),
|
|
741
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("line", { x1: "4.22", y1: "19.78", x2: "5.64", y2: "18.36" }),
|
|
742
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("line", { x1: "18.36", y1: "5.64", x2: "19.78", y2: "4.22" })
|
|
293
743
|
]
|
|
294
744
|
}
|
|
295
|
-
) : /* @__PURE__ */ (0,
|
|
745
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
296
746
|
"svg",
|
|
297
747
|
{
|
|
298
748
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -304,31 +754,31 @@ function Header() {
|
|
|
304
754
|
strokeWidth: "2",
|
|
305
755
|
strokeLinecap: "round",
|
|
306
756
|
strokeLinejoin: "round",
|
|
307
|
-
children: /* @__PURE__ */ (0,
|
|
757
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" })
|
|
308
758
|
}
|
|
309
759
|
)
|
|
310
760
|
}
|
|
311
761
|
),
|
|
312
|
-
/* @__PURE__ */ (0,
|
|
762
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
313
763
|
import_framer_motion3.motion.a,
|
|
314
764
|
{
|
|
315
765
|
href: contactEmail ? `mailto:${contactEmail}` : "mailto:contact@example.com",
|
|
316
|
-
className:
|
|
317
|
-
whileHover:
|
|
318
|
-
whileTap:
|
|
766
|
+
className: Header_default.contactButton,
|
|
767
|
+
whileHover: hoverLift,
|
|
768
|
+
whileTap: tapScale,
|
|
319
769
|
children: [
|
|
320
|
-
/* @__PURE__ */ (0,
|
|
321
|
-
/* @__PURE__ */ (0,
|
|
770
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: `material-symbols-outlined ${Header_default.contactButtonIcon}`, children: "mail" }),
|
|
771
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: Header_default.contactButtonText, children: "Contact" })
|
|
322
772
|
]
|
|
323
773
|
}
|
|
324
774
|
),
|
|
325
|
-
/* @__PURE__ */ (0,
|
|
775
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
326
776
|
"button",
|
|
327
777
|
{
|
|
328
|
-
className:
|
|
778
|
+
className: Header_default.mobileMenuButton,
|
|
329
779
|
onClick: () => setMobileMenuOpen(!mobileMenuOpen),
|
|
330
780
|
"aria-label": "Toggle menu",
|
|
331
|
-
children: /* @__PURE__ */ (0,
|
|
781
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
332
782
|
"svg",
|
|
333
783
|
{
|
|
334
784
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -340,13 +790,13 @@ function Header() {
|
|
|
340
790
|
strokeWidth: "2",
|
|
341
791
|
strokeLinecap: "round",
|
|
342
792
|
strokeLinejoin: "round",
|
|
343
|
-
children: mobileMenuOpen ? /* @__PURE__ */ (0,
|
|
344
|
-
/* @__PURE__ */ (0,
|
|
345
|
-
/* @__PURE__ */ (0,
|
|
346
|
-
] }) : /* @__PURE__ */ (0,
|
|
347
|
-
/* @__PURE__ */ (0,
|
|
348
|
-
/* @__PURE__ */ (0,
|
|
349
|
-
/* @__PURE__ */ (0,
|
|
793
|
+
children: mobileMenuOpen ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
|
|
794
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
|
|
795
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
|
|
796
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
|
|
797
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("line", { x1: "3", y1: "12", x2: "21", y2: "12" }),
|
|
798
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("line", { x1: "3", y1: "6", x2: "21", y2: "6" }),
|
|
799
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("line", { x1: "3", y1: "18", x2: "21", y2: "18" })
|
|
350
800
|
] })
|
|
351
801
|
}
|
|
352
802
|
)
|
|
@@ -354,19 +804,19 @@ function Header() {
|
|
|
354
804
|
)
|
|
355
805
|
] })
|
|
356
806
|
] }),
|
|
357
|
-
/* @__PURE__ */ (0,
|
|
807
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_framer_motion3.AnimatePresence, { children: mobileMenuOpen && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
358
808
|
import_framer_motion3.motion.nav,
|
|
359
809
|
{
|
|
360
|
-
className:
|
|
810
|
+
className: Header_default.mobileNav,
|
|
361
811
|
initial: { opacity: 0, y: -10 },
|
|
362
812
|
animate: { opacity: 1, y: 0 },
|
|
363
813
|
exit: { opacity: 0, y: -10 },
|
|
364
814
|
transition: { duration: 0.2 },
|
|
365
|
-
children: navLinks.map((link) => /* @__PURE__ */ (0,
|
|
815
|
+
children: navLinks.map((link) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
366
816
|
import_link.default,
|
|
367
817
|
{
|
|
368
818
|
href: link.href,
|
|
369
|
-
className:
|
|
819
|
+
className: Header_default.mobileNavLink,
|
|
370
820
|
onClick: () => setMobileMenuOpen(false),
|
|
371
821
|
children: link.label
|
|
372
822
|
},
|
|
@@ -379,12 +829,47 @@ function Header() {
|
|
|
379
829
|
|
|
380
830
|
// src/components/Hero.tsx
|
|
381
831
|
var import_framer_motion4 = require("framer-motion");
|
|
382
|
-
var
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
var
|
|
386
|
-
|
|
387
|
-
|
|
832
|
+
var import_react4 = require("@portabletext/react");
|
|
833
|
+
|
|
834
|
+
// src/components/Hero.module.css
|
|
835
|
+
var Hero_default = {};
|
|
836
|
+
|
|
837
|
+
// src/lib/sanity.ts
|
|
838
|
+
var import_image_url = __toESM(require("@sanity/image-url"));
|
|
839
|
+
var builder = null;
|
|
840
|
+
function configureSanityClient(client) {
|
|
841
|
+
builder = (0, import_image_url.default)({
|
|
842
|
+
projectId: client.projectId,
|
|
843
|
+
dataset: client.dataset
|
|
844
|
+
});
|
|
845
|
+
}
|
|
846
|
+
function urlFor(source) {
|
|
847
|
+
if (!source) {
|
|
848
|
+
return {
|
|
849
|
+
width: () => ({ height: () => ({ url: () => "" }), url: () => "" }),
|
|
850
|
+
height: () => ({ width: () => ({ url: () => "" }), url: () => "" }),
|
|
851
|
+
url: () => ""
|
|
852
|
+
};
|
|
853
|
+
}
|
|
854
|
+
if (!builder) {
|
|
855
|
+
const projectId = typeof window !== "undefined" ? window.__SANITY_PROJECT_ID__ : process.env.NEXT_PUBLIC_SANITY_PROJECT_ID;
|
|
856
|
+
const dataset = typeof window !== "undefined" ? window.__SANITY_DATASET__ : process.env.NEXT_PUBLIC_SANITY_DATASET || "production";
|
|
857
|
+
if (projectId) {
|
|
858
|
+
builder = (0, import_image_url.default)({ projectId, dataset: dataset || "production" });
|
|
859
|
+
} else {
|
|
860
|
+
console.warn("Sanity client not configured. Call configureSanityClient() or set NEXT_PUBLIC_SANITY_PROJECT_ID");
|
|
861
|
+
return {
|
|
862
|
+
width: () => ({ height: () => ({ url: () => "" }), url: () => "" }),
|
|
863
|
+
height: () => ({ width: () => ({ url: () => "" }), url: () => "" }),
|
|
864
|
+
url: () => ""
|
|
865
|
+
};
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
return builder.image(source);
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
// src/components/Hero.tsx
|
|
872
|
+
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
388
873
|
var defaultUpdates = [
|
|
389
874
|
{
|
|
390
875
|
_id: "1",
|
|
@@ -401,123 +886,123 @@ var defaultUpdates = [
|
|
|
401
886
|
];
|
|
402
887
|
var portableTextComponents = {
|
|
403
888
|
marks: {
|
|
404
|
-
strong: ({ children }) => /* @__PURE__ */ (0,
|
|
889
|
+
strong: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("strong", { children }),
|
|
405
890
|
highlight: ({ children, value }) => {
|
|
406
891
|
if (value?.style === "underline") {
|
|
407
|
-
return /* @__PURE__ */ (0,
|
|
892
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: Hero_default.underline, children });
|
|
408
893
|
}
|
|
409
|
-
return /* @__PURE__ */ (0,
|
|
894
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("strong", { children });
|
|
410
895
|
}
|
|
411
896
|
}
|
|
412
897
|
};
|
|
413
898
|
function Hero({ updates }) {
|
|
414
|
-
const { settings, profile } =
|
|
899
|
+
const { settings, profile } = useSiteSettings();
|
|
415
900
|
const displayUpdates = updates.length > 0 ? updates : defaultUpdates;
|
|
416
901
|
const formatDate = (dateString) => {
|
|
417
902
|
const date = new Date(dateString);
|
|
418
903
|
return date.toLocaleDateString("en-US", { month: "short", year: "numeric" });
|
|
419
904
|
};
|
|
420
|
-
const profileImageUrl = profile?.profileImage ?
|
|
421
|
-
return /* @__PURE__ */ (0,
|
|
905
|
+
const profileImageUrl = profile?.profileImage ? urlFor(profile.profileImage).width(400).height(400).url() : "https://lh3.googleusercontent.com/aida-public/AB6AXuA-51ZbdC8I959tDHVIKQM2go5QOPdVOVKiWaoxslYlpf5sfFXxZWku_Fo0DOotMhL8dFEOKCgNphtRHjlEWUULo0oVWGXkG5Hft4LCs2v09RdKgQp0diGKJE95XmfUyaL8geGo-ZA1pJm_e3zUDJ4zTtlK2y_g6-ZaVsm5ZH8L3IuFWVtMFUW8fJhFsy7kkFUXfI82D6_72Sl7ggk03nQaE4uFLf5ItCBzXWmMzUZQhBaB-g2Ur1apoHUb3x0cpZgYELr1mx1uRpnc";
|
|
906
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
|
|
422
907
|
import_framer_motion4.motion.section,
|
|
423
908
|
{
|
|
424
909
|
id: "about",
|
|
425
|
-
className:
|
|
910
|
+
className: Hero_default.hero,
|
|
426
911
|
initial: "hidden",
|
|
427
912
|
whileInView: "visible",
|
|
428
913
|
viewport: { once: true, amount: 0.1 },
|
|
429
|
-
variants:
|
|
914
|
+
variants: staggerContainer,
|
|
430
915
|
children: [
|
|
431
|
-
/* @__PURE__ */ (0,
|
|
432
|
-
/* @__PURE__ */ (0,
|
|
433
|
-
/* @__PURE__ */ (0,
|
|
916
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: Hero_default.content, children: [
|
|
917
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: Hero_default.imageWrapper, children: [
|
|
918
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
434
919
|
import_framer_motion4.motion.div,
|
|
435
920
|
{
|
|
436
|
-
className:
|
|
921
|
+
className: Hero_default.profileImage,
|
|
437
922
|
style: {
|
|
438
923
|
backgroundImage: `url("${profileImageUrl}")`
|
|
439
924
|
},
|
|
440
|
-
variants:
|
|
925
|
+
variants: blurFade
|
|
441
926
|
}
|
|
442
927
|
),
|
|
443
|
-
/* @__PURE__ */ (0,
|
|
444
|
-
/* @__PURE__ */ (0,
|
|
445
|
-
/* @__PURE__ */ (0,
|
|
928
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: Hero_default.mobileInfo, children: [
|
|
929
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h1", { className: Hero_default.mobileInfoName, children: profile?.name || "David" }),
|
|
930
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { className: Hero_default.mobileInfoTitle, children: [
|
|
446
931
|
profile?.title || "PhD Candidate",
|
|
447
932
|
" ",
|
|
448
933
|
profile?.institution && `at ${profile.institution}`
|
|
449
934
|
] })
|
|
450
935
|
] })
|
|
451
936
|
] }),
|
|
452
|
-
/* @__PURE__ */ (0,
|
|
453
|
-
/* @__PURE__ */ (0,
|
|
454
|
-
profile?.availabilityBadge && /* @__PURE__ */ (0,
|
|
455
|
-
!profile?.availabilityBadge && /* @__PURE__ */ (0,
|
|
456
|
-
/* @__PURE__ */ (0,
|
|
937
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_framer_motion4.motion.div, { className: Hero_default.textContent, variants: staggerContainer, children: [
|
|
938
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { children: [
|
|
939
|
+
profile?.availabilityBadge && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_framer_motion4.motion.span, { className: Hero_default.badge, variants: fadeInUp, children: profile.availabilityBadge }),
|
|
940
|
+
!profile?.availabilityBadge && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_framer_motion4.motion.span, { className: Hero_default.badge, variants: fadeInUp, children: "Available for 2024 Roles" }),
|
|
941
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_framer_motion4.motion.h2, { className: Hero_default.headline, variants: fadeInUp, children: profile?.headline ? /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
|
|
457
942
|
profile.headline.beforeHighlight,
|
|
458
943
|
" ",
|
|
459
|
-
/* @__PURE__ */ (0,
|
|
944
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: Hero_default.highlight, children: profile.headline.highlight }),
|
|
460
945
|
" ",
|
|
461
946
|
profile.headline.afterHighlight
|
|
462
|
-
] }) : /* @__PURE__ */ (0,
|
|
947
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
|
|
463
948
|
"Building the ",
|
|
464
|
-
/* @__PURE__ */ (0,
|
|
949
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: Hero_default.highlight, children: "future of AI" }),
|
|
465
950
|
" ",
|
|
466
951
|
"with robust & scalable vision systems."
|
|
467
952
|
] }) })
|
|
468
953
|
] }),
|
|
469
|
-
/* @__PURE__ */ (0,
|
|
470
|
-
/* @__PURE__ */ (0,
|
|
954
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_framer_motion4.motion.div, { className: Hero_default.description, variants: fadeInUp, children: profile?.bio ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react4.PortableText, { value: profile.bio, components: portableTextComponents }) : /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
|
|
955
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { children: [
|
|
471
956
|
"I am a PhD candidate specializing in",
|
|
472
957
|
" ",
|
|
473
|
-
/* @__PURE__ */ (0,
|
|
958
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("strong", { children: "Computer Vision" }),
|
|
474
959
|
" and",
|
|
475
960
|
" ",
|
|
476
|
-
/* @__PURE__ */ (0,
|
|
961
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("strong", { children: "Machine Learning" }),
|
|
477
962
|
". My research focuses on self-supervised learning, generative models, and their applications in medical imaging and autonomous systems."
|
|
478
963
|
] }),
|
|
479
|
-
/* @__PURE__ */ (0,
|
|
964
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { children: [
|
|
480
965
|
"Previously, I interned at",
|
|
481
966
|
" ",
|
|
482
|
-
/* @__PURE__ */ (0,
|
|
967
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: Hero_default.underline, children: "Google DeepMind" }),
|
|
483
968
|
" and",
|
|
484
969
|
" ",
|
|
485
|
-
/* @__PURE__ */ (0,
|
|
970
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: Hero_default.underline, children: "Meta AI" }),
|
|
486
971
|
". I am passionate about open-source and making AI accessible to everyone."
|
|
487
972
|
] })
|
|
488
973
|
] }) }),
|
|
489
|
-
/* @__PURE__ */ (0,
|
|
490
|
-
/* @__PURE__ */ (0,
|
|
491
|
-
/* @__PURE__ */ (0,
|
|
974
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_framer_motion4.motion.div, { className: Hero_default.links, variants: fadeInUp, children: [
|
|
975
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("a", { href: settings?.resumeUrl || "#", className: Hero_default.link, children: [
|
|
976
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: `material-symbols-outlined ${Hero_default.linkIcon}`, children: "download" }),
|
|
492
977
|
"Download CV"
|
|
493
978
|
] }),
|
|
494
|
-
/* @__PURE__ */ (0,
|
|
495
|
-
/* @__PURE__ */ (0,
|
|
979
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("a", { href: settings?.socialLinks?.googleScholar || "#", className: Hero_default.link, children: [
|
|
980
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: `material-symbols-outlined ${Hero_default.linkIcon}`, children: "school" }),
|
|
496
981
|
"Google Scholar"
|
|
497
982
|
] })
|
|
498
983
|
] })
|
|
499
984
|
] })
|
|
500
985
|
] }),
|
|
501
|
-
/* @__PURE__ */ (0,
|
|
986
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
|
|
502
987
|
import_framer_motion4.motion.div,
|
|
503
988
|
{
|
|
504
|
-
className: `glass-panel ${
|
|
505
|
-
variants:
|
|
989
|
+
className: `glass-panel ${Hero_default.updates}`,
|
|
990
|
+
variants: fadeInUp,
|
|
506
991
|
children: [
|
|
507
|
-
/* @__PURE__ */ (0,
|
|
508
|
-
/* @__PURE__ */ (0,
|
|
992
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("h3", { className: Hero_default.updatesHeader, children: [
|
|
993
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: `material-symbols-outlined ${Hero_default.updatesIcon}`, children: "campaign" }),
|
|
509
994
|
"Latest Updates"
|
|
510
995
|
] }),
|
|
511
|
-
/* @__PURE__ */ (0,
|
|
996
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: Hero_default.updatesList, children: displayUpdates.map((update) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
|
|
512
997
|
import_framer_motion4.motion.div,
|
|
513
998
|
{
|
|
514
|
-
className:
|
|
515
|
-
variants:
|
|
999
|
+
className: Hero_default.updateItem,
|
|
1000
|
+
variants: fadeInUp,
|
|
516
1001
|
children: [
|
|
517
|
-
/* @__PURE__ */ (0,
|
|
518
|
-
/* @__PURE__ */ (0,
|
|
519
|
-
/* @__PURE__ */ (0,
|
|
520
|
-
/* @__PURE__ */ (0,
|
|
1002
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: Hero_default.updateDate, children: formatDate(update.date) }),
|
|
1003
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: Hero_default.updateContent, children: [
|
|
1004
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h4", { children: update.title }),
|
|
1005
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { children: update.description })
|
|
521
1006
|
] })
|
|
522
1007
|
]
|
|
523
1008
|
},
|
|
@@ -534,10 +1019,12 @@ function Hero({ updates }) {
|
|
|
534
1019
|
// src/components/Projects.tsx
|
|
535
1020
|
var import_link2 = __toESM(require("next/link"));
|
|
536
1021
|
var import_framer_motion5 = require("framer-motion");
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
var
|
|
540
|
-
|
|
1022
|
+
|
|
1023
|
+
// src/components/Projects.module.css
|
|
1024
|
+
var Projects_default = {};
|
|
1025
|
+
|
|
1026
|
+
// src/components/Projects.tsx
|
|
1027
|
+
var import_jsx_runtime8 = require("react/jsx-runtime");
|
|
541
1028
|
var defaultProjects = [
|
|
542
1029
|
{
|
|
543
1030
|
_id: "1",
|
|
@@ -562,37 +1049,37 @@ function Projects({ projects }) {
|
|
|
562
1049
|
const displayProjects = projects.length > 0 ? projects : defaultProjects;
|
|
563
1050
|
const getProjectImage = (project, index) => {
|
|
564
1051
|
if (project.image) {
|
|
565
|
-
return
|
|
1052
|
+
return urlFor(project.image).width(800).height(450).url();
|
|
566
1053
|
}
|
|
567
1054
|
return defaultImages[index % defaultImages.length];
|
|
568
1055
|
};
|
|
569
|
-
return /* @__PURE__ */ (0,
|
|
1056
|
+
return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
|
|
570
1057
|
import_framer_motion5.motion.section,
|
|
571
1058
|
{
|
|
572
1059
|
id: "projects",
|
|
573
|
-
className:
|
|
1060
|
+
className: Projects_default.section,
|
|
574
1061
|
initial: "hidden",
|
|
575
1062
|
whileInView: "visible",
|
|
576
1063
|
viewport: { once: true, amount: 0.1 },
|
|
577
|
-
variants:
|
|
1064
|
+
variants: staggerContainer,
|
|
578
1065
|
children: [
|
|
579
|
-
/* @__PURE__ */ (0,
|
|
580
|
-
/* @__PURE__ */ (0,
|
|
581
|
-
/* @__PURE__ */ (0,
|
|
1066
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_framer_motion5.motion.h2, { className: Projects_default.title, variants: fadeInUp, children: "Selected Projects" }),
|
|
1067
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: Projects_default.grid, children: displayProjects.map((project, index) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_framer_motion5.motion.div, { variants: fadeInUp, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_link2.default, { href: `/projects/${project.slug}`, className: Projects_default.card, children: [
|
|
1068
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
582
1069
|
"div",
|
|
583
1070
|
{
|
|
584
|
-
className:
|
|
1071
|
+
className: Projects_default.cardImage,
|
|
585
1072
|
style: { backgroundImage: `url('${getProjectImage(project, index)}')` },
|
|
586
|
-
children: /* @__PURE__ */ (0,
|
|
1073
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: Projects_default.cardImageOverlay })
|
|
587
1074
|
}
|
|
588
1075
|
),
|
|
589
|
-
/* @__PURE__ */ (0,
|
|
590
|
-
/* @__PURE__ */ (0,
|
|
591
|
-
/* @__PURE__ */ (0,
|
|
592
|
-
/* @__PURE__ */ (0,
|
|
1076
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: Projects_default.cardContent, children: [
|
|
1077
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: Projects_default.cardHeader, children: [
|
|
1078
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h3", { className: Projects_default.cardTitle, children: project.title }),
|
|
1079
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: Projects_default.cardLink, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "material-symbols-outlined", children: "open_in_new" }) })
|
|
593
1080
|
] }),
|
|
594
|
-
/* @__PURE__ */ (0,
|
|
595
|
-
/* @__PURE__ */ (0,
|
|
1081
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: Projects_default.cardDescription, children: project.shortDescription }),
|
|
1082
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: Projects_default.cardTags, children: project.tags?.map((tag) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: Projects_default.tag, children: tag }, tag)) })
|
|
596
1083
|
] })
|
|
597
1084
|
] }) }, project._id)) })
|
|
598
1085
|
]
|
|
@@ -602,10 +1089,12 @@ function Projects({ projects }) {
|
|
|
602
1089
|
|
|
603
1090
|
// src/components/Publications.tsx
|
|
604
1091
|
var import_framer_motion6 = require("framer-motion");
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
var
|
|
608
|
-
|
|
1092
|
+
|
|
1093
|
+
// src/components/Publications.module.css
|
|
1094
|
+
var Publications_default = {};
|
|
1095
|
+
|
|
1096
|
+
// src/components/Publications.tsx
|
|
1097
|
+
var import_jsx_runtime9 = require("react/jsx-runtime");
|
|
609
1098
|
var defaultPublications = [
|
|
610
1099
|
{
|
|
611
1100
|
_id: "1",
|
|
@@ -646,46 +1135,46 @@ var defaultPublications = [
|
|
|
646
1135
|
}
|
|
647
1136
|
];
|
|
648
1137
|
function Publications({ publications }) {
|
|
649
|
-
const { settings } =
|
|
1138
|
+
const { settings } = useSiteSettings();
|
|
650
1139
|
const displayPublications = publications.length > 0 ? publications : defaultPublications;
|
|
651
1140
|
const renderAuthors = (authors) => {
|
|
652
|
-
return authors.map((author, index) => /* @__PURE__ */ (0,
|
|
653
|
-
author.isMe ? /* @__PURE__ */ (0,
|
|
1141
|
+
return authors.map((author, index) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
|
|
1142
|
+
author.isMe ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: Publications_default.cardAuthorHighlight, children: author.name }) : author.name,
|
|
654
1143
|
index < authors.length - 1 && ", "
|
|
655
1144
|
] }, index));
|
|
656
1145
|
};
|
|
657
|
-
return /* @__PURE__ */ (0,
|
|
1146
|
+
return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
|
|
658
1147
|
import_framer_motion6.motion.section,
|
|
659
1148
|
{
|
|
660
1149
|
id: "publications",
|
|
661
|
-
className:
|
|
1150
|
+
className: Publications_default.section,
|
|
662
1151
|
initial: "hidden",
|
|
663
1152
|
whileInView: "visible",
|
|
664
1153
|
viewport: { once: true, amount: 0.1 },
|
|
665
|
-
variants:
|
|
1154
|
+
variants: staggerContainer,
|
|
666
1155
|
children: [
|
|
667
|
-
/* @__PURE__ */ (0,
|
|
668
|
-
/* @__PURE__ */ (0,
|
|
669
|
-
/* @__PURE__ */ (0,
|
|
1156
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_framer_motion6.motion.div, { className: Publications_default.header, variants: fadeInUp, children: [
|
|
1157
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h2", { className: Publications_default.title, children: "Publications" }),
|
|
1158
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)("a", { href: settings?.socialLinks?.googleScholar || "#", className: Publications_default.scholarLink, children: "View Google Scholar ->" })
|
|
670
1159
|
] }),
|
|
671
|
-
/* @__PURE__ */ (0,
|
|
1160
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: Publications_default.list, children: displayPublications.map((pub) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
672
1161
|
import_framer_motion6.motion.div,
|
|
673
1162
|
{
|
|
674
|
-
className:
|
|
675
|
-
variants:
|
|
1163
|
+
className: Publications_default.card,
|
|
1164
|
+
variants: fadeInUp,
|
|
676
1165
|
whileHover: { y: -2 },
|
|
677
1166
|
transition: { duration: 0.2 },
|
|
678
|
-
children: /* @__PURE__ */ (0,
|
|
679
|
-
/* @__PURE__ */ (0,
|
|
680
|
-
/* @__PURE__ */ (0,
|
|
681
|
-
/* @__PURE__ */ (0,
|
|
682
|
-
/* @__PURE__ */ (0,
|
|
683
|
-
/* @__PURE__ */ (0,
|
|
684
|
-
pub.highlight && /* @__PURE__ */ (0,
|
|
685
|
-
/* @__PURE__ */ (0,
|
|
1167
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: Publications_default.cardContent, children: [
|
|
1168
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: Publications_default.cardInfo, children: [
|
|
1169
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h3", { className: Publications_default.cardTitle, children: pub.title }),
|
|
1170
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: Publications_default.cardAuthors, children: renderAuthors(pub.authors) }),
|
|
1171
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: Publications_default.cardMeta, children: [
|
|
1172
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: Publications_default.cardVenue, children: pub.venue }),
|
|
1173
|
+
pub.highlight && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { className: Publications_default.cardHighlight, children: [
|
|
1174
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
686
1175
|
"span",
|
|
687
1176
|
{
|
|
688
|
-
className: `material-symbols-outlined ${
|
|
1177
|
+
className: `material-symbols-outlined ${Publications_default.cardHighlightIcon}`,
|
|
689
1178
|
children: "star"
|
|
690
1179
|
}
|
|
691
1180
|
),
|
|
@@ -693,22 +1182,22 @@ function Publications({ publications }) {
|
|
|
693
1182
|
] })
|
|
694
1183
|
] })
|
|
695
1184
|
] }),
|
|
696
|
-
/* @__PURE__ */ (0,
|
|
697
|
-
(pub.pdfUrl || pub.pdfFileUrl) && /* @__PURE__ */ (0,
|
|
698
|
-
/* @__PURE__ */ (0,
|
|
1185
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: Publications_default.cardActions, children: [
|
|
1186
|
+
(pub.pdfUrl || pub.pdfFileUrl) && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("a", { href: pub.pdfUrl || pub.pdfFileUrl, className: Publications_default.actionButton, children: [
|
|
1187
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
699
1188
|
"span",
|
|
700
1189
|
{
|
|
701
|
-
className: `material-symbols-outlined ${
|
|
1190
|
+
className: `material-symbols-outlined ${Publications_default.actionIcon}`,
|
|
702
1191
|
children: "picture_as_pdf"
|
|
703
1192
|
}
|
|
704
1193
|
),
|
|
705
1194
|
"PDF"
|
|
706
1195
|
] }),
|
|
707
|
-
pub.codeUrl && /* @__PURE__ */ (0,
|
|
708
|
-
/* @__PURE__ */ (0,
|
|
1196
|
+
pub.codeUrl && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("a", { href: pub.codeUrl, className: Publications_default.actionButton, children: [
|
|
1197
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
709
1198
|
"span",
|
|
710
1199
|
{
|
|
711
|
-
className: `material-symbols-outlined ${
|
|
1200
|
+
className: `material-symbols-outlined ${Publications_default.actionIcon}`,
|
|
712
1201
|
children: "code"
|
|
713
1202
|
}
|
|
714
1203
|
),
|
|
@@ -723,6 +1212,34 @@ function Publications({ publications }) {
|
|
|
723
1212
|
}
|
|
724
1213
|
);
|
|
725
1214
|
}
|
|
1215
|
+
|
|
1216
|
+
// src/components/HomePage.tsx
|
|
1217
|
+
var import_jsx_runtime10 = require("react/jsx-runtime");
|
|
1218
|
+
function HomePage({
|
|
1219
|
+
updates = [],
|
|
1220
|
+
experiences = [],
|
|
1221
|
+
projects = [],
|
|
1222
|
+
publications = []
|
|
1223
|
+
}) {
|
|
1224
|
+
return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
|
|
1225
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Header, {}),
|
|
1226
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("main", { children: [
|
|
1227
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Hero, { updates }),
|
|
1228
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Divider, {}),
|
|
1229
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ExperienceSection, { experiences }),
|
|
1230
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Divider, {}),
|
|
1231
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Projects, { projects }),
|
|
1232
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Divider, {}),
|
|
1233
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Publications, { publications })
|
|
1234
|
+
] }),
|
|
1235
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Footer, {})
|
|
1236
|
+
] });
|
|
1237
|
+
}
|
|
1238
|
+
|
|
1239
|
+
// src/config.ts
|
|
1240
|
+
function defineConfig(config) {
|
|
1241
|
+
return config;
|
|
1242
|
+
}
|
|
726
1243
|
// Annotate the CommonJS export names for ESM import in node:
|
|
727
1244
|
0 && (module.exports = {
|
|
728
1245
|
Divider,
|
|
@@ -730,6 +1247,20 @@ function Publications({ publications }) {
|
|
|
730
1247
|
Footer,
|
|
731
1248
|
Header,
|
|
732
1249
|
Hero,
|
|
1250
|
+
HomePage,
|
|
733
1251
|
Projects,
|
|
734
|
-
Publications
|
|
1252
|
+
Publications,
|
|
1253
|
+
SiteSettingsProvider,
|
|
1254
|
+
ThemeProvider,
|
|
1255
|
+
applyFonts,
|
|
1256
|
+
applyThemeColors,
|
|
1257
|
+
colorPresets,
|
|
1258
|
+
configureSanityClient,
|
|
1259
|
+
defineConfig,
|
|
1260
|
+
fontPresets,
|
|
1261
|
+
getColorConfig,
|
|
1262
|
+
getFontFamily,
|
|
1263
|
+
urlFor,
|
|
1264
|
+
useSiteSettings,
|
|
1265
|
+
useTheme
|
|
735
1266
|
});
|