Makuco UI
ComponentesData Entry & Selection

Switch

Controle de alternância booleana (ligado/desligado) com suporte completo a form association e semântica de acessibilidade `role="switch"`.

O mk-switch representa um controle de alternância binária — ligado ou desligado. É semanticamente diferente de um checkbox: use-o quando a ação tem efeito imediato (ex.: ativar notificações) em vez de acumular seleções para submissão posterior.

Quando usar

Use o mk-switch quando:

  • A ação é imediata — ligar notificações, ativar modo escuro, habilitar permissão.
  • O resultado é binário: ligado ou desligado.
  • O usuário não precisa confirmar antes da mudança ter efeito.

Prefira outra alternativa quando:

  • A mudança só terá efeito após envio de formulário — use mk-checkbox.
  • Há mais de duas opções — use mk-radio ou mk-select.
  • A ação é destrutiva ou irreversível — prefira botão com confirmação explícita, pois o switch não tem passo de confirmação.

Anatomia

#ParteObrigatório?Função
1Trilha (track)SimFundo do controle — muda de cor para indicar ligado ou desligado.
2Indicador (thumb)SimCírculo deslizante: esquerda = desligado, direita = ligado.
3RótuloSimDescreve o que está sendo controlado. Deve nomear a funcionalidade, não o estado.
4HelperNãoInformação complementar sobre o impacto da configuração.
5LinkNãoAção ou recurso relacionado (ex.: "Saiba mais sobre esta configuração").

Variantes

  • Posição do rótulo à direita (padrão): rótulo à direita do controle. Padrão para listas de configurações.
  • Posição do rótulo à esquerda: rótulo à esquerda do controle. Para formulários com labels à esquerda ou tabelas de permissões.

Comportamento

O Switch muda de estado imediatamente ao clicar — sem etapa de confirmação. Ao ativar, a trilha muda para verde (success-900) e o thumb desliza para a direita. Ao desativar, a trilha volta ao neutro.

O rótulo é clicável: clicar sobre o texto tem o mesmo efeito que clicar no controle, ampliando a área de interação.

O rótulo deve descrever o que está sendo controlado, não o estado atual. Evite "Ativado" ou "Desligado" — prefira "Receber notificações" ou "Modo escuro".

Estados

EstadoQuando apareceO que muda visualmente
Ligado (checked)Funcionalidade ativaTrilha verde (success-900); thumb à direita; rótulo neutral-900.
DesligadoFuncionalidade inativaTrilha cinza (neutral-500); thumb à esquerda; rótulo neutral-900.
Desligado + DesabilitadoControle indisponível, funcionalidade inativaTrilha cinza claro (neutral-400); rótulo neutral-600; cursor bloqueado.
Ligado + DesabilitadoControle indisponível, funcionalidade ativaTrilha mantém success-900; rótulo neutral-600; cursor bloqueado.

Composição

O mk-switch aparece com mais frequência em páginas de configurações, painéis de preferências e listas de permissões — sempre um item por linha, com rótulo claro. Quando vários switches aparecem agrupados, mantenha alinhamento e espaçamento consistentes.

Para seleções que terão efeito após envio de formulário, use mk-checkbox. Para escolhas entre mais de duas opções, use mk-radio.

Padrão

import { MkSwitch } from '@db1/makuco-ui-react';

<MkSwitch label="Notificações" />
<MkSwitch label="Notificações" checked />
<mk-switch label="Notificações"></mk-switch>
<mk-switch label="Notificações" checked></mk-switch>

Posição do rótulo

Use labelPosition="start" para posicionar o rótulo antes do toggle.

<MkSwitch label="Rótulo no início" labelPosition="start" />
<MkSwitch label="Rótulo no fim" labelPosition="end" />
<mk-switch label="Rótulo no início" label-position="start"></mk-switch>
<mk-switch label="Rótulo no fim" label-position="end"></mk-switch>

Obrigatório

Quando required, o formulário não pode ser submetido sem que o switch esteja ligado.

<MkSwitch label="Aceito os termos de uso" required />
<mk-switch label="Aceito os termos de uso" required></mk-switch>

Desabilitado

<MkSwitch label="Desligado" disabled />
<MkSwitch label="Ligado" disabled checked />
<mk-switch label="Desligado" [disabled]="true"></mk-switch>
<mk-switch label="Ligado" [disabled]="true" checked></mk-switch>

Formulários

O mk-switch é form-associated: quando ligado, envia o value com o name ao submeter o formulário. Quando desligado, nenhum valor é enviado.

<form onSubmit={handleSubmit}>
  <MkSwitch label="Receber e-mails de marketing" name="marketing" value="yes" />
  <MkButton type="submit">Salvar preferências</MkButton>
</form>
<form (ngSubmit)="handleSubmit()">
  <mk-switch label="Receber e-mails de marketing" name="marketing" value="yes"></mk-switch>
  <mk-button type="submit">Salvar preferências</mk-button>
</form>

Props

PropTipoPadrãoDescrição
labelstring""Texto exibido ao lado do switch.
checkedbooleanfalseDefine se o switch está ligado. Mutável e refletido no atributo HTML.
disabledbooleanfalseDesabilita o switch, impedindo a interação.
requiredbooleanfalseMarca o switch como obrigatório para validação de formulário.
namestringAtributo name usado no envio do formulário.
valuestring"on"Valor enviado com o formulário quando o switch está ligado.
labelPosition"start" | "end""end"Posição do rótulo em relação ao toggle.

Eventos

EventoPayloadDescrição
mkChange{ checked: boolean }Emitido quando o usuário alterna o switch. Suprimido quando disabled.

Acessibilidade

  • Usa <input type="checkbox" role="switch"> — suporte a teclado (Tab para focar, Space para alternar) incluso.
  • aria-checked="true" ou "false" reflete o estado do switch para leitores de tela.
  • aria-required="true" aplicado quando required.
  • Label associado via htmlFor — leitores de tela anunciam o nome acessível corretamente.
  • Form-associated via ElementInternals: o name/value participam da submissão nativa de formulários.
  • role="switch" garante que leitores de tela anunciem o componente como um controle de alternância, e não como um checkbox.

Rótulos e identificação: o rótulo deve descrever a funcionalidade controlada, não o estado atual. "Notificações por e-mail" é um bom rótulo — "Ativado" não é. O elemento possui role="switch" e o estado (aria-checked) é anunciado automaticamente ao mudar.

Indicador de foco: outline ao redor do controle inteiro (trilha + thumb). Nunca remover o foco visual. O switch deve ser acionado com Space quando focado.

Estado desabilitado: quando desabilitado por razão específica (ex.: requer permissão de conta), comunique o motivo por outro meio — tooltip ou nota abaixo do componente.

On this page