Chaque jeton, composant et règle du système v2, présenté à sa taille d’utilisation. Cliquez sur n’importe quel nuancier pour copier son hexadécimal.
La feuille de style intégrée ici est system.css à l’identique, copiée lors de la compilation. Chaque remplissage de nuancier, ratio de contraste et lecture OKLCH est calculé à partir d’une valeur hexadécimale par build.py, afin qu’un libellé ne puisse pas diverger de la couleur au-dessus. Si le système change, relancez la compilation plutôt que de modifier ce fichier.
Non pas pour être beau. Pour qu’il soit impossible qu’il ait été installé.
Un audit mené en août 2026 a établi que 13 des 13 valeurs d’accent et de texte de l’ancien système étaient les valeurs par défaut littérales de Tailwind, et que notre propre site produit avait été initialisé avec shadcn ("style": "new-york"). Un concurrent d’un secteur sans rapport partageait 9 de nos 12 procédés signature à des valeurs quasi identiques, parce que les deux sites avaient été assemblés à partir du même registre de composants.
Chaque valeur doit remonter à une source. Si la seule réponse à « pourquoi ce nombre ? » est « cela semblait juste », c’est une dérive.
Ce test a remplacé l’ancien, « cela aurait-il pu être installé ? », parce que les listes noires se dégradent selon un cycle d’environ douze mois. Le signe révélateur de 2024 était un dégradé violet et Inter. Celui de 2026 est un crème chaud et une sérif d’affichage, qui constituait la porte de sortie du signe révélateur de 2024, adopté assez largement pour devenir le nouveau. La dérivation ne se dégrade pas.
Source : design-system.md §0, audit d’août 2026.
N’écrivez jamais une interdiction sans remplacement positif. Lorsqu’on lui dit « n’utilisez pas de crème », un modèle ne produit pas de variété, il se déplace vers une autre palette fixe. La négation déplace un attracteur au lieu de le dissoudre. Chaque règle de ce guide nomme le jeton, le nombre ou la police à utiliser à la place.
Le bleu PAY du logotype est la graine. Tous les autres bleus sont cette même couleur rendue plus claire ou plus foncée.
L’étape 50 est le bleu du logotype lui-même, mesuré à la teinte OKLCH 245.56. Sur l’ensemble des treize étapes, la teinte reste dans une plage de 3.1 degrés. Le chroma raconte une autre histoire : il atteint son maximum à la graine et diminue vers les deux extrémités, car sRGB ne peut pas maintenir la saturation à l’extrémité pâle. L’échelle est une échelle de luminosité dont la teinte est verrouillée, ce qui est la propriété qui compte.
Contraste mesuré par rapport à --paper dans chaque thème. Le vert dépasse 4.5:1, le gris dépasse 3:1, le rouge ne dépasse aucun des deux. Calculé le 13 août 2026.
#33A9FF mesure 2.24:1 sur le fond clair. Sur une surface claire, il sert uniquement de remplissage. Jamais du texte, jamais un filet qu’il faut pouvoir lire. Sur le fond sombre, le même hexadécimal atteint 6.37:1 et peut être composé en texte. Cette asymétrie est la raison même pour laquelle une échelle existe à la place d’un hexadécimal unique.
Ce texte est en #33A9FF sur le papier. À 2.24:1, il échoue à tous les seuils d’accessibilité existants.
Ne faites jamais celaLe même hexadécimal comme remplissage derrière du blanc, et comme graine de toute l’échelle.
C’est sa fonctionPour cette raison, personne ne choisit jamais une étape à la main. Six jetons de rôle correspondent au bon échelon selon le thème, et le balisage ne nomme que le rôle.
| Jeton | Fonction | Clair | Ratio | Sombre | Ratio |
|---|---|---|---|---|---|
--mark |
liens, accentuation | étape 75 #106aa6 |
5.09 | étape 30 #81c5ff |
8.77 |
--mark-deep |
accentuation plus forte | étape 80 #005990 |
6.53 | étape 20 #b0daff |
11.05 |
--mark-solid |
REMPLISSAGE sur clair, texte sur foncé | étape 50 #33a9ff |
2.24 | étape 50 #33a9ff |
6.37 |
--mark-tint |
surfaces teintées | étape 05 #edf6ff |
1.04 | étape 95 #002e4d |
1.16 |
--fig |
chiffres à toute taille, la valeur par défaut sûre | étape 75 #106aa6 |
5.09 | étape 30 #81c5ff |
8.77 |
--fig-display |
chiffres d’affichage à partir de 24px | étape 65 #017ec8 |
3.84 | étape 40 #5fb7ff |
7.49 |
--fig-inline |
chiffres dans le texte courant, un alias de --fig | étape 75 #106aa6 |
5.09 | étape 30 #81c5ff |
8.77 |
--fig-display est à 3.84:1 sur le fond clair, il n’est donc autorisé qu’au-delà d’environ 24px. Tant que cette étape vive portait le nom --fig, chaque numéro d’index et chaque statistique en ligne qui allait chercher le nom évident échouait silencieusement au niveau AA, et c’est exactement ce qui s’est produit une fois. Depuis le 8 septembre 2026, les noms reflètent le risque : --fig est l’étape sûre, à 5.09:1 sur fond clair et autorisée à toute taille, et l’étape d’affichage est un choix explicite sous un nom qui porte sa propre contrainte.
N’introduisez jamais une seconde teinte d’accent. Le laiton a été essayé pour les chiffres puis rejeté, avant de survivre inaperçu dans un lavis atmosphérique au chroma 0.086 pendant deux brouillons. Si une couleur est au-dessus d’environ 0.02 de chroma et n’est pas ce bleu, c’est un bug. Deux exceptions existent, et toutes deux doivent être auditables : les marques de tiers conservent la couleur de leur propriétaire, balisée afin que l’audit place sur liste blanche l’attribut et jamais l’hexadécimal ; et une réplique de produit qui montre à un utilisateur ce qu’il voit réellement à la connexion conserve les propres jetons du produit, vérifiés dans les deux sens.
Les deux thèmes sont chauds. L’accent est la seule chose froide de la page.
Le bleu se situe à la teinte 245.56, son complément exact est donc 65.56. Les neutres sont dérivés de ce nombre, ce qui signifie qu’une mesure alimente les deux moitiés du système et que la réponse à « pourquoi cette teinte » relève de l’arithmétique plutôt que du goût. Le chroma et la luminosité portent le rôle de chaque neutre.
Mesurés, les douze neutres couvrent de 62.35 à 80.72 degrés. Ce n’est pas une dérive des couleurs. À un chroma de 0.005 à 0.013, sRGB 8 bits ne peut pas représenter la teinte : un pas sur un seul canal déplace la teinte mesurée de 3.5 à 15.8 degrés, de sorte que chaque valeur se situe déjà à un pas de quantification de la cible, et un nouvel encodage à exactement 65.56 renvoie le même hexadécimal ou un hexadécimal adjacent. La forme vérifiable de la règle est chroma égal ou inférieur à 0.013, teinte comprise entre 55 et 90. Les deux conditions sont respectées pour les douze, et les deux sont réfutables.
Faites passer chaque bordure par rgba(var(--rule-c), a). Le jeton n’est pas une couleur, mais un triplet RGB destiné à la composition : 31,27,22 sur clair, 233,230,225 sur foncé, à une opacité de 0.09 à 0.45. Ne codez jamais en dur un gris, ni une ombre noir neutre. La teinte de l’ombre claire est un chaud 44,32,21.
--paper-2 est le bandeau de note, celui-ci compris, depuis le 21 septembre 2026. Il porte l’intitulé en --mark, --risk ou --good à 1rem, et les trois dépassent 4.5:1 sur lui dans les deux thèmes, le plus juste étant 4.57:1 pour --risk sur fond clair, mesuré à la compilation à partir de la feuille de style analysée. --risk et --good ont été ajustés deux fois le 21 septembre 2026 pour y parvenir, une fois pour le bandeau et une seconde fois lorsque le fond s’est assombri : en thème clair #ad4a40 et #357642, en thème sombre #d87369 et #5e9e69, tous à 4.57:1 ou plus sur le bandeau. Le corps du texte y est en --ink-soft. --wash est une teinte de surface uniquement : --mark, --graphite, --risk et --good passent tous sous le seuil sur lui, de 4.10 à 4.32:1 en thème clair, si bien que le texte posé sur une bande --wash monte à --ink-soft ou plus foncé.
Il n’y a délibérément aucun avertissement ambré. L’ambre se situe près de la teinte 70 et entre en collision avec le fond chaud, ce qui est précisément l’erreur commise par l’accent en laiton retiré. Tout ce qui aurait été un avertissement est soit un risque, soit une simple note d’accentuation.
Le plus bas de ces quatre mesure 4.83:1 sur papier. Jusqu’au 21 septembre 2026, trois d’entre eux ne dépassaient le seuil que de 0.04 ou moins ; les deux ajustements de ce jour-là, consignés dans la note ci-dessus, ont apporté la marge dont le bandeau de note a besoin.
Les rôles ne relèvent pas d’une préférence. Une police qui fait le travail d’une autre est un défaut.
Affichage, titres de section, surtitres, folio et tous les chiffres. Jamais pour le corps du texte, jamais pour un libellé d’interface.
ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 et son italique
Corps du texte, interface, titres de cartes, en-têtes de tableau, boutons. Jamais pour l’affichage, jamais pour les chiffres.
ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789
Chaînes techniques uniquement : code, identifiants, numéros de lot, libellés d’échantillons. Jamais un libellé, un surtitre ou un en-tête courant.
ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789
Geist et Geist Mono sont retirées : ce sont les polices maison de Vercel, et porter l’uniforme de la plateforme représentait la moitié du problème. Inter, Roboto, Arial, Poppins, Montserrat, Space Grotesk et toute pile de polices système pour l’affichage sont exclues pour la même raison, à plus grande échelle. Ce sont celles vers lesquelles un générateur se tourne quand personne n’a décidé.
C’est l’une des quatre polices les plus souvent signalées comme « police IA », et le crème chaud associé à une sérif d’affichage est le style maison documenté des modèles de pointe en 2026. La défense n’est pas la police, mais le rôle que nous lui attribuons : les chiffres. Une colonne de chiffres tabulaires en sérif, en bleu, est un procédé unique. Un mot en sérif italique glissé dans un titre pour donner du caractère est l’élément attracteur. Gardez le centre de gravité de la sérif sur les nombres.
Neuf niveaux, et ils constituent tout le vocabulaire. La typographie se juge par comparaison, donc un ratio lent fonctionne ici. L’espace se juge isolément et utilise un ratio plus rapide.
Une sérif surdimensionnée avec un seul mot en italique est l’accroche universelle des start-ups IA, et c’est le seul endroit où cette police d’affichage pourrait glisser de la signature à la fioriture. Ce qui en fait un signe révélateur, c’est qu’il s’agit généralement d’un choix par défaut, adopté une fois, pour la saveur, sans aucune raison derrière.
Un mot en sérif italique glissé dans un titre parce qu’il y était esthétique. Isolé, inexplicable, décoratif.
Pas un systèmeUn procédé d’accent traçable à une source explicitement énoncée, appliqué systématiquement sur une surface et porté dans le modèle de contenu comme donnée plutôt que marqué à la main à chaque occurrence.
Un systèmeDans les documents, un tel système n’existe pas ; trois rôles italiques autorisés constituent donc tout le vocabulaire, et il n’y en a pas de quatrième : .tag, .note-l et .quote. .doc-title em a quitté la liste le 21 septembre 2026. La seconde ligne en italique sous une première en romain, sur le H1 de chaque document, était le seul procédé qui se lisait comme l’accroche générée ; la seconde partie d’un titre est donc désormais en romain, dans le bleu : le geste que fait le logotype (un segment en bleu, rien d’autre ne change). L’emphase à l’intérieur d’un titre de document vient de la taille, de la graisse, de la couleur ou de la position. Le remplissage en dégradé sur du texte est banni partout, y compris sur le segment bleu du titre : la couleur le marque déjà, et la rampe n’ajoute qu’un signe révélateur.
Les documents ne portent plus aucun surtitre, depuis le 21 septembre 2026. Une centaine, sur l’ensemble des documents du hub, répétaient le titre placé en dessous, et la légende en filet-plus-italique au-dessus de chaque titre était devenue le marqueur de section généré. Le numéro porte la position d’une section ; le bloc Sommaire porte son type. La classe subsiste pour le site web, où les sections sont peu nombreuses : Instrument Serif italique, casse de phrase, graphite, avec un filet de 26px en préfixe. L’ancien surtitre mono en majuscules espacées est mort et ne doit revenir sous aucune forme.
.label — Archivo, --t-xs, graisse 600, espacement .09em, majuscules, graphite. Il s'agit du traitement table th promu en classe, et c'est le seul procédé autorisé restant en majuscules espacées. Utilisez-le pour un en-tête de colonne.
.tag — sérif italique, casse de phrase, graphite, lorsque le texte est une expression plutôt qu'un nom de champ. Utilisez celui-ci en premier.
Un procédé unique. Il ne peut pas être reproduit par reconnaissance de modèle, car personne d’autre ne le fait.
Chaque nombre est composé dans la sérif d'affichage, en bleu, avec font-variant-numeric: tabular-nums lining-nums, aligné à droite dès qu'il se trouve dans une colonne. Dans le texte courant, .fig-inline est légèrement plus grand que l'Archivo environnant afin d'attirer l'œil sans passer en gras.
Sans le traitement : nous avons récupéré 20 millions de dollars sur 450 blocages pour 2,500 entreprises, en travaillant avec 30 prestataires de paiement.
Avec lui : nous avons récupéré $20M sur 450 blocages pour 2,500 entreprises, en travaillant avec 30 prestataires de paiement.
Les chiffres tabulaires sont ce qui rend une colonne lisible : chaque chiffre occupe la même largeur, de sorte que les nombres s’alignent verticalement quelle que soit leur valeur. L’alignement à droite fait le reste, et le registre ci-dessous est l’endroit où vont les chiffres d’un document, avec leur source en dessous.
Chiffres Compaytence, à jour en août 2026.
Même catégorie qu’un logo manquant. Un nombre dans un registre ou une carte statistique est une affirmation ; il porte donc une valeur réelle, un dénominateur lorsqu’il en existe un, une date et sa provenance. Les nombres ronds sans source sont le signe révélateur de contenu le plus souvent cité : « 10,000+ marchands », « 99.9% de disponibilité », « 3x plus rapide ». Des chiffres provisoires peuvent exister dans une ossature. Ils ne doivent jamais être livrés.
Le corps est en 17px sur une ligne de base de 30px, donc une ligne correspond à une unité.
Chaque valeur d’espacement est une fraction ou un multiple de cette ligne, et chacune est un pixel entier. Un ratio géométrique a été envisagé puis rejeté : 1.25 nécessite quatorze niveaux pour couvrir 4 à 100px et place 24 à côté de 30, ce qui ressemble à un accident, et 1.5 devient fractionnaire au troisième niveau.
Les filets bleus derrière ce paragraphe sont tracés tous les 30 pixels. Le texte repose dessus parce que --lh-body vaut 1.765, et que 17 × 1.765 donne 30.005. Une ligne de texte courant est exactement une unité de l’échelle d’espacement, ce qui explique que l’échelle soit exprimée en fractions de ligne.
L’espace entre les blocs de texte utilise des lignes de base entières : 30, 60, 90. Le remplissage à l’intérieur d’un composant utilise les fractions : de 6 à 24. La proximité porte du sens : faites donc varier les espaces lorsque les regroupements diffèrent. Une seule valeur d’espacement partout est un échec de regroupement.
Une échelle de formes à deux niveaux, une seule épaisseur de trait fin et, sur un document, un fond plat sans rien derrière ni rien par-dessus.
Un contrôle situé un niveau plus serré que son conteneur paraît réfléchi plutôt que défini par défaut. Un seul rayon partout est l’indice de la forme molle, et la correction ne coûte rien.
--r-lg--r-ctl--r-xsLes quatre coins, toujours. Les coins elliptiques, chanfreinés, squircle, mis à l'échelle et asymétriques ont chacun été créés puis rejetés, et ils restent rejetés. --r-sm est retiré. N'utilisez jamais une valeur px brute : les deux jetons constituent tout le vocabulaire.
--hair vaut 1px partout, coloré de rgba(var(--rule-c), .09 à .45). Il n'existe pas de seconde épaisseur de bordure dans le système.
Une carte translucide sur le fond chaud, avec backdrop-filter: blur(16px) saturate(1.25). Conservée plutôt qu’abandonnée, parce que sur le site web les halos derrière elle et le grain par-dessus en font un empilement de matières, et non un flou appliqué pour le brillant. Cet empilement halo-verre-grain appartient au site web seul. Sur un document, le fond est plat et la même carte s’y pose comme un panneau plus clair bordé d’un filet, son blanc réduit en thème clair par le même facteur ×0.9653 que le papier.
Là, il recouvre tout, cartes comprises, à un z-index de 9. En dessous, chaque carte l’effacerait et les deux se disputeraient visiblement. Par-dessus, il se comporte comme un grain de pellicule et unifie la surface. Une seule surface grainée par page, et jamais une boîte grainée imbriquée dans une autre. Les documents sont livrés plats depuis le 21 septembre 2026 : le grain était la dernière couche d’un empilement qui n’existe plus dans un document, et il coûtait la netteté du texte, un repaint à chaque défilement et des PDF impossibles à compresser. Le fond a été déplacé vers la couleur moyenne que produisait le grain, mesurée dans Chrome headless, de sorte que rien ne s’est éclairci : papier clair de #fcf9f5 à #f3f0ec, une multiplication ×0.9653 par canal ; sombre de #120f0c à #23201d, un relèvement en mode screen de 7.07% de la marge de chaque canal.
Les documents sont livrés sans halo, depuis le 21 septembre 2026. Le papier ne brille pas, et sur le papier le halo d’angle était la même lueur sur chaque page de la série. Le bleu entre dans un document par les numéros et les chiffres, les liens et le bouton. Le site web conserve exactement deux halos, et c’est tout son budget atmosphérique : pas de troisième halo, pas de champ d’aurore, pas de dégradé maillé, et pas d’orbe lumineux quel que soit le traitement de bord. « Flouté » n’en blanchit aucun.
Là, le grain doit suivre la couche qui peint le ton, jamais la boîte de section. Dans un système de ponts ou de débords, la couleur d’une bande se prolonge au-delà de sa propre section ; un grain limité à la section s’arrête donc tandis que sa couleur continue, et trace une ligne dure à chaque frontière : mesurée à Δ10/255 sur le papier et à Δ22/255 sur le fond sombre. La page se lit alors comme un empilement de dalles plutôt que comme une seule surface.
La carte est le conteneur maison. Ce n’est pas le choix par défaut de la maison.
Une carte dit « comparez-moi à mes semblables. »
Utilisez-en une lorsque les éléments constituent véritablement un ensemble de pairs que le lecteur met en balance : trois offres, trois approches, trois résultats. Tout ce que le lecteur lit dans l’ordre se place directement sur le fond, sans conteneur, sous la forme d’un titre, d’une ligne et d’un filet entre les rangées. Une page où chaque bloc est une grille de cartes se lit comme du bruit, quelle que soit la qualité des cartes. Sur une section de services à quatre parcours, cette application a fait passer la page d’environ 24 surfaces de carte à 9.
Il en va de même pour les visuels de preuve et les citations mises en exergue : une capture d’écran qui possède déjà son propre cadre et son ombre n’a pas besoin d’être entourée d’une carte, et une citation se lit mieux en typographie sur un filet que dans un encadré. Les quatre blocs de la section 07 ci-dessus sont des rangées sans carte, précisément pour cette raison.
Libellé à gauche, chiffre à droite. La rangée de registre, encadrée.
64chUne étiquette, un titre, une ligne de texte et un lien dont la flèche se déplace avec la carte.
Retour en haut →Survolez n’importe quelle carte ci-dessus. Au repos, elle comporte un filet et aucune ombre. L’élévation n’apparaît qu’à l’interaction, et elle arrive en exactement deux couches.
La carte s’élève de 3px et acquiert --shadow-lift à partir de rien. Elle devient physiquement plus proche.
Une légère surbrillance suit le pointeur sur la surface, avec un alpha de .035. Les matériaux coûteux captent la lumière. C’est cette couche qui fait croire au matériau.
Cette valeur a été livrée à .14 et évoquait un projecteur suivant le curseur plutôt qu’un matériau captant la lumière. Le signe qu’elle est juste : vous la remarquez quand le pointeur bouge et ne parvenez pas vraiment à la désigner lorsqu’il s’arrête. Chaque surface partage un même bloc, donc ce seul nombre règle toute la page. Ne le réglez jamais à nouveau par composant.
Une troisième couche, un filet bleu balayant le bord supérieur, a été construite puis supprimée. Avec l’éclat qui portait déjà l’accent, cela faisait un signal de trop et amenait la carte à s’annoncer plutôt qu’à répondre. Livrer un filet et une ombre diffuse au repos a été abandonné pour la même raison : cela fait fonctionner deux systèmes d’élévation à la fois.
Les chiffres d’un document vont dans le registre : .card-row pour un seul, .card-total avec des rangées .mini pour plusieurs, et une ligne .ledger-src en dessous qui nomme la source et la date. Le nombre est ce qu’il est. La rangée de trois cartes statistiques est exclue des documents depuis le 21 septembre 2026 : trois chiffres ronds alignés était le signe révélateur de contenu le plus souvent cité, et le système l’avait livré sur quatre documents destinés aux clients. .card-stat subsiste pour un seul chiffre phare.
Un registre ne ferme jamais une colonne par une ligne simple. .total-line trace deux filets espacés de 4px au-dessus d’un total. Cela coûte un pseudo-élément, cela n’appartient à personne d’autre, et cela veut dire quelque chose. Utilisez-le uniquement au-dessus d’un véritable total, jamais comme décoration : un registre dont les rangées ne s’additionnent pas ne porte pas de ligne de total.
.n pour l’alignement à droite et .num pour afficher le chiffre dans la police serif.--paper-2 sur toute la largeur de colonne, avec l’intitulé dans la couleur sémantique et sans filet latéral, une par section au plus. Deux sémantiques seulement, risque et bon.| Mesure | Avant v2 | Après |
|---|---|---|
| Valeurs par défaut de Tailwind | 13 | 0 |
| Polices de caractères Vercel | 2 | 0 |
| Teintes d’accent | 2 | 1 |
| Niveaux de rayon | 1 | 2 |
| Durées d’apparition | 1 | 2 |
Source : journal des modifications de design-system.md, 3 août et 12 août 2026.
Une carte dans une carte est du bruit visuel. Si le contenu d’une carte a besoin d’un cadre, il lui faut un filet ou une bande teintée, pas une seconde carte.
Tout ce qui arrive de manière identique est décoratif. Varier selon l’importance donne du sens au mouvement.
| Classe | Déplacement | Durée | À utiliser sur |
|---|---|---|---|
.rise | 18 | 0.7 | Titres de section, tout ce qui ouvre un bloc |
.rise-sub | 10 | 0.5 | Cartes, grilles, tableaux au sein d’une section |
| aucun | — | — | Points, libellés, éléments en ligne, petits contrôles |
L’élément principal annonce le bloc ; l’élément suivant se pose dessous. N’ajoutez pas une troisième durée et n’appliquez pas d’apparition à un élément petit. Un élément qui arrive seul sans raison est le même échec que tout ce qui arrive de manière identique.
Une seule paire, et aucun rebond ni effet élastique nulle part. Chaque courbe d’accélération choisie manuellement dans le corpus mesuré est une ease-out, ce que sont ces deux courbes.
Transitions de couleur, d’arrière-plan et de bordure.
Apparitions, élévation de carte, flèche mobile.
La norme du corpus mesuré pour un survol est un changement de couleur : arrière-plan 33.8%, couleur 24.4%, bordure 12.3%, transformation seulement 6.6%. Notre élévation à deux couches est juste sur une carte et incorrecte sur un lien ou une rangée de tableau, qui demandent une couleur à environ 200ms. La transition médiane par site est de 250ms ; --dur-lead à 0.7s et --dur-sub à 0.5s sont donc des valeurs du décile supérieur : adaptées aux apparitions, inadaptées près d’un survol.
Source : motion-canon.md, CSS livré de 1,199 sites, 13 août 2026.
transform et opacity. Jamais width, height, padding ni margin. Les propriétés de mise en page représentent 5.7% de toutes les déclarations de transition du corpus, ce qui confirme cette règle.IntersectionObserver ou dans un onglet masqué, tout est affiché immédiatement.4.5:1 pour le texte, 3:1 pour les chiffres d’affichage au-delà d’environ 24px. Chaque valeur ci-dessous a été calculée à partir de l’hex livré, et non copiée depuis une note.
| Jeton | Fonction | Clair | Sombre | Seuil |
|---|---|---|---|---|
--ink |
titres | 15.07 | 15.05 | 4.5 |
--ink-soft |
corps de texte | 7.33 | 13.05 | 4.5 |
--graphite |
texte atténué, surtitre | 5.08 | 5.88 | 4.5 |
--mark |
liens, accentuation | 5.09 | 8.77 | 4.5 |
--fig |
chiffres, toute taille | 5.09 | 8.77 | 4.5 |
--fig-inline |
chiffres dans le texte | 5.09 | 8.77 | 4.5 |
--fig-display |
chiffres d’affichage >=24px | 3.84 | 7.49 | 3.0 |
--mark-solid remplissage uniquement |
REMPLISSAGE sur fond clair ; texte sur fond sombre | 2.24 | 6.37 | 4.5 |
--risk |
états d’erreur | 4.83 | 5.07 | 4.5 |
--good |
confirmations | 4.84 | 5.07 | 4.5 |
Ratios par rapport à --paper dans chaque thème. Luminance relative WCAG 2.1, calculée à la compilation. Les seuils livrés du système sont 3.84:1 sur fond clair (--fig-display) et 5.07:1 sur fond sombre (--good).
--fig-display à 3.84:1 n’est autorisé qu’au-delà d’environ 24px. Chaque usage livré y satisfait : le chiffre statistique à 51.9px, le numéro de section, le chiffre de rangée et le chiffre de total à 33.2px.:focus-visible visibles, 2px en --mark, décalage de 3px. Parcourez cette page avec la touche Tab pour les voir..card-link ne l’est pas.prefers-reduced-motion est respecté et le thème est appliqué avant le premier rendu.78.6% des sites mesurés écrivent outline:none au moins une fois, et 26.5% le font sans jamais définir :focus-visible. 12.7% n’ont aucun style de focus. Le mouvement réduit est pire : seuls 39.8% des sites comportent la requête, et par plateforme ce chiffre tombe à 14.4% sur Webflow et 2.3% sur Framer, soit deux sites sur 87. Toute surface Compaytence construite sur Framer ou Webflow nécessite cette requête écrite à la main.
Source : motion-canon.md, 13 août 2026.
Dans un onglet de prévisualisation masqué, getComputedStyle renvoie des valeurs obsolètes pour tout élément au milieu d’une transition, et forcer le reflow n’aide pas. Avant de mesurer le contraste, injectez *,*::before,*::after{transition:none!important}. Sinon, un changement de thème rapporte les couleurs du thème précédent et chaque lecture est erronée.
Le 13 août 2026, 1,290 systèmes de design livrés ont été mesurés automatiquement à partir du CSS appliqué. Les chiffres ci-dessous sont les résultats obtenus.
Source : styles.refero.design, 1,290 systèmes mesurés à partir du CSS appliqué ; anti-patterns.md §9 et website-builder/references/design-canon.md, 13 août 2026.
Deux autres constats ont affiné le système plutôt que de le confirmer. Le gras est un signe plus révélateur que le rayon : 46.2% de ces sites ne dépassent jamais la graisse 600, et 36.6% énoncent une règle anti-gras. La hiérarchie repose sur la taille, l’espace et la couleur ; un titre en graisse 700 est donc un marqueur plus fiable d’un système non réfléchi que n’importe quel choix de palette. Et l’approche négative n’est pas une règle d’hygiène : environ la moitié du corpus n’en applique aucune, même en affichage. Ajustez l’approche par plage de taille avec une raison explicite, ou ne l’ajustez pas du tout.
Ne laissez jamais un accent chaud sur le papier chaud. Ni dans une illustration, ni dans une série de graphiques, ni dans une teinte de survol, ni dans un lavis atmosphérique. C’est le seul geste qui fait passer une position de 2.6% à une position de 77.3%, et c’est exactement le mode d’échec déjà consigné : le laiton est resté inaperçu dans un lavis à chroma 0.086 pendant deux versions. --risk est l’exception autorisée, limitée aux états d’erreur.
La plupart de ces signes étaient des tendances de design humain de 2022 à 2024, avec des exemples nommés, avant que les générateurs ne deviennent vraiment efficaces. Ce qui a changé, ce n’est pas le vocabulaire, c’est que produire la moyenne ne coûte plus rien. Le vrai diagnostic est « personne n’a décidé », pas « une machine l’a fait » : un humain qui livre le shadcn standard produit exactement le même artefact. Appliquez cette liste à notre propre travail.
Définitivement exclus. Si l’un d’eux apparaît, c’est une régression, pas une option.
rgba(var(--rule-c), a)box-shadow créé à la main au lieu de --shadow ou --shadow-liftsrc défectueux<div> avec un gestionnaire de clic là où un <button> est nécessaireLe système v1 retiré est archivé et ne doit jamais être rendu : aucun canevas crème #fafaf7, aucun Geist, aucun #3b82f6, aucun surtitre mono, aucun orbe lumineux, aucune superposition de grille, aucune barre de navigation sombre.
Six questions. Tout « non » est un défaut, pas une préférence.
Remplacez le logotype par celui d’un concurrent. Faut-il modifier quoi que ce soit d’autre ?
Choisissez au hasard cinq valeurs rendues : une couleur, un rayon, un espacement, une taille, une durée. Chacune peut-elle être rattachée à un jeton ou à une dérivation énoncée sans dire « cela avait l’air juste » ?
La page montre-t-elle ce qui compte le plus, ou chaque bloc a-t-il le même poids ? Des nombres de mots identiques dans des cartes sœurs signifient que le texte a été rogné pour remplir les cases.
Chaque chiffre et chaque citation portent-ils une source réelle, une date et une attribution ?
Les états vide, de chargement, d’erreur et 404 existent-ils, et chacun dit-il quelque chose de précis ?
La page tient-elle la route lorsqu’on défile jusqu’en bas à 375px et à 1440px, dans les deux thèmes ? Une page vérifiée uniquement depuis sa première fenêtre d’affichage est vérifiée comme le ferait un générateur.
Si la réalisation est comparée à un site de référence, ajoutez une septième question : placez notre page, la référence et le modèle générique le plus proche côte à côte. Le caractère distinctif n’est visible que dans un alignement.
Cette page est destinée aux humains. La version évaluable, où chaque règle porte un identifiant, une valeur mesurée, un test et une ligne source, est .claude/skills/compaytence/references/design-system-spec.md. C'est ce vers quoi se résout le critique système de la compétence design-loop, et sa §15 est une checklist préconstruite de vingt lignes, prête à être dupliquée dans une exécution.