Button
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".
As partes opcionais não coexistem todas ao mesmo tempo; são mostradas em combinações reais.
Ícone + label
Label + badge
Spinner + label
- Label: texto que descreve a ação.
- Ícone (componente Icon): reforço visual opcional, antes ou depois do label.
- Badge: número de itens associados (opcional).
- 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.
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 label | Caracteres | Palavras |
|---|---|---|
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:
| Appearance | Tom | Características | Evitar |
|---|---|---|---|
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:
| Contexto | Fórmula | Exemplo |
|---|---|---|
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" |
| Caso | O que fazer | O 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/componentsimport 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
| Name | Type | Default | Description |
|---|---|---|---|
as | 'button' | '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' | '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' | Change the size of the button. |
Button.Skeleton
| Name | Type | Default | Description |
|---|---|---|---|
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. |