16 KiB
| type | name | description | scope | trigger | priority | updatedAt |
|---|---|---|---|---|---|---|
| rule | refactoring-ui-hierarquia-despoluicao | Diretrizes obrigatórias do livro Refactoring UI (Steve Schoger & Adam Wathan) para eliminar poluição visual, excesso de bordas, botões concorrentes e falta de hierarquia nos frontends. | global | always_on | alta | 2026-10-26 |
Regra: Despoluição Visual e Hierarquia de UI (Refactoring UI)
Contexto
Interfaces geradas sem disciplina de hierarquia visual tendem a sair carregadas, barulhentas e confusas: cartões dentro de cartões com bordas e divisores em excesso (Card-ception), múltiplos botões coloridos sólidos competindo por atenção, dezenas de pares Rótulo: Valor com mesmo peso visual, tabelas espremidas com 10+ colunas e formulários esticados por toda a tela.
Toda construção ou refatoração em pacotes *-front (@front, @ux, @land) DEVE obedecer aos 6 pilares práticos de Steve Schoger & Adam Wathan (Refactoring UI).
- Obra de referência completa (consulta online no Paiol):
https://adm.paiol.idz.one/estaticos/Refactoring-UI-Steve-Schoger-Adam-Wathan.pdf
Regra
1. Hierarquia Visual por Peso e Contraste (Cap. 2 — Hierarquia é Tudo)
- 3 Níveis de Cor de Texto e 2 Pesos de Fonte:
- Pesos permitidos:
400/500para texto normal e600/700para ênfase (títulos, valores principais, células-chave). Proibido usar peso< 400ou fonte< 12pxpara des-enfatizar texto (reduz legibilidade). - Cores de texto: Primário escuro (
--cor-eli-primaria-texto#2E3F00ou#212529), Secundário médio (--cor-eli-neutro#5E6553ou#495057) e Terciário discreto para metadados auxiliares.
- Pesos permitidos:
- Enfatizar Des-enfatizando (Emphasize by de-emphasizing):
- Quando um elemento principal não se destaca, não aumente sua fonte ou saturação indefinidamente: reduza o contraste dos elementos que competem com ele (itens inativos, textos de apoio, barras laterais sem caixas pesadas).
- Rótulos são o Último Recurso (Labels are a last resort):
- Proibido empilhar listas ingênuas de
Rótulo: Valorvindas do banco de dados com igual peso visual. - Omitir o rótulo quando o formato ou contexto já identifica o dado (CNPJ, e-mail, telefone, status, moeda, data) ou combinar rótulo + valor em frase natural (
"12 etapas pendentes","R$ 15.000,00 de valor total"). - Quando o rótulo for necessário (ex.: cards de indicadores/KPIs), o valor é o protagonista (
20px–24px, peso600/700, cor escura) e o rótulo é secundário (12px, cor neutra suave).
- Proibido empilhar listas ingênuas de
- Separar Hierarquia Visual da Semântica HTML:
- Tags
<h1>,<h2>,<h3>em telas de aplicação funcionam como rótulos de seção: devem ser contidas (16px–20px, peso600), nunca títulos gigantes que roubam espaço da área de trabalho.
- Tags
- Equilibrar Peso e Contraste em Ícones (
@lucide/vue):- Ícones têm maior densidade superficial que texto. Ao acompanhar um rótulo, o ícone deve ter contraste suavizado (
colorneutra/secundária,:size="16"a"18",:stroke-width="1.75"ou"2") para não pesar mais que o texto.
- Ícones têm maior densidade superficial que texto. Ao acompanhar um rótulo, o ícone deve ter contraste suavizado (
- Proibido Texto Cinza ou Branco Translúcido em Fundos Coloridos:
- Sobre fundos coloridos, texto secundário nunca deve ser cinza puro nem branco com
opacityreduzida: escolher tom da mesma matiz com luminosidade ajustada (ex.:#2E3F00sobre#EEF3D0).
- Sobre fundos coloridos, texto secundário nunca deve ser cinza puro nem branco com
2. Pirâmide de Ações: A Semântica é Secundária (Cap. 2, p. 60)
- Apenas 1 Ação Primária Verdadeira por Vista/Seção:
- Somente a ação principal da tela recebe botão sólido de alto contraste (
color="primary" variant="flat").
- Somente a ação principal da tela recebe botão sólido de alto contraste (
- Ações Secundárias e Terciárias:
- Secundárias (ex.: Filtrar, Exportar, Voltar): usar
variant="outlined"ouvariant="tonal"com cor neutra/secundária escura (#3E4436/#495057). - Terciárias (ex.: Cancelar, Limpar, Ver mais): usar estilo discreto (
variant="text").
- Secundárias (ex.: Filtrar, Exportar, Voltar): usar
- Ações Destrutivas Discretas Fora do Modal:
- Ser uma ação destrutiva (Excluir, Remover, Arquivar) NÃO significa que o botão deva ser vermelho sólido e chamativo na página principal ou em cada linha da tabela.
- Na tela principal/listagem, ações destrutivas devem usar tratamento secundário/terciário discreto (
variant="text"neutro com hover em--cor-eli-erro, ou agrupadas emv-menu). O botão vermelho sólido (color="error" variant="flat") deve existir exclusivamente dentro do modal de confirmação.
3. Anti-Ruído: Use Menos Bordas e Zero Card-ception (Cap. 7, p. 238)
- Proibido Aninhar Cartões com Borda (Card-ception):
- NUNCA colocar
v-cardcom borda (variant="outlined"ouborder) dentro de outrov-cardcom borda, nem inserir<v-divider>a cada par de linhas.
- NUNCA colocar
- 3 Alternativas Obrigatórias ao Excesso de Bordas:
- Contraste de superfície: posicionar o card branco (
--cor-eli-superficie#FFFFFF) diretamente sobre o fundo neutro da página (--cor-eli-fundo#F2F3EEou#EBEDF0), dispensando bordas pesadas. - Sombra sutil de elevação: usar
box-shadowleve para delinear o container sem linha dura. - Espaçamento extra: aumentar a distância entre grupos (
24px–32px) em vez de desenhar linhas divisórias (<v-divider>).
- Contraste de superfície: posicionar o card branco (
4. Espaço em Branco, Proximidade e Largura Ideal (Cap. 3, p. 66–99)
- Começar com Espaço em Branco Generoso:
- O respiro visual (
pa-6,ga-6) é o padrão; compactar apenas deliberadamente em tabelas operacionais densas.
- O respiro visual (
- Evitar Espaçamento Ambíguo (Lei da Proximidade):
- Deve haver sempre mais espaço ao redor de um grupo do que dentro dele:
- Entre label e input:
4px–6px - Entre um campo e o próximo campo:
16px–20px - Entre seções distintas de um formulário/tela:
32px–40px
- Entre label e input:
- Deve haver sempre mais espaço ao redor de um grupo do que dentro dele:
- Não Preencher a Tela Inteira sem Necessidade:
- Formulários simples, cartões de leitura ou configurações não devem ser esticados em
100%da largura (1360px+). Limitar à largura ideal (max-width: 640px–800px) ou usar layout em 2 colunas assimétricas (título e texto explicativo da seção à esquerda em4 cols+ card de campos à direita em8 cols).
- Formulários simples, cartões de leitura ou configurações não devem ser esticados em
- Larguras Fixas Onde Necessário:
- Não usar colunas fluidas percentuais para elementos que exigem largura fixa otimizada (menus laterais, colunas de ações, avatares, badges de status).
5. Tabelas Escaneáveis e Tipografia Refinada (Caps. 4 e 7, p. 102–135, 242)
- Combinar Colunas Relacionadas em Tabelas:
- Proibido criar tabelas espremidas com 8–15 colunas onde cada campo vira uma coluna isolada.
- Combinar dados correlatos em uma única célula com hierarquia de 2 linhas (ex.: Linha 1 em
14pxpeso600escuro com Razão Social; Linha 2 em12pxpeso400neutro com CNPJ • Município/UF).
- Alinhamento e Ritmo Tipográfico:
- Textos alinhados à esquerda; números, quantidades e valores monetários alinhados à direita com
font-variant-numeric: tabular-nums. - Comprimento de linha de parágrafos e textos de ajuda limitado a
45ch–75ch. line-heightinversamente proporcional ao tamanho da fonte:1.15–1.25para títulos grandes/números de KPI e1.5para corpo de texto.- Alinhar pela linha de base (
align-baseline) ao misturar tamanhos de fonte na mesma linha (ex.: título + subtítulo/contador). - Textos em
UPPERCASE(cabeçalhos de tabela, siglas, badges) devem ter tamanho reduzido (11px–12px), peso600eletter-spacing: 0.05em.
- Textos alinhados à esquerda; números, quantidades e valores monetários alinhados à direita com
6. Contraste Invertido, Ícones e Estados Vazios (Caps. 5, 6 e 7)
- Contraste Invertido em Badges e Alertas (p. 162):
- Evitar múltiplos chips/badges com fundo escuro saturado que competem com o botão primário. Usar fundo claro suave (
stop 50/100) + texto escuro da mesma matiz (stop 800/900). Nunca confiar apenas na cor (combinar com ícone ou rótulo explícito).
- Evitar múltiplos chips/badges com fundo escuro saturado que competem com o botão primário. Usar fundo claro suave (
- Tamanho Pretendido de Ícones e Bordas de Acento (p. 208, 224):
- Proibido ampliar ícones de
16–24pxpara48px–64pxa seco (ficam grosseiros). Para destaque em empty states ou cabeçalhos de cards, manter o ícone em20px–24pxdentro de um container arredondado (40px–48px) com fundo suave (--cor-eli-primaria-bg). - Usar bordas de acento (
border-topouborder-left: 3px solid var(--cor-eli-primaria)) em cards de resumo ou alertas para dar acabamento sem ruído.
- Proibido ampliar ícones de
- Estados Vazios Despoluídos (p. 234):
- Quando uma coleção estiver inicialmente vazia (zero registros criados), ocultar barras de filtros secundárias, abas vazias e paginação, exibindo somente o Empty State orientador com o botão de ação primária (CTA).
7. Ergonomia Cognitiva, Orçamento de Viewport e Organização de Telas, Modais e Painéis (Leis de Sweller, Hick, Miller e Material Design 3)
Mesmo respeitando pesos tipográficos e ausência de bordas, uma tela continuará carregada e cansativa se desperdiçar espaço de tela com múltiplas barras fixas, colidir painéis laterais ou pendurar dezenas de pílulas coloridas em cada linha. Todo frontend deve obedecer a 5 limites quantitativos de ergonomia espacial:
- Orçamento de Viewport (Regra 75/25) e Teto de 2 Faixas no Topo:
- Em uma tela desktop padrão (
1366x768ou1440x900), no mínimo 70%–75% da área da janela deve pertencer ao canvas principal de trabalho (lista, árvore, tabela, Gantt, Kanban). - Proibido empilhar 3 a 6 barras horizontais de cabeçalho/filtros/formulários inline acima do conteúdo. O cabeçalho operacional de uma visão deve consolidar-se em no máximo 2 faixas horizontais enxutas:
- Faixa 1 (Contexto): Título do contexto ativo + KPIs resumidos inline + ações secundárias discretas/compactas.
- Faixa 2 (Operação): Seletor de visão/abas + busca/filtros integrados + botão
+ Novo(revelando campos de criação inline ou modal sob demanda, sem manter formulários multi-campo abertos permanentemente roubando altura).
- Em uma tela desktop padrão (
- Prevenção de Colisão de Painéis Laterais (Sidebar Mutual Exclusion):
- Proibido manter abertos simultaneamente um Menu Lateral de Navegação (
240px–280px) e um Painel Inspetor de Detalhes (400px–440px) quando a soma dos painéis laterais consumir mais de 30%–35% da largura da tela, espremendo o conteúdo central. - Ao abrir um Painel Inspetor (
Master-Detail) ou alternar para visões de alta densidade horizontal (Cronograma Gantt/Quadro Kanban), o menu lateral secundário deve recolher automaticamente (auto-collapse), liberando largura para a área de trabalho.
- Proibido manter abertos simultaneamente um Menu Lateral de Navegação (
- Orçamento de Densidade por Linha/Card (Teto de 3 Indicadores em Repouso):
- Cada linha de árvore/lista ou card Kanban em estado de repouso deve exibir no máximo 3 sinais visuais além do título (ex.:
1. Checkbox/Ícone de modalidade,2. Prazo ou Progresso X/Y,3. Indicador de bloqueio ou status crítico). - Proibido o "Natal de Badges" (empilhar 5 a 7 pílulas coloridas de modalidade, dependência, barra de progresso, moeda, data, responsável e status em cada linha, nem pintar todas as linhas concluídas com fundos e bordas saturadas).
- Ações secundárias de linha (ex.:
+ Sub,Editar,Excluir) devem ficar ocultas ou discretas em repouso, revelando-se em:hoverou:focus-within(opacity-0 group-hover:opacity-100).
- Cada linha de árvore/lista ou card Kanban em estado de repouso deve exibir no máximo 3 sinais visuais além do título (ex.:
- Revelação Progressiva Intra-Painel (Inspetor em Acordeão & Zero Card de Resumo Redundante):
- Painéis inspetores (
Drawer/Aside) nunca devem iniciar com um "Card de Resumo" que duplica os mesmos dados já visíveis na linha selecionada e nos blocos editáveis imediatamente abaixo. - No máximo 2 seções primárias (Identificação/Prazo e Entrega) devem iniciar abertas. Seções relacionais secundárias (Pré-requisitos/Dependências, Recursos e Custos, Responsáveis) devem utilizar seções colapsáveis (Acordeão) exibindo o resumo no próprio cabeçalho (ex.:
Recursos e custos (2 • R$ 2.424,00)) e abrindo a lista/formulário apenas quando expandidas pelo usuário.
- Painéis inspetores (
- Matriz de Superfícies, Chunking de Telas e Regiões Fixas em Modais/Painéis (Material Design 3):
- Agrupamento temático em telas (Chunking): Dividir formulários longos em blocos lógicos de no máximo 4 a 6 campos encabeçados por título curto em Sentence case (
16px–20px, peso600, sem:e sem.). - Modais Básicos (Basic Dialogs,
400px–560px): Usar com parcimônia, apenas para confirmações críticas/destrutivas ou decisões rápidas (até 3–4 campos). Proibido usar modal para feedback passivo de sucesso (usarv-snackbar) ou formulários extensos de 6+ campos (usar Side Sheet ou Página). - Regiões Fixas (Pinned Header & Footer): Em modais (
v-dialog) e painéis laterais (Side Sheets), o Cabeçalho no topo (com título em Sentence case e botão fecharXnos painéis) e a Barra de Ações no rodapé ([Cancelar]+[Verbo específico], nuncaSim/Não/OK) devem permanecer sempre fixos, rolando apenas o corpo central caso necessário.
- Agrupamento temático em telas (Chunking): Dividir formulários longos em blocos lógicos de no máximo 4 a 6 campos encabeçados por título curto em Sentence case (
Exemplos
❌ Incorreto — Tela carregada (Card-ception, botões brigando e rótulos redundantes)
<v-card variant="outlined" class="pa-2">
<h1 class="text-h3">Listagem de Solicitações</h1>
<v-divider class="my-2" />
<v-card variant="outlined" class="pa-2 mb-2">
<div><strong>Razão Social:</strong> Organização Vale Verde</div>
<v-divider class="my-1" />
<div><strong>CNPJ:</strong> 12.345.678/0001-90</div>
<v-divider class="my-1" />
<div><strong>Status:</strong> Em andamento</div>
<div class="d-flex ga-2 mt-2">
<v-btn color="primary" variant="flat">Editar</v-btn>
<v-btn color="success" variant="flat">Concluir</v-btn>
<v-btn color="warning" variant="flat">Exportar</v-btn>
<v-btn color="error" variant="flat">Excluir</v-btn>
</div>
</v-card>
</v-card>
✅ Correto — Hierarquia clara, menos bordas, Sentence case e pirâmide de ações (Refactoring UI + M3)
<section class="pa-6">
<header class="d-flex align-baseline justify-space-between mb-6">
<div>
<h1 class="text-h6 font-weight-semibold">Solicitações ativas</h1>
<p class="text-body-2 text-medium-emphasis">12 solicitações registradas no período</p>
</div>
<div class="d-flex align-center ga-3">
<v-btn color="secondary" variant="outlined">Exportar</v-btn>
<v-btn color="primary" variant="flat">Nova solicitação</v-btn>
</div>
</header>
<v-card flat class="pa-5 bg-surface rounded-lg">
<div class="d-flex align-center justify-space-between">
<div>
<div class="text-subtitle-1 font-weight-semibold">Organização Vale Verde Ltda.</div>
<div class="text-caption text-medium-emphasis">12.345.678/0001-90 • Criciúma/SC</div>
</div>
<div class="d-flex align-center ga-2">
<v-btn color="secondary" variant="tonal" size="small">Concluir</v-btn>
<v-btn variant="text" size="small">Editar</v-btn>
<v-btn variant="text" color="error" size="small">Excluir</v-btn>
</div>
</div>
</v-card>
</section>
Impacto
Elimina o aspecto amador, sobrecarregado e confuso das interfaces geradas pela IA, garantindo telas limpas, escaneáveis e com hierarquia visual profissional em todo o ecossistema.
Referências
- Livro completo no Paiol:
https://adm.paiol.idz.one/estaticos/Refactoring-UI-Steve-Schoger-Adam-Wathan.pdf - Material Design 3 — Writing, Layout, Dialogs & Side Sheets:
https://m3.material.io/foundations/writing/best-practices,https://m3.material.io/components/dialogs/guidelines,https://m3.material.io/components/side-sheets/guidelines - Rule:
global/rules/mensagens-usuario - Rule:
global/rules/estilos-design-system - Skill:
skills/ux/SKILL.md - Skill:
skills/ux-fluxo-funcional/SKILL.md - Skill:
skills/auditar-ux-heuristicas/SKILL.md