[object Object]

← back to Designer Wallcoverings

auto-save: 2026-07-08T13:05:49 (10 files) — pending-approval/boost-filter-consolidation-2026-06-25 shopify/scripts/cadence/data/cadence-cursor.json shopify/scripts/cadence/data/cadence-plan-pm-2026-07-08.json shopify/scripts/cadence/data/upload-restore-2026-07-08.jsonl shopify/scripts/catalog-push-to-kamatera.sh

36a54f9838ddf16ca46b11ea19f89c00f8e5e2fe · 2026-07-08 13:05:53 -0700 · Steve Abrams

Files touched

Diff

commit 36a54f9838ddf16ca46b11ea19f89c00f8e5e2fe
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Jul 8 13:05:53 2026 -0700

    auto-save: 2026-07-08T13:05:49 (10 files) — pending-approval/boost-filter-consolidation-2026-06-25 shopify/scripts/cadence/data/cadence-cursor.json shopify/scripts/cadence/data/cadence-plan-pm-2026-07-08.json shopify/scripts/cadence/data/upload-restore-2026-07-08.jsonl shopify/scripts/catalog-push-to-kamatera.sh
---
 shopify/scripts/cadence/data/cadence-cursor.json   |   4 +-
 .../cadence/data/cadence-plan-pm-2026-07-08.json   | 146 ++++++++-------------
 .../cadence/data/upload-restore-2026-07-08.jsonl   |  11 ++
 shopify/scripts/catalog-push-to-kamatera.sh        |   7 +-
 shopify/theme-LIVE-591-pull-20260708/.gitignore    |   4 +
 .../config/settings_schema.json                    |   1 +
 .../snippets/color-palette.liquid                  |  95 +++++++++++++-
 shopify/theme-LIVE-591/layout/theme.liquid         |   7 +-
 8 files changed, 174 insertions(+), 101 deletions(-)

diff --git a/shopify/scripts/cadence/data/cadence-cursor.json b/shopify/scripts/cadence/data/cadence-cursor.json
index 76887608..1c15d267 100644
--- a/shopify/scripts/cadence/data/cadence-cursor.json
+++ b/shopify/scripts/cadence/data/cadence-cursor.json
@@ -1,5 +1,5 @@
 {
- "idx": 8,
- "lastSlot": "am",
+ "idx": 4,
+ "lastSlot": "pm",
  "lastRun": "2026-07-08"
 }
