</>
{ }
React · Storybook 8 · Design System · Component-Driven Development
Storybook 8: Design System
systematisch aufbauen

Ein Design System ohne lebende Dokumentation ist nach sechs Monaten veraltet. Storybook 8 verbindet Component-Driven Development, automatisch generierte Docs und visuelles Regressionstesting zu einem Workflow, der tatsächlich durchgehalten wird – von der ersten Button-Komponente bis zur produktionsreifen Bibliothek.

18 Min. Lesezeit autodocs · Controls · Interactions · Chromatic · Vite Storybook 8.x · React 18/19 · TypeScript

1. Warum Storybook 8 das Design-System-Problem löst

Ein Design System scheitert selten an der Technik – es scheitert an der Pflege. Komponenten werden gebaut, aber nicht dokumentiert. Varianten existieren nur im Kopf des Entwicklers, der sie geschrieben hat. Neue Teammitglieder kennen die Button-Zustände nicht, reproduzieren sie neu und schaffen Inkonsistenz. Storybook 8 löst dieses Problem, indem es die Komponente selbst zur Wahrheitsquelle macht: Stories sind gleichzeitig Dokumentation, Playground und Testgrundlage.

Version 8 brachte gegenüber Version 7 mehrere entscheidende Verbesserungen: Der Vite-Builder ist jetzt der Standard, was Cold-Start-Zeiten von unter einer Sekunde ermöglicht. Die autodocs-Funktion erzeugt vollständige Komponentendokumentationen aus TypeScript-Typen und JSDoc-Kommentaren ohne manuelle MDX-Dateien. Das Test-API @storybook/test ersetzt den alten @storybook/jest-Ansatz durch Vitest-kompatible Funktionen. Und der neue Portable Stories API macht es möglich, Stories direkt in Vitest oder Jest zu importieren und als vollständige Komponententests auszuführen – ohne Browser.

Der wichtigste konzeptionelle Shift: Storybook 8 erzwingt Component-Driven Development. Wer eine Komponente zuerst in Isolation entwickelt und dabei alle Zustände als Stories definiert, bemerkt Designprobleme bevor sie im Kontext der Applikation auftauchen. Accessibility-Checks, Controls für Props und Interaction-Tests laufen während der Entwicklung im Browser – kein Umweg über die echte Applikation nötig.

2. Setup: Storybook 8 mit Vite und React

Die Installation von Storybook 8 in ein bestehendes React-Vite-Projekt ist bewusst einfach gehalten. Der Befehl npx storybook@latest init erkennt das Framework automatisch, installiert die richtigen Abhängigkeiten und erstellt eine funktionierende Grundkonfiguration. Für TypeScript-Projekte wird automatisch ein .storybook/main.ts mit korrektem Framework-String erzeugt. Die Konfigurationsdatei .storybook/preview.ts ist der zentrale Ort für globale Decorators, Parameter und Toolbar-Einstellungen, die für alle Stories gelten.

Die Verzeichnisstruktur spielt eine wichtige Rolle für ein wartbares Design System. Eine bewährte Konvention: Story-Dateien direkt neben den Komponenten abzulegen (Button.stories.tsx neben Button.tsx). Die Glob-Pattern in main.ts erkennt alle *.stories.{ts,tsx}-Dateien automatisch. Für größere Design-System-Bibliotheken lohnt sich ein separates Package in einem Monorepo, das die Komponentenbibliothek von der Applikation trennt und unabhängige Versionen ermöglicht.


// .storybook/main.ts — Storybook 8 Vite configuration
import type { StorybookConfig } from "@storybook/react-vite";

const config: StorybookConfig = {
  // Discover all story files next to their components
  stories: ["../src/**/*.stories.@(ts|tsx|mdx)"],
  addons: [
    "@storybook/addon-essentials",    // controls, docs, actions, viewport
    "@storybook/addon-interactions",  // interaction tests
    "@storybook/addon-a11y",          // accessibility checks
  ],
  framework: {
    name: "@storybook/react-vite",
    options: {},
  },
  docs: {
    autodocs: "tag",  // generate docs for stories tagged with autodocs
  },
  typescript: {
    reactDocgen: "react-docgen-typescript",  // extract props from TypeScript
    reactDocgenTypescriptOptions: {
      shouldExtractLiteralValuesFromEnum: true,
      propFilter: (prop) => !prop.parent?.fileName.includes("node_modules"),
    },
  },
};

