Un portfolio moderne, sobre et élégant conçu pour mettre en valeur vos projets et compétences de développeur web. Ce template utilise Next.js, Tailwind CSS et Framer Motion pour offrir une expérience utilisateur fluide et performante.
✅ Note : Ce projet utilise Tailwind CSS v3.4 (stable) pour une compatibilité maximale.
- 🎨 Design minimaliste avec palette de couleurs sombres et accents pastel
- ✨ Animations fluides avec Framer Motion (fade-in, slide, hover effects)
- 📱 100% Responsive - Mobile-first design
- ♿ Accessible - Navigation clavier, ARIA labels, contraste vérifié
- 🎯 SEO optimisé - Meta tags, structure sémantique
- Hero : Présentation avec animations et liens sociaux
- Projets : Cartes de projets avec images, technologies et liens
- Compétences : Grille de compétences organisée par catégories
- À propos : Parcours et motivations
- Contact : Formulaire de contact avec validation RGPD
- ⚛️ Next.js 15 - Framework React avec App Router
- 🎨 Tailwind CSS - Styling utilitaire et responsive
- 🎬 Framer Motion - Animations performantes
- 📦 TypeScript - Type-safety
- 🎯 React Icons - Bibliothèque d'icônes
- Node.js 18+ installé
- npm ou yarn
- Cloner ou télécharger le projet
git clone <votre-repo>
cd portfolio-test- Installer les dépendances
npm install- Lancer le serveur de développement
npm run dev- Ouvrir dans le navigateur
http://localhost:3000
Modifiez les métadonnées SEO :
export const metadata: Metadata = {
title: "Portfolio | Votre Nom",
description: "Votre description personnalisée",
authors: [{ name: "Votre Nom" }],
// ...
};Modifiez :
- Le titre et la description dans la Hero section
- Les liens vers vos réseaux sociaux (GitHub, LinkedIn, Email)
- Le texte de la section "À propos"
Éditez src/data/projects.ts :
export const projects: Project[] = [
{
id: 'projet-1',
title: 'Nom du projet',
description: 'Description courte',
stack: ['React', 'Node.js', ...],
image: '/projects/mon-projet.jpg',
githubUrl: 'https://github.com/...',
demoUrl: 'https://...',
featured: true,
order: 1,
},
// ...
];Ajout d'images :
- Placez vos captures d'écran dans
/public/projects/ - Format recommandé : WebP (pour les performances)
- Dimensions recommandées : 1200x800px
Éditez src/data/skills.ts :
export const skills: Skill[] = [
{
id: 'react',
name: 'React',
category: 'frontend',
icon: 'FaReact', // Nom de l'icône depuis react-icons
level: 85,
order: 1,
},
// ...
];Icônes disponibles :
Éditez tailwind.config.ts :
colors: {
primary: {
dark: '#0a0a0f', // Fond principal sombre
DEFAULT: '#14141f', // Fond par défaut
light: '#1e1e2e', // Fond clair
},
accent: {
blue: '#6b9bd1', // Accent bleu
green: '#a8c5a7', // Accent vert
// ...
},
}Par défaut, le formulaire est simulé. Pour l'activer :
- Créez un compte sur FormSpree
- Obtenez votre endpoint
- Dans
src/components/ContactForm.tsx, remplacez :
const response = await fetch('https://formspree.io/f/YOUR_FORM_ID', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(formData),
});Créez src/app/api/contact/route.ts :
import { NextResponse } from 'next/server';
export async function POST(request: Request) {
const data = await request.json();
// Logique d'envoi d'email (Nodemailer, SendGrid, etc.)
return NextResponse.json({ success: true });
}- Modifiez les liens de navigation
- Changez le logo/texte
- Mettez à jour les liens sociaux
- Ajoutez les mentions légales
- Créer un compte sur Vercel
- Connecter votre repo GitHub
- Importer le projet
- Déployer - C'est automatique !
- Créer un compte sur Netlify
- Build command :
npm run build - Publish directory :
.next - Déployer
Si vous utilisez une API ou des services externes :
# .env.local
NEXT_PUBLIC_FORMSPREE_ID=your_id
NEXT_PUBLIC_GA_ID=your_ga_idportfolio-test/
├── public/
│ ├── projects/ # Images des projets
│ ├── robots.txt # SEO
│ └── sitemap.txt # Sitemap
├── src/
│ ├── app/
│ │ ├── layout.tsx # Layout principal
│ │ ├── page.tsx # Page d'accueil
│ │ └── globals.css # Styles globaux
│ ├── components/
│ │ ├── Header.tsx # En-tête
│ │ ├── Footer.tsx # Pied de page
│ │ ├── ProjectCard.tsx # Carte projet
│ │ ├── SkillCard.tsx # Carte compétence
│ │ └── ContactForm.tsx # Formulaire
│ └── data/
│ ├── projects.ts # Données projets
│ └── skills.ts # Données compétences
├── tailwind.config.ts # Configuration Tailwind
├── next.config.ts # Configuration Next.js
└── package.json
- ✅ Images optimisées avec
next/image - ✅ Code splitting automatique avec Next.js
- ✅ Lazy loading des animations
- ✅ CSS minifié en production
- ✅ Meta tags configurés
- ✅ Structure sémantique HTML
- ✅ Textes alt sur les images
- ✅ URLs sémantiques
- ✅ Robots.txt et sitemap
- ✅ Navigation au clavier
- ✅ ARIA labels
- ✅ Contraste vérifié (WCAG AA)
- ✅ Focus visible
# Développement
npm run dev
# Build production
npm run build
# Démarrer en production
npm start
# Linter (Biome)
npm run lint
# Format du code
npm run formatConsultez le fichier TROUBLESHOOTING.md pour les problèmes courants et leurs solutions.
Problème résolu : Erreur Tailwind CSS v4 → Migration vers v3.4 stable ✅
Ce projet est préparé pour intégrer un CMS headless :
// src/data/projects.ts
export const getProjects = async (): Promise<Project[]> => {
const res = await fetch('https://your-strapi.com/api/projects');
return res.json();
};import { createClient } from 'contentful';
const client = createClient({
space: 'your_space_id',
accessToken: 'your_access_token',
});- Vérifiez que
'use client'est présent en haut des composants utilisant Framer Motion - Effacez le cache :
rm -rf .next && npm run dev
- Vérifiez
tailwind.config.ts - Assurez-vous que les classes sont dans le
contentarray
- Vérifiez que tous les types sont importés
- Lancez
npm run lintpour voir les erreurs
Ce projet est libre d'utilisation pour votre portfolio personnel.
Pour toute question ou problème :
- Consultez la documentation ci-dessus
- Vérifiez les issues GitHub
- Contactez-moi à [[email protected]]
Fait avec ❤️ par un développeur passionné