# Changelog — Refatoração do CMS Layout (Julho/2026)

Este documento registra as melhorias estruturais, de performance, acessibilidade e segurança aplicadas ao layout do CMS V2.

```
Data:    24-26 Julho 2026
Escopo:  app.blade.php, header.blade.php, sidebar.blade.php,
         cms-layout.css, dashboard.blade.php,
         Nginx (nginx.conf, lotep.conf.template),
         config/session.php,
         ~35 views de módulos CMS
```

---

## 1. Segurança HTTP (Nginx + Laravel)

### 1.1. Headers de Segurança — `nginx.conf` (global)

| Header | Valor | Função |
|--------|-------|--------|
| `Strict-Transport-Security` | `max-age=63072000; includeSubDomains; preload` | Força HTTPS |
| `Referrer-Policy` | `strict-origin-when-cross-origin` | Privacidade de referrer |
| `Permissions-Policy` | `geolocation=(), camera=(), microphone=(), payment=(), usb=()` | Bloqueio de APIs não utilizadas |
| `X-XSS-Protection` | Removido (obsoleto — substituído por CSP) | — |

### 1.2. Content Security Policy — `lotep.conf.template`

Adicionado CSP strict no servidor:

```
default-src 'self';
script-src 'self' 'nonce-{NONCE}' https://cdnjs.cloudflare.com;
style-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com;
img-src 'self' data: blob:;
font-src 'self' data:;
connect-src 'self';
frame-ancestors 'none';
base-uri 'self';
form-action 'self';
object-src 'none';
```

### 1.3. Cache de Assets Estáticos

Adicionado bloco `location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?|webp|avif)$` no `lotep.conf.template`:
- `expires 1y`
- `Cache-Control: public, immutable`

### 1.4. Segurança de Cookies — `config/session.php`

| Parâmetro | Antes | Depois |
|-----------|-------|--------|
| `secure` | `env(SESSION_SECURE_COOKIE, false)` | `env(SESSION_SECURE_COOKIE, true)` |
| `same_site` | `null` | `'lax'` |

---

## 2. Arquitetura CSS

### 2.1. Propriedades Registradas (`@property`)

Onze variáveis de tema agora são type-safe e animáveis:

```css
@property --sidebar-width    { syntax: "<length>"; }
@property --sidebar-mini-width { syntax: "<length>"; }
@property --header-height     { syntax: "<length>"; }
@property --theme-primary     { syntax: "<color>"; }
@property --theme-primary-hover { syntax: "<color>"; }
@property --theme-secondary   { syntax: "<color>"; }
@property --theme-success     { syntax: "<color>"; }
@property --theme-warning     { syntax: "<color>"; }
@property --theme-danger      { syntax: "<color>"; }
@property --theme-info        { syntax: "<color>"; }
```

### 2.2. Cascade Layers (`@layer`)

```css
@layer reset, base, layout, components, utilities, print;
```

### 2.3. Acessibilidade

| Elemento | Descrição |
|----------|-----------|
| `.skip-link` | Link de pular para conteúdo principal (primeiro elemento do `<body>`) |
| `prefers-reduced-motion` | Reduz animações quando configurado no sistema |
| `color-scheme: light` | Informa navegador sobre suporte a tema claro |
| `@media print` | Oculta sidebar/header/footer, formata A4 |

### 2.4. Performance CSS

| Técnica | Aplicação |
|---------|-----------|
| `content-visibility: auto` | `.cms-main` com `contain-intrinsic-size: 500px` |
| `contain: layout style` | `.cms-sidebar-menu` — isola renderização |

### 2.5. Classes Utilitárias

```css
.cursor-pointer { cursor: pointer; }
.cursor-default { cursor: default; }
.cms-search-btn, .cms-portal-btn, .cms-kbd, .cms-contrast-btn
```

---

## 3. HTML App Shell

### 3.1. Resource Hints

```html
<link rel="preconnect" href="https://cdnjs.cloudflare.com">
<link rel="dns-prefetch" href="https://cdnjs.cloudflare.com">
<meta name="description" content="...">
```

### 3.2. Script Loading

Todos os 6 scripts globais migrados para `defer`:
- jQuery 3.6.0
- Bootstrap 5 bundle
- cms-alerts.js
- masks.js
- flatpickr (core + locale pt)

Os três blocos `DOMContentLoaded` separados foram unificados em **um único listener** contendo:
1. Restauração do estado da sidebar
2. Persistência de grupos de menu
3. Inicialização de Tooltips/Popovers Bootstrap
4. Configuração do Flatpickr
5. Spotlight Search (Ctrl+K)
6. Controles de acessibilidade (alto contraste + escala de fonte)

### 3.3. Acessibilidade HTML

- Skip link como primeiro elemento do `<body>`: `<a href="#main-content" class="skip-link">`
- `id="main-content"` no `<main>` (já existente)
- `scope="col"` em todos os `<th>` da tabela de SEO no dashboard

---

