Button

2.11.1

Permite iniciar uma ação, confirmar uma decisão ou avançar em um processo.

  • Criar, adicionar ou salvar em um formulário: iniciar um objeto novo, somar um item a algo existente ou persistir alterações; costuma ir como primary. Ex.: "Criar produto", "Adicionar variação", "Salvar alterações".
  • Editar ou configurar: abrir algo existente em modo de edição ou iniciar um fluxo de configuração. Ex.: "Editar informação", "Configurar pagamentos".
  • Confirmar uma ação: executar algo destrutivo e sem volta, ou confirmar a leitura de um aviso somente leitura. Ex.: "Excluir produto", "Entendi".
  • Cancelar ou fechar sem executar: voltar ao estado anterior ou fechar um painel informativo sem consequências. Ex.: "Cancelar", "Fechar".
  • Mudar o estado de um objeto: ativar ou desativar uma funcionalidade. Ex.: "Ativar", "Desativar".
  • Para navegar para outra página ou ver mais detalhe: o Button é para executar ações, não para navegar. Em vez disso, usar Link. Ex.: "Ler mais", "Ver detalhe", "Ir para a lista".
  • Para alternar um estado binário ativado/desativado. Em vez disso, usar Toggle.

As partes opcionais não coexistem todas ao mesmo tempo; são mostradas em combinações reais.

2
1

Ícone + label

3

Label + badge

4

Spinner + label

  1. Label: texto que descreve a ação.
  2. Ícone (componente Icon): reforço visual opcional, antes ou depois do label.
  3. Badge: número de itens associados (opcional).
  4. Spinner: indicador de carregamento (opcional).

Destaca a ação mais relevante da página; usar uma única vez por contexto. O Primary do conteúdo não impede outro Primary na sidebar/header. Tom direto e ativo. Ex.: em uma tela de edição, "Salvar alterações".

Ações neutras ou complementares; acompanha Primary ou Danger em ações opostas. Tom funcional, sem hierarquia emocional. Ex.: se o Primary é "Salvar", o Neutral é "Cancelar".

Ações destrutivas ou irreversíveis; costuma vir acompanhada de Neutral. Tom seco e sem ambiguidade: não suavizar nem dramatizar. Ex.: "Excluir produto" junto a "Cancelar".

Quando o fundo não precisa se destacar (ação de baixo ênfase dentro de um contêiner). Tom contido, sem ênfase verbal. Ex.: "Ver detalhe".

Ação principal em fluxos assistidos por IA (Lumi); o estilo de IA a distingue de uma ação comum. Ex.: "Gerar com IA".

Ação secundária ou complementar nesses mesmos contextos de IA (Lumi), acompanhando uma AI Primary. Ex.: "Sugerir texto".

Usar em ações secundárias ou de menor prioridade que devem ocupar pouco espaço, como dentro de cards ou banners, onde não convém distrair da ação principal da página.

A variante padrão, recomendada para a maioria dos botões no Desktop: ações principais e secundárias em formulários, tabelas e cards.

Usar no Mobile como CTA principal de uma tela, podendo também vir acompanhado de uma ação secundária, para garantir a área de interação. Por exemplo, em uma Initial Screen para contratar um produto novo.

O botão se ajusta à largura do seu conteúdo e ocupa apenas o espaço necessário para o label. É o comportamento padrão, preferido no Desktop e para a maioria dos botões, sobretudo quando há vários em uma linha ou são ações secundárias: economiza espaço, mantém o alinhamento à direita fora dos cards e deixa o texto definir o tamanho.

O botão ocupa toda a largura do seu contêiner. Usar no Mobile (padrão para o CTA principal) e no Desktop quando a ação deve dominar a largura do contêiner (ex.: Plan Display): maximiza a área de clique e direciona o foco para a ação.

Matriz de estados do Button: as aparências primary, neutral, danger, transparent, AI primary e AI secondary em repouso, hover, ativo, foco, desabilitado e carregando.

Fora de cards, alinhado à direita; largura conforme o conteúdo. No rodapé de um modal, o neutral acompanha o primary (ou o danger) como ação oposta.

As ações usam fullWidth e se empilham verticalmente para garantir uma área de toque ampla; a ação principal fica no topo.

Quando o objeto não tem nome próprio, nomear o tipo de objeto no label: "Excluir variação", "Adicionar imagem".

Evitar labels genéricos como "Excluir isto" ou "Excluir selecionado" sem especificar o quê.

Com duas ações juntas, deixar só uma como primary; o objeto no label deixa clara a diferença.

Evitar colocar dois primary disputando a atenção na mesma tela.

Quando o Button está disabled, manter o label da ação; o motivo é explicado fora do botão (Alert ou help text).

Evitar incluir o motivo do bloqueio dentro do label do Button.

Se a ação demora mais de 1 segundo, mostrar o estado de carregamento com o verbo no gerúndio.

Evitar deixar o Button no estado normal enquanto processa: o usuário não sabe que a ação está em andamento.

Se o mesmo Button alterna entre duas ações opostas, mudar o label conforme o estado: "Ativar" / "Desativar".

Evitar um único label ambíguo para duas ações opostas.

O CTA de um empty state deve ser autossuficiente: "Adicionar produto" se entende sem contexto.

Evitar labels que dependem de um contexto que num empty state pode não estar disponível.

  • Navegação por teclado: ao renderizar um <button> nativo, recebe o foco com Tab e é ativado com Enter ou Espaço.
  • Foco visível: o Nimbus aplica um anel de foco próprio (:focus-visible); não suprimir o outline ao personalizar estilos.
  • Rótulo no label: o conteúdo (children) é obrigatório e deve descrever a ação. Se a ação for apenas um ícone, usar Icon button (que exige um aria-label), não um Button sem texto.
  • Botão vs. link: se a ação navega para outra página, usar as="a" com href para renderizar um <a> com a semântica correta; reservar o <button> para ações.
  • Estado desabilitado: usar a prop disabled, não simular com cor ou opacidade; o <button disabled> comunica o estado inativo às tecnologias assistivas.
  • Não depender da cor: o significado de uma ação danger deve ficar claro pelo texto do label, não apenas pela cor.

