From 5ca31ca2c026dedbfc67e413bab199e34d6a121e Mon Sep 17 00:00:00 2001 From: Daniel Smith Date: Tue, 12 May 2026 10:12:30 -0700 Subject: [PATCH] feat(personal-site): resume-aligned projects with GitHub, npm, and live icons - Extend featuredRepos and featuredProjects with optional github, npm, and live URLs - Add ProjectOutboundLinks with GitHub, npm, and globe icons - Update /projects layout copy; home featured grid and intro text --- personal-site/src/app/page.tsx | 27 ++-- personal-site/src/app/projects/page.tsx | 36 ++--- .../src/components/ProjectOutboundLinks.tsx | 72 ++++++++++ personal-site/src/components/SocialIcons.tsx | 30 +++++ personal-site/src/lib/site.ts | 126 +++++++++++++----- 5 files changed, 217 insertions(+), 74 deletions(-) create mode 100644 personal-site/src/components/ProjectOutboundLinks.tsx diff --git a/personal-site/src/app/page.tsx b/personal-site/src/app/page.tsx index 022fe1d..baa3c5e 100644 --- a/personal-site/src/app/page.tsx +++ b/personal-site/src/app/page.tsx @@ -2,6 +2,7 @@ import Link from 'next/link' import { Button } from '@/components/Button' import { Card } from '@/components/Card' import { Container } from '@/components/Container' +import { ProjectOutboundLinks } from '@/components/ProjectOutboundLinks' import { GitHubIcon, LinkedInIcon, @@ -120,21 +121,14 @@ function FeaturedProjectCard({ project }: { project: FeaturedProject }) { return ( Project - {project.name} + {project.name} {project.description} -
-

{project.label}

- {project.extraLink ? ( - - {project.extraLink.label} - - ) : null} -
+
) } @@ -330,10 +324,11 @@ export default async function Home() { Featured projects

- ClawQL, CoachellaPlus, and gRPC MCP Transport. + MCP stack, libraries, gateways, and product PWAs — use the icons for + GitHub, npm, or the live site when each exists.

-
+
{featuredProjects.map((project) => ( ))} diff --git a/personal-site/src/app/projects/page.tsx b/personal-site/src/app/projects/page.tsx index bb7d041..5a183c3 100644 --- a/personal-site/src/app/projects/page.tsx +++ b/personal-site/src/app/projects/page.tsx @@ -1,21 +1,10 @@ import { type Metadata } from 'next' import { Card } from '@/components/Card' +import { ProjectOutboundLinks } from '@/components/ProjectOutboundLinks' import { SimpleLayout } from '@/components/SimpleLayout' -import { GitHubIcon } from '@/components/SocialIcons' import { featuredRepos } from '@/lib/site' -function LinkIcon(props: React.ComponentPropsWithoutRef<'svg'>) { - return ( - - ) -} - export const metadata: Metadata = { title: 'Projects', description: @@ -25,8 +14,8 @@ export const metadata: Metadata = { export default function Projects() { return (
    {featuredRepos.map((project) => ( -
    - -
    {project.highlight ? ( -

    +

    AI / agents

    ) : null} -

    - {project.name} +

    + {project.name}

    {project.description} -

    - - {project.label} -

    +
    ))}
diff --git a/personal-site/src/components/ProjectOutboundLinks.tsx b/personal-site/src/components/ProjectOutboundLinks.tsx new file mode 100644 index 0000000..61abda3 --- /dev/null +++ b/personal-site/src/components/ProjectOutboundLinks.tsx @@ -0,0 +1,72 @@ +import Link from 'next/link' +import clsx from 'clsx' + +import { GitHubIcon, GlobeIcon, NpmIcon } from '@/components/SocialIcons' + +export type ProjectOutbound = { + github: string | null + npm: string | null + live: string | null +} + +const base = + 'relative z-10 flex h-10 w-10 items-center justify-center rounded-full border border-zinc-200/80 bg-white shadow-sm transition dark:border-zinc-600 dark:bg-zinc-800' + +const hoverTeal = + 'hover:border-teal-500/50 hover:text-teal-600 dark:hover:border-teal-500/50 dark:hover:text-teal-400' + +/** + * Up to three outbound links (GitHub, npm, live site) with icons — only renders anchors that are set. + */ +export function ProjectOutboundLinks({ + github, + npm, + live, + className, +}: ProjectOutbound & { className?: string }) { + return ( +
+ {github ? ( + + + + ) : null} + {npm ? ( + + + + ) : null} + {live ? ( + + + + ) : null} +
+ ) +} diff --git a/personal-site/src/components/SocialIcons.tsx b/personal-site/src/components/SocialIcons.tsx index 251913d..ff6d0c4 100644 --- a/personal-site/src/components/SocialIcons.tsx +++ b/personal-site/src/components/SocialIcons.tsx @@ -27,6 +27,36 @@ export function GitHubIcon(props: React.ComponentPropsWithoutRef<'svg'>) { ) } +/** npm registry mark (simplified logo) */ +export function NpmIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} + +/** Live site / docs (globe) */ +export function GlobeIcon(props: React.ComponentPropsWithoutRef<'svg'>) { + return ( + + ) +} + export function LinkedInIcon(props: React.ComponentPropsWithoutRef<'svg'>) { return (