# PNTP — Acessibilidade, mapa do site e Radar

> **Critérios:** 13.1–13.5, 2.9, 1.3.
> **Fase:** [`P26`](../../implementation-phases/P26-acessibilidade-mapa.md).
> **Estado atual:** o layout já tem `@layer a11y`, `A11yPreferences` e `A11yFontScale`; falta o
> controle visível, o símbolo, o mapa do site e o Radar.

## 1. Requisitos

| # | Critério | Entrega |
|---|---|---|
| 13.1 | Símbolo de acessibilidade | símbolo em destaque no header/footer, link para a página de acessibilidade |
| 13.2 | Breadcrumb | caminho em todas as páginas, `nav aria-label="breadcrumb"`, `aria-current="page"` |
| 13.3 | Alto contraste | controle visível; estado server-side; `@layer a11y`; sem FOUC |
| 13.4 | Redimensionamento | A+/A− e/ou zoom; escala persistida; layout não quebra |
| 13.5 | Mapa do site | `/mapa-do-site` com todas as páginas públicas, agrupadas; HTML; link no rodapé |
| 2.9 | Radar | link visível para o Radar da Transparência (Atricon); externo, sem request |
| 1.3 | Link da transparência | link no header/home, 1 clique, sem scroll |

## 2. Implementação

- **Símbolo:** componente `A11ySymbol` no shell do portal (não em cada módulo), com `aria-label`
  traduzido e link para `/acessibilidade`.
- **Barra de acessibilidade:** já existe no shell; garantir que os controles sejam **visíveis**
  (não só via JS) e operem sem JS quando possível; estado em cookie, renderizado no servidor.
- **Alto contraste:** `data-a11y-contrast="high"` no `<html>`; CSS em `@layer a11y`; teste axe e
  contraste.
- **Fonte:** `A11yFontScale` com `rem`; A+/A−; limite; persistência; nenhum `!important`.
- **Breadcrumb:** o contrato `<x-layout::portal>` já recebe `breadcrumbs`; P26 audita todas as
  páginas e adiciona onde faltar. Não é um segundo breadcrumb visual.
- **Mapa do site:** rota pública `/mapa-do-site`; fonte = manifest/sitemap + páginas curadas;
  grupos por módulo; links internos com locale; `SitemapSource` não é o mapa (XML é para máquina).
  Atualiza no request/cache; sem lista manual duplicada.
- **Radar:** link no header/footer; `rel="noopener noreferrer"`; sem iframe/asset; allowlist de
  links externos é só de navegação, não de request.
- **Transparência:** link no header e/ou home; se o menu for editável (P1), o item é dado; se não,
  fallback no shell.

## 3. Testes

- [ ] axe zero A/AA em desktop/mobile; teclado; foco visível.
- [ ] Contraste alto e fonte aumentada não quebram layout; estado sobrevive à navegação.
- [ ] Breadcrumb em todas as páginas públicas; `aria-current`.
- [ ] `/mapa-do-site` lista todas as rotas públicas, sem link morto, com locale.
- [ ] Radar e transparência visíveis sem scroll no mobile/desktop.
- [ ] `make check` 2× + `E2E=1`; sniffCSS estrito.

## 4. Riscos

| Risco | Mitigação |
|---|---|
| Controle só via JS | estado no servidor/cookie; baseline sem JS |
| Mapa manual desatualizado | derivar do manifest/sitemap |
| Link externo virar request | link, sem iframe/asset |
| Breadcrumb duplicado | um por página, no shell |
| Contraste quebrar tema | `@layer a11y` por último; axe |
