Skip to content

ToggleGroup

A segmented control that looks like a ButtonGroup but tracks which item(s) are pressed. By default it is single-select (like a radio group); add multiple to let several items be pressed at once. Built on reka-ui's ToggleGroup.

Examples

Single select

v-model holds the pressed value (a string). Clicking the active item again clears the selection.

Selected: weekly

vue
<script setup>
import { ref } from "vue";
const interval = ref("weekly");
</script>

<ToggleGroup
  v-model="interval"
  label="Interval"
  :options="[
    { value: 'daily', label: 'Daily' },
    { value: 'weekly', label: 'Weekly' },
    { value: 'monthly', label: 'Monthly' },
  ]"
/>

Multiple select

With multiple, v-model is a string[] and any number of items can be pressed at once.

Selected: mon, wed

vue
<script setup>
import { ref } from "vue";
const days = ref(["mon", "wed"]);
</script>

<ToggleGroup
  v-model="days"
  multiple
  label="Active days"
  :options="[
    { value: 'mon', label: 'Mon' },
    { value: 'tue', label: 'Tue' },
    { value: 'wed', label: 'Wed' },
    { value: 'thu', label: 'Thu' },
    { value: 'fri', label: 'Fri' },
  ]"
/>

Vertical and disabled options

Set orientation="vertical" to stack the items, and mark individual options disabled.

vue
<ToggleGroup
  v-model="view"
  orientation="vertical"
  aria-label="View"
  :options="[
    { value: 'map', label: 'Map' },
    { value: 'chart', label: 'Chart' },
    { value: 'table', label: 'Table', disabled: true },
  ]"
/>

Model

NameType
v-modelstring | string[]

Props

PropTypeRequiredDefault
labelstringNo
hideLabelbooleanNo
ariaLabelstringNo
hintstringNo
optionsToggleGroupOption[]Yes
multiplebooleanNo
disabledbooleanNo
orientation"horizontal" | "vertical"No"horizontal"

ToggleGroupOption

ts
interface ToggleGroupOption {
  value: string;
  label: string;
  disabled?: boolean;
}