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 Types heute 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\BlockRequest Block-Payloads aktuell normalisiert und validiert
  • Speicher-Eigentum: welche Werte in blocks, dedizierten Übersetzungszeilen, block_media oder 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, geordnetes block_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 überein
  • mostly clear: der aktuelle Vertrag ist verständlich, hat aber einen nennenswerten Vorbehalt
  • transitional: der aktuelle Vertrag trägt bewusst einen Kompatibilitätspfad oder ein gemischtes Eigentumsmuster
  • needs review: aktuelle Codepfade widersprechen sich oder das Verhalten ist so unzureichend dokumentiert, dass Phase 2 es deutlicher sichtbar machen sollte
  • legacy/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_id oder block_media verwenden
  • 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\BlockRequest ist der gemeinsame Bearbeitungs-Request-Pfad
  • slug-spezifische Zweige innerhalb dieses Requests normalisieren Felder in die aktuelle kanonische Speicherung
  • App\Support\Blocks\BlockPayloadWriter persistiert die normalisierte Block-Payload
  • App\Support\Blocks\BlockTranslationWriter verschiebt locale-eigene Felder für registrierte Familien in Übersetzungszeilen
  • App\Support\Blocks\BlockTranslationResolver lö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:

  • gallery bewahrt weiterhin einen älteren, auf Einstellungen basierenden Fallback-Pfad für Einträge, wenn kanonische geordnete block_media-Zeilen fehlen
  • der table-Renderer unterstützt weiterhin einen älteren Fallback-Pfad über settings.rows, obwohl das zentrale Admin-Formular übersetzten Zeilentext schreibt
  • hero bewahrt weiterhin ältere Feld-Fallbacks, wenn die kanonischen übersetzten Einleitungsfelder leer sind
  • feature-grid und feature-item sind jetzt veröffentlicht, weil sie quellgestützt sind, bleiben aber bewusst transitionale Delegate-Verträge über den gemeinsamen Präsentationspfaden von Columns bzw. Column Item
  • tabs, slider, menu und faq-list existieren 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 fehlschlagen
  • showcase-list und contact-info existieren 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.

  • code folgt jetzt dem bestehenden Textübersetzungspfad für Titel, Label und Snippet-Inhalt, während die Syntaxsprache gemeinsam bleibt
  • table folgt jetzt dem bestehenden Textübersetzungspfad für Titel und Zeilentext, während der Tabellenstil gemeinsam bleibt
  • breadcrumb bewahrt jetzt die offengelegten gemeinsamen Einstellungen beim Speichern
  • stat-card nutzt jetzt die vorhandene optionale URL im öffentlichen Renderer mit einem einfachen sicheren Link
  • link-list rendert jetzt die vorhandene übersetzte Einleitung oberhalb der Liste der untergeordneten Einträge
  • sticky-navbar richtet jetzt die persistierte Navbar-Root-Eigentümerschaft an Block::ownsPublicRoot() aus, sodass die öffentliche Shell keinen zusätzlichen generischen Wrapper hinzufügt
  • image folgt jetzt dem bestehenden Bildübersetzungspfad für Bildunterschrift und Alt-Text, während ausgewählte Medien und die optionale Link-URL gemeinsam bleiben
  • gallery verwendet jetzt locale-eigene block_gallery_item_translations fü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 ausgeschlossen
  • download folgt jetzt dem bestehenden Textübersetzungspfad für sichtbares Label und Hilfetext, während ausgewählte Medien und Button-Variante gemeinsam bleiben
  • file, video und audio haben 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 rendern
  • image, gallery, download, file, video und audio akzeptieren 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 bleiben
  • code, table, quote, toc und html akzeptieren 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 bleiben
  • navbar-brand und sidebar-brand teilen 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 erzwingen
  • sidebar-nav-group verwendet jetzt für verschachtelte Kindlinks dieselbe manuelle Sidebar-Item-Ausgabesemantik wie sidebar-nav-item und bewahrt dabei den bestehenden WebBlocks-UI-Nav-Group-Wrapper-Vertrag
  • section, container, grid, cluster, card und content_header verwenden jetzt dieselbe ausgelieferte Vertragsquelle über Registry, schreibgeschütztes Admin-Vertragsmodal, Audit-Ausgabe, Doku und fokussierte Regressionsabdeckung hinweg
  • hero, columns, column_item, cta, feature-grid und feature-item sind 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
  • card verwendet jetzt einen komponierbaren Shell-Vertrag: die übergeordnete Card besitzt den wb-card-Root, Card-Regionen besitzen wb-card-header, wb-card-body und wb-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 erhalten
  • content_header behä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-Eigentum
  • testimonial und stats bleiben ehrlich als reines Alias-Verhalten dokumentiert, das an bestehende Quote- oder Columns-Renderpfade delegiert, statt als eigenständige veröffentlichte Kernverträge
  • tabs, slider, menu und faq-list bleiben Kompatibilitäts-Slugs aus der Entwurfs- oder Alias-Ära statt veröffentlichter Kernverträge, während showcase-list und contact-info rein öffentliche Kompatibilitäts-Renderer ohne ausgelieferten Kernvertragseintrag bleiben