[object Object]

← back to Quadrille Showroom

showroom: boot = first-person user standing in the doorway at the entrance end, stopped (no auto-walk); uniform same-size control pills + small pills on the bottom bar

90fe8f02d9c42bad0e13ca4cacab430a57089a6e · 2026-07-01 07:14:23 -0700 · Steve Abrams

Files touched

Diff

commit 90fe8f02d9c42bad0e13ca4cacab430a57089a6e
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Jul 1 07:14:23 2026 -0700

    showroom: boot = first-person user standing in the doorway at the entrance end, stopped (no auto-walk); uniform same-size control pills + small pills on the bottom bar
---
 public/js/showroom.js  | 39 +++++++++++++++++++--------------------
 public/js/viewmodes.js | 13 ++++++++++---
 public/showroom.html   | 23 +++++++++++++++++++++++
 3 files changed, 52 insertions(+), 23 deletions(-)

diff --git a/public/js/showroom.js b/public/js/showroom.js
index ab23ebc..6bfd632 100644
--- a/public/js/showroom.js
+++ b/public/js/showroom.js
@@ -4078,27 +4078,26 @@ function smoothCameraTo(pos, target, onComplete, fov) {
   };
 }
 
-// Automated "walk through the CENTER" of the showroom on boot (Steve 2026-06-30).
-// A slow forward dolly down the middle of the room, on the shared cameraAnim tween
-// (eases inside the main render loop). walk.enter() parked us at the front looking
-// at the board wall; this glides us up the centre to just in front of the arc, then
-// hands back to free Explore (WASD). Cheap + interruptible (cameraAnim auto-clears
-// on complete; a click stops any tour).
-function _qhStartCenterWalk() {
-  if (cameraAnim) return;
-  const backZ = -CONFIG.room.depth / 2;
-  cameraAnim = {
-    startPos: camera.position.clone(),
-    endPos: new THREE.Vector3(0, 1.62, backZ + 2.4),   // centre of room, eye-level, near the boards
-    startTarget: controls.target.clone(),
-    endTarget: new THREE.Vector3(0, 1.4, backZ + 0.2), // looking straight down the centre at the board wall
-    startFov: camera.fov, endFov: camera.fov,
-    progress: 0,
-    duration: 7.0,        // slow, cinematic centre walk
-    onComplete: null      // leaves the user in Explore among the boards
-  };
+// Boot pose: STAND IN THE DOORWAY at the back (entrance) end of the room and STOP
+// (Steve 2026-07-01). Re-asserted after the BOOK_MODE boot chain settles (which would
+// otherwise re-centre the camera on the book), so the first-person user starts in the
+// doorway looking in toward the boards. No dolly — stationary until WASD.
+function _qhStandInDoorway() {
+  cameraAnim = null;                 // cancel any tween that would move us
+  // Explore must be ON, else the per-frame spin-pose re-pins the camera to lockedSpinEye
+  // (~centre-book z=0.7) every frame and the doorway pose never sticks.
+  if (!exploreMode && window._toggleExploreFromViewmode) window._toggleExploreFromViewmode(true);
+  if (controlsLocked) unlockControls();
+  const z = CONFIG.room.depth / 2 - 0.25;   // in the doorway threshold, centred
+  camera.position.set(0, 1.6, z);
+  controls.target.set(0, 1.4, -CONFIG.room.depth / 2 + 0.2);  // look toward the board wall
+  if (lockedSpinEye) lockedSpinEye.copy(camera.position);     // keep any spin-pose in sync with the doorway
+  camera.lookAt(controls.target);
+  camera.updateProjectionMatrix();
+  if (controls.update) controls.update();
 }
-window._qhStartCenterWalk = _qhStartCenterWalk;
+window._qhStandInDoorway = _qhStandInDoorway;
+window._qhStartCenterWalk = _qhStandInDoorway;   // legacy alias (auto-walk retired)
 
 function updateSampleTray() {
   const tray = document.getElementById('sample-tray'), items = document.getElementById('tray-items');
diff --git a/public/js/viewmodes.js b/public/js/viewmodes.js
index 0795811..d67b466 100644
--- a/public/js/viewmodes.js
+++ b/public/js/viewmodes.js
@@ -140,7 +140,9 @@ function boot() {
         ctl.enableRotate = true; ctl.enableZoom = true; ctl.enablePan = false;
         // Hand off to the showroom's native Explore so WASD + proximity book-match work.
         if (!QH.exploreMode && window._toggleExploreFromViewmode) window._toggleExploreFromViewmode(true);
-        const pos = new THREE.Vector3(0, 1.6, ROOM.depth / 2 - 1.2);
+        // Stand IN THE DOORWAY at the back (entrance) end of the room, centred, eye-level,
+        // looking straight in toward the board wall (Steve 2026-07-01).
+        const pos = new THREE.Vector3(0, 1.6, ROOM.depth / 2 - 0.25);
         QH.camera.position.copy(pos);
         ctl.target.set(0, 1.4, backZ);
         QH.setTargetFov(55); QH.camera.fov = 55; QH.camera.updateProjectionMatrix();
@@ -862,9 +864,14 @@ function boot() {
   const safeBootModes = { walk: 1, hero: 1, macro: 1, room: 1, table: 1 };
   const bootMode = (savedMode && MODES[savedMode] && safeBootModes[savedMode]) ? savedMode : 'walk';
   setMode(bootMode, true);
+  // Boot = the first-person user STANDS IN THE DOORWAY at the back (entrance) end of
+  // the room and STOPS (Steve 2026-07-01) — stationary, looking in toward the boards.
+  // The BOOK_MODE boot chain re-centres the camera on the book at +700/+1500ms, so we
+  // re-assert the doorway pose just after it settles. No dolly — stationary until WASD.
   if (bootMode === 'walk') {
-    // Kick the automated center walk-through a beat after the scene settles.
-    setTimeout(() => { if (currentMode === 'walk' && window._qhStartCenterWalk) window._qhStartCenterWalk(); }, 1400);
+    [1700, 2100].forEach(t => setTimeout(() => {
+      if (currentMode === 'walk' && window._qhStandInDoorway) window._qhStandInDoorway();
+    }, t));
   }
 
   // Expose for the test harness + for showroom guided buttons to re-assert the view.
diff --git a/public/showroom.html b/public/showroom.html
index 907cdb0..f862747 100644
--- a/public/showroom.html
+++ b/public/showroom.html
@@ -200,6 +200,29 @@
     body.book-mode #now-viewing,
     body.book-mode #guided-title,
     body.book-mode #guided-instruction { display:none !important; }
+
+    /* ── Uniform control PILLS (Steve 2026-07-01): every control is the same-size pill;
+       the bottom #window-bar row is SMALL pills; panels stay tucked in the hamburger. ── */
+    .vm-chip,
+    #window-bar button, #window-bar #sort-select,
+    #vm-sample-addbtn, #vm-sample-add, .sr-btn {
+      border-radius: 999px !important;
+      min-height: 30px !important;
+      padding: 5px 16px !important;
+      font-size: 12px !important;
+      line-height: 1.1 !important;
+      box-sizing: border-box !important;
+      display: inline-flex !important;
+      align-items: center !important;
+      justify-content: center !important;
+    }
+    /* small pills along the bottom bar */
+    #window-bar { border-radius: 999px !important; }
+    #window-bar button, #window-bar #sort-select {
+      min-height: 26px !important;
+      padding: 3px 13px !important;
+      font-size: 11px !important;
+    }
 </style>
 </head>
 <body class="guided-mode">

← 8dfe072 showroom P3: At-the-Table view — seated avatar + click-patte  ·  back to Quadrille Showroom  ·  showroom polish (070126A): wrap consultation nook in a group 842a1dc →