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