A modern, responsive, and highly maintainable personal portfolio website built with React and Tailwind CSS, following SOLID principles for scalability and flexibility.
This portfolio showcases a professional web developer's work, skills, and experience through a beautifully designed interface with smooth animations, responsive layouts, and an intuitive user experience.
- Responsive Design: Fully responsive across all devices (mobile, tablet, desktop)
- Dark Mode: Built-in dark mode toggle with persistent theme preference
- Smooth Animations: Tailwind CSS animations for enhanced user experience
- Dynamic Components: Reusable components following React best practices
- SOLID Principles: Code architecture designed for maintainability and scalability
- Accessible: ARIA labels and semantic HTML for better accessibility
- SEO Optimized: Meta tags and semantic structure for search engines
Each component has one clear, focused responsibility:
Hero- Displays the hero section onlySkillList- Manages and displays skillsProjectCard- Renders individual project cardsButton- Renders styled buttonsNavigation- Handles navigation logic
Components are open for extension but closed for modification:
- New skills can be added by updating the data array
- New projects can be added without changing component logic
- Styling variants can be extended without modifying core components
The Card component can be used anywhere a card is needed:
- SkillCard extends Card functionality
- ProjectCard extends Card functionality
- All maintain consistent behavior
Components only depend on props they actually use:
ProjectCardoptionally acceptsshowTagsandshowLinksSkillCardonly requires skill-related props- No component is forced to accept unnecessary props
Components depend on abstractions, not concrete implementations:
- Data fetching uses abstract functions (
getSkills(),getProjects()) - Easy to swap data sources (local β API β database)
- Components don't know where data comes from
portfolio/
βββ src/
β βββ components/ # Reusable UI components
β β βββ Button.jsx
β β βββ Card.jsx
β β βββ Hero.jsx
β β βββ Navigation.jsx
β β βββ Footer.jsx
β β βββ SkillCard.jsx
β β βββ SkillList.jsx
β β βββ ProjectCard.jsx
β β βββ ProjectList.jsx
β βββ pages/ # Page components
β β βββ Home.jsx
β β βββ About.jsx
β β βββ Projects.jsx
β β βββ Contact.jsx
β βββ data/ # Data abstraction layer
β β βββ skills.js
β β βββ projects.js
β β βββ personal.js
β βββ App.jsx # Main app component with routing
β βββ main.jsx # Entry point
β βββ index.css # Global styles
βββ index.html
βββ package.json
βββ vite.config.js
βββ tailwind.config.js
βββ postcss.config.js
- Node.js (v16 or higher)
- npm or yarn
- Clone the repository:
git clone https://github.com/yourusername/portfolio.git
cd portfolio- Install dependencies:
npm install- Start the development server:
npm run dev- Open your browser and navigate to
http://localhost:5173
npm run buildThe optimized production build will be in the dist folder.
npm run previewUpdate your personal information in src/data/personal.js:
- Name, tagline, description
- Contact information
- Social media links
- Work experience
- Education
Add or modify skills in src/data/skills.js:
{
id: 9,
name: 'Your Skill',
category: 'Category',
level: 85,
icon: 'π―'
}Add your projects in src/data/projects.js:
{
id: 7,
title: 'Project Name',
description: 'Project description',
image: 'image-url',
tags: ['React', 'Node.js'],
github: 'github-url',
live: 'live-demo-url',
featured: true
}Customize colors in tailwind.config.js:
colors: {
primary: {
500: '#f58720', // Main brand color
600: '#c46c1a',
// ...
}
}Update fonts in tailwind.config.js and src/index.css:
fontFamily: {
display: ['Your Display Font', 'serif'],
body: ['Your Body Font', 'sans-serif'],
}- Hero section with introduction
- Skills showcase
- Featured projects
- Call-to-action buttons
- Personal biography
- Work experience timeline
- Education information
- Technology stack
- All projects grid
- Tag-based filtering
- Project details with links
- Contact information
- Working contact form with validation
- Social media links
- Frontend: React 18.2
- Styling: Tailwind CSS 3.3
- Routing: React Router DOM 6.20
- Build Tool: Vite 5.0
- Language: JavaScript (ES6+)
- Automatic detection of system preference
- Manual toggle with persistent storage
- Smooth transitions between themes
- Fade-in animations on page load
- Slide-up animations for content
- Hover effects on interactive elements
- Staggered animations for lists
- Real-time validation feedback
- Error messages for invalid inputs
- Accessible form labels and ARIA attributes
- Success/error states after submission
- Mobile-first approach
- Breakpoints for tablet and desktop
- Hamburger menu for mobile navigation
- Optimized images for different screen sizes
- Push your code to GitHub
- Import project in Vercel
- Deploy with one click
- Connect your GitHub repository
- Set build command:
npm run build - Set publish directory:
dist - Deploy
npm run build
# Deploy the dist folder to gh-pages branch- Add blog posts in
src/data/blog.js - Create BlogPost component
- Add blog route and page
// Add to index.html
<script async src="https://www.googletagmanager.com/gtag/js?id=GA_MEASUREMENT_ID"></script>- Use React Helmet for dynamic meta tags
- Add structured data (JSON-LD)
- Generate sitemap.xml
- Lazy loading for images
- Code splitting for routes
- Optimize bundle size
Contributions are welcome! Please feel free to submit a Pull Request.
This project is open source and available under the MIT License.
Jerico P. Jacob
- Email: xiaoliners@gmail.com
- Location: Philippines
- GitHub: @jericojacob
- Tailwind CSS for the utility-first CSS framework
- React team for the amazing library
- Unsplash for placeholder images
- Google Fonts for typography
Built with β€οΈ using React and Tailwind CSS "# MyPortfolio"