export default config;

3. Component Story Format 3 richtig schreiben

Das Component Story Format 3 (CSF3) ist die Grundlage aller modernen Storybook 8-Stories. Jede Story-Datei hat einen Default-Export, der den Komponenten-Metadaten entspricht – Titel, Komponente, Decorator und globale Args. Die einzelnen Stories sind benannte Exports als Objekte mit einer args-Property. Das render-Feld ist optional; ohne es rendert Storybook die Komponente direkt mit den Args. Dieser Ansatz ist deutlich prägnanter als CSF2, wo jede Story eine Funktion sein musste.

Der Typ Meta<typeof Button> und StoryObj<typeof Button> aus @storybook/react geben vollständige TypeScript-Typisierung für Args. Wenn eine Prop in der Komponente required ist, zeigt die IDE sofort einen Fehler, wenn sie in der Story fehlt. Dieses Muster sorgt dafür, dass das Design System mit TypeScript als erste Verteidigungslinie gegen unvollständige Stories arbeitet – automatisch, ohne Extra-Konfiguration.


// Button.stories.tsx — CSF3 with full TypeScript typing
import type { Meta, StoryObj } from "@storybook/react";
import { fn } from "@storybook/test";
import { Button } from "./Button";

// Default export: component metadata
const meta: Meta<typeof Button> = {
  title: "Design System/Atoms/Button",
  component: Button,
  tags: ["autodocs"],  // enables automatic documentation generation
  parameters: {
    layout: "centered",
    docs: {
      description: {
        component: "Primary UI action element. Supports all semantic button variants.",
      },
    },
  },
  argTypes: {
    variant: {
      control: "select",
      options: ["primary", "secondary", "ghost", "danger"],
      description: "Visual hierarchy of the button",
    },
    size: { control: "radio", options: ["sm", "md", "lg"] },
    onClick: { action: "clicked" },
  },
  args: {
    onClick: fn(),  // spy function — tracks calls in Interactions panel
  },
};
export default meta;
type Story = StoryObj<typeof meta>;

// Named exports: individual stories
export const Primary: Story = {
  args: { variant: "primary", size: "md", children: "Jetzt starten" },
};

export const Danger: Story = {
  args: { variant: "danger", size: "md", children: "Unwiderruflich löschen" },
};

export const AllSizes: Story = {
  render: (args) => (
    <div className="flex items-center gap-4">
      {(["sm", "md", "lg"] as const).map((size) => (
        <Button key={size} {...args} size={size}>{size.toUpperCase()}</Button>
      ))}
    </div>
  ),
  args: { variant: "primary", children: "Button" },
};

4. autodocs: Dokumentation automatisch generieren

Das autodocs-Feature von Storybook 8 erzeugt eine vollständige Komponentendokumentation aus TypeScript-Typen und JSDoc-Kommentaren – ohne manuelle MDX-Dateien. Wenn eine Story-Datei den Tag "autodocs" in der Meta-Konfiguration trägt, erstellt Storybook automatisch eine Docs-Seite mit einer Props-Tabelle, Controls für jeden Prop und einer Vorschau aller Stories. Das macht das Design System für Nicht-Entwickler zugänglich: Designer und Product Owner sehen alle Varianten mit interaktiven Steuerelementen, ohne Code lesen zu müssen.

Die Qualität der generierten Dokumentation hängt direkt von der Sorgfalt der TypeScript-Definitionen ab. JSDoc-Kommentare über Props (/** Visuelle Hierarchie des Buttons */) erscheinen in der Docs-Tabelle. Unions werden als Dropdown-Controls dargestellt. Boolean-Props bekommen automatisch einen Toggle. Für komplexe Objekt-Props empfiehlt sich ein explizites argTypes-Mapping in der Meta-Konfiguration, um sinnvolle Controls statt roher JSON-Eingabefelder zu erhalten.

5. Controls und Args: Interaktive Komponentenerkundung

