UX-13 P3: Simple view and Batteries screen
checks / unit (pull_request) Successful in 11m9s
infra-pin / fresh (pull_request) Successful in 2s

- Batteries: one card per battery with On/Off, the mode list (cheap hours
  and selling greyed out until OPT-11 P3), level, and Now / Today / Why
  lines built in homeview.py. Replaces the OPT-11 P1 minimal cards and uses
  the existing pack_use / pack_mode actions and store keys.
- An Off battery the peak limit still needs says so with its figure; no line
  shows 0 W beside moving power (OPT-11 P1 test F2). Today says "Not planned
  yet" until OPT-11 P3/P4.
- Home's plan leaves Off batteries out, except for the peak limit.
- Settings opens on Simple: the layout's simple fields with an applies chip
  and a note, plus the battery switches and modes. Installer is one tap.
- English and Dutch words in app/ui_text; test_batteries_screen.py; browser
  check tools/ux13_browser_check.py (CHECK=1 ux13_screenshots.sh); new and
  changed screenshots only.

No control, allocator, arbiter or command module changed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UBtqPrG1mDLXzTEBnhEkkV
This commit is contained in:
Claude
2026-09-28 22:39:43 +02:00
parent ed739d4cdb
commit 2d2b6afb07
26 changed files with 1119 additions and 89 deletions
+18 -4
View File
@@ -6,8 +6,8 @@ error, so a broken screen is never pictured.
python3 ux13_screenshots.py OUT_DIR # DEMO_<STATE> = the fixture's URL
The battery-mode screens (P3) are not built, so there is no shot of them:
DOCS.md says so instead of showing a mock-up.
P3 adds the Batteries screen and Settings, Simple (the default Settings
view), so the Installer shots click Installer first.
"""
import os
@@ -48,7 +48,12 @@ def shot(browser, name, state, route, *, lang="en-GB", size=DESKTOP,
print(f" {name}.png")
def installer(page):
page.locator("#set-view [data-v=installer]").click()
def open_tariff(page):
installer(page)
page.locator("details.grp[data-g=tariff] > summary").click()
page.locator("details.grp[data-g=meter] > summary").click() # close it
# The fixture site is on a dynamic contract: its fallback gets windows.
@@ -80,8 +85,17 @@ def main():
shot(b, "home-shadow", "shadow", "#home")
shot(b, "home-phone", "running", "#home", size=PHONE)
shot(b, "home-setup-only", "setup", "#home", full=False)
shot(b, "settings-installer", "running", "#settings")
shot(b, "settings-installer-nl", "running", "#settings", lang="nl-BE")
shot(b, "settings-installer", "running", "#settings", act=installer)
shot(b, "settings-installer-nl", "running", "#settings", lang="nl-BE",
act=installer)
shot(b, "batteries", "modes", "#batteries")
shot(b, "batteries-nl", "modes", "#batteries", lang="nl-BE")
shot(b, "batteries-off-peak", "off_peak", "#batteries")
shot(b, "batteries-phone", "refusal", "#batteries", size=PHONE,
full=False)
shot(b, "batteries-modes-off", "running", "#batteries", full=False)
shot(b, "settings-simple", "modes", "#settings")
shot(b, "settings-simple-nl", "modes", "#settings", lang="nl-BE")
tariff = "details.grp[data-g=tariff]"
shot(b, "settings-time-windows", "running", "#settings",
act=windows, only=tariff)