\ No newline at end of file
diff --git a/shopify/scripts/cadence/data/cadence-plan-pm-2026-07-08.json b/shopify/scripts/cadence/data/cadence-plan-pm-2026-07-08.json
index fe90d99b..f5ebf590 100644
--- a/shopify/scripts/cadence/data/cadence-plan-pm-2026-07-08.json
+++ b/shopify/scripts/cadence/data/cadence-plan-pm-2026-07-08.json
@@ -1,4 +1,34 @@
 [
+ {
+  "vendor": "Alan Campbell",
+  "dw_sku": "DWAK-700409",
+  "cost": 0,
+  "retail": 0,
+  "sample": "4.25",
+  "sampleOnly": true,
+  "title": "Pale Turquoise on White Wallcoverings | Alan Campbell",
+  "willActivate": true
+ },
+ {
+  "vendor": "Alan Campbell",
+  "dw_sku": "DWAK-700410",
+  "cost": 0,
+  "retail": 0,
+  "sample": "4.25",
+  "sampleOnly": true,
+  "title": "Pale Fern on White Wallcoverings | Alan Campbell",
+  "willActivate": true
+ },
+ {
+  "vendor": "Alan Campbell",
+  "dw_sku": "DWAK-700411",
+  "cost": 0,
+  "retail": 0,
+  "sample": "4.25",
+  "sampleOnly": true,
+  "title": "Bali Blue on White Wallcoverings | Alan Campbell",
+  "willActivate": true
+ },
  {
   "vendor": "Romo",
   "dw_sku": "DWRM-240167",
@@ -31,32 +61,32 @@
  },
  {
   "vendor": "Thibaut",
-  "dw_sku": "DWTT-73846",
+  "dw_sku": "DWTT-73870",
   "cost": 69.3,
   "retail": 125.43,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "Luta Sisal, Blush Wallcoverings | Thibaut",
+  "title": "Normandy, Navy Wallcoverings | Thibaut",
   "willActivate": true
  },
  {
   "vendor": "Thibaut",
-  "dw_sku": "DWTT-73847",
+  "dw_sku": "DWTT-73871",
   "cost": 69.3,
   "retail": 125.43,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "Luta Sisal, Mist Wallcoverings | Thibaut",
+  "title": "Spiro, Grey Wallcoverings | Thibaut",
   "willActivate": true
  },
  {
   "vendor": "Thibaut",
-  "dw_sku": "DWTT-73848",
+  "dw_sku": "DWTT-73872",
   "cost": 69.3,
   "retail": 125.43,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "Luta Sisal, Slate Wallcoverings | Thibaut",
+  "title": "Spiro, Off White Wallcoverings | Thibaut",
   "willActivate": true
  },
  {
@@ -73,112 +103,52 @@
  },
  {
   "vendor": "Designtex",
-  "dw_sku": "DWDX-220642",
-  "cost": 42,
-  "retail": 76.02,
+  "dw_sku": "DWDX-220658",
+  "cost": 31,
+  "retail": 56.11,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "Addison, Boulder Wallcoverings | Designtex",
+  "title": "Abbott, Rose Wallcoverings | Designtex",
   "willActivate": false
  },
  {
   "vendor": "Designtex",
-  "dw_sku": "DWDX-220643",
-  "cost": 42,
-  "retail": 76.02,
-  "sample": "4.25",
-  "sampleOnly": false,
-  "title": "Addison, Copper Wallcoverings | Designtex",
-  "willActivate": false
- },
- {
-  "vendor": "Newwall",
-  "dw_sku": "DWXW-1005998",
-  "cost": 88,
-  "retail": 159.28,
-  "sample": "4.25",
-  "sampleOnly": false,
-  "title": "Waves 6800706, Made to Measure Mural Type II Wallcoverings | Newwall",
-  "willActivate": false
- },
- {
-  "vendor": "Newwall",
-  "dw_sku": "DWXW-1005999",
-  "cost": 88,
-  "retail": 159.28,
+  "dw_sku": "DWDX-220659",
+  "cost": 31,
+  "retail": 56.11,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "Waves 6800707, Made to Measure Mural Type II Wallcoverings | Newwall",
+  "title": "Abbott, Prune Wallcoverings | Designtex",
   "willActivate": false
  },
  {
   "vendor": "Newwall",
-  "dw_sku": "DWXW-1006000",
-  "cost": 88,
-  "retail": 159.28,
-  "sample": "4.25",
-  "sampleOnly": false,
-  "title": "Window Flora 6800404, Made to Measure Mural Vinyl Wallcoverings | Newwall",
-  "willActivate": false
- },
- {
-  "vendor": "Brewster & York",
-  "dw_sku": "DWBR-171061",
-  "cost": 90,
-  "retail": 162.9,
+  "dw_sku": "DWXW-1006042",
+  "cost": 216,
+  "retail": 390.95,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "Dwell, Black Wallcoverings | Malibu Wallcovering",
+  "title": "Artemis Black, Sample Wallcoverings | Newwall",
   "willActivate": true
  },
  {
-  "vendor": "Brewster & York",
-  "dw_sku": "DWBR-171062",
-  "cost": 90,
-  "retail": 162.9,
-  "sample": "4.25",
-  "sampleOnly": false,
-  "title": "Dwell, Pink Wallcoverings | Malibu Wallcovering",
-  "willActivate": true
- },
- {
-  "vendor": "Brewster & York",
-  "dw_sku": "DWBR-171063",
-  "cost": 90,
-  "retail": 162.9,
-  "sample": "4.25",
-  "sampleOnly": false,
-  "title": "Dwell, Grey Wallcoverings | Malibu Wallcovering",
-  "willActivate": true
- },
- {
-  "vendor": "Kravet",
-  "dw_sku": "DWKK-103102",
-  "cost": 95,
-  "retail": 142.5,
-  "sample": "4.25",
-  "sampleOnly": false,
-  "title": "Kravet Design, Beige Wallcoverings | Kravet",
-  "willActivate": true
- },
- {
-  "vendor": "Kravet",
-  "dw_sku": "DWKK-103103",
-  "cost": 94.5,
-  "retail": 141.75,
+  "vendor": "Newwall",
+  "dw_sku": "DWXW-1006043",
+  "cost": 216,
+  "retail": 390.95,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "Kravet Design, Off-White Wallcoverings | Kravet",
+  "title": "Florika Petrol, Sample Wallcoverings | Newwall",
   "willActivate": true
  },
  {
-  "vendor": "Kravet",
-  "dw_sku": "DWKK-103104",
-  "cost": 94.5,
-  "retail": 141.75,
+  "vendor": "Newwall",
+  "dw_sku": "DWXW-1006044",
+  "cost": 216,
+  "retail": 390.95,
   "sample": "4.25",
   "sampleOnly": false,
-  "title": "Kravet Design, Light Gray Wallcoverings | Kravet",
+  "title": "Pluma Eau de Nil, Sample Wallcoverings | Newwall",
   "willActivate": true
  }
 ]
