ADR 022
StatutStatus ActifActive
DateDate 2026-05-29
DécideursDecision makers Guilherme Negreiros — Design System Lead

ADR-022 — Lucide Icons comme bibliothèque d'icônes

Date : 2026-05-29 Statut : ✅ Actif Décideurs : Guilherme Negreiros — Design System Lead Type: contract Chemin logique: decisions/ADR-022-lucide-icons.md Lecture avant: AGENTS.md, DESIGN.md, .claude/rules/tokens-system.md Relations: tokens/primitives.json, tokens/semantic.json, components/ds-icon.js, guidelines/components/icon.md


Contexte

Le design system référençait dans les exemples de composants (notamment guidelines/components/button.md) sans qu'aucun système d'icônes ne soit défini. Aucun token de taille d'icône n'existait. Les équipes créaient des solutions ad hoc (emoji, SVG inline, classes Tailwind) — chacune une dérive potentielle.


Décision

Bibliothèque : Lucide Icons

Lucide (fork de Feather Icons, MIT) est adopté comme bibliothèque d'icônes officielle du système.

Caractéristiques techniques :

Adoption sectorielle : Linear, Vercel, shadcn/ui, Raycast — signal de qualité et de pérennité.

Web Component : ds-icon

Un composant Lit encapsule Lucide et expose l'API du design system :

// Usage
<ds-icon name="trash-2" size="control" label="Supprimer"></ds-icon>
<ds-icon name="check" size="inline" decorative></ds-icon>

Props :

PropTypeValeursDéfaut
nameStringNom Lucide (ex: "trash-2")— (requis)
sizeString"inline" / "control" / "nav""control"
labelStringTexte accessible
decorativeBooleanIcône purement décorativefalse

Règle WCAG 1.1.1 : Si decorative est absent, label est obligatoire → aria-label injecté. Si decorative est présent → aria-hidden="true".

Tokens de taille d'icône

// primitives.json
"iconSize": {
  "sm": "16px",  // inline — dans un texte
  "md": "20px",  // control — dans un bouton, input
  "lg": "24px"   // nav — navigation, emphase
}

// semantic.json
"icon.size.inline":  "{primitive.iconSize.sm}"
"icon.size.control": "{primitive.iconSize.md}"
"icon.size.nav":     "{primitive.iconSize.lg}"

Intégration dans le site de documentation

Lucide est ajouté comme dépendance npm dans site/package.json. Le build génère une page de référence des icônes à site/dist/components/icon.html.


Argumentaire WCAG


Alternatives rejetées

AlternativeRaison du rejet
Material IconsFont icon — problèmes FOUT, accessibilité plus complexe, couplage Google.
HeroiconsQualité équivalente mais moindre adoption, moins de variantes.
Font AwesomeModèle freemium, dépendance propriétaire pour icônes avancées.
SVG sprite customMaintenance manuelle insoutenable pour 100+ icônes.
Phosphor IconsQualité équivalente mais écosystème React-centrique, moins de support Web Components.

Conséquences

Pour les tokens :

Pour les composants :

Pour les agents IA :

Pour les équipes :

← ADR-021