Skip to main content
Version: Next

Toggle Group

A container that manages selection state across a set of toggle items. Supports single and multiple selection, keyboard navigation, and accessibility roles (radiogroup / group).

Import​

// Subpath (recommended)
import { ToggleGroup } from '@editora/ui-react/ToggleGroup';

// Barrel
import { ToggleGroup } from '@editora/ui-react';

Composition​

ComponentRendersPurpose
ToggleGroup<ui-toggle-group>Root — manages selection state
ToggleGroup.Item<ui-toggle>Individual toggle button

Basic Usage​

Live Editor
function AlignmentPicker() {
  const [value, setValue] = React.useState('left');

  return (
    <ThemeProvider>
      <ToggleGroup
        value={value}
        variant="soft"
        onValueChange={(detail) => {
          if (typeof detail.value === 'string') setValue(detail.value);
        }}
      >
        <ToggleGroup.Item value="left">Left</ToggleGroup.Item>
        <ToggleGroup.Item value="center">Center</ToggleGroup.Item>
        <ToggleGroup.Item value="right">Right</ToggleGroup.Item>
      </ToggleGroup>
    </ThemeProvider>
  );
}
Result
Loading...

Multiple Selection​

const [value, setValue] = React.useState<string[]>(['bold']);

<ToggleGroup
multiple
value={value}
onValueChange={(detail) => {
if (Array.isArray(detail.value)) setValue(detail.value);
}}
>
<ToggleGroup.Item value="bold">Bold</ToggleGroup.Item>
<ToggleGroup.Item value="italic">Italic</ToggleGroup.Item>
<ToggleGroup.Item value="underline">Underline</ToggleGroup.Item>
<ToggleGroup.Item value="strike">Strike</ToggleGroup.Item>
</ToggleGroup>

Vertical Contrast​

<ToggleGroup orientation="vertical" variant="contrast" multiple value={['overview', 'alerts']}>
<ToggleGroup.Item value="overview">Overview</ToggleGroup.Item>
<ToggleGroup.Item value="analytics">Analytics</ToggleGroup.Item>
<ToggleGroup.Item value="alerts">Alerts</ToggleGroup.Item>
<ToggleGroup.Item value="settings">Settings</ToggleGroup.Item>
</ToggleGroup>

Disabled Items​

<ToggleGroup value="a" variant="soft">
<ToggleGroup.Item value="a">Option A</ToggleGroup.Item>
<ToggleGroup.Item value="b" disabled>Option B</ToggleGroup.Item>
<ToggleGroup.Item value="c">Option C</ToggleGroup.Item>
</ToggleGroup>

ToggleGroup Props​

PropTypeDefaultDescription
valuestring | string[]—Controlled selected value(s)
multiplebooleanfalseAllow multiple items to be selected
disabledbooleanfalseDisable all items in the group
orientation'horizontal' | 'vertical''horizontal'Layout direction and arrow key axis
variant'default' | 'soft' | 'contrast' | 'minimal''default'Visual style
size'sm' | 'md' | 'lg''md'Size of the group container
density'compact' | 'default' | 'comfortable''default'Gap and padding density
shape'default' | 'square' | 'pill''default'Border radius style
elevation'default' | 'none''default'Box shadow
allowEmptybooleanfalseAllow deselecting the last item (single mode)
requiredbooleanfalseMarks group as required (aria-required)
headlessbooleanfalseHides the group wrapper, renders only the slot
activation'auto' | 'manual''auto'Whether arrow key focus also selects the item
onInput(detail: ToggleGroupDetail) => void—Fires on every value change
onChange(detail: ToggleGroupDetail) => void—Fires on committed value change
onValueChange(detail: ToggleGroupDetail) => void—Fires on both input and change

ToggleGroup.Item Props​

ToggleGroup.Item accepts all Toggle props:

PropTypeDefaultDescription
valuestring—Identifier used by the group for selection state
pressedboolean—Controlled pressed state (managed by group)
disabledbooleanfalseDisable this item individually
loadingbooleanfalseShow loading indicator
size'sm' | 'md' | 'lg''md'Item size
variant'default' | 'soft' | 'outline' | 'contrast' | 'minimal''default'Item visual style
tone'brand' | 'success' | 'warning' | 'danger''brand'Color tone
shape'default' | 'square' | 'pill''default'Border radius
elevation'default' | 'none''default'Box shadow
namestring—Form field name
requiredbooleanfalseMarks item as required
iconOnstring—Icon shown when pressed
iconOffstring—Icon shown when not pressed
onInput(detail: ToggleDetail) => void—Fires on item input event
onChange(detail: ToggleDetail) => void—Fires on item change event

ToggleGroupDetail Type​

type ToggleGroupDetail = {
value: string | string[]; // current selected value(s)
values: string[]; // always an array
multiple: boolean;
};

Keyboard Navigation​

KeyAction
ArrowRight / ArrowDownMove focus to next item
ArrowLeft / ArrowUpMove focus to previous item
HomeMove focus to first item
EndMove focus to last item
Space / EnterToggle focused item

Arrow keys wrap around. With activation="auto" (default), focus movement also selects the item. With activation="manual", press Space or Enter to select.