From bf027672b58f2f77befa2c29e56a29a77cef5a11 Mon Sep 17 00:00:00 2001 From: ducoterra Date: Sun, 1 Nov 2026 23:26:36 -0500 Subject: [PATCH] phase: 04_reachable_share_cta MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All verification is complete. The pending working-tree changes are exactly the phase 04 work (CSS, tests, the README narrow-screen line, the AGENTS.md "Two→Three pages" fix) — all accurate. ## Final report **Verified (final pass — all 4 task files present in `complete/`):** - Gate 1: `uv run ruff check . && uv run ruff format --check .` → all checks passed, 29 files formatted - Gate 2: `uv run pyright` → 0 errors - Gate 3: `uv run pytest` → **269 passed, 4 skipped** (realdisplay-gated), coverage 95% - Gate 4: `MIRROR_REALDISPLAY=1 uv run pytest -m realdisplay` → **3 passed, 1 skipped** (host delivers no audio source — documented in module docstring) **Completion criteria:** 1. `#start` elementFromPoint at the 11 required sizes — ✅ `TestIdleShareButtonReachable` sweeps 12 viewports (superset); 12/12 passed 2. `#stop` clickable while sharing — ✅ `TestLiveStopButtonReachable` (320×568, 390×844, 1280×450) passed, incl. placeholder-hidden + livetag assertions 3. Single-cell stage guard — ✅ `test_the_share_stage_is_one_cell` + `test_the_stage_has_a_floor_and_a_ceiling` passed; CSS has `grid-template: 1fr / 1fr`, `.stage > * { grid-area: 1 / 1 }`, `min-height: 264px`, `max-height: min(70svh, 640px)` + vh fallback, `.placeholder { max-height: 100%; overflow: auto }`, `align-content: safe center` 4. Live video fills stage, rounded corners, `#livetag` top-left — ✅ verified by live-browser probe: video fills stage (decoded), stage radius 14px, livetag top-left, placeholder hidden 5. README accurate, AGENTS.md current, suite 100% green — ✅ 6. Phases 01–03 unchanged — ✅ `test_keyboard_wall` + `test_audio_share` + `test_sender_fidelity`: 48 passed **Documentation:** README.md reviewed in full (page table, quickstart, all 12 config defaults vs `config.py`, CLI flags, secure-context/wayland/audio sections, kiosk key table vs `watch.js`/`share.js`, dev commands) — **consistent, no fixes needed**. AGENTS.md verified statement-by-statement (commands, routes, test names, browser/realdisplay flags) — **no stale statements; no changes needed** (the pending "Two→Three pages" fix is correct). **Decisions:** criterion 4 had no dedicated test, so verified directly with a throwaway probe reusing the e2e harness (script in /tmp, not committed). No live infrastructure touched. No defects found in prior work. **Next pending phase:** none — `todo/` is empty of other phases. --- .../04_reachable_share_cta/00_phase.md | 0 .../01_one_cell_stage.md | 0 .../02_size_the_stage_for_real_viewports.md | 0 .../03_reachable_cta_e2e.md | 0 .../04_css_guard_and_docs.md | 0 .../04_reachable_share_cta__00_phase.a1.err | 0 .../04_reachable_share_cta__00_phase.a1.md | 23 +++ ...reachable_share_cta__00_phase.a1.md.status | 1 + ..._reachable_share_cta__00_phase.a1.validate | 34 ++++ ...chable_share_cta__01_one_cell_stage.a1.err | 0 ...achable_share_cta__01_one_cell_stage.a1.md | 10 + ..._share_cta__01_one_cell_stage.a1.md.status | 1 + ...e_share_cta__01_one_cell_stage.a1.validate | 34 ++++ ...2_size_the_stage_for_real_viewports.a1.err | 0 ...02_size_the_stage_for_real_viewports.a1.md | 16 ++ ..._the_stage_for_real_viewports.a1.md.status | 1 + ...e_the_stage_for_real_viewports.a1.validate | 34 ++++ ...ble_share_cta__03_reachable_cta_e2e.a1.err | 0 ...able_share_cta__03_reachable_cta_e2e.a1.md | 17 ++ ...are_cta__03_reachable_cta_e2e.a1.md.status | 1 + ...hare_cta__03_reachable_cta_e2e.a1.validate | 34 ++++ ...le_share_cta__04_css_guard_and_docs.a1.err | 0 ...ble_share_cta__04_css_guard_and_docs.a1.md | 13 ++ ...re_cta__04_css_guard_and_docs.a1.md.status | 1 + ...are_cta__04_css_guard_and_docs.a1.validate | 34 ++++ AGENTS.md | 2 +- README.md | 6 +- docs/screenshots/phase-04/idle-1280x800.png | Bin 0 -> 45499 bytes docs/screenshots/phase-04/idle-390x844.png | Bin 0 -> 42054 bytes docs/screenshots/phase-04/live-1280x800.png | Bin 0 -> 50975 bytes src/mirror/static/app.css | 71 ++++++- tests/e2e/test_live_mirror.py | 88 +++++++++ tests/e2e/test_share_layout.py | 174 ++++++++++++++++++ tests/test_app.py | 84 ++++++++- 34 files changed, 670 insertions(+), 9 deletions(-) rename .agents/phases/{todo => complete}/04_reachable_share_cta/00_phase.md (100%) rename .agents/phases/{todo => complete}/04_reachable_share_cta/01_one_cell_stage.md (100%) rename .agents/phases/{todo => complete}/04_reachable_share_cta/02_size_the_stage_for_real_viewports.md (100%) rename .agents/phases/{todo => complete}/04_reachable_share_cta/03_reachable_cta_e2e.md (100%) rename .agents/phases/{todo => complete}/04_reachable_share_cta/04_css_guard_and_docs.md (100%) create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__00_phase.a1.err create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__00_phase.a1.md create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__00_phase.a1.md.status create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__00_phase.a1.validate create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__01_one_cell_stage.a1.err create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__01_one_cell_stage.a1.md create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__01_one_cell_stage.a1.md.status create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__01_one_cell_stage.a1.validate create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__02_size_the_stage_for_real_viewports.a1.err create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__02_size_the_stage_for_real_viewports.a1.md create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__02_size_the_stage_for_real_viewports.a1.md.status create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__02_size_the_stage_for_real_viewports.a1.validate create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__03_reachable_cta_e2e.a1.err create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__03_reachable_cta_e2e.a1.md create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__03_reachable_cta_e2e.a1.md.status create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__03_reachable_cta_e2e.a1.validate create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__04_css_guard_and_docs.a1.err create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__04_css_guard_and_docs.a1.md create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__04_css_guard_and_docs.a1.md.status create mode 100644 .agents/reports/04_reachable_share_cta/04_reachable_share_cta__04_css_guard_and_docs.a1.validate create mode 100644 docs/screenshots/phase-04/idle-1280x800.png create mode 100644 docs/screenshots/phase-04/idle-390x844.png create mode 100644 docs/screenshots/phase-04/live-1280x800.png create mode 100644 tests/e2e/test_share_layout.py diff --git a/.agents/phases/todo/04_reachable_share_cta/00_phase.md b/.agents/phases/complete/04_reachable_share_cta/00_phase.md similarity index 100% rename from .agents/phases/todo/04_reachable_share_cta/00_phase.md rename to .agents/phases/complete/04_reachable_share_cta/00_phase.md diff --git a/.agents/phases/todo/04_reachable_share_cta/01_one_cell_stage.md b/.agents/phases/complete/04_reachable_share_cta/01_one_cell_stage.md similarity index 100% rename from .agents/phases/todo/04_reachable_share_cta/01_one_cell_stage.md rename to .agents/phases/complete/04_reachable_share_cta/01_one_cell_stage.md diff --git a/.agents/phases/todo/04_reachable_share_cta/02_size_the_stage_for_real_viewports.md b/.agents/phases/complete/04_reachable_share_cta/02_size_the_stage_for_real_viewports.md similarity index 100% rename from .agents/phases/todo/04_reachable_share_cta/02_size_the_stage_for_real_viewports.md rename to .agents/phases/complete/04_reachable_share_cta/02_size_the_stage_for_real_viewports.md diff --git a/.agents/phases/todo/04_reachable_share_cta/03_reachable_cta_e2e.md b/.agents/phases/complete/04_reachable_share_cta/03_reachable_cta_e2e.md similarity index 100% rename from .agents/phases/todo/04_reachable_share_cta/03_reachable_cta_e2e.md rename to .agents/phases/complete/04_reachable_share_cta/03_reachable_cta_e2e.md diff --git a/.agents/phases/todo/04_reachable_share_cta/04_css_guard_and_docs.md b/.agents/phases/complete/04_reachable_share_cta/04_css_guard_and_docs.md similarity index 100% rename from .agents/phases/todo/04_reachable_share_cta/04_css_guard_and_docs.md rename to .agents/phases/complete/04_reachable_share_cta/04_css_guard_and_docs.md diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__00_phase.a1.err b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__00_phase.a1.err new file mode 100644 index 0000000..e69de29 diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__00_phase.a1.md b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__00_phase.a1.md new file mode 100644 index 0000000..6fb9a0b --- /dev/null +++ b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__00_phase.a1.md @@ -0,0 +1,23 @@ +All verification is complete. The pending working-tree changes are exactly the phase 04 work (CSS, tests, the README narrow-screen line, the AGENTS.md "Two→Three pages" fix) — all accurate. + +## Final report + +**Verified (final pass — all 4 task files present in `complete/`):** +- Gate 1: `uv run ruff check . && uv run ruff format --check .` → all checks passed, 29 files formatted +- Gate 2: `uv run pyright` → 0 errors +- Gate 3: `uv run pytest` → **269 passed, 4 skipped** (realdisplay-gated), coverage 95% +- Gate 4: `MIRROR_REALDISPLAY=1 uv run pytest -m realdisplay` → **3 passed, 1 skipped** (host delivers no audio source — documented in module docstring) + +**Completion criteria:** +1. `#start` elementFromPoint at the 11 required sizes — ✅ `TestIdleShareButtonReachable` sweeps 12 viewports (superset); 12/12 passed +2. `#stop` clickable while sharing — ✅ `TestLiveStopButtonReachable` (320×568, 390×844, 1280×450) passed, incl. placeholder-hidden + livetag assertions +3. Single-cell stage guard — ✅ `test_the_share_stage_is_one_cell` + `test_the_stage_has_a_floor_and_a_ceiling` passed; CSS has `grid-template: 1fr / 1fr`, `.stage > * { grid-area: 1 / 1 }`, `min-height: 264px`, `max-height: min(70svh, 640px)` + vh fallback, `.placeholder { max-height: 100%; overflow: auto }`, `align-content: safe center` +4. Live video fills stage, rounded corners, `#livetag` top-left — ✅ verified by live-browser probe: video fills stage (decoded), stage radius 14px, livetag top-left, placeholder hidden +5. README accurate, AGENTS.md current, suite 100% green — ✅ +6. Phases 01–03 unchanged — ✅ `test_keyboard_wall` + `test_audio_share` + `test_sender_fidelity`: 48 passed + +**Documentation:** README.md reviewed in full (page table, quickstart, all 12 config defaults vs `config.py`, CLI flags, secure-context/wayland/audio sections, kiosk key table vs `watch.js`/`share.js`, dev commands) — **consistent, no fixes needed**. AGENTS.md verified statement-by-statement (commands, routes, test names, browser/realdisplay flags) — **no stale statements; no changes needed** (the pending "Two→Three pages" fix is correct). + +**Decisions:** criterion 4 had no dedicated test, so verified directly with a throwaway probe reusing the e2e harness (script in /tmp, not committed). No live infrastructure touched. No defects found in prior work. + +**Next pending phase:** none — `todo/` is empty of other phases. diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__00_phase.a1.md.status b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__00_phase.a1.md.status new file mode 100644 index 0000000..9766475 --- /dev/null +++ b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__00_phase.a1.md.status @@ -0,0 +1 @@ +ok diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__00_phase.a1.validate b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__00_phase.a1.validate new file mode 100644 index 0000000..b687bb6 --- /dev/null +++ b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__00_phase.a1.validate @@ -0,0 +1,34 @@ +........................................................................ [ 26%] +.................ssss................................................... [ 52%] +........................................................................ [ 79%] +......................................................... [100%] +=============================== warnings summary =============================== +.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1 + /home/ducoterra/Projects/Personal/mirror/.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead. + from starlette.testclient import TestClient as TestClient # noqa + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +================================ tests coverage ================================ +_______________ coverage: platform linux, python 3.14.8-final-0 ________________ + +Name Stmts Miss Cover Missing +------------------------------------------------------ +src/mirror/__init__.py 3 0 100% +src/mirror/__main__.py 72 3 96% 129, 145, 156 +src/mirror/access.py 60 0 100% +src/mirror/app.py 185 11 94% 108, 113, 117, 182-183, 212-216, 245 +src/mirror/config.py 68 5 93% 110-111, 118-120 +src/mirror/debug.py 15 10 33% 19-28 +src/mirror/protocol.py 59 0 100% +src/mirror/registry.py 191 3 98% 166, 180, 355 +------------------------------------------------------ +TOTAL 653 32 95% +=========================== short test summary info ============================ +SKIPPED [1] tests/e2e/test_x11_capture.py:281: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +SKIPPED [1] tests/e2e/test_x11_capture.py:321: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +SKIPPED [1] tests/e2e/test_x11_capture.py:364: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +SKIPPED [1] tests/e2e/test_x11_capture.py:446: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +269 passed, 4 skipped, 1 warning in 68.73s (0:01:08) +All checks passed! +29 files already formatted +0 errors, 0 warnings, 0 informations diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__01_one_cell_stage.a1.err b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__01_one_cell_stage.a1.err new file mode 100644 index 0000000..e69de29 diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__01_one_cell_stage.a1.md b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__01_one_cell_stage.a1.md new file mode 100644 index 0000000..a250286 --- /dev/null +++ b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__01_one_cell_stage.a1.md @@ -0,0 +1,10 @@ +Everything is verified and green. Final report: + +**Phase 04 / Task 01 — one-cell stage: complete.** + +- **Implemented**: `src/mirror/static/app.css` `.stage` now declares `grid-template: 1fr / 1fr` (one cell) plus `.stage > * { grid-area: 1 / 1; }`, so `#preview`, `#placeholder`, `#livetag` overlap in one cell; invariant comment added at the rule. `.livetag` stays absolute, `.stage video` untouched, `share.js`/`mirror.html` untouched. Diff confined to the `/* share */` block. +- **Instrumented browser check** (Chromium `channel="chromium"`, `http://127.0.0.1`): idle `#placeholder` topOffset now 1 @320×568 and 187.4 @1280×800 (centred, no longer the constant 151 px row); `#start` bottom 37 px below stage at 320 (was 187) and fully inside at 1280 with `elementFromPoint` = `BUTTON#start`; live state A/B-probed against old CSS — geometry byte-identical at both sizes (placeholder hidden, `#stop` clickable, video + `#livetag` unchanged → no visual regression). +- **Screenshots**: `docs/screenshots/phase-04/` — `idle-1280x800.png`, `idle-390x844.png`, `live-1280x800.png` (visually verified: CTA centred, live video fills stage, LIVE top-left). +- **Gates**: `uv run ruff check . && uv run ruff format --check .` clean · `uv run pyright` 0 errors · `uv run pytest` **245 passed, 4 skipped** (realdisplay-only) · `MIRROR_REALDISPLAY=1 uv run pytest -m realdisplay` **3 passed, 1 skipped** (pre-existing documented host-audio skip). Coverage 95% (floor >90%). +- **Docs**: no README/AGENTS.md changes — README makes no claim about the share-page layout that this fix alters (no stale statement; the one pre-existing warning is a Starlette dependency deprecation, untouched). +- **Next pending task**: `02_size_the_stage_for_real_viewports.md`. diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__01_one_cell_stage.a1.md.status b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__01_one_cell_stage.a1.md.status new file mode 100644 index 0000000..9766475 --- /dev/null +++ b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__01_one_cell_stage.a1.md.status @@ -0,0 +1 @@ +ok diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__01_one_cell_stage.a1.validate b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__01_one_cell_stage.a1.validate new file mode 100644 index 0000000..0be2212 --- /dev/null +++ b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__01_one_cell_stage.a1.validate @@ -0,0 +1,34 @@ +...................................................................ssss. [ 28%] +........................................................................ [ 57%] +........................................................................ [ 86%] +................................. [100%] +=============================== warnings summary =============================== +.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1 + /home/ducoterra/Projects/Personal/mirror/.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead. + from starlette.testclient import TestClient as TestClient # noqa + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +================================ tests coverage ================================ +_______________ coverage: platform linux, python 3.14.8-final-0 ________________ + +Name Stmts Miss Cover Missing +------------------------------------------------------ +src/mirror/__init__.py 3 0 100% +src/mirror/__main__.py 72 3 96% 129, 145, 156 +src/mirror/access.py 60 0 100% +src/mirror/app.py 185 11 94% 108, 113, 117, 182-183, 212-216, 245 +src/mirror/config.py 68 5 93% 110-111, 118-120 +src/mirror/debug.py 15 10 33% 19-28 +src/mirror/protocol.py 59 0 100% +src/mirror/registry.py 191 3 98% 166, 180, 355 +------------------------------------------------------ +TOTAL 653 32 95% +=========================== short test summary info ============================ +SKIPPED [1] tests/e2e/test_x11_capture.py:281: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +SKIPPED [1] tests/e2e/test_x11_capture.py:321: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +SKIPPED [1] tests/e2e/test_x11_capture.py:364: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +SKIPPED [1] tests/e2e/test_x11_capture.py:446: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +245 passed, 4 skipped, 1 warning in 66.61s (0:01:06) +All checks passed! +28 files already formatted +0 errors, 0 warnings, 0 informations diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__02_size_the_stage_for_real_viewports.a1.err b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__02_size_the_stage_for_real_viewports.a1.err new file mode 100644 index 0000000..e69de29 diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__02_size_the_stage_for_real_viewports.a1.md b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__02_size_the_stage_for_real_viewports.a1.md new file mode 100644 index 0000000..e56845a --- /dev/null +++ b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__02_size_the_stage_for_real_viewports.a1.md @@ -0,0 +1,16 @@ +All green. Final state verified — everything complete: + +**Task 02 complete.** Report: + +**Implemented** +- `app.css` (entirely inside the `/* share */` block): `.stage` floor `min-height: 264px`, ceiling `max-height: min(70vh, 640px)` + `min(70svh, 640px)` (vh fallback), `align-content: safe center`; `.stage .placeholder` escape hatch `max-height: 100%; overflow: auto`; `aspect-ratio: 4/3` at ≤900px, `auto` + 16px padding at ≤480px +- Two fixes beyond the literal task: (1) media queries placed *after* the base rules — before that, equal-specificity source order made them lose; (2) `width: 100%` on `.stage` — a stretched grid item with aspect-ratio gets its *width* recomputed from a max-height-clamped height (stage shrank to 1024px, 534px gap beside the panel); a definite width keeps the full column and the video letterboxes, per the task's ASSUMPTION +- `tests/e2e/test_live_mirror.py::TestStageSizing`: the 6 measured failure viewports (button inside stage + inside viewport, floor ≥263, stage bottom on-screen) + 1920×1080 ceiling (≤641px, Session panel reachable) — in `test_live_mirror.py` since `test_share_layout.py` belongs to task 03 + +**Before → after** (measured, Chromium over 127.0.0.1): 320×568 stage 180→264, `#start` clipped→263–315 inside; 900×480 542→336 (on-screen); 1280×450 564→315; 1920×1080 964→640, panel bottom 499 < 1080. Test verified **red before** the fix (6/7 viewports + ceiling fail) and green after. + +**Gates**: `uv run ruff check . && uv run ruff format --check .` clean · `uv run pyright` 0 errors · `uv run pytest` 252 passed, 4 skipped (realdisplay-gated) · `MIRROR_REALDISPLAY=1 uv run pytest -m realdisplay` 3 passed, 1 skipped (documented env-gated audio) · `pytest tests/test_app.py -m "not e2e"` 68 passed · coverage 95% (no new src code; phase is CSS-only per 00_phase.md) + +**Docs**: README.md — added the sharer-facing narrow-screen line (320px viewport, CTA always on screen). AGENTS.md — no stale statements, no edit. + +**Next pending task**: `03_reachable_cta_e2e` — the 12-viewport `elementFromPoint` sweep in `tests/e2e/test_share_layout.py`, idle + live `#stop`. diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__02_size_the_stage_for_real_viewports.a1.md.status b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__02_size_the_stage_for_real_viewports.a1.md.status new file mode 100644 index 0000000..9766475 --- /dev/null +++ b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__02_size_the_stage_for_real_viewports.a1.md.status @@ -0,0 +1 @@ +ok diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__02_size_the_stage_for_real_viewports.a1.validate b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__02_size_the_stage_for_real_viewports.a1.validate new file mode 100644 index 0000000..fa41c87 --- /dev/null +++ b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__02_size_the_stage_for_real_viewports.a1.validate @@ -0,0 +1,34 @@ +........................................................................ [ 28%] +..ssss.................................................................. [ 56%] +........................................................................ [ 84%] +........................................ [100%] +=============================== warnings summary =============================== +.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1 + /home/ducoterra/Projects/Personal/mirror/.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead. + from starlette.testclient import TestClient as TestClient # noqa + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +================================ tests coverage ================================ +_______________ coverage: platform linux, python 3.14.8-final-0 ________________ + +Name Stmts Miss Cover Missing +------------------------------------------------------ +src/mirror/__init__.py 3 0 100% +src/mirror/__main__.py 72 3 96% 129, 145, 156 +src/mirror/access.py 60 0 100% +src/mirror/app.py 185 12 94% 108, 113, 116-117, 182-183, 212-216, 245 +src/mirror/config.py 68 5 93% 110-111, 118-120 +src/mirror/debug.py 15 10 33% 19-28 +src/mirror/protocol.py 59 0 100% +src/mirror/registry.py 191 3 98% 166, 180, 355 +------------------------------------------------------ +TOTAL 653 33 95% +=========================== short test summary info ============================ +SKIPPED [1] tests/e2e/test_x11_capture.py:281: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +SKIPPED [1] tests/e2e/test_x11_capture.py:321: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +SKIPPED [1] tests/e2e/test_x11_capture.py:364: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +SKIPPED [1] tests/e2e/test_x11_capture.py:446: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +252 passed, 4 skipped, 1 warning in 66.55s (0:01:06) +All checks passed! +28 files already formatted +0 errors, 0 warnings, 0 informations diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__03_reachable_cta_e2e.a1.err b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__03_reachable_cta_e2e.a1.err new file mode 100644 index 0000000..e69de29 diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__03_reachable_cta_e2e.a1.md b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__03_reachable_cta_e2e.a1.md new file mode 100644 index 0000000..f812484 --- /dev/null +++ b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__03_reachable_cta_e2e.a1.md @@ -0,0 +1,17 @@ +All green. Report: + +**Implemented** +- `tests/e2e/test_share_layout.py`: `#start` hit-test sweep over the 12 task viewports (verbatim `elementFromPoint` probe; asserts `disabled`, `hit_is_button` with `hit` named in the failure message, `in_stage`, `in_viewport`, `no_h_scroll`) plus live-state sweep at 320×568 / 390×844 / 1280×450 asserting `#stop` hit-testable, `#placeholder` hidden, `#livetag` visible inside the stage — reusing `base_url`/`browser`/`start_sharing` from `tests/e2e/conftest.py`. +- Pre-fix verification (temporary revert to HEAD CSS, then restored): **7/12 idle viewports fail** — 320×568 (`hit: H2`), 360×640 (`hit: #name`), 390×844 (`hit: LABEL`), 430×932 (`hit: H2`), 480×800 (`hit: MAIN`), 900×480 (`hit: null`), 1280×450 (`hit: null`); 700×900, 900×700, 1024×600, 1280×800, 1920×1080 pass. Matches the 00_phase diagnosis (480×800's hit landed on `MAIN` this run vs `#share-link` in the original table — same clip, culprit named in output). Please fold these failing widths into the phase commit message. + +**Gates (all green)** +- `uv run ruff check . && uv run ruff format --check .` — All checks passed; 29 files formatted +- `uv run pyright` — 0 errors +- `uv run pytest` — 267 passed, 4 skipped (realdisplay gate), 95% coverage +- `MIRROR_REALDISPLAY=1 uv run pytest -m realdisplay` — 3 passed, 1 skipped (host offers no audio source; pre-existing, documented in the test) + +**Docs** — no doc impact: README already documents the 320px phone behaviour (tasks 01–02); this task is test-only, no stale AGENTS.md facts. + +**Decisions** — git stash unavailable per harness rules, so pre-fix check used a file swap of `app.css` (restored immediately); live probe parameterised on selector since `#stop` lives in the Session panel, not the stage (`in_stage` asserted for `#start` only). + +**Next pending task** — `04_css_guard_and_docs` (`.agents/phases/todo/04_reachable_share_cta/04_css_guard_and_docs.md`). diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__03_reachable_cta_e2e.a1.md.status b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__03_reachable_cta_e2e.a1.md.status new file mode 100644 index 0000000..9766475 --- /dev/null +++ b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__03_reachable_cta_e2e.a1.md.status @@ -0,0 +1 @@ +ok diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__03_reachable_cta_e2e.a1.validate b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__03_reachable_cta_e2e.a1.validate new file mode 100644 index 0000000..ddcb6de --- /dev/null +++ b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__03_reachable_cta_e2e.a1.validate @@ -0,0 +1,34 @@ +........................................................................ [ 26%] +.................ssss................................................... [ 53%] +........................................................................ [ 79%] +....................................................... [100%] +=============================== warnings summary =============================== +.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1 + /home/ducoterra/Projects/Personal/mirror/.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead. + from starlette.testclient import TestClient as TestClient # noqa + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +================================ tests coverage ================================ +_______________ coverage: platform linux, python 3.14.8-final-0 ________________ + +Name Stmts Miss Cover Missing +------------------------------------------------------ +src/mirror/__init__.py 3 0 100% +src/mirror/__main__.py 72 3 96% 129, 145, 156 +src/mirror/access.py 60 0 100% +src/mirror/app.py 185 11 94% 108, 113, 117, 182-183, 212-216, 245 +src/mirror/config.py 68 5 93% 110-111, 118-120 +src/mirror/debug.py 15 10 33% 19-28 +src/mirror/protocol.py 59 0 100% +src/mirror/registry.py 191 3 98% 166, 180, 355 +------------------------------------------------------ +TOTAL 653 32 95% +=========================== short test summary info ============================ +SKIPPED [1] tests/e2e/test_x11_capture.py:281: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +SKIPPED [1] tests/e2e/test_x11_capture.py:321: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +SKIPPED [1] tests/e2e/test_x11_capture.py:364: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +SKIPPED [1] tests/e2e/test_x11_capture.py:446: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +267 passed, 4 skipped, 1 warning in 69.49s (0:01:09) +All checks passed! +29 files already formatted +0 errors, 0 warnings, 0 informations diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__04_css_guard_and_docs.a1.err b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__04_css_guard_and_docs.a1.err new file mode 100644 index 0000000..e69de29 diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__04_css_guard_and_docs.a1.md b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__04_css_guard_and_docs.a1.md new file mode 100644 index 0000000..9b67ccb --- /dev/null +++ b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__04_css_guard_and_docs.a1.md @@ -0,0 +1,13 @@ +Everything is verified and green. Final report: + +**Phase 04, Task 04 — complete. All gates green.** + +- **`TestStylesheet::test_the_share_stage_is_one_cell`** — asserts `.stage` declares `grid-template: 1fr / 1fr` (or explicit rows/columns of 1fr) *and* `.stage > *` carries `grid-area: 1 / 1`; docstring records the 300×150 idle-video / 151px-stack / `overflow: hidden` clip reason. +- **`TestStylesheet::test_the_stage_has_a_floor_and_a_ceiling`** — `.stage` must keep `min-height` and `max-height`; any rule combining `overflow: hidden` with `aspect-ratio` needs `min-height` in the same block (the general statement of the bug). +- **`test_hidden_always_means_gone`** — `.placeholder` added to the `[hidden]`-toggled component list, with the inline comment corrected so it stays accurate. +- **Revert verification (by hand)**: deleting the grid lines fails the one-cell guard; deleting `min-height: 264px` fails the floor check; deleting both `max-height` lines fails the ceiling check. CSS restored; all 5 `TestStylesheet` tests green. +- **README.md L10** — added the `/share` alias (served by `app.py`, asserted by `test_pages_render`, previously undocumented). The narrow-screen user-facing line (L39) was already present from an earlier task; full-file consistency pass found no other gaps (ports, config defaults, key tables, kiosk commands all verified against code/docs). +- **AGENTS.md L44** — fixed the one stale fact: "Two pages" → "Three pages and one WebSocket" (the index page exists and is tested). No narrative added; "coverage ~95%" re-measured at 95%, still accurate. +- **PLAN.md** — untouched, but L204's "per-leg `maxBitrate` cap (default 12 Mbit/s)" is contradicted by reality: phase 02 raised the default to 25 Mbit/s (`config.py` L15, README L72). Reported here for the user to amend; I did not edit it. +- **Gates**: `uv run ruff check . && uv run ruff format --check .` clean · `uv run pyright` 0 errors · `uv run pytest` 269 passed / 4 skipped (realdisplay flag-gated) · `MIRROR_REALDISPLAY=1 uv run pytest -m realdisplay` 3 passed / 1 skipped (host has no audio source — documented platform limitation). Phases 01–03 e2e suites (keyboard, sharpness, audio) all still green. +- **Next pending task**: none — task 04 was the last task of phase 04; the phase is ready for its final validation pass. diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__04_css_guard_and_docs.a1.md.status b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__04_css_guard_and_docs.a1.md.status new file mode 100644 index 0000000..9766475 --- /dev/null +++ b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__04_css_guard_and_docs.a1.md.status @@ -0,0 +1 @@ +ok diff --git a/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__04_css_guard_and_docs.a1.validate b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__04_css_guard_and_docs.a1.validate new file mode 100644 index 0000000..e5588c8 --- /dev/null +++ b/.agents/reports/04_reachable_share_cta/04_reachable_share_cta__04_css_guard_and_docs.a1.validate @@ -0,0 +1,34 @@ +........................................................................ [ 26%] +.................ssss................................................... [ 52%] +........................................................................ [ 79%] +......................................................... [100%] +=============================== warnings summary =============================== +.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1 + /home/ducoterra/Projects/Personal/mirror/.venv/lib64/python3.14/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead. + from starlette.testclient import TestClient as TestClient # noqa + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +================================ tests coverage ================================ +_______________ coverage: platform linux, python 3.14.8-final-0 ________________ + +Name Stmts Miss Cover Missing +------------------------------------------------------ +src/mirror/__init__.py 3 0 100% +src/mirror/__main__.py 72 3 96% 129, 145, 156 +src/mirror/access.py 60 0 100% +src/mirror/app.py 185 12 94% 108, 113, 116-117, 182-183, 212-216, 245 +src/mirror/config.py 68 5 93% 110-111, 118-120 +src/mirror/debug.py 15 10 33% 19-28 +src/mirror/protocol.py 59 0 100% +src/mirror/registry.py 191 3 98% 166, 180, 355 +------------------------------------------------------ +TOTAL 653 33 95% +=========================== short test summary info ============================ +SKIPPED [1] tests/e2e/test_x11_capture.py:281: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +SKIPPED [1] tests/e2e/test_x11_capture.py:321: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +SKIPPED [1] tests/e2e/test_x11_capture.py:364: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +SKIPPED [1] tests/e2e/test_x11_capture.py:446: set MIRROR_REALDISPLAY=1 to exercise the real X11 capture backend +269 passed, 4 skipped, 1 warning in 68.64s (0:01:08) +All checks passed! +29 files already formatted +0 errors, 0 warnings, 0 informations diff --git a/AGENTS.md b/AGENTS.md index 9be6342..f964470 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -41,7 +41,7 @@ is a roster and a signaling relay. Linux is the reference platform. | Rule | Why it exists | |---|---| | **No external assets.** No CDN, remote font, remote icon, `@import`, or analytics | LAN/offline correctness. `tests/test_app.py::TestClientScripts::test_nothing_is_loaded_from_a_cdn` fails the build if you add one | -| **No framework, no bundler** in `src/mirror/static/` | Two pages and one WebSocket. `node --check` is the entire frontend toolchain | +| **No framework, no bundler** in `src/mirror/static/` | Three pages and one WebSocket. `node --check` is the entire frontend toolchain | | **Media never passes through the server** | The server relays JSON only. Anything that puts frames in the Python process violates A3 | | **`Registry` stays pure** — no sockets, no FastAPI, no `await` | It returns `list[Envelope]`. Transport lives in `Hub`. This is why the policy has 100%-ish unit coverage | | **camelCase on the wire, snake_case in Python**, via `alias_generator=to_camel` | A silently-dropped `displaySurface` was a real bug we shipped. Any new multi-word field needs an alias test | diff --git a/README.md b/README.md index 2714527..a0acb7c 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ your network: | Page | URL | What it does | | ------------ | ------------------ | ----------------------------------------------------------------------- | -| **Share** | `/mirror` | Picks a window, screen, or tab via the OS-native picker and mirrors it. | +| **Share** | `/mirror` (also `/share`) | Picks a window, screen, or tab via the OS-native picker and mirrors it. | | **Watch** | `/watch` | Shows every screen currently being mirrored; click a tile to take the stage. | | **Index** | `/` | Signpost + live count of mirrors. | @@ -36,6 +36,10 @@ Linux is the primary target. On Linux the native picker is X11/Wayland's own (Chromium uses `xdg-desktop-portal` on Wayland/GNOME/KDE, and its built-in X11 picker on Xorg), so nothing has to be installed on the client side. +The share page works on a phone as well as a desktop: `/mirror` is usable +down to a 320 px-wide viewport, and the preview keeps its shape but never +shrinks below the controls it holds, so the Share button is always on screen. + The target *client* setup for an always-on display is Fedora Silverblue running GNOME Kiosk — see [`docs/kiosk-silverblue.md`](docs/kiosk-silverblue.md). diff --git a/docs/screenshots/phase-04/idle-1280x800.png b/docs/screenshots/phase-04/idle-1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..2446e4893781a59ecb15390b671a2c27c0742cd3 GIT binary patch literal 45499 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/phase-04/idle-390x844.png b/docs/screenshots/phase-04/idle-390x844.png new file mode 100644 index 0000000000000000000000000000000000000000..ce0d47741da02f2b6e30e53ed4009e05d6720642 GIT binary patch literal 42054 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

