# 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 `