{{# Case de sucesso — pagina de detalhe. Layout editorial, 100% estatico: nenhuma animacao, nenhum JS, nada que dependa de scroll. Só hover em links e botoes. Toda secao esta dentro do seu proprio condicional. Uma entrada que ainda nao foi migrada nao renderiza nada disso — e cai no bloco .cs-legacy do final, que imprime o corpo (content) original intacto. Por isso trocar o template da colecao de "page" para "cases/show" e seguro: nenhuma pagina fica em branco. O corpo legado sai apenas quando design_v2 esta desligado; ver o comentario extenso no fim do arquivo. A linguagem visual espelha resources/views/services/detail.antlers.html + public/assets/css/service.css: wash diagonal no hero, faixa de numeros que quebra o branco, ordinais gerados por counter() em CSS, filetes de 1px em vez de molduras, e banda de gradiente escuro no CTA final. Ritmo vertical: cada secao e uma faixa full-bleed com sua propria superficie (wash / mint / paper / paper-2), em vez de uma coluna branca unica. As faixas alternam mesmo quando galeria e depoimento estao vazios (ver a ordem abaixo). #}}
{{# ------------------------------------------------------------- hero #}} {{# O guard NAO inclui `title` de proposito: title existe sempre, e a secao renderizaria um hero vazio por cima do conteudo legado das entradas nao migradas. O H1 continua caindo para `title` quando client_name falta. #}} {{ if client_name || hero_lead || hero_image }}
Voltar para cases {{ case_eyebrow ?? 'Case de sucesso' | entities }}

{{ client_name ?? title | entities }}

{{ if card_tags }}
    {{ card_tags }}
  • {{ value | entities }}
  • {{ /card_tags }}
{{ /if }} {{ if hero_lead }}

{{ hero_lead | entities | nl2br }}

{{ /if }}
{{# Unica imagem carregada com eager: esta acima da dobra. #}} {{ if hero_image }}
{{ hero_image_alt ?? '' | entities }}
{{ /if }}
{{ /if }} {{# -------------------------------------------------------- faixa KPI #}} {{# O primeiro "wow" da pagina: numeros grandes sobre a faixa mint, com filetes verticais de 1px entre eles (mesmo papel de .svc-stats em service.css). A quantidade de KPIs varia por entrada — 3 (Útil Gás), 4 (Auto Baterias) e 6 (Age Fibra). O numero de colunas e resolvido no CSS por breakpoint, e o caso de 4 itens ganha uma linha de quatro em vez de 3+1; ver .cs-kpis__grid. #}} {{ if kpis }}
{{ kpis }}
{{ value | entities }} {{ if label }}{{ label | entities }}{{ /if }}
{{ /kpis }}
{{ /if }} {{# ---------------------------------------------------------- estrategia #}} {{ if strategy_heading || strategy_lead || strategy_items }}
Estratégia {{ if strategy_heading }}

{{ strategy_heading | entities }}

{{ /if }} {{ if strategy_lead }}

{{ strategy_lead | entities | nl2br }}

{{ /if }}
{{ if strategy_items }}
    {{ strategy_items }} {{ if label }}
  • {{ label | entities }}
  • {{ /if }} {{ /strategy_items }}
{{ /if }}
{{ /if }} {{# ----------------------------------------------------------- resultados #}} {{# Duas coisas sao feitas em CSS de proposito, nao no Antlers: 1. O ordinal (01, 02, 03...). .cs-results__list abre um counter e cada .cs-result o incrementa; o numero sai de content: counter(..., decimal-leading-zero) no ::before do rail. Mesma tecnica de .svc-journey__badge em service.css. O numero nao existe no markup, logo continua correto se alguma linha for filtrada — e a entrada com 7 blocos numera ate 07 sem nenhuma mudanca aqui. 2. A alternancia dos lados (.cs-result:nth-child(even) troca o "order" das colunas). Sem modulo no template. A classe cs-result--media so entra quando a linha tem imagem: sem ela o bloco ocupa a largura toda em vez de deixar uma coluna vazia. Nenhuma das entradas atuais tem imagem em resultados, e por isso que isso importa. value e value_label sao independentes: uma entrada (Auto Baterias) tem value_label sem value, e outra (Age Fibra) tem um bloco sem numero nenhum. O guard cobre os dois. #}} {{ if results }}
Resultados
{{ results }}
{{ if kicker }}{{ kicker | entities }}{{ /if }} {{ if heading }}

{{ heading | entities }}

{{ /if }} {{ if body }}

{{ body | entities | nl2br }}

{{ /if }} {{ if value || value_label }}

{{ if value }}{{ value | entities }}{{ /if }} {{ if value_label }}{{ value_label | entities }}{{ /if }}

{{ /if }}
{{ if image }}
{{ image_alt ?? '' | entities }}
{{ /if }}
{{ /results }}
{{ /if }} {{# -------------------------------------------------------------- galeria #}} {{# Grade deliberadamente irregular: a primeira foto ocupa duas colunas e duas linhas, as seguintes preenchem uma celula. Nenhuma entrada tem galeria hoje — o {{ if gallery }} garante que a secao inteira (faixa, titulo e grade) simplesmente nao existe no HTML nesse caso. #}} {{ if gallery }} {{ /if }} {{# ------------------------------------------------------------ depoimento #}} {{ if quote_text }}
{{ quote_text | entities | nl2br }}
{{ if quote_author || quote_role }}
{{ if quote_author }}{{ quote_author | entities }}{{ /if }} {{ if quote_role }}{{ quote_role | entities }}{{ /if }}
{{ /if }}
{{ /if }} {{# ------------------------------------------------------------- CTA final #}} {{ if cta_heading || cta_label }}
Próximo passo

{{ cta_heading ?? 'Vamos escrever o próximo case juntos?' | entities }}

Conte o seu desafio para a gente. Montamos a estratégia e mostramos o caminho até o resultado.

{{ cta_label ?? 'Fale com um especialista' | entities }}
{{ /if }} {{# ------------------------------------------------- navegacao entre cases #}} {{# Outros cases da colecao. O filtro `:id:isnt="id"` e binding dinamico do Antlers: o `id` do lado direito e resolvido no contexto DA PAGINA (fora do loop) antes da query rodar, portanto exclui a entrada atual. Dentro do loop `id` ja seria o da entrada iterada, e a comparacao nao teria como ser feita. O toggle `listed` NAO pode ser filtrado na query: as entradas migradas nao gravam o campo (o default true vem do blueprint) e a query roda sobre o dado cru, entao tanto `listed:is="true"` quanto `listed:isnt="false"` devolvem zero resultados. Verificado na pagina renderizada. O filtro correto e o modifier `where` sobre a colecao ja augmentada — ai `listed` vale true por default e so quem desligar explicitamente sai da lista. `as="siblings"` + a atribuicao `others` existem para que o {{ if others }} envolva a faixa inteira: com um case so na colecao (ou com todos os outros deslistados) nem a faixa nem o titulo "Outros cases" sao impressos. #}} {{ collection:cases as="siblings" sort="card_order" :id:isnt="id" }} {{ others = siblings | where('listed', true) | limit(3) }} {{ if others }}
{{ /if }} {{ /collection:cases }} {{# ------------------------------------------------------ conteudo legado CRITICO. Este bloco imprime o HTML original da entrada (markup exportado do site antigo, Elementor). Ele e a garantia de que nenhuma entrada fica em branco enquanto a migracao para os campos novos nao acontece. Esta condicionado a design_v2 porque a migracao COPIA a prosa do corpo legado para os campos novos: se o corpo saisse sempre, uma entrada ja migrada mostraria o mesmo texto duas vezes — uma estilizada e uma como markup cru do Elementor. - entrada SEM design_v2 -> renderiza o corpo legado inteiro, exatamente como o template "page" fazia. Nenhuma regressao. - entrada COM design_v2 -> renderiza so as secoes novas. O corpo legado continua no arquivo da entrada, apenas nao e emitido. Usa "if !design_v2" em vez de "unless" so para manter o balanceamento de condicionais trivial de auditar. O CSS de .cs-legacy e neutro de proposito: nenhuma regra de .cs vaza para dentro dele (todas as regras novas usam classes .cs-*, que o markup legado nao possui) e ele nao herda tipografia nova. #}} {{ if !design_v2 }} {{ if content }}
{{ content }}
{{ /if }} {{ /if }}