1. Créer un thème
Structure et fichiers de base d’un thème. Voir →
This content is not available in your language yet.
À la fin de cette étape, vous serez capable de :
# Node.js et npm (pour Tailwind/Alpine)node --version # >= 18.xnpm --version # >= 9.x
# Composer (pour dépendances Drupal)composer --version # >= 2.x
# Drushdrush --version # >= 12.x# Sauvegarder la base de données avant modificationsdrush sql:dump > backup-avant-etape6.sql
# En cas de problème, restaurer avec :# drush sql:cli < backup-avant-etape6.sql# Désactiver le cache pour voir les modifications en temps réeldrush state:set system.performance css_preprocess 0 --input-format=stringdrush state:set system.performance js_preprocess 0 --input-format=stringdrush crApproche progressive : Nous suivrons une méthodologie logique — d’abord la structure du thème, puis les outils (CSS/JS), ensuite les templates Twig pour personnaliser l’affichage, et enfin l’interactivité avec Alpine.js.
1. Créer un thème
Structure et fichiers de base d’un thème. Voir →
2. Templates Twig
Personnaliser l’affichage avec Twig. Voir →
3. Assets (CSS/JS)
Ajouter des librairies CSS et JavaScript. Voir →
4. Tailwind CSS
Intégrer Tailwind CSS v4 dans Drupal. Voir →
5. Alpine.js
Ajouter des interactions dynamiques. Voir →
themes/custom/tailstore/├── tailstore.info.yml # Déclaration du thème├── tailstore.libraries.yml # CSS et JS├── tailstore.theme # Fonctions PHP├── tailstore.breakpoints.yml # Points de rupture responsive│├── css/│ ├── base/│ │ ├── reset.css│ │ └── typography.css│ ├── components/│ │ ├── buttons.css│ │ ├── cards.css│ │ ├── forms.css│ │ └── navigation.css│ ├── layout/│ │ ├── grid.css│ │ └── regions.css│ └── tailstore.css # Import principal│├── js/│ ├── tailstore.js # Scripts principaux│ ├── cart.js # Panier│ └── slider.js # Carousel│├── images/│ ├── logo.svg│ └── icons/│├── templates/│ ├── layout/│ │ ├── page.html.twig│ │ └── region.html.twig│ ├── block/│ │ ├── block.html.twig│ │ └── block--system-branding-block.html.twig│ ├── node/│ │ ├── node.html.twig│ │ ├── node--product.html.twig│ │ ├── node--product--teaser.html.twig│ │ └── node--product--card.html.twig│ ├── field/│ │ └── field--field-price.html.twig│ ├── views/│ │ └── views-view--products-catalog.html.twig│ └── misc/│ ├── pager.html.twig│ └── breadcrumb.html.twig│└── config/ └── install/ └── tailstore.settings.yml💡 Pourquoi des tokens ?
| Variable | Hex | Usage |
|---|---|---|
--color-primary | #0073e6 | Actions principales |
--color-secondary | #6c757d | Actions secondaires |
--color-success | #28a745 | Succès, en stock |
--color-warning | #ffc107 | Alertes |
--color-danger | #dc3545 | Erreurs, soldes |
--color-dark | #1a1a2e | Texte principal |
--color-light | #f8f9fa | Arrière-plans |
| Élément | Font | Size | Weight |
|---|---|---|---|
| H1 | Inter | 2.5rem | 700 |
| H2 | Inter | 2rem | 600 |
| H3 | Inter | 1.5rem | 600 |
| Body | Inter | 1rem | 400 |
| Small | Inter | 0.875rem | 400 |
| Price | Inter | 1.25rem | 700 |
--spacing-xs: 0.25rem; /* 4px */--spacing-sm: 0.5rem; /* 8px */--spacing-md: 1rem; /* 16px */--spacing-lg: 1.5rem; /* 24px */--spacing-xl: 2rem; /* 32px */--spacing-2xl: 3rem; /* 48px */# Désactiver l'agrégation CSS/JS via Drushdrush state:set system.performance css_preprocess 0 --input-format=stringdrush state:set system.performance js_preprocess 0 --input-format=stringActiver le débogage Twig dans sites/default/services.yml :
parameters: twig.config: debug: true auto_reload: true cache: false# Vider le cache après modificationdrush cr# Cache des templatesdrush cr
# Cache des CSS (si agrégation activée)drush cc css-js<!-- THEME DEBUG --><!-- THEME HOOK: 'node' --><!-- FILE NAME SUGGESTIONS: * node--product--full.html.twig * node--product.html.twig * node--1.html.twig * node.html.twig--><!-- BEGIN OUTPUT from 'themes/custom/tailstore/templates/node/node--product.html.twig' -->Stratégie : Commencer par les composants de base (header, footer), puis les éléments de contenu (produits), et enfin les interactions avancées (slider, panier dynamique).
| Priorité | Composant | Template | Difficulté | Étape | Temps |
|---|---|---|---|---|---|
| 🔴 1 | Header + Logo | block--system-branding-block.html.twig | ⭐ Facile | 6.1-6.2 | 30min |
| 🔴 2 | Footer | region--footer.html.twig | ⭐ Facile | 6.2 | 30min |
| 🔴 3 | Product Card | node--product--card.html.twig | ⭐⭐ Moyen | 6.2 | 1h |
| 🟠 4 | Product Teaser | node--product--teaser.html.twig | ⭐⭐ Moyen | 6.2 | 45min |
| 🟠 5 | Homepage Layout | page--front.html.twig | ⭐⭐ Moyen | 6.4 | 1h30 |
| 🟠 6 | Shop/Catalog | page--shop.html.twig | ⭐⭐ Moyen | 6.4 | 1h |
| 🟡 7 | Mega Menu | menu--main.html.twig | ⭐⭐⭐ Difficile | 6.5 | 2h |
| 🟡 8 | Hero Slider | block--hero-banner.html.twig | ⭐⭐⭐ Difficile | 6.5 | 2h |
| 🟢 9 | Cart Icon (dynamique) | block--cart-summary.html.twig | ⭐⭐⭐ Difficile | 6.5 | 1h30 |
| 🔵 10 | Fiche produit complète | node--product--full.html.twig | ⭐⭐⭐⭐ Expert | 6.2-6.5 | 2h |
Légende priorités :
Le thème suit une approche atomique pour une maintenabilité optimale :
.btn, .btn-primary, .btn-secondary.form-input, .form-select.icon, .icon--large1. Homepage → 2. Catalogue → 3. Fiche produit → 4. Panier → 5. Checkout → 6. Confirmation (page.html) (views) (node--product) (custom) (custom) (custom)Chaque étape nécessite des templates et styles spécifiques.
Symptôme : Modifications CSS/Twig non visibles dans le navigateur
Solution : drush cr après CHAQUE modification de template ou CSS
💡 Astuce : En mode dev avec cache: false, seul le cache de routing nécessite un flush
Problème : Conflits entre utility classes et CSS personnalisé
Bonne pratique : Utiliser Tailwind à 95%, CSS custom pour <5% des cas exceptionnels
Exemple valide : Animations complexes, reset CSS spécifique
Danger : Modifications perdues lors des mises à jour Drupal
Bonne pratique : TOUJOURS copier les templates dans themes/custom/tailstore/templates/
Jamais : Modifier directement dans core/themes/ ou modules/contrib/
Problème : node.html.twig s’applique à TOUS les types de contenu
Bonne pratique : Utiliser les suggestions spécifiques :
node--product--full.html.twig (type + mode d’affichage)node--product.html.twig (type de contenu)node.html.twig (trop large)Problème : Site cassé sur mobile/tablette
Bonne pratique : Tester sur plusieurs tailles (F12 → Toggle Device Toolbar)
Points de rupture Tailwind : sm: (640px), md: (768px), lg: (1024px), xl: (1280px)
Problème : 200KB de JS/CSS sur toutes les pages, même inutiles
Bonne pratique : Charger conditionnellement via hook_preprocess_HOOK()
Exemple : Slider JS uniquement sur la homepage
À la fin de l’étape 6, vous devrez avoir réalisé :
tailstore.info.yml et tailstore.libraries.yml✅ Fonctionnel : Le site affiche correctement tous les contenus
✅ Responsive : Mise en page adaptée mobile/tablette/desktop
✅ Performance : CSS < 100KB, pas de JS inutile chargé
✅ Code propre : Templates commentés, structure logique
✅ Debug désactivé : Pas de {{ dump() }} oublié dans les templates
Après chaque sous-étape, vérifiez :
| Sous-étape | Résultat visible |
|---|---|
| 6.1 Création thème | Thème activable dans l’admin, logo affiché |
| 6.2 Twig | Header et footer personnalisés visibles |
| 6.3 Assets | CSS chargé (inspecter le <head>) |
| 6.4 Tailwind | Classes Tailwind appliquées (ex: bg-blue-500 fonctionne) |
| 6.5 Alpine.js | Menu mobile ou interaction fonctionnelle |
Extensions VS Code recommandées :
Vous avez maintenant une vision complète de l’étape 6. Commencez par Créer le thème.