Die drei Ebenen und ihr tatsächlicher Zweck
Die Konvention ist nahezu universell, was es einfach macht, die Struktur ohne die zugrunde liegende Logik zu übernehmen. Jede Ebene beantwortet eine andere Frage; zu wissen, welche das ist, verhindert, dass Dinge an der falschen Stelle platziert werden.
| Antworten | Beispiel | Verwendet von | |
|---|---|---|---|
| Primitive | Welche Werte existieren in diesem Design? | blue-600, space-4, radius-md | Nur die semantische Ebene. Niemals Produktcode |
| Semantisch | Wofür ist dieser Wert gedacht? | --color-danger, --text-muted, --surface-raised | Produktcode. Dies ist die Ebene, gegen die entwickelt wird |
| Komponente | Wo weicht eine Komponente legitim ab? | --button-primary-bg, --tooltip-surface | Nur diese Komponente, und nur selten |
Die Regel, die dies ermöglicht, und diejenige, die am häufigsten verletzt wird: Nichts außerhalb der semantischen Ebene darf ein Primitive referenzieren. In dem Moment, in dem eine Komponente blue-600 direkt verwendet, wird die Primitive-Ebene zu einer öffentlichen API. Man kann dann keinen Wert mehr ändern, ohne die gesamte Codebasis zu prüfen – was genau der Grund für die Einführung der Ebenen war.
:root {
/* Tier 1: primitives. Values only. Nobody uses these directly. */
--blue-600: #2563eb;
--red-600: #dc2626;
--gray-500: #6b7280;
/* Tier 2: semantic. Roles. This is the public API. */
--color-primary: var(--blue-600);
--color-danger: var(--red-600);
--text-muted: var(--gray-500);
/* Tier 3: component. Only where a component truly deviates. */
--button-danger-bg: var(--color-danger);
}
/* ✅ product code */
.alert { color: var(--color-danger); }
/* ❌ reaches past the semantic layer */
.alert { color: var(--red-600); }Das Benennungsmuster
Von links nach rechts lesen, von allgemein zu spezifisch: Kategorie, Rolle, Variante, Zustand. Nicht jeder Token benötigt alle vier; diejenigen, die es tun, sind in der Regel interaktiv.
| Kategorie | Rolle | Variante | Zustand | |
|---|---|---|---|---|
color-text-primary | color | text | primary | — |
color-surface-raised | color | surface | raised | — |
color-action-primary-hover | color | action | primary | hover |
space-inset-lg | space | inset | lg | — |
border-subtle | border | — | subtle | — |
Konsistenz ist weitaus wichtiger als das gewählte Muster. Eine Codebasis, in der die Hälfte der Tokens text-color-muted und die andere Hälfte color-text-muted heißt, zwingt alle Beteiligten dauerhaft zu jedem Zeitpunkt zu einer erneuten Überprüfung. Legen Sie eine Reihenfolge fest, dokumentieren Sie diese und setzen Sie sie im Review durch.
Ein praktischer Vorteil der Sortierung vom Allgemeinen zum Spezifischen: Die Tokens werden alphabetisch in sinnvollen Gruppen sortiert. Alle color-surface-* Tokens erscheinen gemeinsam in der Autovervollständigung des Editors, wodurch die Namenskonvention zu einem Mechanismus zur Entdeckung wird.
Hier ist das angewendete Muster, statt einer bloßen Beschreibung. Achten Sie auf die Rollennamen, nicht auf die Farben. Die Frage, die jeder Name beantworten muss, lautet: „Wofür ist dies gedacht?“. Ein Name, der nur beantwortet, „welche Farbe hat es“, erfüllt die Anforderungen seiner Ebene nicht.
Der Test, mit dem schlechte Namen erkannt werden
Eine einzige Frage löst die meisten Diskussionen über die Benennung in Sekunden:
Wenn sich das Design ändern würde, wäre dieser Name dann immer noch zutreffend?
Wendet man dies auf reale Fälle an, sind die Antworten eindeutig:
| Übersteht es das Redesign? | Warum | |
|---|---|---|
--color-brand-blue | Nein | Rebranding auf Grün, und der Name ist eine Lüge, die niemand zu korrigieren wagt |
--color-primary | Ja | Die Rolle ändert sich nicht, wenn sich der Farbton ändert |
--text-small-gray | Nein | Zwei visuelle Fakten, die sich beide ändern werden |
--text-muted | Ja | Benennt die Intention: de-emphasised Text |
--shadow-card | Nein | Kodiert den Mechanismus. Wechselt man zu einer Hairline-Elevation, ist der Name falsch |
--elevation-raised | Ja | Benennt den Effekt. Es kann ein Schatten, ein Rahmen oder eine Surface-Stufe sein |
Der Fall --shadow-card ist ein subtiler, aber wichtiger Punkt. Einen Token nach seiner Implementierung zu benennen, zwingt die Implementierung auf. Sobald jede Card im Codebase box-shadow: var(--shadow-card) verwendet, wird der Wechsel zu einer border-basierten Elevation zu einem Refactoring statt zu einer Token-Änderung – genau die Kopplung, die Design-Tokens eigentlich vermeiden sollten.
Im Dark Mode scheitern farbbasierte Namen oft kläglich. --gray-100 als „heller Hintergrund“ ist in einem Theme korrekt und im anderen invertiert, sodass man am Ende bei einem --gray-100 landet, das fast schwarz ist, was alle verwirrt. --surface-base hingegen ist in beiden Fällen korrekt.
Warum die Komponentenebene ständig wächst
Die meisten Token-Systeme scheitern genau hier. Die Komponentenebene beginnt klein und sinnvoll, absorbiert dann aber alles, bis man schließlich vierhundert Tokens hat, von denen die Hälfte nur einen einzigen Consumer hat.
Der Mechanismus ist immer derselbe. Jemand benötigt einen Button-Hintergrund, der nicht ganz --color-primary entspricht. Das Hinzufügen von --button-primary-bg dauert dreißig Sekunden, aber das Hinzufügen zur semantischen Ebene erfordert eine Besprechung. Also wird der Komponententoken eingefügt, die nächste Person macht dasselbe, und die semantische Ebene verliert ihre Funktion als Source of Truth, ohne dass dies jemals explizit entschieden wurde.
| Das eigentliche Problem | |
|---|---|
| Mehrere Komponenten benötigen denselben nicht-semantischen Wert | Ein fehlender semantischer Token. Benennen Sie die Rolle und stufen Sie ihn hoch |
| Eine Komponente benötigt einen wirklich einzigartigen Wert | Legitim. Genau dafür ist diese Ebene da. Sie sollte jedoch selten vorkommen |
| Eine ganze Surface benötigt unterschiedliche Werte | Ein fehlendes Theme oder ein fehlender Scope, keine Komponententokens. Schauen Sie sich an, was Encore mit Layers gemacht hat |
| Niemand kann sagen, welchen semantischen Token man verwenden soll | Die semantische Ebene ist unterdefiniert oder schlecht benannt |
Ein nützliches Audit: Zählen Sie die Tokens der Komponentenebene mit exakt einem Consumer. Wenn diese Zahl hoch ist, wird die Ebene als Notlösung missbraucht; die Lösung liegt eine Ebene höher.
Fünf Fehler und was jeder einzelne kostet
Diese Fehler treten in fast jedem Token-System auf, das irgendwann nicht mehr genutzt wird. Jeder Fehler ist leicht zu beheben, wenn er früh erkannt wird, und teuer, wenn nicht.
- 1
Nummerierte Skalen ohne Anker
color-1biscolor-12sagt niemandem etwas, und die Zahlen erhalten ihre Bedeutung nur durch Folklore. Nummerierte Skalen sind in der Primitive-Ebene völlig in Ordnung, wo die Zahl eine reale Dimension wie die Helligkeit abbildet. In der semantischen Ebene sind sie niemals akzeptabel, da der Zweck dieser Ebene darin besteht, zu sagen, wofür etwas da ist. - 2
Das Theme im Namen kodieren
--light-bgund--dark-bgals separate Tokens zu verwenden bedeutet, dass jede Komponente beide referenziert und verzweigt. Ein Name, zwei Werte, gewechselt durch das Theme: Genau dafür ist die Token-Ebene da. Wenn Sieif (theme === 'dark')im Komponentencode finden, sind die Tokens falsch benannt./* ❌ */ --light-bg: #fff; --dark-bg: #0a0a0a; /* ✅ */ --surface-base: #fff; [data-theme="dark"] { --surface-base: #0a0a0a; } - 3
Größen, die nach ihrem aktuellen Verwendungszweck benannt sind
--text-heroist in Ordnung, bis die Hero-Größe plötzlich in einer Preistabelle auftaucht.--text-4xloder--font-scale-7benennt die Stufe, nicht die Seite, und bleibt auch bei einer Wiederverwendung gültig. Benennen Sie nach der Position in einer Skala, nicht nach dem ersten Kunden. - 4
Statusfarben, die gleichzeitig als Markenfarben dienen
Der häufigste Grund, warum ein System nicht mehr in der Lage ist, Zustände darzustellen. Wenn das Marken-Grün und das Erfolgs-Grün derselbe Token sind, kann die Marke nicht ohne eine Änderung der Erfolgsdarstellung neu gestaltet werden, und eine korrekte Zeile lässt sich nicht von einer markenspezifischen unterscheiden. Halten Sie den Status-Satz reserviert und vermerken Sie dies in einem Kommentar.
- 5
Abkürzungen, die nur eine Person versteht
--clr-bg-scndryspart elf Zeichen und kostet jeden Leser für immer einen Dekodierungsschritt – einschließlich eines Modells, das raten muss, obscndryfür secondary steht oder ein Tippfehler ist. Autocomplete macht die Länge nahezu vernachlässigbar. Schreiben Sie die Wörter aus.
Der zweite Punkt ist eine Überprüfung wert, die man heute durchführen sollte. Suchen Sie in Ihren Komponenten per Grep nach Theme-Bedingungen. Jede gefundene Bedingung ist ein Token, der eigentlich ein Name mit zwei Werten hätte sein sollen, und jede ist eine Stelle, an der der Dark Mode stillschweigend vom Light Mode abweichen wird.
Namen, die über die eigene Codebasis hinaus Bestand haben
Tokens müssen zunehmend wandern: von einem Design-Tool zu CSS, in ein Tailwind-Theme, in eine native Plattform, in ein shadcn-Registry-Element, in eine DESIGN.md, die ein Agent liest. Das stellt eine Anforderung an die Namen, über die die meisten Teams erst nachdenken, wenn der erste Export fehlschlägt.
| Portabel? | Warum | |
|---|---|---|
| Punkte oder Slashes als Trennzeichen | Riskant | color.text.muted ist in JSON natürlich, in einer CSS-Custom-Property jedoch illegal. Bindestriche funktionieren überall. |
| Großschreibung oder Mixed Case | Riskant | Einige Zielsysteme normalisieren die Groß-/Kleinschreibung, andere nicht. Durchgängige Kleinschreibung beseitigt diese Frage. |
| Tiefe Verschachtelung | Riskant | color.semantic.text.emphasis.high wird zu etwas Unlesbarem abgeflacht, das niemand zweimal tippen möchte. |
| Flach, kleingeschrieben, mit Bindestrichen | Ja | --color-text-muted funktioniert als CSS-Variable, als JSON-Key, als Tailwind-Key und als einfaches Wort im Fließtext. |
Die praktische Regel: Wählen Sie Namen, die gleichzeitig eine gültige CSS-Custom-Property, ein gültiger JSON-Key und eine lesbare englische Phrase sind. Flach, kleingeschrieben und mit Bindestrichen erfüllt alle drei Kriterien. Zudem lassen sich die verschachtelten Gruppen des DTCG/W3C-Token-Formats wesentlich einfacher aus einem flachen Set generieren als umgekehrt.
Ein weiterer Portabilitätstest: Können Sie den Token-Namen in einem Meeting laut aussprechen, ohne ihn buchstabieren zu müssen? Wenn sich zwei Personen nicht darüber einig sind, wie ein Token ausgesprochen wird, werden sie ihn auch schriftlich nicht konsistent verwenden.
Einheitliche Namen für Design und Code
Die effektivste Entscheidung bei der Benennung ist nicht das Muster. Es ist die Frage, ob die Namen in Ihrem Design-Tool identisch mit den Namen im Code sind.
Salesforce's SLDS 2 ist das deutlichste veröffentlichte Beispiel: Die Figma-Library verwendet dieselben semantischen Hook-Namen wie das CSS (ihre Beispiele sind radius-border-4 und font-scale-4), sodass Designs eins-zu-eins auf den Live-Code abgebildet werden. Ihr erklärtes Ziel ist ein gemeinsames Vokabular, das Design und Entwicklung verbindet.
Die praktische Folge ist, dass eine ganze Klasse von Handoff-Bugs verschwindet. Wenn ein Designer font-scale-4 sagt und ein Entwickler font-scale-4 tippt, gibt es keinen Übersetzungsschritt und somit keinen Raum für Missverständnisse. Vergleichen Sie dies mit einem Figma-Style namens "Heading / Large", der auf eine CSS-Variable namens --text-2xl abgebildet wird, wobei jeder Handoff eine Suche ist und jede Suche eine Chance für eine Fehlinterpretation.
Wenn Sie nur eine Änderung an Ihrem Token-System vornehmen können, sorgen Sie dafür, dass die Namen über alle Tools hinweg übereinstimmen. Es kostet eine Umbenennung und entfernt eine dauerhafte Effizienzbremse.
Benennung, wenn ein Agent der Konsument ist
Die Benennung von Tokens war früher eine Frage der menschlichen Ergonomie: Autocomplete, Lesbarkeit, Onboarding. Zunehmend ist der intensivste Leser Ihrer Token-Datei ein Coding-Agent, und das ändert die Art der Fehler, die relevant sind.
Ein Mensch, der nicht weiß, welches von zwei Grautönen er verwenden soll, wird nachfragen oder einen wählen und im Review korrigiert werden. Ein Modell wird stillschweigend in jeder Datei, die es bearbeitet, einen auswählen, und die Inkonsistenz breitet sich schneller aus, als ein Review sie erfassen kann. Mehrdeutigkeit in der semantischen Ebene ist ein weitaus teurerer Defekt als früher.
Wir haben 299 DESIGN.md-Dateien analysiert, die für Agents veröffentlicht wurden, und festgestellt, dass 86 % Farben als reine Hex-Werte ohne jegliche semantische Rolle angeben. Nicht schlecht benannte Tokens: gar keine Tokens. Ein Modell, dem #6b7280 gegeben wird und dem gesagt wird, dass dies Teil der Palette ist, wird es überall dort verwenden, wo ein mittleres Grau plausibel ist: Fließtext, Rahmen, Icons, Platzhalter, deaktivierte Zustände. Fünf verschiedene Aufgaben, ein Wert, keine Möglichkeit, diese später unabhängig voneinander zu ändern.
| Was der Agent tut | |
|---|---|
Gray: #6b7280 | Verwendet es gleichermaßen für Fließtext, Rahmen, Icons, Platzhalter und deaktivierte Zustände |
--text-muted: #6b7280: nur für sekundären und unterstützenden Text. Rahmen verwenden --border-subtle. Deaktivierte Zustände verwenden --text-disabled. | Wird für unterstützenden Text verwendet. Die anderen Aufgaben haben eigene Namen, sodass sie später voneinander abweichen können |
Die zweite Version kostet drei zusätzliche Zeilen, ermöglicht aber die Möglichkeit, Rahmen zu verdunkeln, ohne die Bildunterschriften zu verdunkeln – eine Änderung, die gewünscht sein wird und die in der ersten Version ohne eine prüfung des gesamten Codebases unmöglich wäre.
Die Design-Kits von Identity Forge liefern 28 semantische Farbrollen für Light- und Dark-Mode sowie Typografie, Spacing und Elevation, serialisiert in einer DESIGN.md, die ein Agent liest, bevor er Code schreibt. Kits durchsuchen oder Erklärung zu semantischen Farb-Tokens lesen.
Ein Startset
Wenn ein System von Grund auf benannt wird, ist dies ein vertretbares Minimum. Es ist bewusst klein gehalten. Ein System, das niemand mehr im Kopf behalten kann, wird ignoriert.
/* Surfaces — what things sit on */
--surface-base /* the page */
--surface-raised /* cards, panels */
--surface-overlay /* modals, popovers */
--surface-sunken /* wells, inset areas */
/* Text — by emphasis, never by colour */
--text-primary
--text-secondary
--text-muted
--text-disabled
--text-on-accent /* text sitting on the accent colour */
/* Borders — by weight of presence */
--border-subtle
--border-strong
--border-focus
/* Action — the interactive colour and its states */
--action-primary
--action-primary-hover
--action-primary-active
/* Status — reserved. Nothing decorative uses these. */
--status-success
--status-warning
--status-danger
--status-infoZwei Anmerkungen zu diesem Set. Text-Tokens werden nach der Betonung statt nach der Farbe benannt, damit sie im Dark-Mode konsistent bleiben. Status-Tokens enthalten einen Kommentar zur Reservierung, da das häufigste Problem bei Status-Systemen darin besteht, dass Designer das „Success-Grün“ als dekorativen Akzent verwenden und niemand mehr eine funktionierende Zeile von einer markenspezifischen unterscheiden kann.
Was ist die beste Benennungskonvention für Design-Tokens?
Drei Ebenen (primitive, semantische, Komponenten) mit Namen, die vom Allgemeinen zum Spezifischen gelesen werden: Kategorie, Rolle, Variante, Zustand. Die genaue Reihenfolge ist weitaus weniger wichtig als die konsistente Anwendung, da die eigentlichen Kosten von Inkonsistenz in einer notwendigen Nachschlageaktion bei jeder einzelnen Verwendung liegen.
Was ist der Unterschied zwischen primitiven und semantischen Tokens?
Ein Primitive benennt einen Wert (blue-600) und sagt nichts darüber aus, wo er hingehört. Ein semantischer Token benennt eine Aufgabe (--color-primary) und verweist auf ein Primitive. Produktcode sollte ausschließlich semantische Tokens verwenden, sodass die Änderung eines Wertes eine einzeilige Bearbeitung statt einer Prüfung der gesamten Codebase ist.
Sollten Tokens nach Farben benannt werden?
Nur in der primitiven Ebene, wo die Benennung des Wertes der Zweck ist. In der semantischen Ebene niemals: --color-brand-blue wird in dem Moment zur Lüge, in dem ein Rebranding erfolgt, und niemand benennt ihn um, weil zu viel davon abhängt. Benennen Sie die Rolle und lassen Sie den Wert darunter variieren.
Wie viele Design-Tokens sollte ein System haben?
Weniger als man denkt. Eine semantische Schicht von etwa 25 bis 40 Farbrollen plus Skalen für Typografie, Spacing und Elevation deckt die meisten Produkte ab. Wenn die Zahl über hundert steigt, prüfen Sie, wie viele Tokens genau einen Konsumenten haben: Diese Zahl verrät Ihnen, ob Sie ein System oder eine Liste haben.
Spielen Token-Namen jetzt eine größere Rolle, da KI den Code schreibt?
Ja, weil sich die Fehlerquelle verschoben hat. Ein Mensch, der unsicher ist, welches Grau zu verwenden ist, fragt nach oder wird im Review korrigiert. Ein Modell wählt in jeder Datei, die es bearbeitet, stillschweigend eines aus, sodass sich Mehrdeutigkeiten schneller verbreiten, als ein Review sie erfassen kann. Eindeutige Rollennamen mit definierten Zwecken sind die Lösung.