apps/docs/content/docs/en/react/components/(controls)/switch.mdx
import { Switch, SwitchGroup, Label } from '@heroui/react';
<ComponentPreview name="switch-basic" />
import { Switch, Label, Description } from '@heroui/react';
export default () => (
<Switch>
<Switch.Control>
<Switch.Thumb>
<Switch.Icon/>
</Switch.Thumb>
</Switch.Control>
<Switch.Content>
<Label />
<Description />
</Switch.Content>
</Switch>
);
For grouping multiple switches, use the SwitchGroup component:
import { Switch, SwitchGroup, Label } from '@heroui/react';
export default () => (
<SwitchGroup>
<Switch>
<Switch.Control>
<Switch.Thumb />
</Switch.Control>
<Label>Option 1</Label>
</Switch>
<Switch>
<Switch.Control>
<Switch.Thumb />
</Switch.Control>
<Label>Option 2</Label>
</Switch>
</SwitchGroup>
);
<ComponentPreview name="switch-sizes" />
<ComponentPreview name="switch-with-icons" />
<ComponentPreview name="switch-disabled" />
<ComponentPreview name="switch-without-label" />
<ComponentPreview name="switch-with-description" />
<ComponentPreview name="switch-default-selected" />
<ComponentPreview name="switch-controlled" />
<ComponentPreview name="switch-label-position" />
<ComponentPreview name="switch-group" />
<ComponentPreview name="switch-group-horizontal" />
<ComponentPreview name="switch-form" />
<ComponentPreview name="switch-render-props" />
<ComponentPreview name="switch-render-function" />
To customize the Switch component classes, you can use the @layer components directive.
Learn more.
@layer components {
.switch {
@apply inline-flex gap-3 items-center;
}
.switch__control {
@apply h-5 w-8 bg-gray-400 data-[selected=true]:bg-blue-500;
}
.switch__thumb {
@apply bg-white shadow-sm;
}
.switch__content {
@apply flex flex-col gap-1;
}
.switch__icon {
@apply h-3 w-3 text-current;
}
}
HeroUI follows the BEM methodology to ensure component variants and states are reusable and easy to customize.
The Switch component uses these CSS classes (View source styles):
.switch - Base switch container.switch__content - Optional content container.switch__control - Switch control track.switch__thumb - Switch thumb that moves.switch__icon - Optional icon inside the thumb.switch--sm - Small size variant.switch--md - Medium size variant (default).switch--lg - Large size variantThe SwitchGroup component uses these CSS classes (View source styles):
.switch-group - Switch group container.switch-group__items - Container for switch items.switch-group--horizontal - Horizontal layout.switch-group--vertical - Vertical layout (default)The switch supports both CSS pseudo-classes and data attributes for flexibility:
[data-selected="true"] (thumb position and background color change):hover or [data-hovered="true"]:focus-visible or [data-focus-visible="true"] (shows focus ring):disabled or [aria-disabled="true"] (reduced opacity, no pointer events):active or [data-pressed="true"]Inherits from React Aria Switch.
| Prop | Type | Default | Description |
|---|---|---|---|
size | 'sm' | 'md' | 'lg' | 'md' | The size of the switch |
isSelected | boolean | false | Whether the switch is on |
defaultSelected | boolean | false | Whether the switch is on by default (uncontrolled) |
isDisabled | boolean | false | Whether the switch is disabled |
isInvalid | boolean | false | Whether the switch is invalid |
isReadOnly | boolean | false | Whether the switch is read only |
isRequired | boolean | false | Whether the switch must be selected |
validate | (value: boolean) => ValidationError | true | null | undefined | - | Custom validation function |
validationBehavior | 'native' | 'aria' | 'native' | Whether to use native HTML form validation or ARIA |
name | string | - | The name of the input element, used when submitting an HTML form |
value | string | - | The value of the input element, used when submitting an HTML form |
onChange | (isSelected: boolean) => void | - | Handler called when the switch value changes |
onPress | (e: PressEvent) => void | - | Handler called when the switch is pressed |
children | React.ReactNode | (values: SwitchRenderProps) => React.ReactNode | - | Switch content or render prop |
render | DOMRenderFunction<keyof React.JSX.IntrinsicElements, SwitchRenderProps> | - | Overrides the default DOM element with a custom render function. |
When using the render prop pattern, these values are provided:
| Prop | Type | Description |
|---|---|---|
isSelected | boolean | Whether the switch is currently on |
isHovered | boolean | Whether the switch is hovered |
isPressed | boolean | Whether the switch is currently pressed |
isFocused | boolean | Whether the switch is focused |
isFocusVisible | boolean | Whether the switch is keyboard focused |
isDisabled | boolean | Whether the switch is disabled |
isReadOnly | boolean | Whether the switch is read only |
isInvalid | boolean | Whether the switch is invalid |
isRequired | boolean | Whether the switch is required |
state | - | State of the switch. |
| Prop | Type | Default | Description |
|---|---|---|---|
orientation | 'horizontal' | 'vertical' | 'vertical' | The orientation of the switch group |
children | React.ReactNode | - | The switch items to render |
className | string | - | Additional CSS class names |