# Spec 035-UX — Ligbox Console — Shell unificada

**Criado:** 2026-06-21  
**Solicitado por:** Roger  
**Status:** ✅ Decisões UX fixadas — implementação Fase A (gerente) primeiro  
**URL canónica:** `https://console.ligbox.com.br`  
**Relacionado:** [domain-manager-console-ui.md](./domain-manager-console-ui.md) · [ligbox-system-admin-ui.md](./ligbox-system-admin-ui.md) · Spec **019** (Ops) · Spec **030** (Agentic Ops UI — Mission Board)

---

## 1. Decisões Roger (2026-06-21) — FIXADAS

| # | Decisão | Valor |
|---|---------|-------|
| 1 | Shell visual partilhada | ✅ **Sim** — um design system React para gerente + Admin Ligbox + Ops |
| 2 | URL única de marca | ✅ **`console.ligbox.com.br`** — login detecta role |
| 3 | Ops / chamados Wazuh | ✅ **Dentro do mesmo shell** — secção Operações (Spec 019 integrada) |
| 4 | Tom visual | ✅ **Caloroso BR** — tokens Desk (`styles.css`) + layout Spec **030** |
| 5 | Prioridade Fase A | ✅ **Gerente de domínio (cliente)** primeiro — Admin Ligbox staff depois |
| 6 | Padrões UX | ✅ **Spec 030 Mission Board** — status bar, 3 colunas, cards, contexto |

**Princípio:** FOSS, OpenPanel, Carbonio, Nextcloud **nunca** aparecem como nomes na UI. Só **Ligbox Console** com vocabulário: Email, Files, Plano, Pagamento, Certificação, Operações.

---

## 2. URL única + routing por role

```
https://console.ligbox.com.br
        │
        ├── /login              → detecção role pós-autenticação
        │
        ├── /admin              → Gerente de domínio (Fase A — PRIORIDADE)
        ├── /admin/contas
        ├── /admin/files
        ├── /admin/plano
        └── …
        │
        ├── /ops                → Staff Ligbox — chamados CH-*, Wazuh (Spec 019)
        ├── /ops/ch/:id
        └── …
        │
        ├── /comercial          → Staff Ligbox — preços, catálogo, clientes (Fase C)
        ├── /comercial/precos
        └── …
        │
        └── /me                   → Utilizador email (Fase B — futuro)
```

### Login único — detecção de role

| Credencial | Role detectada | Redirect |
|------------|----------------|----------|
| `admin@{dominio}` + senha | `domain_manager` | `/admin` (contexto domínio) |
| `{user}@{dominio}` + senha | `domain_user` | `/me` ou webmail (Fase B) |
| `@ligbox.com.br` staff + RBAC | `ligbox_staff` | `/ops` ou `/comercial` conforme permissões |
| SSO FOSS pós-compra | `domain_manager` | `/admin?sso=TOKEN` |

**API:** `POST /api/console/login` → JWT com claims `{ role, domain?, permissions[] }`.

### Redirects legacy (Traefik CT114)

| URL antiga | Redirect |
|------------|----------|
| `onboard.ligbox.com.br/admin` | 301 → `console.ligbox.com.br/admin` |
| `onboard.ligbox.com.br/admin/*` | 301 → `console.ligbox.com.br/admin/*` |
| `desk.ligbox.com.br` | 301 → `console.ligbox.com.br/ops` (staff) |
| `desk.ligbox.com.br/admin` | 301 → `console.ligbox.com.br/comercial` |

Manter redirects **mín. 12 meses** — bookmarks e emails antigos.

---

## 3. Shell partilhada — componentes React

**Monorepo proposto:** `ligbox-console-ui/` (VM123 Docker, Spec 019 host)

```
ligbox-console-ui/
├── packages/
│   ├── design-system/     # tokens, Button, Card, Table, Modal, Toast
│   ├── shell/             # AppLayout, Sidebar, Header, CommandPalette
│   ├── domain-admin/      # rotas /admin/*  ← FASE A
│   ├── ligbox-admin/      # rotas /comercial/*
│   ├── ops/               # rotas /ops/*     ← Spec 019
│   └── user-self/         # rotas /me/*      ← Fase B
└── apps/
    └── console/           # Vite + React Router — entry console.ligbox.com.br
```

**Um `AppLayout`** — sidebar e header adaptam-se ao role:

| Elemento | Gerente | Staff Ligbox |
|----------|---------|--------------|
| Logo Ligbox | ✅ | ✅ |
| Selector domínio | ✅ (1 domínio) | ✅ (todos + impersonate) |
| Sidebar items | 6–7 (§4) | 8–10 (§4) |
| Pesquisa global ⌘K | domínio próprio | clientes, domínios, CH-* |
| Avatar / sair | ✅ | ✅ |

---

## 4. Navegação por role (mesma shell, menus diferentes)

### 4.1 Gerente de domínio — `/admin` (Fase A)

