Toggle
Em andamentoInterruptor liga/desliga com efeito imediato, como uma luz: role="switch", trilho verde quando ligado e o polegar deslizando. Tem descrição opcional e estado de erro.
- Função
- Formulário e ação
- Também chamado de
- interruptor, switch, chave, liga e desliga
- Mora em
- app/components/atoms/Toggle.tsx
- Última mudança
- 2026-09-30
Prévia
A peça ao vivo, vinda da ficha, na largura escolhida. Em larguras fixas, ela roda num quadro do tamanho de uma tela de verdade.
Na largura da página: 0px
Variantes na ficha
Lidas da ficha no build, na ordem do palco. Cada uma abre sozinha, sem o styleguide em volta — é o endereço que o palco carrega.
Quando usar
Para uma preferência que vale na hora em que muda — receber lembretes, mostrar legendas.
Faça
- Escreva o rótulo como o que fica ligado: "Lembretes por e-mail".
- Aplique o efeito na hora da mudança — é o que o interruptor promete.
- Use
descriptionpara explicar o efeito sem alongar o nome.
Evite
- Pedir confirmação ("Salvar") depois de mudar um interruptor — aí é Checkbox.
- Rótulos "Ligado/Desligado" no lugar do nome: o leitor já anuncia o estado.
Quando não usar. Para uma escolha que só vale ao enviar o formulário (aceitar termos, opções de inscrição), use o Checkbox.
Nota de uso
É interruptor, role="switch": o efeito é imediato, como ligar uma luz. Para escolha que só vale ao enviar o formulário, use o Checkbox. O trilho desligado tem limite em --border-interactive. A description é ligada por aria-describedby e fica fora do nome. Erro vindo do FormField aparece como anel vermelho e ícone ao lado do rótulo — estado nunca só por cor.
Anatomia
As partes, na ordem em que o olho — e o teclado — passam.
- Trilho — 44 × 24px; desligado em `--muted` com borda de controle, ligado em `--secondary`.
- Polegar — 18px, branco, com 2px de folga para todos os lados nos dois estados.
- Rótulo — Texto `text-sm` ao lado; com erro, um ícone de alerta antes dele.
- Descrição — Linha embaixo, fora do nome, ligada por `aria-describedby`.
Estados
Os estados que a peça tem no código, e o que muda em cada um.
| Estado | O que muda |
|---|---|
| Desligado | Trilho claro com borda --border-interactive; polegar à esquerda. |
| Ligado | Trilho e borda --secondary (verde); polegar desliza 20px para a direita. |
| Foco | Anel ring-ring de 2px em volta do trilho, só no teclado. |
| Erro | aria-invalid: anel vermelho no trilho e ícone de alerta ao lado do rótulo. |
| Desabilitado | Linha a 50%, cursor proibido e fora do Tab — medido. |
Comportamento
| Situação | O que acontece |
|---|---|
| Clique no trilho ou no texto | Liga ou desliga — a linha é o <label> do controle. |
Relacionados
Como usar no código
A importação e o menor uso, lidos do arquivo. O … marca as props obrigatórias.
import { Toggle } from '@/app/components/atoms/Toggle';
<Toggle />Propriedades
Lidas do código da peça no build — não escritas à mão.
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|---|---|---|---|---|
label | string | — | não | — |
description | string | — | não | Linha de apoio, ligada ao controle por aria-describedby — fora do nome. |
Aceita também: Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'>.
Medidas
| Parte | Valor | Classe |
|---|---|---|
| Trilho | 44 × 24px | h-6 w-11 |
| Polegar | 18px | after:size-4.5 |
| Linha (alvo de toque) | 44px de altura | min-h-alvo-toque |
Tokens de cor
Os tokens semânticos que o código da peça usa, com o valor de hoje em app/globals.css.
| Token | Valor | Usado como |
|---|---|---|
--card | #FFFFFF | bg-cardborder-card |
--destructive | #BA0517 | ring-destructivetext-destructive |
--secondary | #0B8434 | bg-secondaryborder-secondary |
--border | #E5E5E5 | bg-border |
--border-interactive | #8C8C8C | border-border-interactive |
--foreground | #1A1A1A | text-ink |
--muted | #F4F6F9 | bg-muted |
--muted-foreground | #595959 | text-muted-foreground |
--primary | #D42B2B | ring-primary/20 |
--ring | var(--footer-red)), decisão da revisão 2. Se outra peça precisar
* dele como superfície, o nome vira de papel (ex.: --surface-brand-strong). */
--footer-red: #7D1B1B | ring-ring |
Teclado
| Tecla | Faz |
|---|---|
| Tab | Leva o foco ao interruptor. Desabilitado é pulado. |
| Espaço | Liga ou desliga — medido. |
| Enter | Não faz nada — medido. Como no Checkbox, só o Espaço alterna. |
Leitor de tela
O que é anunciado, e por quê.
role="switch": o leitor anuncia "interruptor, ligado/desligado", e não "caixa de seleção".- O controle nativo é visualmente escondido (
sr-only) e o trilho desenhado éaria-hidden.
O que sustenta o estado
Esta peça usa formulario. O estado dela é o de quem já foi ouvido com leitor de tela nesses padrões — e não uma passada sobre esta peça em específico.
Falta ouvir: formulario — ver docs/a11y-screen-reader-checklist.md.
Status e recursos
| Tipo | Recurso | Status |
|---|---|---|
| Código | app/components/atoms/Toggle.tsx | Disponível |
| Ficha | Storybook (abre em outra aba) | Disponível |
| Teste de acessibilidade | axe em npm run test | No gate de todo commit |
| Leitor de tela | Passada da E33 | Falta ouvir |
| Design | Figma | Desativado até a Fase 2 |
Histórico
Os últimos commits que tocaram o arquivo, lidos do git no build.
0298af82026-09-30E147: fechamento da Entrega 11 — REPORT.md, verificação cross-agent e o gate estático estrito
O histórico completo está no GitHub (abre em outra aba).