diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..8510ff0 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,30 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Commands + +```bash +npm run dev # Start dev server at http://localhost:3000 +npm run build # Production build +npm run lint # ESLint +``` + +No test suite is configured. + +## Architecture + +Personal portfolio website for Janpeter Visser, built with **Next.js 15 App Router**, **TypeScript**, and **Tailwind CSS**. Deployed on Vercel at `jp-visser.nl`. + +### Data flow + +All CV content lives in a single source of truth: `lib/cv-data.ts` (`CV_DATA` const). Components import directly from there — no API calls, no state management. + +### Page structure + +`app/page.tsx` composes the single-page layout by stacking section components in order: `Nav → Hero → ExperienceSection → SkillsSection → AppsSection → ContactSection → Footer`. + +### Adding apps to the portfolio + +- **Subdomain approach**: deploy separately on Vercel and add a subdomain (e.g. `app1.jp-visser.nl`) +- **Route approach**: create `app/apps//page.tsx`, then update `components/apps.tsx` to link to it diff --git a/app/favicon.ico b/app/favicon.ico new file mode 100644 index 0000000..01beb88 Binary files /dev/null and b/app/favicon.ico differ diff --git a/components/apps.tsx b/components/apps.tsx index a85dcfc..b469056 100644 --- a/components/apps.tsx +++ b/components/apps.tsx @@ -1,11 +1,20 @@ +import Image from "next/image"; import { FadeIn } from "./fade-in"; -const PLACEHOLDER_APPS = [ - { icon: "⚡", label: "App 1 — binnenkort" }, - { icon: "🔧", label: "App 2 — binnenkort" }, - { icon: "📱", label: "App 3 — binnenkort" }, +const APPS = [ + { + title: "Inspannings Monitor", + subtitle: "Wellness-first dagflow", + description: + "Een lichte app die helpt doseren en inzicht geeft zonder lange formulieren of overprikkeling.", + screenshot: "/images/app-inspannings-monitor.png", + screenshotMobile: "/images/app-inspannings-monitor-mobile.png", + href: "https://inspannings-monitor.jp-visser.nl/dashboard", + }, ]; +const PLACEHOLDER_APPS = [{ label: "App 2 — binnenkort" }]; + export function AppsSection() { return (
-
- {PLACEHOLDER_APPS.map((app, i) => ( +
+ {APPS.map((app, i) => ( + + {/* Screenshots */} +
+ {/* Desktop screenshot */} + {app.title} + {/* Mobile screenshot overlay */} + {app.screenshotMobile && ( +
+ {`${app.title} +
+ )} +
+ + {/* Info */} +
+

+ {app.subtitle} +

+

+ {app.title} +

+

+ {app.description} +

+
+
+
+ ))} + + {PLACEHOLDER_APPS.map((app, i) => ( +
-
- {app.icon} -

Bekijk CV + + Apps +

diff --git a/public/images/app-inspannings-monitor-mobile.png b/public/images/app-inspannings-monitor-mobile.png new file mode 100644 index 0000000..af0723b Binary files /dev/null and b/public/images/app-inspannings-monitor-mobile.png differ diff --git a/public/images/app-inspannings-monitor.png b/public/images/app-inspannings-monitor.png new file mode 100644 index 0000000..d042c95 Binary files /dev/null and b/public/images/app-inspannings-monitor.png differ