# Changelog

## [1.5.4] - 2026-03-16
- Removidas referências ao axe-core visíveis ao cliente
- Corrigido arquivo .bak duplicado que impedia ativação do plugin

## [1.5.3] - 2026-03-15

### Adicionado — Seletor de modo de análise no editor
- 🎨 **Meta box do editor** — Adicionado toggle segmentado (WCAG 2.2 / NBR 17.225) no meta box de acessibilidade
- 🎨 **UX/UI** — Controle estilo segmented control com transições suaves, `:focus-visible`, `role="radiogroup"` e `aria-checked` para acessibilidade completa
- 🔧 **wally-editor.js** — A análise agora lê o modo selecionado diretamente do toggle (com fallback para `wallyData.analysisMode`)
- 🔧 **wally-admin.js** — Bindings para o toggle de modo com atualização em tempo real do `wallyData.analysisMode`
- ℹ️ O modo padrão do toggle segue a configuração das Settings do plugin

## [1.5.2] - 2026-03-15

### Corrigido — Falsos positivos de landmarks no site scanner
- 🐛 **wally-scanner.js** — Adicionada neutralização de `<main>`, `<header>`, `<footer>` (mesma lógica do editor v1.4.2)
- 🐛 Eliminados 3 falsos positivos que apareciam no scan de site mas não no editor:
  - `landmark-no-duplicate-main` — admin tem `<main>` + página injetada tem `<main>`
  - `landmark-no-duplicate-banner` — admin tem `<header>` + página tem `<header>`
  - `landmark-no-duplicate-contentinfo` — admin tem `<footer>` + página tem `<footer>`
- ℹ️ **Causa raiz**: O fix de v1.4.2 só foi aplicado ao `wally-editor.js`, mas o `wally-scanner.js` não tinha a mesma neutralização

## [1.5.1] - 2026-03-15

### Corrigido — Contagem precisa de elementos afetados
- 🐛 **getUniqueSelector()** — Nova função utilitária que gera seletores CSS únicos para cada elemento DOM (tag + classes + `:nth-of-type`), evitando que a deduplicação em `processAxeResults` colapse múltiplas violações distintas em uma só
- 🐛 **`custom-navigation-structure`** — Página com 3 `<nav>` sem `aria-label` agora reporta 3 elementos afetados (antes: 1)
- 🐛 **Todas as 17 regras** atualizadas para usar `getUniqueSelector()` em vez de seletores genéricos (`target: ['nav']`, `target: ['table']`, etc.)
- ℹ️ **Causa raiz**: `processAxeResults` deduplicava nodes baseado em `JSON.stringify(node.target)`. Quando múltiplos elementos diferentes geravam o mesmo seletor genérico (ex: `['nav']`), apenas o primeiro era contado.

## [1.5.0] - 2026-03-15

### Adicionado — Cobertura completa de blocos Gutenberg
- 🔍 **`custom-social-links-incomplete`** — Detecta blocos Social Links com URL ausente (`<a>` sem `href` = não focável) ou sem `aria-label`
- 🔍 **`custom-file-block-accessibility`** — Detecta blocos File/Download com botão genérico ("Download") sem `aria-label` descritivo do arquivo
- 🔍 **`custom-details-generic-summary`** — Detecta blocos Details/Accordion com `<summary>` genérico ("Details", vazio) que não descreve o conteúdo expansível
- 🔍 **`custom-generic-landmark`** — Detecta `<section>` e `<aside>` (incluindo blocos Group com tagName semântico) sem `aria-label` ou `aria-labelledby`
- 📊 **17 regras custom** — Engine atualizada de 13 para 17 regras, cobrindo todos os blocos core do Gutenberg

### Análise de cobertura (Gutenberg blocks → WCAG)
- `core/button` → `custom-empty-button-link` (sem href, sem texto)
- `core/image` → `custom-image-alt-empty` (alt vazio/ausente, texto embutido)
- `core/gallery` → `custom-wp-gallery-missing-alt` (imagens sem alt)
- `core/video` / `core/audio` → `custom-wp-media-no-captions` (sem legendas/transcrição)
- `core/embed` → `custom-embed-no-title` (iframe sem title)
- `core/cover` → `custom-cover-contrast` (contraste WCAG real)
- `core/table` → `custom-table-accessibility` (sem th/scope/caption)
- `core/heading` → `custom-heading-hierarchy` (saltos de nível, múltiplos H1)
- `core/navigation` → `custom-navigation-structure` (sem nav/aria-label)
- `core/site-logo` → `custom-site-logo-alt` (alt vazio/genérico)
- `core/search` → `custom-search-widget-label` (campo sem label)
- `core/html` → `custom-html-block-warning` (elementos interativos)
- `core/social-links` → **`custom-social-links-incomplete`** (NOVO)
- `core/file` → **`custom-file-block-accessibility`** (NOVO)
- `core/details` → **`custom-details-generic-summary`** (NOVO)
- `core/group` (section/aside) → **`custom-generic-landmark`** (NOVO)
- `core/spacer` → N/A (WP já coloca `aria-hidden="true"`)
- `core/separator` → N/A (semântico por padrão `<hr>`)
- `core/columns` → N/A (neutro `<div>`)
- `core/quote` → N/A (semântico `<blockquote>`)

