[object Object]

← back to Quadrille Showroom

furniture FIX 2: Transitional now unmistakably distinct from Contemporary

02b4e0a9c073b73f495299bc9afb0579bed46969 · 2026-07-02 10:16:27 -0700 · Steve

Chair upholstery moved OFF cream/greige to a deep sage-olive (mattMat env-0 so the
~1.6x showroom light-lift can't wash it back to cream) so the CHAIR — the dominant
visual mass — reads clearly green vs Contemporary's white seat. Table wood darkened
to a matte mid-oak (env-0) so it reads as solid wood, not pale blonde. Also gates the
resizeRoom re-dress: a resize only re-dresses if the user had actively chosen a room
type, preserving the FIX-1 clean-empty-room boot invariant.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

Files touched

Diff

commit 02b4e0a9c073b73f495299bc9afb0579bed46969
Author: Steve <steve@designerwallcoverings.com>
Date:   Thu Jul 2 10:16:27 2026 -0700

    furniture FIX 2: Transitional now unmistakably distinct from Contemporary
    
    Chair upholstery moved OFF cream/greige to a deep sage-olive (mattMat env-0 so the
    ~1.6x showroom light-lift can't wash it back to cream) so the CHAIR — the dominant
    visual mass — reads clearly green vs Contemporary's white seat. Table wood darkened
    to a matte mid-oak (env-0) so it reads as solid wood, not pale blonde. Also gates the
    resizeRoom re-dress: a resize only re-dresses if the user had actively chosen a room
    type, preserving the FIX-1 clean-empty-room boot invariant.
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---
 public/js/showroom.js | 24 ++++++++++++++++++------
 1 file changed, 18 insertions(+), 6 deletions(-)

diff --git a/public/js/showroom.js b/public/js/showroom.js
index e97ace6..4a08208 100644
--- a/public/js/showroom.js
+++ b/public/js/showroom.js
@@ -1168,12 +1168,16 @@ const FURNITURE_STYLES = {
   transitional: {
     label: 'Transitional',
     buildTable(g) {
-      // WARM honey-oak — clearly a wood tone (not the Contemporary set's cool white).
-      const wood = fmat(0xa9803f, 0.5, 0.0);
+      // DEEP warm mid-oak — pushed well off the Contemporary set's cool white. mattMat
+      // (envMapIntensity 0) is REQUIRED here: the ~1.6x showroom light-lift + ACES tone-map
+      // washes any env-lit wood to pale blonde (proven — a 0.15-env honey rendered nearly
+      // white). A darker matte base survives the lift and reads as a solid oak brown, sitting
+      // clearly between Contemporary's white and Traditional's dark walnut.
+      const wood = mattMat(0x4f3a1c, 0.6);
       const top = new THREE.Mesh(new THREE.BoxGeometry(1.06, 0.055, 0.70), wood);
       top.position.set(0, 0.73, 0); top.castShadow = true; top.receiveShadow = true; g.add(top);
       // softened edge: a thin inset trim just under the top reads as an eased/beveled edge
-      const trim = new THREE.Mesh(new THREE.BoxGeometry(1.00, 0.03, 0.64), fmat(0x8a6531, 0.55, 0.0));
+      const trim = new THREE.Mesh(new THREE.BoxGeometry(1.00, 0.03, 0.64), mattMat(0x3d2c14, 0.65));
       trim.position.set(0, 0.695, 0); trim.castShadow = true; g.add(trim);
       [[-0.45, -0.29], [0.45, -0.29], [-0.45, 0.29], [0.45, 0.29]].forEach(([lx, lz]) =>
         buildTaperedLeg(g, lx, lz, wood, 0.70));
@@ -1182,7 +1186,13 @@ const FURNITURE_STYLES = {
     buildChair(g) {
       // Soft, rounded upholstered chair — a curved barrel back + bolstered front, so its
       // silhouette reads clearly SOFTER than the Contemporary set's crisp rectilinear chair.
-      const wood = fmat(0xa9803f, 0.55, 0.0), greige = fmat(0xcfc3af, 0.9, 0.0);
+      // Upholstery is a DEEP SAGE-OLIVE (not cream/greige) so the chair — the dominant visual
+      // mass — reads clearly green at room distance and is never confused with Contemporary's
+      // crisp white seat. mattMat (env 0) + a deliberately dark, saturated base is REQUIRED:
+      // a pale linen washed to cream under the ~1.6x showroom light-lift (proven). This tone
+      // survives the lift and lands as a recognisable sage.
+      const wood = mattMat(0x4f3a1c, 0.6);
+      const greige = mattMat(0x4c5730, 0.95);
       const c = new THREE.Group(); c.position.set(0, 0, 0.69);
       const seat = new THREE.Mesh(new THREE.BoxGeometry(0.50, 0.12, 0.48), greige);
       seat.position.set(0, 0.45, 0); seat.castShadow = true; seat.receiveShadow = true; c.add(seat);
@@ -5360,8 +5370,10 @@ function resizeRoom(w, d, h) {
   }
   enableStaticShadows();
 
-  // Re-dress the active (or default) room type into the new box.
-  buildRoomType(currentRoomType || 'living');
+  // Re-dress ONLY if the user had actively chosen a room type — the boot default is a
+  // clean empty room (no sofa/lamps/rug), so a resize must NOT silently re-introduce the
+  // dressing. currentRoomType is null until the user clicks a room-type chip.
+  if (currentRoomType) buildRoomType(currentRoomType);
 
   // Persist.
   try { localStorage.setItem('qh_room_w', String(w)); localStorage.setItem('qh_room_h', String(h)); localStorage.setItem('qh_room_d', String(d)); } catch (e) {}

← 6bdf2b5 furniture FIX 1: onload = clean empty room + table+chair onl  ·  back to Quadrille Showroom  ·  chore: v1.3.2 (session close — furniture style selector + ar bf8db8a →