Contratos de tipos de bloque

Propósito y alcance

Este documento empezó como el inventario de la Fase 1 de los tipos de bloque core publicados que se distribuyen actualmente en WebBlocks CMS, ahora documenta también la vista de contrato de solo lectura del administrador de la Fase 2 y registra las correcciones de estandarización de carencias de la Fase 3 completadas hasta ahora, incluida la limpieza de Layout + Card para section, container, grid, cluster, card y content_header, la limpieza de Marketing / Contenido estructurado para hero, columns, column_item, cta, feature-grid y feature-item, y la limpieza de Legacy / Transitional que mantiene los slugs de compatibilidad antiguos documentados con honestidad sin promoverlos al catálogo core publicado.

La Fase 1 es únicamente documentación de solo lectura.

  • No rediseña los formularios de bloque.
  • No añade un constructor de formularios basado en base de datos.
  • No migra el contenido de los bloques.
  • No cambia el renderizado público.
  • No cambia el funcionamiento actual de la edición en Admin -> System -> Block Types.

La pantalla de administración Block Types actual sigue siendo una pantalla de catálogo y metadatos. En la Fase 2 ya puede abrir un modal Contract de solo lectura para cada fila listada, pero sigue sin ser un constructor de formularios dinámico ni un editor de esquemas.

La Fase 3 de plugins añade hooks de bloque de plugin solo declarativos mediante PluginBlockTypeDefinition, PluginBlockPackDefinition y PluginBlockRegistry. Los plugins habilitados pueden exponer handles propios del plugin, como analytics-tools::score-card, para su descubrimiento, pero estas declaraciones no sustituyen a los contratos de bloque core distribuidos, las vistas de bloque core, los seeders core ni los servicios de edición de bloques. Los handles sin cualificar de estilo core, como hero, siguen perteneciendo al core y se rechazan en las declaraciones de plugins.

Definición

Un contrato de tipo de bloque es el acuerdo técnico actual sobre cómo se comporta un tipo de bloque a través de las capas del CMS:

  • identidad de catálogo: slug, etiqueta, categoría, estado y metadatos de sistema o de contenedor
  • origen del formulario de administración: qué parcial Blade edita actualmente el bloque y qué campos expone
  • validación y gestión de peticiones: cómo normaliza y valida actualmente App\Http\Requests\Admin\BlockRequest las cargas útiles de los bloques
  • propiedad del almacenamiento: qué valores residen en blocks, en filas de traducción dedicadas, en block_media o en registros relacionados
  • propiedad de la traducción: qué campos dirigidos al usuario pertenecen al idioma
  • propiedad compartida: qué ajustes o relaciones permanecen compartidos entre idiomas
  • propiedad de medios o relaciones: media_id directo, block_media ordenado, búsquedas de navegación o relaciones dentro de la misma página
  • soporte de hijos: si el bloque es un contenedor y si los tipos hijos están restringidos
  • origen del renderizador público: qué parcial Blade público renderiza hoy el bloque
  • contrato de raíz del renderizador: si el bloque posee su propio marcado raíz público o depende de la ruta genérica del envoltorio
  • portabilidad y revisiones: si la forma de almacenamiento actual debería seguir viajando a través de revisiones, clonación, exportación/importación y promoción
  • pruebas y carencias: cobertura focalizada conocida, comportamiento poco claro o deuda de compatibilidad

Términos del contrato actual

Términos de estado utilizados a continuación:

  • clear: el formulario de administración, la gestión de peticiones, el almacenamiento y el renderizador coinciden en gran medida
  • mostly clear: el contrato actual se entiende, pero tiene una salvedad destacable
  • transitional: el contrato actual mantiene de forma intencionada una ruta de compatibilidad o un patrón de propiedad mixto
  • needs review: las rutas de código actuales no concuerdan o el comportamiento está lo bastante poco documentado como para que la Fase 2 deba exponerlo con mayor claridad
  • legacy/fallback: el comportamiento publicado depende de una ruta alternativa o de compatibilidad

Reglas de propiedad del almacenamiento

El trabajo actual y futuro sobre los contratos debería mantener explícitas estas reglas de propiedad:

  • el texto dirigido al usuario pertenece a las filas de traducción cuando el bloque pertenece a un idioma
  • los datos operativos o de configuración compartidos pertenecen a los ajustes compartidos del bloque o a relaciones explícitas
  • los medios deberían usar las rutas de propiedad media_id o block_media cuando corresponda
  • evite mover contenido dirigido al usuario a un JSON de ajustes arbitrario
  • mantenga documentadas las rutas de almacenamiento de compatibilidad mientras sigan afectando a la salida pública o a las importaciones

Fuentes distribuidas

