# Switch
An on/off control that takes effect at once: a native checkbox with the switch role.
```ehtml Example
import { Switch } from "@elements/ui/switch";
import { Label } from "@elements/ui/label";
```
## Parts
| Part | What it is |
|---|---|
| `.switch` | The wrapper: track and thumb stacked in one cell. |
| `.switch-input` | The native ``, drawn as the track. |
| `.switch-thumb` | The knob. It moves by transform; nothing resizes. |
## Attributes
| Attribute | Type | Default | Description |
|---|---|---|---|
| `checked` | `boolean` (two-way) | `false` | On or off. Bind it to state; a click writes back. |
| `value` | `string` | `"on"` | Submitted with name while on. |
| `name` | `string` | `""` | Form field name. |
| `size` | `"sm" \| "md"` | `"md"` | Track size. |
| `uncheckedValue` | `string \| undefined` | `undefined` | Submitted under name while off. By default an off switch submits nothing. |
| `readOnly` | `boolean` | `false` | Focusable and announced, but a click, Space, Enter or a label press does not change it. |
| `disabled` | `boolean` | `false` | Native disabled. |
| `required` | `boolean` | `false` | The form will not submit while off. |
| `invalid` | `boolean` | `false` | aria-invalid and a danger outline. |
| `class` | `string` | `""` | Extra classes on the wrapper. |
| `attrs` | `Record` | `{}` | Attributes for the ``: id, aria-label, aria-describedby, data-\*. |
| `onCheckedChange` | `(checked: boolean, details: ChangeDetails) => void` | `() => {}` | The user changed it, or a form reset restored it (not called for changes made in code). It runs before the change with details second (reason, event, cancel(), isCanceled); details.cancel() keeps the state. |
## Keyboard
| Keys | Action |
|---|---|
| `Space` | Toggles the switch. |
| `Enter` | Toggles the switch. |
## Data attributes
| Attribute | Values | On | Description |
|---|---|---|---|
| `data-state` | `"checked" \| "unchecked"` | wrapper, input, thumb | |
| `data-checked, data-unchecked` | present for the current state | wrapper, input, thumb | The same state as data-state, as presence attributes. |
| `data-size` | `"sm" \| "md"` | wrapper | |
| `data-disabled` | present while disabled | wrapper, thumb | |
| `data-readonly` | present while readOnly | wrapper, input, thumb | |
| `data-required` | present while required | wrapper, thumb | |
| `data-invalid` | present while invalid | input | |
## Accessibility
- role="switch" on a native checkbox: assistive tech announces on and off from its checked state.
- Keep the label the same in both states; the switch carries the state (APG).
- Name it with a `