Global Style Guide IDeia · v1.12.0
Tema
Produto
Ir para

Uma identidade visual para todos os sistemas da IDeia

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.

1 · Style Guide

O visual: logo, cores, tipografia, ícones, espaçamento, raio, elevação e tema.

2 · UI Kit

Os componentes: como cada um é, as variantes, os estados e as regras de uso, ao vivo.

3 · Pattern Library

Os padrões: layout, navegação, formulários, tabelas, feedback, i18n, acessibilidade e texto.

4 · Implementação

A stack padrão do front, shadcn/ui + Tailwind: tokens, mapa de componentes e o código de cada um, abaixo de cada exemplo.

Demonstração ao vivo. Um sistema de exemplo com todos estes componentes e padrões funcionando, com troca de produto, tema, idioma e estados de rede: design.ideiabusiness.com.br/live.

Escopo e precedência. Vale para sistemas (painéis com login); landing pages e sites não entram. A versão em texto, para as IAs e os devs, é o 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.

Princípios

01

Mesma experiência em todos os produtos

A cor primária e o logo mudam. Todo o resto é igual.

02

Menos é mais

Layout limpo, espaço em branco, uma ação principal por contexto.

03

Tudo vive numa box

Nenhum conteúdo solto sobre o fundo: tabela, formulário, KPI, vazio e erro ficam numa superfície elevada.

04

Hierarquia dentro da box

Título, descrição, conteúdo, ação secundária. A tela não tem título: o nome dela é o breadcrumb.

05

Feedback para toda ação

Carregando, deu certo, deu errado, nada aqui: cada estado tem um componente e um lugar.

06

Mobile-first e container-first

A tela nasce no celular e cresce. Dentro do shell, o componente mede o contêiner, não a janela.

07

Acessível por padrão

Contraste mínimo, foco visível, nome acessível em todo controle, teclado em tudo.

08

Texto curto

Uma frase por aviso. O usuário decide com o que lê, não estuda.

09

Claro e escuro, sempre

Nenhuma cor fixa na tela: só tokens, que respondem ao tema.

10

Três idiomas desde o início

Nenhum texto fixo no código. Português, inglês e espanhol vêm de dicionário.

Parte 1

Style Guide

O visual. É aqui que mora a identidade; os componentes só a aplicam.

1.1 Marca e logo

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 escuro
icone-clara · só o símbolo, quadrado
icone-escura · símbolo branco
https://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

Topo da sidebar, aberta e recolhida, e favicon

O logo completo e o ícone com a mesma altura, 32px: o topo não muda de altura ao recolher. Logo abaixo, a troca de empresa (2.25). Na aba do navegador, o ícone a 16px. Troque o tema: o fundo da sidebar muda e a versão do logo acompanha.
Empresa Exemplo
Rede Ideia

Onde cada versão entra

Login, painel da marcalogo completo na versão escura, canto superior esquerdo, 32px de altura
Sidebar expandidalogo 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

Regras

  • O slug é o nome em minúsculas, sem acento, com hífen: rede-ideia, ideia-chat, lapidai.
  • O logo já traz o nome: nunca escreva o nome ao lado dele.
  • Respiro de metade da altura em volta. Largura mínima de 120px.
  • Nunca distorça, recolora, rotacione, aplique sombra ou ponha sobre fundo que não seja o background ou o sidebar.
  • No escuro entra a versão branca. Nunca o colorido sobre fundo escuro.
  • O logo não muda com a primária: o token deriva do logo, nunca o contrário.

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.

1.2 Cores

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.

Neutros, iguais em todos os produtos

Claro: frios, com leve viés azul. Escuro: grafite, sem matiz (tema Modern Minimal do tweakcn). No escuro, card e popover são mais claros que o fundo; a sidebar é igual ao fundo, separada pela borda.
TokenPapelClaroEscuro
backgroundfundo da página; só o vazio entre as boxes#f8fafc#171717
foregroundtexto e ícones padrão#0f172a#e5e5e5
card · popoversuperfície elevada e flutuante#ffffff#262626
sidebarmenu lateral e painel da direita; no escuro, igual ao fundo e separada pela borda#ffffff#171717
muted / muted-foregroundsuperfície sutil; texto de menor peso#f1f5f9 / #475569#1f1f1f / #a8a8a8
secondaryação secundária preenchida#f1f5f9#404040
accenthover de item de menu e de linha; igual ao muted#f1f5f9#1f1f1f
item ativo do menuprimary cheia com texto primary-foreground: a 12% o texto não ficava nítido no escuro= primária= primária
branda primária clara, fixa nos dois temas; só o painel do login= primária clara= primária clara
borderbordas e separadores; pode ser suave#e2e8f0#404040
inputborda dos controles de formulário; 3:1 contra card e fundo#8592a6#737373
ringanel de foco= primária= primária

Primária: a única cor que muda por produto

O logo nunca muda; o token deriva dele. Claro: a cor do logo, escurecida se o branco sobre ela não chega a 4,5:1. Escuro: o mesmo matiz, clareado até ter 3:1 contra o card.
ProdutoCor do logoPrimária claraPrimá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.

Semânticas, iguais em todos os produtos

Quatro tipos, cada um com ícone fixo. Não existe quinto tipo, e a primária nunca tem sentido semântico.
TokenSignificadoÍconeClaroEscuroAo vivo
successdeu certo; estado bom; ligadocircle-check#15803d#4ade80Ativa
warningatenção: tem consequênciatriangle-alert#b45309#fbbf24Atrasando
dangererro, recusa, destrutivo; desligadocircle-alert#b91c1c#f87171Inativa
infocontexto neutro: o que valeinfo#0369a1#38bdf8Em análise

Três intensidades, e só estas

  • Texto e ícone no tom: a cor direto no texto.
  • Superfície tingida: 12% no badge, 8% com borda a 30% no alerta, 10% no botão de perigo (20% no escuro), texto no tom -strong. É o padrão. Excluir
  • Superfície cheia: só selo de destaque.

Contraste

  • Mínimo 4,5:1 para texto; 3:1 para texto grande, ícone, borda de controle e contorno. Nos dois temas. Quem cumpre a borda de controle é o input; o border dos separadores pode ser suave. O build confere.
  • Contraste se corrige onde nasce: no token, por decisão humana. Nunca um remendo numa tela.
  • Texto que carrega informação (descrição, erro, ajuda) nunca leva opacidade.

Cor que vem do banco

A única cor que não é token: a que o usuário escolheu para fila, etiqueta ou categoria.
Amarela Marinho Branca Preta

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.

Gráficos

  • Séries na primária e em degraus dela; neutros para o que é referência.
  • Semântica só quando o dado é semântico: vencido em danger, no prazo em success.
  • Cada série com 3:1 contra o card do tema. Rótulos em muted-foreground, grade na border.

1.3 Tipografia

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.

Legenda · 12 / 16 · 400Última atualização há 5 minutos
Corpo · 14 / 20 · 400A fila distribui as conversas por rodízio entre os atendentes ativos.
Rótulo e botão · 14 / 20 · 500Limite de espera
Leitura · 16 / 24 · 400Mensagens, e-mails e textos longos usam 16px para não cansar.
Título de box · 16 / 22 · 500

Filas da empresa

Título de seção · 20 / 28 · 600

Configurações da empresa

Título grande · 24 / 32 · 600

Entrar

KPI · 30 / 36 · 7001.248
Vitrine · 36 / 44 · 700Gestão de tasks para times ágeis
Mono · 13 / 20 · 400
id   8f3a-21c9-4b7e
hash a1b2c3d4e5f6
  • Pesos: 400 texto, item de menu e tooltip; 500 rótulo, botão, badge, cabeçalho de tabela e título de box; 600 título de seção e título grande; 700 só número de KPI e a vitrine. São os pesos do shadcn.
  • O texto digitado num campo tem 16px abaixo de 768px de janela, para o iPhone não ampliar a tela (o shadcn já faz).
  • Números em coluna ou KPI com dígitos tabulares. Nada fora da escala. Nenhuma outra fonte, nem por imagem com texto.
  • Hierarquia dentro da box: título, descrição em muted-foreground, conteúdo, ação secundária. A tela não tem título: o nome é o breadcrumb.

1.4 Ícones

Lucide em todos os produtos: traço de 2px, cantos arredondados, sem preenchimento. Nenhuma outra biblioteca, nenhum emoji como ícone.

Tamanhos

12pxdentro de badge
12pxbotão xs
14pxbotão sm, separador do breadcrumb
16pxo padrão: botão, campo, célula, alerta, item de menu e da sidebar, estado vazio
20pxsó solto, ao lado de um título de seção