| Item sidebar | Rota | Pergunta que responde |
|--------------|------|------------------------|
| 📊 Início | `/admin` | Está tudo bem? |
| 📧 Contas | `/admin/contas` | Quem tem email? |
| 📁 Files | `/admin/files` | Armazenamento e Mail NC |
| 🔐 Certificação | `/admin/certificacao` | Email chega bem? |
| 🌐 Domínio | `/admin/dominio` | DNS correcto? |
| 💳 Plano | `/admin/plano` | Quanto pago? Boleto/PIX |

**Footer atalhos:** Webmail · Files · Suporte

### 4.2 Staff Ligbox — `/comercial` + `/ops`

**Comercial** (`/comercial`):

| Item | Rota |
|------|------|
| 📊 Início | KPIs, fila preços |
| 💰 Planos & preços | catálogo + aprovação Roger |
| 👥 Clientes | pesquisa, estado |
| 🌐 Domínios | todos, health, impersonate → `/admin` |
| 💳 Pagamentos | gateway boleto/PIX |
| ⚙️ Provisionamento | jobs (sem nome OpenPanel) |

**Operações** (`/ops`) — Spec 019 no mesmo shell:

| Item | Rota |
|------|------|
| 📊 Overview | alertas activos |
| 🔍 Discover | eventos correlacionados |
| 🎫 Chamados | `CH-*` hub |
| 🛡️ Segurança | Wazuh deep-link |

Staff com role `ops` vê `/ops`; `commercial` vê `/comercial`; Roger vê **ambos** no mesmo sidebar (secções agrupadas).

---

## 5. Design system — Spec 030 (Mission Board) + tom caloroso BR

Roger (2026-06-21): UX de referência = **Spec 030 Agentic Ops UI** (Mission Board) — **não** Spec 029-tickets-workspace.

### Mapa das specs (para não confundir)

| Spec | Nome | O que é |
|------|------|---------|
| **029-agentic-ops-runbooks** | Backend agentes | API, agentes A0–A7, LLM Ollama, cenários, runbooks |
| **030-agentic-ops-ui** | **Mission Board UI** ✅ | Painel comando: status bar, kanban, cards, context panel |
| 029-tickets-workspace | Motor tickets Desk | KPIs tickets, filas — **spec separada**, não é a referência UX Console |

**Código referência Spec 030 (VM122 / repo):**

```
projects/ops-desk/frontend/assets/
  styles.css           # tokens globais Desk (creme + bordô)
  agentic-ops.js       # Mission Board, Fleet rail, Context panel
  agentic-ops.css      # grid ao-* · componentes ao-incident-card
```

Ver: [specs/030-agentic-ops-ui/spec.md](../../030-agentic-ops-ui/spec.md) · [wireframes.md](../../030-agentic-ops-ui/design/wireframes.md)

### 5.1 Padrões Spec 030 → reutilizar no Console React

| Padrão Spec 030 | O que faz | Aplicar em `/admin` gerente | Aplicar em `/ops` |
|-----------------|-----------|----------------------------|-------------------|
| **Status bar fixa** | Tier, último tick, contagens | Plano · contas · pagamento · certificação | **Reutilizar** overview agentes + tickets |
| **Layout 3 colunas** | Frota \| Board \| Contexto | Nav \| Conteúdo \| Painel detalhe | Mission Board + tickets Spec 019 |
| **Cards por severidade** | Kanban Crítico → OK | Cards contas por estado (activa/suspensa/quota) | Incident cards **já prontos** |
| **1 problema = 1 card** | Deduplicação cenário | 1 conta = 1 card (não duplicar linhas) | Manter dedup `agent_incidents` |
| **Context panel** | Thread + chat ao seleccionar | Quotas, reset senha, atalhos webmail/Files | Thread CH-* + Copiloto A6 |
| **Fleet rail** | Agentes A0–A7 compactos | Sidebar secções (Início, Contas, Files…) | Frota agentes + filtro |
| **Próxima acção no card** | Ack / Abrir / Atribuir | «Criar conta» · «Pagar boleto» | CTAs operador |
| **Poll 30s** | Refresh sem flash | Actualizar quotas / pagamento | Manter |
| **Mobile tabs** | Board \| Frota \| Contexto | Contas \| Plano \| Detalhe | Responsivo |

**Referências UX Spec 030:** Mission Control · Agent Track Dashboard — mission board, inbox, timeline.

### 5.2 Tokens — herdar Desk (`styles.css`) + componentes `ao-*`

Tom **caloroso BR** vem do Desk global; layout **3 colunas** vem da Spec 030:

| Token Desk | Valor | Uso Console |
|------------|-------|-------------|
| `--bg` | `#f5f0e8` | fundo `/admin` gerente |
| `--card` | `#fffdf9` | cards |
| `--accent` | `#5c2e2e` | CTAs (bordô Ligbox) |
| `--sidebar-bg` | `#2e1218` | rail esquerda |
| `--sidebar-active-bar` | `#ff5c8a` | item activo |
| Font | **DM Sans** | global |

**Zona `/ops` agentic:** `agentic-ops.css` (superfície escura scoped) — OK para missões SIEM; gerente `/admin` usa tokens creme.

### 5.3 Padrões UX «banco digital BR» (complemento)

