## Goal

Corrigir dois problemas de acessibilidade estrutural no portal:

**(A) Homepage com múltiplos H1 no carrossel hero.**
- `GET /` → hero é um Swiper com 2 slides; cada slide contém um `<h1 data-animation="fadeInUp">`:
  - Slide 1: "Faça parte da maior comunidade de TI do Brasil"
  - Slide 2: "Tecnologia que transforma negócios e pessoas"
- O AX tree expõe **2 H1s** (ambos no DOM/AX, mesmo com um slide inativo). Isso viola a estrutura de documento (1 H1 por página; WCAG 1.3.1/2.4.6).
- A página home (template SLE herdada) também renderiza outros títulos de seção (`section-title` H2) — o H1 deve ser único.

**Solução esperada (A):**
- Manter **um único `<h1>`** na home. Opções (avaliar qual preserva melhor o visual/JS do Swiper):
  1. Trocar o `<h1>` dos slides 2..n para `<h2>` (ou `div` com estilos), mantendo o primeiro slide como H1.
  2. Manter H1 apenas no primeiro slide e `aria-hidden="true"` nos slides inativos (com Swiper, os slides inativos são os que não possuem classe `.swiper-slide-active`).
- Não quebrar o comportamento de animação (`data-animation`, WOW) nem o loop do carrossel.

**(B) Ícones de fonte dentro de headings sem `aria-hidden` vazando no nome acessível.**
- `GET /noticias` → `<h2 class="section-title-custom"><i class="bi bi-newspaper me-2"></i>Últimas notícias</h2>` → AX name vira " Últimas notícias" (o glifo do ícone entra no nome).
- `GET /regional/{slug}` → `<h2>` com `<i class="bi">` sem `aria-hidden` → names " Sobre a Regional", " Associados", " Notícias da Regional" (glifos vazando).
- Padrão: todo `<i class="bi ...">` dentro de elementos de texto acessível (headings, links, botões) deve ter `aria-hidden="true"` (ou `role="presentation"`).

**Solução esperada (B):**
- Auditar por grep todos os `<h1..h6>` que contêm `<i class="bi` sem `aria-hidden` em `V2/layouts/portal` e `V2/Modules/*/Views/portal`.
- Adicionar `aria-hidden="true"` aos ícones decorativos dentro de headings (ex.: noticias section-title, regional-detail section-titles).
- Não tocar em ícones que já possuem `aria-hidden` ou que são conteúdo semântico (raro).

## Non-Goal

- Não alterar as imagens/alt do hero.
- Não mudar o visual (fontes, tamanhos, animações) dos títulos.
- Não alterar a estrutura de headings das demais páginas (apenas auditar e corrigir o padrão de ícones).
- Não alterar o plugin Swiper/meanmenu.

## Constraints

PHP 7.4 | PHPUnit ~6.0. Nunca commitar. Model: UUID, SoftDeletes.
Use o X-CMS-AI-Token do ai_acess definido no .env para ter livre acesso ao CMS a nível de UI/UX
SniffCSS habilitado em MCP e Host para consulta da página real
Docker only. execute via docker compose exec app [command]
O hero da home é renderizado de dados SLE (StructuralLandingEditor) — localizar o template de origem do bloco hero (provavelmente `V2/Modules/Support/StructuralLandingEditor` ou seeder SLE).

## Success Criteria

1. SniffCSS (`--ax-tree`) na home mostra **exatamente 1 H1** na página.
2. O carrossel hero continua funcionando (slides trocam, animações WOW preservadas).
3. SniffCSS em `/noticias` e `/regional/{slug}` mostra headings com nomes acessíveis limpos (sem glifos) — ex.: "Últimas notícias", "Sobre a Regional".
4. Grep de auditoria: nenhum `<i class="bi` sem `aria-hidden` dentro de headings no portal.
5. Suíte V2 Unit não regride (0 novas falhas).

================================================================================

# RESULT-LOG

```
Status: Concluído
Date: 2026-08-17
Sub-tasks: 4/4 (hero H1 único, CSS hero-2, ícones em headings, testes)
Files modified: 12 (3 templates hero + 2 CSS + 7 views com ícones em headings)
Seeds closed: 1/1 (sucesu-cd18)
Outcome: Home com 1 H1 no hero (slide1); slides 2..n viram H2 com mesmo estilo.
         Todos os ícones decorativos em headings do portal com aria-hidden.
Notes:
  - DECISÃO do usuário (2 rodadas): slide1 H1, demais H2. LIMITAÇÃO ACEITA:
    o Swiper hero usa loop:true e clona slides no DOM (runtime) — o clone do slide1
    continua gerando um 2º H1 no AX tree pós-JS. HTML server-side tem exatamente 1 H1.
  - Templates alterados: lse/render/hero.blade.php, portal/sections/hero.blade.php,
    BasicPage/portal/homepage.blade.php — $loop->first ? H1 : H2.
  - CSS: .hero-1/.hero-2 .hero-content h1/h2 (main.css + main.min.css) para manter
    o visual idêntico nos slides H2.
  - Ícones aria-hidden: /noticias (Últimas notícias), regional/{slug} (Sobre a
    Regional, Galeria, Associados, Notícias da Regional), associado detail
    (Sobre o Convênio, Benefícios, Galeria), instituicao (3 títulos),
    main-right-area (Links Úteis), noticia show (Categoria, Compartilhar).
    Auditoria automatizada (regex H1-H6 + <i class="bi sem aria-hidden): 0 restantes.
  - Testes: tests/Feature/V2/Modules/Layouts/Homepage/HomepageA11yTest.php
    (2 testes, 6 asserts) — 1 H1 no hero + aria-hidden no ícone de /noticias.
  - Evidência: before/after em sniff-report/evidence/sucesu-cd18/
    (home.png + home-hero.png AFTER). HTML real: hero 1 H1 + 1 H2.
  - REVISÃO VISUAL: verificar home-hero.png (AFTER) — o slide 2 (H2) deve manter
    a mesma aparência do H1.
```

================================================================================

# AI-AREA

```
1. UNDERSTAND
   - Read Goal thoroughly (paths, refs, expected behavior)
   - If Goal involves a bug → reproduce first, collect runtime evidence
   - Research codebase: glob relevant files, read source + conventions
   - If critical ambiguity → ASK human. Minor → ASSUME + document.

2. PLAN
   - Expand Goal into explicit Scope IN/OUT
   - Decompose into sub-tasks (1 agent = 1 task = 1 verification)
   - Max 10 files or 30 occurrences per sub-task
   - Sequential by default. Parallel only if independent.
   - Register: sd create → sd plan create → sd plan adopt → sd sync

3. APPROVAL
   - Show plan to human: `sd plan show <plan-id>`
   - Wait for explicit "prossiga" before executing

4. EXECUTE
   - For each sub-task sequentially:
     a. Delegate to coder via task tool
     b. Verify against Success Criteria
     c. IF implementation involves UI, verify with SniffCSS (MCP || CLI command)
     d. IF fail any verify → correction sub-task, repeat 4a
     e. sd close <seed-id> --reason "[result]"

5. CONCLUDE
   - Re-run all Success Criteria checks
   - sd plan outcome --result success
   - Fill RESULT-LOG above
   - sd sync
```