# Portaria e Alertas TMS — Revisão Visual Implementation Plan

> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.

**Goal:** Aumentar densidade visual da Portaria de Pedidos, adicionar auto-refresh e converter Alertas TMS de link externo para modal inline com UX correta.

**Architecture:** Três arquivos de view são modificados (HTML/CSS/JS), zero mudança de backend. A Portaria compacta células de tabela e remove o botão manual substituindo-o por `setInterval`. O botão GCB dos Alertas TMS troca de `<a target="_blank">` para `<button>` usando `abrirModal()` do Galaxia, e o conteúdo do modal recebe wrapper scroll + compactação de espaçamentos.

**Tech Stack:** PHP (views), Tailwind CSS (utilitários), Bootstrap 5 (modal Alertas TMS), jQuery + Galaxia JS (wiring de modais)

## Global Constraints

- Arquivos de backend (PHP controller, Laboratórios, Sondas) são intocáveis
- JS de aprovação, seleção, animação "nave" e dedup não são alterados
- `window.__refreshPortariaTeste` permanece intacto (apenas adicionamos o timer que o chama)
- Badge/counter de Alertas TMS e seu polling JS ficam inalterados
- Commits frequentes; branch `dev_team`

---

### Task 1: Portaria — Densidade HTML/CSS

**Files:**
- Modify: `componentes/Missoes/Logistica/sinais/Central/html/central_portaria.php`

**Interfaces:**
- Produces: visual compactado visível no browser; sem API changes

- [ ] **Step 1: Compactar CSS — padding-top do modal**

Em `central_portaria.php` linha 70, trocar `padding-top: 100px` por `70px`:

```css
/* ANTES */
#modal-portaria {
    align-items: flex-start !important;
    padding-top: 100px !important;
}

/* DEPOIS */
#modal-portaria {
    align-items: flex-start !important;
    padding-top: 70px !important;
}
```

- [ ] **Step 2: Remover parágrafo descritivo**

Remover as linhas 133–135 inteiras:

```html
<!-- REMOVER ESTE BLOCO COMPLETO -->
        <div class="erro-mensagem text-left mb-4 text-gray-100 text-sm">
            Gerencie os pedidos que estão solicitando entrada no mapa. Selecione e aprove.
        </div>
```

- [ ] **Step 3: Compactar summary cards**

Trocar linha 138 (`mb-4` → `mb-2`) e os dois cards (`p-3` → `p-2`, `text-2xl` → `text-xl`, `text-3xl` → `text-2xl`):

```html
<!-- ANTES -->
        <div class="mb-4 flex gap-4">
            <div class="bg-indigo-900/40 p-3 rounded-lg portaria-card flex-1 flex items-center justify-between">
                <div>
                    <span class="block text-xs uppercase text-white font-bold mb-1">Solicitações</span>
                    <span class="text-2xl font-bold text-white leading-none" id="portaria-total">0</span>
                </div>
                <i class="fas fa-list-ul text-3xl" style="color: #a5b4fc;"></i>
            </div>
            <div class="bg-red-900/40 p-3 rounded-lg portaria-card flex-1 flex items-center justify-between">
                <div>
                    <span class="block text-xs uppercase text-white font-bold mb-1">Com Alertas</span>
                    <span class="text-2xl font-bold text-white leading-none" id="portaria-alertas">0</span>
                </div>
                <i class="fas fa-exclamation-triangle text-3xl" style="color: #fca5a5;"></i>
            </div>
        </div>

<!-- DEPOIS -->
        <div class="mb-2 flex gap-4">
            <div class="bg-indigo-900/40 p-2 rounded-lg portaria-card flex-1 flex items-center justify-between">
                <div>
                    <span class="block text-xs uppercase text-white font-bold mb-1">Solicitações</span>
                    <span class="text-xl font-bold text-white leading-none" id="portaria-total">0</span>
                </div>
                <i class="fas fa-list-ul text-2xl" style="color: #a5b4fc;"></i>
            </div>
            <div class="bg-red-900/40 p-2 rounded-lg portaria-card flex-1 flex items-center justify-between">
                <div>
                    <span class="block text-xs uppercase text-white font-bold mb-1">Com Alertas</span>
                    <span class="text-xl font-bold text-white leading-none" id="portaria-alertas">0</span>
                </div>
                <i class="fas fa-exclamation-triangle text-2xl" style="color: #fca5a5;"></i>
            </div>
        </div>
```

- [ ] **Step 4: Compactar toolbar e corrigir ícone de busca**

