# História 08 — CMS de Notícias (criar, publicar e ver no portal)

## Objetivo

Provar o vertical de conteúdo do piloto (F4.I2) ponta a ponta: um autor do painel cria uma notícia
com o **editor rico** (ADR-028), publica e o **portal** renderiza o HTML semântico — sem HTML no
banco e sem quebrar a acessibilidade.

## Pré-condições

- `make up` + `php artisan db:seed` (usuário do painel `admin@concordia.inf.br`).
- Assets compilados (`make check`).

## Passos

1. Entrar no painel (`cms.<host>/login`) com o usuário de demonstração.
2. Abrir **Notícias** na navegação do manifesto.
3. **Nova notícia** → preencher título, endereço (slug), situação = publicado.
4. Escrever um parágrafo no editor rico (TipTap) — aba `pt_BR`.
5. Salvar e confirmar a mensagem de sucesso; verificar axe na tela.
6. Abrir a notícia no **portal** (`/<slug>`) e conferir o parágrafo renderizado.

## Cenário: mídia com legenda por `<dialog>` (sem prompt bloqueante)

1. Inserir uma imagem pelo diálogo de mídia (upload real via serviço Media).
2. Selecionar a imagem e abrir **Legenda da imagem**.
3. A legenda abre em **`<dialog>` nativo** (o prompt bloqueante do navegador não é usado); axe verde.
4. Aplicar → o `<figure>` recebe `<figcaption>` com o texto.

## Contrato verificado

- Conteúdo é **AST JSON** (`jsonb`) por locale (ADR-012/028) — nunca HTML.
- Portal renderiza um **parágrafo semântico** (`<p>`) a partir do AST.
- Sem JS, o `<textarea>` com o AST continua sendo o campo do formulário (ADR-010).
- Legenda/alt da mídia usam `<dialog>` nativo (ADR-009); `RichTextEditorTest` impede `window.prompt`.
- Nenhuma violação de acessibilidade (axe) nas telas envolvidas.

## Limite de mídia (soft/hard)

- Uma imagem acima do **recomendado** (2 MiB) entra, mas o editor mostra um aviso persistente
  (`role="status"`) com o tamanho e o limite; acima do **hard** (20 MiB) o cliente barra antes do
  POST e o servidor devolve 422 com a mensagem do tipo. PDFs até 100 MiB são aceitos.
