Native Solid 2 fork. Original documentation and designs © WorkOS; historical posts retain their original context.

Switch

A control that allows the user to toggle between checked and not checked.

Download runnable sandbox
import { Switch } from "@radix-solid/primitives";
import styles from "./styles.module.css";
const SwitchDemo = () => <form>
<div style={{ "display": "flex", "align-items": "center" }}>
<label id="airplane-mode-label" for="airplane-mode" class={styles.Label} style={{ "padding-right": "15px" }}>
Airplane mode
</label>
<Switch.Root id="airplane-mode" aria-labelledby="airplane-mode-label" class={styles.Root}>
<Switch.Thumb class={styles.Thumb} />
</Switch.Root>
</div>
</form>;
export default SwitchDemo;

Features

  • Full keyboard navigation.

  • Can be controlled or uncontrolled.

Anatomy

Import all parts and piece them together.

import { Switch } from "@radix-solid/primitives";
export default () => <Switch.Root>
<Switch.Thumb />
</Switch.Root>;

API Reference

Root

Contains all the parts of a switch. An input will also render when used within a form to ensure events propagate correctly.

PropTypeDefault
asChildbooleanfalse
defaultCheckedboolean—
checkedboolean—
onCheckedChangefunction—
disabledboolean—
requiredboolean—
namestring—
valuestringon
Data attributeValues
[data-state]"checked" | "unchecked"
[data-disabled]

Present when disabled

Thumb

The thumb that is used to visually indicate whether the switch is on or off.

PropTypeDefault
asChildbooleanfalse
Data attributeValues
[data-state]"checked" | "unchecked"
[data-disabled]

Present when disabled

Examples

Decoupling the hidden input

By default, Switch.Root renders a visually hidden input for form submission. To recompose, move, or exclude that input, you can build the switch from its lower-level parts instead.

Important: These parts are unstable and prefixed with unstable_, so their API may change in a future release.

  • Switch.unstable_Provider provides the switch state and accepts the form-related props (name, value, checked, defaultChecked, required, disabled, onCheckedChange).
  • Switch.unstable_Trigger is the interactive button that wraps Switch.Thumb.
  • Switch.unstable_BubbleInput is the visually hidden input that Switch.Root renders by default. Omit it when you don't need form submission.
import { Switch } from "@radix-solid/primitives";
export default () => <Switch.unstable_Provider name="airplane-mode">
<Switch.unstable_Trigger>
<Switch.Thumb />
</Switch.unstable_Trigger>
{/* The hidden input can be omitted if you don't need form submission */}
<Switch.unstable_BubbleInput />
</Switch.unstable_Provider>;

Accessibility

Adheres to the switch role requirements.

Keyboard Interactions

KeyDescription
Space
Toggles the component's state.
Enter
Toggles the component's state.