| Nome | Setor | Atendentes | Em espera | Status | Ações |
|---|---|---|---|---|---|
| Suporte técnico | Suporte | 6 | 12 | Ativa | |
| Comercial | Vendas | 4 | 3 | Ativa | |
| Financeiro | Financeiro | 2 | 0 | Inativa | |
| Retenção | Vendas | 3 | 7 | Ativa |
Este guia define como toda tela de sistema da IDeia é feita, em qualquer stack. Cada produto tem o seu logo e a sua cor primária. Todo o resto é igual: neutros, cores semânticas, tipografia, ícones, espaçamento, componentes e comportamento. Troque o produto e o tema no topo e veja a mesma tela mudar só o que deve mudar.
O visual: logo, cores, tipografia, ícones, espaçamento, raio, elevação e tema.
Os componentes: como cada um é, as variantes, os estados e as regras de uso, ao vivo.
Os padrões: layout, navegação, formulários, tabelas, feedback, i18n, acessibilidade e texto.
A stack padrão do front, shadcn/ui + Tailwind: tokens, mapa de componentes e o código de cada um, abaixo de cada exemplo.
GLOBAL-STYLE-GUIDE.md na raiz de cada projeto. A stack padrão do front é shadcn/ui + Tailwind (Parte 4); projeto fora dela tem um docs/DESIGN.md local que mapeia este guia para a biblioteca dele. Precedência: guia global, depois o local, depois qualquer tela antiga. Mudar uma regra é decisão humana, nunca da IA.
A cor primária e o logo mudam. Todo o resto é igual.
Layout limpo, espaço em branco, uma ação principal por contexto.
Nenhum conteúdo solto sobre o fundo: tabela, formulário, KPI, vazio e erro ficam numa superfície elevada.
Título, descrição, conteúdo, ação secundária. A tela não tem título: o nome dela é o breadcrumb.
Carregando, deu certo, deu errado, nada aqui: cada estado tem um componente e um lugar.
A tela nasce no celular e cresce. Dentro do shell, o componente mede o contêiner, não a janela.
Contraste mínimo, foco visível, nome acessível em todo controle, teclado em tudo.
Uma frase por aviso. O usuário decide com o que lê, não estuda.
Nenhuma cor fixa na tela: só tokens, que respondem ao tema.
Nenhum texto fixo no código. Português, inglês e espanhol vêm de dicionário.
O visual. É aqui que mora a identidade; os componentes só a aplicam.
Cada produto tem o seu logo em quatro versões, guardadas neste repositório em public/logos e servidas em design.ideiabusiness.com.br. O sistema confere pelo index.json quais existem, usa a clara quando não há escura, e nunca escreve o nome do produto em texto no lugar do logo. Troque o produto no topo.
clara · colorido, tema claro
escura · branco, tema escurohttps://cdn.ideiabusiness.com.br/logos/<slug>/<slug>-clara.png https://cdn.ideiabusiness.com.br/logos/<slug>/<slug>-escura.png https://cdn.ideiabusiness.com.br/logos/<slug>/<slug>-icone-clara.png https://cdn.ideiabusiness.com.br/logos/<slug>/<slug>-icone-escura.png https://design.ideiabusiness.com.br/logos/index.json


