[Nom du Layout]
Type de ressource : Layout Astro (Gabarit de page)
Fichier source :src/layouts/[NomLayout].astro
Statut : [Actif / Déprécié / En développement]
1. Vue dâoverview
Section titled â1. Vue dâoverviewâ1.1. Description
Section titled â1.1. Descriptionâ[Description concise du rĂŽle de ce layout dans lâarchitecture du site]
1.2. Objectif
Section titled â1.2. Objectifâ- [Objectif principal : ex. fournir la structure HTML globale pour les pages de blog]
- [BĂ©nĂ©fice pour lâarchitecture : ex. cohĂ©rence visuelle + SEO centralisĂ©]
1.3. PérimÚtre concerné
Section titled â1.3. PĂ©rimĂštre concernĂ©â- Type de pages : [Blog / Portfolio / Vitrine / Documentation / Toutes]
- Mode de rendu : [SSG / SSR / Les deux]
- Consommateurs : [Liste des pages qui utilisent ce layout]
2. Architecture et structure
Section titled â2. Architecture et structureâ2.1. Diagramme de flux
Section titled â2.1. Diagramme de fluxâ[Page Astro] â (import du layout) âŒ[Layout] â âą Structure HTML globale â âą Injection des mĂ©tadonnĂ©es SEO â âą Inclusion des composants globaux (Header, Footer) â âą Gestion des slots de contenu âŒ[HTML final]2.2. Composants impliquĂ©s
Section titled â2.2. Composants impliquĂ©sâ| Composant | RĂŽle | Fichier |
|---|---|---|
| Layout parent | Structure HTML de base | src/layouts/BaseLayout.astro (si applicable) |
| Header | Navigation globale | src/components/ui/Header.astro |
| Footer | Pied de page global | src/components/ui/Footer.astro |
| SEO Component | Injection des balises meta | src/components/seo/SeoJsonLd.astro |
| Slot de contenu | Zone de contenu dynamique | <slot /> |
3. Implémentation
Section titled â3. ImplĂ©mentationâ3.1. Code du layout
Section titled â3.1. Code du layoutâ---import BaseLayout from './BaseLayout.astro';import Header from '../components/ui/Header.astro';import Footer from '../components/ui/Footer.astro';import SeoJsonLd from '../components/seo/SeoJsonLd.astro';
interface Props { title: string; description?: string; ogImage?: string; canonical?: string; jsonLd?: object;}
const { title, description, ogImage, canonical = Astro.url.href, jsonLd} = Astro.props;---
<BaseLayout title={title} description={description} ogImage={ogImage} canonical={canonical}> <Header />
<main id="main-content"> <slot /> </main>
<Footer />
{jsonLd && <SeoJsonLd data={jsonLd} />}</BaseLayout>3.2. Variante : Layout avec sidebar
Section titled â3.2. Variante : Layout avec sidebarâ---import BaseLayout from './BaseLayout.astro';import Header from '../components/ui/Header.astro';import Footer from '../components/ui/Footer.astro';import Sidebar from '../components/ui/BlogSidebar.astro';
interface Props { title: string; description?: string; publishedAt?: string; author?: { name: string; image?: string; };}
const { title, description, publishedAt, author } = Astro.props;---
<BaseLayout title={title} description={description}> <Header />
<div class="blog-layout"> <article class="blog-content"> <header class="blog-header"> <h1>{title}</h1> {publishedAt && ( <time datetime={publishedAt}> {new Date(publishedAt).toLocaleDateString('fr-FR')} </time> )} {author && ( <div class="author"> {author.image && <img src={author.image} alt={author.name} />} <span>{author.name}</span> </div> )} </header>
<slot /> </article>
<Sidebar /> </div>
<Footer /></BaseLayout>
<style> .blog-layout { display: grid; grid-template-columns: 1fr 300px; gap: 2rem; max-width: 1200px; margin: 0 auto; padding: 2rem; }
@media (max-width: 768px) { .blog-layout { grid-template-columns: 1fr; } }</style>3.3. Variante : Layout Base (structure minimale)
Section titled â3.3. Variante : Layout Base (structure minimale)â---interface Props { title: string; description?: string; ogImage?: string; canonical?: string;}
const { title, description, ogImage = '/images/default-og.jpg', canonical = Astro.url.href} = Astro.props;---
<!DOCTYPE html><html lang="fr"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="generator" content={Astro.generator} />
<!-- SEO Meta Tags --> <title>{title}</title> {description && <meta name="description" content={description} />} <link rel="canonical" href={canonical} />
<!-- Open Graph --> <meta property="og:type" content="website" /> <meta property="og:title" content={title} /> {description && <meta property="og:description" content={description} />} <meta property="og:image" content={ogImage} /> <meta property="og:url" content={canonical} />
<!-- Twitter Card --> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:title" content={title} /> {description && <meta name="twitter:description" content={description} />} <meta name="twitter:image" content={ogImage} />
<!-- Favicon --> <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<!-- Styles --> <link rel="stylesheet" href="/styles/global.css" />
<!-- Analytics (si applicable) --> <!-- Cloudflare Web Analytics ou autre --> </head> <body> <slot /> </body></html>4. Props et interface
Section titled â4. Props et interfaceâ4.1. Props obligatoires
Section titled â4.1. Props obligatoiresâ| Prop | Type | Description | Exemple |
|---|---|---|---|
title |
string |
Titre de la page (utilisé pour <title> et OG) |
"Mon article de blog" |
4.2. Props optionnelles
Section titled â4.2. Props optionnellesâ| Prop | Type | Description | Valeur par dĂ©faut |
|---|---|---|---|
description |
string |
Meta description | undefined |
ogImage |
string |
URL de lâimage Open Graph | '/images/default-og.jpg' |
canonical |
string |
URL canonique | Astro.url.href |
jsonLd |
object |
Données JSON-LD pour le structured data | undefined |
| [Autre prop] | [Type] | [Description] | [Valeur] |
4.3. Slots
Section titled â4.3. Slotsâ| Slot | Description | Obligatoire |
|---|---|---|
default |
Contenu principal de la page | â |
sidebar |
Contenu de la sidebar (si applicable) | â |
head |
Contenu supplémentaire dans <head> |
â |
5. SEO et métadonnées
Section titled â5. SEO et mĂ©tadonnĂ©esâ5.1. Balises meta injectĂ©es
Section titled â5.1. Balises meta injectĂ©esâ| Balise | Source | Fallback |
|---|---|---|
<title> |
props.title |
- |
<meta name="description"> |
props.description |
- |
<link rel="canonical"> |
props.canonical |
Astro.url.href |
<meta property="og:title"> |
props.title |
- |
<meta property="og:description"> |
props.description |
- |
<meta property="og:image"> |
props.ogImage |
Image par défaut |
<meta property="og:url"> |
props.canonical |
Astro.url.href |
5.2. Structured Data (JSON-LD)
Section titled â5.2. Structured Data (JSON-LD)â{jsonLd && ( <script type="application/ld+json" set:html={JSON.stringify(jsonLd)} />)}Types de JSON-LD supportĂ©s :
Organization(global)WebSite+SearchActionArticle/BlogPostingCreativeWork/Project
5.3. RĂšgles de fallback
Section titled â5.3. RĂšgles de fallbackâ- â
titleest toujours obligatoire - â
descriptionutilise un fallback intelligent depuis les donnĂ©es Sanity si disponible - â
ogImageutilise lâimage principale du contenu si non spĂ©cifiĂ©e - â
canonicalest toujours généré automatiquement
6. Accessibilité (a11y)
Section titled â6. AccessibilitĂ© (a11y)â6.1. Structure sĂ©mantique
Section titled â6.1. Structure sĂ©mantiqueâ<body> <a href="#main-content" class="skip-link">Aller au contenu principal</a>
<Header />
<main id="main-content"> <slot /> </main>
<Footer /></body>6.2. RĂšgles dâaccessibilitĂ©
Section titled â6.2. RĂšgles dâaccessibilitĂ©â- â Skip link vers le contenu principal
- â
Structure HTML sémantique (
<header>,<main>,<footer>,<article>) - â
Attribut
lang="fr"sur<html> - â Focus visible sur tous les Ă©lĂ©ments interactifs
- â Contraste WCAG AA minimum
- â Navigation clavier complĂšte
7. Styles et design system
Section titled â7. Styles et design systemâ7.1. Utilisation des design tokens
Section titled â7.1. Utilisation des design tokensâ/* Le layout utilise les design tokens dĂ©finis dans tokens.css */.blog-layout { max-width: var(--container-max-width, 1200px); margin: 0 auto; padding: var(--spacing-lg, 2rem); font-family: var(--font-family-base); color: var(--color-text-primary); background-color: var(--color-bg-primary);}7.2. Responsive design
Section titled â7.2. Responsive designâ/* Mobile-first approach */.blog-layout { display: grid; grid-template-columns: 1fr; gap: var(--spacing-md, 1rem);}
/* Tablet */@media (min-width: 768px) { .blog-layout { grid-template-columns: 1fr 300px; gap: var(--spacing-lg, 2rem); }}
/* Desktop */@media (min-width: 1024px) { .blog-layout { max-width: var(--container-max-width, 1200px); }}7.3. Mode sombre (si applicable)
Section titled â7.3. Mode sombre (si applicable)â/* Support du mode sombre via prefers-color-scheme */@media (prefers-color-scheme: dark) { :root { --color-bg-primary: var(--color-gray-9); --color-text-primary: var(--color-gray-1); }}
/* Ou via classe manuelle */[data-theme="dark"] { --color-bg-primary: var(--color-gray-9); --color-text-primary: var(--color-gray-1);}8. Composants globaux inclus
Section titled â8. Composants globaux inclusâ8.1. Header
Section titled â8.1. Headerâ| Composant | RĂŽle | Hydratation |
|---|---|---|
Header.astro |
Navigation globale, logo, menu | Aucune |
MobileNav.astro |
Menu mobile interactif | client:load |
8.2. Footer
Section titled â8.2. Footerâ| Composant | RĂŽle | Hydratation |
|---|---|---|
Footer.astro |
Liens, copyright, réseaux sociaux | Aucune |
8.3. Autres composants globaux
Section titled â8.3. Autres composants globauxâ| Composant | RĂŽle | Hydratation |
|---|---|---|
SeoJsonLd.astro |
Injection du structured data | Aucune |
Analytics.astro |
Scripts analytics (si applicable) | client:load |
| [Autre] | [RÎle] | [Stratégie] |
9. Intégration avec les pages
Section titled â9. IntĂ©gration avec les pagesâ9.1. Utilisation dans une page SSG
Section titled â9.1. Utilisation dans une page SSGâ---import BlogLayout from '../../layouts/BlogLayout.astro';import { getSanityClient } from '../../lib/sanity';
export async function getStaticPaths() { // ... génération des chemins}
const { slug } = Astro.params;const post = await getSanityClient(Astro).fetch(/* ... */);---
<BlogLayout title={post.title} description={post.excerpt} publishedAt={post.publishedAt} author={post.author}> <!-- Contenu de l'article --></BlogLayout>9.2. Utilisation dans une page SSR
Section titled â9.2. Utilisation dans une page SSRâ---import MainLayout from '../layouts/MainLayout.astro';
export const prerender = false;
// Logique SSR...---
<MainLayout title="Contact" description="Formulaire de contact"> <!-- Contenu de la page --></MainLayout>9.3. Pages utilisant ce layout
Section titled â9.3. Pages utilisant ce layoutâ| Page | Fichier | Mode |
|---|---|---|
| [Nom de la page] | src/pages/[chemin].astro |
[SSG/SSR] |
| [Autre page] | src/pages/[chemin].astro |
[SSG/SSR] |
10. Performance et optimisation
Section titled â10. Performance et optimisationâ10.1. Optimisations appliquĂ©es
Section titled â10.1. Optimisations appliquĂ©esâ- â HTML statique par dĂ©faut (pas de JavaScript sauf si nĂ©cessaire)
- â Images optimisĂ©es (WebP/AVIF via Cloudflare)
- â CSS minimal et critique inline (si applicable)
- â Fonts prĂ©chargĂ©es (si applicable)
- â Pas de JavaScript bloquant sur le chemin critique
10.2. Core Web Vitals
Section titled â10.2. Core Web Vitalsâ| MĂ©trique | Objectif | StratĂ©gie |
|---|---|---|
| LCP | < 2.5s | Images optimisées, fonts préchargées |
| INP | < 200ms | JavaScript minimal, ßlots ciblés |
| CLS | < 0.1 | Dimensions explicites, fonts stables |
10.3. Cache
Section titled â10.3. Cacheâ| Type | Cache-Control | Rationale |
|---|---|---|
| HTML (SSG) | public, max-age=31536000, immutable |
Contenu statique |
| HTML (SSR) | public, max-age=60 |
Contenu semi-dynamique |
| CSS/JS | public, max-age=31536000, immutable |
Assets versionnés |
11. Débogage et troubleshooting
Section titled â11. DĂ©bogage et troubleshootingâ11.1. ProblĂšmes courants
Section titled â11.1. ProblĂšmes courantsâ| SymptĂŽme | Cause probable | Solution |
|---|---|---|
| Layout non appliquĂ© | Import incorrect | VĂ©rifier le chemin dâimport |
| SEO manquant | Props non passées | Vérifier les props obligatoires |
| Styles cassĂ©s | Conflit CSS | VĂ©rifier les spĂ©cificitĂ©s et lâordre |
| Accessibilité dégradée | Structure HTML incorrecte | Valider avec axe-core |
| Performance dégradée | JavaScript inutile | Vérifier les hydratations |
11.2. Tests manuels
Section titled â11.2. Tests manuelsâ# Test localnpm run dev
# Vérification de l'accessibiliténpx axe http://localhost:4321/
# Vérification des performancesnpx lighthouse http://localhost:4321/
# Validation HTMLnpx html-validate src/pages/[page].astro11.3. Logs et monitoring
Section titled â11.3. Logs et monitoringâ# Logs de buildnpm run build -- --verbose
# Vérification des typesnpx astro check12. Bonnes pratiques
Section titled â12. Bonnes pratiquesâ12.1. Architecture
Section titled â12.1. Architectureâ- â
Centraliser la structure HTML globale dans un
BaseLayout - â CrĂ©er des layouts spĂ©cialisĂ©s pour chaque type de contenu (Blog, Portfolio, etc.)
- â Utiliser des slots pour la flexibilitĂ©
- â Injecter les mĂ©tadonnĂ©es SEO de maniĂšre centralisĂ©e
- â Respecter la structure sĂ©mantique HTML
12.2. Code
Section titled â12.2. Codeâ- â Typer les props avec TypeScript
- â Utiliser des valeurs par dĂ©faut pour les props optionnelles
- â Valider les props obligatoires
- â Utiliser les design tokens pour les styles
- â SĂ©parer le CSS scoped du CSS global
12.3. Maintenance
Section titled â12.3. Maintenanceâ- â Documenter les props et slots dans ce fichier
- â Tester lâaccessibilitĂ© rĂ©guliĂšrement
- â VĂ©rifier les performances avec Lighthouse
- â Mettre Ă jour les layouts lors des changements de design
13. Ăvolutions et roadmap
Section titled â13. Ăvolutions et roadmapâ13.1. AmĂ©liorations planifiĂ©es
Section titled â13.1. AmĂ©liorations planifiĂ©esâ- [Ăvolution 1 : ex. Support du mode sombre]
- [Ăvolution 2 : ex. Ajout dâun breadcrumbs automatique]
- [Ăvolution 3 : ex. IntĂ©gration de View Transitions]
13.2. Limitations connues
Section titled â13.2. Limitations connuesâ- â Les layouts ne peuvent pas ĂȘtre hydratĂ©s (pas de JavaScript cĂŽtĂ© layout)
- â Les slots ne supportent pas les props (utiliser des contextes si nĂ©cessaire)
- â Les layouts imbriquĂ©s peuvent compliquer la maintenance
14. Ressources liées
Section titled â14. Ressources liĂ©esâ- Documentation Astro : Layouts
- Documentation Astro : Slots
- DAT L2 : §3 - Structure de lâEspace de Travail
- DAT L2 : §10 - Stratégie SEO
- DAT L2 : §11 - Accessibilité
- DAT L2 : §12 - Design System
- Layouts associés :
src/layouts/BaseLayout.astrosrc/layouts/MainLayout.astrosrc/layouts/BlogLayout.astro
- Composants utilisés :
src/components/ui/Header.astrosrc/components/ui/Footer.astrosrc/components/seo/SeoJsonLd.astro
15. Historique des modifications
Section titled â15. Historique des modificationsâ| Date | Version | Description | Auteur |
|---|---|---|---|
| YYYY-MM-DD | 1.0 | Création initiale | [Nom] |
| YYYY-MM-DD | 1.1 | [Modification] | [Nom] |
---
**Points clés de ce template :**- Documente la structure HTML globale et les slots- Détaille les props et leur typage TypeScript- Inclut la gestion centralisée du SEO (meta tags, JSON-LD)- Couvre l'accessibilité (structure sémantique, skip link)- Fournit l'intégration avec le design system (tokens CSS)- Sépare clairement les layouts de base et les layouts spécialisés- Inclut les bonnes pratiques de performance et de maintenance