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.

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, 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.

Checkbox, Label, Radio

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.