Button
Botões em todas as variantes e tamanhos, com um fluxo integrado de carregamento, sucesso e erro que dispensa o spinner em requisições rápidas.
pnpm dlx shadcn@latest add https://hextaui.com/r/button.jsonAdiciona o componente, os tokens de tema do HextaUI e quaisquer componentes do HextaUI dos quais ele depende.
Adicione os tokens de tema ao seu CSS global, se ainda não o fez.
Instale as dependências.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnCopie e cole o código a seguir no seu projeto.
components/ui/button.tsx Atualize os caminhos de importação para corresponder à configuração do seu projeto.
Com feedback, retorne uma promise de onClick e o botão mostra o carregamento, depois sucesso ou erro, e então volta ao normal sozinho.
Variantes
Sete variants. destructive é um tom suave, para que uma ação perigosa seja lida com clareza sem gritar, e ghost-destructive é a versão discreta para ações repetidas em linhas, como Sign out ou Remove.
Tamanhos
Tamanhos de texto de xs a lg, e tamanhos quadrados icon-*. Botões de ícone pequenos ganham uma área de toque invisível maior em telas sensíveis ao toque.
Pill
shape="pill" arredonda totalmente as pontas, e os tamanhos de ícone viram círculos. Combina com botões dentro de superfícies arredondadas, como o composer de um chat.
Com ícone
Marque um ícone com data-icon="inline-start" ou "inline-end" e o padding daquele lado diminui para equilibrá-lo.
Desabilitado
focusableWhenDisabled mantém um botão desativado na ordem de tabulação, para que um tooltip ou uma explicação ainda possa ser alcançado pelo teclado.
Rótulos personalizados
loadingLabel, successLabel e errorLabel substituem o texto de cada estado. Cada rótulo gira para dentro enquanto o antigo gira para fora.
Largura suave
O botão se ajusta suavemente à largura de cada rótulo em vez de reservar espaço para o mais longo, então nada ao redor dele salta.
Detalhes do erro
Passe uma função para errorLabel para exibir o motivo da rejeição. Enquanto o ponteiro ou o foco do teclado permanecer no botão, o erro continua na tela.
Formulários
Para botões de envio, chame track() de useButtonFeedback em onSubmit e espalhe buttonProps no botão. Remova o @ para ver o erro.
Botões de ícone
Os tamanhos de ícone trocam apenas o ícone de cada estado e mantêm o formato quadrado. O aria-label continua sendo o nome acessível.
Feedback em todas as variants
As variants preenchidas ficam verdes ou vermelhas ao terminar. ghost e link só mudam a cor do texto.
Carregamento controlado
Defina loading você mesmo quando o trabalho for acompanhado em outro lugar. O botão continua focável e anuncia que está ocupado.
Status controlado
Controle status diretamente, por exemplo a partir do estado de envio de uma biblioteca de formulários.
Como link
Passe um âncora para render e defina nativeButton={false} para que o botão mantenha a semântica de link.
Da direita para a esquerda
Os ícones e os rótulos de estado seguem a direção de leitura.
| Tecla | Ação |
|---|---|
| EnterSpace | Ativa o botão. Ignorado enquanto uma requisição de feedback está em andamento. |
| Tab | Move o foco. Um botão em carregamento continua focável, e focar um erro o mantém na tela até você sair. |
- Toda mudança de estado é anunciada por uma região live educada (polite): carregando, e depois o rótulo de sucesso ou de erro.
- Durante o carregamento, o botão define
aria-busye continua focável, então o foco nunca se perde no meio da requisição. - O spinner só aparece após 150ms e então permanece por pelo menos 400ms, de modo que requisições rápidas nunca piscam e as lentas nunca tremulam.
- Com movimento reduzido, os rótulos de estado aparecem com fade em vez de girar e o tremor de erro é ignorado.
Construído sobre o botão do Base UI. Renderiza um <button> e aceita todos os seus atributos.
| Prop | Tipo | Padrão |
|---|---|---|
variant | "default" | "outline" | "secondary" | "ghost" | "ghost-destructive" | "destructive" | "link" | "default" |
size | "xs" | "sm" | "default" | "lg" | "icon-xs" | "icon-sm" | "icon" | "icon-lg" | "icon-xl" | "default" |
shape | "default" | "pill" | "default" |
feedbackAcompanha a promise retornada de onClick e exibe seu status. | boolean | false |
onClickRetorne uma promise para controlar o feedback. | (event) => unknown | – |
loadingEstado de carregamento controlado. | boolean | – |
statusStatus controlado. Tem prioridade sobre loading. | "idle" | "loading" | "success" | "error" | – |
onStatusChange | (status: ButtonStatus) => void | – |
onErrorChamado com o motivo da rejeição. | (error: unknown) => void | – |
resetAfterMilissegundos antes de voltar ao estado idle. | number | { success?: number; error?: number } | { success: 2000, error: 4000 } |
loadingLabelExibido ao lado do spinner. Oculto nos tamanhos de ícone. | ReactNode | – |
successLabel | ReactNode | "Done" |
errorLabel | ReactNode | (error: unknown) => ReactNode | "Failed" |
disabled | boolean | false |
focusableWhenDisabledSempre true durante o carregamento. | boolean | false |
nativeButtonDefina como false quando render não for um <button>. | boolean | true |
render | ReactElement | (props, state) => ReactElement | <button> |
| Atributo | Descrição |
|---|---|
data-slot="button" | Seleciona os botões no CSS. |
data-status | idle, loading, success ou error. Presente quando feedback, loading ou status é usado. |
data-disabled | Presente quando o botão está desativado. |
aria-busy | Presente durante o carregamento. |
Executa o mesmo fluxo de feedback de qualquer lugar, como o onSubmit de um formulário. Aceita resetAfter, onStatusChange e onError. Veja o guia do useButtonFeedback para os tempos completos.
| Retorna | Descrição |
|---|---|
track(action) | Passe uma promise ou uma função que retorne uma. Chamadas feitas enquanto uma requisição está em andamento são ignoradas. |
buttonProps | Espalhe em <Button> para exibir o status e pausar o reset ao passar o mouse e ao receber foco. |
status | O ButtonStatus atual. |
error | O último motivo de rejeição. |
reset() | Cancela a requisição e volta ao estado idle. |
isPending() | Se há uma requisição em andamento. |
- SpinnerUm indicador de carregamento com tracinhos no estilo Apple ou um anel que "respira", que pode esperar antes de aparecer e permanecer o suficiente para não piscar.
- useButtonFeedbackExecuta uma ação assíncrona passando por carregamento, sucesso e erro, pulando o spinner em requisições rápidas e mantendo o erro na tela enquanto você o lê.
- Button groupBotões unidos em um único controle, com emendas compartilhadas, separadores, addons de texto, aninhamento e pilhas verticais.
- ToggleUm botão que fica ligado ou desligado, com um preenchimento que se assenta ao ser pressionado, uma transição clara do hover para o estado ligado e ícones que podem se preencher conforme o estado.
- Toggle groupUma linha de toggles para uma ou várias escolhas, com um preenchimento que desliza até o item escolhido, itens unidos ou espaçados e foco por setas do teclado.
- AlertMensagens inline para status e feedback, com uma superfície neutra, um ícone colorido e um botão de dispensar que recolhe suavemente.
Usado em blocos
Blocos que se baseiam em Button.
- Prompt InputUm campo de conversa que começa como uma linha discreta, cresce até virar um card conforme você escreve e desce quando a conversa começa. Enter envia, de forma segura com entrada em japonês e chinês. Cole, solte ou escolha arquivos com prévias, progresso e nova tentativa. @ adiciona arquivos e / executa comandos a partir de um menu no cursor. Um seletor de modelo com teclas numéricas, um slider de esforço que ganha vida no Max, um anel de contexto, ditado com forma de onda ao vivo, chips de ferramentas, uma fila para mensagens digitadas enquanto uma resposta é transmitida e rascunhos que sobrevivem a um recarregamento.
- Agent TodosMostre o plano de um agente enquanto ele trabalha. Cada etapa passa de backlog para a fazer, em andamento e concluída, com tempos ao vivo, falhas e as chamadas de ferramenta por trás dela. Uma pílula de status para acima do composer, mudanças no plano que você consegue ver e uma etapa de revisão para editar o plano antes de executá-lo.
- API keysA página de chaves de API de um produto de IA, como nos consoles da OpenAI e da Anthropic. Crie chaves com permissões restritas e uma expiração, veja o segredo uma única vez com uma cópia que confirma, revogue com desfazer, renomeie no próprio lugar, faça a rotação com um período de tolerância e veja o uso por chave.
- AppearanceA seção Aparência das configurações de um produto de IA: tema, cor de destaque, tom do plano de fundo, densidade, fonte do chat, tamanhos de texto e opções de acessibilidade, tudo mantido como rascunho até que as pessoas salvem.