Minimal roulette wheel component. built with React Hooks.
- Easy Setup: Seamlessly integrates into React apps using React Hooks, simplifying embedding and state management.
- Canvas-Based Rendering: Uses HTML Canvas for high-performance rendering.
- Simple API: easy-to-use API for customization.
live demo available on stackblitz
npm install react-hook-roulette
pnpm add react-hook-roulette
yarn add react-hook-roulette
import { Roulette, useRoulette } from 'react-hook-roulette';
const App = () => {
const items = [
{ name: "label1" },
{ name: "label2" },
{ name: "label3" },
{ name: "label4" },
{ name: "label5" },
{ name: "label6" },
];
const { roulette, onStart, onStop, result } = useRoulette({ items });
return (
<div>
<Roulette roulette={roulette} />
<button type="button" onClick={onStart}>Start</button>
<button type="button" onClick={onStop}>Stop</button>
{result && <p>Result: {result}</p>}
</div>
);
};
Property | Type | Description |
---|---|---|
name |
string |
Label for the roulette segment. |
bg |
string? |
Background color of the roulette segment. |
color |
string? |
Text color for the segment label. |
weight |
number? |
Determines the segment's size relative to others. |
If you want to set styling globally, please refer to the StyleOption section. (If both are specified, the one specified in rouletteItem takes precedence.)
Property | Type | Description |
---|---|---|
items |
RouletteItem[] |
Array of items to display on the roulette wheel. |
onSpinUp |
() => void |
Optional callback executed when the roulette starts spinning. |
onSpinDown |
() => void |
Optional callback executed when the roulette starts slowing down. |
onSpinEnd |
(result: string) => void |
Optional callback executed when the roulette stops, returning the result. |
options |
Partial<RouletteOptions> |
Optional settings to customize the roulette wheel. |
Property | Type | Description |
---|---|---|
roulette |
RouletteCanvas |
Contains the size of the roulette and a ref to the canvas element. |
result |
string |
The result after the wheel stops spinning. |
onStart |
() => void |
Function to start the wheel spinning. |
onStop |
() => void |
Function to stop the wheel spinning. |
Property | Type | Default Value | Description |
---|---|---|---|
size |
number |
400 |
Diameter of the roulette wheel. |
initialAngle |
number |
0 |
Starting angle of the wheel. |
rotationDirection |
RotationDirection |
"clockwise" |
Rotation direction. |
maxSpeed |
number |
100 |
Maximum rotation speed. |
acceleration |
number |
1 |
Acceleration rate until reaching max speed. |
deceleration |
number |
1 |
Deceleration rate after stopping. |
determineAngle |
number |
45 |
Angle for determining the selected item. |
showArrow |
boolean |
true |
Controls visibility of the selection arrow. |
style |
StyleOption |
Customize roulette stylings. |
Property | Type | Description |
---|---|---|
bg |
string |
Background color of the canvas. |
Property | Type | Description |
---|---|---|
border |
boolean |
if set true , set border for each pie segment |
borderColor |
string |
|
borderWidth |
number |
|
theme |
PieTheme[] |
Array of theme options for the pie segments. |
Property | Type | Description |
---|---|---|
font |
string |
Font style and size for the label text. |
defaultColor |
string |
Default text color for the label. |
align |
CanvasTextAlign |
Horizontal alignment of the label text. |
baseline |
CanvasTextBaseline |
Vertical alignment of the label text. |
offset |
number |
Position offset of the label from the center. |
Property | Type | Description |
---|---|---|
bg |
string |
Background color of the arrow. |
size |
number |
Size of the arrow. |
const option = {
size: 400,
maxSpeed: 100,
rotationDirection: "clockwise",
acceleration: 1,
deceleration: 1,
initialAngle: 0,
determineAngle: 45,
showArrow: true,
style: {
canvas: {
bg: "#fff",
},
arrow: {
bg: "#000",
size: 16,
},
label: {
font: "16px Arial",
align: "right",
baseline: "middle",
offset: 0.75,
defaultColor: "#000",
},
pie: {
border: false,
borderColor: '#000',
borderWidth: 2,
theme: [
{
bg: "#e0e7ff",
},
{
bg: "#a5b4fc",
},
{
bg: "#6366f1",
color: "#fff",
},
{
bg: "#4338ca",
color: "#fff",
},
],
},
},
}
MIT