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, und ein Wert kann nicht mehr geändert werden, 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 einem unnötigen Nachschlagen. 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 anstatt einer bloßen Beschreibung. Achten Sie auf die Rollennamen, nicht auf die Farben – die Frage, die jeder Name beantworten muss, lautet: „Wofür wird dies verwendet?“. Ein Name, der nur beantwortet, „Welche Farbe hat es?“, ist für seine Ebene ungeeignet.
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 | Bei einem Rebrand auf Grün wird der Name zur Lüge, die niemand zu korrigieren wagt |
--color-primary | Ja | Die Rolle bleibt gleich, auch wenn sich der Farbton ändert |
--text-small-gray | Nein | Zwei optische Merkmale, von denen sich beide ändern können |
--text-muted | Ja | Benennt die Absicht – dezent hervorgehobener Text |
--shadow-card | Nein | Kodiert den Mechanismus. Bei einem Wechsel zu Hairline-Elevation ist der Name falsch |
--elevation-raised | Ja | Benennt den Effekt. Dies kann ein Schatten, ein Rahmen oder eine Oberflächenstufe sein |
Der Fall --shadow-card ist subtil und eine nähere Betrachtung wert. Wenn ein Token nach seiner Implementierung benannt wird, fixiert dies die Implementierung. Sobald jede Karte in der Codebasis box-shadow: var(--shadow-card) verwendet, wird ein Wechsel zu einer rahmenbasierten Elevation zu einem Refactoring statt zu einer einfachen Token-Änderung – genau die Kopplung, die Tokens eigentlich verhindern sollten.
Im Dark Mode scheitern optisch benannte Tokens auf spektakuläre Weise. --gray-100 als „heller Hintergrund“ ist in einem Theme korrekt und im anderen invertiert. Das führt dazu, dass --gray-100 einen fast schwarzen Wert hält und jeder Entwickler verwirrt ist. --surface-base hingegen ist in beiden Themes korrekt.
Warum die Komponenten-Ebene immer weiter wächst
Die meisten Token-Systeme scheitern genau hier. Die Komponenten-Ebene beginnt klein und legitim, absorbiert dann aber alles, bis man schließlich vierhundert Tokens hat, von denen die Hälfte nur einen einzigen Consumer besitzt.
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, während die Aufnahme in die semantische Ebene eine Abstimmung erfordern würde. Also wird das Komponenten-Token eingeführt, die nächste Person macht es genauso, und die semantische Ebene hört auf, die „Source of Truth“ zu sein, ohne dass dies jemals explizit so entschieden wurde.
| Das eigentliche Problem | |
|---|---|
| Mehrere Komponenten benötigen denselben nicht-semantischen Wert | Ein fehlendes semantisches Token. Die Rolle benennen und in die semantische Ebene heben |
| Eine Komponente benötigt einen wirklich einzigartigen Wert | Legitim. Genau dafür ist diese Ebene da. Dies sollte jedoch selten vorkommen |
| Eine gesamte Oberfläche benötigt unterschiedliche Werte | Ein fehlendes Theme oder Scope, keine Komponenten-Tokens. Siehe, was Encore mit Layers umgesetzt hat |
| Niemand weiß, welches semantische Token zu verwenden ist | Die semantische Ebene ist unterdefiniert oder schlecht benannt |
Ein nützliches Audit: Zählen Sie die Tokens der Komponenten-Ebene, die genau einen Consumer haben. Ist diese Zahl hoch, wird die Ebene als Notausgang genutzt; die Lösung liegt dann weiter oben in der Hierarchie.
Fünf Fehler und ihre jeweiligen Kosten
Diese Fehler treten in fast jedem Token-System auf, das nicht mehr genutzt wird. Jeder davon lässt sich frühzeitig günstig beheben, wird aber teuer, wenn man es ignoriert.
- 1
Nummerierte Skalen ohne Anker
color-1biscolor-12sagt niemandem etwas; die Zahlen erhalten ihre Bedeutung nur durch informelles Wissen. Nummerierte Skalen sind in der primitiven Ebene 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, die Funktion eines Elements zu definieren. - 2
Kodierung des Themes im Namen
Wenn
--light-bgund--dark-bgseparate Tokens sind, muss jede Komponente auf beide referenzieren und verzweigen. Ein Name, zwei Werte, gewechselt durch das Theme – genau das ist die Aufgabe der Token-Schicht. Wenn Sieif (theme === 'dark')im Komponenten-Code 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-7benennen die Stufe, nicht die Seite, und bleiben 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 Ä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 heute eine Überprüfung wert. Suchen Sie in Ihren Komponenten per Grep nach Theme-Bedingungen – jede gefundene Stelle ist ein Token, der eigentlich ein Name mit zwei Werten sein sollte, und jede ist ein Ort, an dem 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 eliminiert 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-Bibliothek verwendet dieselben semantischen Hook-Namen wie das CSS – Beispiele hierfür sind radius-border-4 und font-scale-4 – sodass Designs eins-zu-eins auf den Live-Code abgebildet werden. Das erklärte 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 Nachschlageaktion und jeder Nachschlag eine Chance für eine Fehlinterpretation ist.
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, was verändert, welche Fehler kritisch sind.
Ein Mensch, der nicht weiß, welches von zwei Grautönen zu verwenden ist, 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 heute ein wesentlich kostspieligerer 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 – sondern gar keine Tokens. Ein Modell, dem #6b7280 gegeben wird und dem gesagt wird, dass dies Teil der Palette ist, wird es überall 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 abzudunkeln, ohne die Bildunterschriften abzudunkeln – eine Änderung, die gewünscht sein wird und die in der ersten Version ohne eine prüfung des gesamten Codebases unmöglich gemacht wird.
Identity Forge Design-Kits 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 etwas 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 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, der sie reserviert, da das häufigste Problem bei Status-Systemen darin besteht, dass Designer das Erfolgs-Grün als dekorativen Akzent verwenden und niemand mehr eine gesunde 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 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.
Sollte ich Tokens nach Farben benennen?
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 es um, weil zu viel davon abhängt. Benennen Sie die Rolle und lassen Sie den Wert darunter wandern.
Wie viele Design-Tokens sollte ein System haben?
Weniger als man denkt. Eine semantische Ebene 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 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 das Fehlermuster geändert hat. Ein Mensch, der unsicher ist, welches Grau zu verwenden ist, fragt nach oder wird im Review korrigiert. Ein Modell wählt stillschweigend in jeder Datei, die es bearbeitet, eines aus, sodass sich Mehrdeutigkeiten schneller verbreiten, als ein Review sie erfassen kann. Eindeutige Rollennamen mit festgelegten Zwecken sind die Lösung.