UI Polish - Detalhes que Fazem a Interface Parecer Melhor

SkillAI & models

Skill de polish de interface — os detalhes pequenos que fazem uma UI parecer refinada em vez de "ok". Use ao construir componentes, revisar codigo frontend, implementar animacoes, hover states, sombras, bordas, tipografia ou qualquer trabalho de detalhe visual. Trigger em: "polish", "deixar mais refinado", "parece meio off", "acabamento", "border radius", "alinhamento optico", "font smoothing", "tabular numbers", "shadow em vez de border", "sombra pra dar profundidade", "stagger na animacao de entrada", "animacao de saida", "scale on press", "stagger animation", "hit area", "image outline", "revisar detalhes visuais".

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the UI Polish - Detalhes que Fazem a Interface Parecer Melhor skill

What this skill tells your AI

The instructions your AI receives, as published by felvieira/claude-skills-fv in skills/52-ui-polish/SKILL.md and read by ahel’s review.

Grandes interfaces raramente vêm de uma coisa só. É uma coleção de pequenos detalhes que se acumulam. Esta skill entra depois que Frontend (04) e/ou Motion Design (12) já produziram o componente — ela revisa e ajusta acabamento, não substitui a estrutura.

Para projetos sem Framer Motion (ou quando a transição é puramente CSS), copiar direto de templates/transitions.css em vez de reescrever a regra em prosa — o arquivo tem snippets nomeados (t-fade, t-scale-press, t-icon-swap, etc.) já com guard de prefers-reduced-motion embutido. Os valores no CSS espelham os princípios abaixo; se um valor mudar aqui, replicar no arquivo.

Governanca Global

Esta skill segue GLOBAL.md, policies/execution.md, policies/handoffs.md, policies/token-efficiency.md e policies/evals.md.

Para exemplos extensos de CSS/Tailwind/Motion por categoria, consultar docs/skill-guides/ui-polish.md apenas quando necessario.

Quando Usar

  • revisar ou ajustar acabamento visual de componentes ja implementados
  • implementar animacoes de entrada/saida, hover states, micro-interacoes de icone
  • resolver feedback subjetivo tipo "parece meio off" ou "falta polish"
  • checklist final antes de considerar um componente "pronto"

Quando Nao Usar

  • para definir estrutura, layout ou fluxo de tela do zero (isso e 02-ui-ux-design)
  • para corrigir layout quebrado em mobile — componente que nao ocupa 100%, corta na tela, scroll horizontal, modal estourando viewport (isso e 56-responsive-conversion). Polish sobre layout quebrado e desperdicio: corrigir a estrutura primeiro, refinar o acabamento depois
  • para sistema de motion tokens ou orquestracao de animacao em escala (isso e 12-motion-design — esta skill foca em detalhes pontuais, nao no sistema)
  • para logica de componente, estado ou integracao com API (isso e 04-frontend-integration)

Entradas Esperadas

  • componente(s) ja implementados (Frontend) e/ou com motion base (Motion Design)
  • codigo CSS/Tailwind/Motion existente para revisar
  • feedback subjetivo do usuario sobre "sensacao" da interface, se houver

Saidas Esperadas

  • tabela markdown com mudancas Before/After, agrupadas por principio
  • checklist de revisao marcado
  • codigo ajustado (CSS, Tailwind ou Motion) aplicado direto nos arquivos do Frontend

Principios Core

1. Border Radius Concentrico

Raio externo = raio interno + padding. Raios diferentes em elementos aninhados e a coisa mais comum que faz uma interface parecer errada.

outerRadius = innerRadius + padding

Se o padding for maior que 24px, tratar as camadas como superficies separadas — nao forcar concentricidade.

2. Alinhamento Optico > Geometrico

Quando a centralizacao geometrica parece errada, alinhar oticamente. Botoes com icone, triangulos de play e icones assimetricos (estrela, seta, caret) precisam de ajuste manual.

  • Botao com texto + icone: padding do lado do icone = padding do lado do texto - 2px
  • Play button: deslocar o triangulo levemente pra direita (margin-left: 2px)
  • Icones assimetricos: preferir corrigir o SVG na fonte a adicionar margin

3. Sombra em Vez de Borda

Para cards, containers e botoes com proposito de profundidade/elevacao, usar box-shadow em camadas transparentes em vez de border solida. Sombra se adapta a qualquer fundo; borda solida nao.

Nao aplicar em dividers (border-b, border-t, separadores de layout) — esses continuam borda.

--shadow-border:
  0px 0px 0px 1px rgba(0, 0, 0, 0.06),
  0px 1px 2px -1px rgba(0, 0, 0, 0.06),
  0px 2px 4px 0px rgba(0, 0, 0, 0.04);