Regras

  • O componente do shadcn dimensiona o ícone; a tela não passa tamanho dentro de botão ou campo.
  • O ícone acompanha a cor do texto onde está. Cor própria só nas semânticas e no indicador de estado.
  • Ícone nunca vai sozinho sem nome acessível: botão só de ícone tem aria-label e tooltip.
  • Carregando não é ícone: é Skeleton ou Spinner.

1.5 Espaçamento, tamanhos, raio e elevação

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.

Escala

4
8
12
16
24
32
48

Onde cada espaço entra

Padding da página24px desktop · 16px celular
Entre boxes16px
Padding de card, modal e folha16px (card sm: 12px)
Entre campos20px
Rótulo, controle e ajuda8px
Ícone e texto num botão6px (4px no sm e no xs)
Padding horizontal de botão e campo10px (8px no xs)
Célula de tabela8px
Entre botões8px

Tamanhos

Controle padrão · sm · lg · xs32 · 28 · 36 · 24px (não existe xl)
Item de menu e de select · cabeçalho de tabela28 · 40px
Badge · switch20px · 32 × 18px
Item da sidebar32px (topo e usuário: 48)
Header da tela64px (48 com a sidebar recolhida)
Sidebar expandida · recolhida · gaveta256 · 48 · 288px
Painel da direita256px
Card de loginaté 384px
Modal: padrão · formulário · largo384 · 512 · 672px
Avatar32px (24 em lista densa, 40 em cabeçalho)

Raio

6px · rounded-md · item de menu, tooltip, botão sm
8px · rounded-lg · botão, campo, popover, menu, alerta
11px · rounded-xl · card, modal
redondo · badge, avatar, contador

Elevação

Box
Contorno de 1px em foreground a 10%, sem sombra. Card, tabela, formulário, painel.
Flutuante
Contorno e a sombra média (shadow-md). Menu, popover, select, toast. O modal tem só contorno, sobre o véu.

1.6 Tema e movimento

Tema claro e escuro

  • Os dois temas são obrigatórios. Toda tela é feita e conferida nos dois.
  • A escolha fica no menu do usuário, na linha "Tema", com o Sol e a Lua. Guardada por usuário.
  • Inicial de quem nunca escolheu: claro, ou o do sistema operacional quando a stack permitir.
  • Troca sem piscar e sem animação. Nenhum componente decide o que renderizar pelo tema: tudo é token.
  • Imagens que dependem do tema (o logo) têm as duas versões.

Movimento

  • Controles: 150ms. Flutuantes: as animações do shadcn, 100ms (modal, menu, popover, select) e 200ms (folha lateral).
  • Nada anima na troca de tema. Nada em loop, exceto o Spinner e o brilho do Skeleton.
  • Quem pede movimento reduzido no sistema operacional não vê animação nenhuma.
Código shadcn/ui · layout.tsx: fontes, tema e providers
Parte 2

UI Kit

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.

2.1 Botão

Rótulo é verbo. Ícone à esquerda. Um primário por contexto. Botão só de ícone tem nome acessível e tooltip, sem exceção.

Variantes

VarianteUsoQuantos por contexto
primarya ação principal do contexto1
secondaryação de apoio preenchidavários
outlineação de apoio, filtros, "Editar"vários
ghostcancelar, voltar, só de ícone em barracom moderação
linknavegação dentro de textocom moderação
dangersó ação destrutiva, só depois de confirmação ou dentro dela1

Tamanhos e estados

Editar Ações Nova fila

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.

Regras

  • Rótulo é verbo no infinitivo: "Salvar", "Excluir fila", "Nova fila". Nunca "OK", "Sim", "Clique aqui".
  • Ícone à esquerda, 16px, 8px de distância. À direita só para "abre algo": seta, chevron, link externo.
  • Desabilitado fica visível, a 50%, com tooltip explicando por quê quando o motivo não é óbvio.
  • Link com cara de botão é um link com o estilo do botão. Nunca um link dentro de um botão.
  • "Novo…" fica no canto superior direito do card que ele alimenta, no tamanho padrão (32px, a mesma altura da busca e dos filtros da barra), o único primário do card. Abaixo de 40rem de card, só o ícone, com nome e tooltip, como o último acima. Nunca no header.
  • Não existe botão "Atualizar": os dados se atualizam sozinhos (3.8). "Tentar de novo" continua nos estados de erro.
Código shadcn/ui · Botão

2.2 a 2.4 Campos, seleção e escolha

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.

Mostrar senha
Informe um número maior que zero.
Opcional
Até 8 opções. Acima disso, combobox com busca.
Abrir calendário
Digitável no formato do idioma. No calendário, mês e ano são dropdowns.

Checkbox, rádio e switch

Regras

  • Checkbox para escolha múltipla e para "aceito". Rádio para escolha única entre 2 e 5 opções; acima, select.
  • Switch só para ligar e desligar algo com efeito imediato. Dentro de formulário com "Salvar", é checkbox.
  • Ícone dentro do campo, à esquerda, em muted-foreground. Ação dentro do campo (mostrar senha, limpar) à direita, como botão só de ícone.
  • Foco: a borda vira ring e ganha um anel de 3px em ring a 50%. Erro: borda e anel em danger, e a mensagem diz o que fazer.
  • Seleção múltipla mostra chips dentro do controle, cada um com o seu "×" nomeado.
Código shadcn/ui · Campos

2.5 Badge

Pílula de 20px de altura, texto 12/500. Badge de status sempre leva ícone e texto, para não depender só da cor.

Neutro Primária Ativa Atrasando Inativa Em análise Contador:3128
Código shadcn/ui · Badge

2.6 Alerta

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.

Fila salva.
Não foi possível excluir: a fila tem 12 conversas abertas.
Desativar a fila devolve as conversas para a triagem.
Os contadores atualizam a cada 5 minutos.
Conexão perdidaReconectando. As mensagens enviadas agora ficam na fila.
Nota interna: o cliente não vê o que você escrever aqui.

Regras

  • success: deu certo e precisa ficar à vista; se é passageiro, é toast. danger: a ação não aconteceu. warning: tem consequência. info: contexto neutro.
  • Título só quando a mensagem precisa de manchete (o quinto exemplo). Com uma frase, só a descrição.
  • Pode ficar dentro de um modal: é o lugar da recusa do servidor numa confirmação.
  • Quando não é alerta: o que vale enquanto dura (o sexto exemplo) é indicador de estado, neutro, com role="status" e ícone próprio.
  • Erro de campo não é alerta: é a mensagem do campo. Erro ao carregar lista não é alerta: é estado vazio com "Tentar de novo".
Código shadcn/ui · Alerta

2.7 Toast

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.

Fila criada
Retenção já recebe conversas.
Não foi possível salvar
Tente de novo em instantes.
Nova conversa atribuída
Contato excluído

Regras

  • Toast é para o que não precisa ficar: "Fila criada", "Alterações salvas". O que precisa ficar é alerta.
  • Erro de formulário nunca é toast: vai no campo ou acima do rodapé.
  • Pausa com o mouse em cima. No máximo 3 ao mesmo tempo; o mais antigo sai.
  • Ação opcional ("Ver", "Desfazer") como botão ghost pequeno.
  • Leitor de tela anuncia o erro na hora e os outros quando puder.
Código shadcn/ui · Toast

2.8 Tooltip

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.

Recolher menu Ctrl B Notificações Assuma a conversa antes de transferir Passe o mouse. O primeiro está fixo para mostrar o atalho.
  • Fundo invertido (escuro no claro, claro no escuro), 12px, 6 × 12px de padding, raio 6, abre sem atraso.
  • Botão desabilitado não dispara tooltip: envolve-se num elemento que dispara (o terceiro exemplo).
  • Tooltip não guarda informação necessária: o que a pessoa precisa saber está na tela.
Código shadcn/ui · Tooltip e botão só de ícone

2.9 Card e KPI

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.

Horário de atendimento

Fora do horário, as conversas ficam na triagem.
Conversas hoje148
+12%
Espera média4 min
+40 s
  • KPI: rótulo em cima, valor 30/700 tabular embaixo, variação opcional como badge. No dashboard, uma linha em 12 muted-foreground diz o recorte: "Últimos 30 dias, contra os 30 anteriores" (3.1).
  • Grade de KPIs: 1 coluna no celular, 2 a partir de 28rem de contêiner, 3 ou 4 a partir de 42rem.
  • Card clicável inteiro tem hover e foco visível, e uma ação só.
Código shadcn/ui · Card e KPI

2.10 Tabela de dados

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
ComercialVendasARHP3AtivaAções
FinanceiroFinanceiroJP0InativaAções
RetençãoRetençãoELHP7AtivaAções
Suporte técnicoSuporteARELIT12AtivaAções

Menu do "…"

Todas as ações da linha num botão só. Nunca botões soltos na linha.

