Version : 1.0 — Mars 2026 Scope : Tout projet frontend Gentle Designs Objectif : Produire un frontend de qualité irréprochable et intentionnel, en éliminant systématiquement les signaux d'AI slop
0. Philosophie — Pourquoi ce document existe
L'IA générative (Claude, Copilot, Cursor…) produit par défaut une esthétique reconnaissable : Inter + gradients violets + cards uniformes + ombres identiques + layouts prévisibles. C'est l'AI slop — du contenu fonctionnel mais interchangeable, sans intention de design.
Le positionnement Gentle Designs est l'exact opposé : chaque pixel doit communiquer qu'un humain a pensé le design, pas qu'un prompt l'a généré. Ce document centralise les décisions, outils et patterns validés pour que chaque composant d'un projet bénéficie de la même approche — pas seulement celui qui a eu la chance d'être reworké.
Signaux d'AI Slop à éliminer systématiquement
- Polices génériques : Inter, Roboto, Arial, system-ui utilisées sans intention
- Gradients violets/bleus sur fond blanc (le cliché absolu)
- Ombres uniformes : même
box-shadowsur cards, boutons, badges - Rayons de bordure identiques partout (le fameux
rounded-lguniversel) - Layouts 100% symétriques et prévisibles
- Fonds plats monochrome sans texture ni profondeur
- Emojis comme éléments de design (🚀📊💡) au lieu d'icônes intentionnelles
- Letter-spacing et line-height jamais ajustés selon le contexte
- Pas de hiérarchie visuelle : tout a le même poids
1. Stack de référence — Gentle Designs
| Couche | Outil | Rôle |
|---|---|---|
| Framework | Next.js 16 (App Router) | SSR, SSG, Server Components |
| Styling | Tailwind CSS 4 + @theme design tokens |
Utility-first + système de tokens CSS-first |
| Animations | Framer Motion (Motion) | Micro-interactions, transitions, scroll-triggered |
| Icônes | Phosphor Icons (duotone) | Différenciation vs Lucide/Heroicons (AI slop default) |
| Composants base | shadcn/ui + Radix UI | Accessibilité + contrôle total du code |
| Composants premium | Aceternity UI / ReactBits / Magic UI | Effets "wow", hero sections, backgrounds animés |
| Inspiration | 21st.dev | Registry de composants shadcn installables |
| Langage | TypeScript | Typage, autocomplétion, collaboration IA fiable |
| Déploiement | Vercel | CI/CD, preview deployments, CDN mondial |
2. Typographie — Le signal anti-slop #1
La typographie est le levier le plus immédiat pour échapper au rendu générique. Le choix de fonts doit être intentionnel, documenté et cohérent à travers tout le projet.
Polices à ne JAMAIS utiliser par défaut
Inter, Roboto, Arial, system-ui, Space Grotesk (devenu cliché IA), Poppins (sur-utilisée). Ces polices ne sont pas mauvaises en soi — elles sont juste tellement utilisées par les outils IA qu'elles signalent immédiatement "généré".
Polices recommandées (gratuites, web-optimisées)
Display / Titres
| Police | Caractère | Source | Cas d'usage |
|---|---|---|---|
| Fraunces | Serif variable, expressif | Google Fonts | Titres avec personnalité, branding (utilisé sur robindebessel.pro) |
| Satoshi | Géométrique contemporain | Fontshare | Headlines tech-forward mais pas froid |
| Host Grotesk | Grotesque avec caractère | Google Fonts | Headers avec personnalité contrôlée |
| Instrument Sans | Moderne, propre | Google Fonts | Utilisé par Framer — bon pour les UIs tools |
| Elms Sans | Distinctif, 9 poids | Google Fonts | Headlines qui se démarquent |
| Playfair Display | Serif élégant | Google Fonts | Projets éditoriaux, luxe |
Body / Contenu
| Police | Caractère | Source | Cas d'usage |
|---|---|---|---|
| DM Sans | Géométrique lisible | Google Fonts | Body text polyvalent, variable font |
| Manrope | Géométrique-humaniste | Google Fonts | Corps moderne, bonne lisibilité |
| Switzer | Neutre raffiné | Fontshare | Dashboards, apps data, news |
| Geist | Neutre par Vercel | Vercel Fonts | Interfaces dev, documentation |
Monospace
| Police | Source | Cas d'usage |
|---|---|---|
| JetBrains Mono | jetbrains.com | Code, terminaux |
| Geist Mono | Vercel Fonts | Inline code, métriques |
| SUSE Mono | Google Fonts | Hybride géométrique/monospace |
Règles de typographie
- Un projet = un pairing intentionnel. Choisir 1 display + 1 body + 1 mono MAX.
- Letter-spacing contextuel — adapter selon l'usage :
- Headings :
-0.01emà-0.02em(serré = confiant) - Body text :
0emà0.01em(légèrement aéré = confortable) - Badges/labels :
0.04emà0.06em(aéré = se lit comme un label) - Petits caps/overlines :
0.08emà0.12em(très espacé = signal catégoriel)
- Headings :
- Line-height contextuel :
- Headlines :
1.1à1.2 - Body :
1.5à1.7 - UI compacte :
1.3à1.4
- Headlines :
- Variable fonts quand possible — un seul fichier, poids ajustable en continu.
- Ne jamais laisser Claude choisir la police — le pairing est une décision humaine documentée dans le design token du projet.
Implémentation Tailwind 4
@import "tailwindcss";
@theme {
--font-display: 'Fraunces', Georgia, serif;
--font-sans: 'DM Sans', system-ui, sans-serif;
--font-mono: 'JetBrains Mono', monospace;
}
<h1 className="font-display text-5xl font-semibold tracking-tight">Titre</h1>
<p className="font-sans text-base leading-relaxed tracking-[0.01em]">Corps</p>
<code className="font-mono text-sm">code</code>
3. Design Tokens — Tailwind 4 @theme
Tailwind 4 remplace le tailwind.config.js par une approche CSS-first via @theme. Tous les tokens sont des CSS variables natives, utilisables partout.
Structure de tokens recommandée
@import "tailwindcss";
@theme {
/* ─── Couleurs : primitives ─── */
--color-slate-950: #0a0f1a;
--color-slate-900: #111827;
--color-slate-800: #1e293b;
--color-slate-700: #334155;
--color-slate-400: #94a3b8;
--color-slate-300: #cbd5e1;
--color-slate-100: #f1f5f9;
/* ─── Couleurs : sémantiques ─── */
--color-surface: var(--color-slate-950);
--color-surface-raised: var(--color-slate-900);
--color-surface-overlay: var(--color-slate-800);
--color-text-primary: var(--color-slate-100);
--color-text-muted: var(--color-slate-400);
--color-text-dim: var(--color-slate-700);
--color-border: var(--color-slate-800);
--color-accent: #a78bfa; /* Exemple — à adapter par projet */
--color-accent-hover: #8b5cf6;
/* ─── Typographie ─── */
--font-display: 'Fraunces', Georgia, serif;
--font-sans: 'DM Sans', system-ui, sans-serif;
--font-mono: 'JetBrains Mono', monospace;
/* ─── Ombres : hiérarchisées ─── */
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.2);
--shadow-md: 0 4px 12px rgba(0, 0, 0, 0.25);
--shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.3);
--shadow-glow: 0 0 20px var(--color-accent) / 0.15;
/* ─── Rayons : intentionnels ─── */
--radius-sm: 6px;
--radius-md: 10px;
--radius-lg: 16px;
--radius-full: 9999px;
/* ─── Spacing custom si nécessaire ─── */
--spacing-section: 6rem;
--spacing-block: 3rem;
}
Principes
- Séparer primitives et sémantiques — les couleurs brutes dans
--color-slate-*, les rôles dans--color-surface,--color-text-*, etc. - Ombres hiérarchisées — JAMAIS la même ombre partout. Cards =
shadow-md, boutons =shadow-sm, modals =shadow-lg. L'ombre raconte la profondeur. - Rayons intentionnels — Un bouton n'a pas le même rayon qu'une card qui n'a pas le même rayon qu'un badge. Documenter les choix.
- Un accent dominant + variations — pas de palette distribuée uniformément. Un accent fort, le reste neutre.
4. Animations — Framer Motion (Motion)
Choix de bibliothèque
| Besoin | Outil | Pourquoi |
|---|---|---|
| Micro-interactions UI (hover, tap, mount/unmount) | Framer Motion | API déclarative, intégration React native, layout animations |
| Scroll reveals, fade-in, stagger | Framer Motion | whileInView, variants, stagger intégré |
| Transitions de page | Framer Motion | AnimatePresence, layoutId |
| Timelines complexes, SVG morphing, scroll-driven narratif | GSAP (si nécessaire) | Timeline sequencing, ScrollTrigger, MorphSVG |
| Physique naturelle, drag fluide | React Spring (optionnel) | Mouvements "organiques", rebond réaliste |
Règle : Framer Motion couvre 90% des besoins d'un site vitrine ou d'une app. N'ajouter GSAP que si le projet requiert des timelines complexes ou du SVG morphing. Ne jamais installer les deux "au cas où".
Patterns Framer Motion
// Pattern 1 : Stagger reveal (hero, listes)
const stagger = {
hidden: {},
visible: { transition: { staggerChildren: 0.12 } },
};
const fadeUp = {
hidden: { opacity: 0, y: 24 },
visible: { opacity: 1, y: 0, transition: { duration: 0.5, ease: "easeOut" } },
};
// Pattern 2 : Scroll reveal
<motion.div
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: "-100px" }}
transition={{ duration: 0.6 }}
/>
// Pattern 3 : Hover interaction
<motion.div
whileHover={{ scale: 1.02, y: -2 }}
transition={{ type: "spring", stiffness: 300, damping: 20 }}
/>
Principes d'animation
- Un moment fort bien orchestré > plein de micro-interactions dispersées. Un page load avec stagger progressif crée plus de plaisir que des hover effects partout.
prefers-reduced-motion— toujours respecter. Wrapper utilitaire :const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;- Transform + opacity uniquement pour les animations fréquentes (GPU-accelerated).
- Spring > ease pour les interactions utilisateur (plus naturel).
- Durées : micro-interactions 150-300ms, transitions de section 400-600ms, page transitions 300-500ms.
5. Icônes — Phosphor Icons
Pourquoi Phosphor et pas Lucide/Heroicons
Lucide est devenu le défaut de shadcn/ui, Heroicons celui de Tailwind UI. Tout site généré par IA les utilise. Phosphor offre :
- 9 000+ icônes, 6 poids (thin, light, regular, bold, fill, duotone)
- Le style duotone apporte profondeur et caractère, surtout en dark mode
- Tree-shakable, MIT, activement maintenu
Usage stratégique des poids
| Contexte | Poids | Raison |
|---|---|---|
| Hero sections, features principales | Duotone | Impact visuel, profondeur |
| Navigation, sidebar | Regular ou Light | Discret, fonctionnel |
| Boutons, actions | Bold | Lisibilité à petite taille |
| Accents décoratifs | Thin | Léger, élégant |
Implémentation
import { Rocket, Lightning, ShieldCheck } from "@phosphor-icons/react";
// Duotone avec couleur d'accent
<Rocket size={32} weight="duotone" className="text-accent" />
// Regular pour la navigation
<Lightning size={20} weight="regular" className="text-muted" />
6. Composants — Architecture en couches
Couche 1 : shadcn/ui + Radix UI (fondations)
Composants structurels accessibles : Dialog, Dropdown, Tabs, Tooltip, etc.
- Code copié dans le projet (pas de dépendance npm)
- Stylé avec Tailwind, comportement via Radix
- Personnaliser systématiquement les styles par défaut pour correspondre au design token du projet
Interaction clavier : tout composant interactif (modal, dropdown, formulaire, navigation) doit suivre le standard
keyboard-navigation.md. Si Radix/shadcn est utilisé, sonDialog/Dropdowngère déjà focus trap et clavier — préférer ces primitives au recodage manuel.
Couche 2 : Aceternity UI / ReactBits / Magic UI (différenciation)
Composants animés premium pour les moments clés :
| Library | Forces | Cas d'usage |
|---|---|---|
| Aceternity UI | Hero sections, backgrounds animés, hover effects, grids | Landing pages, portfolios, sections "wow" |
| ReactBits | Micro-interactions, boutons animés, textes | Détails qui font la différence sur toute l'app |
| Magic UI | Composants SaaS, setup simple | Sites marketing, dashboards |
Règle critique : ces composants ne remplacent PAS un design system. Les utiliser comme accents sur les points d'impact (hero, CTA, features), pas comme base de toute l'UI.
Couche 3 : 21st.dev (inspiration + composants)
Registry ouvert de composants shadcn installables. Workflow :
- Explorer 21st.dev pour trouver un effet/pattern
- Installer via
npx shadcn add [composant] - Adapter aux tokens du projet (ne JAMAIS utiliser tel quel)
7. Backgrounds & Textures — Profondeur visuelle
Les fonds plats à couleur unie sont un marqueur majeur d'AI slop. Techniques pour ajouter profondeur :
Noise / Grain
Ajoute une texture organique aux gradients et surfaces.
/* SVG noise inline — technique CSS-Tricks */
.noise-bg {
position: relative;
}
.noise-bg::after {
content: '';
position: absolute;
inset: 0;
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
opacity: 0.03;
pointer-events: none;
mix-blend-mode: overlay;
}
Outils de génération
- fffuel.co/gggrain — Générateur SVG de gradients granuleux
- grainy-gradients.vercel.app — Playground interactif CSS-Tricks
- cssmatic.com/noise-texture — Générateur de textures bruit
Gradient mesh
Alternative aux gradients linéaires plats :
- Utiliser des
radial-gradientmultiples avec positions décalées - Combiner avec
mix-blend-modepour des effets de lumière
Glassmorphism (maîtrisé)
.glass {
background: rgba(255, 255, 255, 0.05);
backdrop-filter: blur(12px);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: var(--radius-md);
}
Attention : le glassmorphism est devenu courant. L'utiliser avec parcimonie, jamais sur tous les éléments.
8. Layout — Casser la prévisibilité
Principes anti-slop
- Asymétrie intentionnelle — pas tout centré. Un bloc texte à gauche, une illustration débordante à droite.
- Densité variable — sections aérées alternant avec sections compactes.
- Grid-breaking — un élément qui sort de la grille (image qui déborde, texte qui chevauche).
- Espace négatif généreux — l'espace vide n'est pas du gaspillage, c'est du rythme.
Patterns concrets
{/* Asymétrie : contenu décalé */}
<div className="grid grid-cols-12 gap-8">
<div className="col-span-5 col-start-2">Texte</div>
<div className="col-span-4 col-start-8">Image</div>
</div>
{/* Overlap : élément qui chevauche */}
<div className="relative">
<div className="bg-surface-raised rounded-lg p-8">Card</div>
<div className="absolute -bottom-6 -right-6 bg-accent rounded-full p-4">
Badge qui dépasse
</div>
</div>
9. UI/UX Pro Max Skill — Position dans le workflow
Le plugin UI/UX Pro Max pour Claude Code fournit une base de données de 57 styles, 95 palettes, 56 font pairings et 98 guidelines UX.
Rôle assigné : assistant technique, PAS directeur artistique
| Phase | Qui décide | Rôle de UI/UX Pro Max |
|---|---|---|
| Direction artistique | Humain (brief créatif, choix de ton) | ❌ Ne pas utiliser |
| Choix de font pairing | Humain (Section 2 de ce doc) | ✅ Vérification / alternatives |
| Guidelines UX | Collaboration | ✅ Recherche de guidelines pertinentes |
| Accessibilité | Collaboration | ✅ Vérification des patterns |
| Palette de couleurs | Humain (tokens du projet) | ⚠️ Inspiration uniquement, pas de pilotage auto |
Commandes utiles
# Chercher des guidelines UX pour un contexte spécifique
python3 .claude/skills/ui-ux-pro-max/scripts/search.py "accessibility focus" --domain ux
# Vérifier un style spécifique
python3 .claude/skills/ui-ux-pro-max/scripts/search.py "glassmorphism" --domain style
# Explorer des font pairings (à valider avec Section 2)
python3 .claude/skills/ui-ux-pro-max/scripts/search.py "modern serif sans" --domain font
INTERDIT : laisser UI/UX Pro Max générer automatiquement le design system d'un projet. Ses palettes "par industrie" produisent des sites interchangeables.
10. Workflow complet — Du brief au composant
Phase 1 : Brief créatif (Claude.ai)
Avant tout code, définir dans le projet Claude.ai :
- Ton : luxe ? brutalist ? éditorial ? organique ? minimal raffiné ?
- Font pairing : 1 display + 1 body + 1 mono (choisis dans Section 2)
- Palette : accent dominant + neutres + 1-2 couleurs de support
- Élément mémorable : qu'est-ce qu'on retiendra de ce site ?
- Références visuelles : 2-3 sites qui incarnent la direction souhaitée
Phase 2 : Design tokens (code)
Traduire le brief en @theme Tailwind 4 (Section 3).
Ce fichier est la source unique de vérité pour tout le projet.
Phase 3 : Composants (Claude Code)
Claude Code lit ce playbook + les tokens du projet et :
- Utilise shadcn/ui pour les fondations (dialog, dropdown, etc.)
- Pioche dans Aceternity UI / ReactBits pour les moments clés
- Anime avec Framer Motion selon les patterns (Section 4)
- Utilise Phosphor Icons avec le poids approprié (Section 5)
- Ajoute texture/profondeur selon Section 7
- Vérifie l'accessibilité via UI/UX Pro Max (Section 9)
Phase 4 : Review anti-slop
Checklist avant chaque livraison :
- Aucune police générique non-intentionnelle (Inter, Roboto, Arial)
- Letter-spacing et line-height ajustés selon le contexte
- Ombres hiérarchisées (pas la même partout)
- Rayons de bordure variés selon le type d'élément
- Au moins un élément de layout non-symétrique
- Backgrounds avec texture/gradient (pas de fond plat monochrome sur les sections hero)
- Icônes Phosphor avec poids intentionnel (pas tout en regular)
- Animations avec
prefers-reduced-motionrespecté - Pas d'emojis comme éléments de design
- Design tokens utilisés partout (pas de valeurs hardcodées)
- Navigation clavier complète : focus visible, Escape ferme les overlays, équivalent clavier de chaque action souris (cf.
keyboard-navigation.md)
11. Ressources & Veille
Libraries (à jour mars 2026)
| Ressource | URL | Usage |
|---|---|---|
| Aceternity UI | ui.aceternity.com | Composants animés premium |
| ReactBits | reactbits.dev | Micro-interactions |
| Magic UI | magicui.design | Composants SaaS |
| 21st.dev | 21st.dev | Registry shadcn, inspiration |
| shadcn/ui | ui.shadcn.com | Composants accessibles base |
| Phosphor Icons | phosphoricons.com | Icônes 6 poids |
Typographie
| Ressource | URL | Usage |
|---|---|---|
| Fontshare | fontshare.com | Polices gratuites de qualité (Satoshi, Switzer…) |
| Google Fonts | fonts.google.com | Catalogue principal gratuit |
| Typewolf | typewolf.com/google-fonts | Curation des meilleures Google Fonts |
Textures & backgrounds
| Ressource | URL | Usage |
|---|---|---|
| fffuel gggrain | fffuel.co/gggrain | Gradients granuleux SVG |
| Grainy Gradients Playground | grainy-gradients.vercel.app | Playground CSS noise |
| learnui.design mesh | learnui.design/tools/mesh-gradient-generator.html | Gradient mesh + noise |
Veille design
| Ressource | URL | Pourquoi |
|---|---|---|
| stoptheslop.dev | stoptheslop.dev | Philosophie anti-slop en dev |
| awwwards.com | awwwards.com | Références de design web premium |
| Motion docs | motion.dev | Documentation Framer Motion (anciennement framer-motion) |
12. Annexe — Extrait anti-patterns
❌ AI Slop typique
// TOUT est mauvais ici :
<div className="bg-white rounded-lg shadow-md p-6">
<h2 className="text-2xl font-bold text-gray-900">Feature</h2>
<p className="text-gray-600 mt-2">Description générique</p>
<button className="bg-purple-600 text-white rounded-lg px-4 py-2 mt-4">
🚀 Get Started
</button>
</div>
Problèmes : Inter par défaut, purple gradient cliché, shadow-md uniforme, rounded-lg partout, emoji comme design, aucune texture, aucune intention.
✅ Approche Gentle Designs
<motion.div
className="bg-surface-raised/80 backdrop-blur-sm border border-border/50 rounded-[var(--radius-md)] p-8 relative overflow-hidden"
whileHover={{ y: -2 }}
transition={{ type: "spring", stiffness: 300, damping: 25 }}
>
{/* Noise texture subtile */}
<div className="absolute inset-0 opacity-[0.02] mix-blend-overlay pointer-events-none noise-bg" />
<ShieldCheck size={28} weight="duotone" className="text-accent mb-4" />
<h3 className="font-display text-xl font-semibold tracking-[-0.01em]">
Sécurité intégrée
</h3>
<p className="font-sans text-text-muted text-sm leading-relaxed tracking-[0.005em] mt-3">
Chaque intégration est auditée pour protéger vos données.
</p>
</motion.div>
Différences : font display intentionnel, tracking ajusté, icône Phosphor duotone, couleurs via tokens sémantiques, texture noise, animation spring, pas d'emoji, rayon via variable.
13. Installation dans gentlewits
Emplacement
gentlewits/knowledge/references/frontend-anti-slop-playbook.md
Référencement dans le CLAUDE.md d'un projet
Ajouter dans la section "Documentation transversale" :
## Documentation transversale (docs/gentlewits/)
IMPORTANT : Vérifie si un fichier ci-dessous est pertinent et lis-le.
- `knowledge/references/frontend-anti-slop-playbook.md` — Standards frontend anti-AI-slop
Fichier compagnon par projet
Chaque projet frontend doit avoir un docs/claude-mds/frontend/design-tokens.md qui traduit les principes de ce playbook en valeurs concrètes pour CE projet :
- Fonts choisies (pairing spécifique)
- Palette (couleurs exactes)
- Ombres, rayons, spacing custom
- Direction artistique
Ce fichier est référencé dans la section "Documentation projet" du CLAUDE.md :
## Documentation projet (docs/claude-mds/)
IMPORTANT : Lis le fichier pertinent avant de commencer une tâche.
- `frontend/design-tokens.md` — Palette, fonts, ombres, rayons de CE projet
- `frontend/components.md` — Libraries utilisées, conventions de composants
- `frontend/animations.md` — Patterns d'animation, timings, easings
Quand Claude Code le lit
Ce playbook est lu via progressive disclosure : Claude ne le charge PAS au démarrage de chaque session. Il le lit dès qu'une tâche frontend est demandée, grâce au mot "IMPORTANT" dans l'instruction du CLAUDE.md.
Ce document doit être mis à jour à chaque découverte significative d'outil, de pattern ou de technique. L'écosystème frontend/IA évolue quasi-quotidiennement — une source de plus de 3 mois doit être vérifiée.
Dernière mise à jour : mars 2026