Dark mode: simplificar pra um unico ring branco (0 0 0 1px rgba(255, 255, 255, 0.08)).

4. Animacoes Interrompiveis

CSS transitions para mudancas de estado interativas (hover, toggle, abrir/fechar) — retomam de onde pararam se o usuario mudar de intencao no meio. Keyframes ficam reservados para sequencias que rodam uma vez (loading, entrada de pagina) — reiniciam do zero se interrompidas, o que parece quebrado em elemento interativo.

5. Split e Stagger em Animacoes de Entrada

Nao animar um container unico. Quebrar em blocos semanticos (titulo, descricao, botoes) e escalonar com ~100ms de delay entre eles. Para titulos, considerar quebrar em palavras individuais com ~80ms de stagger. Combinar opacity + blur + translateY.

6. Animacoes de Saida Sutis

Saida deve ser mais discreta que entrada — o foco do usuario ja foi pro proximo lugar. Usar translateY pequeno e fixo (ex: -12px), nao a altura total do elemento. Duracao de saida menor que entrada (ex: 150ms vs 300ms). Nunca remover a animacao de saida completamente (display: none direto) — motion sutil preserva contexto.

7. Animacao Contextual de Icone

Ao trocar icone (hover, mudanca de estado), animar com opacity + scale + blur em vez de so alternar visibilidade. Valores exatos, sem desvio:

  • scale: 0.251 (nunca 0.5 ou 0.6)
  • opacity: 01
  • filter: blur(4px)blur(0px)
  • Se o projeto tiver motion/framer-motion no package.json: transition: { type: "spring", duration: 0.3, bounce: 0 } — bounce sempre 0
  • Sem lib de motion: manter os dois icones no DOM (um absolute) e cross-fade via CSS transition com cubic-bezier(0.2, 0, 0, 1) — da entrada e saida sem dependencia nova

8. Font Smoothing

-webkit-font-smoothing: antialiased + -moz-osx-font-smoothing: grayscale no root do layout (afeta so macOS, seguro aplicar universal).

9. Tabular Numbers

font-variant-numeric: tabular-nums (Tailwind: tabular-nums) em qualquer numero que atualiza dinamicamente (contador, preco, timer, coluna de tabela) — evita layout shift. Nao usar em numeros estaticos (versao, CEP, telefone).

10. Text Wrapping

  • text-wrap: balance (Tailwind: text-balance) em headings — so funciona ate 6 linhas (Chromium) / 10 (Firefox), nao usar em paragrafo longo
  • text-wrap: pretty (Tailwind: text-pretty) em paragrafo curto/medio, descricao, caption, item de lista — evita palavra orfa na ultima linha
  • Texto muito longo (10+ linhas): nenhum dos dois, deixar wrapping default

11. Image Outline

Outline sutil de 1px em imagens para profundidade consistente. Regra de cor nao-negociavel: preto puro rgba(0, 0, 0, 0.1) no light mode, branco puro rgba(255, 255, 255, 0.1) no dark mode. Nunca usar near-black/near-white da paleta do projeto (slate-900, zinc-900, etc) — outline com tinta pega a cor da superficie ao redor e parece sujeira na borda da imagem.

<img className="outline outline-1 -outline-offset-1 outline-black/10 dark:outline-white/10" />

12. Scale on Press

scale(0.96) sutil no click para feedback tatil. Sempre 0.96 — nunca menor que 0.95 (fica exagerado). Usar CSS transition (interrompivel). Adicionar prop static no componente de botao pra desabilitar quando o movimento for indesejado.

13. Skip Animation on Page Load

initial={false} em AnimatePresence evita animacao de entrada no primeiro render — funciona bem pra icon swap, toggle, tabs. Nao usar quando o componente depende do initial pra configurar a entrada da pagina (hero com stagger, loading state) — verificar sempre com refresh completo da pagina.

14. Nunca Usar transition: all

Sempre especificar propriedades exatas: transition-property: scale, opacity. Tailwind transition-transform cobre transform, translate, scale, rotate — usar quando so anima transform; para multiplas propriedades nao-transform, usar transition-[scale,opacity,filter].

15. will-change com Moderacao

So para transform, opacity, filter, clip-path — propriedades que a GPU compoe. Nunca will-change: all. Adicionar so quando notar stutter no primeiro frame (Safari se beneficia mais); nao adicionar preventivamente — cada layer de composicao custa memoria.

16. Hit Area Minima

Elementos interativos precisam de pelo menos 40x40px (WCAG pede 44x44px) de area clicavel. Estender com pseudo-elemento se o elemento visivel for menor (ex: checkbox 20x20). Duas areas de hit nunca podem sobrepor — se colidir, encolher o pseudo-elemento até nao colidir.

Erros Comuns

