{"_id":"@cxde/wheel-of-fortune","_rev":"9-55190014b2aa0e1747550314c5c7fbb4","name":"@cxde/wheel-of-fortune","dist-tags":{"latest":"0.1.8"},"versions":{"0.1.0":{"name":"@cxde/wheel-of-fortune","version":"0.1.0","keywords":["react","wheel-of-fortune","prize-wheel","roulette","spinner"],"license":"MIT","_id":"@cxde/wheel-of-fortune@0.1.0","maintainers":[{"name":"cxde","email":"freezer314@gmail.com"}],"homepage":"https://github.com/DFreezer/wheel-of-fortune#readme","bugs":{"url":"https://github.com/DFreezer/wheel-of-fortune/issues"},"dist":{"shasum":"0a187689871d781ead8e7304d283759603fa94f7","tarball":"https://registry.npmjs.org/@cxde/wheel-of-fortune/-/wheel-of-fortune-0.1.0.tgz","fileCount":20,"integrity":"sha512-JNkElPWR/7p1N2onj5YzSaqajTi7MMtaBeMylYddvfjmBu5Z7K+QGl54lk4CtgcBLHO9Bg0RhDtYjkzMFf8mgA==","signatures":[{"sig":"MEQCIFSYSiqiYcwjsaP7jm2dzcLyDvbLI1wsrCUSkmTWorszAiAHsaqaJZrHFUr8dU/JYGmLYtEU0XfHV3WtuXeLt9MpIA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98456},"main":"./dist/index.cjs","type":"module","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./style.css":"./dist/style.css"},"gitHead":"b2505dc8722480fb98bd97809d8729e171f8286e","scripts":{"dev":"vite","test":"node --test tests/*.test.ts","build":"npm run build:lib && npm run build:playground","preview":"vite preview","build:lib":"vite build && tsc -p tsconfig.lib.json","prepublishOnly":"npm test && npm run build:lib","build:playground":"tsc -p tsconfig.app.json && vite build --config vite.playground.config.ts"},"_npmUser":{"name":"cxde","email":"freezer314@gmail.com"},"repository":{"url":"git+https://github.com/DFreezer/wheel-of-fortune.git","type":"git"},"_npmVersion":"10.9.8","description":"Highly customizable and performant wheel of fortune component for React","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","react":"^19.2.3","react-dom":"^19.2.3","typescript":"^5.9.3","@types/react":"^19.2.8","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^5.1.1"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/wheel-of-fortune_0.1.0_1784669897454_0.4608682025010826","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@cxde/wheel-of-fortune","version":"0.1.1","keywords":["react","wheel-of-fortune","prize-wheel","roulette","spinner"],"license":"MIT","_id":"@cxde/wheel-of-fortune@0.1.1","maintainers":[{"name":"cxde","email":"freezer314@gmail.com"}],"homepage":"https://customizablewheel.netlify.app","bugs":{"url":"https://github.com/DFreezer/wheel-of-fortune/issues"},"dist":{"shasum":"174319d74527cb17e7563634d8ac1f6d2de141e6","tarball":"https://registry.npmjs.org/@cxde/wheel-of-fortune/-/wheel-of-fortune-0.1.1.tgz","fileCount":21,"integrity":"sha512-U61pwxbZXjbT13g4cxDNR9+94k/4+P8KlH0vYOaFWRYCXTLbt8F8yRhXpHvU9AGMA4xNXNJurOpTMBo9StZcMQ==","signatures":[{"sig":"MEQCIHwRXtTrwa+TCsdk25V8ub73EJmhdeiJxLXnIS+nc5+HAiACffcZnWcqSRVNh9Sxyd9WD6HXNVt7hoEv1uDUt0C4BQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99595},"main":"./dist/index.cjs","type":"module","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./style.css":"./dist/style.css"},"gitHead":"98ea60eb17ec9a5050eab5624cd2b467bc6b112d","scripts":{"dev":"vite","test":"node --test tests/*.test.ts","build":"npm run build:lib && npm run build:playground","preview":"vite preview","build:lib":"vite build && tsc -p tsconfig.lib.json","prepublishOnly":"npm test && npm run build:lib","build:playground":"tsc -p tsconfig.app.json && vite build --config vite.playground.config.ts"},"_npmUser":{"name":"cxde","email":"freezer314@gmail.com"},"repository":{"url":"git+https://github.com/DFreezer/wheel-of-fortune.git","type":"git"},"_npmVersion":"10.9.8","description":"Highly customizable and performant wheel of fortune component for React","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","react":"^19.2.3","react-dom":"^19.2.3","typescript":"^5.9.3","@types/react":"^19.2.8","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^5.1.1"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/wheel-of-fortune_0.1.1_1784676382453_0.030052266647408343","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@cxde/wheel-of-fortune","version":"0.1.2","keywords":["react","wheel-of-fortune","prize-wheel","roulette","spinner"],"license":"MIT","_id":"@cxde/wheel-of-fortune@0.1.2","maintainers":[{"name":"cxde","email":"freezer314@gmail.com"}],"homepage":"https://customizablewheel.netlify.app","bugs":{"url":"https://github.com/DFreezer/wheel-of-fortune/issues"},"dist":{"shasum":"4a8c2376ffb1547558b6cb86ac9b8af7b2706d23","tarball":"https://registry.npmjs.org/@cxde/wheel-of-fortune/-/wheel-of-fortune-0.1.2.tgz","fileCount":21,"integrity":"sha512-VAKC5vZCHZClpZSLgJr8MkX9yJwAEl3YB+J+GLeiGgMU5rN+exwkrWkG23+oAlwikCQfM1I/G6LmI84+GDVFhw==","signatures":[{"sig":"MEUCIQCgx2VIIMPVWIZM2TE1OIumW+TOeozeVmJH24Fj0+SnogIgOOhuxnSO0rdhDWrv04HauW+wBoFmA8ZmWHj/mEzbmfg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99795},"main":"./dist/index.cjs","type":"module","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./style.css":"./dist/style.css"},"gitHead":"a1a152c88b0a36ba51272cd7be181aa6c7ba656e","scripts":{"dev":"vite","test":"node --test tests/*.test.ts","build":"npm run build:lib && npm run build:playground","preview":"vite preview","build:lib":"vite build && tsc -p tsconfig.lib.json","prepublishOnly":"npm test && npm run build:lib","build:playground":"tsc -p tsconfig.app.json && vite build --config vite.playground.config.ts"},"_npmUser":{"name":"cxde","email":"freezer314@gmail.com"},"repository":{"url":"git+https://github.com/DFreezer/wheel-of-fortune.git","type":"git"},"_npmVersion":"10.9.8","description":"Highly customizable and performant wheel of fortune component for React","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","react":"^19.2.3","react-dom":"^19.2.3","typescript":"^5.9.3","@types/react":"^19.2.8","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^5.1.1"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/wheel-of-fortune_0.1.2_1784748266381_0.8879225170604008","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@cxde/wheel-of-fortune","version":"0.1.3","keywords":["react","wheel-of-fortune","prize-wheel","roulette","spinner"],"license":"MIT","_id":"@cxde/wheel-of-fortune@0.1.3","maintainers":[{"name":"cxde","email":"freezer314@gmail.com"}],"homepage":"https://customizablewheel.netlify.app","bugs":{"url":"https://github.com/DFreezer/wheel-of-fortune/issues"},"dist":{"shasum":"93d452986d26c47a12fa51b939c383fc74c1923e","tarball":"https://registry.npmjs.org/@cxde/wheel-of-fortune/-/wheel-of-fortune-0.1.3.tgz","fileCount":21,"integrity":"sha512-jVgtg0kMeia70X+uXgzasvMFO2KLoRnT5mxzwUjNlGgzk+nvZzQJJu4Dekv6BlVZ3fe7OtvRpnZmcb1uq/4ZoA==","signatures":[{"sig":"MEYCIQCz3NUVuU+V0mjIU8WdxJ9nFhsK2IoT9BeDhgCyhOLkfgIhANbaELYc56XTHpGxSxcc6NGi15NOToyueBc4jpC/PUa5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100140},"main":"./dist/index.cjs","type":"module","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./style.css":"./dist/style.css"},"gitHead":"bb4b7ebb427d2af74dc2bc31ec77adb77b8ec1ea","scripts":{"dev":"vite","test":"node --test tests/*.test.ts","build":"npm run build:lib && npm run build:playground","preview":"vite preview","build:lib":"vite build && tsc -p tsconfig.lib.json","prepublishOnly":"npm test && npm run build:lib","build:playground":"tsc -p tsconfig.app.json && vite build --config vite.playground.config.ts"},"_npmUser":{"name":"cxde","email":"freezer314@gmail.com"},"repository":{"url":"git+https://github.com/DFreezer/wheel-of-fortune.git","type":"git"},"_npmVersion":"10.9.8","description":"Highly customizable and performant wheel of fortune component for React","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","react":"^19.2.3","react-dom":"^19.2.3","typescript":"^5.9.3","@types/react":"^19.2.8","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^5.1.1"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/wheel-of-fortune_0.1.3_1785259513542_0.18400126018964347","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@cxde/wheel-of-fortune","version":"0.1.4","keywords":["react","wheel-of-fortune","prize-wheel","roulette","spinner"],"license":"MIT","_id":"@cxde/wheel-of-fortune@0.1.4","maintainers":[{"name":"cxde","email":"freezer314@gmail.com"}],"homepage":"https://customizablewheel.netlify.app","bugs":{"url":"https://github.com/DFreezer/wheel-of-fortune/issues"},"dist":{"shasum":"9b43c891b06acc1de6e1a7ff411c66ae3e1434a7","tarball":"https://registry.npmjs.org/@cxde/wheel-of-fortune/-/wheel-of-fortune-0.1.4.tgz","fileCount":25,"integrity":"sha512-P0wYb+bvY3koXBYACnv4RiLSCF08KXU77lp2ZgkFZs0uOZm7n7wo+WaxdLClFWeqnMj36pcIoJN9UrMugQiUkw==","signatures":[{"sig":"MEYCIQDWb3CMMavjz06q/u2lw0ZPynXnzljjFdIvm/okmC2TnQIhAI31f/4OX+h97wK1UYS8IRYeRBrQaj/WtEiQx2qTL7W+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109865},"main":"./dist/index.cjs","type":"module","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./style.css":"./dist/style.css"},"gitHead":"dec2167f6061c03f918762b0b948e082981c3107","scripts":{"dev":"vite","test":"node --test tests/*.test.ts","build":"npm run build:lib && npm run build:playground","preview":"vite preview","build:lib":"vite build && tsc -p tsconfig.lib.json","prepublishOnly":"npm test && npm run build:lib","build:playground":"tsc -p tsconfig.app.json && vite build --config vite.playground.config.ts"},"_npmUser":{"name":"cxde","email":"freezer314@gmail.com"},"repository":{"url":"git+https://github.com/DFreezer/wheel-of-fortune.git","type":"git"},"_npmVersion":"10.9.8","description":"Highly customizable and performant wheel of fortune component for React","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","react":"^19.2.3","react-dom":"^19.2.3","typescript":"^5.9.3","@types/react":"^19.2.8","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^5.1.1"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/wheel-of-fortune_0.1.4_1785281402352_0.3237688821006093","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@cxde/wheel-of-fortune","version":"0.1.5","keywords":["react","wheel-of-fortune","prize-wheel","roulette","spinner"],"license":"MIT","_id":"@cxde/wheel-of-fortune@0.1.5","maintainers":[{"name":"cxde","email":"freezer314@gmail.com"}],"homepage":"https://customizablewheel.netlify.app","bugs":{"url":"https://github.com/DFreezer/wheel-of-fortune/issues"},"dist":{"shasum":"3f84c40c4ba4121805b3b85bc5ee6f29626c0ffc","tarball":"https://registry.npmjs.org/@cxde/wheel-of-fortune/-/wheel-of-fortune-0.1.5.tgz","fileCount":27,"integrity":"sha512-HpdXLYF8ZQFEpxWYWseBQ2ER8zIXka1xuzmPzclckA9psfRBTZuFLoVjQLVsRoCr3K3jQTnUyCSWMqIwCUaT0w==","signatures":[{"sig":"MEUCIHXFGhPWsYQmhTq1xtSKRoubl9BGO+sAUTJZ3JRKZ5QyAiEA9KEFP1GNl4ICQCIwAG13kOq8MS2ACWFO1G1zZk/MJvI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112534},"main":"./dist/index.cjs","type":"module","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./style.css":"./dist/style.css"},"gitHead":"64f78693b999443a1a16d152a11fa4f0015b33f0","scripts":{"dev":"vite","test":"node --test tests/*.test.ts","build":"npm run build:lib && npm run build:playground","preview":"vite preview","build:lib":"vite build && tsc -p tsconfig.lib.json","prepublishOnly":"npm test && npm run build:lib","build:playground":"tsc -p tsconfig.app.json && vite build --config vite.playground.config.ts"},"_npmUser":{"name":"cxde","email":"freezer314@gmail.com"},"repository":{"url":"git+https://github.com/DFreezer/wheel-of-fortune.git","type":"git"},"_npmVersion":"10.9.8","description":"Highly customizable and performant wheel of fortune component for React","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","react":"^19.2.3","react-dom":"^19.2.3","typescript":"^5.9.3","@types/react":"^19.2.8","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^5.1.1"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/wheel-of-fortune_0.1.5_1785348693250_0.024209502412727568","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@cxde/wheel-of-fortune","version":"0.1.6","keywords":["react","wheel-of-fortune","prize-wheel","roulette","spinner"],"license":"MIT","_id":"@cxde/wheel-of-fortune@0.1.6","maintainers":[{"name":"cxde","email":"freezer314@gmail.com"}],"homepage":"https://customizablewheel.netlify.app","bugs":{"url":"https://github.com/DFreezer/wheel-of-fortune/issues"},"dist":{"shasum":"08264e372c48062f299abd4f30c371f3714d9247","tarball":"https://registry.npmjs.org/@cxde/wheel-of-fortune/-/wheel-of-fortune-0.1.6.tgz","fileCount":29,"integrity":"sha512-p+PPu9iq8snM7sEJAH+2pHskS5zS16z1EmJLwG4oeTW7mF2u3Bm5h/WQkItiLe7Vu0cgDncaOoPSfXRDiHtCAQ==","signatures":[{"sig":"MEUCIQD7wt9NqVpqMKQ8wfcfWZTc+C8WxdxO23CBEiCIRBPNhgIgAiLp0DK5te3fkNlzYx/yyNxqs7qRBQ6yKQcL8HlgjTs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125769},"main":"./dist/index.cjs","type":"module","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./style.css":"./dist/style.css"},"gitHead":"1ca54ab490016a8506c5192357d45418a8d5f7b5","scripts":{"dev":"vite","test":"node --test tests/*.test.ts","build":"npm run build:lib && npm run build:playground","preview":"vite preview","build:lib":"vite build && tsc -p tsconfig.lib.json","prepublishOnly":"npm test && npm run build:lib","build:playground":"tsc -p tsconfig.app.json && vite build --config vite.playground.config.ts"},"_npmUser":{"name":"cxde","email":"freezer314@gmail.com"},"repository":{"url":"git+https://github.com/DFreezer/wheel-of-fortune.git","type":"git"},"_npmVersion":"10.9.8","description":"Highly customizable and performant wheel of fortune component for React","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","react":"^19.2.3","react-dom":"^19.2.3","typescript":"^5.9.3","@types/react":"^19.2.8","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^5.1.1"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/wheel-of-fortune_0.1.6_1785362687726_0.980870371747032","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@cxde/wheel-of-fortune","version":"0.1.7","keywords":["react","wheel-of-fortune","prize-wheel","roulette","spinner"],"license":"MIT","_id":"@cxde/wheel-of-fortune@0.1.7","maintainers":[{"name":"cxde","email":"freezer314@gmail.com"}],"homepage":"https://customizablewheel.netlify.app","bugs":{"url":"https://github.com/DFreezer/wheel-of-fortune/issues"},"dist":{"shasum":"a277be32209672c6ec892461f488ac8602816641","tarball":"https://registry.npmjs.org/@cxde/wheel-of-fortune/-/wheel-of-fortune-0.1.7.tgz","fileCount":29,"integrity":"sha512-J+R0OlNtWSwJFfrBPBQnej5HocGHYdgO74Vd5saUiYpBSVWagp89V25zOEfT8rsGonOGHFhCHTb5XfbHCvOppw==","signatures":[{"sig":"MEQCIGTqHoHptQ2VrhIJRTiWQ4PnT1t8KVu3yyeuouhwYJLfAiA3ipZtilWX5paUR+zyIhU90ybm6iqdRX4NaptzFMNkqw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125902},"main":"./dist/index.cjs","type":"module","types":"./dist/types/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./style.css":"./dist/style.css"},"gitHead":"4188b22f81271cae699d8870ec5aa29b06980697","scripts":{"dev":"vite","test":"node --test tests/*.test.ts","build":"npm run build:lib && npm run build:playground","preview":"vite preview","build:lib":"vite build && tsc -p tsconfig.lib.json","prepublishOnly":"npm test && npm run build:lib","build:playground":"tsc -p tsconfig.app.json && vite build --config vite.playground.config.ts"},"_npmUser":{"name":"cxde","email":"freezer314@gmail.com"},"repository":{"url":"git+https://github.com/DFreezer/wheel-of-fortune.git","type":"git"},"_npmVersion":"10.9.8","description":"Highly customizable and performant wheel of fortune component for React","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","react":"^19.2.3","react-dom":"^19.2.3","typescript":"^5.9.3","@types/react":"^19.2.8","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^5.1.1"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/wheel-of-fortune_0.1.7_1785422238499_0.06812172804264138","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@cxde/wheel-of-fortune","version":"0.1.8","type":"module","description":"Highly customizable and performant wheel of fortune component for React","license":"MIT","repository":{"type":"git","url":"git+https://github.com/DFreezer/wheel-of-fortune.git"},"homepage":"https://customizablewheel.netlify.app","bugs":{"url":"https://github.com/DFreezer/wheel-of-fortune/issues"},"engines":{"node":">=18"},"keywords":["react","wheel-of-fortune","prize-wheel","roulette","spinner"],"main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./style.css":"./dist/style.css"},"sideEffects":["**/*.css"],"publishConfig":{"access":"public"},"scripts":{"dev":"vite","build":"npm run build:lib && npm run build:playground","build:lib":"vite build && tsc -p tsconfig.lib.json","build:playground":"tsc -p tsconfig.app.json && vite build --config vite.playground.config.ts","test":"node --test tests/*.test.ts","preview":"vite preview","prepublishOnly":"npm test && npm run build:lib"},"peerDependencies":{"react":">=18","react-dom":">=18"},"devDependencies":{"@types/react":"^19.2.8","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^5.1.1","react":"^19.2.3","react-dom":"^19.2.3","typescript":"^5.9.3","vite":"^7.3.1"},"_id":"@cxde/wheel-of-fortune@0.1.8","gitHead":"2f374806af130e8ad5c14d625daf18ce656c39bf","_nodeVersion":"22.23.0","_npmVersion":"10.9.8","dist":{"integrity":"sha512-x1tdPAeSmtLwY3zus5EMHv713qzOPM5ABmXedZ8Tv+u/r5QlpAevQQ7RR+UjHv7YDyzj3o867rQI67B96AhqjA==","shasum":"0d21b6e122eaea627160f35c3124f44f39107e51","tarball":"https://registry.npmjs.org/@cxde/wheel-of-fortune/-/wheel-of-fortune-0.1.8.tgz","fileCount":29,"unpackedSize":128685,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD8eX13tXpy+CPcof3u32FsLkX+t+75psoraRdmmnNotQIgW/PNBoJpDvjtHUOSkdfzt/dFrhu97Irs9mY0QAk83I0="}]},"_npmUser":{"name":"cxde","email":"freezer314@gmail.com"},"directories":{},"maintainers":[{"name":"cxde","email":"freezer314@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/wheel-of-fortune_0.1.8_1786997214628_0.36160401467831016"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-21T21:38:17.243Z","modified":"2026-08-17T20:06:54.922Z","0.1.0":"2026-07-21T21:38:17.578Z","0.1.1":"2026-07-21T23:26:22.598Z","0.1.2":"2026-07-22T19:24:26.585Z","0.1.3":"2026-07-28T17:25:13.702Z","0.1.4":"2026-07-28T23:30:02.535Z","0.1.5":"2026-07-29T18:11:33.408Z","0.1.6":"2026-07-29T22:04:47.882Z","0.1.7":"2026-07-30T14:37:18.683Z","0.1.8":"2026-08-17T20:06:54.771Z"},"bugs":{"url":"https://github.com/DFreezer/wheel-of-fortune/issues"},"license":"MIT","homepage":"https://customizablewheel.netlify.app","keywords":["react","wheel-of-fortune","prize-wheel","roulette","spinner"],"repository":{"type":"git","url":"git+https://github.com/DFreezer/wheel-of-fortune.git"},"description":"Highly customizable and performant wheel of fortune component for React","maintainers":[{"name":"cxde","email":"freezer314@gmail.com"}],"readme":"# React Wheel of Fortune\n\n<p align=\"center\">\n  <img\n    src=\"https://raw.githubusercontent.com/DFreezer/wheel-of-fortune/main/src/assets/realistic-space/wheel.png\"\n    alt=\"Wheel of Fortune preview\"\n    width=\"520\"\n  />\n</p>\n\nA working MVP of a customizable wheel-of-fortune library for React, plus an interactive playground for exploring the API.\n\n## Live demo\n\nExplore the interactive playground at [customizablewheel.netlify.app](https://customizablewheel.netlify.app/).\n\n## Run the playground\n\n```bash\nnpm install\nnpm run dev\n```\n\nOpen the URL printed by Vite (usually `http://localhost:5173`). Run a production build with:\n\n```bash\nnpm run build\n```\n\n## Install the library\n\n```bash\nnpm install @cxde/wheel-of-fortune\n```\n\nImport the stylesheet once from your application entry point:\n\n```tsx\nimport '@cxde/wheel-of-fortune/style.css';\n```\n\nThe geometry and winner-selection checks run without an additional test runner:\n\n```bash\nnpm test\n```\n\n## Implemented features\n\n- sectors with arbitrary weights, colors, transparent image layers above the color, per-sector text styles, and optional normalized chance labels;\n- labels clipped to the sector wedge; long text uses an ellipsis by default, with `hide` and `shrink` alternatives;\n- configurable wheel borders, text strokes and shadows, and divider shadows;\n- client-side weighted selection using `crypto.getRandomValues`, server-side selection through `winnerId`, and an asynchronous `resolveWinner` with `AbortSignal`;\n- landing at the center or at a random point inside the winning sector with safe edge padding;\n- Web Animations API spin with a single rotating layer, no React render on every frame, custom CSS `easing`, duration, and rotation count;\n- CSS-backed pointer bounce, rate-limited sector-pass events, Web Audio tick playback, and pointer placement at the top or right (`pointerPosition`);\n- `overlay`, `center`, and `pointer` as `ReactNode`, supporting `<img>`, inline SVG, GIF, and `<video>`; `centerSize` controls the center slot size;\n- responsive sizing through `size`, including values such as `\"50%\"` inside a container;\n- `spin`/`tick`/`win` sounds from a URL or a local `File`/`Blob`, plus an optional `spinLoop` layer that plays for the full spin without replacing tick sounds;\n- a controlled `items` list: add and remove items by updating React state, with `crossfade`, Canvas LOD `collapse`, or no animation while idle;\n- optional idle animation (subtle tilt and pulse) on a compositor layer; the pointer reacts to sector-boundary crossings through the same bounce/tick event;\n- Canvas is the only wheel renderer; it caps DPR and hides labels/dividers that would no longer be readable;\n- geometric hit testing, hover, click, and controlled visual highlighting (`onSectorHover`, `onSectorClick`, `highlightedItemId`, `highlightStyle`);\n- a visually hidden semantic item list is emitted by default for assistive technology; set `accessibleItemList={false}` when the application provides its own external list;\n- `WheelMedia` for quickly connecting image/GIF/WebM content to `overlay`, `center`, and `pointer`;\n- `prefers-reduced-motion`: spin and transitions are shortened, and the winner is announced through a live region.\n\n## Minimal usage\n\n```tsx\nimport { useState } from 'react';\nimport { Wheel, useWheel, type WheelItem } from '@cxde/wheel-of-fortune';\nimport '@cxde/wheel-of-fortune/style.css';\n\nfunction PrizeWheel() {\n  const wheel = useWheel();\n  const [items, setItems] = useState<WheelItem[]>([\n    {\n      id: 'bonus', label: 'A super-long bonus for a new customer', weight: 70, color: '#7c3aed',\n      image: { src: '/sparkles.png', opacity: 0.55, fit: 'cover' },\n      text: { overflow: 'shrink-wrap', minFontSize: 1.8, maxLines: 2, innerRadius: 0.28, strokeColor: '#312e81', strokeWidth: 0.25 },\n    },\n    { id: 'gift', label: 'Gift', weight: 30, color: '#db2777' },\n  ]);\n\n  return (\n    <>\n      <Wheel\n        controller={wheel}\n        items={items}\n        size=\"100%\"\n        showProbability\n        itemsTransition={{ mode: 'collapse', duration: 360, easing: 'cubic-bezier(.22, 1, .36, 1)' }}\n        spinAnimation={{\n          duration: 4200,\n          rotations: { min: 5, max: 7 },\n          easing: 'cubic-bezier(.12, .82, .18, 1)',\n        }}\n        overlay={<img src=\"/frame.svg\" alt=\"\" />}\n        center={<img src=\"/logo.gif\" alt=\"\" />}\n        centerSize=\"32%\"\n        pointerPosition=\"right\"\n        idleAnimation={{ enabled: true, duration: 3200, rotation: 0.5, scale: 1.01 }}\n        onSpinEnd={({ winner }) => console.log(winner)}\n      />\n      <button onClick={() => wheel.spin({ mode: 'client' })}>Spin</button>\n      <button onClick={() => wheel.spin({ mode: 'server', winnerId: 'gift' })}>\n        Select the server-side gift\n      </button>\n    </>\n  );\n}\n```\n\n`sounds.spin` remains a one-shot start cue. Add `sounds.spinLoop` when a longer\nloop should run from the start of the wheel animation until it finishes or is\ncancelled; `sounds.tick` continues to play on sector boundaries independently:\n\n```tsx\n<Wheel\n  items={items}\n  sounds={{\n    enabled: true,\n    spin: '/sounds/spin-start.mp3',\n    spinLoop: '/sounds/spinning-loop.mp3',\n    tick: '/sounds/tick.mp3',\n    win: '/sounds/win.mp3',\n    volume: 0.45,\n  }}\n  controller={wheel}\n/>\n```\n\nFor labels that can be longer than their sectors, use `overflow: 'shrink-wrap'`.\nIt wraps at word boundaries; an unbreakable word or text beyond `maxLines` is\ntruncated with an ellipsis. It reduces text only when the resulting lines do\nnot fit vertically, only as far as `minFontSize` (both defaults are 55% of\n`fontSize` and two lines).\nSet `innerRadius` (0–1) to reserve space from the wheel centre, such as for a\nlarge centre element; text is fitted and clipped outside that inner boundary.\n\n## Debug layout guides\n\nPass `debug` to inspect the Canvas geometry while configuring a wheel:\n\n```tsx\n<Wheel items={items} debug />\n```\n\nThe cyan guides show each sector's radial axis and configured text `radius`;\npink arcs show `innerRadius`; yellow rectangles show the available text area\nafter `orientation`, `align`, `maxWidth`, and offsets are applied. Debug mode is\nvisual only and does not change hit testing, probabilities, or spin results.\n\n## Asynchronous server result\n\nUse `resolveWinner` when the authoritative result should be requested immediately after the user clicks. While the promise is pending, `getState()` returns `status: 'resolving'`; item updates are deferred and `cancel()` propagates through `AbortSignal`.\n\n```tsx\nawait wheel.spin({\n  mode: 'server',\n  resolveWinner: async ({ signal }) => {\n    const response = await fetch('/api/spins', { method: 'POST', signal });\n    const { winnerId } = await response.json();\n    return { winnerId, landing: { mode: 'random', edgePadding: 0.15 } };\n  },\n});\n```\n\nFor dense wheels, Canvas exposes the same geometric sector events. `highlightedItemId` provides controlled highlighting without relying on individual DOM nodes:\n\n```tsx\n<Wheel\n  items={items}\n  highlightedItemId={hoveredId}\n  onSectorHover={(sector) => setHoveredId(sector?.item.id)}\n  onSectorClick={({ item }) => setServerWinnerId(item.id)}\n/>\n```\n\nDetailed architectural decisions and future work are documented in [ARCHITECTURE.md](./ARCHITECTURE.md).\n\nCanvas `collapse` follows a level-of-detail policy without affecting weights or winner selection: 1–50 sectors redraw the full wheel at up to 60 FPS; 51–150 redraw fills, simple dividers and border at up to 30 FPS; 151+ sectors crossfade two prepared Canvas bitmaps.\n\n`highlightStyle` controls the controlled highlight layer without redrawing the base wheel:\n\n```tsx\n<Wheel\n  items={items}\n  highlightedItemId={hoveredId}\n  highlightStyle={{ color: '#fef08a', opacity: 0.28, blendMode: 'screen' }}\n/>\n```\n\nFor repeatable local performance checks, run the app and open [`/benchmark.html`](http://127.0.0.1:5173/benchmark.html). See [BENCHMARKS.md](./BENCHMARKS.md) for the scenarios and measurement rules.\nOpen [`/visual-fixtures.html`](http://127.0.0.1:5173/visual-fixtures.html) to inspect the supported Canvas customisation matrix before updating visual snapshots.\n\nThe sector image (`WheelItem.image`) is always rendered **above** its `color` and clipped to the sector wedge. Transparent PNG/GIF pixels therefore leave the sector color visible. The object form also accepts `opacity` and `fit`: `'cover' | 'contain' | 'stretch'`. `scale` (default `1`) scales the layer from the wheel center: values below `1` zoom out and values above `1` zoom in. `rotation` rotates the image around the center in degrees, while `offsetX` and `offsetY` move it horizontally and vertically in wheel coordinates from `0` to `100` (positive values move right and down).\n\n## Current limitations\n\n- Hover and click are geometric; applications that need full keyboard navigation for hundreds of sectors should provide an external prize list.\n- For valuable prizes, the server should remain the source of truth: client-side mode selects locally for UI-only experiences.\n","readmeFilename":"README.md"}