react-flexible-star-rating
Version:
A flexible and customizable React star rating component.
325 lines (228 loc) โข 11.8 kB
Markdown
# React Star Rating Component
[](https://www.npmjs.com/package/react-flexible-star-rating) [](https://standardjs.com)  
A highly customizable and lightweight star rating component for React applications. Supports both full and half-star ratings with extensive customization options.
## ๐ฎ Live Demos ๐
See all interactive demos and usage examples in action:
### ๐ฏ [**Interactive Demo Gallery**](https://67accf8b8080b9c7771736c7-dihbfchhak.chromatic.com/?path=/docs/components-starrating--docs) โ Explore All Features & Examples
โจ [**Basic Star Rating**](https://67accf8b8080b9c7771736c7-dihbfchhak.chromatic.com/?path=/story/components-starrating--basic) โ Simple & clean star rating
๐ [**Half-Star Rating**](https://67accf8b8080b9c7771736c7-dihbfchhak.chromatic.com/?path=/story/components-starrating--half-star-rating) โ Supports half-star selection
๐ด [**Custom Styled Rating (Red)**](https://67accf8b8080b9c7771736c7-dihbfchhak.chromatic.com/?path=/story/components-starrating--custom-styled-red) โ Red-themed stars
๐ข [**Custom Styled Rating (Green)**](https://67accf8b8080b9c7771736c7-dihbfchhak.chromatic.com/?path=/story/components-starrating--custom-styled-green) โ Green-themed stars
๐ต [**Custom Styled Rating (Blue)**](https://67accf8b8080b9c7771736c7-dihbfchhak.chromatic.com/?path=/story/components-starrating--custom-styled-blue) โ Blue-themed stars
โญ [**Single Large Star**](https://67accf8b8080b9c7771736c7-dihbfchhak.chromatic.com/?path=/story/components-starrating--single-large-star) โ A big bold rating star
๐ [**Read-only Rating**](https://67accf8b8080b9c7771736c7-dihbfchhak.chromatic.com/?path=/story/components-starrating--read-only) โ Non-editable rating display
๐ซ [**Disabled Hover Effects**](https://67accf8b8080b9c7771736c7-dihbfchhak.chromatic.com/?path=/story/components-starrating--disabled-hover) โ No hover animations
## ๐ Features
- โญ Configurable number of stars
- ๐ Support for half-star ratings
- ๐ Deselectable ratings (click same rating to cancel)
- โจ Interactive hover effects
- ๐ Read-only mode support
- ๐จ Customizable star colors
- ๐ Adjustable star sizes
- ๐ฏ TypeScript support
- ๐ชถ Lightweight
- Final Bundle Size: 15.7 kB (compressed .tgz file size)
- Unpacked Size: 70.2 kB (size after npm install)
## ๐ฆ Installation
### Using npm
```bash
npm install react-flexible-star-rating
```
Alternatively, you can use yarn or pnpm:
#### Using yarn
```bash
yarn add react-flexible-star-rating
```
#### Using pnpm
```bash
pnpm add react-flexible-star-rating
```
## ๐ป Basic Usage
#### Using a Callback Function to Handle Rating Changes
This example demonstrates how to handle rating changes using a custom callback function. The initial rating value starts at 0, and the rating is logged to the console each time the user clicks on a star. If the user clicks the same rating again, it resets to 0.
```tsx
import { StarRating } from 'react-flexible-star-rating';
function App() {
const handleRatingChange = (rating: number) => {
// Logs the new rating; resets to 0 if the same rating is clicked again
console.log(`New rating: ${rating}`);
};
/*
โ ๏ธ Note
To enable half-star ratings with an initial value of 0,
set the `isHalfRatingEnabled` prop to `true`.
Example usages:
`<StarRating isHalfRatingEnabled={true} />`
`<StarRating initialRating={0} isHalfRatingEnabled={true} />`
*/
return <StarRating onRatingChange={handleRatingChange} />;
}
```
<hr>
#### Using useState Hook with a Handler Function
This example demonstrates how to manage the rating value using the useState hook while also logging the rating changes to the console.
```tsx
import { useState } from 'react';
import { StarRating } from 'react-flexible-star-rating';
function App() {
const ratingValue = 3.5;
const [rating, setRating] = useState(ratingValue);
const handleRatingChange = (newRating: number) => {
console.log(`New rating: ${newRating}`);
setRating(newRating);
};
/*
โ ๏ธ Important Note: Proper Usage of `initialRating`
โ Incorrect (Avoid this):
`<StarRating initialRating={rating} />`
- Binding `initialRating` to state can cause half-ratings to behave like integers.
โ
Correct (Use one of these approaches):
- Static value: `<StarRating initialRating={3.5} />`
- Defined variable:
`const ratingValue = 3.5;`
...
`<StarRating initialRating={ratingValue} />`
This ensures proper half-rating functionality of the component.
*/
return <StarRating initialRating={ratingValue} onRatingChange={handleRatingChange} />;
}
```
<hr>
#### Using setState Function Directly
This example demonstrates how to manage the rating value using the `useState` hook without needing a separate handler function. The state is updated directly when the user selects a new rating.
```tsx
import { useState } from 'react';
import { StarRating } from 'react-flexible-star-rating';
function App() {
const ratingValue = 3.5;
const [rating, setRating] = useState(ratingValue);
return <StarRating initialRating={ratingValue} onRatingChange={setRating} />;
}
```
### Next.js Usage
โ ๏ธ **Important Note for Next.js Users**
When using this component in Next.js applications, you must add the `"use client"` directive at the top of your component file. This is because the star rating component uses React hooks (`useState`, `useCallback`), which can only be used in client-side components.
#### Sample Usage in Next.js
```tsx
'use client'; // โ ๏ธ Required: do not forget this line
import { useState } from 'react';
import { StarRating } from 'react-flexible-star-rating';
export default function RatingComponent() {
const initialRatingValue = 2;
const [rating, setRating] = useState(initialRatingValue);
return (
<div>
<h2>Product Rating</h2>
<StarRating initialRating={initialRatingValue} onRatingChange={setRating} />
<p>Current Rating: {rating}</p>
</div>
);
}
```
## โ๏ธ Props
| Prop | Type | Default | Description |
| --------------------- | -------------------------- | ----------- | --------------------------------------------------------------------- |
| `starsLength` | `number` | `5` | Number of stars to display |
| `isHalfRatingEnabled` | `boolean` | `false` | Enable half-star ratings |
| `isHoverEnabled` | `boolean` | `true` | Enable hover effects |
| `isReadOnly` | `boolean` | `false` | Make the rating read-only |
| `initialRating` | `number` | `0` | Initial rating value |
| `dimension` | `number` | `30` | Size (width & height) of stars in rem |
| `color` | `string` | `"#FFD700"` | Star color in HEX format |
| `onRatingChange` | `(rating: number) => void` | `undefined` | Accepts setState or custom callback function to handle rating changes |
<hr>
## ๐ Usage Examples
### Basic Star Rating
โก [Interactive Demo](https://67accf8b8080b9c7771736c7-dihbfchhak.chromatic.com/?path=/story/components-starrating--basic)
<hr>
<img src="./gifs/basic.gif" alt="screenshot" width="60%" />
<hr>
#### Sample Usage
```tsx
<StarRating starsLength={5} initialRating={0} onRatingChange={(rating) => console.log(rating)} />
```
### Half-Star Rating
โก [Interactive Demo](https://67accf8b8080b9c7771736c7-dihbfchhak.chromatic.com/?path=/story/components-starrating--half-star-rating)
<hr>
<img src="./gifs/half.gif" alt="screenshot" width="60%" />
<hr>
#### Sample Usage
```tsx
<StarRating
starsLength={5}
initialRating={3.5}
isHalfRatingEnabled={true}
onRatingChange={(rating) => console.log(rating)}
/>
```
### Read-only Rating Display
โก [Interactive Demo](https://67accf8b8080b9c7771736c7-dihbfchhak.chromatic.com/?path=/story/components-starrating--read-only)
<hr>
<img src="./gifs/readonly.gif" alt="screenshot" width="60%" />
<hr>
#### Sample Usage
```tsx
<StarRating starsLength={5} initialRating={4} isReadOnly={true} />
```
### Custom Styled Rating
โก [Interactive Demo](https://67accf8b8080b9c7771736c7-dihbfchhak.chromatic.com/?path=/story/components-starrating--custom-styled-red)
<hr>
<img src="./gifs/customs.gif" alt="screenshot" width="60%" />
<hr>
#### Sample Usage
```tsx
<StarRating starsLength={10} initialRating={5} dimension={50} color="#FF5733" />
```
### Disabled Hover Effects
โก [Interactive Demo](https://67accf8b8080b9c7771736c7-dihbfchhak.chromatic.com/?path=/story/components-starrating--disabled-hover)
<hr>
<img src="./gifs/disabled.gif" alt="screenshot" width="60%" />
<hr>
#### Sample Usage
```tsx
<StarRating starsLength={5} initialRating={3} isHoverEnabled={false} />
<StarRating starsLength={5} initialRating={1.5} isHoverEnabled={false} />
```
## ๐ API Details
### Rating Validation
- When `isHalfRatingEnabled` is `true`, ratings can be in increments of 0.5
- When `isHalfRatingEnabled` is `false`, only integer ratings are allowed
- `initialRating` must be between 0 and `starsLength`
- The component will throw an error if:
- `initialRating` is greater than `starsLength`
- `initialRating` is less than 0
- `starsLength` is less than or equal to 0
- `isHoverEnabled` is true when `isReadOnly` is true
### Rating Deselection
The component supports rating deselection:
- Click on the same rating twice to cancel/deselect it
- The rating will reset to 0
- The `onRatingChange` callback will be called with 0
### Performance Optimization
- Uses React's `useCallback` hooks for optimal rendering
- Efficient state updates using React's state management
### Browser Compatibility
- Supports all modern browsers (Chrome, Firefox, Safari, Edge)
- Touch events supported for mobile devices
## ๐ฎ TODO Features
Here are some exciting features planned for future releases:
- ~~๐ Live Demo - An interactive demo website to showcase component features~~ โ
- โจ๏ธ Keyboard Navigation
- Arrow keys for rating selection
- Space/Enter for rating confirmation
- Escape key for rating reset
- ๐ฃ๏ธ Voice Control
- Voice commands for setting specific ratings
- Natural language support for rating control
- Voice feedback for current rating state
- Voice-activated rating reset
- โฟ Screen Reader Accessibility
- Improved ARIA labels and descriptions
- Better announcement of rating changes
- Enhanced focus management
## ๐ง Contact
For questions or suggestions, email me at: `suhatanriverdi.dev@gmail.com`
<a href="https://www.buymeacoffee.com/suhatanriverdi" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" width="20%"></a>
_Your support means a lot to me to continue the development of open-source projects like this._
<small>_Created by Sรผha Tanrฤฑverdi, 2025_ </small>