A modern, responsive personal portfolio built with React, Vite, and TailwindCSS.
Features dark/light mode, smooth animations, scroll spy navigation, and a contact form.
- Dark / Light Mode with persistent preference
- Typing Animation hero with dynamic titles
- Scroll Spy navbar with smooth scrolling
- Project Cards with tech stack tags and links
- Timeline Experience section
- Animated Skill Bars with categorized skills
- Contact Form via Formspree
- Fully Responsive mobile-first design
- SEO Optimized with meta tags and Open Graph
- Framer Motion scroll-triggered animations
- Node.js v18+
- npm or yarn
# Clone the repo
git clone https://github.com/YOUR_USERNAME/portfolio.git
cd portfolio
# Install dependencies
npm install
# Start dev server
npm run devThe app will open at http://localhost:3000
npm run build
npm run previewsrc/
├── components/
│ ├── Navbar.jsx # Navigation with scroll spy
│ ├── Hero.jsx # Hero section with typing effect
│ ├── About.jsx # About me & education
│ ├── Projects.jsx # Project cards grid
│ ├── Experience.jsx # Work timeline
│ ├── Skills.jsx # Categorized skills
│ ├── Contact.jsx # Contact form (Formspree)
│ ├── Footer.jsx # Footer with links
│ └── ScrollToTop.jsx # Scroll-to-top button
├── context/
│ └── DarkModeContext.jsx
├── data/
│ └── portfolioData.js # ← All your CV data here
├── hooks/
│ └── useSectionInView.js
├── utils/
│ └── scrollUtils.js
├── App.jsx
├── main.jsx
└── index.css
All personal data is in src/data/portfolioData.js.
Edit this single file to update your:
- Name, title, socials
- About / bio text
- Education
- Work experience
- Projects
- Skills & levels
- Formspree form ID
- Go to formspree.io and create a free account
- Create a new form and copy the form ID (e.g.,
xrbgnkwd) - Update
contactData.formspreeIdinsrc/data/portfolioData.js
- Push your code to GitHub
- Go to vercel.com and sign in with GitHub
- Click "New Project" → Import your repository
- Framework Preset: Vite
- Click Deploy — done!
- Push your code to GitHub
- Go to netlify.com and sign in with GitHub
- Click "Add new site" → "Import from Git"
- Select your repo
- Build command:
npm run build - Publish directory:
dist - Click Deploy
npm run build
# Deploy the dist/ folder to gh-pages branch
npx gh-pages -d dist| Technology | Purpose |
|---|---|
| React 18 | UI library |
| Vite 6 | Build tool |
| TailwindCSS 3 | Styling |
| Framer Motion | Animations |
| React Icons | Icon library |
| Formspree | Contact form backend |
MIT © Rijad Halili