EcomSmart Hub · guia para o programador frontend

Frontend por módulo: o que construir, como e por quê

Navegação, shell, padrão de módulo em cinco abas, estrutura conversacional do assistente, detalhe dos cinco módulos com componentes a reaproveitar e critérios de aceite. Companheiro do protótipo v3 e da identidade v2.4.

Versão 1 · 12/09/2026Angular 21 · standalone · signalsPrecedência: identidade → este guia → protótipo

Este guia diz o que construir, como e por quê. O protótipo mostra a tela; aqui está a razão de cada decisão, para que o dev resolva sozinho o que o protótipo não cobre. Quando houver conflito, vale: identidade v2.4 (skill identidade-ecomsmart) → este guia → protótipo.

1. Princípios de UX que governam tudo

  1. Um modelo mental para os cinco módulos. Todo módulo tem as mesmas cinco abas na mesma ordem (Dashboard, Configurar, Mensagens, Histórico, Assistente). O lojista aprende uma vez. Custo: um pouco de repetição de código; ganho: zero curva de aprendizado ao ativar o segundo módulo, que é exatamente o momento da venda.
  2. Duas portas para a mesma configuração. Formulário em cards numerados e conversa com o assistente escrevem no mesmo modelo (ConfigModulo). O lojista que gosta de controle usa o formulário; o que tem pressa conversa. Nunca são dois sistemas: alterar num lado aparece no outro.
  3. Nada é enviado sem confirmação explícita. O assistente executa leitura na hora (contar público, simular) e mostra a escrita como proposta num card; só o clique em "Confirmar" executa. É a regra que permite dar poder ao assistente sem medo.
  4. Módulo bloqueado é visível, não escondido. Aparece no menu com cadeado, abre a prévia desfocada com um argumento real da base. Esconder mata o upsell e gera a pergunta "onde está o RFV?".
  5. Estado em forma, não só em cor. Pílula, ponto, cadeado, borda esquerda. Cor semântica (verde, âmbar, vermelho) é reforço. Acessível e legível em tema escuro.
  6. O dado é o destaque. KPIs em Figtree 700 tabular; azul quando é dinheiro ou taxa de resultado. Nada mais é azul além de ações e dados.
  7. Mobile é primeira classe, não adaptação. Barra inferior fixa, uma decisão por tela, tabelas viram cards, assistente em folha inferior, abas roláveis. Layouts são desenhados para 390 px e crescem, não o contrário.
  8. Backend é a fonte de verdade de gating, mensagens e limiares. Guards e textos no front só melhoram UX. Se o backend diz alerta: true, a tela mostra alerta; ela não recompara números.

2. Arquitetura de navegação

Três áreas, três layouts, três bundles lazy:

ÁreaLayoutRotasQuem vê
Públicopublic-layout (header marketing + rodapé em bloco)/lp/:slug, /cadastro, /login, /precosanônimo
Onboardingonboarding-layout (barra de passos, sem menu, fundo Névoa)/onboarding/:passo (empresa, modulos, pagamento, whatsapp, loja, pronto)logado, Empresa.onboarding.concluido = false
Appapp-shell (sidebar navy no web · barra inferior no mobile)/app, /app/modulos, /app/m/:modulo/:aba, /app/m/:modulo/ativar, /app/assistente, `/app/conta/(assinaturamcpconfiguracoes), /app/base/(clientespedidosprodutosrfv)`logado

Regras:

3. Shell do app

Web: sidebar 232 px, navy #0B1033, item ativo com 12 % de branco, seções Meus módulos (5 itens com ponto colorido; bloqueado com opacidade 55 % e cadeado à direita; trial com etiqueta âmbar), Minha base, Conta. Header branco com nome da empresa, pílula de canal (WhatsApp Oficial · conectado, verde só aqui), medidor de mensagens do ciclo (3.240 / 10.000 + barra), etiqueta de trial e avatar.

Mobile: header de 52 px (logo ou "‹ Módulo"), conteúdo, barra inferior de 4 itens com ícone em linha 22 px e rótulo 10,5 px. O medidor de mensagens fica no header em texto pequeno.

Assistente: no web, painel fixo de 360 px à direita em toda tela de módulo (não é modal, não sobrepõe); no mobile, botão "Abrir assistente" no card e tela própria (aba Assistente). Mesmo componente <hub-assistente> nos dois.

