[object Object]

← back to Interiordesignershowroom

ui(build): persistent 3-column Room Builder — left words, right products column, middle images/room-settings centered (desktop); products no longer hidden under hamburger; hint text updated

439a773f4afe655088dce2139a9a8a0dd588b60f · 2026-08-01 23:04:29 -0700 · Steve Abrams

Files touched

Diff

commit 439a773f4afe655088dce2139a9a8a0dd588b60f
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Sat Aug 1 23:04:29 2026 -0700

    ui(build): persistent 3-column Room Builder — left words, right products column, middle images/room-settings centered (desktop); products no longer hidden under hamburger; hint text updated
---
 public/css/site.css | 19 +++++++++++++++++++
 public/js/build.js  |  2 +-
 server.js           |  4 ++--
 3 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/public/css/site.css b/public/css/site.css
index 1400d4b..00e29fd 100644
--- a/public/css/site.css
+++ b/public/css/site.css
@@ -1507,6 +1507,25 @@ body:has(.rb-right:not(.collapsed)) .rb-ham { opacity: 0; pointer-events: none;
    RESPONSIVE
    ========================================================= */
 
+/* Desktop: persistent 3-column Room Builder —
+   LEFT = select words (filters) · MIDDLE = images & room settings (centered) · RIGHT = select products */
+@media (min-width: 981px) {
+  .rb-body { grid-template-columns: 210px minmax(0, 1fr) 300px; }
+  /* products become a real in-grid column instead of an off-canvas drawer */
+  .rb-right {
+    position: sticky; top: 96px; height: auto; max-height: calc(100vh - 116px);
+    width: auto; z-index: 1; box-shadow: none; transform: none;
+    border: 1px solid var(--line); border-radius: 6px;
+  }
+  .rb-right.collapsed { transform: none; }        /* always visible on desktop */
+  .rb-ham, .rb-ham-close { display: none; }        /* no hamburger needed */
+  /* center the middle column's generated images + room settings */
+  .rb-mid { text-align: center; }
+  .rb-render-bar { justify-content: center; }
+  .rb-renders { grid-template-columns: repeat(auto-fill, 320px); justify-content: center; }
+  .rb-pieces { grid-template-columns: repeat(auto-fill, 160px); justify-content: center; }
+}
+
 /* 980px: builder collapses to single column */
 @media (max-width: 980px) {
   .rb-body { grid-template-columns: 1fr; }
diff --git a/public/js/build.js b/public/js/build.js
index ccd9d9c..09353c9 100644
--- a/public/js/build.js
+++ b/public/js/build.js
@@ -57,7 +57,7 @@
     if (cat) parts.push('<span class="rb-chip" data-rmk="cat">' + cat + ' ✕</span>');
     if (brand) parts.push('<span class="rb-chip" data-rmk="brand">' + brand + ' ✕</span>');
     Object.keys(board).forEach(function (id) { var p = board[id]; parts.push('<span class="rb-chip prod" data-rm="' + id + '">' + (p.image_url ? '<img src="' + p.image_url + '">' : '') + (p.title || '').slice(0, 16) + ' ✕</span>'); });
-    $('rbChips').innerHTML = parts.join('') || '<span class="rb-hint">Pick a vibe on the left, ☰ Products to add pieces →</span>';
+    $('rbChips').innerHTML = parts.join('') || '<span class="rb-hint">Pick a vibe on the left, add pieces from Products on the right →</span>';
   }
 
   function query() {
diff --git a/server.js b/server.js
index 7e7f426..bb900e7 100644
--- a/server.js
+++ b/server.js
@@ -376,7 +376,7 @@ app.get('/build', (_req, res) => {
     <div class="rb-tray" id="rbTray" role="toolbar" aria-label="Room builder controls">
       <select id="rbRoom" aria-label="Room type"><option value="">Room…</option>${roomOpts}</select>
       <div class="rb-chips" id="rbChips" role="list" aria-label="Selected filters and pieces">
-        <span class="rb-hint">Pick a vibe on the left — open <strong>Products</strong> to add pieces →</span>
+        <span class="rb-hint">Pick a vibe on the left, add pieces from <strong>Products</strong> on the right →</span>
       </div>
       <input id="rbTitle" type="text" placeholder="Room name (optional)" aria-label="Room name">
       <button id="rbGo" class="cta" type="button" aria-label="Save and view this room">GO ▶</button>
@@ -395,7 +395,7 @@ app.get('/build', (_req, res) => {
         <div class="rb-renders" id="rbRenders" role="list" aria-label="Generated room settings" aria-live="polite">
           <div class="rb-render-ph">
             <span>Your generated room settings appear here.</span><br>
-            <small>Pick a vibe on the left, open <strong>Products</strong> to add pieces, then hit <strong>Generate</strong>. Make several, pick your favorite, and hit <strong>GO</strong> to save.</small>
+            <small>Pick a vibe on the left, add <strong>Products</strong> from the right, then hit <strong>Generate</strong>. Make several, pick your favorite, and hit <strong>GO</strong> to save.</small>
           </div>
         </div>
         <h4 class="rb-pieces-h" id="rbPiecesH" hidden>Shop the pieces in this room</h4>

← b7e8531 feat: shoppable hotspots on the live Room Builder gallery to  ·  back to Interiordesignershowroom  ·  feat(room): thumbnail rail beside the scene — stacked right bede8a7 →