Modern and professional web portfolio built with React + Vite, designed to reflect contemporary technical authority and senior software development experience.
- β¨ Modern Design 2024-2025: Glassmorphism, dark/light mode, micro-interactions
- π Multilingual (i18n): Full support for Spanish and English
- π¨ Theme System: Real-time switchable dark/light mode
- π± Responsive Design: Optimized for all devices
- β‘ Performance: Optimized build with Vite
- π― SEO Friendly: Meta tags and semantic structure
- βΏ Accessibility: ARIA labels and keyboard navigation
| Technology | Version | Purpose |
|---|---|---|
| React | 18.2.0 | UI Framework |
| Vite | 5.0.8 | Build tool and dev server |
| CSS Modules | - | Locally scoped styles |
| Context API | - | Global state (theme/language) |
/
βββ public/
β βββ assets/ # Images, icons
β βββ favicon.svg # Site favicon
β
βββ src/
β βββ components/
β β βββ common/ # Reusable components
β β β βββ Button.jsx
β β β βββ Card.jsx
β β β βββ SectionTitle.jsx
β β β βββ ThemeToggle.jsx
β β β βββ LanguageToggle.jsx
β β β
β β βββ layout/ # Layout components
β β β βββ Header.jsx
β β β βββ Footer.jsx
β β β βββ Layout.jsx
β β β
β β βββ sections/ # Page sections
β β βββ Hero.jsx
β β βββ About.jsx
β β βββ TechStack.jsx
β β βββ Services.jsx
β β βββ Portfolio.jsx
β β βββ Contact.jsx
β β
β βββ contexts/
β β βββ ThemeContext.jsx # Dark/light theme management
β β βββ LanguageContext.jsx # ES/EN language management
β β
β βββ locales/
β β βββ es.json # Spanish translations
β β βββ en.json # English translations
β β
β βββ styles/
β β βββ variables.css # CSS variables (colors, typography)
β β βββ global.css # Global styles and reset
β β
β βββ hooks/
β β βββ useIntersectionObserver.js # Animation hook
β β
β βββ App.jsx # Main component
β βββ main.jsx # Entry point
β
βββ index.html
βββ package.json
βββ vite.config.js
βββ README.md
- Separation of concerns: UI, logic, data, and styles clearly separated
- Scalability: Easy to add new sections or components
- Maintainability: Centralized localization, modular components
- Reusability: Common components shared throughout the app
- Node.js 16+
- npm or yarn
# Clone the repository
git clone https://github.com/luisfben/luisfben.github.io.git
cd luisfben.github.io
# Install dependencies
npm install# Start development server
npm run dev
# The application will be available at http://localhost:5173# Generate optimized build
npm run build
# Preview the build
npm run previewThe i18n system uses React Context API + JSON files to handle translations:
- Translation files:
src/locales/es.jsonandsrc/locales/en.json - Context Provider:
LanguageContextdynamically loads translations - Custom hook:
useLanguage()providest()function for translating
Edit the JSON files in src/locales/:
// src/locales/es.json
{
"nav": {
"about": "Sobre mΓ",
"services": "Servicios"
},
"hero": {
"title": "Arquitecto de Software"
}
}import { useLanguage } from '../../contexts/LanguageContext';
const MyComponent = () => {
const { t } = useLanguage();
return <h1>{t('hero.title')}</h1>;
};- Create file
src/locales/[code].json(e.g.,fr.json) - Copy structure from
es.jsonand translate - Add option in
LanguageToggle.jsx:
<button onClick={() => setLanguage('fr')}>FR</button>Themes are defined in src/styles/variables.css:
:root[data-theme="dark"] {
--bg: #0b0f1a;
--text: #e7eaf4;
--primary: #0ea5e9;
}
:root[data-theme="light"] {
--bg: #f7f8fb;
--text: #0b1220;
--primary: #0ea5e9;
}The theme is managed with ThemeContext:
import { useTheme } from '../../contexts/ThemeContext';
const MyComponent = () => {
const { theme, toggleTheme } = useTheme();
return <button onClick={toggleTheme}>Toggle Theme</button>;
};Edit the translations in src/locales/es.json and en.json:
{
"portfolio": {
"projects": {
"myProject": {
"title": "My Project",
"description": "Project description",
"role": "My role",
"impact": "Impact achieved"
}
}
}
}Then add the project in Portfolio.jsx:
const projects = [
{
key: 'myProject',
tech: ['React', 'Node.js'],
gradient: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
}
];Similar to portfolio, edit the translations and update Services.jsx.
Testimonials are completely defined in the translation files:
{
"testimonials": {
"items": [
{
"name": "Client",
"role": "Position",
"company": "Company",
"text": "Testimonial...",
"rating": 5
}
]
}
}Modify the variables in src/styles/variables.css:
:root {
--primary: #0ea5e9; /* Primary color */
--primary-2: #22d3ee; /* Secondary primary color */
--accent: #a78bfa; /* Accent color */
}Fonts are loaded from Google Fonts in index.html. To change:
- Update the link in
index.html - Modify the variables in
variables.css:
:root {
--font-primary: 'YourFont', sans-serif;
--font-mono: 'YourMonoFont', monospace;
}Spacing system based on 8px:
:root {
--space-1: 0.5rem; /* 8px */
--space-2: 1rem; /* 16px */
--space-4: 2rem; /* 32px */
/* ... */
}# Build
npm run build
# Deploy (configure GitHub Pages to serve from /dist)# Connect repository on vercel.com
# Automatic deploy on every push# Connect repository on netlify.com
# Build command: npm run build
# Publish directory: dist- React: Mature ecosystem, reusable components, large community
- Vite: Ultra-fast build, instant HMR, minimal configuration
- Automatic scoping (no name conflicts)
- No runtime required (vs styled-components)
- Easy maintenance and debugging
- Optimal performance
- Sufficient for simple state (theme/language)
- No external dependencies
- Less boilerplate
- Native to React
- Development environment restriction
- In-memory state is sufficient for this application
- Easy to migrate to localStorage in the future if needed
- Optimized images with
loading="lazy" - CSS Modules for automatic code splitting
- Vite automatically optimizes the bundle
- Meta tags in
index.html - Semantic HTML5 structure
- Descriptive texts in Spanish and English
- ARIA labels on interactive buttons
- Functional keyboard navigation
- WCAG AA color contrast
- Modern browsers (last 2 versions)
- Chrome, Firefox, Safari, Edge
- Responsive: mobile, tablet, desktop
This is a personal project, but suggestions are welcome:
- Fork the project
- Create a branch (
git checkout -b feature/improvement) - Commit changes (
git commit -m 'Add improvement') - Push to the branch (
git push origin feature/improvement) - Open a Pull Request
Β© 2025 Luis Fernando Benavides Rengifo. All rights reserved.
- Email: lfbenavides@gmail.com
- LinkedIn: linkedin.com/in/luis-fernando-benavides-rengifo
- GitHub: github.com/Luisfben
- Stack Overflow: stackoverflow.com/users/114611/luis-fernando-benavides
Made with β₯ by Luis Fernando Benavides Rengifo