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 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 fonctionnement du design system en CSS avec la directive
@themede Tailwind v4. - Savoir utiliser les directives
@applyet@utilitypour 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 et la CLI v4 : Téléchargez l'outil de build officiel et son moteur d'exécution en tapant :
npm install -D tailwindcss @tailwindcss/cli
- Créer la feuille de style maîtresse : Créez votre fichier CSS source (ex:
src/input.css) et importez Tailwind au tout début :@import "tailwindcss";
- Lancer la compilation automatique (Watcher) : Exécutez la CLI Tailwind pour compiler votre CSS en continu pendant vos développements :
npx @tailwindcss/cli -i ./src/input.css -o ./dist/output.css --watch
É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 CSS source avec @import "tailwindcss"; et vos réglages @theme
├── 📁 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
1. Personnaliser Tailwind v4 : La directive `@theme`
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). Depuis Tailwind v4, il n'y a plus de fichier JS externe : toute la configuration se fait directement dans votre fichier CSS grâce à la directive @theme.
Il y a deux façons d'ajuster votre charte graphique dans votre fichier CSS :
- Étendre le thème (Par défaut) : Ajouter des variables CSS personnalisées dans le bloc
@theme { ... }conserve l'intégralité du catalogue Tailwind tout en y injectant vos propres réglages. - Surcharger l'existant : Vous pouvez réinitialiser une catégorie complète en utilisant l'instruction
--color-*: initial;pour remplacer totalement les valeurs par défaut.
Explorez la personnalisation moderne du thème via CSS (Theme Configuration v4).
@import "tailwindcss";
@theme {
/* Ajout d'une couleur de marque personnalisée */
--color-brand-light: #f3e8ff;
--color-brand: #6b21a8; /* s'utilisera via bg-brand ou text-brand */
--color-brand-dark: #4c1d95;
/* Intégration d'une police système ou Google Font personnalisée */
--font-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 strictly 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).
@import "tailwindcss";
.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 de la version 4.
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 1 : Starter -->
<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-gray-500 dark:text-gray-400 uppercase tracking-widest bg-gray-100 dark:bg-slate-800 px-3 py-1 rounded-full">
Débutant
</span>
</div>
<!-- Descriptif et Tarifs -->
<h3 class="text-xl font-black text-gray-950 dark:text-white mb-2">Formule Starter</h3>
<p class="text-sm text-gray-500 dark:text-slate-400 mb-6">Idéal pour lancer vos premiers projets web sans vous ruiner.</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">19 €</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> 10 Go de stockage
</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> Déploiement automatique
</li>
</ul>
<!-- Bouton avec effet d'onde et de lueur (Glow) au survol -->
<button class="w-full bg-slate-800 text-white font-bold py-3.5 px-4 rounded-2xl transition-all duration-300 hover:bg-slate-900 hover:shadow-lg hover:shadow-slate-500/30 active:scale-95">
Commencer gratuitement
</button>
</div>
<!-- Carte Interactive 2 : Pro (Populaire) -->
<div class="group relative bg-white dark:bg-slate-900 border-2 border-indigo-500 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/20 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>
<!-- Carte Interactive 3 : Enterprise -->
<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-purple-600 dark:text-purple-400 uppercase tracking-widest bg-purple-50 dark:bg-purple-950/50 px-3 py-1 rounded-full">
Sur-Mesure
</span>
</div>
<!-- Descriptif et Tarifs -->
<h3 class="text-xl font-black text-gray-950 dark:text-white mb-2">Formule Enterprise</h3>
<p class="text-sm text-gray-500 dark:text-slate-400 mb-6">Infrastructures dédiées et accompagnement par un expert dédié.</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">99 €</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> Serveurs dédiés SLA 99.9%
</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> Sécurité & Audit renforcés
</li>
</ul>
<!-- Bouton avec effet d'onde et de lueur (Glow) au survol -->
<button class="w-full bg-slate-800 text-white font-bold py-3.5 px-4 rounded-2xl transition-all duration-300 hover:bg-slate-900 hover:shadow-lg hover:shadow-slate-500/30 active:scale-95">
Contacter la vente
</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>
Évaluation Pratique : Dashboard « AeroSpace Control Center 360° »
Objectifs de l'évaluation
- Mettre en place un projet Tailwind v4 complet via l'environnement Node/npm (compilation CLI obligatoire).
- Configurer le thème global via la directive
@themeavec des variables de couleurs imposées. - Créer et appliquer une classe réutilisable via
@applydans le fichier CSS source. - Intégrer le Dashboard spatial avec cartes high-design, tableau télémétrique dense et terminal de commande interactif.
- Utiliser l'IA (ChatGPT, Claude, v0) pour concevoir et affiner le code des composants complexes.
📊 Barème & Grille d'Évaluation (Sur 10 points)
| Critère | Exigences Techniques | Barème |
|---|---|---|
| 1. Workflow & Tooling npm | Projet initialisé (package.json), installation de Tailwind CLI v4, dossier src/input.css et compilation dans dist/output.css. |
/ 2 pts |
2. Configuration @theme |
Ajout et utilisation effective des couleurs imposées (--color-space-dark et --color-neon-cyan) dans la configuration CSS. |
/ 1.5 pt |
3. Composant CSS @apply |
Création de la classe réutilisable .btn-control regroupant au moins 5 propriétés utilitaires et réutilisée dans le code. |
/ 1.5 pt |
| 4. Layout du Dashboard | Structure responsive globale (Sidebar + Topbar + Grid + Terminal), alignements propres et fond personnalisé. | / 2 pts |
| 5. Qualité Design des Cartes & Tableaux | Rendu fidèle des widgets à fort impact visuel (Dégradés vibrants, glassmorphism backdrop-blur, orbes décoratifs, jauges, tableau et console CLI). |
/ 3 pts |
🚀 Sujet : Dashboard « AeroSpace Control Center »
Vous devez intégrer le cockpit de contrôle du centre spatial « AeroSpace Operations ». Vous disposez du squelette HTML brut à habiller ainsi que de la maquette visuelle de référence ci-dessous.
@theme
--color-space-dark: #070913;
Fond principal de l'application
--color-neon-cyan: #00f2fe;
Lueurs, accents, jauges & statut
🖼️ Objectif Visuel — Aperçu du Rendu Attendu
Maquette Target
- Build npm / CLI : Compilation obligatoire avec la CLI Tailwind CSS v4 via terminal (
npx @tailwindcss/cli ...). - Couleurs sur-mesure dans
@theme:--color-space-dark: #070913;(Fond sombre profond)--color-neon-cyan: #00f2fe;(Lueurs et accentuations cyan)
- Composant réutilisable avec
@apply: Définissez.btn-controldans votresrc/input.css(padding, rounded, transition, background translucide et hover state). - Utilisation recommandée des IA : Vous pouvez utiliser des IA (ChatGPT, Claude, v0.dev) pour vous aider à générer la combinaison précise de classes pour le glassmorphism, les orbes lumineuses floutées (
blur-xl) et les dégradés complexes.
💻 Structure HTML Brute à habiller (Squelette de départ)
Copiez ce squelette HTML dans votre fichier index.html. Ajoutez les classes Tailwind requises dans les éléments class="...".
<!DOCTYPE html>
<html lang="fr" class="h-full">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AeroSpace Control Center</title>
<link rel="stylesheet" href="./dist/output.css">
</head>
<body class="..."> <!-- Appliquer la couleur space-dark -->
<div class="...">
<div class="...">
<!-- SIDEBAR NAVIGATION ENRICHIE -->
<aside class="...">
<div class="...">
<div class="...">
<span class="...">🚀</span>
<div>
<h1 class="...">Aero<span class="...">Space</span></h1>
<span class="...">CORE OS v4.12.0</span>
</div>
</div>
<nav class="...">
<a href="#" class="...">📊 Vue Générale 360°</a>
<a href="#" class="...">🛰️ Télémétrie Orbitale</a>
<a href="#" class="...">🔋 Réseaux & Énergie</a>
<a href="#" class="...">👨🚀 Équipage Orion-I</a>
<a href="#" class="...">🛡️ Dôme de Sécurité</a>
</nav>
</div>
<!-- Card Statut Sidebar -->
<div class="...">
<div class="...">
<span>Réserve O₂ Globale</span>
<span class="...">● STABLE</span>
</div>
<div class="...">84.2 <span class="...">HRS</span></div>
<div class="..."><div class="..." style="width: 74%"></div></div>
</div>
</aside>
<!-- CONTENU PRINCIPAL -->
<main class="...">
<!-- TOPBAR -->
<header class="...">
<div>
<h2 class="...">Cockpit Principal — Mission Orion Alpha-9</h2>
<p class="...">Coordonnées : RA 05h 35m / Dec -05° 23' • Altitude ISS : 408.4 km</p>
</div>
<div class="...">
<span class="...">● SYSTEM ONLINE (1.2ms)</span> <!-- Utiliser neon-cyan -->
<button class="btn-control">Exporter Logs</button>
</div>
</header>
<!-- 1. GRILLE DE 3 CARTES HIGH-DESIGN -->
<div class="...">
<!-- Carte 1 : Environnement Thermal -->
<!-- Carte 2 : Moniteur Télémétrie O₂ -->
<!-- Carte 3 : Commander Profile Card -->
</div>
<!-- 2. TABLEAU TÉLÉMÉTRIE & CONSOLE DE LOGS -->
<div class="...">
<!-- Tableau de Télémétrie -->
<div class="...">
<table class="...">...</table>
</div>
<!-- Console CLI Logs -->
<div class="...">
<input type="text" placeholder="Entrer une commande CLI..." class="...">
</div>
</div>
</main>
</div>
</div>
</body>
</html>
🔒 Verrou Enseignant : Accéder au corrigé complet de l'évaluation
Entrez le mot de passe maître pour débloquer l'implémentation de référence du Dashboard.
space-dark, neon-cyan, l'extraction de .btn-control via @apply, les 3 cartes high-design, la table de télémétrie complète ainsi que la console CLI.
/* =========================================================
FICHIER : src/input.css
========================================================= */
@import "tailwindcss";
@theme {
--color-space-dark: #070913;
--color-neon-cyan: #00f2fe;
}
/* Classe réutilisable imposée avec @apply */
.btn-control {
@apply bg-slate-800 hover:bg-slate-700 text-slate-200 font-bold px-3.5 py-1.5 rounded-xl border border-slate-700 text-xs transition duration-200 active:scale-95 cursor-pointer flex items-center gap-2 backdrop-blur-sm shadow-md;
}
/* =========================================================
FICHIER : index.html (Correction Intégrale)
========================================================= */
<!DOCTYPE html>
<html lang="fr" class="h-full">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AeroSpace Control Center 360°</title>
<link rel="stylesheet" href="./dist/output.css">
</head>
<body class="bg-space-dark text-slate-100 font-sans min-h-screen antialiased selection:bg-neon-cyan selection:text-black p-4 md:p-8">
<!-- Wrapper Global Dashboard -->
<div class="bg-slate-950 text-slate-100 font-sans rounded-2xl p-4 md:p-8 shadow-2xl border border-slate-800">
<div class="flex flex-col lg:flex-row gap-6 min-h-[700px]">
<!-- SIDEBAR NAVIGATION ENRICHIE -->
<aside class="w-full lg:w-64 bg-slate-900/80 border border-slate-800/90 rounded-2xl p-5 flex flex-col justify-between backdrop-blur-xl">
<div class="space-y-6">
<!-- Logo -->
<div class="flex items-center gap-3 pb-4 border-b border-slate-800">
<span class="text-2xl">🚀</span>
<div>
<h1 class="text-base font-black tracking-widest text-white uppercase leading-none">Aero<span class="text-neon-cyan">Space</span></h1>
<span class="text-[9px] font-mono text-slate-400">CORE OS v4.12.0</span>
</div>
</div>
<!-- Menu Navigation -->
<nav class="space-y-1.5">
<a href="#" class="flex items-center gap-3 bg-gradient-to-r from-cyan-500/20 to-indigo-500/10 text-neon-cyan px-3.5 py-2.5 rounded-xl font-medium text-xs border border-cyan-500/30 shadow-lg shadow-cyan-500/5">
<span>📊</span> Vue Générale 360°
</a>
<a href="#" class="flex items-center gap-3 text-slate-400 hover:bg-slate-800/60 hover:text-slate-200 px-3.5 py-2.5 rounded-xl font-medium text-xs transition">
<span>🛰️</span> Télémétrie Orbitale
</a>
<a href="#" class="flex items-center gap-3 text-slate-400 hover:bg-slate-800/60 hover:text-slate-200 px-3.5 py-2.5 rounded-xl font-medium text-xs transition">
<span>🔋</span> Réseaux & Énergie
</a>
<a href="#" class="flex items-center gap-3 text-slate-400 hover:bg-slate-800/60 hover:text-slate-200 px-3.5 py-2.5 rounded-xl font-medium text-xs transition">
<span>👨🚀</span> Équipage Orion-I
</a>
<a href="#" class="flex items-center gap-3 text-slate-400 hover:bg-slate-800/60 hover:text-slate-200 px-3.5 py-2.5 rounded-xl font-medium text-xs transition">
<span>🛡️</span> Dôme de Sécurité
</a>
</nav>
</div>
<!-- Card de Statut Widget Sidebar -->
<div class="mt-6 p-3.5 bg-rose-950/30 border border-rose-500/30 rounded-xl space-y-2">
<div class="flex justify-between items-center text-[10px] font-bold text-rose-400 uppercase tracking-wider">
<span>Réserve O₂ Globale</span>
<span class="animate-pulse">● STABLE</span>
</div>
<div class="text-xl font-black font-mono text-white">84.2 <span class="text-xs text-rose-300">HRS</span></div>
<div class="w-full bg-slate-900 h-1.5 rounded-full overflow-hidden">
<div class="bg-gradient-to-r from-amber-500 to-rose-500 h-full w-[74%]"></div>
</div>
<p class="text-[9px] text-slate-400">Recyclage automatique actif (Module B)</p>
</div>
</aside>
<!-- CONTENU PRINCIPAL DENSE -->
<main class="flex-1 space-y-6">
<!-- TOPBAR AVANCÉE -->
<header class="flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4 pb-4 border-b border-slate-800">
<div>
<div class="flex items-center gap-2">
<h2 class="text-xl font-black text-white tracking-tight">Cockpit Principal — Mission Orion Alpha-9</h2>
<span class="bg-indigo-900/60 text-indigo-300 text-[10px] font-bold px-2 py-0.5 rounded border border-indigo-500/30">SECTEUR G-42</span>
</div>
<p class="text-xs text-slate-400 mt-0.5 font-mono">Coordonnées : RA 05h 35m / Dec -05° 23' • Altitude ISS : 408.4 km</p>
</div>
<div class="flex items-center gap-3">
<span class="text-[11px] font-mono text-neon-cyan bg-cyan-950/60 px-3 py-1.5 rounded-full border border-cyan-500/30 animate-pulse shadow-[0_0_15px_rgba(0,242,254,0.15)]">
● SYSTEM ONLINE (1.2ms)
</span>
<button class="btn-control">
Exporter Logs
</button>
</div>
</header>
<!-- 1. GRILLE DES 3 CARTES VIBRANTES HIGH-DESIGN -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-5">
<!-- CARTE 1 : Météo / Environnement Thermal -->
<div class="bg-gradient-to-br from-sky-600 via-teal-700 to-slate-950 text-white rounded-3xl p-5 shadow-2xl relative overflow-hidden border border-sky-400/40">
<div class="absolute -right-10 -top-10 w-32 h-32 bg-sky-300/20 rounded-full blur-2xl"></div>
<div class="flex justify-between items-start mb-4">
<div>
<span class="bg-black/30 text-sky-200 text-[9px] font-bold px-2 py-0.5 rounded-full border border-sky-300/30 uppercase tracking-widest block w-max mb-1">Station ISS • Ombre</span>
<h5 class="text-base font-bold">Environnement Thermal</h5>
</div>
<span class="text-3xl">🌍</span>
</div>
<div class="mb-3 flex items-baseline gap-2">
<span class="text-4xl font-black font-mono tracking-tight">-120°C</span>
<span class="text-xs text-sky-200 font-medium">Cadence nominale</span>
</div>
<div class="grid grid-cols-2 border-t border-white/15 pt-3 text-[10px] text-sky-100 gap-2">
<div><span class="block text-slate-300">Vitesse Orbitale</span><strong class="font-mono text-xs">7.66 km/s</strong></div>
<div><span class="block text-slate-300">Radiation Solaire</span><strong class="font-mono text-xs text-emerald-300">0.12 mSv/h</strong></div>
</div>
</div>
<!-- CARTE 2 : Moniteur Télémétrie O₂ -->
<div class="bg-gradient-to-br from-indigo-900 via-slate-900 to-purple-950 text-white rounded-3xl p-5 shadow-2xl relative overflow-hidden border border-indigo-500/40">
<div class="absolute -left-10 -bottom-10 w-32 h-32 bg-indigo-500/20 rounded-full blur-2xl"></div>
<div class="flex justify-between items-center mb-3">
<div class="flex items-center gap-2">
<span class="w-2.5 h-2.5 bg-neon-cyan rounded-full animate-ping"></span>
<h5 class="text-xs font-bold text-indigo-200 uppercase tracking-wider">Taux Oxygène O₂</h5>
</div>
<span class="text-2xl">🫁</span>
</div>
<div class="flex justify-between items-end mb-2">
<span class="text-4xl font-black font-mono text-neon-cyan tracking-tight">98.4<span class="text-xl text-indigo-300">%</span></span>
<span class="text-[10px] text-emerald-400 font-bold bg-emerald-950/80 px-2 py-0.5 rounded border border-emerald-500/30">+0.2% nom.</span>
</div>
<!-- Jauge Lumineuse neon-cyan -->
<div class="w-full bg-slate-950/80 h-2.5 rounded-full overflow-hidden p-0.5 border border-indigo-500/30 mb-3">
<div class="bg-gradient-to-r from-indigo-500 to-neon-cyan h-full rounded-full shadow-[0_0_10px_rgba(0,242,254,0.8)]" style="width: 98.4%"></div>
</div>
<div class="flex justify-between text-[10px] text-slate-300 border-t border-indigo-500/20 pt-2.5">
<span>Pression : <strong class="text-white font-mono">1.013 bar</strong></span>
<span>CO₂ : <strong class="text-emerald-400 font-mono">0.04%</strong></span>
</div>
</div>
<!-- CARTE 3 : Profile Card Commandant -->
<div class="bg-slate-900/90 text-white rounded-3xl p-5 shadow-2xl relative overflow-hidden border border-rose-500/30 backdrop-blur-xl flex flex-col justify-between">
<div class="absolute -right-6 -bottom-6 w-24 h-24 bg-rose-500/15 rounded-full blur-2xl"></div>
<div class="flex items-center gap-3.5 mb-3">
<div class="relative">
<img src="https://images.unsplash.com/photo-1534528741775-53994a69daeb?auto=format&fit=crop&w=150&q=80" alt="Commander Avatar" class="w-11 h-11 rounded-2xl object-cover border-2 border-rose-500/60 shadow-md">
<span class="absolute -bottom-1 -right-1 w-3 h-3 bg-emerald-500 border-2 border-slate-900 rounded-full"></span>
</div>
<div>
<h5 class="text-sm font-bold text-white leading-tight">Cmdt. Sarah Connor</h5>
<p class="text-[10px] text-rose-300 font-mono">Badge #8849-ORION</p>
</div>
</div>
<div class="bg-slate-950/70 rounded-xl p-2.5 border border-slate-800 flex justify-around text-center">
<div>
<span class="block text-[9px] text-slate-400 uppercase font-bold">Missions</span>
<span class="text-xs font-black font-mono text-white">14</span>
</div>
<div class="border-x border-slate-800 px-3">
<span class="block text-[9px] text-slate-400 uppercase font-bold">Sorties EVA</span>
<span class="text-xs font-black font-mono text-white">128h</span>
</div>
<div>
<span class="block text-[9px] text-slate-400 uppercase font-bold">Santé</span>
<span class="text-xs font-black font-mono text-emerald-400">100%</span>
</div>
</div>
</div>
</div>
<!-- 2. SECTION COMPLEXE : TABLEAU DE TÉLÉMÉTRIE & CONSOLE DE LOGS -->
<div class="grid grid-cols-1 lg:grid-cols-3 gap-5">
<!-- Tableau de Télémétrie Avancé -->
<div class="lg:col-span-2 bg-slate-900/80 border border-slate-800 rounded-2xl p-5 space-y-4">
<div class="flex justify-between items-center">
<h3 class="text-sm font-bold text-white flex items-center gap-2">
<span>⚡</span> Télémétrie des Sous-Systèmes Critiques
</h3>
<span class="text-[10px] font-mono text-slate-400 bg-slate-800 px-2 py-0.5 rounded">Rafraîchissement : 500ms</span>
</div>
<div class="overflow-x-auto">
<table class="w-full text-left text-xs font-sans">
<thead>
<tr class="text-slate-400 border-b border-slate-800 text-[10px] uppercase font-bold tracking-wider">
<th class="pb-2">Module</th>
<th class="pb-2">Paramètre</th>
<th class="pb-2">Valeur Temps Réel</th>
<th class="pb-2">Seuil Min/Max</th>
<th class="pb-2 text-right">Statut</th>
</tr>
</thead>
<tbody class="divide-y divide-slate-800/50 text-slate-300">
<tr>
<td class="py-2.5 font-bold text-white">Propulsion Ionique</td>
<td class="py-2.5 text-slate-400">Poussée Vectorielle</td>
<td class="py-2.5 font-mono text-neon-cyan font-bold">45.8 N</td>
<td class="py-2.5 font-mono text-slate-500 text-[10px]">40.0 - 50.0 N</td>
<td class="py-2.5 text-right"><span class="text-[10px] bg-emerald-950/80 text-emerald-400 px-2 py-0.5 rounded font-bold border border-emerald-500/30">● OPTIMAL</span></td>
</tr>
<tr>
<td class="py-2.5 font-bold text-white">Bouclier Thermique</td>
<td class="py-2.5 text-slate-400">Température Matrice</td>
<td class="py-2.5 font-mono text-amber-400 font-bold">412.5 °C</td>
<td class="py-2.5 font-mono text-slate-500 text-[10px]">< 850.0 °C</td>
<td class="py-2.5 text-right"><span class="text-[10px] bg-emerald-950/80 text-emerald-400 px-2 py-0.5 rounded font-bold border border-emerald-500/30">● NORMAL</span></td>
</tr>
<tr>
<td class="py-2.5 font-bold text-white">Générateur RTG</td>
<td class="py-2.5 text-slate-400">Charge Matrice Thêta</td>
<td class="py-2.5 font-mono text-rose-400 font-bold">74.2%</td>
<td class="py-2.5 font-mono text-slate-500 text-[10px]">> 50.0%</td>
<td class="py-2.5 text-right"><span class="text-[10px] bg-amber-950/80 text-amber-400 px-2 py-0.5 rounded font-bold border border-amber-500/30">▲ RECHARGE</span></td>
</tr>
<tr>
<td class="py-2.5 font-bold text-white">Réseau K-Band</td>
<td class="py-2.5 text-slate-400">Débit UPLINK</td>
<td class="py-2.5 font-mono text-neon-cyan font-bold">12.4 Gbps</td>
<td class="py-2.5 font-mono text-slate-500 text-[10px]">> 10.0 Gbps</td>
<td class="py-2.5 text-right"><span class="text-[10px] bg-emerald-950/80 text-emerald-400 px-2 py-0.5 rounded font-bold border border-emerald-500/30">● LOCKED</span></td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- Terminal Live Logs Console -->
<div class="bg-slate-900/80 border border-slate-800 rounded-2xl p-5 space-y-3 font-mono flex flex-col justify-between">
<div>
<div class="flex justify-between items-center pb-2 border-b border-slate-800 mb-3">
<h3 class="text-xs font-bold text-white flex items-center gap-2">
<span>📜</span> Journal d'Événements
</h3>
<span class="w-2 h-2 rounded-full bg-emerald-400 animate-pulse"></span>
</div>
<div class="space-y-2 text-[10px]">
<div class="text-slate-400"><span class="text-neon-cyan">[16:40:12]</span> Core system check verified.</div>
<div class="text-slate-400"><span class="text-neon-cyan">[16:40:08]</span> Orbital alignment complete: pitch +0.02°.</div>
<div class="text-slate-400"><span class="text-neon-cyan">[16:39:45]</span> Solar array efficiency at 96.1%.</div>
<div class="text-slate-400"><span class="text-neon-cyan">[16:38:22]</span> Sync with Control Ground Center (ESTEC).</div>
<div class="text-slate-400"><span class="text-neon-cyan">[16:35:10]</span> O₂ scrubbers cycle #4401 initiated.</div>
</div>
</div>
<div class="pt-3 border-t border-slate-800">
<input type="text" placeholder="Entrer une commande CLI..." class="w-full bg-slate-950 border border-slate-800 rounded-lg px-3 py-1.5 text-[10px] text-neon-cyan focus:outline-none focus:border-cyan-500 font-mono">
</div>
</div>
</div>
</main>
</div>
</div>
</body>
</html>