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>
5.3 KiB
Etapa 12 — Sistema de Design e Componentes Base
Contexto do projeto
Continuação do frontend do SeConectai Vendas. A Etapa 11 entregou o projeto Next.js configurado com Tailwind, tokens de design e estrutura de pastas. Nenhum componente de UI reutilizável existe ainda.
Referência obrigatória: seção 6 (tokens) e seção 7 (lista de
componentes) do 10-frontend-schema-arquitetura.md.
Objetivo desta etapa
Construir a biblioteca de componentes base (components/ui/) que será
usada por todas as telas de negócio das próximas etapas. Tudo aqui
deve já nascer responsivo e acessível — as telas de negócio só vão
compor esses componentes, não reimplementar comportamento responsivo
caso a caso.
Tarefas
-
Base a partir do shadcn/ui
- Instalar e configurar shadcn/ui, mas customizar cada componente usado para consumir os tokens do projeto (não deixar cores/spacing hardcoded vindos do template padrão).
- Justificar no código (comentário curto) qualquer componente que fugir do padrão shadcn por necessidade específica do projeto.
-
Componentes a construir (todos em
components/ui/, cada um com suas variantes documentadas via comentário ou arquivo.storiesopcional):- Button: variantes
primary(usa--color-primary),secondary,destructive,ghost; tamanhossm/md/lg; estadoloading(spinner substituindo o label, sem mudar a largura do botão); estadodisabled. - Input / Textarea: com label, texto de ajuda, estado de erro (borda + mensagem), prefixo/sufixo opcional (ex: "R$" para campos de valor).
- Select: nativo estilizado ou baseado em Radix (via shadcn), com busca para listas longas (ex: seleção de cliente/produto).
- DatePicker: seleção de data única e, quando necessário, período (usado nos filtros de dashboard/listagens).
- FormField: wrapper que padroniza label + input + mensagem de erro + texto de ajuda — todo formulário do sistema deve usar esse wrapper, nunca montar label/erro manualmente.
- Table: componente central desta etapa. Recebe colunas e
dados de forma genérica (tipado com generics em TypeScript).
Abaixo do breakpoint
md, renderiza automaticamente como lista de Cards empilhados (cada linha vira um card com pares rótulo:valor, permitindo destacar 1–2 campos principais e colapsar o resto). Suporta: ordenação por coluna, estado de loading (skeleton), estado vazio (usa oEmptyState), paginação integrada. - Modal / Sheet: um único componente que se comporta como modal
centralizado no desktop e como tela cheia (ou bottom sheet, definir
e justificar qual) no mobile, controlado pelo mesmo breakpoint
md. - Toast: sistema de notificação temporária (sucesso, erro, aviso, info), empilhável, com auto-dismiss configurável.
- Badge / StatusPill: variantes semânticas mapeadas para os
status de negócio já existentes no backend (
pendente,pago,atrasado,cancelado,ativo,inadimplente,suspenso,trial,confirmada,concluida,orcamento) — cada status com cor e label em português já resolvidos aqui, para não repetir esse mapeamento em cada tela. - Card: contêiner base usado em dashboards e nas listas responsivas da Table.
- Pagination: controles de página, compatível com os parâmetros de paginação da API do backend.
- EmptyState: ilustração/texto + ação sugerida, usado em toda listagem vazia (ex: "Nenhum cliente cadastrado ainda" + botão "Cadastrar cliente").
- Skeleton: blocos de carregamento reutilizáveis (linha de texto, card, linha de tabela).
- Tabs: navegação em abas (usado, por exemplo, no detalhe de venda: Itens / Parcelas / Histórico).
- Button: variantes
-
Acessibilidade (obrigatório, não opcional)
- Todos os componentes interativos com foco de teclado visível
(
outlinecustomizado com a cor de foco do design system, não o padrão do navegador nemoutline: nonesem substituto). - Componentes baseados em Radix/shadcn já trazem boa parte da semântica ARIA — não remover isso ao customizar.
- Respeitar
prefers-reduced-motionem qualquer transição/animação. - Touch targets mínimos de 44x44px nos componentes interativos.
- Todos os componentes interativos com foco de teclado visível
(
-
Página de showcase
- Criar uma rota de desenvolvimento (ex:
/dev/componentes, não exposta em produção) que renderiza todos os componentes acima com suas variantes, para revisão visual rápida em qualquer breakpoint sem precisar montar uma tela de negócio primeiro.
- Criar uma rota de desenvolvimento (ex:
Critérios de aceite
- Todos os componentes listados existem, tipados em TypeScript, com as variantes descritas
Tablealterna corretamente entre tabela (≥768px) e cards empilhados (<768px) na página de showcaseModal/Sheetalterna corretamente entre modal centralizado (desktop) e tela cheia/bottom sheet (mobile)StatusPillcobre todos os status de negócio listados, com cor e label em português- Navegação por teclado (Tab) percorre todos os componentes interativos da página de showcase com foco visível
- Nenhum componente quebra ou tem overflow horizontal em 375px
- Página de showcase acessível apenas em ambiente de desenvolvimento