Radio Card

A selectable card component that behaves like a Radio

Source
Theme Source
pnpm dlx dreamy add radio-card

Radio Card is a multipart component. The hidden radio input is rendered automatically inside RadioCard.Root — pass all radio props to Root.

React Router

Next.js

Vue.js

<RadioGroup full defaultValue="rr">
	<Group full>
		<RadioCard.Root full value="rr">
			<RadioCard.Header>
				<RadioCard.Title>React Router</RadioCard.Title>
				<RadioCard.Radio />
			</RadioCard.Header>
		</RadioCard.Root>
		<RadioCard.Root full value="next">
			<RadioCard.Header>
				<RadioCard.Title>Next.js</RadioCard.Title>
				<RadioCard.Radio />
			</RadioCard.Header>
		</RadioCard.Root>
		<RadioCard.Root full value="vue">
			<RadioCard.Header>
				<RadioCard.Title>Vue.js</RadioCard.Title>
				<RadioCard.Radio />
			</RadioCard.Header>
		</RadioCard.Root>
	</Group>
</RadioGroup>

Add RadioCard.Description below the header for supporting text.

React Router

Description for React Router

Next.js

Description for Next.js

Vue.js

Description for Vue.js

<RadioCard.Root full value="rr">
	<RadioCard.Header>
		<RadioCard.Title>React Router</RadioCard.Title>
		<RadioCard.Radio />
	</RadioCard.Header>
	<RadioCard.Description>Description for React Router</RadioCard.Description>
</RadioCard.Root>

Change the Radio variant of the Radio card.

Outline

Description for Outline

Subtle

Description for Subtle

<RadioCard.Root full value="outline" variant="outline">
	<RadioCard.Header>
		<RadioCard.Title>Outline</RadioCard.Title>
		<RadioCard.Radio />
	</RadioCard.Header>
	<RadioCard.Description>Description for Outline</RadioCard.Description>
</RadioCard.Root>

Change the color scheme of the Radio card.

Primary

Description for Primary

Secondary

Description for Secondary

Success

Description for Success

Warning

Description for Warning

Error

Description for Error

Info

Description for Info

None

Description for None

<RadioCard.Root full value="primary" scheme="primary">
	<RadioCard.Header>
		<RadioCard.Title>Primary</RadioCard.Title>
		<RadioCard.Radio />
	</RadioCard.Header>
	<RadioCard.Description>Description for Primary</RadioCard.Description>
</RadioCard.Root>

Change the Radio card size.

Small

Description for Small

Medium

Description for Medium

Large

Description for Large

<RadioCard.Root full value="sm" size="sm">
	<RadioCard.Header>
		<RadioCard.Title>Small</RadioCard.Title>
		<RadioCard.Radio />
	</RadioCard.Header>
	<RadioCard.Description>Description for Small</RadioCard.Description>
</RadioCard.Root>

You can control the Radio state by using value and onChange in <RadioGroup />.

export function ControlledRadioCards() {
    const [value, setValue] = useState<string | number>("rr");
 
    return (
        <RadioGroup
            value={value}
            onChange={setValue}
        >
            <Group
                full
                wrapped
            >
                <RadioCard.Root
                    value="rr"
                    full
                >
                    <RadioCard.Header>
                        <RadioCard.Title>React Router</RadioCard.Title>
                        <RadioCard.Radio />
                    </RadioCard.Header>
                    <RadioCard.Description>Description for React Router</RadioCard.Description>
                </RadioCard.Root>
            </Group>
        </RadioGroup>
    );
}

Use custom content inside RadioCard.Title or RadioCard.Description for richer layouts.

React Router

Description for React Router

Next.js

Description for Next.js

Vue.js

Description for Vue.js

<RadioCard.Root full value="rr">
	<RadioCard.Header>
		<RadioCard.Title>
			<Flex col gap={2}> 
				<Icon as={<SiReactrouter />} boxSize="5" color="fg.medium" />
				<Text>React Router</Text>
			</Flex>
		</RadioCard.Title>
		<RadioCard.Radio />
	</RadioCard.Header>
	<RadioCard.Description>Description for React Router</RadioCard.Description>
</RadioCard.Root>

Omit RadioCard.Radio to hide the radio indicator.

Paypal

Credit Card

Apple

<RadioCard.Root full value="paypal">
	<RadioCard.Header>
		<RadioCard.Title>
			<Flex full gap={2} row center>
				<Icon as={<FaPaypal />} boxSize="5" color="fg.medium" />
				<Text>Paypal</Text>
			</Flex>
		</RadioCard.Title>
	</RadioCard.Header>
</RadioCard.Root>