shadcn/ui Troubleshooting: Stilkonflikte, fehlende Komponenten, TypeScript-Fehler
Sie starren auf die Button-Komponente auf dem Bildschirm – eigentlich sollte es ein schöner blauer Button sein, sieht aber aus wie ein ganz normaler HTML-Button, ohne abgerundete Ecken.
In den letzten drei Monaten habe ich mehr Fallen als Code geschrieben. Stilkonflikte, fehlgeschlagene Komponenten-Renderings, TypeScript-Fehler – das sind quasi die „Spezialitäten” von shadcn/ui. In fast jedem neuen Projekt tauchen ein paar davon auf.
Heute fasse ich diese häufigen Probleme und Lösungen zusammen – damit Sie weniger Umwege machen müssen.
Stilkonflikte: Fehlersuche
Stilkonflikte sind das häufigste Problem – etwa 40 % aller Fälle. Die Hauptursachen:
CSS-Variablen-Konflikte
shadcn/ui nutzt CSS-Variablen für Theme-Farben. Diese stehen in globals.css:
:root {
--background: 0 0% 100%;
--foreground: 222.2 84% 4.9%;
--primary: 222.2 47.4% 11.2%;
--primary-foreground: 210 40% 2%;
}
Das Problem: Wenn Ihr Projekt schon ein eigenes Theme hat oder Sie Tailwind-Farben vor der shadcn/ui-Installation angepasst haben, können die Konfigurationen kollidieren.
Wie prüfen?
Öffnen Sie globals.css und prüfen Sie, ob alle CSS-Variablen vorhanden sind. Dann die colors-Konfiguration in tailwind.config.js:
module.exports = {
theme: {
extend: {
colors: {
border: "hsl(var(--border))",
input: "hsl(var(--input))",
ring: "hsl(var(--ring))",
background: "hsl(var(--background))",
foreground: "hsl(var(--foreground))",
primary: {
DEFAULT: "hsl(var(--primary))",
foreground: "hsl(var(--primary-foreground))",
},
},
},
},
}
Beide Seiten müssen zusammenpassen. Fehlt eine Variable, greift der zugehörige Style nicht.
Meine Erfahrung: Sichern Sie tailwind.config.js und globals.css vor der shadcn/ui-Installation. Nach der Installation Dateien vergleichen und überschriebene Einstellungen manuell zurückholen.
Shadow DOM und Tailwind
Interessanter Fall: Shadow DOM isoliert Styles – Tailwind-Klassen durchdringen die Shadow-DOM-Grenze nicht.
Typisch bei der Dialog-Komponente: DialogContent rendert per Portal in document.body – außerhalb des Shadow DOM – und die Styles fehlen.
Zwei Lösungsansätze:
Erstens, Shadow DOM weglassen:
const MyDialogWC = r2wc(MyDialog, {
shadow: null // Shadow DOM deaktivieren
});
Portal funktioniert dann, aber die Isolation entfällt. Globale Styles manuell steuern und auf Klassennamen-Konflikte achten.
Zweitens, Safelist für Klassen:
// tailwind.config.js
module.exports = {
safelist: [
'bg-primary',
'text-primary-foreground',
'hover:bg-primary/90',
'bg-red-500',
'h-9',
'h-10',
'px-3',
'px-4',
],
}
Styles werden generiert, aber Safelist vergrößert die CSS-Datei – abwägen.
Koexistenz mit anderen UI-Bibliotheken
Nutzen Sie schon MUI (Material-UI) und wollen zu shadcn/ui migrieren, gibt es Stilkonflikte.
Ursache: Tailwinds Preflight setzt Browser-Defaults zurück – auch MUI-Styles, Komponenten wirken kaputt.
Häufiger Versuch: Preflight deaktivieren:
module.exports = {
corePlugins: {
preflight: false, // Preflight deaktivieren
},
}
Nebenwirkung: Tailwind-Styles leiden mit – manche Komponenten rendern falsch.
Besserer Ansatz: Tailwind-Prefix für alle Klassen:
module.exports = {
prefix: 'tw-', // Klassen werden tw-bg-blue-500
}
Tailwind- und MUI-Klassen kollidieren nicht. Sie müssen tw- vor jede Klasse setzen – etwas umständlich.
Mein Rat: Bei vielen MUI-Komponenten nicht alles auf einmal migrieren. Prefix-Koexistenz, neue Teile mit shadcn/ui, alte schrittweise anpassen.
Überschriebene Tailwind-Konfiguration
Den habe ich mehrfach erwischt.
Nach npx shadcn-ui@latest init wird die Tailwind-Konfiguration überschrieben – besonders das plugins-Array. Hatten Sie @tailwindcss/forms oder andere Plugins, sind sie weg.
Symptome: Formularfelder sehen plötzlich seltsam aus, manche Komponenten ohne Style.
Schritte:
- Backup von
tailwind.config.jsvor der Installation öffnen - Mit der neuen Konfiguration vergleichen
- Fehlende Plugins ergänzen:
module.exports = {
// ... weitere Konfiguration
plugins: [
require("@tailwindcss/forms"), // wieder hinzufügen
require("tailwindcss-animate"),
],
}
Prävention: Vor shadcn/ui Konfiguration sichern oder ein Skript für alle Plugins führen.
Komponenten rendern nicht: Fehlersuche
Styles ok, Komponente unsichtbar? Auch häufig.
Falsche content-Pfade
Tailwind muss wissen, in welchen Dateien Klassen vorkommen – sonst kein CSS. Das steht in content in tailwind.config.js.
Typisch: Das shadcn/ui-Komponentenverzeichnis fehlt in content.
Konfiguration prüfen:
module.exports = {
content: [
'./src/app/**/*.{ts,tsx}',
'./src/components/**/*.{ts,tsx}', // muss enthalten sein
'./app/**/*.{ts,tsx}',
'./pages/**/*.{ts,tsx}',
],
}
Liegen Komponenten in node_modules einer UI-Lib, ergänzen:
content: [
// ... weitere Pfade
'./node_modules/@your-ui-lib/**/*.{ts,tsx}',
]
Meine Erfahrung: Bei jedem neuen Komponentenordner den Pfad in content eintragen – sonst scannt Tailwind nicht und generiert keine Klassen.
globals.css-Pfad
shadcn/ui braucht eine CSS-Datei für Theme-Variablen – Pfad in components.json.
Typisch: falscher Pfad oder mehrere globals.css.
Prüfen:
Zuerst components.json:
{
"style": "default",
"css": "src/app/globals.css", // dieser Pfad
}
Dann:
- Existiert die Datei?
- Nur eine globals.css im Projekt?
- Wird globals.css im Entry korrekt importiert?
Mehrere globals.css? Überflüssige löschen, eine behalten.
Import prüfen:
In Next.js sollte globals.css in app/layout.tsx oder pages/_app.tsx importiert werden:
import '@/app/globals.css' // oder './globals.css'
Ohne Import greifen CSS-Variablen nicht – Komponenten verlieren den Style.
Undefinierte CSS-Variablen
globals.css existiert, Variablen fehlen trotzdem.
Typisch Dark Mode: nach Wechsel falsche Farben – Dark-Mode-Variablen fehlen.
globals.css prüfen:
:root {
--background: 0 0% 100%;
--foreground: 222.2 84% 4.9%;
}
.dark {
--background: 222.2 84% 4.9%;
--foreground: 210 40% 2%;
}
Unter .dark müssen Variablen definiert sein – sonst kein Dark-Mode-Style.
Tailwind v4:
Andere Konfiguration:
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-primary: var(--primary);
}
@theme inline ist Pflicht – sonst erkennt Tailwind v4 die Variablen nicht.
Groß-/Kleinschreibung bei Import-Pfaden
Zweimal erwischt.
Windows: Dateinamen case-insensitive. Linux/Mac: sensitive. Lokal ok, Produktion bricht.
Symptom: lokal rendert, auf dem Server Modul nicht gefunden.
Typischer Fehler:
// ❌ Falsch: Button mit großem B
import { Button } from "@/components/ui/Button"
// ✅ Richtig: button kleingeschrieben
import { Button } from "@/components/ui/button"
shadcn/ui-Dateinamen sind kleingeschrieben – Import-Pfad auch.
Prüfen: Alle Import-Statements gegen Dateinamen – besonders Produktions-Fehlermeldungen.
TypeScript-Typfehler: Fehlersuche
Seltener, aber nervig.
variant-Typfehler
Die Button-Komponente hat variant (default, destructive, outline …).
Typische Meldung:
Type '{ variant: string }' is not assignable to type 'IntrinsicAttributes & ButtonProps'.
Property 'variant' does not exist on type 'IntrinsicAttributes & ButtonProps'.
Ursache: variant ist in der Typdefinition der Button-Komponente nicht korrekt exportiert.
Prüfen:
components/ui/button.tsx öffnen:
const buttonVariants = cva(
"inline-flex items-center justify-center rounded-md text-sm font-medium",
{
variants: {
variant: {
default: "bg-primary text-primary-foreground hover:bg-primary/90",
destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
},
},
}
)
interface ButtonProps
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
VariantProps<typeof buttonVariants> {
// VariantProps muss hier stehen
}
Fehlt VariantProps<typeof buttonVariants>, fehlt der Typ für variant.
Meine Erfahrung: Bei solchen Fehlern zuerst die Komponenten-Typen prüfen – VariantProps muss vererbt sein.
React-Versions-Inkompatibilität
React 19, manche Dependencies noch nicht kompatibel – Typfehler.
Typische Meldung:
npm error ERESOLVE unable to resolve dependency tree
npm error Found: [email protected]
Zwei Wege:
Erstens, erzwungene Installation:
npm install --legacy-peer-deps
# oder
npm install --force
Peer-Dependency-Anforderungen werden ignoriert – mögliche Laufzeitprobleme.
Zweitens, React downgraden:
npm install react@18 react-dom@18
React 18 bis Dependencies nachziehen.
Mein Rat: Neue Projekte mit React 18 starten. Upgrade auf 19, wenn shadcn/ui und Dependencies bereit sind.
React Hook Form Typen
Form-Komponenten mit React Hook Form und Zod – Typ-Mapping-Probleme.
Typische Meldung:
Type 'info.${number}.fileName' is not assignable to type '"info" | "info.0" | "info.0.fileName"'
Dynamische Formularfelder – Zod-Schema-Typ passt nicht zum name von FormField.
Lösung:
Schema-Typ korrekt ableiten:
const formSchema = z.object({
email: z.string().email(),
password: z.string(),
})
type FormValues = z.infer<typeof formSchema> // Typableitung nötig
const form = useForm<FormValues>({
resolver: zodResolver(formSchema),
})
name in FormField passt dann zu den Schema-Feldern.
Meine Erfahrung: Dynamische Formulare (z. B. mit useFieldArray) sind komplexer – Zod-Schema und TypeScript-Ableitung genau prüfen.
Fehlende Typ-Abhängigkeiten
Manchmal fehlen @types/react oder @types/react-dom.
Mögliche Meldung:
Could not find a declaration file for module 'react'
Lösung:
npm install -D @types/react @types/react-dom
Danach TypeScript-Server neu starten (VSCode: Ctrl+Shift+P, „TypeScript: Restart TS Server”).
Prävention: Typ-Pakete von Anfang an installieren – nicht erst nach dem ersten Fehler.
Best Practices und Prävention
Aus vielen Fallen – ein paar Regeln.
Konfigurations-Management
Konfiguration sichern:
Vor shadcn/ui-Installation oder Tailwind-Änderung:
cp tailwind.config.js tailwind.config.js.backup
cp globals.css globals.css.backup
Nach Installation Unterschiede vergleichen und manuell mergen.
Eine Konfigurationsdatei:
Pro Projekt ein tailwind.config.js, eine globals.css – mehrere Dateien erzeugen Konflikte.
Vollständige Pfade:
content muss alle Komponentenverzeichnisse abdecken:
content: [
'./src/**/*.{ts,tsx}', // Wildcard für alle Verzeichnisse
'./app/**/*.{ts,tsx}',
'./pages/**/*.{ts,tsx}',
'./components/**/*.{ts,tsx}',
]
Dependency-Versionen
peerDependencies prüfen:
Vor neuer Abhängigkeit:
npm info <package> peerDependencies
Verlangt das Paket React 18, Sie nutzen React 19 – Kompatibilität bedenken.
Typ-Abhängigkeiten aktualisieren:
npm update @types/react @types/react-dom
Typdeklarationen an React-Version anpassen.
Teststrategie
Direkt nach Installation testen:
Nach shadcn/ui-Setup sofort Styles prüfen:
- Einfache Seite mit ein paar shadcn/ui-Komponenten
- Styles sichtbar?
- Dark-Mode-Wechsel
- TypeScript-Build
Produktion testen:
Lokal ok heißt nicht Produktion ok:
npm run build
npm run preview
Nach Build Vorschau – Styles und Typen prüfen.
Fazit
Die häufigsten shadcn/ui-Probleme konzentrieren sich auf drei Bereiche:
- Stilkonflikte: überschriebene Konfiguration, CSS-Variablen, Koexistenz mit anderen UI-Bibliotheken
- Kein Rendering: falsche content-Pfade, globals.css-Pfad, Import-Groß-/Kleinschreibung
- TypeScript-Fehler: fehlende variant-Typen, React-Version, fehlende @types-Pakete
Reihenfolge bei Problemen:
- Konfigurationsdateien (
tailwind.config.js,globals.css) - Pfade (
content, Imports) - Typdefinitionen (Komponenten, Dependency-Versionen)
Neu bei shadcn/ui? Erst in einem leeren Projekt den Ablauf durchspielen. Dann in echten Projekten – mit weniger Überraschungen.
shadcn/ui ist stark, die Konfiguration braucht Aufmerksamkeit. Mit diesen Schritten bleiben Sie bei Problemen gelassen.
FAQ
Warum sind nach der shadcn/ui-Installation alle Styles verschwunden?
• Ist das plugins-Array in tailwind.config.js vollständig?
• Stimmt der Pfad zu globals.css?
• Sind alle CSS-Variablen definiert?
Lösung: Konfigurationsdateien vor der Installation sichern, danach Unterschiede vergleichen und fehlende Einstellungen manuell ergänzen.
Warum sehen Komponenten nach dem Dark-Mode-Wechsel falsch aus?
• Die .dark-Klasse muss existieren
• Alle Theme-Variablen müssen neu definiert werden
• Bei Tailwind v4 brauchen Sie @theme inline zur Variablen-Zuordnung
Kann shadcn/ui neben MUI laufen?
• prefix: 'tw-' setzen, damit alle Tailwind-Klassen ein Präfix erhalten
• Neue Komponenten mit shadcn/ui, alte MUI-Komponenten behalten
• Schrittweise migrieren, nicht alles auf einmal
Preflight zu deaktivieren wird nicht empfohlen – das beeinträchtigt Tailwind-Styles.
Was tun bei TypeScript-Fehlern bei der variant-Eigenschaft von Button?
• VariantProps<typeof buttonVariants> muss vererbt werden
• Stellen Sie sicher, dass die Komponentendatei Typen vollständig exportiert
• Installieren Sie @types/react und @types/react-dom
Fehlen Typdefinitionen, führen Sie npx shadcn@latest add button erneut aus.
Funktioniert shadcn/ui mit React 19?
• Bei der Installation --legacy-peer-deps oder --force verwenden
• Oder react-is-Version in package.json overrides festlegen
• Für neue Projekte zuerst React 18, Upgrade nach Dependency-Updates
Komponenten lokal ok, in Produktion Modul nicht gefunden?
• shadcn/ui-Dateinamen sind kleingeschrieben (button.tsx)
• Import-Pfad muss passen (@/components/ui/button)
• Windows ist case-insensitive, Linux/Mac nicht – lokal ok, Produktion bricht
Alle Import-Statements prüfen und Pfade exakt an Dateinamen anpassen.
7 Min. Lesezeit · Veröffentlicht am: 2. Apr. 2026 · Aktualisiert am: 13. Juli 2026
Tailwind & shadcn/ui in der Praxis
Wenn du über die Suche hier gelandet bist, kommst du am schnellsten weiter, indem du zum vorherigen oder nächsten Beitrag dieser Serie springst.
Vorheriger
React Compiler + shadcn/ui: Frontend-Entwicklung im Zeitalter der automatischen Optimierung
React Compiler in shadcn/ui-Projekten: Aktivierung, Praxiserfahrung, Migrationshinweise und Performance-Vergleich – vom manuellen zum automatischen Optimieren
Teil 13 von 14
Nächster
Dies ist bisher der neueste Beitrag dieser Serie.
Ähnliche Beiträge
Tailwind v4 + Vite: 5-Minuten-Setup-Vorlage und Verzeichnisstruktur

Tailwind v4 + Vite: 5-Minuten-Setup-Vorlage und Verzeichnisstruktur
Tailwind CSS v4 – Neue Features: Performance, Konfiguration und Migrationsleitfaden


Kommentare
Melde dich mit GitHub an, um einen Kommentar zu hinterlassen