\ No newline at end of file
diff --git a/shopify/scripts/cadence/data/upload-restore-2026-07-08.jsonl b/shopify/scripts/cadence/data/upload-restore-2026-07-08.jsonl
index 6f15b511..c41efc72 100644
--- a/shopify/scripts/cadence/data/upload-restore-2026-07-08.jsonl
+++ b/shopify/scripts/cadence/data/upload-restore-2026-07-08.jsonl
@@ -258,3 +258,14 @@
 {"table":"quadrille_house_catalog","mfr_sku":"306102FW","dw_sku":"DWQC-600405","shopify_product_id":"7879392526387","action":"created","activated":true,"published":true,"sampleOnly":true,"status":"ACTIVE","batch_id":"upload-am-2026-07-08T18-40-05-726Z","ts":"2026-07-08T18:41:01.582Z"}
 {"table":"quadrille_house_catalog","mfr_sku":"306100F","dw_sku":"DWQC-600406","shopify_product_id":"7879392559155","action":"created","activated":true,"published":true,"sampleOnly":true,"status":"ACTIVE","batch_id":"upload-am-2026-07-08T18-40-05-726Z","ts":"2026-07-08T18:41:05.126Z"}
 {"table":"quadrille_house_catalog","mfr_sku":"306107F","dw_sku":"DWQC-600407","shopify_product_id":"7879392591923","action":"created","activated":true,"published":true,"sampleOnly":true,"status":"ACTIVE","batch_id":"upload-am-2026-07-08T18-40-05-726Z","ts":"2026-07-08T18:41:08.595Z"}