## [1.4.3] - 2026-03-15

### Melhorado
- 🔍 **`custom-empty-button-link` ampliado** — Agora detecta botões Gutenberg (`<a class="wp-block-button__link">`) que possuem texto mas não possuem `href`. Sem `href`, o `<a>` não é focável pelo teclado e não é anunciado como interativo por leitores de tela (viola WCAG 2.1.1 e 4.1.2)

## [1.4.2] - 2026-03-15

### Corrigido
- 🐛 **Falso positivo `landmark-no-duplicate-main`** — A página do admin (post.php) já possui `<main>`, e injetar o conteúdo da página escaneada com outro `<main>` fazia o axe-core reportar landmarks duplicados
- 🔧 **Neutralização de landmarks de documento** — Tags `<main>`, `<header>` e `<footer>` no HTML injetado são convertidas para `<div data-wally-original-tag="...">` antes da análise, preservando atributos e conteúdo

## [1.4.1] - 2026-03-15

### Corrigido
- 🐛 **jQuery `.html()` crash** — `SyntaxError: Failed to execute 'appendChild'` quando mensagens do axe-core contêm tags HTML literais (`<script>`, `<template>`, `<ul>`, `<li>`)
- 🔧 **`wally-editor.js`** — Substituído `$().html(html)` por `$().empty()[0].innerHTML = html` (bypassa o pipeline `buildFragment/appendChild` do jQuery)
- 🔧 **`wally-ui.js`** — Mesma correção aplicada ao renderizador de violações do site scanner
- 🛡️ **Fallback `escapeHtml`** — Função inline caso `WallyMonitor.Utils` não esteja carregado
- 🛡️ **`error.message` e `v.helpUrl`** — Agora escapados com `escapeHtml()` antes de injeção no DOM

## [1.4.0] - 2026-03-14

### Adicionado — Wave 4: UX + Wave 5: Polish
- 🎯 **Plano de Ação Priorizado** — Top 3 violações com ícone de impacto, contagem de elementos e QuickFix
- 🔍 **Filtros avançados** — Filtro por engine (axe-core/WordPress/NBR/IF-THEN), ordenação (impacto/contagem/quickfix), agrupamento por página
- 📄 **Agrupamento por página** — Modo de visualização que agrupa violações por URL em scans multi-página
- ♿ **Suporte forced-colors/high-contrast** — `@media (forced-colors: active)` completo com system colors para todos os componentes
- 🧩 **`wally-rule-helpers.js`** — Módulo compartilhado com 7 helpers (`getSelector`, `outerSnippet`, `getComputed`, `makeNode`, `violation`, `isHidden`, `hasAriaLabel`)
- 🏗️ **`class-wally-html-checker.php`** — DOMDocument-based accessibility checker para server-side (substitui regex)
  - 12 core checks via XPath (image-alt, empty-link, html-lang, etc.)
  - 8 validators DOM-based (page-title, table-headers, heading-hierarchy, form-labels, etc.)
  - Scoring helpers estáticos (`calculate_penalty`, `calculate_score`)

### Alterado
- ♻️ **NBR + IF-THEN refatorados** — Helpers locais removidos, delegam para `WallyMonitor.RuleHelpers`
- ♻️ **Cron + REST API refatorados** — Substituídas 12 regex patterns por `Wally_HTML_Checker::run_core_checks()`
- ♻️ **CLI refatorado** — 8 validators regex substituídos por `Wally_HTML_Checker` com DOMDocument/XPath
- 🏷️ **Fix WCAG mapping** — `custom-empty-button-link` agora inclui tag `wcag412` (Name, Role, Value) além de `wcag244`

### Removido
- 🗑️ **`wally-monitor-admin.js` DELETADO** — Monólito de 3.068 linhas nunca carregado (dead code desde v1.1.0)
  - 36 funções duplicadas eliminadas (~71 cópias reduzidas a ~35)

### Documentação
- 📝 **README.md** — Estrutura de arquivos atualizada (15 módulos JS, 11 classes PHP)
- 📝 **readme.txt** — Changelog sincronizado (adicionados v1.1.0, v1.2.0, v1.3.0, v1.4.0)
- 📝 **Stable tag** — Atualizado para 1.4.0

## [1.3.0] - 2025-03-14

### Adicionado — Modos de Análise Distintos + axe-core 4.11.1
- 🔄 **axe-core atualizado para v4.11.1** (de v4.10.2)
  - Correções de falso-positivos em contraste de cores (oklch, oklab)
  - Melhor suporte a Shadow DOM e contextos iframe
  - Constante de luminância corrigida (0.03928 → 0.04045)
  - Suporte a tags RGAA para padrão francês
  - Correções em `target-size`, `valid-lang`, `color-contrast`
- 📋 **Novo módulo `wally-analysis-modes.js`** — Motor de modos de análise
  - **Modo WCAG 2.2 (axe-core):** Apenas o motor axe-core, padrão internacional (~90 regras) — padrão
  - **Modo NBR 17.225:** Apenas as regras brasileiras exclusivas (118 regras customizadas)
  - Filtragem por nível WCAG (A/AA/AAA) via `runOnly` tags
  - Tagging de fonte (`_source`) em cada violação para rastreabilidade
  - API: `runAnalysis()`, `getConfig()`, `filterBySource()`, `groupBySource()`
- 🗺️ **Mapa NBR ↔ WCAG** — Cross-reference completo NBR 17.225 → WCAG 2.2 SC
  - 50+ mapeamentos bidirecionais com títulos e níveis
  - Utility: `lookupWcag()`, `extractNbrSection()`
- 🎨 **Seletor de modo na página de relatórios** — Dropdown inline antes do scan
  - Exibe motores ativos em tempo real
  - Badge de motor nos resultados finais
- ⚙️ **Nova configuração "Modo de Análise"** na página de Configurações
  - Persiste no `wp_options` como `analysis_mode`
  - Passado para JS via `wallyData.analysisMode`

### Alterado
- ♻️ **Scanner refatorado** — `wally-scanner.js` agora delega a `AnalysisModes.runAnalysis()`
  - Removido código direto de `axe.run()` + `Rules.runAllChecks()` + `NBRRules.runAllChecks()`
  - Barra de progresso usa `uniqueUrls.length` (fix do denominador)
  - Resultados incluem metadados de modo e motores ativos
- ♻️ **Editor refatorado** — `wally-editor.js` também usa `AnalysisModes.runAnalysis()`
  - Removido chamadas diretas a 3 rule engines
  - Console debug agora mostra modo, motores e _source por violação
- 📦 **Dependências JS reorganizadas** — `wally-analysis-modes` centraliza deps de rule engines
  - Scanner e Editor dependem apenas de `wally-analysis-modes` (não mais de cada rule engine)
- 📝 **wallyData expandido** — Agora inclui `analysisMode`, `wcagLevel`, `siteUrl`, `axeCoreVer`, `pluginVer`

## [1.2.0] - 2025-01-15

### Adicionado — 57 Regras IF-THEN Exclusivas (NBR 17.225)
- 🔀 **Novo módulo `wally-ifthen-rules.js`** — 57 verificações condicionais exclusivas ao Wally Monitor
  - **Grupo A — ARIA & Roles (10 regras):** role="button" com teclado, tablist→tab→tabpanel, dialog name, aria-expanded→controls, slider values, progressbar value, alertdialog desc, menu children, tree children
  - **Grupo B — Forms & Inputs (10 regras):** radio grouping, checkbox grouping, required+aria-required, file input label, range accessibility, textarea label, select multiple instructions, pattern title, disabled not focusable, form submit label
  - **Grupo C — Tables (7 regras):** th scope, complex table headers+id, table caption, presentation table clean, colspan headers, nested tables, sortable aria-sort
  - **Grupo D — Links & Navigation (8 regras):** new window warning, hash links, javascript: href, adjacent duplicate links, aria-current page, pagination semantic, download link info, anchor target exists
  - **Grupo E — Media & Embeds (7 regras):** video captions, audio transcript, canvas fallback, interactive SVG keyboard, decorative iframe hidden, decorative img role, map iframe alternative
  - **Grupo F — Structure & Landmarks (8 regras):** nested header/footer labeled, aside labeled, unique main, section labeled, article heading, search landmark labeled, modal aria-modal
  - **Grupo G — Dynamic Content (7 regras):** contenteditable accessible, infinite scroll alternative, accordion aria-expanded, tooltip focusable, loading spinner aria, cookie banner accessible, countdown live region