| Padrão | Aplicação Ligbox |
|--------|------------------|
| Cards com ícone + número grande | «12/25 contas», «R$ 549/mês» |
| Linguagem directa PT-BR | «Seu plano» não «Subscription tier» |
| CTAs contrastantes | «Criar conta», «Pagar agora», «Aprovar preço» |
| Feedback imediato | toast verde «Conta criada»; skeleton loading |
| Empty states amigáveis | «Você ainda não tem contas — vamos criar a primeira?» |
| Status chips coloridos | Em dia · Aguardando · Vencido |
| Ilustrações leves (opcional Fase 2) | empty states, onboarding |

### 5.4 `/admin` gerente — wireframe alinhado Spec 030 (3 colunas)

```
┌──────────────────────────────────────────────────────────────────────────┐
│ STATUS BAR · Business · 12/25 contas · Certif. ✅ · Pagamento em dia      │
├──────────┬───────────────────────────────────────────┬───────────────────┤
│ NAV      │  CONTAS (cards)                           │ CONTEXTO          │
│ Início   │  ┌─────────────────┐ ┌─────────────────┐│ vendas@           │
│ Contas   │  │ vendas@  activa   │ │ suporte@ activa ││ Quota mail 30GB   │
│ Files    │  │ 30GB · Files ✅   │ │ 20GB · Files ✅ ││ [Reset senha]     │
│ Plano    │  └─────────────────┘ └─────────────────┘│ [Abrir webmail]   │
│ …        │  [+ Nova conta]                          │                   │
└──────────┴───────────────────────────────────────────┴───────────────────┘
```

Mesma lógica Spec 030: **seleccionar card → painel contexto à direita**.

### 5.5 O que evitar

- Jargon técnico (FOSS, OpenPanel, webhook, VM)
- Cinza corporativo frio estilo enterprise US
- Sidebars com 15+ itens
- Modais em cascata
- Tabelas sem acção inline

---

## 6. Orquestração invisível — padrão UI

Toda acção multi-backend mostra **um fluxo Ligbox**:

```
[ Criar conta ]  →  barra progresso «Criando sua conta…»
                 →  ✅ «Pronto! vendas@empresa.com.br»
                 →  atalhos: Abrir webmail · Abrir Files
```

Erro: mensagem humana + botão «Tentar novamente» ou «Falar com suporte». Log técnico só em `/ops` (staff).

---

## 7. Fases de implementação UI

| Fase | Entrega | Prioridade |
|------|---------|------------|
| **UX-0** | Design tokens + `AppLayout` + login role routing | P0 |
| **UX-A0** | Portar layout Spec 030 (status bar + 3 colunas + cards) | P0 |
| **UX-A** | **`/admin` gerente completo** (Roger: primeiro) | **P0** |
| UX-A1 | Início — status bar + nav rail (Spec 030) | P0 |
| UX-A2 | CRUD contas + quotas | P0 |
| UX-A3 | Files + toggle Mail NC | P1 |
| UX-A4 | Certificação + Plano/boleto PIX | P1 |
| **UX-B** | `/comercial` Admin Ligbox (preços, clientes) | P1 |
| **UX-C** | `/ops` — migrar **Spec 030 Mission Board** + tickets/chamados Spec 019 | P1 |
| **UX-D** | `/me` utilizador (Fase B) | P2 |

**Deploy:** VM123 Docker (`ligbox-console` container), Traefik `console.ligbox.com.br` → VM123.

**Motor API:** VM122 Desk + VM112 Wizard (inalterado — só UI unifica).

---

## 8. Impersonate (staff → gerente)

Staff clica «Entrar como gerente» num domínio:

```
/comercial/dominios/empresa.com.br  →  [ Entrar como gerente ]
  → JWT impersonate (audit Spec 027)
  → /admin?impersonate=1&domain=empresa.com.br
  → mesma UI gerente + banner amarelo «Modo suporte Ligbox»
```

Gerente **nunca** vê este modo — só staff.

---

## 9. Relacionados

| Doc | Conteúdo |
|-----|----------|
| [domain-manager-console-ui.md](./domain-manager-console-ui.md) | Detalhe secções `/admin` |
| [034-console-process-ui.md](../034-nextcloud-carbonio-vm112-integration/034-console-process-ui.md) | Processos Carbonio + Files no Console |
| [ligbox-system-admin-ui.md](./ligbox-system-admin-ui.md) | Detalhe `/comercial` |
| Spec **019** | Motor `/ops` — UI migra para shell partilhada |
| [user-self-service-ui.md](./user-self-service-ui.md) | Futuro `/me` |

---

## 10. Critérios de aceite shell

- [ ] Um login em `console.ligbox.com.br` — roles distintos, mesma marca
- [ ] Gerente não vê menus staff; staff vê `/admin` via impersonate
- [ ] Zero ocorrência «FOSS» ou «OpenPanel» na UI gerente
- [ ] `onboard.ligbox.com.br/admin` redirect 301 funcional
- [ ] Ops `/ops` no mesmo header/logo que `/admin`
- [ ] Lighthouse acessibilidade ≥ 90 na rota `/admin`
