Das Kit verwendet Tailwind CSS 3.4 mit einem semantischen Farbsystem, das auf CSS Custom Properties aufbaut. Statt hartkodierter Farbwerte wie
bg-blue-500 verwendet die gesamte Anwendung theme-bewusste Klassen wie bg-primary, die sich automatisch an das aktive Farbthema und den Dark Mode anpassen. Diese Seite behandelt die Tailwind-Konfiguration, wie man sie erweitert, und die globale CSS-Architektur.Für das Wechseln zwischen Themes, siehe Farbthemen & Dark Mode. Für Komponenten-Styling-Muster, siehe UI-Komponenten.
Tailwind-Konfiguration
Die Tailwind-Konfiguration ordnet jede semantische Farbe ihrer CSS Custom Property zu und definiert eigene Schriftarten, Animationen und Layout-Utilities:
tailwind.config.js — Vollständige Konfiguration
/** @type {import('tailwindcss').Config} */
module.exports = {
darkMode: ['class'],
content: [
'./src/pages/**/*.{js,ts,jsx,tsx,mdx}',
'./src/components/**/*.{js,ts,jsx,tsx,mdx}',
'./src/app/**/*.{js,ts,jsx,tsx,mdx}',
'../../packages/ui/src/**/*.{js,ts,jsx,tsx}',
],
theme: {
container: {
center: true,
padding: '2rem',
screens: {
'2xl': '1400px',
},
},
extend: {
fontFamily: {
sans: ['var(--font-inter)', 'system-ui', 'sans-serif'],
mono: ['var(--font-jetbrains-mono)', 'ui-monospace', 'monospace'],
},
borderRadius: {
lg: 'var(--radius)',
md: 'calc(var(--radius) - 2px)',
sm: 'calc(var(--radius) - 4px)',
},
colors: {
background: 'hsl(var(--background))',
foreground: 'hsl(var(--foreground))',
card: {
DEFAULT: 'hsl(var(--card))',
foreground: 'hsl(var(--card-foreground))',
},
popover: {
DEFAULT: 'hsl(var(--popover))',
foreground: 'hsl(var(--popover-foreground))',
},
primary: {
DEFAULT: 'hsl(var(--primary))',
foreground: 'hsl(var(--primary-foreground))',
},
secondary: {
DEFAULT: 'hsl(var(--secondary))',
foreground: 'hsl(var(--secondary-foreground))',
},
muted: {
DEFAULT: 'hsl(var(--muted))',
foreground: 'hsl(var(--muted-foreground))',
},
accent: {
DEFAULT: 'hsl(var(--accent))',
foreground: 'hsl(var(--accent-foreground))',
},
destructive: {
DEFAULT: 'hsl(var(--destructive))',
foreground: 'hsl(var(--destructive-foreground))',
},
success: {
DEFAULT: 'hsl(var(--success))',
foreground: 'hsl(var(--success-foreground))',
},
warning: {
DEFAULT: 'hsl(var(--warning))',
foreground: 'hsl(var(--warning-foreground))',
},
info: {
DEFAULT: 'hsl(var(--info))',
foreground: 'hsl(var(--info-foreground))',
},
border: 'hsl(var(--border))',
input: 'hsl(var(--input))',
ring: 'hsl(var(--ring))',
},
},
},
plugins: [require('tailwindcss-animate'), require('@tailwindcss/typography')],
}
Wichtige Konfigurationspunkte:
darkMode: ['class']— Dark Mode wird über die.dark-Klasse umgeschaltet (verwaltet von next-themes), nicht über Media Queriescontent-Pfade — Durchsucht sowohl diesrc/-Verzeichnisse als auchpackages/ui/, damit gemeinsame Komponenten Tailwind-Klassen erhaltencontainer— Zentriert mit2remInnenabstand und einem1400pxMaximum-Width beim2xl-Breakpointcolors— Jede Farbe referenziert eine CSS-Variable überhsl(var(--name)), was alle Farben theme-bewusst machtplugins—tailwindcss-animatefür Animations-Utilities und@tailwindcss/typographyfür Prosa-Styling
Semantisches Farbsystem
Das Farbsystem funktioniert über drei Ebenen:
Theme-CSS-Datei (default.css) → --primary: 221 83% 53%;
|
Tailwind-Konfiguration (tailwind.config.js) → primary: 'hsl(var(--primary))'
|
Deine Komponenten → className="bg-primary text-primary-foreground"
Wenn du
bg-primary verwendest, generiert Tailwind background-color: hsl(var(--primary)). Der tatsächliche Farbwert stammt aus der jeweils aktiven Theme-CSS-Datei.Opacity-Modifikatoren
Da CSS-Variablen rohe HSL-Werte speichern (nicht in
hsl() eingewickelt), funktioniert Tailwinds Opacity-Modifier-Syntax direkt:tsx
// 50% Deckkraft der Primärfarbe
<div className="bg-primary/50" />
// Generiert: background-color: hsl(221 83% 53% / 0.5)
// 80% Deckkraft des Vordergund-Textes
<p className="text-foreground/80" />
// Generiert: color: hsl(0 0% 3.9% / 0.8)
Farb-Verwendungsreferenz
| Tailwind-Klasse | CSS-Variable | Wann verwenden |
|---|---|---|
bg-background | --background | Seitenhintergrund |
text-foreground | --foreground | Primärer Fließtext |
bg-card | --card | Karten- und Oberflächen-Hintergründe |
bg-primary | --primary | Primäre Buttons, Links, Markenelemente |
text-primary-foreground | --primary-foreground | Text auf primärfarbigen Hintergründen |
bg-secondary | --secondary | Sekundäre Buttons, weniger prominente Elemente |
bg-muted | --muted | Dezente Hintergrundbereiche, deaktivierte Zustände |
text-muted-foreground | --muted-foreground | Hilfetext, Platzhalter, Zeitstempel |
bg-accent | --accent | Hover-Zustände, ausgewählte Elemente |
bg-destructive | --destructive | Fehlerzustände, Lösch-Buttons |
border-border | --border | Alle Rahmen und Trennlinien |
border-input | --input | Formularfeld-Rahmen |
ring-ring | --ring | Fokus-Ring-Umrisse |
Verwende immer semantische Klassen (
bg-primary, text-muted-foreground) statt hartkodierter Werte (bg-blue-500, text-gray-600). Hartkodierte Farben funktionieren nicht mehr, wenn Nutzer das Theme wechseln, und reagieren nicht auf den Dark Mode. Die einzige Ausnahme ist die safelist in der Tailwind-Konfiguration für Sonderfälle, die spezifische Farben benötigen.Konfiguration erweitern
Eigene Schriftarten
Die Konfiguration definiert zwei Schriftfamilien über CSS-Variablen, die von
next/font gesetzt werden:typescript
fontFamily: {
sans: ['var(--font-inter)', 'system-ui', 'sans-serif'],
mono: ['var(--font-jetbrains-mono)', 'ui-monospace', 'monospace'],
}
Um Schriftarten zu ändern, aktualisiere die
next/font-Imports in apps/boilerplate/src/app/layout.tsx — die Variablennamen werden automatisch weitergereicht. Die font-sans-Klasse verwendet Inter und font-mono verwendet JetBrains Mono.Rahmenradius
Rahmenradius-Werte werden aus der
--radius-CSS-Custom-Property abgeleitet (Standard: 0.5rem):typescript
borderRadius: {
lg: 'var(--radius)', // 0.5rem
md: 'calc(var(--radius) - 2px)', // ~0.375rem
sm: 'calc(var(--radius) - 4px)', // ~0.25rem
}
Das Ändern von
--radius in einer Theme-CSS-Datei passt alle abgerundeten Ecken in der gesamten Anwendung an.Eigene Animationen
Um eigene Animationen hinzuzufügen, definiere einen
keyframes-Eintrag und einen passenden animation-Eintrag im extend-Bereich von tailwind.config.js:javascript
keyframes: {
'slide-in': {
'0%': { transform: 'translateX(-100%)', opacity: '0' },
'100%': { transform: 'translateX(0)', opacity: '1' },
},
},
animation: {
'slide-in': 'slide-in 0.3s ease-out',
},
Globale CSS-Architektur
Das globale Stylesheet legt das Basis-Styling für die gesamte Anwendung fest. Es ist in Ebenen gegliedert:
src/app/globals.css — Theme-Imports, Tailwind-Direktiven & Base-Layer
/* Import all available color themes - MUST be first! */
@import '../styles/themes/default.css';
@import '../styles/themes/ocean.css';
@import '../styles/themes/forest.css';
@import '../styles/themes/sunset.css';
@import '../styles/themes/midnight.css';
@import '../styles/themes/coral.css';
@import '../styles/themes/slate.css';
@import '../styles/themes/aurora.css';
@import '../styles/themes/crimson.css';
/* Syntax highlighting (extracted for maintainability) */
@import '../styles/syntax-highlighting.css';
/* Universal status colors — theme-independent */
:root {
--success: 142 76% 36%;
--success-foreground: 0 0% 100%;
--warning: 32 95% 44%;
--warning-foreground: 0 0% 100%;
--info: 199 89% 48%;
--info-foreground: 0 0% 100%;
/* Opaque content surface: muted/80 composited over background.
Used on <main> and sticky overlays to avoid opacity stacking. */
--main-surface: hsl(var(--muted));
--main-surface: color-mix(in srgb, hsl(var(--muted)) 80%, hsl(var(--background)));
}
.dark {
--success: 142 76% 50%;
--success-foreground: 0 0% 100%;
--warning: 32 95% 54%;
--warning-foreground: 0 0% 100%;
--info: 199 89% 58%;
--info-foreground: 0 0% 100%;
--main-surface: hsl(var(--background));
--main-surface: color-mix(in srgb, hsl(var(--muted)) 20%, hsl(var(--background)));
}
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
* {
@apply border-border;
}
body {
@apply bg-background text-foreground;
}
/* Prevent body scrollbar in dashboard layout — only <main> should scroll */
html:has([data-dashboard-layout]) {
overflow: hidden;
}
/* Typography System
Heading styles (h1-h4) are set via explicit className on each element.
Prose typography (legal pages) is handled by @tailwindcss/typography plugin. */
.prose h2 {
@apply border-b pb-2;
}
p {
@apply leading-7;
}
/* Dashboard heading spacing — vertical rhythm within sections
H3-H6 get top margin when preceded by other content (not when first child).
H1/H2 spacing is handled by .db-page-sections and component containers. */
[data-dashboard-layout] h3:not(:first-child) {
@apply mt-6 sm:mt-8;
}
[data-dashboard-layout] h4:not(:first-child) {
@apply mt-5 sm:mt-6;
}
[data-dashboard-layout] h5:not(:first-child),
[data-dashboard-layout] h6:not(:first-child) {
@apply mt-4;
}
code {
@apply relative rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold;
}
}
Die Datei ist in 4 klar abgegrenzte Abschnitte unterteilt:
- Theme-Imports — Alle 9 Theme-CSS-Dateien sowie Syntax-Highlighting müssen zuerst importiert werden, bevor Tailwind-Direktiven folgen. Das stellt sicher, dass CSS Custom Properties verfügbar sind, wenn Tailwind Utility-Klassen generiert.
- Tailwind-Direktiven —
@tailwind base,@tailwind components,@tailwind utilitiesfügen Tailwinds generierte Stile an der richtigen Ebene ein. Universelle Statusfarben (success, warning, info) werden zwischen den Importen und den Direktiven definiert. - Base-Layer —
@layer basesetzt globale Standardwerte: Rahmenfarbe für alle Elemente, Hintergrund-/Textfarbe am Body, Absatz-Zeilenhöhe, Inline-code-Styling und Dashboard-spezifische Überschriften-Abstände. Überschriften-Stile (h1–h4) werden über expliziteclassName-Attribute an jedem Element angewendet; Prosa-Typografie (rechtliche Seiten) wird vom@tailwindcss/typography-Plugin übernommen. - Components-Layer (weiter unten in der Datei) —
@layer componentsdefiniert wiederverwendbare Muster wie Code-Block-Styling für Prosa-Inhalte mit Dark-Mode-Anpassungen.
Theme-CSS-Imports müssen vor den
@tailwind-Direktiven stehen. Erscheinen sie danach, sind CSS Custom Properties möglicherweise nicht verfügbar, wenn Tailwind seine Utility-Klassen generiert, was zu fehlenden oder defekten Farben führt.Eigene Utilities hinzufügen
CSS-Utilities
Füge eigene Utility-Klassen mit Tailwinds
@layer utilities-Direktive in globals.css hinzu:css
@layer utilities {
.text-balance {
text-wrap: balance;
}
.scrollbar-hide {
-ms-overflow-style: none;
scrollbar-width: none;
}
.scrollbar-hide::-webkit-scrollbar {
display: none;
}
}
Tailwind-Konfiguration erweitern
Für Utilities, die responsive Varianten oder andere Tailwind-Modifikatoren benötigen, füge sie zur Konfiguration hinzu:
javascript
// tailwind.config.js — extend-Bereich
extend: {
spacing: {
'18': '4.5rem',
'88': '22rem',
},
maxWidth: {
'prose-wide': '85ch',
},
zIndex: {
'60': '60',
'70': '70',
},
}
Konfigurationsbasierte Erweiterungen erhalten automatisch responsive (
md:max-w-prose-wide), Hover- (hover:z-60) und andere Modifikator-Unterstützung.Wichtige Dateien
| Datei | Zweck |
|---|---|
apps/boilerplate/tailwind.config.js | Tailwind-Konfiguration — Farben, Schriftarten, Animationen, Plugins |
apps/boilerplate/src/app/globals.css | Globale Stile — Theme-Imports, Base-Layer, Typografie, eigene Utilities |
apps/boilerplate/src/styles/themes/*.css | 9 Theme-CSS-Dateien mit CSS Custom Properties (hell + dunkel) |
apps/boilerplate/postcss.config.js | PostCSS-Konfiguration für Tailwind und Autoprefixer |
packages/utils/src/index.ts | cn()-Utility — kombiniert Tailwind-Klassen mit Konfliktauflösung |