+{"table":"quadrille_house_catalog","mfr_sku":"AC715-04","dw_sku":"DWAK-700409","shopify_product_id":"7879407894579","action":"created","activated":true,"published":true,"sampleOnly":true,"status":"ACTIVE","batch_id":"upload-pm-2026-07-08T19-40-05-734Z","ts":"2026-07-08T19:40:11.809Z"}
+{"table":"quadrille_house_catalog","mfr_sku":"AC715-01","dw_sku":"DWAK-700410","shopify_product_id":"7879407927347","action":"created","activated":true,"published":true,"sampleOnly":true,"status":"ACTIVE","batch_id":"upload-pm-2026-07-08T19-40-05-734Z","ts":"2026-07-08T19:40:15.315Z"}
+{"table":"quadrille_house_catalog","mfr_sku":"AC715-02","dw_sku":"DWAK-700411","shopify_product_id":"7879407960115","action":"created","activated":true,"published":true,"sampleOnly":true,"status":"ACTIVE","batch_id":"upload-pm-2026-07-08T19-40-05-734Z","ts":"2026-07-08T19:40:19.058Z"}
+{"table":"thibaut_catalog","mfr_sku":"T14559","dw_sku":"DWTT-73870","shopify_product_id":"7879407992883","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-pm-2026-07-08T19-40-05-734Z","ts":"2026-07-08T19:40:27.493Z"}
+{"table":"thibaut_catalog","mfr_sku":"T14562","dw_sku":"DWTT-73871","shopify_product_id":"7879408025651","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-pm-2026-07-08T19-40-05-734Z","ts":"2026-07-08T19:40:31.352Z"}
+{"table":"thibaut_catalog","mfr_sku":"T14561","dw_sku":"DWTT-73872","shopify_product_id":"7879408058419","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-pm-2026-07-08T19-40-05-734Z","ts":"2026-07-08T19:40:35.121Z"}
+{"table":"designtex_catalog","mfr_sku":"6732601","dw_sku":"DWDX-220658","shopify_product_id":"7879408091187","action":"created","activated":false,"published":false,"sampleOnly":false,"status":"DRAFT","batch_id":"upload-pm-2026-07-08T19-40-05-734Z","ts":"2026-07-08T19:40:37.320Z"}
+{"table":"designtex_catalog","mfr_sku":"6732602","dw_sku":"DWDX-220659","shopify_product_id":"7879408123955","action":"created","activated":false,"published":false,"sampleOnly":false,"status":"DRAFT","batch_id":"upload-pm-2026-07-08T19-40-05-734Z","ts":"2026-07-08T19:40:39.465Z"}
+{"table":"newwall_catalog","mfr_sku":"1-WA-ART-DI-BLK-XXX-004","dw_sku":"DWXW-1006042","shopify_product_id":"7879408156723","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-pm-2026-07-08T19-40-05-734Z","ts":"2026-07-08T19:40:43.292Z"}
+{"table":"newwall_catalog","mfr_sku":"1-WA-FLO-DI-PET-XXX-004","dw_sku":"DWXW-1006043","shopify_product_id":"7879408189491","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-pm-2026-07-08T19-40-05-734Z","ts":"2026-07-08T19:40:46.970Z"}
+{"table":"newwall_catalog","mfr_sku":"1-WA-PLU-DI-EAU-XXX-004","dw_sku":"DWXW-1006044","shopify_product_id":"7879408222259","action":"created","activated":true,"published":true,"sampleOnly":false,"status":"ACTIVE","batch_id":"upload-pm-2026-07-08T19-40-05-734Z","ts":"2026-07-08T19:40:50.747Z"}
diff --git a/shopify/scripts/catalog-push-to-kamatera.sh b/shopify/scripts/catalog-push-to-kamatera.sh
index 70a884b4..bcab361e 100755
--- a/shopify/scripts/catalog-push-to-kamatera.sh
+++ b/shopify/scripts/catalog-push-to-kamatera.sh
@@ -20,8 +20,11 @@ LOG="$HOME/.claude/logs/catalog-push.log"; mkdir -p "$(dirname "$LOG")"
 exec >> "$LOG" 2>&1
 echo "==== $(date '+%Y-%m-%d %H:%M:%S') catalog-push START ===="
 
-cd "$HOME/Projects/Designer-Wallcoverings/DW-Programming/ImportNewSkufromURL" || { echo "no cwd"; exit 1; }
-MAC3=$(grep -m1 '^DATABASE_URL=' .env | cut -d= -f2- | tr -d '"')
+# SOURCE = local peer auth as macstudio3, a mac3 SUPERUSER. pg_dump locks ACCESS SHARE
+# on every -t table up front and aborts the WHOLE dump if denied on even one; dw_admin
+# lacks read on foreign-owned tables (e.g. sangetsu_catalog), so we dump as the superuser
+# (bypasses per-table grants). TARGET stays dw_admin (only needs write on its own tables).
+MAC3="postgresql:///dw_unified"
 KAM='postgresql://dw_admin@127.0.0.1:5432/dw_unified'
 
 # reachability guards — never half-run
