Overview
The RadioButton component provides a radio input for single selection from a group of options, with support for labels, validation states, and error handling.Basic Usage
- Code
- Preview
import { useState } from "react";
import { RadioButton } from '@peppermint-design/devreadykit-custom';
export default function App() {
const [selected, setSelected] = useState("option1");
return (
<RadioButton
checked={selected === "option1"}
onCheckedChange={(checked) => checked && setSelected("option1")}
label="Option 1"
name="group"
value="option1"
/>
);
}
Radio Group
Basic Group
- Code
- Preview
import { useState } from "react";
import { RadioButton } from '@peppermint-design/devreadykit-custom';
function RadioGroup() {
const [selected, setSelected] = useState("option1");
return (
<div className="space-y-2">
<RadioButton
checked={selected === "option1"}
onCheckedChange={(checked) => checked && setSelected("option1")}
label="Option 1"
name="group"
value="option1"
/>
<RadioButton
checked={selected === "option2"}
onCheckedChange={(checked) => checked && setSelected("option2")}
label="Option 2"
name="group"
value="option2"
/>
<RadioButton
checked={selected === "option3"}
onCheckedChange={(checked) => checked && setSelected("option3")}
label="Option 3"
name="group"
value="option3"
/>
</div>
);
}
Visual States
Focus
- Code
- Preview
<RadioButton
checked={false}
label="Focused radio"
visualState="focus"
name="group"
value="focus"
/>
Error
- Code
- Preview
<RadioButton
checked={false}
label="Error radio"
visualState="error"
errorMessage="This selection is required"
name="group"
value="error"
/>
Disabled
- Code
- Preview
<RadioButton
checked={true}
label="Disabled checked"
visualState="disabled"
name="group"
value="disabled1"
/>
<RadioButton
checked={false}
label="Disabled unchecked"
visualState="disabled"
name="group"
value="disabled2"
/>
Props
| Prop | Type | Default | Description |
|---|---|---|---|
| checked | boolean | false | Checked state |
| onCheckedChange | (checked: boolean, event: ChangeEvent) => void | — | Change handler |
| visualState | "rest" | "focus" | "error" | "disabled" | "default" | "focused" | "rest" | Visual state |
| label | React.ReactNode | — | Label content |
| required | boolean | false | Required field indicator |
| errorMessage | React.ReactNode | — | Error message |
| name | string | — | Name for radio group |
| value | string | — | Value for radio button |
| disabled | boolean | false | Disabled state |
| className | string | — | Additional CSS classes |
Examples
Survey Form
- Code
- Preview
import { useState, type ChangeEvent } from "react";
import { RadioButton } from '@peppermint-design/devreadykit-custom';
function SurveyForm() {
const [responses, setResponses] = useState({
satisfaction: "",
recommendation: "",
experience: ""
});
const handleChange = (field: string) => (checked: boolean, event: ChangeEvent) => {
if (checked) {
setResponses(prev => ({ ...prev, [field]: event.target.value }));
}
};
return (
<form className="space-y-6">
<div>
<h3 className="font-medium mb-3">How satisfied are you?</h3>
<div className="space-y-2">
{["very-satisfied", "satisfied", "neutral", "dissatisfied", "very-dissatisfied"].map(value => (
<RadioButton
key={value}
checked={responses.satisfaction === value}
onCheckedChange={handleChange('satisfaction')}
label={value.replace('-', ' ').replace(/\b\w/g, l => l.toUpperCase())}
name="satisfaction"
value={value}
/>
))}
</div>
</div>
</form>
);
}
Payment Method Selection
- Code
- Preview
import { useState } from "react";
import { RadioButton } from '@peppermint-design/devreadykit-custom';
function PaymentMethod() {
const [method, setMethod] = useState("credit-card");
return (
<div className="space-y-3">
<h3 className="font-medium">Payment Method</h3>
<RadioButton
checked={method === "credit-card"}
onCheckedChange={(checked) => checked && setMethod("credit-card")}
label="Credit Card"
name="payment"
value="credit-card"
/>
<RadioButton
checked={method === "paypal"}
onCheckedChange={(checked) => checked && setMethod("paypal")}
label="PayPal"
name="payment"
value="paypal"
/>
<RadioButton
checked={method === "bank-transfer"}
onCheckedChange={(checked) => checked && setMethod("bank-transfer")}
label="Bank Transfer"
name="payment"
value="bank-transfer"
/>
</div>
);
}