{
  "version": 3,
  "sources": ["/cdn/shop/t/17/assets/hbd-install.js?hbd=20260508f"],
  "sourcesContent": ["// assets/hbd-install.js\r\n(function () {\r\n  'use strict';\r\n\r\n  var STORAGE_KEY_POSTCODE = 'hbd_postcode';\r\n  var STORAGE_KEY_STATUS = 'hbd_postcode_status';\r\n\r\n  function extractLetterPrefix(raw) {\r\n    if (!raw) return '';\r\n    var cleaned = String(raw).toUpperCase().replace(/\\s+/g, '');\r\n    var match = cleaned.match(/^[A-Z]+/);\r\n    return match ? match[0] : '';\r\n  }\r\n\r\n  // UK postcode format \u2014 outward OR full\r\n  function looksLikePostcode(raw) {\r\n    var cleaned = String(raw).toUpperCase().replace(/\\s+/g, '');\r\n    return (\r\n      /^[A-Z]{1,2}[0-9][A-Z0-9]?[0-9][A-Z]{2}$/.test(cleaned) ||\r\n      /^[A-Z]{1,2}[0-9][A-Z0-9]?$/.test(cleaned)\r\n    );\r\n  }\r\n\r\n  function extractShopifyErrorMessage(body) {\r\n    try {\r\n      var parsed = JSON.parse(body);\r\n      return parsed.description || parsed.message || body;\r\n    } catch (_e) {\r\n      return body;\r\n    }\r\n  }\r\n\r\n  // Format pence as a GBP-style string for inline display.\r\n  function formatPenceAsMoney(pence) {\r\n    var p = Math.max(0, parseInt(pence, 10) || 0);\r\n    var pounds = p / 100;\r\n    if (pounds === Math.floor(pounds)) {\r\n      return '\u00A3' + pounds.toFixed(0);\r\n    }\r\n    return '\u00A3' + pounds.toFixed(2);\r\n  }\r\n\r\n  function refreshCartAfterInstallAdd() {\r\n    if (typeof window.HBDRenderCartSection === 'function') {\r\n      return window.HBDRenderCartSection();\r\n    }\r\n\r\n    return fetch('/cart.js', { headers: { Accept: 'application/json' } })\r\n      .then(function (res) { return res.ok ? res.json() : null; })\r\n      .then(function (cart) {\r\n        if (cart) {\r\n          window.dispatchEvent(new CustomEvent('cartcount:update', { detail: cart }));\r\n        }\r\n        document.dispatchEvent(new CustomEvent('cart:refresh'));\r\n\r\n        if (typeof window.HBDRefreshWidgets === 'function') {\r\n          window.HBDRefreshWidgets();\r\n        }\r\n      })\r\n      .catch(function () {\r\n        if (typeof window.HBDRefreshWidgets === 'function') {\r\n          window.HBDRefreshWidgets();\r\n        }\r\n      });\r\n  }\r\n\r\n  function HBDInstallController(root) {\r\n    this.root = root;\r\n    this.cartMode = root.dataset.cartMode === 'true';\r\n    this.productId = root.dataset.productId;\r\n    this.installVariantId = root.dataset.installVariantId;\r\n    this.ripoffSurchargeVariantId = root.dataset.ripoffSurchargeVariantId || '';\r\n    this.ripoffUpchargePercent = parseInt(root.dataset.ripoffUpchargePercent || '25', 10);\r\n    if (!Number.isFinite(this.ripoffUpchargePercent) || this.ripoffUpchargePercent < 0) {\r\n      this.ripoffUpchargePercent = 25;\r\n    }\r\n    this.installAvailable = root.dataset.installAvailable === 'true';\r\n    this.installPriceFormatted = root.dataset.installPriceFormatted;\r\n    this.bannerEligible = root.dataset.bannerEligible;\r\n    this.bannerExcluded = root.dataset.bannerExcluded;\r\n\r\n    // -------- Bifold panel-variant map --------\r\n    // Maps panel count string (\"2\"\u2013\"6\") \u2192 Shopify variant ID string.\r\n    // Non-null only on bifold products. Used to update installVariantId when\r\n    // the variant:change event fires (e.g. if panel count is a frame variant option).\r\n    this.installPanelCount = root.dataset.installPanelCount || '';\r\n    try {\r\n      var _rawMap = root.dataset.installVariantMap || 'null';\r\n      var _parsedMap = JSON.parse(_rawMap);\r\n      this.installVariantMap = (_parsedMap && typeof _parsedMap === 'object') ? _parsedMap : null;\r\n    } catch (_e) {\r\n      this.installVariantMap = null;\r\n    }\r\n    // ------------------------------------------\r\n    this.frameLineKey = root.dataset.frameLineKey || '';\r\n    this.frameVariantId = root.dataset.frameVariantId || '';\r\n    this.frameQuantity = parseInt(root.dataset.frameQuantity || '1', 10);\r\n\r\n    // -------- Minimum order tracking --------\r\n    this.minOrderCents = parseInt(root.dataset.minOrderCents || '200000', 10);\r\n    this.minOrderFormatted = root.dataset.minOrderFormatted || formatPenceAsMoney(this.minOrderCents);\r\n    this.unitPriceCents = parseInt(root.dataset.unitPriceCents || '0', 10);\r\n    this.meetsMinAtRender = root.dataset.meetsMinAtRender === 'true';\r\n    // ----------------------------------------\r\n\r\n    try {\r\n      var parsedFrameProperties = JSON.parse(root.dataset.frameProperties || '{}');\r\n      this.frameProperties = parsedFrameProperties && typeof parsedFrameProperties === 'object'\r\n        ? parsedFrameProperties\r\n        : {};\r\n    } catch (e) {\r\n      this.frameProperties = {};\r\n    }\r\n\r\n    try {\r\n      var _parsedAllowed = JSON.parse(root.dataset.allowedPrefixes || '[]');\r\n      this.allowedPrefixes = Array.isArray(_parsedAllowed)\r\n        ? _parsedAllowed.map(function (p) { return String(p || '').trim().toUpperCase(); }).filter(Boolean)\r\n        : [];\r\n    } catch (e) {\r\n      this.allowedPrefixes = [];\r\n    }\r\n\r\n    try {\r\n      var _parsedPrefixes = JSON.parse(root.dataset.excludedPrefixes || '[]');\r\n      this.excludedPrefixes = Array.isArray(_parsedPrefixes)\r\n        ? _parsedPrefixes.map(function (p) { return String(p || '').trim().toUpperCase(); }).filter(Boolean)\r\n        : [];\r\n    } catch (e) {\r\n      this.excludedPrefixes = [];\r\n    }\r\n\r\n    this.input = root.querySelector('.hbd-postcode-input');\r\n    this.checkBtn = root.querySelector('.hbd-check-btn');\r\n    this.feedback = root.querySelector('.hbd-feedback');\r\n    this.toggleWrap = root.querySelector('.hbd-toggle-wrap');\r\n    this.toggleInput = root.querySelector('.hbd-toggle-input');\r\n    this.ripoffToggle = root.querySelector('[data-hbd-ripoff-toggle]');\r\n    this.cartAddBtn = root.querySelector('.hbd-cart-add-btn');\r\n\r\n    // -------- Min-order UI elements --------\r\n    this.installCardEl = root.querySelector('[data-hbd-install-card]');\r\n    this.minOrderNoteEl = root.querySelector('[data-hbd-min-order-note]');\r\n    this.shortfallMsgEl = root.querySelector('[data-hbd-shortfall-msg]');\r\n    // ---------------------------------------\r\n\r\n    // Scope to the nearest product form to avoid capturing unrelated forms\r\n    var wrapper = root.closest('[data-product-form-area]') || root.closest('form[action*=\"/cart/add\"]') || document;\r\n    this.productForm = wrapper.querySelector\r\n      ? wrapper.querySelector('form[action*=\"/cart/add\"]')\r\n      : null;\r\n    if (!this.productForm) {\r\n      this.productForm = document.querySelector('form[action=\"/cart/add\"], form[action^=\"/cart/add\"]');\r\n    }\r\n\r\n    // Find the quantity input inside the product form (PDP mode only)\r\n    this.qtyInput = null;\r\n    if (!this.cartMode && this.productForm) {\r\n      this.qtyInput = this.productForm.querySelector('input[name=\"quantity\"]');\r\n    }\r\n\r\n    this._bindEvents();\r\n    this._initMinOrderTracking();\r\n    this._restoreFromStorage();\r\n  }\r\n\r\n  HBDInstallController.prototype._bindEvents = function () {\r\n    var self = this;\r\n\r\n    this.checkBtn.addEventListener('click', function () { self._handleCheck(); });\r\n\r\n    this.input.addEventListener('keypress', function (e) {\r\n      if (e.key === 'Enter') {\r\n        e.preventDefault();\r\n        self._handleCheck();\r\n      }\r\n    });\r\n\r\n    this.input.addEventListener('input', function () {\r\n      self.input.value = self.input.value.toUpperCase();\r\n    });\r\n\r\n    if (this.cartMode && this.cartAddBtn) {\r\n      this.cartAddBtn.addEventListener('click', function () { self._handleCartAdd(); });\r\n    }\r\n\r\n    if (this.productForm) {\r\n      this.productForm.addEventListener('submit', function (e) { self._handleSubmit(e); }, true);\r\n    }\r\n\r\n    // -------- Listen for quantity changes (PDP mode only) --------\r\n    if (!this.cartMode && this.qtyInput) {\r\n      this.qtyInput.addEventListener('change', function () { self._evaluateMinOrder(); });\r\n      this.qtyInput.addEventListener('input', function () { self._evaluateMinOrder(); });\r\n\r\n      // Plus/minus button patterns commonly used in themes \u2014 listen for clicks\r\n      // on quantity-related buttons that mutate the qty input value.\r\n      var qtyContainer = this.qtyInput.closest('.product-form__quantity, .product-quantity, .quantity, [data-quantity]') || this.productForm;\r\n      if (qtyContainer) {\r\n        qtyContainer.addEventListener('click', function (e) {\r\n          var t = e.target.closest('button, [data-quantity-plus], [data-quantity-minus], .product-quantity-button, .qty-btn');\r\n          if (!t) return;\r\n          // Defer to allow the theme's own handler to update the input first\r\n          setTimeout(function () { self._evaluateMinOrder(); }, 0);\r\n        });\r\n      }\r\n\r\n      // Some themes dispatch a 'variant:change' or similar event when the\r\n      // selected variant changes. Hook into common patterns to update price\r\n      // AND (for bifold) switch to the matching panel-count install variant.\r\n      ['variant:change', 'variantChange', 'product:variantChange'].forEach(function (eventName) {\r\n        document.addEventListener(eventName, function (e) {\r\n          var detail = e && (e.detail || e.data) || {};\r\n          var variant = detail.variant || detail.selectedVariant || (detail.product && detail.product.selected_variant);\r\n          if (!variant) return;\r\n\r\n          // Update price for min-order tracking\r\n          if (typeof variant.price !== 'undefined') {\r\n            self.unitPriceCents = parseInt(variant.price, 10) || self.unitPriceCents;\r\n          }\r\n\r\n          // Bifold panel variant swap: if the new frame variant has a panel-count\r\n          // option value that exists in our install variant map, switch install variant.\r\n          if (self.installVariantMap) {\r\n            var opts = variant.options || [];\r\n            for (var oi = 0; oi < opts.length; oi++) {\r\n              var optVal = String(opts[oi]).trim();\r\n              if (self.installVariantMap[optVal]) {\r\n                self.installVariantId = String(self.installVariantMap[optVal]);\r\n                break;\r\n              }\r\n            }\r\n          }\r\n\r\n          self._evaluateMinOrder();\r\n        });\r\n      });\r\n    }\r\n    // -------------------------------------------------------------\r\n  };\r\n\r\n  HBDInstallController.prototype._initMinOrderTracking = function () {\r\n    if (this.cartMode) {\r\n      // Cart mode: Liquid already determined visibility based on cart\r\n      // product subtotal. JS does no toggling here.\r\n      return;\r\n    }\r\n    // PDP mode: evaluate against current qty \u00D7 unit price\r\n    this._evaluateMinOrder();\r\n  };\r\n\r\n  HBDInstallController.prototype._evaluateMinOrder = function () {\r\n    if (this.cartMode) return;\r\n\r\n    var qty = 1;\r\n    if (this.qtyInput) {\r\n      var v = parseInt(this.qtyInput.value || '1', 10);\r\n      if (isFinite(v) && v >= 1) qty = v;\r\n    }\r\n    var currentValue = this.unitPriceCents * qty;\r\n    var meetsMin = currentValue >= this.minOrderCents;\r\n\r\n    this._setMinOrderVisibility(meetsMin, currentValue);\r\n  };\r\n\r\n  HBDInstallController.prototype._setMinOrderVisibility = function (meetsMin, currentValueCents) {\r\n    if (this.installCardEl) {\r\n      this.installCardEl.hidden = !meetsMin;\r\n    }\r\n    if (this.minOrderNoteEl) {\r\n      this.minOrderNoteEl.hidden = meetsMin;\r\n    }\r\n\r\n    // If threshold dropped below min, defensively uncheck the install toggle\r\n    // and hide the cart-add button so a stale \"checked\" state can't sneak\r\n    // through on form submit.\r\n    if (!meetsMin) {\r\n      if (this.toggleInput) this.toggleInput.checked = false;\r\n      if (this.ripoffToggle) this.ripoffToggle.checked = false;\r\n      if (this.toggleWrap) this.toggleWrap.hidden = true;\r\n      if (this.cartAddBtn) this.cartAddBtn.hidden = true;\r\n    }\r\n\r\n    // Update shortfall message when below threshold\r\n    if (this.shortfallMsgEl && !meetsMin) {\r\n      var shortfall = Math.max(0, this.minOrderCents - currentValueCents);\r\n      var shortfallStr = formatPenceAsMoney(shortfall);\r\n      var msg = this.cartMode\r\n        ? 'Add ' + shortfallStr + ' more in products to unlock professional installation.'\r\n        : 'Add ' + shortfallStr + ' more in products (or increase quantity) to unlock professional installation.';\r\n      this.shortfallMsgEl.textContent = msg;\r\n    }\r\n  };\r\n\r\n  HBDInstallController.prototype._restoreFromStorage = function () {\r\n    var saved = localStorage.getItem(STORAGE_KEY_POSTCODE);\r\n    if (saved) {\r\n      this.input.value = saved;\r\n      this._handleCheck();\r\n    }\r\n  };\r\n\r\n  HBDInstallController.prototype._isEligible = function (postcode) {\r\n    var prefix = extractLetterPrefix(postcode);\r\n    if (!prefix) return false;\r\n\r\n    // If an explicit allowlist exists, treat everything else as blocked.\r\n    if (this.allowedPrefixes.length > 0) {\r\n      return this.allowedPrefixes.indexOf(prefix) !== -1;\r\n    }\r\n\r\n    return this.excludedPrefixes.indexOf(prefix) === -1;\r\n  };\r\n\r\n  HBDInstallController.prototype._showFeedback = function (message, type) {\r\n    this.feedback.textContent = message;\r\n    this.feedback.hidden = false;\r\n    this.feedback.className = 'hbd-feedback hbd-feedback--' + type;\r\n  };\r\n\r\n  HBDInstallController.prototype._handleCheck = function () {\r\n    var raw = (this.input.value || '').trim();\r\n    if (!raw) {\r\n      this._showFeedback('Please enter a postcode.', 'warning');\r\n      return;\r\n    }\r\n\r\n    if (!looksLikePostcode(raw)) {\r\n      this._showFeedback(\"That doesn't look like a UK postcode.\", 'warning');\r\n      return;\r\n    }\r\n\r\n    localStorage.setItem(STORAGE_KEY_POSTCODE, raw);\r\n\r\n    if (this._isEligible(raw)) {\r\n      this._showFeedback(this.bannerEligible || 'Installation is available in your area.', 'success');\r\n      if (this.toggleWrap) this.toggleWrap.hidden = false;\r\n      if (this.cartAddBtn) this.cartAddBtn.hidden = false;\r\n      localStorage.setItem(STORAGE_KEY_STATUS, 'eligible');\r\n    } else {\r\n      this._showFeedback(this.bannerExcluded || 'Installation is not available in your area.', 'excluded');\r\n      if (this.toggleWrap) this.toggleWrap.hidden = true;\r\n      if (this.toggleInput) this.toggleInput.checked = false;\r\n      if (this.cartAddBtn) this.cartAddBtn.hidden = true;\r\n      localStorage.setItem(STORAGE_KEY_STATUS, 'excluded');\r\n    }\r\n  };\r\n\r\n  HBDInstallController.prototype._handleCartAdd = function () {\r\n    var raw = (this.input.value || '').trim();\r\n    if (!raw || !looksLikePostcode(raw)) {\r\n      this._showFeedback('Enter a valid postcode before adding installation.', 'warning');\r\n      return;\r\n    }\r\n\r\n    if (!this._isEligible(raw)) {\r\n      this._showFeedback(this.bannerExcluded || 'Installation is not available in your area.', 'excluded');\r\n      return;\r\n    }\r\n\r\n    if (!this.installAvailable) {\r\n      this._showFeedback('Installation is currently out of stock for this product.', 'warning');\r\n      return;\r\n    }\r\n\r\n    if (!this.frameLineKey || !this.frameVariantId || !this.installVariantId) {\r\n      this._showFeedback('Could not identify cart line details. Refresh the page and try again.', 'warning');\r\n      return;\r\n    }\r\n\r\n    var self = this;\r\n    var installVariantIdNum = parseInt(this.installVariantId, 10);\r\n    var wantsRipoff = !!(this.ripoffToggle && this.ripoffToggle.checked);\r\n    var ripoffSurchargeVariantIdNum = wantsRipoff ? parseInt(this.ripoffSurchargeVariantId, 10) : 0;\r\n    if (!installVariantIdNum) {\r\n      this._showFeedback('Installation variant is invalid. Check product metafields.', 'warning');\r\n      return;\r\n    }\r\n\r\n    if (wantsRipoff && !ripoffSurchargeVariantIdNum) {\r\n      this._showFeedback('Remove & replace service is not yet set up for this product. Please contact us for assistance.', 'warning');\r\n      return;\r\n    }\r\n\r\n    var selectedInstallVariantIdNum = (wantsRipoff && ripoffSurchargeVariantIdNum)\r\n      ? ripoffSurchargeVariantIdNum\r\n      : installVariantIdNum;\r\n    var selectedInstallVariantId = String(selectedInstallVariantIdNum);\r\n\r\n    var frameProperties = Object.assign({}, this.frameProperties || {});\r\n    frameProperties._linked_install = selectedInstallVariantId;\r\n    this.cartAddBtn.disabled = true;\r\n\r\n    // Step 1: update frame line properties via XHR (not fetch \u2014 avoids Empire ns.fetch interception)\r\n    var xhrChange = new XMLHttpRequest();\r\n    xhrChange.open('POST', '/cart/change.js');\r\n    xhrChange.setRequestHeader('Content-Type', 'application/json');\r\n    xhrChange.onload = function () {\r\n      if (xhrChange.status < 200 || xhrChange.status >= 300) {\r\n        self.cartAddBtn.disabled = false;\r\n        self._showFeedback('Could not update cart. Please refresh and try again.', 'warning');\r\n        return;\r\n      }\r\n      // Step 2: add install line \u2014 quantity matches the frame quantity in cart\r\n      var xhrAdd = new XMLHttpRequest();\r\n      xhrAdd.open('POST', '/cart/add.js');\r\n      xhrAdd.setRequestHeader('Content-Type', 'application/json');\r\n      xhrAdd.onload = function () {\r\n        if (xhrAdd.status >= 200 && xhrAdd.status < 300) {\r\n          refreshCartAfterInstallAdd().then(function () {\r\n            self.cartAddBtn.disabled = false;\r\n          });\r\n        } else {\r\n          self.cartAddBtn.disabled = false;\r\n          var msg = '';\r\n          try { msg = JSON.parse(xhrAdd.responseText).description || ''; } catch (ex) {}\r\n          if (/sold out|out of stock|unavailable/i.test(msg)) {\r\n            self._showFeedback('Installation could not be added because the mapped installation product is out of stock.', 'warning');\r\n          } else {\r\n            self._showFeedback(msg || 'Could not add installation. Please try again.', 'warning');\r\n          }\r\n        }\r\n      };\r\n      xhrAdd.onerror = function () {\r\n        self.cartAddBtn.disabled = false;\r\n        self._showFeedback('Could not add installation. Please try again.', 'warning');\r\n      };\r\n\r\n      // Add only the replace-existing variant when ripoff is selected (it already\r\n      // prices the full install + surcharge). Never add both variants together.\r\n      var itemsToAdd;\r\n      if (wantsRipoff && ripoffSurchargeVariantIdNum) {\r\n        itemsToAdd = [{\r\n          id: ripoffSurchargeVariantIdNum,\r\n          quantity: self.frameQuantity,\r\n          properties: {\r\n            _install_for: String(self.frameVariantId),\r\n            _ripoff_replace_existing: 'Yes (+' + self.ripoffUpchargePercent + '%)'\r\n          }\r\n        }];\r\n      } else {\r\n        itemsToAdd = [{\r\n          id: installVariantIdNum,\r\n          quantity: self.frameQuantity,\r\n          properties: { _install_for: String(self.frameVariantId) }\r\n        }];\r\n      }\r\n\r\n      xhrAdd.send(JSON.stringify({\r\n        items: itemsToAdd\r\n      }));\r\n    };\r\n    xhrChange.onerror = function () {\r\n      self.cartAddBtn.disabled = false;\r\n      self._showFeedback('Could not update cart. Please refresh and try again.', 'warning');\r\n    };\r\n    xhrChange.send(JSON.stringify({\r\n      id: this.frameLineKey,\r\n      quantity: this.frameQuantity,\r\n      properties: frameProperties\r\n    }));\r\n  };\r\n\r\n  HBDInstallController.prototype._handleSubmit = function (e) {\r\n    if (!this.toggleInput || !this.toggleInput.checked) return;\r\n\r\n    // Defensive: re-check threshold at submit time. If qty was lowered\r\n    // after toggling install on, refuse to add the install line.\r\n    if (!this.cartMode) {\r\n      this._evaluateMinOrder();\r\n      var formData = new FormData(this.productForm);\r\n      var qty = parseInt(formData.get('quantity') || '1', 10);\r\n      var currentValue = this.unitPriceCents * qty;\r\n      if (currentValue < this.minOrderCents) {\r\n        // Threshold not met \u2014 don't intercept; let the form submit normally\r\n        // (without installation). Toggle is already unchecked by _setMinOrderVisibility.\r\n        return;\r\n      }\r\n    }\r\n\r\n    e.preventDefault();\r\n    e.stopImmediatePropagation(); // Prevent Empire theme's jQuery submit handler from also adding the frame\r\n\r\n    var self = this;\r\n    var formData2 = new FormData(this.productForm);\r\n    var frameVariantId = formData2.get('id');\r\n    var frameVariantIdNum = parseInt(frameVariantId, 10);\r\n    var installVariantIdNum = parseInt(self.installVariantId, 10);\r\n    var wantsRipoff = !!(self.ripoffToggle && self.ripoffToggle.checked);\r\n    var ripoffSurchargeVariantIdNum = wantsRipoff ? parseInt(self.ripoffSurchargeVariantId, 10) : 0;\r\n\r\n    if (wantsRipoff && !ripoffSurchargeVariantIdNum) {\r\n      // Ripoff was requested but no surcharge variant ID is available.\r\n      self._showFeedback('Remove & replace service is not yet set up for this product. Please contact us for assistance.', 'warning');\r\n      return;\r\n    }\r\n    // Prefer direct DOM read of qty input: Empire sometimes renders the qty\r\n    // stepper outside the <form> element, causing FormData to miss it (\u2192 null \u2192 1).\r\n    var qtyValue = (self.qtyInput && parseInt(self.qtyInput.value, 10) > 0)\r\n      ? parseInt(self.qtyInput.value, 10)\r\n      : (parseInt(formData2.get('quantity') || '1', 10) || 1);\r\n\r\n    if (!this.installAvailable) {\r\n      this._showFeedback('Installation is currently out of stock for this product.', 'warning');\r\n      return;\r\n    }\r\n\r\n    if (!frameVariantIdNum || !installVariantIdNum) {\r\n      this._showFeedback('Could not detect product variant. Please refresh and try again.', 'warning');\r\n      return;\r\n    }\r\n\r\n    this.checkBtn.disabled = true;\r\n\r\n    // Use XHR (not fetch) to avoid Empire's ns.fetch monkey-patch, which intercepts\r\n    // window.fetch calls to /cart/add.js and calls addedToCart(item) where item is\r\n    // undefined in this context \u2014 causing a crash that prevents the cart redirect.\r\n    var xhr = new XMLHttpRequest();\r\n    xhr.open('POST', '/cart/add.js');\r\n    xhr.setRequestHeader('Content-Type', 'application/json');\r\n    xhr.onload = function () {\r\n      self.checkBtn.disabled = false;\r\n      if (xhr.status >= 200 && xhr.status < 300) {\r\n        window.location.href = '/cart';\r\n      } else {\r\n        var msg = '';\r\n        try { msg = JSON.parse(xhr.responseText).description || ''; } catch (ex) {}\r\n        if (/sold out|out of stock|unavailable/i.test(msg)) {\r\n          self._showFeedback(\r\n            'Installation could not be added because one of the selected products is out of stock.',\r\n            'warning'\r\n          );\r\n        } else {\r\n          self._showFeedback(\r\n            msg || 'There was a problem adding installation. Please try again or order supply-only.',\r\n            'warning'\r\n          );\r\n        }\r\n      }\r\n    };\r\n    xhr.onerror = function () {\r\n      self.checkBtn.disabled = false;\r\n      self._showFeedback(\r\n        'There was a problem adding installation. Please try again or order supply-only.',\r\n        'warning'\r\n      );\r\n    };\r\n\r\n    // Use replace-existing variant when ripoff is selected (full install + surcharge\r\n    // in one line item). Otherwise use standard install variant.\r\n    var installIdToAdd = (wantsRipoff && ripoffSurchargeVariantIdNum) ? ripoffSurchargeVariantIdNum : installVariantIdNum;\r\n    var installProperties = { _install_for: String(frameVariantId) };\r\n    if (wantsRipoff && ripoffSurchargeVariantIdNum) {\r\n      installProperties._ripoff_replace_existing = 'Yes (+' + self.ripoffUpchargePercent + '%)';\r\n    }\r\n\r\n    var submitItems = [\r\n      {\r\n        id: frameVariantIdNum,\r\n        quantity: qtyValue,\r\n        properties: { _linked_install: String(installIdToAdd) }\r\n      },\r\n      {\r\n        id: installIdToAdd,\r\n        quantity: qtyValue,\r\n        properties: installProperties\r\n      }\r\n    ];\r\n\r\n    xhr.send(JSON.stringify({\r\n      items: submitItems\r\n    }));\r\n  };\r\n\r\n  function HBDCartInstallHubController(root) {\r\n    this.root = root;\r\n    this.bannerEligible = root.dataset.bannerEligible;\r\n    this.bannerExcluded = root.dataset.bannerExcluded;\r\n    this.ripoffUpchargePercent = parseInt(root.dataset.ripoffUpchargePercent || '25', 10);\r\n    if (!Number.isFinite(this.ripoffUpchargePercent) || this.ripoffUpchargePercent < 0) {\r\n      this.ripoffUpchargePercent = 25;\r\n    }\r\n    this.minOrderCents = parseInt(root.dataset.minOrderCents || '200000', 10);\r\n    if (!Number.isFinite(this.minOrderCents) || this.minOrderCents < 0) {\r\n      this.minOrderCents = 200000;\r\n    }\r\n\r\n    try {\r\n      var _parsedAllowed = JSON.parse(root.dataset.allowedPrefixes || '[]');\r\n      this.allowedPrefixes = Array.isArray(_parsedAllowed)\r\n        ? _parsedAllowed.map(function (p) { return String(p || '').trim().toUpperCase(); }).filter(Boolean)\r\n        : [];\r\n    } catch (e) {\r\n      this.allowedPrefixes = [];\r\n    }\r\n\r\n    try {\r\n      var _parsedExcluded = JSON.parse(root.dataset.excludedPrefixes || '[]');\r\n      this.excludedPrefixes = Array.isArray(_parsedExcluded)\r\n        ? _parsedExcluded.map(function (p) { return String(p || '').trim().toUpperCase(); }).filter(Boolean)\r\n        : [];\r\n    } catch (e) {\r\n      this.excludedPrefixes = [];\r\n    }\r\n\r\n    this.input = root.querySelector('.hbd-postcode-input');\r\n    this.checkBtn = root.querySelector('.hbd-hub-check-btn') || root.querySelector('.hbd-check-btn');\r\n    this.feedback = root.querySelector('.hbd-feedback');\r\n    this.ripoffToggle = root.querySelector('[data-hbd-ripoff-toggle]');\r\n    this.ripoffWrap = root.querySelector('[data-hbd-ripoff-wrap]');\r\n    this.targetButtons = Array.prototype.slice.call(root.querySelectorAll('[data-hbd-cart-install-target]'));\r\n    this.minNoteEl = root.querySelector('[data-hbd-hub-min-note]');\r\n    this.hubCardEl = root.querySelector('[data-hbd-hub-card]');\r\n    this.shortfallEl = root.querySelector('[data-hbd-hub-shortfall]');\r\n\r\n    // Only one cart hub is expected on the page.\r\n    window.HBDCartInstallHubActive = this;\r\n\r\n    this._bindEvents();\r\n    this._evaluateThreshold();\r\n    this._restoreFromStorage();\r\n  }\r\n\r\n  HBDCartInstallHubController.prototype._bindEvents = function () {\r\n    var self = this;\r\n\r\n    if (this.checkBtn) {\r\n      this.checkBtn.addEventListener('click', function () { self._handleCheck(); });\r\n    }\r\n\r\n    if (this.input) {\r\n      this.input.addEventListener('keypress', function (e) {\r\n        if (e.key === 'Enter') {\r\n          e.preventDefault();\r\n          self._handleCheck();\r\n        }\r\n      });\r\n\r\n      this.input.addEventListener('input', function () {\r\n        self.input.value = self.input.value.toUpperCase();\r\n      });\r\n    }\r\n\r\n    this.targetButtons.forEach(function (btn) {\r\n      btn.addEventListener('click', function () {\r\n        self._handleTargetAdd(btn);\r\n      });\r\n    });\r\n\r\n    if (!window.HBDCartHubThresholdListenerBound) {\r\n      window.HBDCartHubThresholdListenerBound = true;\r\n\r\n      function evaluateActiveHub(delayMs) {\r\n        setTimeout(function () {\r\n          var activeHub = window.HBDCartInstallHubActive;\r\n          if (activeHub && typeof activeHub._evaluateThreshold === 'function') {\r\n            activeHub._evaluateThreshold();\r\n          }\r\n        }, delayMs);\r\n      }\r\n\r\n      document.addEventListener('change', function (e) {\r\n        var field = e.target && e.target.closest\r\n          ? e.target.closest('[data-cartitem-quantity][data-quantity-input], [data-cartitem-quantity][data-quantity-select]')\r\n          : null;\r\n        if (!field) return;\r\n\r\n        // Run once shortly after the switch, and once later to catch slow cart AJAX.\r\n        evaluateActiveHub(250);\r\n        evaluateActiveHub(1100);\r\n      }, true);\r\n\r\n      window.addEventListener('cartcount:update', function () {\r\n        evaluateActiveHub(120);\r\n      });\r\n\r\n      document.addEventListener('cart:refresh', function () {\r\n        evaluateActiveHub(80);\r\n      });\r\n    }\r\n  };\r\n\r\n  HBDCartInstallHubController.prototype._restoreFromStorage = function () {\r\n    if (!this.input) return;\r\n    var saved = localStorage.getItem(STORAGE_KEY_POSTCODE);\r\n    if (saved) {\r\n      this.input.value = saved;\r\n      this._handleCheck();\r\n    }\r\n  };\r\n\r\n  HBDCartInstallHubController.prototype._isEligible = function (postcode) {\r\n    var prefix = extractLetterPrefix(postcode);\r\n    if (!prefix) return false;\r\n\r\n    if (this.allowedPrefixes.length > 0) {\r\n      return this.allowedPrefixes.indexOf(prefix) !== -1;\r\n    }\r\n\r\n    return this.excludedPrefixes.indexOf(prefix) === -1;\r\n  };\r\n\r\n  HBDCartInstallHubController.prototype._showFeedback = function (message, type) {\r\n    if (!this.feedback) return;\r\n    this.feedback.textContent = message;\r\n    this.feedback.hidden = false;\r\n    this.feedback.className = 'hbd-feedback hbd-feedback--' + type;\r\n  };\r\n\r\n  HBDCartInstallHubController.prototype._setTargetsVisible = function (visible) {\r\n    var hasPendingTargets = false;\r\n    for (var i = 0; i < this.targetButtons.length; i++) {\r\n      if (this.targetButtons[i]) {\r\n        hasPendingTargets = true;\r\n        break;\r\n      }\r\n    }\r\n\r\n    var showTargets = !!visible && hasPendingTargets;\r\n\r\n    this.targetButtons.forEach(function (btn) {\r\n      btn.hidden = !showTargets;\r\n    });\r\n\r\n    // Only show ripoff toggle when at least one target can actually be added.\r\n    if (this.ripoffWrap) {\r\n      this.ripoffWrap.hidden = !showTargets;\r\n    }\r\n    if (!showTargets && this.ripoffToggle) {\r\n      this.ripoffToggle.checked = false;\r\n    }\r\n  };\r\n\r\n  HBDCartInstallHubController.prototype._getCartSubtotalCents = function () {\r\n    var totalEls = document.querySelectorAll('[data-cart-total]');\r\n    var best = 0;\r\n\r\n    for (var i = 0; i < totalEls.length; i++) {\r\n      var raw = (totalEls[i].textContent || '').trim();\r\n      if (!raw) continue;\r\n\r\n      var numeric = raw\r\n        .replace(/\\s+/g, '')\r\n        .replace(/,/g, '')\r\n        .replace(/[^0-9.\\-]/g, '');\r\n\r\n      if (!numeric) continue;\r\n\r\n      var value = parseFloat(numeric);\r\n      if (!Number.isFinite(value)) continue;\r\n\r\n      var cents = Math.round(value * 100);\r\n      if (cents > best) best = cents;\r\n    }\r\n\r\n    return best;\r\n  };\r\n\r\n  HBDCartInstallHubController.prototype._evaluateThreshold = function () {\r\n    var subtotalCents = this._getCartSubtotalCents();\r\n    var meetsMin = subtotalCents >= this.minOrderCents;\r\n\r\n    if (this.hubCardEl) {\r\n      this.hubCardEl.hidden = !meetsMin;\r\n    }\r\n    if (this.minNoteEl) {\r\n      this.minNoteEl.hidden = meetsMin;\r\n    }\r\n\r\n    if (!meetsMin) {\r\n      this._setTargetsVisible(false);\r\n      if (this.ripoffToggle) {\r\n        this.ripoffToggle.checked = false;\r\n      }\r\n      if (this.feedback) {\r\n        this.feedback.hidden = true;\r\n      }\r\n      if (this.shortfallEl) {\r\n        var shortfall = Math.max(0, this.minOrderCents - subtotalCents);\r\n        this.shortfallEl.textContent = 'Add ' + formatPenceAsMoney(shortfall) + ' more in products to unlock professional installation.';\r\n      }\r\n      return;\r\n    }\r\n\r\n    // When crossing threshold via AJAX, auto-restore/check saved postcode state.\r\n    if (this.input && !this.input.value) {\r\n      var savedPostcode = localStorage.getItem(STORAGE_KEY_POSTCODE);\r\n      if (savedPostcode) {\r\n        this.input.value = savedPostcode;\r\n      }\r\n    }\r\n\r\n    var status = localStorage.getItem(STORAGE_KEY_STATUS);\r\n    if (status === 'eligible' && this.input && this.input.value) {\r\n      this._handleCheck();\r\n    }\r\n  };\r\n\r\n  HBDCartInstallHubController.prototype._handleCheck = function () {\r\n    if (!this.input) return;\r\n\r\n    var raw = (this.input.value || '').trim();\r\n    if (!raw) {\r\n      this._showFeedback('Please enter a postcode.', 'warning');\r\n      this._setTargetsVisible(false);\r\n      return;\r\n    }\r\n\r\n    if (!looksLikePostcode(raw)) {\r\n      this._showFeedback(\"That doesn't look like a UK postcode.\", 'warning');\r\n      this._setTargetsVisible(false);\r\n      return;\r\n    }\r\n\r\n    localStorage.setItem(STORAGE_KEY_POSTCODE, raw);\r\n\r\n    if (this._isEligible(raw)) {\r\n      this._showFeedback(this.bannerEligible || 'Installation is available in your area.', 'success');\r\n      this._setTargetsVisible(true);\r\n      localStorage.setItem(STORAGE_KEY_STATUS, 'eligible');\r\n    } else {\r\n      this._showFeedback(this.bannerExcluded || 'Installation is not available in your area.', 'excluded');\r\n      this._setTargetsVisible(false);\r\n      localStorage.setItem(STORAGE_KEY_STATUS, 'excluded');\r\n    }\r\n  };\r\n\r\n  HBDCartInstallHubController.prototype._findCartRow = function (frameLineKey, frameVariantId) {\r\n    var rows = document.querySelectorAll('[data-cartitem-key]');\r\n    var variantFallback = null;\r\n\r\n    for (var i = 0; i < rows.length; i++) {\r\n      var row = rows[i];\r\n      var rowKey = row.getAttribute('data-cartitem-key');\r\n      var rowVariantId = row.getAttribute('data-cartitem-id');\r\n\r\n      if (frameLineKey && rowKey === frameLineKey) {\r\n        return row;\r\n      }\r\n\r\n      if (!variantFallback && frameVariantId && String(rowVariantId) === String(frameVariantId)) {\r\n        variantFallback = row;\r\n      }\r\n    }\r\n\r\n    return variantFallback;\r\n  };\r\n\r\n  HBDCartInstallHubController.prototype._getLineFromRow = function (row) {\r\n    if (!row) return null;\r\n\r\n    var list = document.querySelector('[data-cart-item-list]');\r\n    if (!list) return null;\r\n\r\n    var rows = list.querySelectorAll('[data-cartitem]');\r\n    for (var i = 0; i < rows.length; i++) {\r\n      if (rows[i] === row) {\r\n        return i + 1;\r\n      }\r\n    }\r\n\r\n    return null;\r\n  };\r\n\r\n  HBDCartInstallHubController.prototype._getRowQuantity = function (row, fallbackQty) {\r\n    if (!row) return fallbackQty;\r\n\r\n    var field = row.querySelector('[data-quantity-input], [data-quantity-select]');\r\n    if (!field) return fallbackQty;\r\n\r\n    var qty = parseInt(field.value || '', 10);\r\n    if (!Number.isFinite(qty) || qty < 1) return fallbackQty;\r\n    return qty;\r\n  };\r\n\r\n  HBDCartInstallHubController.prototype._requestJson = function (url, payload) {\r\n    return new Promise(function (resolve, reject) {\r\n      var xhr = new XMLHttpRequest();\r\n      xhr.open('POST', url);\r\n      xhr.setRequestHeader('Content-Type', 'application/json');\r\n      xhr.setRequestHeader('Accept', 'application/json');\r\n\r\n      xhr.onload = function () {\r\n        var body = xhr.responseText || '';\r\n        var data = null;\r\n        try {\r\n          data = body ? JSON.parse(body) : null;\r\n        } catch (_e) {\r\n          data = null;\r\n        }\r\n\r\n        if (xhr.status >= 200 && xhr.status < 300) {\r\n          resolve(data);\r\n          return;\r\n        }\r\n\r\n        var err = new Error('Request failed (' + xhr.status + ')');\r\n        err.status = xhr.status;\r\n        err.body = body;\r\n        reject(err);\r\n      };\r\n\r\n      xhr.onerror = function () {\r\n        var err = new Error('Network request failed');\r\n        err.status = 0;\r\n        err.body = '';\r\n        reject(err);\r\n      };\r\n\r\n      xhr.send(JSON.stringify(payload));\r\n    });\r\n  };\r\n\r\n  HBDCartInstallHubController.prototype._tryLinkInstall = function (frameLineKey, frameLine, frameQuantity, frameProperties) {\r\n    var self = this;\r\n    var attempts = [];\r\n\r\n    if (frameLineKey) {\r\n      attempts.push({ id: frameLineKey, quantity: frameQuantity, properties: frameProperties });\r\n    }\r\n    if (Number.isFinite(frameLine) && frameLine >= 1) {\r\n      attempts.push({ line: frameLine, quantity: frameQuantity, properties: frameProperties });\r\n    }\r\n\r\n    if (!attempts.length) {\r\n      return Promise.resolve(false);\r\n    }\r\n\r\n    function runAttempt(index) {\r\n      if (index >= attempts.length) {\r\n        return Promise.resolve(false);\r\n      }\r\n\r\n      return self._requestJson('/cart/change.js', attempts[index])\r\n        .then(function () { return true; })\r\n        .catch(function () { return runAttempt(index + 1); });\r\n    }\r\n\r\n    return runAttempt(0);\r\n  };\r\n\r\n  HBDCartInstallHubController.prototype._handleTargetAdd = function (btn) {\r\n    // Guard: if a cart install op is already in flight (e.g. empire.js morphdom\r\n    // re-rendered the widget while an add was pending), ignore this click entirely.\r\n    if (window.HBDInstallOpInFlight) return;\r\n\r\n    var raw = this.input ? (this.input.value || '').trim() : '';\r\n    if (!raw || !looksLikePostcode(raw)) {\r\n      this._showFeedback('Enter a valid postcode before adding installation.', 'warning');\r\n      return;\r\n    }\r\n\r\n    if (!this._isEligible(raw)) {\r\n      this._showFeedback(this.bannerExcluded || 'Installation is not available in your area.', 'excluded');\r\n      this._setTargetsVisible(false);\r\n      return;\r\n    }\r\n\r\n    var installVariantId = btn.dataset.installVariantId || '';\r\n    var frameVariantId = btn.dataset.frameVariantId || '';\r\n    var wantsRipoff = !!(this.ripoffToggle && this.ripoffToggle.checked);\r\n    var ripoffSurchargeVariantId = wantsRipoff ? (btn.dataset.ripoffSurchargeVariantId || '') : '';\r\n\r\n    var installVariantIdNum = parseInt(installVariantId, 10);\r\n    var frameVariantIdNum = parseInt(frameVariantId, 10);\r\n    var ripoffSurchargeVariantIdNum = ripoffSurchargeVariantId ? parseInt(ripoffSurchargeVariantId, 10) : 0;\r\n    if (!installVariantIdNum || !frameVariantIdNum) {\r\n      this._showFeedback('Could not identify cart line details. Refresh the page and try again.', 'warning');\r\n      return;\r\n    }\r\n\r\n    if (wantsRipoff && !ripoffSurchargeVariantIdNum) {\r\n      this._showFeedback('Remove & replace service is not yet set up for this product. Please contact us for assistance.', 'warning');\r\n      return;\r\n    }\r\n\r\n    var selectedInstallVariantIdNum = wantsRipoff ? ripoffSurchargeVariantIdNum : installVariantIdNum;\r\n\r\n    var self = this;\r\n    btn.disabled = true;\r\n\r\n    // Signal to hbd-ajax-cart.js that a cart mutation is in progress.\r\n    // This prevents empire.js's cartcount:update (fired mid-add by /cart/add.js)\r\n    // from re-rendering the install widget before the operation is complete,\r\n    // which would put the Add button back and allow duplicate installs.\r\n    window.HBDInstallOpInFlight = true;\r\n\r\n    // Fetch live cart state before touching anything.\r\n    // Dataset values (frameLineKey, frameLine, frameQuantity) are set at Liquid\r\n    // render time and become stale after any AJAX qty change \u2014 both attempts in\r\n    // _tryLinkInstall would then 400. Live data guarantees a fresh key/line/qty.\r\n    // We also use this to detect if the installation is already in the cart so\r\n    // we can skip the /cart/add.js call and prevent duplicate line items.\r\n    fetch('/cart.js', { headers: { Accept: 'application/json' } })\r\n      .then(function (res) { return res.ok ? res.json() : null; })\r\n      .then(function (liveCart) {\r\n        var frameLineKey = '';\r\n        var frameLine = 0;\r\n        var frameQuantity = 1;\r\n        var frameProperties = {};\r\n\r\n        // Find frame item in live cart by variant_id, skip install service lines.\r\n        if (liveCart && liveCart.items) {\r\n          for (var i = 0; i < liveCart.items.length; i++) {\r\n            var ci = liveCart.items[i];\r\n            if (\r\n              String(ci.variant_id) === String(frameVariantIdNum) &&\r\n              !(ci.properties && ci.properties._install_for)\r\n            ) {\r\n              frameLineKey = ci.key;\r\n              frameLine = i + 1;\r\n              frameQuantity = ci.quantity;\r\n              // Carry over any existing non-private properties from the live item.\r\n              if (ci.properties && typeof ci.properties === 'object') {\r\n                var rawProps = ci.properties;\r\n                for (var propKey in rawProps) {\r\n                  if (\r\n                    Object.prototype.hasOwnProperty.call(rawProps, propKey) &&\r\n                    propKey.charAt(0) !== '_'\r\n                  ) {\r\n                    frameProperties[propKey] = rawProps[propKey];\r\n                  }\r\n                }\r\n              }\r\n              break;\r\n            }\r\n          }\r\n        }\r\n\r\n        if (!frameLineKey) {\r\n          var notFoundErr = new Error('Frame item not found in live cart.');\r\n          notFoundErr.notFound = true;\r\n          throw notFoundErr;\r\n        }\r\n\r\n        // Mark the frame item as linked to the selected installation variant\r\n        // (standard or remove/replace).\r\n        frameProperties._linked_install = String(selectedInstallVariantIdNum);\r\n\r\n        var installProperties = { _install_for: String(frameVariantIdNum) };\r\n        if (wantsRipoff) {\r\n          installProperties._ripoff_replace_existing = 'Yes (+25%)';\r\n          installProperties._ripoff_surcharge_percent = String(self.ripoffUpchargePercent);\r\n        }\r\n\r\n        // Pre-flight: if this exact install variant is already in the cart for\r\n        // this frame, skip /cart/add.js \u2014 only re-link and refresh.\r\n        var selectedInstallAlreadyInCart = liveCart && liveCart.items && liveCart.items.some(function (item) {\r\n          return (\r\n            item.properties &&\r\n            String(item.properties._install_for) === String(frameVariantIdNum) &&\r\n            String(item.variant_id) === String(selectedInstallVariantIdNum)\r\n          );\r\n        });\r\n\r\n        return self._tryLinkInstall(frameLineKey, frameLine, frameQuantity, frameProperties)\r\n          .then(function () {\r\n            var itemsToAdd = [];\r\n\r\n            if (wantsRipoff && ripoffSurchargeVariantIdNum) {\r\n              // Add only the replace-existing variant (full install + surcharge in one line).\r\n              if (!selectedInstallAlreadyInCart) {\r\n                itemsToAdd.push({\r\n                  id: ripoffSurchargeVariantIdNum,\r\n                  quantity: frameQuantity,\r\n                  properties: {\r\n                    _install_for: String(frameVariantIdNum),\r\n                    _ripoff_replace_existing: 'Yes (+' + self.ripoffUpchargePercent + '%)'\r\n                  }\r\n                });\r\n              }\r\n            } else if (!selectedInstallAlreadyInCart) {\r\n              // Standard installation only.\r\n              itemsToAdd.push({\r\n                id: installVariantIdNum,\r\n                quantity: frameQuantity,\r\n                properties: installProperties\r\n              });\r\n            }\r\n\r\n            if (!itemsToAdd.length) {\r\n              return null;\r\n            }\r\n\r\n            return self._requestJson('/cart/add.js', {\r\n              items: itemsToAdd\r\n            });\r\n          });\r\n      })\r\n      .then(function () {\r\n        return refreshCartAfterInstallAdd();\r\n      })\r\n      .then(function () {\r\n        window.HBDInstallOpInFlight = false;\r\n        btn.disabled = false;\r\n      })\r\n      .catch(function (err) {\r\n        window.HBDInstallOpInFlight = false;\r\n        btn.disabled = false;\r\n        var msg = '';\r\n        if (err && err.body) {\r\n          try { msg = JSON.parse(err.body).description || ''; } catch (_e) { msg = ''; }\r\n        }\r\n\r\n        if (err && err.notFound) {\r\n          self._showFeedback('Could not locate your cart item. Please refresh the page and try again.', 'warning');\r\n        } else if (/sold out|out of stock|unavailable/i.test(msg)) {\r\n          self._showFeedback('Installation could not be added because the mapped installation product is out of stock.', 'warning');\r\n        } else {\r\n          self._showFeedback(msg || 'Could not add installation. Please try again.', 'warning');\r\n        }\r\n      });\r\n  };\r\n\r\n  function init(root) {\r\n    root = root || document;\r\n    root.querySelectorAll('[data-hbd-install-hub]').forEach(function (el) {\r\n      if (el.dataset.hbdHubInitialized) return;\r\n      el.dataset.hbdHubInitialized = 'true';\r\n      new HBDCartInstallHubController(el);\r\n    });\r\n\r\n    root.querySelectorAll('[data-hbd-install]').forEach(function (el) {\r\n      if (el.dataset.hbdInitialized) return;\r\n      el.dataset.hbdInitialized = 'true';\r\n      new HBDInstallController(el);\r\n    });\r\n  }\r\n\r\n  // Expose for re-initialisation after AJAX widget injection (used by hbd-ajax-cart.js)\r\n  window.HBDInitWidgets = init;\r\n\r\n  if (document.readyState === 'loading') {\r\n    document.addEventListener('DOMContentLoaded', function () { init(); });\r\n  } else {\r\n    init();\r\n  }\r\n\r\n  // Theme editor support\r\n  document.addEventListener('shopify:section:load', function (e) { init(e.target); });\r\n})();\r\n"],
  "mappings": "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",
  "names": []
}
