@react-beauty/ui-radio
Version:
ui-radio
179 lines (146 loc) • 5.12 kB
Markdown
# Radio Component
A modern, accessible radio button component for React applications with support for labels, helper text, and error states.
## Installation
```bash
npm install @react-beauty/ui-radio
```
## Usage
```jsx
import { RadioGroup, RadioInput } from '@react-beauty/ui-radio';
import { useState } from 'react';
// Basic Usage
function BasicRadio() {
const [value, setValue] = useState('');
return (
<RadioGroup name="basic-radio" selectedValue={value} onValueChange={setValue}>
<RadioInput value="option1">
<RadioInput.Field />
<RadioInput.Label>Option 1</RadioInput.Label>
</RadioInput>
</RadioGroup>
);
}
// With Helper Text
function RadioWithHelper() {
const [value, setValue] = useState('');
return (
<RadioGroup name="helper-radio" selectedValue={value} onValueChange={setValue}>
<RadioInput value="option1">
<RadioInput.Field />
<RadioInput.Label>Option 1</RadioInput.Label>
</RadioInput>
<RadioGroup.HelperText>This is a group-level helper text</RadioGroup.HelperText>
</RadioGroup>
);
}
// With Error State
function RadioWithError() {
const [value, setValue] = useState('');
return (
<RadioGroup name="error-radio" selectedValue={value} onValueChange={setValue} hasError>
<RadioInput value="option1">
<RadioInput.Field />
<RadioInput.Label>Option 1</RadioInput.Label>
</RadioInput>
<RadioGroup.HelperText>This is an error message</RadioGroup.HelperText>
</RadioGroup>
);
}
// Disabled Radio
function DisabledRadio() {
const [value, setValue] = useState('option1');
return (
<RadioGroup name="disabled-radio" selectedValue={value} onValueChange={setValue} isDisabled>
<RadioInput value="option1">
<RadioInput.Field />
<RadioInput.Label>Option 1</RadioInput.Label>
</RadioInput>
<RadioGroup.HelperText>This radio is disabled</RadioGroup.HelperText>
</RadioGroup>
);
}
// Radio Group with Multiple Options
function RadioGroupExample() {
const [selectedValue, setSelectedValue] = useState('option1');
return (
<RadioGroup
name="radio-group"
selectedValue={selectedValue}
onValueChange={setSelectedValue}
>
<RadioInput value="option1">
<RadioInput.Field />
<RadioInput.Label>Option 1</RadioInput.Label>
</RadioInput>
<RadioInput value="option2">
<RadioInput.Field />
<RadioInput.Label>Option 2</RadioInput.Label>
</RadioInput>
<RadioInput value="option3">
<RadioInput.Field />
<RadioInput.Label>Option 3</RadioInput.Label>
</RadioInput>
<RadioGroup.HelperText>Select one option from the list</RadioGroup.HelperText>
</RadioGroup>
);
}
// Interactive Radio Group with Validation
function InteractiveRadioGroup() {
const [selectedValue, setSelectedValue] = useState('');
const [error, setError] = useState(true);
const handleChange = (value) => {
setSelectedValue(value);
setError(false);
};
return (
<RadioGroup
name="interactive-radio-group"
selectedValue={selectedValue}
onValueChange={handleChange}
hasError={error}
>
<RadioInput value="option1">
<RadioInput.Field />
<RadioInput.Label>Small</RadioInput.Label>
</RadioInput>
<RadioInput value="option2">
<RadioInput.Field />
<RadioInput.Label>Medium</RadioInput.Label>
</RadioInput>
<RadioInput value="option3">
<RadioInput.Field />
<RadioInput.Label>Large</RadioInput.Label>
</RadioInput>
{error && (
<RadioGroup.HelperText>Please select a size</RadioGroup.HelperText>
)}
</RadioGroup>
);
}
```
## Components
### RadioGroup
The container component for a group of radio inputs. Props include:
- `name`: string - The name for all radio buttons in the group (required)
- `selectedValue`: string - The currently selected value
- `onValueChange`: (value: string) => void - Callback when selection changes (required)
- `isDisabled`: boolean - Disables all radio buttons in the group
- `hasError`: boolean - Indicates if the radio group has an error
### RadioGroup.HelperText
Text displayed below the radio group to provide additional context or error messages.
### RadioInput
Container for an individual radio input. Props include:
- `value`: string - The value of the radio input (required)
### RadioInput.Field
The actual radio input element.
### RadioInput.Label
The label component for the radio input.
## Accessibility
The radio component is built with accessibility in mind:
- Properly associated labels and inputs
- ARIA attributes for error and disabled states
- Clear visual indicators for focus states
- Proper contrast for all states
- Keyboard navigation support
## Customization
Styling is handled through CSS variables, allowing for easy customization through the design token system. The Radio component now features a refined 1px border styling using the `var(--colors-main-beerus)` color variable for improved visual design.