@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.mjs
CHANGED
|
@@ -8,9 +8,438 @@ function Divider() {
|
|
|
8
8
|
// src/components/Experience.tsx
|
|
9
9
|
import { motion } from "framer-motion";
|
|
10
10
|
import styles2 from "./Experience.module.css";
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
|
|
12
|
+
// src/styles/motion.ts
|
|
13
|
+
var easeOutExpo = [0.16, 1, 0.3, 1];
|
|
14
|
+
var springStiff = {
|
|
15
|
+
mass: 1,
|
|
16
|
+
stiffness: 100,
|
|
17
|
+
damping: 15
|
|
18
|
+
};
|
|
19
|
+
var timing = {
|
|
20
|
+
quick: 0.15,
|
|
21
|
+
standard: 0.35,
|
|
22
|
+
ambient: 0.8
|
|
23
|
+
};
|
|
24
|
+
var fadeInUp = {
|
|
25
|
+
hidden: {
|
|
26
|
+
opacity: 0,
|
|
27
|
+
y: 20
|
|
28
|
+
},
|
|
29
|
+
visible: {
|
|
30
|
+
opacity: 1,
|
|
31
|
+
y: 0,
|
|
32
|
+
transition: {
|
|
33
|
+
duration: timing.standard,
|
|
34
|
+
ease: easeOutExpo
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var fadeIn = {
|
|
39
|
+
hidden: {
|
|
40
|
+
opacity: 0
|
|
41
|
+
},
|
|
42
|
+
visible: {
|
|
43
|
+
opacity: 1,
|
|
44
|
+
transition: {
|
|
45
|
+
duration: timing.standard,
|
|
46
|
+
ease: easeOutExpo
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
var blurFade = {
|
|
51
|
+
hidden: {
|
|
52
|
+
opacity: 0,
|
|
53
|
+
filter: "blur(10px)"
|
|
54
|
+
},
|
|
55
|
+
visible: {
|
|
56
|
+
opacity: 1,
|
|
57
|
+
filter: "blur(0px)",
|
|
58
|
+
transition: {
|
|
59
|
+
duration: timing.standard,
|
|
60
|
+
ease: easeOutExpo
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
var staggerContainer = {
|
|
65
|
+
hidden: { opacity: 1 },
|
|
66
|
+
visible: {
|
|
67
|
+
opacity: 1,
|
|
68
|
+
transition: {
|
|
69
|
+
staggerChildren: 0.05,
|
|
70
|
+
delayChildren: 0.1
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
var slideInLeft = {
|
|
75
|
+
hidden: {
|
|
76
|
+
opacity: 0,
|
|
77
|
+
x: -20
|
|
78
|
+
},
|
|
79
|
+
visible: {
|
|
80
|
+
opacity: 1,
|
|
81
|
+
x: 0,
|
|
82
|
+
transition: {
|
|
83
|
+
duration: timing.standard,
|
|
84
|
+
ease: easeOutExpo
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
var scaleUp = {
|
|
89
|
+
hidden: {
|
|
90
|
+
opacity: 0,
|
|
91
|
+
scale: 0.95
|
|
92
|
+
},
|
|
93
|
+
visible: {
|
|
94
|
+
opacity: 1,
|
|
95
|
+
scale: 1,
|
|
96
|
+
transition: {
|
|
97
|
+
duration: timing.standard,
|
|
98
|
+
ease: easeOutExpo
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
var hoverLift = {
|
|
103
|
+
y: -5,
|
|
104
|
+
transition: {
|
|
105
|
+
type: "spring",
|
|
106
|
+
mass: springStiff.mass,
|
|
107
|
+
stiffness: springStiff.stiffness,
|
|
108
|
+
damping: springStiff.damping
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
var tapScale = {
|
|
112
|
+
scale: 0.95
|
|
113
|
+
};
|
|
114
|
+
var cardHover = {
|
|
115
|
+
scale: 1.02,
|
|
116
|
+
transition: {
|
|
117
|
+
type: "spring",
|
|
118
|
+
mass: springStiff.mass,
|
|
119
|
+
stiffness: springStiff.stiffness,
|
|
120
|
+
damping: springStiff.damping
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
var pageTransition = {
|
|
124
|
+
initial: {
|
|
125
|
+
opacity: 0,
|
|
126
|
+
x: -20
|
|
127
|
+
},
|
|
128
|
+
animate: {
|
|
129
|
+
opacity: 1,
|
|
130
|
+
x: 0,
|
|
131
|
+
transition: {
|
|
132
|
+
duration: timing.standard,
|
|
133
|
+
ease: easeOutExpo
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
exit: {
|
|
137
|
+
opacity: 0,
|
|
138
|
+
x: 20,
|
|
139
|
+
transition: {
|
|
140
|
+
duration: timing.quick,
|
|
141
|
+
ease: easeOutExpo
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
// src/context/SiteSettingsContext.tsx
|
|
147
|
+
import { createContext as createContext2, useContext as useContext2, useEffect as useEffect2 } from "react";
|
|
148
|
+
|
|
149
|
+
// src/context/ThemeContext.tsx
|
|
150
|
+
import { createContext, useContext, useEffect, useState } from "react";
|
|
151
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
152
|
+
var ThemeContext = createContext({
|
|
153
|
+
theme: "dark",
|
|
154
|
+
toggleTheme: () => {
|
|
155
|
+
},
|
|
156
|
+
mounted: false
|
|
157
|
+
});
|
|
158
|
+
function ThemeProvider({ children }) {
|
|
159
|
+
const [theme, setTheme] = useState("dark");
|
|
160
|
+
const [mounted, setMounted] = useState(false);
|
|
161
|
+
useEffect(() => {
|
|
162
|
+
setMounted(true);
|
|
163
|
+
const stored = localStorage.getItem("theme");
|
|
164
|
+
if (stored) {
|
|
165
|
+
setTheme(stored);
|
|
166
|
+
} else if (window.matchMedia("(prefers-color-scheme: light)").matches) {
|
|
167
|
+
setTheme("light");
|
|
168
|
+
}
|
|
169
|
+
}, []);
|
|
170
|
+
useEffect(() => {
|
|
171
|
+
if (mounted) {
|
|
172
|
+
document.documentElement.setAttribute("data-theme", theme);
|
|
173
|
+
localStorage.setItem("theme", theme);
|
|
174
|
+
}
|
|
175
|
+
}, [theme, mounted]);
|
|
176
|
+
const toggleTheme = () => {
|
|
177
|
+
setTheme((prev) => prev === "dark" ? "light" : "dark");
|
|
178
|
+
};
|
|
179
|
+
return /* @__PURE__ */ jsx2(ThemeContext.Provider, { value: { theme, toggleTheme, mounted }, children: /* @__PURE__ */ jsx2("div", { "data-theme": theme, children }) });
|
|
180
|
+
}
|
|
181
|
+
function useTheme() {
|
|
182
|
+
const context = useContext(ThemeContext);
|
|
183
|
+
return context;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// src/lib/themeColors.ts
|
|
187
|
+
var colorPresets = {
|
|
188
|
+
violet: {
|
|
189
|
+
light: {
|
|
190
|
+
primary: "#8b5cf6",
|
|
191
|
+
primaryHover: "#7c3aed",
|
|
192
|
+
primaryLight: "#a78bfa",
|
|
193
|
+
tagBg: "rgba(139, 92, 246, 0.1)",
|
|
194
|
+
shadow: "rgba(139, 92, 246, 0.15)",
|
|
195
|
+
borderHighlight: "rgba(139, 92, 246, 0.2)",
|
|
196
|
+
glassBorder: "rgba(139, 92, 246, 0.1)"
|
|
197
|
+
},
|
|
198
|
+
dark: {
|
|
199
|
+
primary: "#a78bfa",
|
|
200
|
+
primaryHover: "#8b5cf6",
|
|
201
|
+
primaryLight: "#c4b5fd",
|
|
202
|
+
tagBg: "rgba(167, 139, 250, 0.15)",
|
|
203
|
+
shadow: "rgba(139, 92, 246, 0.2)",
|
|
204
|
+
borderHighlight: "rgba(167, 139, 250, 0.2)",
|
|
205
|
+
glassBorder: "rgba(167, 139, 250, 0.1)"
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
blue: {
|
|
209
|
+
light: {
|
|
210
|
+
primary: "#3b82f6",
|
|
211
|
+
primaryHover: "#2563eb",
|
|
212
|
+
primaryLight: "#60a5fa",
|
|
213
|
+
tagBg: "rgba(59, 130, 246, 0.1)",
|
|
214
|
+
shadow: "rgba(59, 130, 246, 0.15)",
|
|
215
|
+
borderHighlight: "rgba(59, 130, 246, 0.2)",
|
|
216
|
+
glassBorder: "rgba(59, 130, 246, 0.1)"
|
|
217
|
+
},
|
|
218
|
+
dark: {
|
|
219
|
+
primary: "#60a5fa",
|
|
220
|
+
primaryHover: "#3b82f6",
|
|
221
|
+
primaryLight: "#93c5fd",
|
|
222
|
+
tagBg: "rgba(96, 165, 250, 0.15)",
|
|
223
|
+
shadow: "rgba(59, 130, 246, 0.2)",
|
|
224
|
+
borderHighlight: "rgba(96, 165, 250, 0.2)",
|
|
225
|
+
glassBorder: "rgba(96, 165, 250, 0.1)"
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
emerald: {
|
|
229
|
+
light: {
|
|
230
|
+
primary: "#10b981",
|
|
231
|
+
primaryHover: "#059669",
|
|
232
|
+
primaryLight: "#34d399",
|
|
233
|
+
tagBg: "rgba(16, 185, 129, 0.1)",
|
|
234
|
+
shadow: "rgba(16, 185, 129, 0.15)",
|
|
235
|
+
borderHighlight: "rgba(16, 185, 129, 0.2)",
|
|
236
|
+
glassBorder: "rgba(16, 185, 129, 0.1)"
|
|
237
|
+
},
|
|
238
|
+
dark: {
|
|
239
|
+
primary: "#34d399",
|
|
240
|
+
primaryHover: "#10b981",
|
|
241
|
+
primaryLight: "#6ee7b7",
|
|
242
|
+
tagBg: "rgba(52, 211, 153, 0.15)",
|
|
243
|
+
shadow: "rgba(16, 185, 129, 0.2)",
|
|
244
|
+
borderHighlight: "rgba(52, 211, 153, 0.2)",
|
|
245
|
+
glassBorder: "rgba(52, 211, 153, 0.1)"
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
rose: {
|
|
249
|
+
light: {
|
|
250
|
+
primary: "#f43f5e",
|
|
251
|
+
primaryHover: "#e11d48",
|
|
252
|
+
primaryLight: "#fb7185",
|
|
253
|
+
tagBg: "rgba(244, 63, 94, 0.1)",
|
|
254
|
+
shadow: "rgba(244, 63, 94, 0.15)",
|
|
255
|
+
borderHighlight: "rgba(244, 63, 94, 0.2)",
|
|
256
|
+
glassBorder: "rgba(244, 63, 94, 0.1)"
|
|
257
|
+
},
|
|
258
|
+
dark: {
|
|
259
|
+
primary: "#fb7185",
|
|
260
|
+
primaryHover: "#f43f5e",
|
|
261
|
+
primaryLight: "#fda4af",
|
|
262
|
+
tagBg: "rgba(251, 113, 133, 0.15)",
|
|
263
|
+
shadow: "rgba(244, 63, 94, 0.2)",
|
|
264
|
+
borderHighlight: "rgba(251, 113, 133, 0.2)",
|
|
265
|
+
glassBorder: "rgba(251, 113, 133, 0.1)"
|
|
266
|
+
}
|
|
267
|
+
},
|
|
268
|
+
amber: {
|
|
269
|
+
light: {
|
|
270
|
+
primary: "#f59e0b",
|
|
271
|
+
primaryHover: "#d97706",
|
|
272
|
+
primaryLight: "#fbbf24",
|
|
273
|
+
tagBg: "rgba(245, 158, 11, 0.1)",
|
|
274
|
+
shadow: "rgba(245, 158, 11, 0.15)",
|
|
275
|
+
borderHighlight: "rgba(245, 158, 11, 0.2)",
|
|
276
|
+
glassBorder: "rgba(245, 158, 11, 0.1)"
|
|
277
|
+
},
|
|
278
|
+
dark: {
|
|
279
|
+
primary: "#fbbf24",
|
|
280
|
+
primaryHover: "#f59e0b",
|
|
281
|
+
primaryLight: "#fcd34d",
|
|
282
|
+
tagBg: "rgba(251, 191, 36, 0.15)",
|
|
283
|
+
shadow: "rgba(245, 158, 11, 0.2)",
|
|
284
|
+
borderHighlight: "rgba(251, 191, 36, 0.2)",
|
|
285
|
+
glassBorder: "rgba(251, 191, 36, 0.1)"
|
|
286
|
+
}
|
|
287
|
+
},
|
|
288
|
+
cyan: {
|
|
289
|
+
light: {
|
|
290
|
+
primary: "#06b6d4",
|
|
291
|
+
primaryHover: "#0891b2",
|
|
292
|
+
primaryLight: "#22d3ee",
|
|
293
|
+
tagBg: "rgba(6, 182, 212, 0.1)",
|
|
294
|
+
shadow: "rgba(6, 182, 212, 0.15)",
|
|
295
|
+
borderHighlight: "rgba(6, 182, 212, 0.2)",
|
|
296
|
+
glassBorder: "rgba(6, 182, 212, 0.1)"
|
|
297
|
+
},
|
|
298
|
+
dark: {
|
|
299
|
+
primary: "#22d3ee",
|
|
300
|
+
primaryHover: "#06b6d4",
|
|
301
|
+
primaryLight: "#67e8f9",
|
|
302
|
+
tagBg: "rgba(34, 211, 238, 0.15)",
|
|
303
|
+
shadow: "rgba(6, 182, 212, 0.2)",
|
|
304
|
+
borderHighlight: "rgba(34, 211, 238, 0.2)",
|
|
305
|
+
glassBorder: "rgba(34, 211, 238, 0.1)"
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
};
|
|
309
|
+
function getColorConfig(preset, customColor) {
|
|
310
|
+
if (preset === "custom" && customColor) {
|
|
311
|
+
const hex = customColor.replace("#", "");
|
|
312
|
+
const r = parseInt(hex.substring(0, 2), 16);
|
|
313
|
+
const g = parseInt(hex.substring(2, 4), 16);
|
|
314
|
+
const b = parseInt(hex.substring(4, 6), 16);
|
|
315
|
+
const lighterR = Math.min(255, r + 40);
|
|
316
|
+
const lighterG = Math.min(255, g + 40);
|
|
317
|
+
const lighterB = Math.min(255, b + 40);
|
|
318
|
+
const lighter = `#${lighterR.toString(16).padStart(2, "0")}${lighterG.toString(16).padStart(2, "0")}${lighterB.toString(16).padStart(2, "0")}`;
|
|
319
|
+
const darkerR = Math.max(0, r - 20);
|
|
320
|
+
const darkerG = Math.max(0, g - 20);
|
|
321
|
+
const darkerB = Math.max(0, b - 20);
|
|
322
|
+
const darker = `#${darkerR.toString(16).padStart(2, "0")}${darkerG.toString(16).padStart(2, "0")}${darkerB.toString(16).padStart(2, "0")}`;
|
|
323
|
+
return {
|
|
324
|
+
light: {
|
|
325
|
+
primary: customColor,
|
|
326
|
+
primaryHover: darker,
|
|
327
|
+
primaryLight: lighter,
|
|
328
|
+
tagBg: `rgba(${r}, ${g}, ${b}, 0.1)`,
|
|
329
|
+
shadow: `rgba(${r}, ${g}, ${b}, 0.15)`,
|
|
330
|
+
borderHighlight: `rgba(${r}, ${g}, ${b}, 0.2)`,
|
|
331
|
+
glassBorder: `rgba(${r}, ${g}, ${b}, 0.1)`
|
|
332
|
+
},
|
|
333
|
+
dark: {
|
|
334
|
+
primary: lighter,
|
|
335
|
+
primaryHover: customColor,
|
|
336
|
+
primaryLight: lighter,
|
|
337
|
+
tagBg: `rgba(${lighterR}, ${lighterG}, ${lighterB}, 0.15)`,
|
|
338
|
+
shadow: `rgba(${r}, ${g}, ${b}, 0.2)`,
|
|
339
|
+
borderHighlight: `rgba(${lighterR}, ${lighterG}, ${lighterB}, 0.2)`,
|
|
340
|
+
glassBorder: `rgba(${lighterR}, ${lighterG}, ${lighterB}, 0.1)`
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
return colorPresets[preset] || colorPresets.violet;
|
|
345
|
+
}
|
|
346
|
+
function applyThemeColors(preset, customColor, isDark = false) {
|
|
347
|
+
const config = getColorConfig(preset, customColor);
|
|
348
|
+
const colors = isDark ? config.dark : config.light;
|
|
349
|
+
document.documentElement.style.setProperty("--primary", colors.primary);
|
|
350
|
+
document.documentElement.style.setProperty("--primary-hover", colors.primaryHover);
|
|
351
|
+
document.documentElement.style.setProperty("--primary-light", colors.primaryLight);
|
|
352
|
+
document.documentElement.style.setProperty("--tag-bg", colors.tagBg);
|
|
353
|
+
document.documentElement.style.setProperty("--shadow", colors.shadow);
|
|
354
|
+
document.documentElement.style.setProperty("--border-highlight", colors.borderHighlight);
|
|
355
|
+
document.documentElement.style.setProperty("--glass-border", colors.glassBorder);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// src/lib/fonts.ts
|
|
359
|
+
var fontPresets = {
|
|
360
|
+
"inter": {
|
|
361
|
+
family: "Inter",
|
|
362
|
+
fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
|
|
363
|
+
},
|
|
364
|
+
"roboto": {
|
|
365
|
+
family: "Roboto",
|
|
366
|
+
fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
|
|
367
|
+
},
|
|
368
|
+
"open-sans": {
|
|
369
|
+
family: "Open Sans",
|
|
370
|
+
fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
|
|
371
|
+
},
|
|
372
|
+
"lato": {
|
|
373
|
+
family: "Lato",
|
|
374
|
+
fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
|
|
375
|
+
},
|
|
376
|
+
"poppins": {
|
|
377
|
+
family: "Poppins",
|
|
378
|
+
fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
|
|
379
|
+
},
|
|
380
|
+
"montserrat": {
|
|
381
|
+
family: "Montserrat",
|
|
382
|
+
fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
|
|
383
|
+
},
|
|
384
|
+
"playfair-display": {
|
|
385
|
+
family: "Playfair Display",
|
|
386
|
+
fallback: "Georgia, 'Times New Roman', serif"
|
|
387
|
+
},
|
|
388
|
+
"source-sans-pro": {
|
|
389
|
+
family: "Source Sans 3",
|
|
390
|
+
fallback: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
|
|
391
|
+
},
|
|
392
|
+
"merriweather": {
|
|
393
|
+
family: "Merriweather",
|
|
394
|
+
fallback: "Georgia, 'Times New Roman', serif"
|
|
395
|
+
}
|
|
396
|
+
};
|
|
397
|
+
function getFontFamily(preset) {
|
|
398
|
+
const config = fontPresets[preset] || fontPresets["inter"];
|
|
399
|
+
return `'${config.family}', ${config.fallback}`;
|
|
400
|
+
}
|
|
401
|
+
function applyFonts(headingFont, bodyFont) {
|
|
402
|
+
const heading = headingFont || "inter";
|
|
403
|
+
const body = bodyFont || "inter";
|
|
404
|
+
document.documentElement.style.setProperty("--font-heading", getFontFamily(heading));
|
|
405
|
+
document.documentElement.style.setProperty("--font-body", getFontFamily(body));
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// src/context/SiteSettingsContext.tsx
|
|
409
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
410
|
+
var SiteSettingsContext = createContext2({
|
|
411
|
+
settings: null,
|
|
412
|
+
profile: null
|
|
413
|
+
});
|
|
414
|
+
function SiteSettingsProvider({
|
|
415
|
+
children,
|
|
416
|
+
settings,
|
|
417
|
+
profile
|
|
418
|
+
}) {
|
|
419
|
+
const { theme } = useTheme();
|
|
420
|
+
useEffect2(() => {
|
|
421
|
+
if (settings?.themeColor) {
|
|
422
|
+
applyThemeColors(
|
|
423
|
+
settings.themeColor.preset,
|
|
424
|
+
settings.themeColor.customColor,
|
|
425
|
+
theme === "dark"
|
|
426
|
+
);
|
|
427
|
+
}
|
|
428
|
+
}, [settings, theme]);
|
|
429
|
+
useEffect2(() => {
|
|
430
|
+
applyFonts(
|
|
431
|
+
settings?.fontFamily?.heading,
|
|
432
|
+
settings?.fontFamily?.body
|
|
433
|
+
);
|
|
434
|
+
}, [settings]);
|
|
435
|
+
return /* @__PURE__ */ jsx3(SiteSettingsContext.Provider, { value: { settings, profile }, children });
|
|
436
|
+
}
|
|
437
|
+
function useSiteSettings() {
|
|
438
|
+
return useContext2(SiteSettingsContext);
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
// src/components/Experience.tsx
|
|
442
|
+
import { jsx as jsx4, jsxs } from "react/jsx-runtime";
|
|
14
443
|
var defaultExperiences = [
|
|
15
444
|
{
|
|
16
445
|
_id: "1",
|
|
@@ -60,7 +489,7 @@ function ExperienceSection({ experiences }) {
|
|
|
60
489
|
variants: staggerContainer,
|
|
61
490
|
children: [
|
|
62
491
|
/* @__PURE__ */ jsxs(motion.div, { className: styles2.header, variants: fadeInUp, children: [
|
|
63
|
-
/* @__PURE__ */
|
|
492
|
+
/* @__PURE__ */ jsx4("h2", { className: styles2.title, children: "Experience & Education" }),
|
|
64
493
|
/* @__PURE__ */ jsxs(
|
|
65
494
|
motion.a,
|
|
66
495
|
{
|
|
@@ -69,30 +498,30 @@ function ExperienceSection({ experiences }) {
|
|
|
69
498
|
whileHover: hoverLift,
|
|
70
499
|
whileTap: tapScale,
|
|
71
500
|
children: [
|
|
72
|
-
/* @__PURE__ */
|
|
501
|
+
/* @__PURE__ */ jsx4("span", { className: "material-symbols-outlined", children: "download" }),
|
|
73
502
|
"Download Resume"
|
|
74
503
|
]
|
|
75
504
|
}
|
|
76
505
|
)
|
|
77
506
|
] }),
|
|
78
|
-
/* @__PURE__ */
|
|
507
|
+
/* @__PURE__ */ jsx4("div", { className: styles2.timeline, children: displayExperiences.map((exp) => /* @__PURE__ */ jsxs(
|
|
79
508
|
motion.div,
|
|
80
509
|
{
|
|
81
510
|
className: styles2.timelineItem,
|
|
82
511
|
variants: fadeInUp,
|
|
83
512
|
children: [
|
|
84
|
-
/* @__PURE__ */
|
|
513
|
+
/* @__PURE__ */ jsx4(
|
|
85
514
|
"div",
|
|
86
515
|
{
|
|
87
516
|
className: `${styles2.timelineDot} ${exp.isCurrent ? styles2.timelineDotCurrent : ""}`
|
|
88
517
|
}
|
|
89
518
|
),
|
|
90
519
|
/* @__PURE__ */ jsxs("div", { className: styles2.timelineHeader, children: [
|
|
91
|
-
/* @__PURE__ */
|
|
92
|
-
/* @__PURE__ */
|
|
520
|
+
/* @__PURE__ */ jsx4("h3", { className: styles2.timelineTitle, children: exp.title }),
|
|
521
|
+
/* @__PURE__ */ jsx4("span", { className: styles2.timelinePeriod, children: exp.period })
|
|
93
522
|
] }),
|
|
94
|
-
/* @__PURE__ */
|
|
95
|
-
exp.description && /* @__PURE__ */
|
|
523
|
+
/* @__PURE__ */ jsx4("p", { className: styles2.timelineOrg, children: exp.organization }),
|
|
524
|
+
exp.description && /* @__PURE__ */ jsx4("p", { className: styles2.timelineDescription, children: exp.description })
|
|
96
525
|
]
|
|
97
526
|
},
|
|
98
527
|
exp._id
|
|
@@ -105,11 +534,9 @@ function ExperienceSection({ experiences }) {
|
|
|
105
534
|
// src/components/Footer.tsx
|
|
106
535
|
import { motion as motion2 } from "framer-motion";
|
|
107
536
|
import styles3 from "./Footer.module.css";
|
|
108
|
-
import { fadeInUp as fadeInUp2 } from "@/styles/motion";
|
|
109
|
-
import { useSiteSettings as useSiteSettings2 } from "@/context/SiteSettingsContext";
|
|
110
537
|
import { jsxs as jsxs2 } from "react/jsx-runtime";
|
|
111
538
|
function Footer() {
|
|
112
|
-
const { settings, profile } =
|
|
539
|
+
const { settings, profile } = useSiteSettings();
|
|
113
540
|
return /* @__PURE__ */ jsxs2(
|
|
114
541
|
motion2.footer,
|
|
115
542
|
{
|
|
@@ -117,7 +544,7 @@ function Footer() {
|
|
|
117
544
|
initial: "hidden",
|
|
118
545
|
whileInView: "visible",
|
|
119
546
|
viewport: { once: true },
|
|
120
|
-
variants:
|
|
547
|
+
variants: fadeInUp,
|
|
121
548
|
children: [
|
|
122
549
|
/* @__PURE__ */ jsxs2("p", { className: styles3.copyright, children: [
|
|
123
550
|
"\xA9 ",
|
|
@@ -138,14 +565,11 @@ function Footer() {
|
|
|
138
565
|
}
|
|
139
566
|
|
|
140
567
|
// src/components/Header.tsx
|
|
141
|
-
import { useState } from "react";
|
|
568
|
+
import { useState as useState2 } from "react";
|
|
142
569
|
import Link from "next/link";
|
|
143
570
|
import { motion as motion3, AnimatePresence } from "framer-motion";
|
|
144
|
-
import { useTheme } from "@/context/ThemeContext";
|
|
145
|
-
import { useSiteSettings as useSiteSettings3 } from "@/context/SiteSettingsContext";
|
|
146
571
|
import styles4 from "./Header.module.css";
|
|
147
|
-
import {
|
|
148
|
-
import { Fragment, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
572
|
+
import { Fragment, jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
149
573
|
var navLinks = [
|
|
150
574
|
{ href: "#about", label: "About" },
|
|
151
575
|
{ href: "#publications", label: "Publications" },
|
|
@@ -154,23 +578,23 @@ var navLinks = [
|
|
|
154
578
|
];
|
|
155
579
|
function Header() {
|
|
156
580
|
const { theme, toggleTheme } = useTheme();
|
|
157
|
-
const { settings, profile } =
|
|
158
|
-
const [mobileMenuOpen, setMobileMenuOpen] =
|
|
581
|
+
const { settings, profile } = useSiteSettings();
|
|
582
|
+
const [mobileMenuOpen, setMobileMenuOpen] = useState2(false);
|
|
159
583
|
const socialLinks = settings?.socialLinks;
|
|
160
584
|
const contactEmail = settings?.contactEmail;
|
|
161
585
|
return /* @__PURE__ */ jsxs3("header", { className: styles4.header, children: [
|
|
162
586
|
/* @__PURE__ */ jsxs3("div", { className: styles4.container, children: [
|
|
163
587
|
/* @__PURE__ */ jsxs3(Link, { href: "/", className: styles4.logo, children: [
|
|
164
|
-
/* @__PURE__ */
|
|
165
|
-
/* @__PURE__ */
|
|
588
|
+
/* @__PURE__ */ jsx5("span", { className: styles4.logoName, children: profile?.name || "David" }),
|
|
589
|
+
/* @__PURE__ */ jsx5("span", { className: styles4.logoTitle, children: profile?.title || "PhD Candidate" })
|
|
166
590
|
] }),
|
|
167
|
-
/* @__PURE__ */
|
|
591
|
+
/* @__PURE__ */ jsx5("nav", { className: styles4.nav, children: navLinks.map((link) => /* @__PURE__ */ jsxs3(Link, { href: link.href, className: styles4.navLink, children: [
|
|
168
592
|
link.label,
|
|
169
|
-
/* @__PURE__ */
|
|
593
|
+
/* @__PURE__ */ jsx5("span", { className: styles4.navLinkUnderline })
|
|
170
594
|
] }, link.href)) }),
|
|
171
595
|
/* @__PURE__ */ jsxs3("div", { className: styles4.actions, children: [
|
|
172
596
|
/* @__PURE__ */ jsxs3("div", { className: styles4.socialLinks, children: [
|
|
173
|
-
(socialLinks?.twitter || !settings) && /* @__PURE__ */
|
|
597
|
+
(socialLinks?.twitter || !settings) && /* @__PURE__ */ jsx5(
|
|
174
598
|
"a",
|
|
175
599
|
{
|
|
176
600
|
href: socialLinks?.twitter || "https://twitter.com",
|
|
@@ -178,10 +602,10 @@ function Header() {
|
|
|
178
602
|
rel: "noopener noreferrer",
|
|
179
603
|
className: styles4.socialLink,
|
|
180
604
|
"aria-label": "Twitter",
|
|
181
|
-
children: /* @__PURE__ */
|
|
605
|
+
children: /* @__PURE__ */ jsx5("svg", { fill: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx5("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" }) })
|
|
182
606
|
}
|
|
183
607
|
),
|
|
184
|
-
(socialLinks?.github || !settings) && /* @__PURE__ */
|
|
608
|
+
(socialLinks?.github || !settings) && /* @__PURE__ */ jsx5(
|
|
185
609
|
"a",
|
|
186
610
|
{
|
|
187
611
|
href: socialLinks?.github || "https://github.com",
|
|
@@ -189,7 +613,7 @@ function Header() {
|
|
|
189
613
|
rel: "noopener noreferrer",
|
|
190
614
|
className: styles4.socialLink,
|
|
191
615
|
"aria-label": "GitHub",
|
|
192
|
-
children: /* @__PURE__ */
|
|
616
|
+
children: /* @__PURE__ */ jsx5("svg", { fill: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx5(
|
|
193
617
|
"path",
|
|
194
618
|
{
|
|
195
619
|
fillRule: "evenodd",
|
|
@@ -199,7 +623,7 @@ function Header() {
|
|
|
199
623
|
) })
|
|
200
624
|
}
|
|
201
625
|
),
|
|
202
|
-
(socialLinks?.linkedin || !settings) && /* @__PURE__ */
|
|
626
|
+
(socialLinks?.linkedin || !settings) && /* @__PURE__ */ jsx5(
|
|
203
627
|
"a",
|
|
204
628
|
{
|
|
205
629
|
href: socialLinks?.linkedin || "https://linkedin.com",
|
|
@@ -207,7 +631,7 @@ function Header() {
|
|
|
207
631
|
rel: "noopener noreferrer",
|
|
208
632
|
className: styles4.socialLink,
|
|
209
633
|
"aria-label": "LinkedIn",
|
|
210
|
-
children: /* @__PURE__ */
|
|
634
|
+
children: /* @__PURE__ */ jsx5("svg", { fill: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx5(
|
|
211
635
|
"path",
|
|
212
636
|
{
|
|
213
637
|
fillRule: "evenodd",
|
|
@@ -218,13 +642,13 @@ function Header() {
|
|
|
218
642
|
}
|
|
219
643
|
)
|
|
220
644
|
] }),
|
|
221
|
-
/* @__PURE__ */
|
|
645
|
+
/* @__PURE__ */ jsx5(
|
|
222
646
|
motion3.button,
|
|
223
647
|
{
|
|
224
648
|
className: styles4.themeToggle,
|
|
225
649
|
onClick: toggleTheme,
|
|
226
|
-
whileHover:
|
|
227
|
-
whileTap:
|
|
650
|
+
whileHover: hoverLift,
|
|
651
|
+
whileTap: tapScale,
|
|
228
652
|
"aria-label": `Switch to ${theme === "dark" ? "light" : "dark"} mode`,
|
|
229
653
|
children: theme === "dark" ? /* @__PURE__ */ jsxs3(
|
|
230
654
|
"svg",
|
|
@@ -239,18 +663,18 @@ function Header() {
|
|
|
239
663
|
strokeLinecap: "round",
|
|
240
664
|
strokeLinejoin: "round",
|
|
241
665
|
children: [
|
|
242
|
-
/* @__PURE__ */
|
|
243
|
-
/* @__PURE__ */
|
|
244
|
-
/* @__PURE__ */
|
|
245
|
-
/* @__PURE__ */
|
|
246
|
-
/* @__PURE__ */
|
|
247
|
-
/* @__PURE__ */
|
|
248
|
-
/* @__PURE__ */
|
|
249
|
-
/* @__PURE__ */
|
|
250
|
-
/* @__PURE__ */
|
|
666
|
+
/* @__PURE__ */ jsx5("circle", { cx: "12", cy: "12", r: "5" }),
|
|
667
|
+
/* @__PURE__ */ jsx5("line", { x1: "12", y1: "1", x2: "12", y2: "3" }),
|
|
668
|
+
/* @__PURE__ */ jsx5("line", { x1: "12", y1: "21", x2: "12", y2: "23" }),
|
|
669
|
+
/* @__PURE__ */ jsx5("line", { x1: "4.22", y1: "4.22", x2: "5.64", y2: "5.64" }),
|
|
670
|
+
/* @__PURE__ */ jsx5("line", { x1: "18.36", y1: "18.36", x2: "19.78", y2: "19.78" }),
|
|
671
|
+
/* @__PURE__ */ jsx5("line", { x1: "1", y1: "12", x2: "3", y2: "12" }),
|
|
672
|
+
/* @__PURE__ */ jsx5("line", { x1: "21", y1: "12", x2: "23", y2: "12" }),
|
|
673
|
+
/* @__PURE__ */ jsx5("line", { x1: "4.22", y1: "19.78", x2: "5.64", y2: "18.36" }),
|
|
674
|
+
/* @__PURE__ */ jsx5("line", { x1: "18.36", y1: "5.64", x2: "19.78", y2: "4.22" })
|
|
251
675
|
]
|
|
252
676
|
}
|
|
253
|
-
) : /* @__PURE__ */
|
|
677
|
+
) : /* @__PURE__ */ jsx5(
|
|
254
678
|
"svg",
|
|
255
679
|
{
|
|
256
680
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -262,7 +686,7 @@ function Header() {
|
|
|
262
686
|
strokeWidth: "2",
|
|
263
687
|
strokeLinecap: "round",
|
|
264
688
|
strokeLinejoin: "round",
|
|
265
|
-
children: /* @__PURE__ */
|
|
689
|
+
children: /* @__PURE__ */ jsx5("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" })
|
|
266
690
|
}
|
|
267
691
|
)
|
|
268
692
|
}
|
|
@@ -272,21 +696,21 @@ function Header() {
|
|
|
272
696
|
{
|
|
273
697
|
href: contactEmail ? `mailto:${contactEmail}` : "mailto:contact@example.com",
|
|
274
698
|
className: styles4.contactButton,
|
|
275
|
-
whileHover:
|
|
276
|
-
whileTap:
|
|
699
|
+
whileHover: hoverLift,
|
|
700
|
+
whileTap: tapScale,
|
|
277
701
|
children: [
|
|
278
|
-
/* @__PURE__ */
|
|
279
|
-
/* @__PURE__ */
|
|
702
|
+
/* @__PURE__ */ jsx5("span", { className: `material-symbols-outlined ${styles4.contactButtonIcon}`, children: "mail" }),
|
|
703
|
+
/* @__PURE__ */ jsx5("span", { className: styles4.contactButtonText, children: "Contact" })
|
|
280
704
|
]
|
|
281
705
|
}
|
|
282
706
|
),
|
|
283
|
-
/* @__PURE__ */
|
|
707
|
+
/* @__PURE__ */ jsx5(
|
|
284
708
|
"button",
|
|
285
709
|
{
|
|
286
710
|
className: styles4.mobileMenuButton,
|
|
287
711
|
onClick: () => setMobileMenuOpen(!mobileMenuOpen),
|
|
288
712
|
"aria-label": "Toggle menu",
|
|
289
|
-
children: /* @__PURE__ */
|
|
713
|
+
children: /* @__PURE__ */ jsx5(
|
|
290
714
|
"svg",
|
|
291
715
|
{
|
|
292
716
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -299,12 +723,12 @@ function Header() {
|
|
|
299
723
|
strokeLinecap: "round",
|
|
300
724
|
strokeLinejoin: "round",
|
|
301
725
|
children: mobileMenuOpen ? /* @__PURE__ */ jsxs3(Fragment, { children: [
|
|
302
|
-
/* @__PURE__ */
|
|
303
|
-
/* @__PURE__ */
|
|
726
|
+
/* @__PURE__ */ jsx5("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
|
|
727
|
+
/* @__PURE__ */ jsx5("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
|
|
304
728
|
] }) : /* @__PURE__ */ jsxs3(Fragment, { children: [
|
|
305
|
-
/* @__PURE__ */
|
|
306
|
-
/* @__PURE__ */
|
|
307
|
-
/* @__PURE__ */
|
|
729
|
+
/* @__PURE__ */ jsx5("line", { x1: "3", y1: "12", x2: "21", y2: "12" }),
|
|
730
|
+
/* @__PURE__ */ jsx5("line", { x1: "3", y1: "6", x2: "21", y2: "6" }),
|
|
731
|
+
/* @__PURE__ */ jsx5("line", { x1: "3", y1: "18", x2: "21", y2: "18" })
|
|
308
732
|
] })
|
|
309
733
|
}
|
|
310
734
|
)
|
|
@@ -312,7 +736,7 @@ function Header() {
|
|
|
312
736
|
)
|
|
313
737
|
] })
|
|
314
738
|
] }),
|
|
315
|
-
/* @__PURE__ */
|
|
739
|
+
/* @__PURE__ */ jsx5(AnimatePresence, { children: mobileMenuOpen && /* @__PURE__ */ jsx5(
|
|
316
740
|
motion3.nav,
|
|
317
741
|
{
|
|
318
742
|
className: styles4.mobileNav,
|
|
@@ -320,7 +744,7 @@ function Header() {
|
|
|
320
744
|
animate: { opacity: 1, y: 0 },
|
|
321
745
|
exit: { opacity: 0, y: -10 },
|
|
322
746
|
transition: { duration: 0.2 },
|
|
323
|
-
children: navLinks.map((link) => /* @__PURE__ */
|
|
747
|
+
children: navLinks.map((link) => /* @__PURE__ */ jsx5(
|
|
324
748
|
Link,
|
|
325
749
|
{
|
|
326
750
|
href: link.href,
|
|
@@ -339,10 +763,43 @@ function Header() {
|
|
|
339
763
|
import { motion as motion4 } from "framer-motion";
|
|
340
764
|
import { PortableText } from "@portabletext/react";
|
|
341
765
|
import styles5 from "./Hero.module.css";
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
import
|
|
345
|
-
|
|
766
|
+
|
|
767
|
+
// src/lib/sanity.ts
|
|
768
|
+
import imageUrlBuilder from "@sanity/image-url";
|
|
769
|
+
var builder = null;
|
|
770
|
+
function configureSanityClient(client) {
|
|
771
|
+
builder = imageUrlBuilder({
|
|
772
|
+
projectId: client.projectId,
|
|
773
|
+
dataset: client.dataset
|
|
774
|
+
});
|
|
775
|
+
}
|
|
776
|
+
function urlFor(source) {
|
|
777
|
+
if (!source) {
|
|
778
|
+
return {
|
|
779
|
+
width: () => ({ height: () => ({ url: () => "" }), url: () => "" }),
|
|
780
|
+
height: () => ({ width: () => ({ url: () => "" }), url: () => "" }),
|
|
781
|
+
url: () => ""
|
|
782
|
+
};
|
|
783
|
+
}
|
|
784
|
+
if (!builder) {
|
|
785
|
+
const projectId = typeof window !== "undefined" ? window.__SANITY_PROJECT_ID__ : process.env.NEXT_PUBLIC_SANITY_PROJECT_ID;
|
|
786
|
+
const dataset = typeof window !== "undefined" ? window.__SANITY_DATASET__ : process.env.NEXT_PUBLIC_SANITY_DATASET || "production";
|
|
787
|
+
if (projectId) {
|
|
788
|
+
builder = imageUrlBuilder({ projectId, dataset: dataset || "production" });
|
|
789
|
+
} else {
|
|
790
|
+
console.warn("Sanity client not configured. Call configureSanityClient() or set NEXT_PUBLIC_SANITY_PROJECT_ID");
|
|
791
|
+
return {
|
|
792
|
+
width: () => ({ height: () => ({ url: () => "" }), url: () => "" }),
|
|
793
|
+
height: () => ({ width: () => ({ url: () => "" }), url: () => "" }),
|
|
794
|
+
url: () => ""
|
|
795
|
+
};
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
return builder.image(source);
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
// src/components/Hero.tsx
|
|
802
|
+
import { Fragment as Fragment2, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
346
803
|
var defaultUpdates = [
|
|
347
804
|
{
|
|
348
805
|
_id: "1",
|
|
@@ -359,17 +816,17 @@ var defaultUpdates = [
|
|
|
359
816
|
];
|
|
360
817
|
var portableTextComponents = {
|
|
361
818
|
marks: {
|
|
362
|
-
strong: ({ children }) => /* @__PURE__ */
|
|
819
|
+
strong: ({ children }) => /* @__PURE__ */ jsx6("strong", { children }),
|
|
363
820
|
highlight: ({ children, value }) => {
|
|
364
821
|
if (value?.style === "underline") {
|
|
365
|
-
return /* @__PURE__ */
|
|
822
|
+
return /* @__PURE__ */ jsx6("span", { className: styles5.underline, children });
|
|
366
823
|
}
|
|
367
|
-
return /* @__PURE__ */
|
|
824
|
+
return /* @__PURE__ */ jsx6("strong", { children });
|
|
368
825
|
}
|
|
369
826
|
}
|
|
370
827
|
};
|
|
371
828
|
function Hero({ updates }) {
|
|
372
|
-
const { settings, profile } =
|
|
829
|
+
const { settings, profile } = useSiteSettings();
|
|
373
830
|
const displayUpdates = updates.length > 0 ? updates : defaultUpdates;
|
|
374
831
|
const formatDate = (dateString) => {
|
|
375
832
|
const date = new Date(dateString);
|
|
@@ -384,11 +841,11 @@ function Hero({ updates }) {
|
|
|
384
841
|
initial: "hidden",
|
|
385
842
|
whileInView: "visible",
|
|
386
843
|
viewport: { once: true, amount: 0.1 },
|
|
387
|
-
variants:
|
|
844
|
+
variants: staggerContainer,
|
|
388
845
|
children: [
|
|
389
846
|
/* @__PURE__ */ jsxs4("div", { className: styles5.content, children: [
|
|
390
847
|
/* @__PURE__ */ jsxs4("div", { className: styles5.imageWrapper, children: [
|
|
391
|
-
/* @__PURE__ */
|
|
848
|
+
/* @__PURE__ */ jsx6(
|
|
392
849
|
motion4.div,
|
|
393
850
|
{
|
|
394
851
|
className: styles5.profileImage,
|
|
@@ -399,7 +856,7 @@ function Hero({ updates }) {
|
|
|
399
856
|
}
|
|
400
857
|
),
|
|
401
858
|
/* @__PURE__ */ jsxs4("div", { className: styles5.mobileInfo, children: [
|
|
402
|
-
/* @__PURE__ */
|
|
859
|
+
/* @__PURE__ */ jsx6("h1", { className: styles5.mobileInfoName, children: profile?.name || "David" }),
|
|
403
860
|
/* @__PURE__ */ jsxs4("p", { className: styles5.mobileInfoTitle, children: [
|
|
404
861
|
profile?.title || "PhD Candidate",
|
|
405
862
|
" ",
|
|
@@ -407,50 +864,50 @@ function Hero({ updates }) {
|
|
|
407
864
|
] })
|
|
408
865
|
] })
|
|
409
866
|
] }),
|
|
410
|
-
/* @__PURE__ */ jsxs4(motion4.div, { className: styles5.textContent, variants:
|
|
867
|
+
/* @__PURE__ */ jsxs4(motion4.div, { className: styles5.textContent, variants: staggerContainer, children: [
|
|
411
868
|
/* @__PURE__ */ jsxs4("div", { children: [
|
|
412
|
-
profile?.availabilityBadge && /* @__PURE__ */
|
|
413
|
-
!profile?.availabilityBadge && /* @__PURE__ */
|
|
414
|
-
/* @__PURE__ */
|
|
869
|
+
profile?.availabilityBadge && /* @__PURE__ */ jsx6(motion4.span, { className: styles5.badge, variants: fadeInUp, children: profile.availabilityBadge }),
|
|
870
|
+
!profile?.availabilityBadge && /* @__PURE__ */ jsx6(motion4.span, { className: styles5.badge, variants: fadeInUp, children: "Available for 2024 Roles" }),
|
|
871
|
+
/* @__PURE__ */ jsx6(motion4.h2, { className: styles5.headline, variants: fadeInUp, children: profile?.headline ? /* @__PURE__ */ jsxs4(Fragment2, { children: [
|
|
415
872
|
profile.headline.beforeHighlight,
|
|
416
873
|
" ",
|
|
417
|
-
/* @__PURE__ */
|
|
874
|
+
/* @__PURE__ */ jsx6("span", { className: styles5.highlight, children: profile.headline.highlight }),
|
|
418
875
|
" ",
|
|
419
876
|
profile.headline.afterHighlight
|
|
420
877
|
] }) : /* @__PURE__ */ jsxs4(Fragment2, { children: [
|
|
421
878
|
"Building the ",
|
|
422
|
-
/* @__PURE__ */
|
|
879
|
+
/* @__PURE__ */ jsx6("span", { className: styles5.highlight, children: "future of AI" }),
|
|
423
880
|
" ",
|
|
424
881
|
"with robust & scalable vision systems."
|
|
425
882
|
] }) })
|
|
426
883
|
] }),
|
|
427
|
-
/* @__PURE__ */
|
|
884
|
+
/* @__PURE__ */ jsx6(motion4.div, { className: styles5.description, variants: fadeInUp, children: profile?.bio ? /* @__PURE__ */ jsx6(PortableText, { value: profile.bio, components: portableTextComponents }) : /* @__PURE__ */ jsxs4(Fragment2, { children: [
|
|
428
885
|
/* @__PURE__ */ jsxs4("p", { children: [
|
|
429
886
|
"I am a PhD candidate specializing in",
|
|
430
887
|
" ",
|
|
431
|
-
/* @__PURE__ */
|
|
888
|
+
/* @__PURE__ */ jsx6("strong", { children: "Computer Vision" }),
|
|
432
889
|
" and",
|
|
433
890
|
" ",
|
|
434
|
-
/* @__PURE__ */
|
|
891
|
+
/* @__PURE__ */ jsx6("strong", { children: "Machine Learning" }),
|
|
435
892
|
". My research focuses on self-supervised learning, generative models, and their applications in medical imaging and autonomous systems."
|
|
436
893
|
] }),
|
|
437
894
|
/* @__PURE__ */ jsxs4("p", { children: [
|
|
438
895
|
"Previously, I interned at",
|
|
439
896
|
" ",
|
|
440
|
-
/* @__PURE__ */
|
|
897
|
+
/* @__PURE__ */ jsx6("span", { className: styles5.underline, children: "Google DeepMind" }),
|
|
441
898
|
" and",
|
|
442
899
|
" ",
|
|
443
|
-
/* @__PURE__ */
|
|
900
|
+
/* @__PURE__ */ jsx6("span", { className: styles5.underline, children: "Meta AI" }),
|
|
444
901
|
". I am passionate about open-source and making AI accessible to everyone."
|
|
445
902
|
] })
|
|
446
903
|
] }) }),
|
|
447
|
-
/* @__PURE__ */ jsxs4(motion4.div, { className: styles5.links, variants:
|
|
904
|
+
/* @__PURE__ */ jsxs4(motion4.div, { className: styles5.links, variants: fadeInUp, children: [
|
|
448
905
|
/* @__PURE__ */ jsxs4("a", { href: settings?.resumeUrl || "#", className: styles5.link, children: [
|
|
449
|
-
/* @__PURE__ */
|
|
906
|
+
/* @__PURE__ */ jsx6("span", { className: `material-symbols-outlined ${styles5.linkIcon}`, children: "download" }),
|
|
450
907
|
"Download CV"
|
|
451
908
|
] }),
|
|
452
909
|
/* @__PURE__ */ jsxs4("a", { href: settings?.socialLinks?.googleScholar || "#", className: styles5.link, children: [
|
|
453
|
-
/* @__PURE__ */
|
|
910
|
+
/* @__PURE__ */ jsx6("span", { className: `material-symbols-outlined ${styles5.linkIcon}`, children: "school" }),
|
|
454
911
|
"Google Scholar"
|
|
455
912
|
] })
|
|
456
913
|
] })
|
|
@@ -460,22 +917,22 @@ function Hero({ updates }) {
|
|
|
460
917
|
motion4.div,
|
|
461
918
|
{
|
|
462
919
|
className: `glass-panel ${styles5.updates}`,
|
|
463
|
-
variants:
|
|
920
|
+
variants: fadeInUp,
|
|
464
921
|
children: [
|
|
465
922
|
/* @__PURE__ */ jsxs4("h3", { className: styles5.updatesHeader, children: [
|
|
466
|
-
/* @__PURE__ */
|
|
923
|
+
/* @__PURE__ */ jsx6("span", { className: `material-symbols-outlined ${styles5.updatesIcon}`, children: "campaign" }),
|
|
467
924
|
"Latest Updates"
|
|
468
925
|
] }),
|
|
469
|
-
/* @__PURE__ */
|
|
926
|
+
/* @__PURE__ */ jsx6("div", { className: styles5.updatesList, children: displayUpdates.map((update) => /* @__PURE__ */ jsxs4(
|
|
470
927
|
motion4.div,
|
|
471
928
|
{
|
|
472
929
|
className: styles5.updateItem,
|
|
473
|
-
variants:
|
|
930
|
+
variants: fadeInUp,
|
|
474
931
|
children: [
|
|
475
|
-
/* @__PURE__ */
|
|
932
|
+
/* @__PURE__ */ jsx6("div", { className: styles5.updateDate, children: formatDate(update.date) }),
|
|
476
933
|
/* @__PURE__ */ jsxs4("div", { className: styles5.updateContent, children: [
|
|
477
|
-
/* @__PURE__ */
|
|
478
|
-
/* @__PURE__ */
|
|
934
|
+
/* @__PURE__ */ jsx6("h4", { children: update.title }),
|
|
935
|
+
/* @__PURE__ */ jsx6("p", { children: update.description })
|
|
479
936
|
] })
|
|
480
937
|
]
|
|
481
938
|
},
|
|
@@ -493,9 +950,7 @@ function Hero({ updates }) {
|
|
|
493
950
|
import Link2 from "next/link";
|
|
494
951
|
import { motion as motion5 } from "framer-motion";
|
|
495
952
|
import styles6 from "./Projects.module.css";
|
|
496
|
-
import {
|
|
497
|
-
import { urlFor as urlFor2 } from "../../sanity/lib/client";
|
|
498
|
-
import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
953
|
+
import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
499
954
|
var defaultProjects = [
|
|
500
955
|
{
|
|
501
956
|
_id: "1",
|
|
@@ -520,7 +975,7 @@ function Projects({ projects }) {
|
|
|
520
975
|
const displayProjects = projects.length > 0 ? projects : defaultProjects;
|
|
521
976
|
const getProjectImage = (project, index) => {
|
|
522
977
|
if (project.image) {
|
|
523
|
-
return
|
|
978
|
+
return urlFor(project.image).width(800).height(450).url();
|
|
524
979
|
}
|
|
525
980
|
return defaultImages[index % defaultImages.length];
|
|
526
981
|
};
|
|
@@ -532,25 +987,25 @@ function Projects({ projects }) {
|
|
|
532
987
|
initial: "hidden",
|
|
533
988
|
whileInView: "visible",
|
|
534
989
|
viewport: { once: true, amount: 0.1 },
|
|
535
|
-
variants:
|
|
990
|
+
variants: staggerContainer,
|
|
536
991
|
children: [
|
|
537
|
-
/* @__PURE__ */
|
|
538
|
-
/* @__PURE__ */
|
|
539
|
-
/* @__PURE__ */
|
|
992
|
+
/* @__PURE__ */ jsx7(motion5.h2, { className: styles6.title, variants: fadeInUp, children: "Selected Projects" }),
|
|
993
|
+
/* @__PURE__ */ jsx7("div", { className: styles6.grid, children: displayProjects.map((project, index) => /* @__PURE__ */ jsx7(motion5.div, { variants: fadeInUp, children: /* @__PURE__ */ jsxs5(Link2, { href: `/projects/${project.slug}`, className: styles6.card, children: [
|
|
994
|
+
/* @__PURE__ */ jsx7(
|
|
540
995
|
"div",
|
|
541
996
|
{
|
|
542
997
|
className: styles6.cardImage,
|
|
543
998
|
style: { backgroundImage: `url('${getProjectImage(project, index)}')` },
|
|
544
|
-
children: /* @__PURE__ */
|
|
999
|
+
children: /* @__PURE__ */ jsx7("div", { className: styles6.cardImageOverlay })
|
|
545
1000
|
}
|
|
546
1001
|
),
|
|
547
1002
|
/* @__PURE__ */ jsxs5("div", { className: styles6.cardContent, children: [
|
|
548
1003
|
/* @__PURE__ */ jsxs5("div", { className: styles6.cardHeader, children: [
|
|
549
|
-
/* @__PURE__ */
|
|
550
|
-
/* @__PURE__ */
|
|
1004
|
+
/* @__PURE__ */ jsx7("h3", { className: styles6.cardTitle, children: project.title }),
|
|
1005
|
+
/* @__PURE__ */ jsx7("span", { className: styles6.cardLink, children: /* @__PURE__ */ jsx7("span", { className: "material-symbols-outlined", children: "open_in_new" }) })
|
|
551
1006
|
] }),
|
|
552
|
-
/* @__PURE__ */
|
|
553
|
-
/* @__PURE__ */
|
|
1007
|
+
/* @__PURE__ */ jsx7("p", { className: styles6.cardDescription, children: project.shortDescription }),
|
|
1008
|
+
/* @__PURE__ */ jsx7("div", { className: styles6.cardTags, children: project.tags?.map((tag) => /* @__PURE__ */ jsx7("span", { className: styles6.tag, children: tag }, tag)) })
|
|
554
1009
|
] })
|
|
555
1010
|
] }) }, project._id)) })
|
|
556
1011
|
]
|
|
@@ -561,9 +1016,7 @@ function Projects({ projects }) {
|
|
|
561
1016
|
// src/components/Publications.tsx
|
|
562
1017
|
import { motion as motion6 } from "framer-motion";
|
|
563
1018
|
import styles7 from "./Publications.module.css";
|
|
564
|
-
import {
|
|
565
|
-
import { useSiteSettings as useSiteSettings5 } from "@/context/SiteSettingsContext";
|
|
566
|
-
import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
1019
|
+
import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
567
1020
|
var defaultPublications = [
|
|
568
1021
|
{
|
|
569
1022
|
_id: "1",
|
|
@@ -604,11 +1057,11 @@ var defaultPublications = [
|
|
|
604
1057
|
}
|
|
605
1058
|
];
|
|
606
1059
|
function Publications({ publications }) {
|
|
607
|
-
const { settings } =
|
|
1060
|
+
const { settings } = useSiteSettings();
|
|
608
1061
|
const displayPublications = publications.length > 0 ? publications : defaultPublications;
|
|
609
1062
|
const renderAuthors = (authors) => {
|
|
610
1063
|
return authors.map((author, index) => /* @__PURE__ */ jsxs6("span", { children: [
|
|
611
|
-
author.isMe ? /* @__PURE__ */
|
|
1064
|
+
author.isMe ? /* @__PURE__ */ jsx8("span", { className: styles7.cardAuthorHighlight, children: author.name }) : author.name,
|
|
612
1065
|
index < authors.length - 1 && ", "
|
|
613
1066
|
] }, index));
|
|
614
1067
|
};
|
|
@@ -620,27 +1073,27 @@ function Publications({ publications }) {
|
|
|
620
1073
|
initial: "hidden",
|
|
621
1074
|
whileInView: "visible",
|
|
622
1075
|
viewport: { once: true, amount: 0.1 },
|
|
623
|
-
variants:
|
|
1076
|
+
variants: staggerContainer,
|
|
624
1077
|
children: [
|
|
625
|
-
/* @__PURE__ */ jsxs6(motion6.div, { className: styles7.header, variants:
|
|
626
|
-
/* @__PURE__ */
|
|
627
|
-
/* @__PURE__ */
|
|
1078
|
+
/* @__PURE__ */ jsxs6(motion6.div, { className: styles7.header, variants: fadeInUp, children: [
|
|
1079
|
+
/* @__PURE__ */ jsx8("h2", { className: styles7.title, children: "Publications" }),
|
|
1080
|
+
/* @__PURE__ */ jsx8("a", { href: settings?.socialLinks?.googleScholar || "#", className: styles7.scholarLink, children: "View Google Scholar ->" })
|
|
628
1081
|
] }),
|
|
629
|
-
/* @__PURE__ */
|
|
1082
|
+
/* @__PURE__ */ jsx8("div", { className: styles7.list, children: displayPublications.map((pub) => /* @__PURE__ */ jsx8(
|
|
630
1083
|
motion6.div,
|
|
631
1084
|
{
|
|
632
1085
|
className: styles7.card,
|
|
633
|
-
variants:
|
|
1086
|
+
variants: fadeInUp,
|
|
634
1087
|
whileHover: { y: -2 },
|
|
635
1088
|
transition: { duration: 0.2 },
|
|
636
1089
|
children: /* @__PURE__ */ jsxs6("div", { className: styles7.cardContent, children: [
|
|
637
1090
|
/* @__PURE__ */ jsxs6("div", { className: styles7.cardInfo, children: [
|
|
638
|
-
/* @__PURE__ */
|
|
639
|
-
/* @__PURE__ */
|
|
1091
|
+
/* @__PURE__ */ jsx8("h3", { className: styles7.cardTitle, children: pub.title }),
|
|
1092
|
+
/* @__PURE__ */ jsx8("p", { className: styles7.cardAuthors, children: renderAuthors(pub.authors) }),
|
|
640
1093
|
/* @__PURE__ */ jsxs6("div", { className: styles7.cardMeta, children: [
|
|
641
|
-
/* @__PURE__ */
|
|
1094
|
+
/* @__PURE__ */ jsx8("span", { className: styles7.cardVenue, children: pub.venue }),
|
|
642
1095
|
pub.highlight && /* @__PURE__ */ jsxs6("span", { className: styles7.cardHighlight, children: [
|
|
643
|
-
/* @__PURE__ */
|
|
1096
|
+
/* @__PURE__ */ jsx8(
|
|
644
1097
|
"span",
|
|
645
1098
|
{
|
|
646
1099
|
className: `material-symbols-outlined ${styles7.cardHighlightIcon}`,
|
|
@@ -653,7 +1106,7 @@ function Publications({ publications }) {
|
|
|
653
1106
|
] }),
|
|
654
1107
|
/* @__PURE__ */ jsxs6("div", { className: styles7.cardActions, children: [
|
|
655
1108
|
(pub.pdfUrl || pub.pdfFileUrl) && /* @__PURE__ */ jsxs6("a", { href: pub.pdfUrl || pub.pdfFileUrl, className: styles7.actionButton, children: [
|
|
656
|
-
/* @__PURE__ */
|
|
1109
|
+
/* @__PURE__ */ jsx8(
|
|
657
1110
|
"span",
|
|
658
1111
|
{
|
|
659
1112
|
className: `material-symbols-outlined ${styles7.actionIcon}`,
|
|
@@ -663,7 +1116,7 @@ function Publications({ publications }) {
|
|
|
663
1116
|
"PDF"
|
|
664
1117
|
] }),
|
|
665
1118
|
pub.codeUrl && /* @__PURE__ */ jsxs6("a", { href: pub.codeUrl, className: styles7.actionButton, children: [
|
|
666
|
-
/* @__PURE__ */
|
|
1119
|
+
/* @__PURE__ */ jsx8(
|
|
667
1120
|
"span",
|
|
668
1121
|
{
|
|
669
1122
|
className: `material-symbols-outlined ${styles7.actionIcon}`,
|
|
@@ -681,12 +1134,54 @@ function Publications({ publications }) {
|
|
|
681
1134
|
}
|
|
682
1135
|
);
|
|
683
1136
|
}
|
|
1137
|
+
|
|
1138
|
+
// src/components/HomePage.tsx
|
|
1139
|
+
import { Fragment as Fragment3, jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
1140
|
+
function HomePage({
|
|
1141
|
+
updates = [],
|
|
1142
|
+
experiences = [],
|
|
1143
|
+
projects = [],
|
|
1144
|
+
publications = []
|
|
1145
|
+
}) {
|
|
1146
|
+
return /* @__PURE__ */ jsxs7(Fragment3, { children: [
|
|
1147
|
+
/* @__PURE__ */ jsx9(Header, {}),
|
|
1148
|
+
/* @__PURE__ */ jsxs7("main", { children: [
|
|
1149
|
+
/* @__PURE__ */ jsx9(Hero, { updates }),
|
|
1150
|
+
/* @__PURE__ */ jsx9(Divider, {}),
|
|
1151
|
+
/* @__PURE__ */ jsx9(ExperienceSection, { experiences }),
|
|
1152
|
+
/* @__PURE__ */ jsx9(Divider, {}),
|
|
1153
|
+
/* @__PURE__ */ jsx9(Projects, { projects }),
|
|
1154
|
+
/* @__PURE__ */ jsx9(Divider, {}),
|
|
1155
|
+
/* @__PURE__ */ jsx9(Publications, { publications })
|
|
1156
|
+
] }),
|
|
1157
|
+
/* @__PURE__ */ jsx9(Footer, {})
|
|
1158
|
+
] });
|
|
1159
|
+
}
|
|
1160
|
+
|
|
1161
|
+
// src/config.ts
|
|
1162
|
+
function defineConfig(config) {
|
|
1163
|
+
return config;
|
|
1164
|
+
}
|
|
684
1165
|
export {
|
|
685
1166
|
Divider,
|
|
686
1167
|
ExperienceSection as Experience,
|
|
687
1168
|
Footer,
|
|
688
1169
|
Header,
|
|
689
1170
|
Hero,
|
|
1171
|
+
HomePage,
|
|
690
1172
|
Projects,
|
|
691
|
-
Publications
|
|
1173
|
+
Publications,
|
|
1174
|
+
SiteSettingsProvider,
|
|
1175
|
+
ThemeProvider,
|
|
1176
|
+
applyFonts,
|
|
1177
|
+
applyThemeColors,
|
|
1178
|
+
colorPresets,
|
|
1179
|
+
configureSanityClient,
|
|
1180
|
+
defineConfig,
|
|
1181
|
+
fontPresets,
|
|
1182
|
+
getColorConfig,
|
|
1183
|
+
getFontFamily,
|
|
1184
|
+
urlFor,
|
|
1185
|
+
useSiteSettings,
|
|
1186
|
+
useTheme
|
|
692
1187
|
};
|