Regras

  • O "Novo…" fecha a barra de ferramentas, à direita, no tamanho padrão, como o resto da barra: o único primário do card. Card com título: nas ações do cabeçalho (2.1).
  • Toda listagem tem o padrão completo: busca, colunas ordenáveis, paginação, "…" e os estados (decisão do usuário, 2026-10-26).
  • Toda coluna de valor único ordena, inclusive telefone, e-mail e código; "Atendentes" ordena pela quantidade. Não ordenam: ações, seleção, etiquetas e texto livre longo. O aria-sort acompanha, e o ícone aparece só na coluna ordenada. Clique nos cabeçalhos.
  • Coluna de conjunto fechado vira filtro na barra: escolha única até 5 valores (Status, Setor); múltipla acima disso ou quando o normal é combinar (Atendentes). Até três à vista, o resto em "Filtros". Filtro ativo: borda na primária e contador; o texto continua em foreground.
  • Número alinhado à direita, com dígitos tabulares.
  • Primeira carga: linhas de Skeleton. Recarregando (busca, filtro, ordenação): os dados ficam e um Spinner aparece na barra. Nunca na releitura automática, em segundo plano.
  • Busca vai ao servidor com atraso de 300ms; lista inteira no cliente filtra sem atraso.
  • Lista paginada por cursor não pagina no cliente: mostra o que veio e "Carregar mais" no rodapé do card.
  • A página nunca rola para o lado: colunas secundárias somem antes; se precisar, só a tabela rola dentro do card.
Código shadcn/ui · Tabela de dados

2.11 Skeleton e Spinner

Duas situações, um componente cada. Nunca um texto "Carregando…" solto.

Skeleton

O componente ainda não tem os dados para aparecer. Mesmas alturas, larguras e colunas do conteúdo final.

Larguras fixas, nunca aleatórias.

Spinner

O componente já está na tela e uma informação está sendo buscada ou processada.
Enviando 3 de 10
  • 16px, no botão ou na barra de ferramentas. Nunca no lugar de um componente inteiro.
  • Nunca na releitura periódica em segundo plano, na do foco da janela ou na releitura depois de uma ação.
  • Toda chamada ao servidor tem um dos dois. Nenhuma tela fica muda esperando.
Código shadcn/ui · Skeleton e Spinner

2.12 Estado vazio

Dentro da box, no lugar do conteúdo. Primeiro uso convida a agir; filtro sem resultado oferece limpar; erro oferece tentar de novo.

Nenhum contato ainda

Cadastre o primeiro para começar.

Nenhum resultado para "retençao"

Confira a grafia ou limpe os filtros.

Não foi possível carregar

Tente de novo em instantes.

Código shadcn/ui · Estado vazio

2.15 Shell: sidebar, header e painel da direita

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.

MSMarcos Silvamarcos@empresa.com.br
Perfil
Configurações
Idioma
Tema
Sair
Recolher menu Ctrl B
Sem tempo real 3
Filas ativas3
Conversas em espera22
Espera média4 min
NomeSetorAtendentesEm esperaStatusAções
Suporte técnicoSuporte612Ativa
ComercialVendas43Ativa
FinanceiroFinanceiro20Inativa
RetençãoVendas37Ativa

Avisos desta tela

Desativar uma fila devolve as conversas para a triagem.
Os contadores atualizam a cada 5 minutos.
Fila criada
Retenção já recebe conversas.

Anatomia

Sidebar 256px
logo · empresa · grupos · itens · usuário no rodapé

recolhe para 48px (só ícones), o topo com a mesma altura
abaixo de 768px vira gaveta
Header 64px: recolher · breadcrumb · indicadores · ? · ✨ · sino. Nada mais.
Painel da direita 256px
opcional
só a partir de 1024px

o assistente de IA usa este lugar, com 384px
box
box
box
Rodapé 40px: uma linha, rola com a página

Regras

  • Grupos com rótulo e itens de 32px: ícone, rótulo, contador de 20px. Ativo em primária cheia, texto em primary-foreground: a 12% o texto não ficava nítido no escuro.
  • Rodapé padrão de uma linha no fim da coluna de conteúdo (2.21).
  • Estado recolhido guardado por usuário. Atalho Ctrl B (⌘ B).
  • À direita do header, nesta ordem: os indicadores, o ? da ajuda (2.28), o ✨ do assistente (2.29, só nos produtos com IA) e o sino, botões só de ícone ghost icon-sm, na altura do recolher. O header é só disso: nenhuma ação da tela vai nele.
  • Item cujas seções são telas próprias, como as configurações, abre o segundo menu (2.27) abaixo do header e continua ativo. O assistente de IA (2.29) usa o lugar do painel da direita, com 384px.
  • O conteúdo começa logo abaixo, sem título e sem barra de ações: a primeira box vem direto, e o "Novo…" fica no card que ele alimenta.
  • A tela preenche o painel da direita do shell; nunca monta um painel dentro do próprio conteúdo.
  • Breadcrumb: o grupo em muted-foreground, sem link; a tela em 500. Detalhe: "Grupo › Lista › Item".
  • Topo da sidebar em duas linhas de 48px: o logo do produto, com 32px de altura aberta e recolhida, e a troca de empresa (2.25) logo abaixo.
Código shadcn/ui · Shell e item do menu

2.20 Login

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.

Regras

  • Painel da marca: degradê de 135° da primária clara para ela 25% mais escura; sempre colorido, nos dois temas; texto branco; logo branco no canto, 32px; frase do produto em 36/44/700, até duas linhas; até três recursos com o ícone sparkles.
  • Coluna do formulário: fundo do tema, até 384px, centralizada na vertical. "Esqueci minha senha" à direita do rótulo da senha, na mesma linha. Botão de largura total. Linha de apoio com o e-mail de contato.
  • Rodapé (2.21) na coluna da direita, embaixo do formulário, já estendido: produtos à vista, carrossel passando, sem a seta (decisão do usuário, 2026-10-27: na largura toda, ficou feio). No celular, recolhido com a seta, para não empurrar o formulário.
  • Enviando: botão desabilitado com Spinner. Erro de credencial: alerta acima do botão, uma frase, sem dizer qual campo está errado.
  • Abaixo de 1024px o painel vira uma faixa no topo com o logo e a frase; abaixo de 640px, só o logo.
  • Recuperar senha, primeiro acesso e código de verificação usam a mesma estrutura.
Código shadcn/ui · Login

2.21 Rodapé

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.

O conteúdo da tela termina aqui. Clique na seta do rodapé: ele cresce com os produtos e a página fica mais alta, sem cobrir nada. Clique de novo ou Esc fecham.

Estendido

Aberto pela seta, como na demonstração acima, ou já estendido no login (2.20), na coluna da direita e sem a seta. É o mesmo bloco nos dois casos, sempre no fluxo da página, nunca por cima do conteúdo: fundo da página; borda em cima; sem raio e sem borda nos lados; sombra só para cima. Os textos e os produtos vêm da API, em SSG, consultada 1 ou 2 vezes por dia: API dos produtos.

