Systèmes de couleurs sémantiques : nommer les couleurs par usage, pas par teinte
Embed This Widget
Add the script tag and a data attribute to embed this widget.
Embed via iframe for maximum compatibility.
<iframe src="https://colorfyi.com/iframe/entity//" width="420" height="400" frameborder="0" style="border:0;border-radius:10px;max-width:100%" loading="lazy"></iframe>
Paste this URL in WordPress, Medium, or any oEmbed-compatible platform.
https://colorfyi.com/entity//
Add a dynamic SVG badge to your README or docs.
[](https://colorfyi.com/entity//)
Use the native HTML custom element.
Un système de couleurs qui appelle sa couleur de bouton principale « bleu » fonctionne bien jusqu'à ce que quelqu'un change la marque en vert. Désormais, chaque référence à « bleu » est incorrecte, et chaque designer et développeur qui touche la base de code doit rechercher les instances où « bleu » signifie en réalité « interactif ». La dénomination sémantique des couleurs résout ce problème à la racine : au lieu de nommer une couleur par son apparence, on la nomme par ce qu'elle fait.
Ce n'est pas une distinction cosmétique. Elle change la façon dont les équipes prennent des décisions, dont les produits gèrent les changements de thème, et dont votre interface reste accessible dans différents modes.
Pourquoi la dénomination sémantique est supérieure à la dénomination par teinte
Le problème de nommage en pratique
La plupart des équipes commencent avec des noms basés sur la teinte. Vous avez un guide de style qui dit : « Principal : blue-600. Secondaire : gray-700. Erreur : red-500. » Cela semble propre, et pendant un temps ça l'est. Le problème surgit lorsque :
- La marque pivote et le « bleu principal » devient violet
- Vous ajoutez un mode sombre où le « rouge d'erreur » doit s'éclaircir considérablement pour maintenir le contraste
- Un produit en marque blanche a besoin de couleurs de marque différentes sans toucher à la logique des composants
Avec la dénomination par teinte, chaque refonte est une opération de recherche-remplacement dans toute la base de code. Avec la dénomination sémantique, vous changez la valeur de --color-brand-primary dans un seul fichier, et chaque composant qui l'utilise se met à jour automatiquement.
Les noms sémantiques communiquent l'intention
Une variable nommée --color-interactive-default vous indique son rôle : cette couleur marque les éléments avec lesquels les utilisateurs peuvent interagir. Une variable nommée blue-500 ne vous dit rien d'autre que son apparence. Quand un développeur voit color: var(--color-text-danger) dans une feuille de style, il comprend immédiatement qu'il s'agit du texte en état de danger. Quand il voit color: #EF4444, il doit consulter une spécification pour comprendre pourquoi ce rouge particulier a été choisi.
Les noms sémantiques rendent le code auto-documenté. Ils accélèrent les revues de design parce que tout le monde parle le même langage. Ils rendent les passages entre designers et développeurs moins sujets aux erreurs.
Le mode sombre est sémantique par nature
Le mode sombre est l'argument le plus clair en faveur des systèmes sémantiques. En mode clair, --color-surface-default peut être #FFFFFF. En mode sombre, il peut être #1E1E1E. Le nom sémantique reste constant ; seule la valeur change. Si vous avez construit votre système autour des noms de teinte, « blanc » et « quasi-noir » ne peuvent pas partager un seul rôle sémantique — vous auriez besoin d'une logique conditionnelle partout plutôt qu'un simple échange de token.
Tokens de couleur primitifs vs sémantiques
Un système de tokens de couleur bien structuré comporte au moins deux couches : les tokens primitifs et les tokens sémantiques.
Tokens primitifs : la palette de couleurs
Les tokens primitifs sont votre palette de couleurs brute. Ils n'ont aucune opinion sur l'endroit où ils sont utilisés — ils définissent simplement chaque couleur disponible dans votre système. Une palette typique peut inclure une gamme neutre, une gamme de marque et des gammes utilitaires :
/* Tokens primitifs — la palette complète */
--color-blue-50: #EFF6FF;
--color-blue-100: #DBEAFE;
--color-blue-200: #BFDBFE;
--color-blue-300: #93C5FD;
--color-blue-400: #60A5FA;
--color-blue-500: #3B82F6;
--color-blue-600: #2563EB;
--color-blue-700: #1D4ED8;
--color-blue-800: #1E40AF;
--color-blue-900: #1E3A8A;
--color-blue-950: #172554;
--color-green-50: #F0FDF4;
--color-green-500: #22C55E;
--color-green-700: #15803D;
--color-red-50: #FFF1F2;
--color-red-500: #EF4444;
--color-red-700: #B91C1C;
--color-yellow-50: #FEFCE8;
--color-yellow-500: #EAB308;
--color-yellow-700: #A16207;
--color-neutral-0: #FFFFFF;
--color-neutral-50: #F8FAFC;
--color-neutral-100: #F1F5F9;
--color-neutral-200: #E2E8F0;
--color-neutral-900: #0F172A;
--color-neutral-950: #020617;
Les tokens primitifs ne sont jamais référencés directement dans le code des composants. Ils existent exclusivement comme valeurs sources pour les tokens sémantiques.
Tokens sémantiques : des couleurs avec un rôle
Les tokens sémantiques référencent les tokens primitifs et leur attribuent des rôles :
/* Tokens sémantiques — ce que fait chaque couleur */
:root {
/* Marque */
--color-brand-primary: var(--color-blue-600);
--color-brand-primary-hover: var(--color-blue-700);
--color-brand-primary-subtle: var(--color-blue-50);
/* Texte */
--color-text-default: var(--color-neutral-900);
--color-text-muted: var(--color-neutral-500);
--color-text-inverse: var(--color-neutral-0);
--color-text-danger: var(--color-red-700);
--color-text-success: var(--color-green-700);
--color-text-warning: var(--color-yellow-700);
--color-text-info: var(--color-blue-700);
/* Surfaces */
--color-surface-default: var(--color-neutral-0);
--color-surface-subtle: var(--color-neutral-50);
--color-surface-raised: var(--color-neutral-0);
--color-surface-overlay: var(--color-neutral-50);
/* Bordures */
--color-border-default: var(--color-neutral-200);
--color-border-focus: var(--color-blue-600);
--color-border-danger: var(--color-red-500);
/* États de retour */
--color-feedback-danger-surface: var(--color-red-50);
--color-feedback-danger-border: var(--color-red-500);
--color-feedback-danger-text: var(--color-red-700);
--color-feedback-success-surface: var(--color-green-50);
--color-feedback-warning-surface: var(--color-yellow-50);
--color-feedback-info-surface: var(--color-blue-50);
}
Les feuilles de style des composants consomment uniquement des tokens sémantiques. Aucune couleur primitive n'apparaît dans le code des composants.
Motifs de couleur pour succès, avertissement, erreur et information
Les couleurs de retour sont le point de départ le plus courant pour les systèmes sémantiques parce que leur finalité est indéniable. Personne ne nomme un état d'erreur #EF4444 pour sa teinte — on le choisit parce qu'il signale le danger. Rendre cette intention explicite dans le nom du token est un petit pas avec un grand retour.
Les quatre catégories de retour
Succès communique des résultats positifs : soumission de formulaire complétée, paiement traité, fichier téléversé. Les couleurs de succès sont généralement des verts, bien que les variations sarcelle et émeraude fonctionnent bien. L'exigence critique est que la couleur se lise comme positive dans toutes les cultures — ce qui signifie généralement éviter les verts jaune-vert qui peuvent paraître morbides, et favoriser des verts clairs et saturés.
Un trio de succès utile : - Surface : #F0FDF4 — fond vert très clair pour les bannières de succès - Bordure : #22C55E — bordure verte visible pour le conteneur - Texte : #15803D — vert plus foncé pour le texte lisible à l'intérieur
Avertissement communique un risque qui n'est pas encore une erreur : approche d'une limite de taille de fichier, session sur le point d'expirer, action aux conséquences irréversibles. Les jaunes et les ambrés signalent traditionnellement la prudence, en empruntant aux conventions des feux de circulation. Les jaunes vifs ne respectent pas les exigences de contraste sur fond blanc — associez toujours un fond jaune à une couleur de texte ambrée ou marron foncée.
Un trio d'avertissement respectant WCAG AA : - Surface : #FEFCE8 — fond jaune pâle - Bordure : #EAB308 — bordure jaune visible - Texte : #713F12 — texte ambré foncé (suffisamment foncé pour un contraste adéquat)
Erreur communique un échec : entrée invalide, erreur serveur, confirmation d'action destructrice. Les rouges sont la convention quasi universelle. La tentation est d'utiliser un seul rouge, mais les états de retour fonctionnent mieux comme triades — une surface claire, une bordure moyenne et un texte foncé — parce qu'ils se superposent en bannières fermables, en validation en ligne et en combinaisons icône+texte sans avoir besoin que la couleur soit le seul signal.
Information communique une information neutre : conseils, liens de documentation, mises à jour de progression sans urgence. Les bleus fonctionnent bien parce qu'ils partagent des associations chromatiques avec l'interactivité, ce qui convient — les états d'information contiennent souvent des liens ou des actions. Utilisez un bleu suffisamment distinct pour que les états d'information ne se lisent pas comme des éléments interactifs à eux seuls.
Implémentation accessible du retour
<!-- État d'erreur accessible : couleur + icône + texte (trois canaux) -->
<div class="alert" role="alert" aria-live="polite">
<svg aria-hidden="true" class="alert-icon"><!-- icône d'erreur --></svg>
<p class="alert-message">
<strong>Paiement échoué.</strong>
Votre carte a été refusée. Veuillez vérifier vos informations de carte et réessayer.
</p>
</div>
.alert {
display: flex;
gap: 0.75rem;
padding: 1rem;
border-radius: 0.375rem;
border-width: 1px;
border-style: solid;
background-color: var(--color-feedback-danger-surface);
border-color: var(--color-feedback-danger-border);
color: var(--color-feedback-danger-text);
}
Notez l'approche à trois canaux : couleur (surface et bordure rouges), forme (icône d'erreur) et texte (message descriptif). Cela satisfait WCAG 1.4.1 — l'information n'est pas transmise uniquement par la couleur.
Architecture des tokens : global → alias → composant
Les systèmes de design à l'échelle de l'entreprise ajoutent une troisième couche entre les tokens primitifs et sémantiques : les tokens de composant. Cette architecture à trois niveaux est souvent appelée global → alias → composant.
Niveau 1 : tokens globaux (primitifs)
Valeurs brutes. Nombres, couleurs, tailles de type. Pas d'opinions. Ce sont les atomes :
/* Global / Primitif */
--global-color-red-500: #EF4444;
--global-color-red-700: #B91C1C;
--global-space-4: 1rem;
--global-radius-md: 0.375rem;
Niveau 2 : tokens alias (sémantiques)
Affectations de rôle. Ceux-ci référencent les tokens globaux et leur donnent des rôles. C'est là que vit la dénomination sémantique :
/* Alias / Sémantique */
--alias-color-feedback-error-surface: var(--global-color-red-50);
--alias-color-feedback-error-border: var(--global-color-red-500);
--alias-color-feedback-error-text: var(--global-color-red-700);
Niveau 3 : tokens de composant
Affectations spécifiques aux composants qui référencent les tokens alias. Ils existent pour permettre à un seul composant d'être personnalisé sans affecter l'ensemble de la couche sémantique :
/* Tokens au niveau du composant */
--input-border-color-error: var(--alias-color-feedback-error-border);
--input-text-color-error: var(--alias-color-feedback-error-text);
--alert-surface-color-error: var(--alias-color-feedback-error-surface);
La feuille de style d'un composant n'utilise que ses propres tokens de composant :
.input--error {
border-color: var(--input-border-color-error);
}
.input--error-message {
color: var(--input-text-color-error);
}
Cela signifie que si vous souhaitez personnaliser la bordure d'erreur pour les champs de saisie spécifiquement — peut-être en la rendant légèrement plus foncée pour une meilleure visibilité dans une mise en page de formulaire particulière — vous changez --input-border-color-error dans le fichier de tokens du composant sans toucher du tout à la couche alias.
Implémentation en propriétés personnalisées CSS et Tailwind
Propriétés personnalisées CSS
L'implémentation CSS complète utilise une cascade qui rend le mode sombre sans effort :
:root {
/* Valeurs par défaut du mode clair */
--color-surface-default: #FFFFFF;
--color-text-default: #0F172A;
--color-brand-primary: #2563EB;
--color-feedback-danger-surface: #FFF1F2;
--color-feedback-danger-border: #EF4444;
--color-feedback-danger-text: #B91C1C;
}
@media (prefers-color-scheme: dark) {
:root {
/* Surcharges du mode sombre — mêmes noms de tokens, valeurs différentes */
--color-surface-default: #0F172A;
--color-text-default: #F8FAFC;
--color-brand-primary: #60A5FA;
--color-feedback-danger-surface: #450A0A;
--color-feedback-danger-border: #F87171;
--color-feedback-danger-text: #FCA5A5;
}
}
Chaque composant continue de référencer les mêmes noms de tokens. Le mode sombre est entièrement géré dans la déclaration :root — pas de logique conditionnelle dans le code des composants.
Intégration Tailwind CSS
La configuration CSS-first de Tailwind v4 rend l'intégration des couleurs sémantiques simple. Définissez vos tokens sémantiques dans votre feuille de style d'entrée et référencez-les dans vos utilitaires Tailwind :
/* styles.css — Tailwind v4 */
@import "tailwindcss";
@theme {
--color-brand-primary: #2563EB;
--color-brand-primary-hover: #1D4ED8;
--color-brand-primary-subtle: #EFF6FF;
--color-text-default: #0F172A;
--color-text-muted: #64748B;
--color-text-danger: #B91C1C;
--color-surface-default: #FFFFFF;
--color-surface-subtle: #F8FAFC;
--color-feedback-danger-surface: #FFF1F2;
--color-feedback-danger-border: #EF4444;
}
Dans Tailwind v3, étendez votre configuration :
// tailwind.config.js
module.exports = {
theme: {
extend: {
colors: {
brand: {
primary: 'var(--color-brand-primary)',
'primary-hover': 'var(--color-brand-primary-hover)',
subtle: 'var(--color-brand-primary-subtle)',
},
feedback: {
'danger-surface': 'var(--color-feedback-danger-surface)',
'danger-border': 'var(--color-feedback-danger-border)',
'danger-text': 'var(--color-feedback-danger-text)',
},
},
},
},
}
Tailwind génère maintenant des utilitaires comme bg-brand-primary, text-feedback-danger-text et border-feedback-danger-border. Votre balisage de template ne référence jamais une valeur hexadécimale brute :
<div class="rounded-md border border-feedback-danger-border bg-feedback-danger-surface p-4">
<p class="text-sm text-feedback-danger-text font-medium">
Ce champ est obligatoire.
</p>
</div>
Token de design JSON pour les systèmes multi-plateformes
Si votre équipe travaille sur le web, iOS et Android, les données de tokens sont souvent stockées dans un format JSON indépendant de la plateforme et transformées en sorties spécifiques à la plateforme (propriétés personnalisées CSS, constantes Swift, constantes Kotlin) par un outil comme Style Dictionary :
{
"color": {
"feedback": {
"danger": {
"surface": {
"$value": "#FFF1F2",
"$type": "color",
"$description": "Arrière-plan pour les états de danger/erreur"
},
"border": {
"$value": "#EF4444",
"$type": "color",
"$description": "Couleur de bordure pour les états de danger/erreur"
},
"text": {
"$value": "#B91C1C",
"$type": "color",
"$description": "Couleur de texte dans les états de danger/erreur. Respecte 4.5:1 sur blanc."
}
}
}
}
}
Style Dictionary lit ce JSON et génère le CSS, Swift, Kotlin et tout autre format requis par votre pipeline de build. Les équipes utilisant Figma peuvent utiliser le plugin Tokens Studio pour synchroniser ces tokens JSON directement avec les fichiers de design, maintenant design et code en phase.
Pièges courants à éviter
Mélanger les couches de nommage dans les composants. Si un composant référence à la fois --color-blue-600 (primitif) et --color-brand-primary (sémantique), la discipline s'effondre. Imposez une règle de lint ou une convention de revue de code : le code des composants ne peut référencer que des tokens sémantiques ou de composant.
Trop de rôles sémantiques. Certaines équipes créent un token sémantique pour chaque contexte — --color-sidebar-background, --color-modal-background, --color-drawer-background — alors que les trois correspondent à la même surface. Consolidez là où les couleurs partagent véritablement un rôle. Un test utile : si deux tokens sémantiques ont toujours la même valeur et changent toujours ensemble, fusionnez-les.
Sauter la couche primitive. Sans une palette primitive disciplinée, les tokens sémantiques référencent directement des valeurs hexadécimales brutes. Quand vous souhaitez ajuster votre palette verte, vous devez rechercher dans tous les tokens sémantiques qui référencent n'importe quelle valeur hexadécimale verte. La couche primitive est ce qui fait de ce changement une seule modification.
Nommer pour le design d'aujourd'hui, pas pour celui de demain. Si --color-brand-primary est le bleu d'aujourd'hui, une refonte future en violet reste valide — le nom sémantique demeure correct. Mais si vous l'avez nommé --color-brand-blue, le nom devient incorrect dès que la marque change. Gardez les noms sémantiques exempts de références aux teintes autant que possible.
Résumé
Les systèmes de couleurs sémantiques sont un investissement unique qui rapporte des dividendes à chaque évolution de votre produit. Les principes clés :
- Nommez les couleurs par rôle, pas par apparence.
--color-text-dangerplutôt que--color-red. - Séparez les tokens primitifs (votre palette complète) des tokens sémantiques (affectations de rôle).
- Ne référencez que des tokens sémantiques dans le code des composants. Ne remontez jamais vers les primitifs.
- Gérez le mode sombre et le thème au niveau de la couche sémantique — les composants restent inchangés.
- Pour les grandes équipes, ajoutez une couche de tokens de composant pour la personnalisation par composant sans casser la couche sémantique.
Un système de couleurs bien nommé fait de votre prochain rafraîchissement de marque, de votre implémentation de mode sombre ou de votre variante en marque blanche un changement de configuration plutôt qu'une migration de base de code.
Couleurs associées
Marques associées
Outils associés
Générateur de palettes
Générez des palettes de couleurs harmonieuses en utilisant des schémas complémentaires, analogues, triadiques et complémentaires divisés.
Vérificateur de contraste
Vérifiez les ratios de contraste des couleurs selon les directives WCAG 2.1. Testez la conformité AA et AAA pour le texte normal et le grand texte.