```html
<!-- ANTES (linha 156–165) -->
        <div class="flex justify-between items-center mb-3 bg-gray-800/50 p-2 rounded portaria-card">
            <div class="relative w-1/3">
                <input type="text" id="busca-portaria" onkeyup="filtrarPortaria()" placeholder="Buscar..."
                    class="w-full bg-gray-900 rounded px-3 py-1.5 text-white text-sm focus:outline-none pl-8 transition portaria-input">
                <i class="fas fa-search absolute left-2.5 top-2.5 text-white text-xs"></i>
            </div>

<!-- DEPOIS -->
        <div class="flex justify-between items-center mb-2 bg-gray-800/50 p-1.5 rounded portaria-card">
            <div class="relative w-1/3">
                <input type="text" id="busca-portaria" onkeyup="filtrarPortaria()" placeholder="Buscar..."
                    class="w-full bg-gray-900 rounded px-3 py-1.5 text-white text-sm focus:outline-none pl-8 transition portaria-input">
                <i class="fas fa-search absolute left-2.5 top-1/2 -translate-y-1/2 text-white text-xs"></i>
            </div>
```

- [ ] **Step 5: Compactar cabeçalhos da tabela**

Trocar `p-3` → `py-1.5 px-2` em todos os `<th>` (linhas 172–182):

```html
<!-- ANTES -->
                    <tr>
                        <th class="p-3 w-10 text-center bg-gray-800">
                            <input type="checkbox" id="check-todos-portaria" onchange="toggleTodosPortaria()" class="portaria-checkbox">
                        </th>
                        <th class="p-3 text-xs font-bold text-white uppercase tracking-wider bg-gray-800">Pedido</th>
                        <th class="p-3 text-xs font-bold text-white uppercase tracking-wider bg-gray-800">Tipo/Data</th>
                        <th class="p-3 text-xs font-bold text-white uppercase tracking-wider bg-gray-800">Cliente/Cidade</th>
                        <th class="p-3 text-xs font-bold text-white uppercase tracking-wider bg-gray-800 text-center">Aguardando</th>
                        <th class="p-3 text-xs font-bold text-white uppercase tracking-wider bg-gray-800 text-right">Cubagem</th>
                        <th class="p-3 text-xs font-bold text-white uppercase tracking-wider bg-gray-800 text-right">Valor</th>
                        <th class="p-3 text-center bg-gray-800 text-xs font-bold text-white uppercase tracking-wider w-16">Ação</th>
                    </tr>

<!-- DEPOIS -->
                    <tr>
                        <th class="py-1.5 px-2 w-10 text-center bg-gray-800">
                            <input type="checkbox" id="check-todos-portaria" onchange="toggleTodosPortaria()" class="portaria-checkbox">
                        </th>
                        <th class="py-1.5 px-2 text-xs font-bold text-white uppercase tracking-wider bg-gray-800">Pedido</th>
                        <th class="py-1.5 px-2 text-xs font-bold text-white uppercase tracking-wider bg-gray-800">Tipo/Data</th>
                        <th class="py-1.5 px-2 text-xs font-bold text-white uppercase tracking-wider bg-gray-800">Cliente/Cidade</th>
                        <th class="py-1.5 px-2 text-xs font-bold text-white uppercase tracking-wider bg-gray-800 text-center">Aguardando</th>
                        <th class="py-1.5 px-2 text-xs font-bold text-white uppercase tracking-wider bg-gray-800 text-right">Cubagem</th>
                        <th class="py-1.5 px-2 text-xs font-bold text-white uppercase tracking-wider bg-gray-800 text-right">Valor</th>
                        <th class="py-1.5 px-2 text-center bg-gray-800 text-xs font-bold text-white uppercase tracking-wider w-16">Ação</th>
                    </tr>
```

- [ ] **Step 6: Compactar células geradas pelo JS**

Na função `renderizarListaPortaria` (linha ~404), trocar o template literal do `tr.innerHTML`. Localizar a string `<td class="p-3 text-center"><input type="checkbox"` e substituir todo o bloco:

