Skip to content

Repository files navigation

React Portfolio with Tailwind CSS

A modern, responsive, and highly maintainable personal portfolio website built with React and Tailwind CSS, following SOLID principles for scalability and flexibility.

🎯 Project Overview

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.

Key Features

  • 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

πŸ—οΈ Architecture & SOLID Principles

Single Responsibility Principle (SRP)

Each component has one clear, focused responsibility:

  • Hero - Displays the hero section only
  • SkillList - Manages and displays skills
  • ProjectCard - Renders individual project cards
  • Button - Renders styled buttons
  • Navigation - Handles navigation logic

Open/Closed Principle (OCP)

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

Liskov Substitution Principle (LSP)

The Card component can be used anywhere a card is needed:

  • SkillCard extends Card functionality
  • ProjectCard extends Card functionality
  • All maintain consistent behavior

Interface Segregation Principle (ISP)

Components only depend on props they actually use:

  • ProjectCard optionally accepts showTags and showLinks
  • SkillCard only requires skill-related props
  • No component is forced to accept unnecessary props

Dependency Inversion Principle (DIP)

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

πŸ“ Project Structure

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

πŸš€ Getting Started

Prerequisites

  • Node.js (v16 or higher)
  • npm or yarn

Installation

  1. Clone the repository:
git clone https://github.com/yourusername/portfolio.git
cd portfolio
  1. Install dependencies:
npm install
  1. Start the development server:
npm run dev
  1. Open your browser and navigate to http://localhost:5173

Building for Production

npm run build

The optimized production build will be in the dist folder.

Preview Production Build

npm run preview

🎨 Customization

Personal Information

Update your personal information in src/data/personal.js:

  • Name, tagline, description
  • Contact information
  • Social media links
  • Work experience
  • Education

Skills

Add or modify skills in src/data/skills.js:

{
  id: 9,
  name: 'Your Skill',
  category: 'Category',
  level: 85,
  icon: '🎯'
}

Projects

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
}

Theme Colors

Customize colors in tailwind.config.js:

colors: {
  primary: {
    500: '#f58720',  // Main brand color
    600: '#c46c1a',
    // ...
  }
}

Fonts

Update fonts in tailwind.config.js and src/index.css:

fontFamily: {
  display: ['Your Display Font', 'serif'],
  body: ['Your Body Font', 'sans-serif'],
}

πŸ“„ Pages

Home (/)

  • Hero section with introduction
  • Skills showcase
  • Featured projects
  • Call-to-action buttons

About (/about)

  • Personal biography
  • Work experience timeline
  • Education information
  • Technology stack

Projects (/projects)

  • All projects grid
  • Tag-based filtering
  • Project details with links

Contact (/contact)

  • Contact information
  • Working contact form with validation
  • Social media links

πŸ› οΈ Tech Stack

  • Frontend: React 18.2
  • Styling: Tailwind CSS 3.3
  • Routing: React Router DOM 6.20
  • Build Tool: Vite 5.0
  • Language: JavaScript (ES6+)

✨ Features in Detail

Dark Mode

  • Automatic detection of system preference
  • Manual toggle with persistent storage
  • Smooth transitions between themes

Animations

  • Fade-in animations on page load
  • Slide-up animations for content
  • Hover effects on interactive elements
  • Staggered animations for lists

Form Validation

  • Real-time validation feedback
  • Error messages for invalid inputs
  • Accessible form labels and ARIA attributes
  • Success/error states after submission

Responsive Design

  • Mobile-first approach
  • Breakpoints for tablet and desktop
  • Hamburger menu for mobile navigation
  • Optimized images for different screen sizes

πŸš€ Deployment

Vercel (Recommended)

  1. Push your code to GitHub
  2. Import project in Vercel
  3. Deploy with one click

Netlify

  1. Connect your GitHub repository
  2. Set build command: npm run build
  3. Set publish directory: dist
  4. Deploy

GitHub Pages

npm run build
# Deploy the dist folder to gh-pages branch

πŸ“ Additional Features (Optional Enhancements)

Blog Integration

  • Add blog posts in src/data/blog.js
  • Create BlogPost component
  • Add blog route and page

Analytics

// Add to index.html
<script async src="https://www.googletagmanager.com/gtag/js?id=GA_MEASUREMENT_ID"></script>

SEO Optimization

  • Use React Helmet for dynamic meta tags
  • Add structured data (JSON-LD)
  • Generate sitemap.xml

Performance Optimization

  • Lazy loading for images
  • Code splitting for routes
  • Optimize bundle size

🀝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

πŸ“„ License

This project is open source and available under the MIT License.

πŸ‘€ Author

Jerico P. Jacob

πŸ™ Acknowledgments

  • 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"

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages