@prosophia/personal-portfolio 0.0.2 → 0.0.4

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