# shadcn/ui
Ein Framework zum Erstellen von UI, Komponenten und Designsystemen. Komponenten werden als Quellcode über die CLI zum Projekt des Benutzers hinzugefügt.
> **WICHTIG:** Alle CLI-Befehle mit dem Paket-Manager des Projekts ausführen: `npx shadcn@latest`, `pnpm dlx shadcn@latest` oder `bunx --bun shadcn@latest` – basierend auf dem `packageManager` des Projekts. Die Beispiele unten verwenden `npx shadcn@latest`, aber ersetzen Sie den Befehl durch den korrekten für das Projekt.
## Aktueller Projektkontext
```json
!`npx shadcn@latest info --json`
Das obige JSON enthält die Projektkonfiguration und die installierten Komponenten. Verwenden Sie npx shadcn@latest docs <component>, um Dokumentations- und Beispiel-URLs für jede Komponente zu erhalten.
Grundsätze
- Vorhandene Komponenten zuerst verwenden. Verwenden Sie
npx shadcn@latest search, um Registries zu durchsuchen, bevor Sie benutzerdefiniertes UI schreiben. Durchsuchen Sie auch Community-Registries. - Komponieren, nicht neu erfinden. Einstellungsseite = Tabs + Card + Formularsteuerelemente. Dashboard = Sidebar + Card + Chart + Table.
- Eingebaute Varianten vor benutzerdefinierten Stilen verwenden.
variant="outline",size="sm", usw. - Semantische Farben verwenden.
bg-primary,text-muted-foreground– niemals Rohwerte wiebg-blue-500.
Kritische Regeln
Diese Regeln werden immer durchgesetzt. Jede verlinkt auf eine Datei mit falschen/richtigen Code-Paaren.
Styling & Tailwind → styling.md
classNamefür Layout, nicht für Styling. Überschreiben Sie niemals Komponentenfarben oder Typografie.- Kein
space-x-*oderspace-y-*. Verwenden Sieflexmitgap-*. Für vertikale Stapel:flex flex-col gap-*. size-*verwenden, wenn Breite und Höhe gleich sind.size-10nichtw-10 h-10.truncate-Kurzform verwenden. Nichtoverflow-hidden text-ellipsis whitespace-nowrap.- Keine manuellen
dark:-Farbüberschreibungen. Semantische Tokens verwenden (bg-background,text-muted-foreground). cn()für bedingte Klassen verwenden. Keine manuellen Template-Literal-Ternär-Schreibweisen.- Kein manuelles
z-indexauf Overlay-Komponenten. Dialog, Sheet, Popover usw. kümmern sich selbst um Ihr Stacking.
Formulare & Eingaben → forms.md
- Formulare verwenden
FieldGroup+Field. Niemals rohesdivmitspace-y-*odergrid gap-*für das Formular-Layout. InputGroupverwendetInputGroupInput/InputGroupTextarea. Niemals rohesInput/Textareainnerhalb vonInputGroup.- Buttons innerhalb von Eingaben verwenden
InputGroup+InputGroupAddon. - Optionssets (2–7 Auswahlmöglichkeiten) verwenden
ToggleGroup. KeineButton-Schleife mit manuellem aktivem Zustand. FieldSet+FieldLegendzum Gruppieren verwandter Checkboxen/Radios. Keindivmit einer Überschrift.- Feldvalidierung verwendet
data-invalid+aria-invalid.data-invalidaufField,aria-invalidauf dem Steuerelement. Für deaktiviert:data-disabledaufField,disabledauf dem Steuerelement.
Komponentenstruktur → composition.md
- Items immer innerhalb ihrer Gruppe.
SelectItem→SelectGroup.DropdownMenuItem→DropdownMenuGroup.CommandItem→CommandGroup. asChild(radix) oderrender(base) für benutzerdefinierte Auslöser verwenden. Prüfen Sie das Feldbasevonnpx shadcn@latest info. → base-vs-radix.md- Dialog, Sheet und Drawer benötigen immer einen Titel.
DialogTitle,SheetTitle,DrawerTitlefür Barrierefreiheit erforderlich. Verwenden SieclassName="sr-only", wenn visuell versteckt. - Vollständige Card-Komposition verwenden.
CardHeader/CardTitle/CardDescription/CardContent/CardFooter. Nicht alles inCardContentpacken. - Button hat kein
isPending/isLoading. MitSpinner+data-icon+disabledkomponieren. TabsTriggermuss innerhalb vonTabsListsein. Auslöser niemals direkt inTabsrendern.Avatarbenötigt immerAvatarFallback. Für den Fall, dass das Bild nicht geladen werden kann.
Komponenten verwenden, kein benutzerdefiniertes Markup → composition.md
- Vorhandene Komponenten vor benutzerdefiniertem Markup verwenden. Prüfen, ob eine Komponente existiert, bevor ein gestyltes
divgeschrieben wird. - Hinweise verwenden
Alert. Keine benutzerdefinierten gestylten Divs bauen. - Leere Zustände verwenden
Empty. Kein benutzerdefiniertes Markup für leere Zustände bauen. - Toast folgt der Projektbasis.
toastaus dertoast-Komponente für Base-UI-Projekte verwenden.toast()vonsonnerfür Radix- und React-Aria-Projekte verwenden. Separatorverwenden anstelle von<hr>oder<div className="border-t">.Skeletonfür Ladeplatzhalter verwenden. Keine benutzerdefiniertenanimate-pulse-Divs.Badgeanstelle von benutzerdefinierten gestylten Spans verwenden.
Icons → icons.md
- Icons in
Buttonverwendendata-icon.data-icon="inline-start"oderdata-icon="inline-end"auf dem Icon. - Keine Größenklassen auf Icons innerhalb von Komponenten. Komponenten kümmern sich über CSS um die Icon-Größe. Kein
size-4oderw-4 h-4. - Icons als Objekte übergeben, nicht als String-Schlüssel.
icon={CheckIcon}, nicht als String-Nachschlage.
Chat & Messaging → chat.md
- Chat-UI komponiert die Chat-Primitive. Konversationen verwenden
MessageScroller, Zeilen verwendenMessage, Oberflächen verwendenBubble. Niemals handgemachte Bubble-Divs oder einen rohen Scroll-Container. MessageScrollerbesitzt das Scroll-Verhalten. Streaming-Follow, Verankerung und Sprung-zu-neuestem (MessageScrollerButton) sind eingebaut. Schreiben Sie keinenuseStickToBottom/ResizeObserver-Hook.- Anhänge verwenden
Attachment; Systemnotizen und Trennlinien verwendenMarker. NichtItem-Karten oderSeparator+ eine Beschriftung.
CLI
- Preset-Codes niemals manuell dekodieren oder Preset-URLs manuell erstellen. Verwenden Sie
npx shadcn@latest preset decode <code>,preset url <code>oderpreset open <code>. Für proaktive Preset-Erkennung verwenden Sienpx shadcn@latest preset resolve. - Preset-Codes direkt mit der CLI anwenden. Verwenden Sie
npx shadcn@latest apply <code>für bestehende Projekte odernpx shadcn@latest init --preset <code>beim Initialisieren.
Schlüsselmuster
Dies sind die häufigsten Muster, die korrekten shadcn/ui-Code auszeichnen. Für Randfälle siehe die verlinkten Regeldateien oben.
// Formular-Layout: FieldGroup + Field, nicht div + Label.
<FieldGroup>
<Field>
<FieldLabel htmlFor="email">E-Mail</FieldLabel>
<Input id="email" />
</Field>
</FieldGroup>
// Validierung: data-invalid auf Field, aria-invalid auf dem Steuerelement.
<Field data-invalid>
<FieldLabel>E-Mail</FieldLabel>
<Input aria-invalid />
<FieldDescription>Ungültige E-Mail.</FieldDescription>
</Field>
// Icons in Buttons: data-icon, keine Größenklassen.
<Button>
<SearchIcon data-icon="inline-start" />
Suchen
</Button>
// Abstand: gap-*, nicht space-y-*.
<div className="flex flex-col gap-4"> // richtig
<div className="space-y-4"> // falsch
// Gleiche Abmessungen: size-*, nicht w-* h-*.
<Avatar className="size-10"> // richtig
<Avatar className="w-10 h-10"> // falsch
// Statusfarben: Badge-Varianten oder semantische Tokens, nicht Rohfarben.
<Badge variant="secondary">+20,1%</Badge> // richtig
<span className="text-emerald-600">+20,1%</span> // falsch
Komponentenauswahl
| Bedarf | Verwenden |
|---|---|
| Button/Aktion | Button mit passender Variante |
| Formulareingaben | Input, Select, Combobox, Switch, Checkbox, RadioGroup, Textarea, InputOTP, Slider |
| Umschalten zwischen 2–5 Optionen | ToggleGroup + ToggleGroupItem |
| Datenanzeige | Table, Card, Badge, Avatar |
| Navigation | Sidebar, NavigationMenu, Breadcrumb, Tabs, Pagination |
| Overlays | Dialog (Modal), Sheet (Seitenpanel), Drawer (unteres Blatt), AlertDialog (Bestätigung) |
| Feedback | toast (Base UI), sonner (Radix/Aria), Alert, Progress, Skeleton, Spinner |
| Befehlspalette | Command innerhalb von Dialog |
| Diagramme | Chart (umhüllt Recharts) |
| Layout | Card, Separator, Resizable, ScrollArea, Accordion, Collapsible |
| Leere Zustände | Empty |
| Menüs | DropdownMenu, ContextMenu, Menubar |
| Tooltips/Info | Tooltip, HoverCard, Popover |
| Chat-/Konversations-UI | MessageScroller, Message, Bubble, Attachment, Marker |
Schlüsselfelder
Der eingefügte Projektkontext enthält diese Schlüsselfelder:
aliases→ das tatsächliche Alias-Präfix für Importe verwenden (z.B.@/,~/), niemals fest codieren.isRSC→ wenntrue, benötigen Komponenten, dieuseState,useEffect, Event-Handler oder Browser-APIs verwenden,"use client"am Anfang der Datei. Dieses Feld immer referenzieren, wenn Sie die Direktive empfehlen.tailwindVersion→"v4"verwendet@theme inline-Blöcke;"v3"verwendettailwind.config.js.tailwindCssFile→ die globale CSS-Datei, in der benutzerdefinierte CSS-Variablen definiert sind. Diese Datei immer bearbeiten, niemals eine neue erstellen.style→ visuelle Behandlung der Komponente (z.B.nova,vega).base→ primitive Bibliothek (radixoderbase). Beeinflusst Komponenten-APIs und verfügbare Props.iconLibrary→ bestimmt Icon-Importe.lucide-reactfürlucide,@tabler/icons-reactfürtablerusw. verwenden. Niemalslucide-reactannehmen.resolvedPaths→ genaue Dateisystem-Ziele für Komponenten, Utils, Hooks usw.framework→ Routing- und Dateikonventionen (z.B. Next.js App Router vs. Vite SPA).packageManager→ für alle Nicht-shadcn-Abhängigkeitsinstallationen verwenden (z.B.pnpm add date-fnsvs.npm install date-fns).preset→ aufgelöster Preset-Code und Werte für das aktuelle Projekt. Verwenden Sienpx shadcn@latest preset resolve --json, wenn Sie nur Preset-Informationen benötigen.
Siehe cli.md — info-Befehl für die vollständige Feldreferenz.
Komponentendokumentation, Beispiele und Verwendung
Führen Sie npx shadcn@latest docs <component> aus, um die URLs für die Dokumentation, Beispiele und API-Referenz einer Komponente zu erhalten. Rufen Sie diese URLs ab, um den tatsächlichen Inhalt zu erhalten.
npx shadcn@latest docs button dialog select
Führen Sie beim Erstellen, Reparieren, Debuggen oder Verwenden einer Komponente immer zuerst npx shadcn@latest docs aus und rufen Sie die URLs ab. Dadurch wird sichergestellt, dass Sie mit der korrekten API und den korrekten Verwendungsmustern arbeiten, anstatt zu raten.
Arbeitsablauf
- Projektkontext abrufen — bereits oben eingefügt. Führen Sie
npx shadcn@latest infoerneut aus, wenn Sie ihn aktualisieren müssen. - Zuerst installierte Komponenten prüfen — vor dem Ausführen von
addimmer die Liste dercomponentsaus dem Projektkontext prüfen oder das VerzeichnisresolvedPaths.uiauflisten. Importieren Sie keine Komponenten, die nicht hinzugefügt wurden, und fügen Sie keine Komponenten, die bereits installiert sind, erneut hinzu. - Komponenten finden —
npx shadcn@latest search. - Dokumentation und Beispiele abrufen — führen Sie
npx shadcn@latest docs <component>aus, um URLs zu erhalten, und rufen Sie diese dann ab. Verwenden Sienpx shadcn@latest view, um Registry-Elemente zu durchsuchen, die Sie nicht installiert haben. Verwenden Sienpx shadcn@latest add --diff, um Änderungen an installierten Komponenten in der Vorschau anzuzeigen. - Installieren oder aktualisieren —
npx shadcn@latest add. Verwenden Sie beim Aktualisieren vorhandener Komponenten--dry-runund--diff, um Änderungen zuerst in der Vorschau anzuzeigen (siehe Komponenten aktualisieren unten). - Importe in Drittanbieter-Komponenten korrigieren — Nach dem Hinzufügen von Komponenten aus Community-Registries (z.B.
@bundui,@magicui) überprüfen Sie die hinzugefügten Nicht-UI-Dateien auf fest codierte Importpfade wie@/components/ui/.... Diese stimmen möglicherweise nicht mit den tatsächlichen Aliasen des Projekts überein. Verwenden Sienpx shadcn@latest info, um den korrektenui-Alias zu erhalten (z.B.@workspace/ui/components) und schreiben Sie die Importe entsprechend um. Die CLI schreibt Importe für ihre eigenen UI-Dateien um, aber Drittanbieter-Registry-Komponenten können Standardpfade verwenden, die nicht mit dem Projekt übereinstimmen. - Hinzugefügte Komponenten überprüfen — Nach dem Hinzufügen einer Komponente oder eines Blocks aus einer beliebigen Registry lesen Sie immer die hinzugefügten Dateien und überprüfen Sie, ob sie korrekt sind. Überprüfen Sie auf fehlende Unterkomponenten (z.B.
SelectItemohneSelectGroup), fehlende Importe, falsche Komposition oder Verstöße gegen die Kritischen Regeln. Ersetzen Sie auch alle Icon-Importe mit dericonLibrarydes Projekts aus dem Projektkontext (z.B. wenn das Registry-Elementlucide-reactverwendet, das Projekt aberhugeiconsverwendet, tauschen Sie die Importe und Icon-Namen entsprechend aus). Beheben Sie alle Probleme, bevor Sie fortfahren. - Registry muss explizit sein — Wenn der Benutzer das Hinzufügen eines Blocks oder einer Komponente verlangt, raten Sie nicht die Registry. Wenn keine Registry angegeben ist (z.B. der Benutzer sagt "Füge einen Login-Block hinzu" ohne Angabe von
@shadcn,@tailark,owner/repousw.), fragen Sie, welche Registry verwendet werden soll. Verwenden Sie niemals standardmäßig eine Registry im Namen des Benutzers. - Presets wechseln — Fragen Sie zuerst den Benutzer: Überschreiben, Teilweise, Zusammenführen oder Überspringen?
- Aktuelles Preset inspizieren:
npx shadcn@latest preset resolve. Verwenden Sie--json, wenn Sie strukturierte Werte benötigen. - Eingehendes Preset inspizieren:
npx shadcn@latest preset decode <code>. Verwenden Siepreset url <code>oderpreset open <code>, um den Preset-Builder zu teilen oder zu öffnen. - Überschreiben:
npx shadcn@latest apply <code>. Überschreibt erkannte Komponenten, Schriftarten und CSS-Variablen. - Teilweise:
npx shadcn@latest apply <code> --only theme,font. Aktualisiert nur die ausgewählten Preset-Teile, ohne UI-Komponenten neu zu installieren. Unterstützte Werte sindthemeundfont; durch Kommas getrennte Kombinationen sind erlaubt.iconwird absichtlich nicht unterstützt, da Icon-Änderungen eine vollständige Neuinstallation der Komponenten erfordern können, um Inkonsistenzen zu vermeiden. - Zusammenführen: Führen Sie zuerst
npx shadcn@latest diffaus, um Unterschiede zwischen den installierten Komponenten und dem neuen Preset zu sehen. Verwenden Sie dannnpx shadcn@latest apply <code> --only theme,font, um nur Design- und Schriftarteinstellungen zu übernehmen, und installieren Sie Komponenten einzeln nach Bedarf. Für Komponentenkonflikte verwenden Sienpx shadcn@latest add <component> --diff, um Änderungen zu überprüfen, bevor Sie sie anwenden.
- Aktuelles Preset inspizieren:
Komponenten aktualisieren
Führen Sie zum Aktualisieren den Add-Befehl für die Komponente aus. Überprüfen Sie zuerst mit --dry-run und --diff, was sich ändert:
npx shadcn@latest add button --dry-run
npx shadcn@latest add button --diff
npx shadcn@latest add button
Fehlerbehebung
Bauschritte
Wenn Kompilierungsfehler auftreten:
- befehl ausführen:
npx shadcn@latest info --json– wenn dies fehlschlägt, ist shadcn nicht richtig eingerichtet. - JSON parsen – Der Kontext sollte unter dem Schlüssel
componentseine Liste installierter Komponenten enthalten. - Pfad auf Existenz prüfen – Prüfen Sie, ob
resolvedPaths.uivorhanden ist, mit den erwarteten Dateien. - Datei lesen – Wenn eine Komponentendatei beschädigt zu sein scheint, lesen Sie sie direkt.
Das Terminal kann shadcn nicht ausführen
Wenn der Befehl nicht gefunden wird, liegt dies daran, dass er nicht global installiert ist. Verwenden Sie stattdessen den Paket-Manager Ihres Projekts:
- npm:
npx shadcn@latest - pnpm:
pnpm dlx shadcn@latest - bun:
bunx --bun shadcn@latest
Fehler "No components.json found" (Keine components.json gefunden)
Wenn keine components.json vorhanden ist, initialisieren Sie shadcn/ui zuerst:
npx shadcn@latest init
Fehler beim Auflösen von Importen
Drittanbieter-Registry-Komponenten verwenden manchmal @/components/ui als Standard-Importpfad. Passen Sie die Importe an den tatsächlichen Alias des Projekts an, der in npx shadcn@latest info --json unter aliases.ui zu finden ist.
Verwaltung von Projektabhängigkeiten
- shadcn/ui-spezifische Aktionen verwenden immer den
packageManagerdes Projekts (aus dem Task-Kontext oder dem Ergebnis vonnpx shadcn@latest info). Beispiel:npx shadcn@latest add button. - Nicht-shadcn-Abhängigkeiten (z.B.
date-fns,zod,recharts) werden mit dem Paket-Manager des Projekts installiert:npm install date-fns,pnpm add date-fnsusw. - Installieren Sie keine Abhängigkeiten erneut, die bereits installiert sind. Prüfen Sie die
package.jsondes Projekts oder die Liste der installierten Abhängigkeiten. - Verwenden Sie immer
--save-exact, wenn Sie Abhängigkeiten installieren (z.B.pnpm add recharts --save-exact), um eine konsistente Paketauflösung zu gewährleisten.
Verwendung von Hooks
- Verwenden Sie
use-mobileaus@/hooks/use-mobile. - Siehe hooks.md für die vollständige Liste der verfügbaren Hooks.
Fehlerbehandlung mit KI
Wenn beim Erstellen, Hinzufügen, Aktualisieren oder Debuggen von Komponenten ein Fehler auftritt:
- Führen Sie
npx shadcn@latest infoerneut aus, um den Projektkontext zu aktualisieren, falls der Fehler durch eine Änderung ancomponents.jsonverursacht wurde. - Wenn der Fehler auf eine fehlerhafte Bedienung zurückzuführen zu sein scheint (z.B. eine nicht installierte Komponente verwenden), installieren Sie zuerst die erforderlichen Komponenten.
- Wenn der Fehler auf einen fehlerhaften Import oder eine fehlerhafte API zurückzuführen zu sein scheint, lesen Sie die Komponentendokumentation mit
npx shadcn@latest docs.```