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, destructive und ghost.
    • 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:

    VarianteVisueller StilTypische Verwendung
    defaultPrimäre Schaltfläche mit Vollfläche (bg-primary, weißer Text)Wichtigste Handlungsaufforderung (zum Beispiel „Speichern“, „Absenden“).
    outlineTransparenter Hintergrund, sichtbarer RahmenSekundäre oder weniger hervorgehobene Aktion („Abbrechen“).
    destructiveRot/Gefahrenfarbe (bg-destructive)Aktionen mit destruktiven Folgen („Löschen“, „Entfernen“).
    ghostMinimales Styling, dezenter Hover-EffektWeniger betonte Schaltflächen (zum Beispiel Symbole, sekundäre Links).
    linkWie ein Textlink gestaltetFü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 derselben button.tsx ergä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)

    1. Tailwind CSS installieren (falls noch nicht vorhanden):

      npx create-next-app my-app
      cd my-app
      npx tailwindcss init -p
      
    2. shadcn/ui initialisieren

      npx shadcn-ui@latest init
      
    3. Komponenten hinzufügen

      npx shadcn-ui@latest add button card dialog input
      
    4. Importieren und anpassen Deine neuen Komponenten erscheinen in components/ui/.

    🧩 shadcn im Vergleich zu anderen UI-Bibliotheken

    Merkmalshadcn/uiChakra UIMaterial UIHeadless UI
    Codekontrolle✅ Liegt bei dir❌ Durch Bibliothek kontrolliert❌ Durch Bibliothek kontrolliert✅ Liegt bei dir
    StylingTailwindStyled SystemEmotion / CSSTailwind
    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“.