Publish CMS content on public routes with responsive media, accessibility checks, and deterministic visual baselines. Co-authored-by: Cursor <cursoragent@cursor.com>
6.1 KiB
6.1 KiB
1. Fundação de leitura e layout público
- 1.1 Criar
app/Application/Queries/Marketing/GetPublishedServiceseGetPublishedPortfolioCases(scopepublished(), ordenação porsort_order, eager loading explícito) com feature tests cobrindo exclusão de rascunho e ordem - 1.2 Criar
FindPublishedPortfolioCaseBySlugretornandonullpara rascunho, com teste - 1.3 Criar
app/Application/Data/PageMetacom fallback parasite_settingse unit test sem banco (title/description/canonical/OG) - 1.4 Estender
layouts/public.blade.phpcom head de SEO (components/seo/meta.blade.php), landmarks completos, navegação e footer alimentados porsite_settings; feature test do head - 1.5 Rodar
composer pint,composer phpstanecomposer test:feature
2. Mídia responsiva
- 2.1 Adicionar extensão
gdaoDockerfilee às matrizes de PHP do CI; adicionarintervention/imageaocomposer.json - 2.2 Criar
app/Support/ResponsiveImagegerando variantes 480/960/1440 com nome derivado do original, e removendo variantes quando o original é substituído/excluído; unit test comStorage::fake - 2.3 Plugar a geração no
saveUploadedFileUsingdePublicImageUploadRulese cobrir com feature test em um Resource do CMS - 2.4 Criar componente
<x-media.image>comsrcset,sizes,width/height,alteloadingconfigurável; feature test verificando lazy fora da dobra e eager no hero - 2.5 Criar comando
php artisan media:generate-variantspara backfill, com teste - 2.6 Adicionar
php artisan storage:linkidempotente aodocker/entrypoint.she validar no jobcontainer - 2.7 Rodar
composer quality
3. Home editorial (WEB-01)
- 3.1 Criar
GetHomeContent+ DTOHomeContent(hero desite_settings, serviços/casos em destaque, depoimentos publicados) com feature test - 3.2 Criar
HomeControllere substituirRoute::view('/')pela rota nomeadahome - 3.3 Implementar as seções do SPEC §6.2 como componentes Blade reutilizáveis (hero, prova visual, serviços, método, casos, depoimentos, CTA final)
- 3.4 Feature tests: conteúdo publicado exibido em ordem, rascunho ausente, seções omitidas quando não há conteúdo, CTA aponta para a rota
contact - 3.5 Rodar
composer quality
4. Serviços, portfólio e páginas institucionais (WEB-02, WEB-03, WEB-07)
- 4.1 Rota + controller + view de
/servicoslistando serviços publicados; feature test - 4.2 Rota + controller + view de
/portfoliocom paginação; feature test incluindo paginação e exclusão de rascunho - 4.3 Rota + view de
/portfolio/{slug}com desafio, solução, resultado e galeria ordenada; feature tests de 200 publicado, 404 rascunho e ordem da galeria - 4.4 Rotas + views de
/sobree/privacidadeusandosite_settings; feature tests - 4.5 Rota + view de
/contatoexibindo e-mail, telefone e redes desite_settings, sem criação de lead; feature test - 4.6 Views
errors/404.blade.phpeerrors/500.blade.phpcom layout público; feature tests de 404 branded e de 500 sem stack trace comAPP_DEBUG=false - 4.7 Teste de contagem de queries no detalhe do caso para garantir ausência de N+1
- 4.8 Rodar
composer quality
5. SEO, sitemap e analytics
- 5.1 Aplicar
PageMetaem todos os controllers públicos (title, description, canonical, OG) com feature tests de override por caso e de fallback para os padrões do site - 5.2 Emitir JSON-LD
Organizationna home eArticle/creative work no detalhe do caso; feature test validando JSON parseável - 5.3 Criar
GetSitemapEntries, rota/sitemap.xmle view XML; feature tests de inclusão de publicado, exclusão de rascunho e entrada após publicação - 5.4 Substituir
public/robots.txtpor rotatext/plainreferenciando o sitemap absoluto; feature test - 5.5 Injetar o snippet de analytics apenas com
analytics_enabledverdadeiro; feature tests dos dois estados - 5.6 Rodar
composer quality
6. Acessibilidade
- 6.1 Feature tests estruturais de HTML: um único
h1, landmarksheader/nav/main/footer,altpresente nas imagens de conteúdo - 6.2 Garantir skip link funcional e foco visível em todos os elementos interativos das páginas novas
- 6.3 Adicionar verificação axe na suíte browser para home, serviços, portfólio e detalhe do caso, falhando em issues
critical/serious - 6.4 Teste browser de navegação por teclado até o CTA principal e ativação por teclado
- 6.5 Teste browser garantindo ausência de erros no console nas rotas cobertas
- 6.6 Verificar
prefers-reduced-motion: reducedesabilitando transições; teste browser com emulação - 6.7 Rodar
composer test:browser
7. Regressão visual
- 7.1 Adicionar fontes self-hosted via Vite e remover qualquer dependência de fonte de sistema ou CDN
- 7.2 Implementar
APP_FROZEN_NOW(provider que chamaCarbonImmutable::setTestNow()fora de produção) e documentar em.env.example; unit test do provider - 7.3 Criar
VisualContentSeederdeterminístico (textos, datas e imagens fixture fixas), separado doContentSeeder - 7.4 Criar testes de snapshot para Home, Serviços, Portfólio e Detalhe do portfólio em 1440×1000 e 390×844; gravar baselines versionadas
- 7.5 Confirmar que duas execuções consecutivas no mesmo commit não produzem diff
- 7.6 Verificar que
composer visual:updategrava baselines e que a suíte padrão roda em modo assertivo
8. Gate de CI e fechamento da fase
- 8.1 Job
browserdo CI: executarphp artisan db:seed --class=VisualContentSeeder --forceantes da suíte - 8.2 Job
browserdo CI: publicar screenshots, diffs de snapshot, logs da aplicação e logs do browser comif: failure() - 8.3 Confirmar os cinco jobs verdes (
static,unit,feature,browser,container) em pull request - 8.4 Rodar
composer qualitycompleto e registrar o resultado no PR - 8.5 Revisar o critério de saída da Fase 1 (conteúdo gerenciável no Filament e site público aprovado visualmente) e atualizar
SPEC.md§18 marcando apenas itens comprovados