Quand utiliser
- L'utilisateur souhaite une nouvelle landing page (produit, service, événement, portfolio, waitlist)
- Il veut redessiner une landing existante pour qu'elle soit professionnelle et unique
- Il demande des animations, des effets de défilement ou des micro-interactions sur une page marketing
- Il est en phase de planification : quelles sections, quel message, quelle structure
Stack (et pourquoi)
| Pièce | Choix | Pourquoi | Alternative écartée |
|---|---|---|---|
| Framework | Astro 5 | Statique par défaut (0 JS de base), composants, astro:assets pour les images, déploiement = upload du dossier dist/ | Next.js (overkill pour une landing, déploiement plus complexe), HTML brut (sans composants ni optimisation) |
| Styles | Tailwind CSS v4 | Tokens personnalisés via @theme en CSS, sans config JS, purge automatique | Kits UI (shadcn/DaisyUI/Flowbite → look générique), CSS pur (lent pour itérer) |
| Animation | GSAP 3.13+ (ScrollTrigger, SplitText) | Standard de l'industrie pour le défilement/timeline ; depuis v3.13 TOUS les plugins sont gratuits | Framer Motion (lié à React), AOS (limité, se voit "de template") |
| Défilement fluide | Lenis | Léger (~4kb), intégration documentée avec ScrollTrigger | Locomotive Scroll (plus lourd, moins maintenu) |
| Déploiement | Netlify / Cloudflare Pages / Vercel | Connecter le repo → push → déploiement ; sortie statique sans serveur | VPS (inutile pour du statique) |
Règle stricte : NE PAS installer de bibliothèques de composants UI. Le design est propre — c'est exactement ce qui distingue cette compétence d'un template.
Workflow (obligatoire, dans cet ordre)
Ne JAMAIS commencer par le code. Une landing sans brief est un template avec un autre nom.
- Brief — remplir assets/brief-template.md AVEC l'utilisateur. Si l'objectif, l'audience ou l'appel à l'action manquent : DEMANDER avant de continuer.
- Direction artistique — suivre references/design-direction.md : personnalité → typographie → couleur → layout → signature visuelle. La matérialiser dans assets/design-tokens.css.
- Architecture des sections — définir l'arc narratif (tableau ci-dessous) et le copy des titres avant de maquetter.
- Construction — section par section, mobile-first (390px d'abord). Animations avec references/animation-recipes.md.
- Audit — checklist de livraison (ci-dessous). Ne pas livrer sans l'avoir passée.
- Déploiement — build statique + hébergement (commandes ci-dessous).
Arc narratif (structure de base)
| # | Section | Travail qu'elle effectue |
|---|---|---|
| 1 | Hero | Proposition de valeur compréhensible en <5s + CTA primaire |
| 2 | Problème / contexte | Nomme la douleur que le visiteur reconnaît |
| 3 | Solution / bénéfices | Comment tu la résous — bénéfices, pas fonctionnalités |
| 4 | Preuve sociale | Témoignages réels, logos, métriques |
| 5 | Comment ça marche | Étapes, démo, captures d'écran |
| 6 | Objections | FAQ, garantie, prix |
| 7 | CTA final | Répète la MÊME action unique du hero |
Adapte, fusionne ou supprime des sections selon le brief — toutes les landings n'ont pas les 7.
Patterns critiques
- Une seule conversion : toute la page pousse vers UNE action. Deux CTA distincts = brief mal fait.
- Mobile-first réel : on conçoit et construit d'abord à 390px ; desktop est la progression, pas l'inverse.
- LCP intouchable : l'élément LCP (titre ou image du hero) n'est jamais en
opacity: 0en CSS. Les entrées se font avecgsap.from()(sans JS la page s'affiche complète) et durent ≤ 1s au total. prefers-reduced-motion: TOUTE animation vit à l'intérieur degsap.matchMedia(). Sans exception.- Îles minimales : JS uniquement là où il y a une interaction réelle. Un accordéon FAQ est un
<details>, pas un composant hydraté. - Images : toujours
astro:assets(<Image>), AVIF/WebP, dimensions explicites,loading="lazy"sauf le hero. - Polices : auto-hébergées (woff2 local ou Fontsource),
font-display: swap, maximum 2 familles, préchargement de la police d'affichage.
Checklist avant de livrer
- Lighthouse mobile ≥ 95 en Performance, Accessibilité et SEO
- CLS = 0 (dimensions sur les images, fallback de police ajusté)
- Animations désactivées avec
prefers-reduced-motion: reduce - Contraste AA : 4.5:1 pour le texte, 3:1 pour l'interface large
- Navigable au clavier, focus visible, un seul
h1 - Meta description, balises OG, favicon, titre unique
- Testée à 390px, 768px et 1440px
- Test de la marque : en cachant le logo, la page pourrait-elle être celle d'une autre entreprise ? Si oui → retour à la phase 2
Commandes
# Créer le projet
pnpm create astro@latest ma-landing -- --template minimal --typescript strict
cd ma-landing
pnpm astro add tailwind
pnpm add gsap lenis
# Développement et build
pnpm dev
pnpm build && pnpm preview
# Déploiement (choisis un ; sur Netlify/Vercel/Cloudflare : build "pnpm build", output "dist")
npx wrangler pages deploy dist # Cloudflare Pages direct
npx netlify deploy --prod --dir=dist # Netlify direct
Ressources
- Templates : assets/brief-template.md — questionnaire de planification ; assets/design-tokens.css — base du système de design propre (Tailwind v4
@theme) - Guides : references/design-direction.md — direction artistique anti-générique ; references/animation-recipes.md — recettes GSAP/ScrollTrigger/Lenis prêtes à être adaptées