# ToggleGroup A set of toggle buttons, one or many on, with one tab stop and arrow keys. ```ehtml Example import { ToggleGroup, ToggleGroupItem } from "@elements/ui/toggle-group"; import { Icon } from "@elements/ui/icon"; All Missed ``` ## Parts | Part | What it is | |---|---| | `.toggle-group` | The role="group" container; its data attributes style the items. | | `.toggle-group-item` | A .toggle button with data-value. | ## Attributes ### ToggleGroup | Attribute | Type | Default | Description | |---|---|---|---| | `type` | `"single" \| "multiple"` | `"single"` | One item on at most, or any number. | | `value` | `string` (two-way) | `""` | single: the pressed item's value, or empty. | | `values` | `string[]` (two-way) | `[]` | multiple: the pressed items' values. | | `variant` | `"default" \| "outline"` | `"default"` | Item look. | | `size` | `"sm" \| "md" \| "lg"` | `"md"` | Item height. | | `spacing` | `0 \| 1 \| 2 \| 3 \| 4` | `2` | Gap from the space scale; 0 joins the items into one segmented control. | | `orientation` | `"horizontal" \| "vertical"` | `"horizontal"` | Row or column, and which arrows move. | | `disabled` | `boolean` | `false` | Disables every item. | | `rovingFocus` | `boolean` | `true` | One tab stop with arrow keys. Off, every item is a tab stop. | | `loop` | `boolean` | `true` | Arrows wrap at the ends. | | `dir` | `"ltr" \| "rtl" \| ""` | `""` | Reading direction; empty follows the page. | | `label` | `string` | `""` | The group's accessible name. | | `class / attrs` | `string / Record` | `"" / {}` | Extra classes and attributes on the group. | | `onValueChange` | `(value: string, details: ChangeDetails) => void` | `() => {}` | single: the user pressed an item. It runs before the change with details second (reason, event, cancel(), isCanceled); details.cancel() keeps the value. | | `onValuesChange` | `(values: string[], details: ChangeDetails) => void` | `() => {}` | multiple: the user pressed an item. It runs before the change with details second (reason, event, cancel(), isCanceled); details.cancel() keeps the values. | ### ToggleGroupItem | Attribute | Type | Default | Description | |---|---|---|---| | `value` | `string` | (required) | This item's value. | | `label` | `string` | `""` | Accessible name; required for icon-only items. | | `disabled` | `boolean` | `false` | This item cannot be pressed; arrows skip it. | | `class / attrs` | `string / Record` | `"" / {}` | Extra classes and attributes on the button. | ## Slots | Slot | Part | Content | |---|---|---| | `default` | `ToggleGroup` | ToggleGroupItem parts. | | `default` | `ToggleGroupItem` | An icon, text, or both. | ## Keyboard | Keys | Action | |---|---| | `Tab` | Into the group on the pressed item, or the first. | | `Space / Enter` | Presses the focused item. | | `ArrowRight / ArrowDown` | Next item (ArrowLeft in right to left; vertical uses Up and Down). | | `ArrowLeft / ArrowUp` | Previous item. | | `Home / End` | First or last item. | ## Data attributes | Attribute | Values | On | Description | |---|---|---|---| | `data-orientation` | `"horizontal" \| "vertical"` | group, item | | | `data-variant / data-size / data-spacing / data-type` | the attribute | group | | | `data-multiple` | present when type is multiple | group | | | `data-state` | `"on" \| "off"` | item | | | `data-pressed` | present while pressed | item | The same state as data-state="on", as a presence attribute. | | `data-disabled` | present while disabled | group, item | | ## Accessibility - role="group" named by label. Items are buttons: aria-pressed in multiple mode, role="radio" with aria-checked in single mode. - One tab stop (roving tabindex) on the pressed item, or the first; arrows move without pressing; disabled items are skipped. - Icon-only items need label. ## See also - [Icon](icon): An inline stroke icon from the set the templates draw their own controls with, sized in pixels and colored by the text around it. - [ButtonGroup](button-group): Related buttons, or an input and its buttons, joined into one control. - [Input](input): A native text input in the theme's control chrome, with a two-way value. - [InputGroup](input-group): An Input or Textarea with icons, text and buttons inside one box. - [Textarea](textarea): A native multi-line input that grows with its content, between rows and maxRows. - [Field](field): A label, a control, a description and an error wired together, with native validation that never moves the layout.