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