Modern React + TypeScript portfolio powered by Vite, Tailwind CSS, and Framer Motion.
- React 19, TypeScript 6, Vite 8
- Tailwind CSS 4, PostCSS, Styled Components
- Framer Motion (animations), Lucide Icons
- Chart.js + react-chartjs-2 (lazy-loaded Bar)
- Vitest + Testing Library (unit tests)
Prerequisites: Node 24+, Yarn 4 (via Corepack).
Install deps
yarn installDev server
yarn devBuild
yarn buildPreview
yarn previewdev: start Vite dev serverbuild: build for productionpreview: preview production buildlint/lint:fix: run/fix ESLinttypecheck: check TypeScript typesformat/format:check: format/check code with Prettiertest: run tests oncetest:watch: run tests in watch modetest:coverage: generate coverage reporttest:ui: run tests with UI dashboardclean: remove dist/ directoryverify: lint, typecheck, and testfix: lint:fix and formatdocker:dev: run dev with Docker (5173, HMR 24678)docker:prod: run production build with nginx (8082)docker:down: stop Docker containershealth/health:full: health checks and audithealth:report: generate health reportdeps:check/deps:audit: check/audit dependenciesdeploy: build and deploy to GitHub Pagesci: CI workflow (install, verify, build)
- Dockerfile has multi-stage targets: dev (Vite), build, prod (nginx)
- docker-compose.yml defines:
- web: bind-mount dev with hot reload on http://localhost:5173
- web-prod: serves built assets via nginx on http://localhost:8082
- .dockerignore is configured to keep the build context small
Common
yarn docker:dev # dev with HMR
yarn docker:prod # serve built site on :8082- Vitest + @testing-library/react
- Framer Motion is mocked in test setup (src/test-setup.ts) for stable DOM
- Hooks are mocked per test with vi.mocked(...) patterns
Run
yarn test
yarn test:watch
yarn test:coverage
yarn test:ui- Public JSON data: public/data/profile.json, public/data/resume.json
- Hooks: src/hooks/useProfileData.ts, src/hooks/useResumeData.ts
- Key components: src/components/Portfolio.tsx, src/components/Resume.tsx
- Resume sections are collapsible (accessible), default-expanded
GA4 is loaded in index.html and initialized in public/analytics.js
Deployment is handled by the deploy script and the production branch workflow:
yarn deployThis will:
- Build your project
- Replace the
productionbranch contents with your builtdistassets - Commit and push to
production - Trigger GitHub Actions deployment recording for
production
src/
components/
Portfolio.tsx
Resume.tsx
hooks/
useProfileData.ts
useResumeData.ts
__tests__/
public/
data/
profile.json
resume.json
Created by Zach Schneider