ToggleButtonGroup
Groups multiple ToggleButtons into a unified control, allowing users to select one or multiple options.
Usage
import { ToggleButtonGroup, ToggleButton } from '@lenso/ui';"use client";
import { Bold, Italic, Strikethrough, Underline } from "@gravity-ui/icons";import { ToggleButton, ToggleButtonGroup } from "@lenso/ui";
export function Basic() { return ( <ToggleButtonGroup multiple aria-label="Text formatting"> <ToggleButton isIconOnly aria-label="Bold" value="bold"> <ToggleButton.Icon> <Bold /> </ToggleButton.Icon> </ToggleButton> <ToggleButton isIconOnly aria-label="Italic" value="italic"> <ToggleButtonGroup.Separator /> <ToggleButton.Icon> <Italic /> </ToggleButton.Icon> </ToggleButton> <ToggleButton isIconOnly aria-label="Underline" value="underline"> <ToggleButtonGroup.Separator /> <ToggleButton.Icon> <Underline /> </ToggleButton.Icon> </ToggleButton> <ToggleButton isIconOnly aria-label="Strikethrough" value="strikethrough"> <ToggleButtonGroup.Separator /> <ToggleButton.Icon> <Strikethrough /> </ToggleButton.Icon> </ToggleButton> </ToggleButtonGroup> );}Local adaptation source above. Derived from HeroUI v3.2.6 source.
Anatomy
import { ToggleButtonGroup, ToggleButton } from '@lenso/ui';
export default () => ( <ToggleButtonGroup selectionMode="multiple"> <ToggleButton id="first">First</ToggleButton> <ToggleButton id="second"> <ToggleButtonGroup.Separator /> Second </ToggleButton> <ToggleButton id="third"> <ToggleButtonGroup.Separator /> Third </ToggleButton> </ToggleButtonGroup>);Examples
Sizes
"use client";export { Sizes } from "./source";Local adaptation source above. Derived from HeroUI v3.2.6 source.
Orientation
"use client";export { Orientation } from "./source";Local adaptation source above. Derived from HeroUI v3.2.6 source.
Full Width
"use client";export { FullWidth } from "./source";Local adaptation source above. Derived from HeroUI v3.2.6 source.
Disabled
"use client";export { Disabled } from "./source";Local adaptation source above. Derived from HeroUI v3.2.6 source.
Without Separator
Simply omit the <ToggleButtonGroup.Separator /> component from your buttons.
"use client";export { WithoutSeparator } from "./source";Local adaptation source above. Derived from HeroUI v3.2.6 source.
Detached
Use isDetached to separate buttons with gaps instead of connecting them.
"use client";export { Attached } from "./source";Local adaptation source above. Derived from HeroUI v3.2.6 source.
Selection Mode
Use selectionMode="single" for mutually exclusive choices or selectionMode="multiple" for independent toggles.
"use client";export { SelectionMode } from "./source";Local adaptation source above. Derived from HeroUI v3.2.6 source.
Controlled
"use client";export { Controlled } from "./source";Local adaptation source above. Derived from HeroUI v3.2.6 source.
Customization
Tailwind CSS
"use client";export { CustomStyles } from "./source";Local adaptation source above. Derived from HeroUI v3.2.6 source.
Global CSS
To customize the ToggleButtonGroup component classes, you can use the @layer components directive.
Learn more.
@layer components { .toggle-button-group { @apply rounded-lg; }
.toggle-button-group__separator { @apply opacity-25; }
.toggle-button-group--full-width { @apply w-full; }}Styling Reference
HeroUI follows the BEM methodology to ensure component variants and states are reusable and easy to customize.
CSS Classes
The ToggleButtonGroup component uses these CSS classes (View source styles):
Base & Layout Classes [!toc]
.toggle-button-group- Base container styles.toggle-button-group--horizontal- Horizontal orientation.toggle-button-group--vertical- Vertical orientation.toggle-button-group--full-width- Full width modifier.toggle-button-group__separator- Separator element between buttons
Modifier Classes [!toc]
.toggle-button-group--detached- Detached mode (separated buttons with gaps)
API Reference
ToggleButtonGroup
Inherits from React Aria ToggleButtonGroup.
| Prop | Type | Default | Description |
|---|---|---|---|
selectionMode | "single" | "multiple" | "single" | Whether one or multiple buttons can be selected |
selectedKeys | Iterable<Key> | - | Controlled selection state |
defaultSelectedKeys | Iterable<Key> | - | Default selected keys (uncontrolled) |
onSelectionChange | (keys: Set<Key>) => void | - | Called when selection changes |
disallowEmptySelection | boolean | false | Prevents clearing all selections |
orientation | "horizontal" | "vertical" | "horizontal" | Layout direction |
size | "sm" | "md" | "lg" | "md" | Size propagated to child ToggleButtons |
isDetached | boolean | false | Whether buttons are visually separated with gaps |
fullWidth | boolean | false | Whether the group fills available width |
isDisabled | boolean | false | Disables all buttons in the group |
className | string | - | Additional CSS classes |
ToggleButtonGroup.Separator
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
Note
- ToggleButtonGroup uses React Context to pass
sizeto all child ToggleButton components - Each ToggleButton must have a unique
idprop that corresponds to the keys used inselectedKeys/defaultSelectedKeys - The
isDisabledprop is handled natively by React Aria and disables all child ToggleButtons — individual buttons can override this by settingisDisabled={false} - The component automatically handles border radius between buttons
- Add
<ToggleButtonGroup.Separator />inside each ToggleButton (except the first) to show dividers between buttons - Use
disallowEmptySelectionwithselectionMode="single"to ensure one option is always selected