docs(ui): define web application visual style requirements

This commit is contained in:
2026-09-03 22:06:45 +03:00
parent 9c274800b5
commit 8ffd6dabcf
5 changed files with 222 additions and 10 deletions
+6 -2
View File
@@ -12,8 +12,10 @@ This directory is a local mirror of the ChatGPT project “maze32”.
### Language ### Language
- Write all canonical documentation in English. - Write all canonical documentation in English.
- Write source comments, test names, protocol identifiers, log messages, and - Write source comments, test names, protocol identifiers, and system log
user-facing diagnostic text in English. messages in English.
- Write all player-facing browser UI copy, game messages, and user-visible
browser errors in Russian.
### Canonical documents ### Canonical documents
@@ -22,6 +24,8 @@ This directory is a local mirror of the ChatGPT project “maze32”.
- `PLANS.md` defines the current implementation milestone and its evidence. - `PLANS.md` defines the current implementation milestone and its evidence.
- `docs/BOARD_PASSPORT.md` defines confirmed hardware facts and explicit - `docs/BOARD_PASSPORT.md` defines confirmed hardware facts and explicit
unknowns. unknowns.
- `docs/UI_STYLE.md` defines the canonical browser visual language, responsive
layout, controls, and presentation behavior.
- Files under `sources/` remain read-only references and are never canonical - Files under `sources/` remain read-only references and are never canonical
implementation files. implementation files.
+11
View File
@@ -320,6 +320,17 @@ drop-key action. The UI renders only server-provided visible state. The observer
view supports fitting, panning, or zooming the complete `128 x 64` map without view supports fitting, panning, or zooming the complete `128 x 64` map without
changing server authority. changing server authority.
`docs/UI_STYLE.md` is the canonical browser presentation contract. The player
layout supports a minimum `412 x 916` CSS-pixel viewport. Observer mode requires
at least `1024 x 768` CSS pixels and presents a large-screen requirement message
below that threshold. Responsive layout changes presentation only; they never
change projection content, command validation, or server authority.
All application assets are local and precompressed. Browser startup and play
must not depend on internet access, third-party CSS, remote fonts, icons,
analytics, or content services. The complete compressed web payload is limited
to 1.5 MiB within the unchanged 1,984 KiB LittleFS partition.
A temporary session token is stored in browser-local storage so page refresh A temporary session token is stored in browser-local storage so page refresh
can reattach to the existing slot. It is not a permanent account credential and can reattach to the existing slot. It is not a permanent account credential and
does not need to survive an ESP reboot. does not need to survive an ESP reboot.
+36 -4
View File
@@ -215,7 +215,34 @@ Browser controls must support:
- If the player does not reconnect within 60 seconds, the match ends in a draw. - If the player does not reconnect within 60 seconds, the match ends in a draw.
- Reloading a page is treated as a reconnect, not as leaving the match. - Reloading a page is treated as a reconnect, not as leaving the match.
## 11. Technical constraints ## 11. Browser presentation
- The browser UI uses one dark, humorous retro arcade visual language across
provisioning, lobby, player, and observer modes, as defined in
`docs/UI_STYLE.md`.
- All player-facing UI copy, game messages, and browser errors are in Russian.
- The UI uses a near-black background, purple panels, turquoise interactive
accents, blue for Player 1, pink for Player 2, and plant-like green maze
walls. Important state is distinguished by icons, labels, outlines, or
shapes in addition to color.
- The player map consumes all space not required by fixed status and control
panels. The player view supports a minimum `412 x 916` CSS-pixel viewport
without page scrolling.
- Computers support keyboard movement and on-screen arcade controls. Tablets
support swipes and on-screen controls. Phones use directional swipes without
on-screen directional buttons.
- An always-visible `OK` control with a key icon drops the carried key without
confirmation and exposes the Russian accessible label `Сбросить ключ`.
- Observer mode requires at least a `1024 x 768` CSS-pixel viewport, initially
fits the complete map, and supports zoom and pan. Smaller viewports show a
Russian large-screen requirement message.
- Sound and vibration are enabled by default after the first user interaction
when the browser and device support them.
- The application has no runtime internet dependency. It uses local assets,
locally authored SVG icons, plain CSS, and a system monospace font styled to
resemble a pixel font.
## 12. Technical constraints
- Target: ESP32-C6FH4, 4 MB Flash, no required PSRAM. - Target: ESP32-C6FH4, 4 MB Flash, no required PSRAM.
- Build: PlatformIO, `espressif32@7.0.1`, ESP-IDF, compatible - Build: PlatformIO, `espressif32@7.0.1`, ESP-IDF, compatible
@@ -224,6 +251,8 @@ Browser controls must support:
MVP. MVP.
- Static browser assets reside in LittleFS and should be compressed for the - Static browser assets reside in LittleFS and should be compressed for the
production image. production image.
- The complete compressed web payload must not exceed 1.5 MiB and must fit the
unchanged 1,984 KiB LittleFS partition.
- HTTP serves the application and provisioning pages; WebSocket carries live - HTTP serves the application and provisioning pages; WebSocket carries live
lobby, control, and match messages. lobby, control, and match messages.
- The initial LwIP socket limit is 16. - The initial LwIP socket limit is 16.
@@ -232,7 +261,7 @@ Browser controls must support:
- Active lobby and match state may live in RAM and need not survive an ESP - Active lobby and match state may live in RAM and need not survive an ESP
reboot. Wi-Fi settings must survive reboot. reboot. Wi-Fi settings must survive reboot.
## 12. MVP acceptance criteria ## 13. MVP acceptance criteria
The MVP is accepted when all of the following are demonstrated on the target The MVP is accepted when all of the following are demonstrated on the target
board: board:
@@ -263,8 +292,12 @@ board:
60-second reconnect timeout ends it as a draw. 60-second reconnect timeout ends it as a draw.
12. A representative match normally completes in approximately five minutes 12. A representative match normally completes in approximately five minutes
after balance tuning, without imposing a hard match timer. after balance tuning, without imposing a hard match timer.
13. The Russian retro arcade UI follows `docs/UI_STYLE.md`, works at the
required player and observer viewport sizes in the current stable Chrome,
Safari, Firefox, and Edge releases, requires no runtime internet access,
and stays within the 1.5 MiB compressed web-asset budget.
## 13. Explicitly outside MVP ## 14. Explicitly outside MVP
- More than two active players or more than one concurrent match. - More than two active players or more than one concurrent match.
- More than four observers. - More than four observers.
@@ -277,4 +310,3 @@ board:
- Persistent match recovery after ESP reboot. - Persistent match recovery after ESP reboot.
- OTA firmware partitions and OTA update flow. - OTA firmware partitions and OTA update flow.
- Dependence on PSRAM, an unverified LED, or an assumed board pinout. - Dependence on PSRAM, an unverified LED, or an assumed board pinout.
+24 -4
View File
@@ -23,8 +23,10 @@
not yet available. Expected evidence may be listed in advance. not yet available. Expected evidence may be listed in advance.
11. If later work invalidates recorded evidence, reopen the affected milestone 11. If later work invalidates recorded evidence, reopen the affected milestone
and change its status before continuing. and change its status before continuing.
12. All project documentation, milestone text, source comments, test names, and 12. All project documentation, milestone text, source comments, test names,
user-facing diagnostic messages are written in English. protocol identifiers, and system log messages are written in English.
Player-facing browser UI copy, game messages, and browser errors are
written in Russian.
## Milestone 001 — Requirements and technical baseline ## Milestone 001 — Requirements and technical baseline
@@ -397,15 +399,20 @@ into the browser.
### Scope ### Scope
- Name selection, lobby, countdown, running, paused, and result screens. - Name selection, lobby, countdown, running, paused, and result screens.
- Dark, humorous retro arcade presentation following `docs/UI_STYLE.md`.
- Russian player-facing copy and locally served pixel-styled graphics.
- Maze viewport and visual landmarks. - Maze viewport and visual landmarks.
- Keyboard movement and touchscreen swipes. - Keyboard movement, touchscreen swipes, and responsive on-screen arcade
controls.
- Accessible drop-key action. - Accessible drop-key action.
- Inventory, vision duration, compass hint, connection, and error feedback. - Inventory, vision duration, compass hint, connection, and error feedback.
- Default sound, supported-device vibration, and animated game feedback.
- Session restoration after page refresh. - Session restoration after page refresh.
### Deliverables ### Deliverables
- Responsive browser application and compressed production assets. - Responsive browser application and compressed production assets.
- Implemented visual tokens, SVG icon set, and shared control styles.
- Browser interaction tests for desktop and mobile input. - Browser interaction tests for desktop and mobile input.
- Accessibility and viewport behavior checks. - Accessibility and viewport behavior checks.
@@ -416,7 +423,17 @@ into the browser.
3. Hidden and previously seen cells are not retained on screen. 3. Hidden and previously seen cells are not retained on screen.
4. Inventory, effects, hints, pause, and results are unambiguous. 4. Inventory, effects, hints, pause, and results are unambiguous.
5. Refresh restores the active player without changing position or inventory. 5. Refresh restores the active player without changing position or inventory.
6. The production asset image fits its LittleFS partition. 6. The player flow remains usable without page scrolling at a `412 x 916`
CSS-pixel viewport and at representative tablet and desktop viewports.
7. Player-facing UI copy and browser errors are in Russian while protocol and
system-log text remain in English.
8. The application requires no runtime internet access or third-party UI
dependency.
9. The complete compressed web payload is no larger than 1.5 MiB and fits the
unchanged LittleFS partition.
10. The current stable Chrome, Safari, Firefox, and Edge releases pass the
applicable browser interaction checks, with versions and test date
recorded in the milestone evidence.
### Evidence ### Evidence
@@ -436,6 +453,7 @@ and reconnect behavior.
### Scope ### Scope
- Full-map observer rendering with player and object updates. - Full-map observer rendering with player and object updates.
- Large-screen observer layout with initial full-map fit, zoom, and pan.
- Observer access without a password and strict read-only authorization. - Observer access without a password and strict read-only authorization.
- Player disconnect detection and authoritative pause. - Player disconnect detection and authoritative pause.
- Session reattachment and 60-second monotonic deadline. - Session reattachment and 60-second monotonic deadline.
@@ -455,6 +473,8 @@ and reconnect behavior.
4. Reconnection within 60 seconds restores and resumes the same state. 4. Reconnection within 60 seconds restores and resumes the same state.
5. Reconnection timeout ends the match in a draw. 5. Reconnection timeout ends the match in a draw.
6. Observer attempts to send mutation commands are rejected and audited. 6. Observer attempts to send mutation commands are rejected and audited.
7. Observer mode works at `1024 x 768` CSS pixels and larger, while smaller
viewports show the required Russian large-screen message.
### Evidence ### Evidence
+145
View File
@@ -0,0 +1,145 @@
# Browser UI style
## 1. Purpose
This document defines the canonical visual language, controls, responsive
layout, and presentation behavior for every maze32 browser mode. Product rules
remain in `MVP.md`, and browser authority boundaries remain in
`ARCHITECTURE.md`.
## 2. Visual direction and tone
- Use a dark retro arcade-game style throughout network provisioning, name
selection, lobby, player, and observer modes.
- Use humorous copy, imagery, animation, object names, and suggested player
names wherever the game remains clear and usable.
- Humor must be understandable to children, non-offensive, and based on
internet humor that is current when the release is designed. Runtime access
to external meme or content services is forbidden.
- Use only a dark theme. A light theme is outside the MVP.
- Use small SVG icons, pixel-art graphics, or graphics styled to resemble
pixel art. Locally authored icons must not require an external icon library.
- Use a system monospace font stack with CSS pixel-style treatment. The UI must
not download Google Fonts or any other external font at runtime.
## 3. Color system
The exact color values may be tuned during implementation, but their semantic
roles must remain stable:
- black or near-black for the application and map background;
- purple for panels and elevated surfaces;
- turquoise for interactive accents;
- blue for Player 1 and pink for Player 2 across every screen, map object, and
message;
- green for success, yellow for warnings, red for errors, blue for pause, and
orange for disconnection;
- green vegetation, bushes, and plants for maze walls.
When two semantic roles use related colors, icons, labels, outlines, or shapes
must keep them unambiguous. Important player and object information must not be
communicated by color alone. Key objects use an additional label, outline, or
marker.
WCAG AA contrast certification and dedicated color-vision-deficiency palettes
are not MVP requirements.
## 4. Animation, sound, and haptics
- Use frequent but purposeful animation for screen transitions, movement,
pickups, game events, and humorous feedback.
- Pending controls blink until their command is resolved.
- A reduced-motion mode is not required for the MVP.
- Sound and vibration are enabled by default. They begin only after the first
user interaction when required by the browser, and are used only when the
browser and device support them.
- Dedicated sound and vibration toggles are not required for the MVP.
## 5. Shared controls
- Controls use a retro arcade appearance with clear normal, hover, pressed,
disabled, and pending states.
- Visible keyboard-focus outlines are not required for the MVP.
- On computers, movement works from the keyboard and from an on-screen
directional control cluster fixed in the lower-right corner.
- On tablets, an on-screen directional control cluster is fixed in the
lower-right corner for right-handed use. Touch swipes remain supported.
- On phones, movement uses directional swipes and no on-screen directional
buttons are shown.
- The always-visible key-drop control is labelled `OK`, includes a key icon,
and is positioned closer to the upper edge of the screen than the
directional controls. Dropping does not require confirmation.
- The key-drop control has the Russian accessible label `Сбросить ключ`.
## 6. Shared layout
- The map fills all viewport space not required by fixed status and control
panels. The player match screen must not require page scrolling.
- A fixed status panel occupies the top of the screen.
- The persistent player status shows the player name, carried key when one is
held, active vision effect, and match state.
- Connection details and the Wi-Fi settings link belong in a secondary panel,
not in the persistent status row.
- Countdown, pause, and result states appear as modal overlays above the map.
- Errors and rejected actions appear as contextual tooltips or notices near
the relevant control or status area.
- The lobby uses separate blocks for players, observers, and match actions.
- Network provisioning uses the same colors, type, controls, and humor as the
game application.
## 7. Player map presentation
- Keep the player near the center of the map viewport except where maze
boundaries prevent it.
- Render unknown space as a solid background. Never infer, retain, animate, or
decorate maze geometry outside the server-provided visible projection.
- Use a nominal cell size of 20 CSS pixels on phones and 40 CSS pixels on
tablets and computers. Minor adjustment is allowed to fit browser chrome and
safe areas without making the map unusable.
- Player zoom and pan controls are not part of the MVP.
- Use different colors plus labels, outlines, shapes, or icons to distinguish
player ownership and object types.
- Give immediate visual feedback when movement is rejected by a wall without
revealing hidden state.
## 8. Responsive behavior
- The minimum supported player viewport is `412 x 916` CSS pixels.
- Support both portrait and landscape orientations. Suggest landscape when it
materially improves play, but do not block portrait play.
- Respect display safe areas and keep essential status and controls visible.
- Scale icons and controls up on tablets and computers while preserving map
priority and fixed panel placement.
- Validate the MVP against the current stable releases of Chrome, Safari,
Firefox, and Edge available at the time of validation. Record the tested
browser versions and date; legacy browser support is outside the MVP.
## 9. Observer presentation
- Observer mode is supported only at viewports of at least `1024 x 768` CSS
pixels. Smaller viewports show a Russian message explaining that a larger
screen is required.
- Place player and match status blocks above the full maze.
- Initially fit the complete `128 x 64` map into the available map area.
- Provide zoom and pan without granting any gameplay control or changing
server authority.
## 10. Asset and dependency budget
- Use plain project CSS without a third-party CSS framework.
- All runtime web assets must be served locally from the ESP. The UI must not
require internet access, remote fonts, external icons, analytics, or content
services.
- Precompress production web assets. Their complete compressed payload must
not exceed 1.5 MiB and must fit the existing 1,984 KiB LittleFS partition.
- The LittleFS partition size and Flash layout remain unchanged.
## 11. Visual verification
- Verify player layout at the minimum `412 x 916` viewport and representative
tablet and desktop viewports.
- Verify observer layout at `1024 x 768` and at a larger desktop viewport.
- Verify every control state, modal state, responsive transition, Russian
message, and semantic color role manually and through focused browser tests
where practical.
- Golden-image or screenshot-regression tests are not required for the MVP.