# CSS-Framework im Vergleich — Bootstrap & Tailwind
Ein selbst entwickeltes, schlankes CSS-Framework für Jinja2/HTMX-Webapplikationen.
Kein NPM, kein Build-Schritt, kein fremder Designgeschmack — nur das, was wirklich gebraucht wird.
---
## Warum ein eigenes Framework?
Die meisten Projekte brauchen kein 300-kB-Monster, sondern ein konsistentes Designsystem, das zur eigenen Sprache passt. CSS-Framework wurde für genau einen Stack gebaut: **FastAPI + Jinja2 + HTMX**. Alles andere wurde weggelassen.
---
## Kurzübersicht
| Kriterium | CSS-Framework | Bootstrap 5 | Tailwind CSS |
|---|---|---|---|
| **Eigene Kontrolle** | Vollständig | Begrenzt | Mittel |
| **Build-Tool erforderlich** | Nein | Nein | Ja (PostCSS/Vite) |
| **Dateigröße (unkomprimiert)** | Klein (~5 Dateien) | ~180 kB CSS + JS | Roh ~4 MB, nach Purge variabel |
| **Designsystem (Tokens)** | CSS Custom Properties | Sass-Variablen / CSS Vars (überschreibbar) | Tailwind Config (JS) |
| **Classless Base** | Ja | Nein (Reboot, aber kein Classless) | Nein |
| **Dark Mode** | Eingebaut via `data-theme` | Eingebaut (Klasse/Media) | Eingebaut (Klasse/Media) |
| **HTML-Lesbarkeit** | Hoch | Mittel | Niedrig |
| **Externes CDN / Abhängigkeit** | Keine | Optional, aber üblich | Kein CDN für Production |
| **JavaScript** | Minimal, framework-agnostisch | Umfangreich (Popper, Bundle) | Kein eigenes JS |
| **Jinja2/HTMX-Integration** | Erstklassig | Nachträglich | Nachträglich |
---
## Gegenüber Bootstrap
### Was Bootstrap mitbringt — und was das kostet
Bootstrap ist vollständig und ausgereift. Aber das hat seinen Preis:
- **Der Bootstrap-Look ist unverkennbar.** Ohne umfangreiches Customizing sehen alle Bootstrap-Seiten ähnlich aus. Das Überschreiben von Sass-Variablen oder Custom Properties setzt voraus, dass man zuerst versteht, was Bootstrap macht — bevor man es ändern kann.
- **Alles oder nichts.** Bootstrap lädt Komponenten mit, die nie genutzt werden. Tree-Shaking ist umständlich. PurgeCSS oder eigene Import-Selektion ist nötig.
- **JavaScript-Bundle.** Bootstrap bringt eigene JS-Abhängigkeiten mit (Popper.js für Dropdowns, Tooltips, Modals). Mit HTMX entstehen Konflikte und Redundanzen.
- **Klassen statt Semantik.** Selbst ein Button braucht `class="btn btn-primary"`. Kein Element ist ohne Klasse sinnvoll gestylt.
- **Kein echtes Token-System.** Zwar gibt es CSS Custom Properties, aber sie sind nach Bootstrap-Logik strukturiert — nicht nach dem eigenen Designsystem.
### Was CSS-Framework anders macht
- **Classless First.** Valides, semantisches HTML ist ohne eine einzige Klasse brauchbar gestylt. Formulare, Tabellen, Typografie, Listen — alles läuft direkt aus `base.css`.
- **Token First.** Farben, Spacing, Typografie, Radius und Schatten sind in `tokens.css` zentral definiert. Eine Änderung dort zieht sich durch das gesamte Framework. Keine Sass-Compiler nötig.
- **Kein JavaScript-Bundle.** Die wenigen nötigen Funktionen (Modal, Toast, Dropdown) sind schlanke, eigenständige Funktionen ohne externe Abhängigkeit — kompatibel mit HTMX.
- **Kein Bootstrap-Look.** Das visuelle Ergebnis gehört zu uns, nicht zu Bootstrap.
---
## Gegenüber Tailwind
### Was Tailwind verspricht — und wo es kippt
Tailwind ist ein anderer Ansatz: keine Komponenten, nur Utility-Klassen. Das klingt flexibel, hat aber konkrete Nachteile im gewählten Stack:
- **Build-Toolchain zwingend.** Tailwind braucht PostCSS, Vite oder einen ähnlichen Bundler. Für ein Jinja2-Projekt mit statischem CSS ist das ein erheblicher Overhead — ein Schritt, der bei CSS-Framework vollständig entfällt.
- **HTML wird unleserlich.** Ein Button mit Padding, Hover-Farbe, Radius, Font-Weight und Transition erzeugt in Tailwind 8–12 Klassen auf einem Element. Jinja2-Templates werden dadurch schwer wartbar.
- **Kein Classless-Ansatz.** Jedes Element, das nicht wie `
` aussehen soll, braucht Klassen. Formulare, Tabellen und Listen sind ohne Klassen praktisch unstylt.
- **Designentscheidungen im Markup verstreut.** Farb- und Spacing-Entscheidungen stecken in hunderten Template-Zeilen statt in einer zentralen Tokendatei. Farbe ändern bedeutet: alle Dateien durchsuchen.
- **HTMX-Fragmente werden zum Problem.** Wird ein HTML-Fragment dynamisch nachgeladen, muss Tailwind's JIT wissen, welche Klassen vorkommen können — oder die Klassen werden weggepurgt. Mit CSS-Framework ist das kein Thema.
### Was CSS-Framework anders macht
- **Kein Build-Schritt.** `main.css` wird direkt eingebunden. Fertig. Funktioniert in jedem Deployment ohne Pipeline.
- **Lesbares HTML.** Ein Button ist `