RadioGroup
<script setup lang="ts">
import { RadioGroupIndicator, RadioGroupItem, RadioGroupRoot } from 'akar';
import { ref } from 'vue';
import './styles.css';
const radioStateSingle = ref('default');
</script>
<template>
<div class="akar-demo akar-demo-RadioGroup">
<RadioGroupRoot
v-model="radioStateSingle"
class="RadioGroupRoot"
default-value="default"
aria-label="View density"
>
<div :style="{ display: 'flex', alignItems: 'center' }">
<RadioGroupItem
id="r1"
class="RadioGroupItem"
value="default"
>
<RadioGroupIndicator
class="RadioGroupIndicator"
/>
</RadioGroupItem>
<label
class="Label"
for="r1"
>
Default
</label>
</div>
<div :style="{ display: 'flex', alignItems: 'center' }">
<RadioGroupItem
id="r2"
class="RadioGroupItem"
value="comfortable"
>
<RadioGroupIndicator
class="RadioGroupIndicator"
/>
</RadioGroupItem>
<label
class="Label"
for="r2"
>
Comfortable
</label>
</div>
<div :style="{ display: 'flex', alignItems: 'center' }">
<RadioGroupItem
id="r3"
class="RadioGroupItem"
value="compact"
>
<RadioGroupIndicator
class="RadioGroupIndicator"
/>
</RadioGroupItem>
<label
class="Label"
for="r3"
>
Compact
</label>
</div>
</RadioGroupRoot>
</div>
</template>@import '../_colors/black-alpha.css';
@import '../_colors/grass.css';
@scope (.akar-demo-RadioGroup) {
/* reset */
button {
all: unset;
}
.RadioGroupRoot {
display: flex;
flex-direction: column;
gap: 10px;
}
.RadioGroupItem {
background-color: white;
width: 25px;
height: 25px;
border-radius: 100%;
box-shadow: 0 2px 10px var(--black-a7);
}
.RadioGroupItem:hover {
background-color: var(--grass-3);
}
.RadioGroupItem:focus {
box-shadow: 0 0 0 2px black;
}
.RadioGroupIndicator {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
position: relative;
}
.RadioGroupIndicator::after {
content: '';
display: block;
width: 11px;
height: 11px;
border-radius: 50%;
background-color: var(--grass-11);
}
.Label {
color: white;
font-size: 15px;
line-height: 1;
padding-left: 15px;
}
}Features
- Full keyboard navigation.
- Supports horizontal/vertical orientation.
- Can be controlled or uncontrolled.
Installation
Install the component from your command line.
pnpm add akar
yarn add akar
npm install akar
bun add akar
Anatomy
Import all parts and piece them together.
<script setup>
import { RadioGroupIndicator, RadioGroupItem, RadioGroupRoot } from 'akar';
</script>
<template>
<RadioGroupRoot>
<RadioGroupItem>
<RadioGroupIndicator />
</RadioGroupItem>
</RadioGroupRoot>
</template>
API Reference
Root
Contains all the parts of a radio group.
| Prop | Default | Type |
|---|---|---|
as | "div" | AsTag | ComponentThe element or component this component should render as. Can be overwritten by |
asChild | booleanChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | |
defaultValue | AcceptableValueThe value of the radio item that should be checked when initially rendered. Use when you do not need to control the state of the radio items. | |
dir | "ltr" | "rtl"The reading direction of the combobox when applicable. If omitted, inherits globally from | |
disabled | false | booleanWhen |
loop | true | booleanWhen |
modelValue | AcceptableValueThe controlled value of the radio item to check. Can be binded as | |
name | stringThe name of the field. Submitted with its owning form as part of a name/value pair. | |
orientation | "vertical" | "horizontal"The orientation of the component. | |
required | false | booleanWhen |
| Event | Payload |
|---|---|
update:modelValue | payload: AcceptableValueEvent handler called when the radio group value changes |
| Slot (default) | Payload |
|---|---|
modelValue | null | string | number | bigint | Record<string, any>Current input values |
| Data attribute | Value |
|---|---|
[data-disabled] | Present when disabled |
Item
An item in the group that can be checked. An input will also render when used within a form to ensure events propagate correctly.
| Prop | Default | Type |
|---|---|---|
as | "button" | AsTag | ComponentThe element or component this component should render as. Can be overwritten by |
asChild | booleanChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | |
disabled | false | booleanWhen |
id | string | |
name | stringThe name of the field. Submitted with its owning form as part of a name/value pair. | |
required | booleanWhen | |
value | AcceptableValueThe value given as data when submitted with a |
| Event | Payload |
|---|---|
select | event: SelectEvent |
| Slot (default) | Payload |
|---|---|
checked | booleanCurrent checked state |
required | booleanRequired state |
disabled | booleanDisabled state |
| Data attribute | Value |
|---|---|
[data-state] | "checked" | "unchecked" |
[data-disabled] | Present when disabled |
Indicator
Renders when the radio item is in a checked state. You can style this element directly, or you can use it as a wrapper to put an icon into, or both.
| Prop | Default | Type |
|---|---|---|
as | "span" | AsTag | ComponentThe element or component this component should render as. Can be overwritten by |
asChild | booleanChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | |
forceMount | booleanUsed to force mounting when more control is needed. Useful when controlling animation with Vue animation libraries. |
| Data attribute | Value |
|---|---|
[data-state] | "checked" | "unchecked" |
[data-disabled] | Present when disabled |
Accessibility
Adheres to the Radio Group WAI-ARIA design pattern and uses roving tabindex to manage focus movement among radio items.
Keyboard Interactions
| Key | Description |
|---|---|
| Tab | Moves focus to either the checked radio item or the first radio item in the group. |
| Space | When focus is on an unchecked radio item, checks it. |
| ArrowDown | Moves focus and checks the next radio item in the group. |
| ArrowRight | Moves focus and checks the next radio item in the group. |
| ArrowUp | Moves focus to the previous radio item in the group. |
| ArrowLeft | Moves focus to the previous radio item in the group. |