Files
amare/openspec/changes/archive/2026-08-01-recreate-public-frontend/design.md
Manoel Freitas cf1589c916 feat: recreate public frontend with Heritage Editorial identity (#5)
* feat: recreate public frontend with Heritage Editorial identity

Replace placeholder visual system with EB Garamond/olive tokens, brand assets, editorial home narrative, São Paulo settings, real testimonials, and regenerated visual baselines.

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs: archive recreate-public-frontend and sync Heritage Editorial specs

Merge delta requirements into main OpenSpec capabilities and move the completed change into the dated archive.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-01 23:39:00 -03:00

9.9 KiB
Raw Blame History

Context

O site público da Fase 1 já entrega rotas, CMS, SEO, mídia responsiva, regressão visual e acessibilidade. A identidade visual, porém, ainda é o placeholder da fundação: Instrument Sans, acento ouro, raios arredondados e cartões com sombra. DESIGN.md (“Heritage Editorial”), o mockup amare-home-editorial.html, o logo fornecido (coração facetado) e depoimentos.md (cinco casais reais) definem a marca a materializar.

Restrições que condicionam o desenho:

  • Arquitetura multipágina Laravel/Blade/CMS já aprovada; o mockup HTML é single-page com âncoras — adaptar, não portar literalmente.
  • Contato permanece placeholder (WEB-05 fora de escopo); CTAs levam a /contato sem criar leads.
  • Fontes self-hosted via Vite (determinismo visual); sem Google Fonts CDN.
  • Imagens públicas via disco configurado + variantes; Unsplash do mockup não entra no app.
  • PRODUCT.md: São Paulo capital; seeders atuais ainda usam Fortaleza e depoimentos fictícios.
  • Change paralela complete-foundation-parity não bloqueia nem é bloqueada por esta.

Goals / Non-Goals

Goals:

  • Materializar Heritage Editorial em todas as rotas públicas (home, serviços, portfólio, caso, sobre, contato, privacidade, 404, 500).
  • Home como capa do “Dossiê Editorial do Evento”: hero, manifesto, serviços, portfólio, método (4 passos), depoimentos reais, perfil Amare, CTA final.
  • Tokens centralizados alinhados a DESIGN.md; EB Garamond única família; radius 0; elevação por campos tonais.
  • Logo oficial otimizado (selo + lockup) em fundos claros/escuros, geometria preservada.
  • Cinco depoimentos de depoimentos.md no CMS/seed, multipárrafo, com nota de autorização.
  • Manter publicação dinâmica, paginação, eager loading, SEO, axe, teclado, contraste AA e baselines determinísticas.

Non-Goals:

  • Briefing funcional / lead (WEB-05), WhatsApp automatizado, inventar provas corporativas.
  • Redesign do Filament, page builder, single-page navigation como modelo primário.
  • Fotografia proprietária real (permanece ilustrativa e marcada até acervo autorizado).
  • Staging/deploy/auth parity (complete-foundation-parity).

Decisions

D1 — Multipágina editorial, não single-page literal

Preservar rotas do SPEC §5.1. Home concentra a narrativa do mockup; páginas internas herdam a mesma gramática (eyebrow, títulos, linhas 1px, spreads assimétricos no desktop, sequência linear no mobile). Header usa links de rota (não #âncoras como navegação primária), com CTA “Solicitar proposta” → contact.

Alternativas: home quase idêntica com âncoras (rejeitada: conflita com SEO/CMS/rotas já testadas); portar HTML estático (rejeitada: perde CMS e determinismo).

D2 — Tokens Heritage Editorial como única fonte visual

Reescrever resources/css/tokens.css e o mapeamento @theme em app.css:

Papel Token Valor
Fundo --amare-color-bg #FBF9F4 (Papel Marfim)
Fundo profundo --amare-color-bg-deep #F0EEE9
Arquivo --amare-color-bg-archive #E4E2DD
Oliva --amare-color-accent #556B2F
Oliva profunda --amare-color-accent-deep #3E5219
Sálvia --amare-color-sage #8B9D77
Tinta --amare-color-text #1B1C19
Tinta suave --amare-color-muted #5D6155
Linha --amare-color-border #C5C8B8
Radius --amare-radius-* 0
Container --amare-container-max 1120px
Sombra removida / não usada em conteúdo

Tipografia: EB Garamond (400/500/600) self-hosted via Vite; escala display/headline/title/body/label conforme DESIGN.md. Componentes públicos deixam de usar rounded-* e shadows de cartão.

Alternativa: CSS inline do mockup (rejeitada: foge de design-tokens e quebra Tailwind/@theme).

D3 — Composição da home e omissão de seções vazias

Ordem canônica:

  1. Hero (settings + imagem OG/hero se houver)
  2. Manifesto (copy de settings)
  3. Serviços em destaque (lista editorial, não grid de cartões)
  4. Portfólio em destaque (bloco escuro oliva; funde proof+cases atuais)
  5. Método (4 passos: Escuta, Direção, Produção, Execução)
  6. Depoimentos publicados
  7. Perfil / posicionamento Amare (about + princípios)
  8. CTA final → /contato

Seções alimentadas por collections (serviços, casos, depoimentos) omitidas quando vazias. Manifesto, método, perfil e CTA final permanecem (copy de settings / defaults editoriais). Um único h1 no hero; demais seções usam h2/h3.

D4 — Contato continua presentation-only

/contato e o CTA da home mostram canais de site_settings (e-mail, telefone, cidade, sociais). Nenhum <form> funcional, nenhum lead. O mockup de formulário serve só como referência visual futura para WEB-05; nesta change o bloco de contato da home é CTA editorial + link para a página de contato, não formulário embutido.

D5 — Extensão mínima tipada de site_settings

Novos campos tipados (não key/value genérico):

  • logo_path / logo_alt (opcional; fallback para lockup estático em public/)
  • hero_secondary_cta_label (opcional)
  • hero_note (texto curto sob CTAs)
  • manifesto_title, manifesto_lead, manifesto_body
  • method_intro (opcional; passos estruturados em JSON tipado ou colunas method_step_{1..4}_{title,body} — preferir JSONB method_steps validado no Filament)
  • principles (JSONB lista de até 4 strings) ou quatro colunas principle_1..4
  • Manter about_summary, hero atual, contato, SEO, analytics

Filament ManageSiteSettings ganha seções editoriais em pt-BR. Defaults no seeder alinhados ao mockup + São Paulo.

Alternativa: hardcode de manifesto/método nas Blade (rejeitada parcialmente: método/princípios podem ter default no view, mas copy institucional deve ser editável como o hero).

D6 — Logo: ativo estático + campo CMS opcional

  1. Converter/otimizar o PNG fornecido para WebP/SVG derivados em public/brand/ (selo coração + lockup completo), com versões para fundo claro (oliva) e fundo escuro (papel/branco).
  2. Componente <x-brand.logo> escolhe variante por contexto (on-dark / on-light) e expõe alt acessível.
  3. Se logo_path em settings estiver preenchido, usa o upload; senão, o estático versionado.

Não redesenhar o coração facetado; não inventar polígonos decorativos genéricos.

D7 — Depoimentos reais multipárrafo

  • Seedar os 5 casais de depoimentos.md em quote (texto completo com quebras \n\n), author_name, context (ex.: Casamento · 06/12/2025), sort_order, is_featured, published_at conforme ambiente.
  • Blade renderiza parágrafos a partir de quebras de linha; tipografia editorial (aspas, offset).
  • Nota discreta no markup/admin: autorização final dos casais antes de publicação em produção.
  • Remover depoimentos fictícios dos seeders de demo/visual ou substituí-los pelos reais (visual seeder usa subset determinístico, tipicamente 2 featured).

D8 — Navegação responsiva com JS mínimo

resources/js/app.js ganha toggle de menu mobile (aria-expanded, menu-open, fechar ao navegar), espelhando o mockup. Sem framework novo. prefers-reduced-motion continua a anular transições não essenciais. Hover de imagem (scale leve) só quando motion permitido.

D9 — Páginas internas como capítulos

Rota Tratamento
/servicos Lista editorial (número + nome + resumo), não cartões
/portfolio Grade assimétrica / stack com captions; fundo pode usar papel profundo
/portfolio/{slug} Caderno de caso: metadados, desafio/solução/resultado, galeria
/sobre Perfil editorial + princípios
/contato Canais + CTA textual (sem form)
/privacidade Tipografia editorial sobre papel
404/500 Mesma linguagem; 500 sem internals

D10 — Testes e baselines

  • Atualizar feature tests de home (ordem de seções, omissão, CTA → contact, data-testid="home-primary-cta").
  • Browser: axe nas rotas cobertas; Tab até CTA; console limpo.
  • composer visual:update após aprovação visual local; timezone permanece America/Fortaleza (SPEC); copy de cidade pública passa a São Paulo.
  • Fotos fixture locais continuam; filtro CSS de saturação contida via classe utilitária, não via URL externa.

Risks / Trade-offs

  • Regeneração de 8+ snapshots → risco de ruído no PR; mitigar com seeder visual estável e revisão humana do diff.
  • EB Garamond em forms/UI → legibilidade de labels uppercase; mitigar com letter-spacing e peso 600 conforme DESIGN.md; validar contraste AA.
  • Depoimentos longos → layout quebra em mobile; mitigar com tipografia responsiva e subset featured na home.
  • Autorização de depoimentos → risco legal/reputacional; mitigar com nota explícita e published_at null até autorização.
  • Campos novos em site_settings → migração + Filament; mitigar com defaults e nullable.
  • Paridade com mockup single-page → expectativa visual vs rotas; documentar adaptação multipágina na proposta e no surface brief.

Migration Plan

  1. Migrar tokens/fontes/logo estático (sem breaking de rotas).
  2. Migrar site_settings (colunas novas nullable + backfill de defaults).
  3. Atualizar seeders (SP + depoimentos reais).
  4. Trocar layout e páginas; manter contratos de testes passando incrementalmente.
  5. Regenerar baselines com composer visual:update.
  6. Rollback: reverter deploy/commit; migração down remove colunas novas; assets estáticos são aditivos.

Open Questions

  • Formato exato de method_steps / principles (JSONB vs colunas) — default recomendado: JSONB validado no Filament.
  • WhatsApp/e-mail/Instagram oficiais ainda ausentes — settings continuam placeholder até o dono informar.
  • Subconjunto de depoimentos na home (2 vs 5) — default: featured first, até 2 na home estilo mockup; listagem completa só se houver página dedicada (não há); home mostra todos published featured ou os N primeiros por sort_order (cap 23 para ritmo editorial).