Toggle switch with labels and form chrome.
Introduction
Use switches for binary settings that take effect immediately, such as enabling notifications or dark mode. Prefer Checkbox when the choice is part of a form submission or when users may select multiple options. For choosing among labeled segments in a shared track, use Toggle Group.
endLabel / startLabel and description are built into the component. A native checkbox input with role="switch" drives the control under the hood.
Import
import { Switch } from "@bridge-ui/vue/Components/Switch";import { Switch } from "@bridge-ui/react/Components/Switch";Basic usage
Provide endLabel / startLabel and optional description. In React, use checked and onChange for controlled state; in Vue, use v-model. For uncontrolled usage with an initial state, use defaultChecked in React or default-checked in Vue.
Use dark theme across the app.
Use dark theme across the app.
Colors
Use the color prop to change the track and thumb color. Available colors: primary, secondary, success, info, warning, error, and dark.
Sizes
Control the switch size with the size prop. Available sizes: 2xs, xs, sm, md (default), lg, xl, and 2xl.
Rounded
Use the rounded prop to control border radius. Available values: none, xs, sm, md, lg, xl, 2xl, 3xl, 4xl, and full (defaults vary by component).
Validation
Use required to mark the field as required, error with errorMessage for invalid state, and disabled to prevent interaction.
You must enable this setting.
You must enable this setting.
Related components
Checkbox, Label, Radio, Toggle Group
Accessibility
- Space toggles the switch when the native input is focused
- Tab and Shift+Tab move between controls in the page
- A visually hidden native <input type="checkbox" role="switch"> holds state; track and thumb have aria-hidden
- endLabel is associated with the input through matching id and htmlFor
- error sets aria-invalid on the input and data-invalid on the FormControl root
- disabled sets aria-disabled on the FormControl root
Anatomy
<div data-invalid>
<div>
<!-- row -->
<label>
<input type="checkbox" role="switch" class="sr-only" id="..." />
<span aria-hidden="true" />
<!-- track -->
<span aria-hidden="true" />
<!-- thumb -->
</label>
<label for="...">End label</label>
</div>
<p>Description</p>
<p aria-hidden>Error message</p>
</div>API
| Prop | Type | Default | Description |
|---|---|---|---|
| v-model | boolean | — | Two-way binding for the on state. |
| default-checked | boolean | false | Initial on state for uncontrolled usage (without v-model). |
| Prop | Type | Default | Description |
|---|---|---|---|
| checked | boolean | — | On state. Use with onChange for controlled state. |
| defaultChecked | boolean | — | Initial on state for uncontrolled usage. |
| onChange | ChangeEventHandler<HTMLInputElement> | — | Native input change handler. |
| Prop | Type | Default | Description |
|---|---|---|---|
| endLabel | string | — | Label text after the control (LTR: right). |
| startLabel | string | — | Label text before the control (LTR: left). |
| description | string | — | Helper text below the control row. |
| error | boolean | false | Applies invalid styling and sets aria-invalid. |
| errorMessage | string | — | Error message shown below the control row. |
| required | boolean | false | Sets the native required attribute on the input. |
| disabled | boolean | false | Whether the switch is disabled. |
| color | SwitchColor | "primary" | Semantic color of the switch. |
| size | SwitchSize | "md" | Size of the control and label typography. |
| rounded | SwitchRounded | "full" | Border radius of the track. |
| classes | SwitchClasses | — | Classes for form control chrome and switch parts. |
| customProps | SwitchCustomProps | — | Extra props for FormControl chrome and control parts. startLabel / endLabel accept Label props (no children). |
| slots | SwitchSlots | — | React slots for chrome and the control. |