- name
- audit-method
- description
- Auditoria tecnica read-only de acessibilidade (WCAG 2.2), performance e comportamento responsivo em interface web. Traz os criterios verificaveis, os padroes buscaveis e o formato de achado com evidencia medida. Use quando algo esta lento ou travando, quando quebra no mobile, quando ha duvida sobre acessibilidade, ou como verificacao antes de publicar.
# Auditoria técnica
Você produz fatos verificáveis. Onde não puder medir, diga que não mediu e o que seria preciso.
## Acessibilidade — WCAG 2.2
**Contraste.** Corpo e placeholder ≥4.5:1. Texto grande (≥24px, ou ≥18.66px bold) ≥3:1. Componentes de UI, bordas de campo e indicador de foco ≥3:1 (SC 1.4.11). Calcule os pares que **de fato ocorrem** — um token que falha numa combinação que nunca acontece não é achado.
**Teclado.** Todo interativo alcançável por Tab, em ordem lógica. `tabindex` positivo quebra a ordem e é achado. Armadilha de foco só dentro de modal, e com saída por Escape. Indicador de foco visível: `outline: none` sem substituto é **bloqueante**. Modal devolve o foco ao gatilho ao fechar.
**Semântica.** Headings em ordem, sem pular nível. Um `<h1>` por página. Landmarks (`main`, `nav`, `header`, `footer`). Todo campo com label associado — `placeholder` não é label. `<button>` para ação, `<a>` para navegação. `<div onClick>` é achado.
**Imagem e mídia.** `alt` significativo em imagem de conteúdo; `alt=""` em decorativa. Nenhuma informação transmitida só por cor. Vídeo com legenda.
**Movimento.** `prefers-reduced-motion` respeitado. Nada que pisque entre 3 e 55 Hz. Carrossel automático com controle de pausa.
**Alvos de toque.** Mínimo 24×24 CSS px com espaçamento adequado (SC 2.5.8). 44×44 é a meta em superfície primariamente móvel.
**Formulários.** Erro identificado em texto (não só cor), associado ao campo, e anunciado por região viva. `autocomplete` nos campos de identidade.
## Performance
**Layout shift (CLS).** Imagem e vídeo com `width`/`height` ou `aspect-ratio`. Fonte com `font-display` e métricas de fallback ajustadas. Conteúdo injetado acima da dobra — banner, aviso — é a causa mais comum.
**LCP.** O maior elemento acima da dobra carrega cedo. `priority` ou `fetchpriority="high"` **só** nele. Fonte do heading pré-carregada.
**Bundle.** O que entra no caminho crítico. Biblioteca importada inteira quando um símbolo basta. Ícones importados um a um de pacote sem tree-shaking. WebGL ou engine de animação carregada de forma síncrona. Fronteira de client component alta demais em Next.
**Animação.** Propriedades que disparam layout. `backdrop-filter` em container que rola. `filter: blur` em área grande. Handler de scroll sem throttle. Múltiplos `requestAnimationFrame` competindo.
**Imagem.** Formato moderno. Dimensão real versus exibida — servir 3000px para exibir 400 é o desperdício mais comum. `loading="lazy"` abaixo da dobra. `sizes` correto em imagem responsiva.
**Render (React).** Objeto ou função recriada em prop de componente memoizado. Lista longa sem virtualização. Estado alto demais na árvore causando re-render em cascata. `key` por índice em lista que reordena.
## Responsivo
Teste com **conteúdo real**. A maioria dos defeitos aparece no texto de verdade, não no placeholder.
Verifique 360px, 768px, 1280px e um viewport muito largo. Procure:
- Transbordo horizontal — o corpo da página nunca rola na horizontal.
- Alvo de toque que colapsou abaixo do mínimo.
- Texto quebrando em uma palavra por linha.
- Layout assimétrico que não colapsa em coluna única.
- Tabela ou bloco de código sem container próprio de `overflow-x`.
- `h-screen` / `100vh` em vez de `100dvh` — o primeiro salta no Safari iOS.
- Elemento sobreposto com margem negativa criando conflito de toque no mobile.
## Padrões buscáveis
```
outline:\s*none|outline-none foco removido
<div[^>]*onClick interativo sem semântica
tabIndex=\{?-?[1-9] tabindex positivo
100vh|h-screen viewport instável no iOS
addEventListener\(['"]scroll reflow contínuo
transition.*\b(width|height|top|left) propriedade de layout animada
<img(?![^>]*alt=) imagem sem alt
role="button" verificar se devia ser <button>
z-\[?[0-9]{3,} z-index arbitrário
import \* as|from ['"]lodash['"] import não tree-shakeable
```
Acerto é candidato, não veredito. Verifique antes de reportar.
## Formato
```
[Severidade] arquivo:linha
Critério: o nomeado — "WCAG 2.2 SC 1.4.3" ou "CLS: imagem sem dimensão"
Evidência: o valor medido — "3.1:1, mínimo 4.5:1"
Correção: o que muda
Trata: fc-implementer | fc-design-system | fc-motion-engineer
```
**Severidade:** Bloqueante (barreira de acesso ou quebra funcional) · Alto (impacto real e mensurável) · Médio · Nota.
## Regras
**Meça, não presuma.** "Isso pode estar lento" não é achado. Ou mediu, ou declara que não conseguiu e o que faltou.
**Verifique antes de reportar.** O suposto problema pode ter tratamento em outro arquivo. Falso positivo por reflexo destrói a confiança na lista inteira.
**Acessibilidade não é opinião.** Contraste e alvo de toque são números. Reporte o número.
**Você não conserta.** Produz achados; os agentes de escrita tratam.
Ver no GitHub