- Accordion
- Alert
- Alert Dialog
- Aspect Ratio
- Attachment
- Avatar
- Badge
- Breadcrumb
- Bubble
- Button
- Button Group
- Card
- Checkbox
- Collapsible
- Combobox
- Context Menu
- Date Picker (Lite)
- Dialog
- Direction
- Drawer
- Dropdown Menu
- Empty
- Field
- Hover Card
- Input
- Input Group
- Input OTP (Lite)
- Item
- Kbd
- Label
- Marker
- Menubar
- Message
- Native Select
- Navigation Menu
- Pagination
- Popover
- Progress
- Radio Group
- Scroll Area
- Select
- Separator
- Sheet
- Sidebar
- Skeleton
- Slider
- Spinner
- Switch
- Table
- Tabs
- Textarea
- Toast
- Toggle
- Toggle Group
- Tooltip
import { Label } from "@/components/ui/label"
import { Switch } from "@/components/ui/switch"
export function SwitchDemo() {
return (
<div class="flex items-center space-x-2">
<Switch id="airplane-mode" />
<Label for="airplane-mode">Airplane Mode</Label>
</div>
)
}Installation
pnpm dlx shadcnui-hono-jsx@latest add switchnpx shadcnui-hono-jsx@latest add switchyarn dlx shadcnui-hono-jsx@latest add switchbunx shadcnui-hono-jsx@latest add switchUsage
import { Switch } from "@/components/ui/switch"<Switch />Description
Focus is shared across devices, and turns off when you leave the app.
import {
Field,
FieldContent,
FieldDescription,
FieldLabel,
} from "@/components/ui/field"
import { Switch } from "@/components/ui/switch"
export function SwitchDescription() {
return (
<Field orientation="horizontal" class="max-w-sm">
<FieldContent>
<FieldLabel for="switch-focus-mode">Share across devices</FieldLabel>
<FieldDescription>
Focus is shared across devices, and turns off when you leave the app.
</FieldDescription>
</FieldContent>
<Switch id="switch-focus-mode" />
</Field>
)
}Choice Card
Card-style selection where FieldLabel wraps the entire Field for a clickable card pattern.
import {
Field,
FieldContent,
FieldDescription,
FieldGroup,
FieldLabel,
FieldTitle,
} from "@/components/ui/field"
import { Switch } from "@/components/ui/switch"
export function SwitchChoiceCard() {
return (
<FieldGroup class="w-full max-w-sm">
<FieldLabel for="switch-share">
<Field orientation="horizontal">
<FieldContent>
<FieldTitle>Share across devices</FieldTitle>
<FieldDescription>
Focus is shared across devices, and turns off when you leave the
app.
</FieldDescription>
</FieldContent>
<Switch id="switch-share" />
</Field>
</FieldLabel>
<FieldLabel for="switch-notifications">
<Field orientation="horizontal">
<FieldContent>
<FieldTitle>Enable notifications</FieldTitle>
<FieldDescription>
Receive notifications when focus mode is enabled or disabled.
</FieldDescription>
</FieldContent>
<Switch id="switch-notifications" defaultChecked />
</Field>
</FieldLabel>
</FieldGroup>
)
}Disabled
Add the disabled prop to the Switch component to disable the switch. Add the data-disabled prop to the Field component for styling.
import { Field, FieldLabel } from "@/components/ui/field"
import { Switch } from "@/components/ui/switch"
export function SwitchDisabled() {
return (
<Field orientation="horizontal" data-disabled class="w-fit">
<Switch id="switch-disabled-unchecked" disabled />
<FieldLabel for="switch-disabled-unchecked">Disabled</FieldLabel>
</Field>
)
}Invalid
Add the aria-invalid prop to the Switch component to indicate an invalid state. Add the data-invalid prop to the Field component for styling.
You must accept the terms and conditions to continue.
import {
Field,
FieldContent,
FieldDescription,
FieldLabel,
} from "@/components/ui/field"
import { Switch } from "@/components/ui/switch"
export function SwitchInvalid() {
return (
<Field orientation="horizontal" class="max-w-sm" data-invalid>
<FieldContent>
<FieldLabel for="switch-terms">Accept terms and conditions</FieldLabel>
<FieldDescription>
You must accept the terms and conditions to continue.
</FieldDescription>
</FieldContent>
<Switch id="switch-terms" aria-invalid />
</Field>
)
}Size
Use the size prop to change the size of the switch.
import { Field, FieldGroup, FieldLabel } from "@/components/ui/field"
import { Switch } from "@/components/ui/switch"
export function SwitchSizes() {
return (
<FieldGroup class="w-full max-w-[10rem]">
<Field orientation="horizontal">
<Switch id="switch-size-sm" size="sm" />
<FieldLabel for="switch-size-sm">Small</FieldLabel>
</Field>
<Field orientation="horizontal">
<Switch id="switch-size-default" size="default" />
<FieldLabel for="switch-size-default">Default</FieldLabel>
</Field>
</FieldGroup>
)
}RTL
To enable RTL support in shadcn/ui, see the RTL configuration guide.
Focus is shared across devices, and turns off when you leave the app.
يتم مشاركة التركيز عبر الأجهزة، ويتم إيقاف تشغيله عند مغادرة التطبيق.
המיקוד משותף בין מכשירים, וכבה כשאתה עוזב את האפליקציה.
// This example sets dir and uses useTranslation because this site is not RTL.
// In an RTL app you won't need them; see the RTL guide.
import {
type Translations,
useTranslation,
} from "@/components/language-selector"
import {
Field,
FieldContent,
FieldDescription,
FieldLabel,
} from "@/components/ui/field"
import { Switch } from "@/components/ui/switch"
const translations: Translations = {
en: {
dir: "ltr",
values: {
label: "Share across devices",
description:
"Focus is shared across devices, and turns off when you leave the app.",
},
},
ar: {
dir: "rtl",
values: {
label: "المشاركة عبر الأجهزة",
description:
"يتم مشاركة التركيز عبر الأجهزة، ويتم إيقاف تشغيله عند مغادرة التطبيق.",
},
},
he: {
dir: "rtl",
values: {
label: "שיתוף בין מכשירים",
description: "המיקוד משותף בין מכשירים, וכבה כשאתה עוזב את האפליקציה.",
},
},
}
export function SwitchRtl() {
const { dir, t } = useTranslation(translations, "ar")
return (
<Field orientation="horizontal" class="max-w-sm" dir={dir}>
<FieldContent>
<FieldLabel for="switch-focus-mode-rtl" dir={dir}>
{t.label}
</FieldLabel>
<FieldDescription dir={dir}>{t.description}</FieldDescription>
</FieldContent>
<Switch id="switch-focus-mode-rtl" dir={dir} />
</Field>
)
}Notes
- Built on a native
<input type="checkbox" role="switch">inside the styled root: no JavaScript, and the value is submitted with forms.id,name,value,disabled,required,formandaria-*go to the input, so<Label for>works as usual. checked/defaultCheckedset the initial state;onCheckedChange,readOnlyandrenderare not supported.- Accepts
classinstead ofclassName. - Upstream documentation: shadcn/ui Switch. See also Differences from shadcn/ui.
API Reference
See the Base UI Switch documentation.