Design Tokens — colors, spacing, typography as CSS custom properties
13 min read

Design Tokens: Das Fundament jedes Design-Systems

#CSS #Design Tokens #Design Systems

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.

Jina Anne Gründerin der Design Tokens Community Group

Warum Design Tokens wichtig sind

1
Quelle der Wahrheit
Token-Datei
200+
Synchronisierte Komponenten
Automatisch
0
Hartcodierte Werte
Ziel

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

Farb-Token-Palette Visualisierung
Farb-Tokens

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.

Abstands-Rastersystem Visualisierung
Abstands-Tokens

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.

Typografie-Skala Demonstration
Typografie-Tokens

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- und Animations-Token-Beispiele
Effekte & Bewegung

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

  1. 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.

  2. 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.

  3. 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.

  4. 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).

  5. 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

Markenkonsistenz

Jede Komponente schöpft aus derselben Palette. Keine „Welches Blau war das nochmal?"-Gespräche mehr.

Dark Mode gratis

Tausche Token-Werte in einer Datei. Jede Komponente passt sich ohne Änderungen an.

Eingebaute Barrierefreiheit

Erzwinge Kontrastverhältnisse auf Token-Ebene. --color-text auf --color-bg erfüllt immer WCAG 4,5:1.

Räumliche Harmonie

Das 8-Punkt-Raster eliminiert willkürliche Abstände. Jedes Layout hat konsistenten Rhythmus und Raum zum Atmen.

Einfaches Rebranding

Die gesamte visuelle Identität ändern heißt eine Token-Datei aktualisieren. Keine Komponentenänderungen nötig.

Design-Dev-Synchronisation

Token-Namen im Code stimmen mit Token-Namen in Figma überein. Designer und Entwickler sprechen die gleiche Sprache.

Häufige Fehler

Frequently Asked Questions

Wie Design Tokens und Atomic Design in einem realen Projekt mit über 45 Komponenten zusammenspielen, zeigt der Praxis-Bericht: Atomic Design mit Astro.