Tema: claro por padrão, escuro por escolha (data-theme), tokens da identidade. Toda tela é testada nos dois.

4. O padrão de módulo (modulo-shell)

Componente único que recebe ModuloDef e renderiza cabeçalho + abas + <router-outlet> da aba. As abas são componentes por módulo que implementam uma interface comum.

AbaPropósitoConteúdo fixoPor quê
Dashboardresponder "está funcionando e quanto rende?" em 5 segundos4 KPIs · card "Configuração atual" (4 linhas + Editar) · funil de 4 etapas · gráfico mensal monocromático · painel do assistente (web)KPI primeiro porque é a promessa do produto; a configuração resumida evita ir à aba Configurar só para conferir
Configuraralterar com controle e revisãocards numerados na ordem: Nome → Canal → Mensagem → Regra → Agendamento → Revisão (módulos sem campanha adaptam, ver §6) · faixa "Prefere conversar?" no topo · prévia e impacto à direitacards numerados dão sensação de progresso e evitam formulário infinito; a Revisão com variáveis do template evita disparo com {{2}} sem fonte
Mensagensgerir templates e qualidade do canalrating do número no topo · tabela (nome, categoria Meta, status, "usar em", nota) · variáveis · classificação · erros recentesrating do número é o que antecede queda de entrega; nota do template quase sempre UNKNOWN e não é alarme
Históricoauditar e provar receitachips de filtro · alerta de saúde (15 dias) · lista/tabela (quando, quem, o quê, status, resultado) · detalhe por linhareceita atribuída por vínculo ou janela é o argumento de renovação; o detalhe com payload e código da Meta é o que suporte precisa
Assistente ✦criar e alterar conversandochat com passos · opções prontas · cards de leitura · prévia WhatsApp · card de confirmação · resumo em construção (web)é o diferencial do produto e o caminho mais curto para o lojista sem tempo

Cabeçalho do módulo: breadcrumb, ícone com cor do módulo (único lugar de cor de módulo além do ponto do menu), nome, uma linha de descrição (web), pílula de status (Ativo, Trial, Pausado, Aguardando canal), botão "✦ Configurar conversando". Banner de trial acima quando aplicável.

5. Estrutura conversacional (assistente)

5.1 Contrato de eventos (SSE) POST /api/assistente/conversar/

