Communitygithub.com

Surfaces

Define o que a UI do produto é feita na web: níveis de elevação, bordas, raios, estados e ícones.

O que é Surfaces?

Essa skill define como cada elemento visual de uma interface é construído na web, a partir de uma lista enxuta de receitas de superfície. Ela decide o preenchimento, borda, sombra, raio, estados interativos e ícones, garantindo consistência entre telas. Antes de qualquer decisão, aplica os princípios do skill `product-ui` (seção 1 e 5). A tomada de decisão é sequencial: primeiro verifica se uma superfície é necessária, depois define seu nível (página, elevado, flutuante ou sobreposição), escolhe entre sombra ou borda para a aresta, calcula raios concêntricos, define os estados interativos como mudanças na superfície, seleciona o tratamento de ícones (um conjunto, `currentColor`, traço combinado com o texto), verifica se materiais são permitidos (apenas chrome flutuante sobre conteúdo com scroll) e trata as bordas de scroll. A skill fornece tokens exatos de sombra para cada nível, diferenciando modo claro e escuro. Regras importantes: bordas mostram estrutura, sombras mostram elevação; manter `border: 1px solid transparent` sob a sombra para forced-colours mode; imagens recebem um contorno interno de 1px; raios devem ser concêntricos; foco nunca é vazio (usa `:focus-visible` com outline de 2px); controles desabilitados não reagem a hover, press ou escala; ícones são outline por padrão e fill quando ativos, com traço de 1.5px a 2px dependendo do peso da fonte. A skill é independente de plataforma (web) e pode ser aplicada em qualquer framework de UI. Sua documentação inclui tabelas de níveis, regras, pares de erros/acertos e um passo a passo de verificação antes de finalizar.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/nkurunziza-saddy/hmm-interfaces/tree/HEAD/surfaces

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

O que Surfaces faz?

Esta skill decide do que cada coisa é feita: seu preenchimento, borda, sombra, raio, estados e ícones. Ela escolhe a partir de uma lista curta de receitas, para que duas telas nunca tenham dois cards diferentes.

Antes de qualquer decisão, aplique product-ui §1 (o diário de gosto e precedência) e §5 (qual skill possui o quê).

Decida nesta ordem

  1. É necessária uma superfície? Remova antes de adicionar. Um título com espaço ao redor não precisa de card. Nunca aninhe um card dentro de outro card. Por quê: todo contêiner adiciona uma borda que o olho precisa ler.
  2. Qual nível? Página, elevado, flutuante ou sobreposição. Um nível por elemento, escolhido pelo que faz, não pelo quanto você quer que se destaque. elevation.md.
  3. O que desenha a borda? Elevação recebe um anel de sombra. Estrutura recebe uma borda. Nunca ambos em uma borda. elevation.md.
  4. Qual raio? Pegue o token para a função do elemento, depois torne os raios aninhados concêntricos. elevation.md.
  5. Quais estados? Projete hover, pressionado, selecionado, desabilitado e foco-visível como mudanças na superfície, antes de polir o estado padrão. states-and-icons.md.
  6. Qual tratamento de ícone? Um conjunto, currentColor, traço combinado com o texto. states-and-icons.md.
  7. Um material é permitido? Apenas chrome flutuante sobre conteúdo com scroll. materials-and-edges.md.
  8. Bordas do scroll. Divisores, fades, overscroll. materials-and-edges.md.

Os quatro níveis

NívelParaClaroEscuro
PáginaO chãoPreenchimento do chão, sem sombraPreenchimento mais escuro, sem sombra
ElevadoCards, controles, a opção escolhidaBranco, anel + 1px gota + 3px gota apertadaUm tom mais claro, anel branco, gota preta apertada
FlutuanteMenus, popovers, tooltips, toastsBranco, anel + 1px gota + 4px gota apertadaDois tons mais claros, anel branco, gota preta apertada
SobreposiçãoDiálogos, folhas, paleta de comandos (com um scrim)Branco, anel + 1px gota + 6px gota apertadaTrês tons mais claros, anel branco, gota preta apertada

Tokens exatos estão em elevation.md. As regras por trás deles:

  • Um anel mais uma gota apertada. Desfoque ≤ 8px, deslocamento ≤ 6px, gotas com espalhamento negativo. Por quê: desfoques grandes e suaves são lidos como brilho, sujam a página e parecem gerados.
  • O modo escuro sobe clareando. Sombras mal aparecem no escuro, então a claridade carrega a altura e um anel branco com baixa alfa carrega a borda.
  • As sombras são translúcidas e de uma cor. Cinzas opacas deixam um halo. Gotas escuras permanecem pretas.
  • Irmãos compartilham um nível. Cards em uma linha têm uma sombra, um raio, um preenchimento.
  • Hover muda o preenchimento, não a sombra.

