Files
SeConectai_Vendas/Etapas/V2/10-frontend-schema-arquitetura.md
T
tiagoandClaude Sonnet 5 323912748f Frontend completo (Etapas 11-18) e extensões de backend (Etapas 13 e 18)
Adiciona o frontend Next.js em frontend/ (setup, design system,
autenticação/tema, layout/navegação, área master, área tenant completa:
clientes, produtos, vendas, recebimentos, whatsapp, e-mail, alertas,
equipe e perfil). Estende o backend de forma aditiva e autorizada:
cookie httpOnly para refresh token (Etapa 13) e CRUD de equipe +
edição de perfil do tenant (Etapa 18, módulo src/modules/equipe/ novo
e PUT /tenant/perfil). Detalhes completos em Etapas/V2/*.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-16 09:41:13 -03:00

262 lines
10 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.
# SeConectai Vendas — Schema de Frontend (Web Responsivo)
Este documento define a arquitetura do frontend que vai consumir a API
já especificada nas etapas 1–8. Cobre estrutura de telas, navegação,
sistema de design e a estratégia de responsividade para funcionar bem
tanto em tela de PC quanto em smartphone.
## 1. Visão geral
Uma única aplicação, com duas áreas autenticadas separadas:
- **Área master** (`/master/...`) — seu painel, gestão dos tenants.
- **Área tenant** (`/app/...`) — painel que seus clientes usam no dia a
dia (vendas, clientes, produtos, alertas).
Ambas consomem a mesma API REST do backend. O layout de cada área é
diferente (menu, cores, permissões), mas compartilham o mesmo sistema de
design (componentes, tokens, grid responsivo).
## 2. Stack sugerida
- **Next.js 14+ (App Router)** + React 18 + TypeScript
- **Tailwind CSS** para estilos utilitários, com tokens de design via
CSS variables (necessário para o whitelabel: cor primária muda por
tenant em tempo de execução, não pode ser fixa no build)
- **shadcn/ui** como base de componentes acessíveis, customizados por
cima (não usar como está "fora da caixa" — ajustar aos tokens do
projeto)
- **TanStack Query (React Query)** para cache/estado de dados vindos da
API (listagens, dashboards)
- **React Hook Form + Zod** para formulários e validação — os schemas
Zod devem espelhar os DTOs do backend
- **Recharts** para os gráficos de dashboard (resumo de vendas etc)
- Estado de UI leve (sidebar aberta/fechada, tema) via Context/Zustand —
não precisa de Redux para este escopo
## 3. Estratégia de responsividade
Mobile-first. Breakpoints (padrão Tailwind, manter):
| Breakpoint | Largura | Uso principal |
|------------|-----------|----------------|
| base | < 640px | smartphone |
| `sm` | ≥ 640px | smartphone grande / phablet |
| `md` | ≥ 768px | tablet |
| `lg` | ≥ 1024px | desktop |
| `xl` | ≥ 1280px | desktop grande |
Regras de layout por faixa:
- **Desktop (`lg` e acima):** sidebar fixa lateral (~240px) + topbar.
Conteúdo em grid de 2 colunas quando fizer sentido (ex: formulário +
resumo lateral).
- **Tablet (`md`):** sidebar colapsada só com ícones (expande em hover
ou toque), conteúdo em coluna única ou 2 colunas conforme espaço.
- **Mobile (abaixo de `md`):**
- Sidebar vira **drawer** (menu lateral que desliza, acionado por
ícone de hambúrguer na topbar).
- **Bottom tab bar fixa** com os 4–5 itens mais usados de cada área
(ex. no tenant: Dashboard, Clientes, Vendas, Recebimentos, Mais).
- Tabelas **não** fazem scroll horizontal como solução padrão — cada
linha vira um **card empilhado** (rótulo: valor), com as
informações mais importantes em destaque e as secundárias
colapsadas/expansíveis.
- Formulários em coluna única; campos grandes o suficiente para touch
(mínimo 44x44px de área de toque).
- Modais viram **tela cheia** ou **bottom sheet** (desliza de baixo),
nunca uma caixa pequena centralizada como no desktop.
- Filtros de listagem (que no desktop ficam visíveis lateralmente)
viram um botão "Filtros" que abre um bottom sheet no mobile.
Checklist de teste obrigatório em **toda** tela construída: 375px
(mobile pequeno), 768px (tablet) e 1280px (desktop), sem scroll
horizontal indevido em nenhuma delas.
## 4. Mapa de rotas
### Público (sem autenticação)
```
/login → detecta master ou tenant pelo e-mail/domínio
/esqueci-senha
/redefinir-senha/:token
```
### Área master — `/master`
```
/master/dashboard
/master/tenants (lista)
/master/tenants/novo
/master/tenants/:id (detalhe, edição, faturas do tenant)
/master/planos
/master/faturas (visão consolidada de todas as mensalidades)
/master/evolution-config
/master/alertas/templates
/master/alertas/logs
/master/configuracoes (perfil do admin master, senha, MFA)
```
### Área tenant — `/app`
```
/app/dashboard
/app/clientes (lista)
/app/clientes/novo
/app/clientes/:id (detalhe, contatos, histórico de vendas)
/app/produtos (produtos e serviços)
/app/produtos/novo
/app/produtos/:id
/app/vendas (lista)
/app/vendas/nova
/app/vendas/:id (detalhe, itens, parcelas)
/app/recebimentos (contas a receber, marcar pago)
/app/whatsapp (instâncias Evolution, QR code, status)
/app/email-config
/app/alertas/templates
/app/alertas/logs
/app/equipe (usuários do tenant, só para tenant_admin)
/app/perfil (logo, cor, dados da empresa)
```
## 5. Navegação e layout por área
**Desktop:**
- Sidebar: logo do tenant (ou logo master) no topo, itens de menu com
ícone + label, indicador do item ativo, avatar do usuário + logout no
rodapé.
- Topbar: breadcrumb da página atual, sino de notificações (alertas
recentes), busca rápida (clientes/vendas).
**Mobile:**
- Topbar fixa: logo compacta (só o símbolo, não o nome completo) +
ícone de menu (drawer) + sino de notificações.
- Drawer: réplica do menu completo da sidebar desktop, ocupa a tela
inteira ou 80% da largura.
- Bottom tab bar: 4 itens fixos mais "Mais" (que abre o restante do
menu). Ícone + label curto embaixo.
## 6. Sistema de design (tokens)
Paleta **neutra da plataforma** (usada em textos, fundos, bordas —
igual em master e em todos os tenants):
- `--neutral-950: #12141A` — texto principal
- `--neutral-500: #6B7280` — texto secundário
- `--neutral-200: #E5E7EB` — bordas
- `--neutral-50: #F8F9FB` — fundo de página
- `--surface: #FFFFFF` — fundo de cards/painéis
- `--danger: #DC2626` — erros, valores atrasados
- `--success: #16A34A` — pagos, confirmados
- `--warning: #D97706` — pendências, avisos
Cor de marca **do painel master** (fixa, identidade do SeConectai
Vendas): `--brand-master: #1E3A5F` (azul petróleo escuro) com acento
`--brand-master-accent: #2DD4BF` (verde-água) — usada apenas na área
`/master`.
Cor de marca **de cada tenant** (dinâmica, whitelabel): variável
`--color-primary`, resolvida em runtime a partir de
`tenants.cor_primaria` (endpoint público de tema, já definido na Etapa
8 do backend) e aplicada via CSS variable no layout de `/app`. Se o
tenant não definiu cor própria, cair para um azul neutro padrão
(`#2563EB`). Validar contraste mínimo (WCAG AA) contra branco antes de
aplicar — se a cor escolhida pelo tenant não passar, usar uma versão
escurecida automaticamente para texto sobre fundo colorido.
Tipografia: uma família para UI (ex: Inter ou similar, boa legibilidade
em telas pequenas e números tabulares para valores monetários) e uso de
`font-variant-numeric: tabular-nums` em qualquer coluna de valores para
alinhamento visual em tabelas/cards.
## 7. Componentes de design system (biblioteca a construir)
Base (`components/ui/`): Button, Input, Select, DatePicker, Textarea,
Table (com variante que vira lista de Cards abaixo do breakpoint `md`),
Modal/Sheet (adaptável tela-cheia no mobile), Toast, Badge/StatusPill
(para status de fatura/parcela/venda), Card, Pagination, EmptyState,
Skeleton (loading), Tabs, FormField (wrapper de label+erro+input).
Layout (`components/layout/`): Sidebar, Topbar, Drawer, BottomTabBar,
Breadcrumb.
Domínio (`components/domain/`): ClienteCard, VendaForm, ParcelaRow,
ProdutoForm, StatusFaturaBadge, ResumoVendasChart, InstanciaWhatsappCard.
## 8. Dados e autenticação no client
- **TanStack Query** para toda chamada de leitura (listagens,
dashboards, detalhes), com invalidação automática após mutations
(criar/editar/excluir).
- **Zod schemas** espelhando os DTOs do backend — usados tanto na
validação de formulário quanto na tipagem das respostas da API (fonte
única de verdade dos tipos no frontend).
- **Access token em memória** (não em `localStorage`, para reduzir
superfície de XSS); **refresh token em cookie `httpOnly`**, setado
pelo backend. Interceptor de requisição renova o access token
automaticamente em caso de 401 e repete a chamada original.
- **Middleware do Next.js** protegendo `/master/*` e `/app/*`,
verificando sessão válida antes de renderizar a página (evita "flash"
de conteúdo protegido).
- Tema (cor primária + logo) resolvido no login: chama o endpoint
público de tema com o identificador do tenant, aplica as CSS
variables antes mesmo do usuário autenticar (tela de login já com a
cara do tenant certo).
## 9. Estrutura de pastas sugerida
```
frontend/
├── app/
│ ├── (public)/
│ │ ├── login/
│ │ ├── esqueci-senha/
│ │ └── redefinir-senha/[token]/
│ ├── master/
│ │ ├── layout.tsx
│ │ ├── dashboard/
│ │ ├── tenants/
│ │ ├── planos/
│ │ ├── faturas/
│ │ ├── evolution-config/
│ │ └── alertas/
│ └── app/
│ ├── layout.tsx
│ ├── dashboard/
│ ├── clientes/
│ ├── produtos/
│ ├── vendas/
│ ├── recebimentos/
│ ├── whatsapp/
│ ├── email-config/
│ ├── alertas/
│ ├── equipe/
│ └── perfil/
├── components/
│ ├── ui/
│ ├── layout/
│ └── domain/
├── lib/
│ ├── api/ (client HTTP + funções por domínio)
│ ├── auth/
│ ├── theme/
│ └── validators/ (schemas Zod)
├── hooks/
└── styles/
└── tokens.css (CSS variables da paleta e tipografia)
```
## 10. Checklist de responsividade (aplicar em toda tela nova)
- [ ] Testado em 375px, 768px e 1280px sem overflow horizontal indevido
- [ ] Tabelas de listagem viram cards empilhados abaixo de `md`
- [ ] Navegação principal acessível via bottom tab bar ou drawer no mobile
- [ ] Touch targets ≥ 44x44px em elementos interativos no mobile
- [ ] Formulário utilizável com teclado virtual aberto (campo em foco
não fica escondido atrás do teclado)
- [ ] Modais/diálogos viram tela cheia ou bottom sheet no mobile
- [ ] Cor primária dinâmica do tenant aplicada corretamente em
botões/links/destaques, com contraste validado
- [ ] Foco de teclado visível em todos os elementos interativos
(acessibilidade, não só mobile)
- [ ] Estados de carregamento (skeleton) e vazio (empty state) tratados
em toda listagem