T2 EducaçãoMidas

Button

Botão de ação. Variantes default, outline, secondary, ghost, destructive e link; tamanhos xs, sm, default e lg; tamanhos de ícone; formato arredondado; estado loading; asChild para links.

Código-fonte

Exemplos

Interaja com o componente e copie o código de cada exemplo.

Variantes

Tamanhos

Com ícone

Só ícone

Tamanhos icon-xs, icon-sm, icon e icon-lg. Sempre com aria-label.

Arredondado

Carregando

A prop loading mostra o Spinner e desabilita o botão.

Com atalho de teclado

Como link

Com asChild, o Link do Next ganha o visual de botão.

import { Button } from "@t2-educacao/midas";

Uso

<Button>Salvar</Button>
<Button variant="outline">Cancelar</Button>

Props

Aceita todas as props de <button> (onClick, disabled, type...) mais:

PropTipoPadrãoDescrição
variant"default" | "outline" | "secondary" | "ghost" | "destructive" | "link""default"Estilo visual
size"xs" | "sm" | "default" | "lg" | "icon-xs" | "icon-sm" | "icon" | "icon-lg""default"Altura, padding e tamanho do ícone
roundedbooleanfalseFormato pill (totalmente arredondado)
loadingbooleanfalseMostra o Spinner, desabilita o botão e marca aria-busy
asChildbooleanfalseRenderiza o filho com o visual de botão
classNamestringClasses extras, mescladas (as suas vencem)
refRef<HTMLButtonElement>Encaminhada ao elemento

type é "button" por padrão (não envia formulários sem querer). Use type="submit" em formulários. loading não tem efeito com asChild.

Variantes

VarianteQuando usar
defaultA ação principal da tela, na cor primária da T2. Idealmente uma por tela ou seção
outlineAções neutras, "Cancelar", filtros
secondaryAções de apoio ao lado da principal
ghostAções de baixa ênfase, barras de ferramentas, menus
destructiveAções destrutivas ("Excluir", "Cancelar assinatura")
linkAção com aparência de link

Tamanhos

TamanhoMedidaUso
xs24px de alturaÁreas muito densas, chips de ação
sm28pxTabelas, barras de ferramentas
default32pxPadrão
lg36pxCTAs de destaque
icon-xs / icon-sm / icon / icon-lg24 / 28 / 32 / 36px quadradoBotão só com ícone (exige aria-label)

Exemplos

Com ícone

O ícone é dimensionado pelo size do botão. Não passe size para o ícone.

import { ArrowRight, Plus } from "@t2-educacao/midas/icons";

<Button><Plus /> Novo curso</Button>
<Button size="lg">Começar <ArrowRight /></Button>

Só ícone

import { Trash } from "@t2-educacao/midas/icons";

<Button size="icon" variant="ghost" aria-label="Excluir">
  <Trash />
</Button>

Arredondado

<Button rounded>Inscrever</Button>
<Button size="icon" rounded aria-label="Adicionar"><Plus /></Button>

Carregando

<Button loading={isPending} type="submit">
  {isPending ? "Salvando" : "Salvar"}
</Button>

Com atalho de teclado

import { Button, Kbd } from "@t2-educacao/midas";

<Button variant="outline">
  Buscar <Kbd>⌘K</Kbd>
</Button>
import Link from "next/link";

<Button asChild>
  <Link href="/cursos">Ver cursos</Link>
</Button>

Largura total

<Button className="w-full">Continuar</Button>

Para agrupar botões, veja ButtonGroup.

Acessibilidade

  • Usa <button> nativo: foco, Enter e Espaço funcionam sem configuração.
  • Anel de foco visível (focus-visible) de 3px com o token ring.
  • loading marca aria-busy="true" e desabilita o botão; mantenha um texto que descreva a ação.
  • disabled remove o botão da navegação por teclado. Se o usuário precisa saber por que está desabilitado, mostre o motivo em texto próximo.
  • Tamanhos icon* exigem aria-label.

Não faça

  • <Link><Button /></Link>: gera <button> dentro de <a> (HTML inválido). Use asChild.
  • Vários default lado a lado: só um é o principal.
  • className="bg-[#009adb]": use a variante ou tokens.

On this page