[object Object]

← back to Designer Wallcoverings

color-palette: demote single-hex below canvas; renderMeta fallback so un-enriched products show multi-color+% not a lone 'Color' card

279d399576cbdb7aff0b7bd68d4c75d6102a5e4c · 2026-07-07 09:24:12 -0700 · Steve

Files touched

Diff

commit 279d399576cbdb7aff0b7bd68d4c75d6102a5e4c
Author: Steve <steve@designerwallcoverings.com>
Date:   Tue Jul 7 09:24:12 2026 -0700

    color-palette: demote single-hex below canvas; renderMeta fallback so un-enriched products show multi-color+% not a lone 'Color' card
---
 .../theme-LIVE-591/snippets/color-palette.liquid   | 37 +++++++++++-----------
 1 file changed, 18 insertions(+), 19 deletions(-)

diff --git a/shopify/theme-LIVE-591/snippets/color-palette.liquid b/shopify/theme-LIVE-591/snippets/color-palette.liquid
index 6ff27f3d..0ad6d174 100644
--- a/shopify/theme-LIVE-591/snippets/color-palette.liquid
+++ b/shopify/theme-LIVE-591/snippets/color-palette.liquid
@@ -132,26 +132,25 @@
       return true;
     }
 
-    /* ── Tier 1: color_details / color_dots_json metafield ── */
-    var raw = root.dataset.colors;
-    if(raw){
-      try { if(render(JSON.parse(raw.replace(/=>/g,':')))) return; } catch(e){}
-    }
-
-    /* ── Tier 2: primary_color_hex + ai_generated_colors ── */
-    var ph = root.dataset.primaryHex, aiRaw = root.dataset.aiColors;
-    if(ph || aiRaw){
-      var list2=[];
+    /* Metafield fallbacks — used ONLY if canvas extraction yields nothing.
+       (A single color_hex alone is a worse answer than a multi-color canvas read
+       for the "all colors with %" goal, so these are demoted below canvas.) */
+    function renderMeta(){
+      var ph=root.dataset.primaryHex, aiRaw=root.dataset.aiColors, sh=root.dataset.colorHex, list2=[];
       if(ph) list2.push({hex:ph, name:root.dataset.colorName||'Primary'});
       try { JSON.parse((aiRaw||'[]').replace(/=>/g,':')).forEach(function(nm){ var h=N[(''+nm).toLowerCase()]; if(h) list2.push({hex:h,name:nm}); }); } catch(e){}
-      if(render(list2)) return;
+      if(list2.length && render(list2)) return true;
+      if(sh) return render([{hex:sh, name:root.dataset.colorName||'Color'}]);
+      return false;
     }
 
-    /* ── Tier 2.5: single color_hex ── */
-    var sh = root.dataset.colorHex;
-    if(sh){ if(render([{hex:sh, name:root.dataset.colorName||'Color'}])) return; }
+    /* ── Tier 1: color_details / color_dots_json metafield (BEST — local-vision enriched) ── */
+    var raw = root.dataset.colors;
+    if(raw){
+      try { if(render(JSON.parse(raw.replace(/=>/g,':')))) return; } catch(e){}
+    }
 
-    /* ── Tier 3: Canvas extraction from the product image (always yields %) ── */
+    /* ── Tier 2: Canvas extraction from the product image (multi-color + %), meta as fallback ── */
     var REF={'red':[190,55,55],'crimson':[176,40,60],'navy':[30,45,80],'blue':[70,110,175],'slate blue':[95,120,150],'powder blue':[170,196,214],'green':[70,130,80],'sage':[150,168,138],'celadon':[176,192,168],'eucalyptus':[130,146,128],'moss':[120,138,90],'olive':[124,124,70],'gold':[200,168,90],'ochre':[190,150,80],'yellow':[224,186,90],'orange':[220,120,70],'terracotta':[196,110,85],'coral':[224,140,120],'pink':[220,150,165],'blush':[224,190,190],'purple':[140,100,160],'lavender':[190,180,205],'black':[40,40,40],'charcoal':[70,74,78],'white':[248,246,240],'ivory':[240,236,224],'cream':[236,228,206],'eggshell':[224,216,196],'gray':[140,140,142],'greige':[176,168,154],'silver':[196,196,198],'brown':[130,95,70],'walnut':[110,80,55],'taupe':[150,138,120],'beige':[214,202,178],'tan':[196,176,140],'sand':[200,184,150],'stone':[186,180,166],'teal':[70,140,140],'turquoise':[110,180,175]};
     function closestName(r,g,b){var best='',bd=1e9;for(var n in REF){var c=REF[n],d=Math.pow(r-c[0],2)+Math.pow(g-c[1],2)+Math.pow(b-c[2],2);if(d<bd){bd=d;best=n;}}return best;}
     function hx(r,g,b){return '#'+[r,g,b].map(function(x){return x.toString(16).padStart(2,'0');}).join('');}
@@ -166,10 +165,10 @@
           var sorted=Object.keys(bk).map(function(k){return bk[k];}).sort(function(a,b){return b.n-a.n;});
           var tot=sz*sz,out=[],seen={};
           for(var j=0;j<sorted.length && out.length<8;j++){var s=sorted[j],ar=Math.round(s.r/s.n),ag=Math.round(s.g/s.n),ab=Math.round(s.b/s.n),nm=closestName(ar,ag,ab),pct=Math.round(s.n/tot*100);if(seen[nm]||pct<2)continue;seen[nm]=1;out.push({name:nm,hex:hx(ar,ag,ab),pct:pct});}
-          render(out.slice(0,6));
-        }catch(e){}
+          if(!render(out.slice(0,6))) renderMeta();
+        }catch(e){ renderMeta(); }
       };
-      img.onerror=function(){};
+      img.onerror=function(){ renderMeta(); };
       img.src=url;
     }
     function imgUrl(){
@@ -184,7 +183,7 @@
     else {
       var obs=new MutationObserver(function(m,o){var v=imgUrl();if(v){o.disconnect();fromCanvas(v);}});
       obs.observe(document.body,{childList:true,subtree:true});
-      setTimeout(function(){obs.disconnect();},5000);
+      setTimeout(function(){ obs.disconnect(); if(!cards.children.length) renderMeta(); },5000);
     }
   }
   if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',init);}else{init();}

← fb621f98 gitignore daisy-bennett-viewer img/ + rooms-local/ (keep swa  ·  back to Designer Wallcoverings  ·  auto-save: 2026-07-07T09:29:44 (4 files) — pending-approval/ f168a645 →