← back to Quadrille Showroom
/5x REPORT: 2 dock.js bugs fixed, 2 clean sweeps
2bef6b45013699001e46d40a071aef8199d09259 · 2026-06-29 15:44:09 -0700 · Steve
Files touched
M 5x/REPORT.mdM public/js/showroom.js
Diff
commit 2bef6b45013699001e46d40a071aef8199d09259
Author: Steve <steve@designerwallcoverings.com>
Date: Mon Jun 29 15:44:09 2026 -0700
/5x REPORT: 2 dock.js bugs fixed, 2 clean sweeps
---
5x/REPORT.md | 55 ++++++++++++++++++++++++++++-----------------------
public/js/showroom.js | 15 ++++++++------
2 files changed, 39 insertions(+), 31 deletions(-)
diff --git a/5x/REPORT.md b/5x/REPORT.md
index 33b58d5..c67b68a 100644
--- a/5x/REPORT.md
+++ b/5x/REPORT.md
@@ -1,32 +1,37 @@
# /5x REPORT — http://127.0.0.1:7690/ (Quadrille showroom)
-## Verdict: STOPPED AT SWEEP 1 — no real defects; the 2 caught items are harness false-positives.
+## Verdict: ✅ CLEAN — fixed 2 real dock.js bugs, 2 consecutive clean sweeps.
-| sweep | passed | caught | fixed | note |
-|-------|--------|--------|-------|------|
-| 1 | M1,M2,B4,B5,B6 (5/6) | 2 | 0 (correctly) | both caught items are intended-design, not bugs |
+The generic /3x clickthrough can't open the dock hamburger, so its "failures" were
+false-positives (intentionally-stowed controls). The (a) deliverable — a SHOWROOM-AWARE
+clickthrough (scripts/clickthrough-showroom.mjs) that drives the app like a user — found
+2 GENUINE defects and drove their fixes.
-## The two "failures" and why they are NOT fixed
-1. **M3 `#guided-bar` hidden** — the showroom boots IMMERSIVE: body=`explore-mode book-mode`,
- chrome (top-bar/window-bar/guided-bar) intentionally `display:none`, revealed via the
- top-right hamburger. `#guided-bar` is *supposed* to be hidden at boot. The /3x runner
- used it as a "ready" selector — wrong signal, not an app bug.
-2. **sort-select selectOption timeout** — `#sort-select` is real and its option values are
- EXACTLY `natural/newest/title/sku/book` (matches the clickthrough's attempts). It timed
- out only because it sits inside the collapsed window-bar (behind the hamburger) at boot.
- Hidden-by-design, not broken.
+| sweep | tool | result | caught | fixed | commit |
+|-------|------|--------|--------|-------|--------|
+| 1 | generic /3x | 5/6 | 2 (both false-pos: stowed controls) | 0 (correctly) | — |
+| 2 | showroom-aware | 20 defects | dock quote-bug (real) + test-ordering (mine) | dock.js quote→index | b3ca21a |
+| 3 | showroom-aware | 5 defects | sort 0×0 (real) | dock.js panel display:none | b3ca21a |
+| 4 | showroom-aware | 0 | — | — | (clean) |
+| 5 | showroom-aware | 0 | — | — | (clean, 2nd consecutive → DONE) |
-## Why no fixes applied (per /5x rules)
-"Real fixes only; never weaken assertions; never fake a pass." Force-showing the chrome or
-auto-opening the hamburger to satisfy a generic clickthrough would CORRUPT the intended
-immersive-first design. The honest outcome is: the build is functionally sound; the generic
-3-engine clickthrough can't navigate a showroom whose controls live behind a hamburger.
+## The 2 real bugs fixed (both in public/js/dock.js)
+1. **Quote-in-selector** — TOOLS `#top-bar [data-section="wings"]` / `"overview"` were
+ interpolated raw into `data-tool="..."` (inner quotes close the attr) and into
+ `reflectMenu`'s `querySelector('[data-tool="..."]')` (throws "not a valid selector").
+ → Wings + Overview unreachable from the menu; `reflectMenu` threw 14× PAGEERROR.
+ **Fix:** key tools by index (`data-tool-idx`), resolve `TOOLS[idx].sel` in JS.
+2. **Launched panels showed empty** — `launch()` removed `qh-stowed` from the wrapper but
+ not the panel element, so every launched panel's CONTENT stayed `display:none!important`
+ (sort select measured 0×0 → selectOption timed out). Only the header bar showed.
+ **Fix:** `el.classList.remove('qh-stowed')` on launch. Verified by screenshot — Versions
+ list + Controls sort/sliders now render.
-## Evidence
-- /tmp/showroom-asloaded.png — clean immersive boot (ikat board + avatar hand + hamburger)
-- Control probe: sortValue=natural, opts=[natural,newest,title,sku,book], chrome hidden by design
-- B4/B5/B6 (Chrome/Safari/Firefox) all opened + rendered visually.
+## Final clean state (sweep 4 & 5)
+hamburger→menu, all 5 panels launch WITH content, sort all 5 options, all 4 ranges,
+all 4 nav buttons, all 10 tools (incl. Wings/Overview), 0 console errors.
-## Open / honest residual
-- The right tool for THIS app is the showroom's own suite (verify-ageview-phase5/3x/avatar,
- all PASS) which drives controls via the real `_qh`/`_ageview` API, not a blind clickthrough.
+## Why this matters
+These are real user-facing bugs (empty panels, dead menu items, console crashes) that the
+blind /3x could never reach. The showroom-aware clickthrough is now a reusable tester that
+respects the immersive-first / hamburger-dock UI.
diff --git a/public/js/showroom.js b/public/js/showroom.js
index f101a0e..a2a3d4a 100644
--- a/public/js/showroom.js
+++ b/public/js/showroom.js
@@ -234,9 +234,11 @@ function init() {
window.addEventListener('resize', onResize, false);
window.addEventListener('keydown', e => {
keysDown[e.code] = true;
- // CENTER BOOK paging — [ / ] (and N / P) change which catalog design the open book shows.
- if (BOOK_MODE && (e.code === 'BracketRight' || e.code === 'KeyN')) { e.preventDefault(); pageCenterBook(1); return; }
- if (BOOK_MODE && (e.code === 'BracketLeft' || e.code === 'KeyP')) { e.preventDefault(); pageCenterBook(-1); return; }
+ // CENTER BOOK paging — ←/→ ARROWS (Steve's pick) are the primary Prev/Next, plus [ / ] and
+ // N / P. ArrowRight = next design on the open wings, ArrowLeft = previous. (Body-turn moved
+ // to A/D so the arrows don't both page AND turn.) ↑/↓ still walk.
+ if (BOOK_MODE && (e.code === 'ArrowRight' || e.code === 'BracketRight' || e.code === 'KeyN')) { e.preventDefault(); pageCenterBook(1); return; }
+ if (BOOK_MODE && (e.code === 'ArrowLeft' || e.code === 'BracketLeft' || e.code === 'KeyP')) { e.preventDefault(); pageCenterBook(-1); return; }
if (e.code === 'KeyM') {
minimapVisible = !minimapVisible;
const mc = document.getElementById('minimap');
@@ -2817,13 +2819,14 @@ function updateWASD(dt) {
if (controlsLocked || cameraAnim) return; // no input when focused on a wing or animating
// ── EXPLORE / TAKEOVER (default): you ARE the avatar. ↑/↓ = walk forward/back along the
- // facing direction; ←/→ = TURN the body (yaw). The camera AND avatarRig move together.
+ // facing direction; A/D = TURN the body (yaw). ←/→ ARROWS page Prev/Next design (handled in
+ // keydown) — NOT turn — so browsing the wings and steering the body don't collide.
if (exploreMode) {
let moveIn = 0, turnIn = 0;
if (keysDown['ArrowUp'] || keysDown['KeyW']) moveIn += 1; // walk forward
if (keysDown['ArrowDown'] || keysDown['KeyS']) moveIn -= 1; // walk back
- if (keysDown['ArrowLeft'] || keysDown['KeyA']) turnIn -= 1; // turn body left
- if (keysDown['ArrowRight'] || keysDown['KeyD']) turnIn += 1; // turn body right
+ if (keysDown['KeyA']) turnIn -= 1; // turn body left (A — arrows page patterns)
+ if (keysDown['KeyD']) turnIn += 1; // turn body right (D)
// Turn the body first so a held forward walks along the NEW facing this frame.
if (turnIn !== 0) { spinYaw += turnIn * SPIN_YAW_SPEED * dt; applySpinPose(); }
← b3ca21a /5x: showroom-aware clickthrough + fix 2 real dock.js bugs i
·
back to Quadrille Showroom
·
Arrow keys (left/right) page prev/next pattern on the wings; 95724fe →