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.
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:
| Prop | Tipo | Padrão | Descriçã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 |
rounded | boolean | false | Formato pill (totalmente arredondado) |
loading | boolean | false | Mostra o Spinner, desabilita o botão e marca aria-busy |
asChild | boolean | false | Renderiza o filho com o visual de botão |
className | string | Classes extras, mescladas (as suas vencem) | |
ref | Ref<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
| Variante | Quando usar |
|---|---|
default | A ação principal da tela, na cor primária da T2. Idealmente uma por tela ou seção |
outline | Ações neutras, "Cancelar", filtros |
secondary | Ações de apoio ao lado da principal |
ghost | Ações de baixa ênfase, barras de ferramentas, menus |
destructive | Ações destrutivas ("Excluir", "Cancelar assinatura") |
link | Ação com aparência de link |
Tamanhos
| Tamanho | Medida | Uso |
|---|---|---|
xs | 24px de altura | Áreas muito densas, chips de ação |
sm | 28px | Tabelas, barras de ferramentas |
default | 32px | Padrão |
lg | 36px | CTAs de destaque |
icon-xs / icon-sm / icon / icon-lg | 24 / 28 / 32 / 36px quadrado | Botã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>Como link (Next.js)
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,EntereEspaçofuncionam sem configuração. - Anel de foco visível (
focus-visible) de 3px com o tokenring. loadingmarcaaria-busy="true"e desabilita o botão; mantenha um texto que descreva a ação.disabledremove 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*exigemaria-label.
Não faça
<Link><Button /></Link>: gera<button>dentro de<a>(HTML inválido). UseasChild.- Vários
defaultlado a lado: só um é o principal. className="bg-[#009adb]": use a variante ou tokens.
Badge
Etiqueta pequena em formato pill para status e destaques (ex.: Beta, Novo). Variantes secondary (padrão), default, outline, destructive e success.
ButtonGroup
Agrupa botões encostados, na horizontal ou vertical, com separador e texto opcionais. Usado em barras de ações, botões divididos (split) e campos com botão.