O label é uma promessa: descrever exatamente a ação que será executada. Priorizar a precisão sobre a brevidade.

Pontuação: sem ponto final, sem pontos de exclamação e sem dois-pontos.

Pessoa gramatical: infinitivo como norma. O imperativo ("Salve", "Exclua") é uma exceção justificada apenas quando o contexto conversacional o exige; em buttons de interface, o infinitivo é a convenção.

Limite de caracteres recomendado:

Tipo de labelCaracteresPalavras

Label padrão

20 caracteres

máximo 2 palavras

Label com objeto necessário para clareza

30 caracteres

máximo 3 palavras

Loading state

15 caracteres

gerúndio do verbo: "Salvando…", "Excluindo…"

Forma verbal:

  • Infinitivo para labels padrão → "Salvar", "Excluir", "Criar".
  • Infinitivo + objeto quando o verbo sozinho é ambíguo → "Salvar alterações", "Excluir produto".
  • Gerúndio apenas como loading state → "Salvando…", "Excluindo…" (nunca como label estático).
  • Nunca substantivo sozinho como label de ação (ex.: "Aplicativos" em um botão que executa algo).

Cada aparência tem um tom e características próprias que orientam o copy:

AppearanceTomCaracterísticasEvitar

primary

Ativo, direto

O usuário toma a iniciativa. Sem adornos. Infinitivo.

Exclamações · gerúndio · substantivo sem verbo

neutral

Neutro

Alternativa sem hierarquia emocional. Funcional.

Superlativos · verbos de marketing

danger

Seco, sem ambiguidade

Não suavizar ("Excluir", não "Talvez excluir"). Também não dramatizar.

Pontos de exclamação · linguagem alarmante

transparent

Funcional, sem ênfase

O mais contido. Não precisa chamar a atenção.

Qualquer ênfase verbal ou tonal

Conforme onde o botão aparece, o label segue uma fórmula:

ContextoFórmulaExemplo

Botão primário de página (header junto ao H1)

[Verbo] + [objeto]

"Criar produto", "Adicionar endereço", "Configurar pagamentos"

Confirmação em Modal (destrutivo)

Mesmo verbo + objeto que o título do Modal

Modal "Excluir segmento" → botão "Excluir segmento"

Salvar formulário

"Salvar" (contexto unívoco) ou "Salvar [objeto]"

"Salvar", "Salvar alterações"

Cancelamento

"Cancelar" — nunca "Não"

"Cancelar"

Fechamento sem ação

"Fechar" — nunca "Cancelar" se não há ação em curso

"Fechar"

Loading state

Gerúndio do verbo principal

"Salvando…", "Excluindo…", "Carregando…"

Confirmação de leitura (modal informativo)

"Entendi" — nunca "OK", "Aceitar" nem "Sim"

"Entendi"

CasoO que fazerO que não fazer

O objeto não tem nome (item genérico)

Usar o tipo de objeto: "Excluir variação" · "Adicionar imagem".

"Excluir isto" nem "Excluir selecionado" sem especificar o quê.

Dois botões primários na mesma tela

Revisar a arquitetura antes do copy. Se for inevitável, que o objeto os diferencie: "Salvar rascunho" vs. "Publicar produto".

Deixar dois primary disputando a atenção sem diferenciá-los.

O botão está desabilitado (disabled)

Manter o label; o contexto (Alert, help text, mensagem inline) explica por que está desabilitado.

Incluir no botão a informação de por que está desabilitado.

A ação demora mais de 1 segundo

Usar o estado de loading com o gerúndio do verbo. Se passar de 5 segundos, adicionar um indicador de progresso adicional.

Deixar o botão no estado normal, sem feedback, enquanto processa.

O mesmo botão executa ações opostas conforme o estado do objeto

Mudar o label dinamicamente conforme o estado: "Ativar" / "Desativar".

Um único label ambíguo para duas ações opostas.

CTA de empty state

Que funcione sem contexto adicional: "Adicionar produto" (autossuficiente).

"Adicionar" — depende de um contexto que pode não estar disponível.

Instale o componente via terminal.

npm install @nimbus-ds/components
import React from "react";
import { Button } from "@nimbus-ds/components";

const Example: React.FC = () => <Button>Button</Button>;

export default Example;

Propriedades adicionais são repassadas ao elemento <Button>. Consulte a documentação do elemento button para ver a lista de atributos aceitos.

  • Link — Para navegar entre páginas com menor destaque visual que o Button.
  • Icon button — Para ações representadas apenas por um ícone, sem texto visível.

Button

NameTypeDefaultDescription

as

'button'
'a'
React.ElementType

'button'

The underlying element to render — either a HTML element name or a React component.

children*

React.ReactNode

The content of the button.

appearance

'ai-primary'
'ai-secondary'
'danger'
'neutral'
'primary'
'transparent'

'neutral'

Change the visual style of the button.

disabled

boolean

'false'

Disables the button, disallowing user interaction.

fullWidth

boolean

'false'

Determines if the button should grow to fill the full width of its container.

size

'large'
'medium'
'small'

'medium'

Change the size of the button.

Button.Skeleton

NameTypeDefaultDescription

width

string

Width of the skeleton. Useful when the skeleton is inside an inline element with no width of its own.

className

string

data-testid

string

This is an attribute used to identify a DOM node for testing purposes.