| Login, painel da marca | logo completo na versão escura, canto superior esquerdo, 32px de altura |
| Sidebar expandida | logo completo, 32px de altura, com a empresa abaixo |
| Sidebar recolhida | ícone, 32px de altura: a mesma do logo completo |
| Favicon e ícone de app | ícone |
rede-ideia, ideia-chat, lapidai.background ou o sidebar.Famílias: Rede Ideia e os produtos IDeia (Business, Academy, Benefits, Signer, Pay, Partner, Sales, Publi, MEI, DevTeam, Timestamp, Client, NF) compartilham o navy e o verde. Chat e MultiChat usam o azul. DevTasks, Agenda, Vault, Cockpit, Lapid.ai, Arsenal, Polaria, Plure, Lumoria, MDE, B2B, Conecta RI e DEIA têm cor própria.
A tela nunca usa um valor de cor: usa o papel. Os tokens vêm em pares, a superfície e o texto sobre ela. Só a primária muda por produto.
| Token | Papel | Claro | Escuro |
|---|---|---|---|
background | fundo da página; só o vazio entre as boxes | #f8fafc | #171717 |
foreground | texto e ícones padrão | #0f172a | #e5e5e5 |
card · popover | superfície elevada e flutuante | #ffffff | #262626 |
sidebar | menu lateral e painel da direita; no escuro, igual ao fundo e separada pela borda | #ffffff | #171717 |
muted / muted-foreground | superfície sutil; texto de menor peso | #f1f5f9 / #475569 | #1f1f1f / #a8a8a8 |
secondary | ação secundária preenchida | #f1f5f9 | #404040 |
accent | hover de item de menu e de linha; igual ao muted | #f1f5f9 | #1f1f1f |
| item ativo do menu | primary cheia com texto primary-foreground: a 12% o texto não ficava nítido no escuro | = primária | = primária |
brand | a primária clara, fixa nos dois temas; só o painel do login | = primária clara | = primária clara |
border | bordas e separadores; pode ser suave | #e2e8f0 | #404040 |
input | borda dos controles de formulário; 3:1 contra card e fundo | #8592a6 | #737373 |
ring | anel de foco | = primária | = primária |
| Produto | Cor do logo | Primária clara | Primária escura |
|---|
Produto cujo matiz coincide com uma semântica (o laranja do Cockpit é o matiz da atenção) mantém as semânticas como estão: o ícone carrega o significado, e a primária aparece só em ação principal, menu e foco.
| Token | Significado | Ícone | Claro | Escuro | Ao vivo |
|---|---|---|---|---|---|
success | deu certo; estado bom; ligado | circle-check | #15803d | #4ade80 | Ativa |
warning | atenção: tem consequência | triangle-alert | #b45309 | #fbbf24 | Atrasando |
danger | erro, recusa, destrutivo; desligado | circle-alert | #b91c1c | #f87171 | Inativa |
info | contexto neutro: o que vale | info | #0369a1 | #38bdf8 | Em análise |
-strong. É o padrão. Excluirinput; o border dos separadores pode ser suave. O build confere.Toda marca com cor do banco leva contorno de 1px em foreground a 20%: a cor pode ser quase branca ou quase preta, e o contorno garante que ela apareça nos dois temas. Troque o tema e veja.
danger, no prazo em success.muted-foreground, grade na border.Roboto em títulos e corpo, em todos os produtos. Corpo do sistema em 14px. Roboto Mono só em bloco de código e citação literal do sistema: log, payload, ID, hash.
id 8f3a-21c9-4b7e hash a1b2c3d4e5f6
muted-foreground, conteúdo, ação secundária. A tela não tem título: o nome é o breadcrumb.Lucide em todos os produtos: traço de 2px, cantos arredondados, sem preenchimento. Nenhuma outra biblioteca, nenhum emoji como ícone.
| 12px | dentro de badge |
| 12px | botão xs |
| 14px | botão sm, separador do breadcrumb |
| 16px | o padrão: botão, campo, célula, alerta, item de menu e da sidebar, estado vazio |
| 20px | só solto, ao lado de um título de seção |
aria-label e tooltip.Os componentes têm as medidas do shadcn/ui (estilo nova), sem edição. O layout da tela usa a escala de 4px. Raio igual em todos os produtos. Elevação plana: box tem contorno, só o flutuante tem sombra.
| Padding da página | 24px desktop · 16px celular |
| Entre boxes | 16px |
| Padding de card, modal e folha | 16px (card sm: 12px) |
| Entre campos | 20px |
| Rótulo, controle e ajuda | 8px |
| Ícone e texto num botão | 6px (4px no sm e no xs) |
| Padding horizontal de botão e campo | 10px (8px no xs) |
| Célula de tabela | 8px |
| Entre botões | 8px |
| Controle padrão · sm · lg · xs | 32 · 28 · 36 · 24px (não existe xl) |
| Item de menu e de select · cabeçalho de tabela | 28 · 40px |
| Badge · switch | 20px · 32 × 18px |
| Item da sidebar | 32px (topo e usuário: 48) |
| Header da tela | 64px (48 com a sidebar recolhida) |
| Sidebar expandida · recolhida · gaveta | 256 · 48 · 288px |
| Painel da direita | 256px |
| Card de login | até 384px |
| Modal: padrão · formulário · largo | 384 · 512 · 672px |
| Avatar | 32px (24 em lista densa, 40 em cabeçalho) |
rounded-md · item de menu, tooltip, botão smrounded-lg · botão, campo, popover, menu, alertarounded-xl · card, modalforeground a 10%, sem sombra. Card, tabela, formulário, painel.shadow-md). Menu, popover, select, toast. O modal tem só contorno, sobre o véu.Cada componente abaixo é canônico. A ordem para qualquer coisa nova: um componente do kit; uma composição deles; só então um componente próprio, montado com os do kit. HTML puro fica para a estrutura, nunca para controle interativo.
Rótulo é verbo. Ícone à esquerda. Um primário por contexto. Botão só de ícone tem nome acessível e tooltip, sem exceção.
| Variante | Uso | Quantos por contexto |
|---|---|---|
primary | a ação principal do contexto | 1 |
secondary | ação de apoio preenchida | vários |
outline | ação de apoio, filtros, "Editar" | vários |
ghost | cancelar, voltar, só de ícone em barra | com moderação |
link | navegação dentro de texto | com moderação |
danger | só ação destrutiva, só depois de confirmação ou dentro dela | 1 |
Carregando: desabilitado, Spinner no lugar do ícone, rótulo mantido ("Salvar", não "Salvando…"). Passe o mouse nos botões só de ícone para ver a tooltip.
Rótulo acima, controle de 32px, ajuda ou erro abaixo, 8px entre eles. Placeholder é exemplo do formato, nunca o rótulo. Opcional diz "Opcional"; obrigatório não leva asterisco.
muted-foreground. Ação dentro do campo (mostrar senha, limpar) à direita, como botão só de ícone.ring e ganha um anel de 3px em ring a 50%. Erro: borda e anel em danger, e a mensagem diz o que fazer.Pílula de 20px de altura, texto 12/500. Badge de status sempre leva ícone e texto, para não depender só da cor.
A caixa que fica na tela até a condição mudar. Quatro tipos; o tipo escolhe o ícone e a cor, a tela não escolhe nenhum dos dois. Uma frase.
success: deu certo e precisa ficar à vista; se é passageiro, é toast. danger: a ação não aconteceu. warning: tem consequência. info: contexto neutro.role="status" e ícone próprio.Aviso passageiro no canto inferior direito. Título de até 5 palavras, descrição opcional de uma linha, some em 6 segundos. Erro fica até fechar.
ghost pequeno.Toda dica ao passar o mouse ou focar. Nunca o atributo nativo title. Obrigatória em todo botão só de ícone, com o mesmo texto do nome acessível.
A superfície que embala todo conteúdo, o Card do shadcn como vem: fundo card, contorno de 1px, raio 11, padding 16, sem sombra. Cabeçalho com título (16/500) e descrição, conteúdo, rodapé em faixa com ações à direita.
muted-foreground diz o recorte: "Últimos 30 dias, contra os 30 anteriores" (3.1).Toda listagem é uma tabela de dados completa, dentro de um card: busca e um filtro por coluna de conjunto fechado, toda coluna de valor único ordenável, status como badge, ações num único "…", rodapé com paginação. Ordene pelos cabeçalhos e filtre pela barra.
| Ações | |||||
|---|---|---|---|---|---|
| Comercial | Vendas | ARHP | 3 | Ativa | Ações |
| Financeiro | Financeiro | JP | 0 | Inativa | Ações |
| Retenção | Retenção | ELHP | 7 | Ativa | Ações |
| Suporte técnico | Suporte | ARELIT | 12 | Ativa | Ações |
| Nenhuma fila com estes filtros. | |||||
aria-sort acompanha, e o ícone aparece só na coluna ordenada. Clique nos cabeçalhos.foreground.Duas situações, um componente cada. Nunca um texto "Carregando…" solto.
Larguras fixas, nunca aleatórias.
Dentro da box, no lugar do conteúdo. Primeiro uso convida a agir; filtro sem resultado oferece limpar; erro oferece tentar de novo.
Cadastre o primeiro para começar.
Confira a grafia ou limpe os filtros.
Tente de novo em instantes.
Flutuante sobre um véu. Título e descrição, "×", conteúdo, rodapé com "Cancelar" e a ação principal. O foco entra ao abrir e volta ao botão que o abriu ao fechar.
As 12 conversas abertas voltam para a triagem.
danger dentro do modal, acima do rodapé, sem fechar.danger com o verbo e o objeto. Nunca "Sim" e "Não".Flutuante, raio 8, itens de 28px com ícone de 16px. Grupos separados por linha. Item destrutivo por último, depois de um separador.
muted-foreground.Toda tela vive dentro do shell. A tela não monta menu, header nem painel lateral próprios. Abaixo, uma tela de lista completa com o menu do usuário aberto. Troque o produto e o tema no topo.
| Nome | Setor | Atendentes | Em espera | Status | Ações |
|---|---|---|---|---|---|
| Suporte técnico | Suporte | 6 | 12 | Ativa | |
| Comercial | Vendas | 4 | 3 | Ativa | |
| Financeiro | Financeiro | 2 | 0 | Inativa | |
| Retenção | Vendas | 3 | 7 | Ativa |
ghost icon-sm, na altura do recolher. O header é só disso: nenhuma ação da tela vai nele.muted-foreground, sem link; a tela em 500. Detalhe: "Grupo › Lista › Item".Fora do shell, em duas colunas, no padrão do DevTasks: à esquerda o painel da marca, sempre colorido com a primária do produto; à direita o formulário, no tema, com o rodapé embaixo, já estendido com os produtos. Troque o produto e o tema no topo. A frase, a descrição e os recursos são exemplos.
Crie tickets com ajuda de IA, acompanhe o progresso no kanban e mantenha seu time alinhado.
Problemas para entrar? Fale com contato@ideiabusiness.com.br.
sparkles.Todo sistema tem o mesmo rodapé: uma linha no fim da coluna de conteúdo, depois da última box. A seta do canto direito, no clique, estende o próprio rodapé com os produtos da Ideia Business. Teste abaixo.
muted-foreground, padding 12 × 24. Rola com a página; nunca fixa, nunca cobrindo conteúdo. "Um produto da Ideia Business", razão social e CNPJ, e-mail selecionável e, no canto, a seta.chevron-up, com nome acessível, aria-expanded e tooltip "Produtos da Ideia Business". Abre e fecha só no clique, nunca no hover, com cursor de mão; vira chevron-down enquanto aberto.background); borda em cima, sem raio e sem borda nos lados; sombra só para cima; sem véu. Dentro: o título com "Quem está por trás" à direita, na mesma linha, a frase da empresa e o carrossel; o CNPJ só ganha uma linha embaixo quando a linha do rodapé não tem espaço. Fecha pela seta ou com Esc (o foco volta para a seta); clicar fora não fecha, porque o rodapé é parte da página.muted no hover; ícone 32px, nome e descrição de uma linha cada e o external-link à direita, sem "Conhecer". Uma seta em cada ponta, sem barra de rolagem; passa sozinho a cada 4 segundos em laço, para com o mouse em cima ou foco dentro, e não passa sozinho para quem pede movimento reduzido.O Tabs do shadcn com variant="line", como vem: lista de 32px sem fundo, rótulo 14/500, a aba ativa em foreground com sublinhado de 2px. Abas trocam de visão; o controle segmentado é o mesmo componente com variant="default". Use as setas do teclado: elas movem o foco, e Enter ou Espaço abrem a aba.
line)O andamento de cada produto, pelas datas de entrega.
Quantas tarefas cada pessoa entregou, e quantas no prazo.
As entregas da equipe inteira, dia a dia.
default)muted, a ativa em background.Entregas da equipe, uma barra por dia.
Entregas da equipe, uma barra por semana.
Entregas da equipe, uma barra por mês.
| Critério | Abas | Controle segmentado |
|---|---|---|
| Para quê | trocar de visão: cada aba tem o seu conteúdo | trocar o recorte ou o agrupamento do mesmo conteúdo |
| Onde | no topo do card, antes dos filtros (2.24) | junto do que ele muda, dentro do conteúdo |
| Quantas | 2 a 6, uma ou duas palavras | 2 a 4, uma palavra |
tablist com nome, tab com aria-selected, tabpanel ligado à aba.O relatório é um card autossuficiente: abas no topo (as visões), filtros logo abaixo (período, produto…), conteúdo embaixo. Entra em qualquer tela, como o detalhe de um produto, sem depender de barra de ações. Troque a aba e abra o período.
DEIA15 vivas · 8 entregues no períodoFCR p90 12h · 100% em 24hOS104 vivas · 45 entregues no períodoFCR p90 11d 1h · 45% em 24hNF114 vivas · 194 entregues no períodoFCR p90 13d 4h · 62% em 24hPrimeira carga, e aba aberta pela primeira vez: Skeleton no formato, com as abas e os filtros já usáveis.
Tente de novo em instantes.
?visao=pessoas&p=90d). Com mais de um card de relatório na tela, cada um usa um prefixo (entregas.visao).No topo da sidebar, logo abaixo do logo do produto: o seletor da empresa em que a pessoa está trabalhando, como o TeamSwitcher do shadcn. Três modos, pelo que a pessoa alcança. Trocar de empresa remonta a tela limpa e avisa; quem alcança todas e saiu da empresa principal vê a faixa "Você está em …" acima do header.
primary, iniciais 12/500), nome 14/500 e CNPJ 12 na mesma cor, cortados com reticências, e chevrons-up-down. O quadrado distingue a empresa da pessoa, de avatar redondo.building-2, "Você está em Lumen Engenharia" e "Voltar para Empresa Exemplo" à direita (outline sm, arrow-left; no celular, só o ícone). Sem "×": sai pelo botão ou pelo seletor. Não aparece para quem troca entre as próprias empresas, nem na área de administração.Todo kanban de todo produto segue isto. É uma tela de altura cheia: a página não rola; o quadro rola na horizontal, com a barra à vista, e cada coluna rola na vertical, com o cabeçalho parado. Abaixo, um quadro numa área de altura fixa: role as colunas e o quadro, arraste um card para outra coluna, ou use "Mover para" no "…" do card pelo teclado.
flex-1 e min-h-0.input).muted: cabeçalho parado com bolinha, nome (14/500) e contador; lista com rolagem própria; vazia, a caixa tracejada "Arraste tarefas para cá".Card size="sm"): código em mono e "…"; título em até 2 linhas; badges; progresso das subtarefas; prazo; responsável. Bloqueada: borda esquerda em danger.O "?" do header abre a Ajuda. Na primeira visita a uma tela com passo a passo, um convite sai dele: o passo a passo nunca começa sozinho. Ele escurece a tela e destaca uma parte por vez, com um cartão que diz o que se faz ali. Abaixo, os três momentos, parados.
circle-question-mark, ghost icon-sm, tooltip "Ajuda") fica no header, na ordem ? · ✨ · sino (2.15). O menu: "Passo a passo desta tela" (route; na tela sem passo a passo, desabilitado, com "Esta tela não tem passo a passo") e, só se o produto tiver, depois de um separador, "Central de ajuda" (em outra aba, com external-link) e "Falar com o suporte" (life-buoy).PopoverContent como vem (288px), com título, a frase com o número de passos, "Agora não" (ghost sm) e "Começar" (padrão sm).aria-live educado) e vem logo depois do "?" no HTML. Um convite só por tela, que não volta; o "?" não ganha ponto nem contador. Fica guardado por pessoa, no servidor, por tela e versão: se o passo a passo muda, sobe a versão e o convite volta uma vez.muted-foreground); a frase com verbo, até 120 caracteres; "Pular" (ghost) à esquerda; "Voltar" (outline, não aparece no primeiro) e "Próximo" (padrão; no último, "Concluir", e o "Pular" sai). Todos sm.dialog; o foco vai para "Próximo" e fica preso nele; ← e → trocam de passo; Esc é "Pular". Ao sair, o foco volta para onde estava. Sem animação para quem pede movimento reduzido.PopoverContent e os botões nas do Button. Cada passo se prende à tela por data-tour, nunca por classe CSS; o texto vem do i18n.O ✨ do header abre o assistente num painel encaixado à direita, nunca num balão flutuante: por cima, ele cobriria o fim da lista, os toasts e, no atendimento, o botão de enviar. O conteúdo encolhe e nada fica coberto. Toda mudança no sistema passa por uma confirmação. Abaixo, a tela de Contatos com o painel aberto, na proporção de 384px numa janela de 1440.
sparkles, ghost icon-sm, tooltip "Assistente" ou o nome da IA do produto) fica entre o "?" e o sino, com aria-expanded e aria-controls. Só nos produtos com IA. Abre e fecha só no clique: nunca sozinho, no hover ou arrastando.w-96), do topo ao fim da janela, fundo sidebar e borda à esquerda, no lugar do painel da direita (2.15): aberto, toma o lugar do painel da tela, que volta quando ele fecha. O conteúdo encolhe; nada fica coberto.square-pen) e Fechar (x), só de ícone, com tooltip. Logo abaixo, "Nesta tela: Contatos" (12), com o registro aberto quando há, e o × que tira o contexto da conversa.outline sm, uma por linha. Se a tela tem passo a passo (2.28), uma delas é "Fazer o passo a passo desta tela".muted à direita, até 80% da largura. A resposta: sem balão, na largura toda, 14/20, Markdown seguro, nunca HTML do modelo; embaixo, Copiar, Útil e Não útil (ghost icon-xs, com tooltip e aria-pressed).shimmer (parado para quem pede movimento reduzido), e o enviar vira Parar (square). Erro dentro da conversa, com "Tentar de novo"; nunca toast.Item outline sm) com o ícone da ação, a pergunta, o que muda numa frase, Cancelar (outline) e Confirmar (padrão; destructive na ação destrutiva). Depois, vira a linha do resultado. Ler, buscar e resumir não pedem confirmação.InputGroup com a área de texto e o enviar (arrow-up), desabilitado com o campo vazio; de 1 a 6 linhas. Enter envia, Shift Enter quebra a linha. Embaixo, "A IA pode errar. Confira o que for importante."O que é da IDeia, e não de uma empresa cliente (as empresas, os produtos com logo e cores, os papéis das pessoas), mora numa área só do Sysadmin. A entrada fica fixa no pé da sidebar, acima do usuário; lá dentro, a sidebar ganha um tom suave da primária, o seletor de empresa vira o bloco "Administração" e o menu tem só os itens da área.
| Token | Claro | Escuro |
|---|---|---|
sidebar-admin (fundo) | 8% | 14% |
sidebar-admin-accent (hover) | 14% | 22% |
sidebar-admin-border | 20% | 30% |
Quanto da primária do produto entra sobre a sidebar (a borda, sobre a border). O build confere o contraste em todo produto.
shield, com tooltip.sidebar-admin); o item ativo continua na primária cheia e o logo é o do produto. Muda o tom, não a identidade. O header, o conteúdo e o rodapé não mudam./admin/produtos/ideia-vault).data-area="admin"; o globals.css gerado troca --sidebar, --sidebar-accent e --sidebar-border com :root:has([data-area="admin"]), também na gaveta do celular.Na demonstração ao vivo: entre como Marcos (Sysadmin) e clique em "Administração", no pé da sidebar.
Os comportamentos que se repetem. Como as peças do kit se combinam numa tela.
| Tipo | Estrutura |
|---|---|
| Lista (a maioria) | card com a tabela de dados, com o "Novo…" no canto superior direito do card; criar e editar em modal |
| Dashboard | grade de KPIs › cards com gráficos; sem filtro nem período: o recorte é fixo e vai na descrição de cada card ("Últimos 30 dias", "Agora"). Dashboard com filtro é relatório |
| Relatório | um card de relatório (2.24) por assunto: abas, filtros e conteúdo dentro do card |
| Detalhe | cards por assunto (dados, histórico, anexos), com as ações do registro no cabeçalho do primeiro card; ou painel da direita quando a lista fica à vista |
| Altura cheia (atendimento, chat, kanban) | a área vai do header até o rodapé, com a altura da janela: a página não rola, só as partes dela (no kanban, o quadro na horizontal e cada coluna na vertical, 2.26). Altura = janela − header − rodapé − respiros (− a faixa do "Ver como", quando ligada) |
| Configuração | cards por grupo; switch para o que salva sozinho, formulário com "Salvar" para o resto. Sem listagem nem tabela (Perfil): centralizada, até 720px; com tabela, a largura toda. Com várias seções que são telas próprias (Tags, Campos, SLA, Webhooks): segundo menu (2.27), cada seção com a sua URL e na largura toda que sobra (também as de formulário), nunca abas |
| Login e recuperação | fora do shell, duas colunas: painel da marca e formulário |
danger acima do rodapé, sem fechar.Cada filtro tem um nível, e cada nível tem um lugar. O que muda do que o card trata é escopo e fica no topo do próprio card: as abas e, logo abaixo, os filtros do card de relatório (2.24). O que muda como o mesmo conjunto aparece é modo de exibição e fica à direita da barra de ferramentas da box. O que reduz o conjunto é filtro e fica à esquerda da barra de ferramentas. Abaixo, as telas do DevTasks refeitas nesse padrão; a do Cockpit, que depende de uma escolha, virou a listagem em duas etapas (3.18). Período, seletor de pessoa e painel de filtros abrem ao clicar.
DEIA15 vivas · 8 entregues no períodoFCR p90 12h · 100% em 24hOS104 vivas · 45 entregues no períodoFCR p90 11d 1h · 45% em 24hNF114 vivas · 194 entregues no períodoFCR p90 13d 4h · 62% em 24houtline com o contador do que está ativo e abre um popover com todos os campos no mesmo formato; tudo aplica ao mudar, sem "Aplicar"."De quem é o acesso" não fica numa barra da tela nem num seletor vazio: a tela começa listando as pessoas, com busca, ordem e o filtro Cargo, e "Ver acessos ›" leva à segunda etapa, já filtrada. É a listagem em duas etapas; o desenho do Cockpit virou o exemplo vivo dela, na seção 3.18.
Qual componente para cada situação. A tabela decide; a tela não inventa.
| Situação | Componente | Onde |
|---|---|---|
| Erro de um campo | mensagem do campo | abaixo do campo |
| Recusa do servidor num formulário | alerta danger | acima do rodapé |
| Erro de uma ação fora de formulário | alerta danger | no card da ação; sem onde, toast de erro |
| Erro ao carregar uma lista | estado vazio com "Tentar de novo" | dentro da box |
| Deu certo, passageiro | toast success | canto inferior direito |
| Deu certo, precisa ficar | alerta success | no card |
| Consequência que a pessoa precisa saber | alerta warning | onde a ação acontece |
| Contexto neutro | alerta info | no topo do card |
| Condição que vale enquanto dura | indicador de estado, neutro | junto do que descreve |
| Processo longo | Spinner com texto curto | no lugar da ação |
| Primeira carga de qualquer coisa | Skeleton no formato | dentro da box |
| Recarga porque a pessoa mudou o pedido (busca, filtro, ordenação, aba) | Spinner, dados mantidos | barra de ferramentas ou linha de filtros |
| Releitura automática (foco da janela, intervalo, tempo real) | nada: sem Spinner e sem mudar a página de lugar. Não existe botão "Atualizar" | |
| Notificação do sistema | o sino; se acabou de chegar, toast do tipo dela com "Ver" | header |
danger.danger com verbo e objeto ("Excluir fila"). O botão destrutivo nunca é o foco inicial.O cabeçalho do popover tem "Marcar todas como lidas" e o botão de configurações, que abre as preferências de notificação. As preferências são de cada pessoa e cuidam só do app; o e-mail fica no Perfil.
muted. Vazio: "Nenhuma notificação."ghost sm) e o botão settings com a dica "Configurar notificações", que abre as preferências.Notificações por e-mail ficam no seu perfil.
warning diz como liberar.Todo sistema nasce preparado para pt-BR (padrão), en e es. Nenhum texto fixo no código.
| pt-BR | en | es | |
|---|---|---|---|
| Data | 22/10/2026 | 10/22/2026 | 22/10/2026 |
| Hora | 14:05 | 2:05 PM | 14:05 |
| Número | 1.234,56 | 1,234.56 | 1.234,56 |
| Moeda | R$ 1.234,56 | R$1,234.56 | R$ 1.234,56 |
ring e anel de 3px a 50%, o do shadcn. Experimente com Tab nesta página.aria-label em botão só de ícone; tabela com cabeçalho; imagem informativa com alt.role="alert"; indicador de estado, role="status"; toast é anunciado.title, nunca tabindex positivo, nunca foco preso fora de um modal.As IAs tendem a escrever demais. Aqui, não.
À esquerda, o certo. À direita, o que não se escreve.
| pt-BR | en | es |
|---|---|---|
| Salvar | Save | Guardar |
| Cancelar | Cancel | Cancelar |
| Fechar | Close | Cerrar |
| Excluir | Delete | Eliminar |
| Editar | Edit | Editar |
| Novo / Nova … | New … | Nuevo / Nueva … |
| Atualizar (nunca botão de tela) | Refresh | Actualizar |
| Buscar | Search | Buscar |
| Filtrar · Limpar filtros | Filter · Clear filters | Filtrar · Limpiar filtros |
| Carregar mais | Load more | Cargar más |
| Tentar de novo | Try again | Intentar de nuevo |
| Desfazer · Ver | Undo · View | Deshacer · Ver |
| Entrar · Sair | Sign in · Sign out | Iniciar sesión · Cerrar sesión |
| Perfil · Configurações | Profile · Settings | Perfil · Configuración |
| Idioma | Language | Idioma |
| Tema · Claro · Escuro | Theme · Light · Dark | Tema · Claro · Oscuro |
| Ações | Actions | Acciones |
| Opcional | Optional | Opcional |
| Nenhum resultado | No results | Sin resultados |
| Carregando | Loading | Cargando |
| Bem-vindo de volta | Welcome back | Bienvenido de nuevo |
| Esqueci minha senha | Forgot my password | Olvidé mi contraseña |
title em qualquer lugar.Tela que depende de uma escolha (a pessoa, a fila, a empresa) começa listando as opções, com o padrão completo de listagem. Ao escolher, o mesmo card desliza para a segunda etapa, já filtrada, com "← Pessoas" para voltar. É o lugar do antigo "filtro inicial" (decisão do usuário, 2026-10-26). Teste: "Ver acessos ›" numa linha, depois "← Pessoas"; ordene e filtre a primeira etapa antes, e veja que a volta a encontra como ficou.
Endereço da tela: /configuracoes/acesso
| Ações | ||||
|---|---|---|---|---|
| AR Ana Ribeiro | ana.ribeiro@empresa.com.br | Atendente | 6 | |
| BT Bianca Torres | bianca.torres@empresa.com.br | Atendente | 9 | |
| BC Bruno Cardoso | bruno.cardoso@empresa.com.br | Desenvolvedor | 6 | |
| CM Carla Mendes | carla.mendes@empresa.com.br | Desenvolvedora | 8 | |
| DF Diego Fontes | diego.fontes@empresa.com.br | Analista de qualidade | 8 | |
| EL Eduarda Lins | eduarda.lins@empresa.com.br | Atendente | 4 | |
| Nenhuma pessoa com estes filtros. | ||||
| ideia-business/ideia-chat na frota | GitHub | há 7 dias · por Marcos | |
| ideia-business/ideia-chat-api | GitHub | há 12 dias · por Marcos | |
| ideia-business/ideia-renewal | GitHub | há 3 dias · por Marcos | |
| ideia-business/renovacao | GitLab | nunca | |
| Nenhum repositório com estes filtros. | |||
?pessoa=u2), com entrada no histórico. Busca, filtros, ordem e página da etapa 1 continuam na URL e voltam como estavam; os da etapa 2 têm nomes próprios (rq, rpage).A equipe padronizou a stack do front. Projeto novo nasce nela; projeto antigo migra quando tocar na tela. As partes 1 a 3 valem para qualquer stack; esta diz como elas viram código. O código de cada componente está abaixo do exemplo dele, na Parte 2.
| Camada | Padrão |
|---|---|
| Framework | Next.js (App Router) com React 19 e TypeScript. App sem servidor próprio: Vite + React |
| CSS | Tailwind CSS 4 |
| Componentes | shadcn/ui pelo CLI atual (primitivos Base UI), copiados para components/ui/. Composição pelo prop render, nunca asChild |
| Ícones | lucide-react, importado sem o sufixo Icon |
| Tema | next-themes, classe dark no html |
| Formulários | react-hook-form + zod + família Field, por Controller |
| Tabelas | @tanstack/react-table v9 pelo guia Data Table do shadcn |
| Fontes | Roboto e Roboto Mono por next/font/google (no Vite, @fontsource-variable) |
| Classes | cn() de @/lib/utils |
| i18n | next-intl no Next; i18next no Vite (proposta, a confirmar) |
| Documentação | sempre a da versão Base UI: ui.shadcn.com/docs/components/base/<componente> |
--primary, --primary-foreground, --ring, --sidebar-primary e --brand. Todo o resto do globals.css é copiado igual. O danger do guia é o destructive do shadcn: não renomear. --radius: 0.5rem é o rounded-lg (8px, controles); a escala do shadcn multiplica: rounded-md 6px, rounded-xl 11px (card, modal). O @theme inline do arquivo registra cores, fonte e raio: o shadcn/tailwind.css não registra.| Guia | shadcn | Como |
|---|---|---|
| 2.1 Botão | Button | variant: default (= primary), secondary, outline, ghost, link, destructive (= danger). size: sm, default, lg, icon, icon-sm, icon-lg. Ícone com data-icon="inline-start" |
| 2.2 Campo | Field, FieldLabel, Input, FieldDescription, FieldError; InputGroup para ícone | sempre por Controller; nunca o conjunto antigo Form/FormField |
| 2.3 Select, combobox, data | Select; Combobox acima de 8 opções; Calendar num Popover | captionLayout="dropdown" |
| 2.4 Escolha | Checkbox, RadioGroup, Switch | |
| 2.5 Badge | Badge | variantes success, warning, info e danger (tingidas a 12%) no cva do badge.tsx, nível 3 |
| 2.6 Alerta | Alert + AlertDescription | variantes success, warning, info no cva do alert.tsx, ícone fixo por variante |
| 2.7 Toast | Toast por @/lib/toast | toast.success/error/info/warning(título, { description, action }); 6 s |
| 2.8 Tooltip | Tooltip, TooltipTrigger render, TooltipContent | TooltipProvider na raiz; atalho em Kbd |
| 2.9 Card, KPI | Card e partes | KPI: CardTitle className="text-3xl font-bold tabular-nums" |
| 2.10 Tabela | Table + TanStack v9 + reutilizáveis do guia | um DataTable por tela, dentro de Card |
| 2.11 Carregamento | Skeleton, Spinner | |
| 2.12 Vazio | Empty e partes | |
| 2.13 Modal | Dialog; AlertDialog para confirmação | DialogClose render={<Button variant="ghost" />} |
| 2.14 Menu suspenso | DropdownMenu | DropdownMenuItem variant="destructive" por último |
| 2.15 Shell | Sidebar no bloco sidebar-07; painel da direita no sidebar-15; Breadcrumb, Separator, SidebarTrigger | item ativo cheio no sidebar.tsx (bg-sidebar-primary), nível 3 |
| 2.16 Menu do usuário | DropdownMenu no SidebarFooter, ToggleGroup para idioma e tema | |
| 2.17 a 2.19 | Breadcrumb · DataTablePagination · Avatar | |
| 2.20 Login | grid de duas colunas com Field, InputGroup, Button | painel em bg-[linear-gradient(135deg,var(--brand),…)] |
| 2.21 Rodapé | componente próprio components/shell/footer.tsx: Collapsible no desktop, Sheet side="bottom" no celular, Carousel com embla-carousel-autoplay | os dados vêm da API, no servidor (API dos produtos) |
--primary muda tudo.cn(): ajuste pontual.add --overwrite desfaz: reconciliar à mão.components/ui/ nem em lib/utils.ts além do nível 3; helpers em lib/<nome>.ts.apply --preset só com --only theme ou --only font.title, asChild, Link dentro de Button, style inline fora da cor do banco, onPress.@container, não por sm:/md:.tailwind.config, asChild no lugar de render; migram quando a tela for refeita.A tela só está pronta quando passa em tudo.
O guia chega às IAs dos projetos pelo MCP ideia-design ou, sem ele, pelo llms.txt. Os dados de cada produto (rodapé, cores e logos) vêm da API dos produtos.
O servidor está em https://design.ideiabusiness.com.br/mcp e exige o cabeçalho Authorization: Bearer <MCP_TOKEN>; sem ele, responde 401.
prod › MCP_TOKEN. Ele nunca vai para o repositório nem para o chat.~/.config/ideia-design, que só você lê. Também instala a skill aplicar-guia-ideia em ~/.claude/skills: pedir "aplicar o guia" a carrega, e ela segue o roteiro do MCP. Para trocar o token ou atualizar a skill, rode de novo.
sh -c "$(curl -fsSL https://design.ideiabusiness.com.br/conectar-mcp.sh)"
.mcp.json na raiz (sem segredo, vai para o git). Se o projeto já tem um, acrescente só a entrada ideia-design.
{
"mcpServers": {
"ideia-design": {
"type": "http",
"url": "https://design.ideiabusiness.com.br/mcp",
"headersHelper": "${HOME}/.config/ideia-design/mcp-headers"
}
}
}/mcp. O ideia-design aparece connected, com 12 ferramentas e 3 prompts. Erro 401: rode o passo 2 de novo com o token do cofre.get_component("tabela"), get_section("patterns/filtros"), get_tokens("ideia-chat", "css"), checklist). Para auditar o front inteiro, que só verifica e relata, rode o comando abaixo. Para revisar uma tela, /mcp__ideia-design__revisar-tela; para conferir o código de uma tela, check_tela; para conferir só as cores, check_globals_css.
/mcp__ideia-design__auditar-projeto ideia-chat apps/app
docs/adocao-guia-ideia.md antes de alterar qualquer arquivo, espera você revisar o documento e aplica uma parte por vez, parando para o seu OK entre elas. "Continue de onde parou" retoma pelo documento. Com a skill, basta pedir "aplicar o guia"; o comando faz o mesmo.
/mcp__ideia-design__aplicar-guia ideia-chat apps/app
Outro cliente MCP (Cursor, claude.ai): a mesma URL com o cabeçalho Authorization: Bearer <token>. Ferramentas: list_sections, get_section, get_component, get_tokens, check_globals_css, search, checklist, get_logo_urls, list_products, check_tela, plano_template e get_roteiro. Prompts: auditar-projeto, aplicar-guia e revisar-tela.
llms.txt: as regras para o agente, as instruções do MCP e um link para cada seção.llms-full.txt: o guia inteiro num arquivo, o mesmo GLOBAL-STYLE-GUIDE.md da raiz dos projetos.get_section entrega: /guia/components/botao.md, /guia/patterns/filtros.md…/tokens/products.json e os logos em /logos/index.json.ideia-design: a fonte que as IAs consultam, sempre na versão publicada.GLOBAL-STYLE-GUIDE.md na raiz de cada projeto: o mesmo texto deste guia, para quem não tem o MCP.docs/DESIGN.md em cada projeto: só o que é dele (rotas, menu, nomes de arquivos, decisões locais). Ele diz como implementar; nunca muda uma regra do guia.CLAUDE.md ou AGENTS.md do projeto manda consultar o guia antes de criar ou alterar uma tela.De onde os sistemas leem, sem login, o rodapé, as cores, os logos e o globals.css de cada produto. Quem escreve é o painel administrativo, e só o Sysadmin entra nele. Para as IAs, esta seção está também em /guia/api.md e no get_section("api") do MCP.
| Endereço | https://design-api.ideiabusiness.com.br/api/v1 |
|---|---|
| Contrato | Swagger (abre em outra aba), para ler e testar no navegador, e o OpenAPI em JSON (abre em outra aba), para gerar os tipos |
| Painel | design-admin.ideiabusiness.com.br, só para o Sysadmin |
GET; não mande cookie nem Authorization.| Método e caminho | O que devolve |
|---|---|
GET /footer | O rodapé (2.21): os textos da empresa e os cards dos produtos, em ordem alfabética, sem o card do sistema que pede. Sem product, vêm todos |
GET /products | Os produtos que não estão arquivados, em ordem alfabética, com os textos, as cores e os logos. metadata.total diz quantos são |
GET /products/ | Um produto |
GET /products/ | O globals.css do produto (shadcn/ui + Tailwind 4), o mesmo do get_tokens do MCP. Vem o arquivo, não JSON |
GET /health | Se a API e o banco respondem: status ok ou degraded |
GET /guide/ | Os produtos no formato do guia, com a cor do logo e as medidas de cada PNG: o que o build do site e o MCP leem. Os sistemas usam /products |
<slug> é o do produto no guia (ideia-chat, ideia-devtasks…): a lista sai de GET /products ou do list_products do MCP. Só letras minúsculas sem acento, números e hífen.fetch com next: { revalidate: 43200 } ou 86400). Em tela com login, o fetch vem do cache do Next, não da API. Nunca SSR sem cache (uma chamada por página), nunca do navegador, e nada de cache: "no-store", revalidate: 0 ou fetchCache = "force-no-store" nesse caminho. Uma mudança no painel chega a todos os sistemas em até um dia.public, max-age=60, s-maxage=300, stale-while-revalidate=86400).fetch do Next só guarda resposta 200. Sem nenhuma guardada, o que depende dela não aparece (o rodapé, por exemplo) e a página segue./products e do rodapé, e /products/<slug> responde 404. As URLs dos logos dele continuam no ar.?v= da versão atual, e um logo trocado chega com uma URL nova, sem esperar cache. Na tela, <img> ou <Image unoptimized>.globals.css de cada sistema; a API não muda a cor de um sistema que já está no ar. Depois de uma troca de cor no painel, baixe o arquivo de novo.success, data (ou error, quando falha) e metadata, com timestamp, version e, nas listas, total. Só o globals.css vem como arquivo.{
"success": false,
"error": {
"code": "PRODUCT_NOT_FOUND",
"message": "Produto não encontrado: nao-existe"
},
"metadata": {
"timestamp": "2026-10-29T22:47:50.675Z",
"version": "v1"
}
}
| Status | error.code | Quando |
|---|---|---|
| 404 | PRODUCT_NOT_FOUND | O slug não existe ou o produto está arquivado |
| 404 | ROUTE_NOT_FOUND | O caminho não existe |
| 422 | VALIDATION_ERROR | Parâmetro inválido; error.details traz cada campo, com path e message |
| 500 | INTERNAL_ERROR, FOOTER_NOT_CONFIGURED | Falha da API: siga com a última resposta boa |
As rotas do painel respondem também 401 (sem sessão), 403 (sem o papel Sysadmin), 409 SLUG_TAKEN e 422 CONTRAST_FAILED ou LOGO_INVALID. A lista completa está no contrato.
GET /footer?product=ideia-chat| Campo | O que é |
|---|---|
company.brandName | O nome da marca: "Um produto da …" e o nome da seta, "Produtos da …" |
company.legalName, company.cnpj | A razão social e o CNPJ, com a máscara, na linha do rodapé |
company.email | O e-mail de contato, na linha do rodapé |
company.title, company.tagline | O título e a frase da parte estendida |
company.aboutUrl | Para onde o "Quem está por trás" leva |
products[].slug, products[].name | O produto do card |
products[].description | O texto do card: o do rodapé no cadastro do produto; vazio, o do login |
products[].url | O endereço do produto; null, o card sai sem link |
products[].icon | O ícone claro (o logo claro, se o produto não tem ícone); null, sem imagem |
{
"success": true,
"data": {
"company": {
"brandName": "Ideia Business",
"legalName": "Ideia Business Soluções Tecnológicas LTDA",
"cnpj": "30.082.914/0001-00",
"email": "contato@ideiabusiness.com.br",
"title": "Os negócios por trás deste produto",
"tagline": "Mais de 20 anos empreendendo, mais de 500 mil empresas atendidas e uma rede com mais de 5 mil contadores.",
"aboutUrl": "https://ideiabusiness.com.br"
},
"products": [
{
"slug": "ideia-devtasks",
"name": "IDeia DevTasks",
"description": "Crie tickets com ajuda de IA e acompanhe o time no kanban.",
"url": null,
"icon": "https://cdn.ideiabusiness.com.br/logos/ideia-devtasks/ideia-devtasks-icone-clara.png?v=7832ddae0d57"
}
]
},
"metadata": { "timestamp": "2026-10-29T22:43:16.710Z", "version": "v1" }
}GET /products/ideia-chatGET /products. Sem nada interno, como a observação ou quem alterou.| Campo | O que é |
|---|---|
slug | Fixo: não muda depois de criado. É também o nome dos arquivos dos logos |
name | O nome do produto |
family | ideia ou propria (1.1) |
pitch, description | O título e o texto do painel do login (2.20) |
footerDescription | O texto do card do rodapé (2.21); vazio, vale o description |
siteUrl | O endereço do produto, para onde o card do rodapé leva; null quando não tem |
showInFooter | Se o card do produto aparece no rodapé dos outros sistemas |
colors.primary | A primária de cada tema e o texto sobre ela: light, lightForeground, dark e darkForeground (1.2) |
colors.brand | A primária clara, fixa nos dois temas: só o painel do login (2.20) |
colors.link | O texto de link de cada tema, light e dark (1.2) |
logos | A URL de cada PNG que existe: clara, escura, icone-clara e icone-escura (1.1) |
{
"success": true,
"data": {
"slug": "ideia-chat",
"name": "IDeia Chat",
"family": "propria",
"pitch": "Atendimento multicanal pelo WhatsApp",
"description": "Filas, SLA e dashboards para o seu time atender melhor.",
"footerDescription": "Atendimento multicanal pelo WhatsApp, com filas, SLA e dashboards.",
"siteUrl": null,
"showInFooter": true,
"colors": {
"primary": { "light": "#265e9f", "lightForeground": "#ffffff", "dark": "#2e71c0", "darkForeground": "#ffffff" },
"brand": "#265e9f",
"link": { "light": "#265e9f", "dark": "#5c90ce" }
},
"logos": {
"clara": "https://cdn.ideiabusiness.com.br/logos/ideia-chat/ideia-chat-clara.png?v=985d0c40f5c8",
"escura": "https://cdn.ideiabusiness.com.br/logos/ideia-chat/ideia-chat-escura.png?v=1096dde5c415",
"icone-clara": "https://cdn.ideiabusiness.com.br/logos/ideia-chat/ideia-chat-icone-clara.png?v=19c9a6d7496c",
"icone-escura": "https://cdn.ideiabusiness.com.br/logos/ideia-chat/ideia-chat-icone-escura.png?v=251c730a4a82"
}
},
"metadata": { "timestamp": "2026-10-29T22:47:50.483Z", "version": "v1" }
}| Método e caminho | O que faz |
|---|---|
POST /auth/ | Entra com e-mail e senha e recebe o token (JWT) |
POST /auth/ | Entra pelo GitHub: só quem é da organização Ideia-Business e está cadastrado como Sysadmin |
GET /auth/POST /auth/ | Quem está na sessão; sair |
GET /admin/ | A lista, com busca (search), família (family), situação (status: ativos, arquivados ou todos), rodapé (footer) e em revisão (review) |
POST /admin/ | Cadastra um produto. O que faltar das cores sai da receita do guia (1.2) |
GET /admin/PATCH /admin/ | Lê o produto, com as cores e os logos; edita só os campos enviados |
POST /admin/POST /admin/ | Arquiva e tira do arquivo |
POST /admin/ | Assina o envio de um logo: o navegador sobe o PNG direto no armazenamento, num link que vale 5 minutos |
POST /admin/ | Confere o arquivo enviado e publica como versão nova: a URL fixa troca e o cache do CDN é limpo |
POST /admin/ | Volta o logo para uma versão guardada |
POST /admin/ | Sugere a primária clara, a escura e o texto sobre elas a partir de uma cor, com o contraste do resultado |
GET /admin/PATCH /admin/ | Os textos da empresa no rodapé |
Authorization: Bearer <token>. No painel, ele fica num cookie httpOnly, e quem o manda à API é o servidor do painel (BFF): o navegador nunca o vê. A API lê o usuário no banco a cada pedido, e quem é desativado perde o acesso na hora.CONTRAST_FAILED e os motivos.LOGO_INVALID e os motivos. Cada envio guarda uma versão, e o mesmo arquivo de uma versão antiga volta para ela.v1.12.0 · Decidido ponto a ponto com o usuário; o histórico está no CHANGELOG do repositório. Os nomes, e-mails e números das telas de exemplo são fictícios; os da API são os de produção.