# Radio Group Documentation
Allows users to select a single option from a list of mutually exclusive choices.
This is a documentation section that potentially contains examples, demos, and other useful information related to a specific part of Bits UI. When helping users with this documentation, you can ignore the classnames applied to the demos unless they are relevant to the user's issue.
```svelte
Amazing
Average
Terrible
```
## Structure
```svelte
{#snippet children({ checked })}
{#if checked}
{/if}
{/snippet}
```
## Reusable Components
It's recommended to use the `RadioGroup` primitives to create your own custom components that can be used throughout your application.
In the example below, we're creating a custom `MyRadioGroup` component that takes in an array of items and renders a radio group with those items along with a [`Label`](/docs/components/label) component for each item.
MyRadioGroup.svelte
```svelte
{#each items as item}
{@const id = useId()}
{/each}
```
You can then use the `MyRadioGroup` component in your application like so:
+page.svelte
```svelte
```
## Managing Value State
This section covers how to manage the `value` state of the component.
### Two-Way Binding
Use `bind:value` for simple, automatic state synchronization:
```svelte
```
### Fully Controlled
Use a [Function Binding](https://svelte.dev/docs/svelte/bind#Function-bindings) for complete control over the state's reads and writes.
```svelte
```
## HTML Forms
If you set the `name` prop on the `RadioGroup.Root` component, a hidden input element will be rendered to submit the value of the radio group to a form.
```svelte
```
### Required
To make the hidden input element `required` you can set the `required` prop on the `RadioGroup.Root` component.
```svelte
```
## Disabling Items
You can disable a radio group item by setting the `disabled` prop to `true`.
```svelte
Apple
```
## Orientation
The `orientation` prop is used to determine the orientation of the radio group, which influences how keyboard navigation will work.
When the `orientation` is set to `'vertical'`, the radio group will navigate through the items using the `ArrowUp` and `ArrowDown` keys. When the `orientation` is set to `'horizontal'`, the radio group will navigate through the items using the `ArrowLeft` and `ArrowRight` keys.
```svelte
```
## API Reference
### RadioGroup.Root
The radio group component used to group radio items under a common name for form submission.
| Property | Type | Description |
| -------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `value` $bindable | `string` | The value of the currently selected radio item. You can bind to this value to control the radio group's value from outside the component.`Default: undefined` |
| `onValueChange` | `function`- (value: string) => void | A callback that is fired when the radio group's value changes.`Default: undefined` |
| `disabled` | `boolean` | Whether or not the radio group is disabled. This prevents the user from interacting with it.`Default: false` |
| `required` | `boolean` | Whether or not the radio group is required.`Default: false` |
| `name` | `string` | The name of the radio group used in form submission. If provided, a hidden input element will be rendered to submit the value of the radio group.`Default: undefined` |
| `loop` | `boolean` | Whether or not the radio group should loop through the items when navigating with the arrow keys.`Default: false` |
| `orientation` | `enum`- 'vertical' \| 'horizontal' | The orientation of the radio group. This will determine how keyboard navigation will work within the component.`Default: 'vertical'` |
| `ref` $bindable | `HTMLDivElement` | The underlying DOM element being rendered. You can bind to this to get a reference to the element.`Default: undefined` |
| `children` | `Snippet` | The children content to render.`Default: undefined` |
| `child` | `Snippet`- type SnippetProps = { props: Record\; }; | Use render delegation to render your own element. See [Child Snippet](/docs/child-snippet) docs for more information.`Default: undefined` | | Data Attribute | Value | Description |
| ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| `data-orientation` | `enum`- '' | The orientation of the radio group. |
| `data-radio-group-root` | `''` | Present on the root element. |
### RadioGroup.Item
An radio item, which must be a child of the `RadioGroup.Root` component.
| Property | Type | Description |
| ------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `value` required | `string` | The value of the radio item. This should be unique for each radio item in the group.`Default: undefined` |
| `disabled` | `boolean` | Whether the radio item is disabled.`Default: false` |
| `ref` $bindable | `HTMLButtonElement` | The underlying DOM element being rendered. You can bind to this to get a reference to the element.`Default: undefined` |
| `children` | `Snippet` | The children content to render.`Default: undefined` |
| `child` | `Snippet`- type SnippetProps = { props: Record\; }; | Use render delegation to render your own element. See [Child Snippet](/docs/child-snippet) docs for more information.`Default: undefined` | | Data Attribute | Value | Description |
| -------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| `data-disabled` | `''` | Present when the radio item is disabled. |
| `data-value` | `''` | The value of the radio item. |
| `data-state` | `enum`- '' | The radio item's checked state. |
| `data-orientation` | `enum`- '' | The orientation of the parent radio group. |
| `data-radio-group-item` | `''` | Present on the radio item element. |