diff --git a/shopify/theme-LIVE-591-pull-20260708/.gitignore b/shopify/theme-LIVE-591-pull-20260708/.gitignore
new file mode 100644
index 00000000..1bcdbdcb
--- /dev/null
+++ b/shopify/theme-LIVE-591-pull-20260708/.gitignore
@@ -0,0 +1,4 @@
+node_modules/
+.env*
+*.log
+.DS_Store
diff --git a/shopify/theme-LIVE-591-pull-20260708/config/settings_schema.json b/shopify/theme-LIVE-591-pull-20260708/config/settings_schema.json
new file mode 100644
index 00000000..fe51488c
--- /dev/null
+++ b/shopify/theme-LIVE-591-pull-20260708/config/settings_schema.json
@@ -0,0 +1 @@
+[]
diff --git a/shopify/theme-LIVE-591-pull-20260708/snippets/color-palette.liquid b/shopify/theme-LIVE-591-pull-20260708/snippets/color-palette.liquid
index 37f81db8..d19d70fc 100644
--- a/shopify/theme-LIVE-591-pull-20260708/snippets/color-palette.liquid
+++ b/shopify/theme-LIVE-591-pull-20260708/snippets/color-palette.liquid
@@ -27,6 +27,13 @@
 {% assign primary_hex = product.metafields.custom.primary_color_hex.value %}
 {% assign ai_colors_raw = product.metafields.dwc.ai_generated_colors.value | json %}
 {% assign color_name = product.metafields.custom.color_name.value %}
+{%- comment -%}
+  STYLE source (real fields, in priority order — verified live on the PDP 2026-07-08):
+    global.Style  →  custom.style  →  custom.style1
+  Used to scope the color-dot click to same-color-family AND same-style, so the
+  dot no longer text-searches the (LLM-generated, unreliable) color NAME.
+{%- endcomment -%}
+{%- assign product_style = product.metafields.global.Style.value | default: product.metafields.custom.style.value | default: product.metafields.custom.style1.value -%}
 
 <div class="dw-color-palette" data-dw-color-palette
   {% if color_details_raw != blank and color_details_raw != 'null' %}data-colors='{{ color_details_raw | escape }}'{% endif %}
@@ -34,6 +41,7 @@
   {% if ai_colors_raw != blank and ai_colors_raw != 'null' %}data-ai-colors='{{ ai_colors_raw }}'{% endif %}
   {% if color_name != blank %}data-color-name="{{ color_name }}"{% endif %}
   {% if color_hex != blank %}data-color-hex="{{ color_hex }}"{% endif %}
+  {% if product_style != blank %}data-product-style="{{ product_style | escape }}"{% endif %}
   {% if product.featured_image %}data-product-image="{{ product.featured_image | img_url: '400x400' }}"{% endif %}
 >
   <p class="dw-color-palette__title">Colors In This Pattern</p>
