Botão

Um botão é aquilo em que se carrega para algo acontecer. button() desenha um <button> a sério, com type="button", por isso pôr um dentro de um formulário não o submete por acidente.

Botão básico

A predefinição é um botão sólido, primary, de tamanho médio. Os filhos são a etiqueta; tudo o resto é uma prop.

stack({ direction: 'row', gap: 'md' },
  button('Um'),
  button('Dois'),
  button('Três'),
)

Variantes

Cinco níveis de ênfase, do único apelo à ação da página até algo que se lê como uma ligação.

stack({ direction: 'row', gap: 'md', wrap: true },
  button({ variant: 'solid' }, 'Solid'),
  button({ variant: 'soft' }, 'Soft'),
  button({ variant: 'outline' }, 'Outline'),
  button({ variant: 'ghost' }, 'Ghost'),
  button({ variant: 'link' }, 'Link'),
)

Cores

Todos os componentes com tema bebem das mesmas cinco paletas, por isso um botão color: 'danger' e um alerta color: 'danger' combinam sem que nenhum saiba do outro.

stack({ direction: 'row', gap: 'md', wrap: true },
  button({ color: 'primary' }, 'Primary'),
  button({ color: 'neutral' }, 'Neutral'),
  button({ color: 'success' }, 'Success'),
  button({ color: 'warning' }, 'Warning'),
  button({ color: 'danger' }, 'Danger'),
)
stack({ direction: 'row', gap: 'md', wrap: true },
  button({ variant: 'soft', color: 'primary' }, 'Primary'),
  button({ variant: 'soft', color: 'neutral' }, 'Neutral'),
  button({ variant: 'soft', color: 'success' }, 'Success'),
  button({ variant: 'soft', color: 'warning' }, 'Warning'),
  button({ variant: 'soft', color: 'danger' }, 'Danger'),
)

Tamanhos

stack({ direction: 'row', gap: 'md', align: 'center', wrap: true },
  button({ size: 'sm' }, 'Pequeno'),
  button({ size: 'md' }, 'Médio'),
  button({ size: 'lg' }, 'Grande'),
)

Ícones

Passa qualquer marcação SVG em startIcon ou endIcon. Os ícones são dimensionados em em, por isso acompanham o botão em vez de precisarem de um tamanho próprio.

stack({ direction: 'row', gap: 'md', wrap: true },
  button({
    startIcon: icon('plus'),
  }, 'Página nova'),
  button({
    variant: 'outline',
    endIcon: icon('arrow-right'),
  }, 'Continuar'),
)

Botão de ícone

iconButton() é um botão quadrado com um único ícone. O seu label é obrigatório — passa a ser o nome acessível que o ícone sozinho não consegue dar, e a dica ao passar o rato.

stack({ direction: 'row', gap: 'md' },
  iconButton({ label: 'Adicionar', icon: icon('plus') }),
  iconButton({ label: 'Editar', variant: 'soft', icon: icon('edit') }),
  iconButton({ label: 'Eliminar', variant: 'ghost', color: 'danger', icon: icon('trash') }),
)

A carregar e desativado

loading troca por um indicador giratório e define aria-busy, deixando a etiqueta no lugar para que o botão não mude de largura a meio da ação.

stack({ direction: 'row', gap: 'md', wrap: true },
  button({ loading: true }, 'A guardar'),
  button({ variant: 'outline', loading: true }, 'A verificar'),
  button({ disabled: true }, 'Desativado'),
  button({ variant: 'soft', disabled: true }, 'Desativado'),
)

Ligações

Dá a um botão um href e ele desenha um <a> — o elemento certo para algo que navega. As âncoras não têm estado desativado, por isso disabled torna-se aria-disabled e retira-a da ordem de tabulação.

stack({ direction: 'row', gap: 'md', wrap: true },
  button({ href: '/pt/docs' }, 'Ler a documentação'),
  button({ href: '/pt/docs/ui', variant: 'outline' }, 'Componentes'),
  button({ href: '/pt/docs', variant: 'link' }, 'Ligação simples'),
)

Largura total

button({ block: true, size: 'lg' }, 'Publicar o site')

Props

Tudo o que não estiver listado aqui cai no elemento renderizado como atributo — id, data-*, onclick, popovertarget e os restantes.

PropTipoPredefiniçãoDescrição
variant'solid' | 'soft' | 'outline' | 'ghost' | 'link''solid'Quanta ênfase o botão carrega.
color'primary' | 'neutral' | 'success' | 'warning' | 'danger''primary'De que paleta bebe.
size'sm' | 'md' | 'lg''md'Altura, espaçamento e tamanho da etiqueta.
hrefstring—Desenha um <a> em vez de um <button>.
startIconstring—Marcação colocada antes da etiqueta.
endIconstring—Marcação colocada depois da etiqueta.
loadingbooleanfalseMostra um indicador giratório e define aria-busy.
disabledbooleanfalseDesativa o botão, ou marca uma ligação como aria-disabled.
blockbooleanfalseEstica até à largura total do contentor.
type'button' | 'submit' | 'reset''button'Só para a forma <button>.

iconButton() aceita as mesmas props mais um label obrigatório e um icon.