{
  "version": 3,
  "sources": ["/cdn/shop/t/86/assets/shade-styler.js?ss_build=kara-ui-cleanup-v1-20260717"],
  "sourcesContent": ["/**\n * Shade Styler V2 \u2014 variants, overlays, fitter, height filter, inventory, configurable copy.\n */\n(function () {\n  var SHADE_STYLER_BUILD = 'kara-ui-cleanup-v1-20260717';\n  var LEGACY_CATALOG_ERROR_RE = /Shade Styler catalog API|shade-styler-catalog\\.liquid/i;\n\n  function removeLegacyCatalogErrors(root) {\n    var scope = root || document;\n    if (!scope.querySelectorAll) return;\n    Array.prototype.slice\n      .call(scope.querySelectorAll('.shade-styler__empty, .shade-styler__empty--error'))\n      .forEach(function (el) {\n        var text = el.textContent || '';\n        var parent = el.parentElement;\n        var cardsLoaded = !!(parent && parent.querySelector && parent.querySelector('.shade-styler-card'));\n        if (LEGACY_CATALOG_ERROR_RE.test(text) || (cardsLoaded && /Could not load/i.test(text))) {\n          el.remove();\n        }\n      });\n  }\n\n  function getJsonScript(selector) {\n    var el = document.querySelector(selector);\n    if (!el || !el.textContent) return null;\n    try {\n      return JSON.parse(el.textContent);\n    } catch (e) {\n      return null;\n    }\n  }\n\n  function getConfig() {\n    var c = getJsonScript('[data-shade-styler-config]');\n    if (!c) {\n      return {\n        stepChooseBase: 'Now select a lamp base to complete the pairing.',\n        stepChooseShade: 'First, select a lampshade.',\n        searchEnable: true,\n        searchEmptyBases: 'No lamp bases match this search.',\n        searchEmptyShades: 'No lampshades match this search.',\n        deepLinkLoadingText: 'Loading your selection\u2026',\n        shareCopiedText: 'Link copied.',\n        shareCopyFailedText: 'Press Ctrl+C to copy the link.',\n        shareEmailSubject: 'A lamp pairing from The Shade Shop',\n        shareEmailBody: 'I put this lamp base and lampshade together with the Shade Styler:',\n        moneyFormatNoCents: '',\n        cardVariantCountText: 'Available in [count] sizes',\n        cardPriceFromPrefix: 'From',\n        previewEmptySubtext: 'Your selections will appear here.',\n        stepPairingDone: 'A beautiful pairing!',\n        successAddedToCart: 'Added to cart!',\n        variantErrorMessage: 'Please choose valid options.',\n        scaleUsePhysicalDimensions: false,\n        scaleUseWidthRatio: true,\n        scaleUseHeightRatio: true,\n        scaleReferenceWidth: 16,\n        scaleReferenceHeight: 10,\n        previewBaseBodyWidthFraction: 0.9,\n        previewShadeBottomWidthFraction: 0.98,\n        previewShadeWidthTune: 1,\n        scaleMinFactor: 0.7,\n        scaleMaxFactor: 1.3,\n        scaleCurve: 'linear',\n        proportionFilterMode: 'hide_incompatible',\n        proportionTargetRatio: 2,\n        proportionWarnLow: 1.6,\n        proportionWarnHigh: 2.4,\n        proportionFilterMissing: 'hide',\n        proportionHardBlock: false,\n        proportionMessageOk: 'Balanced proportions for this pairing.',\n        proportionMessageWarn: 'This pairing is outside our typical proportion guide.',\n        proportionNeutralMessage: 'Add base width and shade bottom diameter metafields to enable proportion tips.',\n        fitterFilterMode: 'off',\n        heightFilterMode: 'hide_incompatible',\n        heightBandLow: 1.25,\n        heightBandHigh: 1.875,\n        heightFilterMissing: 'hide',\n        noCompatibleShadeSizes: 'No sizes for this lampshade match this lamp base.',\n        noCompatibleLampBases: 'No lamp bases match this lampshade.',\n        previewAutoFit: true,\n        previewFitPadding: 0.08,\n        inventoryOosSelectable: false,\n        bundleRedirectAfterAdd: 'stay',\n        catalogLazyLoad: true,\n        catalogSectionId: 'shade-styler-catalog',\n        catalogPerPage: 50,\n        catalogBackgroundDelayMs: 2500,\n        lampCollectionHandle: '',\n        shadeCollectionHandle: '',\n        finialCollectionHandle: '',\n        finialEnable: false,\n        finialSitsOnShade: true,\n        finialGapPercent: 2,\n        previewFinialHeightFraction: 0.92,\n        defaultOverlayTopFinial: '4%',\n        defaultOverlayLeftFinial: '50%',\n        defaultOverlayScaleFinial: 1,\n        finialEmptyMessage: 'No finials match this search.',\n        stepChooseFinial: 'Add a finial, or skip this step.',\n        discTag: '',\n        inventoryShowOos: true,\n        lampCatalogCount: 0,\n        shadeCatalogCount: 0,\n        emptyBasesMessage: 'No lamp bases in this collection.',\n        emptyShadesMessage: 'No lampshades in this collection.'\n      };\n    }\n    return c;\n  }\n\n  function getProducts() {\n    var d = getJsonScript('[data-shade-styler-products]');\n    if (!d || !d.lamps || !d.shades) return { lamps: [], shades: [], finials: [] };\n    if (!d.finials) d.finials = [];\n    return d;\n  }\n\n  function buildProductCard(card, cfg) {\n    cfg = cfg || {};\n    var article = document.createElement('article');\n    article.className = 'shade-styler-card';\n    article.setAttribute('data-product-id', String(card.productId));\n    article.setAttribute('data-product-handle', card.handle || '');\n    article.setAttribute('data-role', card.role || '');\n    article.setAttribute('data-variant-count', String(card.variantCount || 0));\n    article.setAttribute('data-sort-index', String(card.sortIndex || 0));\n    article.setAttribute('data-sort-title', card.sortTitle || '');\n    article.setAttribute('data-sort-price', String(card.sortPrice || 0));\n    article.setAttribute('data-sort-vendor', card.sortVendor || '');\n    article.setAttribute('data-collection-handles', card.collectionHandles || '');\n    article.setAttribute('data-tags', card.tags || '');\n    if (card.role === 'lamp_base') {\n      article.setAttribute('data-compatible-sizes', card.compatibleSizes || 'small,medium,large');\n    } else {\n      article.setAttribute('data-shade-size', card.shadeSize || 'medium');\n    }\n    article.tabIndex = 0;\n    article.setAttribute('role', 'button');\n\n    var imageWrap = document.createElement('div');\n    imageWrap.className = 'shade-styler-card__image';\n    if (card.image) {\n      var img = document.createElement('img');\n      img.src = card.image;\n      img.alt = card.title || '';\n      img.width = 200;\n      img.height = 200;\n      img.loading = 'lazy';\n      img.className = 'shade-styler-card__img';\n      imageWrap.appendChild(img);\n    }\n    var check = document.createElement('span');\n    check.className = 'shade-styler-card__check';\n    check.setAttribute('aria-hidden', 'true');\n    check.setAttribute('data-card-check', '');\n    check.style.display = 'none';\n    check.textContent = '\u2713';\n    imageWrap.appendChild(check);\n\n    var info = document.createElement('div');\n    info.className = 'shade-styler-card__info';\n    var title = document.createElement('h3');\n    title.className = 'shade-styler-card__title';\n    title.textContent = card.title || '';\n    info.appendChild(title);\n    var price = document.createElement('p');\n    price.className = 'shade-styler-card__price';\n    price.setAttribute('data-card-price', '');\n    price.textContent = formatCardPrice(card, cfg);\n    info.appendChild(price);\n    if (card.variantCount > 1) {\n      var hintText = String(cfg.cardVariantCountText == null ? 'Available in [count] sizes' : cfg.cardVariantCountText)\n        .replace(/\\[count\\]/gi, String(card.variantCount))\n        .trim();\n      if (hintText) {\n        var hint = document.createElement('p');\n        hint.className = 'shade-styler-card__options-hint';\n        hint.textContent = hintText;\n        info.appendChild(hint);\n      }\n    }\n\n    article.appendChild(imageWrap);\n    article.appendChild(info);\n    return article;\n  }\n\n  function createCatalogState(collectionTotal) {\n    return {\n      nextPage: 1,\n      totalPages: null,\n      loading: false,\n      loadedAny: false,\n      started: false,\n      collectionTotal: collectionTotal || 0,\n      backgroundTimer: null,\n      consecutiveFailures: 0\n    };\n  }\n\n  function applySectionDataConfig(cfg, section) {\n    if (!cfg) cfg = {};\n    if (!section || !section.dataset) return cfg;\n    var ds = section.dataset;\n    if (ds.lampCollectionHandle) cfg.lampCollectionHandle = ds.lampCollectionHandle;\n    if (ds.shadeCollectionHandle) cfg.shadeCollectionHandle = ds.shadeCollectionHandle;\n    if (ds.finialCollectionHandle) cfg.finialCollectionHandle = ds.finialCollectionHandle;\n    if (ds.lampCollectionId) cfg.lampCollectionId = parseInt(ds.lampCollectionId, 10) || 0;\n    if (ds.shadeCollectionId) cfg.shadeCollectionId = parseInt(ds.shadeCollectionId, 10) || 0;\n    if (ds.lampCatalogCount) cfg.lampCatalogCount = parseInt(ds.lampCatalogCount, 10) || 0;\n    if (ds.shadeCatalogCount) cfg.shadeCatalogCount = parseInt(ds.shadeCatalogCount, 10) || 0;\n    if (ds.catalogSectionId) cfg.catalogSectionId = ds.catalogSectionId;\n    return cfg;\n  }\n\n  function extractCatalogJsonString(raw) {\n    if (raw == null || raw === '') return null;\n    var text = String(raw).trim();\n    if (text.charAt(0) === '{') return text;\n    var start = text.indexOf('{');\n    var end = text.lastIndexOf('}');\n    if (start === -1 || end === -1 || end <= start) return null;\n    return text.slice(start, end + 1);\n  }\n\n  function normalizeCatalogPayload(payload) {\n    if (!payload || payload.page == null) return null;\n    var page = parseInt(payload.page, 10);\n    if (isNaN(page)) return null;\n    payload.page = page;\n    if (payload.pages != null) payload.pages = parseInt(payload.pages, 10) || 0;\n    if (payload.total != null) payload.total = parseInt(payload.total, 10) || 0;\n    if (!payload.items) payload.items = [];\n    return payload;\n  }\n\n  function parseCatalogResponse(text) {\n    if (!text || !text.trim()) return null;\n    var trimmed = text.trim().replace(/^\\uFEFF/, '');\n    try {\n      var outer = JSON.parse(trimmed);\n      if (outer && typeof outer === 'object' && !Array.isArray(outer)) {\n        var keys = Object.keys(outer);\n        var tryKeys = keys.filter(function (k) {\n          return k.indexOf('shade-styler-catalog') === 0 && outer[k];\n        });\n        if (!tryKeys.length) tryKeys = keys;\n        for (var i = 0; i < tryKeys.length; i++) {\n          try {\n            var jsonText = extractCatalogJsonString(outer[tryKeys[i]]);\n            if (!jsonText) continue;\n            var payload = normalizeCatalogPayload(JSON.parse(jsonText));\n            if (payload) return payload;\n          } catch (innerErr) {}\n        }\n      }\n    } catch (e1) {}\n    try {\n      var direct = extractCatalogJsonString(trimmed);\n      if (direct) return normalizeCatalogPayload(JSON.parse(direct));\n      return normalizeCatalogPayload(JSON.parse(trimmed));\n    } catch (e2) {\n      return null;\n    }\n  }\n\n  function catalogSectionIdForRole(role) {\n    if (role === 'lamp_base') return 'shade-styler-catalog-bases';\n    if (role === 'finial') return 'shade-styler-catalog-finials';\n    return 'shade-styler-catalog-shades';\n  }\n\n  function collectionHandleForRole(cfg, role) {\n    if (role === 'lamp_base') return cfg.lampCollectionHandle;\n    if (role === 'finial') return cfg.finialCollectionHandle;\n    return cfg.shadeCollectionHandle;\n  }\n\n  function buildCatalogUrl(cfg, role, page) {\n    var handle = collectionHandleForRole(cfg, role);\n    if (!handle) return '';\n    var params = new URLSearchParams();\n    params.set('sections', catalogSectionIdForRole(role));\n    params.set('page', String(page));\n    params.set('_', String(Date.now()));\n    return '/collections/' + encodeURIComponent(handle) + '?' + params.toString();\n  }\n\n  function fetchCatalogJson(url, timeoutMs) {\n    timeoutMs = timeoutMs || 15000;\n    var controller = typeof AbortController !== 'undefined' ? new AbortController() : null;\n    var timer = controller\n      ? setTimeout(function () { controller.abort(); }, timeoutMs)\n      : null;\n    var opts = {\n      cache: 'no-store',\n      credentials: 'same-origin',\n      headers: { Accept: 'application/json, text/plain, */*' }\n    };\n    if (controller) opts.signal = controller.signal;\n    return fetch(url, opts)\n      .then(function (res) {\n        if (!res.ok) return null;\n        return res.text();\n      })\n      .then(function (text) {\n        return parseCatalogResponse(text);\n      })\n      .catch(function () {\n        return null;\n      })\n      .finally(function () {\n        if (timer) clearTimeout(timer);\n      });\n  }\n\n  function fetchWithRetry(url, retries, delayMs) {\n    retries = retries || 3;\n    delayMs = delayMs || 1500;\n    return fetchCatalogJson(url).then(function (result) {\n      if (result) return result;\n      if (retries <= 1) return null;\n      return new Promise(function (resolve) {\n        setTimeout(function () {\n          resolve(fetchWithRetry(url, retries - 1, delayMs * 2));\n        }, delayMs);\n      });\n    });\n  }\n\n  function catalogBackgroundDelayMs(cfg) {\n    var ms = cfg.catalogBackgroundDelayMs;\n    if (ms == null || ms < 1000) return 2500;\n    if (ms > 5000) return 5000;\n    return ms;\n  }\n\n  function isDesignMode() {\n    return !!(window.Shopify && window.Shopify.designMode);\n  }\n\n  function initCatalogLoader(cfg, data, dom, onUpdate) {\n    onUpdate = onUpdate || function () {};\n    var catalogByRole = {\n      lamp_base: createCatalogState(cfg.lampCatalogCount || 0),\n      lampshade: createCatalogState(cfg.shadeCatalogCount || 0),\n      finial: createCatalogState(cfg.finialCatalogCount || 0)\n    };\n\n    function getGrid(role) {\n      if (role === 'lamp_base') return dom.gridBases;\n      if (role === 'finial') return dom.gridFinials;\n      return dom.gridShades;\n    }\n\n    function getListKey(role) {\n      if (role === 'lamp_base') return 'lamps';\n      if (role === 'finial') return 'finials';\n      return 'shades';\n    }\n\n    function removeCatalogStatus(grid, role) {\n      if (!grid) return;\n      var key = role === 'lamp_base' ? 'bases' : 'shades';\n      var status = grid.querySelector('[data-catalog-status=\"' + key + '\"]');\n      if (status) status.remove();\n    }\n\n    function showCatalogLoading(grid, role) {\n      if (!grid || grid.querySelector('.shade-styler-card')) return;\n      var key = role === 'lamp_base' ? 'bases' : 'shades';\n      var status = grid.querySelector('[data-catalog-status=\"' + key + '\"]');\n      if (status) {\n        status.hidden = false;\n        return;\n      }\n      status = document.createElement('p');\n      status.className = 'shade-styler__catalog-status';\n      status.setAttribute('data-catalog-status', key);\n      status.textContent = role === 'lamp_base' ? 'Loading lamp bases\u2026' : 'Loading lampshades\u2026';\n      grid.appendChild(status);\n    }\n\n    function showCatalogEmpty(grid, role, cfg) {\n      removeCatalogStatus(grid, role);\n      if (!grid || grid.querySelector('.shade-styler-card')) return;\n      var msg = document.createElement('p');\n      msg.className = 'shade-styler__empty';\n      msg.textContent =\n        role === 'lamp_base'\n          ? cfg.emptyBasesMessage || 'No lamp bases in this collection.'\n          : role === 'finial'\n            ? cfg.finialEmptyMessage || 'No finials match this search.'\n            : cfg.emptyShadesMessage || 'No lampshades in this collection.';\n      grid.appendChild(msg);\n    }\n\n    function setCatalogMore(grid, role, visible) {\n      if (!grid) return;\n      var key = role === 'lamp_base' ? 'bases' : 'shades';\n      var more = grid.querySelector('[data-catalog-more=\"' + key + '\"]');\n      if (!more && visible) {\n        more = document.createElement('p');\n        more.className = 'shade-styler__catalog-more';\n        more.setAttribute('data-catalog-more', key);\n        more.textContent = 'Loading more\u2026';\n        grid.appendChild(more);\n      }\n      if (more) more.hidden = !visible;\n    }\n\n    function ingestCatalogItems(items, role) {\n      var grid = getGrid(role);\n      var listKey = getListKey(role);\n      var seen = {};\n      data[listKey].forEach(function (p) {\n        seen[p.productId] = true;\n      });\n      var added = 0;\n      (items || []).forEach(function (item) {\n        if (!item || !item.product || !item.card) return;\n        var product = item.product;\n        if (seen[product.productId]) return;\n        data[listKey].push(product);\n        seen[product.productId] = true;\n        removeCatalogStatus(grid, role);\n        grid.appendChild(buildProductCard(item.card, cfg));\n        added += 1;\n      });\n      removeLegacyCatalogErrors(grid);\n      if (added) catalogByRole[role].loadedAny = true;\n      return added;\n    }\n\n    function showCatalogError(grid, role, cfg) {\n      removeCatalogStatus(grid, role);\n      removeLegacyCatalogErrors(grid);\n      if (!grid || grid.querySelector('.shade-styler-card')) return;\n      var msg = document.createElement('p');\n      msg.className = 'shade-styler__empty shade-styler__empty--error';\n      if (isDesignMode()) {\n        msg.className = 'shade-styler__empty';\n        msg.textContent = role === 'lamp_base'\n          ? 'Lamp bases will load on the live storefront. (Theme editor does not support catalog preview.)'\n          : 'Lampshades will load on the live storefront. (Theme editor does not support catalog preview.)';\n      } else {\n        msg.textContent =\n          role === 'lamp_base'\n            ? 'Could not load lamp bases. Re-upload assets/shade-styler.js, then hard-refresh (Ctrl+Shift+R). In Network, requests should go to /collections/lamp-bases?sections=shade-styler-catalog-bases'\n            : 'Could not load lampshades. Re-upload assets/shade-styler.js, then hard-refresh (Ctrl+Shift+R). In Network, requests should go to /collections/\u2026?sections=shade-styler-catalog-shades';\n      }\n      grid.appendChild(msg);\n    }\n\n    function stopCatalog(role) {\n      var cs = catalogByRole[role];\n      clearBackgroundTimer(role);\n      if (cs.totalPages == null) cs.totalPages = Math.max(0, cs.nextPage - 1);\n    }\n\n    function fetchCatalogPage(role, done) {\n      done = done || function () {};\n      var cs = catalogByRole[role];\n      if (cs.loading) {\n        done(false);\n        return;\n      }\n      if (cs.totalPages !== null && cs.nextPage > cs.totalPages) {\n        done(true);\n        return;\n      }\n\n      var handle = collectionHandleForRole(cfg, role);\n      if (!handle) {\n        showCatalogEmpty(getGrid(role), role, cfg);\n        stopCatalog(role);\n        done(true);\n        return;\n      }\n\n      var pageFetched = cs.nextPage;\n      cs.loading = true;\n      setCatalogMore(getGrid(role), role, true);\n\n      var url = buildCatalogUrl(cfg, role, pageFetched);\n      var useRetry = pageFetched === 1;\n      var fetchFn = useRetry ? fetchWithRetry(url, 3, 1500) : fetchCatalogJson(url);\n\n      fetchFn\n        .then(function (payload) {\n          payload = normalizeCatalogPayload(payload);\n          if (!payload) {\n            cs.consecutiveFailures += 1;\n            if (cs.consecutiveFailures >= 3) {\n              stopCatalog(role);\n              showCatalogError(getGrid(role), role, cfg);\n            }\n            return false;\n          }\n\n          cs.consecutiveFailures = 0;\n          cs.totalPages = payload.pages || 0;\n          if (payload.total != null) cs.collectionTotal = payload.total;\n          ingestCatalogItems(payload.items, role);\n          cs.nextPage = pageFetched + 1;\n\n          var expectedCount = role === 'lamp_base' ? (cfg.lampCatalogCount || 0) : (cfg.shadeCatalogCount || 0);\n          if (pageFetched === 1 && expectedCount > 0 && payload.total === 0) {\n            // Retry once more with a fresh cache-bust before giving up\n            cs.loading = false;\n            var retryUrl = buildCatalogUrl(cfg, role, 1);\n            return fetchWithRetry(retryUrl, 2, 2000).then(function (retryPayload) {\n              retryPayload = normalizeCatalogPayload(retryPayload);\n              if (retryPayload && retryPayload.total > 0) {\n                cs.totalPages = retryPayload.pages || 0;\n                cs.collectionTotal = retryPayload.total;\n                ingestCatalogItems(retryPayload.items, role);\n                cs.nextPage = 2;\n                return true;\n              }\n              stopCatalog(role);\n              showCatalogError(getGrid(role), role, cfg);\n              return false;\n            });\n          }\n\n          if (!cs.loadedAny && cs.totalPages === 0) {\n            showCatalogEmpty(getGrid(role), role, cfg);\n          } else if (cs.totalPages > 0 && cs.nextPage > cs.totalPages && !getGrid(role).querySelector('.shade-styler-card')) {\n            showCatalogEmpty(getGrid(role), role, cfg);\n          }\n          return true;\n        })\n        .finally(function () {\n          cs.loading = false;\n          setCatalogMore(getGrid(role), role, false);\n          onUpdate();\n          done(cs.nextPage > pageFetched);\n        });\n    }\n\n    function isComplete(role) {\n      var cs = catalogByRole[role];\n      return cs.totalPages !== null && cs.nextPage > cs.totalPages && !cs.loading;\n    }\n\n    function clearBackgroundTimer(role) {\n      var cs = catalogByRole[role];\n      if (cs.backgroundTimer) {\n        window.clearTimeout(cs.backgroundTimer);\n        cs.backgroundTimer = null;\n      }\n    }\n\n    function pumpBackgroundCatalog(role, delayMs) {\n      var cs = catalogByRole[role];\n      clearBackgroundTimer(role);\n      if (isComplete(role)) return;\n      delayMs = delayMs || catalogBackgroundDelayMs(cfg);\n      cs.backgroundTimer = window.setTimeout(function () {\n        cs.backgroundTimer = null;\n        fetchCatalogPage(role, function (advanced) {\n          if (isComplete(role)) return;\n          var nextDelay = advanced ? catalogBackgroundDelayMs(cfg) : Math.min(delayMs * 2, 10000);\n          pumpBackgroundCatalog(role, nextDelay);\n        });\n      }, delayMs);\n    }\n\n    function startBackgroundCatalog(role) {\n      if (isComplete(role)) return;\n      pumpBackgroundCatalog(role);\n    }\n\n    function showDesignModePlaceholder(grid, role) {\n      removeCatalogStatus(grid, role);\n      if (grid.querySelector('.shade-styler__empty')) return;\n      var msg = document.createElement('p');\n      msg.className = 'shade-styler__empty';\n      msg.textContent = role === 'lamp_base'\n        ? 'Lamp bases will load on the live storefront. (Theme editor does not support catalog preview.)'\n        : 'Lampshades will load on the live storefront. (Theme editor does not support catalog preview.)';\n      grid.appendChild(msg);\n    }\n\n    function ensureStarted(role) {\n      var cs = catalogByRole[role];\n      if (cs.started) return;\n      cs.started = true;\n      if (isDesignMode()) {\n        showDesignModePlaceholder(getGrid(role), role);\n        cs.totalPages = 0;\n        return;\n      }\n      showCatalogLoading(getGrid(role), role);\n      fetchCatalogPage(role, function () {\n        startBackgroundCatalog(role);\n      });\n    }\n\n    function accelerate(role) {\n      ensureStarted(role);\n      if (isComplete(role) || catalogByRole[role].loading) return;\n      clearBackgroundTimer(role);\n      fetchCatalogPage(role, function (advanced) {\n        if (!isComplete(role)) pumpBackgroundCatalog(role, advanced ? catalogBackgroundDelayMs(cfg) : 500);\n      });\n    }\n\n    // Load lampshades immediately (default tab); defer lamp bases until that tab is opened.\n    ensureStarted('lampshade');\n\n    function getCollectionTotal(role) {\n      return catalogByRole[role].collectionTotal || 0;\n    }\n\n    function setCollectionTotal(role, total) {\n      if (total > 0) catalogByRole[role].collectionTotal = total;\n    }\n\n    return {\n      fetchPage: fetchCatalogPage,\n      isComplete: isComplete,\n      isStarted: function (role) {\n        return !!catalogByRole[role].started;\n      },\n      ensureStarted: ensureStarted,\n      getCollectionTotal: getCollectionTotal,\n      setCollectionTotal: setCollectionTotal,\n      accelerate: accelerate\n    };\n  }\n\n  function findSection(root) {\n    return root.querySelector('[data-shade-styler]') || document.querySelector('[data-shade-styler]');\n  }\n\n  function num(v) {\n    if (v == null || v === '') return null;\n    var n = parseFloat(v, 10);\n    return isNaN(n) ? null : n;\n  }\n\n  function getProductById(list, id) {\n    return list.find(function (p) { return p.productId === id; }) || null;\n  }\n\n  function optionCount(product) {\n    return (product.optionsWithValues || []).length;\n  }\n\n  function variantOptionValues(v, n) {\n    var o = [v.option1, v.option2, v.option3];\n    return o.slice(0, n);\n  }\n\n  function findVariant(product, selected) {\n    var n = optionCount(product);\n    if (!n) return product.variants[0] || null;\n    return (\n      product.variants.find(function (v) {\n        var vals = variantOptionValues(v, n);\n        for (var i = 0; i < n; i++) {\n          var a = (vals[i] || '').toString().trim().toLowerCase();\n          var b = (selected[i] || '').toString().trim().toLowerCase();\n          if (a !== b) return false;\n        }\n        return true;\n      }) || null\n    );\n  }\n\n  function defaultVariant(product, cfg) {\n    var pool = pickerEligibleVariants(product, cfg);\n    if (!pool.length) pool = product.variants || [];\n    var pick = pool.find(function (v) {\n      return v.available || cfg.inventoryOosSelectable;\n    });\n    return pick || pool[0] || null;\n  }\n\n  function getBaseFitterAllowList(product, variant) {\n    var list = (product.compatibleFitters || []).map(function (x) {\n      return String(x).toLowerCase();\n    });\n    if (list.length) return list;\n    var ft = (variant && variant.fitterType) || product.productFitterType || '';\n    return ft ? [String(ft).toLowerCase()] : [];\n  }\n\n  function shadeVariantPassesFitterFilter(shadeVar, allowed, cfg) {\n    if (cfg.fitterFilterMode !== 'hide_incompatible' || !allowed.length) return true;\n    var sft = (shadeVar.fitterType || '').toLowerCase();\n    if (!sft) return true;\n    return allowed.indexOf(sft) !== -1;\n  }\n\n  function shadeVariantPassesSizeBucket(shadeVar, compatibleSizes, baseSelected) {\n    if (!baseSelected || !compatibleSizes || !compatibleSizes.length) return true;\n    var sz = (shadeVar.shadeSize || 'medium').toLowerCase();\n    return compatibleSizes.some(function (s) {\n      return String(s).toLowerCase() === sz;\n    });\n  }\n\n  function shadeVerticalHeight(shadeVar) {\n    var explicit = num(shadeVar.shadeHeight);\n    if (explicit != null && explicit > 0) return explicit;\n\n    var slant = num(shadeVar.shadeSideLength);\n    if (slant == null || slant <= 0) return null;\n\n    var top = num(shadeVar.shadeTopDiameter) || 0;\n    var bottom = num(shadeVar.shadeBottomDiameter) || 0;\n    var dr = bottom / 2 - top / 2;\n    var inner = slant * slant - dr * dr;\n    if (inner <= 0) return null;\n    return Math.sqrt(inner);\n  }\n\n  function shadeVariantHasPickerDimensions(shadeVar) {\n    var explicit = num(shadeVar.shadeHeight);\n    if (explicit != null && explicit > 0) return true;\n\n    var slant = num(shadeVar.shadeSideLength);\n    var top = num(shadeVar.shadeTopDiameter);\n    var bottom = num(shadeVar.shadeBottomDiameter);\n    return (\n      slant != null && slant > 0 &&\n      top != null && top > 0 &&\n      bottom != null && bottom > 0\n    );\n  }\n\n  function baseVariantHasPickerDimensions(baseVar) {\n    var h = num(baseVar.heightToSocket);\n    return h != null && h > 0;\n  }\n\n  function variantEligibleForPicker(variant, role) {\n    if (role === 'lampshade') return shadeVariantHasPickerDimensions(variant);\n    if (role === 'lamp_base') return baseVariantHasPickerDimensions(variant);\n    return true;\n  }\n\n  function pickerEligibleVariants(product, cfg) {\n    if (!product || !product.variants) return [];\n    return product.variants.filter(function (v) {\n      if (!v.available && !cfg.inventoryOosSelectable) return false;\n      return variantEligibleForPicker(v, product.role);\n    });\n  }\n\n  function shadeVariantPassesHeightFilter(shadeVar, baseVar, cfg, baseP) {\n    // Recommended-diameter override: skip the height band when the base product\n    // specifies an exact shade bottom diameter to pair with.\n    if (baseUsesRecommendedShadeDiameter(baseP)) return true;\n\n    if (cfg.heightFilterMode === 'off') return true;\n\n    var baseH = num(baseVar.heightToSocket);\n    if (baseH == null || baseH <= 0) return true;\n\n    var divLow = num(cfg.heightBandLow);\n    var divHigh = num(cfg.heightBandHigh);\n    if (divLow == null || divLow <= 0) divLow = 1.25;\n    if (divHigh == null || divHigh <= 0) divHigh = 1.875;\n\n    var minShadeH = baseH / divHigh;\n    var maxShadeH = baseH / divLow;\n    var shadeH = shadeVerticalHeight(shadeVar);\n\n    if (shadeH == null) return cfg.heightFilterMissing !== 'hide';\n    return shadeH >= minShadeH && shadeH <= maxShadeH;\n  }\n\n  function widthProportionRatio(shadeVar, baseVar) {\n    var shadeW = num(shadeVar.shadeBottomDiameter);\n    var baseW = num(baseVar.baseBodyWidth);\n    if (shadeW == null || shadeW <= 0 || baseW == null || baseW <= 0) return null;\n    return shadeW / baseW;\n  }\n\n  function shadeVariantPassesWidthFilter(shadeVar, baseVar, cfg, baseP) {\n    // Recommended-diameter override: skip the global width-ratio band when the\n    // base product specifies an exact shade bottom diameter to pair with.\n    if (baseUsesRecommendedShadeDiameter(baseP)) return true;\n\n    if (cfg.proportionFilterMode === 'off') return true;\n\n    var ratio = widthProportionRatio(shadeVar, baseVar);\n    if (ratio == null) return cfg.proportionFilterMissing !== 'hide';\n\n    var lo = num(cfg.proportionWarnLow);\n    var hi = num(cfg.proportionWarnHigh);\n    if (lo == null || lo <= 0) lo = 1.6;\n    if (hi == null || hi <= 0) hi = 2.4;\n    return ratio >= lo && ratio <= hi;\n  }\n\n  function parseRecommendedDiameterInput(raw) {\n    if (raw == null || raw === '') return [];\n    if (typeof raw === 'number') {\n      var only = num(raw);\n      return only != null && only > 0 ? [only] : [];\n    }\n    if (Array.isArray(raw)) {\n      var fromList = [];\n      raw.forEach(function (item) {\n        var n = num(item);\n        if (n != null && n > 0 && isFinite(n)) fromList.push(n);\n      });\n      return fromList;\n    }\n    if (typeof raw === 'string') {\n      // Supports \"16,18\" or \"16|18\" when the metafield is Single line text.\n      return raw\n        .split(/[,;|]/)\n        .map(function (part) {\n          return num(String(part).trim());\n        })\n        .filter(function (n) {\n          return n != null && n > 0 && isFinite(n);\n        });\n    }\n    return [];\n  }\n\n  function baseRecommendedShadeBottomDiameters(baseP) {\n    if (!baseP) return [];\n    var out = [];\n    var seen = {};\n\n    function add(d) {\n      var n = num(d);\n      if (n == null || n <= 0 || !isFinite(n)) return;\n      var key = String(Math.round(n * 100));\n      if (seen[key]) return;\n      seen[key] = true;\n      out.push(n);\n    }\n\n    // recommendedShadeBottomDiameters: one list metafield, 1 or many values (e.g. [14] or [16,18]).\n    parseRecommendedDiameterInput(baseP.recommendedShadeBottomDiameters).forEach(add);\n\n    out.sort(function (a, b) {\n      return a - b;\n    });\n    return out;\n  }\n\n  function baseUsesRecommendedShadeDiameter(baseP) {\n    return baseRecommendedShadeBottomDiameters(baseP).length > 0;\n  }\n\n  function shadeBottomDiameterMatchesRecommended(shadeVar, recommendedList) {\n    var shadeD = num(shadeVar.shadeBottomDiameter);\n    if (shadeD == null || shadeD <= 0 || !recommendedList || !recommendedList.length) return false;\n    // Exact inch match against any recommended value; tolerate minor decimal formatting.\n    return recommendedList.some(function (rec) {\n      return Math.abs(shadeD - rec) < 0.05;\n    });\n  }\n\n  function shadeDistanceToRecommended(shadeD, recommendedList) {\n    if (shadeD == null || !recommendedList || !recommendedList.length) return Infinity;\n    return recommendedList.reduce(function (min, rec) {\n      return Math.min(min, Math.abs(shadeD - rec));\n    }, Infinity);\n  }\n\n  function pickShadeVariantForBase(compatible, baseP, cfg) {\n    if (!compatible.length) return null;\n\n    var recommended = baseRecommendedShadeBottomDiameters(baseP);\n    var pool = compatible;\n\n    if (recommended.length) {\n      // When multiple sizes qualify, prefer the one closest to any recommended diameter.\n      pool = compatible.slice().sort(function (a, b) {\n        var da = shadeDistanceToRecommended(num(a.shadeBottomDiameter), recommended);\n        var db = shadeDistanceToRecommended(num(b.shadeBottomDiameter), recommended);\n        if (da !== db) return da - db;\n        if (a.available !== b.available) return a.available ? -1 : 1;\n        return 0;\n      });\n    }\n\n    var pick = pool.find(function (v) {\n      return v.available || cfg.inventoryOosSelectable;\n    });\n    return pick || pool[0];\n  }\n\n  function evaluateWidthProportion(baseVar, shadeVar, cfg, baseP) {\n    if (!baseVar || !shadeVar) return { status: 'none' };\n\n    // Recommended-diameter override replaces width-ratio guidance for this base.\n    if (baseUsesRecommendedShadeDiameter(baseP)) {\n      var recommended = baseRecommendedShadeBottomDiameters(baseP);\n      if (shadeBottomDiameterMatchesRecommended(shadeVar, recommended)) {\n        return {\n          status: 'ok',\n          message: cfg.proportionMessageOk || 'Balanced proportions for this pairing.',\n          ratio: null\n        };\n      }\n      return {\n        status: 'warn',\n        message: cfg.proportionMessageWarn || 'This pairing is outside our typical proportion guide.',\n        ratio: null\n      };\n    }\n\n    var ratio = widthProportionRatio(shadeVar, baseVar);\n    if (ratio == null) {\n      return {\n        status: 'neutral',\n        message: cfg.proportionNeutralMessage || 'Add base width and shade bottom diameter metafields to enable proportion tips.',\n        ratio: null\n      };\n    }\n    var lo = num(cfg.proportionWarnLow);\n    var hi = num(cfg.proportionWarnHigh);\n    if (lo == null || lo <= 0) lo = 1.6;\n    if (hi == null || hi <= 0) hi = 2.4;\n    if (ratio >= lo && ratio <= hi) {\n      return {\n        status: 'ok',\n        message: cfg.proportionMessageOk || 'Balanced proportions for this pairing.',\n        ratio: ratio\n      };\n    }\n    return {\n      status: 'warn',\n      message: cfg.proportionMessageWarn || 'This pairing is outside our typical proportion guide.',\n      ratio: ratio\n    };\n  }\n\n  function getCompatibleShadeVariants(shadeProduct, baseP, baseV, cfg) {\n    if (!shadeProduct || !shadeProduct.variants) return [];\n    var baseSelected = !!(baseP && baseV);\n    var compatibleSizes = baseP && baseP.shadeSizeCompatibility ? baseP.shadeSizeCompatibility : null;\n    var allowed = baseP && baseV ? getBaseFitterAllowList(baseP, baseV) : [];\n    var useRecommended = baseUsesRecommendedShadeDiameter(baseP);\n    var recommended = useRecommended ? baseRecommendedShadeBottomDiameters(baseP) : [];\n\n    return shadeProduct.variants.filter(function (v) {\n      if (!shadeVariantHasPickerDimensions(v)) return false;\n      if (!v.available && !cfg.inventoryOosSelectable) return false;\n      if (!shadeVariantPassesSizeBucket(v, compatibleSizes, baseSelected)) return false;\n      if (!shadeVariantPassesFitterFilter(v, allowed, cfg)) return false;\n\n      if (useRecommended) {\n        // Override path: only shade variants whose bottom diameter matches any\n        // recommended value on the base product. Height and width-ratio bands are skipped.\n        return shadeBottomDiameterMatchesRecommended(v, recommended);\n      }\n\n      // Default path: apply height band and global width-ratio band.\n      if (baseV && !shadeVariantPassesHeightFilter(v, baseV, cfg, baseP)) return false;\n      if (baseV && !shadeVariantPassesWidthFilter(v, baseV, cfg, baseP)) return false;\n      return true;\n    });\n  }\n\n  function shadeProductHasCompatibleVariants(shadeProduct, baseP, baseV, cfg) {\n    if (!pickerEligibleVariants(shadeProduct, cfg).length) return false;\n    if (!baseP || !baseV) return true;\n    return getCompatibleShadeVariants(shadeProduct, baseP, baseV, cfg).length > 0;\n  }\n\n  /**\n   * True when this base variant pairs with the given shade variant, using the\n   * same rules as getCompatibleShadeVariants (recommended bottom diameter\n   * override first, otherwise size bucket / fitter / height / width bands).\n   */\n  function baseVariantFitsShadeVariant(baseP, baseV, shadeP, shadeV, cfg) {\n    if (!shadeV) return false;\n    return getCompatibleShadeVariants(shadeP, baseP, baseV, cfg).some(function (v) {\n      return v.id === shadeV.id;\n    });\n  }\n\n  /**\n   * Reverse of shadeProductHasCompatibleVariants: shade-first flow.\n   * Mirrors the base-first rule exactly \u2014 the shopper's selection is pinned to\n   * the chosen variant (so a base's recommended shade bottom diameter is\n   * matched against the shade size actually selected), and the other product\n   * shows when any one of its own variants fits.\n   */\n  function baseProductHasCompatibleVariants(baseProduct, shadeP, shadeV, cfg) {\n    var baseVariants = pickerEligibleVariants(baseProduct, cfg);\n    if (!baseVariants.length) return false;\n    if (!shadeP) return true;\n    return baseVariants.some(function (bv) {\n      // No shade size resolved yet: fall back to \"any size of this shade fits\".\n      if (!shadeV) return getCompatibleShadeVariants(shadeP, baseProduct, bv, cfg).length > 0;\n      return baseVariantFitsShadeVariant(baseProduct, bv, shadeP, shadeV, cfg);\n    });\n  }\n\n  function clampScaleFactor(raw, cfg) {\n    var lo = num(cfg.scaleMinFactor) != null ? cfg.scaleMinFactor : 0.7;\n    var hi = num(cfg.scaleMaxFactor) != null ? cfg.scaleMaxFactor : 1.3;\n    return Math.max(lo, Math.min(hi, raw));\n  }\n\n  function physicalShadeWidthScale(shadeVar, cfg) {\n    if (!cfg.scaleUsePhysicalDimensions) return 1;\n    var d = num(shadeVar.shadeBottomDiameter);\n    var ref = num(cfg.scaleReferenceWidth);\n    if (d == null || ref == null || ref <= 0) return 1;\n    var raw = d / ref;\n    if (cfg.scaleCurve === 'log') raw = Math.pow(Math.max(0.01, d) / Math.max(0.01, ref), 0.75);\n    return clampScaleFactor(raw, cfg);\n  }\n\n  function physicalShadeHeightScale(shadeVar, cfg) {\n    if (!cfg.scaleUsePhysicalDimensions) return 1;\n    var h = shadeVerticalHeight(shadeVar);\n    var ref = num(cfg.scaleReferenceHeight);\n    if (ref == null || ref <= 0) ref = 10;\n    if (h == null || h <= 0) return physicalShadeWidthScale(shadeVar, cfg);\n    var raw = h / ref;\n    if (cfg.scaleCurve === 'log') raw = Math.pow(Math.max(0.01, h) / Math.max(0.01, ref), 0.75);\n    return clampScaleFactor(raw, cfg);\n  }\n\n  function physicalBaseHeightScale(baseVar, cfg) {\n    if (!cfg.scaleUsePhysicalDimensions || !baseVar) return 1;\n    var h = num(baseVar.heightToSocket);\n    var ref = num(cfg.scaleReferenceHeight);\n    if (ref == null || ref <= 0) ref = 10;\n    ref = ref * 2;\n    if (h == null || h <= 0) return 1;\n    return clampScaleFactor(h / ref, cfg);\n  }\n\n  function physicalScaleFactor(shadeVar, cfg) {\n    return physicalShadeWidthScale(shadeVar, cfg);\n  }\n\n  function fractionSetting(value, fallback) {\n    var f = num(value);\n    if (f == null || f <= 0) return fallback;\n    if (f > 1) return 1;\n    return f;\n  }\n\n  /**\n   * Scales the base + shade layers so the composite matches real proportions.\n   *\n   * The store's preview PNGs are all sized consistently (bases share a pixel\n   * height, shades share a pixel width) and drawn at true product proportions.\n   * That means we don't need to guess: we measure each layer's on-screen size\n   * at scale 1, convert to pixels-per-inch using the width metafields, and set\n   * the shade scale so both layers render at the same pixels-per-inch. When the\n   * pixels-per-inch match, every dimension (including the width ratio) is\n   * automatically correct.\n   *\n   * The only adjustable inputs are how much of each PNG the actual object fills\n   * (to absorb transparent padding around the artwork).\n   *\n   * NOTE: callers must set both layers to scale 1 and clear the group transform\n   * before calling, so the measured rectangles are stable and comparable.\n   */\n  function getPreviewLayerScales(baseVar, shadeVar, cfg, dom) {\n    var shadeScale = physicalShadeHeightScale(shadeVar, cfg);\n    var baseScale = physicalBaseHeightScale(baseVar, cfg);\n\n    if (\n      !cfg.scaleUsePhysicalDimensions ||\n      !baseVar ||\n      !shadeVar ||\n      !dom ||\n      !dom.previewBaseImg ||\n      !dom.previewShadeImg ||\n      dom.previewBaseImg.style.display === 'none' ||\n      dom.previewShadeImg.style.display === 'none' ||\n      cfg.scaleUseWidthRatio === false\n    ) {\n      return { base: baseScale, shade: shadeScale };\n    }\n\n    var baseWidthIn = num(baseVar.baseBodyWidth);\n    var shadeBottomIn = num(shadeVar.shadeBottomDiameter);\n    if (baseWidthIn == null || baseWidthIn <= 0 || shadeBottomIn == null || shadeBottomIn <= 0) {\n      return { base: baseScale, shade: shadeScale };\n    }\n\n    var baseRect = dom.previewBaseImg.getBoundingClientRect();\n    var shadeRect = dom.previewShadeImg.getBoundingClientRect();\n    if (baseRect.width <= 0 || shadeRect.width <= 0) {\n      return { base: baseScale, shade: shadeScale };\n    }\n\n    var baseFrac = fractionSetting(cfg.previewBaseBodyWidthFraction, 0.9);\n    var shadeFrac = fractionSetting(cfg.previewShadeBottomWidthFraction, 0.98);\n    var tune = num(cfg.previewShadeWidthTune);\n    if (tune == null || tune <= 0) tune = 1;\n\n    // Pixels-per-inch for each layer at scale 1 (base anchored at scale 1).\n    var ppiBase = (baseRect.width * baseFrac) / baseWidthIn;\n    var ppiShade = (shadeRect.width * shadeFrac) / shadeBottomIn;\n    if (ppiShade <= 0) return { base: 1, shade: shadeScale };\n\n    var computedShade = (ppiBase / ppiShade) * tune;\n    if (!isFinite(computedShade) || computedShade <= 0) computedShade = shadeScale;\n    // Guard against absurd values from bad metafields; auto-fit handles overall size.\n    computedShade = Math.max(0.1, Math.min(8, computedShade));\n\n    return { base: 1, shade: computedShade };\n  }\n\n  /**\n   * Whole-dollar price for the styler UI (cards, pairing details, pairing total).\n   * Uses the shop's own money format with the no-decimal token when available so\n   * non-USD shops keep their symbol and separators.\n   */\n  function formatMoneyNoCents(cents, cfg) {\n    var fmt = cfg && cfg.moneyFormatNoCents;\n    if (fmt && typeof Shopify !== 'undefined' && Shopify.formatMoney) {\n      try {\n        return Shopify.formatMoney(cents, fmt);\n      } catch (e) {}\n    }\n    var dollars = Math.round((cents || 0) / 100);\n    return '$' + String(dollars).replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n  }\n\n  /**\n   * Card price line: \"From $300\" when the product has more than one price,\n   * plain \"$300\" when it does not. Never shows cents (per 8.4.26 edits).\n   */\n  function formatCardPrice(card, cfg) {\n    var min = card.priceMin;\n    var max = card.priceMax;\n    if (typeof min !== 'number') return card.formattedSinglePrice || '';\n    var price = formatMoneyNoCents(min, cfg);\n    var varies = card.priceVaries || (typeof max === 'number' && max !== min);\n    if (!varies) return price;\n    var prefix = String(cfg.cardPriceFromPrefix == null ? 'From' : cfg.cardPriceFromPrefix).trim();\n    return prefix ? prefix + ' ' + price : price;\n  }\n\n  function applyLayerTransform(imgEl, overlay, extraScale, options) {\n    if (!imgEl) return;\n    extraScale = extraScale == null ? 1 : extraScale;\n    options = options || {};\n    var anchor = options.anchor || 'center';\n    var o = overlay || {};\n    var sc = (parseFloat(String(o.scale), 10) || 1) * extraScale;\n    var rot = parseFloat(String(o.rotate), 10) || 0;\n    imgEl.style.top = o.top || '50%';\n    imgEl.style.left = o.left || '50%';\n    // Bottom-anchored shades must scale from the bottom edge; otherwise\n    // physical scale pulls the rim away from the base and leaves a visible gap.\n    if (anchor === 'bottom') {\n      imgEl.style.transformOrigin = '50% 100%';\n      imgEl.style.transform =\n        'translate(-50%, -100%) scale(' + sc + ') rotate(' + rot + 'deg)';\n    } else {\n      imgEl.style.transformOrigin = '50% 50%';\n      imgEl.style.transform =\n        'translate(-50%, -50%) scale(' + sc + ') rotate(' + rot + 'deg)';\n    }\n  }\n\n  function getImageAnchorInContainer(imgEl, containerEl, edge) {\n    if (!imgEl || !containerEl || imgEl.style.display === 'none') return null;\n    var imgRect = imgEl.getBoundingClientRect();\n    var containerRect = containerEl.getBoundingClientRect();\n    if (!containerRect.height || !containerRect.width) return null;\n\n    var y;\n    if (edge === 'bottom') y = imgRect.bottom;\n    else if (edge === 'center') y = imgRect.top + imgRect.height / 2;\n    else y = imgRect.top;\n\n    return {\n      topPct: ((y - containerRect.top) / containerRect.height) * 100,\n      leftPct: ((imgRect.left + imgRect.width / 2 - containerRect.left) / containerRect.width) * 100\n    };\n  }\n\n  function init() {\n    var section = findSection(document);\n    if (!section) return;\n    removeLegacyCatalogErrors(section);\n    if (section.getAttribute('data-shade-styler-build') === SHADE_STYLER_BUILD) return;\n    section.setAttribute('data-shade-styler-build', SHADE_STYLER_BUILD);\n\n    var data = getProducts();\n    var cfg = applySectionDataConfig(getConfig(), section);\n    var addToCartInFlight = false;\n\n    var state = {\n      baseProduct: null,\n      baseVariant: null,\n      shadeProduct: null,\n      shadeVariant: null,\n      finialProduct: null,\n      finialVariant: null,\n      lastVariantOosRole: null,\n      lastVariantOosTitle: null,\n      hasOosSelection: false,\n      activeTab: 'shades',\n      baseCollectionFilter: '',\n      shadeCollectionFilter: '',\n      baseColorFilter: '',\n      shadeColorFilter: '',\n      baseSearch: '',\n      shadeSearch: '',\n      basesPage: 1,\n      shadesPage: 1,\n      finialsPage: 1,\n      finialCollectionFilter: '',\n      finialColorFilter: '',\n      finialSearch: '',\n      basesPageSize: 50,\n      shadesPageSize: 50,\n      basesSort: 'default',\n      shadesSort: 'default'\n    };\n\n    var dom = {\n      previewPlaceholder: section.querySelector('[data-preview-placeholder]'),\n      previewInner: section.querySelector('.shade-styler__preview-inner'),\n      previewGroup: section.querySelector('[data-preview-group]'),\n      previewBase: section.querySelector('[data-preview-base]'),\n      previewBaseImg: section.querySelector('[data-preview-base-img]'),\n      previewShade: section.querySelector('[data-preview-shade]'),\n      previewShadeImg: section.querySelector('[data-preview-shade-img]'),\n      detailBaseValue: section.querySelector('[data-detail-base-value]'),\n      detailBasePrice: section.querySelector('[data-detail-base-price]'),\n      detailBaseLink: section.querySelector('[data-detail-base-link]'),\n      detailShadeValue: section.querySelector('[data-detail-shade-value]'),\n      detailShadePrice: section.querySelector('[data-detail-shade-price]'),\n      detailShadeLink: section.querySelector('[data-detail-shade-link]'),\n      stepInstruction: section.querySelector('[data-step-instruction]'),\n      pairingTotalWrap: section.querySelector('[data-pairing-total-wrap]'),\n      pairingTotal: section.querySelector('[data-pairing-total]'),\n      detailShade: section.querySelector('[data-detail-shade]'),\n      detailBase: section.querySelector('[data-detail-base]'),\n      detailFinial: section.querySelector('[data-detail-finial]'),\n      detailFinialValue: section.querySelector('[data-detail-finial-value]'),\n      detailFinialPrice: section.querySelector('[data-detail-finial-price]'),\n      detailFinialLink: section.querySelector('[data-detail-finial-link]'),\n      gridFinials: section.querySelector('[data-grid-finials]'),\n      previewFinial: section.querySelector('[data-preview-finial]'),\n      previewFinialImg: section.querySelector('[data-preview-finial-img]'),\n      shopPairingBtn: section.querySelector('[data-shop-pairing]'),\n      shareWrap: section.querySelector('[data-share-wrap]'),\n      pdfWrap: section.querySelector('[data-pdf-wrap]'),\n      shareToggle: section.querySelector('[data-share-toggle]'),\n      sharePanel: section.querySelector('[data-share-panel]'),\n      shareUrl: section.querySelector('[data-share-url]'),\n      shareEmail: section.querySelector('[data-share-email]'),\n      shareFeedback: section.querySelector('[data-share-feedback]'),\n      errorMessage: section.querySelector('[data-error-message]'),\n      successMessage: section.querySelector('[data-success-message]'),\n      gridShades: section.querySelector('[data-grid-shades]'),\n      gridBases: section.querySelector('[data-grid-bases]'),\n      filterBases: section.querySelector('[data-collection-filter=\"bases\"]'),\n      filterShades: section.querySelector('[data-collection-filter=\"shades\"]'),\n      colorFilter: section.querySelector('[data-color-filter]'),\n      searchFilter: section.querySelector('[data-search-filter]'),\n      gridToolbar: section.querySelector('[data-grid-toolbar]'),\n      pagePrev: section.querySelector('[data-page-prev]'),\n      pageNext: section.querySelector('[data-page-next]'),\n      pageInfo: section.querySelector('[data-page-info]'),\n      pageRange: section.querySelector('[data-page-range]'),\n      gridSort: section.querySelector('[data-grid-sort]'),\n      tabs: section.querySelectorAll('[data-tab]'),\n      panels: section.querySelectorAll('[data-panel]'),\n      slotBase: section.querySelector('[data-variant-slot=\"base\"]'),\n      slotShade: section.querySelector('[data-variant-slot=\"shade\"]'),\n      slotFinial: section.querySelector('[data-variant-slot=\"finial\"]')\n    };\n\n    function positionShadeOnBase() {\n      var base = state.baseVariant;\n      var shade = state.shadeVariant;\n\n      // Reset both layers to a neutral scale so getPreviewLayerScales measures a\n      // stable, comparable rectangle (no accumulated transform from prior calls).\n      if (base && base.previewImage && dom.previewBaseImg) {\n        applyLayerTransform(dom.previewBaseImg, base.overlay, 1, { anchor: 'center' });\n      }\n      if (shade && shade.previewImage && dom.previewShadeImg) {\n        applyLayerTransform(dom.previewShadeImg, shade.overlay, 1, { anchor: 'center' });\n      }\n\n      var scales = getPreviewLayerScales(base, shade, cfg, dom);\n\n      if (base && base.previewImage && dom.previewBaseImg) {\n        applyLayerTransform(dom.previewBaseImg, base.overlay, scales.base, { anchor: 'center' });\n      }\n\n      if (!dom.previewShadeImg || !shade || !shade.previewImage) return;\n\n      var overlay = Object.assign({}, shade.overlay || {});\n\n      if (base && base.previewImage && dom.previewBaseImg && dom.previewGroup) {\n        var baseTop = getImageAnchorInContainer(dom.previewBaseImg, dom.previewGroup, 'top');\n        if (baseTop) {\n          overlay.top = baseTop.topPct + '%';\n          overlay.left = baseTop.leftPct + '%';\n          applyLayerTransform(dom.previewShadeImg, overlay, scales.shade, { anchor: 'bottom' });\n          return;\n        }\n      }\n\n      applyLayerTransform(dom.previewShadeImg, overlay, scales.shade, { anchor: 'center' });\n    }\n\n    /**\n     * Places the finial above the shade.\n     *\n     * The shade's own layer is already positioned by the time this runs, so the\n     * finial reads the shade's rendered top edge and anchors its bottom there.\n     * That keeps it following whatever shade is chosen rather than sitting at a\n     * fixed point. It screws onto the harp rather than resting on the fabric, so\n     * a small gap is left above the shade.\n     *\n     * The scale puts the finial at the shade's pixels-per-inch, from its\n     * finial_height (or finial_width), so a 3in finial and a 6in one differ on\n     * screen the way they do on the table.\n     */\n    function positionFinialOnShade() {\n      var finial = state.finialVariant;\n      if (!dom.previewFinialImg) return;\n\n      if (!finial || !finial.previewImage) {\n        dom.previewFinialImg.style.display = 'none';\n        return;\n      }\n\n      dom.previewFinialImg.style.display = '';\n\n      // Neutral pass first, so the measurement below is not read through a\n      // transform left over from the previous selection. The overlay scale is\n      // held at 1 here so it is applied once, on the final pass, not twice.\n      var neutralOverlay = Object.assign({}, finial.overlay || {}, { scale: 1 });\n      applyLayerTransform(dom.previewFinialImg, neutralOverlay, 1, { anchor: 'center' });\n\n      var shadeShowing = dom.previewShadeImg && dom.previewShadeImg.style.display !== 'none';\n      var scale = getFinialPhysicalScale(finial, state.shadeVariant, shadeShowing);\n      if (scale == null) scale = getFinialScale(finial, state.shadeVariant, cfg);\n      var overlay = Object.assign({}, finial.overlay || {});\n\n      if (cfg.finialSitsOnShade !== false && shadeShowing && dom.previewGroup) {\n        var shadeTop = getImageAnchorInContainer(dom.previewShadeImg, dom.previewGroup, 'top');\n        if (shadeTop) {\n          var gap = parseFloat(cfg.finialGapPercent);\n          if (!isFinite(gap)) gap = 2;\n          // Per product nudge, on top of the shared gap. Negative raises it.\n          var nudge = parseFloat(finial.finialOffset);\n          if (!isFinite(nudge)) nudge = 0;\n          overlay.top = shadeTop.topPct - gap + nudge + '%';\n          overlay.left = shadeTop.leftPct + '%';\n          applyLayerTransform(dom.previewFinialImg, overlay, scale, { anchor: 'bottom' });\n          return;\n        }\n      }\n\n      applyLayerTransform(dom.previewFinialImg, overlay, scale, { anchor: 'center' });\n    }\n\n    /**\n     * Renders the finial at the same pixels-per-inch as the shade it sits on,\n     * so the same finial looks large on a small shade and small on a wide one,\n     * as it does in the shop.\n     *\n     * The shade's pixels-per-inch is read from its rendered width against its\n     * bottom diameter, the same measurement that matches the shade to the base.\n     * The finial's comes from its height at scale 1 (its width when no height\n     * is recorded). Returns null when either side is missing, and the caller\n     * falls back to the reference-height scale.\n     */\n    function getFinialPhysicalScale(finial, shade, shadeShowing) {\n      if (cfg.scaleUsePhysicalDimensions === false) return null;\n      if (!shadeShowing || !shade || !dom.previewShadeImg) return null;\n\n      var shadeBottomIn = num(shade.shadeBottomDiameter);\n      if (shadeBottomIn == null || shadeBottomIn <= 0) return null;\n\n      var shadeRect = dom.previewShadeImg.getBoundingClientRect();\n      var finialRect = dom.previewFinialImg.getBoundingClientRect();\n      if (shadeRect.width <= 0 || finialRect.width <= 0 || finialRect.height <= 0) return null;\n\n      var shadeFrac = fractionSetting(cfg.previewShadeBottomWidthFraction, 0.98);\n      var ppiShade = (shadeRect.width * shadeFrac) / shadeBottomIn;\n\n      var ppiFinial = null;\n      var heightIn = num(finial.finialHeight);\n      var widthIn = num(finial.finialWidth);\n      if (heightIn != null && heightIn > 0) {\n        var fill = fractionSetting(cfg.previewFinialHeightFraction, 1);\n        ppiFinial = (finialRect.height * fill) / heightIn;\n      } else if (widthIn != null && widthIn > 0) {\n        ppiFinial = finialRect.width / widthIn;\n      }\n      if (ppiFinial == null || ppiFinial <= 0) return null;\n\n      var scale = ppiShade / ppiFinial;\n      if (!isFinite(scale) || scale <= 0) return null;\n      // Guard against absurd values from bad metafields.\n      return Math.max(0.02, Math.min(20, scale));\n    }\n\n    /**\n     * Fallback when there is no shade to measure against: a finial as tall as\n     * the reference height renders at 1. Falls back to the overlay scale when no height is recorded,\n     * though the catalogue keeps those out of the picker in the first place.\n     */\n    function getFinialScale(finial, shade, cfg) {\n      var height = parseFloat(finial && finial.finialHeight);\n      if (!isFinite(height) || height <= 0) return 1;\n      if (cfg.scaleUsePhysicalDimensions === false) return 1;\n\n      var reference = parseFloat(cfg.scaleReferenceHeight);\n      if (!isFinite(reference) || reference <= 0) reference = 10;\n\n      var factor = height / reference;\n      var min = parseFloat(cfg.scaleMinFactor);\n      var max = parseFloat(cfg.scaleMaxFactor);\n      if (isFinite(min) && factor < min) factor = min;\n      if (isFinite(max) && factor > max) factor = max;\n\n      // How much of the PNG's height the finial itself occupies. A tight crop\n      // leaves this at 1 and the division is a no-op.\n      var fill = parseFloat(cfg.previewFinialHeightFraction);\n      if (isFinite(fill) && fill > 0) factor = factor / fill;\n      return factor;\n    }\n\n    function resetPreviewGroupTransform() {\n      if (!dom.previewGroup) return;\n      dom.previewGroup.style.transformOrigin = '0 0';\n      dom.previewGroup.style.transform = 'none';\n    }\n\n    function applyLegacyPreviewShift() {\n      if (!dom.previewGroup) return;\n      var shift = section.style.getPropertyValue('--shade-styler-preview-shift') || '18%';\n      dom.previewGroup.style.transformOrigin = '';\n      dom.previewGroup.style.transform = 'translateY(' + shift.trim() + ')';\n    }\n\n    function fitPreviewToContainer() {\n      if (!dom.previewGroup || !dom.previewInner) return;\n\n      if (cfg.previewAutoFit === false) {\n        applyLegacyPreviewShift();\n        return;\n      }\n\n      resetPreviewGroupTransform();\n\n      var imgs = [];\n      if (dom.previewBaseImg && dom.previewBaseImg.style.display !== 'none') imgs.push(dom.previewBaseImg);\n      if (dom.previewShadeImg && dom.previewShadeImg.style.display !== 'none') imgs.push(dom.previewShadeImg);\n      if (dom.previewFinialImg && dom.previewFinialImg.style.display !== 'none') imgs.push(dom.previewFinialImg);\n\n      if (!imgs.length) {\n        resetPreviewGroupTransform();\n        return;\n      }\n\n      var containerRect = dom.previewInner.getBoundingClientRect();\n      if (!containerRect.width || !containerRect.height) return;\n\n      var pad = num(cfg.previewFitPadding);\n      if (pad == null || pad < 0) pad = 0.08;\n      if (pad > 0.4) pad = 0.4;\n\n      var minX = Infinity;\n      var minY = Infinity;\n      var maxX = -Infinity;\n      var maxY = -Infinity;\n\n      imgs.forEach(function (img) {\n        var r = img.getBoundingClientRect();\n        minX = Math.min(minX, r.left);\n        minY = Math.min(minY, r.top);\n        maxX = Math.max(maxX, r.right);\n        maxY = Math.max(maxY, r.bottom);\n      });\n\n      var unionW = maxX - minX;\n      var unionH = maxY - minY;\n      if (unionW <= 0 || unionH <= 0) return;\n\n      var relMinX = minX - containerRect.left;\n      var relMinY = minY - containerRect.top;\n      var availW = containerRect.width * (1 - 2 * pad);\n      var availH = containerRect.height * (1 - 2 * pad);\n      var scale = Math.min(1, availW / unionW, availH / unionH);\n\n      var tx = (containerRect.width - unionW * scale) / 2 - relMinX * scale;\n      var ty = (containerRect.height - unionH * scale) / 2 - relMinY * scale;\n\n      dom.previewGroup.style.transformOrigin = '0 0';\n      dom.previewGroup.style.transform = 'translate(' + tx + 'px, ' + ty + 'px) scale(' + scale + ')';\n    }\n\n    var reflowPreviewTimer = null;\n\n    function whenPreviewImagesReady(done) {\n      done = done || function () {};\n      var base = state.baseVariant;\n      var shade = state.shadeVariant;\n      var imgs = [];\n\n      if (base && base.previewImage && dom.previewBaseImg) imgs.push(dom.previewBaseImg);\n      if (shade && shade.previewImage && dom.previewShadeImg) imgs.push(dom.previewShadeImg);\n      var finialV = state.finialVariant;\n      if (finialV && finialV.previewImage && dom.previewFinialImg) imgs.push(dom.previewFinialImg);\n\n      if (!imgs.length) {\n        done();\n        return;\n      }\n\n      function isReady(img) {\n        return !!(img && img.complete && img.naturalWidth > 0 && img.naturalHeight > 0);\n      }\n\n      function allReady() {\n        return imgs.every(isReady);\n      }\n\n      function finish() {\n        window.requestAnimationFrame(function () {\n          window.requestAnimationFrame(done);\n        });\n      }\n\n      function waitForImg(img) {\n        if (isReady(img)) return Promise.resolve();\n        return new Promise(function (resolve) {\n          var expected = img.src;\n          function doneOne() {\n            if (img.src !== expected) return;\n            resolve();\n          }\n          img.addEventListener('load', doneOne, { once: true });\n          img.addEventListener('error', doneOne, { once: true });\n        });\n      }\n\n      Promise.all(\n        imgs.map(function (img) {\n          return waitForImg(img).then(function () {\n            if (img.decode) return img.decode().catch(function () {});\n          });\n        })\n      ).then(finish);\n    }\n\n    function scheduleReflowPreview() {\n      whenPreviewImagesReady(function () {\n        if (reflowPreviewTimer) window.cancelAnimationFrame(reflowPreviewTimer);\n        reflowPreviewTimer = window.requestAnimationFrame(function () {\n          reflowPreviewTimer = null;\n          reflowPreview();\n        });\n      });\n    }\n\n    function reflowPreview() {\n      resetPreviewGroupTransform();\n      positionShadeOnBase();\n      // After the shade, so it can measure where the shade actually landed.\n      positionFinialOnShade();\n      fitPreviewToContainer();\n    }\n\n    function setPreview() {\n      var base = state.baseVariant;\n      var shade = state.shadeVariant;\n      var showPlaceholder = !base && !shade;\n      if (dom.previewPlaceholder) dom.previewPlaceholder.style.display = showPlaceholder ? '' : 'none';\n\n      if (dom.previewBaseImg) {\n        if (base && base.previewImage) {\n          dom.previewBaseImg.src = base.previewImage;\n          dom.previewBaseImg.alt = (state.baseProduct && state.baseProduct.title) || '';\n          dom.previewBaseImg.style.display = '';\n          if (dom.previewBase) dom.previewBase.style.display = '';\n        } else {\n          dom.previewBaseImg.style.display = 'none';\n          if (dom.previewBase) dom.previewBase.style.display = base ? '' : 'none';\n        }\n      }\n\n      if (dom.previewShadeImg) {\n        if (shade && shade.previewImage) {\n          dom.previewShadeImg.src = shade.previewImage;\n          dom.previewShadeImg.alt = (state.shadeProduct && state.shadeProduct.title) || '';\n          dom.previewShadeImg.style.display = '';\n          if (dom.previewShade) dom.previewShade.style.display = '';\n        } else {\n          dom.previewShadeImg.style.display = 'none';\n          if (dom.previewShade) dom.previewShade.style.display = shade ? '' : 'none';\n        }\n      }\n\n      // The finial's source is set here rather than when it is positioned, so it\n      // is already loading by the time the group is measured. Left to the reflow\n      // it had no height yet, the fit sized the box for the lamp alone and the\n      // finial spilled off the top.\n      var finial = state.finialVariant;\n      if (dom.previewFinialImg) {\n        if (finial && finial.previewImage) {\n          if (dom.previewFinialImg.getAttribute('src') !== finial.previewImage) {\n            dom.previewFinialImg.src = finial.previewImage;\n          }\n          dom.previewFinialImg.alt = (state.finialProduct && state.finialProduct.title) || '';\n          dom.previewFinialImg.style.display = '';\n          if (dom.previewFinial) dom.previewFinial.style.display = '';\n        } else {\n          dom.previewFinialImg.style.display = 'none';\n          if (dom.previewFinial) dom.previewFinial.style.display = 'none';\n        }\n      }\n\n      if (!base && !shade) {\n        resetPreviewGroupTransform();\n      } else if ((base && base.previewImage) || (shade && shade.previewImage)) {\n        scheduleReflowPreview();\n      }\n    }\n\n    function clearSlot(el) {\n      if (!el) return;\n      el.innerHTML = '';\n      el.hidden = true;\n    }\n\n    function defaultShadeVariant(product) {\n      if (!product) return null;\n      if (state.baseProduct && state.baseVariant) {\n        var compatible = getCompatibleShadeVariants(product, state.baseProduct, state.baseVariant, cfg);\n        if (!compatible.length) return null;\n        return pickShadeVariantForBase(compatible, state.baseProduct, cfg);\n      }\n      return defaultVariant(product, cfg);\n    }\n\n    /**\n     * Mirror of defaultShadeVariant for the shade-first flow: when a shade is\n     * already picked, land on a base variant that actually pairs with it rather\n     * than the first available one, which may be an incompatible size.\n     */\n    function defaultBaseVariant(product) {\n      if (!product) return null;\n      var shadeP = state.shadeProduct;\n      var shadeV = state.shadeVariant;\n      if (shadeP) {\n        var pool = pickerEligibleVariants(product, cfg);\n        // Prefer a base variant that keeps the shade size the shopper already chose.\n        var fits = pool.filter(function (bv) {\n          return shadeV\n            ? baseVariantFitsShadeVariant(product, bv, shadeP, shadeV, cfg)\n            : getCompatibleShadeVariants(shadeP, product, bv, cfg).length > 0;\n        });\n        if (!fits.length && shadeV) {\n          fits = pool.filter(function (bv) {\n            return getCompatibleShadeVariants(shadeP, product, bv, cfg).length > 0;\n          });\n        }\n        if (fits.length) {\n          return fits.find(function (v) {\n            return v.available || cfg.inventoryOosSelectable;\n          }) || fits[0];\n        }\n      }\n      return defaultVariant(product, cfg);\n    }\n\n    function optionValuesForVariantPool(product, pool, optionIndex) {\n      var n = optionCount(product);\n      var seen = {};\n      var out = [];\n      pool.forEach(function (v) {\n        var vals = variantOptionValues(v, n);\n        var val = (vals[optionIndex] || '').toString();\n        if (!val || seen[val]) return;\n        seen[val] = true;\n        out.push(vals[optionIndex]);\n      });\n      return out;\n    }\n\n    function variantPoolMatchingSelections(product, pool, selections, upToIndex) {\n      return pool.filter(function (v) {\n        var vals = variantOptionValues(v, optionCount(product));\n        for (var i = 0; i < upToIndex; i++) {\n          var a = (vals[i] || '').toString().trim().toLowerCase();\n          var b = (selections[i] || '').toString().trim().toLowerCase();\n          if (a !== b) return false;\n        }\n        return true;\n      });\n    }\n\n    function buildVariantSlot(slotEl, product, role, onChange) {\n      clearSlot(slotEl);\n      if (!product || !slotEl) return;\n      var n = optionCount(product);\n      if (!product.variants || product.variants.length <= 1 || n <= 0) {\n        slotEl.hidden = true;\n        return;\n      }\n\n      var compatiblePool = pickerEligibleVariants(product, cfg);\n      if (role === 'shade' && state.baseProduct && state.baseVariant) {\n        compatiblePool = getCompatibleShadeVariants(product, state.baseProduct, state.baseVariant, cfg);\n        if (!compatiblePool.length) {\n          slotEl.hidden = false;\n          var emptyMsg = document.createElement('p');\n          emptyMsg.className = 'shade-styler__no-compatible';\n          emptyMsg.textContent = cfg.noCompatibleShadeSizes || 'No sizes for this lampshade match this lamp base.';\n          slotEl.appendChild(emptyMsg);\n          return;\n        }\n      }\n\n      slotEl.hidden = false;\n      var currentSelections = [];\n      if (role === 'shade' && state.shadeVariant) {\n        currentSelections = variantOptionValues(state.shadeVariant, n);\n      } else {\n        currentSelections = readSelectionsFromSlot(slotEl, product);\n      }\n\n      product.optionsWithValues.forEach(function (opt, idx) {\n        var pool = compatiblePool;\n        if (role === 'shade' && idx > 0) {\n          pool = variantPoolMatchingSelections(product, compatiblePool, currentSelections, idx);\n        }\n\n        var values = optionValuesForVariantPool(product, pool, idx);\n        if (!values.length && (opt.values || []).length) {\n          values = opt.values.slice();\n        }\n\n        var row = document.createElement('div');\n        row.className = 'shade-styler__variant-row';\n        var lab = document.createElement('label');\n        lab.textContent = opt.name;\n        lab.setAttribute('for', 'shade-styler-opt-' + role + '-' + product.productId + '-' + idx);\n        var sel = document.createElement('select');\n        sel.id = 'shade-styler-opt-' + role + '-' + product.productId + '-' + idx;\n        sel.setAttribute('data-option-index', String(idx));\n        values.forEach(function (val) {\n          var o = document.createElement('option');\n          o.value = val;\n          o.textContent = val;\n          sel.appendChild(o);\n        });\n        sel.addEventListener('change', onChange);\n        row.appendChild(lab);\n        row.appendChild(sel);\n        slotEl.appendChild(row);\n      });\n\n      var warn = document.createElement('div');\n      warn.setAttribute('data-variant-warning', role);\n      warn.style.display = 'none';\n      warn.style.marginTop = '0.5rem';\n      warn.style.fontSize = '0.9rem';\n      warn.style.color = '#b00020';\n      slotEl.appendChild(warn);\n    }\n\n    function refreshShadeAfterBaseChange() {\n      if (!state.shadeProduct) return;\n\n      var compatible = getCompatibleShadeVariants(\n        state.shadeProduct,\n        state.baseProduct,\n        state.baseVariant,\n        cfg\n      );\n\n      if (!compatible.length) {\n        state.shadeVariant = null;\n        state.hasOosSelection = false;\n        state.lastVariantOosRole = null;\n        buildVariantSlot(dom.slotShade, state.shadeProduct, 'shade', onShadeVariantChange);\n        updateDetails();\n        return;\n      }\n\n      var currentOk = state.shadeVariant && compatible.some(function (v) {\n        return v.id === state.shadeVariant.id;\n      });\n\n      if (!currentOk) {\n        state.shadeVariant = defaultShadeVariant(state.shadeProduct);\n      }\n\n      buildVariantSlot(dom.slotShade, state.shadeProduct, 'shade', onShadeVariantChange);\n      if (state.shadeVariant) {\n        syncSlotSelections(dom.slotShade, state.shadeProduct, state.shadeVariant);\n      }\n      onShadeVariantChange();\n    }\n\n    function readSelectionsFromSlot(slotEl, product) {\n      var n = optionCount(product);\n      var out = [];\n      var hasSelects = !!(slotEl && slotEl.querySelector && slotEl.querySelector('select'));\n      if (!slotEl || !hasSelects || n <= 0) {\n        var dv = defaultVariant(product, cfg);\n        if (dv) out = variantOptionValues(dv, n);\n        return out;\n      }\n      for (var i = 0; i < n; i++) {\n        var sel = slotEl.querySelector('[data-option-index=\"' + i + '\"]');\n        out.push(sel ? sel.value : '');\n      }\n      return out;\n    }\n\n    function syncSlotSelections(slotEl, product, variant) {\n      if (!slotEl || !variant) return;\n      var n = optionCount(product);\n      var vals = variantOptionValues(variant, n);\n      for (var i = 0; i < n; i++) {\n        var sel = slotEl.querySelector('[data-option-index=\"' + i + '\"]');\n        if (sel) sel.value = vals[i] || '';\n      }\n    }\n\n    function resolveVariantFromSlot(product, slotEl) {\n      var sel = readSelectionsFromSlot(slotEl, product);\n      var v = findVariant(product, sel);\n      if (v && !v.available && !cfg.inventoryOosSelectable) return null;\n      return v;\n    }\n\n    function resolveShadeVariantFromSlot(product, slotEl) {\n      var v = resolveVariantFromSlot(product, slotEl);\n      if (!v || !state.baseProduct || !state.baseVariant) return v;\n      var compatible = getCompatibleShadeVariants(product, state.baseProduct, state.baseVariant, cfg);\n      var ok = compatible.some(function (c) {\n        return c.id === v.id;\n      });\n      return ok ? v : null;\n    }\n\n    function updateNotesAndButton() {\n      var proportion = evaluateWidthProportion(state.baseVariant, state.shadeVariant, cfg, state.baseProduct);\n      var proportionBlocked = !!(cfg.proportionHardBlock && proportion.status === 'warn');\n\n      if (dom.shopPairingBtn) {\n        dom.shopPairingBtn.disabled =\n          !(state.baseVariant && state.shadeVariant) || !!state.hasOosSelection || proportionBlocked;\n      }\n\n      function setSlotWarning(role, msg) {\n        var slotEl = role === 'shade' ? dom.slotShade : dom.slotBase;\n        if (!slotEl) return;\n        var w = slotEl.querySelector('[data-variant-warning=\"' + role + '\"]');\n        if (!w) return;\n        if (msg) {\n          w.textContent = msg;\n          w.style.display = '';\n        } else {\n          w.textContent = '';\n          w.style.display = 'none';\n        }\n      }\n\n      var slotMsg = '';\n      if (dom.errorMessage) {\n        if (state.lastVariantOosRole) {\n          var which = state.lastVariantOosRole === 'shade' ? 'shade size' : 'base option';\n          var picked = state.lastVariantOosTitle ? (' (\u201C' + state.lastVariantOosTitle + '\u201D)') : '';\n          slotMsg = 'That ' + which + picked + ' is out of stock. Please choose another option.';\n          dom.errorMessage.textContent = slotMsg;\n          dom.errorMessage.style.display = '';\n        } else if (dom.errorMessage.textContent && dom.errorMessage.textContent.indexOf('out of stock') !== -1) {\n          dom.errorMessage.style.display = 'none';\n          dom.errorMessage.textContent = '';\n        }\n      }\n\n      if (state.lastVariantOosRole) {\n        setSlotWarning(state.lastVariantOosRole, slotMsg || 'This option is out of stock. Please choose another.');\n        setSlotWarning(state.lastVariantOosRole === 'shade' ? 'base' : 'shade', '');\n      } else {\n        setSlotWarning('base', '');\n        setSlotWarning('shade', '');\n      }\n    }\n\n    /**\n     * One instruction line per tab \u2014 the Lamp Bases tab used to tell people to\n     * pick a lampshade, which is the wrong instruction for that tab.\n     * Stays quiet once both halves of the pairing are chosen.\n     */\n    function updateStepInstruction() {\n      if (!dom.stepInstruction) return;\n      var stepText = '';\n      if (state.activeTab === 'finials') {\n        // A finial is optional, so this line stays up whether or not one is chosen.\n        stepText = cfg.stepChooseFinial;\n      } else if (!(state.baseProduct && state.shadeProduct)) {\n        stepText = state.activeTab === 'bases' ? cfg.stepChooseBase : cfg.stepChooseShade;\n      }\n      stepText = String(stepText || '').trim();\n      dom.stepInstruction.textContent = stepText;\n      dom.stepInstruction.style.display = stepText ? '' : 'none';\n    }\n\n    function updateDetails() {\n      var baseP = state.baseProduct;\n      var baseV = state.baseVariant;\n      var shadeP = state.shadeProduct;\n      var shadeV = state.shadeVariant;\n\n      if (dom.detailBaseValue) dom.detailBaseValue.textContent = baseP ? baseP.title : '\u2014';\n      if (dom.detailBasePrice) {\n        dom.detailBasePrice.textContent = baseV ? formatMoneyNoCents(baseV.price, cfg) : '';\n        dom.detailBasePrice.style.display = baseV ? '' : 'none';\n      }\n      if (dom.detailBaseLink) {\n        dom.detailBaseLink.href = baseP ? baseP.productUrl : '#';\n        dom.detailBaseLink.style.display = baseP ? '' : 'none';\n      }\n\n      if (dom.detailShadeValue) dom.detailShadeValue.textContent = shadeP ? shadeP.title : '\u2014';\n      if (dom.detailShadePrice) {\n        dom.detailShadePrice.textContent = shadeV ? formatMoneyNoCents(shadeV.price, cfg) : '';\n        dom.detailShadePrice.style.display = shadeV ? '' : 'none';\n      }\n      if (dom.detailShadeLink) {\n        dom.detailShadeLink.href = shadeP ? shadeP.productUrl : '#';\n        dom.detailShadeLink.style.display = shadeP ? '' : 'none';\n      }\n\n      var finialP = state.finialProduct;\n      var finialV = state.finialVariant;\n      if (dom.detailFinial) dom.detailFinial.hidden = !finialP;\n      if (dom.detailFinialValue) dom.detailFinialValue.textContent = finialP ? finialP.title : '\u2014';\n      if (dom.detailFinialPrice) {\n        dom.detailFinialPrice.textContent = finialV ? formatMoneyNoCents(finialV.price, cfg) : '';\n        dom.detailFinialPrice.style.display = finialV ? '' : 'none';\n      }\n      if (dom.detailFinialLink) {\n        dom.detailFinialLink.href = finialP ? finialP.productUrl : '#';\n        dom.detailFinialLink.style.display = finialP ? '' : 'none';\n      }\n\n      var total = 0;\n      if (baseV) total += baseV.price;\n      if (shadeV) total += shadeV.price;\n      if (finialV) total += finialV.price;\n      if (dom.pairingTotalWrap) dom.pairingTotalWrap.style.display = baseV || shadeV ? '' : 'none';\n      if (dom.pairingTotal) dom.pairingTotal.textContent = total > 0 ? formatMoneyNoCents(total, cfg) : '';\n\n      publishDetailData('shade', shadeP, shadeV);\n      publishDetailData('base', baseP, baseV);\n      publishDetailData('finial', finialP, finialV);\n\n      updateStepInstruction();\n\n      setPreview();\n      updateNotesAndButton();\n      updateShare();\n    }\n\n    /**\n     * Writes the vendor and the printable specs onto the detail block as data\n     * attributes. The PDF sheet reads the pairing from the page rather than\n     * from this closure, so the two files stay independent of each other.\n     */\n    function publishDetailData(role, product, variant) {\n      var wrap = role === 'shade' ? dom.detailShade : role === 'finial' ? dom.detailFinial : dom.detailBase;\n      if (!wrap) return;\n      if (!product) {\n        wrap.removeAttribute('data-vendor');\n        wrap.removeAttribute('data-specs');\n        return;\n      }\n      wrap.setAttribute('data-vendor', product.vendor || '');\n      wrap.setAttribute('data-specs', JSON.stringify(buildSpecs(role, product, variant)));\n    }\n\n    function buildSpecs(role, product, variant) {\n      var specs = [];\n      if (!variant) return specs;\n\n      if (role === 'shade') {\n        var dims = [variant.shadeTopDiameter, variant.shadeBottomDiameter, variant.shadeSideLength];\n        if (dims.every(function (d) { return d; })) {\n          specs.push({\n            key: cfg.pdfSpecSizeLabel || 'Size',\n            value: dims.join(' x ') + ' ' + (cfg.scaleDimensionUnit || 'in'),\n            hint: cfg.pdfSpecSizeHint || 'Top x bottom diameter x side length'\n          });\n        } else if (variant.shadeSize) {\n          specs.push({ key: cfg.pdfSpecSizeLabel || 'Size', value: variant.shadeSize });\n        }\n        var fitter = variant.fitterType || product.productFitterType;\n        if (fitter) specs.push({ key: cfg.pdfSpecFittingLabel || 'Fitting', value: fitter });\n      } else if (role === 'finial') {\n        if (variant.finialHeight) {\n          specs.push({\n            key: cfg.pdfSpecHeightLabel || 'Height',\n            value: variant.finialHeight + ' ' + (cfg.scaleDimensionUnit || 'in')\n          });\n        }\n      } else {\n        // The lamp's own options are the finish: \"Thyme\", \"Gold base\".\n        var values = (variant.optionsWithValues || [])\n          .map(function (o) { return o.value; })\n          .filter(function (v) { return v && v !== 'Default Title'; });\n        if (!values.length && variant.title && variant.title !== 'Default Title') {\n          values = variant.title.split(' / ');\n        }\n        if (values.length) {\n          specs.push({ key: cfg.pdfSpecFinishLabel || 'Finish', value: values.join('\\n') });\n        }\n      }\n      return specs;\n    }\n\n    function setSelectedCards() {\n      var baseId = state.baseProduct ? state.baseProduct.productId : null;\n      var shadeId = state.shadeProduct ? state.shadeProduct.productId : null;\n      var finialId = state.finialProduct ? state.finialProduct.productId : null;\n      section.querySelectorAll('.shade-styler-card').forEach(function (card) {\n        var id = parseInt(card.getAttribute('data-product-id'), 10);\n        var role = card.getAttribute('data-role');\n        var isSelected = (role === 'lamp_base' && id === baseId)\n          || (role === 'lampshade' && id === shadeId)\n          || (role === 'finial' && id === finialId);\n        card.classList.toggle('is-selected', isSelected);\n        var check = card.querySelector('[data-card-check]');\n        if (check) check.style.display = isSelected ? '' : 'none';\n      });\n    }\n\n    function cardCollectionHandles(card) {\n      return (card.getAttribute('data-collection-handles') || '')\n        .split(',')\n        .map(function (h) { return h.trim(); })\n        .filter(Boolean);\n    }\n\n    function cardTags(card) {\n      return (card.getAttribute('data-tags') || '')\n        .split('|')\n        .map(function (t) { return t.trim(); })\n        .filter(Boolean);\n    }\n\n    function cardMatchesCollectionFilter(card) {\n      var role = card.getAttribute('data-role');\n      var handle = role === 'lamp_base' ? state.baseCollectionFilter : state.shadeCollectionFilter;\n      if (!handle) return true;\n      return cardCollectionHandles(card).indexOf(handle) !== -1;\n    }\n\n    function cardMatchesColorFilter(card) {\n      var role = card.getAttribute('data-role');\n      var color = role === 'lamp_base' ? state.baseColorFilter : state.shadeColorFilter;\n      if (!color) return true;\n      var needle = color.toLowerCase();\n      return cardTags(card).some(function (tag) {\n        return tag.toLowerCase() === needle;\n      });\n    }\n\n    // Memoised base\u2192shade compatibility, keyed by the selected shade product AND\n    // variant, so switching the shade size in the detail panel re-filters the bases.\n    var baseCompatCache = { key: '', map: {} };\n\n    function baseCardFitsSelectedShade(baseProduct, shadeP, shadeV) {\n      var key = shadeP ? String(shadeP.productId) + ':' + (shadeV ? shadeV.id : '') : '';\n      if (baseCompatCache.key !== key) baseCompatCache = { key: key, map: {} };\n      var id = String(baseProduct.productId);\n      if (baseCompatCache.map[id] === undefined) {\n        baseCompatCache.map[id] = baseProductHasCompatibleVariants(baseProduct, shadeP, shadeV, cfg);\n      }\n      return baseCompatCache.map[id];\n    }\n\n    function activeSearchFor(role) {\n      if (role === 'lamp_base') return state.baseSearch;\n      if (role === 'finial') return state.finialSearch;\n      return state.shadeSearch;\n    }\n\n    /**\n     * Free-text match over the product title and brand, which the cards already\n     * carry for sorting. Every word must hit, so \"fermoie blue\" narrows the list\n     * instead of widening it.\n     */\n    function cardMatchesSearchFilter(card) {\n      var query = activeSearchFor(card.getAttribute('data-role'));\n      if (!query) return true;\n      var haystack = (\n        (card.getAttribute('data-sort-title') || '') + ' ' + (card.getAttribute('data-sort-vendor') || '')\n      ).toLowerCase();\n      return query.split(/\\s+/).every(function (word) {\n        return !word || haystack.indexOf(word) !== -1;\n      });\n    }\n\n    function isCardEligible(card) {\n      var role = card.getAttribute('data-role');\n      if (!cardMatchesCollectionFilter(card)) return false;\n      if (!cardMatchesColorFilter(card)) return false;\n      if (!cardMatchesSearchFilter(card)) return false;\n      var productId = parseInt(card.getAttribute('data-product-id'), 10);\n      if (role === 'lampshade') {\n        var baseP = state.baseProduct;\n        var baseV = state.baseVariant;\n        if (baseP && baseV) {\n          var sp = getProductById(data.shades, productId);\n          if (!sp || !shadeProductHasCompatibleVariants(sp, baseP, baseV, cfg)) return false;\n        }\n      } else if (role === 'lamp_base') {\n        var shadeP = state.shadeProduct;\n        if (shadeP) {\n          var bp = getProductById(data.lamps, productId);\n          if (!bp || !baseCardFitsSelectedShade(bp, shadeP, state.shadeVariant)) return false;\n        }\n      }\n      return true;\n    }\n\n    function getActiveGrid() {\n      if (state.activeTab === 'bases') return dom.gridBases;\n      if (state.activeTab === 'finials') return dom.gridFinials;\n      return dom.gridShades;\n    }\n\n    function getPageSizeForTab(tab) {\n      if (tab === 'bases') return state.basesPageSize;\n      if (tab === 'finials') return state.shadesPageSize;\n      return state.shadesPageSize;\n    }\n\n    function getSortForTab(tab) {\n      if (tab === 'bases') return state.basesSort;\n      if (tab === 'finials') return state.shadesSort;\n      return state.shadesSort;\n    }\n\n    function compareCardsForSort(a, b, sortKey) {\n      var titleA = (a.getAttribute('data-sort-title') || '').trim();\n      var titleB = (b.getAttribute('data-sort-title') || '').trim();\n      var priceA = parseInt(a.getAttribute('data-sort-price'), 10) || 0;\n      var priceB = parseInt(b.getAttribute('data-sort-price'), 10) || 0;\n      var vendorA = (a.getAttribute('data-sort-vendor') || '').trim();\n      var vendorB = (b.getAttribute('data-sort-vendor') || '').trim();\n      var idxA = parseInt(a.getAttribute('data-sort-index'), 10) || 0;\n      var idxB = parseInt(b.getAttribute('data-sort-index'), 10) || 0;\n      var titleCmp = titleA.localeCompare(titleB, undefined, { sensitivity: 'base' });\n\n      switch (sortKey) {\n        case 'title-asc':\n          return titleCmp;\n        case 'title-desc':\n          return -titleCmp;\n        case 'price-asc':\n          return priceA !== priceB ? priceA - priceB : titleCmp;\n        case 'price-desc':\n          return priceB !== priceA ? priceB - priceA : titleCmp;\n        case 'vendor-asc':\n          return vendorA !== vendorB ? vendorA.localeCompare(vendorB, undefined, { sensitivity: 'base' }) : titleCmp;\n        case 'vendor-desc':\n          return vendorB !== vendorA ? vendorB.localeCompare(vendorA, undefined, { sensitivity: 'base' }) : titleCmp;\n        default:\n          return idxA - idxB;\n      }\n    }\n\n    function sortGridCards(grid, tabKey) {\n      if (!grid) return;\n      var sortKey = tabKey === 'bases' ? state.basesSort : state.shadesSort;\n      var cards = Array.prototype.slice.call(grid.querySelectorAll('.shade-styler-card'));\n      cards.sort(function (a, b) {\n        return compareCardsForSort(a, b, sortKey);\n      });\n      var frag = document.createDocumentFragment();\n      cards.forEach(function (card) {\n        frag.appendChild(card);\n      });\n      grid.appendChild(frag);\n    }\n\n    var catalogLoader = null;\n\n    function tabKeyToRole(tabKey) {\n      if (tabKey === 'bases') return 'lamp_base';\n      if (tabKey === 'finials') return 'finial';\n      return 'lampshade';\n    }\n\n    function usesCatalogTotalForTab(tabKey) {\n      if (tabKey === 'bases' && state.baseCollectionFilter) return false;\n      if (tabKey === 'shades' && state.shadeCollectionFilter) return false;\n      if (tabKey === 'bases' && state.baseColorFilter) return false;\n      if (tabKey === 'shades' && state.shadeColorFilter) return false;\n      if (tabKey === 'finials' && (state.finialCollectionFilter || state.finialColorFilter)) return false;\n      if (tabKey === 'shades' && state.baseProduct && state.baseVariant) return false;\n      if (tabKey === 'bases' && state.shadeProduct) return false;\n      if (activeSearchFor(tabKeyToRole(tabKey))) return false;\n      return true;\n    }\n\n    function countEligibleInGrid(grid) {\n      var count = 0;\n      if (!grid) return 0;\n      grid.querySelectorAll('.shade-styler-card').forEach(function (card) {\n        if (isCardEligible(card)) count += 1;\n      });\n      return count;\n    }\n\n    function getDisplayTotalForTab(tabKey, loadedEligible) {\n      if (!usesCatalogTotalForTab(tabKey)) return loadedEligible;\n      var role = tabKeyToRole(tabKey);\n      if (catalogLoader) {\n        var catalogTotal = catalogLoader.getCollectionTotal(role);\n        if (catalogTotal > 0) return catalogTotal;\n      }\n      return tabKey === 'bases' ? (cfg.lampCatalogCount || loadedEligible) : (cfg.shadeCatalogCount || loadedEligible);\n    }\n\n    function ensureEligibleLoaded(role, minCount, done) {\n      done = done || function () {};\n      if (!catalogLoader) {\n        done();\n        return;\n      }\n      catalogLoader.ensureStarted(role);\n      if (catalogLoader.isComplete(role)) {\n        done();\n        return;\n      }\n      var grid = role === 'lamp_base' ? dom.gridBases : dom.gridShades;\n      if (countEligibleInGrid(grid) >= minCount) {\n        done();\n        return;\n      }\n      catalogLoader.fetchPage(role, function (advanced) {\n        if (!advanced || countEligibleInGrid(grid) >= minCount || catalogLoader.isComplete(role)) {\n          done();\n          return;\n        }\n        ensureEligibleLoaded(role, minCount, done);\n      });\n    }\n\n    function applyPaginationToGrid(grid, tabKey) {\n      if (!grid) {\n        return {\n          total: 0,\n          loadedEligible: 0,\n          totalPages: 1,\n          page: 1,\n          start: 0,\n          end: 0,\n          catalogLoading: false\n        };\n      }\n\n      sortGridCards(grid, tabKey);\n\n      var isBases = tabKey === 'bases';\n      var isFinials = tabKey === 'finials';\n      var page = isBases ? state.basesPage : isFinials ? state.finialsPage : state.shadesPage;\n      var size = isBases ? state.basesPageSize : state.shadesPageSize;\n      var eligible = [];\n\n      grid.querySelectorAll('.shade-styler-card').forEach(function (card) {\n        if (isCardEligible(card)) eligible.push(card);\n      });\n\n      var loadedEligible = eligible.length;\n      var displayTotal = getDisplayTotalForTab(tabKey, loadedEligible);\n      var totalPages = displayTotal ? Math.ceil(displayTotal / size) : 1;\n      if (page > totalPages) page = totalPages;\n      if (page < 1) page = 1;\n      if (isBases) state.basesPage = page;\n      else if (isFinials) state.finialsPage = page;\n      else state.shadesPage = page;\n\n      var startIndex = (page - 1) * size;\n      var endIndex = startIndex + size;\n      var role = tabKeyToRole(tabKey);\n      var catalogLoading = catalogLoader\n        ? catalogLoader.isStarted(role) && !catalogLoader.isComplete(role)\n        : false;\n\n      grid.querySelectorAll('.shade-styler-card').forEach(function (card) {\n        card.classList.add('shade-styler-card--hidden');\n        card.style.display = 'none';\n      });\n\n      eligible.forEach(function (card, i) {\n        if (i >= startIndex && i < endIndex) {\n          card.classList.remove('shade-styler-card--hidden');\n          card.style.display = '';\n        }\n      });\n\n      if (tabKey === state.activeTab) grid.scrollTop = 0;\n\n      return {\n        total: displayTotal,\n        loadedEligible: loadedEligible,\n        totalPages: totalPages,\n        page: page,\n        start: displayTotal ? startIndex + 1 : 0,\n        end: displayTotal ? Math.min(endIndex, displayTotal) : 0,\n        catalogLoading: catalogLoading\n      };\n    }\n\n    function updatePaginationUi(meta) {\n      meta = meta || applyPaginationToGrid(getActiveGrid(), state.activeTab);\n\n      if (dom.gridToolbar) {\n        // Keep Collection / Color / Sort visible when a 0-result filter is active.\n        // Hiding the toolbar trapped users (e.g. Floral on lamp bases) with no way to clear it.\n        var activeGrid = getActiveGrid();\n        var hasLoadedCards = !!(activeGrid && activeGrid.querySelector('.shade-styler-card'));\n        var filterActive =\n          state.activeTab === 'bases'\n            ? !!(state.baseCollectionFilter || state.baseColorFilter || state.baseSearch || state.shadeProduct)\n            : state.activeTab === 'finials'\n              ? !!(state.finialCollectionFilter || state.finialColorFilter || state.finialSearch)\n              : !!(state.shadeCollectionFilter || state.shadeColorFilter || state.shadeSearch || state.baseProduct);\n        dom.gridToolbar.hidden = !(\n          meta.total > 0 ||\n          meta.loadedEligible > 0 ||\n          hasLoadedCards ||\n          filterActive\n        );\n      }\n      updateFilterEmptyMessage(getActiveGrid(), state.activeTab, meta.loadedEligible);\n      if (dom.pageInfo) {\n        dom.pageInfo.textContent = 'Page ' + meta.page + ' of ' + meta.totalPages;\n      }\n      if (dom.pageRange) {\n        if (meta.total) {\n          var rangeText = 'Showing ' + meta.start + '\u2013' + meta.end + ' of ' + meta.total;\n          if (meta.catalogLoading) {\n            rangeText += ' (loading full catalog\u2026)';\n          }\n          dom.pageRange.textContent = rangeText;\n        } else {\n          dom.pageRange.textContent = '';\n        }\n      }\n      if (dom.pagePrev) dom.pagePrev.disabled = meta.page <= 1;\n      if (dom.pageNext) {\n        dom.pageNext.disabled = meta.page >= meta.totalPages && !meta.catalogLoading;\n      }\n      if (dom.gridSort) dom.gridSort.value = getSortForTab(state.activeTab);\n      if (dom.colorFilter) {\n        dom.colorFilter.value = state.activeTab === 'bases' ? state.baseColorFilter : state.shadeColorFilter;\n      }\n    }\n\n    function updateFilterEmptyMessage(grid, tabKey, loadedEligible) {\n      if (!grid) return;\n      var existing = grid.querySelector('[data-filter-empty]');\n      var hasCards = !!grid.querySelector('.shade-styler-card');\n      if (loadedEligible > 0 || !hasCards) {\n        if (existing) existing.remove();\n        return;\n      }\n      if (!existing) {\n        existing = document.createElement('p');\n        existing.className = 'shade-styler__empty';\n        existing.setAttribute('data-filter-empty', '');\n        grid.appendChild(existing);\n      }\n      var isBases = tabKey === 'bases';\n      // Finials have no compatibility rules, so the only reason their grid is\n      // empty is a filter or an unfinished cut-out.\n      if (tabKey === 'finials') {\n        existing.textContent = cfg.finialEmptyMessage || 'No finials match this search.';\n        return;\n      }\n      var color = isBases ? state.baseColorFilter : state.shadeColorFilter;\n      if (activeSearchFor(tabKeyToRole(tabKey))) {\n        existing.textContent = isBases\n          ? cfg.searchEmptyBases || 'No lamp bases match this search.'\n          : cfg.searchEmptyShades || 'No lampshades match this search.';\n      } else if (color) {\n        existing.textContent = isBases\n          ? 'No lamp bases match this color.'\n          : 'No lampshades match this color.';\n      } else if (isBases && state.shadeProduct) {\n        existing.textContent = cfg.noCompatibleLampBases || 'No lamp bases match this lampshade.';\n      } else if (!isBases && state.baseProduct && state.baseVariant) {\n        existing.textContent = cfg.noCompatibleShadeSizes || 'No sizes for this lampshade match this lamp base.';\n      } else {\n        existing.textContent = isBases\n          ? cfg.emptyBasesMessage || 'No lamp bases in this collection.'\n          : cfg.emptyShadesMessage || 'No lampshades in this collection.';\n      }\n    }\n\n    // The color list is shared by both tabs, so an option that cannot match anything\n    // in the current tab + collection (e.g. \"Marbled\" on Lamp Bases) is dropped from\n    // the menu instead of being left to return an empty grid.\n    var allColorOptions = null;\n    var renderedColorSignature = '';\n\n    function snapshotColorOptions() {\n      if (allColorOptions || !dom.colorFilter) return;\n      allColorOptions = Array.prototype.slice\n        .call(dom.colorFilter.options)\n        .filter(function (o) { return o.value !== ''; })\n        .map(function (o) { return { value: o.value, label: o.textContent }; });\n    }\n\n    function colorTagsPresentInActiveTab() {\n      var grid = getActiveGrid();\n      var present = {};\n      if (!grid) return present;\n      grid.querySelectorAll('.shade-styler-card').forEach(function (card) {\n        if (!cardMatchesCollectionFilter(card)) return;\n        cardTags(card).forEach(function (tag) {\n          present[tag.toLowerCase()] = true;\n        });\n      });\n      return present;\n    }\n\n    function refreshColorOptions() {\n      if (!dom.colorFilter) return;\n      snapshotColorOptions();\n      if (!allColorOptions || !allColorOptions.length) return;\n\n      var grid = getActiveGrid();\n      var loaded = !!(grid && grid.querySelector('.shade-styler-card'));\n      var available;\n      if (loaded) {\n        var present = colorTagsPresentInActiveTab();\n        available = allColorOptions.filter(function (o) {\n          return present[o.value.toLowerCase()];\n        });\n      } else {\n        // This tab's catalog has not arrived yet. Show the full list rather than\n        // leaving the other tab's narrowed options on screen; it narrows on load.\n        available = allColorOptions.slice();\n      }\n\n      var isBases = state.activeTab === 'bases';\n      var selected = isBases ? state.baseColorFilter : state.shadeColorFilter;\n      var stillValid = !selected || available.some(function (o) { return o.value === selected; });\n      if (!stillValid) {\n        // The active color just became impossible (tab or collection changed): clear it.\n        selected = '';\n        if (isBases) {\n          state.baseColorFilter = '';\n          state.basesPage = 1;\n        } else {\n          state.shadeColorFilter = '';\n          state.shadesPage = 1;\n        }\n      }\n\n      var signature = state.activeTab + '|' + available.map(function (o) { return o.value; }).join(',');\n      if (signature !== renderedColorSignature) {\n        renderedColorSignature = signature;\n        var allOption = dom.colorFilter.querySelector('option[value=\"\"]');\n        dom.colorFilter.innerHTML = '';\n        if (allOption) dom.colorFilter.appendChild(allOption);\n        available.forEach(function (o) {\n          var opt = document.createElement('option');\n          opt.value = o.value;\n          opt.textContent = o.label;\n          dom.colorFilter.appendChild(opt);\n        });\n      }\n      dom.colorFilter.value = selected;\n    }\n\n    var searchInputTimer = null;\n\n    function applySearchInput(raw) {\n      var query = String(raw || '').trim().toLowerCase();\n      var tab = state.activeTab;\n      var current = tab === 'bases' ? state.baseSearch\n        : tab === 'finials' ? state.finialSearch : state.shadeSearch;\n      if (current === query) return;\n      if (tab === 'bases') {\n        state.baseSearch = query;\n        state.basesPage = 1;\n      } else if (tab === 'finials') {\n        state.finialSearch = query;\n        state.finialsPage = 1;\n      } else {\n        state.shadeSearch = query;\n        state.shadesPage = 1;\n      }\n      // Only loaded cards can match, so pull the rest of the catalogue in sooner.\n      if (query && catalogLoader) catalogLoader.accelerate(tabKeyToRole(state.activeTab));\n      applyGridFilters();\n    }\n\n    function scheduleSearchInput(raw) {\n      if (searchInputTimer) window.clearTimeout(searchInputTimer);\n      searchInputTimer = window.setTimeout(function () {\n        searchInputTimer = null;\n        applySearchInput(raw);\n      }, 180);\n    }\n\n    function applyGridFilters() {\n      removeLegacyCatalogErrors(section);\n      // Runs first so a cleared color selection is reflected in this same pass.\n      refreshColorOptions();\n      var basesMeta = applyPaginationToGrid(dom.gridBases, 'bases');\n      var shadesMeta = applyPaginationToGrid(dom.gridShades, 'shades');\n      updatePaginationUi(state.activeTab === 'bases' ? basesMeta : shadesMeta);\n    }\n\n    function onBaseVariantChange() {\n      if (!state.baseProduct) return;\n      state.lastVariantOosRole = null;\n      state.lastVariantOosTitle = null;\n      state.hasOosSelection = false;\n\n      var chosen = resolveVariantFromSlot(state.baseProduct, dom.slotBase);\n      if (!chosen) {\n        var sel = readSelectionsFromSlot(state.baseProduct, dom.slotBase);\n        var vMaybe = findVariant(state.baseProduct, sel);\n        state.lastVariantOosRole = 'base';\n        state.lastVariantOosTitle = (vMaybe && vMaybe.title) ? vMaybe.title : sel.filter(Boolean).join(' / ');\n        state.hasOosSelection = true;\n      } else if (chosen && chosen.available === false) {\n        state.lastVariantOosRole = 'base';\n        state.lastVariantOosTitle = chosen.title || '';\n        state.hasOosSelection = true;\n      }\n      state.baseVariant = chosen;\n      if (!state.baseVariant) state.baseVariant = defaultVariant(state.baseProduct, cfg);\n      if (state.baseVariant && optionCount(state.baseProduct) > 1) {\n        syncSlotSelections(dom.slotBase, state.baseProduct, state.baseVariant);\n      }\n      updateCardPrice('lamp_base', state.baseProduct, state.baseVariant);\n      applyGridFilters();\n      refreshShadeAfterBaseChange();\n      updateDetails();\n    }\n\n    function onShadeVariantChange() {\n      if (!state.shadeProduct) return;\n      state.lastVariantOosRole = null;\n      state.lastVariantOosTitle = null;\n      state.hasOosSelection = false;\n\n      var chosen = resolveShadeVariantFromSlot(state.shadeProduct, dom.slotShade);\n      if (!chosen) {\n        var sel = readSelectionsFromSlot(state.shadeProduct, dom.slotShade);\n        var vMaybe = findVariant(state.shadeProduct, sel);\n        state.lastVariantOosRole = 'shade';\n        state.lastVariantOosTitle = (vMaybe && vMaybe.title) ? vMaybe.title : sel.filter(Boolean).join(' / ');\n        state.hasOosSelection = true;\n      } else if (chosen && chosen.available === false) {\n        state.lastVariantOosRole = 'shade';\n        state.lastVariantOosTitle = chosen.title || '';\n        state.hasOosSelection = true;\n      }\n      state.shadeVariant = chosen;\n      if (!state.shadeVariant) state.shadeVariant = defaultShadeVariant(state.shadeProduct);\n      if (state.shadeVariant && optionCount(state.shadeProduct) > 1) {\n        syncSlotSelections(dom.slotShade, state.shadeProduct, state.shadeVariant);\n      }\n      updateCardPrice('lampshade', state.shadeProduct, state.shadeVariant);\n      // Mirror onBaseVariantChange: re-filter the lamp base grid against the shade selection.\n      applyGridFilters();\n      updateDetails();\n    }\n\n    function updateCardPrice(role, product, variant) {\n      if (!product || !variant) return;\n      var card = section.querySelector('.shade-styler-card[data-role=\"' + role + '\"][data-product-id=\"' + product.productId + '\"]');\n      if (!card) return;\n      var priceEl = card.querySelector('[data-card-price]');\n      if (priceEl) priceEl.textContent = formatMoneyNoCents(variant.price, cfg);\n    }\n\n    function selectLamp(productId) {\n      var p = getProductById(data.lamps, productId);\n      state.baseProduct = p;\n      state.baseVariant = p ? defaultBaseVariant(p) : null;\n      // The shade pool changes with the base, so restart its pagination.\n      state.shadesPage = 1;\n      if (p && state.baseVariant) {\n        buildVariantSlot(dom.slotBase, p, 'base', onBaseVariantChange);\n        syncSlotSelections(dom.slotBase, p, state.baseVariant);\n      } else {\n        clearSlot(dom.slotBase);\n      }\n      onBaseVariantChange();\n      setSelectedCards();\n    }\n\n    function selectShade(productId) {\n      var p = getProductById(data.shades, productId);\n      state.shadeProduct = p;\n      state.shadeVariant = p ? defaultShadeVariant(p) : null;\n      // The base pool changes with the shade, so restart its pagination.\n      state.basesPage = 1;\n      if (p) {\n        buildVariantSlot(dom.slotShade, p, 'shade', onShadeVariantChange);\n        if (state.shadeVariant) {\n          syncSlotSelections(dom.slotShade, p, state.shadeVariant);\n        }\n      } else {\n        clearSlot(dom.slotShade);\n      }\n      onShadeVariantChange();\n      setSelectedCards();\n    }\n\n    /**\n     * A finial is an addition rather than half of the pairing, so picking one\n     * changes nothing about which shades or bases are on offer. Selecting the\n     * one already chosen clears it, which is how a shopper backs out of the\n     * extra without hunting for the Remove link.\n     */\n    function selectFinial(productId) {\n      var already = state.finialProduct && state.finialProduct.productId === productId;\n      var p = already ? null : getProductById(data.finials, productId);\n      state.finialProduct = p;\n      state.finialVariant = p ? defaultFinialVariant(p) : null;\n      if (p) {\n        buildVariantSlot(dom.slotFinial, p, 'finial', onFinialVariantChange);\n        if (state.finialVariant) {\n          syncSlotSelections(dom.slotFinial, p, state.finialVariant);\n        }\n      } else {\n        clearSlot(dom.slotFinial);\n      }\n      onFinialVariantChange();\n      setSelectedCards();\n    }\n\n    function clearFinial() {\n      state.finialProduct = null;\n      state.finialVariant = null;\n      clearSlot(dom.slotFinial);\n      onFinialVariantChange();\n      setSelectedCards();\n    }\n\n    /** Most finials have a single variant; the rest take the first sellable one. */\n    function defaultFinialVariant(product) {\n      if (!product || !product.variants || !product.variants.length) return null;\n      var pick = product.variants.filter(function (v) {\n        return v.available || cfg.inventoryOosSelectable;\n      })[0];\n      return pick || product.variants[0];\n    }\n\n    function onFinialVariantChange() {\n      if (state.finialProduct) {\n        var v = resolveVariantFromSlot(state.finialProduct, dom.slotFinial);\n        state.finialVariant = v || defaultFinialVariant(state.finialProduct);\n      }\n      updateDetails();\n      // A pairing can be finial-only on screen for a moment; setPreview bails out\n      // early when neither half is chosen, so nudge the reflow directly.\n      if (state.finialVariant && !(state.baseVariant || state.shadeVariant)) {\n        scheduleReflowPreview();\n      }\n    }\n\n    /* ---- Share -------------------------------------------------------- */\n\n    /**\n     * Rebuilds the shareable URL from the current pairing. Both handles and both\n     * variant ids go in, so the link reopens exactly what is on screen \u2014 see\n     * readDeepLinkRequest() for the other side of this contract.\n     */\n    function buildShareUrl() {\n      if (typeof URLSearchParams === 'undefined') return '';\n      if (!state.shadeProduct || !state.baseProduct) return '';\n      var params = new URLSearchParams();\n      params.set('shade', state.shadeProduct.handle || '');\n      if (state.shadeVariant) params.set('shade_variant', String(state.shadeVariant.id));\n      params.set('base', state.baseProduct.handle || '');\n      if (state.baseVariant) params.set('base_variant', String(state.baseVariant.id));\n      // Optional, so a pairing without one produces the same link it always did.\n      if (state.finialProduct) {\n        params.set('finial', state.finialProduct.handle || '');\n        if (state.finialVariant) params.set('finial_variant', String(state.finialVariant.id));\n      }\n      return window.location.origin + window.location.pathname + '?' + params.toString();\n    }\n\n    function shareTitle() {\n      var shade = state.shadeProduct ? state.shadeProduct.title : '';\n      var base = state.baseProduct ? state.baseProduct.title : '';\n      var title = shade && base ? shade + ' on ' + base : shade || base || '';\n      if (title && state.finialProduct) title += ' with ' + state.finialProduct.title;\n      return title;\n    }\n\n    function setShareFeedback(message) {\n      if (!dom.shareFeedback) return;\n      dom.shareFeedback.textContent = message || '';\n    }\n\n    function closeSharePanel() {\n      if (!dom.sharePanel || !dom.shareToggle) return;\n      dom.sharePanel.hidden = true;\n      dom.shareToggle.setAttribute('aria-expanded', 'false');\n      setShareFeedback('');\n    }\n\n    /**\n     * The button only appears once both halves are chosen; anything less is not a\n     * pairing worth sending. Rebuilding the URL here keeps it in step with every\n     * variant change without a separate listener.\n     */\n    function updateShare() {\n      // The PDF button appears on the same condition: a complete pairing.\n      var hasPairing = !!buildShareUrl();\n      if (dom.pdfWrap) dom.pdfWrap.style.display = hasPairing ? '' : 'none';\n\n      if (!dom.shareWrap) return;\n      var url = buildShareUrl();\n      if (!url) {\n        dom.shareWrap.style.display = 'none';\n        closeSharePanel();\n        return;\n      }\n      dom.shareWrap.style.display = '';\n      if (dom.shareUrl) dom.shareUrl.value = url;\n\n      if (dom.shareEmail) {\n        var body = (cfg.shareEmailBody || '') + '\\n\\n' + shareTitle() + '\\n' + url;\n        dom.shareEmail.href =\n          'mailto:?subject=' + encodeURIComponent(cfg.shareEmailSubject || '') +\n          '&body=' + encodeURIComponent(body);\n      }\n\n      var social = section.querySelectorAll('[data-share-social]');\n      for (var i = 0; i < social.length; i++) {\n        var network = social[i].getAttribute('data-share-social');\n        if (network === 'facebook') {\n          social[i].href = 'https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent(url);\n        } else if (network === 'pinterest') {\n          // Pinterest needs an image; the preview shade shot is the closest thing\n          // the page has to a picture of the pairing.\n          var media = dom.previewShadeImg && dom.previewShadeImg.src ? dom.previewShadeImg.src : '';\n          social[i].href =\n            'https://www.pinterest.com/pin/create/button/?url=' + encodeURIComponent(url) +\n            '&description=' + encodeURIComponent(shareTitle()) +\n            (media ? '&media=' + encodeURIComponent(media) : '');\n        }\n      }\n    }\n\n    function copyShareUrl() {\n      if (!dom.shareUrl) return;\n      var done = function () { setShareFeedback(cfg.shareCopiedText || 'Link copied.'); };\n      var failed = function () {\n        // Leave the text selected so Ctrl+C still works where the clipboard is blocked.\n        try { dom.shareUrl.select(); } catch (e) {}\n        setShareFeedback(cfg.shareCopyFailedText || 'Press Ctrl+C to copy the link.');\n      };\n      if (navigator.clipboard && navigator.clipboard.writeText) {\n        navigator.clipboard.writeText(dom.shareUrl.value).then(done, failed);\n        return;\n      }\n      try {\n        dom.shareUrl.select();\n        if (document.execCommand('copy')) done();\n        else failed();\n      } catch (e) {\n        failed();\n      }\n    }\n\n    function startOver() {\n      state.baseProduct = null;\n      state.baseVariant = null;\n      state.shadeProduct = null;\n      state.shadeVariant = null;\n      state.finialProduct = null;\n      state.finialVariant = null;\n      closeSharePanel();\n      clearSlot(dom.slotBase);\n      clearSlot(dom.slotShade);\n      clearSlot(dom.slotFinial);\n      setPreview();\n      updateDetails();\n      setSelectedCards();\n      state.basesPage = 1;\n      state.shadesPage = 1;\n      state.finialsPage = 1;\n      state.finialCollectionFilter = '';\n      state.finialColorFilter = '';\n      state.finialSearch = '';\n      state.baseCollectionFilter = '';\n      state.shadeCollectionFilter = '';\n      state.baseColorFilter = '';\n      state.shadeColorFilter = '';\n      state.baseSearch = '';\n      state.shadeSearch = '';\n      if (dom.filterBases) dom.filterBases.value = '';\n      if (dom.filterShades) dom.filterShades.value = '';\n      if (dom.colorFilter) dom.colorFilter.value = '';\n      if (dom.searchFilter) dom.searchFilter.value = '';\n      applyGridFilters();\n      if (dom.errorMessage) {\n        dom.errorMessage.style.display = 'none';\n        dom.errorMessage.textContent = '';\n      }\n      if (dom.successMessage) {\n        dom.successMessage.style.display = 'none';\n        dom.successMessage.textContent = '';\n      }\n    }\n\n    function setActiveTab(tab) {\n      state.activeTab = tab;\n      dom.tabs.forEach(function (t) {\n        var isActive = t.getAttribute('data-tab') === tab;\n        t.classList.toggle('is-active', isActive);\n        t.setAttribute('aria-selected', isActive);\n      });\n      dom.panels.forEach(function (panel) {\n        var isActive = panel.getAttribute('data-panel') === tab;\n        panel.classList.toggle('is-active', isActive);\n        panel.hidden = !isActive;\n      });\n      section.querySelectorAll('[data-collection-filter-row]').forEach(function (row) {\n        row.hidden = row.getAttribute('data-collection-filter-row') !== tab;\n      });\n      if (dom.colorFilter) {\n        dom.colorFilter.value = tab === 'bases' ? state.baseColorFilter\n          : tab === 'finials' ? state.finialColorFilter : state.shadeColorFilter;\n      }\n      // Search is per tab, like Collection and Color.\n      if (dom.searchFilter) {\n        dom.searchFilter.value = tab === 'bases' ? state.baseSearch\n          : tab === 'finials' ? state.finialSearch : state.shadeSearch;\n      }\n      if (tab === 'shades' && catalogLoader) {\n        catalogLoader.ensureStarted('lampshade');\n      }\n      if (tab === 'bases' && catalogLoader) {\n        catalogLoader.ensureStarted('lamp_base');\n      }\n      if (tab === 'finials' && catalogLoader) {\n        catalogLoader.ensureStarted('finial');\n      }\n      updateStepInstruction();\n      applyGridFilters();\n    }\n\n    function tryOpenCartDrawer() {\n      document.documentElement.dispatchEvent(new CustomEvent('cart:open', { bubbles: true }));\n      if (typeof window.Shopify !== 'undefined' && window.Shopify.theme && window.Shopify.theme.cartDrawer) {\n        try {\n          window.Shopify.theme.cartDrawer.open();\n        } catch (e2) {}\n      }\n    }\n\n    section.addEventListener('change', function (e) {\n      var filter = e.target.closest('[data-collection-filter]');\n      if (filter) {\n        var which = filter.getAttribute('data-collection-filter');\n        if (which === 'bases') {\n          state.baseCollectionFilter = filter.value || '';\n          state.basesPage = 1;\n        } else if (which === 'shades') {\n          state.shadeCollectionFilter = filter.value || '';\n          state.shadesPage = 1;\n        }\n        applyGridFilters();\n        return;\n      }\n\n      var colorFilter = e.target.closest('[data-color-filter]');\n      if (colorFilter) {\n        var colorVal = colorFilter.value || '';\n        if (state.activeTab === 'bases') {\n          state.baseColorFilter = colorVal;\n          state.basesPage = 1;\n        } else if (state.activeTab === 'finials') {\n          state.finialColorFilter = colorVal;\n          state.finialsPage = 1;\n        } else {\n          state.shadeColorFilter = colorVal;\n          state.shadesPage = 1;\n        }\n        catalogLoader.accelerate(tabKeyToRole(state.activeTab));\n        applyGridFilters();\n        return;\n      }\n\n      if (e.target.closest('[data-search-filter]')) {\n        applySearchInput(e.target.value);\n        return;\n      }\n\n      if (e.target.closest('[data-grid-sort]')) {\n        var sortVal = e.target.value || 'default';\n        if (state.activeTab === 'bases') {\n          state.basesSort = sortVal;\n          state.basesPage = 1;\n        } else if (state.activeTab === 'finials') {\n          state.shadesSort = sortVal;\n          state.finialsPage = 1;\n        } else {\n          state.shadesSort = sortVal;\n          state.shadesPage = 1;\n        }\n        catalogLoader.accelerate(tabKeyToRole(state.activeTab));\n        applyGridFilters();\n      }\n    });\n\n    section.addEventListener('click', function (e) {\n      var card = e.target.closest('.shade-styler-card');\n      if (card) {\n        e.preventDefault();\n        var role = card.getAttribute('data-role');\n        var id = parseInt(card.getAttribute('data-product-id'), 10);\n        if (role === 'lamp_base') selectLamp(id);\n        else if (role === 'lampshade') selectShade(id);\n        else if (role === 'finial') selectFinial(id);\n        return;\n      }\n\n      if (e.target.closest('[data-clear-finial]')) {\n        e.preventDefault();\n        clearFinial();\n        return;\n      }\n\n      var tab = e.target.closest('[data-tab]');\n      if (tab) {\n        setActiveTab(tab.getAttribute('data-tab'));\n        return;\n      }\n      if (e.target.closest('[data-page-prev]')) {\n        if (state.activeTab === 'bases') state.basesPage = Math.max(1, state.basesPage - 1);\n        else if (state.activeTab === 'finials') state.finialsPage = Math.max(1, state.finialsPage - 1);\n        else state.shadesPage = Math.max(1, state.shadesPage - 1);\n        applyGridFilters();\n        return;\n      }\n      if (e.target.closest('[data-page-next]')) {\n        if (state.activeTab === 'bases') state.basesPage += 1;\n        else if (state.activeTab === 'finials') state.finialsPage += 1;\n        else state.shadesPage += 1;\n        var nextRole = tabKeyToRole(state.activeTab);\n        var nextSize = getPageSizeForTab(state.activeTab);\n        var nextPage = state.activeTab === 'bases' ? state.basesPage\n          : state.activeTab === 'finials' ? state.finialsPage : state.shadesPage;\n        applyGridFilters();\n        ensureEligibleLoaded(nextRole, nextPage * nextSize, function () {\n          applyGridFilters();\n        });\n        return;\n      }\n      if (e.target.closest('[data-share-toggle]')) {\n        if (dom.sharePanel && dom.shareToggle) {\n          var open = dom.sharePanel.hidden;\n          dom.sharePanel.hidden = !open;\n          dom.shareToggle.setAttribute('aria-expanded', open ? 'true' : 'false');\n          if (open && dom.shareUrl) dom.shareUrl.select();\n          else setShareFeedback('');\n        }\n        return;\n      }\n\n      if (e.target.closest('[data-share-copy]')) {\n        copyShareUrl();\n        return;\n      }\n\n      if (e.target.closest('[data-start-over]')) {\n        startOver();\n        return;\n      }\n      if (e.target.closest('[data-shop-pairing]')) {\n        if (!state.baseVariant || !state.shadeVariant) return;\n        if (addToCartInFlight) return;\n        addToCartInFlight = true;\n        var v1 = state.baseVariant.id;\n        var v2 = state.shadeVariant.id;\n        if (dom.shopPairingBtn) dom.shopPairingBtn.disabled = true;\n        if (dom.errorMessage) {\n          dom.errorMessage.style.display = 'none';\n          dom.errorMessage.textContent = '';\n        }\n        if (dom.successMessage) dom.successMessage.style.display = 'none';\n\n        fetch('/cart/add.js', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({\n            // The finial rides along when one is chosen; the pair alone is still\n            // a complete order.\n            items: state.finialVariant\n              ? [{ id: v1, quantity: 1 }, { id: v2, quantity: 1 }, { id: state.finialVariant.id, quantity: 1 }]\n              : [{ id: v1, quantity: 1 }, { id: v2, quantity: 1 }]\n          })\n        })\n          .then(function (r) {\n            if (!r.ok) {\n              return r.text().then(function (t) {\n                throw new Error('Add to cart failed (' + r.status + '). ' + (t ? t.slice(0, 140) : ''));\n              });\n            }\n            return r.text().then(function (t) {\n              var s = (t || '').trim();\n              if (s && s[0] === '<') {\n                throw new Error('Add to cart blocked (HTML verification / rate limit). Please wait and try again.');\n              }\n              if (!s) return {};\n              try {\n                return JSON.parse(s);\n              } catch (e2) {\n                return {};\n              }\n            });\n          })\n          .then(function (res) {\n            if (res && res.status && res.status !== 200) throw new Error(res.description || 'Add to cart failed');\n            if (dom.successMessage) {\n              dom.successMessage.textContent = cfg.successAddedToCart || 'Added to cart!';\n              dom.successMessage.style.display = '';\n            }\n            if (cfg.bundleRedirectAfterAdd === 'cart') {\n              window.location.href = '/cart';\n            } else if (cfg.bundleRedirectAfterAdd === 'drawer') {\n              tryOpenCartDrawer();\n            }\n          })\n          .catch(function (err) {\n            if (dom.errorMessage) {\n              dom.errorMessage.textContent = err.message || 'Something went wrong. Please try again.';\n              dom.errorMessage.style.display = '';\n            }\n          })\n          .finally(function () {\n            addToCartInFlight = false;\n            if (dom.shopPairingBtn) updateNotesAndButton();\n          });\n      }\n    });\n\n    // Text inputs only fire `change` on blur/Enter, so filter as the customer types.\n    section.addEventListener('input', function (e) {\n      if (e.target.closest('[data-search-filter]')) scheduleSearchInput(e.target.value);\n    });\n\n    section.addEventListener('keydown', function (e) {\n      if (e.target.closest('[data-search-filter]')) {\n        // Enter would submit any enclosing form and reload the page.\n        if (e.key === 'Enter') e.preventDefault();\n        return;\n      }\n      if (e.key === 'Enter' || e.key === ' ') {\n        var card = e.target.closest('.shade-styler-card');\n        if (card) {\n          e.preventDefault();\n          var role = card.getAttribute('data-role');\n          var id = parseInt(card.getAttribute('data-product-id'), 10);\n          if (role === 'lamp_base') selectLamp(id);\n          else if (role === 'lampshade') selectShade(id);\n          else if (role === 'finial') selectFinial(id);\n        }\n      }\n    });\n\n    window.addEventListener('resize', function () {\n      if (state.baseVariant || state.shadeVariant) scheduleReflowPreview();\n    });\n\n    setPreview();\n    updateDetails();\n    setSelectedCards();\n\n    var gridFilterTimer = null;\n    function scheduleGridFilters() {\n      if (gridFilterTimer) window.clearTimeout(gridFilterTimer);\n      gridFilterTimer = window.setTimeout(function () {\n        gridFilterTimer = null;\n        applyGridFilters();\n      }, 80);\n    }\n\n    catalogLoader = initCatalogLoader(cfg, data, dom, function () {\n      if (catalogLoader.isComplete('lamp_base') && usesCatalogTotalForTab('bases')) {\n        var basesEligible = countEligibleInGrid(dom.gridBases);\n        if (basesEligible > 0) catalogLoader.setCollectionTotal('lamp_base', basesEligible);\n      }\n      if (catalogLoader.isComplete('lampshade') && usesCatalogTotalForTab('shades')) {\n        var shadesEligible = countEligibleInGrid(dom.gridShades);\n        if (shadesEligible > 0) catalogLoader.setCollectionTotal('lampshade', shadesEligible);\n      }\n      scheduleGridFilters();\n    });\n\n    /**\n     * Product pages link in as /pages/\u2026?shade=<handle> or ?base=<handle> so the\n     * customer lands with that item already chosen. The catalogue is lazy loaded,\n     * so the product may not be on screen yet \u2014 pull pages in until it shows up.\n     */\n    // Shopify handles are lowercase alphanumerics and hyphens; anything else is\n    // not a handle we could match, and must not reach a selector.\n    function sanitizeHandle(value) {\n      var handle = (value || '').trim();\n      return /^[a-z0-9][a-z0-9-]*$/.test(handle) ? handle : '';\n    }\n\n    function sanitizeVariantId(value) {\n      var id = parseInt(value, 10);\n      return isFinite(id) && id > 0 ? id : null;\n    }\n\n    /**\n     * Two shapes arrive here:\n     *   - a product page link, ?shade=<handle> or ?base=<handle> plus ?variant=\n     *   - a shared pairing, ?shade=&shade_variant=&base=&base_variant=\n     * Both halves are optional, so a one-sided product link still works.\n     */\n    function readDeepLinkRequest() {\n      if (typeof URLSearchParams === 'undefined') return null;\n      var params = new URLSearchParams(window.location.search);\n      var shade = sanitizeHandle(params.get('shade'));\n      var base = sanitizeHandle(params.get('base') || params.get('lamp'));\n      if (!shade && !base) return null;\n\n      // A shared pairing names each variant; a product page sends the bare\n      // ?variant= for whichever half it linked.\n      var legacyVariant = sanitizeVariantId(params.get('variant'));\n      var items = [];\n      if (shade) {\n        items.push({\n          role: 'lampshade',\n          handle: shade,\n          variantId: sanitizeVariantId(params.get('shade_variant')) || (base ? null : legacyVariant)\n        });\n      }\n      if (base) {\n        items.push({\n          role: 'lamp_base',\n          handle: base,\n          variantId: sanitizeVariantId(params.get('base_variant')) || (shade ? null : legacyVariant)\n        });\n      }\n      var finial = sanitizeHandle(params.get('finial'));\n      if (finial) {\n        items.push({\n          role: 'finial',\n          handle: finial,\n          variantId: sanitizeVariantId(params.get('finial_variant'))\n        });\n      }\n      return items;\n    }\n\n    /**\n     * Carry over the variant chosen on the product page. Falls back silently to the\n     * default pick when that size is not one the styler can show \u2014 the product JSON\n     * only carries variants that have the sizing metafields.\n     */\n    function applyDeepLinkVariant(role, variantId) {\n      if (!variantId) return;\n      var product = role === 'lampshade' ? state.shadeProduct\n        : role === 'finial' ? state.finialProduct : state.baseProduct;\n      if (!product) return;\n      var variant = (product.variants || []).find(function (v) {\n        return v.id === variantId;\n      });\n      if (!variant) return;\n      var slot = role === 'lampshade' ? dom.slotShade : role === 'finial' ? dom.slotFinial : dom.slotBase;\n      syncSlotSelections(slot, product, variant);\n      if (role === 'lampshade') onShadeVariantChange();\n      else if (role === 'finial') onFinialVariantChange();\n      else onBaseVariantChange();\n    }\n\n    function findCardByHandle(role, handle) {\n      var grid = role === 'lamp_base' ? dom.gridBases : role === 'finial' ? dom.gridFinials : dom.gridShades;\n      if (!grid) return null;\n      return grid.querySelector('.shade-styler-card[data-product-handle=\"' + handle + '\"]');\n    }\n\n    function ensureProductLoaded(role, handle, done, attempts) {\n      attempts = attempts || 0;\n      var card = findCardByHandle(role, handle);\n      if (card) return done(card);\n      if (!catalogLoader || catalogLoader.isComplete(role) || attempts >= 40) return done(null);\n      catalogLoader.accelerate(role);\n      window.setTimeout(function () {\n        ensureProductLoaded(role, handle, done, attempts + 1);\n      }, 250);\n    }\n\n    function setDeepLinkPending(pending) {\n      if (!dom.stepInstruction) return;\n      if (!pending) {\n        updateStepInstruction();\n        return;\n      }\n      dom.stepInstruction.textContent = cfg.deepLinkLoadingText || 'Loading your selection\u2026';\n      dom.stepInstruction.style.display = '';\n    }\n\n    /**\n     * Applies one half, then calls back so the next can follow. Selecting the\n     * shade first matters: the base grid filters itself against the chosen\n     * shade, so doing both at once would race.\n     */\n    function applyDeepLinkItem(item, done) {\n      if (catalogLoader) catalogLoader.ensureStarted(item.role);\n      ensureProductLoaded(item.role, item.handle, function (card) {\n        // Not in the picker catalogue: leave that half unset rather than showing\n        // an error for something the shopper did not do.\n        if (card) {\n          var id = parseInt(card.getAttribute('data-product-id'), 10);\n          if (item.role === 'lampshade') selectShade(id);\n          else if (item.role === 'finial') selectFinial(id);\n          else selectLamp(id);\n          applyDeepLinkVariant(item.role, item.variantId);\n        }\n        done(!!card);\n      });\n    }\n\n    function applyDeepLink() {\n      var items = readDeepLinkRequest();\n      if (!items || !items.length) return;\n      setDeepLinkPending(true);\n\n      var index = 0;\n      var applied = [];\n      (function next() {\n        if (index >= items.length) {\n          setDeepLinkPending(false);\n          // Open the tab holding the half they still have to choose. When the\n          // link carried both, leave the shade tab up so the pairing reads first.\n          var missingBase = !applied.some(function (r) { return r === 'lamp_base'; });\n          setActiveTab(missingBase ? 'bases' : 'shades');\n          return;\n        }\n        var item = items[index++];\n        applyDeepLinkItem(item, function (ok) {\n          if (ok) applied.push(item.role);\n          next();\n        });\n      })();\n    }\n\n    setActiveTab(state.activeTab || 'shades');\n    applyGridFilters();\n    applyDeepLink();\n\n    if (window.MutationObserver) {\n      var cleanupTimer = null;\n      new MutationObserver(function () {\n        if (cleanupTimer) window.clearTimeout(cleanupTimer);\n        cleanupTimer = window.setTimeout(function () {\n          cleanupTimer = null;\n          removeLegacyCatalogErrors(section);\n        }, 0);\n      }).observe(section, { childList: true, subtree: true });\n    }\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n"],
  "mappings": "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",
  "names": ["cfg"]
}
