On resume, shift all existing arrow targetTimes forward by the
pause duration so they don't immediately register as misses.
Track pause timestamp to compute the exact offset.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Shows a small button in the bottom-right corner on all screens.
Listens to fullscreenchange events and hides when already fullscreen.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Score: move to bottom center above progress bar, remove key-based
remounting that caused layout shifts. Delta now fades in place.
Progress bar: magenta gradient bar at the very bottom showing song
progress via onProgress callback from ArrowGame.
Pause: decouple audio lifecycle from active prop so pausing doesn't
reset the song. Audio pauses/resumes cleanly with timing preserved.
Auto-pause: once game has started, show "I lost track of you" when
calibration pauses instead of the calibration overlay. Suppresses
"ARMS OUT" text during gameplay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Consider store results valid when a song is selected, not just when
score > 0. Prevents fallback to DEFAULT_SCORE on early finish.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Show 'ENABLE CAMERA' button first with a hint explaining why. After
permission is granted, webcam shows as background and fullscreen/
windowed buttons appear. If denied, show error with retry option.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Embed the camera stream into the page as a low-opacity mirrored
background. This makes the permission prompt feel integrated rather
than a random browser popup. Stream is cleaned up on unmount.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Prompt for webcam access early so the permission dialog appears
before the user reaches the game. Stream is immediately stopped
after permission is granted.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Keep our real game engine, score HUD, and viewport-fit layouts.
Incorporate main's sound effects (playSound) and dvh units. Add
sound effects to pause menu buttons.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Use height: 100vh with overflow hidden. Add max-height: 820px media
query to shrink carousel cards, info bar, and header when the
viewport is short (windowed/non-fullscreen).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove fixed width/height attributes, duplicate rect, and class.
Let CSS control dimensions via viewBox only.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add Biggest Little Hackathon 2026 branding, UNR logo, and all five
sponsor logos (Bently Nevada, Microsoft, Ridgeline, Coffee n Comics,
Type III). Logos shown in grayscale with hover-to-color effect.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
GamePage redirects if no song is selected. EndOfGamePage redirects
if no song and no score prop. Prevents broken state from direct URL
access or page refresh.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ArrowGame: use ref for onSongEnd to avoid unstable deps causing the
audio effect to re-run and lose songStartRef. Reset arrows, combo,
and spawn index when the game starts. Log audio play failures instead
of swallowing them.
GestureOverlay: only show 'arms-out' label during calibration, not
step labels which are confusing before the game starts.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Score text pulses (scale 1.3→1) on each point gain. A +delta floater
appears at a random offset near the score and fades upward over 0.8s.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Display current score in top-left during gameplay. Scoring now uses
combo multiplier: base points (1000 perfect, 500 good) scaled by
1 + min(combo, 30) / 10, giving up to 4x at 30+ combo. Miss resets
combo and awards no points.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Pause menu now has Continue, Finish Early (goes to end-of-game with
current score), and Main Menu. Framing text uses sentence case.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Bigger font (44px, weight 900), white with magenta glow. Reword
framing message to 'YOUR WHOLE BODY SHOULD BE VISIBLE ON SCREEN'.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Pause menu with Continue/Main Menu, triggered by Esc key or pause
button in top-right. Game pauses ArrowGame while menu is open.
Restyle calibration status text to sit above the red framing line
using the arcade display font with magenta color and text shadow,
matching the visual style of other screens.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add drawMode option to usePoseLoop. Game page uses 'toes-only' to
show just landmarks 31/32 as bright cyan dots. Debug app keeps the
full skeleton by default.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace placeholder GamePage with full webcam + pose detection +
ArrowGame. Loads SSC chart for the selected song, runs pose loop
for step detection, tracks judgments in the store, and navigates
to end-of-game when the song finishes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
After hovering on a song for 2 seconds, fade in playback from 0:30.
When switching songs, fade out the current preview and start the
delay timer for the new one. Cleans up on unmount.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Layer bg.png behind the color overlay on the song info bar using a
CSS pseudo-element. Also make difficulty dots white/dark like the
song cards for better readability.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Anchor artist text just above the BPM row so layout stays stable
regardless of title length. Long artist names get ellipsis truncation.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Display bn.png as a header across the top of each song card,
full-bleed into the card padding with object-fit cover.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy bg.png (1280x720 background), bn.png (512x160 banner), and
cdtitle.png (100x50 logo) for all 20 songs. Add bgUrl and bannerUrl
fields to Song type and data so they're available for UI use.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Use white for filled dots and dark overlay for empty dots instead of
lightened song color, which was hard to distinguish from the card bg.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Unify Song type to include id, chartUrl, audioUrl alongside display
fields. Replace 8 placeholder songs with all 20 real StepMania songs
(artist, BPM, duration from SSC/audio files). Get Lucky is first.
songIndex.ts now re-exports from the canonical song-data source.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>