Das Controls-Addon ist das mächtigste Werkzeug für die tägliche Arbeit mit dem Design System. Es erzeugt aus den argTypes-Definitionen automatisch UI-Steuerelemente im Storybook-Panel: Dropdowns, Toggles, Farbpicker, Zahleneingaben und Textfelder. Entwickler und Designer können Komponenten in Echtzeit anpassen, ohne Codeänderungen. Das ist besonders wertvoll für Randfälle: langer Text, leere Zustände, kombinierte Varianten – alles ohne eine Testseite in der Applikation anlegen zu müssen.

Der args-Mechanismus ist die technische Grundlage: Args fließen von der globalen Meta-Ebene über Story-spezifische args bis zu Story-internen render-Funktionen und werden durch Controls live überschrieben. Dieser Datenfluss funktioniert auch für zusammengesetzte Komponenten: Ein Form-Story kann alle Args der enthaltenen Input-Komponente über einen Prefix-Namespace steuern. Das Storybook 8-Composition-Feature erlaubt sogar, mehrere Storybook-Instanzen in einem einzigen Sidebar zusammenzuführen – ideal für Monorepos mit mehreren Paketen.


// Input.stories.tsx — Controls with argTypes and validation states
import type { Meta, StoryObj } from "@storybook/react";
import { Input } from "./Input";

const meta: Meta<typeof Input> = {
  title: "Design System/Atoms/Input",
  component: Input,
  tags: ["autodocs"],
  argTypes: {
    type: {
      control: "select",
      options: ["text", "email", "password", "number", "tel", "url"],
    },
    validationState: {
      control: "radio",
      options: ["idle", "success", "error", "loading"],
      description: "Visual feedback state of the field",
    },
    // Disable auto-generated control for complex callback props
    onChange: { control: false },
    onBlur: { control: false },
  },
};
export default meta;
type Story = StoryObj<typeof meta>;

export const Default: Story = {
  args: {
    label: "E-Mail-Adresse",
    placeholder: "name@example.com",
    type: "email",
    validationState: "idle",
  },
};

export const WithError: Story = {
  args: {
    label: "E-Mail-Adresse",
    defaultValue: "keine-gueltige-mail",
    validationState: "error",
    errorMessage: "Bitte gib eine gültige E-Mail-Adresse ein.",
  },
};

export const AllStates: Story = {
  render: () => (
    <div className="flex flex-col gap-4 w-80">
      {(["idle", "success", "error", "loading"] as const).map((state) => (
        <Input
          key={state}
          label={`Status: ${state}`}
          defaultValue="Eingabewert"
          validationState={state}
          errorMessage={state === "error" ? "Fehlertext hier" : undefined}
        />
      ))}
    </div>
  ),
};

6. Interactions: Stories als echte Tests

Das Interactions-Addon verwandelt Stories in vollständige Integrationstests. Mit @storybook/test – einem auf Vitest basierenden API – schreibt man play-Funktionen direkt in der Story, die Benutzerinteraktionen simulieren und Assertions ausführen. userEvent.click(), userEvent.type() und expect() laufen im Browser und zeigen das Ergebnis im Interactions-Panel. Dieses Muster schließt die Lücke zwischen Storybook-Dokumentation und echten Tests: Die Story beschreibt den Zustand, die play-Funktion beschreibt das Verhalten.

Portable Stories gehen einen Schritt weiter: Mit composeStories() aus @storybook/react lassen sich Stories direkt in Vitest-Testdateien importieren und als React Testing Library-Tests ausführen. Die play-Funktion wird automatisch ausgeführt. Das bedeutet: Eine einzige Story-Definition dient als Dokumentation im Browser, als Interaction-Test in Storybook und als Unit-Test in der CI-Pipeline – ohne Codeduplizierung. Für das Design System ergibt sich dadurch eine Teststrategie mit minimalem Wartungsaufwand.

7. Design Tokens und Theme-Unterstützung

Ein Design System ohne Design Tokens ist kein System, sondern eine Komponentensammlung. Design Tokens sind benannte Variablen für alle wiederkehrenden Werte: Farben, Abstände, Typografie, Schatten, Übergänge. In Storybook lassen sich Tokens über CSS Custom Properties oder eine Theme-Provider-Komponente einbinden. Der Toolbar-Addon erlaubt es, zwischen Themes (Light/Dark, Brand A/Brand B) direkt in der Sidebar zu wechseln – ohne Codeänderung. Das macht Storybook zum idealen Werkzeug für Multibrand-Design-Systeme.

