Toggle

Molecule

role="switch" toggle/switch with three sizes, description slot, and disabled support. Fully accessible via CSS transform without a native input.

Props EditorInteractive
<Toggle id="toggle" label="Enable notifications" onChange={setChecked} />

Checked

Preview
Code
<Toggle id="notif" label="Notifications enabled" checked onChange={setEnabled} />

Unchecked

Preview
Code
<Toggle id="dark" label="Dark mode" checked={false} onChange={setDark} />

No visible label

Preview
Code
<Toggle id="t" label="" ariaLabel="Enable notifications" checked onChange={setEnabled} />

Disabled

Preview
Code
<Toggle id="a" label="Enabled (disabled)" checked disabled onChange={() => {}} />
<Toggle id="b" label="Disabled option" checked={false} disabled onChange={() => {}} />

Sizes

Preview
Code
<Toggle id="sm" label="Small" size="sm" checked onChange={set} />
<Toggle id="md" label="Medium" size="md" checked onChange={set} />
<Toggle id="lg" label="Large" size="lg" checked onChange={set} />

Pending (a write is in flight)

Preview
Code
<Toggle id="heater" label="Heater" checked pending onChange={write} />

Mismatch (the device reports another value)

Preview

The device reports a different value.

Code
<Toggle id="heater" label="Heater" checked mismatch describedBy="heater-hint" onChange={write} />
<p id="heater-hint">The device reports a different value.</p>

With description

Preview
Code
<Toggle id="marketing" label="Marketing emails" description="Receive weekly updates." checked={value} onChange={setValue} />

Settings list (controlled)

Preview

Push notifications

Alerts for new activity

Marketing emails

Weekly updates and offers

Dark mode

Switch to dark theme

Code
function Demo() {
  const [s, setS] = useState({ notifications: true, marketing: false });
  return (
    <div className="divide-y border rounded-lg">
      {[{ key: 'notifications', label: 'Push notifications', desc: 'Alerts for new activity' }, ...].map(({ key, label, desc }) => (
        <div key={key} className="flex items-center justify-between px-4 py-3">
          <div>
            <p className="text-sm font-medium">{label}</p>
            <p className="text-xs text-text-secondary">{desc}</p>
          </div>
          <Toggle id={key} label="" ariaLabel={label} checked={s[key]} onChange={() => setS(p => ({ ...p, [key]: !p[key] }))} />
        </div>
      ))}
    </div>
  );
}
Sourcemodules/ui/Toggle.tsx