# Patrones de Producción Este documento recoge patrones reales usados en módulos y secciones generales de proyectos Acai en producción. Cada patrón incluye el HTML/Twig listo para reutilizar y notas sobre cuándo aplicarlo. Cubre: cabecera de sección con colores configurables, layout zigzag (imagen + texto alternado), acordeón FAQ, formulario de contacto completo con `c-form`, compartir en redes sociales, sección general de detalle de producto, galería con carousel modo `gallery`. Léelo cuando vayas a crear un módulo y quieras evitar reinventar patrones que ya tienen una versión canónica testeada en producción. ## 1. Cabecera de sección (Pretítulo + Título + Subtítulo) Bloque de cabecera con colores y alineación configurables. Casi todos los módulos lo usan como inicio. ```html
{% if titulo %}
{% endif %}
``` ## 2. Layout Zigzag (imagen + texto alternado) Usa `loop.index is odd/even` para alternar la dirección. ```html
  • {{ record.titulobloque | raw }}

    {{ record.textobloque | raw }}
    {{ record.enlacebloque_anchor }}
  • ``` ## 3. Acordeón FAQ ```html
  • {{ loop.index }}.
  • ``` `script.js`: ```js document.addEventListener("DOMContentLoaded", () => { document.querySelectorAll(".faq-page").forEach((faq) => { faq.addEventListener("click", () => { const body = faq.nextElementSibling; const isActive = faq.classList.toggle("active"); body.classList.toggle("hidden", !isActive); if (typeof AOS !== "undefined") AOS.refresh(); }); }); }); ``` ## 4. Formulario de contacto completo ```html {% set imagen = '' %} {% set gracias = 'apartados' | get('num = 20').0 %}
    ``` ## 5. Compartir en redes sociales ```html ``` ## 6. Sección general — Detalle de producto Patrón completo para `template/estandar/modulos/custom-productos/index-base.tpl`: ```html

    {{ thisrecord.name }}

    {{ thisrecord.categoria_bd.0.name }}
    {{ thisrecord.precio }} €
    {{ thisrecord.precio_descuento }} €
    {{ thisrecord.precio }} €
    {{ thisrecord.descripcion | raw }}
    {% set productosRelacionados = 'productos' | get('categoria = ' ~ thisrecord.categoria ~ ' and num!=' ~ thisrecord.num, 'globalOrder ASC', '3') %}

    {{ 'Productos relacionados' | translate }}

    ``` ## 7. Galería con carousel — modo Gallery ```html
    ``` ## 8. Listado con filtros y paginación ```html {% set perPage = 12 %} {% set page = pagina | default(1) %} {% set offset = (page - 1) * perPage %}
    {% set where = 'visible=1' %} {% if cat_filter %} {% set where = where ~ ' AND categoria_num=' ~ cat_filter %} {% endif %} {% set productos = 'productos' | get(where, 'orden ASC', perPage) %}
    ``` ## Reglas de aplicación - Estos patrones son **referencia** — adáptalos al estilo del proyecto (ver `docs/project-styles.md` si existe). - Reutiliza **clases utilitarias de Acai** (`bg-main-color`, `transition3s`, `lazyload`, `glightbox`, `c-tns-wrapper`) antes de inventar. - Para campos editables siempre añade `data-field-label` (ver `01-builder-fields.md`). - Para `c-form`, prefiere usarlo antes de construir POST/hook custom. - Para detalle de registro usa **siempre** la convención `custom-{tableName}/`.