Blocktyp-Verträge
Zweck und Umfang
Dieses Dokument begann als das Phase-1-Inventar der aktuell ausgelieferten, veröffentlichten Kern-Blocktypen in WebBlocks CMS, dokumentiert nun auch die schreibgeschützte Admin-Vertragsansicht aus Phase 2 und hält die bisher abgeschlossenen Phase-3-Korrekturen zur Lücken-Standardisierung fest, darunter die Layout-+-Card-Bereinigung für section, container, grid, cluster, card und content_header, die Marketing-/Structured-Content-Bereinigung für hero, columns, column_item, cta, feature-grid und feature-item sowie die Legacy-/Übergangs-Bereinigung, die alte Kompatibilitäts-Slugs ehrlich dokumentiert hält, ohne sie in den veröffentlichten Kernkatalog zu befördern.
Phase 1 ist ausschließlich schreibgeschützte Dokumentation.
- Sie gestaltet keine Blockformulare neu.
- Sie fügt keinen DB-gesteuerten Formular-Builder hinzu.
- Sie migriert keine Blockinhalte.
- Sie ändert das öffentliche Rendering nicht.
- Sie ändert nicht, wie Bearbeitungen unter
Admin -> System -> Block Typesheute funktionieren.
Der aktuelle Blocktypen-Admin-Bildschirm bleibt ein Katalog- und Metadaten-Bildschirm. In Phase 2 kann er nun für jede aufgeführte Zeile ein schreibgeschütztes Vertrags-Modal öffnen, ist aber weiterhin kein dynamischer Formular-Builder oder Schema-Editor.
Plugin-Phase 3 fügt über PluginBlockTypeDefinition, PluginBlockPackDefinition und PluginBlockRegistry rein deklarative Plugin-Block-Hooks hinzu. Aktivierte Plugins können plugin-eigene Handles wie analytics-tools::score-card für die Discovery bereitstellen, aber diese Deklarationen ersetzen nicht die ausgelieferten Kern-Blockverträge, Kern-Block-Views, Kern-Seeder oder die Blockbearbeitungs-Services. Unqualifizierte Handles im Kern-Stil wie hero bleiben kerneigen und werden für Plugin-Deklarationen abgelehnt.
Definition
Ein Blocktyp-Vertrag ist die aktuelle technische Vereinbarung darüber, wie sich ein Blocktyp über die CMS-Schichten hinweg verhält:
- Katalogidentität: Slug, Label, Kategorie, Status sowie System- oder Container-Metadaten
- Quelle des Admin-Formulars: welches Blade-Partial den Block aktuell bearbeitet und welche Felder es bereitstellt
- Validierung und Request-Verarbeitung: wie
App\Http\Requests\Admin\BlockRequestBlock-Payloads aktuell normalisiert und validiert - Speicher-Eigentum: welche Werte in
blocks, dedizierten Übersetzungszeilen,block_mediaoder verknüpften Datensätzen liegen - Übersetzungs-Eigentum: welche nutzerseitigen Felder der Sprache (Locale) gehören
- geteiltes Eigentum: welche Einstellungen oder Beziehungen über Sprachen hinweg geteilt bleiben
- Medien- oder Beziehungs-Eigentum: direktes
media_id, geordnetesblock_media, Navigations-Lookups oder Beziehungen innerhalb derselben Seite - Kind-Unterstützung: ob der Block ein Container ist und ob Kindtypen eingeschränkt sind
- Quelle des öffentlichen Renderers: welches öffentliche Blade-Partial den Block heute rendert
- Renderer-Root-Vertrag: ob der Block sein öffentliches Root-Markup besitzt oder sich auf den generischen Wrapper-Pfad verlässt
- Portabilität und Revisionen: ob die aktuelle Speicherform weiterhin durch Revisionen, Klonen, Export/Import und Beförderung wandern soll
- Tests und Lücken: bekannte gezielte Abdeckung, unklares Verhalten oder Kompatibilitätsschulden
Aktuelle Vertragsbegriffe
Nachfolgend verwendete Statusbegriffe:
clear: Admin-Formular, Request-Verarbeitung, Speicherung und Renderer stimmen weitgehend übereinmostly clear: der aktuelle Vertrag ist verständlich, hat aber einen nennenswerten Vorbehalttransitional: der aktuelle Vertrag trägt bewusst einen Kompatibilitätspfad oder ein gemischtes Eigentumsmusterneeds review: aktuelle Codepfade widersprechen sich oder das Verhalten ist so unzureichend dokumentiert, dass Phase 2 es deutlicher sichtbar machen solltelegacy/fallback: das veröffentlichte Verhalten hängt von einem Fallback- oder Kompatibilitätspfad ab
Regeln zum Speicher-Eigentum
Aktuelle und künftige Vertragsarbeit sollte diese Eigentumsregeln explizit halten:
- nutzerseitige Texte gehören in Übersetzungszeilen, wenn der Block der Sprache (Locale) gehört
- geteilte operative oder Einstellungsdaten gehören in geteilte Blockeinstellungen oder explizite Beziehungen
- Medien sollten, wo zutreffend, die Eigentumspfade
media_idoderblock_mediaverwenden - vermeiden Sie es, nutzerseitige Inhalte in beliebiges Einstellungs-JSON zu verschieben
- halten Sie Kompatibilitäts-Speicherpfade dokumentiert, solange sie die öffentliche Ausgabe oder Importe noch beeinflussen
Ausgelieferte Quellen
Dieses Phase-1-Inventar basiert auf dem ausgelieferten Quellcode, nicht auf Vermutungen.
- Katalogquelle:
app/Support/Blocks/CoreBlockTypeCatalogSyncer.php - Normalisierung der Blockbearbeitungs-Requests:
app/Http/Requests/Admin/BlockRequest.php - Persistenz-Helfer:
app/Support/Blocks/BlockPayloadWriter.php,app/Support/Blocks/BlockTranslationWriter.php,app/Support/Blocks/BlockTranslationResolver.php - Übersetzungs-Registry:
app/Support/Blocks/BlockTranslationRegistry.php - Admin-Formulare:
resources/views/admin/blocks/types/*.blade.php - öffentliche Renderer:
resources/views/pages/partials/blocks/*.blade.php - Abdeckungsreferenzen: Blockkatalog-, Rendering-, Übersetzungs- und Slug-spezifische Tests unter
tests/Feature/
Aktuell hier dokumentierte veröffentlichte Kern-Blocktypen: 42.
Audit-Befehl
Phase 1 fügt einen sicheren Entwickler-Audit-Befehl hinzu:
php artisan block-types:contracts-audit
php artisan block-types:contracts-audit --json
Der Befehl ist rein lesend.
- er verändert die Datenbank nicht
- er hängt nicht von installierten Site-Inhalten ab
- er liest die ausgelieferten Kern-Katalogdefinitionen
- er prüft das Vorhandensein der ausgelieferten Admin-Formular- und öffentlichen Renderer-Dateien
- er berichtet Übersetzungsfamilien-Metadaten und grundlegende Container-Unterstützung
Der Befehl ist eine Aktualitätshilfe für Katalog- und Dateipräsenz-Drift. Er ersetzt nicht die ausführlicheren Vertragsnotizen in diesem Dokument.
Phase-2-Admin-Ansicht
Phase 2 legt Vertragsdetails schreibgeschützt unter Admin -> System -> Block Types offen.
- jede Zeile kann ein
Block Type Contract-Modal öffnen - das Modal ist rein informativ und sendet keine Aktualisierungen
- es zeigt Katalog-, Admin-Formular-, Speicher-, Übersetzungs-, Medien- oder Beziehungs-, Kind-, Renderer- und Lücken-Details aus dem ausgelieferten Code
- es macht die Blocktypen-Verwaltung nicht zu einem Schema-Editor oder Formular-Builder
- eigene oder Entwurfs-Blocktypen können das Modal weiterhin öffnen, zeigen aber möglicherweise
No shipped contract is documented for this block type yet., wenn kein Kernvertrag definiert ist
Matrix der veröffentlichten Blockverträge
Content
| Slug | Bezeichnung | Kategorie | Quelle des Admin-Formulars | Übersetzbare Felder | Geteilte/Einstellungsfelder | Medien-/Beziehungsfelder | Kind-/Container-Verhalten | Quelle des öffentlichen Renderers | Renderer-Root-Vertrag | Aktueller Status | Tests / Abdeckung | Bekannte Lücken / Hinweise |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| header | Header | content | resources/views/admin/blocks/types/header.blade.php | title über Textübersetzungszeilen | variant als Überschriftenebene; settings.alignment; gemeinsamer Anker in settings.anchor mit Legacy-Fallback auf url | Das Inhaltsverzeichnis derselben Seite liest verankerte Header-Blöcke | Kein Container | resources/views/pages/partials/blocks/header.blade.php | Besitzt sein Root-Überschriftenelement | clear | SyncCoreBlockTypesCommandTest, PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest | Kanonischer Überschriften-Block; der Vertrag für den gemeinsamen Anker ist klar, es besteht aber weiterhin ein Legacy-Fallback-Verhalten über url. |
| plain_text | Einfacher Text | content | resources/views/admin/blocks/types/plain_text.blade.php | content über Textübersetzungszeilen | settings.alignment | Keine | Kein Container | resources/views/pages/partials/blocks/plain_text.blade.php | Besitzt sein Root- | clear | PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest | Einfacher übersetzter Grundbaustein für Fließtext. |
| rich-text | Rich Text | content | resources/views/admin/blocks/types/rich-text.blade.php | content über Textübersetzungszeilen | Keine | Keine | Kein Container | resources/views/pages/partials/blocks/rich-text.blade.php | Besitzt sein .wb-rich-text-Root, wenn Inhalt vorhanden ist | clear | RichTextBlockTest, PublicRichContentTest, BlockTranslationIntegrityTest | Sichere HTML-Speicherung und Übersetzungsverantwortung sind klar geregelt. |
| code | Code | content | resources/views/admin/blocks/types/code.blade.php | title, subtitle, content über Textübersetzungszeilen | settings.language | Keine | Kein Container; historische Kindzeilen bleiben erhalten, aber neue Kindplatzierung wird nicht unterstützt | resources/views/pages/partials/blocks/code.blade.php | Besitzt sein -Root | clear | PublicRichContentTest, BlockTypePhaseThreeContractsTest, PageBuilderExperienceTest | Phase 3 richtet den übersetzten Code-Titel, die Bezeichnung und den Snippet-Inhalt an der bestehenden Textübersetzungsarchitektur aus und ignoriert in der öffentlichen Ausgabe nun beliebige historische Kindbäume. |
| button_link | Button Link | content | resources/views/admin/blocks/types/button_link.blade.php | title-Bezeichnung über Textübersetzungszeilen | settings.url; settings.target; geteiltes variant | Keine | Kein Container | resources/views/pages/partials/blocks/button_link.blade.php | Besitzt sein -Root | clear | PublicEditorialBlocksRenderingTest | Geteilte URL und geteiltes Ziel sind mit der übersetzten Bezeichnung konsistent. |
| card | Card | layout | resources/views/admin/blocks/types/card.blade.php | Keine | settings.layout_name | Kind-Regionsblöcke definieren die Struktur; kein direkter Medien- oder Übersetzungsvertrag | Container; als direkte Kinder sind ausschließlich card_header, card_body und card_footer erlaubt | resources/views/pages/partials/blocks/card.blade.php | Besitzt sein -Root | clear | PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest, BlockTranslationIntegrityTest, MediaVisualBlockContractsTest | Card ist jetzt eine komponierbare Hülle. Der Block besitzt das Card-Root, leert beim Speichern Legacy-Inhalts- oder Medienfelder und behält nur einen minimalen Legacy-Render-Fallback für ältere gespeicherte Zeilen ohne Card-Regionskinder. |
| card_header | Card Header | layout | resources/views/admin/blocks/types/card_header.blade.php | Keine | settings.layout_name | Nur Beziehung zum übergeordneten card | Container; darf nur unter card platziert werden; Card-Regionskinder sind nicht erlaubt | resources/views/pages/partials/blocks/card_header.blade.php | Besitzt sein -Root | clear | PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Komponierbarer Card-Regionsblock für Kopfzeileninhalte. |
| card_body | Card Body | layout | resources/views/admin/blocks/types/card_body.blade.php | Keine | settings.layout_name | Nur Beziehung zum übergeordneten card | Container; darf nur unter card platziert werden; Card-Regionskinder sind nicht erlaubt | resources/views/pages/partials/blocks/card_body.blade.php | Besitzt sein -Root | clear | PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Komponierbarer Card-Regionsblock für den Hauptinhalt. |
| card_footer | Card Footer | layout | resources/views/admin/blocks/types/card_footer.blade.php | Keine | settings.layout_name | Nur Beziehung zum übergeordneten card | Container; darf nur unter card platziert werden; Card-Regionskinder sind nicht erlaubt | resources/views/pages/partials/blocks/card_footer.blade.php | Besitzt sein -Root | clear | PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Komponierbarer Card-Regionsblock für Fußzeilen- oder Aktionsinhalte. |
| stat-card | Stat Card | content | resources/views/admin/blocks/types/stat-card.blade.php | title, subtitle, content über Textübersetzungszeilen | Das kanonische url bleibt auf der Blockzeile geteilt | Keine | Kein Container | resources/views/pages/partials/blocks/stat-card.blade.php | Besitzt sein Stat-Card-Root | clear | StatCardTest, BlockTranslationIntegrityTest | Phase 3 behält das bestehende optionale URL-Feld bei und rendert nun einen einfachen öffentlichen Link, wenn eine URL vorhanden ist. |
| image | Bild | content | resources/views/admin/blocks/types/image.blade.php | caption, alt text über Bildübersetzungszeilen | Geteiltes media_id; geteilte kanonische url | Direkte Bild-Medienbeziehung über media_id | Kein Container; historische Kindzeilen bleiben erhalten, aber neue Kindplatzierung wird nicht unterstützt | resources/views/pages/partials/blocks/image.blade.php | Besitzt sein semantisches -Root, wenn Medien vorhanden sind | clear | MediaVisualBlockContractsTest, PublicMediaBlocksTest, BlockTranslationIntegrityTest | Phase 3 richtet Image an der bestehenden Bildübersetzungsarchitektur aus, sodass Bildunterschrift und Alt-Text locale-eigen sind, während ausgewählte Medien und die optionale Link-URL geteilt bleiben. |
| gallery | Galerie | content | resources/views/admin/blocks/types/gallery.blade.php sowie resources/views/admin/blocks/types/partials/gallery-items-editor.blade.php | Pro Galerie-Element alt_text, caption, overlay_title und overlay_text über block_gallery_item_translations | Geteilte Galerie-Darstellungseinstellungen sowie geordnete block_media-Galerie-Element-Beziehungen | Geordnete block_media-Zeilen mit der Rolle gallery_item; locale-eigene Galerie-Element-Texte liegen in block_gallery_item_translations; gespeicherte Legacy-Werte für title/subtitle am Block können noch existieren, werden vom öffentlichen Rendering aber ignoriert | Kein Container; historische Kindzeilen bleiben erhalten, aber neue Kindplatzierung wird nicht unterstützt | resources/views/pages/partials/blocks/gallery.blade.php | Besitzt sein Galerie-Wrapper-Root und registriert ein Viewer-Modal unter #wb-overlay-root, wenn die Lightbox aktiviert ist | clear | MediaVisualBlockContractsTest, PublicMediaBlocksTest, PageBuilderExperienceTest, SiteCloneServiceTest, SiteExportImportTest, SitePromotionTest, ReconstructionIntegrityTest, SharedSlotRevisionTest | Galerie ist jetzt ein Medienkollektions-Block. Das normale Admin-Formular verwendet einen kompakten Listenzeilen-Editor anstelle des älteren Rasters ausgewählter Assets. Sein verschachtelter Add Gallery Items-Picker bleibt auf dem geteilten Admin-Vertrag #wb-overlay-root, sodass die WebBlocks-UI den Lebenszyklus gestapelter Modals besitzt; lange kompakte Ergebnislisten behalten ihre natürliche Zeilenhöhe, während der Modal-Body der Scroll-Container bleibt. Die öffentlichen Varianten sind klar unterschieden: grid behält gleiche Zellen, masonry nutzt CSS-Spalten mit natürlicher Bildhöhe, und collage behält die Komposition mit dem hervorgehobenen Element zuerst. Gespeicherte Legacy-Werte masonary werden weiterhin akzeptiert und auf den kanonischen masonry-Pfad normalisiert. Galerie besitzt keine Intro-Überschrift und keine Absatzausgabe mehr; Editoren sollten content_header plus plain_text oder rich-text vor der Galerie platzieren, wenn Abschnittstexte benötigt werden. Legacy-Fallback-Elemente auf Einstellungsbasis bleiben für ältere Inhalte lesbar. |
| download | Download | content | resources/views/admin/blocks/types/download.blade.php | title, subtitle über Textübersetzungszeilen | Geteiltes media_id; geteiltes variant | Direkte Download-Medienbeziehung über media_id | Kein Container; historische Kindzeilen bleiben erhalten, aber neue Kindplatzierung wird nicht unterstützt | resources/views/pages/partials/blocks/download.blade.php | Besitzt sein CTA-Wrapper-Root, wenn Medien vorhanden sind | clear | MediaVisualBlockContractsTest, PublicMediaBlocksTest | Phase 3 hält die ausgewählten Download-Medien und die Button-Variante geteilt, während sichtbare Bezeichnung und Hilfstext in den bestehenden Textübersetzungspfad verschoben werden. |
| file | Datei | content | resources/views/admin/blocks/types/file.blade.php | title, content über Textübersetzungszeilen | Geteiltes media_id; geteilte kanonische url | Direkte Medienbeziehung über media_id mit Fallback auf eine externe URL | Kein Container; historische Kindzeilen bleiben erhalten, aber neue Kindplatzierung wird nicht unterstützt | resources/views/pages/partials/blocks/file.blade.php | Besitzt sein File-Card-Root | clear | MediaVisualBlockContractsTest, PublicMediaBlocksTest | Phase 3 produktisiert den ausgelieferten File-Renderer mit einem eigenen Admin-Formular und hält die geteilte Verantwortung für die Dateiquelle zwischen Medien und externem URL-Fallback explizit. |
| video | Video | content | resources/views/admin/blocks/types/video.blade.php | title, content über Textübersetzungszeilen | Geteiltes media_id; geteilte kanonische url | Direkte Medienbeziehung über media_id mit sicherem Fallback auf eine externe URL | Kein Container; historische Kindzeilen bleiben erhalten, aber neue Kindplatzierung wird nicht unterstützt | resources/views/pages/partials/blocks/video.blade.php | Besitzt sein Video-Card-Root | clear | MediaVisualBlockContractsTest, PublicMediaBlocksTest | Phase 3 ergänzt das fehlende Admin-Formular und den Speicherpfad, sodass hochgeladene Videomedien, sichere externe Anbieter-URLs, übersetzte sichtbare Texte und das öffentliche Fallback-Verhalten nun denselben Vertrag beschreiben. |
| audio | Audio | content | resources/views/admin/blocks/types/audio.blade.php | title, content über Textübersetzungszeilen | Geteiltes media_id; geteilte kanonische url | Direkte Medienbeziehung über media_id mit Fallback auf eine externe URL | Kein Container; historische Kindzeilen bleiben erhalten, aber neue Kindplatzierung wird nicht unterstützt | resources/views/pages/partials/blocks/audio.blade.php | Besitzt sein Audio-Card-Root | clear | MediaVisualBlockContractsTest, PublicMediaBlocksTest | Phase 3 ergänzt das fehlende Admin-Formular und den Speicherpfad, sodass hochgeladene Audiomedien, übersetzte sichtbare Texte und das sichere Rendering ohne leere Player-Steuerelemente nun dem dokumentierten Vertrag entsprechen. |
| table | Tabelle | content | resources/views/admin/blocks/types/table.blade.php | title, content über Textübersetzungszeilen | Geteiltes variant; der Renderer prüft zusätzlich den settings.rows-Fallback | Keine | Kein Container; historische Kindzeilen bleiben erhalten, aber neue Kindplatzierung wird nicht unterstützt | resources/views/pages/partials/blocks/table.blade.php | Besitzt sein Tabellen-Wrapper-Root | mostly clear | PublicRichContentTest, BlockTypePhaseThreeContractsTest, PageBuilderExperienceTest | Phase 3 richtet die Verantwortung für übersetzten Titel und Zeilentexte an der bestehenden Textübersetzungsarchitektur aus und ignoriert in der öffentlichen Ausgabe nun beliebige historische Kindbäume; der Legacy-Fallback-Pfad über settings.rows bleibt dokumentiert. |
| quote | Zitat | content | resources/views/admin/blocks/types/quote.blade.php | Derzeit keine in der Registry | Kanonische Felder title, subtitle, content, variant | Keine | Kein Container; historische Kindzeilen bleiben erhalten, aber neue Kindplatzierung wird nicht unterstützt | resources/views/pages/partials/blocks/quote.blade.php | Besitzt sein Zitat-Root | clear | PublicRichContentTest, PageBuilderExperienceTest | Phase 3 behandelt Quote in der öffentlichen Ausgabe nicht mehr als Layout-/Container-Wrapper, während vorhandene gespeicherte Kindzeilen in den Admin-Blockbäumen erhalten bleiben. |
| hero | Hero | content | resources/views/admin/blocks/types/hero.blade.php | title, subtitle, content über Textübersetzungszeilen | Geteiltes variant; settings.layout; settings.title_tag | Kind-button-Blöcke für verwaltete CTAs | Container; nur button-Kinder | resources/views/pages/partials/blocks/hero.blade.php | Besitzt sein Promo--Root | transitional | PublicHeroBlockRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Hero ist jetzt ein veröffentlichter, quellgestützter Kernvertrag. Intro-Texte sind locale-eigen, CTA-Bezeichnungen werden auf den Kind-Buttons übersetzt, und CTA-URLs bleiben geteilt. Legacy-Inhalts-Fallbacks bleiben lesbar, wo kanonische übersetzte Felder leer sind. |
| columns | Spalten | content | resources/views/admin/blocks/types/columns.blade.php | title, subtitle, content über Textübersetzungszeilen | Geteiltes variant | Kind-column_item-Blöcke | Container; nur column_item-Kinder | resources/views/pages/partials/blocks/columns.blade.php | Besitzt sein -Root für strukturierte Inhalte | clear | PublicColumnsRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Columns ist jetzt ein veröffentlichter, erstklassiger Block für strukturierte Inhalte. Intro-Texte sind locale-eigen, während Variante, Kindreihenfolge und Kind-URLs geteilt bleiben. |
| column_item | Spaltenelement | content | resources/views/admin/blocks/types/column_item.blade.php | title, subtitle, content über Textübersetzungszeilen | Geteilte kanonische url | Beziehung zum übergeordneten columns | Kein Container | resources/views/pages/partials/blocks/column_item.blade.php | Das vom Parent bestimmte Element-Root variiert je nach Columns-Variante | clear | PublicColumnsRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Column Item ist jetzt ein veröffentlichter unterstützender Kindvertrag für Columns. Locale-Bearbeitungen aktualisieren Elementtexte, ohne geteilte URLs zu überschreiben. |
| cta | CTA | content | resources/views/admin/blocks/types/cta.blade.php | title, subtitle, content über Textübersetzungszeilen | Geteiltes variant | Kind-button-Blöcke für verwaltete CTAs | Container; nur button-Kinder | resources/views/pages/partials/blocks/cta.blade.php | Besitzt sein Promo--Root | clear | PublicHeroBlockRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | CTA ist jetzt ein veröffentlichter Promo-Vertrag mit locale-eigenen Texten und CTA-Bezeichnungen, geteilten CTA-URLs und einem öffentlichen Renderer, der sein Root besitzt. |
| feature-grid | Feature Grid | content | resources/views/admin/blocks/types/feature-grid.blade.php | title, subtitle, content über Textübersetzungszeilen | Keine über die geteilte Kindstruktur hinaus | Kind-feature-item-Blöcke mit legacy-kompatibler column_item-Unterstützung | Container; erlaubte Kinder sind feature-item und column_item | resources/views/pages/partials/blocks/feature-grid.blade.php | Delegiert an die Karten-Darstellung von Columns und verwendet weiterhin den generischen öffentlichen Wrapper | transitional | PublicHeroBlockRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Feature Grid ist jetzt ein veröffentlichter Kompatibilitäts-Alias, da es real ausgelieferte Admin- und Render-Pfade besitzt, aber weiterhin bewusst an den Karten-Vertrag von Columns delegiert. |
| feature-item | Feature Item | content | resources/views/admin/blocks/types/feature-item.blade.php | title, content über Textübersetzungszeilen | Geteilte kanonische url | Beziehung zum übergeordneten feature-grid | Kein Container | resources/views/pages/partials/blocks/feature-item.blade.php | Delegiert an die Karten-Darstellung von Column Item | transitional | PublicHeroBlockRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Feature Item ist jetzt ein veröffentlichter unterstützender Kindvertrag für Feature Grid und teilt weiterhin die bestehende Card-Hülle von Column Item. |
Layout
| Slug | Bezeichnung | Kategorie | Quelle des Admin-Formulars | Übersetzbare Felder | Geteilte/Einstellungsfelder | Medien-/Beziehungsfelder | Kind-/Container-Verhalten | Quelle des öffentlichen Renderers | Renderer-Root-Vertrag | Aktueller Status | Tests / Abdeckung | Bekannte Lücken / Hinweise |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| section | Abschnitt | layout | resources/views/admin/blocks/types/section.blade.php | Keine | settings.layout_name; settings.spacing | Nur Kind-Blöcke | Container; keine explizite Kind-Whitelist | resources/views/pages/partials/blocks/section.blade.php | Besitzt sein Root- | clear | PublicEditorialBlocksRenderingTest, PublicLayoutStructureTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Phase 3 hält Section rein Layout-bezogen: geteilte Layout-Einstellungen bleiben kanonisch, der Block besitzt das semantische -Root, und nutzersichtbare Texte werden nicht in beliebige Einstellungen verlagert. |
| container | Container | layout | resources/views/admin/blocks/types/container.blade.php | Keine | settings.layout_name; settings.width; settings.flow | Nur Kind-Blöcke | Container; keine explizite Kind-Whitelist | resources/views/pages/partials/blocks/container.blade.php | Besitzt sein Root-Container- | clear | PublicEditorialBlocksRenderingTest, PublicLayoutStructureTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Der Legacy-Standard fällt weiterhin auf den gestapelten Flow zurück, wenn nichts gesetzt ist, während ein explizites Flow: None der layoutneutrale Kompositionspfad bleibt. |
| cluster | Cluster | layout | resources/views/admin/blocks/types/cluster.blade.php | Keine | settings.layout_name; settings.gap; settings.alignment; settings.items_alignment; settings.wrap; settings.width | Nur Kind-Blöcke | Container; keine explizite Kind-Whitelist | resources/views/pages/partials/blocks/cluster.blade.php | Besitzt sein Root-Cluster- | clear | PublicEditorialBlocksRenderingTest, PublicLayoutStructureTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Geteilte Layout-Einstellungen bleiben explizit und rendererseitig verwaltet, einschließlich des bestehenden navbar-kompatiblen Kompositionspfads mit voller Breite, between, center und nowrap, ohne navbar-spezifische Logik hinzuzufügen. |
| grid | Grid | layout | resources/views/admin/blocks/types/grid.blade.php | Keine | settings.layout_name; settings.columns; settings.gap | Nur Kind-Blöcke | Container; keine explizite Kind-Whitelist | resources/views/pages/partials/blocks/grid.blade.php | Besitzt sein Root-Grid- | clear | PublicEditorialBlocksRenderingTest, PublicLayoutStructureTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest | Geteilte Grid-Einstellungen bleiben kanonisch, und die öffentliche Ausgabe bleibt auf die ausgelieferten wb-grid-- und unterstützten wb-gap--Klassenzuordnungen beschränkt. |
Pattern
| Slug | Bezeichnung | Kategorie | Quelle des Admin-Formulars | Übersetzbare Felder | Geteilte/Einstellungsfelder | Medien-/Beziehungsfelder | Kind-/Container-Verhalten | Quelle des öffentlichen Renderers | Renderer-Root-Vertrag | Aktueller Status | Tests / Abdeckung | Bekannte Lücken / Hinweise |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| content_header | Content Header | pattern | resources/views/admin/blocks/types/content_header.blade.php | title, subtitle, meta über Textübersetzungszeilen | settings.alignment | meta wird als strukturierter Listeninhalt gespeichert | Kein Container | resources/views/pages/partials/blocks/content_header.blade.php | Besitzt sein Root- | clear | PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest, BlockTranslationIntegrityTest | Content Header ist ein Pattern-Block, der als Inhaltshülle dient. Titel-, Intro- und Meta-Texte bleiben locale-eigen, der Titel wird immer als H1 gerendert, beim Rendern werden etwaige gespeicherte Legacy-Werte für die Überschriftenebene ignoriert, und nur die Ausrichtung bleibt geteilt. |
| alert | Alert | pattern | resources/views/admin/blocks/types/alert.blade.php | title, content über Textübersetzungszeilen | settings.variant | Keine | Kein Container | resources/views/pages/partials/blocks/alert.blade.php | Besitzt sein Alert-Root | clear | PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest | Geteilte Variante und übersetzte Texte passen sauber zusammen. |
Navigation
| Slug | Bezeichnung | Kategorie | Quelle des Admin-Formulars | Übersetzbare Felder | Gemeinsame/Einstellungsfelder | Medien-/Beziehungsfelder | Kind-/Container-Verhalten | Quelle des öffentlichen Renderers | Renderer-Root-Vertrag | Aktueller Status | Tests / Abdeckung | Bekannte Lücken / Hinweise |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| link-list | Link List | navigation | resources/views/admin/blocks/types/link-list.blade.php | title, subtitle, content über Textübersetzungszeilen | Keine | Untergeordnete link-list-item-Blöcke | Container; nur link-list-item-Kinder | resources/views/pages/partials/blocks/link-list.blade.php | Besitzt seinen .wb-link-list-Root, wenn untergeordnete Zeilen vorhanden sind | clear | LinkListBlockTest, PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest, BlockTypePhaseThreeContractsTest | Phase 3 rendert die vorhandene übersetzte Einleitung jetzt oberhalb der öffentlichen Linkliste, ohne das Verhalten der untergeordneten Einträge zu ändern. |
| link-list-item | Link List Item | navigation | resources/views/admin/blocks/types/link-list-item.blade.php | Erforderlicher title, optionaler subtitle, optionaler content über Textübersetzungszeilen | Erforderliche gemeinsame url | Beziehung zum übergeordneten link-list | Kein Container | resources/views/pages/partials/blocks/link-list-item.blade.php | Besitzt seinen Zeilenlink-Root und lässt das Beschreibungselement weg, wenn der Inhalt leer ist | clear | LinkListBlockTest, PageBuilderExperienceTest, PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest | Gemeinsame URL und übersetzter Zeilentext sind konsistent. |
| toc | TOC | navigation | resources/views/admin/blocks/types/toc.blade.php | Keine | Nur kanonischer title | Veröffentlichte header-Blöcke derselben Seite mit gültigen Ankern | Kein Container; historische untergeordnete Zeilen bleiben erhalten, neue Kindplatzierung wird jedoch nicht unterstützt | resources/views/pages/partials/blocks/toc.blade.php | Besitzt seinen generierten TOC-Wrapper, wenn Überschriften vorhanden sind | clear | PublicRichContentTest, PageBuilderExperienceTest | Phase 3 hält das TOC ausschließlich auf erkannte Seitenüberschriften fokussiert und behandelt beliebige untergeordnete Blöcke nicht mehr als öffentlichen TOC-Inhalt. |
| breadcrumb | Breadcrumb | navigation | resources/views/admin/blocks/types/breadcrumb.blade.php | Keine | Gemeinsames settings.home_label; settings.include_current | Breadcrumb-Kontext aus aktueller Seite, Site und Sprache (Locale) | Kein Container | resources/views/pages/partials/blocks/breadcrumb.blade.php | Besitzt seinen -Root | clear | PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest | Phase 3 bewahrt die offengelegten Breadcrumb-Einstellungen über den gemeinsamen BlockRequest-Pfad, sodass das Formularverhalten nun mit Persistenz und Rendering übereinstimmt. |
| header-actions | Header Actions | navigation | resources/views/admin/blocks/types/header-actions.blade.php | Keine | Gemeinsame settings.show_mode_toggle; settings.show_accent_toggle; settings.show_search | Suchroute plus clientseitige UI-Hooks | Kein Container | resources/views/pages/partials/blocks/header-actions.blade.php | Besitzt nur sein inneres Aktions-Cluster | clear | PublicEditorialBlocksRenderingTest | System-Utility-Block; per Design keine Übersetzungsverantwortung. |
| sticky-navbar | Navbar | navigation | resources/views/admin/blocks/types/sticky-navbar.blade.php | Keine | settings.layout_name; settings.sticky_mode | Verschachtelte untergeordnete Navbar-Blöcke | Container; zulässige Kinder sind container, cluster, header, plain_text, rich-text, button_link, navbar-brand, navbar-navigation, header-actions, search-form | resources/views/pages/partials/blocks/sticky-navbar.blade.php | Der öffentliche Renderer besitzt den äußeren -Root | clear | PublicEditorialBlocksRenderingTest, PublicLayoutStructureTest, BlockTypePhaseThreeContractsTest | Phase 3 richtet den persistierten sticky-navbar-Slug an Block::ownsPublicRoot() aus, sodass die Navbar keinen zusätzlichen generischen öffentlichen Block-Wrapper mehr erhält. |
| navbar-brand | Navbar Brand | navigation | resources/views/admin/blocks/types/navbar-brand.blade.php | title, subtitle über Textübersetzungszeilen | Gemeinsame settings.url; settings.target; settings.aria_label | Gemeinsames Logo-Medium über media_id; Fallback auf die Startseiten-URL der Site | Kein Container | resources/views/pages/partials/blocks/navbar-brand.blade.php | Besitzt nur den inneren Markenlink | clear | PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTranslationIntegrityTest, BlockTypePhaseThreeContractsTest | Phase 3 richtet das Speicherverhalten im Admin am ausgelieferten Renderer-Vertrag aus: eine explizit gespeicherte URL gewinnt, andernfalls wird, falls verfügbar, der Startseitenpfad der aktuellen Site verwendet, danach / als letzter sicherer Fallback. |
| navbar-navigation | Navbar Navigation | navigation | resources/views/admin/blocks/types/navbar-navigation.blade.php | Keine | Kanonischer title als gemeinsames ARIA-Label; settings.menu_key | Gemeinsamer NavigationItem-Menübaum | Kein Container | resources/views/pages/partials/blocks/navbar-navigation.blade.php | Besitzt nur den inneren Navigations-Wrapper | clear | PublicEditorialBlocksRenderingTest | Gemeinsame Menübindung und ARIA-Label sind aktuelles produktseitig verantwortetes Verhalten. |
| sidebar-brand | Sidebar Brand | navigation | resources/views/admin/blocks/types/sidebar-brand.blade.php | title, subtitle über Textübersetzungszeilen | Gemeinsame settings.url; settings.target; settings.aria_label | Gemeinsames Logo-Medium über media_id; Fallback auf die Startseiten-URL der Site | Kein Container | resources/views/pages/partials/blocks/sidebar-brand.blade.php | Besitzt nur den inneren Markenlink | clear | PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTranslationIntegrityTest, BlockTypePhaseThreeContractsTest | Phase 3 gibt Sidebar Brand dieselbe Fallback-Reihenfolge für den zugänglichen Namen bei reiner Logo-Darstellung wie Navbar Brand und denselben konservativen Fallback-Vertrag für die gemeinsame URL. |
| sidebar-navigation | Sidebar Navigation | navigation | resources/views/admin/blocks/types/sidebar-navigation.blade.php | title über Textübersetzungszeilen | Gemeinsame settings.menu_key; settings.layout_name; settings.show_icons; settings.active_matching | Entweder der CMS-NavigationItem-Baum oder manuelle untergeordnete Blöcke | Container; nur sidebar-nav-item- und sidebar-nav-group-Kinder | resources/views/pages/partials/blocks/sidebar-navigation.blade.php | Besitzt seinen -Root | clear | PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest | Sowohl die gemeinsamen Menümodus-Einstellungen als auch der manuelle Kindmodus sind explizit. |
| sidebar-nav-item | Sidebar Nav Item | navigation | resources/views/admin/blocks/types/sidebar-nav-item.blade.php | title über Textübersetzungszeilen | Gemeinsame settings.url; settings.target; settings.icon; settings.active_mode; settings.manual_active | Gemeinsamer Icon-Katalog-Slug; Beziehung zur übergeordneten Sidebar | Kein Container | resources/views/pages/partials/blocks/sidebar-nav-item.blade.php | Besitzt seinen Sidebar-Link-Root | clear | PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest | Gemeinsames Linkverhalten und übersetztes Label passen gut zusammen. |
| sidebar-nav-group | Sidebar Nav Group | navigation | resources/views/admin/blocks/types/sidebar-nav-group.blade.php | title über Textübersetzungszeilen | Gemeinsame settings.icon; settings.initially_open; settings.layout_name | Untergeordnete sidebar-nav-item-Blöcke; Icon-Katalog-Slug | Container; nur sidebar-nav-item-Kinder | resources/views/pages/partials/blocks/sidebar-nav-group.blade.php | Besitzt seinen .wb-nav-group-Root | clear | PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTranslationIntegrityTest, BlockTypePhaseThreeContractsTest | Phase 3 behält den ausgelieferten WebBlocks-UI-Nav-Group-Wrapper-Vertrag bei, während verschachtelte manuelle Kindlinks nun dieselbe Sidebar-Item-Semantik für href, target, Icon und Aktiv-Zustand wiederverwenden. |
| search-form | Search Form | navigation | resources/views/admin/blocks/types/search-form.blade.php | title, subtitle, content über Textübersetzungszeilen | Gemeinsame variant; settings.show_button | Suchroute-, Site- und Sprachkontext (Locale) | Kein Container | resources/views/pages/partials/blocks/search-form.blade.php | Besitzt seinen -Root | clear | SearchFormTest, PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest | Gemeinsame Einstellungen zur Button-Anzeige und übersetzte Labels sind explizit. |
| sidebar-footer | Sidebar Footer | navigation | resources/views/admin/blocks/types/sidebar-footer.blade.php | title, subtitle, content über Textübersetzungszeilen | Gemeinsame settings.variant | Keine | Kein Container | resources/views/pages/partials/blocks/sidebar-footer.blade.php | Besitzt seinen inneren Footer-Block-Root | clear | PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest | Gemeinsame Variante mit übersetztem Text ist unkompliziert. |
Formulare
| Slug | Bezeichnung | Kategorie | Quelle des Admin-Formulars | Übersetzbare Felder | Gemeinsame/Einstellungsfelder | Medien-/Beziehungsfelder | Kind-/Container-Verhalten | Quelle des öffentlichen Renderers | Renderer-Root-Vertrag | Aktueller Status | Tests / Abdeckung | Bekannte Lücken / Hinweise |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| contact_form | Contact Form | form | resources/views/admin/blocks/types/contact_form.blade.php | title, content, submit_label, success_message über Kontaktformular-Übersetzungszeilen | Gemeinsame settings.recipient_email; settings.send_email_notification; settings.store_submissions | contact_messages-Einsendungen verweisen zurück auf den Block und die Seite | Kein Container | resources/views/pages/partials/blocks/contact_form.blade.php | Besitzt seinen section.wb-card-Root und gibt ein natives, CSRF-geschütztes Formular aus, das an /contact-messages sendet | clear | ContactFormModuleTest, InternalContentApiTest, ContactMailDiagnoseCommandTest | Der Renderer gibt ein CMS-eigenes, verstecktes, generiertes Anti-Spam-Prüffeld aus, das keine normale Besuchereingabe ist und nicht manuell angelegt werden sollte. Einsendungen mit ausgefülltem Prüffeld liefern eine generische Erfolgsmeldung ohne Speicherung oder Benachrichtigung. Legitime Nachrichten werden vor der Benachrichtigung gespeichert, als Spam eingestufte Inhalte bleiben zur Admin-Prüfung erhalten, der Empfänger-Fallback lautet Block, Site, CONTACT_RECIPIENT_EMAIL, dann MAIL_FROM_ADDRESS, und Kontaktseiten sollten Trusted HTML/rohe Formulare/mailto: nicht als Ersatz verwenden. |
Erweitert
| Slug | Bezeichnung | Kategorie | Quelle des Admin-Formulars | Übersetzbare Felder | Gemeinsame/Einstellungsfelder | Medien-/Beziehungsfelder | Kind-/Container-Verhalten | Quelle des öffentlichen Renderers | Renderer-Root-Vertrag | Aktueller Status | Tests / Abdeckung | Bekannte Lücken / Hinweise |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| html | HTML (Trusted) | advanced | resources/views/admin/blocks/types/html.blade.php | Keine | Kanonischer vertrauenswürdiger HTML-content | Öffentliche Overlay- und Body-End-Registries können extrahierte Fragmente erhalten | Kein Container; historische untergeordnete Zeilen bleiben erhalten, neue Kindplatzierung wird jedoch nicht unterstützt | resources/views/pages/partials/blocks/html.blade.php | Besitzt einen Wrapper- um das vertrauenswürdige Markup und kann zusätzlich Out-of-Band-Overlay- oder Body-End-Inhalte ausgeben | mostly clear | PublicEditorialBlocksRenderingTest, PublicRichContentTest, PageBuilderExperienceTest | Phase 3 behandelt Trusted HTML nicht mehr als öffentlichen Kind-Container-Wrapper. Vertrauenswürdiges Markup kann die gemeinsame Overlay- oder Body-End-Ausgabe jenseits des sichtbaren Roots weiterhin beeinflussen. |
Überblick über Validierung und Persistenz
Veröffentlichte Blocktypen haben heute nicht jeweils eine eigene dedizierte Request-Klasse.
App\Http\Requests\Admin\BlockRequestist der gemeinsame Bearbeitungs-Request-Pfad- slug-spezifische Zweige innerhalb dieses Requests normalisieren Felder in die aktuelle kanonische Speicherung
App\Support\Blocks\BlockPayloadWriterpersistiert die normalisierte Block-PayloadApp\Support\Blocks\BlockTranslationWriterverschiebt locale-eigene Felder für registrierte Familien in ÜbersetzungszeilenApp\Support\Blocks\BlockTranslationResolverlöst übersetzte oder Fallback-Werte zurück auf eine renderbare Blockinstanz auf
Dieser gemeinsame Request-Pfad ist einer der Gründe, warum Phase 1 zuerst die Verträge dokumentiert, bevor schemagesteuerte Bearbeitungsarbeiten beginnen.
Lücken und Backlog
Aktuell verbleibende wesentliche Lücken nach den aktuellen Phase-3-Korrekturen:
gallerybewahrt weiterhin einen älteren, auf Einstellungen basierenden Fallback-Pfad für Einträge, wenn kanonische geordneteblock_media-Zeilen fehlen- der
table-Renderer unterstützt weiterhin einen älteren Fallback-Pfad übersettings.rows, obwohl das zentrale Admin-Formular übersetzten Zeilentext schreibt herobewahrt weiterhin ältere Feld-Fallbacks, wenn die kanonischen übersetzten Einleitungsfelder leer sindfeature-gridundfeature-itemsind jetzt veröffentlicht, weil sie quellgestützt sind, bleiben aber bewusst transitionale Delegate-Verträge über den gemeinsamen Präsentationspfaden von Columns bzw. Column Itemtabs,slider,menuundfaq-listexistieren weiterhin als ältere Entwurfs-Katalogzeilen mit Kompatibilitätsformularen oder -Renderern, sind aber keine veröffentlichten Kernverträge und sollten im Vertragsmodal und in der Audit-Ausgabe weiterhin sicher fehlschlagenshowcase-listundcontact-infoexistieren weiterhin nur als Kompatibilitätspfade für das öffentliche Rendering und nicht als ausgelieferte veröffentlichte Kern-Katalogblöcke; ihre einstellungsgesteuerten Links folgen jetzt denselben sicheren öffentlichen URL-Regeln wie andere Block-Renderer- veröffentlichte und Entwurfs-Kataloge existieren nebeneinander, daher muss die künftige Admin-Darstellung explizit zwischen veröffentlichten Kernverträgen und Entwurfs- oder installationsspezifischen Zeilen unterscheiden
Empfohlene Phase 3
Empfohlene spätere Standardisierungsarbeiten für Blockgruppen:
- stabile produktseitig verantwortete Blockgruppen wie Layout, Inhalt, Navigation, Muster und Erweitert in einer einzigen Quelle der Wahrheit definieren
- Picker-Gruppierungen, Doku-Gruppierungen und die Gruppierungen im Block-Types-Admin an derselben Quelle ausrichten
- entscheiden, welche derzeit als Entwurf oder transitional geführten Blöcke unterstützt, archiviert oder explizit als Legacy eingestuft werden sollen
- standardisieren, welche Verträge übersetzungsgestützt und welche bewusst rein gemeinsam (shared-only) sind, bevor schemagesteuerte Formulararbeiten beginnen
Zusammenfassung Phase 1
Phase 1 erstellt das aktuelle Inventar der veröffentlichten Verträge, ohne das Blockbearbeitungsverhalten, die Blockspeicherung oder das öffentliche Rendering zu verändern.
Das war der beabsichtigte Endpunkt für das Phase-1-Release.
Zusammenfassung Phase 2
Phase 2 macht den dokumentierten Vertrag im Block-Types-Admin als schreibgeschützte Information sichtbar, während Blockbearbeitungsverhalten, Speicherung, Renderer und Picker-Verhalten unverändert bleiben.
Zusammenfassung Phase 3
Phase 3 beginnt damit, dokumentierte risikoarme Vertragslücken zu schließen, ohne einen Schema-Editor, einen dynamischen Formular-Builder oder ein DB-gesteuertes Block-Formularsystem hinzuzufügen.
codefolgt jetzt dem bestehenden Textübersetzungspfad für Titel, Label und Snippet-Inhalt, während die Syntaxsprache gemeinsam bleibttablefolgt jetzt dem bestehenden Textübersetzungspfad für Titel und Zeilentext, während der Tabellenstil gemeinsam bleibtbreadcrumbbewahrt jetzt die offengelegten gemeinsamen Einstellungen beim Speichernstat-cardnutzt jetzt die vorhandene optionale URL im öffentlichen Renderer mit einem einfachen sicheren Linklink-listrendert jetzt die vorhandene übersetzte Einleitung oberhalb der Liste der untergeordneten Einträgesticky-navbarrichtet jetzt die persistierte Navbar-Root-Eigentümerschaft anBlock::ownsPublicRoot()aus, sodass die öffentliche Shell keinen zusätzlichen generischen Wrapper hinzufügtimagefolgt jetzt dem bestehenden Bildübersetzungspfad für Bildunterschrift und Alt-Text, während ausgewählte Medien und die optionale Link-URL gemeinsam bleibengalleryverwendet jetzt locale-eigeneblock_gallery_item_translationsfür Alt-Text, Bildunterschrift, Overlay-Titel und Overlay-Text je Eintrag, während geordnete Galerie-Medien und Präsentationseinstellungen gemeinsam bleiben; ältere Fallback-Einträge für alte Inhalte bleiben erhalten, und alte Galerietitel/-beschreibungen sind von der normalen Bearbeitung und der öffentlichen Ausgabe ausgeschlossendownloadfolgt jetzt dem bestehenden Textübersetzungspfad für sichtbares Label und Hilfetext, während ausgewählte Medien und Button-Variante gemeinsam bleibenfile,videoundaudiohaben jetzt vollwertige Admin-Formulare und Request-Normalisierung, sodass übersetzter sichtbarer Text und gemeinsame Medien- oder URL-Quellen über denselben Vertrag laufen, den sie bereits öffentlich rendernimage,gallery,download,file,videoundaudioakzeptieren keine neue beliebige Kindplatzierung mehr und rendern beliebige historische Kindbäume nicht mehr öffentlich, während vorhandene untergeordnete Zeilen in den Admin-Blockbäumen erhalten bleibencode,table,quote,tocundhtmlakzeptieren keine neue normale Kindplatzierung mehr und rendern beliebige historische Kindbäume nicht mehr öffentlich, während vorhandene untergeordnete Zeilen in den Admin-Blockbäumen erhalten bleibennavbar-brandundsidebar-brandteilen sich jetzt einen konservativen Fallback-Vertrag aus gespeicherter URL oder Site-Startseite, und beide bewahren eine sichere zugängliche Benennung für reine Logo-Ausgabe, ohne sichtbaren Text zu erzwingensidebar-nav-groupverwendet jetzt für verschachtelte Kindlinks dieselbe manuelle Sidebar-Item-Ausgabesemantik wiesidebar-nav-itemund bewahrt dabei den bestehenden WebBlocks-UI-Nav-Group-Wrapper-Vertragsection,container,grid,cluster,cardundcontent_headerverwenden jetzt dieselbe ausgelieferte Vertragsquelle über Registry, schreibgeschütztes Admin-Vertragsmodal, Audit-Ausgabe, Doku und fokussierte Regressionsabdeckung hinweghero,columns,column_item,cta,feature-gridundfeature-itemsind jetzt im ausgelieferten Kernkatalog veröffentlicht, in der gemeinsamen Vertrags-Registry dokumentiert und als quellgestützte Marketing- oder strukturierte Inhaltsverträge abgedeckt, statt nur als Entwurf oder unterdokumentiert zu bleiben- Nur-Locale-Bearbeitungen für verwaltete CTA-Buttons und strukturierte untergeordnete Einträge bewahren jetzt gemeinsame URLs, während übersetzte Labels oder Texte weiterhin aktualisiert werden
- Layout-Primitive halten gemeinsame Layout-Einstellungen und Kindstruktur in der kanonischen Blockspeicherung statt in Übersetzungszeilen oder beliebigen Textfeldern
cardverwendet jetzt einen komponierbaren Shell-Vertrag: die übergeordnete Card besitzt denwb-card-Root, Card-Regionen besitzenwb-card-header,wb-card-bodyundwb-card-footer, Regionsblöcke sind nur unterhalb von Card gültig, und alter gespeicherter Card-Text bleibt nur über einen minimalen Fallback-Renderer-Pfad ohne Regionen erhaltencontent_headerbehält übersetzten Titel-, Einleitungs- und Meta-Text, rendert seinen Titel immer als H1, ignoriert alte gespeicherte Werte für die Überschriftenebene sicher und hält seinen semantischen<header class="wb-content-header">-Root ohne generischen Wrapper in Renderer-Eigentumtestimonialundstatsbleiben ehrlich als reines Alias-Verhalten dokumentiert, das an bestehende Quote- oder Columns-Renderpfade delegiert, statt als eigenständige veröffentlichte Kernverträgetabs,slider,menuundfaq-listbleiben Kompatibilitäts-Slugs aus der Entwurfs- oder Alias-Ära statt veröffentlichter Kernverträge, währendshowcase-listundcontact-inforein öffentliche Kompatibilitäts-Renderer ohne ausgelieferten Kernvertragseintrag bleiben