Toggle
A two-state button that can be either on or off
pnpm add @wandercom/design-system-web
import { Toggle } from '@wandercom/design-system-web/ui/toggle';
import { IconTextBold } from '@wandercom/design-system-icons/text-bold';
export function Example() {
return (
<Toggle aria-label="Toggle bold">
<IconTextBold className="size-4" />
</Toggle>
);
}The toggle component supports icon-only and text variants across multiple sizes. The default variant transitions from ghost to filled background when pressed, while the filter variant uses bordered styling suitable for filter chips.
The default variant has a ghost background that becomes filled when pressed.
import { IconStar } from '@wandercom/design-system-icons/star';
<Toggle variant="default" aria-label="Toggle option">
<IconStar className="size-4" />
</Toggle>The filter variant has a bordered appearance, useful for filter chips and selection UI.
import { IconFilter } from '@wandercom/design-system-icons/filter';
<Toggle variant="filter" size="md">
<IconFilter className="size-4" />
Filters
</Toggle>Icon-only toggles come in three sizes.
import { IconTextBold } from '@wandercom/design-system-icons/text-bold';
<Toggle size="icon-sm" aria-label="Small toggle">
<IconTextBold className="size-4" />
</Toggle>
<Toggle size="icon-md" aria-label="Medium toggle">
<IconTextBold className="size-4" />
</Toggle>
<Toggle size="icon-lg" aria-label="Large toggle">
<IconTextBold className="size-5" />
</Toggle>Toggles with text content also come in three sizes.
import { IconTextBold } from '@wandercom/design-system-icons/text-bold';
<Toggle size="sm">
<IconTextBold className="size-4" />
Small
</Toggle>
<Toggle size="md">
<IconTextBold className="size-4" />
Medium
</Toggle>
<Toggle size="lg">
<IconTextBold className="size-5" />
Large
</Toggle>Use pressed and onPressedChange for controlled state.
import { Toggle } from '@wandercom/design-system-web/ui/toggle';
import { IconStar } from '@wandercom/design-system-icons/star';
import { useState } from 'react';
export function ControlledToggle() {
const [pressed, setPressed] = useState(false);
return (
<Toggle pressed={pressed} onPressedChange={setPressed}>
<IconStar className="size-4" />
</Toggle>
);
}variant?
size?
defaultPressed?
pressed?
onPressedChange?
disabled?
className?
The Toggle component is built on Radix UI Toggle primitive and follows WAI-ARIA button pattern.
Keyboard interaction:
Space- Toggles the pressed stateEnter- Toggles the pressed state
Always provide an aria-label when using icon-only toggles to ensure screen readers can announce the toggle's purpose.