Este inventario de la Fase 1 se basa en el código fuente distribuido, no en suposiciones.

  • origen del catálogo: app/Support/Blocks/CoreBlockTypeCatalogSyncer.php
  • normalización de la petición de edición de bloques: app/Http/Requests/Admin/BlockRequest.php
  • ayudantes de persistencia: app/Support/Blocks/BlockPayloadWriter.php, app/Support/Blocks/BlockTranslationWriter.php, app/Support/Blocks/BlockTranslationResolver.php
  • registro de traducciones: app/Support/Blocks/BlockTranslationRegistry.php
  • formularios de administración: resources/views/admin/blocks/types/*.blade.php
  • renderizadores públicos: resources/views/pages/partials/blocks/*.blade.php
  • referencias de cobertura: pruebas de catálogo de bloques, renderizado, traducción y específicas de slug en tests/Feature/

Tipos de bloque core publicados documentados actualmente aquí: 42.

Comando de auditoría

La Fase 1 añade un comando de auditoría seguro para desarrolladores:

php artisan block-types:contracts-audit
php artisan block-types:contracts-audit --json

El comando es de solo lectura.

  • no modifica la base de datos
  • no depende del contenido del sitio instalado
  • lee las definiciones del catálogo core distribuido
  • verifica la presencia de los archivos del formulario de administración y del renderizador público distribuidos
  • informa de los metadatos de la familia de traducción y del soporte básico de contenedores

El comando es una ayuda de actualidad para detectar desviaciones del catálogo y de la presencia de archivos. No sustituye a las notas de contrato más completas de este documento.

Vista de administración de la Fase 2

La Fase 2 expone los detalles del contrato en modo solo lectura en Admin -> System -> Block Types.

  • cada fila puede abrir un modal Block Type Contract
  • el modal es solo informativo y no envía actualizaciones
  • muestra los detalles de catálogo, formulario de administración, almacenamiento, traducción, medios o relaciones, hijos, renderizador y carencias a partir del código distribuido
  • no convierte la administración de Block Types en un editor de esquemas ni en un constructor de formularios
  • los tipos de bloque personalizados o en borrador también pueden abrir el modal, pero pueden mostrar No shipped contract is documented for this block type yet. cuando no hay ningún contrato core definido

Matriz de contratos de bloques publicados

Contenido

Slug Label Categoría Origen del formulario de administración Campos traducibles Campos compartidos/de ajustes Campos de medios/relación Comportamiento como hijo/contenedor Origen del renderizador público Contrato de la raíz del renderizador Estado actual Pruebas / cobertura Carencias conocidas / notas
header Header content resources/views/admin/blocks/types/header.blade.php title mediante filas de traducción de texto variant nivel de encabezado; settings.alignment; anclaje compartido en settings.anchor con reserva heredada en url El TOC de la misma página lee los bloques Header con anclaje No es un contenedor resources/views/pages/partials/blocks/header.blade.php Posee su propio elemento de encabezado raíz clear SyncCoreBlockTypesCommandTest, PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest Bloque de encabezado canónico; el contrato del anclaje compartido es claro, pero todavía conserva el comportamiento de reserva heredado con url.
plain_text Plain Text content resources/views/admin/blocks/types/plain_text.blade.php content mediante filas de traducción de texto settings.alignment Ninguno No es un contenedor resources/views/pages/partials/blocks/plain_text.blade.php Posee su propio raíz clear PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest Primitiva sencilla de texto corrido traducido.
rich-text Rich Text content resources/views/admin/blocks/types/rich-text.blade.php content mediante filas de traducción de texto Ninguno Ninguno No es un contenedor resources/views/pages/partials/blocks/rich-text.blade.php Posee su raíz .wb-rich-text cuando hay contenido clear RichTextBlockTest, PublicRichContentTest, BlockTranslationIntegrityTest El almacenamiento seguro de HTML y la propiedad de la traducción están claros.
code Code content resources/views/admin/blocks/types/code.blade.php title, subtitle, content mediante filas de traducción de texto settings.language Ninguno No es un contenedor; se conservan las filas hijas históricas, pero no se admite la colocación de nuevos hijos resources/views/pages/partials/blocks/code.blade.php Posee su raíz clear PublicRichContentTest, BlockTypePhaseThreeContractsTest, PageBuilderExperienceTest La Fase 3 alinea el título traducido del código, la etiqueta y el cuerpo del fragmento con la arquitectura de traducción de texto existente, y ahora ignora en la salida pública los árboles de hijos históricos arbitrarios.
button_link Button Link content resources/views/admin/blocks/types/button_link.blade.php la etiqueta title mediante filas de traducción de texto settings.url; settings.target; variant compartido Ninguno No es un contenedor resources/views/pages/partials/blocks/button_link.blade.php Posee su raíz clear PublicEditorialBlocksRenderingTest La URL y el destino compartidos con la etiqueta traducida son coherentes.
card Card layout resources/views/admin/blocks/types/card.blade.php Ninguno settings.layout_name Los bloques de región hijos definen la estructura; no hay contrato directo de medios ni de traducción Contenedor; los únicos hijos directos permitidos son card_header, card_body y card_footer resources/views/pages/partials/blocks/card.blade.php Posee su raíz clear PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest, BlockTranslationIntegrityTest, MediaVisualBlockContractsTest Card es ahora una carcasa componible. Posee la raíz de la tarjeta, limpia al guardar los campos heredados de contenido o medios y mantiene solo una reserva mínima de renderizado heredado para las filas guardadas antiguas que no tienen hijos de región Card.
card_header Card Header layout resources/views/admin/blocks/types/card_header.blade.php Ninguno settings.layout_name Solo la relación con el card padre Contenedor; solo puede colocarse bajo card; no se admiten hijos de región de tarjeta resources/views/pages/partials/blocks/card_header.blade.php Posee su raíz clear PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest Bloque de región Card componible para el contenido de la cabecera.
card_body Card Body layout resources/views/admin/blocks/types/card_body.blade.php Ninguno settings.layout_name Solo la relación con el card padre Contenedor; solo puede colocarse bajo card; no se admiten hijos de región de tarjeta resources/views/pages/partials/blocks/card_body.blade.php Posee su raíz clear PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest Bloque de región Card componible para el contenido principal.
card_footer Card Footer layout resources/views/admin/blocks/types/card_footer.blade.php Ninguno settings.layout_name Solo la relación con el card padre Contenedor; solo puede colocarse bajo card; no se admiten hijos de región de tarjeta resources/views/pages/partials/blocks/card_footer.blade.php Posee su raíz clear PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest Bloque de región Card componible para el pie o el contenido de acción.
stat-card Stat Card content resources/views/admin/blocks/types/stat-card.blade.php title, subtitle, content mediante filas de traducción de texto El url canónico sigue siendo compartido en la fila del bloque Ninguno No es un contenedor resources/views/pages/partials/blocks/stat-card.blade.php Posee su raíz de stat-card clear StatCardTest, BlockTranslationIntegrityTest La Fase 3 mantiene el campo de URL opcional existente y ahora renderiza un enlace público sencillo cuando está presente.
image Image content resources/views/admin/blocks/types/image.blade.php caption, alt text mediante filas de traducción de imagen media_id compartido; url canónico compartido Relación directa con medios de imagen mediante media_id No es un contenedor; se conservan las filas hijas históricas, pero no se admite la colocación de nuevos hijos resources/views/pages/partials/blocks/image.blade.php Posee su raíz semántica cuando existe el archivo de medios clear MediaVisualBlockContractsTest, PublicMediaBlocksTest, BlockTranslationIntegrityTest La Fase 3 alinea Image con la arquitectura de traducción de imágenes existente, de modo que el pie de foto y el texto alternativo pertenecen a cada idioma mientras que el archivo seleccionado y la URL de enlace opcional siguen siendo compartidos.
gallery Gallery content resources/views/admin/blocks/types/gallery.blade.php más resources/views/admin/blocks/types/partials/gallery-items-editor.blade.php Por cada elemento de la galería: alt_text, caption, overlay_title y overlay_text mediante block_gallery_item_translations Ajustes de presentación de la galería compartidos, más las relaciones ordenadas block_media de los elementos de la galería Filas block_media ordenadas con el rol gallery_item; el texto de los elementos de la galería propio de cada idioma vive en block_gallery_item_translations; pueden seguir existiendo valores heredados de title/subtitle guardados en el bloque, pero el renderizado público los ignora No es un contenedor; se conservan las filas hijas históricas, pero no se admite la colocación de nuevos hijos resources/views/pages/partials/blocks/gallery.blade.php Posee la raíz de su envoltorio de galería y registra un único modal de visor bajo #wb-overlay-root cuando el lightbox está activado clear MediaVisualBlockContractsTest, PublicMediaBlocksTest, PageBuilderExperienceTest, SiteCloneServiceTest, SiteExportImportTest, SitePromotionTest, ReconstructionIntegrityTest, SharedSlotRevisionTest Gallery es ahora un bloque de colección de medios. El formulario de administración normal utiliza un editor compacto de filas en lugar de la antigua cuadrícula de recursos seleccionados. Su selector anidado Add Gallery Items se mantiene sobre el contrato compartido de administración #wb-overlay-root, de modo que WebBlocks UI gestiona el ciclo de vida de los modales apilados, y las listas de resultados compactas y largas conservan una altura de fila natural mientras el cuerpo del modal sigue siendo el contenedor de desplazamiento. Las variantes públicas son distintas: grid mantiene celdas iguales, masonry usa columnas CSS con altura de imagen natural y collage conserva la composición con el elemento destacado en primer lugar. Los valores heredados masonary guardados siguen aceptándose y se normalizan a la ruta canónica masonry. Gallery ya no genera el encabezado ni el párrafo de introducción; los editores deben colocar content_header más plain_text o rich-text antes de Gallery cuando se necesite texto de sección. Los elementos heredados de reserva basados en ajustes siguen siendo legibles para el contenido antiguo.
download Download content resources/views/admin/blocks/types/download.blade.php title, subtitle mediante filas de traducción de texto media_id compartido; variant compartido Relación directa con el archivo de descarga mediante media_id No es un contenedor; se conservan las filas hijas históricas, pero no se admite la colocación de nuevos hijos resources/views/pages/partials/blocks/download.blade.php Posee la raíz de su envoltorio de CTA cuando existe el archivo de medios clear MediaVisualBlockContractsTest, PublicMediaBlocksTest La Fase 3 mantiene compartidos el archivo de descarga seleccionado y la variante del botón, y traslada la etiqueta visible y el texto de ayuda a la vía de traducción de texto existente.
file File content resources/views/admin/blocks/types/file.blade.php title, content mediante filas de traducción de texto media_id compartido; url canónico compartido Relación directa con medios mediante media_id, con reserva a una URL externa No es un contenedor; se conservan las filas hijas históricas, pero no se admite la colocación de nuevos hijos resources/views/pages/partials/blocks/file.blade.php Posee su raíz de tarjeta de archivo clear MediaVisualBlockContractsTest, PublicMediaBlocksTest La Fase 3 productiza el renderizador de File ya publicado con un formulario de administración propio y deja explícita la propiedad compartida del origen del archivo entre la biblioteca de medios y la reserva de URL externa.
video Video content resources/views/admin/blocks/types/video.blade.php title, content mediante filas de traducción de texto media_id compartido; url canónico compartido Relación directa con medios mediante media_id, con reserva segura a una URL externa No es un contenedor; se conservan las filas hijas históricas, pero no se admite la colocación de nuevos hijos resources/views/pages/partials/blocks/video.blade.php Posee su raíz de tarjeta de vídeo clear MediaVisualBlockContractsTest, PublicMediaBlocksTest La Fase 3 añade el formulario de administración y la ruta de guardado que faltaban, de modo que el vídeo subido, las URL seguras de proveedores externos, el texto visible traducido y el comportamiento público de reserva describen ahora el mismo contrato.
audio Audio content resources/views/admin/blocks/types/audio.blade.php title, content mediante filas de traducción de texto media_id compartido; url canónico compartido Relación directa con medios mediante media_id, con reserva a una URL externa No es un contenedor; se conservan las filas hijas históricas, pero no se admite la colocación de nuevos hijos resources/views/pages/partials/blocks/audio.blade.php Posee su raíz de tarjeta de audio clear MediaVisualBlockContractsTest, PublicMediaBlocksTest La Fase 3 añade el formulario de administración y la ruta de guardado que faltaban, de modo que el audio subido, el texto visible traducido y un renderizado seguro sin controles vacíos coinciden ahora con el contrato documentado.
table Table content resources/views/admin/blocks/types/table.blade.php title, content mediante filas de traducción de texto variant compartido; el renderizador también comprueba la reserva settings.rows Ninguno No es un contenedor; se conservan las filas hijas históricas, pero no se admite la colocación de nuevos hijos resources/views/pages/partials/blocks/table.blade.php Posee la raíz de su envoltorio de tabla mostly clear PublicRichContentTest, BlockTypePhaseThreeContractsTest, PageBuilderExperienceTest La Fase 3 alinea la propiedad del título traducido y del texto de las filas con la arquitectura de traducción de texto existente y ahora ignora en la salida pública los árboles de hijos históricos arbitrarios; la vía heredada de reserva settings.rows sigue documentada.
quote Quote content resources/views/admin/blocks/types/quote.blade.php Ninguno en el registro actual title, subtitle, content y variant canónicos Ninguno No es un contenedor; se conservan las filas hijas históricas, pero no se admite la colocación de nuevos hijos resources/views/pages/partials/blocks/quote.blade.php Posee su raíz de cita clear PublicRichContentTest, PageBuilderExperienceTest La Fase 3 deja de tratar Quote como un envoltorio de layout o contenedor en la salida pública, conservando a la vez las filas hijas guardadas en los árboles de bloques de administración.
hero Hero content resources/views/admin/blocks/types/hero.blade.php title, subtitle, content mediante filas de traducción de texto variant compartido; settings.layout; settings.title_tag Bloques button hijos para las CTA gestionadas Contenedor; solo hijos button resources/views/pages/partials/blocks/hero.blade.php Posee su raíz promocional transitional PublicHeroBlockRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest Hero es ahora un contrato básico publicado y respaldado por código fuente. El texto de introducción pertenece a cada idioma, las etiquetas de las CTA se traducen en los botones hijos y las URL de las CTA siguen siendo compartidas. Las reservas heredadas de contenido siguen siendo legibles cuando los campos traducidos canónicos están vacíos.
columns Columns content resources/views/admin/blocks/types/columns.blade.php title, subtitle, content mediante filas de traducción de texto variant compartido Bloques column_item hijos Contenedor; solo hijos column_item resources/views/pages/partials/blocks/columns.blade.php Posee su raíz de contenido estructurado clear PublicColumnsRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest Columns es ahora un bloque de contenido estructurado publicado y de primera clase. El texto de introducción pertenece a cada idioma, mientras que la variante, el orden de los hijos y las URL de los hijos siguen siendo compartidos.
column_item Column Item content resources/views/admin/blocks/types/column_item.blade.php title, subtitle, content mediante filas de traducción de texto url canónico compartido Relación con el columns padre No es un contenedor resources/views/pages/partials/blocks/column_item.blade.php La raíz del elemento la determina el padre y varía según la variante de Columns clear PublicColumnsRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest Column Item es ahora un contrato hijo de apoyo publicado para Columns. Las ediciones por idioma actualizan el texto del elemento sin sobrescribir las URL compartidas.
cta CTA content resources/views/admin/blocks/types/cta.blade.php title, subtitle, content mediante filas de traducción de texto variant compartido Bloques button hijos para las CTA gestionadas Contenedor; solo hijos button resources/views/pages/partials/blocks/cta.blade.php Posee su raíz promocional clear PublicHeroBlockRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest CTA es ahora un contrato promocional publicado, con texto y etiquetas de CTA propios de cada idioma, URL de CTA compartidas y un renderizador público que posee su raíz.
feature-grid Feature Grid content resources/views/admin/blocks/types/feature-grid.blade.php title, subtitle, content mediante filas de traducción de texto Ninguno más allá de la estructura de hijos compartida Bloques feature-item hijos, con soporte compatible con el heredado column_item Contenedor; los hijos permitidos son feature-item y column_item resources/views/pages/partials/blocks/feature-grid.blade.php Delega en la presentación de tarjetas de Columns y sigue usando el envoltorio público genérico transitional PublicHeroBlockRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest Feature Grid es ahora un alias de compatibilidad publicado, porque tiene vías reales de administración y renderizado ya publicadas, pero sigue delegando de forma intencionada en el contrato de tarjetas de Columns.
feature-item Feature Item content resources/views/admin/blocks/types/feature-item.blade.php title, content mediante filas de traducción de texto url canónico compartido Relación con el feature-grid padre No es un contenedor resources/views/pages/partials/blocks/feature-item.blade.php Delega en la presentación de tarjetas de Column Item transitional PublicHeroBlockRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest Feature Item es ahora un contrato hijo de apoyo publicado para Feature Grid, que sigue compartiendo la carcasa de tarjeta existente de Column Item.

Layout

Slug Etiqueta Categoría Origen del formulario de administración Campos traducibles Campos compartidos/de configuración Campos de medios/relación Comportamiento de hijos/contenedor Origen del renderizador público Contrato de raíz del renderizador Estado actual Pruebas / cobertura Carencias conocidas / notas
section Section layout resources/views/admin/blocks/types/section.blade.php Ninguno settings.layout_name; settings.spacing Solo bloques hijos Contenedor; sin lista blanca explícita de hijos resources/views/pages/partials/blocks/section.blade.php Posee su raíz clear PublicEditorialBlocksRenderingTest, PublicLayoutStructureTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest La fase 3 mantiene Section únicamente como layout: los ajustes de layout compartidos siguen siendo canónicos, posee la raíz semántica y no traslada el texto visible para el usuario a ajustes arbitrarios.
container Container layout resources/views/admin/blocks/types/container.blade.php Ninguno settings.layout_name; settings.width; settings.flow Solo bloques hijos Contenedor; sin lista blanca explícita de hijos resources/views/pages/partials/blocks/container.blade.php Posee su contenedor raíz clear PublicEditorialBlocksRenderingTest, PublicLayoutStructureTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest El valor predeterminado heredado sigue recurriendo al flujo apilado cuando no se define, mientras que Flow: None explícito sigue siendo la vía de composición neutral respecto al layout.
cluster Cluster layout resources/views/admin/blocks/types/cluster.blade.php Ninguno settings.layout_name; settings.gap; settings.alignment; settings.items_alignment; settings.wrap; settings.width Solo bloques hijos Contenedor; sin lista blanca explícita de hijos resources/views/pages/partials/blocks/cluster.blade.php Posee su de cluster raíz clear PublicEditorialBlocksRenderingTest, PublicLayoutStructureTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest Los ajustes de layout compartidos siguen siendo explícitos y propiedad del renderizador, incluida la vía de composición existente compatible con la navbar (full-width, between, center, nowrap) sin añadir lógica específica de navbar.
grid Grid layout resources/views/admin/blocks/types/grid.blade.php Ninguno settings.layout_name; settings.columns; settings.gap Solo bloques hijos Contenedor; sin lista blanca explícita de hijos resources/views/pages/partials/blocks/grid.blade.php Posee su de grid raíz clear PublicEditorialBlocksRenderingTest, PublicLayoutStructureTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest Los ajustes de grid compartidos siguen siendo canónicos y la salida pública se limita a las asignaciones de clase wb-grid- incluidas y wb-gap- admitidas.

Patrón

Slug Etiqueta Categoría Origen del formulario de administración Campos traducibles Campos compartidos/de configuración Campos de medios/relación Comportamiento de hijos/contenedor Origen del renderizador público Contrato de raíz del renderizador Estado actual Pruebas / cobertura Carencias conocidas / notas
content_header Content Header pattern resources/views/admin/blocks/types/content_header.blade.php title, subtitle, meta mediante filas de traducción de texto settings.alignment meta se almacena como contenido de lista estructurada No es un contenedor resources/views/pages/partials/blocks/content_header.blade.php Posee su raíz clear PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTypePhaseThreeContractsTest, BlockTranslationIntegrityTest Content Header es un bloque de patrón de tipo content-shell. Conserva el título, la introducción y el texto meta gestionados por idioma (locale), renderiza siempre su título como H1, ignora en el momento del renderizado cualquier valor de nivel de encabezado heredado guardado y solo mantiene compartida la alineación.
alert Alert pattern resources/views/admin/blocks/types/alert.blade.php title, content mediante filas de traducción de texto settings.variant Ninguno No es un contenedor resources/views/pages/partials/blocks/alert.blade.php Posee la raíz de su alerta clear PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest La variante compartida y el texto traducido encajan sin problemas.

Navegación

Slug Etiqueta Categoría Origen del formulario de administración Campos traducibles Campos compartidos/de configuración Campos de medios/relación Comportamiento de hijos/contenedor Origen del renderizador público Contrato de raíz del renderizador Estado actual Pruebas / cobertura Carencias conocidas / notas
link-list Link List navigation resources/views/admin/blocks/types/link-list.blade.php title, subtitle, content mediante filas de traducción de texto Ninguno Bloques link-list-item hijos Contenedor; solo hijos link-list-item resources/views/pages/partials/blocks/link-list.blade.php Posee su raíz .wb-link-list cuando existen filas hijas clear LinkListBlockTest, PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest, BlockTypePhaseThreeContractsTest La fase 3 renderiza ahora el texto de introducción traducido existente por encima de la lista de enlaces pública, sin cambiar el comportamiento de los elementos hijos.
link-list-item Link List Item navigation resources/views/admin/blocks/types/link-list-item.blade.php title obligatorio, subtitle opcional y content opcional, mediante filas de traducción de texto url compartido obligatorio Relación con el link-list padre No es un contenedor resources/views/pages/partials/blocks/link-list-item.blade.php Posee la raíz del enlace de la fila y omite el elemento de descripción cuando el contenido está vacío clear LinkListBlockTest, PageBuilderExperienceTest, PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest La URL compartida junto con el texto traducido de la fila es coherente.
toc TOC navigation resources/views/admin/blocks/types/toc.blade.php Ninguno Solo el title canónico Bloques header publicados de la misma página con anclas válidas No es un contenedor; se conservan las filas hijas históricas, pero no se admite colocar nuevos hijos resources/views/pages/partials/blocks/toc.blade.php Posee su envoltorio de TOC generado cuando existen encabezados clear PublicRichContentTest, PageBuilderExperienceTest La fase 3 mantiene TOC centrado únicamente en los encabezados de página detectados y ya no trata los bloques hijos arbitrarios como contenido público del TOC.
breadcrumb Breadcrumb navigation resources/views/admin/blocks/types/breadcrumb.blade.php Ninguno settings.home_label; settings.include_current compartidos Contexto de breadcrumb de la página, el sitio y el idioma (locale) actuales No es un contenedor resources/views/pages/partials/blocks/breadcrumb.blade.php Posee su raíz clear PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest La fase 3 conserva los ajustes de breadcrumb expuestos a través de la vía compartida BlockRequest, de modo que el comportamiento del formulario coincide ahora con la persistencia y el renderizado.
header-actions Header Actions navigation resources/views/admin/blocks/types/header-actions.blade.php Ninguno settings.show_mode_toggle; settings.show_accent_toggle; settings.show_search compartidos Ruta de búsqueda más hooks de interfaz del lado del cliente No es un contenedor resources/views/pages/partials/blocks/header-actions.blade.php Posee únicamente su cluster de acciones interno clear PublicEditorialBlocksRenderingTest Bloque de utilidad del sistema; por diseño no posee traducciones.
sticky-navbar Navbar navigation resources/views/admin/blocks/types/sticky-navbar.blade.php Ninguno settings.layout_name; settings.sticky_mode Bloques hijos anidados de la navbar Contenedor; los hijos permitidos son 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 El renderizador público posee la raíz exterior clear PublicEditorialBlocksRenderingTest, PublicLayoutStructureTest, BlockTypePhaseThreeContractsTest La fase 3 alinea el slug persistido sticky-navbar con Block::ownsPublicRoot(), de modo que Navbar ya no recibe un envoltorio de bloque público genérico adicional.
navbar-brand Navbar Brand navigation resources/views/admin/blocks/types/navbar-brand.blade.php title, subtitle mediante filas de traducción de texto settings.url; settings.target; settings.aria_label compartidos Medio de logotipo compartido mediante media_id; reserva a la URL de inicio del sitio No es un contenedor resources/views/pages/partials/blocks/navbar-brand.blade.php Posee únicamente el enlace de marca interno clear PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTranslationIntegrityTest, BlockTypePhaseThreeContractsTest La fase 3 alinea el comportamiento de guardado de la administración con el contrato del renderizador distribuido: la URL guardada explícita tiene prioridad; en su defecto se utiliza la ruta de inicio del sitio actual cuando está disponible y, por último, / como reserva segura final.
navbar-navigation Navbar Navigation navigation resources/views/admin/blocks/types/navbar-navigation.blade.php Ninguno El title canónico como etiqueta ARIA compartida; settings.menu_key Árbol de menú NavigationItem compartido No es un contenedor resources/views/pages/partials/blocks/navbar-navigation.blade.php Posee únicamente el envoltorio de navegación interno clear PublicEditorialBlocksRenderingTest La vinculación de menú compartida y la etiqueta ARIA son comportamiento actual propiedad del producto.
sidebar-brand Sidebar Brand navigation resources/views/admin/blocks/types/sidebar-brand.blade.php title, subtitle mediante filas de traducción de texto settings.url; settings.target; settings.aria_label compartidos Medio de logotipo compartido mediante media_id; reserva a la URL de inicio del sitio No es un contenedor resources/views/pages/partials/blocks/sidebar-brand.blade.php Posee únicamente el enlace de marca interno clear PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTranslationIntegrityTest, BlockTypePhaseThreeContractsTest La fase 3 otorga a Sidebar Brand el mismo orden de reserva del nombre accesible cuando solo hay logotipo que Navbar Brand, y el mismo contrato conservador de reserva de la URL compartida.
sidebar-navigation Sidebar Navigation navigation resources/views/admin/blocks/types/sidebar-navigation.blade.php title mediante filas de traducción de texto settings.menu_key; settings.layout_name; settings.show_icons; settings.active_matching compartidos El árbol NavigationItem del CMS o bien bloques hijos manuales Contenedor; solo hijos sidebar-nav-item y sidebar-nav-group resources/views/pages/partials/blocks/sidebar-navigation.blade.php Posee su raíz clear PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest Tanto los ajustes compartidos del modo de menú como el modo de hijos manuales son explícitos.
sidebar-nav-item Sidebar Nav Item navigation resources/views/admin/blocks/types/sidebar-nav-item.blade.php title mediante filas de traducción de texto settings.url; settings.target; settings.icon; settings.active_mode; settings.manual_active compartidos Slug compartido del catálogo de iconos; relación con la barra lateral padre No es un contenedor resources/views/pages/partials/blocks/sidebar-nav-item.blade.php Posee la raíz de su enlace de barra lateral clear PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest El comportamiento de enlace compartido y la etiqueta traducida encajan bien.
sidebar-nav-group Sidebar Nav Group navigation resources/views/admin/blocks/types/sidebar-nav-group.blade.php title mediante filas de traducción de texto settings.icon; settings.initially_open; settings.layout_name compartidos Bloques sidebar-nav-item hijos; slug del catálogo de iconos Contenedor; solo hijos sidebar-nav-item resources/views/pages/partials/blocks/sidebar-nav-group.blade.php Posee su raíz .wb-nav-group clear PublicEditorialBlocksRenderingTest, PageBuilderExperienceTest, BlockTranslationIntegrityTest, BlockTypePhaseThreeContractsTest La fase 3 mantiene el contrato del envoltorio nav-group distribuido de WebBlocks UI, mientras que los enlaces hijos manuales anidados reutilizan ahora la misma semántica de elemento de barra lateral para href, target, icono y salida del estado activo.
search-form Search Form navigation resources/views/admin/blocks/types/search-form.blade.php title, subtitle, content mediante filas de traducción de texto variant; settings.show_button compartidos Contexto de la ruta de búsqueda, del sitio y del idioma (locale) No es un contenedor resources/views/pages/partials/blocks/search-form.blade.php Posee su raíz clear SearchFormTest, PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest Los ajustes compartidos de visualización del botón y las etiquetas traducidas son explícitos.
sidebar-footer Sidebar Footer navigation resources/views/admin/blocks/types/sidebar-footer.blade.php title, subtitle, content mediante filas de traducción de texto settings.variant compartido Ninguno No es un contenedor resources/views/pages/partials/blocks/sidebar-footer.blade.php Posee la raíz de su bloque de pie interno clear PublicEditorialBlocksRenderingTest, BlockTranslationIntegrityTest La variante compartida con texto traducido es sencilla.

Formularios

Slug Etiqueta Categoría Origen del formulario de administración Campos traducibles Campos compartidos/de configuración Campos de medios/relación Comportamiento de hijos/contenedor Origen del renderizador público Contrato de raíz del renderizador Estado actual Pruebas / cobertura Carencias conocidas / notas
contact_form Contact Form form resources/views/admin/blocks/types/contact_form.blade.php title, content, submit_label, success_message mediante filas de traducción del formulario de contacto settings.recipient_email; settings.send_email_notification; settings.store_submissions compartidos Los envíos de contact_messages se relacionan de vuelta con el bloque y la página No es un contenedor resources/views/pages/partials/blocks/contact_form.blade.php Posee su raíz section.wb-card y emite un formulario nativo protegido por CSRF que envía a /contact-messages clear ContactFormModuleTest, InternalContentApiTest, ContactMailDiagnoseCommandTest El renderizador emite un campo de comprobación antispam oculto y generado, propiedad del CMS, que no es una entrada normal del visitante y que no debe crearse manualmente. Los envíos con el campo de comprobación relleno devuelven un éxito genérico, sin almacenamiento ni notificación. Los mensajes legítimos se almacenan antes de la notificación, el spam puntuado se conserva para su revisión por la administración, el orden de reserva del destinatario es el bloque, el sitio, CONTACT_RECIPIENT_EMAIL y después MAIL_FROM_ADDRESS, y las páginas de contacto no deben utilizar Trusted HTML, formularios en bruto ni mailto: como sustitutos.

Avanzado

Slug Etiqueta Categoría Origen del formulario de administración Campos traducibles Campos compartidos/de configuración Campos de medios/relación Comportamiento de hijos/contenedor Origen del renderizador público Contrato de raíz del renderizador Estado actual Pruebas / cobertura Carencias conocidas / notas
html HTML (Trusted) advanced resources/views/admin/blocks/types/html.blade.php Ninguno El content HTML de confianza canónico Los registros públicos de overlay y de final de body pueden recibir fragmentos extraídos No es un contenedor; se conservan las filas hijas históricas, pero no se admite colocar nuevos hijos resources/views/pages/partials/blocks/html.blade.php Posee un envoltorio alrededor del marcado de confianza y también puede emitir contenido de overlay o de final de body fuera de banda mostly clear PublicEditorialBlocksRenderingTest, PublicRichContentTest, PageBuilderExperienceTest La fase 3 deja de tratar Trusted HTML como un envoltorio contenedor de hijos público. El marcado de confianza todavía puede afectar a la salida compartida de overlay o de final de body más allá de la raíz visible.

Visión general de la validación y la persistencia

Actualmente, los tipos de bloque publicados no tienen cada uno su propia clase de request dedicada.

  • App\Http\Requests\Admin\BlockRequest es la ruta de solicitud de edición compartida
  • las ramas específicas de cada slug dentro de esa solicitud normalizan los campos hacia el almacenamiento canónico actual
  • App\Support\Blocks\BlockPayloadWriter persiste el payload normalizado del bloque
  • App\Support\Blocks\BlockTranslationWriter traslada los campos propiedad del idioma (locale) a filas de traducción para las familias registradas
  • App\Support\Blocks\BlockTranslationResolver resuelve los valores traducidos o de reserva sobre una instancia de bloque renderizable

Esa ruta de solicitud compartida es una de las razones por las que la Fase 1 documenta primero los contratos, antes de cualquier trabajo de edición basado en esquemas.

Carencias y backlog

Carencias relevantes que siguen pendientes tras las correcciones actuales de la Fase 3:

  • gallery todavía conserva una ruta heredada de elementos de reserva basada en la configuración cuando las filas canónicas ordenadas de block_media no están presentes
  • table — su renderizador todavía admite una ruta de reserva heredada basada en settings.rows aunque el formulario de administración principal escribe el texto traducido de las filas
  • hero todavía conserva reservas de campos heredadas cuando los campos de introducción traducidos canónicos están vacíos
  • feature-grid y feature-item ya están publicados porque están respaldados por el código fuente, pero siguen siendo, de forma intencionada, contratos delegados transitorios sobre las rutas de presentación compartidas de Columns o Column Item
  • tabs, slider, menu y faq-list siguen existiendo como filas heredadas del catálogo en estado borrador, con formularios o renderizadores de compatibilidad, pero no son contratos publicados del núcleo y deben seguir fallando de forma segura en el modal de contrato y en la salida de auditoría
  • showcase-list y contact-info solo existen como rutas de compatibilidad de renderizado público, y no como bloques publicados del catálogo del núcleo; sus enlaces basados en la configuración siguen ahora las mismas reglas de URL pública segura que el resto de renderizadores de bloques
  • los catálogos publicados y en borrador coexisten, por lo que cualquier exposición futura en la administración debe distinguir explícitamente entre contratos publicados del núcleo y filas en borrador o específicas de la instalación

Fase 3 recomendada

Trabajo de estandarización recomendado más adelante para los grupos de bloques:

  • definir grupos de bloques estables propiedad del producto, como layout, contenido, navegación, patrón y avanzado, en una única fuente de verdad
  • alinear las agrupaciones del selector, las de la documentación y las de la administración de Block Types con esa misma fuente
  • decidir qué bloques actualmente en borrador o transitorios deben pasar a estar soportados, archivados o marcados explícitamente como heredados
  • estandarizar qué contratos están respaldados por traducciones y cuáles son intencionadamente solo compartidos antes de iniciar cualquier trabajo de formularios basado en esquemas

Resumen de la Fase 1

La Fase 1 establece el inventario actual de contratos publicados sin cambiar el comportamiento de edición de bloques, su almacenamiento ni el renderizado público.

Ese era el punto de parada previsto para la versión de la Fase 1.

Resumen de la Fase 2

La Fase 2 hace visible el contrato documentado en la administración de Block Types como información de solo lectura, manteniendo sin cambios el comportamiento de edición de bloques, el almacenamiento, los renderizadores y el selector.

Resumen de la Fase 3

La Fase 3 empieza a resolver las carencias documentadas de bajo riesgo en los contratos sin añadir un editor de esquemas, un constructor dinámico de formularios ni un sistema de formularios de bloque basado en base de datos.

  • code ahora sigue la ruta de traducción de texto existente para el título, la etiqueta y el cuerpo del fragmento, manteniendo compartido el lenguaje de sintaxis
  • table ahora sigue la ruta de traducción de texto existente para el título y el texto de las filas, manteniendo compartido el estilo de la tabla
  • breadcrumb ahora conserva al guardar la configuración compartida expuesta
  • stat-card ahora utiliza la URL opcional existente en el renderizador público mediante un enlace seguro y sencillo
  • link-list ahora renderiza el texto de introducción traducido existente encima de la lista de elementos hijos
  • sticky-navbar ahora alinea la propiedad persistida de la raíz del Navbar con Block::ownsPublicRoot() para que el shell público no añada un contenedor genérico adicional
  • image ahora sigue la ruta de traducción de imágenes existente para el pie de foto y el texto alternativo, manteniendo compartidos el medio seleccionado y la URL de enlace opcional
  • gallery ahora utiliza la tabla propiedad del idioma (locale) block_gallery_item_translations para el texto alternativo, el pie de foto, el título de superposición y el texto de superposición de cada elemento, manteniendo compartidos los medios ordenados de la galería y la configuración de presentación, conservando los elementos de reserva heredados para el contenido antiguo y excluyendo el título y la descripción heredados de la galería de la edición normal y de la salida pública
  • download ahora sigue la ruta de traducción de texto existente para la etiqueta visible y el texto de ayuda, manteniendo compartidos el medio seleccionado y la variante del botón
  • file, video y audio ahora tienen formularios de administración de primer nivel y normalización de solicitudes, de modo que el texto visible traducido y los medios compartidos o las fuentes de URL viajan de ida y vuelta por el mismo contrato con el que ya se renderizan públicamente
  • image, gallery, download, file, video y audio ya no aceptan la colocación arbitraria de nuevos hijos ni renderizan públicamente árboles de hijos históricos arbitrarios, aunque las filas hijas existentes se conservan en los árboles de bloques de la administración
  • code, table, quote, toc y html ya no aceptan la colocación normal de nuevos hijos ni renderizan públicamente árboles de hijos históricos arbitrarios, aunque las filas hijas existentes se conservan en los árboles de bloques de la administración
  • navbar-brand y sidebar-brand ahora comparten un contrato conservador de reserva basado en la URL guardada o en la página de inicio del sitio, y ambos conservan un nombre accesible y seguro para la salida con solo logotipo, sin forzar texto visible
  • sidebar-nav-group ahora reutiliza la misma semántica de salida de elementos manuales de la barra lateral que sidebar-nav-item para los enlaces hijos anidados, conservando el contrato existente del contenedor nav-group de WebBlocks UI
  • section, container, grid, cluster, card y content_header ahora usan la misma fuente de contrato distribuida en el registro, el modal de contrato de solo lectura de la administración, la salida de auditoría, la documentación y la cobertura de regresión específica
  • hero, columns, column_item, cta, feature-grid y feature-item ya están publicados en el catálogo del núcleo distribuido, documentados en el registro de contratos compartido y cubiertos como contratos de marketing o de contenido estructurado respaldados por el código fuente, en lugar de permanecer solo como borradores o poco documentados
  • las ediciones exclusivas de un idioma (locale) para los botones CTA gestionados y los elementos hijos estructurados ahora conservan las URL compartidas y siguen actualizando las etiquetas o el texto traducidos
  • las primitivas de layout mantienen la configuración de layout compartida y la estructura de hijos en el almacenamiento canónico de bloques, en lugar de en filas de traducción o campos de texto arbitrarios
  • card ahora utiliza un contrato de shell componible: la Card padre es propietaria de la raíz wb-card, las regiones de Card son propietarias de wb-card-header, wb-card-body y wb-card-footer, los bloques de región solo son válidos dentro de Card y el texto de Card guardado heredado solo se conserva mediante una ruta mínima de renderizado de reserva sin regiones
  • content_header mantiene el título, la introducción y el texto meta traducidos, renderiza siempre su título como H1, ignora de forma segura los valores heredados de nivel de encabezado guardados y mantiene su raíz semántica <header class="wb-content-header"> bajo la propiedad del renderizador, sin contenedor genérico
  • testimonial y stats siguen documentados con honestidad como un comportamiento de solo alias que delega en las rutas de renderizado existentes de Quote o Columns, y no como contratos publicados del núcleo independientes
  • tabs, slider, menu y faq-list siguen siendo slugs en borrador o de compatibilidad de la época de los alias, y no contratos publicados del núcleo, mientras que showcase-list y contact-info siguen siendo renderizadores de compatibilidad exclusivamente públicos, sin entrada de contrato en el catálogo del núcleo distribuido