```javascript
// ANTES (dentro de renderizarListaPortaria, tr.innerHTML = ...)
            tr.innerHTML = `
            <td class="p-3 text-center"><input type="checkbox" class="portaria-checkbox" value="${movId}" ${selecionado?'checked':''} onchange="toggleSelecaoPortaria('${movId}')"></td>
            <td class="p-3"><div class="text-sm font-bold text-white">#${numPedido}</div>${tagsHtml?'<div class="mt-1">'+tagsHtml+'</div>':''}</td>
            <td class="p-3 text-xs"><span class="inline-block px-1.5 py-0.5 rounded text-[10px] font-bold mb-1" style="background:${tipoBg};color:${tipoColor};">${tipoPedido}</span><div class="text-gray-300 font-mono text-[11px]">${dataEnvio}</div></td>
            <td class="p-3"><div class="text-sm font-bold text-gray-100 truncate max-w-[160px]" title="${pedido.cliente_nome}">${pedido.cliente_nome||'Cliente'}</div><div class="text-xs text-gray-400">${pedido.cidade_nome||'-'} / ${pedido.estado_uf||'UF'}</div></td>
            <td class="p-3 text-center"><span class="inline-block px-2 py-0.5 rounded text-xs font-mono font-bold" style="background: ${minutosAguardando > 30 ? 'rgba(239,68,68,0.3)' : minutosAguardando > 15 ? 'rgba(245,158,11,0.3)' : 'rgba(34,197,94,0.3)'}; color: #fff;">${tempoLabel}</span></td>
            <td class="p-3 text-right"><span class="inline-block px-2 py-0.5 rounded text-xs font-mono font-bold" style="background:${cubagemCorFundo};color:${cubagemCorTexto};box-shadow:inset 0 0 0 1px ${cubagemCorTexto}40;">${cubagem}</span></td>
            <td class="p-3 text-right text-sm font-mono text-white">${valor}</td>
            <td class="p-3 text-center"><button onclick="event.stopPropagation();acaoAprovarUnico('${movId}')" class="w-7 h-7 rounded-full bg-green-600/20 text-green-400 hover:bg-green-600 hover:text-white transition flex items-center justify-center mx-auto btn-aprovar-unico" title="Aprovar"><i class="fas fa-check text-xs"></i></button></td>`;

// DEPOIS
            tr.innerHTML = `
            <td class="py-1 px-2 text-center"><input type="checkbox" class="portaria-checkbox" value="${movId}" ${selecionado?'checked':''} onchange="toggleSelecaoPortaria('${movId}')"></td>
            <td class="py-1 px-2"><div class="text-xs font-semibold text-white">#${numPedido}</div>${tagsHtml?'<div class="mt-0.5">'+tagsHtml+'</div>':''}</td>
            <td class="py-1 px-2 text-xs"><span class="inline-block px-1.5 py-0.5 rounded text-[10px] font-bold mb-0.5" style="background:${tipoBg};color:${tipoColor};">${tipoPedido}</span><div class="text-gray-300 font-mono text-[11px]">${dataEnvio}</div></td>
            <td class="py-1 px-2"><div class="text-xs text-gray-100 truncate max-w-[160px]" title="${pedido.cliente_nome}">${pedido.cliente_nome||'Cliente'}</div><div class="text-xs text-gray-400">${pedido.cidade_nome||'-'} / ${pedido.estado_uf||'UF'}</div></td>
            <td class="py-1 px-2 text-center"><span class="inline-block px-2 py-0.5 rounded text-xs font-mono font-bold" style="background: ${minutosAguardando > 30 ? 'rgba(239,68,68,0.3)' : minutosAguardando > 15 ? 'rgba(245,158,11,0.3)' : 'rgba(34,197,94,0.3)'}; color: #fff;">${tempoLabel}</span></td>
            <td class="py-1 px-2 text-right"><span class="inline-block px-2 py-0.5 rounded text-xs font-mono font-bold" style="background:${cubagemCorFundo};color:${cubagemCorTexto};box-shadow:inset 0 0 0 1px ${cubagemCorTexto}40;">${cubagem}</span></td>
            <td class="py-1 px-2 text-right text-xs font-mono text-white">${valor}</td>
            <td class="py-1 px-2 text-center"><button onclick="event.stopPropagation();acaoAprovarUnico('${movId}')" class="w-7 h-7 rounded-full bg-green-600/20 text-green-400 hover:bg-green-600 hover:text-white transition flex items-center justify-center mx-auto btn-aprovar-unico" title="Aprovar"><i class="fas fa-check text-xs"></i></button></td>`;
```

- [ ] **Step 7: Verificar visualmente no browser**

Abrir o painel Central e clicar no botão Portaria.
Verificar:
- Linhas da tabela são visivelmente mais compactas (~34px vs ~60px antes)
- Ícone de lupa está centrado verticalmente no input
- Cards de resumo menores (sem `text-2xl`)
- Parágrafo "Gerencie os pedidos..." não aparece mais

