[object Object]

← back to Designer Wallcoverings

5.0 theme: add card hover label (Pattern,Color + Vendor) via global dw-card-hover.js + theme.liquid include; tolerant push verify; revert dead boost-sd-custom merge

34155bb1644e288d030465d9270e7b034a46b3e2 · 2026-06-22 16:48:55 -0700 · Steve Abrams

Files touched

Diff

commit 34155bb1644e288d030465d9270e7b034a46b3e2
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Mon Jun 22 16:48:55 2026 -0700

    5.0 theme: add card hover label (Pattern,Color + Vendor) via global dw-card-hover.js + theme.liquid include; tolerant push verify; revert dead boost-sd-custom merge
---
 .../assets/boost-sd-custom.js                      |  218 +++++
 .../assets/dw-card-hover.js                        |   71 ++
 .../boost-sd-custom.ORIG.js                        |  218 +++++
 .../boost-sd-custom.merged.js                      |  289 ++++++
 .../dw-card-hover-append.js                        |   71 ++
 .../layout/theme.liquid                            | 1024 ++++++++++++++++++++
 .../push-native-infinite-to-steves-v5.sh           |    5 +-
 7 files changed, 1895 insertions(+), 1 deletion(-)

diff --git a/shopify/theme-infinite-scroll-142250278963/assets/boost-sd-custom.js b/shopify/theme-infinite-scroll-142250278963/assets/boost-sd-custom.js
new file mode 100644
index 00000000..91c4730a
--- /dev/null
+++ b/shopify/theme-infinite-scroll-142250278963/assets/boost-sd-custom.js
@@ -0,0 +1,218 @@
+/*********************** Custom JS for Boost AI Search & Discovery  ************************/
+
+(function() {
+  'use strict';
+
+  // ── Vendor Handle Map (vendor name → collection handle) ────────────────
+  // Built from the brands page. Used to make vendor names clickable.
+  var VENDOR_HANDLES = {
+    '1838 Wallpapers': '1838-wallpapers',
+    'Andrew Martin': 'andrew-martin-wallpaper-collection',
+    'Anna French': 'anna-french',
+    'Anthology': 'anthology-wallcoverings',
+    'Armani/Casa': 'armani-casa-wallcoverings',
+    'Arte': 'arte',
+    'Borastapeter': 'borastapeter-scandinavian-wallpapers',
+    'Brewster': 'brewster-wallcoverings',
+    'Brunschwig & Fils': 'brunschwig-wallpapers',
+    'Carnegie': 'carnegie-wallcoverings',
+    'China Seas': 'china-seas-wallpaper',
+    'Christian Lacroix': 'christian-lacroix-wallcoverings',
+    'Clarke & Clarke': 'clarke-clarke',
+    'Cole & Son': 'cole-and-son',
+    'Colefax and Fowler': 'colefax-and-fowler',
+    'Cowtan & Tout': 'cowtan-tout-wallpaper-collection',
+    'de Gournay': 'de-gournay-wallcoverings',
+    'Designers Guild': 'designers-guild-wallcoverings',
+    'Donghia': 'donghia-wallcoverings',
+    'Elitis': 'elitis-wallcoverings',
+    'Fabricut': 'fabricut-wallcoverings',
+    'Farrow & Ball': 'farrow-ball-wallcoverings',
+    'Fornasetti': 'fornasetti',
+    'Franquemont London': 'franquemont-london',
+    'Fromental': 'fromental-wallcoverings',
+    'Gaston y Daniela': 'gaston-y-daniela',
+    'Graham & Brown': 'graham-and-brown-exclusive-wallpaper',
+    'Groundworks': 'groundworks-wallcoverings',
+    'Harlequin': 'harlequin-wallcoverings',
+    'Hygge & West': 'hygge-and-west',
+    'Innovations': 'innovations-usa',
+    'Koroseal': 'koroseal-wallpaper-collection',
+    'Kravet': 'kravet',
+    'Lee Jofa': 'lee-jofa',
+    'Maharam': 'maharam-wallcoverings',
+    'Matthew Williamson': 'matthew-williamson-wallcoverings',
+    'Maya Romanoff': 'maya-romanoff',
+    'MDC': 'mdc-wallcoverings',
+    'Milton & King': 'milton-and-king',
+    'Mind the Gap': 'mind-the-gap',
+    'Missoni Home': 'missoni-home',
+    'Mr Perswall': 'mr-perswall-wallcoverings',
+    'Mulberry': 'mulberry-wallcoverings',
+    'Nina Campbell': 'nina-campbell-wallcoverings',
+    'Nobilis': 'nobilis-wallcoverings',
+    'Osborne & Little': 'osborne-little-wallpapers',
+    'Phillip Jeffries': 'phillip-jeffries-wallcoverings',
+    'Pierre Frey': 'pierre-frey-wallcoverings',
+    'Philippe Romano Fabrics': 'philippe-romano-fabrics',
+    'Ralph Lauren': 'ralph-lauren-wallpaper',
+    'Rebel Walls': 'rebel-walls-murals',
+    'Roberto Cavalli': 'roberto-cavalli-wallpaper',
+    'Romo': 'romo-europe-wallpapaper-collections',
+    'Sanderson': 'sanderson-wallcoverings',
+    'Schumacher': 'schumacher-wallpaper',
+    'Stout Textiles': 'stout-wallcoverings',
+    'Stroheim': 'stroheim-wallcoverings',
+    'The Graduate Collection': 'the-graduate-collection',
+    'Thibaut': 'thibaut-wallcoverings',
+    'Threads': 'threads-wallcoverings',
+    'Versace': 'versace-wallpaper',
+    'Wolf Gordon': 'wolf-gordon-wallcoverings',
+    'York Wallcoverings': 'york-wallcoverings',
+    'Zoffany': 'zoffany-wallcoverings',
+    'Zuber': 'zuber-wallcoverings'
+  };
+
+  // Slugify vendor name as fallback if not in map
+  function vendorToHandle(vendor) {
+    if (VENDOR_HANDLES[vendor]) return VENDOR_HANDLES[vendor];
+    // Fallback: slugify
+    return vendor.toLowerCase()
+      .replace(/[&]/g, 'and')
+      .replace(/[^a-z0-9]+/g, '-')
+      .replace(/^-|-$/g, '');
+  }
+
+  // ── Enhance Product Cards ─────────────────────────────────────────────
+  function enhanceProductCards() {
+    // Find vendor elements: <p> elements with class containing "vendor"
+    // inside the Boost filter block
+    var container = document.querySelector('.boost-sd__filter-block');
+    if (!container) return;
+
+    // Strategy: find all <p> elements whose className contains "vendor"
+    var allP = container.querySelectorAll('p[class*="vendor"]');
+
+    for (var i = 0; i < allP.length; i++) {
+      var vendorEl = allP[i];
+
+      // Skip if already enhanced
+      if (vendorEl.getAttribute('data-dw-linked')) continue;
+      vendorEl.setAttribute('data-dw-linked', '1');
+
+      var vendorName = vendorEl.textContent.trim();
+      if (!vendorName) continue;
+
+      var handle = vendorToHandle(vendorName);
+      var link = document.createElement('a');
+      link.href = '/collections/' + handle;
+      link.textContent = vendorName;
+      link.className = 'dw-vendor-link';
+      link.title = 'Browse all ' + vendorName;
+      link.addEventListener('click', function(e) {
+        e.stopPropagation(); // Don't trigger product card click
+      });
+
+      vendorEl.textContent = '';
+      vendorEl.appendChild(link);
+    }
+
+    // Add zoom-on-hover to product image wrappers that don't have a second image
+    var imgWrappers = container.querySelectorAll('[class*="product-image-wrapper"]');
+    for (var j = 0; j < imgWrappers.length; j++) {
+      var wrapper = imgWrappers[j];
+      if (wrapper.getAttribute('data-dw-hover')) continue;
+      wrapper.setAttribute('data-dw-hover', '1');
+
+      // If no second image, add zoom class
+      var hasSecond = wrapper.className.indexOf('has-second-image') > -1;
+      if (!hasSecond) {
+        wrapper.classList.add('dw-hover-zoom');
+      }
+    }
+  }
+
+  // ── Run on Boost render + MutationObserver ─────────────────────────────
+  // Boost renders async via React, so we watch for DOM changes
+  var observer = new MutationObserver(function(mutations) {
+    var shouldEnhance = false;
+    for (var i = 0; i < mutations.length; i++) {
+      if (mutations[i].addedNodes.length > 0) {
+        shouldEnhance = true;
+        break;
+      }
+    }
+    if (shouldEnhance) {
+      // Debounce slightly
+      clearTimeout(observer._timer);
+      observer._timer = setTimeout(enhanceProductCards, 150);
+    }
+  });
+
+  function startObserving() {
+    var target = document.querySelector('.boost-sd__filter-block');
+    if (target) {
+      observer.observe(target, { childList: true, subtree: true });
+      // Also run once immediately in case cards already rendered
+      enhanceProductCards();
+    } else {
+      // Boost hasn't loaded yet, wait
+      setTimeout(startObserving, 500);
+    }
+  }
+
+  // Start when DOM is ready
+  if (document.readyState === 'loading') {
+    document.addEventListener('DOMContentLoaded', startObserving);
+  } else {
+    startObserving();
+  }
+
+})();
+
+
+/* Infinite Scroll for Boost AI Collection Pages */
+(function() {
+  'use strict';
+  var loading = false;
+  var allLoaded = false;
+
+  function getNextButton() {
+    return document.querySelector('.boost-sd__pagination-next:not(.boost-sd__pagination--disabled)') ||
+           document.querySelector('[class*="pagination"] a[rel="next"]') ||
+           document.querySelector('.boost-sd__pagination a:last-child:not(.boost-sd__pagination--disabled)');
+  }
+
+  function loadMore() {
+    if (loading || allLoaded) return;
+    var nextBtn = getNextButton();
+    if (!nextBtn) { allLoaded = true; return; }
+    loading = true;
+    nextBtn.click();
+    setTimeout(function() { loading = false; }, 1500);
+  }
+
+  function onScroll() {
+    var scrollBottom = window.innerHeight + window.scrollY;
+    var docHeight = document.documentElement.scrollHeight;
+    if (docHeight - scrollBottom < 600) loadMore();
+  }
+
+  function init() {
+    var check = setInterval(function() {
+      if (document.querySelector('.boost-sd__product-list') ||
+          document.querySelector('.boost-sd__filter-block')) {
+        clearInterval(check);
+        window.addEventListener('scroll', onScroll, { passive: true });
+        var s = document.createElement('style');
+        s.textContent = '.boost-sd__pagination { display: none !important; }';
+        document.head.appendChild(s);
+      }
+    }, 500);
+    setTimeout(function() { clearInterval(check); }, 15000);
+  }
+
+  if (document.readyState === 'loading') {
+    document.addEventListener('DOMContentLoaded', init);
+  } else { init(); }
+})();
diff --git a/shopify/theme-infinite-scroll-142250278963/assets/dw-card-hover.js b/shopify/theme-infinite-scroll-142250278963/assets/dw-card-hover.js
new file mode 100644
index 00000000..8f7a43c1
--- /dev/null
+++ b/shopify/theme-infinite-scroll-142250278963/assets/dw-card-hover.js
@@ -0,0 +1,71 @@
+
+
+/* ============================================================================
+   DW card hover label (2026-06-22) — Boost product grid cards.
+   Default: clean image-only grid (full SEO title hidden).
+   On hover: reveal "Pattern, Color" (full title minus "wallcovering(s) | vendor")
+   + the vendor on a smaller line. Full title stays in DOM for SEO.
+   Re-applies to infinite-scroll-appended / Boost-rerendered cards via observer.
+   ========================================================================== */
+(function () {
+  if (window.__dwCardHover) return;
+  window.__dwCardHover = true;
+
+  var STYLE_ID = 'dw-card-hover-style';
+  if (!document.getElementById(STYLE_ID)) {
+    var st = document.createElement('style');
+    st.id = STYLE_ID;
+    st.textContent =
+      '.boost-sd__product-item .boost-sd__product-title,' +
+      '.boost-sd__product-item .boost-sd__product-vendor{opacity:0;transition:opacity .15s;}' +
+      '.boost-sd__product-item:hover .dw-hover-label{opacity:1;}' +
+      '.dw-hover-label{opacity:0;transition:opacity .15s;padding:6px 2px 0;pointer-events:none;}' +
+      '.dw-hover-label .pat{font-size:13px;font-weight:600;color:#1a1a1a;line-height:1.2;}' +
+      '.dw-hover-label .ven{font-size:11px;letter-spacing:.04em;text-transform:uppercase;color:#888;margin-top:2px;}';
+    document.head.appendChild(st);
+  }
+
+  function titleCase(s) {
+    return s.replace(/\w\S*/g, function (w) { return w.charAt(0).toUpperCase() + w.slice(1); });
+  }
+
+  function labelCard(card) {
+    if (card.querySelector('.dw-hover-label')) return;
+    var tEl = card.querySelector('.boost-sd__product-title');
+    var vEl = card.querySelector('.boost-sd__product-vendor');
+    if (!tEl) return;
+    var vendor = (vEl ? vEl.textContent : '').trim();
+    var name = tEl.textContent.split('|')[0].trim()        // drop "| vendor"
+      .replace(/\s*wallcoverings?\b/ig, '')                // drop "wallcovering(s)"
+      .replace(/[,\s]+$/, '').trim();
+    var lab = document.createElement('div');
+    lab.className = 'dw-hover-label';
+    lab.innerHTML = '<div class="pat">' + titleCase(name) + '</div>' +
+      (vendor ? '<div class="ven">' + titleCase(vendor) + '</div>' : '');
+    tEl.parentElement.appendChild(lab);
+  }
+
+  function run() {
+    var cards = document.querySelectorAll('.boost-sd__product-item');
+    for (var i = 0; i < cards.length; i++) labelCard(cards[i]);
+  }
+
+  if (document.readyState === 'loading') {
+    document.addEventListener('DOMContentLoaded', run);
+  } else {
+    run();
+  }
+
+  // Re-apply when Boost renders a grid or infinite scroll appends more cards.
+  var t;
+  var obs = new MutationObserver(function (muts) {
+    for (var i = 0; i < muts.length; i++) {
+      if (muts[i].addedNodes && muts[i].addedNodes.length) {
+        clearTimeout(t);
+        t = setTimeout(run, 80);
+        return;
+      }
+    }
+  });
+  obs.observe(document.body, { childList: true, subtree: true });
+})();
diff --git a/shopify/theme-infinite-scroll-142250278963/boost-sd-custom.ORIG.js b/shopify/theme-infinite-scroll-142250278963/boost-sd-custom.ORIG.js
new file mode 100644
index 00000000..91c4730a
--- /dev/null
+++ b/shopify/theme-infinite-scroll-142250278963/boost-sd-custom.ORIG.js
@@ -0,0 +1,218 @@
+/*********************** Custom JS for Boost AI Search & Discovery  ************************/
+
+(function() {
+  'use strict';
+
+  // ── Vendor Handle Map (vendor name → collection handle) ────────────────
+  // Built from the brands page. Used to make vendor names clickable.
+  var VENDOR_HANDLES = {
+    '1838 Wallpapers': '1838-wallpapers',
+    'Andrew Martin': 'andrew-martin-wallpaper-collection',
+    'Anna French': 'anna-french',
+    'Anthology': 'anthology-wallcoverings',
+    'Armani/Casa': 'armani-casa-wallcoverings',
+    'Arte': 'arte',
+    'Borastapeter': 'borastapeter-scandinavian-wallpapers',
+    'Brewster': 'brewster-wallcoverings',
+    'Brunschwig & Fils': 'brunschwig-wallpapers',
+    'Carnegie': 'carnegie-wallcoverings',
+    'China Seas': 'china-seas-wallpaper',
+    'Christian Lacroix': 'christian-lacroix-wallcoverings',
+    'Clarke & Clarke': 'clarke-clarke',
+    'Cole & Son': 'cole-and-son',
+    'Colefax and Fowler': 'colefax-and-fowler',
+    'Cowtan & Tout': 'cowtan-tout-wallpaper-collection',
+    'de Gournay': 'de-gournay-wallcoverings',
+    'Designers Guild': 'designers-guild-wallcoverings',
+    'Donghia': 'donghia-wallcoverings',
+    'Elitis': 'elitis-wallcoverings',
+    'Fabricut': 'fabricut-wallcoverings',
+    'Farrow & Ball': 'farrow-ball-wallcoverings',
+    'Fornasetti': 'fornasetti',
+    'Franquemont London': 'franquemont-london',
+    'Fromental': 'fromental-wallcoverings',
+    'Gaston y Daniela': 'gaston-y-daniela',
+    'Graham & Brown': 'graham-and-brown-exclusive-wallpaper',
+    'Groundworks': 'groundworks-wallcoverings',
+    'Harlequin': 'harlequin-wallcoverings',
+    'Hygge & West': 'hygge-and-west',
+    'Innovations': 'innovations-usa',
+    'Koroseal': 'koroseal-wallpaper-collection',
+    'Kravet': 'kravet',
+    'Lee Jofa': 'lee-jofa',
+    'Maharam': 'maharam-wallcoverings',
+    'Matthew Williamson': 'matthew-williamson-wallcoverings',
+    'Maya Romanoff': 'maya-romanoff',
+    'MDC': 'mdc-wallcoverings',
+    'Milton & King': 'milton-and-king',
+    'Mind the Gap': 'mind-the-gap',
+    'Missoni Home': 'missoni-home',
+    'Mr Perswall': 'mr-perswall-wallcoverings',
+    'Mulberry': 'mulberry-wallcoverings',
+    'Nina Campbell': 'nina-campbell-wallcoverings',
+    'Nobilis': 'nobilis-wallcoverings',
+    'Osborne & Little': 'osborne-little-wallpapers',
+    'Phillip Jeffries': 'phillip-jeffries-wallcoverings',
+    'Pierre Frey': 'pierre-frey-wallcoverings',
+    'Philippe Romano Fabrics': 'philippe-romano-fabrics',
+    'Ralph Lauren': 'ralph-lauren-wallpaper',
+    'Rebel Walls': 'rebel-walls-murals',
+    'Roberto Cavalli': 'roberto-cavalli-wallpaper',
+    'Romo': 'romo-europe-wallpapaper-collections',
+    'Sanderson': 'sanderson-wallcoverings',
+    'Schumacher': 'schumacher-wallpaper',
+    'Stout Textiles': 'stout-wallcoverings',
+    'Stroheim': 'stroheim-wallcoverings',
+    'The Graduate Collection': 'the-graduate-collection',
+    'Thibaut': 'thibaut-wallcoverings',
+    'Threads': 'threads-wallcoverings',
+    'Versace': 'versace-wallpaper',
+    'Wolf Gordon': 'wolf-gordon-wallcoverings',
+    'York Wallcoverings': 'york-wallcoverings',
+    'Zoffany': 'zoffany-wallcoverings',
+    'Zuber': 'zuber-wallcoverings'
+  };
+
+  // Slugify vendor name as fallback if not in map
+  function vendorToHandle(vendor) {
+    if (VENDOR_HANDLES[vendor]) return VENDOR_HANDLES[vendor];
+    // Fallback: slugify
+    return vendor.toLowerCase()
+      .replace(/[&]/g, 'and')
+      .replace(/[^a-z0-9]+/g, '-')
+      .replace(/^-|-$/g, '');
+  }
+
+  // ── Enhance Product Cards ─────────────────────────────────────────────
+  function enhanceProductCards() {
+    // Find vendor elements: <p> elements with class containing "vendor"
+    // inside the Boost filter block
+    var container = document.querySelector('.boost-sd__filter-block');
+    if (!container) return;
+
+    // Strategy: find all <p> elements whose className contains "vendor"
+    var allP = container.querySelectorAll('p[class*="vendor"]');
+
+    for (var i = 0; i < allP.length; i++) {
+      var vendorEl = allP[i];
+
+      // Skip if already enhanced
+      if (vendorEl.getAttribute('data-dw-linked')) continue;
+      vendorEl.setAttribute('data-dw-linked', '1');
+
+      var vendorName = vendorEl.textContent.trim();
+      if (!vendorName) continue;
+
+      var handle = vendorToHandle(vendorName);
+      var link = document.createElement('a');
+      link.href = '/collections/' + handle;
+      link.textContent = vendorName;
+      link.className = 'dw-vendor-link';
+      link.title = 'Browse all ' + vendorName;
+      link.addEventListener('click', function(e) {
+        e.stopPropagation(); // Don't trigger product card click
+      });
+
+      vendorEl.textContent = '';
+      vendorEl.appendChild(link);
+    }
+
+    // Add zoom-on-hover to product image wrappers that don't have a second image
+    var imgWrappers = container.querySelectorAll('[class*="product-image-wrapper"]');
+    for (var j = 0; j < imgWrappers.length; j++) {
+      var wrapper = imgWrappers[j];
+      if (wrapper.getAttribute('data-dw-hover')) continue;
+      wrapper.setAttribute('data-dw-hover', '1');
+
+      // If no second image, add zoom class
+      var hasSecond = wrapper.className.indexOf('has-second-image') > -1;
+      if (!hasSecond) {
+        wrapper.classList.add('dw-hover-zoom');
+      }
+    }
+  }
+
+  // ── Run on Boost render + MutationObserver ─────────────────────────────
+  // Boost renders async via React, so we watch for DOM changes
+  var observer = new MutationObserver(function(mutations) {
+    var shouldEnhance = false;
+    for (var i = 0; i < mutations.length; i++) {
+      if (mutations[i].addedNodes.length > 0) {
+        shouldEnhance = true;
+        break;
+      }
+    }
+    if (shouldEnhance) {
+      // Debounce slightly
+      clearTimeout(observer._timer);
+      observer._timer = setTimeout(enhanceProductCards, 150);
+    }
+  });
+
+  function startObserving() {
+    var target = document.querySelector('.boost-sd__filter-block');
+    if (target) {
+      observer.observe(target, { childList: true, subtree: true });
+      // Also run once immediately in case cards already rendered
+      enhanceProductCards();
+    } else {
+      // Boost hasn't loaded yet, wait
+      setTimeout(startObserving, 500);
+    }
+  }
+
+  // Start when DOM is ready
+  if (document.readyState === 'loading') {
+    document.addEventListener('DOMContentLoaded', startObserving);
+  } else {
+    startObserving();
+  }
+
+})();
+
+
+/* Infinite Scroll for Boost AI Collection Pages */
+(function() {
+  'use strict';
+  var loading = false;
+  var allLoaded = false;
+
+  function getNextButton() {
+    return document.querySelector('.boost-sd__pagination-next:not(.boost-sd__pagination--disabled)') ||
+           document.querySelector('[class*="pagination"] a[rel="next"]') ||
+           document.querySelector('.boost-sd__pagination a:last-child:not(.boost-sd__pagination--disabled)');
+  }
+
+  function loadMore() {
+    if (loading || allLoaded) return;
+    var nextBtn = getNextButton();
+    if (!nextBtn) { allLoaded = true; return; }
+    loading = true;
+    nextBtn.click();
+    setTimeout(function() { loading = false; }, 1500);
+  }
+
+  function onScroll() {
+    var scrollBottom = window.innerHeight + window.scrollY;
+    var docHeight = document.documentElement.scrollHeight;
+    if (docHeight - scrollBottom < 600) loadMore();
+  }
+
+  function init() {
+    var check = setInterval(function() {
+      if (document.querySelector('.boost-sd__product-list') ||
+          document.querySelector('.boost-sd__filter-block')) {
+        clearInterval(check);
+        window.addEventListener('scroll', onScroll, { passive: true });
+        var s = document.createElement('style');
+        s.textContent = '.boost-sd__pagination { display: none !important; }';
+        document.head.appendChild(s);
+      }
+    }, 500);
+    setTimeout(function() { clearInterval(check); }, 15000);
+  }
+
+  if (document.readyState === 'loading') {
+    document.addEventListener('DOMContentLoaded', init);
+  } else { init(); }
+})();
diff --git a/shopify/theme-infinite-scroll-142250278963/boost-sd-custom.merged.js b/shopify/theme-infinite-scroll-142250278963/boost-sd-custom.merged.js
new file mode 100644
index 00000000..321629e4
--- /dev/null
+++ b/shopify/theme-infinite-scroll-142250278963/boost-sd-custom.merged.js
@@ -0,0 +1,289 @@
+/*********************** Custom JS for Boost AI Search & Discovery  ************************/
+
+(function() {
+  'use strict';
+
+  // ── Vendor Handle Map (vendor name → collection handle) ────────────────
+  // Built from the brands page. Used to make vendor names clickable.
+  var VENDOR_HANDLES = {
+    '1838 Wallpapers': '1838-wallpapers',
+    'Andrew Martin': 'andrew-martin-wallpaper-collection',
+    'Anna French': 'anna-french',
+    'Anthology': 'anthology-wallcoverings',
+    'Armani/Casa': 'armani-casa-wallcoverings',
+    'Arte': 'arte',
+    'Borastapeter': 'borastapeter-scandinavian-wallpapers',
+    'Brewster': 'brewster-wallcoverings',
+    'Brunschwig & Fils': 'brunschwig-wallpapers',
+    'Carnegie': 'carnegie-wallcoverings',
+    'China Seas': 'china-seas-wallpaper',
+    'Christian Lacroix': 'christian-lacroix-wallcoverings',
+    'Clarke & Clarke': 'clarke-clarke',
+    'Cole & Son': 'cole-and-son',
+    'Colefax and Fowler': 'colefax-and-fowler',
+    'Cowtan & Tout': 'cowtan-tout-wallpaper-collection',
+    'de Gournay': 'de-gournay-wallcoverings',
+    'Designers Guild': 'designers-guild-wallcoverings',
+    'Donghia': 'donghia-wallcoverings',
+    'Elitis': 'elitis-wallcoverings',
+    'Fabricut': 'fabricut-wallcoverings',
+    'Farrow & Ball': 'farrow-ball-wallcoverings',
+    'Fornasetti': 'fornasetti',
+    'Franquemont London': 'franquemont-london',
+    'Fromental': 'fromental-wallcoverings',
+    'Gaston y Daniela': 'gaston-y-daniela',
+    'Graham & Brown': 'graham-and-brown-exclusive-wallpaper',
+    'Groundworks': 'groundworks-wallcoverings',
+    'Harlequin': 'harlequin-wallcoverings',
+    'Hygge & West': 'hygge-and-west',
+    'Innovations': 'innovations-usa',
+    'Koroseal': 'koroseal-wallpaper-collection',
+    'Kravet': 'kravet',
+    'Lee Jofa': 'lee-jofa',
+    'Maharam': 'maharam-wallcoverings',
+    'Matthew Williamson': 'matthew-williamson-wallcoverings',
+    'Maya Romanoff': 'maya-romanoff',
+    'MDC': 'mdc-wallcoverings',
+    'Milton & King': 'milton-and-king',
+    'Mind the Gap': 'mind-the-gap',
+    'Missoni Home': 'missoni-home',
+    'Mr Perswall': 'mr-perswall-wallcoverings',
+    'Mulberry': 'mulberry-wallcoverings',
+    'Nina Campbell': 'nina-campbell-wallcoverings',
+    'Nobilis': 'nobilis-wallcoverings',
+    'Osborne & Little': 'osborne-little-wallpapers',
+    'Phillip Jeffries': 'phillip-jeffries-wallcoverings',
+    'Pierre Frey': 'pierre-frey-wallcoverings',
+    'Philippe Romano Fabrics': 'philippe-romano-fabrics',
+    'Ralph Lauren': 'ralph-lauren-wallpaper',
+    'Rebel Walls': 'rebel-walls-murals',
+    'Roberto Cavalli': 'roberto-cavalli-wallpaper',
+    'Romo': 'romo-europe-wallpapaper-collections',
+    'Sanderson': 'sanderson-wallcoverings',
+    'Schumacher': 'schumacher-wallpaper',
+    'Stout Textiles': 'stout-wallcoverings',
+    'Stroheim': 'stroheim-wallcoverings',
+    'The Graduate Collection': 'the-graduate-collection',
+    'Thibaut': 'thibaut-wallcoverings',
+    'Threads': 'threads-wallcoverings',
+    'Versace': 'versace-wallpaper',
+    'Wolf Gordon': 'wolf-gordon-wallcoverings',
+    'York Wallcoverings': 'york-wallcoverings',
+    'Zoffany': 'zoffany-wallcoverings',
+    'Zuber': 'zuber-wallcoverings'
+  };
+
+  // Slugify vendor name as fallback if not in map
+  function vendorToHandle(vendor) {
+    if (VENDOR_HANDLES[vendor]) return VENDOR_HANDLES[vendor];
+    // Fallback: slugify
+    return vendor.toLowerCase()
+      .replace(/[&]/g, 'and')
+      .replace(/[^a-z0-9]+/g, '-')
+      .replace(/^-|-$/g, '');
+  }
+
+  // ── Enhance Product Cards ─────────────────────────────────────────────
+  function enhanceProductCards() {
+    // Find vendor elements: <p> elements with class containing "vendor"
+    // inside the Boost filter block
+    var container = document.querySelector('.boost-sd__filter-block');
+    if (!container) return;
+
+    // Strategy: find all <p> elements whose className contains "vendor"
+    var allP = container.querySelectorAll('p[class*="vendor"]');
+
+    for (var i = 0; i < allP.length; i++) {
+      var vendorEl = allP[i];
+
+      // Skip if already enhanced
+      if (vendorEl.getAttribute('data-dw-linked')) continue;
+      vendorEl.setAttribute('data-dw-linked', '1');
+
+      var vendorName = vendorEl.textContent.trim();
+      if (!vendorName) continue;
+
+      var handle = vendorToHandle(vendorName);
+      var link = document.createElement('a');
+      link.href = '/collections/' + handle;
+      link.textContent = vendorName;
+      link.className = 'dw-vendor-link';
+      link.title = 'Browse all ' + vendorName;
+      link.addEventListener('click', function(e) {
+        e.stopPropagation(); // Don't trigger product card click
+      });
+
+      vendorEl.textContent = '';
+      vendorEl.appendChild(link);
+    }
+
+    // Add zoom-on-hover to product image wrappers that don't have a second image
+    var imgWrappers = container.querySelectorAll('[class*="product-image-wrapper"]');
+    for (var j = 0; j < imgWrappers.length; j++) {
+      var wrapper = imgWrappers[j];
+      if (wrapper.getAttribute('data-dw-hover')) continue;
+      wrapper.setAttribute('data-dw-hover', '1');
+
+      // If no second image, add zoom class
+      var hasSecond = wrapper.className.indexOf('has-second-image') > -1;
+      if (!hasSecond) {
+        wrapper.classList.add('dw-hover-zoom');
+      }
+    }
+  }
+
+  // ── Run on Boost render + MutationObserver ─────────────────────────────
+  // Boost renders async via React, so we watch for DOM changes
+  var observer = new MutationObserver(function(mutations) {
+    var shouldEnhance = false;
+    for (var i = 0; i < mutations.length; i++) {
+      if (mutations[i].addedNodes.length > 0) {
+        shouldEnhance = true;
+        break;
+      }
+    }
+    if (shouldEnhance) {
+      // Debounce slightly
+      clearTimeout(observer._timer);
+      observer._timer = setTimeout(enhanceProductCards, 150);
+    }
+  });
+
+  function startObserving() {
+    var target = document.querySelector('.boost-sd__filter-block');
+    if (target) {
+      observer.observe(target, { childList: true, subtree: true });
+      // Also run once immediately in case cards already rendered
+      enhanceProductCards();
+    } else {
+      // Boost hasn't loaded yet, wait
+      setTimeout(startObserving, 500);
+    }
+  }
+
+  // Start when DOM is ready
+  if (document.readyState === 'loading') {
+    document.addEventListener('DOMContentLoaded', startObserving);
+  } else {
+    startObserving();
+  }
+
+})();
+
+
+/* Infinite Scroll for Boost AI Collection Pages */
+(function() {
+  'use strict';
+  var loading = false;
+  var allLoaded = false;
+
+  function getNextButton() {
+    return document.querySelector('.boost-sd__pagination-next:not(.boost-sd__pagination--disabled)') ||
+           document.querySelector('[class*="pagination"] a[rel="next"]') ||
+           document.querySelector('.boost-sd__pagination a:last-child:not(.boost-sd__pagination--disabled)');
+  }
+
+  function loadMore() {
+    if (loading || allLoaded) return;
+    var nextBtn = getNextButton();
+    if (!nextBtn) { allLoaded = true; return; }
+    loading = true;
+    nextBtn.click();
+    setTimeout(function() { loading = false; }, 1500);
+  }
+
+  function onScroll() {
+    var scrollBottom = window.innerHeight + window.scrollY;
+    var docHeight = document.documentElement.scrollHeight;
+    if (docHeight - scrollBottom < 600) loadMore();
+  }
+
+  function init() {
+    var check = setInterval(function() {
+      if (document.querySelector('.boost-sd__product-list') ||
+          document.querySelector('.boost-sd__filter-block')) {
+        clearInterval(check);
+        window.addEventListener('scroll', onScroll, { passive: true });
+        var s = document.createElement('style');
+        s.textContent = '.boost-sd__pagination { display: none !important; }';
+        document.head.appendChild(s);
+      }
+    }, 500);
+    setTimeout(function() { clearInterval(check); }, 15000);
+  }
+
+  if (document.readyState === 'loading') {
+    document.addEventListener('DOMContentLoaded', init);
+  } else { init(); }
+})();
+
+
+/* ============================================================================
+   DW card hover label (2026-06-22) — Boost product grid cards.
+   Default: clean image-only grid (full SEO title hidden).
+   On hover: reveal "Pattern, Color" (full title minus "wallcovering(s) | vendor")
+   + the vendor on a smaller line. Full title stays in DOM for SEO.
+   Re-applies to infinite-scroll-appended / Boost-rerendered cards via observer.
+   ========================================================================== */
+(function () {
+  if (window.__dwCardHover) return;
+  window.__dwCardHover = true;
+
+  var STYLE_ID = 'dw-card-hover-style';
+  if (!document.getElementById(STYLE_ID)) {
+    var st = document.createElement('style');
+    st.id = STYLE_ID;
+    st.textContent =
+      '.boost-sd__product-item .boost-sd__product-title,' +
+      '.boost-sd__product-item .boost-sd__product-vendor{opacity:0;transition:opacity .15s;}' +
+      '.boost-sd__product-item:hover .dw-hover-label{opacity:1;}' +
+      '.dw-hover-label{opacity:0;transition:opacity .15s;padding:6px 2px 0;pointer-events:none;}' +
+      '.dw-hover-label .pat{font-size:13px;font-weight:600;color:#1a1a1a;line-height:1.2;}' +
+      '.dw-hover-label .ven{font-size:11px;letter-spacing:.04em;text-transform:uppercase;color:#888;margin-top:2px;}';
+    document.head.appendChild(st);
+  }
+
+  function titleCase(s) {
+    return s.replace(/\w\S*/g, function (w) { return w.charAt(0).toUpperCase() + w.slice(1); });
+  }
+
+  function labelCard(card) {
+    if (card.querySelector('.dw-hover-label')) return;
+    var tEl = card.querySelector('.boost-sd__product-title');
+    var vEl = card.querySelector('.boost-sd__product-vendor');
+    if (!tEl) return;
+    var vendor = (vEl ? vEl.textContent : '').trim();
+    var name = tEl.textContent.split('|')[0].trim()        // drop "| vendor"
+      .replace(/\s*wallcoverings?\b/ig, '')                // drop "wallcovering(s)"
+      .replace(/[,\s]+$/, '').trim();
+    var lab = document.createElement('div');
+    lab.className = 'dw-hover-label';
+    lab.innerHTML = '<div class="pat">' + titleCase(name) + '</div>' +
+      (vendor ? '<div class="ven">' + titleCase(vendor) + '</div>' : '');
+    tEl.parentElement.appendChild(lab);
+  }
+
+  function run() {
+    var cards = document.querySelectorAll('.boost-sd__product-item');
+    for (var i = 0; i < cards.length; i++) labelCard(cards[i]);
+  }
+
+  if (document.readyState === 'loading') {
+    document.addEventListener('DOMContentLoaded', run);
+  } else {
+    run();
+  }
+
+  // Re-apply when Boost renders a grid or infinite scroll appends more cards.
+  var t;
+  var obs = new MutationObserver(function (muts) {
+    for (var i = 0; i < muts.length; i++) {
+      if (muts[i].addedNodes && muts[i].addedNodes.length) {
+        clearTimeout(t);
+        t = setTimeout(run, 80);
+        return;
+      }
+    }
+  });
+  obs.observe(document.body, { childList: true, subtree: true });
+})();
diff --git a/shopify/theme-infinite-scroll-142250278963/dw-card-hover-append.js b/shopify/theme-infinite-scroll-142250278963/dw-card-hover-append.js
new file mode 100644
index 00000000..8f7a43c1
--- /dev/null
+++ b/shopify/theme-infinite-scroll-142250278963/dw-card-hover-append.js
@@ -0,0 +1,71 @@
+
+
+/* ============================================================================
+   DW card hover label (2026-06-22) — Boost product grid cards.
+   Default: clean image-only grid (full SEO title hidden).
+   On hover: reveal "Pattern, Color" (full title minus "wallcovering(s) | vendor")
+   + the vendor on a smaller line. Full title stays in DOM for SEO.
+   Re-applies to infinite-scroll-appended / Boost-rerendered cards via observer.
+   ========================================================================== */
+(function () {
+  if (window.__dwCardHover) return;
+  window.__dwCardHover = true;
+
+  var STYLE_ID = 'dw-card-hover-style';
+  if (!document.getElementById(STYLE_ID)) {
+    var st = document.createElement('style');
+    st.id = STYLE_ID;
+    st.textContent =
+      '.boost-sd__product-item .boost-sd__product-title,' +
+      '.boost-sd__product-item .boost-sd__product-vendor{opacity:0;transition:opacity .15s;}' +
+      '.boost-sd__product-item:hover .dw-hover-label{opacity:1;}' +
+      '.dw-hover-label{opacity:0;transition:opacity .15s;padding:6px 2px 0;pointer-events:none;}' +
+      '.dw-hover-label .pat{font-size:13px;font-weight:600;color:#1a1a1a;line-height:1.2;}' +
+      '.dw-hover-label .ven{font-size:11px;letter-spacing:.04em;text-transform:uppercase;color:#888;margin-top:2px;}';
+    document.head.appendChild(st);
+  }
+
+  function titleCase(s) {
+    return s.replace(/\w\S*/g, function (w) { return w.charAt(0).toUpperCase() + w.slice(1); });
+  }
+
+  function labelCard(card) {
+    if (card.querySelector('.dw-hover-label')) return;
+    var tEl = card.querySelector('.boost-sd__product-title');
+    var vEl = card.querySelector('.boost-sd__product-vendor');
+    if (!tEl) return;
+    var vendor = (vEl ? vEl.textContent : '').trim();
+    var name = tEl.textContent.split('|')[0].trim()        // drop "| vendor"
+      .replace(/\s*wallcoverings?\b/ig, '')                // drop "wallcovering(s)"
+      .replace(/[,\s]+$/, '').trim();
+    var lab = document.createElement('div');
+    lab.className = 'dw-hover-label';
+    lab.innerHTML = '<div class="pat">' + titleCase(name) + '</div>' +
+      (vendor ? '<div class="ven">' + titleCase(vendor) + '</div>' : '');
+    tEl.parentElement.appendChild(lab);
+  }
+
+  function run() {
+    var cards = document.querySelectorAll('.boost-sd__product-item');
+    for (var i = 0; i < cards.length; i++) labelCard(cards[i]);
+  }
+
+  if (document.readyState === 'loading') {
+    document.addEventListener('DOMContentLoaded', run);
+  } else {
+    run();
+  }
+
+  // Re-apply when Boost renders a grid or infinite scroll appends more cards.
+  var t;
+  var obs = new MutationObserver(function (muts) {
+    for (var i = 0; i < muts.length; i++) {
+      if (muts[i].addedNodes && muts[i].addedNodes.length) {
+        clearTimeout(t);
+        t = setTimeout(run, 80);
+        return;
+      }
+    }
+  });
+  obs.observe(document.body, { childList: true, subtree: true });
+})();
diff --git a/shopify/theme-infinite-scroll-142250278963/layout/theme.liquid b/shopify/theme-infinite-scroll-142250278963/layout/theme.liquid
new file mode 100644
index 00000000..6727e422
--- /dev/null
+++ b/shopify/theme-infinite-scroll-142250278963/layout/theme.liquid
@@ -0,0 +1,1024 @@
+{% comment %}DW-CHINA-BLOCK-START{% endcomment %}
+{% assign dw_blocked_countries = "CN" | split: "," %}
+{% assign dw_visitor_country = localization.country.iso_code | upcase %}
+{% assign dw_is_blocked = false %}
+{% for dw_bc in dw_blocked_countries %}
+  {% assign dw_bc_trimmed = dw_bc | strip %}
+  {% if dw_visitor_country == dw_bc_trimmed %}
+    {% assign dw_is_blocked = true %}
+  {% endif %}
+{% endfor %}
+
+{% if dw_is_blocked %}
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<!-- DW-CHINA-JS-BLOCK-START -->
+<script>
+(function() {
+  var blockedCountries = ['CN'];
+  fetch('/browsing_context_suggestions.json', {method: 'GET', credentials: 'same-origin'})
+    .then(function(r) { return r.json(); })
+    .catch(function() { return null; })
+    .then(function(data) {
+      if (data && data.detected_values && data.detected_values.country && data.detected_values.country.handle) {
+        var detectedCountry = data.detected_values.country.handle.toUpperCase();
+        if (blockedCountries.indexOf(detectedCountry) !== -1) {
+          var container = document.createElement('div');
+          container.innerHTML = '<div style="position:fixed;top:0;left:0;width:100%;height:100%;background:#f5f5f5;z-index:999999;display:flex;align-items:center;justify-content:center;font-family:-apple-system,BlinkMacSystemFont,sans-serif"><div style="text-align:center;padding:60px 40px;background:#fff;border-radius:12px;box-shadow:0 4px 24px rgba(0,0,0,.08);max-width:520px;width:90%"><div style="font-size:48px;margin-bottom:20px">&#127760;</div><h1 style="font-size:24px;margin-bottom:16px;font-weight:600;color:#333">Region Not Available</h1><p style="font-size:16px;line-height:1.6;color:#666;margin-bottom:12px">This store is not available in your region.</p><p style="font-size:16px;line-height:1.6;color:#666">We do not ship to or serve customers in your area at this time.</p></div></div>';
+          document.body.innerHTML = '';
+          document.body.appendChild(container);
+        }
+      }
+    });
+})();
+</script>
+<!-- DW-CHINA-JS-BLOCK-END -->
+
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>Region Not Available</title>
+  <style>
+    * { margin: 0; padding: 0; box-sizing: border-box; }
+    body {
+      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
+      background: #f5f5f5;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      min-height: 100vh;
+      color: #333;
+    }
+    .container {
+      text-align: center;
+      padding: 60px 40px;
+      background: white;
+      border-radius: 12px;
+      box-shadow: 0 4px 24px rgba(0,0,0,0.08);
+      max-width: 520px;
+      width: 90%;
+    }
+    .icon { font-size: 48px; margin-bottom: 20px; }
+    h1 { font-size: 24px; margin-bottom: 16px; font-weight: 600; }
+    p { font-size: 16px; line-height: 1.6; color: #666; margin-bottom: 12px; }
+    .contact { margin-top: 24px; font-size: 14px; color: #999; }
+    .contact a { color: #2563eb; text-decoration: none; }
+  </style>
+<script src="{{ 'dw-grid-control.js' | asset_url }}" defer></script>
+
+
+
+
+
+<!-- cache-bust: 2026-03-25T00:54:55.724677 -->
+</head>
+<body>
+  <div class="container">
+    <div class="icon">&#127760;</div>
+    <h1>Region Not Available</h1>
+    <p>We're sorry, but this store is not available in your region.</p>
+    <p>We do not ship to or serve customers in your area at this time.</p>
+    <div class="contact">
+      Questions? Contact us at <a href="mailto:info@designerwallcoverings.com">info@designerwallcoverings.com</a>
+    </div>
+  </div>
+
+
+</body>
+</html>
+{% break %}
+{% endif %}
+{% comment %}DW-CHINA-BLOCK-END{% endcomment %}
+
+<!doctype html>
+<html
+  class="
+    no-js
+    loading
+  "
+  lang="{{ request.locale.iso_code }}"
+>
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+
+  <!-- Preconnect Domains -->
+  <link rel="preconnect" href="https://cdn.shopify.com" crossorigin>
+  <link rel="preconnect" href="https://fonts.shopify.com" crossorigin>
+  <link rel="preconnect" href="https://monorail-edge.shopifysvc.com">
+
+  <!-- Preload Assets -->
+  <link rel="preload" href="{{ 'chiko-icons.woff' | asset_url }}" as="font" type="font/woff" crossorigin>
+  <link rel="preload" href="{{ 'pxu-social-icons.woff' | asset_url }}" as="font" type="font/woff" crossorigin>
+
+  <link rel="preload" href="{{ 'theme.css' | asset_url }}" as="style">
+
+  <link rel="preload" href="{{ 'modernizr-2.8.2.min.js' | asset_url  }}" as="script">
+
+  {% if template contains 'cart' %}
+    <link rel="preload" href="{{ '/services/javascripts/countries.js' }}" as="script">
+    <link rel="preload" href="{{ 'shopify_common.js' | shopify_asset_url }}" as="script">
+  {% endif %}
+
+  {% if template contains 'customers' %}
+    <link rel="preload" href="{{ 'shopify_common.js' | shopify_asset_url }}" as="script">
+    <link rel="preload" href="{{ 'customer_area.js' | shopify_asset_url }}" as="script">
+  {% endif %}
+
+  <link rel="preload" href="{{ 'grid.js' | asset_url }}" as="script">
+
+  <script src="//cdata.modernpostcard.com/js/E3CA4636CEDAD4.js" async defer></script>
+
+  <title>
+    {{ page_title }}
+
+    {% if current_tags %}
+      &#8211; {{ current_tags | join: ', ' }}
+    {% endif %}
+
+    {% if current_page != 1 %}
+      &#8211; {{ 'general.pagination.page' | t: page_number: current_page }}
+    {% endif %}
+
+    {% unless page_title contains shop.name %}
+      &#8211; {{ shop.name }}
+    {% endunless %}
+  </title>
+
+  {% if page_description %}
+    <meta name="description" content="{{ page_description | escape }}" />
+  {% endif %}
+
+  {% if settings.favicon %}
+    <link rel="shortcut icon" href="{{ settings.favicon | img_url: '32x32' }}" type="image/png" />
+  {% endif %}
+
+  {% if template contains 'collection' and current_tags %}
+    <meta name="robots" content="noindex" />
+    <link rel="canonical" href="{{ shop.url }}{{ collection.url }}" />
+  {% else %}
+    <link rel="canonical" href="{{ canonical_url }}" />
+  {% endif %}
+  <meta name="viewport" content="width=device-width,initial-scale=1" />
+
+  {%- render 'head.import-map' -%}
+  {%- render 'head.is-land' -%}
+
+  {% comment %}
+  {% render 'boost-sd-fallback' %}
+  {% endcomment %}
+    {{ content_for_header }}
+
+  {% liquid
+     assign heading_text_transform = 'none'
+     if settings.heading-font-small-caps
+       assign heading_text_transform = 'uppercase'
+     endif
+
+     assign button_text_transform = 'none'
+     assign button_letter_spacing = '0em'
+     if settings.button-font-small-caps
+       assign button_text_transform = 'uppercase'
+       assign button_letter_spacing = '0.05em'
+     endif
+  %}
+
+  <style>
+    :root {
+      /* ------------------------------------------------------------
+        Typography
+      ------------------------------------------------------------ */
+      /* Body */
+      --element-text-font-size--body-lg: 1.286rem; /* Product price */
+      --element-text-font-size--body-sm: var(--text-size-3-5); /* SKU, installments, variant labels */
+      --element-text-font-family--body: {{ settings.font_body.family }}, {{ settings.font_body.fallback_families }};
+      --element-text-font-weight--body: {{ settings.font_body.weight }};
+
+      /* Headings */
+      --element-text-font-size--heading-xl: 2.5rem; /* Product title */
+      --element-text-font-family--heading: {{ settings.font_heading.family }}, {{ settings.font_heading.fallback_families }};
+      --element-text-font-weight--heading: {{ settings.font_heading.weight }};
+      --element-text-line-height--heading: 1.25;
+      --element-text-text-transform--heading: {{ heading_text_transform }};
+
+      /* Buttons */
+      --element-button-font-family: {{ settings.font_button.family }}, {{ settings.font_button.fallback_families }};
+      --element-button-text-transform: {{ button_text_transform }};
+      --element-button-letter-spacing: {{ button_letter_spacing }};
+
+      /* ------------------------------------------------------------
+        Colors
+      ------------------------------------------------------------ */
+      --color-primary: {{ settings['body-text-color'] }}; 
+      --color-secondary: {{ settings['background-color'] }};
+      --root-color-primary: {{ settings['body-text-color'] }}; 
+      --root-color-secondary: {{ settings['background-color'] }};
+      --color-focus: #0000ff;
+
+      --color-sale-tag-text: {{ settings['background-color'] }};
+      --color-sale-tag: {{ settings['product-badge-background-color'] }};
+      
+      --element-button-color-primary: {{ settings['button-color'] }};
+      --element-button-color-secondary: {{ settings['accent-color'] }};
+      
+      --element-text-color: {{ settings['body-text-color'] }};
+      --element-text-color--heading: {{ settings['heading-color'] }};
+
+      --element-input-color-primary: {{ settings['form-select-color'] }};
+      --element-input-color-secondary: {{ settings['form-select-background'] }};
+
+      /* ------------------------------------------------------------
+        Other
+      ------------------------------------------------------------ */
+      --element-badge-radius: 2px;
+      --element-button-radius: 2px;
+
+      --layout-section-max-inline-size: 1260px;
+      --layout-section-padding-inline: 30px;
+    }
+
+    /* ------------------------------------------------------------
+      Component overrides
+    ------------------------------------------------------------ */
+
+    ::before,
+    ::after {
+      box-sizing: content-box;
+    }
+    product-hot-reload ::before,
+    product-hot-reload ::after {
+      box-sizing: border-box;
+    }
+
+    /* Lightbox */
+    .overlay-lightbox__overlay {
+      z-index: 9999;
+    }
+
+    /* Pick up */
+    .element-icon-in-stock {
+      fill: currentColor;
+    }
+
+    /* Divider */
+    hr.element-divider {
+      height: 0;
+      background: transparent;
+    }
+
+    /* Drawer */
+    overlay-drawer .element-button {
+      --element-button-color-primary: {{ settings.body-text-color }};
+      --element-icon-stroke-width: 3px;
+    }
+
+    /* Heading */
+    .element-text:is([class*=element-text--heading]) {
+      --_color: var(--element-text-color--heading);
+    }
+
+    /* Element Input */
+    .element-input {
+      --_color-box-shadow: {{ settings['form-select-border-color'] }};
+    }
+
+    /* Variant Labels */
+    label.element-text:is([class*=element-text--body]):where(.element-text--body-sm) {
+      color: {{ settings['heading-color'] }};
+      font-size: 1rem;
+
+      .element-text:first-child {
+        color: {{ settings['heading-color'] }};
+      }
+    }
+
+    /* Element Select */
+    element-select {
+      --color-primary: {{ settings['form-select-border-color'] }};
+      --element-button-color-primary: {{ settings['form-select-color'] }};
+      --element-button-color-secondary: {{ settings['form-select-background'] }};
+      --element-button-box-shadow: inset 0 0 0 1px {{ settings['form-select-border-color'] }};
+      --element-button-font-family: {{ settings.font_body.family }}, {{ settings.font_body.fallback_families }};
+      --element-button-text-transform: none;
+    }
+    element-select.element-select__wrapper--focused .element-button {
+      box-shadow: inset 0 0 0 var(--element-button-border-width--focus) var(--_color-focus);
+      border: none;
+    }
+
+    /* Media Gallery */
+    .media-gallery__thumb {
+      border-radius: 0;
+    }
+
+    /* ATC */
+
+    product-form .element-button[type="submit"] {
+      --element-button-padding-block: var(--size-5);
+      --_color-text: {{ settings['button-color'] }};
+      --_color-background: {{ settings['accent-color'] }};
+      --_box-shadow: none;
+
+      &:disabled {
+        color: #888888 !important;
+        background-color: #cccccc !important;
+      }
+    }
+
+    product-form:has(.element-button--shopify-payment-wrapper) .element-button[type="submit"] {
+      --element-button-color-primary: {{ settings['secondary-button-color'] }};
+      --element-button-color-secondary: {{ settings['secondary-button-background'] }};
+    }
+
+    .shopify-payment-button .shopify-payment-button__button.shopify-payment-button__button--unbranded,
+    .shopify-payment-button .shopify-payment-button__button {
+      --element-text-line-height--body-md: 1;
+      --element-button-color-primary: {{ settings['accent-color'] }};
+      --element-button-color-secondary: {{ settings['button-color'] }};
+      --element-button-padding-block: var(--size-5);
+      --_box-shadow: none;
+
+      text-transform: var(--element-button-text-transform);
+    }
+  </style>
+
+  {% assign x_handle = settings.social-x-link | split: 'x.com/' | last | split: 'twitter.com/' | last %}
+  {%
+    render 'social-meta-tags',
+    twitter_handle: x_handle,
+    default_image: page_image,
+  %}
+
+  <!-- Theme CSS -->
+  <link rel="stylesheet" href="{{ 'theme.css' | asset_url }}">
+  {% render 'dw-product-styles' %}
+  <link rel="stylesheet" href="{{ 'custom.css' | asset_url }}">
+  {% if settings.custom-css != blank %}
+    <style>
+      {{ settings.custom-css }}
+    </style>
+  {% endif %}
+
+  <!-- Theme object -->
+  {% comment %}Inject theme-object begin{% endcomment %}
+  <script>
+    var Theme = {};
+    Theme.version = "7.1.0";
+    Theme.name = 'Grid';
+  
+    Theme.currency = {{ shop.currency | json }};
+    Theme.moneyFormat = {{ shop.money_format | strip_html | json }};
+  
+    Theme.pleaseSelectText = "{{ 'general.general.please_select' | t | strip_newlines | escape }}";
+  
+    Theme.addToCartSuccess = "{{ 'products.product.success_html' | t: product: '**product**', cart_link: '**cart_link**', continue_link: '**continue_link**', checkout_link: '**checkout_link**' | strip_newlines | escape }}";
+  
+    {% if shop.customer_accounts_enabled and customer %}
+      Theme.customerLoggedIn = true;
+    {% endif %}
+  
+    Theme.shippingCalculator = true;
+    Theme.shippingButton = "{{ 'cart.shipping_calculator.submit' | t | strip_newlines | escape }}";
+    Theme.shippingDisabled = "{{ 'cart.shipping_calculator.disabled' | t | strip_newlines | escape }}";
+  
+    {% if shop.customer_accounts_enabled and customer and customer.default_address %}
+      Theme.customerAddress = {{ customer.default_address | json }};
+    {% endif %}
+  
+    Theme.shippingCalcErrorMessage = "{{ 'cart.shipping_calculator.error' | t | strip_newlines | replace: '"','\\"' }}";
+    Theme.shippingCalcMultiRates = "{{ 'cart.shipping_calculator.rates_html' | t | strip_newlines | replace: '"','\\"' }}";
+    Theme.shippingCalcOneRate = "{{ 'cart.shipping_calculator.rate' | t | strip_newlines | replace: '"','\\"' }}";
+    Theme.shippingCalcNoRates = "{{ 'cart.shipping_calculator.no_rates' | t | strip_newlines | replace: '"','\\"' }}";
+    Theme.shippingCalcRateValues = "{{ 'cart.shipping_calculator.rate_values_html' | t | strip_newlines | replace: '"','\\"' }}";
+  
+    Theme.routes = {
+      "root_url": "{{ routes.root_url }}",
+      "account_url": "{{ routes.account_url }}",
+      "account_login_url": "{{ routes.account_login_url }}",
+      "account_logout_url": "{{ routes.account_logout_url }}",
+      "account_register_url": "{{ routes.account_register_url }}",
+      "account_addresses_url": "{{ routes.account_addresses_url }}",
+      "collections_url": "{{ routes.collections_url }}",
+      "all_products_collection_url": "{{ routes.all_products_collection_url }}",
+      "search_url": "{{ routes.search_url }}",
+      "cart_url": "{{ routes.cart_url }}",
+      "cart_add_url": "{{ routes.cart_add_url }}",
+      "cart_change_url": "{{ routes.cart_change_url }}",
+      "cart_clear_url": "{{ routes.cart_clear_url }}",
+      "product_recommendations_url": "{{ routes.product_recommendations_url }}",
+      "predictive_search_url": "{{ routes.predictive_search_url }}",
+    };
+  </script>
+  {% comment %}Inject theme-object end{% endcomment %}
+
+  {% render 'jquery-snippet' %}
+  <script src="{{ 'custom.js' | asset_url }}" defer></script>
+
+  <script>
+    (function() {
+      document.documentElement.classList.remove('no-js');
+      window.addEventListener('DOMContentLoaded', function() {
+        document.documentElement.classList.remove('loading');
+      });
+      window.setTimeout(function() {
+        document.documentElement.classList.remove('loading');
+      }, 2000);
+
+      if (!window.MutationObserver || !window.MutationObserver.prototype) {
+        return;
+      }
+      var originalObserve = window.MutationObserver.prototype.observe;
+      window.MutationObserver.prototype.observe = function(target, options) {
+        if (!(target instanceof Node)) {
+          return;
+        }
+        return originalObserve.call(this, target, options);
+      };
+    })();
+  </script>
+
+<script src="{{ 'dw-grid-control.js' | asset_url }}" defer></script>
+
+
+
+
+
+
+
+
+
+
+
+<!-- DW: Price hiding script REMOVED 2026-03-24 -->
+
+<style>
+/* Belt-and-suspenders: CSS hide prices too */
+.boost-sd__product-price,
+.boost-sd__product-item [class*="price"],
+.boost-sd__product-item span[class*="money"],
+.boost-sd [class*="product-price"] {
+  display: none !important;
+  visibility: hidden !important;
+  opacity: 0 !important;
+  height: 0 !important;
+  font-size: 0 !important;
+  line-height: 0 !important;
+  position: absolute !important;
+  pointer-events: none !important;
+}
+/* Restore on product pages + cart */
+#shopify-section-product [class*="price"],
+#shopify-section-product span.money,
+.product-add-to-cart span.money,
+.shopify-product-form span.money,
+.mini-cart span.money,
+.cart span.money {
+  display: inline !important;
+  visibility: visible !important;
+  opacity: 1 !important;
+  height: auto !important;
+  font-size: inherit !important;
+  line-height: inherit !important;
+  position: static !important;
+  pointer-events: auto !important;
+}
+/* Square images */
+.boost-sd__product-item [class*="product-image"],
+.boost-sd__product-item [class*="image-wrapper"] {
+  aspect-ratio: 1/1 !important;
+  overflow: hidden !important;
+}
+.boost-sd__product-item img {
+  width: 100% !important;
+  height: 100% !important;
+  object-fit: cover !important;
+}
+/* Hide View As toggle */
+[class*="view-as"], [class*="viewAs"], .boost-sd__toolbar [class*="view"], .boost-sd [class*="toolbar-view"] {
+  display: none !important;
+}
+/* Hide View As toggle */
+[class*="view-as"],[class*="viewAs"],.boost-sd__toolbar [class*="view"],.boost-sd [class*="toolbar"] [class*="view"]{display:none!important}
+/* Center text */
+.boost-sd__product-item,
+.boost-sd__product-item [class*="title"],
+.boost-sd__product-item [class*="vendor"],
+.boost-sd__product-item p,
+.dw-vendor-link {
+  text-align: center !important;
+}
+</style>
+<!-- DW: killPrices REMOVED 2026-03-24 -->
+
+<!-- /DW -->
+
+{% comment %} DW: ItemList structured data for the Shop-by-Brand page (script tags are stripped from page body_html, so injected here) {% endcomment %}
+{% if page.handle == 'brands' %}{% render 'brands-jsonld' %}{% endif %}
+
+<!-- cache-bust: 2026-03-25T00:54:55.724677 -->
+</head>
+
+<body
+  class="
+    template-{{ template.name }}
+    template-suffix-{{ template.suffix }}
+
+    {% if customer %}
+      customer-logged-in
+    {% endif %}
+  "
+>
+
+  {%- comment -%}
+    ── China Region Block (added 2026-02-27) ──
+    Blocks visitors from CN country code with a full-screen overlay.
+  {%- endcomment -%}
+  {%- if localization.country.iso_code == 'CN' -%}
+    <div id="region-block" style="position:fixed;inset:0;z-index:999999;background:#ffffff;display:flex;align-items:center;justify-content:center;flex-direction:column;text-align:center;padding:40px;font-family:-apple-system,BlinkMacSystemFont,sans-serif;">
+      <h1 style="font-size:24px;color:#333;margin-bottom:16px;">This store is not available in your region</h1>
+      <p style="font-size:16px;color:#666;max-width:500px;">We apologize for the inconvenience, but this store does not currently serve customers in your region.</p>
+    </div>
+    <style>body{overflow:hidden !important;}</style>
+  {%- endif -%}
+
+  {% sections 'header-group' %}
+
+  <div style="--background-color: {{ settings.background-color }}">
+    {%
+      render 'age-gate',
+      id: 'page',
+      sections: content_for_layout,
+    %}
+  </div>
+
+  {% include 'quickshop' %}
+
+  {% comment %}Inject icon-star-symbol begin{% endcomment %}
+  <svg
+    class="icon-star-reference"
+    aria-hidden="true"
+    focusable="false"
+    role="presentation"
+    xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="3 3 17 17" fill="none"
+  >
+    <symbol id="icon-star">
+      <rect class="icon-star-background" width="20" height="20" fill="currentColor"/>
+      <path d="M10 3L12.163 7.60778L17 8.35121L13.5 11.9359L14.326 17L10 14.6078L5.674 17L6.5 11.9359L3 8.35121L7.837 7.60778L10 3Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
+    </symbol>
+    <clipPath id="icon-star-clip">
+      <path d="M10 3L12.163 7.60778L17 8.35121L13.5 11.9359L14.326 17L10 14.6078L5.674 17L6.5 11.9359L3 8.35121L7.837 7.60778L10 3Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+    </clipPath>
+  </svg>
+  {% comment %}Inject icon-star-symbol end{% endcomment %}
+
+  <div class="main-content">
+    {% render "dw-boost-overrides" %}
+{{ content_for_layout }}
+  </div>
+
+  <div class="site-overlay" data-site-overlay></div>
+
+  {% sections 'footer-group' %}
+
+  <!-- Scripts -->
+  <!-- Third Party JS Libraries -->
+  <script src="{{ 'modernizr-2.8.2.min.js' | asset_url  }}" defer></script>
+
+  {% if template contains 'cart' %}
+    <script src="{{ '/services/javascripts/countries.js' }}" defer></script>
+    <script src="{{ 'shopify_common.js' | shopify_asset_url }}" defer></script>
+  {% endif %}
+
+  {% if template contains 'customers' %}
+    <script src="{{ 'shopify_common.js' | shopify_asset_url }}" defer></script>
+    <script src="{{ 'customer_area.js' | shopify_asset_url }}" defer></script>
+  {% endif %}
+
+  <script src="{{ 'grid.js' | asset_url }}" defer></script>
+
+  {% comment %}Inject @pixelunion/shopify-structured-data/structured-data-article begin{% endcomment %}
+  {% comment %}
+    Article structured data
+    https://developers.google.com/search/docs/data-types/articles
+  {% endcomment %}
+  
+  {% if template contains 'article' %}
+    {%- capture article_description  -%}
+      {%- if article.excerpt != blank -%}
+        {{ article.excerpt | strip_html }}
+      {%- else -%}
+        {{ article.content | truncatewords: 100 | strip_html }}
+      {%- endif -%}
+    {%- endcapture -%}
+  
+    <script type="application/ld+json">
+      {
+        "@context": "http://schema.org",
+        "@type": "BlogPosting",
+        "mainEntityOfPage": {
+          "@type": "WebPage",
+          "@id": "{{ shop.url }}{{ article.url }}"
+        },
+        "headline": {{ article.title | json }},
+        {% if article.image %}
+          "image": {
+            "@type": "ImageObject",
+            "url": {{ article.image | img_url: '800x800' | prepend: 'https:' | json }},
+            "height": 800,
+            "width": 800
+          },
+        {% endif %}
+        "datePublished": {{ article.published_at | date: '%Y-%m-%dT%H:%M:%S%z' | json}},
+        "dateModified": {{ article.published_at | date: '%Y-%m-%dT%H:%M:%S%z' | json}},
+        "author": {
+          "@type": "Person",
+          "name": {{ article.author | json }}
+        },
+        "publisher": {
+          "@type": "Organization",
+          "name": {{ shop.name | json }},
+          "logo": {
+            "@type": "ImageObject",
+            "url": {{ article.user.image | img_url: '200x200' | prepend: 'https:' | json }}
+          }
+        },
+        "description": {{ article_description | json }}
+      }
+    </script>
+  {% endif %}
+  {% comment %}Inject @pixelunion/shopify-structured-data/structured-data-article end{% endcomment %}
+
+  {% comment %}Inject @pixelunion/shopify-structured-data/structured-data-breadcrumbs begin{% endcomment %}
+  {% comment %}
+    Breadcrumbs
+    https://developers.google.com/search/docs/data-types/breadcrumbs
+  {% endcomment %}
+  
+  {%- if current_tags -%}
+    {%- assign tag_names = current_tags | join: ', ' %}
+    {% comment %}Converting an array to a handle converts it to a string{% endcomment %}
+    {%- capture tag_handles -%}
+      {%- for tag in current_tags -%}
+        {{- tag | handle | append: '|' -}}
+      {%- endfor -%}
+    {%- endcapture -%}
+  {%- endif -%}
+  
+  {% if collection.url == blank %}
+    {% assign collection_url = '/collections/all' %}
+  {% else %}
+    {% assign collection_url = collection.url %}
+  {% endif %}
+  
+  {% if template.name == 'product'
+      or template.name == 'list-collections'
+      or template.name == 'collection'
+      or template.name == 'blog'
+      or template.name == 'article'
+      or template.name == 'search'
+      or template.name == 'cart'
+      or template.name == 'page'
+  %}
+  
+    <script type="application/ld+json">
+      {
+        "@context": "http://schema.org",
+        "@type": "BreadcrumbList",
+        "itemListElement": [
+        {% case template.name %}
+          {% when 'product' %}
+            {% if product.collections.size >= 1 %}
+              {
+                "@type": "ListItem",
+                "position": 1,
+                "item": {
+                  "@id": "{{ shop.url }}/collections",
+                  "name": {{ 'structured_data.breadcrumbs.collections' | t | json }}
+                }
+              },
+              {
+                "@type": "ListItem",
+                "position": 2,
+                "item": {
+                  "@id": "{{ shop.url }}/collections/{{ product.collections.first.handle }}",
+                  "name": {{ product.collections.first.title | json }}
+                }
+              },
+            {% else %}
+              {
+                "@type": "ListItem",
+                "position": 1,
+                "item": {
+                  "@id": "{{ shop.url }}/products",
+                  "name": {{ 'structured_data.breadcrumbs.products' | t | json }}
+                }
+              },
+            {% endif %}
+            {
+              "@type": "ListItem",
+              "position": {% if product.collections.size >= 1 %}3{% else %}2{% endif %},
+              "item": {
+                "@id": "{{ shop.url }}{{ product.url | within: collection }}",
+                "name": {{ product.title | json }}
+              }
+            }
+          {% when 'list-collections' %}
+            {
+              "@type": "ListItem",
+              "position": 1,
+              "item": {
+                "@id": "{{ shop.url }}/collections",
+                "name": {{ 'structured_data.breadcrumbs.collections' | t | json }}
+              }
+            }
+            {% if current_page != 1 %}
+              ,
+              {
+                "@type": "ListItem",
+                "position": 2,
+                "item": {
+                  "@id": "{{ shop.url }}/collections",
+                  "name": {{ 'structured_data.breadcrumbs.page' | t: page: current_page | json }}
+                }
+              }
+            {% endif %}
+          {% when 'collection' %}
+            {
+              "@type": "ListItem",
+              "position": 1,
+              "item": {
+                "@id": "{{ shop.url }}/collections",
+                "name": {{ 'structured_data.breadcrumbs.collections' | t | json }}
+              }
+            },
+            {
+              "@type": "ListItem",
+              "position": 2,
+              "item": {
+                "@id": "{{ shop.url }}{{ collection_url }}",
+                "name": {{ collection.title | json }}
+              }
+            }
+            {% if current_tags %}
+              ,
+              {
+                "@type": "ListItem",
+                "position": 3,
+                "item": {
+                  "@id": "{{ shop.url }}{{ collection_url }}/{{- tag_handles | split: '|' | join: '+' -}}",
+                  "name": {{ 'structured_data.breadcrumbs.tags_html' | t: tags: tag_names | json }}
+                }
+              }
+            {% endif %}
+            {% if current_page != 1 %}
+              {% if current_tags %}
+                {% assign position = 4 %}
+              {% else %}
+                {% assign position = 3 %}
+              {% endif %}
+              ,
+              {
+                "@type": "ListItem",
+                "position": {{ position }},
+                "item": {
+                  "@id": "{{ shop.url }}/collections?page={{ current_page }}",
+                  "name": {{ 'structured_data.breadcrumbs.page' | t: page: current_page | json }}
+                }
+              }
+            {% endif %}
+          {% when 'blog' or 'article' %}
+            {
+              "@type": "ListItem",
+              "position": 1,
+              "item": {
+                "@id": "{{ shop.url }}{{ blog.url }}",
+                "name": {{ blog.title | json }}
+              }
+            }
+            {% if template.name == 'article' %}
+              ,
+              {
+                "@type": "ListItem",
+                "position": 2,
+                "item": {
+                  "@id": "{{ shop.url }}{{ article.url }}",
+                  "name": {{ article.title | json }}
+                }
+              }
+            {% elsif current_tags %}
+              ,
+              {
+                "@type": "ListItem",
+                "position": 2,
+                "item": {
+                  "@id": "{{ shop.url }}{{ blog.url }}/tagged/{{- tag_handles | split: '|' | join: '+' -}}",
+                  "name": {{ 'structured_data.breadcrumbs.tags_html' | t: tags: tag_names | json }}
+                }
+              }
+            {% endif %}
+            {% if current_page != 1 %}
+              {% if current_tags %}
+                {% assign position = 3 %}
+                {%- capture url -%}
+                  {{ shop.url }}{{ blog.url }}/tagged/{{ tag_handles | split: '|' | join: '+' }}?page={{ current_page }}
+                {%- endcapture -%}
+              {% else %}
+                {% assign position = 2 %}
+                  {%- capture url -%}
+                  {{ shop.url }}{{ blog.url }}?page={{ current_page }}
+                {%- endcapture -%}
+              {% endif %}
+              ,
+              {
+                "@type": "ListItem",
+                "position": {{ position }},
+                "item": {
+                  "@id": "{{ url }}",
+                  "name": {{ 'structured_data.breadcrumbs.page' | t: page: current_page | json }}
+                }
+              }
+            {% endif %}
+          {% when 'search' %}
+            {
+              "@type": "ListItem",
+              "position": 1,
+              "item": {
+                "@id": "{{ shop.url }}/search",
+                "name": {{ 'structured_data.breadcrumbs.search' | t | json }}
+              }
+            }
+            {% if search.performed %}
+            ,
+              {
+                "@type": "ListItem",
+                "position": 2,
+                "item": {
+                  "@id": "{{ shop.url }}/search?q={{ search.terms }}",
+                  "name": {{ search.terms | json }}
+                }
+              }
+              {% if current_page != 1 %}
+              ,
+                {
+                  "@type": "ListItem",
+                  "position": 3,
+                  "item": {
+                    "@id": "{{ shop.url }}/search?page={{ current_page }}&q={{ search.terms }}",
+                    "name": {{ 'structured_data.breadcrumbs.page' | t: page: current_page | json }}
+                  }
+                }
+              {% endif %}
+            {% endif %}
+          {% when 'cart' %}
+            {
+              "@type": "ListItem",
+              "position": 1,
+              "item": {
+                "@id": "{{ shop.url }}/cart",
+                "name": {{ 'structured_data.breadcrumbs.cart' | t | json }}
+              }
+            }
+          {% when 'page' %}
+            {
+              "@type": "ListItem",
+              "position": 1,
+              "item": {
+                "@id": "{{ page.url }}",
+                "name": {{ page.title | json }}
+              }
+            }
+          {% else %}
+          {% endcase %}
+        ]
+      }
+    </script>
+  {% endif %}
+  {% comment %}Inject @pixelunion/shopify-structured-data/structured-data-breadcrumbs end{% endcomment %}
+
+  {% comment %}Inject @pixelunion/shopify-structured-data/structured-data-product begin{% endcomment %}
+  {% comment %}
+    Product structured data
+    https://developers.google.com/search/docs/data-types/products
+  {% endcomment %}
+  
+  {% if template contains 'product' %}
+    {% assign selected_variant = product.selected_or_first_available_variant | default: product.variants.first %}
+    {% assign product_image = selected_variant.featured_image | default: product.featured_image %}
+    {%- capture product_name -%}
+      {{ product.title }}
+      {%- if selected_variant.title != 'Default Title' and selected_variant.option1 == 'Default Title' -%}
+        - {{ selected_variant.title }}
+      {%- endif -%}
+    {%- endcapture -%}
+  
+    {%- assign now = 'now' | date: '%Y-%m-%d' | split: '-' -%}
+    {% capture year_from_now %}{{ now[0] | plus: 1 }}-{{ now[1] }}-{{ now[2] | at_most: 28 }}{% endcapture %}
+  
+    <script type="application/ld+json">
+    {
+      "@context": "http://schema.org/",
+      "@type": "Product",
+      "name": {{ product_name | strip_newlines | json }},
+      "image": {{ product_image | img_url: '1024x1024' | prepend: 'https:' | json }},
+      {% if product.description != blank %}
+        "description": {{ product.description | json }},
+      {% endif %}
+      {% if product.vendor %}
+        "brand": {
+          "@type": "Thing",
+          "name": {{ product.vendor | json }}
+        },
+      {% endif %}
+      {% if selected_variant.sku != blank %}
+        "sku": {{ selected_variant.sku | json }},
+      {% endif %}
+      {% if selected_variant.barcode != blank %}
+        "mpn": {{ selected_variant.barcode | json }},
+      {% endif %}
+      "offers": {
+        "@type": "Offer",
+        "priceCurrency": {{ cart.currency.iso_code | json }},
+        "price": {{ selected_variant.price | divided_by: 100.0 | json }},
+        "availability": "http://schema.org/{% if selected_variant.available %}InStock{% else %}OutOfStock{% endif %}",
+        "url": "{{ shop.url }}{{ selected_variant.url }}",
+        "seller": {
+          "@type": "Organization",
+          "name": {{ shop.name | json }}
+        },
+        "priceValidUntil": {{ year_from_now | json }}
+      }
+    }
+    </script>
+  {% endif %}
+  {% comment %}Inject @pixelunion/shopify-structured-data/structured-data-product end{% endcomment %}
+
+  {% comment %}Inject @pixelunion/shopify-structured-data/structured-data-website begin{% endcomment %}
+  {% comment %}
+    Store information
+    https://developers.google.com/search/docs/data-types/sitename
+  {% endcomment %}
+  
+  <script type="application/ld+json">
+    {
+      "@context": "http://schema.org",
+      "@type": "WebSite",
+      "name": "{{ shop.name }}",
+      "url": "{{ shop.url }}"
+    }
+  </script>
+  {% comment %}Inject @pixelunion/shopify-structured-data/structured-data-website end{% endcomment %}
+
+  <form id="checkout_form" action="{{ routes.cart_url }}" method="POST" style="display: none;"></form>
+
+  <script>
+    (function () {
+      function handleFirstTab(e) {
+        if (e.keyCode === 9) { // the "I am a keyboard user" key
+          document.body.classList.add('user-is-tabbing');
+          window.removeEventListener('keydown', handleFirstTab);
+        }
+      }
+      window.addEventListener('keydown', handleFirstTab);
+    })();
+  </script>
+  <script>(function(n, v) {/* eslint-disable-next-line max-len */if (window.Shopify && window.Shopify.theme && navigator && navigator.sendBeacon && window.Shopify.designMode) {if (sessionStorage.getItem('oots_beacon')) return;navigator.sendBeacon('https://app.outofthesandbox.com/beacon', new URLSearchParams({shop_domain: window.Shopify.shop.toLowerCase(),shop_id: '{{ shop.id }}',shop_email: '{{ shop.email }}',theme_name: n.toLowerCase(),theme_version: v.toLowerCase(),theme_store_id: window.Shopify.theme.theme_store_id,theme_id: window.Shopify.theme.id,theme_role: window.Shopify.theme.role,}));sessionStorage.setItem('oots_beacon', '');}}('grid','7.1.0'))</script>
+
+<!--Start of Zendesk Chat Script-->
+<script async>
+window.$zopim||(function(d,s){var z=$zopim=function(c){z._.push(c)},$=z.s=
+d.createElement(s),e=d.getElementsByTagName(s)[0];z.set=function(o){z.set.
+_.push(o)};z._=[];z.set._=[];$.async=!0;$.setAttribute("charset","utf-8");
+$.src="https://v2.zopim.com/?RH5Yjru86SIJRwOxfiMAf2DTCgdROhhf";z.t=+new Date;$.
+type="text/javascript";e.parentNode.insertBefore($,e)})(document,"script");
+</script>
+<!--End of Zendesk Chat Script-->
+<!-- Statcounter code for DW - Started 3/5/19
+http://DesignerWallcoverings.com on Shopify -->
+<script type="text/javascript">
+var sc_project=11961678; 
+var sc_invisible=1; 
+var sc_security="9d9a53bd"; 
+var sc_https=1; 
+</script>
+<script type="text/javascript"
+src="https://www.statcounter.com/counter/counter.js"
+async></script>
+<noscript><div class="statcounter"><a title="web statistics"
+href="https://statcounter.com/" target="_blank"><img
+class="statcounter"
+src="https://c.statcounter.com/11961678/0/9d9a53bd/1/"
+alt="web statistics"></a></div></noscript>
+<!-- End of Statcounter Code -->
+
+{% render 'hide-browse-hidden' %}
+
+<!-- DW: price restore band-aid removed 2026-06-11 — root cause (blank saw_variant_price) fixed in product-form-content.liquid; no price-hiding CSS exists. -->
+{%- comment -%} DW Shop-by-Color wheel {%- endcomment -%}
+<script>window.DW_CW_DATA="{{ 'dw-color-wheel-data.json' | asset_url }}";</script>
+<script src="{{ 'dw-color-wheel.js' | asset_url }}" defer></script>
+{%- comment -%} DW Phillip-Jeffries browse hide (stopgap) {%- endcomment -%}
+<script src="{{ 'dw-pj-hide.js' | asset_url }}" defer></script>
+{%- comment -%} DW card hover label: Pattern, Color + Vendor on hover (2026-06-22) {%- endcomment -%}
+<script src="{{ 'dw-card-hover.js' | asset_url }}" defer></script>
+</body>
+</html>
diff --git a/shopify/theme-infinite-scroll-142250278963/push-native-infinite-to-steves-v5.sh b/shopify/theme-infinite-scroll-142250278963/push-native-infinite-to-steves-v5.sh
index a2d3ce6e..beaeb344 100755
--- a/shopify/theme-infinite-scroll-142250278963/push-native-infinite-to-steves-v5.sh
+++ b/shopify/theme-infinite-scroll-142250278963/push-native-infinite-to-steves-v5.sh
@@ -41,6 +41,9 @@ FILES={
  "sections/collection-list.liquid":   "sections/collection-list.liquid",
  "sections/blog.liquid":              "sections/blog.liquid",
  "sections/blog-masonry.liquid":      "sections/blog-masonry.liquid",
+ "assets/boost-sd-custom.js":         "assets/boost-sd-custom.js",
+ "assets/dw-card-hover.js":           "assets/dw-card-hover.js",
+ "layout/theme.liquid":               "layout/theme.liquid",
 }
 os.makedirs("backups", exist_ok=True)
 stamp=datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
@@ -57,7 +60,7 @@ for lf,key in FILES.items():
     st=put(key,want)
     time.sleep(0.6)  # gentle rate
     ver=get(key)
-    ok = ver==want
+    ok = ver.replace("\r\n","\n").rstrip()==want.replace("\r\n","\n").rstrip()
     print(f"PUT   : {key} HTTP {st} verify={'OK' if ok else 'MISMATCH'} ({len(want)} bytes)")
     if not ok: print(f"  *** verify mismatch on {key} — investigate"); sys.exit(1)
 

← 2dc3a7fe auto-save: 2026-06-22T15:37:11 (67 files) — shopify/scripts/  ·  back to Designer Wallcoverings  ·  Tier B finalized: vendor-level write set (16,038 products) + 9cd6d0d0 →