A lei visual do Hub Central
Esta página é o design system e nada além dele. Os valores não estão escritos aqui: são lidos de src/app/globals.css em tempo de build, pelo mesmo módulo que alimenta o npm run verifica:contraste. O documento normativo é Referência/06 - Design System.md; conflito entre os dois é defeito a relatar, não escolha a fazer.
Fundamento
Uma frase decide toda dúvida deste sistema: isso reduz ou aumenta a carga de função executiva? Não é metáfora. Hierarquia fraca, densidade alta e ruído visual custam atenção que o usuário deste sistema não tem sobrando — por isso contraste, foco e teclado aparecem como requisito de componente, e não como capítulo de polimento no fim.
O calendário responde quando. O Hub responde o quê.
Amostra da voz e da tipografia juntas: segunda pessoa, verbo na frente, sem emoji e sem exclamação. O sistema é uma ferramenta pessoal, não um app que precisa agradar.
Nunca uma folha em branco
Toda tela de trabalho abre com uma resposta já dada. Escolher o que fazer é o trabalho mais caro do dia.
Nunca preso ao palpite
A decisão automática é mostrada como decisão e desfeita em um clique, sem abrir painel.
Uma pergunta por vez
Divulgação progressiva vence formulário completo. Capturar mostra um campo; processar mostra um item.
O teste de saída
Alguém fluente em Linear, Notion ou Raycast senta nesta interface e confia nela de primeira, ou hesita a cada componente? A régua é familiaridade conquistada: a ferramenta deve sumir dentro da tarefa.
Cor
Estratégia contida: neutros levemente azulados e um único acento, tudo derivado do azul da marca PH SILVA. A cor pertence ao ALERTA — a área de vida está escrita na tela, e continua colorida apenas no evento publicado no Google, onde a cor é a única legenda possível (AD-030).
Evidência
Todo par abaixo é calculado, não estimado: OKLCH → sRGB → luminância relativa → razão WCAG. O mesmo módulo alimenta esta página e o npm run verifica:contraste, que trava o commit quando um par reprova.
246 pares verificados nos dois temas, 246 aprovados.
Superfícies
Três papéis: conteúdo (background, card), estrutura (sidebar) e apoio (muted, accent, secondary). No tema escuro o card é MAIS CLARO que a página — por isso ele, e não o fundo, é o pior caso nos cálculos.
Tema claro
--background
#ffffff · L 1
--card
#ffffff · L 1
--sidebar
#f6f7fa · L 0.977
--muted
#f2f4f8 · L 0.968
--accent
#ebf0f8 · L 0.955
--secondary
#f2f4f8 · L 0.968
--popover
#ffffff · L 1
Tema escuro
--background
#10141a · L 0.19
--card
#191d25 · L 0.23
--sidebar
#0b0e14 · L 0.165
--muted
#242932 · L 0.28
--accent
#29313d · L 0.31
--secondary
#242932 · L 0.28
--popover
#191d25 · L 0.23
Marca e controles
O azul da marca PH SILVA é o único acento, reservado a ação primária, seleção e estado corrente. --border é divisória decorativa e não tem piso; --input é o contorno que IDENTIFICA um controle e por isso precisa de 3:1.
Tema claro
--primary
#0c449b · L 0.41
--destructive
#c13c3b · L 0.55
--input
#88909c · L 0.65
--ring
#0c449b · L 0.41
--border
#e1e4e8 · L 0.918
Tema escuro
--primary
#6397ee · L 0.68
--destructive
#f2716a · L 0.7
--input
#626974 · L 0.519
--ring
#6397ee · L 0.68
--border
pode ter alfa — sem piso
Alertas
Oito estados do RN-04.3, dois tokens cada. A TINTA é sempre texto e ícone; o SUAVE é sempre preenchimento. Inverter os papéis produz um bloco saturado e é defeito de revisão.
Tema claro
Tema escuro
Energia
Rampa de cinco degraus dentro do matiz da marca. Piso de 3:1 porque é elemento gráfico, não texto — a informação está na contagem de barras, e a cor só reforça.
Tema claro
1
3.09:1passa, piso 32
3.93:1passa, piso 33
5.18:1passa, piso 34
6.91:1passa, piso 35
9.35:1passa, piso 3Tema escuro
1
3.15:1passa, piso 32
4.10:1passa, piso 33
5.36:1passa, piso 34
6.93:1passa, piso 35
8.44:1passa, piso 3Distinguibilidade dos selos
Contraste diz se dá para LER o selo; distância diz se dá para DIFERENCIAR um do outro. A régua é o par hoje × amanhã, que já convivia na paleta sem objeção (AD-030).
Tema claro · régua 0.1410
- atrasado × hoje0.0858
- amanha × semana0.1324
- hoje × amanha0.1410
- livre × nao-processado0.1482
Tema escuro · régua 0.1944
- atrasado × hoje0.1197
- hoje × amanha0.1944
- amanha × semana0.2412
- livre × nao-processado0.2429
Matriz completa
Todos os pares, um a um. Fica recolhida porque é referência de conferência, não leitura corrida — divulgação progressiva vale também para a documentação.
Ver a matriz completa dos 246 pares
Tema claro
Texto sobre superfície · piso 4,5:1
| token | background | card | sidebar | muted | accent | secondary | popover |
|---|---|---|---|---|---|---|---|
| foreground | 17.31:1passa, piso 4.5 | 17.31:1passa, piso 4.5 | 16.20:1passa, piso 4.5 | 15.78:1passa, piso 4.5 | 15.19:1passa, piso 4.5 | 15.78:1passa, piso 4.5 | 17.31:1passa, piso 4.5 |
| muted-foreground | 5.28:1passa, piso 4.5 | 5.28:1passa, piso 4.5 | 4.94:1passa, piso 4.5 | 4.81:1passa, piso 4.5 | 4.63:1passa, piso 4.5 | 4.81:1passa, piso 4.5 | 5.28:1passa, piso 4.5 |
| primary | 9.07:1passa, piso 4.5 | 9.07:1passa, piso 4.5 | 8.49:1passa, piso 4.5 | 8.27:1passa, piso 4.5 | 7.96:1passa, piso 4.5 | 8.27:1passa, piso 4.5 | 9.07:1passa, piso 4.5 |
| destructive | 5.29:1passa, piso 4.5 | 5.29:1passa, piso 4.5 | 4.95:1passa, piso 4.5 | 4.82:1passa, piso 4.5 | 4.64:1passa, piso 4.5 | 4.82:1passa, piso 4.5 | 5.29:1passa, piso 4.5 |
| accent-foreground | 12.70:1passa, piso 4.5 | 12.70:1passa, piso 4.5 | 11.88:1passa, piso 4.5 | 11.57:1passa, piso 4.5 | 11.14:1passa, piso 4.5 | 11.57:1passa, piso 4.5 | 12.70:1passa, piso 4.5 |
| secondary-foreground | 14.59:1passa, piso 4.5 | 14.59:1passa, piso 4.5 | 13.66:1passa, piso 4.5 | 13.30:1passa, piso 4.5 | 12.80:1passa, piso 4.5 | 13.30:1passa, piso 4.5 | 14.59:1passa, piso 4.5 |
| sidebar-foreground | 17.31:1passa, piso 4.5 | 17.31:1passa, piso 4.5 | 16.20:1passa, piso 4.5 | 15.78:1passa, piso 4.5 | 15.19:1passa, piso 4.5 | 15.78:1passa, piso 4.5 | 17.31:1passa, piso 4.5 |
| sidebar-accent-foreground | 14.60:1passa, piso 4.5 | 14.60:1passa, piso 4.5 | 13.66:1passa, piso 4.5 | 13.31:1passa, piso 4.5 | 12.81:1passa, piso 4.5 | 13.31:1passa, piso 4.5 | 14.60:1passa, piso 4.5 |
| card-foreground | 17.31:1passa, piso 4.5 | 17.31:1passa, piso 4.5 | 16.20:1passa, piso 4.5 | 15.78:1passa, piso 4.5 | 15.19:1passa, piso 4.5 | 15.78:1passa, piso 4.5 | 17.31:1passa, piso 4.5 |
| popover-foreground | 17.31:1passa, piso 4.5 | 17.31:1passa, piso 4.5 | 16.20:1passa, piso 4.5 | 15.78:1passa, piso 4.5 | 15.19:1passa, piso 4.5 | 15.78:1passa, piso 4.5 | 17.31:1passa, piso 4.5 |
Tinta de selo · piso 4,5:1
| token | background | card | sidebar | o próprio suave |
|---|---|---|---|---|
| alerta-atrasado | 5.36:1passa, piso 4.5 | 5.36:1passa, piso 4.5 | 5.01:1passa, piso 4.5 | 4.60:1passa, piso 4.5 |
| alerta-hoje | 5.27:1passa, piso 4.5 | 5.27:1passa, piso 4.5 | 4.94:1passa, piso 4.5 | 4.61:1passa, piso 4.5 |
| alerta-amanha | 5.12:1passa, piso 4.5 | 5.12:1passa, piso 4.5 | 4.79:1passa, piso 4.5 | 4.61:1passa, piso 4.5 |
| alerta-semana | 5.09:1passa, piso 4.5 | 5.09:1passa, piso 4.5 | 4.77:1passa, piso 4.5 | 4.61:1passa, piso 4.5 |
| alerta-proxima-semana | 5.15:1passa, piso 4.5 | 5.15:1passa, piso 4.5 | 4.82:1passa, piso 4.5 | 4.61:1passa, piso 4.5 |
| alerta-livre | 5.37:1passa, piso 4.5 | 5.37:1passa, piso 4.5 | 5.02:1passa, piso 4.5 | 4.86:1passa, piso 4.5 |
| alerta-nao-processado | 5.46:1passa, piso 4.5 | 5.46:1passa, piso 4.5 | 5.11:1passa, piso 4.5 | 4.88:1passa, piso 4.5 |
| alerta-concluido | 5.20:1passa, piso 4.5 | 5.20:1passa, piso 4.5 | 4.86:1passa, piso 4.5 | 4.68:1passa, piso 4.5 |
Energia e controles · piso 3:1
| token | background | card | sidebar |
|---|---|---|---|
| energia-1 | 3.09:1passa, piso 3 | 3.09:1passa, piso 3 | — |
| energia-2 | 3.93:1passa, piso 3 | 3.93:1passa, piso 3 | — |
| energia-3 | 5.18:1passa, piso 3 | 5.18:1passa, piso 3 | — |
| energia-4 | 6.91:1passa, piso 3 | 6.91:1passa, piso 3 | — |
| energia-5 | 9.35:1passa, piso 3 | 9.35:1passa, piso 3 | — |
| input | 3.23:1passa, piso 3 | 3.23:1passa, piso 3 | 3.03:1passa, piso 3 |
| ring | 9.07:1passa, piso 3 | 9.07:1passa, piso 3 | 8.49:1passa, piso 3 |
| sidebar-ring | 9.07:1passa, piso 3 | 9.07:1passa, piso 3 | 8.49:1passa, piso 3 |
Tema escuro
Texto sobre superfície · piso 4,5:1
| token | background | card | sidebar | muted | accent | secondary | popover |
|---|---|---|---|---|---|---|---|
| foreground | 15.96:1passa, piso 4.5 | 14.60:1passa, piso 4.5 | 16.65:1passa, piso 4.5 | 12.61:1passa, piso 4.5 | 11.37:1passa, piso 4.5 | 12.61:1passa, piso 4.5 | 14.60:1passa, piso 4.5 |
| muted-foreground | 6.91:1passa, piso 4.5 | 6.32:1passa, piso 4.5 | 7.21:1passa, piso 4.5 | 5.46:1passa, piso 4.5 | 4.93:1passa, piso 4.5 | 5.46:1passa, piso 4.5 | 6.32:1passa, piso 4.5 |
| primary | 6.35:1passa, piso 4.5 | 5.81:1passa, piso 4.5 | 6.63:1passa, piso 4.5 | 5.02:1passa, piso 4.5 | 4.53:1passa, piso 4.5 | 5.02:1passa, piso 4.5 | 5.81:1passa, piso 4.5 |
| destructive | 6.44:1passa, piso 4.5 | 5.89:1passa, piso 4.5 | 6.72:1passa, piso 4.5 | 5.09:1passa, piso 4.5 | 4.59:1passa, piso 4.5 | 5.09:1passa, piso 4.5 | 5.89:1passa, piso 4.5 |
| accent-foreground | 15.96:1passa, piso 4.5 | 14.60:1passa, piso 4.5 | 16.65:1passa, piso 4.5 | 12.61:1passa, piso 4.5 | 11.37:1passa, piso 4.5 | 12.61:1passa, piso 4.5 | 14.60:1passa, piso 4.5 |
| secondary-foreground | 15.96:1passa, piso 4.5 | 14.60:1passa, piso 4.5 | 16.65:1passa, piso 4.5 | 12.61:1passa, piso 4.5 | 11.37:1passa, piso 4.5 | 12.61:1passa, piso 4.5 | 14.60:1passa, piso 4.5 |
| sidebar-foreground | 15.96:1passa, piso 4.5 | 14.60:1passa, piso 4.5 | 16.65:1passa, piso 4.5 | 12.61:1passa, piso 4.5 | 11.37:1passa, piso 4.5 | 12.61:1passa, piso 4.5 | 14.60:1passa, piso 4.5 |
| sidebar-accent-foreground | 15.96:1passa, piso 4.5 | 14.60:1passa, piso 4.5 | 16.65:1passa, piso 4.5 | 12.61:1passa, piso 4.5 | 11.37:1passa, piso 4.5 | 12.61:1passa, piso 4.5 | 14.60:1passa, piso 4.5 |
| card-foreground | 15.96:1passa, piso 4.5 | 14.60:1passa, piso 4.5 | 16.65:1passa, piso 4.5 | 12.61:1passa, piso 4.5 | 11.37:1passa, piso 4.5 | 12.61:1passa, piso 4.5 | 14.60:1passa, piso 4.5 |
| popover-foreground | 15.96:1passa, piso 4.5 | 14.60:1passa, piso 4.5 | 16.65:1passa, piso 4.5 | 12.61:1passa, piso 4.5 | 11.37:1passa, piso 4.5 | 12.61:1passa, piso 4.5 | 14.60:1passa, piso 4.5 |
Tinta de selo · piso 4,5:1
| token | background | card | sidebar | o próprio suave |
|---|---|---|---|---|
| alerta-atrasado | 6.44:1passa, piso 4.5 | 5.89:1passa, piso 4.5 | 6.72:1passa, piso 4.5 | 4.87:1passa, piso 4.5 |
| alerta-hoje | 7.92:1passa, piso 4.5 | 7.24:1passa, piso 4.5 | 8.26:1passa, piso 4.5 | 5.95:1passa, piso 4.5 |
| alerta-amanha | 9.74:1passa, piso 4.5 | 8.91:1passa, piso 4.5 | 10.16:1passa, piso 4.5 | 7.24:1passa, piso 4.5 |
| alerta-semana | 9.96:1passa, piso 4.5 | 9.11:1passa, piso 4.5 | 10.39:1passa, piso 4.5 | 7.59:1passa, piso 4.5 |
| alerta-proxima-semana | 7.61:1passa, piso 4.5 | 6.96:1passa, piso 4.5 | 7.94:1passa, piso 4.5 | 5.77:1passa, piso 4.5 |
| alerta-livre | 7.45:1passa, piso 4.5 | 6.81:1passa, piso 4.5 | 7.77:1passa, piso 4.5 | 5.79:1passa, piso 4.5 |
| alerta-nao-processado | 7.25:1passa, piso 4.5 | 6.63:1passa, piso 4.5 | 7.56:1passa, piso 4.5 | 5.43:1passa, piso 4.5 |
| alerta-concluido | 7.28:1passa, piso 4.5 | 6.66:1passa, piso 4.5 | 7.60:1passa, piso 4.5 | 5.45:1passa, piso 4.5 |
Energia e controles · piso 3:1
| token | background | card | sidebar |
|---|---|---|---|
| energia-1 | 3.44:1passa, piso 3 | 3.15:1passa, piso 3 | — |
| energia-2 | 4.48:1passa, piso 3 | 4.10:1passa, piso 3 | — |
| energia-3 | 5.87:1passa, piso 3 | 5.36:1passa, piso 3 | — |
| energia-4 | 7.58:1passa, piso 3 | 6.93:1passa, piso 3 | — |
| energia-5 | 9.23:1passa, piso 3 | 8.44:1passa, piso 3 | — |
| input | 3.34:1passa, piso 3 | 3.05:1passa, piso 3 | 3.48:1passa, piso 3 |
| ring | 6.35:1passa, piso 3 | 5.81:1passa, piso 3 | 6.63:1passa, piso 3 |
| sidebar-ring | 6.35:1passa, piso 3 | 5.81:1passa, piso 3 | 6.63:1passa, piso 3 |
Tipografia
Switzer variável, uma família só. UI de produto não precisa de par display/corpo: contraste tipográfico exagerado vira ruído quando a tela tem muitos elementos de texto.
Escala — fixa em rem, nunca fluida
clamp() não serve a UI de produto: o usuário trabalha em DPI consistente, e um título que encolhe dentro de uma coluna fica pior, não melhor. Razão entre degraus de 1,125 a 1,2. Acima de text-2xl, nada.
Pesos
400 corpo · 500 títulos e ênfase · 600 título de página. 700 não é usado: font-medium faz aqui o trabalho que bold faria em outro produto.
400 — corpo do texto
500 — título e ênfase
600 — título de página
Números tabulares
Obrigatórios em horário, contador e duração, pelo atributo data-numerico. Sem isso a agenda dança quando 08:15 vira 09:00 — repare na coluna de baixo.
Com data-numerico
08:15 → 09:00
11:11 → 12:44
Sem o atributo
08:15 → 09:00
11:11 → 12:44
Medida
Prosa limitada a 65–75ch. Listas e dados podem correr mais densos; prosa, não.
O calendário responde quando e em qual área. O Hub responde o que exatamente fazer. Essa divisão é a tese do sistema, e é o que justifica publicar no Google em vez de reconstruir um calendário aqui dentro — o gatilho externo é andaime de função executiva, e andaime que ninguém vê não sustenta nada.
Espaço, forma e camada
Escala do Tailwind, base 4pt. Superfícies planas com elevação por anel de 1px; sombra reservada a sobreposição. O responsivo é estrutural, não tipográfico — o PWA é o mesmo código.
Ritmo
Hierarquia vem de espaço e peso antes de vir de tamanho. Espaçamento uniforme na página inteira é ausência de hierarquia — varie de propósito. Valor arbitrário como p-[13px] é defeito de revisão.
- gap-1 → gap-2.5
- dentro de uma linha: título e seus metadados
- gap-3 / gap-4
- entre irmãos: campos de um formulário, chips
- space-y-8 / 10
- entre seções de uma página
- p-4 → p-5
- interno de painel (celular → ≥ sm)
Raio
Uma escala derivada de --radius. Misturar raios sem motivo é o tipo de inconsistência que o usuário não sabe nomear, mas sente.
rounded-sm
rounded-md
rounded-lg
rounded-xl
rounded-2xl
Elevação
Superfície em repouso usa anel de 1px, como no Notion. Sombra é reservada a sobreposição — se tudo flutua, nada flutua.
Em repouso
Anel de 1px. É assim que card, painel e faixa se separam do fundo.
Sobreposto
Sombra só aqui: diálogo, popover, menu, dica.
Camadas
Escala semântica, nunca valor arbitrário. z-[999] e z-[9999] são defeito: significam que alguém perdeu a disputa e apelou.
- z-20
- cabeçalho de celular, barra inferior
- z-50
- fundo de diálogo, diálogo, popover, menu
- acima
- toast, gerido pelo Sonner
Densidade e alvo de toque
Mínimo de 44×44 no que é tocado com frequência, mesmo quando o desenho é menor. A moldura tracejada mostra o alvo real da caixa de concluir.
16px de desenho, 44px de alvo.
Movimento
Movimento comunica estado: mudança, feedback, carregamento, revelação. Nada além disso, e nenhuma coreografia no carregamento da página — o Hub abre dentro de uma tarefa.
Curvas e duração
150–250 ms na maioria das transições: o usuário está em fluxo e não quer assistir à coreografia. Saída em curva exponencial — sai rápido, assenta devagar. Sem bounce: o sistema não faz piada.
Com prefers-reduced-motion ligado no sistema operacional, esse movimento vira troca instantânea — a garantia está em globals.css e vale para toda a aplicação, inclusive para as animações que vêm da biblioteca de UI. Não é lembrete por componente.
Componentes base
shadcn/ui no estilo base-nova, sobre @base-ui/react. Não instale uma segunda biblioteca e não introduza um segundo conjunto de ícones — lucide-react é o conjunto do projeto.
Variantes
Uma forma de botão em todo o sistema. Se o botão de salvar tem aparência diferente em duas telas, uma das duas está errada.
Tamanhos
Estados
Os oito estados não são opcionais. O erro clássico é desenhar hover e esquecer foco — quem navega por teclado nunca vê hover. Tabule pelos botões abaixo para conferir o anel.
Campos
Rótulo visível sempre. Placeholder não é rótulo: some quando o campo é preenchido, e some justamente para quem mais precisaria dele.
Essa data não existe. Use dia/mês, como 03/09.
Controles
Alvo de toque de 44px mesmo quando o desenho tem 16. A caixa de concluir é o gesto mais repetido do dia.
Sobreposições
Diálogo é último recurso — esgote inline e divulgação progressiva antes. Todos portalizam, então nunca são cortados por um contêiner com overflow.
Componentes do domínio
Vivem em src/components/dominio/ e são o contrato entre design e implementação. Nenhum deles calcula: recebem valores já derivados no servidor. Se um dia precisarem de uma data para decidir um alerta, a regra vazou para o lugar errado.
Os oito estados
Matiz, ícone e palavra, sempre juntos. No tema claro as oito tintas vivem na mesma faixa de luminosidade por exigência de contraste — a cor sozinha não diz a urgência, e por isso ícone e palavra são obrigatórios, não enfeite.
Prazo concreto
Quando existe um prazo real, ele substitui a palavra na tela — e o rótulo canônico continua indo para o leitor de tela. O dado extra soma, não troca.
Só ícone — último recurso
A palavra some da tela, nunca do leitor de tela. Se você precisou disto em mais de um lugar, o problema é a densidade da lista, não o selo.
Medidor de energia
A informação está na contagem de barras. A altura cresce junto e a cor reforça — três canais para o mesmo dado, porque num dia ruim ninguém compara matizes.
1
2
3
4
5
A escala é uma só
O medidor não tem variante grande. Na linha de metadados ele é um metadado entre outros, e o teto da escada é a altura óptica dos ícones ao lado — o ícone ocupa caixa de 12px, mas o traço desenha uns 10, e é com a tinta que o olho compara. Um componente com dois tamanhos convida a escolher o errado.
ComputadorMarina
Variantes numa lista
Deliberadamente não é card: a tela de execução mostra dezenas destas, e card sobre card come altura útil. A separação é uma hairline; o agrupamento vem do espaço. Marque uma caixa para ver o estado concluído.
- há 3 dias — Atrasado
Fechar o escopo do orçamento da reforma
Proposta — Construtora ValeClientesComputador
- Vence hoje
Revisar o roteiro da gravação de quinta
Blazar Co.Computadorconteúdo
- Vence amanhã
Confirmar a escala do louvor
MinistérioCelularMarina
- Vence esta semana
Ler o capítulo 4 de Sistemas Distribuídos
FaculdadeCasa
- A qualquer momento
Reorganizar a estrutura de pastas do Drive inteiro, incluindo os arquivos antigos da faculdade que nunca foram migrados e continuam ocupando espaço
Desenvolvimento PessoalComputador
- Defina essa ação
Pagar
Celular
- Concluído
Enviar o contrato assinado
Clientes
Casos de borda de texto
O título corta em duas linhas. Só quem passa disso ganha o “ver mais”, no fim da segunda linha — quem cabe não mostra botão, reticência nem espaço reservado. Reduza a janela: o mesmo título que cabe no desktop transborda no celular, e o botão aparece sozinho.
- A qualquer momento
Ok
- Vence esta semana
Revisar a proposta da Construtora Vale antes da reunião de terça
Computador
- Semana que vem
Levantar com a coordenação do curso se a disciplina optativa de arquitetura de software conta como carga horária complementar para a segunda graduação, e se conta, quantas horas ela integraliza no histórico
Fechamento do semestreComputador
- Defina essa ação
Item sem nenhum metadado
Seletor de contexto
O escape do princípio “nunca preso ao palpite”: um clique, sem abrir painel. Navegue com Tab e depois com as setas — é um grupo de rádio nativo, então o teclado funciona sem uma linha de JavaScript.
Selecionado: todos
Seletor de área
Recebe as opções por prop, e essa diferença é proposital: área é dado que o usuário cria e renomeia. Congelar a lista no componente transformaria o design system em regra de negócio. Sem cor por área — aqui a área está escrita.
Selecionada: Clientes
Desativado
Estados de tela
Cinco obrigações. Não são polimento de fim de sprint: para quem tem TDAH, uma tela que não explica o que aconteceu não gera curiosidade, gera paralisia.
Vazio de partida
Ensina o próximo passo. “Nada por aqui” informa a ausência e não faz nada com ela — é defeito.
Seu Inbox está vazio
Capture qualquer coisa que esteja ocupando espaço na sua cabeça. Você decide o que ela é depois, no processamento.
Vazio de conquista
Havia itens e acabaram. É outro vazio, e confundir os dois faz o sistema parabenizar quem ainda não começou.
Nada vencendo hoje
Os itens com prazo para hoje já foram concluídos. O que sobra pode esperar — e essa é a informação útil.
Carregando
Skeleton que antecipa a forma da lista, nunca spinner solto. Salto de layout custa o foco inteiro de quem já está lutando para mantê-lo.
Erro
Três obrigações: o que falhou, o que NÃO foi perdido, e a saída. A segunda é a que mais some das mensagens de erro por aí.
Não deu para carregar esta lista
A conexão com o servidor falhou no meio do caminho. Seus itens estão a salvo — só esta tela não conseguiu buscá-los.
Sem rede
A captura offline saiu do escopo (AD-021), então o sistema diz isso na cara. Um “salvo!” que evapora destrói a confiança que faz o usuário parar de reconferir tudo à mão.
Você está sem rede
O Hub precisa de conexão para capturar e salvar. Nada foi perdido: nenhuma alteração foi enviada. Assim que a rede voltar, esta faixa some sozinha.
Sincronização — o quinto estado
O canal do Google expira e o sync para sem gerar erro nenhum. Falha silenciosa não é problema de infraestrutura, é problema de interface. Note que o sinal é a MUDANÇA DE FORMA; a cor só acompanha.
Agenda sincronizada há 2 min
A agenda não sincroniza há 2 dias
Sua agenda pode estar desatualizada nos dois sentidos. Reconectar leva alguns segundos e não altera nada do que já está marcado.
Lista longa
Rola dentro do próprio contêiner e termina com uma marca de fim. Sem ela o usuário rola mais um pouco só para conferir se acabou — atrito pequeno, repetido dezenas de vezes por dia.
- Atrasado
Item 1 de uma lista que não cabe na tela
- Vence hoje
Item 2 de uma lista que não cabe na tela
- Vence amanhã
Item 3 de uma lista que não cabe na tela
- Vence esta semana
Item 4 de uma lista que não cabe na tela
- Semana que vem
Item 5 de uma lista que não cabe na tela
- A qualquer momento
Item 6 de uma lista que não cabe na tela
- Defina essa ação
Item 7 de uma lista que não cabe na tela
- Concluído
Item 8 de uma lista que não cabe na tela
- Atrasado
Item 9 de uma lista que não cabe na tela
- Vence hoje
Item 10 de uma lista que não cabe na tela
- Vence amanhã
Item 11 de uma lista que não cabe na tela
- Vence esta semana
Item 12 de uma lista que não cabe na tela
- Semana que vem
Item 13 de uma lista que não cabe na tela
- A qualquer momento
Item 14 de uma lista que não cabe na tela
- Defina essa ação
Item 15 de uma lista que não cabe na tela
- Concluído
Item 16 de uma lista que não cabe na tela
- Atrasado
Item 17 de uma lista que não cabe na tela
- Vence hoje
Item 18 de uma lista que não cabe na tela
- Vence amanhã
Item 19 de uma lista que não cabe na tela
- Vence esta semana
Item 20 de uma lista que não cabe na tela
- Semana que vem
Item 21 de uma lista que não cabe na tela
- A qualquer momento
Item 22 de uma lista que não cabe na tela
- Defina essa ação
Item 23 de uma lista que não cabe na tela
- Concluído
Item 24 de uma lista que não cabe na tela
- Atrasado
Item 25 de uma lista que não cabe na tela
- Vence hoje
Item 26 de uma lista que não cabe na tela
- Vence amanhã
Item 27 de uma lista que não cabe na tela
- Vence esta semana
Item 28 de uma lista que não cabe na tela
- Semana que vem
Item 29 de uma lista que não cabe na tela
- A qualquer momento
Item 30 de uma lista que não cabe na tela
- Defina essa ação
Item 31 de uma lista que não cabe na tela
- Concluído
Item 32 de uma lista que não cabe na tela
- Atrasado
Item 33 de uma lista que não cabe na tela
- Vence hoje
Item 34 de uma lista que não cabe na tela
- Vence amanhã
Item 35 de uma lista que não cabe na tela
- Vence esta semana
Item 36 de uma lista que não cabe na tela
- Semana que vem
Item 37 de uma lista que não cabe na tela
- A qualquer momento
Item 38 de uma lista que não cabe na tela
- Defina essa ação
Item 39 de uma lista que não cabe na tela
- Concluído
Item 40 de uma lista que não cabe na tela
40 itens · fim da lista
Regras de auditoria
O que o Designer confere na entrega do Front-End, antes da revisão de segurança (AD-032). Duas severidades apenas: o que reprova bloqueia o merge; o apontamento entra na próxima passada. A aprovação final é sempre do Líder.
Reprova — bloqueia o merge
Cor literal (#hex, rgb(), oklch()) fora de globals.css.
Selo de alerta sem palavra, ou cor como único canal de significado.
Papéis de token invertidos: --alerta-X como fundo, --alerta-X-suave como texto.
outline: none sem substituto, ou elemento focável sem foco visível.
Percurso que não se completa só pelo teclado.
Contraste abaixo do piso — conferido por cálculo, não a olho.
Tela sem os estados de vazio, carregando, erro e sem rede.
Tela que não responde: como ela avisa que o dado pode estar velho?
Regra de negócio calculada no cliente (alerta, lista GTD, ordenação).
Alvo de toque abaixo de 44px no que é tocado com frequência.
Reordenação visual que quebra a ordem de tabulação.
Card dentro de card, ou grade de cards idênticos.
Valor de z-index arbitrário (z-[999], z-[9999]).
Emoji na interface, exclamação ou entusiasmo fabricado no texto.
Apontamento — corrige na próxima passada
- Espaçamento fora da escala do Tailwind sem justificativa em comentário.
- Ritmo uniforme demais: a página inteira com o mesmo respiro.
- Prosa passando de 75ch.
- Horário, contador ou duração sem o atributo data-numerico.
- font-semibold onde font-medium bastaria.
- Movimento acima de 250 ms, ou que não comunica mudança de estado.
- Vazio que informa a ausência sem ensinar o próximo passo.
- Diálogo onde divulgação progressiva inline resolveria.
Como a auditoria é feita, nesta ordem
npm run build,npm run lintenpm run verifica:contraste— se algum falha, a auditoria para aqui.- Detector determinístico do estelar sobre os arquivos alterados.
- Percurso completo só pelo teclado, nos dois temas, em largura de celular e de desktop.
- Conferência item a item da lista de reprovação, com o achado escrito como problema, regra violada e correção proposta.
- Devolução ao Front-End. Divergência que persiste sobe para o Líder e vira AD-NNN — nunca é resolvida no código pelo Designer.