Skip to content

[Nom du Layout]

[Nom du Layout]

Documentation technique

Type de ressource : Layout Astro (Gabarit de page)
Fichier source : src/layouts/[NomLayout].astro
Statut : [Actif / Déprécié / En développement]
Slice : [Numéro de la tranche verticale]
Version : 1.0

1. Vue d’ensemble (DOC)

1.1. Description

[Description concise du rôle de ce layout dans l’architecture du site]

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é1/2

Type de pages Statut
Blog [✅/❌]
Portfolio [✅/❌]
Vitrine [✅/❌]
Documentation [✅/❌]
Toutes [✅/❌]

1.3. Périmètre concerné2/2

Mode de rendu Statut
SSG [✅/❌]
SSR [✅/❌]
Les deux [✅/❌]

2. Architecture et structure (DOC)

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

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 (CODE)

3.1. Code du layout1/2

3.1. Code du layout2/2

src/layouts/[NomLayout].astro
---
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}
}
<Header />
<main id="main-content">
<slot />
</main>
<Footer />
{jsonLd && <SeoJsonLd data={jsonLd} />}
</BaseLayout>

3.2. Variante : Layout avec sidebar

src/layouts/BlogLayout.astro
---
import BaseLayout from './BaseLayout.astro';
import Header from '../components/ui/Header.astro';
import Footer from '../components/ui/Footer.astro';
import Sidebar from '../components/ui/Sidebar.astro';
interface Props {
title: string;
description?: string;
}
const { title, description } = Astro.props;
---
<BaseLayout title={title} description={description}>
<Header />
<div class="flex">
<aside class="w-64">
<Sidebar />
</aside>
<main id="main-content" class="flex-1">
<slot />
</main>
</div>
<Footer />
</BaseLayout>

4. Contrats d’Entrée/Sortie (SPEC)

4.1. Inputs (Props)

Prop Type Obligatoire Validation
title string ✅ Non vide
description string ❌ Valeur par défaut
ogImage string ❌ URL valide
canonical string ❌ URL valide
jsonLd object ❌ Structure JSON-LD valide

4.2. Outputs (HTML)

Élément Type Description
HTML structure HTMLElement Structure HTML complète
Meta tags HTMLMetaElement Balises SEO
Slot content HTMLElement Contenu injecté

5. Tests attendus (TEST)

5.1. Tests unitaires

Scénario Description Résultat attendu
Rendu avec props Props valides Layout rendu correctement
Injection SEO Meta tags Balises injectées
Slot content Contenu injecté Slot rendu correctement

5.2. Tests d’intégration

Scénario Dépendances Description Résultat attendu
Intégration page Page + Layout Page utilise le layout Structure correcte

5.3. Tests E2E

Scénario Parcours utilisateur Description Résultat attendu
Navigation Utilisateur → Page Navigation sur le site Layout cohérent

6. Intégration (INTÉG)

6.1. Intégration avec les composants

Composant Type Rôle Méthode d’intégration
Page L2 Utilisation du layout Import et wrapper
Header L2 Navigation globale Import et rendu
Footer L2 Pied de page Import et rendu

6.2. Points d’attention

  • Les props doivent être typées avec TypeScript
  • Le SEO doit être centralisé dans le layout
  • L’accessibilité doit être conforme WCAG AA

6.3. Vérification de cohérence

  • Le layout fonctionne avec toutes les pages
  • Les meta tags sont injectés correctement
  • L’accessibilité est conforme
  • Les tests E2E passent

7. Sécurité

7.1. Mécanismes de sécurité

  • ✅ CSP headers appliqués par le middleware
  • ✅ Validation des props
  • ✅ Protection XSS (Astro par défaut)

7.2. Règles de sécurité

  • ✅ Ne jamais exposer de données sensibles dans le HTML
  • ✅ Valider toutes les URLs (canonical, ogImage)
  • ✅ Utiliser les en-têtes de sécurité appropriés

8. Performance et limites

8.1. Optimisations

Optimisation Description
Lazy loading Chargement différé des composants
Code splitting Séparation du code par layout
Critical CSS CSS critique inline

8.2. Limitations

  • ❌ Les layouts augmentent la taille du bundle
  • ❌ Les slots complexes peuvent affecter les performances

9. Débogage et troubleshooting

9.1. Problèmes courants

Symptôme Cause probable Solution
Layout non appliqué Import incorrect Vérifier l’import
Meta tags manquants Props non passées Vérifier les props
Slot vide Contenu non injecté Vérifier le slot

9.2. Commandes de debug

Terminal window
# Build local
npm run build
# Preview du build
npm run preview

10. Bonnes pratiques

10.1. Architecture

  • ✅ Layouts hiérarchiques (BaseLayout → Layout spécifique)
  • ✅ Props typées avec TypeScript
  • ✅ SEO centralisé

10.2. Code

  • ✅ Utiliser des composants réutilisables
  • ✅ Optimiser les images et les assets
  • ✅ Documenter les props complexes

10.3. Maintenance

  • ✅ Documenter les changements dans ce fichier
  • ✅ Tester les modifications en local

11. Évolutions et roadmap

11.1. Améliorations planifiées

  • [Évolution 1]
  • [Évolution 2]

11.2. Limitations connues

  • ❌ [Limitation 1]
  • ❌ [Limitation 2]

12. Ressources liées

  • Documentation Astro : Layouts
  • DAT L2 : §5.3 - Structure du Projet

13. Historique des modifications

Date Version Description Auteur
YYYY-MM-DD 1.0 Création initiale [Nom]
Switch to normal mode

Contents