feat(surface): Block-Bundles laden, auch wo keine Fläche ist - #189
Merged
Conversation
Der Canvas rendert die echten Block-Komponenten. Die gibt es nur, wenn ihre Plugin-Bundles geladen sind — und im Admin lädt die Shell ausschließlich Bundles der `admin`-Fläche. Ohne diesen Schritt bliebe die Block-Registry leer. Die Fähigkeit gehört nach @callora/surface, nicht in den Composer (§7.4): Der Composer könnte sie sich bauen, aber jeder Editor täte es dann erneut, und die Fehlertoleranz samt Ladetelemetrie gäbe es doppelt. `loadSurfaceBundles` ist eine Funktion und nicht zwei, weil die Reihenfolge der Punkt ist: Ein Bundle, das vor der Registry läuft, registriert ins Leere — `registerBlock` warnt in die Konsole und kehrt zurück, weil ein Plugin die Shell nie brechen darf. Übrig bliebe ein leerer Canvas ohne Fehler. Ein Vertrag soll solche Fehler unerreichbar machen, nicht dokumentieren. `ensureSurfaceRegistry` ersetzt nie. Ein zweiter Aufruf, der die Registry austauschte, verlöre jeden registrierten Block — und der Loader überspringt ein Skript, das schon im Dokument steht, könnte sie also nie wieder füllen. Die Blöcke wären dauerhaft weg, still. `injectStyles: false` ist kein Detail. Ein Flächen-Stylesheet beansprucht Namen wie `.cal-header`, die auf beiden Seiten etwas bedeuten; eingebunden gestaltete es die Admin-Shell UM den Canvas herum um — genau das Entkommen, gegen das das Scoping gebaut wurde. Die URLs kommen so oder so zurück, der Editor holt den Text und scoped ihn. Der Entwurf sagt jetzt, wohin er gehört: workspaceKey und surfaceKey stehen in der Antwort. Ein ungebundenes Layout behält null statt „default" — eingesetzt sähe es auf der Leitung aus wie ein Layout, das WIRKLICH an die Standardfläche gebunden ist, und der Editor bäute stumm gegen die falschen Blöcke. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QvepSeijoZeRaBsyiGqoka
Die Surface-Anleitung nannte durchgehend `@callora/surface-sdk` unter `custom/surface-sdk/` — ein Paket, das mit der SDK-Productization verschwunden ist. Wer ihr folgte, kam bis `npm install` und dann nicht weiter. Die Doku ist die erste Fläche, die ein Plugin-Autor berührt; sie darf nicht auf ein gelöschtes Verzeichnis zeigen. Zwei sachliche Fehler steckten mit drin, beide von der Sorte, die eine Stunde kostet: - Das Default-Surface-Segment stand als `workspace`, das Preset sagt `surface`. Das Bundle landete unter `public/workspace`, käme so ins Manifest und würde vom Loader — der auf `surface` filtert — nie geholt. Kein Fehler, nur eine leere Fläche. - Eine View bekommt zwei Props, nicht eines: `params` trägt, was das SSR-Template an der Aufrufstelle übergab, und war gar nicht erwähnt. Dazu, was seither dazugekommen ist: `registerBlock` (eine View plus die Metadaten, die ein Editor braucht — kein zweites Ding, dieselbe Identität), `surfaceKeys` an der View, und `loadSurfaceBundles` für Hosts, die Flächen-Blöcke zeigen, ohne eine Fläche zu sein. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QvepSeijoZeRaBsyiGqoka
Der Doku-Job war rot, ohne dass jemand ein Dokument geändert hatte: `markdownlint-cli2` steht auf `^0.23.2`, eine Minor brachte MD060 (table-column-style) mit, und die Regel schlug auf 148 Zeilen in 11 unberührten Dateien an. Die Konfiguration hat dafür bereits eine Antwort im Kopfkommentar — „structure-strict, style-permissive: catch broken markdown, not stylistic taste". Genau darum sind MD004, MD046 und MD049 schon aus. Der Abstand um einen Tabellen-Pipe ist dieselbe Kategorie. Ein Gate, das rot wird, ohne dass jemand etwas getan hat, bringt allen bei, es zu übersehen — und dann sieht auch niemand mehr das Rot, das zählt. Der zweite Teil desselben Rots — drei cspell-Treffer, deutsche Beispielpfade in einer englischen Doku, von mir mit den Data-Contributors hereingetragen — steckt im vorigen Commit. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QvepSeijoZeRaBsyiGqoka
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
1. Why is this change necessary?
Der Canvas rendert die echten Block-Komponenten. Die gibt es nur, wenn ihre Plugin-Bundles
geladen sind — und im Admin lädt die Shell ausschließlich Bundles der
admin-Fläche. Bis hierherwar die Block-Registry im Editor leer, und der Canvas hätte nur Platzhalter zeigen können.
§7.4 benennt den Befund selbst: Die Fähigkeit gehört nach
@callora/surface, parametrisiert nachZiel-Surface, nicht in den Composer. Der Composer könnte sie sich bauen — das wären keine
Sonderrechte, sondern gewöhnliche Plugin-Arbeit. Aber jeder Editor täte es dann erneut, und die
Fehlertoleranz samt Ladetelemetrie gäbe es doppelt.
2. What does this change do, exactly?
loadSurfaceBundlesist eine Funktion und nicht zwei, und das ist der Kern. Ein Bundle, dasvor der Registry läuft, registriert ins Leere:
registerBlockwarnt in die Konsole und kehrtzurück, weil ein Plugin die Shell nie brechen darf. Übrig bliebe ein leerer Canvas — kein Fehler,
nichts zu finden. Ein Vertrag soll solche Fehler unerreichbar machen, nicht dokumentieren.
ensureSurfaceRegistryersetzt nie. Ein zweiter Aufruf, der austauschte, verlöre jedenregistrierten Block — und der Loader überspringt ein Skript, das schon im Dokument steht, könnte
sie also nie wieder füllen. Die Blöcke wären dauerhaft weg, still.
injectStyles: falseist kein Detail. Ein Flächen-Stylesheet beansprucht Namen wie.cal-header, die auf beiden Seiten etwas bedeuten. Eingebunden gestaltete es die Admin-Shellum den Canvas herum um — genau das Entkommen, gegen das #187 das Scoping gebaut hat. Die URLs
kommen so oder so zurück; der Editor holt den Text und scoped ihn.
Der Entwurf sagt jetzt, wohin er gehört.
workspaceKeyundsurfaceKeystehen in derAntwort, weil ein Layout für den Kiosk nicht aus den Blöcken der Standardfläche gebaut werden
darf. Ein ungebundenes Layout behält
nullstatt"default"— eingesetzt sähe es auf der Leitungaus wie ein Layout, das wirklich an die Standardfläche gebunden ist, und der Editor bäute
stumm gegen die falschen Blöcke. Stattdessen sagt die Seite es hin.
Damit ist auch §7.6 Bedingung 2/3 wirklich verdrahtet: Theme-Tokens und Sektions-CSS kommen jetzt
von den echten Endpunkten in den Canvas, statt dass die Fähigkeit ungenutzt dasteht.
3. Describe each step to reproduce the issue or behaviour.
Alle fünf Aussagen der Editor-Seite gegengeprüft — jede sabotiert, jede beißt. Ebenso die vier des
Ladevertrags (Registry-vor-Skript, keine Ersetzung, Ziel-Surface durchgereicht, Styles nicht
eingebunden).
4. Please link to the relevant issues (if any).
Setzt den in §7.4 benannten Plattform-Befund um. Baut auf #186 (Admin-API) und #187 (Canvas) auf.
Zwei Dinge, die nicht im Auftrag standen
Die Surface-Anleitung war falsch. Sie nannte durchgehend
@callora/surface-sdkuntercustom/surface-sdk/— ein Paket, das mit der SDK-Productization verschwunden ist. Wer ihr folgte,kam bis
npm installund dann nicht weiter. Zwei sachliche Fehler steckten mit drin: DasDefault-Surface-Segment stand als
workspacestattsurface(das Bundle landete unterpublic/workspaceund würde vom Loader nie geholt — kein Fehler, nur eine leere Fläche), und eineView bekommt zwei Props, nicht eines (
paramswar gar nicht erwähnt).Das Doku-Gate war rot, ohne dass jemand ein Dokument geändert hatte.
markdownlint-cli2stehtauf
^0.23.2, eine Minor brachte MD060 mit, und die Regel schlug auf 148 Zeilen in 11 unberührtenDateien an. Die Konfiguration hat dafür schon eine Antwort im Kopfkommentar — „structure-strict,
style-permissive: catch broken markdown, not stylistic taste" —, und genau darum sind MD004,
MD046 und MD049 bereits aus. Dazu drei cspell-Treffer, die ich selbst mit den Data-Contributors
hereingetragen hatte.
Noch nicht drin
zwischen Flächen wechselt. Die Registry sammelt Blöcke additiv (richtig, sonst gingen sie
verloren); das Filtern gehört an die Palette, nicht an die Registry.