EventoPayloadRenderização
texto{ html }balão do assistente (permite <b>)
opcoes{ itens: [{label, valor, recomendada?}] }chips; a recomendada vem com borda azul; clique envia valor como mensagem do usuário
tool_leitura{ nome, args, resultado }card com borda esquerda verde: nome da tool em 600 e resultado em uma linha
previa_whatsapp{ texto, botoes? }balão estilo WhatsApp (fundo #0B141A, bolha #202C33)
proposta_escrita{ id, titulo, resumo: [[chave, valor]], acoes: [{tool, args}] }card com borda azul, lista chave/valor, botões "Confirmar" e "Editar algo", nota "Nada é enviado sem este clique."
resumo{ itens: [[chave, valor, ok]] }atualiza o painel "Resumo em construção"
erro{ mensagem }balão com borda esquerda vermelha e botão "Tentar de novo"

POST /api/assistente/confirmar/:id executa acoes em transação e devolve tool_escrita (renderiza o card verde com "✓ executado"). "Editar algo" envia a mensagem "quero alterar X" e o backend reabre o slot.

5.2 Regras de interface

5.3 Slots por módulo (o que a conversa precisa fechar)

MóduloPassosSlots obrigatóriosTools de leituraTools de escrita (na confirmação)
CarrinhoOrigem · Canal · Régua · Regras · Confirmarorigem, canal, n_mensagens, delays[], templates[], cupom?, regras (valor mínimo, dias, frequência)carrinho.simular_regua, canais.status, templates.listarcarrinho.atualizar_regua, cupons.criar, carrinho.ativar
Disparo RFVObjetivo · Público · Mensagem · Agendamento · Confirmarfamilia (reativacao/sazonal/novidade/informativo), segmentos[], modo_template, templates{}, quandorfv.resumo, rfv.contar_publico, templates.listar, campanhas.estimar_custocampanhas.criar_*, campanhas.agendar
RetençãoBoas-vindas · Aniversário · Regras · Confirmarbv.delay, bv.horario, bv.template, bv.agrupador, aniv.horario, aniv.beneficio, aniv.templateretencao.previa_dia, templates.listarretencao.boas_vindas.configurar/ativar, retencao.aniversario.configurar/ativar
E-commerceFlowCatálogo · IA · Flows · Teste · Publicarestoque_min, colecoes?, tom, proibicoes[], pagamentos[], horario_humanocatalogo.status, flow.simular_conversaflow.regras.atualizar, prompts.nova_versao, flow.publicar
Campanhas InteligentesDiagnóstico · Objetivos · Cupons · Aprovação · Confirmarobjetivos[], cupom (valor, mínimo, validade), modo_aprovacaocampanhas.analisar_estoque, campanhas.sugerir_ofertas, campanhas.simular_margemcampanhas.aprovar_objetivo, cupons.regras, campanhas.ativar_objetivos

Gates que a conversa respeita e explica: sem RFV calculado (Disparo, Retenção, Campanhas) o assistente diz o motivo exato do backend e oferece "me avise quando estiver pronto"; sem canal conectado, oferece o Embedded Signup; cota perto do limite, avisa antes de agendar.

6. Cada módulo em detalhe

6.1 Recuperação de Carrinho (carrinho)

Objetivo do usuário: "não perder venda que já estava quase fechada". Ele quer ver carrinhos chegando e dinheiro voltando.

6.2 Disparo para Base RFV (disparo)

Objetivo: "mandar a mensagem certa para o grupo certo sem queimar meu número".

6.3 Retenção (retencao)

Objetivo: "ligar uma vez e esquecer, sabendo que está rodando".

6.4 E-commerceFlow (flow)

Objetivo: "vender dentro do WhatsApp sem atendente".

6.5 Campanhas Inteligentes (campanhas)

Objetivo: "que o sistema me diga o que ofertar e eu só aprove".

7. Telas fora dos módulos (resumo; detalhes na spec de 11/09)

8. Inventário de componentes

Existentes em shared/ a manter: ui-button, ui-input, ui-select, ui-modal, ui-table, responsive-table, bottom-sheet, ui-tabs, ui-toast, stat-card, date-range-picker, paginator, empty-state, skeleton, funil, rfm-matriz, rfm-gate, ui-canal-status-badge, ui-template-vars-resumo, ui-checkbox-dropdown, comm-* de comunicações.

Novos: modulo-shell (cabeçalho + abas + outlet), modulo-kpis (4 KPIs com regra do azul), modulo-config-cards (cards numerados genéricos), hub-assistente (chat SSE com os 7 eventos), hub-assistente-resumo, ui-quota-bar, ui-trial-banner, ui-locked-inline, ui-locked-preview (overlay de paywall), ui-confirm-dialog (com número de afetados), ui-breadcrumb, mobile-tabbar, ui-chip-filter (com query params), wa-preview (bolha WhatsApp).

Tokens: substituir em src/tailwind.input.css conforme identidade v2.4 (Figtree, #0A5BF0, #0B1033, #F6F8FC, tema escuro azul-noite) e remover Inter.

9. Estados, acessibilidade e desempenho

10. Definição de pronto por tela

Uma tela só está pronta quando: funciona nos dois temas e nos dois tamanhos; tem os 4 estados; usa só tokens da identidade; tem rota própria e deep link; passa no checklist da skill identidade-ecomsmart; tem spec com pelo menos o cenário feliz e o de erro; e os textos passam no "diga / não diga" (sem "ilimitado", sem "chatbot", CTA com verbo).

11. Ordem de implementação sugerida

  1. Tokens + app-shell novo (sidebar, header, mobile tabbar, tema) e modulo-shell com abas por rota.
  2. Módulo Carrinho completo (5 abas) migrando as telas existentes. Serve de referência para os outros.
  3. hub-assistente com os 7 eventos e o wizard do Carrinho.
  4. Retenção e Disparo RFV (migração das telas existentes para as abas).
  5. Público + onboarding + billing (dependem de Stripe e CNPJ no backend).
  6. Campanhas Inteligentes e E-commerceFlow (dependem de backend novo).