Die Integration von Tailwind CSS in Storybook 8 erfolgt über die preview.ts-Datei: Das globale CSS mit den Tailwind-Direktiven wird dort importiert, sodass alle Klassen in Stories verfügbar sind. Für Design-Token-Dokumentation empfiehlt sich eine eigene MDX-Seite, die alle Tokens visuell darstellt. Storybook 8 erlaubt die freie Kombination aus automatisch generierten CSF-Docs und handgeschriebenen MDX-Seiten – das gibt Freiheit für Branding-Seiten und Nutzungsrichtlinien neben der technischen Komponentendokumentation.

8. Chromatic: Visuelles Regressionstesting

Chromatic ist der offizielle Cloud-Service für Storybook-basiertes visuelles Regressionstesting. Bei jedem Push wird Storybook gebaut und jede Story in einem Cloud-Browser gerendert. Chromatic vergleicht die Screenshots mit der letzten akzeptierten Baseline und zeigt Abweichungen pixelgenau an. Entwickler reviewen Änderungen direkt im Browser, akzeptieren beabsichtigte Änderungen und lehnen unbeabsichtigte Regressionen ab. Der Review-Prozess integriert sich in GitHub-Pull-Requests als Status-Check.

Die CI-Integration ist bewusst einfach: npx chromatic --project-token=<TOKEN> in der Pipeline genügt. Chromatic baut Storybook selbst, erstellt Screenshots und sendet das Ergebnis zurück an den PR. Für das Design System bedeutet das: Jede Komponente ist visuell abgesichert. Ein refactoring der CSS-Schicht, ein Tailwind-Update oder ein Token-Rename wird sofort sichtbar, bevor er in Produktion gelangt. Chromatic bietet einen kostenlosen Tier für Open-Source-Projekte und kleine Teams.

9. Storybook 8 vs. früherer Ansatz im Vergleich

Viele Teams haben vor Storybook 8 mit Demo-Seiten in der Applikation oder separaten Playgrounds gearbeitet. Der Vergleich zeigt, wo Storybook 8 strukturelle Vorteile bietet und wo Kosten entstehen.

Aspekt Demo-Seite / Playground Storybook 8 Vorteil
Dokumentation Manuell, veraltet schnell autodocs aus TypeScript Immer aktuell, kein Overhead
Komponentenzustände Manuell pro Route Stories als deklarative Zustände Alle Varianten sichtbar
Tests Separat in Testing Library play()-Funktion + Portable Stories Story = Doku + Test
Visuelle Regression Gar nicht / manuell Chromatic automatisch Pixelgenauer Vergleich pro PR
Designer-Einbindung Kein Zugang ohne Dev Chromatic Share-Link Review ohne lokale Installation

Der Initialaufwand für Storybook 8 ist real: Stories müssen geschrieben, Argtypen definiert und die CI-Integration aufgesetzt werden. Dieser Aufwand amortisiert sich bei Projekten mit mehr als fünf Entwicklern oder einer Lebensdauer von mehr als sechs Monaten schnell, weil die Reibung bei Komponentenänderungen drastisch sinkt. Für Wegwerfprojekte oder reine Prototypen ist Storybook Overkill.

Mironsoft

React Design Systems, Storybook und Component-Driven Development

Design System, das das Team wirklich nutzt?

Wir bauen Storybook-8-basierte Design Systems auf – mit autodocs, Interaction-Tests, Chromatic-Integration und Token-Architektur. Von der ersten Komponente bis zur versionierten Bibliothek.

Komponentenaudit

Bestandsaufnahme bestehender Komponenten und Identifikation von Inkonsistenzen im Design System

Storybook-Setup

Storybook 8 mit autodocs, Controls, Interactions und Chromatic in eurer Infrastruktur aufsetzen

Token-Architektur

Design-Token-System entwerfen, das Multibrand und Dark Mode ohne Duplizierung unterstützt

10. Zusammenfassung