- ⚡ **+57 QuickFixes** — Sugestões de código para todas as novas regras IF-THEN
  - Code snippets em português com autoFixAttr onde aplicável
  - Padrão ❌/✅ mostrando antes/depois para cada correção
- 🔍 **+21 regras SEO-critical** — Novas regras IF-THEN mapeadas para impacto SEO
  - Estrutura & Landmarks, Links & Navegação, Media, Forms & Conversão
- 📊 **Total de regras: 105** — 48 NBR + 57 IF-THEN exclusivas (não cobertas por axe-core/WAVE/Lighthouse)

## [1.1.0] - 2025-01-10

### Adicionado — Wave 3: Infraestrutura & Automação
- 🤖 **WP-CLI headless scanner** — 6 subcomandos (`scan`, `status`, `report`, `history`, `schedule`, `reset`)
  - 25 regras server-side (regex) com validadores de HTML semântico
  - Motor de scoring com pesos (critical=-8, serious=-4, moderate=-2, minor=-1) e caps
  - Saída formatada com box ASCII, cores, emojis e suporte a `--format=table|json|csv`
  - `--exit-code` para integração CI/CD (exit 1 se score < threshold)
  - `--save` persiste resultados no banco via `Wally_Database`
- ⏰ **WP-Cron agendamento** — Análises automáticas periódicas (`class-wally-cron.php`)
  - Frequências: horária, diária, semanal, mensal (recurrence custom)
  - Notificações por e-mail configuráveis (sempre / abaixo do limiar / nunca)
  - 12 verificações regex server-side no scan automático
  - Painel de configurações integrado na página de Settings
  - `register_deactivation_hook` limpa agendamentos ao desativar
- 🔌 **REST API completa** — 6 endpoints no namespace `wally-monitor/v1` (`class-wally-rest-api.php`)
  - `GET /scan?url=&save=` — Análise server-side com persistência opcional
  - `GET /report?url=` — Último relatório salvo
  - `GET /history?limit=` — Histórico paginado
  - `GET /status` — Status do plugin, cron, capabilities
  - `POST /schedule` — Habilitar/desabilitar cron via API
  - `GET /rules` — Catálogo público de todas as regras (endpoint público)
  - Permissões `manage_options` em endpoints protegidos
- 🌐 **i18n — Internacionalização** — Suporte completo a traduções
  - `load_plugin_textdomain()` no bootstrap
  - Template `.pot` com 60+ strings traduzíveis
  - Tradução `pt_BR.po` completa (Português do Brasil)
  - Text domain `wally-monitor` em todas as novas classes

### Adicionado — Wave 2: Features
- 🇧🇷 **+35 regras NBR 17.225** — Norma brasileira de acessibilidade digital (novo módulo `wally-nbr-rules.js`)
  - 7 regras WCAG 2.2 exclusivas (focus-not-obscured, target-size, consistent-help, accessible-auth, etc.)
  - 4 regras de idioma e texto (lang, abbreviations, reading level)
  - 5 regras de teclado e foco (skip-nav, focus-order, keyboard-trap, pointer-cancellation)
  - 8 regras visuais e timing (autoplay, text-resize, reflow, text-spacing, pause-stop)
  - 8 regras de semântica e estrutura (link-purpose, section-headings, input-purpose, page-titled)
  - 3 regras de formulários e erros (error-identification, error-suggestion, status-messages)
- 🎯 **Dashboard Gauge animado** — Score de acessibilidade com arco SVG 270° e animação cubic-bezier
- ⚡ **Quick Fix Engine** — Sugestões de código prontas para copiar em 30+ tipos de violação (`wally-quickfix.js`)
  - Código corretivo contextual com snippets HTML/CSS prontos
  - Botão "📋 Copiar Correção" com clipboard API
  - Detecção de autocomplete para campos brasileiros (CPF, CEP, etc.)
- 🌟 **Onboarding Wizard** — Experiência guiada de primeiro uso com 4 etapas (`wally-onboarding.js`)
  - Modal com progress dots e animação de entrada
  - Highlight pulsante no botão de escaneamento
  - Armazenamento em localStorage (mostra apenas uma vez)

