← back to Flockedwallpaper
viewer standard: add Grid/List toggle + per-field on/off menu (Fields) to product grid
08d17aa952b8e21d27a4b4fb06184879827df959 · 2026-08-12 08:33:41 -0700 · Steve
Files touched
Diff
commit 08d17aa952b8e21d27a4b4fb06184879827df959
Author: Steve <steve@designerwallcoverings.com>
Date: Wed Aug 12 08:33:41 2026 -0700
viewer standard: add Grid/List toggle + per-field on/off menu (Fields) to product grid
---
index.html | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 92 insertions(+), 1 deletion(-)
diff --git a/index.html b/index.html
index dbadb0d..f1b4070 100644
--- a/index.html
+++ b/index.html
@@ -89,6 +89,28 @@ footer .footer-desc{font-weight:300;font-size:12px;color:var(--gray);line-height
.chat-label{font-weight:500;font-size:10px;color:var(--gray)}
.share-btn{position:fixed;bottom:80px;right:20px;width:48px;height:48px;border-radius:24px;background:var(--gold);display:flex;align-items:center;justify-content:center;box-shadow:0 4px 12px rgba(0,0,0,.2);cursor:pointer;border:none;z-index:90}
.share-btn svg{width:20px;height:20px}
+/* ── Grid/List toggle + Fields menu (added) ─────────────────────────────── */
+.fw-view-seg{display:flex;border:1px solid var(--gold);overflow:hidden;flex-shrink:0}
+.fw-view-seg button{padding:6px 12px;background:transparent;border:none;border-right:1px solid var(--gold);font-family:'Inter',sans-serif;font-size:11px;letter-spacing:.08em;text-transform:uppercase;font-weight:500;cursor:pointer;color:var(--gold)}
+.fw-view-seg button:last-child{border-right:none}
+.fw-view-seg button.on{background:var(--gold);color:var(--black)}
+.fw-fieldmenu{position:relative;flex-shrink:0}
+.fw-fbtn{padding:6px 12px;border:1px solid var(--gold);background:transparent;font-family:'Inter',sans-serif;font-size:11px;letter-spacing:.08em;text-transform:uppercase;font-weight:500;color:var(--gold);cursor:pointer}
+.fw-fpop{position:absolute;top:calc(100% + 6px);right:0;background:var(--espresso);border:1px solid var(--gold);padding:6px 4px;z-index:40;min-width:170px}
+.fw-fpop[hidden]{display:none}
+.fw-fpop label{display:flex;align-items:center;gap:10px;padding:7px 14px;font-family:'Inter',sans-serif;font-size:11px;letter-spacing:.06em;text-transform:uppercase;font-weight:500;color:#ccc;cursor:pointer;white-space:nowrap}
+.fw-fpop label:hover{background:rgba(196,153,92,.1)}
+.fw-fpop input[type=checkbox]{accent-color:var(--gold)}
+/* List view */
+html.fw-list #productGrid{display:block}
+html.fw-list #productGrid .product-card{display:flex;flex-direction:row;align-items:center;gap:12px;margin-bottom:8px;padding:8px;border-bottom:1px solid rgba(255,255,255,.08)}
+html.fw-list #productGrid .product-card img{width:72px;height:72px;border-radius:4px;aspect-ratio:1/1;flex-shrink:0}
+html.fw-list #productGrid .product-card .name{font-size:13px}
+/* Per-field hide rules */
+html.hf-fw-image .product-card img { display:none !important }
+html.hf-fw-title [data-f="fw-title"] { display:none !important }
+html.hf-fw-color [data-f="fw-color"] { display:none !important }
+html.hf-fw-cta [data-f="fw-cta"] { display:none !important }
</style>
<style id="rebrand-tokens-flockedwallpaper">
:root { --primary: #D70000; --paper: #FFF; --ink: #000; --accent: #D70000; --line: #000; --muted: #D70000; }
@@ -290,6 +312,14 @@ footer .footer-desc{font-weight:300;font-size:12px;color:var(--gray);line-height
</select>
<label style="font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:var(--muted,#A98B5B);margin-left:14px">Density</label>
<input id="density" type="range" min="180" max="380" step="10" value="240" style="accent-color:var(--accent,#A98B5B);width:140px;cursor:pointer">
+ <div class="fw-view-seg" role="tablist" aria-label="View">
+ <button id="fwVGrid" class="on">Grid</button>
+ <button id="fwVList">List</button>
+ </div>
+ <div class="fw-fieldmenu">
+ <button class="fw-fbtn" id="fwFieldsBtn" aria-haspopup="true" aria-expanded="false">Fields ▾</button>
+ <div class="fw-fpop" id="fwFpop" hidden role="menu"></div>
+ </div>
</div>
<script>
// Controls wiring — deferred to DOMContentLoaded so #productGrid (declared after
@@ -475,7 +505,7 @@ function displayBatch(){
const card=document.createElement('div');
card.className='product-card';
card.onclick=()=>window.open(p.productUrl,'_blank');
- card.innerHTML=`<img src="${p.image}" alt="${p.title}" loading="lazy"><div class="name">${shortTitle(p.title)}</div><div class="color">${p.primaryColor||'Flocked Velvet'}</div><div class="shop-link">Shop on DW →</div>`;
+ card.innerHTML=`<img src="${p.image}" alt="${p.title}" loading="lazy"><div class="name" data-f="fw-title">${shortTitle(p.title)}</div><div class="color" data-f="fw-color">${p.primaryColor||'Flocked Velvet'}</div><div class="shop-link" data-f="fw-cta">Shop on DW →</div>`;
grid.appendChild(card);
}
displayed=end;
@@ -493,6 +523,67 @@ function shareProduct(){
}
init();
+
+// ── Grid/List toggle ─────────────────────────────────────────────────────────
+(function(){
+ const FW_FIELDS = [
+ ['fw-image','Image',true],['fw-title','Title',true],
+ ['fw-color','Color',true],['fw-cta','Shop Link',true],
+ ];
+ const STORE = 'flockedwallpaper_grid';
+ function fwGetSaved(){ try{ return JSON.parse(localStorage.getItem(STORE)||'{}'); }catch{ return {}; } }
+ function fwSave(obj){ localStorage.setItem(STORE, JSON.stringify(obj)); }
+
+ // view
+ var saved = fwGetSaved();
+ var fwView = saved.view || 'grid';
+ function fwSetView(v){
+ fwView = v;
+ document.documentElement.classList.toggle('fw-list', v==='list');
+ var vg=document.getElementById('fwVGrid'), vl=document.getElementById('fwVList');
+ if(vg){ vg.classList.toggle('on', v==='grid'); }
+ if(vl){ vl.classList.toggle('on', v==='list'); }
+ var s=fwGetSaved(); s.view=v; fwSave(s);
+ }
+ fwSetView(fwView);
+ var vgBtn=document.getElementById('fwVGrid'), vlBtn=document.getElementById('fwVList');
+ if(vgBtn) vgBtn.addEventListener('click',function(){ fwSetView('grid'); });
+ if(vlBtn) vlBtn.addEventListener('click',function(){ fwSetView('list'); });
+
+ // fields
+ var fwFields = (function(){
+ var def={}; FW_FIELDS.forEach(function(f){ def[f[0]]=f[2]; });
+ try{ return Object.assign(def, JSON.parse(localStorage.getItem('flockedwallpaper_fields')||'{}')); }catch{ return def; }
+ })();
+ function fwApplyFields(){
+ FW_FIELDS.forEach(function(f){ document.documentElement.classList.toggle('hf-'+f[0], !fwFields[f[0]]); });
+ }
+ function fwBuildFieldMenu(){
+ var fpop=document.getElementById('fwFpop'); if(!fpop) return;
+ fpop.innerHTML=FW_FIELDS.map(function(f){
+ return '<label><input type="checkbox" data-field="'+f[0]+'"'+(fwFields[f[0]]?' checked':'')+'>'+f[1]+'</label>';
+ }).join('');
+ fpop.querySelectorAll('input').forEach(function(cb){
+ cb.addEventListener('change',function(){
+ fwFields[cb.dataset.field]=cb.checked;
+ localStorage.setItem('flockedwallpaper_fields', JSON.stringify(fwFields));
+ fwApplyFields();
+ });
+ });
+ }
+ var fwFBtn=document.getElementById('fwFieldsBtn'), fwFpop=document.getElementById('fwFpop');
+ if(fwFBtn && fwFpop){
+ fwFBtn.addEventListener('click',function(e){
+ e.stopPropagation(); var open=fwFpop.hidden; fwFpop.hidden=!open;
+ fwFBtn.setAttribute('aria-expanded', String(open));
+ });
+ document.addEventListener('click',function(e){
+ if(!fwFpop.hidden && !e.target.closest('.fw-fieldmenu')){ fwFpop.hidden=true; fwFBtn.setAttribute('aria-expanded','false'); }
+ });
+ }
+ fwBuildFieldMenu();
+ fwApplyFields();
+})();
</script>
<!-- Zendesk Widget -->
← 2e9a728 SEO: rel=nofollow sponsored on designerwallcoverings.com lin
·
back to Flockedwallpaper
·
TK-11341: add AdSense Auto-Ads loader + ads.txt (revert to r c0e5de1 →