Toggle
Um 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.
pnpm dlx shadcn@latest add https://hextaui.com/r/toggle.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 class-variance-authority cnCopie e cole o código a seguir no seu projeto.
components/ui/toggle.tsx Atualize os caminhos de importação para corresponder à configuração do seu projeto.
Passar o mouse sobre um toggle desligado mostra um tom leve; ligá-lo assenta um preenchimento mais forte e leva o rótulo ao contraste total, então ligado nunca parece hover.
Outline
variant="outline" adiciona uma borda e uma superfície, para toggles que ficam sozinhos.
Com texto
Ícones e rótulos ficam lado a lado. Toggles com texto visível não precisam de aria-label.
Preenchido quando ligado
Adicione group-data-pressed/toggle:fill-current a um ícone outline e ele se preenche quando o toggle é ligado.
Tamanhos
sm, default e lg. Toggles apenas com ícone permanecem quadrados.
Pill
shape="pill" arredonda totalmente as pontas, para toggles dentro de superfícies arredondadas como um compositor de chat.
Desabilitado
Um toggle desabilitado continua mostrando se está ligado, mas não pode ser pressionado nem focado.
Controlado
Passe pressed e onPressedChange. O rótulo permanece o mesmo enquanto o ícone acompanha o estado.
Da direita para a esquerda
Os ícones precedem o rótulo a partir da direita.
| Tecla | Ação |
|---|---|
| SpaceEnter | Liga ou desliga o toggle com foco. |
| Tab | Move o foco para o próximo toggle. |
- O toggle é um
buttoncomaria-pressed, então os leitores de tela anunciam se está ligado. - Dê aos toggles apenas com ícone um
aria-labelque nomeie a ação ("Silenciar microfone") e mantenha-o igual nos dois estados. Mudá-lo junto com o estado pressionado soa como uma dupla negação. - Em telas touch, a área de toque cresce para pelo menos 44px, exceto dentro de um toggle group, onde os vizinhos se sobreporiam.
- Com movimento reduzido, nada escala; o preenchimento apenas aparece com fade.
| Prop | Tipo | Padrão |
|---|---|---|
variant | "default" | "outline" | "default" |
size | "default" | "sm" | "lg" | "default" |
shape | "default" | "pill" | "default" |
pressed | boolean | – |
defaultPressed | boolean | false |
onPressedChange | (pressed, details) => void | – |
disabled | boolean | false |
valueIdentifica o toggle dentro de um toggle group. | string | – |
className | string | (state) => string | – |
nativeButton | boolean | true |
render | ReactElement | (props, state) => ReactElement | <button> |
| Atributo | Descrição |
|---|---|
data-slot="toggle" | O botão, com data-variant e data-size. |
data-pressed | Presente quando o toggle está ligado. |
data-disabled | Presente quando o toggle está desabilitado. |
- ButtonBotõ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.
- Button groupBotões unidos em um único controle, com emendas compartilhadas, separadores, addons de texto, aninhamento e pilhas verticais.
- 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.
Usado em blocos
Blocos que se baseiam em Toggle.
- ArtifactO painel ao lado de um chat de IA que mostra o que o modelo criou. Páginas web, SVGs, documentos e código chegam em streaming ao vivo e depois passam para uma prévia isolada em sandbox, com versões que você pode comparar e restaurar, uma divisão redimensionável e um bottom sheet no celular.
- Code BlockBlocos de código feitos para respostas de IA. Realce de sintaxe que acompanha o streaming, copiar, baixar e quebra de linha, números de linha e linhas destacadas, diffs com aceitar e rejeitar e um terminal para comandos.