[object Object]

← back to Quadrille House Site

settlement scrub (remove 42 banana-leaf/tropical/bird/butterfly patterns) + real room-setting hero + 3D Showroom button (catalog bar)

6a38e9931c3efe91dad756ce4762635b9d4d6c9f · 2026-06-30 16:50:35 -0700 · Steve Abrams

Files touched

Diff

commit 6a38e9931c3efe91dad756ce4762635b9d4d6c9f
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue Jun 30 16:50:35 2026 -0700

    settlement scrub (remove 42 banana-leaf/tropical/bird/butterfly patterns) + real room-setting hero + 3D Showroom button (catalog bar)
---
 public/index.html | 15 ++++++++++-----
 server.js         | 18 +++++++++++++++++-
 2 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/public/index.html b/public/index.html
index f5c12bc..078ef46 100644
--- a/public/index.html
+++ b/public/index.html
@@ -82,6 +82,7 @@
   <div class="controls-in">
     <a href="https://www.designerwallcoverings.com" class="bar-wm">Designer Wallcoverings</a>
     <div class="count"><b id="cnt">—</b> designs</div>
+    <a class="chip sr-btn" href="https://quadrille-showroom.designerwallcoverings.com" target="_blank" rel="noopener">3D Showroom ▸</a>
     <div class="ctl">
       <label for="pattern">Pattern</label>
       <select id="pattern"><option value="">All patterns</option></select>
@@ -153,14 +154,18 @@ let ALL=[], activeBrand='all', activeColor=null, activeSeries=null, FACETS=null,
 const LS={sort:'qhouse.sort', dens:'qhouse.density', brand:'qhouse.brand'};
 const BUCKET_HEX={white:'#efeae0',grey:'#9e978c',black:'#2a2722',red:'#a23b2e',orange:'#c8763a',brown:'#7b5a3c',gold:'#b8923f',green:'#5d7150',teal:'#3f8a86',blue:'#5a7494',purple:'#7a5f86',pink:'#bb8aa0'};
 
-// hero rotation from room shots
-function startHero(items){
-  const pool=items.filter(p=>p.room&&p.images&&p.images.length>1).slice(0,7);
+// hero rotation from REAL interior room-setting photos (lookbook rooms), not
+// fabric-group shots. Falls back to product room shots if the lookbook is empty.
+async function startHero(items){
+  let pool=[];
+  try{ const lb=await (await fetch('/api/lookbook')).json(); pool=(lb.rooms||[]).map(r=>r.src).filter(Boolean); }catch{}
+  if(pool.length<3){ pool=pool.concat(items.filter(p=>p.room&&p.images&&p.images.length>1).map(p=>p.room)); }
+  pool=pool.slice(0,8);
   const h=$('#hero');
-  pool.forEach((p,i)=>{
+  pool.forEach((src,i)=>{
     const d=document.createElement('div');
     d.className='slide'+(i===0?' on':'');
-    d.style.backgroundImage=`url("${p.room}")`;
+    d.style.backgroundImage=`url("${src}")`;
     h.insertBefore(d,h.firstChild);
   });
   const slides=[...document.querySelectorAll('.hero .slide')];
diff --git a/server.js b/server.js
index 3f60c58..ebe43f5 100644
--- a/server.js
+++ b/server.js
@@ -19,10 +19,26 @@ const STORE_BASE = 'https://www.designerwallcoverings.com';
 
 let HOUSE = { products: [], brands: [] };
 let LOOKBOOK = { lookbooks: [], rooms: [] };
+// Settlement gate (legal, HARD): never render banana-leaf / tropical-foliage /
+// bird / butterfly / grape motifs — the settlement-trigger families. Word-boundary
+// match on title/series/color/display_name; "leaf" only as a motif (keep "Leaf
+// Green/Greens" colorways). Filtering at load means flagged products are absent
+// from EVERY endpoint (/api/products, /api/facets, /api/pairs) and the hero at once.
+const SETTLEMENT_BLOCK = /\b(banana|palm|frond|tropical|foliage|bird|butterfly|grape)\b/i;
+const LEAF_MOTIF = /\bleaf(?!\s+greens?\b)/i;
+function settlementSafe(p) {
+  const t = `${p.title || ''} ${p.series || ''} ${p.color || ''} ${p.display_name || ''}`;
+  return !SETTLEMENT_BLOCK.test(t) && !LEAF_MOTIF.test(t);
+}
 function load() {
   HOUSE = JSON.parse(fs.readFileSync(path.join(DATA, 'house.json'), 'utf8'));
+  const before = HOUSE.products.length;
+  HOUSE.products = HOUSE.products.filter(settlementSafe);
+  const removed = before - HOUSE.products.length;
   try { LOOKBOOK = JSON.parse(fs.readFileSync(path.join(DATA, 'lookbook.json'), 'utf8')); } catch {}
-  console.log(`[quadrille-house] ${HOUSE.products.length} products · ${HOUSE.brands.length} brands · ${LOOKBOOK.lookbooks.length} lookbooks · ${LOOKBOOK.rooms.length} room shots`);
+  // scrub settlement-triggering room shots from the hero/lookbook pool too
+  if (LOOKBOOK.rooms) LOOKBOOK.rooms = LOOKBOOK.rooms.filter(r => settlementSafe({ title: r.src, color: r.caption }));
+  console.log(`[quadrille-house] ${HOUSE.products.length} products (settlement-scrubbed ${removed}) · ${HOUSE.brands.length} brands · ${LOOKBOOK.lookbooks.length} lookbooks · ${LOOKBOOK.rooms.length} room shots`);
 }
 load();
 

← d992b93 add 3D Showroom Experience hero band below top hero (iframe  ·  back to Quadrille House Site  ·  Quadrille landing: 3D showroom Enter button LINKS OUT to qua 5c0eb6e →