## 4. Header e Sidebar (Blades)

### 4.1. Inline Styles Removidos

Onze ocorrências de `style="..."` no header migradas para classes CSS:

| Elemento | Style Anterior | Classe Nova |
|----------|---------------|-------------|
| Botão Spotlight | `border-radius: 6px; background-color: #f8f9fa;` | `.cms-search-btn` |
| `<kbd>` | `font-size: 10px; font-family: monospace;` | `.cms-kbd` |
| Link "Ir para Portal" | `border-radius: 6px; ...` | `.cms-portal-btn` |
| Ícone/set do Portal | `color: #6c757d;` | `.text-secondary` (BS5) |
| Botão Contraste | — | `.cms-contrast-btn` |

### 4.2. `aria-current="page"` na Sidebar

Adicionado em quatro níveis de navegação:
- Dashboard (raiz)
- Módulos sem submenu
- Subnível 1 (`$s1Active`)
- Subnível 2 (`$s2['route']`)

### 4.3. `cursor: pointer` Inline → Classe CSS

~30 ocorrências de `cursor: pointer` inline em inputs, labels, cards e temas migradas para `class="cursor-pointer"`.
Removido `style="cursor: pointer;"` dos headers de grupo na sidebar (agora gerenciado por CSS).

---

## 5. Correções em Módulos CMS (~35 views)

### 5.1. Acessibilidade — `scope="col"` em Todas as Tabelas

~70 tags `<th>` em 13 arquivos de index/listagem receberam `scope="col"`:

| Módulo | Arquivo | TH corrigidos |
|--------|---------|---------------|
| Diretoria | `members/index.blade.php` | 7 |
| Diretoria | `bienniums/index.blade.php` | 5 |
| AssocieSe | `leads/index.blade.php` | 6 |
| AssocieSe | `plans/index.blade.php` | 7 |
| FaleConosco | `inbox.blade.php` | 5 |
| História | `index.blade.php` | 5 |
| Notícias | `config/index.blade.php` | 4 |
| Notícias | `categories.blade.php` | 4 |
| TrabalheConosco | `openings/index.blade.php` | 6 |
| TrabalheConosco | `applications/index.blade.php` | 6 |
| Agenda | `index.blade.php` | 6 |
| Feed RSS | `index.blade.php` | 6 |
| Homepage | `index.blade.php` | 6 |

### 5.2. Performance — `loading="lazy"` em Imagens

15 imagens em 12 arquivos receberam `loading="lazy"`:

| Módulo | Arquivos |
|--------|----------|
| Unidade Regional | `index.blade.php`, `edit.blade.php` |
| Associados | `index.blade.php`, `edit.blade.php`, `preview.blade.php` |
| Diretoria | `members/index.blade.php` |
| História | `preview.blade.php` |
| Notícias | `index.blade.php`, `archived.blade.php` |
| Agenda | `index.blade.php` |
| Temas (SLE) | `temas.blade.php`, `tema-cms.blade.php` |
| Logos (SLE) | `logos.blade.php` |

### 5.3. Performance — `defer` em Scripts Externos

| Módulo | Script |
|--------|--------|
| SLE (asset-sidebar) | jQuery 3.7.1 (CDN) |
| Homepage | SortableJS 1.15.0 (CDN) |
| Certificado Digital | pdf.min.js (local) |

### 5.4. CSS — `cursor:` Inline → Classe

~30 ocorrências em 10 arquivos migradas:

| Módulo | Arquivos | Ocorrências |
|--------|----------|-------------|
| SupportConfigs | `modulos.blade.php`, `manutencao.blade.php` | 7 |
| SLE | `asset-card.blade.php`, `temas.blade.php`, `tema-portal.blade.php`, `tema-cms.blade.php` | 16 |
| Mail Audit | `detail.blade.php` | 1 |
| Homepage | `index.blade.php` | 1 |
| BasicPage | `asset-card.blade.php` | 1 |

---

## 6. SRI Placeholder para CDN

Adicionados comentários `integrity` nos links do cropperjs (cdnjs) nos serviços `Gallery` e `Media`.

> **Ação pendente**: Gerar hashes reais com:
> ```bash
> curl -s https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.5.13/cropper.min.js | openssl dgst -sha384 -binary | openssl base64 -A
> ```

---

## Verificações

| Teste | Resultado |
|-------|-----------|
| `nginx -t` | ✅ Syntax OK |
| Headers HTTP (curl) | ✅ 6 headers de segurança presentes |
| PHPUnit V2 Unit (251 testes) | ✅ Mesmo baseline (2 errors pré-existentes não relacionados) |
| Dashboard renderizado | ✅ 143KB, todas as classes no HTML |
| `php -l` CSS | ✅ Sem erros de sintaxe |
| `<th>` sem `scope` nos módulos | ✅ Zero |
| `loading="lazy"` nas imagens CMS | ✅ 100% |
| `defer` nos scripts module-CMS | ✅ 100% |
