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>
4.1 KiB
Etapa 11 — Setup do Projeto Frontend
Contexto do projeto
Estou construindo o frontend do SeConectai Vendas — CRM/vendas
multi-tenant. O backend (API REST em NestJS) já está pronto, seguindo o
schema e as etapas descritas em documentos separados. O frontend consome
essa API e tem duas áreas: painel master (/master) e painel
tenant (/app).
A arquitetura completa (rotas, breakpoints, tokens de design, estrutura
de pastas) está definida no arquivo 10-frontend-schema-arquitetura.md
— use esse arquivo como fonte de verdade para tudo que for construído
nesta e nas próximas etapas.
Esta é a Etapa 1 de 9 do frontend (numerada como Etapa 11 no conjunto geral do projeto, para não colidir com as 8 etapas do backend). Aqui é só a fundação — nenhuma tela de negócio ainda.
Objetivo desta etapa
Inicializar o projeto Next.js com toda a configuração base: Tailwind com os tokens de design do schema, estrutura de pastas, variáveis de ambiente, lint/format, e uma página inicial validando a conexão com a API do backend.
Tarefas
-
Inicialização do projeto
- Next.js 14+ com App Router, TypeScript, ESLint já integrado.
- Configurar Tailwind CSS.
- Configurar Prettier + regra de integração com ESLint (sem conflito de formatação).
-
Tokens de design
- Criar
styles/tokens.csscom todas as CSS variables definidas na seção 6 do schema (--neutral-*,--surface,--danger,--success,--warning,--brand-master,--brand-master-accent,--color-primarycom fallback#2563EB). - Configurar
tailwind.config.tspara expor essas variáveis como cores utilitárias (ex:bg-primary,text-danger), em vez de usarvar(--...)espalhado pelo código. - Configurar fonte (Inter ou equivalente definida no schema), incluindo
font-variant-numeric: tabular-numsdisponível como classe utilitária para colunas de valores monetários.
- Criar
-
Estrutura de pastas
- Criar exatamente a estrutura de pastas da seção 9 do schema:
app/(public)/,app/master/,app/app/,components/ui/,components/layout/,components/domain/,lib/api/,lib/auth/,lib/theme/,lib/validators/,hooks/,styles/. - Cada pasta de rota deve existir com um
page.tsxplaceholder (ex: "Em construção — Etapa X") para validar que o roteamento do mapa de rotas inteiro já resolve sem erro 404, mesmo antes das telas reais existirem.
- Criar exatamente a estrutura de pastas da seção 9 do schema:
-
Variáveis de ambiente e cliente HTTP base
.env.local.examplecomNEXT_PUBLIC_API_URLe demais chaves que forem necessárias.- Criar
lib/api/client.ts: wrapper mínimo sobrefetch(ou axios, justificar a escolha) com base URL configurável, tratamento de erro padronizado (parse de erro da API em formato consistente), e um ponto único de onde o interceptor de refresh token será plugado na Etapa 13 (deixar o gancho pronto, sem implementar auth ainda).
-
Página de diagnóstico
- Uma rota simples (ex:
/diagnostico, pode ser removida depois) que chamaGET /healthdo backend e mostra o resultado — só para confirmar que a integração frontend↔backend está funcionando de ponta a ponta antes de seguir.
- Uma rota simples (ex:
-
Qualidade
- Scripts no
package.json:dev,build,start,lint,format. - Configurar Husky + lint-staged (ou equivalente) para rodar lint no pre-commit, se fizer sentido para o fluxo do projeto.
- Scripts no
Critérios de aceite
npm run devsobe o projeto sem erro- Todas as rotas do mapa de rotas (seção 4 do schema) resolvem, com página placeholder, sem 404
tokens.csscontém todas as variáveis do schema, aplicadas corretamente (inspecionar no DevTools que os valores computados batem)- Classes utilitárias do Tailwind (
bg-primary,text-dangeretc) funcionam e refletem os tokens /diagnosticomostra o retorno real deGET /healthdo backend (com o backend rodando local)npm run lintroda sem erro- Estrutura de pastas idêntica à definida na seção 9 do schema de frontend