Design tokens
Les tokens sont le contrat entre le design et le code. Un nom stable, une valeur qui peut changer, un rôle documenté. C'est aussi ce qui permet à une IA de générer des interfaces conformes.
Trois couches
Chaque couche ne référence que la couche inférieure. C'est cette discipline qui rend le thème sombre, une nouvelle marque ou une version dense possibles sans réécrire un seul composant.
L'inventaire complet des valeurs disponibles. Nommées par leur apparence. Jamais utilisées directement dans un composant.
--char-950: #181615--peach-400: #F2BD98--space-4: 16pxDes décisions : quel gris pour le texte secondaire, quelle couleur pour une erreur. Nommées par leur rôle. Redéfinies par thème.
--fg-2: var(--char-250)--accent: var(--peach-400)--dangerLes réglages propres à un composant, quand il a besoin de s'écarter du cas général. À utiliser avec retenue.
--btn-radius--card-pad--input-heightConvention de nommage
Un nom de token se lit de gauche à droite, du plus général au plus précis. On nomme le rôle, jamais l'apparence : --danger reste juste si l'erreur devient orange, --red deviendrait faux.
--[catégorie]-[propriété]-[variante]-[état] /* exemples */ --fg-2 /* texte, niveau 2 */ --surface-3 /* surface, niveau 3 */ --btn-height-lg /* composant bouton, hauteur, grande */ --accent-hover /* accent, état survol */
Référence
| Token | Référence (sombre) | Référence (clair) |
|---|---|---|
--bg | --char-950 | --char-50 |
--surface | --char-900 | --char-0 |
--surface-2 | --char-850 | --char-100 |
--line | --char-800 | --char-200 |
--line-ui | --char-450 | --char-450 |
--fg-3 | --char-400 | --char-500 |
--accent | --peach-400 | --peach-700 |
--accent-fg | --char-950 | --char-0 |
--plum | --plum-400 | --plum-600 |
| Token | Valeur | Usage type |
|---|---|---|
--space-1 | 4 px | Icône et texte serrés |
--space-2 | 8 px | Groupe de badges |
--space-4 | 16 px | Intérieur des petits composants, gouttière mobile |
--space-5 | 24 px | Champs d'un formulaire |
--space-8 | 48 px | Blocs d'une section |
--space-12 | 128 px | Respiration entre sections |
| Token | Valeur | Usage type |
|---|---|---|
--radius-xs | 6 px | Badges carrés, kbd |
--radius-sm | 10 px | Champs |
--radius-md | 14 px | Alertes, petites cartes |
--radius-lg | 20 px | Cartes, modales |
--radius-full | 999 px | Boutons, puces |
| Token | Valeur |
|---|---|
--ease-out | cubic-bezier(.2, .8, .2, 1) |
--ease-in-out | cubic-bezier(.65, 0, .35, 1) |
--ease-spring | cubic-bezier(.34, 1.56, .64, 1) |
--dur-1 … --dur-5 | 120, 200, 320, 560, 900 ms |
| Token | Référence |
|---|---|
--btn-height-sm / md / lg | 36 / 44 / 52 px |
--btn-radius | --radius-full |
--card-radius | --radius-lg |
--card-pad | clamp(20px, 3vw, 32px) |
--input-height | 44 px |
--input-radius | --radius-sm |
Exports
Une seule source, plusieurs formats. Le format JSON suit la structure du Design Tokens Community Group du W3C (DTCG) (clés $value et $type), ce qui le rend lisible par les outils de transformation et par un modèle de langage.
:root { --peach-400: #F2BD98; --accent: var(--peach-400); --radius-lg: 20px; --card-radius: var(--radius-lg); } :root[data-theme="light"] { --accent: var(--peach-700); }
{
"color": {
"peach": { "400": { "$value": "#F2BD98", "$type": "color" } },
"accent": {
"$value": "{color.peach.400}",
"$type": "color",
"$description": "Action principale, liens, éléments actifs"
}
}
}module.exports = { theme: { extend: { colors: { accent: "var(--accent)", fg: "var(--fg)" }, borderRadius: { card: "var(--card-radius)" } } } };
Atelier : modifier les tokens en direct
Modifiez cinq réglages et observez l'effet sur une carte. Le contrôle de contraste vérifie que le texte reste lisible sur l'accent choisi.
Gouvernance IA
Registre des cas d'usage, classification des risques et revue avant mise en production.
Faire évoluer un token
- Changer une valeur d'un token sémantique est une version mineure si le contraste reste conforme.
- Renommer un token est un changement cassant : l'ancien nom reste disponible en alias pendant une version, avec un avertissement.
- Ajouter un token composant exige un cas d'usage documenté que les tokens sémantiques ne couvrent pas.
Pour aller plus loin : Tokens sémantiques, le contrat qui relie design et code.