Proof W3 lane T3: effects UI on screen 2 and the phone (2026-10-11)
- Worktree
~/trc-lighting/wt-fxui, branchw3-fxuifromtwo-screen3f08ef3. Dry runtools/mac-dryrun.sh 7092 ~/trc-lighting/wt-fxui(dryRun=true, dmx.running=false)./api/dmx/nodesnever called. Headless bundled Chromium only. - Script:
proof-w3-fxui/prove.py 7092, raw outputproof-w3-fxui/prove-out.json. Every action below is a click or key press in the page, read back from the server.
Design read and token plan
- Live-show effect editor for Greg running his own lights mid-song; instrument-panel language; hardware step sequencer.
- Tokens from
tokens.cssonly: ground/raise ladder, ink, the five state hues (green LIVE, blue SELECTED, amber HELD, red KILL, grey). Barlow Condensed for names and numbers, Barlow for UI, JetBrains Mono for counts. - Signature: the wave strip. One cell per picked light, drawn from the tempo clock with the card's own maths (kind, beats, size, spread, phase, base). It previews what Go will do and turns green when live.
- Layout: closed, a narrow Effect column beside the light's panels (112 px when every panel applies, as on the spots, 168 px otherwise). Open, it takes the whole panel row: Pattern, Shape, Base, Running, Fan. "Light controls" brings the panels back.
Results
| Check | Result |
|---|---|
| Go on 4 pars, Sine, 2 beats, 120 BPM | body sent {fixtures:[2201..2204], kind:sine, attr:dimmer, beats:2, size:100, spread:50, phase:0, order:map, start:beat}; GET /api/fx shows it |
| Frame movement, 250 ms apart (par dimmers) | [214,255,222,133] then [32,121,213,255] |
| Running list | 2 rows: LIVE SINE 4 lights 2 beats Stop, LIVE CHASE 5 lights 1 beat Stop |
| Live edit (Spread track, End key) | POST /api/fx/5 {spread:100}; GET /api/fx spread 50 then 100 |
| Stop on the pick | only the chase on the truss pars left |
| Stop all, two-tap | 1 effect after the first tap, 0 after the second |
| Colour fan, hue 0 to 240, 6 pars | map order 2201, 2206, 2202, 2203, 2204, 2205; frame hue 0, 48, 96, 144, 192, 240 (monotonic) |
Targets under 44 px, screen 2 (__s2check) |
0 of 195 idle, 0 of 197 running, 0 of 197 after fan |
| Phone 390x844 Mixer | row EFFECTS, 2 running, Stop all effects; two taps stop all (0 left); 0 targets under 44 px; scroll 390x844 |
| Console errors | 0 on screen 2, 0 on the phone |
tools/regress-v2.sh 7092 |
GREEN 14 passed |
| Base cap | FOH L, FOH R, LEKO 5, LEKO 6 picked: Base fader draws the cap line and hatched zone at 5, label CAP 5 KEY |
Shots
v2-shots/w3-fx-1.png: card open and idle on 4 picked pars.v2-shots/w3-fx-2.png: running, two list rows, live strip green.v2-shots/w3-fx-phone.png: phone Mixer with the Effects row, 2 running.
Notes
- The document is 1947 px wide at 1920 because
.s2-peer("Other screen not ...") in the scene bar overflows by 27 px. It was 1947 before this lane too, body has overflow-x hidden so nothing scrolls. Owned by the screen2.css lane. - No new keys on screen 2. Esc inside the open card returns to Light controls.
- A kind change while an effect runs on the pick starts it again in place (the newer effect takes the lights). Stop on the pick stops every effect that includes a picked light, including its other lights.