The Rating Input component provides an interactive star rating interface that allows users to select a rating from a predefined number of options.
Example
<div style="display:flex;flex-direction:column;gap:16px"><div><p>Default 5-star rating:</p><div class="rating-input skin-primary wrapper [--rating-icon-size:32px] " role="radiogroup" aria-required="false"><input type="radio" id="default-rating-1" aria-label="1 star" name="default-rating" value="1"/><input type="radio" id="default-rating-2" aria-label="2 stars" name="default-rating" value="2"/><input type="radio" id="default-rating-3" aria-label="3 stars" name="default-rating" value="3"/><input type="radio" id="default-rating-4" aria-label="4 stars" name="default-rating" value="4"/><input type="radio" id="default-rating-5" aria-label="5 stars" name="default-rating" value="5"/></div></div><div><p>10-star rating with default value:</p><div class="rating-input skin-primary wrapper [--rating-icon-size:32px] " role="radiogroup" aria-required="false"><input type="radio" id="ten-star-rating-1" aria-label="1 star" name="ten-star-rating" value="1"/><input type="radio" id="ten-star-rating-2" aria-label="2 stars" name="ten-star-rating" value="2"/><input type="radio" id="ten-star-rating-3" aria-label="3 stars" name="ten-star-rating" value="3"/><input type="radio" id="ten-star-rating-4" aria-label="4 stars" name="ten-star-rating" value="4"/><input type="radio" id="ten-star-rating-5" aria-label="5 stars" name="ten-star-rating" value="5"/><input type="radio" id="ten-star-rating-6" aria-label="6 stars" name="ten-star-rating" value="6"/><input type="radio" id="ten-star-rating-7" aria-label="7 stars" name="ten-star-rating" checked="" value="7"/><input type="radio" id="ten-star-rating-8" aria-label="8 stars" name="ten-star-rating" value="8"/><input type="radio" id="ten-star-rating-9" aria-label="9 stars" name="ten-star-rating" value="9"/><input type="radio" id="ten-star-rating-10" aria-label="10 stars" name="ten-star-rating" value="10"/></div></div><div><p>Required rating (with validation):</p><div class="rating-input skin-primary wrapper [--rating-icon-size:32px] " role="radiogroup" aria-required="true"><input type="radio" id="required-rating-1" aria-label="1 star" required="" name="required-rating" value="1"/><input type="radio" id="required-rating-2" aria-label="2 stars" required="" name="required-rating" value="2"/><input type="radio" id="required-rating-3" aria-label="3 stars" required="" name="required-rating" value="3"/><input type="radio" id="required-rating-4" aria-label="4 stars" required="" name="required-rating" value="4"/><input type="radio" id="required-rating-5" aria-label="5 stars" required="" name="required-rating" value="5"/></div></div><div><p>Disabled rating:</p><div class="rating-input skin-primary wrapper [--rating-icon-size:32px] " role="radiogroup" aria-required="false"><input type="radio" id="disabled-rating-1" aria-label="1 star" disabled="" name="disabled-rating" value="1"/><input type="radio" id="disabled-rating-2" aria-label="2 stars" disabled="" name="disabled-rating" value="2"/><input type="radio" id="disabled-rating-3" aria-label="3 stars" disabled="" name="disabled-rating" checked="" value="3"/><input type="radio" id="disabled-rating-4" aria-label="4 stars" disabled="" name="disabled-rating" value="4"/><input type="radio" id="disabled-rating-5" aria-label="5 stars" disabled="" name="disabled-rating" value="5"/></div></div></div>
<div style="display:flex;flex-direction:column;gap:16px"><div><p>Default 5-star rating:</p><div class="rating-input skin-primary wrapper [--rating-icon-size:32px] " role="radiogroup" aria-required="false"><input type="radio" id="default-rating-1" aria-label="1 star" name="default-rating" value="1"/><input type="radio" id="default-rating-2" aria-label="2 stars" name="default-rating" value="2"/><input type="radio" id="default-rating-3" aria-label="3 stars" name="default-rating" value="3"/><input type="radio" id="default-rating-4" aria-label="4 stars" name="default-rating" value="4"/><input type="radio" id="default-rating-5" aria-label="5 stars" name="default-rating" value="5"/></div></div><div><p>10-star rating with default value:</p><div class="rating-input skin-primary wrapper [--rating-icon-size:32px] " role="radiogroup" aria-required="false"><input type="radio" id="ten-star-rating-1" aria-label="1 star" name="ten-star-rating" value="1"/><input type="radio" id="ten-star-rating-2" aria-label="2 stars" name="ten-star-rating" value="2"/><input type="radio" id="ten-star-rating-3" aria-label="3 stars" name="ten-star-rating" value="3"/><input type="radio" id="ten-star-rating-4" aria-label="4 stars" name="ten-star-rating" value="4"/><input type="radio" id="ten-star-rating-5" aria-label="5 stars" name="ten-star-rating" value="5"/><input type="radio" id="ten-star-rating-6" aria-label="6 stars" name="ten-star-rating" value="6"/><input type="radio" id="ten-star-rating-7" aria-label="7 stars" name="ten-star-rating" checked="" value="7"/><input type="radio" id="ten-star-rating-8" aria-label="8 stars" name="ten-star-rating" value="8"/><input type="radio" id="ten-star-rating-9" aria-label="9 stars" name="ten-star-rating" value="9"/><input type="radio" id="ten-star-rating-10" aria-label="10 stars" name="ten-star-rating" value="10"/></div></div><div><p>Required rating (with validation):</p><div class="rating-input skin-primary wrapper [--rating-icon-size:32px] " role="radiogroup" aria-required="true"><input type="radio" id="required-rating-1" aria-label="1 star" required="" name="required-rating" value="1"/><input type="radio" id="required-rating-2" aria-label="2 stars" required="" name="required-rating" value="2"/><input type="radio" id="required-rating-3" aria-label="3 stars" required="" name="required-rating" value="3"/><input type="radio" id="required-rating-4" aria-label="4 stars" required="" name="required-rating" value="4"/><input type="radio" id="required-rating-5" aria-label="5 stars" required="" name="required-rating" value="5"/></div></div><div><p>Disabled rating:</p><div class="rating-input skin-primary wrapper [--rating-icon-size:32px] " role="radiogroup" aria-required="false"><input type="radio" id="disabled-rating-1" aria-label="1 star" disabled="" name="disabled-rating" value="1"/><input type="radio" id="disabled-rating-2" aria-label="2 stars" disabled="" name="disabled-rating" value="2"/><input type="radio" id="disabled-rating-3" aria-label="3 stars" disabled="" name="disabled-rating" checked="" value="3"/><input type="radio" id="disabled-rating-4" aria-label="4 stars" disabled="" name="disabled-rating" value="4"/><input type="radio" id="disabled-rating-5" aria-label="5 stars" disabled="" name="disabled-rating" value="5"/></div></div></div>
Usage
import RatingInput from "@altitude/ui/react/ui/rating-input";
export default function RatingExample() {
// Uncontrolled component example
<label htmlFor="product-rating">Rate this product:</label>
// Controlled component example
const [rating, setRating] = useState<number | null>(null);
const handleRatingChange = (value: number | null) => {
console.log(`Selected rating: ${value}`);
<label htmlFor="service-rating">Rate our service:</label>
onChange={handleRatingChange}
<p>You selected: {rating || "No rating"}</p>
Props
| Prop | Type | Required | Description |
|---|
| numberOfOptions | number | No | Number of rating options/stars (default: 5) |
| defaultValue | number | null | No | Default rating value (uncontrolled component) |
| value | number | null | No | Current rating value (controlled component) |
| onChange | function | No | Callback when rating changes: (value: number | null) => void |
| id | string | No | HTML ID for the input (default: “rating-input”) |
| name | string | No | Form field name (default: “rating”) |
| disabled | boolean | No | Whether the rating input is disabled (default: false) |
| required | boolean | No | Whether a rating selection is required |
| className | string | No | Additional CSS classes for styling |
Features
- Flexible Rating Scale: Supports any number of rating options via the
numberOfOptions prop
- Controlled & Uncontrolled: Works with both component patterns
- Accessible: Implemented as a radio group with proper ARIA attributes
- Form Integration: Works seamlessly in forms with proper value handling and validation
- Visual Feedback: Clear visual indication of selected rating
Accessibility
The Rating Input component is built with accessibility in mind:
- Uses a radio group pattern for keyboard navigation
- Provides appropriate ARIA labels for each rating option
- Supports required attribute for form validation
- Maintains focus properly during interaction