CommunityImagemgithub.com

nkurunziza-saddy/layout

Estrutura e espaçamento na UI de produtos web. Define escala de espaçamento, agrupamento, alinhamento, densidade (compacto ou confortável), áreas de toque, shells de aplicativo (sidebar, toolbar, conteúdo, inspetor), larguras máximas, responsividade a container, dimensionamento de dropdowns e popovers, espaço para texto longo e traduzido, estabilidade de layout (sem deslocamento ao carregar) e elementos sticky que não devem cobrir o foco.

O que é layout?

Este skill estabelece uma metodologia sistemática e consistente para decisões de layout em interfaces de produto na web. Ele define uma ordem fixa de decisão — começando pelo shell da aplicativo, passando por largura, espaçamento, alinhamento, tamanho, tratamento de pior caso de dados, adaptação a container queries, e finalmente medição visual em 2×. O coração do sistema é uma escala de espaçamento baseada em 4px (tokens como `--space-xs` a `--space-4xl`), que elimina valores arbitrários e garante ritmo visual. O skill é agnóstico de plataforma (pode ser aplicado em React, Vue, Angular, ou qualquer framework web), e funciona como um guia de estilo programático que pode ser seguido por desenvolvedores ou agentes de IA (como Claude Code, Cursor, Codex) para gerar interfaces consistentes sem necessidade de designers. Inclui regras rigorosas como "agrupar com espaço" (gap interno ≤ metade do gap entre grupos), uso de propriedades lógicas para RTL, prevenção de mudanças de tamanho ao passar o mouse/selecionar, e verificação final com ferramentas de medição de pixels. Também fornece uma tabela de pares "Quebrado vs. Corrigido" que exemplifica problemas comuns e soluções padronizadas.

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

Installed? Explore more Imagem skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

Perguntar na sua IA favorita

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

Documentação

O que layout faz?

Este skill decide onde as coisas vão, a que distância ficam e qual o seu tamanho. Toma as mesmas decisões na mesma ordem e verifica o resultado contra os pixels renderizados.

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

Decidir nesta ordem

  1. Shell. Nomeie as regiões da tela: sidebar, toolbar, conteúdo, inspetor. Cada região é um proprietário de scroll ou nenhum. Detalhes e larguras: shell-and-responsive.md. Porquê: o shell fixa cada largura na qual o layout interno tem de viver.
  2. Largura e medida. Defina a coluna de conteúdo pelo que ela contém: formulário 440px, leitura 720px com prosa limitada à medida do type (66ch), dados 1200px. Uma coluna nunca se estica porque a tela é larga. Porquê: a partir de 75 caracteres, uma linha perde o leitor, e um formulário esticado envia os olhos pela tela.
  3. Espaço. Use a escala abaixo e mais nada. Agrupe primeiro, com espaço; adicione um preenchimento, depois uma linha, apenas onde o espaço não consegue carregá-lo. spacing-and-density.md.
  4. Alinhar. Escolha as arestas compartilhadas e coloque tudo nelas. Um desvio de 1–4px é um bug. Corrija opticamente onde a geometria parece errada. spacing-and-density.md.
  5. Tamanho. Escolha a densidade para a região, depois as áreas de toque. spacing-and-density.md.
  6. Pior caso de dados. Redimensione a caixa para o conteúdo mais longo, mais curto, ausente, traduzido e ainda a carregar antes de considerar pronto. stability-and-text.md.
  7. Adaptar. Faça a estrutura responder ao seu container, não ao dispositivo. shell-and-responsive.md.
  8. Medir. Renderize a 2×, meça gaps e arestas, corrija o que os pixels mostram. measure.md.

A escala

Uma escala, base 4px. Nunca escreva um valor de espaçamento que não seja um degrau. Porquê: valores únicos (10px, 14px, 18px) tornam o ritmo impossível de ver e impossível de manter.

TokenpxUso típico
--space-xs4rótulo para sua descrição; ícone para rótulo num chip
--space-sm8itens dentro de um grupo; padding block de controlo
--space-md12entre controlos com borda; padding inline de controlo
--space-lg16entre campos; padding de cartão compacto
--space-2020entre blocos dentro de um cartão
--space-xl24entre grupos; padding de cartão confortável
--space-2xl32entre secções
--space-3xl48acima do primeiro título de uma página
--space-4xl64abaixo do último bloco de uma página

Ajustes de 1–2px para alinhamento ótico são os únicos valores fora da escala. Nomeie-os (--play-nudge: 2px).

