Radio Card
- Stable
- WCAG 2.2 evidence
- RTL
A large option of a RadioGroup with an icon, a title, an optional meta tag and a description,
for a few options that need explanation (work location, plan). The whole card is one <label> around a native radio,
so a click or tap anywhere selects it (WCAG 2.5.8); the group is one Tab stop, arrows move and select, Space selects
(2.1.1). The title is the accessible name; meta and description are linked with aria-describedby (1.3.1, 4.1.2).
Selected shows a dot in the circle and a thicker brand border, not only a colour change (1.4.1); keyboard focus draws
the ring around the card (2.4.7). Must be rendered inside a RadioGroup. Consumer duties: wording.
import { RadioCard } from "@nexera-ui/react";- 5
- examples
- 19
- props
- 2
- live controls
- 1
- platform
- 12
- WCAG criteria
- 4
- blocks use it
Try every prop. Copy the code.
Change the props and the code updates. Check light and dark, LTR and RTL, and phone width.
import { RadioCard } from "@nexera-ui/react";
<RadioCard />Examples 4
The same examples as Storybook, rendered live. Open Code to copy one.
In group
Cards of a group with meta, one selected and one disabled.
import { RadioCard, RadioGroup } from "@nexera-ui/react";
import { LuBuilding2, LuHouse, LuUsers } from "react-icons/lu";
export function InGroup() {
return (
<RadioGroup label="Where do you work" type="card" defaultValue="office" name="location">
<RadioCard
value="office"
icon={<LuBuilding2 />}
title="Office"
meta="Most chosen"
description="Lahore HQ, 5 days a week"
/>
<RadioCard
value="hybrid"
icon={<LuUsers />}
title="Hybrid"
description="2 days in the office"
/>
<RadioCard
value="remote"
icon={<LuHouse />}
title="Remote"
description="Not available for your role"
isDisabled
/>
</RadioGroup>
);
}
Invalid
Figma Radio group Type=Card, State=Error: the cards take the danger stroke and the group shows the error.
import { RadioCard, RadioGroup } from "@nexera-ui/react";
import { LuBuilding2, LuHouse } from "react-icons/lu";
export function Invalid() {
return (
<RadioGroup
label="Where do you work"
type="card"
isInvalid
errorMessage="Choose where you work."
>
<RadioCard value="office" icon={<LuBuilding2 />} title="Office" description="Lahore HQ" />
<RadioCard value="remote" icon={<LuHouse />} title="Remote" description="From home" />
</RadioGroup>
);
}
Long text
Title, meta and description wrap; the card grows with its content.
import { RadioCard, RadioGroup } from "@nexera-ui/react";
import { LuBuilding2 } from "react-icons/lu";
export function LongText() {
return (
<RadioGroup aria-label="Where do you work" type="card">
<RadioCard
value="office"
icon={<LuBuilding2 />}
title="Office in the city centre with parking"
meta="Most chosen this quarter"
description="Lahore HQ, five days a week, with a shuttle from the metro station"
/>
</RadioGroup>
);
}
Right to left
Right-to-left: icon tile at the start (right), circle at the end (left).
import { RadioCard, RadioGroup } from "@nexera-ui/react";
import { LuBuilding2, LuHouse } from "react-icons/lu";
export function RightToLeft() {
return (
<RadioGroup aria-label="مكان العمل" type="card" defaultValue="office">
<RadioCard
value="office"
icon={<LuBuilding2 />}
title="المكتب"
meta="الأكثر اختيارًا"
description="المقر الرئيسي في لاهور"
/>
<RadioCard value="remote" icon={<LuHouse />} title="عن بُعد" description="من المنزل" />
</RadioGroup>
);
}
Props 19
Press "Try it" on a card to load that prop into the playground.
19 props shown
iconNexeraReactNodeIcon in the 40 px tile before the text. Decorative. The tile is shown when an icon is provided.
descriptionNexeraReactNodeSupporting text under the title. Linked with aria-describedby. Plain text:
it sits inside the clickable card, so it must not contain links or buttons.
metaNexeraReactNodeShort tag next to the title. Read after the title as part of the description. Shown when provided.
classNameNexerastringExtra classes for the root, merged last so they win over the defaults.
styleNexeraCSSPropertiesInline style of the root.
titleNexeraVisibleContentVisible title. It is the accessible name; wraps and is never truncated. No visible title.
aria-labelNexerastringOverrides the name given by title. Avoid: the name must contain the visible text (WCAG 2.5.3).
Accessible name. Translate it.
Accessible name; aria-labelledby wins when both are set.
aria-labelledbyNexerastringId(s) of element(s) that name the card instead of title.
Id(s) of element(s) that name the card; wins over aria-label.
Id(s) of visible element(s) that name the card.
value*React AriastringThe value of the radio button, used when submitting an HTML form. See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/radio#Value).
isDisabledReact AriabooleanWhether the radio button is disabled or not. Shows that a selection exists, but is not available in that circumstance.
autoFocusReact AriabooleanWhether the element should receive focus on render.
idReact AriastringThe element's unique identifier. See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id).
aria-describedbyReact AriastringIdentifies the element (or elements) that describes the object.
onPressReact Aria(e: PressEvent) => voidHandler that is called when the press is released over the target.
onPressStartReact Aria(e: PressEvent) => voidHandler that is called when a press interaction starts.
onPressEndReact Aria(e: PressEvent) => voidHandler that is called when a press interaction ends, either over the target or when the pointer leaves the target.
onPressChangeReact Aria(isPressed: boolean) => voidHandler that is called when the press state changes.
onPressUpReact Aria(e: PressEvent) => voidHandler that is called when a press is released over the target, regardless of whether it started on the target or not.
inputRefReact AriaRef<HTMLInputElement | null>A ref for the HTML input element.
* Required. React Aria props shown are the ones most apps use; the component accepts the rest of its React Aria props too.
Accessible by default.
Built on React Aria, and covered by the WCAG 2.2 evidence generated on every build.
WCAG 2.2 evidence
8 direct · 4 supporting- 1.1.1Non-text ContentLevel A · tested directly
- 1.3.1Info and RelationshipsLevel A · tested directly
- 1.4.1Use of ColorLevel A · tested directly
- 1.4.4Resize TextLevel AA · supporting test
- 1.4.11Non-text ContrastLevel AA · supporting test
- 1.4.12Text SpacingLevel AA · supporting test
- 2.1.1KeyboardLevel A · tested directly
- 2.4.7Focus VisibleLevel AA · tested directly
- 2.5.3Label in NameLevel A · tested directly
- 2.5.8Target Size (Minimum)Level AA · supporting test
- 3.3.1Error IdentificationLevel A · tested directly
- 4.1.2Name, Role, ValueLevel A · tested directly
Fits any width.
Nexera components respond to the space they are given. Drag the corner of the frame, or pick a width.
Styling hooks
Pass className to add Tailwind classes (merged last). State is exposed as data attributes, so you can style it with variants like data-pressed:.
data-disableddata-hovereddata-invaliddata-readonlydata-selected
<RadioCard className="data-disabled:opacity-90 shadow-sm" />Used in blocks
- Choose a planOnboarding
- AppearanceSettings and preferences
- Billing and planSettings and preferences
- Pricing plansCommerce and payments
Related components
- CalendarDayOne day of a {@link CalendarMonth } grid, built on React Aria `CalendarCell`: a `gridcell` whose button is named by the full, localised date ("Wednesday, October 14, 2026"), with `aria-selected`, `aria-disabled` and the "today" and range descriptions read by screen readers (WCAG 1.3.1, 4.1.2).
- CalendarMonthA month calendar for picking a date or a date range: header with previous / next buttons and the localised month name, weekday row, and six weeks of `CalendarDay`s.
- CheckboxThe bare 18 px checkbox: one independent yes/no choice applied on submit, or a row selector in a table, list or tree.
- CheckboxCardA large checkbox option with an icon, a title and a description, for a few options that need explanation (notification channels, benefits).
- CheckboxFieldA checkbox with a label and optional helper text: the box (the same element as `Checkbox`) followed by the label and description, applied on submit.
- ColorInputA hex colour field with a swatch and a picker popover.
- ColorPickerPicks a colour.
- ColorTokenCardDocumentation card for one colour token: a 96 px colour sample with an "Aa" text sample, then the name, token path, hex value and contrast note as text.