@@ -95,22 +103,95 @@
     function esc(s){return (s||'').toString().replace(/[<>&"]/g,function(c){return {'<':'&lt;','>':'&gt;','&':'&amp;','"':'&quot;'}[c];});}
     function pctOf(c){ var p = (c.pct!=null?c.pct:(c.percentage!=null?c.percentage:null)); if(p==null) return null; p=parseFloat(p); return isNaN(p)?null:Math.round(p); }
 
+    /* ── HEX → color-family COLLECTION (Steve 2026-07-08) ─────────────────────
+       The dot no longer text-searches the color NAME (LLM-generated, unreliable).
+       Instead we derive the color family from the REAL measured hex (PIL median-cut)
+       and link to that family's collection. Handles below are the live-proven set
+       already used by color-dots.liquid — do NOT invent new ones. */
+    var FAM_COLL = {
+      red:'red-wallpaper-collection', orange:'orange', yellow:'yellow-wallpaper-collection',
+      gold:'gold-wallpaper', green:'green-wallpaper-collection', teal:'turquoise',
+      blue:'blue-wallpaper-collection', purple:'purple', pink:'pink-wallcovering-2',
+      brown:'brown-wallpaper-collection', beige:'beige-cream-wallpaper-collection',
+      black:'black', white:'white-wallpaper-collection', gray:'grey-wallcovering'
+    };
+    function hexToRgb(h){
+      h=(h||'').replace('#','');
+      if(h.length===3) h=h.split('').map(function(x){return x+x;}).join('');
+      if(h.length<6) return null;
+      var r=parseInt(h.slice(0,2),16),g=parseInt(h.slice(2,4),16),b=parseInt(h.slice(4,6),16);
+      return (isNaN(r)||isNaN(g)||isNaN(b))?null:[r,g,b];
+    }
+    /* Bucket a hex into one of the FAM_COLL families using HSL derived from the hex. */
+    function familyFromHex(hex){
+      var rgb=hexToRgb(hex); if(!rgb) return null;
+      var r=rgb[0]/255,g=rgb[1]/255,b=rgb[2]/255;
+      var mx=Math.max(r,g,b),mn=Math.min(r,g,b),d=mx-mn;
+      var l=(mx+mn)/2, s=d===0?0:d/(1-Math.abs(2*l-1));
+      var hdeg=0;
+      if(d!==0){
+        if(mx===r) hdeg=60*(((g-b)/d)%6);
+        else if(mx===g) hdeg=60*(((b-r)/d)+2);
+        else hdeg=60*(((r-g)/d)+4);
+      }
+      if(hdeg<0) hdeg+=360;
+      /* neutrals first (low saturation) */
+      if(s<0.18){
+        if(l>0.86) return 'white';
+        if(l<0.18) return 'black';
+        /* warm-neutral (beige/tan) vs cool-neutral (gray) by hue lean */
+        if((hdeg>=20 && hdeg<=70) && l>0.30) return 'beige';
+        return 'gray';
+      }
+      /* pale warm chromatics (cream/oatmeal/tan) → beige */
+      if(l>0.80 && (hdeg>=20 && hdeg<70)) return 'beige';
+      /* dark warm chromatics that are ALSO not very saturated = browns
+         (espresso/mahogany/walnut). Saturated darks (jewel tones) fall through. */
+      if(l<0.40 && s<0.75 && ((hdeg>=10 && hdeg<70) || hdeg>=345)) return 'brown';
+      /* very dark COOL chromatic reads as black-family */
+      if(l<0.16) return 'black';
+      /* hue wheel → family */
+      if(hdeg<15||hdeg>=345) return 'red';
+      if(hdeg<40){ return (s<0.45 && l>0.55) ? 'beige' : 'orange'; }
+      if(hdeg<55){ return (s<0.45) ? 'beige' : (hdeg<50 ? 'gold' : 'yellow'); }
+      if(hdeg<65) return (l<0.45) ? 'gold' : 'yellow';
+      if(hdeg<170) return 'green';
+      if(hdeg<200) return 'teal';
+      if(hdeg<255) return 'blue';
+      if(hdeg<290) return 'purple';
+      return 'pink';
+    }
+    var PRODUCT_STYLE = root.dataset.productStyle || '';
+    /* Build the collection URL for a hex, scoped to the product's style when known.
+       style is applied as a storefront metafield filter (custom.style); if that filter
+       is not enabled on the collection Shopify silently ignores the param, so the user
+       still lands on the correct HEX-derived color family — never a name text-search. */
+    function familyHref(hex){
+      var fam=familyFromHex(hex); if(!fam) return null;
+      var handle=FAM_COLL[fam]; if(!handle) return null;
+      var url='/collections/'+handle+'?sort_by=created-descending';
+      if(PRODUCT_STYLE){ url+='&filter.p.m.custom.style='+encodeURIComponent(PRODUCT_STYLE); }
+      return url;
+    }
+
     /* Build a card. Receives the WHOLE color object (fixes the color-dots `c` bug). */
     function makeCard(c){
       var hex = c.hex || N[(c.name||'').toLowerCase()] || '#ccc';
       var name = c.name || '';
       var pct = pctOf(c);
-      /* Link each color to ALL published ("pushed") SKUs of that color via the storefront
-         search — Shopify search only indexes published products, so "if pushed" is inherent.
-         No name -> not linkable, render a plain swatch. (Steve 2026-07-08) */
+      /* Link each dot by its REAL hex → color-family collection, scoped to the
+         product's STYLE. NO color-name text search anymore. (Steve 2026-07-08)
+         Tooltip surfaces the hex# (+ style) for transparency, not the name. */
+      var href = familyHref(hex);
       var card;
-      if(name){
+      if(href){
         card = document.createElement('a');
-        card.href = '/search?q=' + encodeURIComponent(name) + '&type=product';
-        card.title = 'View all ' + name + ' wallcoverings' + (pct!=null? ' — '+pct+'% here':'') + ' ('+hex+')';
+        card.href = href;
+        card.title = 'Shop ' + (PRODUCT_STYLE? PRODUCT_STYLE+' ' : '') + 'wallcoverings in this color family'
+                   + (name? ' — '+name : '') + ' (' + hex + (pct!=null? ', '+pct+'% here':'') + ')';
       } else {
         card = document.createElement('div');
-        card.title = (pct!=null? pct+'% ':'') + '('+hex+')';
+        card.title = (name? name+' ' : '') + '(' + hex + (pct!=null? ', '+pct+'%':'') + ')';
       }
       card.className = 'dw-color-palette__card';
       var sw = document.createElement('div');
diff --git a/shopify/theme-LIVE-591/layout/theme.liquid b/shopify/theme-LIVE-591/layout/theme.liquid
index adaa7e7e..18e37bda 100644
--- a/shopify/theme-LIVE-591/layout/theme.liquid
+++ b/shopify/theme-LIVE-591/layout/theme.liquid
@@ -577,6 +577,7 @@
   /* single-roll pricing note + dimensions (bolt / min-2 products only) */
   .dw-sr-note{font-size:12px!important;color:rgb(136,136,136)!important;letter-spacing:.02em;margin-left:6px}
   .dw-sr-dims{font-size:12px!important;color:rgb(90,90,90)!important;margin-left:18px;white-space:nowrap}
+  .dw-2roll-note{font-size:13px!important;font-weight:600;color:rgb(60,66,70)!important;margin-top:6px;letter-spacing:.01em}
 </style>
 <script>
 (function () {
@@ -619,8 +620,7 @@
     var srLen = specVal(/^Length S\/R$/i);
     if (!srLen) {
       var dr = specVal(/^Length(?:\s*D\/R)?$/i);
-      var m = dr && dr.match(/([\d.]+)/); var unit = dr ? (dr.replace(/[\d.\s]+/g, ' ').trim() || 'Yards') : 'Yards';
-      if (m) srLen = (parseFloat(m[1]) / 2) + ' ' + unit;
+      if (dr) { var srHalf = dr.replace(/[\d.]+/g, function (x) { return (Math.round((parseFloat(x) / 2) * 1000) / 1000) + ''; }); srLen = /\d/.test(srHalf) ? srHalf : null; }
     }
     var wVal = specVal(/^Width$/i);
     var srDims = (wVal && srLen) ? (wVal.split(/\s*x\s*/i)[0].trim() + ' x ' + srLen) : null;
@@ -648,6 +648,8 @@
     if (money && !document.querySelector('.dw-sr-note')) { var note = document.createElement('span'); note.className = 'dw-sr-note'; note.textContent = '/ single roll'; money.after(note); }
     var price = document.querySelector('.product__price');
     if (srDims && price && !price.querySelector('.dw-sr-dims')) { var d = document.createElement('span'); d.className = 'dw-sr-dims'; d.textContent = 'Single roll: ' + srDims; price.appendChild(d); }
+    // Steve 2026-07-08: every 2-roll-minimum product states the increment rule plainly in the buy box.
+    if (price && !price.querySelector('.dw-2roll-note')) { var n2 = document.createElement('div'); n2.className = 'dw-2roll-note'; n2.textContent = 'Sold in 2 roll increments only'; price.appendChild(n2); }
   }
 
   // Clean the KEYWORDS list (display-only): drop namespaced tags, spec/operational
@@ -1326,5 +1328,6 @@ alt="web statistics"></a></div></noscript>
 </script>
 {% endif %}
 <!-- DW min-qty end -->
+{% unless customer %}{% render 'dw-signin-modal' %}{% endunless %}
 </body>
 </html>

← 8db74464 auto-save: 2026-07-08T12:35:41 (6 files) — pending-approval/  ·  back to Designer Wallcoverings  ·  auto-save: 2026-07-08T14:06:04 (5 files) — pending-approval/ aa8cff6a →