+ {/* Hero profil skeleton */}
+
+ {/* Tabs skeleton */}
+
+ {/* Card skeleton */}
+
);
}
diff --git a/frontend/src/pages/Recipes/RecipeForm.tsx b/frontend/src/pages/Recipes/RecipeForm.tsx
index 6808d40..7e0249b 100644
--- a/frontend/src/pages/Recipes/RecipeForm.tsx
+++ b/frontend/src/pages/Recipes/RecipeForm.tsx
@@ -253,18 +253,32 @@ export default function RecipeForm() {
className="flex-1 flex flex-col items-center justify-center px-4"
>
{/* Image en cours de génération ou finale */}
-
- {liveImageUrl ? (
-
- ) : (
-
- )}
+
+ {/* Halo derrière l'image */}
+
+
+
+ {liveImageUrl ? (
+
+ ) : (
+
+
+
+ )}
+
{/* Titre live (apparaît dès que le stream le révèle) */}
diff --git a/frontend/src/pages/Recipes/RecipeList.tsx b/frontend/src/pages/Recipes/RecipeList.tsx
index 56b1513..6947696 100644
--- a/frontend/src/pages/Recipes/RecipeList.tsx
+++ b/frontend/src/pages/Recipes/RecipeList.tsx
@@ -8,11 +8,11 @@ import { recipeService, type Recipe } from "@/api/recipe"
import { Button } from "@/components/ui/button"
import { Plus, Clock, Utensils, Heart, Share2, ArrowUpRight } from "lucide-react"
import { motion } from "framer-motion"
-import { CookingLoader } from "@/components/illustrations/CookingLoader"
import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"
import { Badge } from "@/components/ui/badge"
import { Card, CardContent, CardFooter } from "@/components/ui/card"
import { EmptyRecipes } from "@/components/illustrations/EmptyRecipes"
+import { RecipeListSkeleton } from "@/components/recipe-card-skeleton"
export default function RecipeList() {
const navigate = useNavigate()
@@ -91,12 +91,31 @@ export default function RecipeList() {
})
return (
-
+
+ {/* Header de page avec titre */}
+
+
+
+ Mes recettes
+
+
+ {loading
+ ? "Chargement de votre collection…"
+ : recipes.length > 0
+ ? `${recipes.length} recette${recipes.length > 1 ? "s" : ""} dans votre carnet`
+ : "Commencez votre collection dès maintenant"}
+
+
+
- {/* Main content */}
+ {/* Erreur */}
{error && (
@@ -104,29 +123,37 @@ export default function RecipeList() {
)}
-
+ {/* Barre filtres + CTA */}
+
-
- Toutes
- Faciles
- Rapides
- Végé
+
+
+ Toutes
+
+
+ Faciles
+
+
+ Rapides
+
+
+ Végé
+
- {
- filteredRecipes.length !== 0 &&
+ {filteredRecipes.length !== 0 && (
- }
+ )}
{loading ? (
-
+
) : (
<>
{filteredRecipes.length === 0 ? (
@@ -147,14 +174,20 @@ export default function RecipeList() {
)}
{/* Floating action button (mobile only) */}
-
-
+
@@ -181,32 +214,57 @@ function RecipeCard({ recipe, index }: RecipeCardProps) {
}[recipe.difficulty || ""] || "bg-gray-500/80 text-white hover:bg-gray-600/80";
return (
-
-
+
+
navigate(`/recipes/${recipe.id}`)}
>
+ {/* Image avec zoom subtil */}

-
-
-
{recipe.title}
-
{recipe.description || "Aucune description disponible"}
-
+
+ {/* Dégradé plus prononcé pour la lisibilité */}
+
+
+ {/* Brillance au hover */}
+
+
+ {/* Titre + description en bas */}
+
+
+ {recipe.title}
+
+
+ {recipe.description || "Aucune description disponible"}
+
-
+ {/* Badges flottants en haut */}
+
{recipe.difficulty && (
-
+
{recipe.difficulty.charAt(0).toUpperCase() + recipe.difficulty.slice(1)}
)}
{(recipe.preparationTime || 0) <= 30 && (
-
+
Rapide
)}
@@ -241,22 +299,34 @@ function RecipeCard({ recipe, index }: RecipeCardProps) {
-
+
-