# Switch
A toggle switch with a label. The label is the `label` attribute or the block body,
and the switch is interactive — readers can flip it. Add `defaultChecked` to start it
on, and `onLabel` / `offLabel` for short text shown inside the track.
Use it as `{% switch %}` in Markdown, or call it from Python logic
(loops, snippets) via `component('aardvark', 'switch', …)`.
## Label, default state, and track text
The label comes from the `label` attribute or the block body. `defaultChecked` starts
it on; `onLabel` / `offLabel` print short text inside the track.
Source: Markdown
```aardvark
{% switch label='Dark mode' defaultChecked=true %}
{% switch label='Notifications' onLabel='ON' offLabel='OFF' %}
```
Source: Python
```python
component('aardvark', 'switch', label='Dark mode', defaultChecked=True)
component('aardvark', 'switch', label='Notifications', onLabel='ON', offLabel='OFF')
```
## Colors and sizes
`color` is any theme color for the on-state track; `size` is `xs`–`xl`.
Source: Markdown
```aardvark
{% switch label='blue' defaultChecked=true %}
{% switch label='teal' color='teal' defaultChecked=true %}
{% switch label='large' size='lg' defaultChecked=true %}
```
Source: Python
```python
component('aardvark', 'switch', label='blue', defaultChecked=True)
component('aardvark', 'switch', label='teal', color='teal', defaultChecked=True)
component('aardvark', 'switch', label='large', size='lg', defaultChecked=True)
```
## Radius, thumb indicator, label position, and disabled
`radius` rounds the track; `withThumbIndicator` shows the inner thumb dot;
`labelPosition='left'` puts the label first; `disabled` makes it non-interactive.
Source: Markdown
```aardvark
{% switch label='Square track' radius='xs' defaultChecked=true %}
{% switch label='Thumb indicator' withThumbIndicator=true defaultChecked=true %}
{% switch label='Label on the left' labelPosition='left' defaultChecked=true %}
{% switch label='Disabled' disabled=true defaultChecked=true %}
```
Source: Python
```python
component('aardvark', 'switch', label='Square track', radius='xs', defaultChecked=True)
component('aardvark', 'switch', label='Thumb indicator', withThumbIndicator=True,
defaultChecked=True)
component('aardvark', 'switch', label='Label on the left', labelPosition='left',
defaultChecked=True)
component('aardvark', 'switch', label='Disabled', disabled=True, defaultChecked=True)
```
## Helper text
`description` and `error` add helper text below the label.
Source: Markdown
```aardvark
{% switch label='Beta features' description='Experimental — may change without notice.' %}
{% switch label='Required setting' error='Turn this on to save.' %}
```
Source: Python
```python
component('aardvark', 'switch', label='Beta features',
description='Experimental — may change without notice.')
component('aardvark', 'switch', label='Required setting', error='Turn this on to save.')
```
## With other components
Combine a switch with a heading and a [button](/components/buttons/button/) to build a
small settings row.
Notification settings
Save
Source: Markdown
```aardvark
Notification settings
{% switch label='Email me about replies' defaultChecked=true %}
{% button %}Save{% endButton %}
```
Source: Python
```python
component('aardvark', 'switch', label='Email me about replies', defaultChecked=True)
component('aardvark', 'button', children='Save')
```
## Attributes
Omit any attribute to take its Mantine default. For a React icon on the thumb
(`thumbIcon`), call `{% component('Switch', …) %}` directly — a
build-time tag can only pass the on/off labels as text.
| Attribute | Valid values | Description |
| --- | --- | --- |
| `label` | string | The label, when not using the block body. Plain text — Markdown (e.g. `**bold**`) is not rendered. |
| `defaultChecked` | bare flag (`true`) | Start the switch on. It stays interactive — the reader can toggle it. |
| `onLabel` | string | Short text shown inside the track in the on position. |
| `offLabel` | string | Short text shown inside the track in the off position. |
| `disabled` | bare flag (`true`) | Render non-interactive. |
| `color` | theme color name (`blue`, `teal`, …) | Track color in the on state. |
| `size` | `xs`, `sm`, `md`, `lg`, `xl` | Overall size. |
| `radius` | `xs`, `sm`, `md`, `lg`, `xl` | Corner rounding of the track. |
| `labelPosition` | `right` (default), `left` | Which side of the switch the label sits on. |
| `withThumbIndicator` | bare flag (`true`) | Show the inner thumb indicator dot. |
| `description` | string | Helper text shown below the label. |
| `error` | string | Error text shown below the label (also marks the switch invalid). |
| `attr` | dict (`attr={…}`) | Raw HTML attributes (e.g. `onchange`) applied to the rendered root. |
## CSS Selectors
Target a `{% switch %}` from your own CSS with the island data attribute or the Mantine Styles API part classes:
```css
/* Every Switch instance on the page */
[data-aardvark-island="Switch"] { }
/* Mantine Styles API parts */
.mantine-Switch-root { }
.mantine-Switch-track { }
.mantine-Switch-thumb { }
```
## Injecting Attributes
Pass `attr={…}` to forward raw HTML attributes — including inline event handlers — straight onto the rendered element. Here it is wired to `onchange`, so toggling it logs its checked state to the console and alerts it:
Source: Markdown
```aardvark
{% switch label='Dark mode' defaultChecked=true attr={'onchange': '''
const value = this.checked;
console.log('attr demo value:', value);
alert(value);
'''} %}
```
Source: Python
```python
component('aardvark', 'switch', label='Dark mode', defaultChecked=True, attr={'onchange': '''
const value = this.checked;
console.log('attr demo value:', value);
alert(value);
'''})
```