ligbox-ops-platform/specs/033-desk-infra-console-ui/spec.md
Ligbox Spec Hub 68ec7bc901 Standardize Infra process cards with uniform grid and detail modals.
Adopt proc-card pattern (fixed min-height, icons, spec labels, 2-line desc) per UX research; move purge forms and rich content to infra-process-modal; document catalog in Spec 033.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-19 22:33:29 +00:00

141 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Spec 033 — Desk Infra Console UI (process cards)
**Criado:** 2026-06-19
**Actualizado:** 2026-06-19 (padronização `proc-card`)
**Solicitado por:** Roger
**Prioridade:** P2 (UX operacional)
**Status:** ✅ Implementado (Desk VM122 frontend)
**Sistema:** Desk VM122 · menu **Infraestrutura** (`view-infra`)
**Relacionado:** Spec **028** (OpenPanel API) · Spec **032** (códigos purge) · Spec **002** (Wazuh) · módulo `infra` (015)
---
## Resumo
Página **Infraestrutura** do Desk com **process cards** uniformes (`proc-card`): mesmo tamanho, tipografia, ícone, badge de status e acções no rodapé. Conteúdo rico (métricas, formulários, JSON) abre em **modal largo** (`#infra-process-modal`).
**Motivo:** painéis `ws-panel` de alturas variadas quebravam o alinhamento visual; inputs inline (purge) inflavam cards.
---
## Referência de design (pesquisa)
Padrões adoptados de boas práticas de UI card (Material UI equal-height, UX Collective, CSS Grid auto-fill):
| Regra | Valor Desk |
|-------|------------|
| Grid | `repeat(auto-fill, minmax(220px, 1fr))` · gap **16px** (sistema 8pt) |
| Altura mínima card | **168px** · `flex-column` + `justify` implícito via footer |
| Padding card | **16px** |
| Título | **0.88rem** · weight 600 |
| Spec label | **0.62rem** uppercase · letter-spacing 0.05em |
| Descrição | **0.75rem** · **2 linhas** (`line-clamp: 2`) |
| Ícone | **32×32px** · fundo pastel por accent |
| Badge status | canto superior direito · classes `badge` existentes |
| Inputs / tabelas / JSON | **modal** `modal-panel-lg` — nunca no card |
| Testes (webhook, OpenPanel) | botão rápido no card **ou** no modal · resultado em `#soc-test-modal` |
**Alinhamento igual altura:** grid `align-items: stretch` + `min-height` fixo no card (não aspect-ratio — conteúdo operacional, não media).
---
## Onde na UI
| Menu Desk | View ID | Render |
|-------------|---------|--------|
| Infraestrutura | `view-infra` | `renderInfra()` em `frontend/assets/app.js` |
**Não** cobre Infra 2 / SOC visual (`view-infra2` → `renderInfra2()`).
---
## Catálogo de process cards (Infra)
| ID | Ícone | Título | Spec label | Accent | Status | Acções card |
|----|-------|--------|------------|--------|--------|-------------|
| `soc` | 📡 | SOC VM112 | Webhook | teal | `health.status` | Detalhes · Testar |
| `openpanel` | 🎛️ | OpenPanel API | Spec 028 | orange | online/check | Detalhes · Testar |
| `purge` | 🔐 | Códigos purge | Spec 032 | rose | N domínios | Gerir códigos → modal |
| `vm112` | 🌐 | VM112 Onboard | Portal | aqua | online/check | Ver status |
| `wazuh` | 🛡️ | Wazuh SOC | Spec 002 | slate | online/check | Ver status |
| `integrations` | 🔗 | Integrações | JSON | violet | activas | Ver JSON |
Mapa de ícones: constante `PROC_CARD_ICONS` em `app.js`.
---
## Modais
| Modal | Uso |
|-------|-----|
| `#infra-process-modal` | Detalhes, formulário purge, JSON integrações |
| `#soc-test-modal` | Resultado testes webhook / OpenPanel multidomínio |
Funções: `openInfraProcessModal()`, `openInfraProcessDetail(procId)`, `closeInfraProcessModal()`, `bindInfraProcessModal()`.
Snapshot API: `state.infraSnapshot` (reutilizado ao abrir detalhe sem re-fetch).
---
## APIs consumidas
| Endpoint | Uso |
|----------|-----|
| `GET /api/v1/infra/vm112/status` | Card VM112 + modal |
| `GET /api/v1/infra/wazuh/status` | Card Wazuh + modal |
| `GET /api/v1/integrations` | Card + modal JSON |
| `GET /api/v1/integrations/health` | Card SOC + modal |
| `GET /api/v1/vm123/health` | Card OpenPanel + modal |
| `GET /api/v1/infra/purge-auth-domains` | Card purge + modal |
| `GET/POST /api/v1/infra/purge-auth-codes` | Modal purge (Spec 032) |
| `POST /api/v1/vm123/openpanel/test-confirm` | Teste OpenPanel |
---
## CSS (`frontend/assets/styles.css`)
Classes **proc-card** (padrão reutilizável em outras páginas):
- `.proc-grid`, `.proc-card`, `.proc-card--{teal|orange|rose|slate|violet|aqua}`
- `.proc-card-head`, `.proc-card-icon`, `.proc-card-spec`, `.proc-card-badge`
- `.proc-card-title`, `.proc-card-desc`, `.proc-card-foot`
Helpers Infra (modais): `.infra-kv`, `.infra-actions`, `.infra-hint`, `.purge-auth-form`
Helper JS: `procCardHtml(opts)` — gera HTML uniforme.
---
## Ficheiros
| Ficheiro | Função |
|----------|--------|
| `frontend/assets/app.js` | `renderInfra()`, `procCardHtml()`, modais Infra |
| `frontend/assets/styles.css` | `.proc-card` + Infra |
| `frontend/index.html` | `#infra-content`, `#infra-process-modal` |
---
## Critérios de aceitação
1. Grid com **6 cards** de **mesma altura mínima** e alinhamento visual.
2. Cada card: ícone + spec label + título + descrição (2 linhas) + badge + acções.
3. Purge: formulário e tabela **só no modal** «Gerir códigos».
4. OpenPanel / SOC: teste rápido no card; detalhes no modal.
5. Responsivo: 1 coluna em mobile (`max-width: 480px`).
---
## Extensão futura
O sistema `proc-card` pode ser adoptado em **Serviços** (substituir `servicos-tile` gradualmente) e **Dashboard** — manter o mesmo catálogo de accents e ícones.
---
## Conclusão
**Spec 033** = layout e padronização visual da Infra. Funcionalidades:
- OpenPanel → **Spec 028**
- Códigos purge → **Spec 032**
- Webhook SOC → health integrations / Spec **001**