nP$w=An2|_~vJB4L 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 HNz8u$fks?p literal 0 HcmV?d00001 diff --git a/docs/screenshots/phase-04/live-1280x800.png b/docs/screenshots/phase-04/live-1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..e7a5970089c0dad1d921ebcb7ce5a751c03bb9c3 GIT binary patch literal 50975 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

LsRir2{JHGQQ!))~@L|8z`Q$^zSUD^1@ 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, the idle placeholder, + the LIVE badge — share that cell, so the placeholder overlays the video the + way the markup intends instead of stacking into a row below it. + Invariant for the next reader: a child added to #preview-stage shares that + cell and must never push another child out of view. `overflow: hidden` is + there to clip the live video to the rounded corners; a box whose content no + longer fits a fixed-aspect stage is the size rule's job, not this one's + (the floor/ceiling below). */ .stage { position: relative; + /* Definite (100%), not stretched-auto: with an aspect-ratio, a stretched + item whose height is clamped by max-height gets its *width* recomputed + from the clamped height (the stage would shrink and leave a gap beside + the panel). A definite width keeps the full column; the video then + letterboxes inside (object-fit: contain) instead. */ + width: 100%; aspect-ratio: 16 / 10; + /* Floor and ceiling: the aspect ratio is the *preferred* shape, and these + bound it. 264px is the measured idle placeholder at 320px wide + slack — + a placeholder taller than the stage scrolls (see below) instead of being + trapped under `overflow: hidden`. The ceiling: the preview is a preview; + on 1920x1080 the ratio alone wanted 964px and pushed the Session panel + off-screen (the video letterboxes inside, so nothing is lost). vh first + as the silent fallback where svh is unsupported — the ceiling is then + never load-bearing on an old browser; dvh deliberately avoided, a mobile + URL bar must not resize the stage mid-share. */ + min-height: 264px; + max-height: min(70vh, 640px); + max-height: min(70svh, 640px); background: #05070a; border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; display: grid; + grid-template: 1fr / 1fr; /* one cell, not one row per child */ place-items: center; + /* The escape hatch's other half: if a row ever overflows the box, align to + the start instead of centring into a clip at both edges (the + centred-overflow trap that hid half the Share button). */ + align-content: safe center; } +/* Every child lives in that one cell: #preview, #placeholder and #livetag + overlap instead of stacking. DOM order paints the placeholder above the video + (no z-index); .livetag stays position: absolute, so grid-area is inert for + it. */ +.stage > * { grid-area: 1 / 1; } + .stage video { width: 100%; height: 100%; object-fit: contain; display: block; } -.stage .placeholder { text-align: center; padding: 24px; color: var(--fg-dim); } +/* Escape hatch: the placeholder may never be taller than the stage; if its + content outgrows it, it scrolls. Paired with `safe center` above, content + that is too tall is always reachable, whichever way the geometry falls. */ +.stage .placeholder { + text-align: center; + padding: 24px; + color: var(--fg-dim); + max-height: 100%; + overflow: auto; +} .stage .placeholder h2 { color: var(--fg); margin: 14px 0 6px; font-size: 20px; } .stage .placeholder p { margin: 0 0 18px; font-size: 14px; } +/* Narrow-width shape rules come *after* the base rules above: same + specificity, so source order decides, and a phone must not be left with + the wide-screen ratio or the wide-screen padding. Single-column below + 900px, and the stage stops asking for a wide-screen shape there (4:3 + instead of 16:10): the floor does the real work, the ratio only keeps + the box from looking like a letterbox. */ +@media (max-width: 900px) { + .share { grid-template-columns: 1fr; } + .stage { aspect-ratio: 4 / 3; } +} + +/* A phone (≤480px) gets a stage as tall as its content rather than any + letterbox, and the placeholder's padding buys back 16px. min-height still + does the real work in both cases. */ +@media (max-width: 480px) { + .stage { aspect-ratio: auto; } + .stage .placeholder { padding: 16px; } +} + .livetag { position: absolute; top: 12px; diff --git a/tests/e2e/test_live_mirror.py b/tests/e2e/test_live_mirror.py index 96243e4..751a5f8 100644 --- a/tests/e2e/test_live_mirror.py +++ b/tests/e2e/test_live_mirror.py @@ -8,6 +8,7 @@ from __future__ import annotations import re import time +from typing import ClassVar import pytest from playwright.sync_api import expect @@ -294,6 +295,93 @@ class TestChromeVisibility: expect(sharer.locator("#start")).not_to_be_visible() expect(sharer.locator("#placeholder")).not_to_be_visible() + +class TestStageSizing: + """The stage has a floor, a ceiling, and an escape hatch. + + ``aspect-ratio: 16 / 10`` alone made the stage 180 px tall at 320 px wide + (the idle placeholder needed ~240 px there) and 543 px tall in a 480 px + window (the Share button ended up below the fold). These tests pin the + six shapes measured in ``00_phase.md``: at each one ``#start`` must be + fully inside *both* the stage box and the viewport — inside the stage or + ``overflow: hidden`` clips it, and inside the viewport or a finger can + never reach it. The 1080p case pins the ceiling: the Session panel must + be reachable without scrolling past a 964 px preview. + """ + + # The three clip cases (button clipped out of the stage) and the two + # below-the-fold cases (stage taller than the viewport), plus 360x640, + # the fourth measured narrow shape. + FAILURE_VIEWPORTS: ClassVar[list[tuple[int, int]]] = [ + (320, 568), + (360, 640), + (390, 844), + (480, 800), + (900, 480), + (1280, 450), + ] + + STAGE_PROBE = """() => { + const s = document.querySelector('#preview-stage').getBoundingClientRect(); + const r = document.querySelector('#start').getBoundingClientRect(); + return { + stage_h: s.height, + stage_bottom: s.bottom, + start: {top: r.top, bottom: r.bottom, right: r.right}, + in_stage: r.bottom <= s.bottom + 1 && r.top >= s.top - 1, + in_viewport: r.top >= 0 && r.bottom <= innerHeight && r.right <= innerWidth, + stage_in_viewport: s.bottom <= innerHeight + 1, + }; + }""" + + @pytest.mark.parametrize("viewport", FAILURE_VIEWPORTS) + def test_the_share_button_is_inside_the_stage_and_the_viewport( + self, base_url, browser, request, viewport + ): + context = browser.new_context(viewport={"width": viewport[0], "height": viewport[1]}) + request.addfinalizer(context.close) + page = context.new_page() + page.goto(f"{base_url}/mirror", wait_until="domcontentloaded") + expect(page.locator("#start")).to_be_visible(timeout=10_000) + result = page.evaluate(self.STAGE_PROBE) + message = f"{viewport[0]}x{viewport[1]}: {result}" + # The floor (264px, the measured idle placeholder + slack) and the + # ceiling (min(70svh, 640px)) must both hold: the box is never so + # short that the CTA clips out, and never so tall that it leaves + # the viewport. + assert result["stage_h"] >= 263, f"floor failed: {message}" + assert result["in_stage"], f"#start is clipped by the stage: {message}" + assert result["in_viewport"], f"#start is below the fold: {message}" + # The stage itself must also fit: on the two short-window shapes the + # aspect-ratio box used to run 543/564 px tall in a 480/450 px window, + # leaving only a scroll to reach the bottom of the page. + assert result["stage_in_viewport"], f"the stage itself overflows the viewport: {message}" + + def test_the_ceiling_keeps_the_session_panel_reachable_at_1080p( + self, base_url, browser, request + ): + """1920x1080: the aspect ratio alone wanted a 964 px stage, which + pushed the Session panel off-screen. The 640 px ceiling must keep + the panel on screen — reachable without scrolling.""" + context = browser.new_context(viewport={"width": 1920, "height": 1080}) + request.addfinalizer(context.close) + page = context.new_page() + page.goto(f"{base_url}/mirror", wait_until="domcontentloaded") + expect(page.locator("#start")).to_be_visible(timeout=10_000) + result = page.evaluate( + """() => { + const s = document.querySelector('#preview-stage').getBoundingClientRect(); + const p = document.querySelector('.panel').getBoundingClientRect(); + return {stage_h: s.height, stage_w: s.width, panel_bottom: p.bottom}; + }""" + ) + assert result["stage_h"] <= 641, ( + f"the 640px ceiling failed (aspect ratio alone wanted 964px): {result}" + ) + assert result["panel_bottom"] <= 1080, ( + f"the Session panel is not reachable without scrolling: {result}" + ) + def test_exit_only_appears_on_the_tile_that_is_on_stage(self, device): sharer = device("/mirror") start_sharing(sharer) diff --git a/tests/e2e/test_share_layout.py b/tests/e2e/test_share_layout.py new file mode 100644 index 0000000..658e1cc --- /dev/null +++ b/tests/e2e/test_share_layout.py @@ -0,0 +1,174 @@ +"""End-to-end: the Share CTA is a *hit*, at every realistic viewport. + +The bug this file pins: ``#preview-stage`` was a two-row grid (the idle +``