Bienvenue dans le cursus Tailwind CSS
Ce cursus structuré en 5 cours de 2 heures a pour but de faire évoluer vos compétences d'intégration depuis l'approche par composants figés (Bootstrap) vers l'autonomie totale et le sur-mesure (Tailwind CSS), complété par l'utilisation éthique et productive de l'IA.
Objectifs Généraux du Cursus
De Bootstrap à Tailwind CSS
Objectifs de la séance
- Comprendre la rupture de paradigme entre l'approche par composants figés et l'approche par utilitaires atomiques (Utility-First).
- Maîtriser le fonctionnement des échelles de tailles basées sur le système REM et le nuancier standardisé de Tailwind.
- Assimiler le concept du compilateur JIT (Just-In-Time) et l'importance de la configuration de base.
- Réaliser la migration complète et autonome d'un composant hérité sans écrire une seule ligne de CSS traditionnel.
1. Introduction théorique : Pourquoi dépasser Bootstrap ?
Jusqu'à présent, vos interfaces reposaient sur des frameworks de composants pré-stylisés comme Bootstrap. Cette approche est confortable : vous appliquez les classes .btn .btn-primary ou .card, et le framework injecte un design clé en main.
Cependant, cette structure présente des limites architecturales majeures en production :
- La prison du design imposé : Dès que le cahier des charges s'écarte des maquettes standard du framework, vous devez créer une feuille de style externe pour forcer le code. Vous vous retrouvez à surcharger des classes imbriquées à coups de sélecteurs hyper-spécifiques ou de directives
!important. Votre CSS devient lourd, difficile à maintenir, et sujet aux régressions visuelles. - Le poids mort (Dead Code) : Même si vous n'utilisez que 10% des composants de Bootstrap, l'intégralité de la feuille de style est chargée par le navigateur de vos utilisateurs, pénalisant les performances et les scores d'optimisation (Core Web Vitals).
- Uniformité visuelle : Sans une refonte lourde des variables Sass, tous les sites construits sous Bootstrap partagent la même identité visuelle générique.
La solution Tailwind CSS : Le paradigme "Utility-First"
Tailwind CSS ne fournit **aucun composant graphique préconçu**. Il n'y a pas de classe pour une barre de navigation, ni pour un accordéon. À la place, il met à votre disposition un catalogue de milliers de classes utilitaires atomiques. Chaque classe n'exécute qu'une seule et unique tâche CSS (ex: ajouter un padding, modifier une couleur de fond, définir une grille flex).
L'assemblage visuel s'effectue directement au sein de votre fichier HTML. Vous concevez votre design sur mesure en combinant ces briques élémentaires, sans jamais quitter votre code HTML et sans accumuler de fichiers CSS superflus.
Explorez la philosophie Utility-First et les concepts fondamentaux directement sur le site de Tailwind CSS.
<!-- Syntaxe opaque cachant le CSS réel -->
<button class="btn btn-danger">
Supprimer
</button>
<!-- Syntaxe transparente et sur-mesure -->
<button class="bg-red-500 text-white font-bold py-2 px-4 rounded shadow hover:bg-red-600 transition">
Supprimer
</button>
2. Guide de Référence : Métriques et Nomenclature
Pour concevoir vos interfaces efficacement, vous devez assimiler la logique de dimensionnement rigoureuse de Tailwind CSS.
A. L'échelle des espacements et des tailles
Toutes les dimensions de marges (m-), de paddings (p-), de largeurs (w-) et de hauteurs (h-) reposent sur un multiplicateur strict basé sur le système REM.
Règle mathématique absolue :
1 unité Tailwind = 0.25rem. Sur la configuration standard des navigateurs (où 1rem = 16px), 1 unité Tailwind = 4px.
p-4: Un padding interne appliqué aux 4 côtés équivalent à $4 \times 4\text{px} = 16\text{px}$ (ou $1\text{rem}$).mb-3: Une marge inférieure (*margin-bottom*) de $3 \times 4\text{px} = 12\text{px}$ (ou $0.75\text{rem}$).py-2.5: Un padding sur l'axe vertical uniquement (haut et bas) de $2.5 \times 4\text{px} = 10\text{px}$.px-6: Un padding sur l'axe horizontal uniquement (gauche et droite) de $6 \times 4\text{px} = 24\text{px}$.
📋 Liste complète de l'échelle des espacements (Padding, Margin, Gaps, Width, Height).
Doc Spacing →B. Le système chromatique standardisé
Tailwind intègre un nuancier sophistiqué. Chaque palette de couleur (slate, gray, zinc, red, orange, amber, emerald, blue, indigo, violet, pink...) est divisée en 11 nuances numériques d'intensité lumineuse décroissante :
Pour appliquer une couleur, spécifiez son rôle d'usage : bg-gray-100 pour un arrière-plan, text-indigo-600 pour la couleur du texte, et border-emerald-300 pour une bordure.
🎨 Visualisez le nuancier complet et apprenez à manipuler les couleurs par défaut.
Doc Palette de Couleurs →C. Typographie, Bordures et Effets d'état
La gestion typographique s'affranchit des pixels via des utilitaires dédiés : text-xs, text-sm, text-base, text-lg jusqu'à text-9xl. L'épaisseur se contrôle par font-light, font-semibold, ou font-black.
Les rayons de courbure (*border-radius*) se déploient via les classes rounded-sm, rounded-lg, rounded-2xl ou rounded-full pour les éléments circulaires. Les ombres portées (*box-shadow*) utilisent l'échelle shadow-sm, shadow-md, shadow-xl.
Pour gérer l'interactivité au survol de la souris, il suffit d'ajouter le préfixe hover: devant n'importe quelle classe utilitaire. Exemple : bg-indigo-500 hover:bg-indigo-600 transition permet d'assombrir de manière fluide l'arrière-plan du bouton au survol.
✨ Apprenez à utiliser les pseudo-classes : hover, focus, active et bien d'autres.
Doc Hover & Pseudo-classes →3. Architecture technique : Le moteur Just-In-Time (JIT)
Pour ce premier cours, nous intégrons Tailwind CSS à l'aide d'un script CDN chargé dans l'en-tête HTML. En production, cette méthode est proscrite. Tailwind s'appuie sur un compilateur Node.js doté d'un moteur Just-In-Time (JIT).
Ce moteur scanne vos fichiers HTML et JavaScript en temps réel à la recherche des classes utilitaires écrites dans vos balises. Il génère ensuite à la volée un fichier CSS optimisé contenant uniquement les règles réellement appelées sur votre site. Si votre projet HTML ne contient que 15 classes Tailwind distinctes, votre fichier CSS final ne pèsera que quelques octets, assurant une vitesse d'affichage maximale.
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Séance 1 - Hello Tailwind</title>
<!-- Chargement du moteur Tailwind via CDN pour l'apprentissage -->
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-100 flex items-center justify-center h-screen">
<!-- Premier conteneur d'essai -->
<div class="bg-white p-8 rounded-2xl shadow-xl max-w-sm text-center">
<h1 class="text-3xl font-black text-indigo-600 mb-3">Hello Tailwind !</h1>
<p class="text-gray-500 text-sm mb-6">On oublie Bootstrap, on reprend le contrôle.</p>
<button class="bg-indigo-500 text-white font-semibold py-2.5 px-6 rounded-xl hover:bg-indigo-600 transition">
Propulser
</button>
</div>
</body>
</html>
4. Exercice Pratique : Le Défi "Clone Express"
Pour valider vos compétences, vous devez effectuer la refonte technique complète d'un élément d'interface hérité. Le client vous fournit un bloc de code structuré avec les composants natifs de Bootstrap. Votre mission est de reconstruire intégralement cette carte visuelle en utilisant **uniquement les classes utilitaires de Tailwind CSS**, tout en modernisant ses propriétés pour obtenir un rendu premium et contemporain.
Code source Bootstrap fourni (À NE PAS MODIFIER)
<div class="card" style="width: 18rem;">
<img src="https://images.unsplash.com/photo-1564013799919-ab600027ffc6?auto=format&fit=crop&w=500&q=80" class="card-img-top" alt="Maison">
<div class="card-body">
<span class="badge bg-secondary">Logement entier</span>
<h5 class="card-title" style="margin-top: 10px;">Villa d'architecte - Piscine</h5>
<p class="card-text text-muted">Aix-en-Provence, France</p>
<p class="card-text"><strong>180 €</strong> / nuit</p>
<a href="#" class="btn btn-primary w-100">Réserver maintenant</a>
</div>
</div>
Spécifications et Cahier des charges graphiques :
- L'Image : Doit occuper toute la largeur disponible, présenter une hauteur fixe contrainte (
h-48) et utiliser un ajustement parfait de typeobject-coverpour éviter toute distorsion. - Le Conteneur Global : Largeur maximale maîtrisée (
max-w-sm), fond blanc pur, bordure fine gris clair, et une ombre portée subtile (shadow-md) pour créer un effet de profondeur. L'arrondi global doit être prononcé (rounded-2xl) et les débordements de l'image masqués proprement (overflow-hidden). - Le Badge : Abandonnez le gris Bootstrap. Créez un badge premium doté d'un arrière-plan rose très clair (
bg-pink-50), d'un texte rose soutenu (text-pink-700), entièrement en capitales avec un espacement de lettres élargi (tracking-wider). - Le Prix : La valeur monétaire "180 €" doit être mise en avant de manière impactante (
text-xl font-extrabold). La mention "/ nuit" doit rester adjacente, discrète et grisée. - Le Bouton : Remplacer le bleu générique par un bouton au design "Tech" moderne : arrière-plan noir ou gris très sombre (
bg-gray-900), angles bien adoucis, texte blanc centré. Au survol de la souris, sa couleur doit s'éclaircir de manière fluide (hover:bg-gray-800 transition duration-200).
Villa d'architecte - Piscine
Aix-en-Provence, France
180 € / nuit
Réserver maintenant🔒 Verrou pédagogique : Accéder à la correction validée
Saisissez le mot de passe fourni par l'enseignant en fin de session pour débloquer le code source optimisé et valider vos alignements.
overflow-hidden sur la carte parente. Sans cela, les angles droits de l'image brute écraseraient le rayon de courbure rounded-2xl du bloc de fond.
<!-- Implémentation cible validée -->
<div class="max-w-sm bg-white rounded-2xl overflow-hidden shadow-md border border-gray-100">
<!-- Image à proportion fixe contrainte -->
<img class="w-full h-48 object-cover" src="https://images.unsplash.com/photo-1564013799919-ab600027ffc6?auto=format&fit=crop&w=500&q=80" alt="Villa">
<!-- Zone de contenu (Padding uniforme de 20px) -->
<div class="p-5">
<!-- Badge typographique customisé -->
<span class="inline-block bg-pink-50 text-pink-700 text-xs font-bold uppercase tracking-wider px-2.5 py-1 rounded-full mb-3">
Logement entier
</span>
<!-- Titres et données géographiques -->
<h5 class="text-lg font-bold text-gray-900 mb-1">Villa d'architecte - Piscine</h5>
<p class="text-sm text-gray-400 mb-4">Aix-en-Provence, France</p>
<!-- Tarification hiérarchisée -->
<p class="text-gray-900 mb-4">
<span class="text-xl font-extrabold">180 €</span>
<span class="text-sm text-gray-400 font-normal">/ nuit</span>
</p>
<!-- Bouton avec micro-interaction au survol -->
<a href="#" class="block text-center bg-gray-900 hover:bg-gray-800 text-white font-medium py-3 px-4 rounded-xl transition duration-200 shadow-sm">
Réserver maintenant
</a>
</div>
</div>
Responsive Multi-Écrans & Architecture Dark Mode
Objectifs de la séance
- Assimiler la méthodologie Mobile-First et comprendre pourquoi les max-width traditionnels sont abandonnés.
- Maîtriser les 5 breakpoints natifs de Tailwind CSS et savoir orchestrer les changements de mise en page.
- Comprendre le fonctionnement mécanique du sélecteur de mode sombre (`dark:`) au niveau du DOM.
- Concevoir un composant hautement adaptatif ("caméléon") qui s'ajuste en géométrie et en palette colorimétrique.
1. L'intégration Mobile-First : Le standard de l'industrie
Dans le développement web moderne, plus de la moitié du trafic mondial s'effectue sur smartphone. L'intégration Mobile-First n'est pas qu'une préférence ergonomique, c'est une exigence technique. Elle consiste à concevoir d'abord l'interface pour le plus petit écran disponible, puis à y ajouter des règles d'agrandissement et d'enrichissement pour les écrans plus larges.
Tailwind CSS applique cette philosophie de manière stricte et native. Toutes les classes que vous écrivez sans préfixe s'appliquent sur mobile ($375\text{px}$ et moins) et se propagent vers le haut par héritage, jusqu'à ce qu'un breakpoint supérieur vienne modifier leur comportement.
Consultez les stratégies avancées de requêtes médias et la personnalisation des points de rupture.
La grille des breakpoints natifs de Tailwind
Tailwind propose 5 points de rupture standards basés sur des requêtes média de type min-width :
| Breakpoint | Largeur minimale | CSS natif équivalent | Cible matérielle courante |
|---|---|---|---|
| sm | 640px | @media (min-width: 640px) | Smartphones format paysage |
| md | 768px | @media (min-width: 768px) | Tablettes (iPad, etc.) |
| lg | 1024px | @media (min-width: 1024px) | Laptops & Écrans de bureau standards |
| xl | 1280px | @media (min-width: 1280px) | Moniteurs haute résolution |
| 2xl | 1536px | @media (min-width: 1536px) | Grands moniteurs / TV 4K |
Le piège de la surcharge : Évitez d'écrireclass="w-full md:w-full". Si un élément doit occuper toute la largeur sur mobile et sur desktop, écrivez simplementclass="w-full". Ne surchargez vos éléments que lorsque la géométrie change réellement d'un écran à l'autre.
2. Architecture Dark Mode : Comment fonctionne l'inversion de contraste ?
Plutôt que de charger une feuille de style alternative ou de manipuler de complexes fichiers de variables CSS, Tailwind intègre une variante d'état universelle : le préfixe dark:.
Par défaut, Tailwind est configuré pour écouter la préférence système de l'utilisateur (définie dans les paramètres d'affichage de macOS, Windows, Android ou iOS) via la média query prefers-color-scheme.
Si la préférence système est configurée sur "Sombre", toutes les classes préfixées par dark: s'activent et écrasent automatiquement leurs équivalents clairs.
Découvrez comment basculer d'une détection système (media) à un contrôle par classe JavaScript (selector).
<div class="bg-white text-gray-900 dark:bg-gray-950 dark:text-gray-50 border border-gray-200 dark:border-gray-800">
<h3 class="text-lg font-bold">Titre Dynamique</h3>
</div>
3. Exercice Pratique : Le Composant "Caméléon"
Votre défi pour cette séance de 2 heures est de faire évoluer la carte logement conçue lors du Cours 1 pour la rendre adaptative. Elle doit changer de forme physique selon l'écran et réagir de manière fluide aux changements de luminosité du système (Dark Mode).
Cahier des charges de la transformation :
A. Comportement Réactif (Layout)
- Sur Mobile (comportement par défaut) : La carte conserve sa structure verticale du cours 1 (Image au-dessus, contenu textuel en dessous). Sa largeur est maximale mais contrainte par un wrapper.
- Sur Écran Intermédiaire et Large (
md:et plus) : La carte pivote horizontalement. Elle doit utiliser Flexbox (md:flex md:flex-row). L'image se place à gauche et doit occuper une largeur fixe (md:w-48 md:h-full), tandis que la zone de texte à droite prend tout l'espace restant (flex-1).
B. Comportement Colorimétrique (Dark Mode)
- Le Conteneur : Fond blanc
bg-whiteen mode clair, basculant sur un fond ardoise sombredark:bg-slate-900en mode sombre. Les bordures passent deborder-gray-100àdark:border-slate-800. - La Typographie : Le titre passe de
text-gray-900àdark:text-white, le descriptif detext-gray-400àdark:text-slate-400. - Le Badge : Devient plus discret et moins agressif en mode sombre (ex: fond rose très opaque
dark:bg-pink-950/30et texte rose clairdark:text-pink-400). - Le Bouton de Réservation : En clair, il est noir à texte blanc. En sombre, il s'inverse pour devenir blanc à texte noir (
dark:bg-white dark:text-slate-900 dark:hover:bg-slate-100).
Villa d'architecte
180 € / nuit
Villa d'architecte
180 € / nuit
🔒 Verrou pédagogique : Accéder à la correction du Cours 2
Saisissez le mot de passe fourni par l'enseignant pour dévoiler l'architecture responsive double-sens validée.
md:flex md:flex-row, et comment nous contrôlons la géométrie de l'image pour qu'elle passe d'un format paysage étiré à une colonne verticale fixe à gauche via md:w-48 md:h-full.
<!-- Composant adaptatif complet : Responsive et compatible Dark Mode -->
<div class="max-w-sm md:max-w-2xl bg-white dark:bg-slate-900 rounded-2xl overflow-hidden shadow-md border border-gray-100 dark:border-slate-800 flex flex-col md:flex-row transition duration-300">
<!-- Image : S'étire sur mobile, prend une forme verticale contrainte sur desktop -->
<img class="w-full md:w-48 h-48 md:h-auto object-cover" src="https://images.unsplash.com/photo-1564013799919-ab600027ffc6?auto=format&fit=crop&w=500&q=80" alt="Villa">
<!-- Contenu de la carte -->
<div class="p-5 flex-1 flex flex-col justify-between">
<div>
<!-- Badge adaptatif -->
<span class="inline-block bg-pink-50 dark:bg-pink-950/30 text-pink-700 dark:text-pink-400 text-xs font-bold uppercase tracking-wider px-2.5 py-1 rounded-full mb-3">
Logement entier
</span>
<!-- Titres contrastés -->
<h5 class="text-lg font-bold text-gray-900 dark:text-white mb-1">Villa d'architecte - Piscine</h5>
<p class="text-sm text-gray-400 dark:text-slate-400 mb-4">Aix-en-Provence, France</p>
</div>
<!-- Section basse : Tarification et Actions -->
<div class="flex items-center justify-between gap-4 mt-2">
<p class="text-gray-900 dark:text-white">
<span class="text-xl font-extrabold">180 €</span>
<span class="text-xs text-gray-400 dark:text-slate-500 block">/ nuit</span>
</p>
<!-- Bouton Caméléon à inversion chromatique complète -->
<a href="#" class="bg-gray-900 hover:bg-gray-800 dark:bg-white dark:hover:bg-slate-100 text-white dark:text-slate-900 font-semibold py-2.5 px-5 rounded-xl text-sm transition duration-200 shadow-sm">
Réserver
</a>
</div>
</div>
</div>
Structures Macro : Maîtrise de Flexbox & CSS Grid
Objectifs de la séance
- Bannir définitivement les techniques d'alignement obsolètes (floats, positionnements absolus détournés).
- Maîtriser la distribution unidimensionnelle (Flexbox) pour les alignements de composants et barres d'outils.
- Apprivoiser l'architecture bidimensionnelle (CSS Grid) pour structurer des gabarits de pages entières et des galeries complexes.
- Manipuler l'écosystème des classes de gouttières (`gap`, `gap-x`, `gap-y`) pour automatiser la gestion des espacements sans effets de bord.
- Orchestrer l'assemblage complet d'une interface de type Application Web (Dashboard) fluide et défilante.
1. Fondations macro-structurelles : Distribuer l'espace proprement
Lorsque vous concevez une page Web complète, vous manipulez deux types de géométries d'affichage : les alignements sur un seul axe (horizontal ou vertical) et les structures sur deux axes simultanés (colonnes et lignes). Tailwind intègre des raccourcis utilitaires calqués directement sur les spécifications W3C les plus robustes : CSS Flexbox et CSS Grid.
Idéal pour les structures unidimensionnelles. On l'utilise pour aligner des éléments le long d'une ligne ou d'une colonne unique. Exemples types : une barre de navigation, une liste de badges imbriqués, l'alignement centré d'une icône à côté d'un texte.
Plaque tournante des structures bidimensionnelles. Indispensable pour l'architecture macro globale de vos interfaces ou pour la distribution de galeries de cartes complexes où les éléments doivent s'aligner de manière rigoureuse à la fois horizontalement et verticalement.
2. Guide syntaxique : Le catalogue d'alignement atomique
A. L'univers Flexbox
La classe flex transforme instantanément le conteneur en élément parent flexible. Par défaut, la direction est horizontale (flex-row). Elle se bascule verticalement via flex-col.
- Axe principal (Justify) : L'alignement horizontal se gère via
justify-start(à gauche),justify-center(centré), oujustify-between(repousse les éléments aux extrémités pour distribuer l'espace vide). - Axe secondaire (Items) : L'alignement vertical se contrôle par
items-center(aligne parfaitement les milieux des boîtes) ouitems-stretch(étire les hauteurs par défaut).
Consultez l'ensemble des modificateurs d'axe (Flex Direction, Wrap, Grow et Shrink).
B. Le système CSS Grid fractionnaire
Pour créer des grilles, on initialise le conteneur avec grid, puis on spécifie la structure du découpage via la syntaxe grid-cols-{nombre}. Tailwind intègre un découpage standardisé allant jusqu'à 12 fractions régulières (grid-cols-12).
<div class="grid grid-cols-1 md:grid-cols-3 lg:grid-cols-4 gap-6">
<div>Élément 1</div>
<div>Élément 2</div>
</div>
Apprenez à gérer les fusions de lignes et colonnes complexes (Grid Template Columns & Spanning).
C. La révolution de la gestion d'espace : L'utilitaire Gap
L'un des plus grands défis de l'intégration traditionnelle résidait dans l'application de marges externes (margin-right / margin-bottom) sur les enfants, forçant souvent à tricher avec des pseudo-sélecteurs :last-child pour annuler la marge sur le dernier élément.
La bonne pratique Tailwind : Utilisez exclusivement la classegap-{valeur}sur le conteneur parent. La gouttière se calcule de manière automatisée uniquement entre les blocs enfants, sans jamais déborder sur les pourtours du cadre. Vous pouvez dissocier les axes avecgap-x-4(horizontal) etgap-y-6(vertical).
Visualisez les correspondances de l'échelle d'espacement numérique (`gap-1` à `gap-96`) appliquées aux grilles.
3. Exercice Pratique : L'Application Web de Distribution (Dashboard)
Votre mission consiste à mettre en place la structure macroscopique complète d'un tableau de bord de type plateforme de vidéo à la demande ou de gestion immobilière. L'interface ne doit pas dépasser la ligne d'horizon du moniteur, éliminant ainsi le défilement global au profit de zones de défilement internes isolées.
Spécifications techniques impératives du Gabarit :
- Le Conteneur Racine : Doit occuper exactement toute la hauteur de la fenêtre graphique visible (
h-screen), utiliser une structure flexible horizontale (flex flex-row), un fond gris clair et interdire les barres de défilement externes (overflow-hidden). - La Barre Latérale (Aside Navigation) : Largeur fixe stricte de 16rem (
w-64), fond gris foncé ou noir (bg-gray-900), texte blanc. Cette barre latérale est masquée sur smartphone (hidden) et s'affiche obligatoirement à partir du breakpoint intermédiaire (md:block). - Le Bloc Central de Contenu : Prend tout l'espace disponible restant à droite de la barre latérale (
flex-1), et se découpe verticalement (flex flex-col h-full). - La Barre Supérieure (Header / Topbar) : Hauteur fixe de 4rem (
h-16), fond blanc pur, séparée du reste par une fine ligne grise inférieure. Elle doit contenir un titre aligné à gauche et une zone profil alignée à l'extrême droite. - La Zone de Défilement Principale (Main) : Doit occuper le reste de l'espace vertical. C'est elle qui encaisse le défilement si le catalogue est volumineux (
flex-1 overflow-y-auto p-6). - La Grille Intérieure de Cartes : Au cœur de cette zone principale, vous intégrerez une grille réactive distribuant les cartes produits conçues au Cours 2. La grille doit afficher : **1 colonne** sur mobile, **2 colonnes** dès le breakpoint
sm:, **3 colonnes** surmd:et **4 colonnes** sur écran largelg:.
🔒 Verrou pédagogique : Accéder à la correction du Cours 3
Saisissez le code d'accès de session pour afficher le squelette architectural complet du Dashboard.
h-screen et overflow-hidden sur la racine fige l'écran. C'est l'ajout ciblé de overflow-y-auto sur la balise <main> qui redonne une autonomie de défilement au contenu interne, créant un effet d'application native.
<!-- Squelette Macro Applicatif Complet (Dashboard) -->
<div class="h-screen w-full flex overflow-hidden bg-gray-50 text-gray-900">
<!-- Barre latérale fixe : Masquée sur mobile, affichée en largeur fixe dès md -->
<aside class="hidden md:block w-64 h-full bg-gray-900 text-white flex flex-col justify-between p-5">
<div class="space-y-6">
<div class="text-xl font-black tracking-wider text-indigo-400 text-center uppercase">SkyBoard</div>
<nav class="space-y-2">
<a href="#" class="block bg-gray-800 px-4 py-2 rounded-xl text-sm font-medium">Vue d'ensemble</a>
<a href="#" class="block hover:bg-gray-800 px-4 py-2 rounded-xl text-sm text-gray-400 hover:text-white transition">Analytique</a>
<a href="#" class="block hover:bg-gray-800 px-4 py-2 rounded-xl text-sm text-gray-400 hover:text-white transition">Paramètres</a>
</nav>
</div>
<div class="text-xs text-gray-500 text-center border-t border-gray-800 pt-3">v1.0.0 (2026)</div>
</aside>
<!-- Espace extensible central droit -->
<div class="flex-1 flex flex-col h-full overflow-hidden">
<!-- En-tête horizontal fixe -->
<header class="h-16 w-full bg-white border-b border-gray-200 flex items-center justify-between px-6 shadow-sm">
<h1 class="text-lg font-bold text-gray-800">Tableau de Bord Principal</h1>
<div class="flex items-center gap-3">
<span class="text-xs text-gray-500 font-mono">Session active</span>
<div class="w-8 h-8 rounded-full bg-indigo-600 text-white flex items-center justify-center font-bold text-xs">MMI</div>
</div>
</header>
<!-- Zone centrale de contenu autonome avec défilement vertical -->
<main class="flex-1 overflow-y-auto p-6 bg-gray-100">
<!-- Grille adaptative multi-colonnes auto-gérée par Gap -->
<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
<!-- Réplication des cartes du cours précédent -->
<!-- Exemple Carte 1 -->
<div class="bg-white rounded-xl shadow p-4"> Carte Logement 1 </div>
<!-- Exemple Carte 2 -->
<div class="bg-white rounded-xl shadow p-4"> Carte Logement 2 </div>
<!-- Exemple Carte 3 -->
<div class="bg-white rounded-xl shadow p-4"> Carte Logement 3 </div>
<!-- Exemple Carte 4 -->
<div class="bg-white rounded-xl shadow p-4"> Carte Logement 4 </div>
</div>
</main>
</div>
</div>
Configuration Avancée, Directives CSS & Animations
Objectifs de la séance
- Comprendre le rôle du fichier de configuration de Tailwind pour surcharger ou étendre le design system par défaut.
- Savoir utiliser les directives `@apply` et `@layer` pour factoriser le code répétitif sans polluer le HTML.
- Maîtriser les transitions physiques, les transformations spatiales (scale, rotate, translate) et les animations fluides.
- Créer des composants hautement interactifs combinant états dynamiques, pseudo-classes et animations temporelles.
🛠️ Guide de démarrage : Installer npm et structurer son projet
Pour exploiter pleinement la puissance de la configuration et des directives CSS de Tailwind, il est nécessaire d'installer Tailwind via un gestionnaire de dépendances. Le plus standard est npm (Node Package Manager).
Node.js est un environnement qui permet d'exécuter du JavaScript en dehors du navigateur web (sur votre ordinateur). npm est installé automatiquement avec Node.js ; c'est un catalogue géant d'outils et de bibliothèques de code gratuits que vous pouvez télécharger instantanément en ligne de commande.
Étape 1 : Le protocole d'installation pas-à-pas
- Télécharger Node.js : Allez sur le site officiel nodejs.org, téléchargez la version **LTS** (Recommandée) pour votre système (Windows/Mac) et installez-la comme n'importe quel logiciel.
- Ouvrir un Terminal : Ouvrez votre éditeur de code (VS Code) et ouvrez le terminal intégré (Ctrl + ` ou Cmd + ` sur Mac).
- Initialiser le projet : Tapez la commande suivante pour créer le fichier d'identité de votre projet web (
package.json) :npm init -y
- Installer Tailwind CSS : Téléchargez l'outil de build officiel en tapant :
npm install -D tailwindcss
- Créer le fichier de configuration : Générez le fameux fichier
tailwind.config.js:npx tailwindcss init
Étape 2 : L'arborescence professionnelle recommandée
Pour que le compilateur Tailwind sache où chercher vos classes et où générer son fichier CSS optimisé, organisez votre projet ainsi :
├── 📁 src/ ── # Vos fichiers sources de travail
│ └── 📄 input.css ── # Votre feuille CSS maîtresse (avec @layer et @apply)
├── 📁 dist/ ── # Le dossier de production généré automatiquement
│ └── 📄 output.css ── # Le CSS final ultra-optimisé produit par Tailwind
├── 📄 index.html ── # Votre page HTML principale (lie le dist/output.css)
├── 📄 package.json ── # Registre des dépendances npm
└── 📄 tailwind.config.js ── # Vos réglages, couleurs et extensions graphiques
1. Personnaliser Tailwind : Le fichier `tailwind.config.js`
Jusqu'à présent, nous avons utilisé les valeurs par défaut de Tailwind CSS. Mais en agence ou sur un projet d'envergure, vous devez respecter une charte graphique stricte (typographies spécifiques, couleurs de marque inédites, breakpoints sur-mesure). C'est le rôle du fichier de configuration tailwind.config.js.
Il y a deux manières de configurer vos valeurs dans l'objet theme :
- Surcharger l'existant (Écrasement direct) : Si vous écrivez vos propriétés directement sous
theme: { ... }, toutes les valeurs par défaut de Tailwind pour cette catégorie disparaissent au profit des vôtres. - Étendre l'existant (Recommandé) : Si vous écrivez vos propriétés sous
theme: { extend: { ... } }, vous conservez l'intégralité du catalogue Tailwind tout en y injectant vos propres variables personnalisées.
Explorez le fonctionnement de l'architecture du fichier de configuration (Theme Configuration).
module.exports = {
content: ["./*.html", "./src/**/*.{js,css}"], // Indique à Tailwind où chercher les classes pour purger
theme: {
extend: {
colors: {
// Ajout d'une couleur de marque personnalisée
brand: {
light: '#f3e8ff',
DEFAULT: '#6b21a8', // s'utilisera via la classe bg-brand ou text-brand
dark: '#4c1d95',
}
},
fontFamily: {
// Intégration d'une police système ou Google Font personnalisée
sans: ['Geist', 'Inter', 'sans-serif'],
}
}
}
}
2. Dompter l'accumulation de classes : `@apply`
L'une des critiques récurrentes faites à l'approche Utility-First est la longueur des chaînes de classes dans le HTML. Lorsque vous avez 15 boutons strictement identiques sur votre application, répéter "bg-indigo-600 text-white font-bold py-2 px-4 rounded-lg hover:bg-indigo-700 transition" pollue le code et complique la maintenance.
La directive @apply vous permet d'extraire ces classes utilitaires répétitives pour les encapsuler dans une classe CSS sémantique personnalisée (dans votre feuille de style d'entrée).
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer components {
.btn-primary {
@apply bg-indigo-600 text-white font-bold py-2 px-4 rounded-lg hover:bg-indigo-700 transition duration-300;
}
}
<!-- Code HTML nettoyé, élégant et maintenable -->
<button class="btn-primary">
Confirmer l'inscription
</button>
Approfondissez l'utilisation des fonctions et directives natives (`@layer`, `@apply`, `@config`).
Règle d'or de l'utilisation d' @apply : N'utilisez pas cette directive trop tôt. Ne créez des composants personnalisés avec @apply que pour des éléments structurels hautement répétitifs et stables (boutons, inputs de formulaires, badges). Pour l'agencement global, restez sur du HTML pur pour garder la flexibilité de Tailwind.
3. Fluidité visuelle : Transitions & Transformations
Pour donner une impression de qualité supérieure ("feel premium"), vos éléments interactifs doivent réagir de manière organique aux interactions utilisateurs. Tailwind intègre des raccourcis très simples pour orchestrer des micro-animations spatiales :
- La Transition (
transition-all) : Indique au navigateur d'animer les changements d'état de manière fluide au lieu d'une coupure nette et instantanée. On l'associe toujours à une durée (duration-300pour 300ms) et une courbe d'accélération (ease-in-out). - Le Changement d'Échelle (
scale-95/scale-105) : Réduit ou agrandit un élément sous l'effet du survol ou du clic. - La Rotation (
hover:rotate-6) : Utile pour dynamiser les icônes. - Le Déplacement (
hover:-translate-y-1) : Très populaire sur les grilles de cartes pour donner un effet de surélévation "3D" physique au survol.
Parcourez le catalogue complet des utilitaires de transition de propriétés, de timing et d'animations clés.
4. Exercice Pratique : Le Hub de Cartes Interactives
Pour valider cette dernière étape du module, les étudiants doivent concevoir une grille de cartes d'offres de services ou de produits premium (par exemple, des forfaits d'hébergement ou des abonnements de streaming). Ces cartes doivent réagir physiquement au survol de la souris en combinant élévation, changement d'échelle, modification d'opacité et effets de lueur diffuse.
Cahier des charges de l'exercice :
- Le Wrapper de Grille : Utilisez Grid pour créer un conteneur réactif (1 colonne mobile, 3 colonnes desktop) avec une gouttière généreuse (
gap-8). - Comportement Physique de la Carte au Survol (
hover:) :- S'élever légèrement vers le haut via un déplacement vertical négatif (
hover:-translate-y-2). - S'agrandir de manière infime (
hover:scale-[1.02]). - Multiplier l'intensité de son ombre portée pour simuler l'éloignement physique du plan de fond (
hover:shadow-2xl hover:shadow-indigo-500/10). - Toutes ces transformations doivent s'opérer de manière fluide sur un intervalle de 300ms (
transition-all duration-300 ease-out).
- S'élever légèrement vers le haut via un déplacement vertical négatif (
- Bouton avec effet d'onde et de lueur (Glow) : Le bouton d'appel à l'action de la carte doit s'illuminer d'un halo de couleur externe au survol de la souris à l'aide des ombres colorées (
hover:shadow-lg hover:shadow-indigo-500/50).
Formule Pro
La puissance de l'automatisation sans limites.
49 € / mois
Remarquez la surélévation de la carte, l'ombre diffuse indigo-500 et le halo lumineux sous le bouton principal.
🔒 Verrou pédagogique : Accéder à la correction du Cours 4
Entrez le mot de passe final de session pour débloquer l'implémentation complète des micro-interactions physiques.
shadow-indigo-500/20 permet de créer des effets de néon ou de surbrillance très modernes, parfaits pour les designs de tableaux de bord ou de landing pages orientées SaaS / Tech.
<!-- Grille Parent -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-8 p-8 max-w-6xl mx-auto">
<!-- Carte Interactive Premium -->
<div class="group relative bg-white dark:bg-slate-900 border border-gray-100 dark:border-slate-800 rounded-3xl p-6 shadow-md transition-all duration-300 ease-out hover:-translate-y-2 hover:scale-[1.02] hover:shadow-2xl hover:shadow-indigo-500/10 cursor-pointer">
<!-- En-tête de la carte -->
<div class="flex items-center justify-between mb-6">
<div class="w-12 h-12 rounded-2xl bg-indigo-50 dark:bg-indigo-950/50 flex items-center justify-center text-indigo-600 dark:text-indigo-400 font-bold text-lg">
⚡
</div>
<span class="text-xs font-bold text-indigo-600 dark:text-indigo-400 uppercase tracking-widest bg-indigo-50 dark:bg-indigo-950/50 px-3 py-1 rounded-full">
Populaire
</span>
</div>
<!-- Descriptif et Tarifs -->
<h3 class="text-xl font-black text-gray-950 dark:text-white mb-2">Formule Pro</h3>
<p class="text-sm text-gray-500 dark:text-slate-400 mb-6">La puissance de l'automatisation sans aucune contrainte de serveurs.</p>
<div class="mb-6 border-b border-gray-100 dark:border-slate-800 pb-6">
<span class="text-4xl font-black text-gray-950 dark:text-white">49 €</span>
<span class="text-sm text-gray-400 font-medium"> / mois</span>
</div>
<!-- Liste de puces -->
<ul class="space-y-3 mb-8 text-sm text-gray-600 dark:text-slate-300">
<li class="flex items-center gap-2">
<span class="text-emerald-500">✓</span> Bande passante illimitée
</li>
<li class="flex items-center gap-2">
<span class="text-emerald-500">✓</span> Support technique 24h/24
</li>
<li class="flex items-center gap-2">
<span class="text-emerald-500">✓</span> Intégration continue
</li>
</ul>
<!-- Bouton avec effet d'onde et de lueur (Glow) au survol -->
<button class="w-full bg-indigo-600 text-white font-bold py-3.5 px-4 rounded-2xl transition-all duration-300 hover:bg-indigo-700 hover:shadow-lg hover:shadow-indigo-500/40 active:scale-95">
Démarrer l'essai
</button>
</div>
</div>
Workflow Augmenté : Concevoir et Intégrer avec l'IA
Objectifs de la séance
- Maîtriser l'art du prompt d'interface (UI Prompting) pour générer des squelettes HTML/Tailwind viables d'un seul coup.
- Apprendre à utiliser les LLM (ChatGPT, Claude, v0.dev) pour analyser des captures d'écran et en extraire le code Tailwind.
- Découvrir les outils de génération d'UI générative (comme v0 de Vercel ou Bolt.new) basés sur Tailwind.
- Adopter une méthode rigoureuse pour relire, épurer et optimiser le code Tailwind généré par l'IA (éviter les hallucinations de classes).
1. Pourquoi l'IA "adore" Tailwind CSS ?
Si vous demandez à une IA (comme Claude ou GPT-4) de vous générer une interface avec du CSS classique ou du Sass, le résultat est souvent catastrophique : elle génère un fichier CSS à part, oublie de lier les classes, crée des collisions de sélecteurs et peine à harmoniser les couleurs.
Avec Tailwind CSS, c'est le jour et la nuit. Comme tout le style est encapsulé directement dans le HTML via des classes utilitaires standards, l'IA n'a qu'un seul fichier à manipuler. De plus, le "Design System" de Tailwind étant figé (les échelles de tailles, de couleurs, de paddings), l'IA fait très peu d'erreurs d'harmonisation car elle pioche dans un dictionnaire de classes ultra-documenté sur le web.
2. Guide de Prompting : Le "System Prompt" parfait pour l'UI
Pour obtenir un code Tailwind propre et moderne (sans styles "inline" bizarres ou classes obsolètes), vous devez cadrer l'IA. Voici le prompt de structure que vous devez lui injecter avant de lui demander un composant :
"Agis en tant qu'intégrateur web senior expert en Tailwind CSS v3+.
Je vais te demander de concevoir un composant d'interface. Respecte STRICTEMENT ces règles :
1. Utilise uniquement les classes utilitaires natives de Tailwind CSS. Pas de styles 'style=\"...\"' en ligne.
2. Applique une philosophie Mobile-First rigoureuse (classes par défaut pour mobile, puis préfixes 'md:' pour desktop).
3. Utilise des arrondis modernes (rounded-2xl ou rounded-3xl), des ombres subtiles (shadow-sm, shadow-md) et une palette de couleurs élégante (privilégie les tons ardoises/zinc 'slate' ou 'zinc' pour les neutres).
4. Prépare le composant pour le Dark Mode avec la variante 'dark:'.
5. Rends le bouton interactif avec des transitions douces (transition-all duration-200 ease-in-out) et des effets hover/active physiques (hover:-translate-y-0.5, etc.)."
3. Les outils révolutionnaires du marché
Au-delà des simples chats textuels, des outils spécialisés ont vu le jour pour créer des interfaces complètes en quelques secondes :
Vous lui décrivez ce que vous voulez (ex: "Une page de paiement Stripe épurée") et il génère instantanément plusieurs propositions d'interfaces codées en Tailwind et React. On peut modifier chaque section à la voix ou par texte.
L'interface interactive d'Anthropic permet de voir le rendu du HTML/Tailwind en temps réel dans une fenêtre adjacente pendant que vous ajustez le design avec le chatbot.
Des environnements de développement complets dans le navigateur qui génèrent, exécutent et déploient des applications entières basées sur Tailwind CSS à partir d'un simple prompt.
4. Exercice Pratique : Reverse Engineering de Maquette
Pour cet exercice, les étudiants vont utiliser la vision par ordinateur d'un LLM pour cloner une interface réelle.
"Analyse cette image et recrée exactement le même composant visuel en utilisant uniquement du HTML5 et Tailwind CSS. Fais attention aux moindres détails : espacements, opacités, icônes (utilise des SVGs ou Heroicons) et l'harmonie des polices."
La checklist de validation humaine :
L'IA n'est jamais parfaite. Les étudiants doivent manuellement vérifier et nettoyer le code généré en passant au crible les points suivants :
- Nettoyage des hallucinations : L'IA a-t-elle inventé des classes qui n'existent pas (ex:
text-md-centerau lieu demd:text-center) ? - Respect du responsive : L'IA a-t-elle figé des largeurs physiques (ex:
w-[450px]) au lieu d'utiliser des classes fluides adaptatives (ex:w-full max-w-md) ? - Sémantique HTML : A-t-elle empilé des
<div>stériles ou a-t-elle utilisé des balises sémantiques (<button>,<nav>,<header>) ?
Strasbourg
Nuageux • Enseignant-IA
🔒 Verrou pédagogique : Accéder au code optimisé du Widget Météo
Saisissez le mot de passe final de validation pour afficher le code propre, épuré de toute scorie d'IA.
bg-gradient-to-br from-blue-500 to-indigo-600 pour un effet professionnel moderne, et comment l'effet de flou en arrière-plan à droite est créé grâce à bg-white/10 blur-xl.
<!-- Code nettoyé du widget météo généré par IA -->
<div class="w-full max-w-xs bg-gradient-to-br from-blue-500 to-indigo-600 text-white rounded-3xl p-6 shadow-xl relative overflow-hidden">
<!-- Effet de lumière artificielle en arrière-plan -->
<div class="absolute -right-10 -top-10 w-32 h-32 bg-white/10 rounded-full blur-xl"></div>
<!-- Top Info -->
<div class="flex justify-between items-start mb-8 relative z-10">
<div>
<h5 class="text-xl font-bold tracking-tight">Strasbourg</h5>
<p class="text-xs text-blue-100/80 font-medium">Nuageux • Enseignant-IA</p>
</div>
<span class="text-4xl filter drop-shadow-md" role="img" aria-label="Nuage">☁️</span>
</div>
<!-- Température -->
<div class="mb-6 relative z-10">
<span class="text-5xl font-black tracking-tighter">14°C</span>
</div>
<!-- Métriques -->
<div class="flex justify-between border-t border-white/20 pt-4 text-xs text-blue-100/90 relative z-10">
<div class="text-center">
<span class="block font-bold text-blue-200">Vent</span>
<span class="font-mono">12 km/h</span>
</div>
<div class="text-center">
<span class="block font-bold text-blue-200">Humidité</span>
<span class="font-mono">78%</span>
</div>
<div class="text-center">
<span class="block font-bold text-blue-200">Pluie</span>
<span class="font-mono">10%</span>
</div>
</div>
</div>
Projet Synthèse : Évaluation Pratique & Grille d'Évaluation
Objectifs de la séance d'évaluation
- Mobiliser l'ensemble des acquis des 5 cours précédents dans un projet concret en temps limité (1h30 de code).
- Construire une landing page produit ou un dashboard complet respectant les normes d'intégration modernes.
- Démontrer la maîtrise absolue du Mobile-First, du Dark Mode, des grilles fluides et des micro-interactions.
- Auto-évaluer son code à l'aide d'une grille barémée rigoureuse sur 10 points.
1. Sujet de l'Épreuve : "SaaS Launchpad"
Vous êtes recruté(e) comme intégrateur/trice Front-End pour le lancement d'un nouvel outil SaaS de gestion de projets web nommé "TaskPulse". Votre mission est d'intégrer en 1 heure et 30 minutes la section principale de tarification et de présentation ("Pricing & Features Hub").
Le fichier doit être entièrement autonome (index.html) et utiliser uniquement le moteur Tailwind CSS (CDN). Aucune ligne de CSS personnalisé traditionnel n'est autorisée.
2. Cahier des Charges Techniques (4 Bloc-Clés)
Une barre de navigation réactive (logo + liens) et un titre accrocheur centré avec un badge animé ("v2.0 disponible") et une sous-description explicative claire.
Une grille adaptative (1 col mobile, 3 cols desktop) avec 3 forfaits (Starter, Pro, Enterprise). La carte "Pro" doit être mise en avant (border indigo, badge "Le plus populaire").
Toutes les cartes doivent s'élever au survol (hover:-translate-y-2). Les boutons doivent posséder des ombres colorées interactives et des transitions douces.
L'intégralité du composant doit réagir au Dark Mode système (dark:). Les fonds, textes, bordures et badges doivent s'inverser sans perte de contraste.
3. Grille d'Évaluation Officielle (Barème /10)
Chaque critère est évalué de manière stricte et objective selon les critères ci-dessous :
| Critère d'évaluation | Description technique attendue | Barème |
|---|---|---|
| 1. Architecture HTML & Sémantique |
Emploi rigoureux des balises sémantiques (<header>, <main>, <section>, <button>). Aucune dépendance CSS externe. Code propre et indenté.
|
/ 1.5 pts |
| 2. Responsiveness & Mobile-First |
Démarche Mobile-First respectée. Utilisation correcte des breakpoints (sm:, md:, lg:). Aucun débordement horizontal (overflow-x parasite) sur smartphone ($375\text{px}$).
|
/ 2.5 pts |
| 3. Support Dark Mode (`dark:`) | Prise en charge complète du mode sombre sur l'ensemble des éléments (fonds, textes, cartes, bordures, boutons). Rendu esthétique et lisible sans baisse de lisibilité. | / 2.0 pts |
| 4. Micro-interactions & Polish |
Animations et transitions fluides au survol (transition-all duration-300, hover:-translate-y-*, ombres portées dynamiques hover:shadow-*).
|
/ 2.0 pts |
| 5. Respect du Design System & Hiérarchie | Utilisation cohérente des échelles de marges/paddings Tailwind, nuanciers de couleurs harmonieux, hiérarchie typographique fluide (tailles, graisses). | / 2.0 pts |
| Total Général | Note finale ramenée sur 10 points. | / 10 pts |
🔒 Verrou enseignants : Débloquer la solution modèle de l'évaluation
Saisissez le code d'évaluation pour afficher la référence d'intégration validée à 10/10.
<!-- LANDING PAGE SAAS EVALUATION VALIDEE (10/10) -->
<div class="min-h-screen bg-slate-50 dark:bg-slate-950 text-slate-900 dark:text-slate-100 transition-colors duration-300 p-4 sm:p-8">
<!-- Header / Navbar -->
<header class="max-w-6xl mx-auto flex items-center justify-between py-6 mb-12 border-b border-slate-200 dark:border-slate-800">
<div class="flex items-center gap-2 font-black text-xl tracking-tight text-indigo-600 dark:text-indigo-400">
<span class="text-2xl">⚡</span> TaskPulse
</div>
<nav class="hidden md:flex gap-6 text-sm font-semibold text-slate-600 dark:text-slate-400">
<a href="#" class="hover:text-indigo-600 dark:hover:text-indigo-400 transition">Fonctionnalités</a>
<a href="#" class="hover:text-indigo-600 dark:hover:text-indigo-400 transition">Tarifs</a>
<a href="#" class="hover:text-indigo-600 dark:hover:text-indigo-400 transition">Avis</a>
</nav>
<button class="bg-indigo-600 hover:bg-indigo-700 text-white font-bold py-2 px-4 rounded-xl text-xs transition duration-200 shadow-md shadow-indigo-500/20">
Connexion
</button>
</header>
<!-- Hero Section -->
<main class="max-w-6xl mx-auto">
<div class="text-center max-w-2xl mx-auto mb-16 space-y-4">
<span class="inline-block bg-indigo-100 dark:bg-indigo-950/60 text-indigo-700 dark:text-indigo-300 text-xs font-bold px-3 py-1 rounded-full uppercase tracking-wider">
v2.0 est disponible
</span>
<h1 class="text-3xl sm:text-5xl font-black tracking-tight">
Des tarifs simples pour des équipes ambitieuses.
</h1>
<p class="text-sm sm:text-base text-slate-500 dark:text-slate-400">
Boostez la productivité de votre agence sans frais cachés. Annulez à tout moment.
</p>
</div>
<!-- Grille de Tarifs (Pricing Grid) -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-8 items-stretch mb-16">
<!-- Carte 1 : Starter -->
<div class="bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 rounded-3xl p-6 sm:p-8 flex flex-col justify-between shadow-sm hover:shadow-xl hover:-translate-y-1 transition duration-300">
<div>
<h3 class="text-lg font-bold mb-2">Starter</h3>
<p class="text-xs text-slate-500 dark:text-slate-400 mb-6">Pour les freelances et projets solo.</p>
<div class="mb-6">
<span class="text-4xl font-black">15 €</span>
<span class="text-xs text-slate-400"> / mois</span>
</div>
<ul class="space-y-3 text-xs text-slate-600 dark:text-slate-300 mb-8">
<li class="flex items-center gap-2"><span class="text-emerald-500">✓</span> Jusqu'à 3 projets</li>
<li class="flex items-center gap-2"><span class="text-emerald-500">✓</span> Support communautaire</li>
<li class="flex items-center gap-2"><span class="text-emerald-500">✓</span> 5 Go de stockage</li>
</ul>
</div>
<button class="w-full bg-slate-100 hover:bg-slate-200 dark:bg-slate-800 dark:hover:bg-slate-700 text-slate-900 dark:text-white font-bold py-3 rounded-2xl text-xs transition">
Démarrer
</button>
</div>
<!-- Carte 2 : Pro (Mise en avant) -->
<div class="bg-white dark:bg-slate-900 border-2 border-indigo-600 dark:border-indigo-500 rounded-3xl p-6 sm:p-8 flex flex-col justify-between shadow-xl hover:shadow-indigo-500/10 hover:-translate-y-2 transition duration-300 relative">
<span class="absolute -top-3.5 left-1/2 -translate-x-1/2 bg-indigo-600 text-white text-[10px] font-black uppercase tracking-widest px-3 py-1 rounded-full">
Le plus populaire
</span>
<div>
<h3 class="text-lg font-bold mb-2">Pro Agence</h3>
<p class="text-xs text-slate-500 dark:text-slate-400 mb-6">Pour les équipes en forte croissance.</p>
<div class="mb-6">
<span class="text-4xl font-black text-indigo-600 dark:text-indigo-400">49 €</span>
<span class="text-xs text-slate-400"> / mois</span>
</div>
<ul class="space-y-3 text-xs text-slate-600 dark:text-slate-300 mb-8">
<li class="flex items-center gap-2"><span class="text-emerald-500">✓</span> Projets illimités</li>
<li class="flex items-center gap-2"><span class="text-emerald-500">✓</span> Support prioritaire 24/7</li>
<li class="flex items-center gap-2"><span class="text-emerald-500">✓</span> 100 Go de stockage cloud</li>
<li class="flex items-center gap-2"><span class="text-emerald-500">✓</span> Intégration IA avancée</li>
</ul>
</div>
<button class="w-full bg-indigo-600 hover:bg-indigo-700 text-white font-bold py-3 rounded-2xl text-xs transition shadow-lg shadow-indigo-500/30">
Essai gratuit (14 jours)
</button>
</div>
<!-- Carte 3 : Enterprise -->
<div class="bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 rounded-3xl p-6 sm:p-8 flex flex-col justify-between shadow-sm hover:shadow-xl hover:-translate-y-1 transition duration-300">
<div>
<h3 class="text-lg font-bold mb-2">Enterprise</h3>
<p class="text-xs text-slate-500 dark:text-slate-400 mb-6">Sécurité et contrôle sur-mesure.</p>
<div class="mb-6">
<span class="text-4xl font-black">129 €</span>
<span class="text-xs text-slate-400"> / mois</span>
</div>
<ul class="space-y-3 text-xs text-slate-600 dark:text-slate-300 mb-8">
<li class="flex items-center gap-2"><span class="text-emerald-500">✓</span> Serveurs dédiés isolés</li>
<li class="flex items-center gap-2"><span class="text-emerald-500">✓</span> Account Manager dédié</li>
<li class="flex items-center gap-2"><span class="text-emerald-500">✓</span> SLA garanti 99.9%</li>
</ul>
</div>
<button class="w-full bg-slate-100 hover:bg-slate-200 dark:bg-slate-800 dark:hover:bg-slate-700 text-slate-900 dark:text-white font-bold py-3 rounded-2xl text-xs transition">
Nous contacter
</button>
</div>
</div>
</main>
</div>