A modern, responsive portfolio website showcasing design work through project experiences. Built with React, Tailwind CSS, and React Router.
- Sticky Sidebar Navigation - Left sidebar with smooth scroll navigation and active section indicators
- Design Projects Section - Medium-style project cards with clean, scannable layout
- Dark Mode Support - Toggle with persistent localStorage preference
- Responsive Design - Mobile-first approach that works on all devices
- Experience & Education - Professional background with clickable company links
- Clean Typography - Inter font with proper hierarchy and readability
- Single Source of Truth - All content managed in one data file for easy updates
- React - UI library
- React Router - Client-side routing
- Tailwind CSS - Utility-first styling
- Vite - Fast build tool
- Lucide React - Icon library
# Install dependencies
npm install
# Start development server
npm run dev
# Build for production
npm run build
# Preview production build
npm run previewAll content is centralized in src/data/portfolioData.js:
Edit the personal object with your name, title, bio, and contact links.
-
Add a new entry in
workExperiencesarray with:title- Project title for card displaydate- Date or date rangetype- Project type (e.g., "LinkedIn Article", "Product Design")company,role,dates,location- Experience detailsdescription- Brief description (shown on card and experience section)tags- Array of skills/technologiescompanyUrl- Link to company websitelink- Route to project detail page
-
Create corresponding project data in
projectsobject for detail pages -
Use section types:
hero,image,text,gallery,cta
Edit the education and certifications arrays with your credentials.
The portfolio uses Tailwind CSS with custom brand colors:
- Primary: Indigo (#6366f1) - Enterprise feel with energy
- Secondary: Purple (#8b5cf6) - Spark of creativity
- Accent: Amber (#f59e0b) - Call-to-action pop
- Dark Mode: Slate-900 background with navy palette
Typography: Inter font family for clean, modern look.
- Toggle button fixed in top-right corner
- Preference saved to localStorage
- All components optimized for both themes
- Card backgrounds:
bg-slate-800/50for proper contrast
- Mobile: < 768px (single column, stacked layout)
- Tablet: 768px - 1024px (two-column with adjusted widths)
- Desktop: > 1024px (full two-column with sticky sidebar)
- Push code to GitHub
- Import repo on vercel.com
- Deploy automatically
- Connect repo on netlify.com
- Build command:
npm run build - Publish directory:
dist
src/
├── components/
│ ├── Layout/
│ │ ├── ProjectCard.jsx # Medium-style project cards
│ │ ├── ProfileHeader.jsx # Name, title, bio
│ │ ├── Navigation.jsx # Sticky nav with scroll detection
│ │ ├── SocialLinks.jsx # Social media links
│ │ ├── WorkExperienceCards.jsx # Experience display
│ │ ├── EducationSection.jsx # Education & certifications
│ │ └── StickyResume.jsx # Sidebar container
│ ├── Projects/ # Project detail page components
│ └── shared/
│ └── DarkModeToggle.jsx # Theme toggle
├── data/
│ └── portfolioData.js # All content configuration
├── pages/
│ ├── Landing.jsx # Main page
│ ├── Project.jsx # Project detail page
│ └── NotFound.jsx # 404 page
└── App.jsx # Main app with routing
- ✅ Dark mode with localStorage persistence
- ✅ Smooth scroll navigation with active indicators
- ✅ Medium-style project cards (scannable, low cognitive load)
- ✅ Responsive two-column layout with sticky sidebar
- ✅ Clickable external company links
- ✅ Accessible (proper ARIA labels, keyboard navigation)
- ✅ Fast loading with Vite
- ✅ Smooth animations and hover effects
- ✅ Custom scrollbar styling
- ✅ 404 page for invalid routes
- Design Projects - 4 projects with images, titles, and descriptions
- Experience - Professional work history with companies, roles, and achievements
- Education - Degrees and certifications
- Sidebar: 420px width with sticky positioning
- Vertical Divider: Subtle border between sections
- Content Width: Max 7xl (1280px) centered container
- Spacing: Generous padding for readability (pr-20 on sidebar, pl-8 on content)
MIT License - feel free to use this template for your own portfolio!
Built with ❤️ by Philip Cheung