From 3827ba7ec7b8f75e64c8ad591c1ae2f2a2933dd5 Mon Sep 17 00:00:00 2001 From: sasa Date: Wed, 9 Sep 2026 20:56:38 +0300 Subject: [PATCH] feat(player-ui): add pre-reader controls and onboarding --- PLANS.md | 53 ++++++--- data/index.html.gz | Bin 2962 -> 3356 bytes docs/PRE_READER_USABILITY.md | 38 +++++++ docs/UI_STYLE.md | 47 ++++++-- test/web/test_player_app.js | 56 ++++++++++ web/icons.svg | 6 ++ web/index.html | 15 ++- web/player.css | 59 +++++++--- web/player.js | 202 ++++++++++++++++++++++++++++++++--- 9 files changed, 424 insertions(+), 52 deletions(-) create mode 100644 docs/PRE_READER_USABILITY.md diff --git a/PLANS.md b/PLANS.md index c4cdd6f..89ab2ba 100644 --- a/PLANS.md +++ b/PLANS.md @@ -1267,7 +1267,7 @@ confirmation remains pending. ## Milestone 015 — Pre-reader child-friendly game experience -**Status:** `NOT_STARTED` +**Status:** `IN_PROGRESS` ### Objective @@ -1363,15 +1363,42 @@ rules. ### Evidence -Completion evidence is not yet available because implementation has not -started. A baseline inspection of the live game at a `412 x 915` viewport on -2026-09-08 found that the visible maze occupied only `80 x 140` pixels inside a -`381 x 729` play area, status labels were approximately `8--10.56` pixels, -status icons were `23 x 23` pixels, the player was identified primarily as -`P1`, and no directional touch controls were visible in the game area. These -observations define the principal redesign targets. The planned joystick -replaces directional-arrow buttons rather than adding them. Expected completion -evidence includes before-and-after viewport captures, deterministic browser -tests, `bash scripts/run_host_tests.sh`, a reproducible `buildfs` size report, -and the facilitated child-usability confirmation or an explicitly approved -deviation. +The implementation and automated verification are complete; the required +representative pre-reader observation or owner-approved evidence deviation +remains pending. + +- The player screen now uses circle and diamond character shapes instead of + `P1`/`P2`, icon-and-shape ownership markers for keys and exits, dynamic + projection sizing from 32 to 72 CSS pixels per cell, a 180 CSS-pixel + joystick (172 on phones), and an icon-only visible mute, reduced-motion, and + onboarding-replay control group. The mobile directional-button cluster stays + hidden while keyboard and swipe input remain available. +- The joystick clamps its handle to the circular base, has a 20-pixel dead + zone and 18% axis hysteresis, emits only cardinal movement intentions, and + schedules repeats from 360 to 170 ms. It resets on pointer release or + cancellation, pause, disconnect, browser blur, and hidden-document events; + the fastest local repeat remains above the 150 ms authoritative cooldown. +- First active player projection now opens an eight-step, icon-first Russian + walkthrough for drag, release, walls, key, vision, compass, exit, and the + other player. It can be replayed or skipped locally. The new + `docs/PRE_READER_USABILITY.md` records the final privacy-safe observation + protocol without collecting child-identifying data. +- On 2026-09-09, `bash scripts/run_host_tests.sh` passed every host suite, + including 15 browser tests. The focused browser coverage verifies joystick + cardinal direction and bounded travel, dead zone, monotonic repeat rate, + hysteresis, dynamic mobile cell sizing, onboarding bounds, reset paths, + mute and reduced-motion controls, local assets, Russian UI, and existing + protocol/observer constraints. Web asset reproducibility reported SHA-256 + `13f95418169fb38d277d86f3324a4dbc3fa8b5e5e2e9fb7bde9439aa2f7b75e4` + using 23,950 of 1,572,864 allowed compressed bytes. +- On 2026-09-09, `pio run -e esp32-c6-devkitm-1` passed with 58,868 of + 327,680 RAM bytes and 1,027,934 of 2,097,152 application bytes. Its + `firmware.bin` SHA-256 was + `87cfffaaa9b119794707c9caedc3da7f3f015d540fc1149d74e7cc0a1ecd2841`. + `pio run -e esp32-c6-devkitm-1 --target buildfs` passed; the fixed LittleFS + image used 2,031,616 of 2,031,616 bytes and SHA-256 + `ea6813e603d883a1f6b79a9f9efbd20e7d02f010052210716a89d7e863716415`. +- Acceptance criterion 11 still requires the facilitated representative + pre-reader observation from `docs/PRE_READER_USABILITY.md`, or a + project-owner-approved documented deviation. Therefore Milestone 015 remains + `IN_PROGRESS`; Milestone 016 has not been started. diff --git a/data/index.html.gz b/data/index.html.gz index d07cf3a29933e38f503d8a532729e438c6e32739..b0805d7078e44ee6b0860a67ed181b107ca0add7 100644 GIT binary patch literal 3356 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 literal 2962 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