Sam Pursuits
A personal pursuits portfolio — a React showcase of interests, projects, and the work outside the day job.
An interactive single-page application that presents personal pursuits — gardening, electronics, tinkering, and life projects — as a curated, editorial experience. Built to demonstrate front-end architecture, component design, and modern React patterns.
What it is
A portfolio site that showcases what I build and explore beyond professional work. Each pursuit gets a dedicated page with rich content blocks, stats, and links, presented in a clean, motion-rich interface.
Tech stack
| Layer | Technology |
|---|---|
| Framework | React 19 |
| Build | Vite 6 |
| Styling | Tailwind CSS 4 (via @tailwindcss/vite) |
| Animation | Motion 12 (framer-motion successor) |
| Routing | React Router 7 |
| Icons | lucide-react |
| Language | TypeScript |
Architecture & design patterns
- Component-driven design — small, focused components (
PursuitCard,PursuitHero,SectionCard,StatBadge,ExternalLinkCard) composed into pages - Data-driven content — all content lives in typed data modules (
pursuitsData.ts,navItems.ts), so adding a pursuit is pure data entry, no new components - Reusable layout shell — shared
Layout+PageHeaderprovide consistent page chrome - Reusable content blocks —
ContentBlocksrenders heterogeneous content (prose, stats, media, links) from structured data - Horizontal tabs —
HorizontalTabsfor sub-navigation within a page - AI chat box — embedded assistant interface (
AiChatBox) for interactive engagement - Fade/slide animation patterns — motion variants (
hidden→showwith staggered children) for consistent page transitions - Route-based pages — React Router for multi-page feel within an SPA
Pages
| Route | Purpose |
|---|---|
/ |
Home — hero + pursuit index |
/interests |
Interest areas overview |
/pursuits/:id |
Individual pursuit deep-dive |
/ai-chat |
Interactive AI assistant |
/contact |
Contact + links |
Standards
- TypeScript strict mode
- Semantic HTML with accessible landmarks
- Tailwind utility-first styling with design tokens
- Fully responsive (mobile → desktop)
- Performance-minded (Vite code-splitting, no heavy dependencies)
Getting started
npm install
npm run dev # development server
npm run build # production build
npm run preview # preview production build
Structure
src/
├── components/ # Reusable UI components
│ ├── Layout.tsx / PageHeader.tsx / SectionCard.tsx
│ ├── PursuitCard.tsx / PursuitHero.tsx / StatBadge.tsx
│ ├── ContentBlocks.tsx / HorizontalTabs.tsx / ExternalLinkCard.tsx
│ └── AiChatBox.tsx
├── data/ # Typed content (pursuitsData.ts, navItems.ts)
├── pages/ # Route components (Home, Interests, PursuitPage, AiChat, Contact)
├── App.tsx # Router + app shell
└── main.tsx # Entry point
One of several portfolio sites in the Sam Rolfe showcase family — see sam-developer, sam-devops, and sam-iot-electronics.
Description
Languages
TypeScript
96.4%
CSS
3.3%
HTML
0.3%