Framework vs. Konsumenten
Die wichtigste Grenze verläuft nicht zwischen den Schichten, sondern quer dazu — am Inhalt.
Die Prüffrage für jeden Baustein
„Könnte ein zweites, völlig anderes Projekt diesen Baustein unverändert nutzen?"
Ja → Framework (wiederverwendbar, inhaltsfrei: Props/Slots statt eingebackener Inhalte). Nein → Konsument (konkrete Seite, konkretes Theme, konkrete Daten).
Die Surface ist die einzige Ebene, die per Definition Konsument ist
Elements, Layouts, Components, Sections und Templates können Lieferumfang sein, weil sie inhaltsfrei sind. Eine Surface kann das nie: Sie ist die eine konkrete Seite mit konkretem Inhalt — immer das Endprodukt. Für Anwendungsseiten (Tür 1) wird gar keine Surface gebraucht; sie ist das Dateiformat der Tür 2.
Kurzformel: Framework = Wortschatz und Satzmuster · Surface = der gesprochene Satz (immer deiner, immer Konsument).
Die Aufgaben der oberen Ebenen, abgegrenzt
| Ebene | entscheidet | entscheidet NICHT |
|---|---|---|
| Layout (grid, stack, cluster, columns) | Anordnung, Abstände, Umbruch, Responsive | was die Kinder sind, wie sie aussehen |
| Section (hero, faq, …) | welcher fachliche Block aus welchen Bausteinen besteht | wo er steht, konkrete Inhalte |
| Template (page, app-shell, …) | die Zonen/Slots — was bei ALLEN Seiten einer Sorte gleich ist | was in den Slots steckt |
| Surface | alles Konkrete: Reihenfolge, Texte, Daten, Theme | nichts Wiederverwendbares |
Merksatz: Layout = wie angeordnet · Section = was für ein Block · Template = wo auf der Seite · Surface = diese eine Seite mit diesem Inhalt.
Der Bootstrap-Vergleich — und warum Invisible eine Ebene höher liefert
Bootstrap liefert Grid, Elements und Components — aber keine Templates. Das ist keine Design-Entscheidung, sondern eine technische Grenze: Bootstrap ist nur CSS, ein „Template" kann dort nur ein Copy-Paste-HTML-Beispiel sein. Und eine Kopie ist tot — kein Update erreicht sie, jede Kopie driftet. Deshalb können Bootstraps Examples nur Demos sein.
Invisible hat diese Grenze nicht: Weil die Sprache Daten sind statt Markup, wird ein Template als versionierte Definition ausgeliefert — zentral, updatebar, referenziert statt kopiert. Was Bootstrap nur als Demo abgeben kann, liefert Invisible als Framework-Bestandteil.
| Bootstrap | Invisible | |
|---|---|---|
| Grid | CSS-Klassen (col-md-6), HTML von Hand | layout.grid als Definition, span als Datum am Node |
| Templates | nur Demos (Kopien, driften) | versionierte Definitionen (referenziert, zentral updatebar) |
| Theming | Sass-Variablen, Neubau nötig | semantische Token-Overrides zur Laufzeit |
| Konsumenten | nur Menschen (HTML tippen) | Code (Tür 1), Dokumente (Tür 2), Validierung, KI |
Daten abwärts, HTML aufwärts
- Props fließen abwärts in Renderer hinein; HTML fließt aufwärts — das Ergebnis wandert eine Ebene höher in einen Slot. HTML entsteht ausschließlich in der Render-Pipeline, nie beim Aufrufer.
- Muss der Empfänger den Inhalt verstehen (Tabellenzelle: Typ prüfen, Badge delegieren, Link bauen) → er bekommt Daten; der Component-Renderer delegiert intern an die zentrale Definition (
ui.badge…). - Muss der Empfänger nur platzieren (Template-Slot) → er bekommt Pipeline-HTML.
- Nie HTML als Datenformat übergeben (vorgerenderte Strings in Zellwerten): das reißt Escaping, Theme und Validierung auf.
Muster statt Kombinationen: was in den Katalog darf
Katalog-Regel
In den Katalog kommt eine Section nur, wenn sie ein wiederkehrendes fachliches Muster ist (Hero, FAQ, Pricing, Footer) — nie eine konkrete Kombination. Kombinationen (Hero MIT Code-Fenster MIT Navy-Band) sind Gestaltungs-Entscheidungen eines Konsumenten.
Die Arbeitsteilung: Das Framework liefert die Fähigkeiten — generische Sections mit Slots und Vorräten, Components, Layouts, Tokens. Der Konsument komponiert: Er zieht den Hero in die Seite, den Code-Block in den Hero-Slot, wählt den Hintergrund aus dem Vorrat — im Builder per Drag & Drop, an Tür 1 als PHP-Komposition. Seine Komposition friert er über „Als Block speichern" als seine Custom-Section ein, sein Seitengerüst als seine Vorlage — künftig im Projekt-Katalog, nie im Lieferumfang.
Drei Stellschrauben-Ebenen pro Baustein
| Ebene | Wer stellt ein | Beispiel |
|---|---|---|
| Props (kuratierte Enums) | die Instanz (Builder/Tür 1) | card.padded, button.variant |
| Token-Props (geöffnete Token-Wahl) | die Instanz — nur aus dem semantischen Vorrat | card.background |
| Komponenten-Tokens (Ebene 3) | der Component-Bauer (Hüllen-Komposition, Component Builder) | --card-radius, --button-background |
Merksatz: Props = was die Instanz darf · Token-Props = wo sie gestalten darf · Komponenten-Tokens = was der Component-Bauer umverdrahten darf.
Pflicht und umgesetzt (2026-08-10): JEDE Definition liefert ihre themebaren Werte (Farben, Radien, Schatten, Fokus-Ring) als eigene Komponenten-Tokens — flächendeckend nachgerüstet, maschinenlesbar, ohne Markup-Eingriff umverdrahtbar. Ein blockierendes Palette-Gate im Build erzwingt die Schichtung: Referenz-Palette darf nur in ein lokales Komponenten-Token fließen (Marken-Umverdrahtung), nie direkt in eine Eigenschaft — dort griffe kein Theme mehr. Die Kette ist immer dreigliedrig: --card-radius: var(--radius-surface) (Ebene 3 → Semantik) → --radius-surface: var(--radius-md) (Semantik → Referenz) — nie eine Stufe überspringen, denn die Mitte ist der Theme-Hebel. Die Stellschrauben jeder Definition stehen maschinenlesbar in der Registry (vom Build aus dem CSS generiert — keine Hand-Liste im Manifest, das wäre eine zweite Wahrheit) und sind in der Galerie-Detailansicht als Tabelle sichtbar.
Das Leiter-Prinzip: Kann, kein Muss
An Tür 1 erzwingt das Framework nichts — Aussteigen ist auf jeder Ebene erlaubt. Aber jede Sprosse abwärts kostet Garantie:
| Ausstieg bei… | verloren geht… |
|---|---|
| geliefertem Template | nichts — zentrales Update erreicht alle Seiten |
| Components einzeln, eigene Anordnung | die Garantie „alle Seiten gleich" — die Anordnung ist jetzt eine Kopie |
| Elements + eigenes Markup drumherum | zusätzlich Theme und Responsive für alles Selbstgeschriebene |
| ganz draußen (eigenes HTML) | alles |
Regel für Sonderfälle: Vorlage oder Vorrat erweitern (neue Version — alle profitieren) statt daneben bauen. Der selbstgebaute Sonderfall von heute ist die Altlast von morgen.