Storybook 8 ist die ausgereifte Antwort auf das Design-System-Pflegeproblem. Der Vite-Builder macht die Entwicklungsschleife schnell. autodocs erzeugt lebende Dokumentation direkt aus TypeScript-Typen. CSF3 mit StoryObj<typeof Meta> gibt vollständige Typensicherheit. Controls erlauben interaktive Erkundung aller Komponentenzustände. play()-Funktionen machen Stories zu Tests. Chromatic sichert jede Komponente visuell gegen Regressionen ab. Zusammen ergibt das einen Workflow, der vom einzelnen Entwickler bis zum designfreudigen Team ohne Brüche funktioniert.

Der entscheidende Erfolgsfaktor ist die konsequente Story-First-Kultur: Neue Komponenten bekommen zuerst Stories, dann Implementierung. Dieses Muster zwingt dazu, alle Zustände, Varianten und Edge Cases vorab zu durchdenken – ähnlich wie TDD den Designprozess strukturiert. Teams, die diese Disziplin halten, profitieren von einem Design System, das nach Monaten noch genauso klar und konsistent ist wie am ersten Tag.

Storybook 8 Design System — Das Wichtigste auf einen Blick

CSF3 + TypeScript

Meta<typeof Component> und StoryObj geben vollständige Typensicherheit. Fehlende required Props erzeugen sofort IDE-Fehler.

autodocs

Tag "autodocs" in Meta erzeugt vollständige Props-Dokumentation aus TypeScript und JSDoc – ohne manuelle MDX-Dateien.

Interactions

play()-Funktion mit userEvent und expect() macht Stories zu Browser-Tests. Portable Stories nutzen sie in Vitest weiter.

Chromatic

Visuelles Regressionstesting per Screenshot-Vergleich pro PR. Kostenloses Tier für kleine Teams. Review direkt in GitHub-PRs.

11. FAQ: Storybook 8 Design System

1Storybook 7 vs. Storybook 8 – was ändert sich?
Vite als Standard-Builder, Vitest-kompatibles Test-API, Portable Stories für Vitest-Import, tiefere Chromatic-Integration. Cold Start unter einer Sekunde.
2Für jede Komponente eine Story?
Für wiederverwendbare Design-System-Komponenten ja. Container-Komponenten mit Datenabrufen besser in Integration Tests. Grenze: Wiederverwendbarkeit.
3autodocs vs. manuelle MDX-Docs?
autodocs bleibt durch TypeScript-Typen immer aktuell. MDX veraltet bei Prop-Änderungen. Für Designprinzipien und Nutzungsrichtlinien bleibt MDX sinnvoll.
4Tailwind CSS in Storybook integrieren?
Globales CSS mit @import 'tailwindcss' in .storybook/preview.ts importieren. Vite-Projekte lesen die Vite-Config automatisch – kein Extra-Plugin nötig.
5Stories als Vitest-Tests verwenden?
composeStories() aus @storybook/react importiert Story mit play()-Funktion in Vitest. Eine Definition für Doku, Browser-Test und Unit-Test.
6Was kostet Chromatic?
5.000 Snapshots/Monat kostenlos. Größere Projekte zahlen nach Volumen. ROI durch vermiedene visuelle Regressionen überwiegt Kosten schnell.
7Design Tokens in Storybook dokumentieren?
MDX-Seiten mit Farbfeldern, Typografieskalen und Abstandsbeispielen. Toolbar für Theme-Wechsel (Light/Dark). Neben automatischer Komponentendokumentation.
8Storybook mit React Server Components?
Experimentelle RSC-Unterstützung in Storybook 8. Presentational Components ohne Server-spezifische Features funktionieren problemlos. Aktive Weiterentwicklung.
9Stories bei Komponentenänderungen aktuell halten?
TypeScript-Typfehler bei neuen required Props. Chromatic zeigt visuelle Änderungen. Beide Mechanismen machen Story-Drift sichtbar, bevor er zum Problem wird.
10Lohnt Storybook für kleine Projekte?
Unter 3 Entwickler und unter 6 Monate: schwer zu rechtfertigen. Wachsendes Team oder wiederverwendbare Komponentenbibliothek: lohnt ab dem ersten Monat.