[object Object]

← back to Consulting Designerwallcoverings Com

graphics+analysis pass: catalog DNA (style/color/needs-tags), 46x ramp chart, gradient fills, real product imagery in mosaic + concept grids/heroes, #all deep-link

d75255d5ac6cd5a95bdd75023595fe8c734c3a98 · 2026-07-26 08:29:29 -0700 · Steve Abrams

Files touched

Diff

commit d75255d5ac6cd5a95bdd75023595fe8c734c3a98
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Sun Jul 26 08:29:29 2026 -0700

    graphics+analysis pass: catalog DNA (style/color/needs-tags), 46x ramp chart, gradient fills, real product imagery in mosaic + concept grids/heroes, #all deep-link
---
 build.mjs                     |  73 +++++++++--
 data/dw-analysis.json         | 290 +++++++++++++++++++++++++++++++++++++++++-
 public/portal.html            |  46 +++++--
 public/versions/atelier.html  |  80 ++++++------
 public/versions/gallery.html  |  80 ++++++------
 public/versions/heritage.html |  80 ++++++------
 public/versions/maison.html   |  80 ++++++------
 public/versions/studio.html   |  80 ++++++------
 public/versions/texture.html  |  80 ++++++------
 scripts/collect-dw.mjs        |  33 +++++
 10 files changed, 664 insertions(+), 258 deletions(-)

diff --git a/build.mjs b/build.mjs
index 2c74b2d..1afcdc2 100644
--- a/build.mjs
+++ b/build.mjs
@@ -16,6 +16,7 @@ const readJ = (p, d) => { try { return JSON.parse(readFileSync(join(HERE, p), 'u
 const client = readJ('data/client.json', {});
 const SNAP = readJ('data/dw-analysis.json', { catalog: {}, channels: [], fleet: { count: 0, sites: [] }, competitors: [] });
 const ADS = readJ('data/ads.json', []);
+const GALLERY = Array.isArray(SNAP.gallery) ? SNAP.gallery : [];
 const C = SNAP.catalog || {};
 const FF = C.five_field || {};
 const SO = C.sample_only || { total: 0, quote_only_by_design: 0, backlog: 0 };
@@ -70,6 +71,10 @@ const CHART = {
   // Analyst-scored competitive read (authority vs digital polish, 0-100) — analyst tier
   comp: { labels: ['Designer Wallcoverings', 'DecoratorsBest', 'Burke Decor', 'Mahones', 'Finest Wallpaper', "Steve's B&W"],
     catalog: [96, 62, 48, 55, 40, 45], digital: [58, 82, 78, 60, 42, 55] },
+  monthly: { labels: (C.monthly_activation || []).map(m => m.month), added: (C.monthly_activation || []).map(m => m.added) },
+  needs: { labels: (C.needs_tags || []).map(n => n.tag.replace('Needs-', 'Needs ')), counts: (C.needs_tags || []).map(n => n.count) },
+  styles: { labels: (C.style_mix || []).map(s => s.style), counts: (C.style_mix || []).map(s => s.count) },
+  colors: { labels: (C.color_mix || []).map(c => c.color), counts: (C.color_mix || []).map(c => c.count), hex: (C.color_mix || []).map(c => c.hex) },
 };
 
 /* ---- map: DW + tracked competitor HQs (analyst-compiled geo) ---------------- */
@@ -191,7 +196,10 @@ const SOURCES = [
   ['Competitor scoring chart + map pins', 'Analyst assessment over public sites; HQ geo compiled from public records', 'Authored consulting view — NOT scraped metrics; the map is oriented, not surveyed', 'analyst'],
   ['Price-band chart', C.price_bands_basis || 'Priced subset of the mirror', 'Partial-basis chart, labeled as such — full variant pricing lives Shopify-side', 'derived'],
   ['Website & social audits, partners, revenue plays, roadmap', 'Analyst strategy grounded in the operating knowledge of the DW stack', 'Consulting recommendations — models and plays, not measurements', 'analyst'],
-  ['Hero & section imagery', 'Unsplash editorial stock (luxury materials, per the luxe-only imagery rule)', 'Hotlinked, decorative only — carries no data meaning', 'estimate'],
+  ['Catalog DNA — style, color & workflow-tag charts', 'Tag-match SQL over all actives (the same tag buckets the storefront sort uses)', 'Live counts per style/color/Needs-* tag; the color doughnut renders in representative hues of the tag names', 'live'],
+  ['Monthly activation ramp', 'created_at_shopify over the last 7 calendar months, live mirror', 'Direct SQL; the ramp multiplier in the copy is computed from the same series', 'live'],
+  ['Product mosaic + concept-grid imagery', "The store's own CDN (one current ACTIVE product per vendor line, forbidden-vendor-filtered)", 'Already customer-facing on the live store; hotlinked at thumbnail width', 'live'],
+  ['Hero imagery', 'Unsplash editorial stock (luxury materials, per the luxe-only imagery rule)', 'Hotlinked, decorative only — carries no data meaning', 'estimate'],
 ];
 const srcRows = SOURCES.map(s => { const t = SRC_TIER[s[3]] || ['—', 'a']; return `<tr><td><b>${s[0]}</b></td><td>${s[1]}</td><td>${s[2]}</td><td class="srccell"><span class="srcb ${t[1]}">${t[0]}</span></td></tr>`; }).join('');
 const srcLegend = [...new Set(SOURCES.map(s => s[3]))].map(k => { const t = SRC_TIER[k]; return `<span class="srcb ${t[1]}">${t[0]}</span>`; }).join('');
@@ -309,6 +317,13 @@ td.srccell{white-space:nowrap;vertical-align:middle}
 .leaflet-container{background:#0a0908;font-family:'Jost',sans-serif}
 .leaflet-popup-content-wrapper{background:var(--panel);color:var(--ink);border:1px solid var(--line)}
 .leaflet-popup-tip{background:var(--panel)}
+.duo{display:grid;grid-template-columns:1fr 1fr;gap:20px}@media(max-width:900px){.duo{grid-template-columns:1fr}}
+.mosaic{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px;margin-top:34px}
+.mtile{position:relative;aspect-ratio:1;overflow:hidden;border-radius:5px;border:1px solid var(--line);display:block}
+.mtile img{width:100%;height:100%;object-fit:cover;transition:transform .5s ease;display:block}
+.mtile:hover img{transform:scale(1.06)}
+.mtile span{position:absolute;left:0;right:0;bottom:0;font-size:10px;letter-spacing:.1em;text-transform:uppercase;padding:14px 10px 8px;background:linear-gradient(0deg,rgba(10,8,6,.85),transparent);color:var(--ink);opacity:0;transition:.3s}
+.mtile:hover span{opacity:1}
 .kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:14px;margin-top:34px}
 .kpi{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:22px 20px}
 .kpi .kv{font-family:'Cormorant Garamond',serif;font-size:34px;color:var(--gold);line-height:1}
@@ -357,6 +372,14 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
   <div class="chartwrap tall"><div class="ct">Top vendor lines by live products</div><canvas id="vendorChart"></canvas></div>
   <div class="chartwrap"><div class="ct">Live catalog by product type</div><canvas id="typeChart"></canvas></div>
   <table><thead><tr><th>#</th><th>Vendor line</th><th>Active products</th></tr></thead><tbody>${vendorRows}</tbody></table>
+  <div class="eyebrow" style="margin-top:52px">Catalog DNA — what the shelves actually hold</div>
+  <p class="lead2">Tag analysis across all ${fmt(FF.active_total)} actives. The palette runs <b>neutrals-first</b> — Beige + White alone account for ~${fmt(((C.color_mix || []).find(c => c.color === 'Beige')?.count || 0) + ((C.color_mix || []).find(c => c.color === 'White')?.count || 0))} products — a texture-led, trade-calibrated assortment. The merchandising read: DW owns the "quiet luxury" wall; bolder saturated stories (the DTC entrants' lane) are the underweighted shelf.</p>
+  <div class="duo">
+    <div class="chartwrap"><div class="ct">Style mix — tag-matched across actives</div><canvas id="styleChart"></canvas></div>
+    <div class="chartwrap"><div class="ct">Color mix — rendered in the actual hues</div><canvas id="colorChart"></canvas></div>
+  </div>
+  <div class="mosaic">${GALLERY.slice(0, 12).map(g => `<a class="mtile" title="${String(g.title).replace(/"/g, '&quot;')} — ${g.vendor}"><img src="${g.image}&width=360" loading="lazy" alt="${String(g.title).replace(/"/g, '&quot;')}"><span>${g.vendor}</span></a>`).join('')}</div>
+  <p class="lead2" style="font-size:14px;opacity:.6;margin-top:10px">Live catalog, not stock photography — one current product from each of twelve vendor lines, straight off the store's own CDN.</p>
   <div class="eyebrow" style="margin-top:52px">The discovery fleet</div>
   <p class="lead2">${fmt(SNAP.fleet?.count)} microsites — material-, era-, and city-specific storefront satellites that catch long-tail search and funnel to the flagship. A sample:</p>
   <div class="fchips">${fleetChips}</div>
@@ -368,6 +391,9 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
   <div class="flagbox"><div class="i">◆</div><div><h3 class="disp">The ${fmt(SO.backlog)}-product finding</h3><p><b>${fmt(SO.total)}</b> actives are sample-only. <b>${fmt(SO.quote_only_by_design)}</b> of those are quote-only lines by design. The remaining <b>${fmt(SO.backlog)}</b> — a third of the live catalog — can be browsed and sampled but not bought. Every one is paid-for merchandising with the register removed. This is the single largest dormant-revenue pool in the business.</p></div></div>
   <div class="chartwrap"><div class="ct">Sample-only actives — where they sit (top lines)</div><canvas id="soChart"></canvas></div>
   <table><thead><tr><th>Vendor line</th><th>Sample-only actives</th></tr></thead><tbody>${soVendorRows}</tbody></table>
+  <div class="eyebrow" style="margin-top:52px">The catalog's own to-do list</div>
+  <p class="lead2">The workflow tags tell the story without an audit: <b>${fmt((C.needs_tags || []).find(n => n.tag === 'Needs-Width')?.count)}</b> actives are tagged Needs-Width, <b>${fmt((C.needs_tags || []).find(n => n.tag === 'Needs-Price')?.count)}</b> Needs-Price, <b>${fmt((C.needs_tags || []).find(n => n.tag === 'Needs-Image')?.count)}</b> Needs-Image. These self-reported queues ARE the integrity sprint's work orders — pre-triaged, machine-readable, waiting.</p>
+  <div class="chartwrap"><div class="ct">Workflow-tag backlog on active products (live tag counts)</div><canvas id="needsChart"></canvas></div>
 </div></section>
 
 <section id="competitors"><div class="eyebrow">03 · Competitive Landscape</div><h2 class="disp">Depth vs. polish: the field.</h2><div class="accbody">
@@ -392,7 +418,8 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
 </div></section>
 
 <section id="timing"><div class="eyebrow">05 · Timing &amp; Cadence</div><h2 class="disp">The drip is live. Point it at revenue.</h2><div class="accbody">
-  <p class="lead2">New actives per week from the live mirror — the activation engine at work. The merchandising calendar below aligns campaigns to the natural intent cycle of the category.</p>
+  <p class="lead2">The growth curve, measured: monthly activations ramped from <b>${fmt((C.monthly_activation || [])[0]?.added)}</b> in ${(C.monthly_activation || [])[0]?.month || 'Jan'} to <b>${fmt((C.monthly_activation || []).slice(-1)[0]?.added)}</b> in ${(C.monthly_activation || []).slice(-1)[0]?.month || 'Jul'} — a ${(() => { const m = C.monthly_activation || []; const a = m[0]?.added || 1, b = m.slice(-1)[0]?.added || 0; return fmt(Math.round(b / a)); })()}× ramp as the activation engine came online. The merchandising calendar below aligns campaigns to the category's natural intent cycle.</p>
+  <div class="chartwrap"><div class="ct">The ramp — new actives per month, last 7 months (live)</div><canvas id="rampChart"></canvas></div>
   <div class="chartwrap"><div class="ct">New active products per week — last 12 weeks (live)</div><canvas id="cadenceChart"></canvas></div>
   <table><thead><tr><th>Month</th><th>What the market is doing</th><th>The DW play</th></tr></thead><tbody>${calRows}</tbody></table>
 </div></section>
@@ -483,6 +510,7 @@ secs.forEach(function(sec){var eb=sec.querySelector(':scope>.eyebrow'),h2=sec.qu
 function drawRoad(sec){var rd=sec.querySelector('.road');if(rd)setTimeout(function(){rd.classList.add('drawn');},140);}
 function setAll(o){accs.forEach(function(s){s.classList.toggle('open',o);var c=s.querySelector('.chev');if(c)c.textContent=o?'\\u2013':'+';if(o)drawRoad(s);});if(o){initCharts();initMap();}}
 document.getElementById('xall').onclick=function(){setAll(true);};document.getElementById('call').onclick=function(){setAll(false);};
+if(location.hash==='#all'){setAll(true);} // deep-link: /portal#all opens the whole brief
 document.querySelectorAll('.menu a[href^="#"]').forEach(function(a){a.addEventListener('click',function(){var id=a.getAttribute('href').slice(1),s=document.getElementById(id);if(s&&!s.classList.contains('open')&&s.querySelector('.acchead')){s.querySelector('.acchead').click();}if(s)setTimeout(function(){s.scrollIntoView({behavior:'smooth'});},80);});});
 (function(){var burger=document.querySelector('.burger');if(!burger)return;function sync(){burger.setAttribute('aria-expanded',document.body.classList.contains('nav'));}new MutationObserver(sync).observe(document.body,{attributes:true,attributeFilter:['class']});sync();})();
 var io=new IntersectionObserver(function(es){es.forEach(function(e){if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target);}});},{threshold:.12});
@@ -497,14 +525,20 @@ function initCharts(){if(charted||!window.Chart)return;charted=true;
   if(!RM){Chart.defaults.animations={y:{from:function(c){return c.chart.scales.y?c.chart.scales.y.getPixelForValue(0):0;}}};}
   var D=${JSON.stringify(CHART)};
   function mk(id,cfg){var el=document.getElementById(id);if(el)new Chart(el,cfg);}
+  // Vertical gold gradient for area fills — scriptable so it re-derives per chart area
+  function goldFill(a){return function(c){var ch=c.chart,area=ch.chartArea;if(!area)return 'rgba(201,162,75,.12)';var g=ch.ctx.createLinearGradient(0,area.top,0,area.bottom);g.addColorStop(0,'rgba(201,162,75,'+a+')');g.addColorStop(1,'rgba(201,162,75,0)');return g;};}
+  mk('rampChart',{type:'bar',data:{labels:D.monthly.labels,datasets:[{label:'New actives / month',data:D.monthly.added,backgroundColor:function(c){var ch=c.chart,area=ch.chartArea;if(!area)return 'rgba(201,162,75,.7)';var g=ch.ctx.createLinearGradient(0,area.bottom,0,area.top);g.addColorStop(0,'rgba(201,162,75,.25)');g.addColorStop(1,'rgba(201,162,75,.9)');return g;},borderRadius:5}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}},plugins:{legend:{display:false}}}});
+  mk('needsChart',{type:'bar',data:{labels:D.needs.labels,datasets:[{label:'Actives tagged',data:D.needs.counts,backgroundColor:'rgba(232,160,160,.72)',borderRadius:5}]},options:{indexAxis:'y',responsive:true,maintainAspectRatio:false,scales:{x:{grid:{color:line}},y:{grid:{display:false}}},plugins:{legend:{display:false}}}});
+  mk('styleChart',{type:'bar',data:{labels:D.styles.labels,datasets:[{label:'Actives tagged',data:D.styles.counts,backgroundColor:'rgba(201,162,75,.72)',borderRadius:5}]},options:{indexAxis:'y',responsive:true,maintainAspectRatio:false,scales:{x:{grid:{color:line}},y:{grid:{display:false}}},plugins:{legend:{display:false}}}});
+  mk('colorChart',{type:'doughnut',data:{labels:D.colors.labels,datasets:[{data:D.colors.counts,backgroundColor:D.colors.hex,borderColor:'#0e0c09',borderWidth:2}]},options:{responsive:true,maintainAspectRatio:false,plugins:{legend:{position:'right',labels:{color:dim,boxWidth:12}}},cutout:'58%'}});
   mk('vendorChart',{type:'bar',data:{labels:D.vendors.labels,datasets:[{label:'Active products',data:D.vendors.counts,backgroundColor:'rgba(201,162,75,.75)'}]},options:{indexAxis:'y',responsive:true,maintainAspectRatio:false,scales:{x:{grid:{color:line}},y:{grid:{display:false}}},plugins:{legend:{display:false}}}});
   mk('typeChart',{type:'doughnut',data:{labels:D.types.labels,datasets:[{data:D.types.counts,backgroundColor:['#c9a24b','#b78d3f','#a67c32','#d9b877','#8f6d2c','#e3c98d'],borderColor:'#0e0c09',borderWidth:2}]},options:{responsive:true,maintainAspectRatio:false,plugins:{legend:{position:'right',labels:{color:dim,boxWidth:12}}},cutout:'58%'}});
   mk('ffChart',{type:'bar',data:{labels:D.integrity.labels,datasets:[{label:'Actives failing',data:D.integrity.counts,backgroundColor:D.integrity.counts.map(function(v){return v>10000?'rgba(232,160,160,.8)':'rgba(201,162,75,.6)';})}]},options:{indexAxis:'y',responsive:true,maintainAspectRatio:false,scales:{x:{grid:{color:line}},y:{grid:{display:false}}},plugins:{legend:{display:false}}}});
   mk('soChart',{type:'bar',data:{labels:D.sampleOnlyVendors.labels,datasets:[{label:'Sample-only actives',data:D.sampleOnlyVendors.counts,backgroundColor:'rgba(232,160,160,.7)'}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}},plugins:{legend:{display:false}}}});
   mk('compChart',{type:'bar',data:{labels:D.comp.labels,datasets:[{label:'Catalog depth',data:D.comp.catalog,backgroundColor:'rgba(201,162,75,.75)'},{label:'Digital polish',data:D.comp.digital,backgroundColor:'rgba(120,170,255,.6)'}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line},max:100},x:{grid:{display:false}}},plugins:{legend:{labels:{color:dim}}}}});
   mk('chanChart',{type:'bar',data:{labels:D.channels.labels,datasets:[{label:'Connected accounts',data:D.channels.accounts,backgroundColor:'rgba(201,162,75,.75)'}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}},plugins:{legend:{display:false}}}});
-  mk('cadenceChart',{type:'line',data:{labels:D.cadence.labels,datasets:[{label:'New actives / week',data:D.cadence.added,borderColor:gold,backgroundColor:'rgba(201,162,75,.12)',fill:true,tension:.4,pointRadius:4}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}},plugins:{legend:{display:false}}}});
-  mk('deskChart',{type:'line',data:{labels:D.cadence.labels,datasets:[{label:'New actives / week',data:D.cadence.added,borderColor:gold,backgroundColor:'rgba(201,162,75,.12)',fill:true,tension:.4,pointRadius:4}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}},plugins:{legend:{display:false}}}});
+  mk('cadenceChart',{type:'line',data:{labels:D.cadence.labels,datasets:[{label:'New actives / week',data:D.cadence.added,borderColor:gold,backgroundColor:goldFill(.30),fill:true,tension:.4,pointRadius:4}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}},plugins:{legend:{display:false}}}});
+  mk('deskChart',{type:'line',data:{labels:D.cadence.labels,datasets:[{label:'New actives / week',data:D.cadence.added,borderColor:gold,backgroundColor:goldFill(.30),fill:true,tension:.4,pointRadius:4}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}},plugins:{legend:{display:false}}}});
   mk('bandChart',{type:'bar',data:{labels:D.bands.labels,datasets:[{label:'Products (priced subset)',data:D.bands.counts,backgroundColor:'rgba(201,162,75,.6)'}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}},plugins:{legend:{display:false}}}});
 }
 var mapped=false;
