apps/docs/content/docs/react/components/(buttons)/toggle-button.mdx
import { ToggleButton } from '@heroui/react';
<ComponentPreview name="toggle-button-basic" />
<ComponentPreview name="toggle-button-variants" />
<ComponentPreview name="toggle-button-icon-only" />
<ComponentPreview name="toggle-button-sizes" />
<ComponentPreview name="toggle-button-controlled" />
<ComponentPreview name="toggle-button-disabled" />
<RelatedComponents component="togglebutton" />import { ToggleButton } from '@heroui/react';
function CustomToggleButton() {
return (
<ToggleButton className="bg-purple-500 text-white">
Toggle
</ToggleButton>
);
}
To customize the ToggleButton component classes, you can use the @layer components directive.
@layer components {
.toggle-button {
@apply bg-purple-500 text-white;
}
.toggle-button--icon-only {
@apply rounded-lg;
}
}
HeroUI follows the BEM methodology to ensure component variants and states are reusable and easy to customize.
The ToggleButton component uses these CSS classes (View source styles):
.toggle-button - Base toggle button styles.toggle-button--sm - Small size variant.toggle-button--md - Medium size variant (default).toggle-button--lg - Large size variant.toggle-button--default - Default variant with filled background.toggle-button--ghost - Ghost variant with transparent background.toggle-button--icon-only - Icon-only toggle button.toggle-button--icon-only.toggle-button--sm - Small icon-only.toggle-button--icon-only.toggle-button--lg - Large icon-onlyThe toggle button supports both CSS pseudo-classes and data attributes for flexibility:
[data-selected="true"] (accent background and foreground):hover or [data-hovered="true"]:active or [data-pressed="true"] (includes scale transform):focus-visible or [data-focus-visible="true"] (shows focus ring):disabled or [aria-disabled="true"] (reduced opacity, no pointer events)Inherits from React Aria ToggleButton.
| Prop | Type | Default | Description |
|---|---|---|---|
variant | 'default' | 'ghost' | 'default' | Visual style variant |
size | 'sm' | 'md' | 'lg' | 'md' | Size of the toggle button |
isIconOnly | boolean | false | Whether the button contains only an icon |
isSelected | boolean | - | Controlled selected state |
defaultSelected | boolean | false | Default selected state (uncontrolled) |
isDisabled | boolean | false | Whether the toggle button is disabled |
onChange | (isSelected: boolean) => void | - | Handler called when selection changes |
onPress | (e: PressEvent) => void | - | Handler called when the button is pressed |
children | React.ReactNode | (values: ToggleButtonRenderProps) => React.ReactNode | - | Button content or render prop |
When using the render prop pattern, these values are provided:
| Prop | Type | Description |
|---|---|---|
isSelected | boolean | Whether the button is currently selected |
isPressed | boolean | Whether the button is currently pressed |
isHovered | boolean | Whether the button is hovered |
isFocused | boolean | Whether the button is focused |
isFocusVisible | boolean | Whether the button should show focus indicator |
isDisabled | boolean | Whether the button is disabled |