Dynamic portfolio scaffold with data-driven sections and blog-ready routing.
npm install
npm run devBuild for production:
npm run build
npm run previewUpdate your profile and portfolio content in one place:
src/content/siteContent.ts
Add, edit, or remove projects without touching page components:
src/content/projects.json
Add, edit, or remove blog posts without touching page components:
src/content/blogPosts.json
All pages render from this data layer:
- Home:
src/pages/HomePage.tsx - About:
src/pages/AboutPage.tsx - Contact:
src/pages/ContactPage.tsx - Projects index:
src/pages/ProjectsPage.tsx - Project detail:
src/pages/ProjectDetailPage.tsx - Blog index:
src/pages/BlogPage.tsx - Blog detail:
src/pages/BlogPostPage.tsx
- Open
src/content/projects.json. - Add a project object with:
slugtitledescriptioncategoryyearoutcomefeatured(optional; settrueto show on home)stackliveUrlrepoUrl
- Save and refresh.
The project appears automatically on:
/projects(full, filterable list)/projects/:slug(detail page)- Home page if marked as
featured
- Open
src/content/blogPosts.json. - Add a new object with:
slugtitleexcerptpublishedOn(YYYY-MM-DD)tags(string[])readMinutesbody(string[]paragraphs)
- Save and refresh the app.
The post appears automatically on:
/blog/blog/:slug- Home page featured list
Put your PDF at:
public/resume.pdf
The Resume button uses siteContent.resumeUrl.
- Routing is handled by React Router.
- Design uses CSS variables for easy theme changes.
- Structure is now JSON-backed and CMS-style for content scaling.
- Theme switch is persisted with local storage (
light/dark). - Route transitions use subtle motion with reduced-motion accessibility fallback.