### Alterado — Wave 1: Refactoring
- 🏗️ **Arquitetura PHP refatorada** — Bootstrap de 848→53 linhas com 5 novas classes SRP
  - `class-wally-sanitizer.php` — Validação/sanitização centralizada
  - `class-wally-database.php` — Operações de banco (singleton)
  - `class-wally-admin.php` — Menu, páginas, enqueue, meta box
  - `class-wally-ajax.php` — 6 endpoints AJAX centralizados
  - `class-wally-export.php` — Exportação JSON/CSV/PDF
- 🧩 **JavaScript modularizado** — Monolito de 3048 linhas dividido em 12 módulos
  - Pipeline: utils → custom-rules → nbr-rules → quickfix → stats → report → scanner → ui → editor → chart → admin → onboarding
- 🎨 **Branding Equallyze** — Cores aplicadas a CSS (#0E4A70, #38D39F, #9361FF, #42307A) e PDF (#0E2336)

## [1.0.2] - 2026-01-05

### Segurança
- 🔒 **CRÍTICO**: Implementada sanitização completa de dados JSON recebidos via POST
- 🔒 Adicionada validação rigorosa da estrutura de relatórios antes do processamento
- 🔒 Criada função `wally_monitor_sanitize_report_data()` para sanitização recursiva de arrays
- 🔒 Criada função `wally_monitor_validate_report_structure()` para validação de estrutura
- 🔒 Adicionado escape de HTML no JavaScript com função `escapeHtml()`
- 🔒 Implementada validação de ranges para scores (0-100) e total de violações (não negativos)
- 🔒 Sanitização de URLs com `esc_url_raw()` antes de salvar no banco de dados
- 🔒 Validação de erros de JSON com `json_last_error()` após decodificação
- 🔒 Escape adequado de dados dinâmicos exibidos no frontend

### Corrigido
- 🐛 Resolvidos todos os problemas de sanitização apontados pelo WordPress.org Plugin Review Team
- 🐛 Corrigida a manipulação de dados JSON seguindo as melhores práticas do WordPress

## [1.0.1] - 2025-12-22

### Atualizado
- 📦 Chart.js atualizado de 4.4.8 para 4.5.1 (última versão estável)
- 📝 Melhorada documentação da estratégia de prevenção de conflitos da biblioteca FPDF
- 🔧 Aprimorada a verificação class_exists() para a biblioteca FPDF prefixada

### Corrigido
- 🐛 Resolvidos avisos do Plugin Check relacionados a bibliotecas

## [1.0.0] - 2025-11-20

### Adicionado
- ✅ Análise de acessibilidade em tempo real no editor (Gutenberg e Classic Editor)
- ✅ Análise completa do site com processamento paralelo (até 5 páginas simultâneas)
- ✅ Sistema de paginação para resultados (10 itens por página)
- ✅ Cálculo de score baseado em padrões WCAG oficiais
- ✅ Determinação de nível de conformidade WCAG (A, AA, AAA)
- ✅ Filtros por criticidade (Crítico, Sério, Moderado, Leve)
- ✅ Exportação de relatórios em CSV e JSON com timestamp
- ✅ Página de histórico (últimas 10 análises)
- ✅ Página de configurações personalizáveis
- ✅ Suporte a Custom Post Types
- ✅ Barra de progresso com estimativa de tempo
- ✅ Timeout de 15s por página para evitar travamentos
- ✅ Tratamento robusto de erros
- ✅ Verificação de capacidades e nonces em todos os endpoints
- ✅ Sanitização de dados
- ✅ Script de desinstalação limpa

### Segurança
- 🔒 Verificação de `manage_options` em todos os endpoints AJAX
- 🔒 Nonces em exportações e configurações
- 🔒 Sanitização de dados de entrada
- 🔒 Escape de saída HTML

### Performance
- ⚡ Carrega axe.js APENAS onde necessário (não em todo admin)
- ⚡ Processamento paralelo de até 5 páginas simultâneas
- ⚡ Paginação de resultados (10 por página)
- ⚡ Timeout configurável para evitar travamentos

### Compatibilidade
- ✅ WordPress 5.0+
- ✅ PHP 7.4+
- ✅ Gutenberg (Block Editor)
- ✅ Classic Editor (TinyMCE)
- ✅ Custom Post Types
- ✅ WCAG 2.0, 2.1, 2.2 (níveis A, AA, AAA)