ErroCorrecao
Mesmo border radius em pai e filhoCalcular outerRadius = innerRadius + padding
Icone parece descentralizadoAjustar oticamente com padding ou corrigir SVG direto
Borda dura entre secoesUsar box-shadow em camadas com transparencia
Animacao de entrada/saida abruptaSplit, stagger, e manter saida sutil
Numero causa layout shiftAplicar tabular-nums
Texto pesado no macOSAplicar antialiased no root
Animacao toca no page loadAdicionar initial={false} no AnimatePresence
transition: all em elementosEspecificar propriedades exatas
Stutter no primeiro frameAdicionar will-change: transform (com moderacao)
Hit area minuscula em controle pequenoEstender com pseudo-elemento ate 40x40px

Formato de Output da Revisao

Sempre apresentar mudancas como tabela markdown com colunas Before e After, agrupadas por principio (um heading por principio, uma tabela por heading). Incluir toda mudanca feita, nao um subconjunto. Se um principio foi revisado mas nada precisou mudar, omitir a tabela inteira — tabela vazia so gera ruido.

#### Border radius concentrico
| Before | After |
| --- | --- |
| `rounded-xl` no card + `rounded-xl` no botao interno (`p-2`) | `rounded-2xl` no card (`12+8`), `rounded-lg` no botao interno |

#### Scale on press
| Before | After |
| --- | --- |
| `scale(0.9)` no press | Ajustado para `scale(0.96)` — abaixo de `0.95` fica exagerado |

Checklist de Revisao

  • Elementos aninhados com border radius usam concentricidade
  • Icones alinhados oticamente, nao so geometricamente
  • Sombra usada em vez de borda onde aplicavel (nao em dividers)
  • Animacoes de entrada divididas e escalonadas
  • Animacoes de saida sutis
  • Numeros dinamicos usam tabular-nums
  • Font smoothing aplicado no root
  • Headings usam text-wrap: balance; paragrafos curtos usam text-wrap: pretty
  • Imagens tem outline sutil (preto/branco puro, nunca tintado)
  • Botoes usam scale on press onde aplicavel
  • AnimatePresence usa initial={false} quando o estado default nao deve animar no load
  • Nenhum transition: all — sempre propriedades especificas
  • will-change so em transform/opacity/filter/clip-path, nunca all
  • Elementos interativos com pelo menos 40x40px de hit area, sem sobreposicao

Checkpoint: marcar um item nesta checklist exige ter visto o resultado no browser (não no código-fonte) — "usei tabular-nums" não é evidência de que o número não pula mais durante contagem, é evidência de que a classe existe. Item que não foi visualmente confirmado fica desmarcado, não vira aposta otimista.

Evidencia de Conclusao

  • tabela Before/After cobrindo toda mudanca aplicada
  • checklist de revisao marcado
  • nenhuma regressao visual introduzida (validar com screenshot/preview quando disponivel)

Handoff

Recebe de Frontend (04) e/ou Motion Design (12)

  1. Componente implementado e funcional
  2. Motion tokens e padroes de animacao ja definidos (se Motion Design ja rodou)

Esta skill NAO cria componentes novos — ajusta acabamento no MESMO codebase do Frontend/Motion. Se Motion Design ainda nao rodou e a tarefa envolve sistema de animacao amplo (nao so detalhe pontual), delegar a 12-motion-design primeiro.

Entrega para Reviewer (11) / QA (05)

  1. Tabela Before/After completa
  2. Checklist marcado
  3. Alertar se alguma mudanca de acabamento impacta acessibilidade (contraste, motion, hit area) — nesse caso, sinalizar tambem para 22-accessibility-specialist

Regra de Codigo Limpo

ZERO comentarios explicando o que o codigo faz. Nomes de classes/variaveis autoexplicativos. Comentario so quando existe uma restricao nao-obvia (ex: por que um valor exato como bounce: 0 ou scale(0.96) foi escolhido, se nao for evidente do contexto).

Fontes

Integracao com Pipeline

  • Orquestrador (skill 09): decide quando esta skill entra — tipicamente apos Frontend (04) e opcionalmente apos Motion Design (12)
  • UI/UX Design (skill 02): aesthetic anchors definem direcao; esta skill garante que a execucao nao destoa em detalhe
  • Motion Design (skill 12): dono do sistema de motion tokens/orquestracao; esta skill foca em ajustes pontuais de acabamento, incluindo animacao
  • Accessibility Specialist (skill 22): consultar quando ajuste de polish tocar contraste, motion ou hit area
  • Responsive Conversion (skill 56): roda antes desta — corrige layout e responsividade; esta skill assume que a estrutura ja esta correta

Signals

GitHub stars
23
Forks
6
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
ui-polish
Source
github.com/felvieira/claude-skills-fv