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