Radio
Radio button. Use in groups (several Radios with the same name) for an
exclusive selection — only one item per group can be active at a time.
When to use
| ✅ Use when… | 🚫 Avoid when… |
|---|---|
|
|
Example
<Radio id="radio-1" name="example" value="1" label="Option 1" />
<Radio id="radio-2" name="example" value="2" label="Option 2" />
<Radio id="radio-3" name="example" value="3" label="Disabled option" disabled />Color
The checked fill follows the brand primary by default — the same
interactive hue as Button and Tabs. Pass color to pick another palette
(information for a neutral "filter" check, secondary, …). The validation
variants (success / error) still win when set.
<Radio id="t" name="plan" value="basic" label="Basic" />
<Radio id="f" name="filter" value="fav" label="Only favorites" color="information" />Label typography
When label is a string, the text uses the Design System defaults
(fontSize="small", color="neutral.180"). To adjust size, color, or weight,
pass labelProps (overrides forwarded to the internal Text/BaseText):
<Radio id="r-terms" name="plan" value="pro" label="Pro Plan" labelProps={{ fontSize: 'micro', color: 'neutral.140' }} />For arbitrary markup (links, bold), pass a ReactNode as label — in that
case labelProps is ignored and the node is rendered as-is.
Interactive Demo
loading
Gotchas
- All
Radios in a group must share the samename— without it, the browser cannot enforce exclusivity between them. - Rendering several
Radios manually? Reach forFieldGroupfirst — it already handles grid spacing, columns, andFormintegration for the case.
Properties
Prop | Type | Default | Description |
|---|---|---|---|
color | "success" | "primary" | "secondary" | "tertiary" | "information" | "warning" | "danger" | 'primary' | Interaction palette of the checked state (fill / ring / ink). Defaults
to the brand `primary`, like `Button` and `Tabs`. `variant` (`success` /
`error`) still wins when set. |
label | ReactNode | null | Text or element displayed next to the radio button. When `string`, it
is rendered via `BaseText`; when `ReactNode`, it is rendered as-is. |
labelProps | Partial<TextInterface> | — | Typography overrides for a string `label` (`fontSize`, `color`, …).
Ignored when `label` is a `ReactNode`.
@example ```tsx
<Radio id="r" name="plan" value="x" label="Accept" labelProps={{ fontSize: 'micro', color: 'ink.secondary' }} />
``` |
onChange | ((e: ChangeEvent<HTMLInputElement, Element>) => void) | — | — |
value | string | — | — |
variant | "default" | "success" | "error" | default | Visual variant of the input — reflects the validation state. |
In addition to the props above, every component accepts the layout props (spacing, color, flex/grid, sizing, border) — not repeated here.
See also
- Storybook story: Components / Radio
- Ready-made radio group:
FieldGroup - For long lists:
InputSelect