Regras que não precisam de referência

  • Agrupar com espaço. A quebra entre grupos é pelo menos 2× o gap dentro de um grupo: 8px dentro significa 16px ou mais entre. Espaçamento igual em todo o lado torna o agrupamento ambíguo, e ambiguidade aqui é um bug funcional.
  • Remover linhas antes de as adicionar. Espaço primeiro, um preenchimento segundo, um divisor por último, e apenas para dados densos. Porquê: cada linha custa atenção pela mesma informação que o espaço dá gratuitamente.
  • Espaço acima igual a espaço abaixo para qualquer coisa entre duas coisas. Porquê: uma coisa mais perto de um vizinho lê-se como sendo dele.
  • Controlos devem parecer controlos. Um botão, link ou toggle tem uma forma, um sublinhado ou uma posição na toolbar. Texto estático nunca partilha esses atributos. Porquê: um controlo estilizado como texto esconde-se, e texto estilizado como controlo recolhe cliques mortos.
  • Ações ficam em cima dos dados em que atuam, nunca por baixo. Um controlo que define algo fica ao lado dele.
  • Conteúdo principal vai primeiro e à esquerda. Ordem visual igual à ordem do DOM: nunca use order, row-reverse ou posicionamento grid para reordenar conteúdo. Porquê: a ordem do teclado e do leitor de ecrã segue o DOM.
  • Propriedades lógicas (margin-inline-start, padding-block, inset-inline-end, text-align: start) para tudo que se espelha. Porquê: RTL funciona assim sem uma segunda folha de estilos.
  • Nunca colocar controlos críticos na borda inferior de uma janela ou sidebar. Porquê: as pessoas empurram janelas parcialmente para fora do ecrã.
  • Scroll mostra o que está escondido. Conteúdo além de uma aresta recebe uma dica visível: um vislumbre de 16–32px ou um fade.
  • Nada se desloca. Hover, seleção e foco nunca mudam o tamanho de um elemento. Os dados carregados ocupam a caixa que o skeleton segurou.

Pares

QuebradoCorrigidoPorquê
gap: 12px no formulário e gap: 12px entre os seus fieldsetsgap: 8px dentro, gap: 24px entreGrupos precisam de uma quebra de pelo menos 2×
padding: 10px 14pxpadding: var(--space-sm) var(--space-md)Apenas degraus
Título em x=24, descrição em x=26Ambos em x=24Um desvio de 1–4px lê-se como um erro
Botão de ícone 16×16 com padding: 0Glyph 16px, ::before { inset: -12px } para um alvo de 40pxO alvo do rato é 40px
.row + .row { margin-top: 8px } com hover e clique nas linhas.row { padding-block: 4px }, sem marginUm gap entre linhas é uma zona morta e faz piscar o hover
.menu { width: 200px }width: max-content; min-width: 160px; max-width: 320pxO menu abraça o seu rótulo mais longo
@media (max-width: 768px) num cartão@container (width < 400px) no pai do cartãoUm cartão numa sidebar estreita precisa da sua própria largura, não da do ecrã
<img src> sem tamanho, depois um cartão que saltawidth, height ou aspect-ratio definidosA caixa existe antes dos bytes
Cabeçalho sticky, âncora aterrar por baixo delescroll-padding-block-start: 56px no contentor de scrollFoco e âncoras nunca ficam por baixo do chrome

Antes de terminar

Pesquise no diff por estes padrões e verifique.

PadrãoCorreção
margin, padding ou gap com um valor não na escalaDegrau mais próximo
Um valor gap usado dentro e entre gruposDentro ≤ metade do entre
Botão só de ícone com menos de 24px, ou menos de 40px sem ::beforeExpandir com um pseudo-elemento
gap ou margin entre linhas clicáveis ou itens de menuPadding dentro do item
width fixo num menu, botão ou caixa de textomax-content, min-width, max-width; min-height para texto
@media (max-width dentro de um componente reutilizável@container no seu pai
height: 100vh para um shell100dvh
Track 1fr ou flex child segurando texto longominmax(0, 1fr) ou min-width: 0
margin-left, padding-right, left: 0, text-align: left em UI espelhadaForma lógica
Cabeçalho ou rodapé sticky sem scroll-padding-blockDefinir para a altura do chrome
Altura de linha de skeleton ou larguras de coluna diferentes das carregadasCorresponder
<img> sem dimensões ou aspect-ratioAdicionar uma

Verifique com measure.md: renderize a 2× a 390px e na largura mais larga do shell, execute o script, recorte cada candidato e conte os pixels. Depois percorra com Tab o ecrã com chrome sticky no lugar, e carregue as strings mais longas. Relate o que não conseguiu verificar como "não verificado".

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/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…

nkurunziza-saddy/surfaces

What product UI is made of on the web. It sets elevation levels with exact shadow recipes for light and dark mode, when to use a shadow and when a border, the transparent border for forced-colours mode, a small radius scale with concentric nesting, image outlines, every interactive state as a surface change (hover, pressed, selected, disabled, focus-visible), icons (one set, currentColor, outline and fill, stroke tha…

Habilidades Relacionadas