@@ -520,14 +554,25 @@ function initMap(){if(mapped||!window.L||!document.getElementById('compmap'))ret
 </body></html>`;
 
 /* ================================================== concept version pages === */
-function versionPage(h) {
+function versionPage(h, conceptIdx = 0) {
+  // Real, already-customer-facing product imagery from the snapshot gallery —
+  // each concept starts at a different offset so the six pages read distinct.
+  const off = (conceptIdx * 4) % Math.max(GALLERY.length, 1);
+  const pool = GALLERY.length >= 12
+    ? [...GALLERY.slice(off), ...GALLERY.slice(0, off)].slice(0, 12)
+    : null;
   const gridCards = Array.from({ length: 12 }, (_, i) => {
     const hue = [28, 152, 208, 12, 262, 88, 340, 190, 46, 300, 130, 20][i];
-    const names = ['Chinois Garden', 'Venetian Plaster', 'Grasscloth No. 9', 'Deco Fan', 'Midnight Damask', 'Coastal Weave', 'Rosewood Toile', 'Celadon Silk', 'Gilt Trellis', 'Amethyst Moire', 'Sage Stripe', 'Terra Fresco'][i];
+    const g = pool ? pool[i] : null;
+    const title = g ? g.title.split('|')[0].replace(/\s*Wallcoverings?\b.*$/i, '').replace(/\s*[-–,]\s*$/, '').trim() : ['Chinois Garden', 'Venetian Plaster', 'Grasscloth No. 9', 'Deco Fan', 'Midnight Damask', 'Coastal Weave', 'Rosewood Toile', 'Celadon Silk', 'Gilt Trellis', 'Amethyst Moire', 'Sage Stripe', 'Terra Fresco'][i];
+    const metaLeft = g ? g.vendor : ['Wallcovering', 'Fabric', 'Mural'][i % 3];
     const tierName = ['casual', 'signature', 'reserve'][i % 3];
-    return `<article class="gcard" data-title="${names}" data-hue="${hue}" data-tier="${i % 3}">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(${hue},22%,${h.dark ? 24 : 78}%),hsl(${(hue + 40) % 360},30%,${h.dark ? 14 : 64}%))"></div>
-      <h4>${names}</h4><div class="gmeta"><span>${['Wallcovering', 'Fabric', 'Mural'][i % 3]}</span><span class="tier">${tierName}</span></div>
+    const img = g
+      ? `<div class="gimg"><img src="${g.image}&width=540" loading="lazy" alt="${String(title).replace(/"/g, '&quot;')}"></div>`
+      : `<div class="gimg" style="background:linear-gradient(135deg,hsl(${hue},22%,${h.dark ? 24 : 78}%),hsl(${(hue + 40) % 360},30%,${h.dark ? 14 : 64}%))"></div>`;
+    return `<article class="gcard" data-title="${String(title).replace(/"/g, '&quot;')}" data-hue="${hue}" data-tier="${i % 3}">
+      ${img}
+      <h4>${title}</h4><div class="gmeta"><span>${metaLeft}</span><span class="tier">${tierName}</span></div>
     </article>`;
   }).join('');
   return `<!doctype html><html lang="en"><head>
@@ -554,7 +599,8 @@ nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
 .heroc p{margin-top:16px;opacity:.75;font-size:17px;max-width:52ch}
 .cta{display:inline-block;margin-top:26px;border:1px solid var(--gold);color:var(--gold);font-size:12px;letter-spacing:.22em;text-transform:uppercase;padding:13px 26px;border-radius:999px;transition:.25s}
 .cta:hover{background:var(--gold);color:${h.dark ? '#0b0b0c' : '#fff'}}
-.heroimg{aspect-ratio:4/3;border-radius:6px;background:linear-gradient(135deg,var(--panel),var(--gold))}
+.heroimg{aspect-ratio:4/3;border-radius:6px;background:linear-gradient(135deg,var(--panel),var(--gold));overflow:hidden}
+.heroimg img{width:100%;height:100%;object-fit:cover;display:block}
 .wrap{max-width:1240px;margin:0 auto;padding:0 22px}
 .sh{display:flex;align-items:center;justify-content:space-between;gap:18px;border-top:3px solid var(--gold);padding-top:12px;margin:34px 0 8px;flex-wrap:wrap}
 .sh h2{font-size:15px;text-transform:uppercase;letter-spacing:.08em;font-weight:600}
@@ -563,7 +609,8 @@ nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
 .controls select{background:var(--panel);color:var(--ink);border:1px solid var(--line);padding:7px 10px;border-radius:4px;font-family:${h.sans};font-size:12px}
 .controls input[type=range]{accent-color:var(--gold);width:110px}
 .grid{display:grid;grid-template-columns:repeat(var(--cols),1fr);gap:20px;padding:18px 0 40px}
-.gcard .gimg{aspect-ratio:3/4;border-radius:5px;transition:.3s}.gcard:hover .gimg{transform:translateY(-4px);box-shadow:0 14px 40px rgba(0,0,0,.28)}
+.gcard .gimg{aspect-ratio:3/4;border-radius:5px;transition:.3s;overflow:hidden;background:var(--panel)}.gcard:hover .gimg{transform:translateY(-4px);box-shadow:0 14px 40px rgba(0,0,0,.28)}
+.gcard .gimg img{width:100%;height:100%;object-fit:cover;display:block}
 .gcard h4{font-family:${h.disp};font-size:16.5px;margin:10px 0 2px}
 .gmeta{display:flex;justify-content:space-between;font-size:11px;opacity:.65;letter-spacing:.06em;text-transform:uppercase}
 .tier{color:var(--gold)}
@@ -581,7 +628,7 @@ footer .in{max-width:1240px;margin:0 auto;padding:36px 22px;display:flex;justify
 <nav class="sec"><div class="in"><a>Wallcoverings</a><a>Fabrics</a><a>Murals</a><a>By Color</a><a>By Room</a><a>New Arrivals</a><a>Trade Program</a><a>Samples</a></div></nav>
 <div class="heroc">
   <div class="rv"><h1 class="disp">${h.tag}</h1><p>${h.mood} A curated face for the deepest designer-wallcovering catalog online — every pattern sampled for $4.25, every order backed by thirty years of trade expertise.</p><a class="cta">Explore the collection</a></div>
-  <div class="heroimg rv"></div>
+  <div class="heroimg rv">${pool ? `<img src="${pool[(conceptIdx + 2) % pool.length].image}&width=1100" alt="" loading="eager">` : ''}</div>
 </div>
 <div class="wrap">
   <div class="sh"><h2>Curated This Week</h2>
@@ -616,5 +663,5 @@ if(sv){sel.value=sv;apply();}if(dv){dens.value=dv;document.documentElement.style
 }
 
 writeFileSync(`${OUT}/portal.html`, app);
-for (const h of HOUSES) writeFileSync(`${OUT}/versions/${h.key}.html`, versionPage(h));
+HOUSES.forEach((h, i) => writeFileSync(`${OUT}/versions/${h.key}.html`, versionPage(h, i)));
 console.log(`Wrote portal.html (14-section DW analysis app, data of ${collectedLabel}) + ${HOUSES.length} concepts: ${HOUSES.map(h => h.key).join(', ')}`);
diff --git a/data/dw-analysis.json b/data/dw-analysis.json
index a1b6c80..9852dcd 100644
--- a/data/dw-analysis.json
+++ b/data/dw-analysis.json
@@ -1,5 +1,5 @@
 {
-  "collected_at": "2026-07-26T15:18:43.298Z",
+  "collected_at": "2026-07-26T15:22:46.241Z",
   "sources": {
     "mirror": "dw_unified local mirror (host=/tmp) — READ ONLY",
     "mcc": "marketing.designerwallcoverings.com/api/channels/status",
@@ -228,6 +228,148 @@
         "vendor": "Osborne & Little",
         "count": 820
       }
+    ],
+    "monthly_activation": [
+      {
+        "month": "Jan",
+        "added": 223
+      },
+      {
+        "month": "Feb",
+        "added": 1363
+      },
+      {
+        "month": "Mar",
+        "added": 4578
+      },
+      {
+        "month": "Apr",
+        "added": 3416
+      },
+      {
+        "month": "May",
+        "added": 493
+      },
+      {
+        "month": "Jun",
+        "added": 5547
+      },
+      {
+        "month": "Jul",
+        "added": 10329
+      }
+    ],
+    "needs_tags": [
+      {
+        "tag": "Needs-Price",
+        "count": 19226
+      },
+      {
+        "tag": "Needs-Image",
+        "count": 16531
+      },
+      {
+        "tag": "Needs-Width",
+        "count": 19656
+      },
+      {
+        "tag": "Needs-Description",
+        "count": 27
+      }
+    ],
+    "style_mix": [
+      {
+        "style": "Contemporary",
+        "count": 32580
+      },
+      {
+        "style": "Textured",
+        "count": 29302
+      },
+      {
+        "style": "Traditional",
+        "count": 22704
+      },
+      {
+        "style": "Geometric",
+        "count": 11747
+      },
+      {
+        "style": "Floral",
+        "count": 10284
+      },
+      {
+        "style": "Grasscloth",
+        "count": 9846
+      },
+      {
+        "style": "Stripe",
+        "count": 9153
+      },
+      {
+        "style": "Mural",
+        "count": 4769
+      },
+      {
+        "style": "Metallic",
+        "count": 3212
+      },
+      {
+        "style": "Damask",
+        "count": 1925
+      }
+    ],
+    "color_mix": [
+      {
+        "color": "Beige",
+        "hex": "#d9c9a8",
+        "count": 22079
+      },
+      {
+        "color": "White",
+        "hex": "#f2efe8",
+        "count": 22061
+      },
+      {
+        "color": "Gray",
+        "hex": "#9a9a99",
+        "count": 12163
+      },
+      {
+        "color": "Blue",
+        "hex": "#5a7fa8",
+        "count": 8550
+      },
+      {
+        "color": "Green",
+        "hex": "#6b8f6d",
+        "count": 7749
+      },
+      {
+        "color": "Brown",
+        "hex": "#8a6a4c",
+        "count": 5192
+      },
+      {
+        "color": "Black",
+        "hex": "#2b2b2b",
+        "count": 4882
+      },
+      {
+        "color": "Gold",
+        "hex": "#c9a24b",
+        "count": 4326
+      },
+      {
+        "color": "Pink",
+        "hex": "#d3a0a6",
+        "count": 3456
+      },
+      {
+        "color": "Red",
+        "hex": "#a84a44",
+        "count": 2946
+      }
     ]
   },
   "channels": [
@@ -651,5 +793,151 @@
       "notes": "Peel & stick only — different category"
     }
   ],
+  "gallery": [
+    {
+      "title": "Willow Pearl - Cream Wallcovering | 1838 Wallcoverings",
+      "vendor": "1838 Wallcoverings",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/2008-148-04-Willow-Pearl-scaled_27cc3134-1291-4605-85ca-d870cd905b85.jpg?v=1773305872"
+    },
+    {
+      "title": "Designdrop - Colourful Wallcovering | A.s. Création",
+      "vendor": "A.S. Création",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/66e3a5f29fd1fd50090f5d5fce9b4ddc.jpg?v=1773629119"
+    },
+    {
+      "title": "Brown on Tint | Alan Campbell",
+      "vendor": "Alan Campbell",
+      "type": "Fabric",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Criss-Cross-Brown-on-Tint-AC403-16_015244-sm-thumb.jpg?v=1783597230"
+    },
+    {
+      "title": "Riviera Wallcovering | Ananbo",
+      "vendor": "Ananbo",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/riviera.webp?v=1761541180"
+    },
+    {
+      "title": "Ark - Parchment - beige Wallcovering | Andrew Martin",
+      "vendor": "Andrew Martin",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AMW10001_1611_11959302-5997-4bcd-9a99-c54a9b0919e8.jpg?v=1775761440"
+    },
+    {
+      "title": "Gibson, Navy Wallcoverings | Anna French",
+      "vendor": "Anna French",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AT78793_4d4910ee-a9f9-4534-ae47-bed6b7d9942d.jpg?v=1782985244"
+    },
+    {
+      "title": "Anthology - Stria Stone/Amber/Plum Wallcovering | Anthology",
+      "vendor": "Anthology",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/ESHE131796.jpg?v=1784735551"
+    },
+    {
+      "title": "Caswell Sage Green Wallcovering | Jeffrey Stevens",
+      "vendor": "Apartment Wallpaper",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/PSW1213RL.jpg?v=1740775136"
+    },
+    {
+      "title": "Atlantic Cay - Verdant | Architectural Fabrics",
+      "vendor": "Architectural Fabrics",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Skintex-SF_Aspect_Teal.jpg?v=1773218078"
+    },
+    {
+      "title": "Agra Okra Wallcovering | Arte International",
+      "vendor": "Arte International",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Indienne_Agra_18310_Roomshot_Web_LR-medium-two-thirds.jpg?v=1775694511"
+    },
+    {
+      "title": "Tabula Wax Yellow Wallcovering | Artmura",
+      "vendor": "Artmura",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/TABW-002.jpg?v=1781283018"
+    },
+    {
+      "title": "History of Art 2 - Green Wallcovering | AS Creation",
+      "vendor": "AS Creation",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/792889b95340fba909e80a1654dba520_26de4b84-bada-44c9-8ff0-d634e951ba3c.jpg?v=1776187521"
+    },
+    {
+      "title": "AT50-04 Unfinished | Atomic 50",
+      "vendor": "Atomic 50 Ceilings",
+      "type": "Tin Ceiling Tile",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/36-raw.webp?v=1773709468"
+    },
+    {
+      "title": "Puntini Sisal - Tanlines Wallcovering | Backdrop",
+      "vendor": "Backdrop",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/puntini-sisal-tanlines.jpg?v=1761078002"
+    },
+    {
+      "title": "Parvani Linen | Baker Lifestyle",
+      "vendor": "Baker Lifestyle",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/PW78034_5_3f924781-0c2e-438b-9846-83f79e437024.jpg?v=1777019988"
+    },
+    {
+      "title": "Otoko Pewter | Black Edition",
+      "vendor": "Black Edition",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/W930-03-otoko-wallcovering-pewter_01_5832ae5f-061c-4ca9-a0fd-a2cfae71fd80.jpg?v=1775598526"
+    },
+    {
+      "title": "Tiger Lily Midnight Wallcovering | Brand McKenzie",
+      "vendor": "Brand McKenzie",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/DWBM-260149.jpg?v=1773968873"
+    },
+    {
+      "title": "Wild Meadow - Plaster Pink Wallcovering",
+      "vendor": "British Walls",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/0146f618c045458f55fde3938e24a872_8d33407f-805e-4aaa-ac25-b833e713ab71.jpg?v=1688757110"
+    },
+    {
+      "title": "Yasu Silver | Brunschwig & Fils",
+      "vendor": "Brunschwig & Fils",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/P8015111_11_926bf78a-0113-4b3d-a601-d75cad06b09c.jpg?v=1777019993"
+    },
+    {
+      "title": "Carnegie Blair",
+      "vendor": "Carnegie",
+      "type": "Upholstery",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/3b939cb6099480f87495278c2df300f8_9a832cf5-8d1b-426c-89a1-7029d87520e7.jpg?v=1784740002"
+    },
+    {
+      "title": "Titik Wp Linen | Caroline Cecil Textiles",
+      "vendor": "Caroline Cecil Textiles",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/CCP-2347_16.jpg?v=1777019997"
+    },
+    {
+      "title": "Posh Snakes Green | Catchii Netherlands Europe",
+      "vendor": "Catchii Netherlands Europe",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Wallpaper-Behang-Posh-Snakes-gray-green-groen-grijs-Catchii-mockup_328e2e61-4b16-43d9-bf54-c100543af4bd.jpg?v=1744999054"
+    },
+    {
+      "title": "Tortoise Wallcovering | Celerie Kemble",
+      "vendor": "Celerie Kemble",
+      "type": "Wallcovering",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/tortoise.jpg?v=1760721667"
+    },
+    {
+      "title": "Diva Poplin, Vert | Charles Burger",
+      "vendor": "Charles Burger",
+      "type": "Fabric",
+      "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/vert-1904_1_134404.jpg?v=1782672048"
+    }
+  ],
   "storefront_live": true
 }
\ No newline at end of file
diff --git a/public/portal.html b/public/portal.html
index e51f003..d8794ba 100644
--- a/public/portal.html
+++ b/public/portal.html
@@ -99,6 +99,13 @@ td.srccell{white-space:nowrap;vertical-align:middle}
 .leaflet-container{background:#0a0908;font-family:'Jost',sans-serif}
 .leaflet-popup-content-wrapper{background:var(--panel);color:var(--ink);border:1px solid var(--line)}
 .leaflet-popup-tip{background:var(--panel)}
+.duo{display:grid;grid-template-columns:1fr 1fr;gap:20px}@media(max-width:900px){.duo{grid-template-columns:1fr}}
+.mosaic{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px;margin-top:34px}
+.mtile{position:relative;aspect-ratio:1;overflow:hidden;border-radius:5px;border:1px solid var(--line);display:block}
+.mtile img{width:100%;height:100%;object-fit:cover;transition:transform .5s ease;display:block}
+.mtile:hover img{transform:scale(1.06)}
+.mtile span{position:absolute;left:0;right:0;bottom:0;font-size:10px;letter-spacing:.1em;text-transform:uppercase;padding:14px 10px 8px;background:linear-gradient(0deg,rgba(10,8,6,.85),transparent);color:var(--ink);opacity:0;transition:.3s}
+.mtile:hover span{opacity:1}
 .kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:14px;margin-top:34px}
 .kpi{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:22px 20px}
 .kpi .kv{font-family:'Cormorant Garamond',serif;font-size:34px;color:var(--gold);line-height:1}
@@ -110,7 +117,7 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
 </style></head><body>
 <header class="bar">
   <button class="burger" onclick="document.body.classList.toggle('nav')" aria-label="Menu" aria-expanded="false" aria-controls="portalmenu"><span></span><span></span><span></span></button>
-  <div class="stamp"><span>Data collected Jul 26, 2026, 8:18 AM</span><button id="refbtn" title="Re-run the read-only collector">↻ Refresh data</button></div>
+  <div class="stamp"><span>Data collected Jul 26, 2026, 8:22 AM</span><button id="refbtn" title="Re-run the read-only collector">↻ Refresh data</button></div>
 </header>
 <div class="scrim" onclick="document.body.classList.remove('nav')"></div>
 <nav class="menu" id="portalmenu" onclick="if(event.target.closest('a'))document.body.classList.remove('nav')">
@@ -137,7 +144,7 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
 <div class="accbar"><button id="xall">Expand all</button><button id="call">Collapse all</button></div>
 
 <section id="swot"><div class="eyebrow">Strategic Snapshot · SWOT</div><h2 class="disp">The whole board on one screen.</h2><div class="accbody">
-  <p class="lead2">Four lenses over the live snapshot — internal <b>Strengths</b> and <b>Weaknesses</b>, external <b>Opportunities</b> and <b>Threats</b> — so the strategy that follows starts from one honest picture. Every number here is from the Jul 26, 2026, 8:18 AM collection.</p>
+  <p class="lead2">Four lenses over the live snapshot — internal <b>Strengths</b> and <b>Weaknesses</b>, external <b>Opportunities</b> and <b>Threats</b> — so the strategy that follows starts from one honest picture. Every number here is from the Jul 26, 2026, 8:22 AM collection.</p>
   <div class="swotgrid"><div class="swotq pos"><h3>Strengths</h3><ul><li>80,522 live SKUs across 174 vendor lines — one of the deepest designer-wallcovering catalogs online</li><li>A 234-site microsite fleet feeding discovery back to the flagship</li><li>7/7 social channels connected through one marketing command center</li><li>Private-label lines with owned margin (Phillipe Romano, Hollywood Wallcoverings, Malibu Wallpaper)</li><li>30+ years of trade relationships; memo-sample program ($4.25) as a proven funnel entry</li><li>Automated activation drip already shipping ~500 products/day, textures-first</li></ul></div><div class="swotq neg"><h3>Weaknesses</h3><ul><li>22,952 active products are sample-only WITHOUT a quote-only designation — browseable but not buyable</li><li>1,444 actives carry zero/null pricing; 333 lack a featured image</li><li>Social reach is broad (80 FB pages, 34 IG accounts) but thin — distribution without engagement depth</li><li>No social→revenue attribution discipline (UTM/coupon per channel) yet</li><li>Flagship UX carries catalog weight — 80k SKUs need stronger guided curation for retail buyers</li></ul></div><div class="swotq pos"><h3>Opportunities</h3><ul><li>Convert the 22,952 sample-only backlog into sellable variants — the single largest dormant-revenue pool in the business</li><li>16,055 staged drafts (2,793 fully stageable today) = months of "New Arrivals" marketing fuel</li><li>AEO/AI-answer citations for wallcovering queries — the flagship already ships an AEO block; extend it fleet-wide</li><li>Sample-order → full-roll conversion funnel instrumentation (order sync to the back office already exists)</li><li>Licensing original design IP (settlement-gated) into marketplaces as a zero-inventory revenue line</li></ul></div><div class="swotq neg"><h3>Threats</h3><ul><li>DTC-native entrants own the "approachable wallpaper" narrative with modern brand voices</li><li>Marketplace aggregators (Amazon, Wayfair, Etsy) commoditize mid-tier patterns</li><li>AI answer engines could disintermediate catalog-depth advantages if citations go to competitors</li><li>Vendor MAP / brand-control tightening limits pricing latitude on marquee lines</li></ul></div></div>
   <div class="flagbox" style="margin-top:34px"><div class="i">⚡</div><div><h3 class="disp">The one-sentence thesis</h3><p>DW's moat is <b>catalog depth + trade authority</b>; its constraint is <b>conversion infrastructure</b>. The fastest wins activate what already exists — the sample-only backlog, the staged-draft drip, the connected-but-quiet channels — before building anything new.</p></div></div>
 </div></section>
@@ -147,6 +154,14 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
   <div class="chartwrap tall"><div class="ct">Top vendor lines by live products</div><canvas id="vendorChart"></canvas></div>
   <div class="chartwrap"><div class="ct">Live catalog by product type</div><canvas id="typeChart"></canvas></div>
   <table><thead><tr><th>#</th><th>Vendor line</th><th>Active products</th></tr></thead><tbody><tr><td class="mo">01</td><td><b>Phillipe Romano</b></td><td>11,270</td></tr><tr><td class="mo">02</td><td><b>Rebel Walls</b></td><td>3,770</td></tr><tr><td class="mo">03</td><td><b>Clarke And Clarke</b></td><td>3,570</td></tr><tr><td class="mo">04</td><td><b>Hollywood Wallcoverings</b></td><td>3,515</td></tr><tr><td class="mo">05</td><td><b>Malibu Wallpaper</b></td><td>3,232</td></tr><tr><td class="mo">06</td><td><b>Thibaut</b></td><td>2,987</td></tr><tr><td class="mo">07</td><td><b>Jeffrey Stevens</b></td><td>2,884</td></tr><tr><td class="mo">08</td><td><b>Brunschwig & Fils</b></td><td>2,761</td></tr><tr><td class="mo">09</td><td><b>Kravet</b></td><td>2,616</td></tr><tr><td class="mo">10</td><td><b>Phillip Jeffries</b></td><td>2,469</td></tr><tr><td class="mo">11</td><td><b>Koroseal</b></td><td>2,455</td></tr><tr><td class="mo">12</td><td><b>Gaston Y Daniela</b></td><td>2,148</td></tr><tr><td class="mo">13</td><td><b>Lee Jofa</b></td><td>2,040</td></tr><tr><td class="mo">14</td><td><b>Los Angeles Fabrics</b></td><td>1,833</td></tr></tbody></table>
+  <div class="eyebrow" style="margin-top:52px">Catalog DNA — what the shelves actually hold</div>
+  <p class="lead2">Tag analysis across all 80,522 actives. The palette runs <b>neutrals-first</b> — Beige + White alone account for ~44,140 products — a texture-led, trade-calibrated assortment. The merchandising read: DW owns the "quiet luxury" wall; bolder saturated stories (the DTC entrants' lane) are the underweighted shelf.</p>
+  <div class="duo">
+    <div class="chartwrap"><div class="ct">Style mix — tag-matched across actives</div><canvas id="styleChart"></canvas></div>
+    <div class="chartwrap"><div class="ct">Color mix — rendered in the actual hues</div><canvas id="colorChart"></canvas></div>
+  </div>
+  <div class="mosaic"><a class="mtile" title="Willow Pearl - Cream Wallcovering | 1838 Wallcoverings — 1838 Wallcoverings"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/2008-148-04-Willow-Pearl-scaled_27cc3134-1291-4605-85ca-d870cd905b85.jpg?v=1773305872&width=360" loading="lazy" alt="Willow Pearl - Cream Wallcovering | 1838 Wallcoverings"><span>1838 Wallcoverings</span></a><a class="mtile" title="Designdrop - Colourful Wallcovering | A.s. Création — A.S. Création"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/66e3a5f29fd1fd50090f5d5fce9b4ddc.jpg?v=1773629119&width=360" loading="lazy" alt="Designdrop - Colourful Wallcovering | A.s. Création"><span>A.S. Création</span></a><a class="mtile" title="Brown on Tint | Alan Campbell — Alan Campbell"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Criss-Cross-Brown-on-Tint-AC403-16_015244-sm-thumb.jpg?v=1783597230&width=360" loading="lazy" alt="Brown on Tint | Alan Campbell"><span>Alan Campbell</span></a><a class="mtile" title="Riviera Wallcovering | Ananbo — Ananbo"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/riviera.webp?v=1761541180&width=360" loading="lazy" alt="Riviera Wallcovering | Ananbo"><span>Ananbo</span></a><a class="mtile" title="Ark - Parchment - beige Wallcovering | Andrew Martin — Andrew Martin"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AMW10001_1611_11959302-5997-4bcd-9a99-c54a9b0919e8.jpg?v=1775761440&width=360" loading="lazy" alt="Ark - Parchment - beige Wallcovering | Andrew Martin"><span>Andrew Martin</span></a><a class="mtile" title="Gibson, Navy Wallcoverings | Anna French — Anna French"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AT78793_4d4910ee-a9f9-4534-ae47-bed6b7d9942d.jpg?v=1782985244&width=360" loading="lazy" alt="Gibson, Navy Wallcoverings | Anna French"><span>Anna French</span></a><a class="mtile" title="Anthology - Stria Stone/Amber/Plum Wallcovering | Anthology — Anthology"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/ESHE131796.jpg?v=1784735551&width=360" loading="lazy" alt="Anthology - Stria Stone/Amber/Plum Wallcovering | Anthology"><span>Anthology</span></a><a class="mtile" title="Caswell Sage Green Wallcovering | Jeffrey Stevens — Apartment Wallpaper"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/PSW1213RL.jpg?v=1740775136&width=360" loading="lazy" alt="Caswell Sage Green Wallcovering | Jeffrey Stevens"><span>Apartment Wallpaper</span></a><a class="mtile" title="Atlantic Cay - Verdant | Architectural Fabrics — Architectural Fabrics"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Skintex-SF_Aspect_Teal.jpg?v=1773218078&width=360" loading="lazy" alt="Atlantic Cay - Verdant | Architectural Fabrics"><span>Architectural Fabrics</span></a><a class="mtile" title="Agra Okra Wallcovering | Arte International — Arte International"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Indienne_Agra_18310_Roomshot_Web_LR-medium-two-thirds.jpg?v=1775694511&width=360" loading="lazy" alt="Agra Okra Wallcovering | Arte International"><span>Arte International</span></a><a class="mtile" title="Tabula Wax Yellow Wallcovering | Artmura — Artmura"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/TABW-002.jpg?v=1781283018&width=360" loading="lazy" alt="Tabula Wax Yellow Wallcovering | Artmura"><span>Artmura</span></a><a class="mtile" title="History of Art 2 - Green Wallcovering | AS Creation — AS Creation"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/792889b95340fba909e80a1654dba520_26de4b84-bada-44c9-8ff0-d634e951ba3c.jpg?v=1776187521&width=360" loading="lazy" alt="History of Art 2 - Green Wallcovering | AS Creation"><span>AS Creation</span></a></div>
+  <p class="lead2" style="font-size:14px;opacity:.6;margin-top:10px">Live catalog, not stock photography — one current product from each of twelve vendor lines, straight off the store's own CDN.</p>
   <div class="eyebrow" style="margin-top:52px">The discovery fleet</div>
   <p class="lead2">234 microsites — material-, era-, and city-specific storefront satellites that catch long-tail search and funnel to the flagship. A sample:</p>
   <div class="fchips"><span class="fchip">all</span><span class="fchip">japan</span><span class="fchip">kravet</span><span class="fchip">cowtan</span><span class="fchip">cowtan-tout</span><span class="fchip">astek</span><span class="fchip">ascreation</span><span class="fchip">wolfgordon</span><span class="fchip">pf-fabric-10110</span><span class="fchip">pierrefreyfabrics</span><span class="fchip">scalamandre</span><span class="fchip">milton-king</span><span class="fchip">phillipjeffries</span><span class="fchip">rebelwalls</span><span class="fchip">jeffreystevens</span><span class="fchip">quadrille</span><span class="fchip">malibu</span><span class="fchip">marburg</span><span class="fchip">hollywood</span><span class="fchip">sancar</span><span class="fchip">philliperomano</span><span class="fchip">graham-brown</span><span class="fchip">coordonne</span><span class="fchip">designtex</span><span class="fchip">chinaseas</span><span class="fchip">romo</span><span class="fchip">jf-fabrics</span><span class="fchip">koroseal</span><span class="fchip">philipjeffries</span><span class="fchip">holly-hunt</span><span class="fchip">arte</span><span class="fchip">thibaut</span><span class="fchip">maharam</span><span class="fchip">trestintas</span><span class="fchip">colouranddesign</span><span class="fchip">fabricut</span><span class="fchip">designersguild</span><span class="fchip">newmor</span><span class="fchip">coleandson</span><span class="fchip">relativity-textiles</span><span class="fchip">denovowall</span><span class="fchip">elitis</span><span class="fchip">pierre-frey</span><span class="fchip">andrewmartin</span><span class="fchip">sandberg</span><span class="fchip">rwltd</span><span class="fchip">mindthegap</span><span class="fchip">markalexander</span></div>
@@ -158,6 +173,9 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
   <div class="flagbox"><div class="i">◆</div><div><h3 class="disp">The 22,952-product finding</h3><p><b>26,737</b> actives are sample-only. <b>3,785</b> of those are quote-only lines by design. The remaining <b>22,952</b> — a third of the live catalog — can be browsed and sampled but not bought. Every one is paid-for merchandising with the register removed. This is the single largest dormant-revenue pool in the business.</p></div></div>
   <div class="chartwrap"><div class="ct">Sample-only actives — where they sit (top lines)</div><canvas id="soChart"></canvas></div>
   <table><thead><tr><th>Vendor line</th><th>Sample-only actives</th></tr></thead><tbody><tr><td><b>Phillipe Romano</b></td><td>5,924</td></tr><tr><td><b>Phillip Jeffries</b></td><td>2,461</td></tr><tr><td><b>Koroseal</b></td><td>2,454</td></tr><tr><td><b>China Seas</b></td><td>1,776</td></tr><tr><td><b>Coordonné</b></td><td>1,300</td></tr><tr><td><b>Hollywood Wallcoverings</b></td><td>1,089</td></tr><tr><td><b>Designers Guild</b></td><td>840</td></tr><tr><td><b>Osborne & Little</b></td><td>820</td></tr></tbody></table>
+  <div class="eyebrow" style="margin-top:52px">The catalog's own to-do list</div>
+  <p class="lead2">The workflow tags tell the story without an audit: <b>19,656</b> actives are tagged Needs-Width, <b>19,226</b> Needs-Price, <b>16,531</b> Needs-Image. These self-reported queues ARE the integrity sprint's work orders — pre-triaged, machine-readable, waiting.</p>
+  <div class="chartwrap"><div class="ct">Workflow-tag backlog on active products (live tag counts)</div><canvas id="needsChart"></canvas></div>
 </div></section>
 
 <section id="competitors"><div class="eyebrow">03 · Competitive Landscape</div><h2 class="disp">Depth vs. polish: the field.</h2><div class="accbody">
@@ -182,7 +200,8 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
 </div></section>
 
 <section id="timing"><div class="eyebrow">05 · Timing &amp; Cadence</div><h2 class="disp">The drip is live. Point it at revenue.</h2><div class="accbody">
-  <p class="lead2">New actives per week from the live mirror — the activation engine at work. The merchandising calendar below aligns campaigns to the natural intent cycle of the category.</p>
+  <p class="lead2">The growth curve, measured: monthly activations ramped from <b>223</b> in Jan to <b>10,329</b> in Jul — a 46× ramp as the activation engine came online. The merchandising calendar below aligns campaigns to the category's natural intent cycle.</p>
+  <div class="chartwrap"><div class="ct">The ramp — new actives per month, last 7 months (live)</div><canvas id="rampChart"></canvas></div>
   <div class="chartwrap"><div class="ct">New active products per week — last 12 weeks (live)</div><canvas id="cadenceChart"></canvas></div>
   <table><thead><tr><th>Month</th><th>What the market is doing</th><th>The DW play</th></tr></thead><tbody><tr><td class="mo">Jan</td><td>New-year refresh intent peaks</td><td class="act">Push "one statement wall" entry offers; retarget Q4 samplers</td></tr><tr><td class="mo">Feb</td><td>Design-award season</td><td class="act">Editorial: trend reports off the catalog's own tag data</td></tr><tr><td class="mo">Mar</td><td>Spring project starts</td><td class="act">Trade outreach wave; hospitality spec season begins</td></tr><tr><td class="mo">Apr</td><td>High-intent renovation search</td><td class="act">Paid search on pattern + brand terms; AEO content sprint</td></tr><tr><td class="mo">May</td><td>Peak sample-ordering</td><td class="act">Sample-bundle promos; instrument sample→roll conversion</td></tr><tr><td class="mo">Jun</td><td>Mid-year new-arrivals surge</td><td class="act">The activation drip = daily "new" stories across channels</td></tr><tr><td class="mo">Jul</td><td>Summer install season</td><td class="act">Installer-partner co-marketing; project galleries</td></tr><tr><td class="mo">Aug</td><td>Pre-fall trade buying</td><td class="act">Designer-net program push; hospitality lookbook release</td></tr><tr><td class="mo">Sep</td><td>Fall flagship season</td><td class="act">Concept-direction launch (the new front page ships here)</td></tr><tr><td class="mo">Oct</td><td>Q4 project commits</td><td class="act">Retarget spring samplers; gift-adjacent art-line cross-sell</td></tr><tr><td class="mo">Nov</td><td>Holiday statement walls</td><td class="act">Peel-and-stick line forward; fast-ship messaging</td></tr><tr><td class="mo">Dec</td><td>Planning season</td><td class="act">Year-in-review design content; January intent capture</td></tr></tbody></table>
 </div></section>
@@ -259,7 +278,7 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
 </div></section>
 
 <section id="desk"><div class="eyebrow">11 · Live Commerce Desk</div><h2 class="disp">The operation, on one screen.</h2><div class="accbody">
-  <p class="lead2">Live KPIs from the Jul 26, 2026, 8:18 AM snapshot — the numbers a weekly growth review should open with. Hit ↻ Refresh (top right) to re-collect on demand.</p>
+  <p class="lead2">Live KPIs from the Jul 26, 2026, 8:22 AM snapshot — the numbers a weekly growth review should open with. Hit ↻ Refresh (top right) to re-collect on demand.</p>
   <div class="kpis">
     <div class="kpi"><div class="kv">80,522</div><div class="kl">Active products</div></div>
     <div class="kpi"><div class="kv">16,055</div><div class="kl">Staged drafts</div></div>
@@ -283,13 +302,13 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
 </div></section>
 
 <section id="sources"><div class="eyebrow">13 · Sources &amp; Methodology</div><h2 class="disp">Where every number comes from.</h2><div class="accbody">
-  <p class="lead2">Snapshot collected <b>Jul 26, 2026, 8:18 AM</b> by a read-only collector. Live rows are measured; analyst rows are authored judgment; anything illustrative says so.</p>
+  <p class="lead2">Snapshot collected <b>Jul 26, 2026, 8:22 AM</b> by a read-only collector. Live rows are measured; analyst rows are authored judgment; anything illustrative says so.</p>
   <div class="srclegend"><span class="srcb r">Live snapshot</span><span class="srcb o">Observed live</span><span class="srcb a">Analyst view</span><span class="srcb d">Computed</span><span class="srcb e">Illustrative</span></div>
-  <table><thead><tr><th>Section</th><th>Where it comes from</th><th>How it's produced</th><th>Provenance</th></tr></thead><tbody><tr><td><b>Catalog KPIs — statuses, vendors, types, integrity, cadence</b></td><td>The dw_unified local mirror (READ-ONLY psql over the /tmp socket)</td><td>Collected by <code>scripts/collect-dw.mjs</code> at <b>Jul 26, 2026, 8:18 AM</b>; every number on this page renders from that snapshot</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>5-field / sample-only split</b></td><td>Mirror rollup columns (has_sample_variant, has_product_variant, has_description, image_url) + the quotes tag</td><td>Direct SQL counts; quote-only lines (by-design sample-only) separated from true backlog</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Social channel status</b></td><td>The DW marketing command center API (marketing.designerwallcoverings.com)</td><td>Authenticated status read at collection time — connected flags + account counts per platform</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Microsite fleet</b></td><td>The fleet aggregator directory API (all.designerwallcoverings.com)</td><td>234 sites enumerated at collection time</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Competitor watch-list</b></td><td>The connie_competitors table (the DW competitor-scan registry)</td><td>Rendered verbatim: domain, watch status, products found by prior scans</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Competitor paid-ads table</b></td><td>A $0 homepage pixel scan of each tracked domain (Google/Meta/TikTok/Pinterest/Bing tag signatures)</td><td>Measured at seed time by <code>scripts/seed-buckets.mjs</code>; unreachable homepages say so rather than guessing</td><td class="srccell"><span class="srcb o">Observed live</span></td></tr><tr><td><b>Competitor scoring chart + map pins</b></td><td>Analyst assessment over public sites; HQ geo compiled from public records</td><td>Authored consulting view — NOT scraped metrics; the map is oriented, not surveyed</td><td class="srccell"><span class="srcb a">Analyst view</span></td></tr><tr><td><b>Price-band chart</b></td><td>products whose minimum variant exceeds the $4.25 memo sample — the priced subset of the mirror (~3.8k); most actives resolve min-variant to the sample, and full variant-level pricing lives Shopify-side</td><td>Partial-basis chart, labeled as such — full variant pricing lives Shopify-side</td><td class="srccell"><span class="srcb d">Computed</span></td></tr><tr><td><b>Website & social audits, partners, revenue plays, roadmap</b></td><td>Analyst strategy grounded in the operating knowledge of the DW stack</td><td>Consulting recommendations — models and plays, not measurements</td><td class="srccell"><span class="srcb a">Analyst view</span></td></tr><tr><td><b>Hero & section imagery</b></td><td>Unsplash editorial stock (luxury materials, per the luxe-only imagery rule)</td><td>Hotlinked, decorative only — carries no data meaning</td><td class="srccell"><span class="srcb e">Illustrative</span></td></tr></tbody></table>
+  <table><thead><tr><th>Section</th><th>Where it comes from</th><th>How it's produced</th><th>Provenance</th></tr></thead><tbody><tr><td><b>Catalog KPIs — statuses, vendors, types, integrity, cadence</b></td><td>The dw_unified local mirror (READ-ONLY psql over the /tmp socket)</td><td>Collected by <code>scripts/collect-dw.mjs</code> at <b>Jul 26, 2026, 8:22 AM</b>; every number on this page renders from that snapshot</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>5-field / sample-only split</b></td><td>Mirror rollup columns (has_sample_variant, has_product_variant, has_description, image_url) + the quotes tag</td><td>Direct SQL counts; quote-only lines (by-design sample-only) separated from true backlog</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Social channel status</b></td><td>The DW marketing command center API (marketing.designerwallcoverings.com)</td><td>Authenticated status read at collection time — connected flags + account counts per platform</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Microsite fleet</b></td><td>The fleet aggregator directory API (all.designerwallcoverings.com)</td><td>234 sites enumerated at collection time</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Competitor watch-list</b></td><td>The connie_competitors table (the DW competitor-scan registry)</td><td>Rendered verbatim: domain, watch status, products found by prior scans</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Competitor paid-ads table</b></td><td>A $0 homepage pixel scan of each tracked domain (Google/Meta/TikTok/Pinterest/Bing tag signatures)</td><td>Measured at seed time by <code>scripts/seed-buckets.mjs</code>; unreachable homepages say so rather than guessing</td><td class="srccell"><span class="srcb o">Observed live</span></td></tr><tr><td><b>Competitor scoring chart + map pins</b></td><td>Analyst assessment over public sites; HQ geo compiled from public records</td><td>Authored consulting view — NOT scraped metrics; the map is oriented, not surveyed</td><td class="srccell"><span class="srcb a">Analyst view</span></td></tr><tr><td><b>Price-band chart</b></td><td>products whose minimum variant exceeds the $4.25 memo sample — the priced subset of the mirror (~3.8k); most actives resolve min-variant to the sample, and full variant-level pricing lives Shopify-side</td><td>Partial-basis chart, labeled as such — full variant pricing lives Shopify-side</td><td class="srccell"><span class="srcb d">Computed</span></td></tr><tr><td><b>Website & social audits, partners, revenue plays, roadmap</b></td><td>Analyst strategy grounded in the operating knowledge of the DW stack</td><td>Consulting recommendations — models and plays, not measurements</td><td class="srccell"><span class="srcb a">Analyst view</span></td></tr><tr><td><b>Catalog DNA — style, color & workflow-tag charts</b></td><td>Tag-match SQL over all actives (the same tag buckets the storefront sort uses)</td><td>Live counts per style/color/Needs-* tag; the color doughnut renders in representative hues of the tag names</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Monthly activation ramp</b></td><td>created_at_shopify over the last 7 calendar months, live mirror</td><td>Direct SQL; the ramp multiplier in the copy is computed from the same series</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Product mosaic + concept-grid imagery</b></td><td>The store's own CDN (one current ACTIVE product per vendor line, forbidden-vendor-filtered)</td><td>Already customer-facing on the live store; hotlinked at thumbnail width</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Hero imagery</b></td><td>Unsplash editorial stock (luxury materials, per the luxe-only imagery rule)</td><td>Hotlinked, decorative only — carries no data meaning</td><td class="srccell"><span class="srcb e">Illustrative</span></td></tr></tbody></table>
   <div class="srcnote"><div class="i">&#9881;</div><div><h4>How this document is built</h4><p>Generated, not hand-typed. A read-only collector (<code>scripts/collect-dw.mjs</code>) snapshots the DW systems into <code>data/dw-analysis.json</code>; the build (<code>build.mjs</code>) renders that snapshot into this page. The ↻ Refresh button re-runs collector + build on demand. Nothing writes to any DW production system.</p></div></div>
 </div></section>
 
-<footer><span>Designer Wallcoverings · Growth Strategy Brief</span><span>Data as of Jul 26, 2026, 8:18 AM</span><span>Confidential — for discussion</span></footer>
+<footer><span>Designer Wallcoverings · Growth Strategy Brief</span><span>Data as of Jul 26, 2026, 8:22 AM</span><span>Confidential — for discussion</span></footer>
 
 <script>
 (function(){var s=document.querySelectorAll('.hero .slide'),i=0;if(s.length<2)return;setInterval(function(){s[i].classList.remove('on');i=(i+1)%s.length;s[i].classList.add('on');},5200);})();
@@ -303,6 +322,7 @@ secs.forEach(function(sec){var eb=sec.querySelector(':scope>.eyebrow'),h2=sec.qu
 function drawRoad(sec){var rd=sec.querySelector('.road');if(rd)setTimeout(function(){rd.classList.add('drawn');},140);}
 function setAll(o){accs.forEach(function(s){s.classList.toggle('open',o);var c=s.querySelector('.chev');if(c)c.textContent=o?'\u2013':'+';if(o)drawRoad(s);});if(o){initCharts();initMap();}}
 document.getElementById('xall').onclick=function(){setAll(true);};document.getElementById('call').onclick=function(){setAll(false);};
+if(location.hash==='#all'){setAll(true);} // deep-link: /portal#all opens the whole brief
 document.querySelectorAll('.menu a[href^="#"]').forEach(function(a){a.addEventListener('click',function(){var id=a.getAttribute('href').slice(1),s=document.getElementById(id);if(s&&!s.classList.contains('open')&&s.querySelector('.acchead')){s.querySelector('.acchead').click();}if(s)setTimeout(function(){s.scrollIntoView({behavior:'smooth'});},80);});});
 (function(){var burger=document.querySelector('.burger');if(!burger)return;function sync(){burger.setAttribute('aria-expanded',document.body.classList.contains('nav'));}new MutationObserver(sync).observe(document.body,{attributes:true,attributeFilter:['class']});sync();})();
 var io=new IntersectionObserver(function(es){es.forEach(function(e){if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target);}});},{threshold:.12});
@@ -315,16 +335,22 @@ function initCharts(){if(charted||!window.Chart)return;charted=true;
   var RM=window.matchMedia&&window.matchMedia('(prefers-reduced-motion:reduce)').matches;
   Chart.defaults.animation=RM?false:{duration:1150,easing:'easeInOutQuart'};
   if(!RM){Chart.defaults.animations={y:{from:function(c){return c.chart.scales.y?c.chart.scales.y.getPixelForValue(0):0;}}};}
-  var D={"cadence":{"labels":["05-11","05-25","06-01","06-08","06-15","06-22","06-29","07-06","07-13","07-20"],"added":[490,3,492,924,1993,1510,1854,4255,1471,3377]},"vendors":{"labels":["Phillipe Romano","Rebel Walls","Clarke And Clarke","Hollywood Wallcoverings","Malibu Wallpaper","Thibaut","Jeffrey Stevens","Brunschwig & Fils","Kravet","Phillip Jeffries"],"counts":[11270,3770,3570,3515,3232,2987,2884,2761,2616,2469]},"types":{"labels":["Wallcovering","Fabric","Commercial Fabric","Mural","Wallcoverings","Memo Sample"],"counts":[58283,16195,1797,1305,453,451]},"integrity":{"labels":["Missing sellable variant","Missing sample variant","Zero / null price","Missing image","Missing description"],"counts":[26737,2298,1444,333,172]},"bands":{"labels":["Under $50","$50–150","$150–300","$300–600","$600+"],"counts":[2118,699,435,443,129]},"channels":{"labels":["Facebook Pages","Instagram","TikTok","YouTube","Bluesky","Threads","LinkedIn"],"accounts":[80,34,1,1,1,1,1]},"sampleOnlyVendors":{"labels":["Phillipe Romano","Phillip Jeffries","Koroseal","China Seas","Coordonné","Hollywood Wallcoverings","Designers Guild","Osborne & Little"],"counts":[5924,2461,2454,1776,1300,1089,840,820]},"comp":{"labels":["Designer Wallcoverings","DecoratorsBest","Burke Decor","Mahones","Finest Wallpaper","Steve's B&W"],"catalog":[96,62,48,55,40,45],"digital":[58,82,78,60,42,55]}};
+  var D={"cadence":{"labels":["05-11","05-25","06-01","06-08","06-15","06-22","06-29","07-06","07-13","07-20"],"added":[490,3,492,924,1993,1510,1854,4255,1471,3377]},"vendors":{"labels":["Phillipe Romano","Rebel Walls","Clarke And Clarke","Hollywood Wallcoverings","Malibu Wallpaper","Thibaut","Jeffrey Stevens","Brunschwig & Fils","Kravet","Phillip Jeffries"],"counts":[11270,3770,3570,3515,3232,2987,2884,2761,2616,2469]},"types":{"labels":["Wallcovering","Fabric","Commercial Fabric","Mural","Wallcoverings","Memo Sample"],"counts":[58283,16195,1797,1305,453,451]},"integrity":{"labels":["Missing sellable variant","Missing sample variant","Zero / null price","Missing image","Missing description"],"counts":[26737,2298,1444,333,172]},"bands":{"labels":["Under $50","$50–150","$150–300","$300–600","$600+"],"counts":[2118,699,435,443,129]},"channels":{"labels":["Facebook Pages","Instagram","TikTok","YouTube","Bluesky","Threads","LinkedIn"],"accounts":[80,34,1,1,1,1,1]},"sampleOnlyVendors":{"labels":["Phillipe Romano","Phillip Jeffries","Koroseal","China Seas","Coordonné","Hollywood Wallcoverings","Designers Guild","Osborne & Little"],"counts":[5924,2461,2454,1776,1300,1089,840,820]},"comp":{"labels":["Designer Wallcoverings","DecoratorsBest","Burke Decor","Mahones","Finest Wallpaper","Steve's B&W"],"catalog":[96,62,48,55,40,45],"digital":[58,82,78,60,42,55]},"monthly":{"labels":["Jan","Feb","Mar","Apr","May","Jun","Jul"],"added":[223,1363,4578,3416,493,5547,10329]},"needs":{"labels":["Needs Price","Needs Image","Needs Width","Needs Description"],"counts":[19226,16531,19656,27]},"styles":{"labels":["Contemporary","Textured","Traditional","Geometric","Floral","Grasscloth","Stripe","Mural","Metallic","Damask"],"counts":[32580,29302,22704,11747,10284,9846,9153,4769,3212,1925]},"colors":{"labels":["Beige","White","Gray","Blue","Green","Brown","Black","Gold","Pink","Red"],"counts":[22079,22061,12163,8550,7749,5192,4882,4326,3456,2946],"hex":["#d9c9a8","#f2efe8","#9a9a99","#5a7fa8","#6b8f6d","#8a6a4c","#2b2b2b","#c9a24b","#d3a0a6","#a84a44"]}};
   function mk(id,cfg){var el=document.getElementById(id);if(el)new Chart(el,cfg);}
+  // Vertical gold gradient for area fills — scriptable so it re-derives per chart area
+  function goldFill(a){return function(c){var ch=c.chart,area=ch.chartArea;if(!area)return 'rgba(201,162,75,.12)';var g=ch.ctx.createLinearGradient(0,area.top,0,area.bottom);g.addColorStop(0,'rgba(201,162,75,'+a+')');g.addColorStop(1,'rgba(201,162,75,0)');return g;};}
+  mk('rampChart',{type:'bar',data:{labels:D.monthly.labels,datasets:[{label:'New actives / month',data:D.monthly.added,backgroundColor:function(c){var ch=c.chart,area=ch.chartArea;if(!area)return 'rgba(201,162,75,.7)';var g=ch.ctx.createLinearGradient(0,area.bottom,0,area.top);g.addColorStop(0,'rgba(201,162,75,.25)');g.addColorStop(1,'rgba(201,162,75,.9)');return g;},borderRadius:5}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}},plugins:{legend:{display:false}}}});
+  mk('needsChart',{type:'bar',data:{labels:D.needs.labels,datasets:[{label:'Actives tagged',data:D.needs.counts,backgroundColor:'rgba(232,160,160,.72)',borderRadius:5}]},options:{indexAxis:'y',responsive:true,maintainAspectRatio:false,scales:{x:{grid:{color:line}},y:{grid:{display:false}}},plugins:{legend:{display:false}}}});
+  mk('styleChart',{type:'bar',data:{labels:D.styles.labels,datasets:[{label:'Actives tagged',data:D.styles.counts,backgroundColor:'rgba(201,162,75,.72)',borderRadius:5}]},options:{indexAxis:'y',responsive:true,maintainAspectRatio:false,scales:{x:{grid:{color:line}},y:{grid:{display:false}}},plugins:{legend:{display:false}}}});
+  mk('colorChart',{type:'doughnut',data:{labels:D.colors.labels,datasets:[{data:D.colors.counts,backgroundColor:D.colors.hex,borderColor:'#0e0c09',borderWidth:2}]},options:{responsive:true,maintainAspectRatio:false,plugins:{legend:{position:'right',labels:{color:dim,boxWidth:12}}},cutout:'58%'}});
   mk('vendorChart',{type:'bar',data:{labels:D.vendors.labels,datasets:[{label:'Active products',data:D.vendors.counts,backgroundColor:'rgba(201,162,75,.75)'}]},options:{indexAxis:'y',responsive:true,maintainAspectRatio:false,scales:{x:{grid:{color:line}},y:{grid:{display:false}}},plugins:{legend:{display:false}}}});
   mk('typeChart',{type:'doughnut',data:{labels:D.types.labels,datasets:[{data:D.types.counts,backgroundColor:['#c9a24b','#b78d3f','#a67c32','#d9b877','#8f6d2c','#e3c98d'],borderColor:'#0e0c09',borderWidth:2}]},options:{responsive:true,maintainAspectRatio:false,plugins:{legend:{position:'right',labels:{color:dim,boxWidth:12}}},cutout:'58%'}});
   mk('ffChart',{type:'bar',data:{labels:D.integrity.labels,datasets:[{label:'Actives failing',data:D.integrity.counts,backgroundColor:D.integrity.counts.map(function(v){return v>10000?'rgba(232,160,160,.8)':'rgba(201,162,75,.6)';})}]},options:{indexAxis:'y',responsive:true,maintainAspectRatio:false,scales:{x:{grid:{color:line}},y:{grid:{display:false}}},plugins:{legend:{display:false}}}});
   mk('soChart',{type:'bar',data:{labels:D.sampleOnlyVendors.labels,datasets:[{label:'Sample-only actives',data:D.sampleOnlyVendors.counts,backgroundColor:'rgba(232,160,160,.7)'}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}},plugins:{legend:{display:false}}}});
   mk('compChart',{type:'bar',data:{labels:D.comp.labels,datasets:[{label:'Catalog depth',data:D.comp.catalog,backgroundColor:'rgba(201,162,75,.75)'},{label:'Digital polish',data:D.comp.digital,backgroundColor:'rgba(120,170,255,.6)'}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line},max:100},x:{grid:{display:false}}},plugins:{legend:{labels:{color:dim}}}}});
   mk('chanChart',{type:'bar',data:{labels:D.channels.labels,datasets:[{label:'Connected accounts',data:D.channels.accounts,backgroundColor:'rgba(201,162,75,.75)'}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}},plugins:{legend:{display:false}}}});
-  mk('cadenceChart',{type:'line',data:{labels:D.cadence.labels,datasets:[{label:'New actives / week',data:D.cadence.added,borderColor:gold,backgroundColor:'rgba(201,162,75,.12)',fill:true,tension:.4,pointRadius:4}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}},plugins:{legend:{display:false}}}});
-  mk('deskChart',{type:'line',data:{labels:D.cadence.labels,datasets:[{label:'New actives / week',data:D.cadence.added,borderColor:gold,backgroundColor:'rgba(201,162,75,.12)',fill:true,tension:.4,pointRadius:4}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}},plugins:{legend:{display:false}}}});
+  mk('cadenceChart',{type:'line',data:{labels:D.cadence.labels,datasets:[{label:'New actives / week',data:D.cadence.added,borderColor:gold,backgroundColor:goldFill(.30),fill:true,tension:.4,pointRadius:4}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}},plugins:{legend:{display:false}}}});
+  mk('deskChart',{type:'line',data:{labels:D.cadence.labels,datasets:[{label:'New actives / week',data:D.cadence.added,borderColor:gold,backgroundColor:goldFill(.30),fill:true,tension:.4,pointRadius:4}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}},plugins:{legend:{display:false}}}});
   mk('bandChart',{type:'bar',data:{labels:D.bands.labels,datasets:[{label:'Products (priced subset)',data:D.bands.counts,backgroundColor:'rgba(201,162,75,.6)'}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}},plugins:{legend:{display:false}}}});
 }
 var mapped=false;
diff --git a/public/versions/atelier.html b/public/versions/atelier.html
index b8eaeec..d5f8cc6 100644
--- a/public/versions/atelier.html
+++ b/public/versions/atelier.html
@@ -22,7 +22,8 @@ nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
 .heroc p{margin-top:16px;opacity:.75;font-size:17px;max-width:52ch}
 .cta{display:inline-block;margin-top:26px;border:1px solid var(--gold);color:var(--gold);font-size:12px;letter-spacing:.22em;text-transform:uppercase;padding:13px 26px;border-radius:999px;transition:.25s}
 .cta:hover{background:var(--gold);color:#fff}
-.heroimg{aspect-ratio:4/3;border-radius:6px;background:linear-gradient(135deg,var(--panel),var(--gold))}
+.heroimg{aspect-ratio:4/3;border-radius:6px;background:linear-gradient(135deg,var(--panel),var(--gold));overflow:hidden}
+.heroimg img{width:100%;height:100%;object-fit:cover;display:block}
 .wrap{max-width:1240px;margin:0 auto;padding:0 22px}
 .sh{display:flex;align-items:center;justify-content:space-between;gap:18px;border-top:3px solid var(--gold);padding-top:12px;margin:34px 0 8px;flex-wrap:wrap}
 .sh h2{font-size:15px;text-transform:uppercase;letter-spacing:.08em;font-weight:600}
@@ -31,7 +32,8 @@ nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
 .controls select{background:var(--panel);color:var(--ink);border:1px solid var(--line);padding:7px 10px;border-radius:4px;font-family:'Jost',system-ui,sans-serif;font-size:12px}
 .controls input[type=range]{accent-color:var(--gold);width:110px}
 .grid{display:grid;grid-template-columns:repeat(var(--cols),1fr);gap:20px;padding:18px 0 40px}
-.gcard .gimg{aspect-ratio:3/4;border-radius:5px;transition:.3s}.gcard:hover .gimg{transform:translateY(-4px);box-shadow:0 14px 40px rgba(0,0,0,.28)}
+.gcard .gimg{aspect-ratio:3/4;border-radius:5px;transition:.3s;overflow:hidden;background:var(--panel)}.gcard:hover .gimg{transform:translateY(-4px);box-shadow:0 14px 40px rgba(0,0,0,.28)}
+.gcard .gimg img{width:100%;height:100%;object-fit:cover;display:block}
 .gcard h4{font-family:'Cormorant Garamond',Georgia,serif;font-size:16.5px;margin:10px 0 2px}
 .gmeta{display:flex;justify-content:space-between;font-size:11px;opacity:.65;letter-spacing:.06em;text-transform:uppercase}
 .tier{color:var(--gold)}
@@ -49,7 +51,7 @@ footer .in{max-width:1240px;margin:0 auto;padding:36px 22px;display:flex;justify
 <nav class="sec"><div class="in"><a>Wallcoverings</a><a>Fabrics</a><a>Murals</a><a>By Color</a><a>By Room</a><a>New Arrivals</a><a>Trade Program</a><a>Samples</a></div></nav>
 <div class="heroc">
   <div class="rv"><h1 class="disp">Hand-painted calm. The scenic house.</h1><p>Scenic-house minimalism — ivory ground, celadon accents, art-object product pages. A curated face for the deepest designer-wallcovering catalog online — every pattern sampled for $4.25, every order backed by thirty years of trade expertise.</p><a class="cta">Explore the collection</a></div>
-  <div class="heroimg rv"></div>
+  <div class="heroimg rv"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Criss-Cross-Brown-on-Tint-AC403-16_015244-sm-thumb.jpg?v=1783597230&width=1100" alt="" loading="eager"></div>
 </div>
 <div class="wrap">
   <div class="sh"><h2>Curated This Week</h2>
@@ -60,42 +62,42 @@ footer .in{max-width:1240px;margin:0 auto;padding:36px 22px;display:flex;justify
       <input type="range" id="dens" min="2" max="6" step="1" value="4">
     </div>
   </div>
-  <div class="grid" id="grid"><article class="gcard" data-title="Chinois Garden" data-hue="28" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(28,22%,78%),hsl(68,30%,64%))"></div>
-      <h4>Chinois Garden</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Venetian Plaster" data-hue="152" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(152,22%,78%),hsl(192,30%,64%))"></div>
-      <h4>Venetian Plaster</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Grasscloth No. 9" data-hue="208" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(208,22%,78%),hsl(248,30%,64%))"></div>
-      <h4>Grasscloth No. 9</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
-    </article><article class="gcard" data-title="Deco Fan" data-hue="12" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(12,22%,78%),hsl(52,30%,64%))"></div>
-      <h4>Deco Fan</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Midnight Damask" data-hue="262" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(262,22%,78%),hsl(302,30%,64%))"></div>
-      <h4>Midnight Damask</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Coastal Weave" data-hue="88" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(88,22%,78%),hsl(128,30%,64%))"></div>
-      <h4>Coastal Weave</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
-    </article><article class="gcard" data-title="Rosewood Toile" data-hue="340" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(340,22%,78%),hsl(20,30%,64%))"></div>
-      <h4>Rosewood Toile</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Celadon Silk" data-hue="190" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(190,22%,78%),hsl(230,30%,64%))"></div>
-      <h4>Celadon Silk</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Gilt Trellis" data-hue="46" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(46,22%,78%),hsl(86,30%,64%))"></div>
-      <h4>Gilt Trellis</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
-    </article><article class="gcard" data-title="Amethyst Moire" data-hue="300" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(300,22%,78%),hsl(340,30%,64%))"></div>
-      <h4>Amethyst Moire</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Sage Stripe" data-hue="130" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(130,22%,78%),hsl(170,30%,64%))"></div>
-      <h4>Sage Stripe</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Terra Fresco" data-hue="20" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(20,22%,78%),hsl(60,30%,64%))"></div>
-      <h4>Terra Fresco</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
+  <div class="grid" id="grid"><article class="gcard" data-title="Willow Pearl - Cream" data-hue="28" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/2008-148-04-Willow-Pearl-scaled_27cc3134-1291-4605-85ca-d870cd905b85.jpg?v=1773305872&width=540" loading="lazy" alt="Willow Pearl - Cream"></div>
+      <h4>Willow Pearl - Cream</h4><div class="gmeta"><span>1838 Wallcoverings</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Designdrop - Colourful" data-hue="152" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/66e3a5f29fd1fd50090f5d5fce9b4ddc.jpg?v=1773629119&width=540" loading="lazy" alt="Designdrop - Colourful"></div>
+      <h4>Designdrop - Colourful</h4><div class="gmeta"><span>A.S. Création</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Brown on Tint" data-hue="208" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Criss-Cross-Brown-on-Tint-AC403-16_015244-sm-thumb.jpg?v=1783597230&width=540" loading="lazy" alt="Brown on Tint"></div>
+      <h4>Brown on Tint</h4><div class="gmeta"><span>Alan Campbell</span><span class="tier">reserve</span></div>
+    </article><article class="gcard" data-title="Riviera" data-hue="12" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/riviera.webp?v=1761541180&width=540" loading="lazy" alt="Riviera"></div>
+      <h4>Riviera</h4><div class="gmeta"><span>Ananbo</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Ark - Parchment - beige" data-hue="262" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AMW10001_1611_11959302-5997-4bcd-9a99-c54a9b0919e8.jpg?v=1775761440&width=540" loading="lazy" alt="Ark - Parchment - beige"></div>
+      <h4>Ark - Parchment - beige</h4><div class="gmeta"><span>Andrew Martin</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Gibson, Navy" data-hue="88" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AT78793_4d4910ee-a9f9-4534-ae47-bed6b7d9942d.jpg?v=1782985244&width=540" loading="lazy" alt="Gibson, Navy"></div>
+      <h4>Gibson, Navy</h4><div class="gmeta"><span>Anna French</span><span class="tier">reserve</span></div>
+    </article><article class="gcard" data-title="Anthology - Stria Stone/Amber/Plum" data-hue="340" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/ESHE131796.jpg?v=1784735551&width=540" loading="lazy" alt="Anthology - Stria Stone/Amber/Plum"></div>
+      <h4>Anthology - Stria Stone/Amber/Plum</h4><div class="gmeta"><span>Anthology</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Caswell Sage Green" data-hue="190" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/PSW1213RL.jpg?v=1740775136&width=540" loading="lazy" alt="Caswell Sage Green"></div>
+      <h4>Caswell Sage Green</h4><div class="gmeta"><span>Apartment Wallpaper</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Atlantic Cay - Verdant" data-hue="46" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Skintex-SF_Aspect_Teal.jpg?v=1773218078&width=540" loading="lazy" alt="Atlantic Cay - Verdant"></div>
+      <h4>Atlantic Cay - Verdant</h4><div class="gmeta"><span>Architectural Fabrics</span><span class="tier">reserve</span></div>
+    </article><article class="gcard" data-title="Agra Okra" data-hue="300" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Indienne_Agra_18310_Roomshot_Web_LR-medium-two-thirds.jpg?v=1775694511&width=540" loading="lazy" alt="Agra Okra"></div>
+      <h4>Agra Okra</h4><div class="gmeta"><span>Arte International</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Tabula Wax Yellow" data-hue="130" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/TABW-002.jpg?v=1781283018&width=540" loading="lazy" alt="Tabula Wax Yellow"></div>
+      <h4>Tabula Wax Yellow</h4><div class="gmeta"><span>Artmura</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="History of Art 2 - Green" data-hue="20" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/792889b95340fba909e80a1654dba520_26de4b84-bada-44c9-8ff0-d634e951ba3c.jpg?v=1776187521&width=540" loading="lazy" alt="History of Art 2 - Green"></div>
+      <h4>History of Art 2 - Green</h4><div class="gmeta"><span>AS Creation</span><span class="tier">reserve</span></div>
     </article></div>
 </div>
 <div class="ns"><div><h3 class="disp">The Designer's Brief</h3><p>New arrivals, designer picks, and pattern stories — weekly, from Los Angeles.</p></div><form onsubmit="return false"><input type="email" placeholder="you@studio.com"><button>Subscribe</button></form></div>
diff --git a/public/versions/gallery.html b/public/versions/gallery.html
index 5aee39c..a90f8d7 100644
--- a/public/versions/gallery.html
+++ b/public/versions/gallery.html
@@ -22,7 +22,8 @@ nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
 .heroc p{margin-top:16px;opacity:.75;font-size:17px;max-width:52ch}
 .cta{display:inline-block;margin-top:26px;border:1px solid var(--gold);color:var(--gold);font-size:12px;letter-spacing:.22em;text-transform:uppercase;padding:13px 26px;border-radius:999px;transition:.25s}
 .cta:hover{background:var(--gold);color:#fff}
-.heroimg{aspect-ratio:4/3;border-radius:6px;background:linear-gradient(135deg,var(--panel),var(--gold))}
+.heroimg{aspect-ratio:4/3;border-radius:6px;background:linear-gradient(135deg,var(--panel),var(--gold));overflow:hidden}
+.heroimg img{width:100%;height:100%;object-fit:cover;display:block}
 .wrap{max-width:1240px;margin:0 auto;padding:0 22px}
 .sh{display:flex;align-items:center;justify-content:space-between;gap:18px;border-top:3px solid var(--gold);padding-top:12px;margin:34px 0 8px;flex-wrap:wrap}
 .sh h2{font-size:15px;text-transform:uppercase;letter-spacing:.08em;font-weight:600}
@@ -31,7 +32,8 @@ nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
 .controls select{background:var(--panel);color:var(--ink);border:1px solid var(--line);padding:7px 10px;border-radius:4px;font-family:'Inter',system-ui,sans-serif;font-size:12px}
 .controls input[type=range]{accent-color:var(--gold);width:110px}
 .grid{display:grid;grid-template-columns:repeat(var(--cols),1fr);gap:20px;padding:18px 0 40px}
-.gcard .gimg{aspect-ratio:3/4;border-radius:5px;transition:.3s}.gcard:hover .gimg{transform:translateY(-4px);box-shadow:0 14px 40px rgba(0,0,0,.28)}
+.gcard .gimg{aspect-ratio:3/4;border-radius:5px;transition:.3s;overflow:hidden;background:var(--panel)}.gcard:hover .gimg{transform:translateY(-4px);box-shadow:0 14px 40px rgba(0,0,0,.28)}
+.gcard .gimg img{width:100%;height:100%;object-fit:cover;display:block}
 .gcard h4{font-family:'Playfair Display',Georgia,serif;font-size:16.5px;margin:10px 0 2px}
 .gmeta{display:flex;justify-content:space-between;font-size:11px;opacity:.65;letter-spacing:.06em;text-transform:uppercase}
 .tier{color:var(--gold)}
@@ -49,7 +51,7 @@ footer .in{max-width:1240px;margin:0 auto;padding:36px 22px;display:flex;justify
 <nav class="sec"><div class="in"><a>Wallcoverings</a><a>Fabrics</a><a>Murals</a><a>By Color</a><a>By Room</a><a>New Arrivals</a><a>Trade Program</a><a>Samples</a></div></nav>
 <div class="heroc">
   <div class="rv"><h1 class="disp">The marketplace of extraordinary walls.</h1><p>Marketplace-luxe — white-gallery ground, curated collections, provenance chips, designer-first navigation. A curated face for the deepest designer-wallcovering catalog online — every pattern sampled for $4.25, every order backed by thirty years of trade expertise.</p><a class="cta">Explore the collection</a></div>
-  <div class="heroimg rv"></div>
+  <div class="heroimg rv"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/riviera.webp?v=1761541180&width=1100" alt="" loading="eager"></div>
 </div>
 <div class="wrap">
   <div class="sh"><h2>Curated This Week</h2>
@@ -60,42 +62,42 @@ footer .in{max-width:1240px;margin:0 auto;padding:36px 22px;display:flex;justify
       <input type="range" id="dens" min="2" max="6" step="1" value="4">
     </div>
   </div>
-  <div class="grid" id="grid"><article class="gcard" data-title="Chinois Garden" data-hue="28" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(28,22%,78%),hsl(68,30%,64%))"></div>
-      <h4>Chinois Garden</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Venetian Plaster" data-hue="152" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(152,22%,78%),hsl(192,30%,64%))"></div>
-      <h4>Venetian Plaster</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Grasscloth No. 9" data-hue="208" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(208,22%,78%),hsl(248,30%,64%))"></div>
-      <h4>Grasscloth No. 9</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
-    </article><article class="gcard" data-title="Deco Fan" data-hue="12" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(12,22%,78%),hsl(52,30%,64%))"></div>
-      <h4>Deco Fan</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Midnight Damask" data-hue="262" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(262,22%,78%),hsl(302,30%,64%))"></div>
-      <h4>Midnight Damask</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Coastal Weave" data-hue="88" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(88,22%,78%),hsl(128,30%,64%))"></div>
-      <h4>Coastal Weave</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
-    </article><article class="gcard" data-title="Rosewood Toile" data-hue="340" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(340,22%,78%),hsl(20,30%,64%))"></div>
-      <h4>Rosewood Toile</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Celadon Silk" data-hue="190" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(190,22%,78%),hsl(230,30%,64%))"></div>
-      <h4>Celadon Silk</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Gilt Trellis" data-hue="46" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(46,22%,78%),hsl(86,30%,64%))"></div>
-      <h4>Gilt Trellis</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
-    </article><article class="gcard" data-title="Amethyst Moire" data-hue="300" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(300,22%,78%),hsl(340,30%,64%))"></div>
-      <h4>Amethyst Moire</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Sage Stripe" data-hue="130" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(130,22%,78%),hsl(170,30%,64%))"></div>
-      <h4>Sage Stripe</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Terra Fresco" data-hue="20" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(20,22%,78%),hsl(60,30%,64%))"></div>
-      <h4>Terra Fresco</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
+  <div class="grid" id="grid"><article class="gcard" data-title="Titik Wp Linen" data-hue="28" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/CCP-2347_16.jpg?v=1777019997&width=540" loading="lazy" alt="Titik Wp Linen"></div>
+      <h4>Titik Wp Linen</h4><div class="gmeta"><span>Caroline Cecil Textiles</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Posh Snakes Green" data-hue="152" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Wallpaper-Behang-Posh-Snakes-gray-green-groen-grijs-Catchii-mockup_328e2e61-4b16-43d9-bf54-c100543af4bd.jpg?v=1744999054&width=540" loading="lazy" alt="Posh Snakes Green"></div>
+      <h4>Posh Snakes Green</h4><div class="gmeta"><span>Catchii Netherlands Europe</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Tortoise" data-hue="208" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/tortoise.jpg?v=1760721667&width=540" loading="lazy" alt="Tortoise"></div>
+      <h4>Tortoise</h4><div class="gmeta"><span>Celerie Kemble</span><span class="tier">reserve</span></div>
+    </article><article class="gcard" data-title="Diva Poplin, Vert" data-hue="12" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/vert-1904_1_134404.jpg?v=1782672048&width=540" loading="lazy" alt="Diva Poplin, Vert"></div>
+      <h4>Diva Poplin, Vert</h4><div class="gmeta"><span>Charles Burger</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Willow Pearl - Cream" data-hue="262" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/2008-148-04-Willow-Pearl-scaled_27cc3134-1291-4605-85ca-d870cd905b85.jpg?v=1773305872&width=540" loading="lazy" alt="Willow Pearl - Cream"></div>
+      <h4>Willow Pearl - Cream</h4><div class="gmeta"><span>1838 Wallcoverings</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Designdrop - Colourful" data-hue="88" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/66e3a5f29fd1fd50090f5d5fce9b4ddc.jpg?v=1773629119&width=540" loading="lazy" alt="Designdrop - Colourful"></div>
+      <h4>Designdrop - Colourful</h4><div class="gmeta"><span>A.S. Création</span><span class="tier">reserve</span></div>
+    </article><article class="gcard" data-title="Brown on Tint" data-hue="340" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Criss-Cross-Brown-on-Tint-AC403-16_015244-sm-thumb.jpg?v=1783597230&width=540" loading="lazy" alt="Brown on Tint"></div>
+      <h4>Brown on Tint</h4><div class="gmeta"><span>Alan Campbell</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Riviera" data-hue="190" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/riviera.webp?v=1761541180&width=540" loading="lazy" alt="Riviera"></div>
+      <h4>Riviera</h4><div class="gmeta"><span>Ananbo</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Ark - Parchment - beige" data-hue="46" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AMW10001_1611_11959302-5997-4bcd-9a99-c54a9b0919e8.jpg?v=1775761440&width=540" loading="lazy" alt="Ark - Parchment - beige"></div>
+      <h4>Ark - Parchment - beige</h4><div class="gmeta"><span>Andrew Martin</span><span class="tier">reserve</span></div>
+    </article><article class="gcard" data-title="Gibson, Navy" data-hue="300" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AT78793_4d4910ee-a9f9-4534-ae47-bed6b7d9942d.jpg?v=1782985244&width=540" loading="lazy" alt="Gibson, Navy"></div>
+      <h4>Gibson, Navy</h4><div class="gmeta"><span>Anna French</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Anthology - Stria Stone/Amber/Plum" data-hue="130" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/ESHE131796.jpg?v=1784735551&width=540" loading="lazy" alt="Anthology - Stria Stone/Amber/Plum"></div>
+      <h4>Anthology - Stria Stone/Amber/Plum</h4><div class="gmeta"><span>Anthology</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Caswell Sage Green" data-hue="20" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/PSW1213RL.jpg?v=1740775136&width=540" loading="lazy" alt="Caswell Sage Green"></div>
+      <h4>Caswell Sage Green</h4><div class="gmeta"><span>Apartment Wallpaper</span><span class="tier">reserve</span></div>
     </article></div>
 </div>
 <div class="ns"><div><h3 class="disp">The Designer's Brief</h3><p>New arrivals, designer picks, and pattern stories — weekly, from Los Angeles.</p></div><form onsubmit="return false"><input type="email" placeholder="you@studio.com"><button>Subscribe</button></form></div>
diff --git a/public/versions/heritage.html b/public/versions/heritage.html
index ef2c45e..80c110c 100644
--- a/public/versions/heritage.html
+++ b/public/versions/heritage.html
@@ -22,7 +22,8 @@ nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
 .heroc p{margin-top:16px;opacity:.75;font-size:17px;max-width:52ch}
 .cta{display:inline-block;margin-top:26px;border:1px solid var(--gold);color:var(--gold);font-size:12px;letter-spacing:.22em;text-transform:uppercase;padding:13px 26px;border-radius:999px;transition:.25s}
 .cta:hover{background:var(--gold);color:#0b0b0c}
-.heroimg{aspect-ratio:4/3;border-radius:6px;background:linear-gradient(135deg,var(--panel),var(--gold))}
+.heroimg{aspect-ratio:4/3;border-radius:6px;background:linear-gradient(135deg,var(--panel),var(--gold));overflow:hidden}
+.heroimg img{width:100%;height:100%;object-fit:cover;display:block}
 .wrap{max-width:1240px;margin:0 auto;padding:0 22px}
 .sh{display:flex;align-items:center;justify-content:space-between;gap:18px;border-top:3px solid var(--gold);padding-top:12px;margin:34px 0 8px;flex-wrap:wrap}
 .sh h2{font-size:15px;text-transform:uppercase;letter-spacing:.08em;font-weight:600}
@@ -31,7 +32,8 @@ nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
 .controls select{background:var(--panel);color:var(--ink);border:1px solid var(--line);padding:7px 10px;border-radius:4px;font-family:'Jost',system-ui,sans-serif;font-size:12px}
 .controls input[type=range]{accent-color:var(--gold);width:110px}
 .grid{display:grid;grid-template-columns:repeat(var(--cols),1fr);gap:20px;padding:18px 0 40px}
-.gcard .gimg{aspect-ratio:3/4;border-radius:5px;transition:.3s}.gcard:hover .gimg{transform:translateY(-4px);box-shadow:0 14px 40px rgba(0,0,0,.28)}
+.gcard .gimg{aspect-ratio:3/4;border-radius:5px;transition:.3s;overflow:hidden;background:var(--panel)}.gcard:hover .gimg{transform:translateY(-4px);box-shadow:0 14px 40px rgba(0,0,0,.28)}
+.gcard .gimg img{width:100%;height:100%;object-fit:cover;display:block}
 .gcard h4{font-family:'Cormorant Garamond',Georgia,serif;font-size:16.5px;margin:10px 0 2px}
 .gmeta{display:flex;justify-content:space-between;font-size:11px;opacity:.65;letter-spacing:.06em;text-transform:uppercase}
 .tier{color:var(--gold)}
@@ -49,7 +51,7 @@ footer .in{max-width:1240px;margin:0 auto;padding:36px 22px;display:flex;justify
 <nav class="sec"><div class="in"><a>Wallcoverings</a><a>Fabrics</a><a>Murals</a><a>By Color</a><a>By Room</a><a>New Arrivals</a><a>Trade Program</a><a>Samples</a></div></nav>
 <div class="heroc">
   <div class="rv"><h1 class="disp">Colour, considered for a century.</h1><p>Estate heritage — muted greens, archival typography, room-story merchandising. A curated face for the deepest designer-wallcovering catalog online — every pattern sampled for $4.25, every order backed by thirty years of trade expertise.</p><a class="cta">Explore the collection</a></div>
-  <div class="heroimg rv"></div>
+  <div class="heroimg rv"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/0146f618c045458f55fde3938e24a872_8d33407f-805e-4aaa-ac25-b833e713ab71.jpg?v=1688757110&width=1100" alt="" loading="eager"></div>
 </div>
 <div class="wrap">
   <div class="sh"><h2>Curated This Week</h2>
@@ -60,42 +62,42 @@ footer .in{max-width:1240px;margin:0 auto;padding:36px 22px;display:flex;justify
       <input type="range" id="dens" min="2" max="6" step="1" value="4">
     </div>
   </div>
-  <div class="grid" id="grid"><article class="gcard" data-title="Chinois Garden" data-hue="28" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(28,22%,24%),hsl(68,30%,14%))"></div>
-      <h4>Chinois Garden</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Venetian Plaster" data-hue="152" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(152,22%,24%),hsl(192,30%,14%))"></div>
-      <h4>Venetian Plaster</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Grasscloth No. 9" data-hue="208" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(208,22%,24%),hsl(248,30%,14%))"></div>
-      <h4>Grasscloth No. 9</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
-    </article><article class="gcard" data-title="Deco Fan" data-hue="12" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(12,22%,24%),hsl(52,30%,14%))"></div>
-      <h4>Deco Fan</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Midnight Damask" data-hue="262" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(262,22%,24%),hsl(302,30%,14%))"></div>
-      <h4>Midnight Damask</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Coastal Weave" data-hue="88" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(88,22%,24%),hsl(128,30%,14%))"></div>
-      <h4>Coastal Weave</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
-    </article><article class="gcard" data-title="Rosewood Toile" data-hue="340" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(340,22%,24%),hsl(20,30%,14%))"></div>
-      <h4>Rosewood Toile</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Celadon Silk" data-hue="190" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(190,22%,24%),hsl(230,30%,14%))"></div>
-      <h4>Celadon Silk</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Gilt Trellis" data-hue="46" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(46,22%,24%),hsl(86,30%,14%))"></div>
-      <h4>Gilt Trellis</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
-    </article><article class="gcard" data-title="Amethyst Moire" data-hue="300" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(300,22%,24%),hsl(340,30%,14%))"></div>
-      <h4>Amethyst Moire</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Sage Stripe" data-hue="130" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(130,22%,24%),hsl(170,30%,14%))"></div>
-      <h4>Sage Stripe</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Terra Fresco" data-hue="20" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(20,22%,24%),hsl(60,30%,14%))"></div>
-      <h4>Terra Fresco</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
+  <div class="grid" id="grid"><article class="gcard" data-title="AT50-04 Unfinished" data-hue="28" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/36-raw.webp?v=1773709468&width=540" loading="lazy" alt="AT50-04 Unfinished"></div>
+      <h4>AT50-04 Unfinished</h4><div class="gmeta"><span>Atomic 50 Ceilings</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Puntini Sisal - Tanlines" data-hue="152" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/puntini-sisal-tanlines.jpg?v=1761078002&width=540" loading="lazy" alt="Puntini Sisal - Tanlines"></div>
+      <h4>Puntini Sisal - Tanlines</h4><div class="gmeta"><span>Backdrop</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Parvani Linen" data-hue="208" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/PW78034_5_3f924781-0c2e-438b-9846-83f79e437024.jpg?v=1777019988&width=540" loading="lazy" alt="Parvani Linen"></div>
+      <h4>Parvani Linen</h4><div class="gmeta"><span>Baker Lifestyle</span><span class="tier">reserve</span></div>
+    </article><article class="gcard" data-title="Otoko Pewter" data-hue="12" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/W930-03-otoko-wallcovering-pewter_01_5832ae5f-061c-4ca9-a0fd-a2cfae71fd80.jpg?v=1775598526&width=540" loading="lazy" alt="Otoko Pewter"></div>
+      <h4>Otoko Pewter</h4><div class="gmeta"><span>Black Edition</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Tiger Lily Midnight" data-hue="262" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/DWBM-260149.jpg?v=1773968873&width=540" loading="lazy" alt="Tiger Lily Midnight"></div>
+      <h4>Tiger Lily Midnight</h4><div class="gmeta"><span>Brand McKenzie</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Wild Meadow - Plaster Pink" data-hue="88" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/0146f618c045458f55fde3938e24a872_8d33407f-805e-4aaa-ac25-b833e713ab71.jpg?v=1688757110&width=540" loading="lazy" alt="Wild Meadow - Plaster Pink"></div>
+      <h4>Wild Meadow - Plaster Pink</h4><div class="gmeta"><span>British Walls</span><span class="tier">reserve</span></div>
+    </article><article class="gcard" data-title="Yasu Silver" data-hue="340" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/P8015111_11_926bf78a-0113-4b3d-a601-d75cad06b09c.jpg?v=1777019993&width=540" loading="lazy" alt="Yasu Silver"></div>
+      <h4>Yasu Silver</h4><div class="gmeta"><span>Brunschwig & Fils</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Carnegie Blair" data-hue="190" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/3b939cb6099480f87495278c2df300f8_9a832cf5-8d1b-426c-89a1-7029d87520e7.jpg?v=1784740002&width=540" loading="lazy" alt="Carnegie Blair"></div>
+      <h4>Carnegie Blair</h4><div class="gmeta"><span>Carnegie</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Titik Wp Linen" data-hue="46" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/CCP-2347_16.jpg?v=1777019997&width=540" loading="lazy" alt="Titik Wp Linen"></div>
+      <h4>Titik Wp Linen</h4><div class="gmeta"><span>Caroline Cecil Textiles</span><span class="tier">reserve</span></div>
+    </article><article class="gcard" data-title="Posh Snakes Green" data-hue="300" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Wallpaper-Behang-Posh-Snakes-gray-green-groen-grijs-Catchii-mockup_328e2e61-4b16-43d9-bf54-c100543af4bd.jpg?v=1744999054&width=540" loading="lazy" alt="Posh Snakes Green"></div>
+      <h4>Posh Snakes Green</h4><div class="gmeta"><span>Catchii Netherlands Europe</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Tortoise" data-hue="130" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/tortoise.jpg?v=1760721667&width=540" loading="lazy" alt="Tortoise"></div>
+      <h4>Tortoise</h4><div class="gmeta"><span>Celerie Kemble</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Diva Poplin, Vert" data-hue="20" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/vert-1904_1_134404.jpg?v=1782672048&width=540" loading="lazy" alt="Diva Poplin, Vert"></div>
+      <h4>Diva Poplin, Vert</h4><div class="gmeta"><span>Charles Burger</span><span class="tier">reserve</span></div>
     </article></div>
 </div>
 <div class="ns"><div><h3 class="disp">The Designer's Brief</h3><p>New arrivals, designer picks, and pattern stories — weekly, from Los Angeles.</p></div><form onsubmit="return false"><input type="email" placeholder="you@studio.com"><button>Subscribe</button></form></div>
diff --git a/public/versions/maison.html b/public/versions/maison.html
index c19373c..5a4afce 100644
--- a/public/versions/maison.html
+++ b/public/versions/maison.html
@@ -22,7 +22,8 @@ nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
 .heroc p{margin-top:16px;opacity:.75;font-size:17px;max-width:52ch}
 .cta{display:inline-block;margin-top:26px;border:1px solid var(--gold);color:var(--gold);font-size:12px;letter-spacing:.22em;text-transform:uppercase;padding:13px 26px;border-radius:999px;transition:.25s}
 .cta:hover{background:var(--gold);color:#0b0b0c}
-.heroimg{aspect-ratio:4/3;border-radius:6px;background:linear-gradient(135deg,var(--panel),var(--gold))}
+.heroimg{aspect-ratio:4/3;border-radius:6px;background:linear-gradient(135deg,var(--panel),var(--gold));overflow:hidden}
+.heroimg img{width:100%;height:100%;object-fit:cover;display:block}
 .wrap{max-width:1240px;margin:0 auto;padding:0 22px}
 .sh{display:flex;align-items:center;justify-content:space-between;gap:18px;border-top:3px solid var(--gold);padding-top:12px;margin:34px 0 8px;flex-wrap:wrap}
 .sh h2{font-size:15px;text-transform:uppercase;letter-spacing:.08em;font-weight:600}
@@ -31,7 +32,8 @@ nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
 .controls select{background:var(--panel);color:var(--ink);border:1px solid var(--line);padding:7px 10px;border-radius:4px;font-family:'Inter',system-ui,sans-serif;font-size:12px}
 .controls input[type=range]{accent-color:var(--gold);width:110px}
 .grid{display:grid;grid-template-columns:repeat(var(--cols),1fr);gap:20px;padding:18px 0 40px}
-.gcard .gimg{aspect-ratio:3/4;border-radius:5px;transition:.3s}.gcard:hover .gimg{transform:translateY(-4px);box-shadow:0 14px 40px rgba(0,0,0,.28)}
+.gcard .gimg{aspect-ratio:3/4;border-radius:5px;transition:.3s;overflow:hidden;background:var(--panel)}.gcard:hover .gimg{transform:translateY(-4px);box-shadow:0 14px 40px rgba(0,0,0,.28)}
+.gcard .gimg img{width:100%;height:100%;object-fit:cover;display:block}
 .gcard h4{font-family:'Playfair Display',Georgia,serif;font-size:16.5px;margin:10px 0 2px}
 .gmeta{display:flex;justify-content:space-between;font-size:11px;opacity:.65;letter-spacing:.06em;text-transform:uppercase}
 .tier{color:var(--gold)}
@@ -49,7 +51,7 @@ footer .in{max-width:1240px;margin:0 auto;padding:36px 22px;display:flex;justify
 <nav class="sec"><div class="in"><a>Wallcoverings</a><a>Fabrics</a><a>Murals</a><a>By Color</a><a>By Room</a><a>New Arrivals</a><a>Trade Program</a><a>Samples</a></div></nav>
 <div class="heroc">
   <div class="rv"><h1 class="disp">The Parisian maison, digitized.</h1><p>French maison energy — indigo + ochre, pattern-forward editorial storytelling. A curated face for the deepest designer-wallcovering catalog online — every pattern sampled for $4.25, every order backed by thirty years of trade expertise.</p><a class="cta">Explore the collection</a></div>
-  <div class="heroimg rv"></div>
+  <div class="heroimg rv"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/PSW1213RL.jpg?v=1740775136&width=1100" alt="" loading="eager"></div>
 </div>
 <div class="wrap">
   <div class="sh"><h2>Curated This Week</h2>
@@ -60,42 +62,42 @@ footer .in{max-width:1240px;margin:0 auto;padding:36px 22px;display:flex;justify
       <input type="range" id="dens" min="2" max="6" step="1" value="4">
     </div>
   </div>
-  <div class="grid" id="grid"><article class="gcard" data-title="Chinois Garden" data-hue="28" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(28,22%,24%),hsl(68,30%,14%))"></div>
-      <h4>Chinois Garden</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Venetian Plaster" data-hue="152" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(152,22%,24%),hsl(192,30%,14%))"></div>
-      <h4>Venetian Plaster</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Grasscloth No. 9" data-hue="208" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(208,22%,24%),hsl(248,30%,14%))"></div>
-      <h4>Grasscloth No. 9</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
-    </article><article class="gcard" data-title="Deco Fan" data-hue="12" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(12,22%,24%),hsl(52,30%,14%))"></div>
-      <h4>Deco Fan</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Midnight Damask" data-hue="262" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(262,22%,24%),hsl(302,30%,14%))"></div>
-      <h4>Midnight Damask</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Coastal Weave" data-hue="88" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(88,22%,24%),hsl(128,30%,14%))"></div>
-      <h4>Coastal Weave</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
-    </article><article class="gcard" data-title="Rosewood Toile" data-hue="340" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(340,22%,24%),hsl(20,30%,14%))"></div>
-      <h4>Rosewood Toile</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Celadon Silk" data-hue="190" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(190,22%,24%),hsl(230,30%,14%))"></div>
-      <h4>Celadon Silk</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Gilt Trellis" data-hue="46" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(46,22%,24%),hsl(86,30%,14%))"></div>
-      <h4>Gilt Trellis</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
-    </article><article class="gcard" data-title="Amethyst Moire" data-hue="300" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(300,22%,24%),hsl(340,30%,14%))"></div>
-      <h4>Amethyst Moire</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Sage Stripe" data-hue="130" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(130,22%,24%),hsl(170,30%,14%))"></div>
-      <h4>Sage Stripe</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Terra Fresco" data-hue="20" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(20,22%,24%),hsl(60,30%,14%))"></div>
-      <h4>Terra Fresco</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
+  <div class="grid" id="grid"><article class="gcard" data-title="Ark - Parchment - beige" data-hue="28" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AMW10001_1611_11959302-5997-4bcd-9a99-c54a9b0919e8.jpg?v=1775761440&width=540" loading="lazy" alt="Ark - Parchment - beige"></div>
+      <h4>Ark - Parchment - beige</h4><div class="gmeta"><span>Andrew Martin</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Gibson, Navy" data-hue="152" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AT78793_4d4910ee-a9f9-4534-ae47-bed6b7d9942d.jpg?v=1782985244&width=540" loading="lazy" alt="Gibson, Navy"></div>
+      <h4>Gibson, Navy</h4><div class="gmeta"><span>Anna French</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Anthology - Stria Stone/Amber/Plum" data-hue="208" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/ESHE131796.jpg?v=1784735551&width=540" loading="lazy" alt="Anthology - Stria Stone/Amber/Plum"></div>
+      <h4>Anthology - Stria Stone/Amber/Plum</h4><div class="gmeta"><span>Anthology</span><span class="tier">reserve</span></div>
+    </article><article class="gcard" data-title="Caswell Sage Green" data-hue="12" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/PSW1213RL.jpg?v=1740775136&width=540" loading="lazy" alt="Caswell Sage Green"></div>
+      <h4>Caswell Sage Green</h4><div class="gmeta"><span>Apartment Wallpaper</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Atlantic Cay - Verdant" data-hue="262" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Skintex-SF_Aspect_Teal.jpg?v=1773218078&width=540" loading="lazy" alt="Atlantic Cay - Verdant"></div>
+      <h4>Atlantic Cay - Verdant</h4><div class="gmeta"><span>Architectural Fabrics</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Agra Okra" data-hue="88" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Indienne_Agra_18310_Roomshot_Web_LR-medium-two-thirds.jpg?v=1775694511&width=540" loading="lazy" alt="Agra Okra"></div>
+      <h4>Agra Okra</h4><div class="gmeta"><span>Arte International</span><span class="tier">reserve</span></div>
+    </article><article class="gcard" data-title="Tabula Wax Yellow" data-hue="340" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/TABW-002.jpg?v=1781283018&width=540" loading="lazy" alt="Tabula Wax Yellow"></div>
+      <h4>Tabula Wax Yellow</h4><div class="gmeta"><span>Artmura</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="History of Art 2 - Green" data-hue="190" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/792889b95340fba909e80a1654dba520_26de4b84-bada-44c9-8ff0-d634e951ba3c.jpg?v=1776187521&width=540" loading="lazy" alt="History of Art 2 - Green"></div>
+      <h4>History of Art 2 - Green</h4><div class="gmeta"><span>AS Creation</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="AT50-04 Unfinished" data-hue="46" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/36-raw.webp?v=1773709468&width=540" loading="lazy" alt="AT50-04 Unfinished"></div>
+      <h4>AT50-04 Unfinished</h4><div class="gmeta"><span>Atomic 50 Ceilings</span><span class="tier">reserve</span></div>
+    </article><article class="gcard" data-title="Puntini Sisal - Tanlines" data-hue="300" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/puntini-sisal-tanlines.jpg?v=1761078002&width=540" loading="lazy" alt="Puntini Sisal - Tanlines"></div>
+      <h4>Puntini Sisal - Tanlines</h4><div class="gmeta"><span>Backdrop</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Parvani Linen" data-hue="130" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/PW78034_5_3f924781-0c2e-438b-9846-83f79e437024.jpg?v=1777019988&width=540" loading="lazy" alt="Parvani Linen"></div>
+      <h4>Parvani Linen</h4><div class="gmeta"><span>Baker Lifestyle</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Otoko Pewter" data-hue="20" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/W930-03-otoko-wallcovering-pewter_01_5832ae5f-061c-4ca9-a0fd-a2cfae71fd80.jpg?v=1775598526&width=540" loading="lazy" alt="Otoko Pewter"></div>
+      <h4>Otoko Pewter</h4><div class="gmeta"><span>Black Edition</span><span class="tier">reserve</span></div>
     </article></div>
 </div>
 <div class="ns"><div><h3 class="disp">The Designer's Brief</h3><p>New arrivals, designer picks, and pattern stories — weekly, from Los Angeles.</p></div><form onsubmit="return false"><input type="email" placeholder="you@studio.com"><button>Subscribe</button></form></div>
diff --git a/public/versions/studio.html b/public/versions/studio.html
index 0acf4d9..0d2b750 100644
--- a/public/versions/studio.html
+++ b/public/versions/studio.html
@@ -22,7 +22,8 @@ nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
 .heroc p{margin-top:16px;opacity:.75;font-size:17px;max-width:52ch}
 .cta{display:inline-block;margin-top:26px;border:1px solid var(--gold);color:var(--gold);font-size:12px;letter-spacing:.22em;text-transform:uppercase;padding:13px 26px;border-radius:999px;transition:.25s}
 .cta:hover{background:var(--gold);color:#fff}
-.heroimg{aspect-ratio:4/3;border-radius:6px;background:linear-gradient(135deg,var(--panel),var(--gold))}
+.heroimg{aspect-ratio:4/3;border-radius:6px;background:linear-gradient(135deg,var(--panel),var(--gold));overflow:hidden}
+.heroimg img{width:100%;height:100%;object-fit:cover;display:block}
 .wrap{max-width:1240px;margin:0 auto;padding:0 22px}
 .sh{display:flex;align-items:center;justify-content:space-between;gap:18px;border-top:3px solid var(--gold);padding-top:12px;margin:34px 0 8px;flex-wrap:wrap}
 .sh h2{font-size:15px;text-transform:uppercase;letter-spacing:.08em;font-weight:600}
@@ -31,7 +32,8 @@ nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
 .controls select{background:var(--panel);color:var(--ink);border:1px solid var(--line);padding:7px 10px;border-radius:4px;font-family:'Inter',system-ui,sans-serif;font-size:12px}
 .controls input[type=range]{accent-color:var(--gold);width:110px}
 .grid{display:grid;grid-template-columns:repeat(var(--cols),1fr);gap:20px;padding:18px 0 40px}
-.gcard .gimg{aspect-ratio:3/4;border-radius:5px;transition:.3s}.gcard:hover .gimg{transform:translateY(-4px);box-shadow:0 14px 40px rgba(0,0,0,.28)}
+.gcard .gimg{aspect-ratio:3/4;border-radius:5px;transition:.3s;overflow:hidden;background:var(--panel)}.gcard:hover .gimg{transform:translateY(-4px);box-shadow:0 14px 40px rgba(0,0,0,.28)}
+.gcard .gimg img{width:100%;height:100%;object-fit:cover;display:block}
 .gcard h4{font-family:'Inter',system-ui,sans-serif;font-size:16.5px;margin:10px 0 2px}
 .gmeta{display:flex;justify-content:space-between;font-size:11px;opacity:.65;letter-spacing:.06em;text-transform:uppercase}
 .tier{color:var(--gold)}
@@ -49,7 +51,7 @@ footer .in{max-width:1240px;margin:0 auto;padding:36px 22px;display:flex;justify
 <nav class="sec"><div class="in"><a>Wallcoverings</a><a>Fabrics</a><a>Murals</a><a>By Color</a><a>By Room</a><a>New Arrivals</a><a>Trade Program</a><a>Samples</a></div></nav>
 <div class="heroc">
   <div class="rv"><h1 class="disp">Wallpaper, without the intimidation.</h1><p>DTC-playful — bold color blocks, plain language, sample-first funnel. A curated face for the deepest designer-wallcovering catalog online — every pattern sampled for $4.25, every order backed by thirty years of trade expertise.</p><a class="cta">Explore the collection</a></div>
-  <div class="heroimg rv"></div>
+  <div class="heroimg rv"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/36-raw.webp?v=1773709468&width=1100" alt="" loading="eager"></div>
 </div>
 <div class="wrap">
   <div class="sh"><h2>Curated This Week</h2>
@@ -60,42 +62,42 @@ footer .in{max-width:1240px;margin:0 auto;padding:36px 22px;display:flex;justify
       <input type="range" id="dens" min="2" max="6" step="1" value="4">
     </div>
   </div>
-  <div class="grid" id="grid"><article class="gcard" data-title="Chinois Garden" data-hue="28" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(28,22%,78%),hsl(68,30%,64%))"></div>
-      <h4>Chinois Garden</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Venetian Plaster" data-hue="152" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(152,22%,78%),hsl(192,30%,64%))"></div>
-      <h4>Venetian Plaster</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Grasscloth No. 9" data-hue="208" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(208,22%,78%),hsl(248,30%,64%))"></div>
-      <h4>Grasscloth No. 9</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
-    </article><article class="gcard" data-title="Deco Fan" data-hue="12" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(12,22%,78%),hsl(52,30%,64%))"></div>
-      <h4>Deco Fan</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Midnight Damask" data-hue="262" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(262,22%,78%),hsl(302,30%,64%))"></div>
-      <h4>Midnight Damask</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Coastal Weave" data-hue="88" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(88,22%,78%),hsl(128,30%,64%))"></div>
-      <h4>Coastal Weave</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
-    </article><article class="gcard" data-title="Rosewood Toile" data-hue="340" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(340,22%,78%),hsl(20,30%,64%))"></div>
-      <h4>Rosewood Toile</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Celadon Silk" data-hue="190" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(190,22%,78%),hsl(230,30%,64%))"></div>
-      <h4>Celadon Silk</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Gilt Trellis" data-hue="46" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(46,22%,78%),hsl(86,30%,64%))"></div>
-      <h4>Gilt Trellis</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
-    </article><article class="gcard" data-title="Amethyst Moire" data-hue="300" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(300,22%,78%),hsl(340,30%,64%))"></div>
-      <h4>Amethyst Moire</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Sage Stripe" data-hue="130" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(130,22%,78%),hsl(170,30%,64%))"></div>
-      <h4>Sage Stripe</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Terra Fresco" data-hue="20" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(20,22%,78%),hsl(60,30%,64%))"></div>
-      <h4>Terra Fresco</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
+  <div class="grid" id="grid"><article class="gcard" data-title="Atlantic Cay - Verdant" data-hue="28" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Skintex-SF_Aspect_Teal.jpg?v=1773218078&width=540" loading="lazy" alt="Atlantic Cay - Verdant"></div>
+      <h4>Atlantic Cay - Verdant</h4><div class="gmeta"><span>Architectural Fabrics</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Agra Okra" data-hue="152" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Indienne_Agra_18310_Roomshot_Web_LR-medium-two-thirds.jpg?v=1775694511&width=540" loading="lazy" alt="Agra Okra"></div>
+      <h4>Agra Okra</h4><div class="gmeta"><span>Arte International</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Tabula Wax Yellow" data-hue="208" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/TABW-002.jpg?v=1781283018&width=540" loading="lazy" alt="Tabula Wax Yellow"></div>
+      <h4>Tabula Wax Yellow</h4><div class="gmeta"><span>Artmura</span><span class="tier">reserve</span></div>
+    </article><article class="gcard" data-title="History of Art 2 - Green" data-hue="12" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/792889b95340fba909e80a1654dba520_26de4b84-bada-44c9-8ff0-d634e951ba3c.jpg?v=1776187521&width=540" loading="lazy" alt="History of Art 2 - Green"></div>
+      <h4>History of Art 2 - Green</h4><div class="gmeta"><span>AS Creation</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="AT50-04 Unfinished" data-hue="262" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/36-raw.webp?v=1773709468&width=540" loading="lazy" alt="AT50-04 Unfinished"></div>
+      <h4>AT50-04 Unfinished</h4><div class="gmeta"><span>Atomic 50 Ceilings</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Puntini Sisal - Tanlines" data-hue="88" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/puntini-sisal-tanlines.jpg?v=1761078002&width=540" loading="lazy" alt="Puntini Sisal - Tanlines"></div>
+      <h4>Puntini Sisal - Tanlines</h4><div class="gmeta"><span>Backdrop</span><span class="tier">reserve</span></div>
+    </article><article class="gcard" data-title="Parvani Linen" data-hue="340" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/PW78034_5_3f924781-0c2e-438b-9846-83f79e437024.jpg?v=1777019988&width=540" loading="lazy" alt="Parvani Linen"></div>
+      <h4>Parvani Linen</h4><div class="gmeta"><span>Baker Lifestyle</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Otoko Pewter" data-hue="190" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/W930-03-otoko-wallcovering-pewter_01_5832ae5f-061c-4ca9-a0fd-a2cfae71fd80.jpg?v=1775598526&width=540" loading="lazy" alt="Otoko Pewter"></div>
+      <h4>Otoko Pewter</h4><div class="gmeta"><span>Black Edition</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Tiger Lily Midnight" data-hue="46" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/DWBM-260149.jpg?v=1773968873&width=540" loading="lazy" alt="Tiger Lily Midnight"></div>
+      <h4>Tiger Lily Midnight</h4><div class="gmeta"><span>Brand McKenzie</span><span class="tier">reserve</span></div>
+    </article><article class="gcard" data-title="Wild Meadow - Plaster Pink" data-hue="300" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/0146f618c045458f55fde3938e24a872_8d33407f-805e-4aaa-ac25-b833e713ab71.jpg?v=1688757110&width=540" loading="lazy" alt="Wild Meadow - Plaster Pink"></div>
+      <h4>Wild Meadow - Plaster Pink</h4><div class="gmeta"><span>British Walls</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Yasu Silver" data-hue="130" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/P8015111_11_926bf78a-0113-4b3d-a601-d75cad06b09c.jpg?v=1777019993&width=540" loading="lazy" alt="Yasu Silver"></div>
+      <h4>Yasu Silver</h4><div class="gmeta"><span>Brunschwig & Fils</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Carnegie Blair" data-hue="20" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/3b939cb6099480f87495278c2df300f8_9a832cf5-8d1b-426c-89a1-7029d87520e7.jpg?v=1784740002&width=540" loading="lazy" alt="Carnegie Blair"></div>
+      <h4>Carnegie Blair</h4><div class="gmeta"><span>Carnegie</span><span class="tier">reserve</span></div>
     </article></div>
 </div>
 <div class="ns"><div><h3 class="disp">The Designer's Brief</h3><p>New arrivals, designer picks, and pattern stories — weekly, from Los Angeles.</p></div><form onsubmit="return false"><input type="email" placeholder="you@studio.com"><button>Subscribe</button></form></div>
diff --git a/public/versions/texture.html b/public/versions/texture.html
index a75a80f..d9775da 100644
--- a/public/versions/texture.html
+++ b/public/versions/texture.html
@@ -22,7 +22,8 @@ nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
 .heroc p{margin-top:16px;opacity:.75;font-size:17px;max-width:52ch}
 .cta{display:inline-block;margin-top:26px;border:1px solid var(--gold);color:var(--gold);font-size:12px;letter-spacing:.22em;text-transform:uppercase;padding:13px 26px;border-radius:999px;transition:.25s}
 .cta:hover{background:var(--gold);color:#0b0b0c}
-.heroimg{aspect-ratio:4/3;border-radius:6px;background:linear-gradient(135deg,var(--panel),var(--gold))}
+.heroimg{aspect-ratio:4/3;border-radius:6px;background:linear-gradient(135deg,var(--panel),var(--gold));overflow:hidden}
+.heroimg img{width:100%;height:100%;object-fit:cover;display:block}
 .wrap{max-width:1240px;margin:0 auto;padding:0 22px}
 .sh{display:flex;align-items:center;justify-content:space-between;gap:18px;border-top:3px solid var(--gold);padding-top:12px;margin:34px 0 8px;flex-wrap:wrap}
 .sh h2{font-size:15px;text-transform:uppercase;letter-spacing:.08em;font-weight:600}
@@ -31,7 +32,8 @@ nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
 .controls select{background:var(--panel);color:var(--ink);border:1px solid var(--line);padding:7px 10px;border-radius:4px;font-family:'Jost',system-ui,sans-serif;font-size:12px}
 .controls input[type=range]{accent-color:var(--gold);width:110px}
 .grid{display:grid;grid-template-columns:repeat(var(--cols),1fr);gap:20px;padding:18px 0 40px}
-.gcard .gimg{aspect-ratio:3/4;border-radius:5px;transition:.3s}.gcard:hover .gimg{transform:translateY(-4px);box-shadow:0 14px 40px rgba(0,0,0,.28)}
+.gcard .gimg{aspect-ratio:3/4;border-radius:5px;transition:.3s;overflow:hidden;background:var(--panel)}.gcard:hover .gimg{transform:translateY(-4px);box-shadow:0 14px 40px rgba(0,0,0,.28)}
+.gcard .gimg img{width:100%;height:100%;object-fit:cover;display:block}
 .gcard h4{font-family:'Cormorant Garamond',Georgia,serif;font-size:16.5px;margin:10px 0 2px}
 .gmeta{display:flex;justify-content:space-between;font-size:11px;opacity:.65;letter-spacing:.06em;text-transform:uppercase}
 .tier{color:var(--gold)}
@@ -49,7 +51,7 @@ footer .in{max-width:1240px;margin:0 auto;padding:36px 22px;display:flex;justify
 <nav class="sec"><div class="in"><a>Wallcoverings</a><a>Fabrics</a><a>Murals</a><a>By Color</a><a>By Room</a><a>New Arrivals</a><a>Trade Program</a><a>Samples</a></div></nav>
 <div class="heroc">
   <div class="rv"><h1 class="disp">Material is the message.</h1><p>Immersive texture — full-bleed material macros, dark gallery chrome, slow motion. A curated face for the deepest designer-wallcovering catalog online — every pattern sampled for $4.25, every order backed by thirty years of trade expertise.</p><a class="cta">Explore the collection</a></div>
-  <div class="heroimg rv"></div>
+  <div class="heroimg rv"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/tortoise.jpg?v=1760721667&width=1100" alt="" loading="eager"></div>
 </div>
 <div class="wrap">
   <div class="sh"><h2>Curated This Week</h2>
@@ -60,42 +62,42 @@ footer .in{max-width:1240px;margin:0 auto;padding:36px 22px;display:flex;justify
       <input type="range" id="dens" min="2" max="6" step="1" value="4">
     </div>
   </div>
-  <div class="grid" id="grid"><article class="gcard" data-title="Chinois Garden" data-hue="28" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(28,22%,24%),hsl(68,30%,14%))"></div>
-      <h4>Chinois Garden</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Venetian Plaster" data-hue="152" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(152,22%,24%),hsl(192,30%,14%))"></div>
-      <h4>Venetian Plaster</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Grasscloth No. 9" data-hue="208" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(208,22%,24%),hsl(248,30%,14%))"></div>
-      <h4>Grasscloth No. 9</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
-    </article><article class="gcard" data-title="Deco Fan" data-hue="12" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(12,22%,24%),hsl(52,30%,14%))"></div>
-      <h4>Deco Fan</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Midnight Damask" data-hue="262" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(262,22%,24%),hsl(302,30%,14%))"></div>
-      <h4>Midnight Damask</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Coastal Weave" data-hue="88" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(88,22%,24%),hsl(128,30%,14%))"></div>
-      <h4>Coastal Weave</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
-    </article><article class="gcard" data-title="Rosewood Toile" data-hue="340" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(340,22%,24%),hsl(20,30%,14%))"></div>
-      <h4>Rosewood Toile</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Celadon Silk" data-hue="190" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(190,22%,24%),hsl(230,30%,14%))"></div>
-      <h4>Celadon Silk</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Gilt Trellis" data-hue="46" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(46,22%,24%),hsl(86,30%,14%))"></div>
-      <h4>Gilt Trellis</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
-    </article><article class="gcard" data-title="Amethyst Moire" data-hue="300" data-tier="0">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(300,22%,24%),hsl(340,30%,14%))"></div>
-      <h4>Amethyst Moire</h4><div class="gmeta"><span>Wallcovering</span><span class="tier">casual</span></div>
-    </article><article class="gcard" data-title="Sage Stripe" data-hue="130" data-tier="1">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(130,22%,24%),hsl(170,30%,14%))"></div>
-      <h4>Sage Stripe</h4><div class="gmeta"><span>Fabric</span><span class="tier">signature</span></div>
-    </article><article class="gcard" data-title="Terra Fresco" data-hue="20" data-tier="2">
-      <div class="gimg" style="background:linear-gradient(135deg,hsl(20,22%,24%),hsl(60,30%,14%))"></div>
-      <h4>Terra Fresco</h4><div class="gmeta"><span>Mural</span><span class="tier">reserve</span></div>
+  <div class="grid" id="grid"><article class="gcard" data-title="Tiger Lily Midnight" data-hue="28" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/DWBM-260149.jpg?v=1773968873&width=540" loading="lazy" alt="Tiger Lily Midnight"></div>
+      <h4>Tiger Lily Midnight</h4><div class="gmeta"><span>Brand McKenzie</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Wild Meadow - Plaster Pink" data-hue="152" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/0146f618c045458f55fde3938e24a872_8d33407f-805e-4aaa-ac25-b833e713ab71.jpg?v=1688757110&width=540" loading="lazy" alt="Wild Meadow - Plaster Pink"></div>
+      <h4>Wild Meadow - Plaster Pink</h4><div class="gmeta"><span>British Walls</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Yasu Silver" data-hue="208" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/P8015111_11_926bf78a-0113-4b3d-a601-d75cad06b09c.jpg?v=1777019993&width=540" loading="lazy" alt="Yasu Silver"></div>
+      <h4>Yasu Silver</h4><div class="gmeta"><span>Brunschwig & Fils</span><span class="tier">reserve</span></div>
+    </article><article class="gcard" data-title="Carnegie Blair" data-hue="12" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/3b939cb6099480f87495278c2df300f8_9a832cf5-8d1b-426c-89a1-7029d87520e7.jpg?v=1784740002&width=540" loading="lazy" alt="Carnegie Blair"></div>
+      <h4>Carnegie Blair</h4><div class="gmeta"><span>Carnegie</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Titik Wp Linen" data-hue="262" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/CCP-2347_16.jpg?v=1777019997&width=540" loading="lazy" alt="Titik Wp Linen"></div>
+      <h4>Titik Wp Linen</h4><div class="gmeta"><span>Caroline Cecil Textiles</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Posh Snakes Green" data-hue="88" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Wallpaper-Behang-Posh-Snakes-gray-green-groen-grijs-Catchii-mockup_328e2e61-4b16-43d9-bf54-c100543af4bd.jpg?v=1744999054&width=540" loading="lazy" alt="Posh Snakes Green"></div>
+      <h4>Posh Snakes Green</h4><div class="gmeta"><span>Catchii Netherlands Europe</span><span class="tier">reserve</span></div>
+    </article><article class="gcard" data-title="Tortoise" data-hue="340" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/tortoise.jpg?v=1760721667&width=540" loading="lazy" alt="Tortoise"></div>
+      <h4>Tortoise</h4><div class="gmeta"><span>Celerie Kemble</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Diva Poplin, Vert" data-hue="190" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/vert-1904_1_134404.jpg?v=1782672048&width=540" loading="lazy" alt="Diva Poplin, Vert"></div>
+      <h4>Diva Poplin, Vert</h4><div class="gmeta"><span>Charles Burger</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Willow Pearl - Cream" data-hue="46" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/2008-148-04-Willow-Pearl-scaled_27cc3134-1291-4605-85ca-d870cd905b85.jpg?v=1773305872&width=540" loading="lazy" alt="Willow Pearl - Cream"></div>
+      <h4>Willow Pearl - Cream</h4><div class="gmeta"><span>1838 Wallcoverings</span><span class="tier">reserve</span></div>
+    </article><article class="gcard" data-title="Designdrop - Colourful" data-hue="300" data-tier="0">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/66e3a5f29fd1fd50090f5d5fce9b4ddc.jpg?v=1773629119&width=540" loading="lazy" alt="Designdrop - Colourful"></div>
+      <h4>Designdrop - Colourful</h4><div class="gmeta"><span>A.S. Création</span><span class="tier">casual</span></div>
+    </article><article class="gcard" data-title="Brown on Tint" data-hue="130" data-tier="1">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Criss-Cross-Brown-on-Tint-AC403-16_015244-sm-thumb.jpg?v=1783597230&width=540" loading="lazy" alt="Brown on Tint"></div>
+      <h4>Brown on Tint</h4><div class="gmeta"><span>Alan Campbell</span><span class="tier">signature</span></div>
+    </article><article class="gcard" data-title="Riviera" data-hue="20" data-tier="2">
+      <div class="gimg"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/riviera.webp?v=1761541180&width=540" loading="lazy" alt="Riviera"></div>
+      <h4>Riviera</h4><div class="gmeta"><span>Ananbo</span><span class="tier">reserve</span></div>
     </article></div>
 </div>
 <div class="ns"><div><h3 class="disp">The Designer's Brief</h3><p>New arrivals, designer picks, and pattern stories — weekly, from Los Angeles.</p></div><form onsubmit="return false"><input type="email" placeholder="you@studio.com"><button>Subscribe</button></form></div>
diff --git a/scripts/collect-dw.mjs b/scripts/collect-dw.mjs
index 8012264..137d597 100644
--- a/scripts/collect-dw.mjs
+++ b/scripts/collect-dw.mjs
@@ -14,6 +14,8 @@ const OUT = join(HERE, '..', 'data');
 mkdirSync(OUT, { recursive: true });
 
 const AUTH = 'Basic ' + Buffer.from('admin:DW2024!').toString('base64');
+// One shared forbidden-name lens for every ingested surface (hosts, notes, gallery)
+const FORBIDDEN_NAMES = /schumacher|momentum|versa|wallquest|chesapeake|seabrook|nextwall|command54|greenland|rigo|tokiwa|justin.?david/i;
 
 function sql(q) {
   try {
@@ -61,6 +63,35 @@ const sampleOnly = { quote_only_by_design: +so[0] || 0, total: +so[1] || 0, back
 const sampleOnlyVendors = sql(`select vendor, count(*) from shopify_products where status='ACTIVE' and not coalesce(has_product_variant,false) group by 1 order by 2 desc limit 8`)
   .map(([v, c]) => ({ vendor: v, count: +c }));
 
+// Monthly activation ramp — 7 calendar months (the growth-story curve)
+const monthly = sql(`select to_char(date_trunc('month',created_at_shopify),'Mon'), count(*)
+  from shopify_products where status='ACTIVE' and created_at_shopify > now() - interval '7 months'
+  group by date_trunc('month',created_at_shopify) order by date_trunc('month',created_at_shopify)`)
+  .map(([m, c]) => ({ month: m, added: +c }));
+
+// Workflow-tag backlog — the ops queue measured from the catalog's own tags
+const needsTags = ['Needs-Price', 'Needs-Image', 'Needs-Width', 'Needs-Description'].map(t => ({
+  tag: t, count: +(sql(`select count(*) from shopify_products where status='ACTIVE' and tags ilike '%${t}%'`)[0]?.[0] || 0),
+})).filter(x => x.count > 0);
+
+// Style + color mix over ACTIVE (tag-match — same buckets the storefront sorts use)
+const STYLES = ['Traditional', 'Contemporary', 'Geometric', 'Floral', 'Damask', 'Stripe', 'Grasscloth', 'Textured', 'Metallic', 'Mural'];
+const styleMix = STYLES.map(s => ({ style: s, count: +(sql(`select count(*) from shopify_products where status='ACTIVE' and tags ilike '%${s}%'`)[0]?.[0] || 0) }))
+  .filter(x => x.count > 0).sort((a, b) => b.count - a.count);
+const COLORS = [['White', '#f2efe8'], ['Beige', '#d9c9a8'], ['Gray', '#9a9a99'], ['Blue', '#5a7fa8'], ['Green', '#6b8f6d'], ['Gold', '#c9a24b'], ['Brown', '#8a6a4c'], ['Black', '#2b2b2b'], ['Pink', '#d3a0a6'], ['Red', '#a84a44']];
+const colorMix = COLORS.map(([c, hex]) => ({ color: c, hex, count: +(sql(`select count(*) from shopify_products where status='ACTIVE' and (tags ilike '%color:${c}%' or tags ilike '%"${c}"%')`)[0]?.[0] || 0) }))
+  .filter(x => x.count > 0).sort((a, b) => b.count - a.count);
+
+// Real product gallery for the concept grids — ACTIVE, already customer-facing
+// on the live store (cdn.shopify.com), forbidden-vendor-filtered, one per vendor.
+const gallery = sql(`select distinct on (vendor) title, vendor, coalesce(nullif(trim(product_type),''),'Wallcovering'), image_url
+  from shopify_products
+  where status='ACTIVE' and image_url like 'https://cdn.shopify.com%' and title is not null
+    and vendor is not null and length(title) between 8 and 60
+  order by vendor, created_at_shopify desc limit 40`)
+  .map(([title, vendor, type, image]) => ({ title, vendor, type, image }))
+  .filter(g => !FORBIDDEN_NAMES.test(g.vendor + ' ' + g.title)).slice(0, 24);
+
 // Activation cadence — new ACTIVEs per week, last 12 weeks (the rotation-activator drip)
 const cadence = sql(`select to_char(date_trunc('week', created_at_shopify),'MM-DD'), count(*)
   from shopify_products where status='ACTIVE' and created_at_shopify > now() - interval '12 weeks'
@@ -131,10 +162,12 @@ const snapshot = {
     price_bands_basis: 'products whose minimum variant exceeds the $4.25 memo sample — the priced subset of the mirror (~3.8k); most actives resolve min-variant to the sample, and full variant-level pricing lives Shopify-side',
     drafts_total: drafts, drafts_stageable: +staged || 0,
     sample_only: sampleOnly, sample_only_vendors: sampleOnlyVendors,
+    monthly_activation: monthly, needs_tags: needsTags, style_mix: styleMix, color_mix: colorMix,
   },
   channels,
   fleet: { count: fleet.length, sites: fleet.slice(0, 60) },
   competitors,
+  gallery,
   storefront_live: !(storefront?._error) && storefront?._status !== 404,
 };
 

← d4a733e P2 fixes: honest null fleet counts, Gallery concept to light  ·  back to Consulting Designerwallcoverings Com  ·  graphic-designer advisory pass: chart typography/gridlines, 9b9d09a →