@prosophia/personal-portfolio 0.0.3 → 0.0.4

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