Skip to content

Type de ressource : Composant Astro (UI atomique)
Fichier source : src/components/HeaderLink.astro
Statut : Actif

Composant de lien de navigation interne avec détection automatique de la page active. Applique un style visuel (gras + soulignement) au lien correspondant à la page courante.

  • Fournir des liens de navigation cohĂ©rents
  • Indiquer visuellement la page active
  • RĂ©duire la duplication de code pour les liens de navigation
  • Simplifier la gestion de l’état actif
Propriété Valeur
Type UI atomique
Hydratation Aucune
Framework JS Aucun
Accessibilité Partiellement conforme
Responsive Non applicable
src/components/
├── BaseHead.astro
├── Header.astro
├── Footer.astro
├── FormattedDate.astro
└── HeaderLink.astro
Composant parent Fichier Relation
Header src/components/Header.astro Utilisation pour les liens internes

Aucun composant enfant n’est utilisĂ© (composant leaf).

3.1. Variante : Composant UI atomique (HTML + CSS purs)

Section titled “3.1. Variante : Composant UI atomique (HTML + CSS purs)”
---
import type { HTMLAttributes } from 'astro/types';
type Props = HTMLAttributes<'a'>;
const { href, class: className, ...props } = Astro.props;
const pathname = Astro.url.pathname.replace(import.meta.env.BASE_URL, '');
const subpath = pathname.match(/[^\/]+/g);
const isActive = href === pathname || href === '/' + (subpath?.[0] || '');
---
<a href={href} class:list={[className, { active: isActive }]} {...props}>
<slot />
</a>
<style>
a {
display: inline-block;
text-decoration: none;
}
a.active {
font-weight: bolder;
text-decoration: underline;
}
</style>
---
import HeaderLink from '../components/HeaderLink.astro';
---
<nav>
<HeaderLink href="/">Home</HeaderLink>
<HeaderLink href="/blog">Blog</HeaderLink>
<HeaderLink href="/about">About</HeaderLink>
</nav>
Prop Type Description Exemple
href string URL du lien "/blog"
Prop Type Description Valeur par défaut
class string Classes CSS additionnelles undefined
(toutes les autres) HTMLAttributes<'a'> Attributs HTML standard -
Slot Description Obligatoire
default Contenu personnalisĂ© du lien ❌
Type de composant Stratégie Rationale
Composant UI atomique Aucune HTML pur, pas d’interaction

Aucune directive n’est utilisĂ©e (composant HTML pur).

Métrique Sans hydratation
HTML size +0.5 KB
CSS size +0.5 KB
JS size 0 KB
TTI Immédiat

Non applicable - styles inline simples.

Non applicable - le composant est responsive par défaut.

Non implémenté - le composant utilise les couleurs par défaut du navigateur.

CritÚre Implémentation Statut
1.3.1 Info and Relationships Structure HTML sĂ©mantique (<a>) ✅
2.4.7 Focus Visible Non testĂ© ⚠

Aucun attribut ARIA n’est utilisĂ©.

Touche Action
Tab Navigation vers le lien
Enter Activation du lien
Terminal window
# Test avec Lighthouse
npx lighthouse http://localhost:4321/ --view
  • ✅ HTML statique par dĂ©faut
  • ✅ CSS scoped
  • ✅ Pas de JavaScript
  • ✅ DĂ©tection automatique de la page active (calcul cĂŽtĂ© serveur)
Métrique Objectif Stratégie
LCP < 2.5s Pas de JS bloquant
INP < 200ms Pas de JS
CLS < 0.1 Pas de layout shift
Type HTML CSS JS (hydraté) Total
UI atomique 0.5 KB 0.5 KB 0 KB 1 KB
SymptĂŽme Cause probable Solution
État actif incorrect Logique de matching incorrecte VĂ©rifier la logique de dĂ©tection du pathname
Styles non appliqués CSS scoped mal configuré Vérifier la configuration du scoped CSS
Terminal window
# Test local
npm run dev
# Test de navigation
# Naviguer entre les pages et vérifier que le lien actif est bien mis en surbrillance

Non applicable (composant statique).

  • ✅ Centraliser la logique de dĂ©tection de la page active
  • ✅ Utiliser le slot pour permettre la personnalisation du contenu
  • ✅ Typer les props avec TypeScript
  • ✅ Supporter tous les attributs HTML standard via spread operator
  • ✅ Utiliser des Ă©lĂ©ments HTML sĂ©mantiques (<a>)
  • ✅ Fournir un texte descriptif pour les liens (via slot)
  • ⚠ AmĂ©liorer le focus visible
  • ✅ Éviter l’hydratation (pas d’interaction requise)
  • ✅ Calcul cĂŽtĂ© serveur (pas de JavaScript cĂŽtĂ© client)
  • ✅ Mettre Ă  jour la logique de dĂ©tection si nĂ©cessaire
  • ✅ Tester sur diffĂ©rentes routes
  • AmĂ©lioration du focus visible
  • [] Support du mode sombre
  • [ [Évolution 2 : ex. Ajout de variantes de style]
  • ❌ Logique de matching basique (pathname simple)
  • ❌ Pas de support des routes dynamiques complexes
  • ❌ Pas de mode sombre
  • Documentation Astro : Components
  • Documentation Astro : Slots
  • Composants associĂ©s :
    • src/components/Header.astro
Date Version Description Auteur
2026-09-15 1.0 Création initiale Devin
Edit page

Last updated: