diff --git a/content/experience.json b/content/experience.json index 3d313ed..38992bd 100644 --- a/content/experience.json +++ b/content/experience.json @@ -26,8 +26,8 @@ "links": [{ "label": "Program", "url": "https://accessacademy.cehd.gmu.edu/ai-summer-camp" }] }, { - "role": "Lead Software Engineer", - "organization": "Raytheon Autonomous Vehicle Competition", + "role": "Team Lead, RAVC Team", + "organization": "Raytheon Autonomous Vehicle Competition (RAVC)", "period": "Dec 2025 – May 2026", "highlights": [ "Beat four competing universities including Virginia Tech.", diff --git a/content/leadership.json b/content/leadership.json index 21390ec..5e8a608 100644 --- a/content/leadership.json +++ b/content/leadership.json @@ -1,6 +1,7 @@ [ - { "role": "Team Lead", "organization": "GMU RAVC/ARC Team", "url": "https://gmu.autonomousrobotics.club/" }, - { "role": "President", "organization": "GMU Minecraft Club", "url": "https://gmmc.sirblob.co/" }, + { "role": "Team Lead", "organization": "GMU RAVC Team", "url": "https://gmu.autonomousrobotics.club/" }, + { "role": "Secretary", "organization": "GMU Autonomous Robotics Club (ARC)", "url": "https://gmu.autonomousrobotics.club/" }, + { "role": "President", "organization": "GMU Minecraft Club", "url": "https://gmmc.club/" }, { "role": "Eagle Scout", "organization": "BSA" }, { "role": "Volunteer", "organization": "Fairfax County CERT" } ] diff --git a/content/profile.json b/content/profile.json index 09bc01e..5387e14 100644 --- a/content/profile.json +++ b/content/profile.json @@ -6,6 +6,7 @@ "title": "Computer Science Student", "email": "sirblob0@gmail.com", "avatar": "/blob_nerd.png", + "photo": "/portfolio-photo.jpg", "bio": "An engineer who loves making things. I build fun coding projects, compete in hackathons and robotics competitions, and enjoy games like Minecraft and Pokémon TCG Live. I'm interested in Open Source, Robotics, Embedded Systems, and AI/ML.", "tagline": "My passion is using Computer Science with practical Engineering to enhance technology for the future.", "education": { diff --git a/src/lib/components/ui/ProfileIntro.svelte b/src/lib/components/ui/ProfileIntro.svelte index 108e6d6..808c2e0 100644 --- a/src/lib/components/ui/ProfileIntro.svelte +++ b/src/lib/components/ui/ProfileIntro.svelte @@ -1,11 +1,18 @@
- {profile.displayName} + {profile.displayName}

{heading}

{subheading}
@@ -24,10 +31,15 @@ img { width: 160px; - image-rendering: pixelated; + aspect-ratio: 1; + object-fit: cover; border: 1px solid color-mix(in srgb, var(--foreground) 25%, transparent); } + img.pixelated { + image-rendering: pixelated; + } + .details { flex: 1; min-width: 240px; diff --git a/src/routes/portfolio/+page.server.ts b/src/routes/portfolio/+page.server.ts new file mode 100644 index 0000000..5a2af67 --- /dev/null +++ b/src/routes/portfolio/+page.server.ts @@ -0,0 +1,10 @@ +import { findProjectCategory } from '#lib/content'; +import { getRepoStats } from '#lib/server/github'; +import type { PageServerLoad } from './$types'; + +export const load: PageServerLoad = async () => { + const openSourceProjects = findProjectCategory('opensource')?.projects ?? []; + const codeUrls = openSourceProjects.flatMap((project) => (project.links.code ? [project.links.code] : [])); + + return { repoStats: await getRepoStats(codeUrls) }; +}; diff --git a/src/routes/portfolio/+page.svelte b/src/routes/portfolio/+page.svelte index 73327c0..39f8276 100644 --- a/src/routes/portfolio/+page.svelte +++ b/src/routes/portfolio/+page.svelte @@ -1,14 +1,27 @@
- + - +
@@ -89,17 +102,38 @@
{#each openSourceProjects as project (project.name)}
- > {project.name} - {#if project.version}v{project.version}{/if} - - {project.description} +
+ > {project.name} + {#if project.version}v{project.version}{/if} + {#if project.period}{project.period}{/if} + {#if project.links.code && data.repoStats[project.links.code]} + {@const stats = data.repoStats[project.links.code]} + + {stats.stars} + + + {stats.forks} + + {/if} +
+

{project.description}

{#each project.tags as tag, index (tag)} {/each}
+
+ {#each projectLinks(project.links) as projectLink (projectLink.url)} + {projectLink.label} + {/each} + More info +
{/each} - All projects +
+ Open source projects + All projects +
@@ -206,6 +240,41 @@ margin-top: 0.35rem; } + .project-heading { + display: flex; + flex-wrap: wrap; + align-items: baseline; + } + + .project-period { + margin-left: 0.75rem; + font-size: 0.85rem; + } + + .repo-stat { + display: inline-flex; + align-items: center; + gap: 0.2rem; + margin-left: 0.75rem; + font-size: 0.85rem; + } + + .repo-stat.stars { + color: var(--yellow); + } + + .repo-stat.forks { + color: var(--cyan); + } + + .repo-stat:hover { + text-decoration: underline; + } + + .project-description { + margin: 0.25rem 0 0; + } + .leadership { margin: 0; padding-left: 1.25rem; diff --git a/static/portfolio-photo.jpg b/static/portfolio-photo.jpg new file mode 100644 index 0000000..f389c11 Binary files /dev/null and b/static/portfolio-photo.jpg differ