- Veröffentlicht am
Was ist shadcn/ui? Zweck, Vorteile und Einsatz in modernen React-Anwendungen verstehen
- Autoren
Was ist shadcn/ui? Zweck, Vorteile und Einsatz in modernen React-Anwendungen verstehen
Moderne React-Projekte stehen oft vor einer schwierigen Abwägung: Solltest du eine fertige UI-Bibliothek verwenden (schnell, aber unflexibel) oder dein eigenes System entwerfen (flexibel, aber aufwendig zu entwickeln)?
Hier kommt shadcn/ui ins Spiel, ein neuer Ansatz für die UI-Entwicklung, der dir volle Kontrolle über deinen Code und zugleich die Ausgereiftheit einer etablierten Komponentenbibliothek bietet.
In diesem Leitfaden sehen wir uns an, was shadcn/ui ist, warum es bei React- und Next.js-Entwicklern so beliebt geworden ist und wie du damit deine eigene UI-Arbeit beschleunigen kannst, ohne Flexibilität zu verlieren.
Was ist shadcn/ui?
shadcn/ui (oft einfach shadcn geschrieben) ist kein traditionelles npm-Paket und keine Komponentenbibliothek mit anpassbaren Themes wie Material UI oder Chakra UI.
Stattdessen ist es eine Sammlung hochwertiger, quelloffener React-Komponenten auf Basis von:
- Tailwind CSS (für das Styling)
- Radix UI (für barrierefreie Grundbausteine ohne Styling)
- Lucide Icons (für klare, einheitliche SVG-Symbole)
Der entscheidende Unterschied:
Statt es als Abhängigkeit zu installieren, kopierst du den tatsächlichen Quellcode jeder Komponente in dein eigenes Projekt.
Damit liegt jede Schaltfläche, jeder Dialog und jedes Dropdown in deiner eigenen Codebasis. Du kannst sie bearbeiten, mit Themes versehen und selbst versionieren.
Du kannst es dir als Komponentengenerator oder UI-Starterkit vorstellen, nicht als Abhängigkeit.
Wie es funktioniert
Das Projekt shadcn/ui bietet ein CLI-Werkzeug, das Komponenten direkt in deinem Projekt anlegt:
npx shadcn-ui@latest add button
Dieser Befehl lädt eine vorgefertigte, barrierefreie Button-Komponente herunter und fügt sie deinem lokalen Ordner components/ui/ hinzu. Anschließend kannst du sie anpassen, Tailwind-Klassen ändern, Varianten abstimmen oder sie deinem Designsystem anpassen.
Jede Komponente besteht lediglich aus React + Tailwind + Radix, ohne versteckte Logik oder Laufzeitabhängigkeit.
Warum Entwickler shadcn/ui verwenden
1. Vollständige Kontrolle über den Code
Anders als bei UI-Bibliotheken mit undurchsichtigen Abhängigkeiten stellt shadcn dir den vollständigen Komponentenquellcode bereit. Du kannst:
- Stile direkt bearbeiten
- Props oder Varianten hinzufügen
- Eigene Logik integrieren (etwa Analysen oder Berechtigungen)
Deine Oberfläche, deine Regeln. Du musst nicht darauf warten, dass die Maintainer einen PR zusammenführen.
2. Auf bewährten Grundlagen aufgebaut
Jede Komponente verwendet:
- Tailwind CSS → Utility-first-Styling
- Radix UI → Barrierefreie Grundbausteine ohne vorgegebenes Styling
- Lucide Icons → Moderne SVG-Symbole
- clsx / tailwind-variants → Übersichtliche bedingte Klassenverwaltung
Das gewährleistet, dass deine Komponenten sowohl barrierefrei als auch produktionsreif sind und von Anfang an bewährten Vorgehensweisen für Designsysteme folgen.
3. Einheitlichkeit und Geschwindigkeit
Du erhältst einen stimmigen, ansprechenden Ausgangspunkt für deine Benutzeroberfläche:
- Einheitliche Abstände, Typografie und ein einheitliches Farbsystem
- Dunkelmodus und Themes über CSS-Variablen
- Einsatzbereite Layouts und Interaktionsmuster (Dropdowns, Modalfenster, Tooltips)
Du kannst Oberflächen ausliefern, die bewusst gestaltet wirken, ohne jede Komponente neu zu erfinden.
4. Keine Anbieterbindung
Da die Komponenten einfach Code sind, kannst du:
- Eigene Abspaltungen erstellen
- Sie ersetzen
- Sie mit anderen Bibliotheken kombinieren
Sollte sich shadcn/ui ändern oder nicht mehr zu deinen Anforderungen passen, gehören deine Komponenten weiterhin vollständig dir.
Häufige Komponenten und Beispiele
Hier sind einige der beliebtesten Komponenten von shadcn/ui und Beispiele für ihren Einsatz.
Beispiel 1: Schaltfläche
import { Button } from '@/components/ui/button'
export default function Example() {
return (
<div className="space-x-2">
<Button>Default</Button>
<Button variant="outline">Outline</Button>
<Button variant="destructive">Delete</Button>
</div>
)
}
Warum das gut ist:
- Integrierte Varianten wie
outline,destructiveundghost. - Vollständig über die Design-Tokens von Tailwind mit Themes gestaltbar.
- Einfach genug für Anpassungen, ohne Einheitlichkeit zu verlieren.
Die Schaltflächenvarianten verstehen
Führe dazu Folgendes aus:
npx shadcn-ui@latest add button
Die CLI erstellt daraufhin eine Datei button.tsx in components/ui/, üblicherweise in dieser Form:
// components/ui/button.tsx
import * as React from 'react'
import { cva } from 'class-variance-authority'
import { cn } from '@/lib/utils'
const buttonVariants = cva(
'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none',
{
variants: {
variant: {
default: 'bg-primary text-primary-foreground hover:bg-primary/90',
outline: 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',
destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
ghost: 'hover:bg-accent hover:text-accent-foreground',
link: 'text-primary underline-offset-4 hover:underline',
},
size: {
default: 'h-10 px-4 py-2',
sm: 'h-9 rounded-md px-3',
lg: 'h-11 rounded-md px-8',
icon: 'h-10 w-10',
},
},
defaultVariants: {
variant: 'default',
size: 'default',
},
}
)
export interface ButtonProps
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
VariantProps<typeof buttonVariants> {}
function Button({ className, variant, size, ...props }: ButtonProps) {
return <button className={cn(buttonVariants({ variant, size, className }))} {...props} />
}
export { Button, buttonVariants }
Was sind also outline, destructive und ghost?
Das sind Stilvarianten, die in dieser buttonVariants-Konfiguration vordefiniert sind. Du musst sie nicht manuell definieren. Sie werden standardmäßig mit der generierten Komponente geliefert.
Jede Variante entspricht einem anderen Muster von Tailwind-Klassen:
| Variante | Visueller Stil | Typische Verwendung |
|---|---|---|
default | Primäre Schaltfläche mit Vollfläche (bg-primary, weißer Text) | Wichtigste Handlungsaufforderung (zum Beispiel „Speichern“, „Absenden“). |
outline | Transparenter Hintergrund, sichtbarer Rahmen | Sekundäre oder weniger hervorgehobene Aktion („Abbrechen“). |
destructive | Rot/Gefahrenfarbe (bg-destructive) | Aktionen mit destruktiven Folgen („Löschen“, „Entfernen“). |
ghost | Minimales Styling, dezenter Hover-Effekt | Weniger betonte Schaltflächen (zum Beispiel Symbole, sekundäre Links). |
link | Wie ein Textlink gestaltet | Für Navigation innerhalb eines Texts. |
Ein Beispiel:
<Button variant="destructive">Delete</Button>
Damit weist du die Komponente Button an, den roten Gefahrenstil zu verwenden, weil die Variante auf bg-destructive und text-destructive-foreground abgebildet wird.
Was sind „Tailwind Design-Tokens“?
„Design-Tokens“ sind benannte Farb- und Abstandsvariablen, die in deinem gesamten Theme verwendet werden. In shadcn/ui werden sie in deiner globals.css (oder tailwind.config.js) folgendermaßen definiert:
:root {
--background: 0 0% 100%;
--foreground: 222.2 47.4% 11.2%;
--primary: 222.2 47.4% 11.2%;
--primary-foreground: 210 40% 98%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 210 40% 98%;
/* etc. */
}
Anschließend referenziert Tailwind sie als „Tokens“ über seine theme()-Syntax oder Klassenkurzformen:
className = 'bg-primary text-primary-foreground hover:bg-primary/90'
Diese Tokens:
- Halten Farben über Komponenten hinweg einheitlich.
- Unterstützen den Dunkelmodus automatisch über CSS-Variablen.
- Ermöglichen Designern und Entwicklern eine gemeinsame visuelle Sprache (zum Beispiel „primär“, „Akzent“, „destruktiv“) statt reiner Hex-Codes.
Warum das nützlich ist
- Du kannst Varianten (zum Beispiel
success,warning) einfach in derselbenbutton.tsxergänzen oder ändern. - Deine Oberfläche bleibt visuell einheitlich, da alle Varianten auf gemeinsame Design-Tokens zugreifen.
- Änderungen deines Themes (Farben, Abstände usw.) aktualisieren sofort alle Komponenten.
- Es ist flexibel. Verwende die integrierten Varianten oder erweitere sie passend zu deiner Marke.
Kurz gesagt: Diese Varianten (outline, destructive, ghost usw.) sind vorgefertigte Stile auf Basis von Design-Tokens, die du erweitern oder überschreiben kannst. Sie tragen dazu bei, dass shadcn/ui-Komponenten direkt produktionsreif, einheitlich, themefähig und leicht anpassbar sind.
Beispiel 2: Dialog (Modalfenster)
import {
Dialog,
DialogContent,
DialogHeader,
DialogTitle,
DialogTrigger,
} from '@/components/ui/dialog'
export default function Example() {
return (
<Dialog>
<DialogTrigger asChild>
<Button>Open Dialog</Button>
</DialogTrigger>
<DialogContent>
<DialogHeader>
<DialogTitle>Confirm Action</DialogTitle>
</DialogHeader>
<p>This action cannot be undone.</p>
</DialogContent>
</Dialog>
)
}
Warum das gut ist: Der Dialog verwendet im Hintergrund Radix-Grundbausteine. Das bedeutet, dass er von Anfang an über die Tastatur bedienbar, für Screenreader geeignet und responsiv ist.
Beispiel 3: Eingabe- und Formularkomponenten
import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
export default function LoginForm() {
return (
<form className="space-y-4">
<div>
<Label htmlFor="email">Email</Label>
<Input id="email" type="email" placeholder="you@example.com" />
</div>
<Button type="submit">Login</Button>
</form>
)
}
Klar, minimal und für jede Authentifizierungs- oder Einstellungsseite leicht erweiterbar.
Wann du shadcn/ui verwenden solltest und wann nicht
✅ Verwende es, wenn
- Du ein individuelles Produkt (SaaS, Dashboard, Anwendung) entwickelst und schnell eine einheitliche Oberfläche möchtest.
- Du volle Kontrolle über Design und Barrierefreiheit benötigst.
- Du bereits Tailwind CSS und Next.js verwendest.
❌ Vermeide es, wenn
- Du ein direkt einsetzbares Designsystem bevorzugst (wie MUI, Chakra UI).
- Du Tailwind nicht verwendest (es ist eng daran gekoppelt).
- Du extrem schnell vorankommen möchtest, ohne Komponentencode anzufassen.
Einstieg (schnelle Einrichtung)
Tailwind CSS installieren (falls noch nicht vorhanden):
npx create-next-app my-app cd my-app npx tailwindcss init -pshadcn/ui initialisieren
npx shadcn-ui@latest initKomponenten hinzufügen
npx shadcn-ui@latest add button card dialog inputImportieren und anpassen Deine neuen Komponenten erscheinen in
components/ui/.
🧩 shadcn im Vergleich zu anderen UI-Bibliotheken
| Merkmal | shadcn/ui | Chakra UI | Material UI | Headless UI |
|---|---|---|---|---|
| Codekontrolle | ✅ Liegt bei dir | ❌ Durch Bibliothek kontrolliert | ❌ Durch Bibliothek kontrolliert | ✅ Liegt bei dir |
| Styling | Tailwind | Styled System | Emotion / CSS | Tailwind |
| Barrierefreiheit | ✅ Radix UI | ✅ | ✅ | ✅ |
| Themes | ✅ (CSS-Variablen + Tailwind) | ✅ | ✅ | ⚙️ Individuell |
| Lernkurve | 🟢 Niedrig | 🟢 Mittel | 🔴 Hoch | 🟡 Mittel |
| Anpassungsfreiheit | 🟢 Vollständig | 🟡 Teilweise | 🔴 Begrenzt | 🟢 Vollständig |
Wichtigste Erkenntnisse
- shadcn/ui ist kein Paket, sondern ein Komponentenmodell zum Kopieren und selbst Verwalten.
- Du erhältst echte Kontrolle, keine Bindung und eine hervorragende Entwicklererfahrung.
- Auf Basis von Tailwind, Radix und modernen React-Mustern ist es ideal für Teams, die eine klare, barrierefreie und erweiterbare Designgrundlage möchten.
Es ist der ideale Mittelweg zwischen „alles selbst entwickeln“ und „von einer umfangreichen UI-Bibliothek abhängen“.