WHEEL OF BLAME — CHANGELOG https://wheelofblame.app ================================================================================ v2.0.0 — 2026-06-09 ================================================================================ + Three visual themes: Corporate Hellscape, Crimson Court, Toxic Sludge + Theme switcher in header with smooth transitions + Compressed URL state: roster encoded as [[name,blame],...] array-of-arrays (legacy {id,name,blame} object format still decoded for backward compatibility) + Smart Web Share API: native share sheet on mobile, clipboard fallback on desktop + Share This Verdict button: copies formatted ironic result snippet for Slack/Discord + Verdict includes winner name, probability %, blame points, ironic quote, and URL + cancelAnimationFrame cleanup on unmount to prevent memory leaks + React.memo on WheelSVG — skips re-renders during rAF spin loop + useMemo on slice trig calculations — only recomputes when roster changes + winnerColor derived as separate useMemo, WinnerModal fully decoupled + Inverted probability: weight = 1/blame_points (MORE blame = SMALLER slice) + alignmentDelta formula: (360 - (offset + targetMid) % 360) % 360 Fixes pointer misalignment bug from double-applying extraSpins ================================================================================ v1.0.0 — 2026-06-01 ================================================================================ + Initial release + SVG wheel with 6 dynamic weighted slices + Blame point tracking per member + URL hash state encoding (base64 JSON) + Winner modal with ironic messages + Roster management: add, remove, adjust blame ±1 + Reset all blame to 1 + Responsive two-column desktop layout + Full ARIA accessibility labels + data-ai-manifest on root element + FAQ accordion with structured data + TextEncoder/TextDecoder for Unicode-safe URL encoding