Radio represents one option inside RadioGroup. Give each option a distinct value and a visible label. The group owns the selected value.
Usage
size prop accepts sm or md and defaults to sm. Use the same size for options in a group.
Visual choices
Compare selected and disabled states, sizes, and the default and card appearances. Use a labeled group of options for an actual choice.Complete parts
Radio.Root and Radio.Indicator expose the installed Base UI parts without the styled assembly. Compose them when you need custom content or indicator placement. The callable Radio supplies Twenty’s radio appearance and indicator for common options.
Radio.Root render a span with radio semantics and an adjacent hidden native input. Card radios render a div. ref targets the rendered root; inputRef targets the input. Radio.Indicator renders a span and its ref targets that element. render, state-based className and style, native attributes and event handlers retain their upstream contracts. The public types include RadioProps, RadioRootProps, RadioRootState, RadioIndicatorProps and RadioIndicatorState.
Card options
Usevariant="card" for full-width options with an inset radio indicator. Card radios keep their div root by default. Use render to choose another element explicitly. When that element is a native button, also set nativeButton. Keep interactive controls outside the card content.
Give the group enough width for its content and leave space for the indicator at the top right. A title, icon, and short description help explain each choice.
Explicit native composition
nativeButton false and forward the supplied render props and ref to the actual element.
Keyboard and selection
Tab enters or leaves the group. Arrow keys move between enabled options and select the focused option. Space selects the focused radio. The installed Base UI radio suppresses Enter selection for both default roots and composed native buttons. Selection and change handlers belong onRadioGroup; see its uncontrolled example and controlled example.
Radio arrows change selection as they move focus. Dropdown.SelectionGroup moves focus with arrows and commits a choice with Enter or Space.
Radio and Radio.Root are generic over the value type. Keep that type consistent with its group. Native attributes such as aria-describedby can associate an option with additional help text.
Props
The reference is generated from the public component types. Native attributes, including accessible names and event handlers, are also accepted on parts that render elements.ReactNode
Option content. Card options wrap it in a padded full-width content area.
string | ((state: RadioRootState) => string | undefined)
CSS class applied to the element, or a function that
returns a class based on the component’s state.
boolean
Whether the component should ignore user interaction.
Ref<HTMLInputElement>
A ref to access the hidden input element.
boolean
default:"false"
Whether the component renders a native
<button> element when replacing it
via the render prop.
Set to true if the rendered element is a native button.boolean
Whether the user should be unable to select the radio button.
ReactElement<unknown, string | JSXElementConstructor<any>> | ComponentRenderFn<HTMLProps, RadioRootState>
Allows you to replace the component’s HTML element
with a different tag, or compose it with another component.Accepts a
ReactElement or a function that returns the element to render.boolean
Whether the user must choose a value before submitting a form.
"md" | "sm"
default:"sm"
Visual size of the radio.
CSSProperties | ((state: RadioRootState) => CSSProperties | undefined)
Style applied to the element, or a function that
returns a style object based on the component’s state.
TValue
required
The unique identifying value of the radio in a group.
"card" | "default"
default:"default"
Appearance of the styled assembly: a standard radio or a full-width card. Standard radios use a span and card radios use a div unless render replaces the root.
Radio.Root
string | ((state: RadioRootState) => string | undefined)
CSS class applied to the element, or a function that
returns a class based on the component’s state.
boolean
Whether the component should ignore user interaction.
Ref<HTMLInputElement>
A ref to access the hidden input element.
boolean
default:"false"
Whether the component renders a native
<button> element when replacing it
via the render prop.
Set to true if the rendered element is a native button.boolean
Whether the user should be unable to select the radio button.
ReactElement<unknown, string | JSXElementConstructor<any>> | ComponentRenderFn<HTMLProps, RadioRootState>
Allows you to replace the component’s HTML element
with a different tag, or compose it with another component.Accepts a
ReactElement or a function that returns the element to render.boolean
Whether the user must choose a value before submitting a form.
CSSProperties | ((state: RadioRootState) => CSSProperties | undefined)
Style applied to the element, or a function that
returns a style object based on the component’s state.
Value
required
The unique identifying value of the radio in a group.
Radio.Indicator
string | ((state: RadioIndicatorState) => string | undefined)
CSS class applied to the element, or a function that
returns a class based on the component’s state.
boolean
default:"false"
Whether to keep the HTML element in the DOM when the radio button is inactive.
ReactElement<unknown, string | JSXElementConstructor<any>> | ComponentRenderFn<HTMLProps, RadioIndicatorState>
Allows you to replace the component’s HTML element
with a different tag, or compose it with another component.Accepts a
ReactElement or a function that returns the element to render.CSSProperties | ((state: RadioIndicatorState) => CSSProperties | undefined)
Style applied to the element, or a function that
returns a style object based on the component’s state.