A modern, fully responsive React portfolio website that dynamically loads all content from a JSON file and generates professional PDF CVs on demand.
- 🎨 Modern Design - Dark theme with glassmorphism effects and smooth animations
- 📱 Fully Responsive - Works seamlessly on desktop, tablet, and mobile
- 📄 PDF CV Generation - Download professional CV with one click (client-side)
- 🔄 Dynamic Content - All content loaded from a single JSON file
- ⚡ Fast Performance - Built with Vite for lightning-fast development and builds
- 🎯 Component-Based - Modular React components for easy customization
- 🌈 Beautiful Animations - Hover effects, floating shapes, and gradient accents
- Node.js (v14 or higher)
- npm or yarn
# Clone or navigate to the project directory
cd portfolio-website
# Install dependencies
npm install
# Start development server
npm run devThe site will be available at http://localhost:5173/
npm run buildThe optimized build will be in the dist/ folder.
portfolio-website/
├── public/
│ └── data/
│ └── portfolio.json # 🎯 Edit this file with your data!
├── src/
│ ├── components/ # React components
│ │ ├── Navigation.jsx
│ │ ├── Hero.jsx
│ │ ├── About.jsx
│ │ ├── Experience.jsx
│ │ ├── Projects.jsx
│ │ ├── Skills.jsx
│ │ ├── Education.jsx
│ │ └── Contact.jsx
│ ├── services/
│ │ └── pdfGenerator.js # PDF CV generation logic
│ ├── App.jsx # Main application
│ ├── App.css # Complete styling
│ └── main.jsx # Entry point
└── package.json
Edit public/data/portfolio.json with your personal information:
{
"personal": {
"name": "Your Name",
"title": "Your Professional Title",
"email": "your.email@example.com",
"phone": "+1 (555) 123-4567",
"location": "Your City, State",
"bio": "Your professional bio...",
"image": "URL to your profile image"
},
"social": [
{ "platform": "GitHub", "url": "https://github.com/yourusername", "icon": "github" },
{ "platform": "LinkedIn", "url": "https://linkedin.com/in/yourusername", "icon": "linkedin" }
],
"experience": [...],
"skills": {...},
"projects": [...],
"education": [...],
"certifications": [...]
}Edit CSS variables in src/App.css:
:root {
--primary: #6366f1; /* Primary color (Indigo) */
--secondary: #ec4899; /* Secondary color (Pink) */
--accent: #14b8a6; /* Accent color (Teal) */
}Components are modular. Simply comment out sections in src/App.jsx you don't need.
- Hero - Name, title, bio, and social links
- About - Professional summary
- Experience - Work history with timeline
- Projects - Featured projects with links
- Skills - Technical and soft skills
- Education - Degrees and certifications
- Contact - Contact information with CV download
The CV is generated entirely on the client-side using jsPDF:
- Professional formatting with sections
- Includes all your data from JSON
- Downloads as
[Your_Name]_CV.pdf - Click "Download CV" button in navigation or contact section
- React 18 - UI framework
- Vite - Build tool
- jsPDF - PDF generation
- jsPDF-AutoTable - Table formatting for PDF
- Modern CSS - Glassmorphism, gradients, animations
This is a static site that can be deployed to:
- Vercel:
vercel deploy - Netlify: Drag and drop the
distfolder - GitHub Pages: Use
gh-pagesbranch - Any static hosting service
The portfolio.json file contains all your portfolio data:
personal- Name, title, contact info, bio, imagesocial- Social media linksexperience- Work history with responsibilitiesskills- Technical and soft skillsprojects- Featured projects with technologies and linkseducation- Degrees and institutionscertifications- Professional certifications
See the example file for the complete structure.
The app fetches portfolio.json on mount and populates all sections:
fetch('/data/portfolio.json')
.then(response => response.json())
.then(data => setPortfolioData(data));Click the "Download CV" button to trigger pdfGenerator.js:
import { generateCV } from './services/pdfGenerator';
// In component
<button onClick={() => generateCV(portfolioData)}>
Download CV
</button>The PDF includes:
- Header with name and contact
- Professional summary
- Experience with details
- Education and certifications
- Skills sections
Feel free to fork this project and customize it for your own use!
This project is open source and available for personal and commercial use.
Built with modern web technologies and best practices for portfolio websites.
Made with ❤️ using React + Vite