A customizable and flexible fortune wheel for vue3
https://roulette.nitocode.com/
See also: codesandbox template
npm i --save vue3-roulette
import { createApp } from 'vue'
import App from './App.vue'
import { Roulette } from 'vue3-roulette'
createApp(App).component("roulette", Roulette).mount('#app')
<Roulette ref="wheel" :items="items" @click="launchWheel" />
Using the sfc syntax
<script setup>
import { ref } from 'vue'
const wheel = ref(null);
const items = [
{ id: 1, name: "Banana", htmlContent: "Banana", textColor: "", background: "" },
{ id: 2, name: "Apple", htmlContent: "Apple", textColor: "", background: "" },
{ id: 3, name: "Orange and Purple", htmlContent: "Orange<br>and Purple", textColor: "", background: "" },
{ id: 4, name: "Cherry", htmlContent: "Cherry", textColor: "", background: "" },
];
function launchWheel (){
wheel.value.launchWheel();
}
</script>
wheel-start
and wheel-end
which provide the item selected
<Roulette
ref="wheel" :items="items" @click="launchWheel"
@wheel-start="wheelStartedCallback"
@wheel-end="wheelEndedCallback"
/>
Composition API
wheel.value.launchWheel();
wheel.value.reset();
Option API
this.$refs.wheel.launchWheel();
this.$refs.wheel.reset();
Props | Type | Required | Default | Options | Details |
---|---|---|---|---|---|
items | Object | yes | - | 4 items minimum | |
first-item-index | Object | no | { value: 0 } | ||
wheel-result-index | Object | no | { value: null } | from 0 to items length | |
centered-indicator | Boolean | no | false | ||
indicator-position | String | no | "top" | "top" | "right" | "bottom" | "left" | |
size | Number | no | 300 | size unit: pixel | |
display-shadow | Boolean | no | false | ||
duration | Number | no | 4 | duration unit: seconds | |
result-variation | Number | no | 0 | number between 0 and 100 | varies the result angle to fake wheel smoothness |
easing | String | no | "ease" | "ease" | "bounce" | wheel animation |
counter-clockwise | Boolean | no | false | rotation direction | |
horizontal-content | Boolean | no | false | text item orientation | |
display-border | Boolean | no | false | ||
display-indicator | Boolean | no | false |
Props | Type | Required | Default | Options | Details |
---|---|---|---|---|---|
base-display | Boolean | no | false | ||
base-size | Number | no | 100 | size unit: pixel | |
base-display-shadow | Boolean | no | false | ||
base-display-indicator | Boolean | no | false | ||
base-background | String | no | "" | rgb(100,0,0) | red | #FF0000 |
You can use your own html for the wheel base
<Roulette ref="wheel" :items="items" @click="launchWheel">
<template #baseContent>
<div v-html="yourHtml"></div>
</template>
</Roulette>
npm install
npm run serve