C1 · Componentes

Button

Componente de ação primário. Cinco variantes, três tamanhos, seis estados. Cada botão dispara uma ação inequívoca — nunca representa navegação ou status.

01

Variantes

Cinco variantes hierárquicas. Em qualquer tela, no máximo uma primary e uma secondary.

VarianteUsoCor
PrimaryAção dominante da tela (ex: 'Entrar na live').Tinta sobre papel.
SecondaryAção principal contextual (ex: 'Salvar drop').Verde-IA sobre papel.
OutlineAção alternativa, complementar.Borda tinta, fundo transparente.
LinkAção inline em fluxo de texto.Cor de acento, sem fundo.
DestructiveExclusão, cancelamento, reversão.Vermelho semântico.
02

Tamanhos

Três tamanhos canônicos.

TamanhoPaddingFont-sizeAlturaOnde usar
sm8px 16px1.2rem32pxTabelas densas, ações secundárias inline.
md (padrão)12px 20px1.4rem40pxPadrão para a maioria dos contextos.
lg16px 24px1.6rem48pxCTAs em hero, landing, capas.
03

Estados

EstadoMudança visualAcessibilidade
defaultCor base.
hoverTonalidade -10% (ex: hover do accent → #008C7A).Visual apenas.
focusOutline 3px na cor de acento, offset 2px.Sempre visível ao tabular.
pressedEscala 0.98, cor -20%.Feedback tátil instantâneo.
disabledOpacidade 0.5, cursor not-allowed.Use aria-disabled se foco precisa permanecer.
loadingTexto + spinner; clique bloqueado.aria-busy='true'.
04

Implementação

/* Estrutura mínima */
<button class="btn-primary" type="button">
  <svg aria-hidden="true" ... />
  Entrar na live
</button>

/* Loading */
<button class="btn-primary" aria-busy="true" disabled>
  <span class="spinner" /> Carregando...
</button>
05

Faça e não faça

Faça

  • Use sempre type='button' exceto em formulários (default é submit).
  • Inclua ícone à esquerda do label quando ele esclarece a ação.
  • Mantenha labels em verbos imperativos: 'Salvar', 'Enviar', 'Cancelar'.

Não faça

  • Não use mais de uma primary visível na mesma viewport.
  • Não use só ícone sem aria-label.
  • Não troque a cor do botão para criar 'estado de sucesso' — use feedback no contexto vizinho.
06

Acessibilidade

  • Foco visível com outline ≥ 3px.
  • Contraste mínimo 4.5:1 entre texto e fundo (AA).
  • Tap target ≥ 44x44px em touch.
  • disabled remove do tab order; aria-disabled mantém mas anuncia o estado.
  • Estado de loading anunciado via aria-busy + texto auxiliar.