# RadioGroup One choice from a set: native radios sharing a name, with arrow-key movement. ```ehtml Example import { RadioGroup, RadioGroupItem } from "@elements/ui/radio-group"; import { Label } from "@elements/ui/label"; ``` ## Parts | Part | What it is | |---|---| | `.radio-group` | The role="radiogroup" container. | | `.radio-group-item` | An item wrapper: the radio and the dot stacked. | | `.radio-group-item-input` | The native ``. | | `.radio-group-indicator` | The dot; scales in, so nothing resizes. | ## Attributes ### RadioGroup | Attribute | Type | Default | Description | |---|---|---|---| | `value` | `string` (two-way) | `""` | The checked item's value. | | `options` | `{ value: string; label: string; disabled?: boolean }[]` | `[]` | Items as data, each in a label. Slot items render after. | | `name` | `string` | `""` | Form field name shared by the radios. Without one the radios still group, but the form submits nothing for them. | | `form` | `string` | `""` | The id of a form the radios join when the group sits outside it. | | `orientation` | `"vertical" \| "horizontal"` | `"vertical"` | Column or row. | | `disabled` | `boolean` | `false` | Disables every item. | | `readOnly` | `boolean` | `false` | The choice cannot change; radios stay focusable and arrows move focus. | | `required` | `boolean` | `false` | The form will not submit until one is chosen. | | `invalid` | `boolean` | `false` | aria-invalid on the group and the danger look on items given as options. | | `loop` | `boolean` | `true` | Arrows wrap from the last item to the first. | | `dir` | `"ltr" \| "rtl" \| ""` | `""` | Reading direction; empty follows the page. | | `class` | `string` | `""` | Extra classes on the group. | | `attrs` | `Record` | `{}` | aria-label, aria-labelledby, id, data-\* for the group. | | `onValueChange` | `(value: string, details: ChangeDetails) => void` | `() => {}` | The user chose an item, or a form reset restored the first value (not called for changes in code). It runs before the change with details second (reason, event, cancel(), isCanceled); details.cancel() keeps the checked radio. | ### RadioGroupItem | Attribute | Type | Default | Description | |---|---|---|---| | `value` | `string` | (required) | This item's value. | | `disabled` | `boolean` | `false` | This item cannot be chosen; arrows skip it. | | `readOnly` | `boolean` | `false` | This item cannot be chosen; it stays focusable. | | `required` | `boolean` | `false` | required on this radio, even when the group is not. | | `invalid` | `boolean` | `false` | aria-invalid and the danger look. | | `class` | `string` | `""` | Extra classes on the item wrapper. | | `attrs` | `Record` | `{}` | id, aria-describedby, aria-label, data-\* for the radio. | ## Slots | Slot | Part | Content | |---|---|---| | `default` | `RadioGroup` | RadioGroupItem parts, in labels, Fields or choice cards. | ## Keyboard | Keys | Action | |---|---| | `Tab` | Moves into the group on the checked radio, or the first when none is. | | `Space` | Checks the focused radio. | | `Enter` | Does nothing: it neither checks the radio nor submits the form. | | `ArrowDown / ArrowRight` | Moves to the next enabled radio and checks it (ArrowLeft in right to left). | | `ArrowUp / ArrowLeft` | Moves to the previous enabled radio and checks it. | ## Data attributes | Attribute | Values | On | Description | |---|---|---|---| | `data-orientation` | `"vertical" \| "horizontal"` | group | | | `data-disabled` | present while disabled | group, item, indicator | | | `data-state` | `"checked" \| "unchecked"` | item, radio, indicator | | | `data-checked, data-unchecked` | present for the current state | item, indicator | Presence flags that mirror data-state. | | `data-readonly` | present while read only | group, item, radio | | | `data-required` | present while the radio is required | item | | ## Accessibility - role="radiogroup" around native radios: each radio's checked state and position in the set are the browser's. - Name the group with aria-label or aria-labelledby in attrs, or a FieldSet legend; name each radio with a Label. - One tab stop: Tab lands on the checked radio. Arrows move and check, skipping disabled items. - required puts required on the radios, so the browser blocks submit and reports it. ## See also - [Label](label): A native label for a control, which dims when the control is disabled. - [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.