- [ ] **Step 8: Commit**

```bash
git add componentes/Missoes/Logistica/sinais/Central/html/central_portaria.php
git commit -m "feat(central): compactar densidade visual da Portaria de Pedidos"
```

---

### Task 2: Portaria — Auto-refresh + Remover botão manual

**Files:**
- Modify: `componentes/Missoes/Logistica/sinais/Central/html/central_portaria.php`

**Interfaces:**
- Consumes: `window.__refreshPortariaTeste` (já definida na mesma view, linha ~765)
- Produces: `window.__portariaRefreshTimer` (global, usado para clearInterval no fechar)

- [ ] **Step 1: Adicionar setInterval em abrirPortaria()**

Localizar a função `abrirPortaria` e adicionar a linha do timer após `carregarDadosPortaria()`:

```javascript
// ANTES
    function abrirPortaria() {
        document.getElementById('modal-portaria').style.display = 'flex';
        document.getElementById('busca-portaria').value = '';
        idsSelecionados.clear();
        carregarDadosPortaria();
    }

// DEPOIS
    function abrirPortaria() {
        document.getElementById('modal-portaria').style.display = 'flex';
        document.getElementById('busca-portaria').value = '';
        idsSelecionados.clear();
        carregarDadosPortaria();
        window.__portariaRefreshTimer = setInterval(window.__refreshPortariaTeste, 30000);
    }
```

- [ ] **Step 2: Adicionar clearInterval em fecharModalPortaria()**

```javascript
// ANTES
    function fecharModalPortaria() {
        document.getElementById('modal-portaria').style.display = 'none';
        idsSelecionados.clear();
        limparFormulario();
    }

// DEPOIS
    function fecharModalPortaria() {
        clearInterval(window.__portariaRefreshTimer);
        document.getElementById('modal-portaria').style.display = 'none';
        idsSelecionados.clear();
        limparFormulario();
    }
```

- [ ] **Step 3: Remover o botão manual de refresh**

Remover as linhas 777–784 inteiras (o elemento `<button id="btn-teste-refresh-portaria">`):

```html
<!-- REMOVER ESTE BLOCO COMPLETO -->
<!-- [TESTE TEMPORÁRIO] Botão manual de refresh da portaria (sem F5). Remover ao trocar pelo timer. -->
<button id="btn-teste-refresh-portaria"
        type="button"
        onclick="window.__refreshPortariaTeste && window.__refreshPortariaTeste()"
        title="Atualizar lista da portaria (teste, sem F5)"
        style="position: fixed; bottom: 16px; left: 16px; z-index: 9999; background: #ea580c; color: #fff; font-weight: 700; font-size: 12px; padding: 8px 12px; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,.3); border: none; cursor: pointer; display: flex; align-items: center; gap: 6px;">
    <i class="fas fa-sync-alt"></i> Atualizar portaria
</button>
```

- [ ] **Step 4: Verificar no browser**

1. Abrir a Portaria; aguardar ~30s; verificar no Network tab do DevTools que uma requisição para `listarPortaria` é disparada automaticamente
2. Fechar a Portaria; aguardar mais 30s; confirmar que **não** há mais requisições automáticas (timer cancelado)
3. Confirmar que o botão laranja "Atualizar portaria" não aparece mais no canto inferior-esquerdo da tela

- [ ] **Step 5: Commit**

```bash
git add componentes/Missoes/Logistica/sinais/Central/html/central_portaria.php
git commit -m "feat(central): substituir botão manual de refresh por setInterval 30s na Portaria"
```

---

### Task 3: Alertas TMS — Wiring do modal + Densidade

**Files:**
- Modify: `componentes/Missoes/Logistica/sinais/Central/html/central.php`
- Modify: `componentes/Missoes/Logistica/sinais/Central/forms/alertas_tms.php`

**Interfaces:**
- Consumes: `Sinal_alertasTms()` em `Central.php` (já existe, linha 310) — retorna HTML via Galaxia
- Consumes: `$galaxia->abrirModal('alertasTms', [])['html']` — gera atributos `data-galaxia-*` para o botão

- [ ] **Step 1: Trocar botão GCB em central.php**

Localizar o bloco do Alertas TMS (linhas 4125–4133) e substituir o `<a>` pelo `<button>`:

