Une application web moderne de gestion de bibliothèque personnelle développée avec React et Vite.
- Ajout de livres avec suggestions automatiques via l'API Google Books
- Modification des informations d'un livre existant
- Suppression avec confirmation de sécurité
- Visualisation en cartes avec couvertures
- Recherche textuelle dans le titre, auteur et résumé
- Filtrage par genre avec options dynamiques
- Filtrage par année de publication
- Filtre favoris pour afficher uniquement les livres préférés
- Filtrage par statut de lecture (non-lu, en cours, lu)
- Marquage rapide des livres favoris d'un simple clic
- Mise à jour optimiste pour une expérience fluide
- Persistance des favoris en base de données
- Trois états : Non lu (📚), En cours (📖), Lu (✅)
- Basculement cyclique d'un simple clic
- Indicateurs visuels avec couleurs distinctes
- Filtrage par statut de lecture
- Mode sombre/clair avec basculement instantané
- Design responsive avec Bootstrap 5
- Pagination pour une navigation facile
- Animations fluides
- Auto-complétion avec l'API Google Books lors de l'ajout
- Gestion d'erreurs robuste avec rollback automatique
- Sauvegarde automatique des préférences de thème
- Navigation avec React Router
- Tri dynamique par titre et date de publication
- Pagination intelligente avec navigation fluide
- React 19.1.0 - Framework JavaScript
- Vite 7.0.4 - Bundler et serveur de développement
- React Router DOM 7.7.0 - Gestion de la navigation
- Bootstrap 5.3.7 - Framework CSS
- React Transition Group 4.4.5 - Animations et transitions
- ESLint - Linting et qualité de code
- Google Fonts - Typographies (Inter & Playfair Display)
- Google Books API - Suggestions de livres avec auto-complétion
- JSON Server (recommandé) - Base de données locale
- Node.js (version 16 ou supérieure)
- npm ou yarn
npm installL'application utilise db.json comme base de données locale. Pour un serveur JSON :
# Installation globale de json-server (optionnel)
npm install -g json-server
# Démarrage du serveur sur le port 3001
json-server --watch db.json --port 3001npm run devL'application sera accessible sur http://localhost:5173
npm run buildnpm run previewnpm run lintsrc/
├── components/ # Composants réutilisables
│ ├── BookCard.jsx # Carte d'affichage d'un livre
│ ├── BookModal.jsx # Modal de détails d'un livre
│ ├── FilterBar.jsx # Barre de filtres et recherche
│ ├── Header.jsx # En-tête avec navigation
│ ├── LoadingSpinner.jsx # Indicateur de chargement
│ └── ThemeToggle.jsx # Bouton de changement de thème
├── contexts/ # Contextes React
│ └── ThemeContext.jsx # Gestion du thème global
├── pages/ # Pages principales
│ ├── AddBook.jsx # Page d'ajout de livre
│ ├── BookList.jsx # Liste paginée des livres
│ └── EditBook.jsx # Page de modification
├── App.jsx # Composant principal
├── main.jsx # Point d'entrée
├── App.css # Styles principaux
└── index.css # Styles globaux et typographie
- Tapez le titre d'un livre pour obtenir des suggestions de l'API Google Books
- Sélectionnez une suggestion pour remplir automatiquement tous les champs
- Possibilité d'ajout manuel pour les livres non référencés
- Nettoyage intelligent des descriptions HTML et entités
- Mode clair : Design épuré avec couleurs douces
- Mode sombre : Interface sombre pour réduire la fatigue oculaire
- Sauvegarde automatique de la préféférence utilisateur
- Détection automatique de la préférence système
- Les options de filtres s'adaptent dynamiquement aux autres filtres actifs
- Combinaison possible de tous les filtres simultanément
- Bouton de réinitialisation pour effacer tous les filtres
- Légende visuelle des statuts de lecture
- Mise à jour optimiste pour une réactivité immédiate
- Rollback automatique en cas d'erreur réseau
- Indicateurs visuels distinctifs
- Trois états disponibles : Non lu, En cours de lecture, Lu
- Cycle automatique : clic pour passer à l'état suivant
- Indicateurs colorés : rouge pour non-lu, jaune pour en cours, vert pour lu
- Persistance en base de données avec mise à jour optimiste
Le projet utilise l'API Google Books. Aucune clé API n'est requise pour les requêtes de base.
Les thèmes sont définis dans src/App.css :
- Variables CSS pour les couleurs
- Classes
.light-themeet.dark-theme - Animations et transitions personnalisables
L'application est entièrement responsive avec des breakpoints Bootstrap :
- Mobile : 1 livre par ligne
- Tablette : 2 livres par ligne
- Desktop : 3-4 livres par ligne selon la taille
- Validation des formulaires avec messages d'erreur
- Gestion des erreurs réseau avec rollback automatique
- États de chargement pour les opérations asynchrones
- Confirmation de suppression pour éviter les erreurs
- Mise à jour optimiste pour une expérience utilisateur fluide
- Composants mémorisés avec React.memo pour éviter les re-rendus
- Callbacks stabilisés avec useCallback
- Filtrage dynamique des options selon les autres filtres
- Pagination intelligente pour gérer de grandes collections
- Debouncing pour les recherches API
- Par titre : ordre alphabétique croissant/décroissant
- Par date : chronologique (anciens → récents / récents → anciens)
- Persistance du choix de tri lors de la navigation
- Affichage complet des informations du livre
- Actions rapides : modifier, supprimer, favoris, statut
- Navigation au clavier et accessibilité
- Système de notes et avis/commentaires de lecture
- Recherche avancée avec opérateurs
- Export/Import de la bibliothèque (JSON, CSV)
- Statistiques de lecture avec graphiques
- Recommandations basées sur les goûts
- Système de catégories personnalisées
- Mode hors-ligne avec synchronisation
- Partage de bibliothèque entre utilisateurs
- Intégration avec d'autres APIs de livres
- Système de prêt de livres
{
"id": "unique-id",
"titre": "Titre du livre",
"auteur": "Nom de l'auteur",
"genre": "Genre littéraire",
"date": "YYYY-MM-DD",
"couverture": "URL ou nom de fichier",
"resume": "Résumé du livre",
"isFavori": false,
"statutLecture": "non-lu" // "non-lu" | "en-cours" | "lu"
}Le fichier vite.config.js ignore les modifications de db.json pour éviter les rechargements inutiles :
export default defineConfig({
plugins: [react()],
server: {
watch: {
ignored: ['**/db.json']
}
}
})Kacktucz