Bridge UI

Switch

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.

Colors

Use the color prop to change the track and thumb color. Available colors: primary, secondary, success, info, warning, error, dark, and black.

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.

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
default-checked boolean false Initial on state for uncontrolled usage (without v-model).
v-model boolean — Two-way binding for the on state.
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
classes SwitchClasses — Classes for form control chrome and switch parts.
color SwitchColor "primary" Semantic color of the switch.
customProps SwitchCustomProps — Extra props for FormControl chrome and control parts. startLabel / endLabel accept Label props (no children).
description string — Helper text below the control row.
disabled boolean false Whether the switch is disabled.
endLabel string — Label text after the control (LTR: right).
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.
rounded SwitchRounded "full" Border radius of the track.
size SwitchSize "md" Size of the control and label typography.
slots SwitchSlots — React slots for chrome and the control.
startLabel string — Label text before the control (LTR: left).