```php
<!-- ANTES -->
        <a href="<?= LINK_SISTEMA ?>/admin/?modulos/lancamentos/romaneios/" target="_blank"
           class="gcb-btn relative group" title="Alertas TMS — bloqueios de sync e pedidos cancelados em romaneios ativos">
            <i class="fas fa-exclamation-triangle text-orange-400"></i>
            <span>Alertas TMS</span>
            <span id="gcb-alertas-tms-badge" class="absolute -top-1 -right-1 flex h-4 w-4 hidden" data-total="0">
                <span class="animate-ping absolute inline-flex h-full w-full rounded-full bg-orange-400 opacity-75"></span>
                <span id="gcb-alertas-tms-counter" class="relative inline-flex rounded-full h-4 w-4 bg-orange-500 text-[10px] items-center justify-center font-bold text-white">0</span>
            </span>
        </a>

<!-- DEPOIS -->
        <button type="button" class="gcb-btn relative group"
                <?= $galaxia->abrirModal('alertasTms', [])['html'] ?>
                title="Alertas TMS — bloqueios de sync e pedidos cancelados em romaneios ativos">
            <i class="fas fa-exclamation-triangle text-orange-400"></i>
            <span>Alertas TMS</span>
            <span id="gcb-alertas-tms-badge" class="absolute -top-1 -right-1 flex h-4 w-4 hidden" data-total="0">
                <span class="animate-ping absolute inline-flex h-full w-full rounded-full bg-orange-400 opacity-75"></span>
                <span id="gcb-alertas-tms-counter" class="relative inline-flex rounded-full h-4 w-4 bg-orange-500 text-[10px] items-center justify-center font-bold text-white">0</span>
            </span>
        </button>
```

- [ ] **Step 2: Verificar que o modal abre**

Abrir o painel Central, clicar em "Alertas TMS". O modal `.modal-config` deve abrir com o conteúdo do `forms/alertas_tms.php`. Verificar no Network tab que a requisição vai para o sinal `alertasTms` (não navega para nova aba).

Verificar também: clicar no backdrop fecha o modal; pressionar Escape fecha o modal; o `×` no header fecha o modal.

- [ ] **Step 3: Adicionar wrapper scroll em alertas_tms.php**

Envolver todo o conteúdo PHP (a partir da linha 41, do `<div class="modal-header">` até o `</div>` final na linha 182) em um div scroll container. Adicionar o `<div>` wrapper logo antes de `<div class="modal-header"` e fechar no fim do arquivo:

```php
// ANTES — linha 41:
<div class="modal-header sticky top-0 z-30">

// DEPOIS — inserir wrapper ANTES da linha 41:
<div style="max-height: 82vh; overflow-y: auto; overflow-x: hidden;">
<div class="modal-header sticky top-0 z-30">
```

E no fim do arquivo, após o `</div>` final (linha 182), adicionar o fechamento:

```php
// ANTES — última linha:
</div>

// DEPOIS:
</div>
</div><!-- /scroll-wrapper -->
```

- [ ] **Step 4: Compactar g-modal-conteudo**

Localizar `style="padding:1.25rem 1.5rem;"` e trocar para `style="padding:0.8rem 1rem;"`:

```php
// ANTES (linha 64):
<div class="g-modal-conteudo" style="padding:1.25rem 1.5rem;">

// DEPOIS:
<div class="g-modal-conteudo" style="padding:0.8rem 1rem;">
```

- [ ] **Step 5: Compactar cards de fantasmas**

Localizar o card de fantasma (linha ~96) e reduzir padding + font do título:

```php
// ANTES:
            <div id="curadoria-row-<?= $rpMd5 ?>"
                 style="border-radius:8px;padding:16px 18px;margin-bottom:10px;background:rgba(15,23,42,0.6);border:1px solid rgba(55,65,81,0.45);border-left:3px solid #ef4444;">

                <div style="display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:8px;">
                    <div>
                        <span style="color:#f1f5f9;font-size:1.05rem;font-weight:700;">Pedido #<?= $numPed ?></span>

// DEPOIS:
            <div id="curadoria-row-<?= $rpMd5 ?>"
                 style="border-radius:8px;padding:10px 12px;margin-bottom:10px;background:rgba(15,23,42,0.6);border:1px solid rgba(55,65,81,0.45);border-left:3px solid #ef4444;">

                <div style="display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:8px;">
                    <div>
                        <span style="color:#f1f5f9;font-size:0.88rem;font-weight:600;">Pedido #<?= $numPed ?></span>
```

- [ ] **Step 6: Compactar bloco de guidance de fantasma**

Localizar o `div` de guidance dentro do loop de fantasmas (linha ~111):

