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>
262 lines
10 KiB
Markdown
262 lines
10 KiB
Markdown
# 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
|