Build portfolio site with Next.js, Tailwind CSS, and dark mode

- Add CLAUDE.md with project conventions and architecture notes
- Create Navbar (sticky, backdrop blur, mobile menu) and Footer
- Build homepage sections: Hero, FeaturedProjects, Skills, CurrentWork, CallToAction
- Add /projects, /about, and /contact pages
- Create reusable ProjectCard and Badge components
- Centralise project data in content/projects.json with featured flag
- Add class-based dark mode toggle (default dark, persisted to localStorage)
- Refactor globals.css: remove conflicting prefers-color-scheme media query
- Fix two-instance ThemeToggle sync bug in Navbar
- Fix key={index} anti-pattern in timeline, stale closure in setOpen

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-26 22:02:30 +01:00
parent 4fa9f280e6
commit 6b698c5f58
18 changed files with 628 additions and 82 deletions
+45
View File
@@ -0,0 +1,45 @@
import Link from 'next/link'
export default function Hero() {
return (
<section className="mx-auto flex min-h-[72vh] max-w-5xl flex-col items-center justify-center px-6 py-32 text-center">
{/* Eyebrow label */}
<div className="mb-10 flex items-center gap-4">
<span className="h-px w-10 bg-zinc-300 dark:bg-zinc-700" />
<span className="font-mono text-xs uppercase tracking-[0.2em] text-zinc-500">
Software Engineer
</span>
<span className="h-px w-10 bg-zinc-300 dark:bg-zinc-700" />
</div>
{/* Name */}
<h1 className="text-7xl font-bold tracking-tight text-zinc-900 dark:text-white sm:text-8xl">
Jonathan
</h1>
{/* Tagline */}
<p className="mt-6 max-w-md text-base leading-7 text-zinc-600 dark:text-zinc-400">
I build clean, fast web applications focused on great user
experiences and solid engineering.
</p>
{/* Actions */}
<div className="mt-12 flex flex-wrap items-center justify-center gap-4">
<Link
href="/projects"
className="rounded-sm bg-zinc-900 px-8 py-3 text-sm font-semibold text-white transition-colors hover:bg-zinc-700 dark:bg-white dark:text-zinc-950 dark:hover:bg-zinc-200"
>
View Projects
</Link>
<Link
href="/contact"
className="rounded-sm border border-zinc-300 px-8 py-3 text-sm font-medium text-zinc-700 transition-colors hover:border-zinc-400 hover:bg-zinc-100 hover:text-zinc-900 dark:border-zinc-700 dark:text-zinc-300 dark:hover:border-zinc-600 dark:hover:bg-zinc-900 dark:hover:text-white"
>
Contact Me
</Link>
</div>
</section>
)
}