@prosophia/personal-portfolio 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,735 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ Divider: () => Divider,
34
+ Experience: () => ExperienceSection,
35
+ Footer: () => Footer,
36
+ Header: () => Header,
37
+ Hero: () => Hero,
38
+ Projects: () => Projects,
39
+ Publications: () => Publications
40
+ });
41
+ module.exports = __toCommonJS(index_exports);
42
+
43
+ // src/components/Divider.tsx
44
+ var import_Divider = __toESM(require("./Divider.module.css"));
45
+ var import_jsx_runtime = require("react/jsx-runtime");
46
+ function Divider() {
47
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("hr", { className: import_Divider.default.divider });
48
+ }
49
+
50
+ // src/components/Experience.tsx
51
+ var import_framer_motion = require("framer-motion");
52
+ var import_Experience = __toESM(require("./Experience.module.css"));
53
+ var import_motion = require("@/styles/motion");
54
+ var import_SiteSettingsContext = require("@/context/SiteSettingsContext");
55
+ var import_jsx_runtime2 = require("react/jsx-runtime");
56
+ var defaultExperiences = [
57
+ {
58
+ _id: "1",
59
+ title: "PhD Student, Computer Science",
60
+ organization: "Massachusetts Institute of Technology (MIT)",
61
+ period: "2021 - Present",
62
+ description: 'Researching self-supervised learning methods for medical imaging. Advised by Prof. Brilliant Mind. TA for "Intro to Deep Learning".',
63
+ isCurrent: true,
64
+ type: "education"
65
+ },
66
+ {
67
+ _id: "2",
68
+ title: "Research Scientist Intern",
69
+ organization: "Google DeepMind",
70
+ period: "Summer 2023",
71
+ description: "Developed a novel transformer architecture for video understanding, improving SOTA on Kinetics-400 by 1.5%.",
72
+ type: "internship"
73
+ },
74
+ {
75
+ _id: "3",
76
+ title: "AI Research Intern",
77
+ organization: "Meta AI (FAIR)",
78
+ period: "Summer 2022",
79
+ description: "Contributed to PyTorch core library optimizations for distributed training.",
80
+ type: "internship"
81
+ },
82
+ {
83
+ _id: "4",
84
+ title: "B.S. in Computer Science",
85
+ organization: "Stanford University",
86
+ period: "2017 - 2021",
87
+ description: "Graduated with Honors. Focused on Artificial Intelligence and Human-Computer Interaction.",
88
+ type: "education"
89
+ }
90
+ ];
91
+ function ExperienceSection({ experiences }) {
92
+ const { settings } = (0, import_SiteSettingsContext.useSiteSettings)();
93
+ const displayExperiences = experiences.length > 0 ? experiences : defaultExperiences;
94
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
95
+ import_framer_motion.motion.section,
96
+ {
97
+ id: "cv",
98
+ className: import_Experience.default.section,
99
+ initial: "hidden",
100
+ whileInView: "visible",
101
+ viewport: { once: true, amount: 0.1 },
102
+ variants: import_motion.staggerContainer,
103
+ children: [
104
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_framer_motion.motion.div, { className: import_Experience.default.header, variants: import_motion.fadeInUp, children: [
105
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h2", { className: import_Experience.default.title, children: "Experience & Education" }),
106
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
107
+ import_framer_motion.motion.a,
108
+ {
109
+ href: settings?.resumeUrl || "#",
110
+ className: import_Experience.default.downloadButton,
111
+ whileHover: import_motion.hoverLift,
112
+ whileTap: import_motion.tapScale,
113
+ children: [
114
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "material-symbols-outlined", children: "download" }),
115
+ "Download Resume"
116
+ ]
117
+ }
118
+ )
119
+ ] }),
120
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: import_Experience.default.timeline, children: displayExperiences.map((exp) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
121
+ import_framer_motion.motion.div,
122
+ {
123
+ className: import_Experience.default.timelineItem,
124
+ variants: import_motion.fadeInUp,
125
+ children: [
126
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
127
+ "div",
128
+ {
129
+ className: `${import_Experience.default.timelineDot} ${exp.isCurrent ? import_Experience.default.timelineDotCurrent : ""}`
130
+ }
131
+ ),
132
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: import_Experience.default.timelineHeader, children: [
133
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: import_Experience.default.timelineTitle, children: exp.title }),
134
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: import_Experience.default.timelinePeriod, children: exp.period })
135
+ ] }),
136
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: import_Experience.default.timelineOrg, children: exp.organization }),
137
+ exp.description && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: import_Experience.default.timelineDescription, children: exp.description })
138
+ ]
139
+ },
140
+ exp._id
141
+ )) })
142
+ ]
143
+ }
144
+ );
145
+ }
146
+
147
+ // src/components/Footer.tsx
148
+ var import_framer_motion2 = require("framer-motion");
149
+ var import_Footer = __toESM(require("./Footer.module.css"));
150
+ var import_motion2 = require("@/styles/motion");
151
+ var import_SiteSettingsContext2 = require("@/context/SiteSettingsContext");
152
+ var import_jsx_runtime3 = require("react/jsx-runtime");
153
+ function Footer() {
154
+ const { settings, profile } = (0, import_SiteSettingsContext2.useSiteSettings)();
155
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
156
+ import_framer_motion2.motion.footer,
157
+ {
158
+ className: import_Footer.default.footer,
159
+ initial: "hidden",
160
+ whileInView: "visible",
161
+ viewport: { once: true },
162
+ variants: import_motion2.fadeInUp,
163
+ children: [
164
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("p", { className: import_Footer.default.copyright, children: [
165
+ "\xA9 ",
166
+ (/* @__PURE__ */ new Date()).getFullYear(),
167
+ " ",
168
+ profile?.name || "David",
169
+ ".",
170
+ " ",
171
+ settings?.footerText || "Built with Passion."
172
+ ] }),
173
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("p", { className: import_Footer.default.updated, children: [
174
+ "Last updated: ",
175
+ (/* @__PURE__ */ new Date()).toLocaleDateString("en-US", { month: "long", day: "numeric", year: "numeric" })
176
+ ] })
177
+ ]
178
+ }
179
+ );
180
+ }
181
+
182
+ // src/components/Header.tsx
183
+ var import_react = require("react");
184
+ var import_link = __toESM(require("next/link"));
185
+ var import_framer_motion3 = require("framer-motion");
186
+ var import_ThemeContext = require("@/context/ThemeContext");
187
+ var import_SiteSettingsContext3 = require("@/context/SiteSettingsContext");
188
+ var import_Header = __toESM(require("./Header.module.css"));
189
+ var import_motion3 = require("@/styles/motion");
190
+ var import_jsx_runtime4 = require("react/jsx-runtime");
191
+ var navLinks = [
192
+ { href: "#about", label: "About" },
193
+ { href: "#publications", label: "Publications" },
194
+ { href: "#projects", label: "Projects" },
195
+ { href: "#cv", label: "CV / Resume" }
196
+ ];
197
+ function Header() {
198
+ const { theme, toggleTheme } = (0, import_ThemeContext.useTheme)();
199
+ const { settings, profile } = (0, import_SiteSettingsContext3.useSiteSettings)();
200
+ const [mobileMenuOpen, setMobileMenuOpen] = (0, import_react.useState)(false);
201
+ const socialLinks = settings?.socialLinks;
202
+ const contactEmail = settings?.contactEmail;
203
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("header", { className: import_Header.default.header, children: [
204
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: import_Header.default.container, children: [
205
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_link.default, { href: "/", className: import_Header.default.logo, children: [
206
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: import_Header.default.logoName, children: profile?.name || "David" }),
207
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: import_Header.default.logoTitle, children: profile?.title || "PhD Candidate" })
208
+ ] }),
209
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("nav", { className: import_Header.default.nav, children: navLinks.map((link) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_link.default, { href: link.href, className: import_Header.default.navLink, children: [
210
+ link.label,
211
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: import_Header.default.navLinkUnderline })
212
+ ] }, link.href)) }),
213
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: import_Header.default.actions, children: [
214
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: import_Header.default.socialLinks, children: [
215
+ (socialLinks?.twitter || !settings) && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
216
+ "a",
217
+ {
218
+ href: socialLinks?.twitter || "https://twitter.com",
219
+ target: "_blank",
220
+ rel: "noopener noreferrer",
221
+ className: import_Header.default.socialLink,
222
+ "aria-label": "Twitter",
223
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("svg", { fill: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M8.29 20.251c7.547 0 11.675-6.253 11.675-11.675 0-.178 0-.355-.012-.53A8.348 8.348 0 0022 5.92a8.19 8.19 0 01-2.357.646 4.118 4.118 0 001.804-2.27 8.224 8.224 0 01-2.605.996 4.107 4.107 0 00-6.993 3.743 11.65 11.65 0 01-8.457-4.287 4.106 4.106 0 001.27 5.477A4.072 4.072 0 012.8 9.713v.052a4.105 4.105 0 003.292 4.022 4.095 4.095 0 01-1.853.07 4.108 4.108 0 003.834 2.85A8.233 8.233 0 012 18.407a11.616 11.616 0 006.29 1.84" }) })
224
+ }
225
+ ),
226
+ (socialLinks?.github || !settings) && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
227
+ "a",
228
+ {
229
+ href: socialLinks?.github || "https://github.com",
230
+ target: "_blank",
231
+ rel: "noopener noreferrer",
232
+ className: import_Header.default.socialLink,
233
+ "aria-label": "GitHub",
234
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("svg", { fill: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
235
+ "path",
236
+ {
237
+ fillRule: "evenodd",
238
+ clipRule: "evenodd",
239
+ d: "M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
240
+ }
241
+ ) })
242
+ }
243
+ ),
244
+ (socialLinks?.linkedin || !settings) && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
245
+ "a",
246
+ {
247
+ href: socialLinks?.linkedin || "https://linkedin.com",
248
+ target: "_blank",
249
+ rel: "noopener noreferrer",
250
+ className: import_Header.default.socialLink,
251
+ "aria-label": "LinkedIn",
252
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("svg", { fill: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
253
+ "path",
254
+ {
255
+ fillRule: "evenodd",
256
+ clipRule: "evenodd",
257
+ d: "M19 0h-14c-2.761 0-5 2.239-5 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5v-14c0-2.761-2.238-5-5-5zm-11 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.396-2.586 7-2.777 7 2.476v6.759z"
258
+ }
259
+ ) })
260
+ }
261
+ )
262
+ ] }),
263
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
264
+ import_framer_motion3.motion.button,
265
+ {
266
+ className: import_Header.default.themeToggle,
267
+ onClick: toggleTheme,
268
+ whileHover: import_motion3.hoverLift,
269
+ whileTap: import_motion3.tapScale,
270
+ "aria-label": `Switch to ${theme === "dark" ? "light" : "dark"} mode`,
271
+ children: theme === "dark" ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
272
+ "svg",
273
+ {
274
+ xmlns: "http://www.w3.org/2000/svg",
275
+ width: "20",
276
+ height: "20",
277
+ viewBox: "0 0 24 24",
278
+ fill: "none",
279
+ stroke: "currentColor",
280
+ strokeWidth: "2",
281
+ strokeLinecap: "round",
282
+ strokeLinejoin: "round",
283
+ children: [
284
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("circle", { cx: "12", cy: "12", r: "5" }),
285
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "12", y1: "1", x2: "12", y2: "3" }),
286
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "12", y1: "21", x2: "12", y2: "23" }),
287
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "4.22", y1: "4.22", x2: "5.64", y2: "5.64" }),
288
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "18.36", y1: "18.36", x2: "19.78", y2: "19.78" }),
289
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "1", y1: "12", x2: "3", y2: "12" }),
290
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "21", y1: "12", x2: "23", y2: "12" }),
291
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "4.22", y1: "19.78", x2: "5.64", y2: "18.36" }),
292
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "18.36", y1: "5.64", x2: "19.78", y2: "4.22" })
293
+ ]
294
+ }
295
+ ) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
296
+ "svg",
297
+ {
298
+ xmlns: "http://www.w3.org/2000/svg",
299
+ width: "20",
300
+ height: "20",
301
+ viewBox: "0 0 24 24",
302
+ fill: "none",
303
+ stroke: "currentColor",
304
+ strokeWidth: "2",
305
+ strokeLinecap: "round",
306
+ strokeLinejoin: "round",
307
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" })
308
+ }
309
+ )
310
+ }
311
+ ),
312
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
313
+ import_framer_motion3.motion.a,
314
+ {
315
+ href: contactEmail ? `mailto:${contactEmail}` : "mailto:contact@example.com",
316
+ className: import_Header.default.contactButton,
317
+ whileHover: import_motion3.hoverLift,
318
+ whileTap: import_motion3.tapScale,
319
+ children: [
320
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: `material-symbols-outlined ${import_Header.default.contactButtonIcon}`, children: "mail" }),
321
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: import_Header.default.contactButtonText, children: "Contact" })
322
+ ]
323
+ }
324
+ ),
325
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
326
+ "button",
327
+ {
328
+ className: import_Header.default.mobileMenuButton,
329
+ onClick: () => setMobileMenuOpen(!mobileMenuOpen),
330
+ "aria-label": "Toggle menu",
331
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
332
+ "svg",
333
+ {
334
+ xmlns: "http://www.w3.org/2000/svg",
335
+ width: "24",
336
+ height: "24",
337
+ viewBox: "0 0 24 24",
338
+ fill: "none",
339
+ stroke: "currentColor",
340
+ strokeWidth: "2",
341
+ strokeLinecap: "round",
342
+ strokeLinejoin: "round",
343
+ children: mobileMenuOpen ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
344
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
345
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
346
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
347
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "3", y1: "12", x2: "21", y2: "12" }),
348
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "3", y1: "6", x2: "21", y2: "6" }),
349
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "3", y1: "18", x2: "21", y2: "18" })
350
+ ] })
351
+ }
352
+ )
353
+ }
354
+ )
355
+ ] })
356
+ ] }),
357
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_framer_motion3.AnimatePresence, { children: mobileMenuOpen && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
358
+ import_framer_motion3.motion.nav,
359
+ {
360
+ className: import_Header.default.mobileNav,
361
+ initial: { opacity: 0, y: -10 },
362
+ animate: { opacity: 1, y: 0 },
363
+ exit: { opacity: 0, y: -10 },
364
+ transition: { duration: 0.2 },
365
+ children: navLinks.map((link) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
366
+ import_link.default,
367
+ {
368
+ href: link.href,
369
+ className: import_Header.default.mobileNavLink,
370
+ onClick: () => setMobileMenuOpen(false),
371
+ children: link.label
372
+ },
373
+ link.href
374
+ ))
375
+ }
376
+ ) })
377
+ ] });
378
+ }
379
+
380
+ // src/components/Hero.tsx
381
+ var import_framer_motion4 = require("framer-motion");
382
+ var import_react2 = require("@portabletext/react");
383
+ var import_Hero = __toESM(require("./Hero.module.css"));
384
+ var import_motion4 = require("@/styles/motion");
385
+ var import_SiteSettingsContext4 = require("@/context/SiteSettingsContext");
386
+ var import_client = require("../../sanity/lib/client");
387
+ var import_jsx_runtime5 = require("react/jsx-runtime");
388
+ var defaultUpdates = [
389
+ {
390
+ _id: "1",
391
+ date: "2024-06-01",
392
+ title: "Accepted to CVPR 2024",
393
+ description: 'My paper on "Self-Supervised Learning for Small Datasets" was accepted for an oral presentation.'
394
+ },
395
+ {
396
+ _id: "2",
397
+ date: "2024-04-01",
398
+ title: "Guest Lecturer at Stanford",
399
+ description: "Invited to speak about the future of Generative AI in Healthcare diagnostics."
400
+ }
401
+ ];
402
+ var portableTextComponents = {
403
+ marks: {
404
+ strong: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { children }),
405
+ highlight: ({ children, value }) => {
406
+ if (value?.style === "underline") {
407
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: import_Hero.default.underline, children });
408
+ }
409
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { children });
410
+ }
411
+ }
412
+ };
413
+ function Hero({ updates }) {
414
+ const { settings, profile } = (0, import_SiteSettingsContext4.useSiteSettings)();
415
+ const displayUpdates = updates.length > 0 ? updates : defaultUpdates;
416
+ const formatDate = (dateString) => {
417
+ const date = new Date(dateString);
418
+ return date.toLocaleDateString("en-US", { month: "short", year: "numeric" });
419
+ };
420
+ const profileImageUrl = profile?.profileImage ? (0, import_client.urlFor)(profile.profileImage).width(400).height(400).url() : "https://lh3.googleusercontent.com/aida-public/AB6AXuA-51ZbdC8I959tDHVIKQM2go5QOPdVOVKiWaoxslYlpf5sfFXxZWku_Fo0DOotMhL8dFEOKCgNphtRHjlEWUULo0oVWGXkG5Hft4LCs2v09RdKgQp0diGKJE95XmfUyaL8geGo-ZA1pJm_e3zUDJ4zTtlK2y_g6-ZaVsm5ZH8L3IuFWVtMFUW8fJhFsy7kkFUXfI82D6_72Sl7ggk03nQaE4uFLf5ItCBzXWmMzUZQhBaB-g2Ur1apoHUb3x0cpZgYELr1mx1uRpnc";
421
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
422
+ import_framer_motion4.motion.section,
423
+ {
424
+ id: "about",
425
+ className: import_Hero.default.hero,
426
+ initial: "hidden",
427
+ whileInView: "visible",
428
+ viewport: { once: true, amount: 0.1 },
429
+ variants: import_motion4.staggerContainer,
430
+ children: [
431
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: import_Hero.default.content, children: [
432
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: import_Hero.default.imageWrapper, children: [
433
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
434
+ import_framer_motion4.motion.div,
435
+ {
436
+ className: import_Hero.default.profileImage,
437
+ style: {
438
+ backgroundImage: `url("${profileImageUrl}")`
439
+ },
440
+ variants: import_motion4.blurFade
441
+ }
442
+ ),
443
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: import_Hero.default.mobileInfo, children: [
444
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h1", { className: import_Hero.default.mobileInfoName, children: profile?.name || "David" }),
445
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: import_Hero.default.mobileInfoTitle, children: [
446
+ profile?.title || "PhD Candidate",
447
+ " ",
448
+ profile?.institution && `at ${profile.institution}`
449
+ ] })
450
+ ] })
451
+ ] }),
452
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_framer_motion4.motion.div, { className: import_Hero.default.textContent, variants: import_motion4.staggerContainer, children: [
453
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { children: [
454
+ profile?.availabilityBadge && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_framer_motion4.motion.span, { className: import_Hero.default.badge, variants: import_motion4.fadeInUp, children: profile.availabilityBadge }),
455
+ !profile?.availabilityBadge && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_framer_motion4.motion.span, { className: import_Hero.default.badge, variants: import_motion4.fadeInUp, children: "Available for 2024 Roles" }),
456
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_framer_motion4.motion.h2, { className: import_Hero.default.headline, variants: import_motion4.fadeInUp, children: profile?.headline ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
457
+ profile.headline.beforeHighlight,
458
+ " ",
459
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: import_Hero.default.highlight, children: profile.headline.highlight }),
460
+ " ",
461
+ profile.headline.afterHighlight
462
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
463
+ "Building the ",
464
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: import_Hero.default.highlight, children: "future of AI" }),
465
+ " ",
466
+ "with robust & scalable vision systems."
467
+ ] }) })
468
+ ] }),
469
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_framer_motion4.motion.div, { className: import_Hero.default.description, variants: import_motion4.fadeInUp, children: profile?.bio ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react2.PortableText, { value: profile.bio, components: portableTextComponents }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
470
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { children: [
471
+ "I am a PhD candidate specializing in",
472
+ " ",
473
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { children: "Computer Vision" }),
474
+ " and",
475
+ " ",
476
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { children: "Machine Learning" }),
477
+ ". My research focuses on self-supervised learning, generative models, and their applications in medical imaging and autonomous systems."
478
+ ] }),
479
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { children: [
480
+ "Previously, I interned at",
481
+ " ",
482
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: import_Hero.default.underline, children: "Google DeepMind" }),
483
+ " and",
484
+ " ",
485
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: import_Hero.default.underline, children: "Meta AI" }),
486
+ ". I am passionate about open-source and making AI accessible to everyone."
487
+ ] })
488
+ ] }) }),
489
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_framer_motion4.motion.div, { className: import_Hero.default.links, variants: import_motion4.fadeInUp, children: [
490
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("a", { href: settings?.resumeUrl || "#", className: import_Hero.default.link, children: [
491
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: `material-symbols-outlined ${import_Hero.default.linkIcon}`, children: "download" }),
492
+ "Download CV"
493
+ ] }),
494
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("a", { href: settings?.socialLinks?.googleScholar || "#", className: import_Hero.default.link, children: [
495
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: `material-symbols-outlined ${import_Hero.default.linkIcon}`, children: "school" }),
496
+ "Google Scholar"
497
+ ] })
498
+ ] })
499
+ ] })
500
+ ] }),
501
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
502
+ import_framer_motion4.motion.div,
503
+ {
504
+ className: `glass-panel ${import_Hero.default.updates}`,
505
+ variants: import_motion4.fadeInUp,
506
+ children: [
507
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("h3", { className: import_Hero.default.updatesHeader, children: [
508
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: `material-symbols-outlined ${import_Hero.default.updatesIcon}`, children: "campaign" }),
509
+ "Latest Updates"
510
+ ] }),
511
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: import_Hero.default.updatesList, children: displayUpdates.map((update) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
512
+ import_framer_motion4.motion.div,
513
+ {
514
+ className: import_Hero.default.updateItem,
515
+ variants: import_motion4.fadeInUp,
516
+ children: [
517
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: import_Hero.default.updateDate, children: formatDate(update.date) }),
518
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: import_Hero.default.updateContent, children: [
519
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h4", { children: update.title }),
520
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { children: update.description })
521
+ ] })
522
+ ]
523
+ },
524
+ update._id
525
+ )) })
526
+ ]
527
+ }
528
+ )
529
+ ]
530
+ }
531
+ );
532
+ }
533
+
534
+ // src/components/Projects.tsx
535
+ var import_link2 = __toESM(require("next/link"));
536
+ var import_framer_motion5 = require("framer-motion");
537
+ var import_Projects = __toESM(require("./Projects.module.css"));
538
+ var import_motion5 = require("@/styles/motion");
539
+ var import_client2 = require("../../sanity/lib/client");
540
+ var import_jsx_runtime6 = require("react/jsx-runtime");
541
+ var defaultProjects = [
542
+ {
543
+ _id: "1",
544
+ title: "VisionPoint 3D",
545
+ slug: "visionpoint-3d",
546
+ shortDescription: "A high-performance web-based visualizer for massive 3D point cloud datasets using WebGL and Rust.",
547
+ tags: ["Python", "WebGL", "Pytorch"]
548
+ },
549
+ {
550
+ _id: "2",
551
+ title: "NeuroDiff",
552
+ slug: "neurodiff",
553
+ shortDescription: "Open-source library for differential privacy in deep learning models, currently used by 2k+ researchers.",
554
+ tags: ["Pytorch", "Security"]
555
+ }
556
+ ];
557
+ var defaultImages = [
558
+ "https://lh3.googleusercontent.com/aida-public/AB6AXuB1PWRnjvaVrfJaohXFUHaRQ4AbMmTuaD8Fg0K8aBv8Krcu2Uzz92Lp98o3qqFyBPJDs5-Z6xe-mM0TEmr0mMGu-3NGBF-wqU7q8pf0xWdcwssH5AEYU7ymnro9hyrscmYzjpycMo4qLpd6tK00_QbtSjLF0ES4Z07YAHDP-uGK6snU8KGxRkrd7ZO4txTM6OS5Nqtk6J8Zj8kjVqPkVcETjF2WaSzZyuSUgdSkuau8GdIxLYu01NDLl-u_8cOKoIB6y56Z71ORPnki",
559
+ "https://lh3.googleusercontent.com/aida-public/AB6AXuAyQMI08rho1tcnXWT8W6kbL5T-yy5_hKxObk-ebQf4NuOOPz84KQaGrIt9a7EThgctYWCWfaK6oaaaY6vzUg1T_YF0mXjzmqwaB90wlCP3DApzeiZb6ywEKvr1f6oebzrg3Em3C0LkuziRLVdOyDmr47uOJG6Q3Yymyi0FJV5-4cMRI5jrZw7OSS5lef8fvHIhQmGlmzl55j74KRq8T5pQEUl4F6I1-gtE6evROpnutCQKUJKPz2hUoyMtu0mvE5CCBeq6-ZHdWdgV"
560
+ ];
561
+ function Projects({ projects }) {
562
+ const displayProjects = projects.length > 0 ? projects : defaultProjects;
563
+ const getProjectImage = (project, index) => {
564
+ if (project.image) {
565
+ return (0, import_client2.urlFor)(project.image).width(800).height(450).url();
566
+ }
567
+ return defaultImages[index % defaultImages.length];
568
+ };
569
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
570
+ import_framer_motion5.motion.section,
571
+ {
572
+ id: "projects",
573
+ className: import_Projects.default.section,
574
+ initial: "hidden",
575
+ whileInView: "visible",
576
+ viewport: { once: true, amount: 0.1 },
577
+ variants: import_motion5.staggerContainer,
578
+ children: [
579
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_framer_motion5.motion.h2, { className: import_Projects.default.title, variants: import_motion5.fadeInUp, children: "Selected Projects" }),
580
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: import_Projects.default.grid, children: displayProjects.map((project, index) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_framer_motion5.motion.div, { variants: import_motion5.fadeInUp, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_link2.default, { href: `/projects/${project.slug}`, className: import_Projects.default.card, children: [
581
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
582
+ "div",
583
+ {
584
+ className: import_Projects.default.cardImage,
585
+ style: { backgroundImage: `url('${getProjectImage(project, index)}')` },
586
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: import_Projects.default.cardImageOverlay })
587
+ }
588
+ ),
589
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: import_Projects.default.cardContent, children: [
590
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: import_Projects.default.cardHeader, children: [
591
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h3", { className: import_Projects.default.cardTitle, children: project.title }),
592
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: import_Projects.default.cardLink, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "material-symbols-outlined", children: "open_in_new" }) })
593
+ ] }),
594
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: import_Projects.default.cardDescription, children: project.shortDescription }),
595
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: import_Projects.default.cardTags, children: project.tags?.map((tag) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: import_Projects.default.tag, children: tag }, tag)) })
596
+ ] })
597
+ ] }) }, project._id)) })
598
+ ]
599
+ }
600
+ );
601
+ }
602
+
603
+ // src/components/Publications.tsx
604
+ var import_framer_motion6 = require("framer-motion");
605
+ var import_Publications = __toESM(require("./Publications.module.css"));
606
+ var import_motion6 = require("@/styles/motion");
607
+ var import_SiteSettingsContext5 = require("@/context/SiteSettingsContext");
608
+ var import_jsx_runtime7 = require("react/jsx-runtime");
609
+ var defaultPublications = [
610
+ {
611
+ _id: "1",
612
+ title: "Self-Supervised Vision Transformers for Medical Image Segmentation",
613
+ authors: [
614
+ { name: "David", isMe: true },
615
+ { name: "Sarah Connor", isMe: false },
616
+ { name: "John Doe", isMe: false }
617
+ ],
618
+ venue: "CVPR 2024",
619
+ year: "2024",
620
+ highlight: "Oral Presentation",
621
+ pdfUrl: "#",
622
+ codeUrl: "#"
623
+ },
624
+ {
625
+ _id: "2",
626
+ title: "Generative Adversarial Networks for Climate Modeling",
627
+ authors: [
628
+ { name: "Jane Smith", isMe: false },
629
+ { name: "David", isMe: true }
630
+ ],
631
+ venue: "ICCV 2023",
632
+ year: "2023",
633
+ pdfUrl: "#"
634
+ },
635
+ {
636
+ _id: "3",
637
+ title: "Efficient Neural Architecture Search",
638
+ authors: [
639
+ { name: "David", isMe: true },
640
+ { name: "Alan Turing", isMe: false }
641
+ ],
642
+ venue: "NeurIPS 2022",
643
+ year: "2022",
644
+ pdfUrl: "#",
645
+ codeUrl: "#"
646
+ }
647
+ ];
648
+ function Publications({ publications }) {
649
+ const { settings } = (0, import_SiteSettingsContext5.useSiteSettings)();
650
+ const displayPublications = publications.length > 0 ? publications : defaultPublications;
651
+ const renderAuthors = (authors) => {
652
+ return authors.map((author, index) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { children: [
653
+ author.isMe ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: import_Publications.default.cardAuthorHighlight, children: author.name }) : author.name,
654
+ index < authors.length - 1 && ", "
655
+ ] }, index));
656
+ };
657
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
658
+ import_framer_motion6.motion.section,
659
+ {
660
+ id: "publications",
661
+ className: import_Publications.default.section,
662
+ initial: "hidden",
663
+ whileInView: "visible",
664
+ viewport: { once: true, amount: 0.1 },
665
+ variants: import_motion6.staggerContainer,
666
+ children: [
667
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_framer_motion6.motion.div, { className: import_Publications.default.header, variants: import_motion6.fadeInUp, children: [
668
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h2", { className: import_Publications.default.title, children: "Publications" }),
669
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("a", { href: settings?.socialLinks?.googleScholar || "#", className: import_Publications.default.scholarLink, children: "View Google Scholar ->" })
670
+ ] }),
671
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: import_Publications.default.list, children: displayPublications.map((pub) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
672
+ import_framer_motion6.motion.div,
673
+ {
674
+ className: import_Publications.default.card,
675
+ variants: import_motion6.fadeInUp,
676
+ whileHover: { y: -2 },
677
+ transition: { duration: 0.2 },
678
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: import_Publications.default.cardContent, children: [
679
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: import_Publications.default.cardInfo, children: [
680
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h3", { className: import_Publications.default.cardTitle, children: pub.title }),
681
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: import_Publications.default.cardAuthors, children: renderAuthors(pub.authors) }),
682
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: import_Publications.default.cardMeta, children: [
683
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: import_Publications.default.cardVenue, children: pub.venue }),
684
+ pub.highlight && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { className: import_Publications.default.cardHighlight, children: [
685
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
686
+ "span",
687
+ {
688
+ className: `material-symbols-outlined ${import_Publications.default.cardHighlightIcon}`,
689
+ children: "star"
690
+ }
691
+ ),
692
+ pub.highlight
693
+ ] })
694
+ ] })
695
+ ] }),
696
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: import_Publications.default.cardActions, children: [
697
+ (pub.pdfUrl || pub.pdfFileUrl) && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("a", { href: pub.pdfUrl || pub.pdfFileUrl, className: import_Publications.default.actionButton, children: [
698
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
699
+ "span",
700
+ {
701
+ className: `material-symbols-outlined ${import_Publications.default.actionIcon}`,
702
+ children: "picture_as_pdf"
703
+ }
704
+ ),
705
+ "PDF"
706
+ ] }),
707
+ pub.codeUrl && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("a", { href: pub.codeUrl, className: import_Publications.default.actionButton, children: [
708
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
709
+ "span",
710
+ {
711
+ className: `material-symbols-outlined ${import_Publications.default.actionIcon}`,
712
+ children: "code"
713
+ }
714
+ ),
715
+ "Code"
716
+ ] })
717
+ ] })
718
+ ] })
719
+ },
720
+ pub._id
721
+ )) })
722
+ ]
723
+ }
724
+ );
725
+ }
726
+ // Annotate the CommonJS export names for ESM import in node:
727
+ 0 && (module.exports = {
728
+ Divider,
729
+ Experience,
730
+ Footer,
731
+ Header,
732
+ Hero,
733
+ Projects,
734
+ Publications
735
+ });