Toggle Group
Atom
Toggle Group organiza opções curtas relacionadas. Use quando a comparação visual entre opções compactas ajuda a operar mais rápido.
Use type="single" quando apenas uma opção pode estar ativa. Use type="multiple" quando as opções são independentes. Para escolhas com descrição ou consequência pesada, prefira Radio Group ou Checkbox.
Exemplos copiáveis
React
React
import * as React from "react"
type ToggleOption = {
value: string
label: string
}
type PulsoToggleGroupProps = {
label: string
options: ToggleOption[]
value: string
onChange: (value: string) => void
}
export function PulsoToggleGroup({ label, options, value, onChange }: PulsoToggleGroupProps) {
return (
<div role="group" aria-label={label} className="inline-flex rounded-[var(--radius-md)] border border-[var(--border)] bg-[var(--muted)] p-1">
{options.map((option) => {
const selected = option.value === value
return (
<button
key={option.value}
type="button"
aria-pressed={selected}
data-state={selected ? "on" : "off"}
onClick={() => onChange(option.value)}
className={[
"min-h-8 rounded-[var(--radius-sm)] px-3 text-sm font-medium transition-colors duration-[var(--motion-duration-fast)] ease-[var(--motion-easing)]",
"focus-visible:outline focus-visible:outline-[var(--ring-width)] focus-visible:outline-offset-2 focus-visible:outline-[var(--ring)]",
selected ? "bg-[var(--card)] text-[var(--fg)] shadow-[var(--shadow-sm)]" : "text-[var(--fg-muted)] hover:text-[var(--fg)]",
].join(" ")}
>
{option.label}
</button>
)
})}
</div>
)
}const [period, setPeriod] = React.useState("7d")
<PulsoToggleGroup
label="Período"
value={period}
onChange={setPeriod}
options={[
{ value: "24h", label: "24h" },
{ value: "7d", label: "7d" },
{ value: "30d", label: "30d" },
]}
/>Quando usar
- Período curto:
24h / 7d / 30d. - Modo de visualização: lista, tabela, timeline.
- Escala simples: linear/log.
- Filtros compactos com opções curtas.
Quando não usar
- Para opções longas ou com descrição.
- Para decisões críticas com consequência complexa.
- Para navegação entre páginas.
- Para listas com muitas opções; use Select.
Acessibilidade
- Use
role="group"comaria-label. - Cada item deve ser botão com
aria-pressed. - Se o grupo for semanticamente escolha exclusiva de formulário,
Radio Grouppode ser mais correto. - Estado ativo precisa ser visível sem depender apenas de cor.
Regras
- Labels curtos: idealmente 1 palavra ou abreviação conhecida.
- Altura e peso visual consistentes entre opções.
- Não misture single e multiple no mesmo grupo.
- Motion deve ser curto e suave, sem deslocamento exagerado.
- Use Radio Group quando a consequência precisa de descrição.
Last updated on