vue3-fortune-wheel
Version:
A Vue 3 Fortune Wheel component
174 lines (125 loc) ⢠4.22 kB
Markdown
š An easy-to-use fortune wheel component for Vue.js 3 š
š„ Built with Vue 3 + TypeScript š„
[](https://codesandbox.io/p/github/joffreyBerrier/vue-fortune-wheel-codesandbox/main?embed=1)

- Customizable wheel segments
- Animated spinning
- Optional center image
- TypeScript support
- Accessible (with ARIA attributes)
```bash
pnpm add vue3-fortune-wheel
```
```vue
<script setup lang="ts">
import { ref } from 'vue'
import { FortuneWheel } from 'vue3-fortune-wheel'
import type { Data, ImgParams } from 'vue3-fortune-wheel'
const gift = ref(2)
const wheel = ref<InstanceType<typeof FortuneWheel> | null>(null)
const data = ref<Data[]>([
{ id: 1, value: 'Gift 1', bgColor: '#7d7db3', color: '#ffffff' },
{ id: 2, value: 'Gift 2', bgColor: '#ffffff', color: '#000000' }
])
// Optional: Center image
const logo: ImgParams = {
src: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Vue.js_Logo_2.svg/2367px-Vue.js_Logo_2.svg.png',
width: 100,
height: 120
}
const hasMiddleCircle = true
const done = (result: Data) => {
console.log('Spin completed:', result)
}
</script>
<template>
<FortuneWheel
ref="wheel"
v-model="gift"
:middle-circle="hasMiddleCircle"
:img-params="logo"
:data="data"
@done="done"
/>
</template>
```
| Prop | Type | Default | Description |
| ------------ | ----------- | ------- | ---------------------------------------------- |
| v-model | `number` | `null` | ID of the winning item |
| data | `Data[]` | `[]` | Array of wheel segments |
| animDuration | `number` | `5000` | Spin animation duration in milliseconds |
| imgParams | `ImgParams` | `{}` | Configuration for center image (optional) |
| middleCircle | `boolean` | `true` | Show/hide middle circle |
| autoSpin | `boolean` | `false` | Launch wheel directly after update modelValue |
| fontFamily | `string` | `Arial, sans-serif` | Typographie |
| debug | `boolean` | `false` | Show debug information |
### Events
| Event | Payload | Description |
| ----- | ------- | ---------------------------------- |
| done | `Data` | Emitted when the spin is completed |
### Methods
| Method | Description |
| ------ | --------------------- |
| spin() | Starts the wheel spin |
## Types
```typescript
interface Data {
id: number
value: string
color: string
bgColor: string
}
interface ImgParams {
src: string
width: number
height: number
}
```
Use the `ref` to call the `spin` method:
```typescript
const wheel = ref<InstanceType<typeof FortuneWheel> | null>(null)
const launchWheel = () => {
wheel.value?.spin()
}
```
If you need to randomly select a winner, you can use a method like this:
```typescript
const randomGift = () => {
return Math.floor(Math.random() * data.value.length) + 1
}
```
1. Fork the repository
2. Clone your fork: `git clone https://github.com/YOUR_USERNAME/vue3-fortune-wheel.git`
3. Install dependencies: `pnpm install`
```bash
pnpm run test:unit
```
1. Create an issue describing the feature or bug
2. Fork the repo and create a branch following the gitflow convention:
- Feature branches: `feature/issueId`
- Release branches: `release/issueId`
- Hotfix branches: `hotfix/issueId`
- Support branches: `support/issueId`
3. Make your changes and push to your fork
4. Open a pull request to the main repository
[](LICENSE)
If you have any questions or need help, please open an issue on the GitHub repository.
---
Made with ā¤ļø by Joffrey Berrier