Regras

  • A linha: 40px, borda superior, texto 12 em 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.
  • A seta: botão só de ícone 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.
  • Estendido, é o próprio rodapé crescendo, no fluxo da página: a parte estendida entra acima da linha, o rodapé fica mais alto e a página rola até mostrá-lo inteiro. Nada fica por cima do conteúdo (decisão do usuário, 2026-10-26). Fundo da página (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.
  • O carrossel: cards finos, de 240 × 54px (decisão do usuário, 2026-10-27): o card inteiro é o link do produto e abre em outra aba, com cursor de mão e fundo 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.
  • Celular: duas linhas centralizadas, CNPJ só na parte estendida, que vira folha de baixo com véu, a seta de fechar e os cards empilhados. No login pelo celular, recolhido com a seta.
  • Login: na coluna da direita, embaixo do formulário, já estendido e sem a seta. Tela de altura cheia: a linha fica abaixo da área que cresce; estendido, a área encolhe para dar lugar a ele.
  • Nunca: parágrafo institucional, carrossel ou cards no corpo da tela; rodapé fixo; abrir no hover; a parte estendida por cima do conteúdo ou com cara de painel flutuante; esconder a linha. Só a parte estendida fica guardada até a seta.
Código shadcn/ui · Rodapé

2.23 Abas

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.

Abas (line)

As visões de um card, no topo dele. Cada aba tem o seu conteúdo.

O andamento de cada produto, pelas datas de entrega.

Controle segmentado (default)

Troca o agrupamento do mesmo conteúdo, junto dele: trilho em muted, a ativa em background.

Entregas da equipe, uma barra por dia.

CritérioAbasControle segmentado
Para quêtrocar de visão: cada aba tem o seu conteúdotrocar o recorte ou o agrupamento do mesmo conteúdo
Ondeno topo do card, antes dos filtros (2.24)junto do que ele muda, dentro do conteúdo
Quantas2 a 6, uma ou duas palavras2 a 4, uma palavra

Regras

  • Mesma semântica nos dois: tablist com nome, tab com aria-selected, tabpanel ligado à aba.
  • Teclado do Base UI: setas movem o foco e voltam ao início; Home e End; Enter ou Espaço abrem. O painel recebe foco, com o anel do guia.
  • A aba aberta vive na URL, como os filtros. Sem espaço, as abas rolam na horizontal dentro do card; nunca duas linhas.
  • Aba não é navegação nem modo de exibição: trocar de tela é o menu, e as seções de uma área (as configurações) vão no segundo menu (2.27); Lista ou Kanban fica na barra de ferramentas.
Código shadcn/ui · Abas

2.24 Card de relatório

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.

Andamento por produto, pelas datas de entrega

3 produtos · 2 com entrega vencida · ordenado por entregas vencidas. O percentual é de entregas no prazo entre as que já venceram.
D.E.I.A. DEIA15 vivas · 8 entregues no períodoFCR p90 12h · 100% em 24h
13%
7 vencidas2 vencem em 7d
IdeiaOS OS104 vivas · 45 entregues no períodoFCR p90 11d 1h · 45% em 24h
46%
12 vencidas30 sem previsão
NF IDeia NF114 vivas · 194 entregues no períodoFCR p90 13d 4h · 62% em 24h
93%
4 vencem em 7d

Primeira carga, e aba aberta pela primeira vez: Skeleton no formato, com as abas e os filtros já usáveis.

Não foi possível carregar

Tente de novo em instantes.

Regras

  • Abas (2.23) no topo; filtros logo abaixo, nos controles de 32px: o período (2.22) vale para todas as abas, e os outros só aparecem na aba em que valem. Uma visão só: sem abas.
  • Conteúdo da aba: título e descrição com o recorte e a contagem, depois a lista, o gráfico ou a tabela.
  • Mudou um filtro, ou voltou a uma aba já vista: os dados ficam e o Spinner aparece no fim da linha de filtros. Erro e vazio no lugar do conteúdo, dentro do card.
  • Aba, período e filtros vivem na URL (?visao=pessoas&p=90d). Com mais de um card de relatório na tela, cada um usa um prefixo (entregas.visao).
  • Dashboard não usa card de relatório: mostra recortes fixos (3.1). Quem precisa filtrar abre um relatório.
Código shadcn/ui · Card de relatório

2.25 Troca de empresa

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.

Uma empresa só

O mesmo bloco, sem a seta e sem menu. Não é botão: não há o que clicar.
Empresa Exemplo12.345.678/0001-90

Lista

Duas ou mais empresas: menu ao lado do botão (embaixo, no celular), a ativa com o check.

Busca (Sysadmin)

Quem alcança todas as empresas: popover com busca no servidor por nome, razão social ou CNPJ, e "Ver todas as empresas" no fim.

Sidebar recolhida

Só o avatar da empresa, com tooltip. O botão encolhe para 32px e a linha continua com 48px: o topo não muda de altura.
Empresa Exemplo

Fora da empresa principal

Você está em Lumen Engenharia
Recolher menu Ctrl BPlataforma Tarefas

Regras

  • Botão de 48px: avatar quadrado de 32px (raio 8, 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.
  • A busca é popover, não menu: campo dentro de menu do Base UI não recebe o que se digita. Espera 300ms, skeleton na primeira carga, Spinner no rótulo enquanto recarrega, estado vazio e de erro com "Tentar de novo".
  • Trocar de empresa: Spinner no lugar da seta até o servidor confirmar; depois a mesma tela remonta limpa (sem filtro, busca, página nem linha aberta; um detalhe volta para a lista) e o toast avisa "Você está em Lumen Engenharia".
  • Fora da empresa principal (quem alcança todas): a faixa fixa acima do header, a mesma do "Ver como" (2.16), com 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.
  • Teclado: Enter, espaço ou seta para baixo abrem; setas andam pela lista; Enter escolhe; Esc fecha e devolve o foco ao botão.
  • Nunca no header nem no menu do usuário. Nunca o nome do produto no lugar do CNPJ: o logo, logo acima, já diz qual é o produto.
Código shadcn/ui · Troca de empresa

2.26 Kanban

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.

Minhas tarefas, no kanban

ListaKanban

No celular

Cerca de 1,5 coluna à vista, quase 2: cada coluna tem 60% do quadro, a próxima aparece pela metade e, ao soltar, o quadro encaixa no começo de uma coluna. A mesma altura fixa; o modo de exibição vai para a folha de "Filtros".

Minhas tarefas, no celular

Nova tarefa

Anatomia

  • Altura = janela − header − rodapé − respiros (− a faixa do "Ver como", quando ligada). No shell, a coluna de conteúdo ganha a altura da janela e cada nível até a coluna cresce com flex-1 e min-h-0.
  • Quadro de borda a borda do card, colunas de no mínimo 288px com 12px entre elas, barra horizontal à vista (10px, polegar em input).
  • Coluna em 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 da tarefa (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.
  • Compacto: só código, título e responsável. Lista: a tabela de dados (2.10), com paginação, e a página volta a rolar.

Regras

  • A página nunca rola com o quadro, e o cabeçalho da coluna nunca rola com os cards. Janela muito baixa: a área tem no mínimo 560px, e só então a página rola.
  • Arrastar e soltar entre colunas: a tarefa entra no topo da coluna nova e o toast avisa "Movida para Revisão", com Desfazer, que devolve a coluna e a posição.
  • Para quem usa teclado, e no celular, "Mover para ›" no "…" do card, um submenu com as outras colunas (2.14); aqui, por simplicidade, a lista vem direto no menu. Depois de mover, o quadro rola até o card e o foco volta ao "…" dele.
  • Barra de ferramentas (decisão do usuário, 2026-10-26): à esquerda, a busca, os filtros, "Filtros", os chips, Lista ou Kanban e Compacto; à direita, só Ordenar e "Nova tarefa" (3.5).
  • Primeira carga: colunas com o cabeçalho e cards em Skeleton. Nada no quadro com os filtros: o estado vazio no lugar do quadro. Erro: o estado de erro com "Tentar de novo".
Código shadcn/ui · Kanban

2.27 Segundo menu

Quando um item do menu reúne seções que são telas próprias, cada uma com a sua listagem ou o seu formulário (as configurações: Tags, Campos personalizados, SLA, Webhooks), elas vão num segundo menu: uma coluna de 224px abaixo do header, à esquerda do conteúdo, em muted. O "Geral" continua ativo na sidebar; a seção aberta fica destacada de leve, sem a primária. Troque o tema no topo: no escuro, o segundo menu fica um tom mais claro que a sidebar.

Abaixo de 1024px

O segundo menu vira um Select "Seção" no topo do conteúdo, antes da primeira box, com os mesmos grupos. Escolher navega para a seção.

Regras

  • Só no item cujas seções são telas próprias, cada uma com a sua URL (/configuracoes/tags; o item sem seção abre a primeira). Trocar de seção é trocar de tela: não são abas (2.23).
  • Abaixo do header, que fica igual ao das outras telas, e à esquerda do conteúdo, até o fim da janela: parado enquanto o conteúdo rola, com rolagem própria se as seções não couberem. O rodapé (2.21) fica na coluna do conteúdo.
  • 224px (w-56), fundo muted, borda à direita, padding 8. Itens de 32px, rótulo 14 e ícone de 16 opcional, raio 8. Mais de 6 seções: grupos com rótulo (12/500, muted-foreground), como os da sidebar.
  • No escuro, o muted fica um tom mais claro que a sidebar. No claro, a sidebar já é branca: o muted é o cinza leve que separa as duas colunas.
  • O item da sidebar continua ativo, em primária cheia, em qualquer seção. A seção aberta fica destacada de leve: fundo card, contorno edge e texto 500, sem a primária. Hover: card a 50%.
  • O breadcrumb ganha o terceiro nível, "Grupo › Item › Seção", com o item como link para a primeira seção. Voltar do navegador volta à seção anterior; recarregar mantém a seção.
  • Toda seção usa a largura toda que sobra, a listagem e o formulário (decisão do usuário, 2026-10-27): listagem em card, com o "Novo…" no canto do card (2.1); formulário em cards na mesma largura, campos em 2 colunas (3.4).
  • nav com nome ("Seções de Geral") e links, com aria-current="page" na seção aberta. O Tab passa pelos links; não é tablist nem tem setas. Seção sem permissão não aparece, e o grupo vazio some com o rótulo.
  • Nunca: abas para trocar de seção; segundo menu dentro de um card ou com título próprio; mais de um nível; uma seção só; a primária no item ativo.
Código shadcn/ui · Segundo menu: as seções das configurações

2.28 Passo a passo da tela e ajuda

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.

O menu de ajuda

O "?" abre um menu suspenso alinhado à direita. A Central de ajuda e o suporte só aparecem se o produto tiver.

O convite

Na primeira visita, sai do "?", sem roubar o foco. "Agora não", Esc ou clicar fora valem o mesmo: o convite não volta, e o passo a passo continua no "?".

Um passo aberto

Véu preto a 50%, nos dois temas, com o recorte na parte destacada; o cartão fica abaixo ou acima dela, onde couber.

Regras

  • O "?" (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).
  • O convite sai na primeira visita, depois que a tela carrega, sem modal nem outro flutuante aberto, e só com pelo menos 2 passos visíveis. É o 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).
  • O convite não rouba o foco: é anunciado (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.
  • De 3 a 5 passos, só da tela: a busca e os filtros, o "Novo…", o "…". Nada do menu nem do header. O último destaca o "?": "Para rever este passo a passo, é aqui.", com "Concluir".
  • Véu preto a 50% nos dois temas, sem desfoque, com o recorte na parte destacada (o raio dela e 4px de folga). A parte destacada não responde a clique.
  • Cartão: título de até 3 palavras e, à direita, "2 de 4" (12, 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.
  • Teclado: o cartão é um 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.
  • driver.js (MIT), com o cartão nas classes do 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.
  • Nunca: começar sozinho; mais de um convite por tela; mais de 5 passos; cartão sem "Pular"; o mesmo cartão fora do passo a passo (dica é tooltip, aviso é alerta).
Código shadcn/ui · Passo a passo da tela e o botão de ajuda

2.29 Assistente de IA

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.

Abrir, fechar e o painel

  • O ✨ (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.
  • Ao abrir, o foco vai para o campo de mensagem. O × do painel, o Esc (com o foco dentro dele) e o próprio ✨ fecham, e o foco volta ao ✨.
  • Encaixado à direita, 384px (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.
  • Sem espaço, abaixo de 1024px ou com a coluna de conteúdo abaixo de 640px (com o segundo menu, 2.27, por exemplo), abre por cima como folha da direita, com véu; no celular, a folha ocupa a tela toda.
  • Cabeçalho de 64px, com a borda de baixo na linha do header: ✨ e o nome (14/500); Nova conversa (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.
  • Aberto ou fechado fica guardado por pessoa, e a conversa continua ao trocar de tela: o painel é do shell, não da tela.

A conversa e as ações

  • Sem conversa: uma frase do que ele faz e de 2 a 4 sugestões da tela, outline sm, uma por linha. Se a tela tem passo a passo (2.28), uma delas é "Fazer o passo a passo desta tela".
  • A pergunta: balão 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).
  • Enquanto responde: "Pensando…" com o shimmer (parado para quem pede movimento reduzido), e o enviar vira Parar (square). Erro dentro da conversa, com "Tentar de novo"; nunca toast.
  • Toda mudança no sistema passa por uma confirmação: o cartão (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.
  • O campo: 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."
  • Só vê e faz o que a pessoa pode; o servidor revalida. Quando não resolve, oferece "Falar com o suporte", levando a tela e a conversa.
  • Nunca: balão flutuante ou janela por cima do conteúdo no desktop; abrir sozinho; mudar algo sem a confirmação; HTML da resposta inserido na página.
Código shadcn/ui · Assistente de IA: painel, conversa e confirmação

2.30 Área de administração

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.

Fora da área

A entrada, fixa acima do usuário, só para quem está como Sysadmin. Dentro da área, ela vira "Sair da administração".
TokenClaroEscuro
sidebar-admin (fundo)8%14%
sidebar-admin-accent (hover)14%22%
sidebar-admin-border20%30%

Quanto da primária do produto entra sobre a sidebar (a borda, sobre a border). O build confere o contraste em todo produto.

Regras

  • Só quem está como Sysadmin (2.16). Com outro papel, ou no "Ver como", a entrada some e a URL da área leva ao início; o servidor responde 404.
  • A entrada é um item como os do menu, fixo no pé da sidebar, acima do menu do usuário: à vista em qualquer tela, sem se misturar aos grupos. Recolhida, só o ícone shield, com tooltip.
  • A cor: a sidebar inteira ganha o tom suave da primária (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.
  • No topo, o bloco fixo "Administração · Todas as empresas" no lugar da troca de empresa (2.25). Não é botão.
  • O menu tem só os itens da área, em grupos: Cadastros (Empresas, Produtos) e Acesso (Usuários). "Sair da administração" volta para a tela de antes.
  • Breadcrumb "Administração › Produtos", e no detalhe "Administração › Produtos › Ideia Vault". Cada tela tem URL própria (/admin/produtos/ideia-vault).
  • As telas seguem os tipos de tela do sistema (3.1). Em Produtos, a cor do produto é dado: amostra com o hex, como a cor de uma tag.
  • No código, o layout da área marca 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.
  • Nunca: outra cor para marcar a área; itens da área no meio dos grupos do sistema; a entrada à vista para quem não está como Sysadmin; o seletor de empresa dentro da área.

Na demonstração ao vivo: entre como Marcos (Sysadmin) e clique em "Administração", no pé da sidebar.

Código shadcn/ui · Área de administração
Parte 3

Pattern Library

Os comportamentos que se repetem. Como as peças do kit se combinam numa tela.

3.1 Tipos de tela

TipoEstrutura
Lista (a maioria)card com a tabela de dados, com o "Novo…" no canto superior direito do card; criar e editar em modal
Dashboardgrade 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órioum card de relatório (2.24) por assunto: abas, filtros e conteúdo dentro do card
Detalhecards 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çãocards 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çãofora do shell, duas colunas: painel da marca e formulário

3.4 e 3.6 Formulários, tabelas e listas

Formulários

  • Criar e editar são o mesmo formulário, com os campos preenchidos na edição.
  • Em modal, por padrão, até 8 campos (recomendação, não limite). Maior que isso pode ser tela própria, com cards por grupo e "Cancelar" e "Salvar" no rodapé do último card.
  • 2 colunas no desktop, 1 no celular; campo longo ocupa a linha. Rótulo acima. 16px entre campos.
  • Ordem: o que identifica primeiro, o opcional por último.
  • Validação no envio, e daí a cada mudança do campo que falhou. Foco no primeiro erro.
  • Recusa do servidor: alerta danger acima do rodapé, sem fechar.
  • "Cancelar" e "Salvar" à direita. Salvando: desabilitado com Spinner. Sucesso: fecha e toast.
  • Fechar com alteração não salva pergunta: "Descartar alterações?".

Tabelas e listas

  • Toda listagem é tabela de dados: mesma barra de ferramentas, mesmo "…", mesmo rodapé.
  • Cards no lugar de tabela só quando o item é visual e tem no máximo 4 informações; a grade segue os mesmos estados.
  • Busca, filtro e ordenação ficam na URL e sobrevivem a recarregar a página.
  • Trocar de empresa ou de contexto remonta a tela limpa: busca, página e linha aberta zeradas.

3.5 Filtros: onde cada um fica

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.

Relatórios: um card de relatório, com as abas e o período dentro dele

Recolher menu
3

Andamento por produto, pelas datas de entrega

31 produtos · 13 com entrega vencida ou task bloqueada · ordenado por entregas vencidas. O % é das entregas que já venceram, quantas saíram no prazo.
D.E.I.A. DEIA15 vivas · 8 entregues no períodoFCR p90 12h · 100% em 24h
13%
10 vencidas5 sem previsão1 bloqueada7 esperando o dev
IdeiaOS OS104 vivas · 45 entregues no períodoFCR p90 11d 1h · 45% em 24h
46%
7 vencidas7 vencem em 7d51 sem previsão18 esperando o dev
NF IDeia NF114 vivas · 194 entregues no períodoFCR p90 13d 4h · 62% em 24h
93%
3 vencidas10 vencem em 7d42 sem previsão8 bloqueadas
  • A visão (Produtos, Pessoas, Equipe) é aba (2.23) no topo do card, e não um controle segmentado numa barra da tela (decisão do usuário, 2026-10-26). Nada de título na tela; o nome está no breadcrumb.
  • Os oito atalhos e os dois campos de data viram um botão só, que mostra o que vale e abre o popover com atalhos de um lado e "De" e "Até" do outro.
  • A frase que estava no header vira a descrição da visão, no topo do conteúdo; a contagem fica junto dela. Vencido, no prazo e a vencer usam as semânticas porque o dado é semântico.
  • Sem barra de ações e sem "Atualizar": o card começa logo abaixo do header, e os dados se atualizam sozinhos.

Minhas tasks: filtros, Lista/Kanban e Compacto à esquerda; à direita, só Ordenar e "Nova task"

Recolher menu
3
ListaKanban
Etiqueta: BloqueadaPrioridade: Alta

Entrada9

#CHAT-75088EPublicar em produção a tradução pt/en/es do Ideia Chat
MelhoriaIdeia Chat
0/2
17h 34m restantes
GMGabriel
#CHAT-91A2C0Revisar o template de e-mail de boas-vindas
FeatureIdeia Chat
GMGabriel
#NF-3C77A1Cancelamento de NFS-e pelo painel
BugNF IDeia
Venceu há 2 dias
GMGabriel

Refinamento3

#CHAT-8723B8Ideia chat · nova funcionalidade: conexão por QR code
FeatureBloqueada
1 mês restante
GMGabriel

Em execução4

#IVL-30A46D1.9 · Publicar a extensão na Chrome Web Store
IVL-2DF2EC-EPCFeature
2/11
5 meses restantes
GMGabriel

Revisão2

#DT-5B10E2Estimativa em horas na tarefa
FeatureIDeia DevTasks
GMGabriel
  • "Nova task" é o único primário e fica no card, no fim da primeira linha da barra de ferramentas (2.1). "Filtros", logo depois dos filtros à vista, é outline com o contador do que está ativo e abre um popover com todos os campos no mesmo formato; tudo aplica ao mudar, sem "Aplicar".
  • À vista, a busca e no máximo três filtros, os mais usados da tela. Os outros oito moram em "Filtros". Pessoa é o seletor múltiplo com busca do print 4: "Eu" fixo no alto, contagem e "Limpar" no rodapé, contador no gatilho.
  • Barra do kanban (decisão do usuário, 2026-10-26): à esquerda, os filtros, "Filtros", os chips de alternância ("Só o que é meu", "Ocultar concluídos"), Lista ou Kanban e Compacto; à direita, só Ordenar e "Nova task". O quadro tem altura fixa: rola na horizontal, e cada coluna na vertical (2.26).
  • A linha de chips removíveis só existe quando há filtro ativo fora do que está à vista, com "Limpar (n)" no fim. A contagem "23 tickets" vai para o rodapé da box.
  • No celular tudo recolhe para a busca e o botão "Filtros", que abre uma folha de baixo com todos os campos.

Acesso a projetos (Cockpit): a escolha é a primeira etapa

"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.

Decisões embutidas nos desenhos: não há barra de ações, e o escopo mora no card (decisão do usuário, 2026-10-26): a visão como abas no topo do card de relatório, e a escolha de que a tela depende como primeira etapa de uma listagem em duas etapas (3.18); no máximo três filtros à vista; filtro aplica ao mudar, sem "Aplicar"; o período como um botão só com popover; sem "Atualizar". Regras gerais que entram junto: filtro e ordenação vivem na URL; busca e filtro vão ao servidor com atraso de 300ms; filtro ativo sempre pode ser visto e removido sem abrir o painel; trocar de empresa zera os filtros.

3.7 a 3.9 Feedback, carregamento e estados

Qual componente para cada situação. A tabela decide; a tela não inventa.

SituaçãoComponenteOnde
Erro de um campomensagem do campoabaixo do campo
Recusa do servidor num formulárioalerta dangeracima do rodapé
Erro de uma ação fora de formulárioalerta dangerno card da ação; sem onde, toast de erro
Erro ao carregar uma listaestado vazio com "Tentar de novo"dentro da box
Deu certo, passageirotoast successcanto inferior direito
Deu certo, precisa ficaralerta successno card
Consequência que a pessoa precisa saberalerta warningonde a ação acontece
Contexto neutroalerta infono topo do card
Condição que vale enquanto duraindicador de estado, neutrojunto do que descreve
Processo longoSpinner com texto curtono lugar da ação
Primeira carga de qualquer coisaSkeleton no formatodentro da box
Recarga porque a pessoa mudou o pedido (busca, filtro, ordenação, aba)Spinner, dados mantidosbarra 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 sistemao sino; se acabou de chegar, toast do tipo dela com "Ver"header

3.10 Ações destrutivas

  • Excluir, desativar, encerrar, remover acesso: item por último no "…", depois do separador, em danger.
  • Confirmação em diálogo: pergunta no título, consequência em uma frase, botão danger com verbo e objeto ("Excluir fila"). O botão destrutivo nunca é o foco inicial.
  • O que dá para desfazer não confirma: faz e oferece "Desfazer" no toast por 6 segundos.
  • Depois: toast de sucesso, a lista atualiza, o foco volta a um lugar razoável.

3.11 Notificações (o sino)

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.

Notificações

Configurar notificações
Nova conversa atribuída
há 5 min
SLA da fila Comercial em atenção
há 32 min
Campanha enviada
ontem

Regras

  • Botão só de ícone no header, com o contador de não lidas na pílula primária.
  • Popover de 360px (no celular, folha): ícone do tipo, título de uma linha, hora relativa, "Ver" quando há destino. Não lida com fundo muted. Vazio: "Nenhuma notificação."
  • Cabeçalho: o título e duas ações, "Marcar todas como lidas" (ghost sm) e o botão settings com a dica "Configurar notificações", que abre as preferências.
  • A que acabou de chegar também aparece como toast do tipo dela, com "Ver".

Preferências de notificação

  • De cada pessoa, não da empresa, e só do app: os canais (no sino, som, navegador) e os tipos (novas conversas, tarefas atribuídas a mim, menções).
  • Cada switch salva na hora, com o toast "Preferência salva". Por isso o rodapé tem só "Fechar".
  • Ligar a do navegador pede a permissão no próprio clique. Bloqueada, o switch fica desabilitado e um alerta warning diz como liberar.
  • O e-mail fica só no Perfil, num switch "Notificações por e-mail", ligado por padrão. Configurações › Geral não tem mais o card "Notificações".
Código shadcn/ui · Notificações: o sino e as preferências

3.12 Responsividade

  • Mobile-first. Pontos de quebra da janela: 640, 768 e 1024px. Abaixo de 768 a sidebar vira gaveta; o painel da direita só existe a partir de 1024. O segundo menu (2.27) vira um Select abaixo de 1024; o assistente de IA (2.29) vira folha abaixo de 1024 ou quando o conteúdo ficaria com menos de 640px.
  • Dentro do shell, o componente mede o contêiner, não a janela: a sidebar e o painel tiram 512px da largura. Grades, tabelas, paginação e barras mudam de arranjo pela largura do elemento em volta.
  • A página nunca rola para o lado. Tabela que não cabe rola dentro do card; antes disso, esconde colunas secundárias.
  • Modal ocupa a largura no celular; formulário longo vira folha de baixo. Alvo mínimo de toque: 24 × 24px (WCAG 2.5.8); controle não cresce no celular, só o texto do campo vai a 16px.

3.14 Internacionalização

Todo sistema nasce preparado para pt-BR (padrão), en e es. Nenhum texto fixo no código.

Regras

  • Rótulo, mensagem, placeholder, tooltip, título e e-mail vêm de dicionário por idioma, com chave por contexto. Ícone e cor não substituem texto.
  • A troca fica no menu do usuário, em sigla, e vale na hora. Guardada por usuário; sem escolha, o idioma do navegador se for um dos três, senão pt-BR.
  • Texto cresce até 30% de um idioma para outro: nenhum rótulo com largura fixa, nenhum botão que corte texto. Plural e gênero vêm do dicionário.
  • Texto que vem do banco fica como está; só a interface traduz.

Formatos por idioma

A moeda é a do dado, não a do idioma.
pt-BRenes
Data22/10/202610/22/202622/10/2026
Hora14:052:05 PM14:05
Número1.234,561,234.561.234,56
MoedaR$ 1.234,56R$1,234.56R$ 1.234,56

3.15 Acessibilidade

  • Contraste mínimo 4,5:1 (3:1 para grande, ícone e borda). Foco visível em todo controle: borda em ring e anel de 3px a 50%, o do shadcn. Experimente com Tab nesta página.
  • Tudo opera por teclado: Tab na ordem visual, Enter e Espaço ativam, Esc fecha, setas navegam em menu e tabela.
  • Todo controle tem nome acessível: rótulo ligado ao campo; aria-label em botão só de ícone; tabela com cabeçalho; imagem informativa com alt.
  • Alerta tem role="alert"; indicador de estado, role="status"; toast é anunciado.
  • Cor nunca é o único sinal: status tem ícone e texto; erro tem mensagem; gráfico tem rótulo.
  • Movimento respeita a preferência do sistema. Nada pisca. Nunca o atributo title, nunca tabindex positivo, nunca foco preso fora de um modal.

3.16 Texto da interface

As IAs tendem a escrever demais. Aqui, não.

Regras

  • Uma frase por aviso, alerta, toast, descrição ou estado vazio. Se precisa de duas, a segunda é um link "Saiba mais".
  • Título de toast: até 5 palavras. Título de modal: até 6. Rótulo de botão: 1 a 3.
  • O texto é o que a pessoa precisa para decidir, não tudo o que é verdade sobre o assunto.
  • Botão é verbo + objeto: "Salvar", "Excluir fila", "Tentar de novo". Nunca "OK", "Sim", "Confirmar", "Clique aqui".
  • Erro diz o que aconteceu e o que fazer: "Não foi possível salvar. Tente de novo." Nunca código, stack ou "erro inesperado".
  • Sem "Por favor", sem "Ops", sem exclamação. Voz ativa, presente, direta. Maiúscula só na primeira palavra.
  • Nome das coisas pelo que a pessoa reconhece ("Notificações"), não pelo que o sistema faz ("Configuração de webhook").
Não foi possível salvar
Tente de novo.
Ops! Ocorreu um erro inesperado ao tentar salvar as alterações
Por favor, verifique sua conexão com a internet e tente novamente. Se o problema persistir, entre em contato com o suporte técnico informando o código ERR_500_DB_TIMEOUT.

À esquerda, o certo. À direita, o que não se escreve.

Glossário dos rótulos padrão

Usar sempre estes, nos três idiomas.
pt-BRenes
SalvarSaveGuardar
CancelarCancelCancelar
FecharCloseCerrar
ExcluirDeleteEliminar
EditarEditEditar
Novo / Nova …New …Nuevo / Nueva …
Atualizar (nunca botão de tela)RefreshActualizar
BuscarSearchBuscar
Filtrar · Limpar filtrosFilter · Clear filtersFiltrar · Limpiar filtros
Carregar maisLoad moreCargar más
Tentar de novoTry againIntentar de nuevo
Desfazer · VerUndo · ViewDeshacer · Ver
Entrar · SairSign in · Sign outIniciar sesión · Cerrar sesión
Perfil · ConfiguraçõesProfile · SettingsPerfil · Configuración
IdiomaLanguageIdioma
Tema · Claro · EscuroTheme · Light · DarkTema · Claro · Oscuro
AçõesActionsAcciones
OpcionalOptionalOpcional
Nenhum resultadoNo resultsSin resultados
CarregandoLoadingCargando
Bem-vindo de voltaWelcome backBienvenido de nuevo
Esqueci minha senhaForgot my passwordOlvidé mi contraseña

3.17 O que nunca fazer

Cor fixa na tela: hexadecimal, nome de cor ou paleta da biblioteca. Só tokens.
Título ou subtítulo na tela: o nome dela é o breadcrumb.
Menu, header ou painel lateral montado dentro da tela.
Ação ou filtro no header, ou numa barra solta acima da primeira box: vai no card a que pertence.
Mais de um botão primário no mesmo contexto.
Botão só de ícone sem nome acessível e tooltip. Atributo title em qualquer lugar.
"Carregando…" ou spinner no lugar de um componente que ainda não carregou: é Skeleton.
Aviso escrito à mão com texto colorido: é alerta. Quinto tipo de alerta.
Tabela solta sem barra de ferramentas, estados e "…". Botões soltos na linha.
Formulário sem feedback de erro; chamada ao servidor sem estado de carregamento.
Opacidade em texto de descrição ou de erro.
Fonte, ícone ou tamanho fora do guia. Emoji como ícone.
Texto fixo no código. Bandeira como idioma.
Sombra em box. Raio diferente de 8, 12 ou redondo.
"Sim" e "Não" numa confirmação. "OK" num botão. Frase explicando o sistema inteiro num toast.
Valor aleatório ou hora atual no primeiro render. Decidir o que renderizar pelo tema.
Botão "Atualizar" ou "Atualizado às": os dados se atualizam sozinhos.
Filtro ou período num dashboard: dashboard com filtro é relatório.

3.18 Listagem em duas etapas

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

Recolher menu
3
Ações
AR Ana Ribeiroana.ribeiro@empresa.com.brAtendente6
BT Bianca Torresbianca.torres@empresa.com.brAtendente9
BC Bruno Cardosobruno.cardoso@empresa.com.brDesenvolvedor6
CM Carla Mendescarla.mendes@empresa.com.brDesenvolvedora8
DF Diego Fontesdiego.fontes@empresa.com.brAnalista de qualidade8
EL Eduarda Linseduarda.lins@empresa.com.brAtendente4

As duas etapas

  • Etapa 1, as opções: tabela de dados completa (2.10): busca, colunas ordenáveis, filtro Cargo (8 valores: escolha múltipla), paginação e estados. A ação "Ver acessos ›" é o único botão da linha, com o nome da pessoa no nome acessível; a linha inteira também abre.
  • Etapa 2, a escolha: "← Pessoas" no topo, o título com o nome escolhido e a descrição com a contagem; depois, a tabela da etapa, também completa.
  • Escolha que não existe mais (o link de alguém que saiu): o título diz "Pessoa não encontrada", com o "← Pessoas".

Ida e volta

  • Desliza em 200ms; com movimento reduzido, troca sem animação.
  • Volta só pelo "← Pessoas" e pelo voltar do navegador. O Esc não volta: ele fecha camadas, e a etapa 2 não é camada (decisão do usuário, 2026-10-26).
  • A escolha fica na URL (?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).
  • Foco: ao ir, no título da etapa 2; ao voltar, na ação da linha de origem.
  • Breadcrumb com o terceiro nível: "Configurações da empresa › Acesso a projetos › Ana Ribeiro", com o nível do meio como link para a etapa 1.
Código shadcn/ui · Listagem em duas etapas
Parte 4

Implementação de referência: shadcn/ui + Tailwind

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.

4.1 A stack e 4.2 os tokens

CamadaPadrão
FrameworkNext.js (App Router) com React 19 e TypeScript. App sem servidor próprio: Vite + React
CSSTailwind CSS 4
Componentesshadcn/ui pelo CLI atual (primitivos Base UI), copiados para components/ui/. Composição pelo prop render, nunca asChild
Íconeslucide-react, importado sem o sufixo Icon
Temanext-themes, classe dark no html
Formuláriosreact-hook-form + zod + família Field, por Controller
Tabelas@tanstack/react-table v9 pelo guia Data Table do shadcn
FontesRoboto e Roboto Mono por next/font/google (no Vite, @fontsource-variable)
Classescn() de @/lib/utils
i18nnext-intl no Next; i18next no Vite (proposta, a confirmar)
Documentaçãosempre a da versão Base UI: ui.shadcn.com/docs/components/base/<componente>
Por produto mudam só --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.
app/globals.css · tokens completos

4.3 Mapa de componentes e 4.5 cuidados com o CLI

GuiashadcnComo
2.1 BotãoButtonvariant: 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 CampoField, FieldLabel, Input, FieldDescription, FieldError; InputGroup para íconesempre por Controller; nunca o conjunto antigo Form/FormField
2.3 Select, combobox, dataSelect; Combobox acima de 8 opções; Calendar num PopovercaptionLayout="dropdown"
2.4 EscolhaCheckbox, RadioGroup, Switch
2.5 BadgeBadgevariantes success, warning, info e danger (tingidas a 12%) no cva do badge.tsx, nível 3
2.6 AlertaAlert + AlertDescriptionvariantes success, warning, info no cva do alert.tsx, ícone fixo por variante
2.7 ToastToast por @/lib/toasttoast.success/error/info/warning(título, { description, action }); 6 s
2.8 TooltipTooltip, TooltipTrigger render, TooltipContentTooltipProvider na raiz; atalho em Kbd
2.9 Card, KPICard e partesKPI: CardTitle className="text-3xl font-bold tabular-nums"
2.10 TabelaTable + TanStack v9 + reutilizáveis do guiaum DataTable por tela, dentro de Card
2.11 CarregamentoSkeleton, Spinner
2.12 VazioEmpty e partes
2.13 ModalDialog; AlertDialog para confirmaçãoDialogClose render={<Button variant="ghost" />}
2.14 Menu suspensoDropdownMenuDropdownMenuItem variant="destructive" por último
2.15 ShellSidebar no bloco sidebar-07; painel da direita no sidebar-15; Breadcrumb, Separator, SidebarTriggeritem ativo cheio no sidebar.tsx (bg-sidebar-primary), nível 3
2.16 Menu do usuárioDropdownMenu no SidebarFooter, ToggleGroup para idioma e tema
2.17 a 2.19Breadcrumb · DataTablePagination · Avatar
2.20 Logingrid de duas colunas com Field, InputGroup, Buttonpainel 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-autoplayos dados vêm da API, no servidor (API dos produtos)

Três níveis de personalização

  1. Tokens no globals.css: onde mora a identidade. Trocar --primary muda tudo.
  2. className por instância, com cn(): ajuste pontual.
  3. Editar o arquivo em components/ui/: só para mudar o padrão global (variantes novas do Badge e do Alert, o item ativo do Sidebar, textos em pt-BR). add --overwrite desfaz: reconciliar à mão.

Cuidados com o CLI

  • Nada nosso em 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.
  • Nunca title, asChild, Link dentro de Button, style inline fora da cor do banco, onPress.
  • Nenhuma cor em classe: só tokens. Arranjo dentro do shell por @container, não por sm:/md:.
  • Projetos ainda em Tailwind 3 + Radix (DevTasks, Radar RH): mesmos tokens em HSL no tailwind.config, asChild no lugar de render; migram quando a tela for refeita.

Checklist antes de entregar uma tela

A tela só está pronta quando passa em tudo.

Para devs e IAs

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.

MCP do guia no Claude Code

O servidor está em https://design.ideiabusiness.com.br/mcp e exige o cabeçalho Authorization: Bearer <MCP_TOKEN>; sem ele, responde 401.

  1. Pegue o token no IdeiaVault: organização IdeiaBusiness › projeto Ideia Design System › ambiente prod › MCP_TOKEN. Ele nunca vai para o repositório nem para o chat.
  2. Uma vez por máquina (Linux, macOS ou WSL), cole o token quando o comando pedir. Ele não aparece na tela; o comando testa no servidor e guarda em ~/.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)"
  3. Em cada projeto, um .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"
        }
      }
    }
  4. Confira: abra o Claude Code na raiz do projeto, aprove o servidor e rode /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.
  5. Use: no dia a dia, o agente consulta sozinho (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
  6. Aplicar o guia em várias telas: o agente pergunta o escopo e os limites, mapeia tudo o que vai mudar em 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.

Para IAs sem MCP

Onde o guia vive

  • O MCP 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.
  • O CLAUDE.md ou AGENTS.md do projeto manda consultar o guia antes de criar ou alterar uma tela.

Pendências de marca

  • Versão escura (branca) do logo completo de DEIA, Vault, Cockpit, Plure e Agenda, e do ícone dos produtos que vieram num arquivo só.
  • Logo completo do IDeia Resources, que só tem o ícone.

API dos produtos

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çohttps://design-api.ideiabusiness.com.br/api/v1
ContratoSwagger (abre em outra aba), para ler e testar no navegador, e o OpenAPI em JSON (abre em outra aba), para gerar os tipos
Paineldesign-admin.ideiabusiness.com.br, só para o Sysadmin

Leitura dos sistemas (sem login)

Os caminhos partem do endereço acima. CORS aberto, só GET; não mande cookie nem Authorization.
Método e caminhoO que devolve
GET /footer?product=<slug>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 /productsOs 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/<slug>Um produto
GET /products/<slug>/globals.cssO globals.css do produto (shadcn/ui + Tailwind 4), o mesmo do get_tokens do MCP. Vem o arquivo, não JSON
GET /healthSe a API e o banco respondem: status ok ou degraded
GET /guide/productsOs 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

Como ler

  • <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.
  • Em SSG, consultando a API 1 ou 2 vezes por dia: a página sai pronta do build e o sistema só volta à API quando a revalidação vence, a cada 12 ou 24 horas (no Next, 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.
  • Cache: a borda da Vercel guarda a resposta por 5 minutos e, passado esse tempo, ainda entrega a anterior por até um dia enquanto busca a nova (public, max-age=60, s-maxage=300, stale-while-revalidate=86400).
  • Com a API fora, o sistema segue com a última resposta boa: o 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.
  • Arquivado: sai de /products e do rodapé, e /products/<slug> responde 404. As URLs dos logos dele continuam no ar.
  • Logos: use a URL que a API devolve. Ela traz o ?v= da versão atual, e um logo trocado chega com uma URL nova, sem esperar cache. Na tela, <img> ou <Image unoptimized>.
  • Cores: ficam compiladas no 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.
  • O guia também lê daqui. O build do site lê os produtos da API, e o painel pede um build novo a cada escrita: uma cor, um texto ou um logo trocado no painel chega ao guia, à /live e ao MCP em cerca de um minuto.

O envelope e os erros

Toda resposta em JSON vem no mesmo envelope: 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"
  }
}
Statuserror.codeQuando
404PRODUCT_NOT_FOUNDO slug não existe ou o produto está arquivado
404ROUTE_NOT_FOUNDO caminho não existe
422VALIDATION_ERRORParâmetro inválido; error.details traz cada campo, com path e message
500INTERNAL_ERROR, FOOTER_NOT_CONFIGUREDFalha 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.

O rodapé: GET /footer?product=ideia-chat

O que o componente do rodapé (2.21) recebe. Os textos da empresa se editam no painel, em Configurações › Rodapé.
CampoO que é
company.brandNameO nome da marca: "Um produto da …" e o nome da seta, "Produtos da …"
company.legalName, company.cnpjA razão social e o CNPJ, com a máscara, na linha do rodapé
company.emailO e-mail de contato, na linha do rodapé
company.title, company.taglineO título e a frase da parte estendida
company.aboutUrlPara onde o "Quem está por trás" leva
products[].slug, products[].nameO produto do card
products[].descriptionO texto do card: o do rodapé no cadastro do produto; vazio, o do login
products[].urlO endereço do produto; null, o card sai sem link
products[].iconO ícone claro (o logo claro, se o produto não tem ícone); null, sem imagem
Resposta de exemplo
{
  "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" }
}

Um produto: GET /products/ideia-chat

O mesmo formato de cada item de GET /products. Sem nada interno, como a observação ou quem alterou.
CampoO que é
slugFixo: não muda depois de criado. É também o nome dos arquivos dos logos
nameO nome do produto
familyideia ou propria (1.1)
pitch, descriptionO título e o texto do painel do login (2.20)
footerDescriptionO texto do card do rodapé (2.21); vazio, vale o description
siteUrlO endereço do produto, para onde o card do rodapé leva; null quando não tem
showInFooterSe o card do produto aparece no rodapé dos outros sistemas
colors.primaryA primária de cada tema e o texto sobre ela: light, lightForeground, dark e darkForeground (1.2)
colors.brandA primária clara, fixa nos dois temas: só o painel do login (2.20)
colors.linkO texto de link de cada tema, light e dark (1.2)
logosA URL de cada PNG que existe: clara, escura, icone-clara e icone-escura (1.1)
Resposta de exemplo
{
  "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" }
}

O painel (com login)

Só o painel administrativo escreve, e só o Sysadmin entra nele. Nele ficam Cadastros › Produtos (cadastrar, editar os textos, as cores e o rodapé de cada produto, arquivar) e Configurações › Rodapé (os textos da empresa). Os sistemas de produto nunca chamam estas rotas.
Método e caminhoO que faz
POST /auth/loginEntra com e-mail e senha e recebe o token (JWT)
POST /auth/githubEntra pelo GitHub: só quem é da organização Ideia-Business e está cadastrado como Sysadmin
GET /auth/me
POST /auth/logout
Quem está na sessão; sair
GET /admin/productsA lista, com busca (search), família (family), situação (status: ativos, arquivados ou todos), rodapé (footer) e em revisão (review)
POST /admin/productsCadastra um produto. O que faltar das cores sai da receita do guia (1.2)
GET /admin/products/<slug>
PATCH /admin/products/<slug>
Lê o produto, com as cores e os logos; edita só os campos enviados
POST /admin/products/<slug>/archive
POST /admin/products/<slug>/restore
Arquiva e tira do arquivo
POST /admin/products/<slug>/logos/<variante>/uploadsAssina o envio de um logo: o navegador sobe o PNG direto no armazenamento, num link que vale 5 minutos
POST /admin/products/<slug>/logos/<variante>Confere o arquivo enviado e publica como versão nova: a URL fixa troca e o cache do CDN é limpo
POST /admin/products/<slug>/logos/<variante>/versions/<n>/restoreVolta o logo para uma versão guardada
POST /admin/colors/deriveSugere a primária clara, a escura e o texto sobre elas a partir de uma cor, com o contraste do resultado
GET /admin/footer
PATCH /admin/footer
Os textos da empresa no rodapé
  • Sessão: o token vai no cabeçalho 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.
  • Contraste: toda cor salva passa pelas contas do guia (1.2); a que reprova é recusada com 422 CONTRAST_FAILED e os motivos.
  • Auditoria: toda escrita grava quem fez, o quê, o antes e o depois.
  • Logos: PNG com fundo transparente (pelo menos um canto), até 2 MB e 4096 px de lado; o ícone, quadrado, com 128 px ou mais; o logo completo, com 64 px de altura ou mais (1.1). O que não serve volta com 422 LOGO_INVALID e os motivos. Cada envio guarda uma versão, e o mesmo arquivo de uma versão antiga volta para ela.
Código Next.js · lib/ideia-design.ts: a leitura da API no servidor

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.