```php
// ANTES:
                <div style="border-radius:6px;padding:9px 13px;font-size:0.8rem;line-height:1.55;margin-bottom:14px;background:rgba(127,29,29,0.12);border:1px solid rgba(239,68,68,0.18);color:#fca5a5;">

// DEPOIS:
                <div style="border-radius:6px;padding:6px 10px;font-size:0.8rem;line-height:1.55;margin-bottom:10px;background:rgba(127,29,29,0.12);border:1px solid rgba(239,68,68,0.18);color:#fca5a5;">
```

- [ ] **Step 7: Compactar section header de fantasmas e espaçamento entre seções**

Localizar o `<div style="margin-bottom:<?= count($bloqueios) ? '28px' : '0' ?>;">` (linha ~80) e o `<p>` de título (linha ~82):

```php
// ANTES:
        <div style="margin-bottom:<?= count($bloqueios) ? '28px' : '0' ?>;">
            <p style="font-size:0.72rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;margin:0 0 12px;display:flex;...

// DEPOIS:
        <div style="margin-bottom:<?= count($bloqueios) ? '16px' : '0' ?>;">
            <p style="font-size:0.72rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;margin:0 0 8px;display:flex;...
```

- [ ] **Step 8: Compactar cards de bloqueios**

Localizar o card de bloqueio (linha ~154) e reduzir padding + font do título:

```php
// ANTES:
            <div style="border-radius:8px;padding:16px 18px;margin-bottom:10px;background:rgba(15,23,42,0.6);border:1px solid rgba(55,65,81,0.45);border-left:3px solid #f97316;">

                <div style="display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:6px;">
                    <div>
                        <span style="color:#6b7280;font-size:0.73rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;">Rota TMS </span>
                        <span style="color:#9ca3af;font-size:0.82rem;">#<?= $tmsId ?></span>
                        <?php if ($numPed): ?>
                            <span style="color:#f1f5f9;font-size:1rem;font-weight:700;display:block;margin-top:3px;">Pedido #<?= $numPed ?></span>

// DEPOIS:
            <div style="border-radius:8px;padding:10px 12px;margin-bottom:10px;background:rgba(15,23,42,0.6);border:1px solid rgba(55,65,81,0.45);border-left:3px solid #f97316;">

                <div style="display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:6px;">
                    <div>
                        <span style="color:#6b7280;font-size:0.73rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;">Rota TMS </span>
                        <span style="color:#9ca3af;font-size:0.82rem;">#<?= $tmsId ?></span>
                        <?php if ($numPed): ?>
                            <span style="color:#f1f5f9;font-size:0.88rem;font-weight:600;display:block;margin-top:3px;">Pedido #<?= $numPed ?></span>
```

- [ ] **Step 9: Compactar bloco de guidance de bloqueios**

Localizar o `div` de guidance dentro do loop de bloqueios (linha ~172):

```php
// ANTES:
                <div style="border-radius:6px;padding:9px 13px;font-size:0.8rem;line-height:1.55;background:rgba(124,45,18,0.12);border:1px solid rgba(249,115,22,0.18);color:#fdba74;">

// DEPOIS:
                <div style="border-radius:6px;padding:6px 10px;font-size:0.8rem;line-height:1.55;background:rgba(124,45,18,0.12);border:1px solid rgba(249,115,22,0.18);color:#fdba74;">
```

- [ ] **Step 10: Compactar section header de bloqueios**

Localizar o `<p>` de título da seção de bloqueios (linha ~133):

```php
// ANTES:
            <p style="font-size:0.72rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;margin:0 0 12px;display:flex;align-items:center;gap:8px;color:#fb923c;">

// DEPOIS:
            <p style="font-size:0.72rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;margin:0 0 8px;display:flex;align-items:center;gap:8px;color:#fb923c;">
```

- [ ] **Step 11: Verificar no browser**

Clicar no botão "Alertas TMS" no GCB. Verificar:
1. Modal abre inline (não nova aba)
2. Cards de fantasma e bloqueio mais compactos
3. Com vários alertas: rolar o conteúdo do modal enquanto o header com `×` permanece fixo no topo
4. Clicar fora do modal fecha; Escape fecha; `×` fecha

- [ ] **Step 12: Commit**

```bash
git add componentes/Missoes/Logistica/sinais/Central/html/central.php
git add componentes/Missoes/Logistica/sinais/Central/forms/alertas_tms.php
git commit -m "feat(central): Alertas TMS como modal inline + densidade e scroll UX"
```
