# 32 — Banner com vigência, widget no slot e módulo inativo

**Fase:** P5.S4.2/S5.2/S6.1 · **Área:** CMS (domínio do painel) + portal · **Spec:** `tests/32-cms-banner-vigencia.spec.ts`

## História

A redação cria três peças de **destaque** no slot `main.after` — uma **vigente** (sem janela), uma
**futura** (`starts_at` em 2030) e uma **expirada** (`ends_at` em 2020) — e coloca o widget
`destaques.banner` no perfil de layout do grupo de URL das páginas. O portal mostra **somente** a
vigente, com o `alt` da peça. Quando a equipe de suporte **desativa** o módulo `Destaques`, o slot
fica vazio e a página continua respondendo 200 (sem wrapper órfão, sem 500); reativado, o banner
volta na requisição seguinte.

## Critérios de aceite

1. As três peças são criadas pela UI com a **mesma imagem do catálogo** e `alt` próprios; a lista
   do painel classifica as peças em vigente/agendada/expirada.
2. O perfil `paginas.portal.show` referencia **apenas o id** `destaques.banner` no slot
   `main.after` (sem import entre módulos) e o catálogo do `/cms/layout` mostra a fonte.
3. A página publicada renderiza **um** `[data-widget="destaques.banner"]` com **apenas** a peça
   vigente; futuro e expirado não aparecem no HTML.
4. A imagem do banner tem `alt` da peça, `width`/`height` e `loading` coerente com o slot; o CLS da
   página fica **≤ 0,1** (medido com `document.fonts.ready` + dois frames, sem sleep).
5. axe A/AA sem violações na página com banner em desktop e no viewport `Pixel 7` (mesmo conteúdo
   público, sem repetir login/escrita).
6. **Módulo inativo** (ADR-034): a equipe desativa `Destaques` com motivo; a página responde 200, o
   `[data-widget]` e a seção `.destaques-banner` desaparecem, o `<h1>` continua e o axe segue
   limpo. Reativar o módulo devolve o widget imediatamente.
7. Ao final o perfil fica **inativo** (não vaza widget para páginas de outras specs) e a página é
   **arquivada** (URL fecha com 404 noindex).

## Dados e isolamento

- Cada execução sobe a própria imagem (alt único), cria a própria página (slug único) e as três
  peças com títulos únicos; o perfil usa um escopo fixo e exclusivo (`paginas.portal.show`), é
  reescrito para ter **uma** colocação e fica inativo no fim.
- A ativação de módulo e o perfil são **estado compartilhado**: o arquivo roda no projeto
  `cms-serial` (um worker, antes dos demais), restaurando tudo no `finally` — como as histórias
  18/23/26. Aviso: desativar `Destaques` faria a história 29 falhar se rodassem em paralelo.

## Fora de escopo

- Rotação automática/carrossel (proibido: ADR-016) e limite por slot (configuração coberta por
  `DestaqueBannerWidgetTest`).
- Cache de payload de mídia ao arquivar/restaurar imagem (registrado como risco da S4.2).
