Templates
Sistema de templates HTML com versionamento, fork, tradução, componentes e preview em tempo real.
Visão Geral
O sistema de Templates controla toda a estrutura visual dos sites da plataforma. Cada template define o HTML do header, body e footer, além de CSS e JavaScript customizados.
Existem dois níveis de gestão:
Estrutura do Template
Cada template é composto por 5 partes editáveis:
| Parte | Descrição |
|---|---|
| Header HTML | Cabeçalho do site — navbar, logo, menus de navegação, busca, carrinho. Aparece em todas as páginas. |
| Body HTML | Estrutura do conteúdo principal. Deve conter o placeholder [[CONTENT]] que será substituído pelo conteúdo real de cada página. |
| Footer HTML | Rodapé do site — links, newsletter, redes sociais, copyright. Aparece em todas as páginas. |
| CSS | Estilos customizados do template. Aceita variáveis Blade (ex: {{ $primaryColor }}), compiladas com os dados reais do tenant. |
| JavaScript | Scripts customizados para interatividade (menus, animações, etc.). |
Placeholder de Conteúdo
O [[CONTENT]] no Body é obrigatório. Quando o site é renderizado, esse placeholder é substituído pelo HTML real da página (vindo do Page Builder ou do editor WYSIWYG).
<main class="container py-4">
[[CONTENT]]
</main>
{{-- Após renderização, vira: --}}
<main class="container py-4">
<div class="hero-block">...</div>
<div class="features-block">...</div>
</main>
[[ e ]] propositalmente — para evitar conflitos com a sintaxe Blade {{ }} e com componentes <x-front.*>.
Variáveis Blade
O HTML e CSS do template são compilados pelo Blade com dados reais do tenant. Mais de 60 variáveis estão disponíveis, organizadas por grupo:
Identidade
@{{ $siteName }} | Nome do site |
{{ $siteTagline }} | Slogan / tagline |
{{ $siteLogo }} | URL do logo principal |
{{ $siteLogoDark }} | URL do logo para fundo escuro |
{{ $siteLogoSmall }} | URL do logo reduzido / ícone |
{{ $siteFavicon }} | URL do favicon |
Contato
{{ $siteEmail }} | E-mail principal |
{{ $sitePhone }} | Telefone principal |
{{ $sitePhoneSecondary }} | Telefone secundário |
{{ $siteWhatsapp }} | Número do WhatsApp |
{{ $siteWhatsappLink }} | Link completo wa.me |
Localização
{{ $siteFullAddress }} | Endereço completo (montado automaticamente) |
{{ $siteAddress }} | Logradouro |
{{ $siteAddressNumber }} | Número |
{{ $siteCity }} | Cidade |
{{ $siteState }} | Estado |
{{ $siteZipCode }} | CEP |
{{ $siteBusinessHours }} | Horário de funcionamento |
{{ $siteGoogleMapsEmbed }} | URL embed do Google Maps |
{{ $siteGoogleMapsLink }} | Link direto do Google Maps |
Redes Sociais
{{ $siteFacebook }} | |
{{ $siteInstagram }} | |
{{ $siteYoutube }} | YouTube |
{{ $siteLinkedin }} | |
{{ $siteTwitter }} | Twitter/X |
{{ $siteTiktok }} | TikTok |
{{ $sitePinterest }} | |
{{ $siteTelegram }} | Telegram |
Cores & Layout
{{ $primaryColor }} | Cor primária (#hex) |
{{ $secondaryColor }} | Cor secundária |
{{ $accentColor }} | Cor de destaque |
{{ $textColor }} | Cor do texto |
{{ $headingColor }} | Cor dos títulos |
{{ $backgroundColor }} | Cor de fundo do site |
{{ $headerBackground }} | Cor de fundo do header |
{{ $footerBackground }} | Cor de fundo do footer |
{{ $fontFamily }} | Fonte principal |
{{ $headingFontFamily }} | Fonte dos títulos |
{{ $fontSize }} | Tamanho base da fonte |
Rodapé
{{ $footerAbout }} | Texto "sobre" do footer |
{{ $footerCopyright }} | Texto de copyright |
{{ $footerCredits }} | Texto de créditos |
{{ $footerCreditsUrl }} | URL dos créditos |
{{ $footerShowSocial }} | Exibir redes sociais no footer (boolean) |
{{ $footerShowContact }} | Exibir contato no footer (boolean) |
SEO & Legal
{{ $seoTitle }} | Título SEO padrão |
{{ $seoDescription }} | Meta description padrão |
{{ $seoKeywords }} | Meta keywords |
{{ $lgpdEnabled }} | LGPD ativa (boolean) |
{{ $lgpdMessage }} | Mensagem do cookie banner |
{{ $privacyPolicyUrl }} | URL da política de privacidade |
Empresa
{{ $companyName }} | Razão social |
{{ $companyTradeName }} | Nome fantasia |
{{ $companyCnpj }} | CNPJ |
{{ $companyStateReg }} | Inscrição estadual |
Componentes do Site
Componentes são blocos funcionais Blade inseridos no HTML do template. Cada um renderiza automaticamente dados reais do tenant (menus, formulários, links, etc.).
Catálogo Completo
| Grupo | Componente | Tag Blade | Requer |
|---|---|---|---|
| Menus de Módulos Dropdowns com categorias |
Blog | <x-front.category-menu type="blog" /> | Módulo Blog |
| Produtos | <x-front.category-menu type="products" /> | Módulo Produtos | |
| Imóveis | <x-front.category-menu type="imoveis" /> | Módulo Imóveis | |
| Veículos | <x-front.category-menu type="vehicles" /> | Módulo Veículos | |
| Portfólio | <x-front.category-menu type="portfolio" /> | Módulo Portfólio | |
| FAQ | <x-front.category-menu type="faq" /> | Módulo FAQ | |
| Downloads | <x-front.category-menu type="downloads" /> | Módulo Downloads | |
| Links de Módulos Links diretos |
Equipe | <li><a href="/equipe">Equipe</a></li> | Módulo Equipe |
| Depoimentos | <li><a href="/depoimentos">...</a></li> | Módulo Depoimentos | |
| Páginas Links para páginas |
Sobre Nós | <li><a href="/sobre">Sobre</a></li> | Página /sobre |
| Contato | <li><a href="/contato">Contato</a></li> | Página /contato | |
| Utilitários Funcionalidades |
Busca | <x-front.search-box /> | — |
| Carrinho/Orçamento | <x-front.mini-cart /> | Módulo Orçamento | |
| Seletor de Idioma | <x-front.language-switcher /> | i18n ativo | |
| Rodapé | Newsletter | <x-front.newsletter-form /> | Módulo Newsletter |
Inserção Automática
Na criação do template, componentes selecionados são inseridos automaticamente na posição correta:
- Menus, Links e Páginas → dentro de
<ul class="navbar-nav"> - Utilitários → na área de ações do header
- Rodapé → antes de
</footer>
Inserção no Editor
No painel lateral do editor, cada componente tem botão "Inserir" com posicionamento inteligente:
- Menus e Links → localiza todos os
<ul class="navbar-nav">(desktop + mobile) - Rodapé → antes de
</footer> - Se clicou no editor nos últimos 10 segundos → insere na posição do cursor
Detecção e Remoção
O editor detecta componentes presentes em tempo real via regex conforme o HTML é editado:
- Badge "Inserido" (verde) com contagem se múltiplas ocorrências (ex: "2x")
- Clicar no badge navega até o componente com highlight verde
- Botão × remove uma ocorrência por vez com highlight vermelho antes da remoção
Editor Master
O editor de templates a nível master (/panel/master/templates/{id}/editor) é a ferramenta principal para criar e manter templates globais.
Layout
O editor é dividido em três áreas:
- Esquerda — Configurações (painel colapsável)
- Nome, Starter Kit associado, Status (Ativo/Inativo), Padrão
- Descrição e imagem de preview
- Botão + para criar kit rapidamente sem sair do editor
- Centro — Editor de Código (CodeMirror, modo HTML)
- 5 abas: Header, Body, Footer, CSS, JS
- Atalho
Ctrl+Spara salvar
- Direita — Painéis de Referência (colapsáveis)
- Variáveis Disponíveis — Lista completa com links para configurações
- Componentes do Site — Inserir, navegar e remover componentes
- Como Funciona — Guia rápido
Barra de Ações
- Badge — Nome do template + kit associado
- Preview — Abre preview em nova janela (com seletor de tenant e página)
- Reset — Restaura o HTML ao starter original (com confirmação)
- Salvar — Salva configurações + versão publicada de uma vez
Editor Tenant
O editor a nível de tenant (/panel/templates/editor) permite que cada site personalize sua cópia do template, com controle de versões completo.
Diferenças em Relação ao Master
| Funcionalidade | Master | Tenant |
|---|---|---|
| Versionamento | Versão única (sempre publicada) | Múltiplas versões (draft + publish) |
| Configurações | Nome, kit, status, padrão | Não editável (herdado do fork) |
| Abas CSS/JS | Sempre visíveis | Ocultas em modo tradução |
| Tradução | Não disponível | Seletor de idioma (se i18n ativo) |
| Rollback | Reset para starter | Publicar versão anterior |
| Componentes | Catálogo completo | Filtrado por módulos ativos do tenant |
Sidebar de Versões
À direita do editor, a sidebar de versões exibe o histórico completo:
- Cada versão mostra: número, data, status (Publicada ou Rascunho), autor e mensagem
- Ações por versão: Visualizar (carrega no editor), Publicar (para rascunhos), Excluir (rascunhos, exceto v1)
- Rollback — Qualquer versão anterior pode ser publicada novamente, revertendo o site ao estado daquela versão
Fluxo de Trabalho
- O tenant abre o editor → vê a versão publicada atual
- Faz alterações no código → escolhe "Salvar rascunho" ou "Salvar e publicar"
- Salvar rascunho cria uma nova versão sem afetar o site
- Publicar ativa a versão imediatamente no site
- Se precisar desfazer, basta publicar uma versão anterior (rollback)
Versionamento
O sistema de versionamento permite rastrear cada alteração no template do tenant, com capacidade de voltar a qualquer ponto anterior.
Regras
- Cada salvamento cria uma nova versão (nunca sobrescreve)
- Apenas uma versão por vez pode estar publicada
- Publicar uma versão automaticamente despublica a anterior
- A v1 é criada automaticamente no fork e não pode ser excluída
- Rascunhos podem ser excluídos (exceto v1 e a versão publicada)
- Número da versão é auto-incrementado
Página de Histórico
A tela /panel/templates/versions mostra o histórico completo de todas as versões, com:
- Número da versão e data de criação
- Status (publicada/rascunho)
- Autor da versão
- Mensagem (changelog opcional)
- Ações: visualizar, publicar, excluir, rollback
Fork de Templates
O fork é o mecanismo que permite a cada tenant ter sua cópia independente de um template global.
Quando o Fork Acontece
O fork é criado automaticamente em dois momentos:
- Quando o tenant seleciona um template global (via "Ativar" na tela de seleção)
- Quando o tenant abre o editor enquanto usa um template global
O Que Acontece no Fork
- Cria-se um novo registro
Templatecomtenant_idpreenchido eparent_template_idapontando para o original - A versão publicada do template global é copiada para a v1 do fork
- O
SiteTemplatedo tenant é atualizado para apontar para o fork - A partir daí, o tenant edita sua cópia sem afetar o template global
Restaurar Base
O tenant pode voltar ao template global original a qualquer momento via "Restaurar Base". Isso:
- Muda o
SiteTemplatede volta para o template global - O fork não é excluído — fica disponível caso o tenant queira voltar
- Ao selecionar o mesmo template global novamente, o fork existente é reutilizado
Tradução de Templates
Quando o sistema de i18n está ativo, templates podem ter traduções independentes para cada idioma.
O Que é Traduzido
Apenas o conteúdo HTML é traduzível:
- Header HTML — textos do cabeçalho, menus, botões
- Body HTML — textos do corpo do template
- Footer HTML — textos do rodapé
CSS e JavaScript não são traduzíveis (são compartilhados entre idiomas).
Como Funciona
- No editor, um seletor de idioma aparece ao lado das abas
- Ao selecionar um idioma diferente do padrão, o editor entra em modo tradução
- O HTML traduzido é carregado (ou o original se ainda não traduzido)
- Ao salvar, a tradução é armazenada separadamente na tabela
content_translations
Seleção de Template
O tenant pode trocar de template a qualquer momento via a tela de seleção (/panel/templates/select).
Templates Disponíveis
A tela exibe um grid de templates em cards com:
- Imagem de preview (ou ícone padrão)
- Nome e descrição
- Badge "Padrão" se for o template default
- Badge com o nome do Starter Kit (se associado)
- Botão "Ativar" (ou "Atual" se já selecionado)
Filtragem por Kit
Se o tenant pertence a um Starter Kit, a seleção mostra apenas:
- Templates vinculados ao kit do tenant
- Templates universais (sem kit associado)
Se o tenant não tiver kit, todos os templates ativos são exibidos.
Ao Ativar
- Se já existe fork para esse template → reutiliza o fork existente
- Se não existe fork → cria automaticamente (copia versão publicada para v1)
- Atualiza
SiteTemplatedo tenant - Redireciona para o editor
Preview
O sistema de preview permite visualizar o template renderizado com dados reais antes de publicar.
Preview do Tenant
Acessível via botão "Preview" no editor. Renderiza o template com:
- Dados reais do tenant (cores, logo, contato, etc.)
- Conteúdo real de uma página (a "home" por padrão, ou a primeira publicada)
- Componentes Blade funcionais
- Barra de preview no topo com botão para voltar ao editor
Preview do Master
No editor master, o preview tem controles adicionais:
- Seletor de tenant — Escolher qual site usar como fonte de dados
- Seletor de página — Escolher qual página renderizar no
[[CONTENT]] - Padrão: usa o Site Modelo (tenant
is_model = true)
Mock de Componentes
No preview master, componentes Blade são substituídos por mocks visuais estáticos:
- category-menu → Dropdowns com categorias fictícias (ex: Blog → "Notícias", "Dicas")
- search-box → Campo de busca desabilitado
- mini-cart → Ícone de carrinho com badge "0"
- newsletter-form → Formulário de e-mail desabilitado
- language-switcher → Botão "PT" com bandeira
Starters (Modelos Base)
Starters são modelos base de HTML/CSS/JS usados como ponto de partida ao criar um novo template global. Cada starter oferece um layout diferente.
Starters Disponíveis
| Starter | Características |
|---|---|
| Institucional | Navbar fixa, hero com imagem, seções em grid. Ideal para empresas e serviços. |
| E-commerce | Topbar de contato, busca centralizada, mini-cart integrado. |
| Magazine | Logo centralizado, data e redes sociais no topo. Para portais de notícias. |
| Landing Page | Header transparente com efeito scroll, focado em conversão. |
| Minimalista | Layout limpo com muito espaço branco. Elegante e leve. |
| Com Topbar | Barra profissional superior + menu principal. Para sites corporativos. |
| Dark Elegante | Tema escuro com acentos dourados. Para marcas premium. |
| Glassmorphism | Efeito vidro fosco moderno com transparências. |
| Gradient Hero | Header com gradientes vibrantes. Chamativo e moderno. |
| Sidebar Fixa | Sidebar lateral fixa à esquerda, conteúdo à direita. |
Gestão Master
O administrador da plataforma gerencia os templates globais em /panel/master/templates.
Listagem
DataTable com colunas:
- Preview (miniatura), Nome, Kit associado, Status, Padrão
- Contagem de forks (quantos tenants usam)
- Data de criação
- Ações: Editar, Duplicar, Excluir
Criar Template
- Escolher um Starter (modelo base)
- Preencher nome, selecionar Kit e componentes
- Os componentes selecionados são inseridos automaticamente no HTML do starter
- Redireciona para o editor
Duplicar Template
Cria uma cópia completa do template com novo slug (sufixo -copia-XXXX). Útil para criar variações a partir de um template existente.
Excluir Template
Só é possível excluir se:
- Nenhum tenant está usando o template (sem forks ativos)
- O template não é o padrão da plataforma
Página do Tenant
A tela principal de templates do tenant (/panel/templates) oferece uma visão geral rápida:
Template Atual
- Card com preview, nome e descrição do template ativo
- Botões: Editar (abre editor), Preview, Histórico de Versões
Versões Recentes
Lista das últimas 5 versões com status, data e autor. Link para histórico completo.
Ações Rápidas
- Trocar Template — Vai para a tela de seleção
- Restaurar Base — Volta ao template global original (se usando fork)
Cache e Performance
O sistema de templates está integrado com o FPC (Full Page Cache) da plataforma.
Invalidação Automática
Ao publicar uma nova versão de template, o cache FPC de todas as páginas do tenant é invalidado automaticamente. Isso garante que as alterações apareçam imediatamente.
Renderização
O template é compilado uma vez pelo Blade e o HTML resultante é cacheado pelo FPC. Na próxima requisição, o HTML é servido diretamente do cache sem recompilação.