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\BlockRequestlas cargas útiles de los bloques - propiedad del almacenamiento: qué valores residen en
blocks, en filas de traducción dedicadas, enblock_mediao 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_iddirecto,block_mediaordenado, 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 medidamostly clear: el contrato actual se entiende, pero tiene una salvedad destacabletransitional: el contrato actual mantiene de forma intencionada una ruta de compatibilidad o un patrón de propiedad mixtoneeds 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 claridadlegacy/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_idoblock_mediacuando 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\BlockRequestes 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\BlockPayloadWriterpersiste el payload normalizado del bloqueApp\Support\Blocks\BlockTranslationWritertraslada los campos propiedad del idioma (locale) a filas de traducción para las familias registradasApp\Support\Blocks\BlockTranslationResolverresuelve 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:
gallerytodavía conserva una ruta heredada de elementos de reserva basada en la configuración cuando las filas canónicas ordenadas deblock_mediano están presentestable— su renderizador todavía admite una ruta de reserva heredada basada ensettings.rowsaunque el formulario de administración principal escribe el texto traducido de las filasherotodavía conserva reservas de campos heredadas cuando los campos de introducción traducidos canónicos están vacíosfeature-gridyfeature-itemya 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 Itemtabs,slider,menuyfaq-listsiguen 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íashowcase-listycontact-infosolo 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.
codeahora 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 sintaxistableahora 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 tablabreadcrumbahora conserva al guardar la configuración compartida expuestastat-cardahora utiliza la URL opcional existente en el renderizador público mediante un enlace seguro y sencillolink-listahora renderiza el texto de introducción traducido existente encima de la lista de elementos hijossticky-navbarahora alinea la propiedad persistida de la raíz del Navbar conBlock::ownsPublicRoot()para que el shell público no añada un contenedor genérico adicionalimageahora 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 opcionalgalleryahora utiliza la tabla propiedad del idioma (locale)block_gallery_item_translationspara 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úblicadownloadahora 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ónfile,videoyaudioahora 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úblicamenteimage,gallery,download,file,videoyaudioya 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óncode,table,quote,tocyhtmlya 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ónnavbar-brandysidebar-brandahora 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 visiblesidebar-nav-groupahora reutiliza la misma semántica de salida de elementos manuales de la barra lateral quesidebar-nav-itempara los enlaces hijos anidados, conservando el contrato existente del contenedor nav-group de WebBlocks UIsection,container,grid,cluster,cardycontent_headerahora 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íficahero,columns,column_item,cta,feature-gridyfeature-itemya 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
cardahora utiliza un contrato de shell componible: la Card padre es propietaria de la raízwb-card, las regiones de Card son propietarias dewb-card-header,wb-card-bodyywb-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 regionescontent_headermantiene 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éricotestimonialystatssiguen 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 independientestabs,slider,menuyfaq-listsiguen siendo slugs en borrador o de compatibilidad de la época de los alias, y no contratos publicados del núcleo, mientras queshowcase-listycontact-infosiguen siendo renderizadores de compatibilidad exclusivamente públicos, sin entrada de contrato en el catálogo del núcleo distribuido