Publish CMS content on public routes with responsive media, accessibility checks, and deterministic visual baselines. Co-authored-by: Cursor <cursoragent@cursor.com>
73 lines
6.1 KiB
Markdown
73 lines
6.1 KiB
Markdown
## 1. Fundação de leitura e layout público
|
||
|
||
- [x] 1.1 Criar `app/Application/Queries/Marketing/GetPublishedServices` e `GetPublishedPortfolioCases` (scope `published()`, ordenação por `sort_order`, eager loading explícito) com feature tests cobrindo exclusão de rascunho e ordem
|
||
- [x] 1.2 Criar `FindPublishedPortfolioCaseBySlug` retornando `null` para rascunho, com teste
|
||
- [x] 1.3 Criar `app/Application/Data/PageMeta` com fallback para `site_settings` e unit test sem banco (title/description/canonical/OG)
|
||
- [x] 1.4 Estender `layouts/public.blade.php` com head de SEO (`components/seo/meta.blade.php`), landmarks completos, navegação e footer alimentados por `site_settings`; feature test do head
|
||
- [x] 1.5 Rodar `composer pint`, `composer phpstan` e `composer test:feature`
|
||
|
||
## 2. Mídia responsiva
|
||
|
||
- [x] 2.1 Adicionar extensão `gd` ao `Dockerfile` e às matrizes de PHP do CI; adicionar `intervention/image` ao `composer.json`
|
||
- [x] 2.2 Criar `app/Support/ResponsiveImage` gerando variantes 480/960/1440 com nome derivado do original, e removendo variantes quando o original é substituído/excluído; unit test com `Storage::fake`
|
||
- [x] 2.3 Plugar a geração no `saveUploadedFileUsing` de `PublicImageUploadRules` e cobrir com feature test em um Resource do CMS
|
||
- [x] 2.4 Criar componente `<x-media.image>` com `srcset`, `sizes`, `width`/`height`, `alt` e `loading` configurável; feature test verificando lazy fora da dobra e eager no hero
|
||
- [x] 2.5 Criar comando `php artisan media:generate-variants` para backfill, com teste
|
||
- [x] 2.6 Adicionar `php artisan storage:link` idempotente ao `docker/entrypoint.sh` e validar no job `container`
|
||
- [x] 2.7 Rodar `composer quality`
|
||
|
||
## 3. Home editorial (WEB-01)
|
||
|
||
- [x] 3.1 Criar `GetHomeContent` + DTO `HomeContent` (hero de `site_settings`, serviços/casos em destaque, depoimentos publicados) com feature test
|
||
- [x] 3.2 Criar `HomeController` e substituir `Route::view('/')` pela rota nomeada `home`
|
||
- [x] 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)
|
||
- [x] 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`
|
||
- [x] 3.5 Rodar `composer quality`
|
||
|
||
## 4. Serviços, portfólio e páginas institucionais (WEB-02, WEB-03, WEB-07)
|
||
|
||
- [x] 4.1 Rota + controller + view de `/servicos` listando serviços publicados; feature test
|
||
- [x] 4.2 Rota + controller + view de `/portfolio` com paginação; feature test incluindo paginação e exclusão de rascunho
|
||
- [x] 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
|
||
- [x] 4.4 Rotas + views de `/sobre` e `/privacidade` usando `site_settings`; feature tests
|
||
- [x] 4.5 Rota + view de `/contato` exibindo e-mail, telefone e redes de `site_settings`, sem criação de lead; feature test
|
||
- [x] 4.6 Views `errors/404.blade.php` e `errors/500.blade.php` com layout público; feature tests de 404 branded e de 500 sem stack trace com `APP_DEBUG=false`
|
||
- [x] 4.7 Teste de contagem de queries no detalhe do caso para garantir ausência de N+1
|
||
- [x] 4.8 Rodar `composer quality`
|
||
|
||
## 5. SEO, sitemap e analytics
|
||
|
||
- [x] 5.1 Aplicar `PageMeta` em 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
|
||
- [x] 5.2 Emitir JSON-LD `Organization` na home e `Article`/creative work no detalhe do caso; feature test validando JSON parseável
|
||
- [x] 5.3 Criar `GetSitemapEntries`, rota `/sitemap.xml` e view XML; feature tests de inclusão de publicado, exclusão de rascunho e entrada após publicação
|
||
- [x] 5.4 Substituir `public/robots.txt` por rota `text/plain` referenciando o sitemap absoluto; feature test
|
||
- [x] 5.5 Injetar o snippet de analytics apenas com `analytics_enabled` verdadeiro; feature tests dos dois estados
|
||
- [x] 5.6 Rodar `composer quality`
|
||
|
||
## 6. Acessibilidade
|
||
|
||
- [x] 6.1 Feature tests estruturais de HTML: um único `h1`, landmarks `header/nav/main/footer`, `alt` presente nas imagens de conteúdo
|
||
- [x] 6.2 Garantir skip link funcional e foco visível em todos os elementos interativos das páginas novas
|
||
- [x] 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`
|
||
- [x] 6.4 Teste browser de navegação por teclado até o CTA principal e ativação por teclado
|
||
- [x] 6.5 Teste browser garantindo ausência de erros no console nas rotas cobertas
|
||
- [x] 6.6 Verificar `prefers-reduced-motion: reduce` desabilitando transições; teste browser com emulação
|
||
- [x] 6.7 Rodar `composer test:browser`
|
||
|
||
## 7. Regressão visual
|
||
|
||
- [x] 7.1 Adicionar fontes self-hosted via Vite e remover qualquer dependência de fonte de sistema ou CDN
|
||
- [x] 7.2 Implementar `APP_FROZEN_NOW` (provider que chama `CarbonImmutable::setTestNow()` fora de produção) e documentar em `.env.example`; unit test do provider
|
||
- [x] 7.3 Criar `VisualContentSeeder` determinístico (textos, datas e imagens fixture fixas), separado do `ContentSeeder`
|
||
- [x] 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
|
||
- [x] 7.5 Confirmar que duas execuções consecutivas no mesmo commit não produzem diff
|
||
- [x] 7.6 Verificar que `composer visual:update` grava baselines e que a suíte padrão roda em modo assertivo
|
||
|
||
## 8. Gate de CI e fechamento da fase
|
||
|
||
- [x] 8.1 Job `browser` do CI: executar `php artisan db:seed --class=VisualContentSeeder --force` antes da suíte
|
||
- [x] 8.2 Job `browser` do CI: publicar screenshots, diffs de snapshot, logs da aplicação e logs do browser com `if: failure()`
|
||
- [ ] 8.3 Confirmar os cinco jobs verdes (`static`, `unit`, `feature`, `browser`, `container`) em pull request
|
||
- [x] 8.4 Rodar `composer quality` completo e registrar o resultado no PR
|
||
- [x] 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
|