Du würdest niemals einen Datenbank-Verbindungsstring in 47 verschiedenen Dateien hartcodieren. Warum codieren Frontend-Teams dann immer noch #3b82f6 an 200 Stellen in ihren Stylesheets? Design Tokens lösen dieses Problem genauso, wie Konfiguration es im Backend löst: eine einzige Quelle der Wahrheit, überall referenziert, an einem Ort geändert.
Design Tokens sind die visuellen Atome eines Design-Systems. Sie speichern Entscheidungen — nicht nur Werte — über Farbe, Typografie, Abstände, Schatten, Rahmen und Animationen in einem Format, das jede Komponente konsumieren kann.
Design Tokens sind die visuellen Design-Atome des Design-Systems — konkret sind es benannte Entitäten, die visuelle Design-Attribute speichern.
Warum Design Tokens wichtig sind
Ohne Tokens sind Designentscheidungen über CSS-Dateien, Komponenten-Styles und Inline-Styles verstreut. Ein „Markenblau” könnte #2563eb im Header sein, #3b82f6 in Buttons und #1d4ed8 in Links — drei verschiedene Blautöne, die eigentlich gleich sein sollten. Tokens eliminieren dieses Abdriften, indem sie einen einzigen kanonischen Wert festlegen.
Wenn du einen Token aktualisierst, aktualisiert sich jede Komponente, die ihn referenziert, automatisch. Ändere --color-primary einmal, und deine Buttons, Links, Überschriften, Focus-Ringe und Active-States folgen. Das ist das fundamentale Versprechen eines Design-Systems.
Token-Kategorien
Deine gesamte Farbpalette — von Marken-Primärfarben und Neutraltönen bis zu semantischen Farben für Erfolg, Warnung, Fehler und Info-Zustände. Semantische Tokens wie --color-text und --color-bg passen sich zwischen Hell- und Dunkelmodus an, ohne Komponentencode zu ändern. Definiere primitive Tokens (die rohe Palette) und semantische Tokens (die Bedeutung) separat.
Ein 8-Punkt-Rastersystem sorgt für konsistenten räumlichen Rhythmus. Werte wie --space-1 (4px) bis --space-12 (96px) erzeugen harmonische Layouts. Komponenten verwenden niemals willkürliche Pixelwerte — jeder Margin, Padding und Gap referenziert einen Abstands-Token. Das beendet die „Sollen es 14px oder 16px sein?"-Debatte für immer.
Schriftfamilien, Größen, Gewichte, Zeilenhöhen und Zeichenabstände — alles tokenisiert. Fluide Typografie-Skalen nutzen clamp(), um lesbaren Text vom Smartphone bis zum Ultrawide sicherzustellen. Eine Überschrift, die auf dem Handy 2rem groß ist, wächst sanft auf 3rem am Desktop — ohne Media Queries.
Schatten, Border-Radii, Transitions und Animationen. Konsistente Schatten (--shadow-sm, --shadow-md, --shadow-lg) schaffen Tiefenhierarchie. Transition-Tokens (--transition-fast: 150ms, --transition-base: 300ms) sorgen für einheitliches Animationsgefühl. Border-Radius-Tokens verhindern das Problem „manche Buttons haben 4px, andere 8px".
Token-Architektur: Drei Schichten
Design Tokens funktionieren am besten, wenn sie in drei Schichten organisiert sind: primitiv, semantisch und komponentenspezifisch. Jede Schicht fügt Bedeutung hinzu.
Primitive Tokens sind die Rohwerte — deine Palette. Sie haben keine Bedeutung, nur Namen und Werte. --blue-500: #3b82f6, --gray-100: #f3f4f6, --space-4: 1rem. Du verwendest sie niemals direkt in Komponenten. Sie sind die Bausteine für semantische Tokens.
Semantische Tokens weisen Primitiven Bedeutung zu. --color-primary: var(--blue-500), --color-bg: var(--gray-100), --color-text: var(--gray-900). Komponenten verwenden ausschließlich semantische Tokens. So funktioniert der Dark Mode: Du tauschst die primitiven Werte hinter den semantischen Tokens, und jede Komponente passt sich an.
Komponenten-Tokens (optional) sind Aliase für bestimmte Komponenten. --btn-bg: var(--color-primary), --btn-text: var(--color-on-primary), --card-radius: var(--radius-md). Sie fügen eine zusätzliche Flexibilitätsebene hinzu: Du kannst alle Button-Hintergründe ändern, ohne andere Komponenten zu beeinflussen, die --color-primary verwenden.
Implementierung in CSS
/* tokens/primitives.css — Rohpalette, nie direkt in Komponenten */
:root {
--blue-50: #eff6ff;
--blue-500: #3b82f6;
--blue-600: #2563eb;
--blue-700: #1d4ed8;
--gray-50: #f9fafb;
--gray-100: #f3f4f6;
--gray-700: #374151;
--gray-900: #111827;
--space-1: 0.25rem; /* 4px */
--space-2: 0.5rem; /* 8px */
--space-4: 1rem; /* 16px */
--space-6: 1.5rem; /* 24px */
--space-8: 2rem; /* 32px */
} /* tokens/semantic.css — bedeutungsvolle Namen, in allen Komponenten */
:root {
--color-primary: var(--blue-600);
--color-primary-hover: var(--blue-700);
--color-bg: var(--gray-50);
--color-bg-alt: var(--gray-100);
--color-text: var(--gray-900);
--color-text-light: var(--gray-700);
--font-size-base: 1rem;
--font-size-lg: 1.25rem;
--font-size-xl: 1.5rem;
--radius-sm: 0.25rem;
--radius-md: 0.5rem;
--shadow-sm: 0 1px 2px rgba(0,0,0,0.05);
--shadow-md: 0 4px 6px rgba(0,0,0,0.1);
--transition-fast: 150ms ease;
--transition-base: 300ms ease;
} /* Dark Mode — tausche Primitive hinter semantischen Tokens */
[data-theme="dark"] {
--color-primary: var(--blue-500);
--color-primary-hover: var(--blue-600);
--color-bg: var(--gray-900);
--color-bg-alt: var(--gray-700);
--color-text: var(--gray-50);
--color-text-light: var(--gray-100);
--shadow-sm: 0 1px 2px rgba(0,0,0,0.3);
--shadow-md: 0 4px 6px rgba(0,0,0,0.4);
}
/* Komponenten verwenden dieselben Tokens — null Codeänderungen */ Tokens vs. Alternativen
| Ansatz | Wartbarkeit Recommended | Dark Mode | Performance |
|---|---|---|---|
| CSS Custom Properties | Exzellent | Nativer Tausch | Null Runtime |
| Tailwind Utility Classes | Gut | Konfigurationsbasiert | Purge nötig |
| CSS-in-JS (styled-components) | Moderat | Theme Provider | Runtime-Kosten |
| SCSS Variables | Moderat | Manuelle Duplikation | Nur Build-Time |
| Hartcodierte Werte | Schlecht | Unmöglich | N/A |
Dein Token-System einrichten
Token-Implementierungsleitfaden
- Bestehende Styles auditieren
Durchsuche deine Codebasis nach hartcodierten Farbwerten, Pixel-Abständen und Font-Deklarationen. Liste jeden einzigartigen Wert auf — du wirst wahrscheinlich Duplikate und Fast-Duplikate finden, die konsolidiert werden sollten.
- Primitive Tokens definieren
Erstelle deine Rohpalette in tokens/primitives.css. Farben (volle Skalen wie blue-50 bis blue-900), Abstände (4px-Schritte), Schriftgrößen, Schriftfamilien und Schriftgewichte.
- Semantische Tokens erstellen
Mappe Primitive auf bedeutungsvolle Namen in tokens/semantic.css. --color-primary, --color-text, --color-bg, --color-error, --color-success. Diese werden deine Komponenten tatsächlich verwenden.
- Hartcodierte Werte ersetzen
Gehe jede Komponente durch und ersetze Rohwerte mit Token-Referenzen. color: #3b82f6 wird zu color: var(--color-primary). padding: 16px wird zu padding: var(--space-4).
- Dark Mode hinzufügen
Erstelle einen [data-theme="dark"]-Block, der semantische Tokens anderen Primitiven zuweist. Schalte das data-theme-Attribut auf <html> mit einem kleinen Skript um. Jede Komponente passt sich automatisch an.
Token-Dateistruktur in der Praxis
src/styles/
├── global.css → Importiert alle Token-Dateien, Base-Resets
└── tokens/
├── primitives.css → Rohpalette (Farben, Skalen)
├── semantic.css → Bedeutungsvolle Namen (Light-Mode-Standard)
├── dark.css → Dark-Mode-Overrides
├── typography.css → Schriftfamilien, -größen, -gewichte, Zeilenhöhen
├── spacing.css → 8-Punkt-Raster-Werte
└── effects.css → Schatten, Radii, Transitions
Die Macht kaskadierender Tokens
Eines der mächtigsten Muster sind kontextuelle Token-Overrides. Da CSS Custom Properties kaskadieren, kannst du Tokens in bestimmten Kontexten überschreiben:
/* Eine dunkle Card überschreibt Tokens für ihre Kinder */
.card--dark {
--color-bg: var(--gray-900);
--color-text: var(--gray-50);
--color-primary: var(--blue-400);
}
/* Alle Kinder (Überschriften, Text, Links) passen sich automatisch an */ /* Abstands-Tokens für Mobilgeräte anpassen */
@media (max-width: 768px) {
:root {
--space-section: var(--space-6); /* 24px statt 48px */
--font-size-hero: var(--font-size-xl); /* kleinerer Hero-Text */
}
} /* Eine Hero-Sektion mit anderer visueller Behandlung */
.hero {
--color-bg: var(--color-primary);
--color-text: white;
}
/* Alle Organismen innerhalb des Hero erben diese Overrides */ Vorteile im großen Maßstab
Jede Komponente schöpft aus derselben Palette. Keine „Welches Blau war das nochmal?"-Gespräche mehr.
Tausche Token-Werte in einer Datei. Jede Komponente passt sich ohne Änderungen an.
Erzwinge Kontrastverhältnisse auf Token-Ebene. --color-text auf --color-bg erfüllt immer WCAG 4,5:1.
Das 8-Punkt-Raster eliminiert willkürliche Abstände. Jedes Layout hat konsistenten Rhythmus und Raum zum Atmen.
Die gesamte visuelle Identität ändern heißt eine Token-Datei aktualisieren. Keine Komponentenänderungen nötig.
Token-Namen im Code stimmen mit Token-Namen in Figma überein. Designer und Entwickler sprechen die gleiche Sprache.
Häufige Fehler
Frequently Asked Questions
Nein. Tokens repräsentieren Designentscheidungen, nicht jeden CSS-Wert. Eine einmalige 3px-Anpassung für optische Ausrichtung braucht keinen Token. Konzentriere dich auf Werte, die über mehrere Komponenten wiederverwendet werden — Farben, Abstands-Skala, Schriftgrößen, Schatten, Radii und Transitions.
Ja. Konfiguriere deine tailwind.config.js, um CSS Custom Properties zu referenzieren: colors: { primary: "var(--color-primary)" }. So verwenden Tailwind-Utilities deine Token-Werte. Du bekommst die Bequemlichkeit von Utility-Klassen mit Token-basierter Konsistenz.
Verwende fluide Typografie mit clamp(). Definiere Tokens wie --font-size-hero: clamp(2rem, 5vw, 3.5rem). Die Schrift skaliert sanft zwischen Minimum und Maximum ohne Media Queries. Jede Komponente, die den Token verwendet, profitiert automatisch.
Wende Token-Werte als Overrides im Scope der Drittanbieter-Komponente an. Die meisten Komponentenbibliotheken bieten CSS Custom Properties oder klassenbasiertes Theming an. Mappe deine Tokens auf deren Theming-API. So bleibt dein visuelles System auch mit externen Komponenten konsistent.
Wie Design Tokens und Atomic Design in einem realen Projekt mit über 45 Komponenten zusammenspielen, zeigt der Praxis-Bericht: Atomic Design mit Astro.