Surfaces — die Konsumenten-Ebene
Eine Surface ist kein Framework-Bestandteil, sondern immer ein Konsument: die eine konkrete Seite mit konkretem Inhalt.
Zum Framework gehören nur das Format (JSON-Baum aus Nodes, Schema in schemas/) und der Renderer (invisible_render_surface()); die gespeicherten Seiten gehören dem jeweiligen Projekt. Details zur Grenze: Framework vs. Konsumenten.
Eine Surface wird nur an Tür 2 gebraucht (redaktionelle Seiten als gespeicherte Dokumente). Anwendungsseiten an Tür 1 kommen ganz ohne Surface aus — dort ruft PHP die Definitionen direkt auf.
Das Format
Reines JSON: ein Baum aus Nodes, jeder mit stabiler nodeId, Definitions-Referenz + gepinnter Version, Props, Slots, Event-Bindings und optional hideOn. Wohnort: surfaces/<scope>/<id>/ — im Framework selbst leer; die früheren Demo- und Admin-Surfaces liegen in archiv/surfaces/.
Was ein Node darf — und was nicht
- ✔ Definition wählen, Props im Schema-Rahmen setzen, Slots regelkonform füllen, Events an registrierte Actions binden, semantische Tokens wählen, pro Viewport ausblenden
- ✘ Klassen, Styles, Scripts, unregistrierte Definitionen/Actions, freie Token-Werte — Sicherheitsmodell
Draft/Publish-Workflow (unveränderliche Versionen, Gates, Migrationen) ist Teil des CMS-Produkts — seit 2026-08-10 in archiv/; die Lese-/Validierungsfunktionen bleiben Teil des Kerns.