SpinPage
A theatrical spinning wheel for draft orders, giveaways and any choice that deserves a show.

The idea
Random pickers are usually joyless form controls. The drama is the point: a decision feels fairer when you watch it land.
What I built
Version 2.0 puts the whole game on one screen that never scrolls, from a 320 px phone to a 4K monitor: the wheel, a live scoreboard and a draft board that fills seat by seat. Around it sit hand-flick spinning, synthesised sound, a gremlin that fakes the stop, and a PANIC slice that throws the table into a horse race or a row of slot machines. A Chaos slider sets how often the twists turn up.
The interesting part
The stunts never touch the odds. Every spin draws its winner before the wheel moves, and flicks, wind-backs and the gremlin only change the route it takes to get there. Flick it by hand and you set the speed, never the result. It is still plain HTML, CSS and JavaScript: no framework, no dependencies and no build step.
Decisions
The draw comes first
Every spin draws its winner, weighted by slice size, before the wheel moves a degree. Power-ups that do change the odds say so on screen, down to the percentage. The one exception, Rigged, has to be switched on by hand and switches itself off on reload.
Odds that lean away from repeats
A twist that has just happened gets rarer for a while, and once a draft has taken more spins than it has names, the twists that undo picks ease off. Nothing is forced and nothing switches off. A balance test plays thousands of drafts: at Normal, twenty names now take about 30 spins, where they used to average 58 and could run past 300.
One screen, checked at fourteen sizes
The wheel, the SPIN button and the live numbers are always on screen together, in four layouts from phone to desktop. A layout test fails if anything scrolls or falls off screen at any of 14 viewports from 320 × 568 to 1920 × 1080.
The same race at 60 Hz and 120 Hz
The PANIC games run at a fixed 60 steps a second, so a 120 Hz phone plays the same race as a 60 Hz monitor. Skip ignores presses for its first second, so the key that spun the wheel cannot skip the game it started.
Classic scripts, on purpose
The single file became a stylesheet and nine plain scripts rather than modules, so the page still opens straight from disk. Every change goes through one commit() that saves once and redraws everything from state, so no panel can show stale numbers.