# Radio Group
URL: https://ark-ui.com/docs/components/radio-group
Source: https://raw.githubusercontent.com/chakra-ui/ark/refs/heads/main/website/src/content/pages/components/radio-group.mdx
Allows single selection from multiple options.
---
## Anatomy
```tsx
```
## Examples
**Example: basic**
```ripple
import { RadioGroup } from 'ark-ripple/radio-group';
import styles from 'styles/radio-group.module.css';
const frameworks = ['React', 'Solid', 'Vue'];
export component Basic() {
{'Framework'}
for (const framework of frameworks; key framework) {
{framework}
}
}
```
### Initial Value
To set the radio group's initial value, set the `defaultValue` prop to the value of the radio item to be selected by
default.
**Example: initial-value**
```ripple
import { RadioGroup } from 'ark-ripple/radio-group';
import styles from 'styles/radio-group.module.css';
const frameworks = ['React', 'Solid', 'Vue'];
export component InitialValue() {
{'Framework'}
for (const framework of frameworks; key framework) {
{framework}
}
}
```
### Controlled
For a controlled Radio Group, the state is managed using the `value` prop, and updates when the `onValueChange` event
handler is called:
**Example: controlled**
```ripple
import { RadioGroup } from 'ark-ripple/radio-group';
import { track } from 'ripple';
import styles from 'styles/radio-group.module.css';
const frameworks = ['React', 'Solid', 'Vue'];
export component Controlled() {
let value = track(null);
{
@value = e.value;
}}
>
{'Framework'}
for (const framework of frameworks; key framework) {
{framework}
}
}
```
### Root Provider
An alternative way to control the radio group is to use the `RootProvider` component and the `useRadioGroup` hook. This
way you can access the state and methods from outside the component.
**Example: root-provider**
```ripple
import { RadioGroup, useRadioGroup } from 'ark-ripple/radio-group';
import button from 'styles/button.module.css';
import styles from 'styles/radio-group.module.css';
const frameworks = ['React', 'Solid', 'Vue'];
export component RootProvider() {
const radioGroup = useRadioGroup({ defaultValue: 'React' });
{'Framework'}
for (const framework of frameworks; key framework) {
{framework}
}
}
```
### Disabled
To make a radio group disabled, set the `disabled` prop to `true`.
**Example: disabled**
```ripple
import { RadioGroup } from 'ark-ripple/radio-group';
import styles from 'styles/radio-group.module.css';
const frameworks = ['React', 'Solid', 'Vue'];
export component Disabled() {
{'Framework'}
for (const framework of frameworks; key framework) {
{framework}
}
}
```
## Guides
### asChild
The `RadioGroup.Item` component renders as a `label` element by default. This ensures proper form semantics and
accessibility, as radio groups are form controls that require labels to provide meaningful context for users.
When using the `asChild` prop, you must **render a `label` element** as the direct child of `RadioGroup.Item` to
maintain valid HTML structure and accessibility compliance.
```tsx
// INCORRECT usage ❌
// CORRECT usage ✅
```
### Hidden Input
The `RadioGroup.ItemHiddenInput` component renders a hidden HTML input element that enables proper form submission and
integration with native form behaviors. This component is essential for the radio group to function correctly as it:
- Provides the underlying input element that browsers use for form submission
- Enables integration with form libraries and validation systems
- Ensures the radio group works with native form reset functionality
```tsx
// INCORRECT usage ❌
// CORRECT usage ✅
```
## API Reference
### Props
**Component API Reference**
**Root Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `defaultValue` | `string` | No | The initial value of the checked radio when rendered.
Use when you don't need to control the value of the radio group. |
| `disabled` | `boolean` | No | If `true`, the radio group will be disabled |
| `form` | `string` | No | The associate form of the underlying input. |
| `id` | `string` | No | The unique identifier of the machine. |
| `ids` | `Partial<{
root: string
label: string
indicator: string
item: (value: string) => string
itemLabel: (value: string) => string
itemControl: (value: string) => string
itemHiddenInput: (value: string) => string
}>` | No | The ids of the elements in the radio. Useful for composition. |
| `invalid` | `boolean` | No | If `true`, the radio group is marked as invalid. |
| `name` | `string` | No | The name of the input fields in the radio
(Useful for form submission). |
| `onValueChange` | `(details: ValueChangeDetails) => void` | No | Function called once a radio is checked |
| `orientation` | `'horizontal' | 'vertical'` | No | Orientation of the radio group |
| `readOnly` | `boolean` | No | Whether the radio group is read-only |
| `required` | `boolean` | No | If `true`, the radio group is marked as required. |
| `value` | `string` | No | The controlled value of the radio group |
**Root Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | radio-group |
| `[data-part]` | root |
| `[data-orientation]` | The orientation of the radio-group |
| `[data-disabled]` | Present when disabled |
| `[data-invalid]` | Present when invalid |
| `[data-required]` | Present when required |
**Indicator Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Indicator Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | radio-group |
| `[data-part]` | indicator |
| `[data-disabled]` | Present when disabled |
| `[data-orientation]` | The orientation of the indicator |
**Indicator CSS Variables:**
| Variable | Description |
|----------|-------------|
| `--transition-property` | The transition property value for the Indicator |
| `--left` | The left position value |
| `--top` | The top position value |
| `--width` | The width of the element |
| `--height` | The height of the element |
**ItemControl Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**ItemControl Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | radio-group |
| `[data-part]` | item-control |
| `[data-active]` | Present when active or pressed |
**ItemHiddenInput Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Item Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `value` | `string` | Yes | |
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `disabled` | `boolean` | No | |
| `invalid` | `boolean` | No | |
**ItemText Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Label Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Label Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | radio-group |
| `[data-part]` | label |
| `[data-orientation]` | The orientation of the label |
| `[data-disabled]` | Present when disabled |
| `[data-invalid]` | Present when invalid |
| `[data-required]` | Present when required |
**RootProvider Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `value` | `UseRadioGroupReturn` | Yes | |
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
### Context
**API:**
| Property | Type | Description |
|----------|------|-------------|
| `value` | `string` | The current value of the radio group |
| `setValue` | `(value: string) => void` | Function to set the value of the radio group |
| `clearValue` | `VoidFunction` | Function to clear the value of the radio group |
| `focus` | `VoidFunction` | Function to focus the radio group |
| `getItemState` | `(props: ItemProps) => ItemState` | Returns the state details of a radio input |
## Accessibility
Complies with the [Radio WAI-ARIA design pattern](https://www.w3.org/WAI/ARIA/apg/patterns/radio/).
### Keyboard Support