Tailwind ist bei uns nicht die Design-Entscheidung, sondern ihr Werkzeug. Zuerst steht das
Design-System: Flächen, Hairlines, Textstufen, Signalfarbe, Schriftgrößen, Radien — alles als
CSS-Variablen in einer Datei. Erst danach kommt Tailwind dazu und spiegelt
diese Variablen über die @theme-Bridge auf Utility-Namen. Aus
--ink-2 wird
text-ink-2, aus
--line wird
border-line. Es gibt keine zweite Farbliste, die
irgendwann auseinanderläuft.
Dark und Light sind deshalb keine zwei Designs, sondern zwei Wertesätze derselben Variablen. Eine
Klasse am html-Element schaltet um, alle Utilities
ziehen den neuen Wert automatisch mit. Kein
dark:-Präfix an tausend Stellen, keine doppelte Pflege —
und deshalb auch kein Theme, das nach dem dritten Relaunch-Sprint nur noch halb stimmt.
Utilities nehmen wir für Layout und Abstände, weil dort jede Änderung lokal bleiben soll. Alles, was
mehrfach exakt gleich aussehen muss — Buttons, Command-Palette, Karten, Prosa-Blöcke — liegt als
eigene Komponentenklasse im components-Layer und nutzt dieselben Tokens. Diese
Trennung ist der Punkt, an dem Utility-First in der Praxis trägt statt zu wuchern: Utilities für den
Einzelfall, Komponenten für das Muster.
Gebaut wird lokal mit der Tailwind-CLI, versioniert in Git, ausgeliefert über
GitHub Actions. Der Build scannt das gesamte
HTML-Verzeichnis und erzeugt ein Stylesheet für die gesamte Website —
kein CSS pro Seite, kein Nachladen, ein Request. Jeder Stand wird von einem Menschen geprüft, auch
wenn er KI-gestützt entstanden ist.