Regras que não precisam de referência

  • Bordas mostram estrutura, sombras mostram elevação. Divisores, inputs, células de tabela e estados selecionados mantêm bordas. Um card cuja borda existe apenas para levantá-lo recebe um anel.
  • Mantenha border: 1px solid transparent sob um anel de sombra. Por quê: o modo forced-colours remove sombras, e a borda ainda desenha uma aresta.
  • Imagens recebem um contorno interno de 1px: outline: 1px solid preto a 10% (branco a 10% no escuro), outline-offset: -1px. Nunca uma cor matizada, que aparece como franja. Pule logotipos e artwork transparente.
  • Raio concêntrico. Externo = interno + preenchimento (+ borda), até 24px de preenchimento. Acima disso, são superfícies separadas.
  • Foco é um anel, nunca nada. :focus-visible mostra um contorno de 2px da cor de destaque com deslocamento de 2px; campos recebem-no rente, como uma borda de destaque de 2px sem lacuna. outline: none sem substituição é um bug. O anel não ocupa espaço de layout.
  • Controles desabilitados não recebem hover, press ou escala.
  • Ícones: um conjunto por superfície, currentColor, outline por padrão e preenchido quando ativo. Traço acompanha o peso da fonte vizinha, 1.5px em 400 até 2px em 600.
  • Desfoque atrás apenas em chrome flutuante. Nunca em conteúdo, cards ou tabelas.
  • Sobreposições com scroll (diálogos, gavetas, menus) recebem overscroll-behavior: contain.

Pares

QuebradoCorrigidoPor quê
border: 1px solid #e5e5e5 em um cardbox-shadow: var(--elev-raised); border: 1px solid transparentUma borda só de profundidade vira anel; forced colours ainda desenha uma aresta
box-shadow: 0 10px 40px rgba(0,0,0,.2)0 0 0 1px a.08, 0 1px 2px a.12, 0 4px 8px -4px a.16Apertado e nítido supera grande e suave
Card escuro com 0 8px 24px #000Preenchimento mais claro mais 0 0 0 1px oklch(1 0 0 / .08)Sombras desaparecem no escuro; claridade mostra altura
Raio do card 8, raio da imagem interna 8, preenchimento 8Interno 8, externo 16Cantos concêntricos mantêm um espaçamento uniforme
<img> se fundindo em um card brancooutline: 1px solid oklch(0 0 0 / .1); outline-offset: -1pxA borda é lida sem uma borda
button:focus { outline: none }button:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px }Usuários de teclado mantêm seu lugar
Traço de ícone de 1.5px ao lado de um rótulo peso 600Traço de 2pxO peso do traço corresponde ao peso da haste
Ícones preenchidos em todos os slots da barra de ferramentasOutline por padrão, preenchido para o ativoPreenchimento é o sinal de estado
backdrop-filter: blur(20px) em um cardUma superfície opacaDesfoque pertence ao chrome flutuando sobre conteúdo com scroll

Antes de finalizar

PadrãoCorreção
box-shadow com desfoque > 8px ou alfa > .2 em UI claraUse um token de nível
border mais box-shadow fazendo o mesmo trabalhoAnel mais borda transparente apenas
Anel de sombra sem border: 1px solid transparentAdicione-o
Mesmo border-radius em um pai e seu filho com preenchimentoinner + padding para o pai
outline: none ou outline: 0 sem substituição por :focus-visibleAdicione o anel
:focus (não :focus-visible) estilizando um anelMude para :focus-visible
border-width mudando em um estadoCor, preenchimento ou uma borda transparente de largura igual
fill="#…" ou stroke="#…" codificado em um íconecurrentColor
Duas bibliotecas de ícones importadas em uma telaUma
backdrop-filter fora de uma barra fixa, barra lateral ou menu flutuanteRemova-o
Lista de sobreposição sem overscroll-behavior: containAdicione-o
Corte duro na borda de um scroller, ou uma sombra cortada por overflow: hiddenDesvaneie a borda; adicione padding ao scroller

Verifique renderizando claro e escuro em 2× e cortando uma borda de cada nível. Passe o mouse, pressione, Tab para focar, selecione e desabilite cada controle e compare o tamanho da caixa antes e depois. Alterne forced colours (DevTools do Chrome, emulação de renderização) e confirme que cada card ainda tem uma borda.

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

nkurunziza-saddy/break

Stress-tests a piece of UI with worst-case data and every reachable state, then reports what broke with a numbered fix for each. Use it when the user types /break, or asks to "break this", "stress-test", "try the worst case", "what happens with long names", "check the empty and error states" or "find the edge cases" on a component or screen.

nkurunziza-saddy/layout

Structure and space in product UI on the web. It sets the spacing scale, grouping, alignment, density (compact or comfortable), hit areas, app shells (sidebar, toolbar, content, inspector), max widths, container-query responsiveness, dropdown and popover sizing, room for long and translated text, layout stability (no shift on load) and sticky elements that must not cover focus.

nkurunziza-saddy/motion

Builds motion for product UI on the web. It decides whether something should move at all, then why, which tool (CSS transition, WAAPI, Motion, spring), which properties, curve, duration, interruption, exit and reduced-motion path, and it writes the code. Also covers stagger and choreography, gestures (drag, flick, sheets), motion tokens and animation performance.

nkurunziza-saddy/pick-library

Picks the right library for a frontend task from a curated, status-checked list, instead of hand-rolling it or installing an abandoned package. Use it when the user asks "what should I use for…", "is there a library for…", or names a package, and when you are about to build a toast, command menu, drawer, date picker, table, virtual list, drag and drop, chart, OTP input, animated number, theme switch, form validation…

Habilidades Relacionadas