{
  "version": 3,
  "sources": ["/cdn/shop/t/33/assets/custom.js?cartfix=20260825-18&colourfix=20260909-2"],
  "sourcesContent": ["/**\n * Puffin Plastics custom behaviours.\n */\n(function () {\n  var STANDARD_DPD_RATE_LIMIT_MM = 350;\n  var BASE_PARCEL_LIMIT_MM = 550;\n  var GENERAL_PARCEL_LENGTH_MM = 700;\n  var GENERAL_PARCEL_MIDDLE_MM = 500;\n  var GENERAL_PARCEL_SHORT_MM = 200;\n  var NARROW_PARCEL_LENGTH_MM = 800;\n  var NARROW_PARCEL_CROSS_SECTION_MM = 300;\n  var CALCULATOR_VARIANTS = {\n    '/products/bespoke-acrylic-display-case': {\n      parcel: 54484751319381,\n      higherParcel: 54763088773461,\n      pallet: 54484736999765\n    },\n    '/products/bespoke-acrylic-plinth': {\n      parcel: 54484752892245,\n      higherParcel: 54763088806229,\n      pallet: 54484738277717\n    }\n  };\n  var productPath = window.location.pathname.replace(/\\/$/, '');\n  var variants = CALCULATOR_VARIANTS[productPath];\n\n  if (!variants) return;\n\n  var originalFetch = window.fetch;\n\n  function parseMillimetres(value) {\n    var match = String(value == null ? '' : value).match(/\\d+(?:\\.\\d+)?/);\n    return match ? Number(match[0]) : NaN;\n  }\n\n  function dimensionsFromProperties(properties) {\n    if (!properties || typeof properties !== 'object') return [];\n\n    var dimensions = [];\n\n    Object.keys(properties).forEach(function (key) {\n      var normalizedKey = key.toLowerCase().replace(/[^a-z]+/g, ' ').trim();\n      var value = properties[key];\n\n      if (/^(width|depth|height)( mm)?$/.test(normalizedKey)) {\n        dimensions.push(parseMillimetres(value));\n        return;\n      }\n\n      if (/^size( external)?$/.test(normalizedKey)) {\n        String(value == null ? '' : value)\n          .split(/[x\u00D7]/i)\n          .slice(0, 3)\n          .forEach(function (part) {\n            dimensions.push(parseMillimetres(part));\n          });\n      }\n    });\n\n    return dimensions.filter(Number.isFinite);\n  }\n\n  function dimensionsFromCalculator() {\n    return ['Width', 'Depth', 'Height']\n      .map(function (name) {\n        var input = document.querySelector(\n          '#calculator input[data-identifier=\"' + name + '\"], ' +\n          '#calculator input[data-identifier=\"' + name + ' (mm)\"]'\n        );\n        return input ? parseMillimetres(input.value) : NaN;\n      })\n      .filter(Number.isFinite);\n  }\n\n  function deliveryClass(dimensions) {\n    if (!Array.isArray(dimensions) || dimensions.length < 3) return null;\n\n    var sortedDimensions = dimensions.slice(0, 3).sort(function (a, b) {\n      return b - a;\n    });\n    var fitsBaseParcel = sortedDimensions[0] <= BASE_PARCEL_LIMIT_MM;\n    var fitsGeneralParcel =\n      sortedDimensions[0] <= GENERAL_PARCEL_LENGTH_MM &&\n      sortedDimensions[1] <= GENERAL_PARCEL_MIDDLE_MM &&\n      sortedDimensions[2] <= GENERAL_PARCEL_SHORT_MM;\n    var fitsNarrowParcel =\n      sortedDimensions[0] <= NARROW_PARCEL_LENGTH_MM &&\n      sortedDimensions[1] <= NARROW_PARCEL_CROSS_SECTION_MM &&\n      sortedDimensions[2] <= NARROW_PARCEL_CROSS_SECTION_MM;\n\n    if (!fitsBaseParcel && !fitsGeneralParcel && !fitsNarrowParcel) return 'pallet';\n\n    return sortedDimensions[0] > STANDARD_DPD_RATE_LIMIT_MM ? 'higherParcel' : 'parcel';\n  }\n\n  function deliveryClassLabel(selectedClass) {\n    if (selectedClass === 'pallet') return 'Pallet (outside DPD size limits)';\n    if (selectedClass === 'higherParcel') return 'Higher-rate DPD parcel';\n    return 'Standard DPD parcel';\n  }\n\n  function setDeliveryClassProperty(form, selectedClass) {\n    var property = form.querySelector('input[name=\"properties[_Puffin_delivery_class]\"]');\n\n    if (!property) {\n      property = document.createElement('input');\n      property.type = 'hidden';\n      property.name = 'properties[_Puffin_delivery_class]';\n      form.appendChild(property);\n    }\n\n    property.value = deliveryClassLabel(selectedClass);\n  }\n\n  function routeCalculatorForm(form) {\n    if (!form || !form.querySelector('#calculator')) return;\n\n    var dimensions = dimensionsFromCalculator();\n    var selectedClass = deliveryClass(dimensions);\n    if (selectedClass === null) return;\n\n    var desiredVariant = variants[selectedClass];\n    var oldVariant = form.querySelector('input[name=\"oldId\"], select[name=\"oldId\"]');\n\n    if (!oldVariant) {\n      oldVariant = document.createElement('input');\n      oldVariant.type = 'hidden';\n      oldVariant.name = 'oldId';\n      form.appendChild(oldVariant);\n    }\n\n    if (String(oldVariant.value) !== String(desiredVariant)) {\n      oldVariant.value = String(desiredVariant);\n      oldVariant.dispatchEvent(new Event('change', { bubbles: true }));\n    }\n\n    setDeliveryClassProperty(form, selectedClass);\n    return String(desiredVariant);\n  }\n\n  function routeCalculatorBaseVariant(event) {\n    var target = event && event.target;\n    var button = target && target.closest && target.closest('.product-form__add-button, form.product-form button[type=\"submit\"], form.product-form input[type=\"submit\"]');\n\n    if (!button) return;\n\n    routeCalculatorForm(button.form || button.closest('form.product-form'));\n  }\n\n  /*\n   * Apippa reads oldId in its Add to cart handler. Route that value during the\n   * capture phase so Cart Transform keeps the correct fixed shipping variant.\n   */\n  document.addEventListener('click', routeCalculatorBaseVariant, true);\n  document.addEventListener('submit', function (event) {\n    routeCalculatorForm(event.target);\n  }, true);\n\n  window.PuffinDeliveryRouting = {\n    sync: function () {\n      return routeCalculatorForm(document.querySelector('form.product-form'));\n    },\n    classify: function (dimensions) {\n      return deliveryClass(dimensions);\n    }\n  };\n\n  function routeLineItem(item) {\n    if (!item || (\n      String(item.id) !== String(variants.parcel) &&\n      String(item.id) !== String(variants.higherParcel) &&\n      String(item.id) !== String(variants.pallet)\n    )) {\n      return;\n    }\n\n    var properties = item.properties && typeof item.properties === 'object' ? item.properties : {};\n    var dimensions = dimensionsFromProperties(properties);\n\n    if (dimensions.length < 3) dimensions = dimensionsFromCalculator();\n    if (dimensions.length < 3) return;\n\n    var selectedClass = deliveryClass(dimensions);\n    if (selectedClass === null) return;\n\n    item.id = variants[selectedClass];\n    properties._Puffin_delivery_class = deliveryClassLabel(selectedClass);\n    item.properties = properties;\n  }\n\n  function routePayload(payload) {\n    if (!payload || typeof payload !== 'object') return payload;\n\n    if (Array.isArray(payload.items)) {\n      payload.items.forEach(routeLineItem);\n    } else {\n      routeLineItem(payload);\n    }\n\n    return payload;\n  }\n\n  function isCartAddRequest(input) {\n    var url = typeof input === 'string' ? input : input && input.url;\n    var path = String(url || '').split('?')[0];\n    return /\\/cart\\/add(?:\\.js)?$/.test(path);\n  }\n\n  if (typeof window.fetch !== 'function') return;\n\n  window.fetch = function (input, init) {\n    if (!isCartAddRequest(input) || !init || typeof init.body !== 'string') {\n      return originalFetch.call(window, input, init);\n    }\n\n    try {\n      var payload = JSON.parse(init.body);\n      var routedInit = Object.assign({}, init, {\n        body: JSON.stringify(routePayload(payload))\n      });\n      return originalFetch.call(window, input, routedInit);\n    } catch (error) {\n      return originalFetch.call(window, input, init);\n    }\n  };\n})();\n\n(function () {\n  \"use strict\";\n\n  function normaliseDiscCombination(value) {\n    return String(value || \"\")\n      .replace(/\\s+/g, \" \")\n      .trim()\n      .toLowerCase();\n  }\n\n  function nativeDiscCombination(control) {\n    if (!control) return \"\";\n\n    if (control.tagName === \"SELECT\") {\n      return control.selectedOptions.length ? control.selectedOptions[0].textContent : \"\";\n    }\n\n    if (!control.id) return \"\";\n    var label = document.querySelector('label[for=\"' + CSS.escape(control.id) + '\"]');\n    return label ? label.textContent : \"\";\n  }\n\n  function selectedNativeDiscControl(nativeOption) {\n    return nativeOption.querySelector('select[data-option-position], input[data-option-position]:checked, input[data-option-position][type=\"hidden\"]');\n  }\n\n  function syncDiscDropdownsFromNative(container) {\n    var nativeOption = container.parentElement.querySelector(\"[data-pp-disc-combined]\");\n    if (!nativeOption) return;\n\n    var selectedControl = selectedNativeDiscControl(nativeOption);\n    var selectedCombination = nativeDiscCombination(selectedControl);\n    var match = String(selectedCombination || \"\").match(/^\\s*(.+?)\\s*-\\s*pack of\\s*(.+?)\\s*$/i);\n    if (!match) return;\n\n    var thickness = container.querySelector(\"[data-pp-disc-thickness]\");\n    var pack = container.querySelector(\"[data-pp-disc-pack]\");\n    if (thickness) thickness.value = match[1].trim();\n    if (pack) pack.value = match[2].trim();\n  }\n\n  function selectNativeDiscCombination(container) {\n    var thickness = container.querySelector(\"[data-pp-disc-thickness]\");\n    var pack = container.querySelector(\"[data-pp-disc-pack]\");\n    var nativeOption = container.parentElement.querySelector(\"[data-pp-disc-combined]\");\n    if (!thickness || !pack || !nativeOption) return;\n\n    var requestedCombination = normaliseDiscCombination(thickness.value + \" - Pack of \" + pack.value);\n    var nativeSelect = nativeOption.querySelector(\"select[data-option-position]\");\n\n    if (nativeSelect) {\n      var matchingOption = Array.from(nativeSelect.options).find(function (option) {\n        return normaliseDiscCombination(option.textContent) === requestedCombination;\n      });\n\n      if (!matchingOption) {\n        syncDiscDropdownsFromNative(container);\n        return;\n      }\n\n      if (nativeSelect.value !== matchingOption.value) {\n        nativeSelect.value = matchingOption.value;\n        nativeSelect.dispatchEvent(new Event(\"change\", { bubbles: true }));\n      }\n      return;\n    }\n\n    var matchingInput = Array.from(nativeOption.querySelectorAll(\"input[data-option-position]\")).find(function (input) {\n      return normaliseDiscCombination(nativeDiscCombination(input)) === requestedCombination;\n    });\n\n    if (!matchingInput) {\n      syncDiscDropdownsFromNative(container);\n      return;\n    }\n\n    if (!matchingInput.checked) {\n      matchingInput.checked = true;\n      matchingInput.dispatchEvent(new Event(\"change\", { bubbles: true }));\n    }\n  }\n\n  function initialiseDiscSelectors(root) {\n    var scope = root && root.querySelectorAll ? root : document;\n    var containers = Array.from(scope.querySelectorAll(\"[data-pp-disc-selectors]:not([data-pp-disc-ready])\"));\n    if (scope.matches && scope.matches(\"[data-pp-disc-selectors]:not([data-pp-disc-ready])\")) {\n      containers.unshift(scope);\n    }\n\n    containers.forEach(function (container) {\n      container.setAttribute(\"data-pp-disc-ready\", \"true\");\n      syncDiscDropdownsFromNative(container);\n\n      container.addEventListener(\"change\", function (event) {\n        if (!event.target.matches(\"[data-pp-disc-thickness], [data-pp-disc-pack]\")) return;\n        selectNativeDiscCombination(container);\n      });\n\n      var productForm = container.closest(\"form.product-form\");\n      if (productForm) {\n        productForm.addEventListener(\"variant:change\", function () {\n          syncDiscDropdownsFromNative(container);\n        });\n      }\n    });\n  }\n\n  function startDiscSelectors() {\n    initialiseDiscSelectors(document);\n    new MutationObserver(function (mutations) {\n      mutations.forEach(function (mutation) {\n        mutation.addedNodes.forEach(function (node) {\n          if (node.nodeType === 1) initialiseDiscSelectors(node);\n        });\n      });\n    }).observe(document.body, { childList: true, subtree: true });\n  }\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", startDiscSelectors);\n  } else {\n    startDiscSelectors();\n  }\n})();\n\n/* Store-upgrade customer account notice */\n(function () {\n  \"use strict\";\n\n  var cookieName = \"puffin_account_notice_20260821\";\n\n  function hasDismissalCookie() {\n    return document.cookie.split(\";\").some(function (cookie) {\n      return cookie.trim().indexOf(cookieName + \"=\") === 0;\n    });\n  }\n\n  function setDismissalCookie() {\n    // Intentionally no Expires or Max-Age: this is a browser-session cookie.\n    document.cookie = cookieName + \"=dismissed; Path=/; SameSite=Lax; Secure\";\n  }\n\n  function initialiseAccountNotice() {\n    var notice = document.querySelector(\"[data-puffin-account-notice]\");\n    if (!notice || notice.getAttribute(\"data-puffin-account-notice-ready\") === \"true\") return;\n\n    notice.setAttribute(\"data-puffin-account-notice-ready\", \"true\");\n\n    if (hasDismissalCookie()) {\n      notice.remove();\n      return;\n    }\n\n    var dialog = notice.querySelector(\".puffin-account-notice__dialog\");\n    var closeButton = notice.querySelector(\".puffin-account-notice__close\");\n    var signInLink = notice.querySelector(\"[data-puffin-account-notice-sign-in]\");\n    var dismissButtons = notice.querySelectorAll(\"[data-puffin-account-notice-dismiss]\");\n    var previouslyFocusedElement = null;\n\n    function getFocusableElements() {\n      return Array.prototype.slice.call(\n        dialog.querySelectorAll('a[href], button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])')\n      );\n    }\n\n    function dismissNotice() {\n      setDismissalCookie();\n      notice.classList.remove(\"is-visible\");\n      document.body.classList.remove(\"puffin-account-notice-open\");\n\n      window.setTimeout(function () {\n        notice.hidden = true;\n\n        if (previouslyFocusedElement && typeof previouslyFocusedElement.focus === \"function\") {\n          previouslyFocusedElement.focus({ preventScroll: true });\n        }\n      }, 180);\n    }\n\n    function showNotice() {\n      previouslyFocusedElement = document.activeElement;\n      notice.hidden = false;\n      document.body.classList.add(\"puffin-account-notice-open\");\n\n      window.requestAnimationFrame(function () {\n        notice.classList.add(\"is-visible\");\n        closeButton.focus({ preventScroll: true });\n      });\n    }\n\n    function isCookieConsentVisible() {\n      var cookieBanner = document.getElementById(\"shopify-pc__banner\");\n\n      return Boolean(\n        cookieBanner &&\n        window.getComputedStyle(cookieBanner).display !== \"none\" &&\n        cookieBanner.getClientRects().length\n      );\n    }\n\n    function showAfterCookieConsent() {\n      window.setTimeout(function () {\n        if (!isCookieConsentVisible()) {\n          showNotice();\n          return;\n        }\n\n        var cookieConsentCheck = window.setInterval(function () {\n          if (isCookieConsentVisible()) return;\n\n          window.clearInterval(cookieConsentCheck);\n          window.setTimeout(showNotice, 300);\n        }, 400);\n      }, 650);\n    }\n\n    dismissButtons.forEach(function (button) {\n      button.addEventListener(\"click\", dismissNotice);\n    });\n\n    signInLink.addEventListener(\"click\", setDismissalCookie);\n\n    notice.addEventListener(\"keydown\", function (event) {\n      if (event.key === \"Escape\") {\n        event.preventDefault();\n        dismissNotice();\n        return;\n      }\n\n      if (event.key !== \"Tab\") return;\n\n      var focusableElements = getFocusableElements();\n      if (!focusableElements.length) return;\n\n      var firstElement = focusableElements[0];\n      var lastElement = focusableElements[focusableElements.length - 1];\n\n      if (event.shiftKey && document.activeElement === firstElement) {\n        event.preventDefault();\n        lastElement.focus();\n      } else if (!event.shiftKey && document.activeElement === lastElement) {\n        event.preventDefault();\n        firstElement.focus();\n      }\n    });\n\n    showAfterCookieConsent();\n  }\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", initialiseAccountNotice);\n  } else {\n    initialiseAccountNotice();\n  }\n})();\n\n(function () {\n  var SHEET_PATH = '/products/cut-to-size-plastic-sheet';\n  var DELIVERY_LIMIT_MM = 600;\n\n  if (window.location.pathname.replace(/\\/$/, '') !== SHEET_PATH) return;\n\n  function parseMillimetres(value) {\n    var number = Number(String(value == null ? '' : value).trim());\n    return Number.isFinite(number) ? number : NaN;\n  }\n\n  function ensureSheetDeliveryStyles() {\n    if (document.getElementById('pp-sheet-delivery-styles')) return;\n\n    var style = document.createElement('style');\n    style.id = 'pp-sheet-delivery-styles';\n    style.textContent = [\n      '.pp-sheet-delivery-class{position:absolute!important;width:1px!important;height:1px!important;margin:-1px!important;padding:0!important;border:0!important;overflow:hidden!important;clip:rect(0 0 0 0)!important;clip-path:inset(50%)!important;white-space:nowrap!important;opacity:0!important;pointer-events:none!important}',\n      '.pp-sheet-delivery-notice{grid-column:1/-1;margin:0;padding:12px 14px;border:1px solid #ef3b3a;border-left:4px solid #ef3b3a;border-radius:6px;font-size:14px;font-weight:700;line-height:1.45}',\n      '.pp-sheet-delivery-notice--parcel{background:#f4faf6;color:#174f2d}',\n      '.pp-sheet-delivery-notice--collection{background:#fff2f2;color:#681b1b}'\n    ].join('');\n    document.head.appendChild(style);\n  }\n\n  function getDeliveryNotice(calculator) {\n    var notice = calculator.querySelector('.pp-sheet-delivery-notice');\n    if (notice) return notice;\n\n    notice = document.createElement('div');\n    notice.className = 'pp-sheet-delivery-notice';\n    notice.setAttribute('role', 'status');\n    notice.setAttribute('aria-live', 'polite');\n\n    var price = calculator.querySelector('.price-marker');\n    calculator.insertBefore(notice, price || null);\n    return notice;\n  }\n\n  function deliveryOptionIndex(select, collectionOnly) {\n    var pattern = collectionOnly ? /collection only/i : /delivery.*600mm/i;\n\n    return Array.prototype.findIndex.call(select.options, function (option) {\n      return pattern.test(option.text || option.label || '');\n    });\n  }\n\n  function syncSheetDelivery() {\n    var calculator = document.querySelector('#calculator');\n    var widthInput = document.querySelector('#calculator input[data-identifier=\"Width (mm)\"]');\n    var heightInput = document.querySelector('#calculator input[data-identifier=\"Height (mm)\"]');\n    var deliverySelect = document.querySelector('#calculator select[data-identifier=\"Puffin Delivery Class\"]');\n\n    if (!calculator || !widthInput || !heightInput || !deliverySelect) return false;\n\n    ensureSheetDeliveryStyles();\n\n    var deliveryField = deliverySelect.closest('.element');\n    if (deliveryField) {\n      deliveryField.classList.add('pp-sheet-delivery-class');\n      deliveryField.setAttribute('aria-hidden', 'true');\n    }\n\n    var width = parseMillimetres(widthInput.value);\n    var height = parseMillimetres(heightInput.value);\n    var collectionOnly =\n      (Number.isFinite(width) && width > DELIVERY_LIMIT_MM) ||\n      (Number.isFinite(height) && height > DELIVERY_LIMIT_MM);\n    var desiredIndex = deliveryOptionIndex(deliverySelect, collectionOnly);\n\n    if (desiredIndex !== -1 && deliverySelect.selectedIndex !== desiredIndex) {\n      deliverySelect.selectedIndex = desiredIndex;\n      deliverySelect.dispatchEvent(new Event('input', { bubbles: true }));\n      deliverySelect.dispatchEvent(new Event('change', { bubbles: true }));\n    }\n\n    var notice = getDeliveryNotice(calculator);\n    notice.classList.toggle('pp-sheet-delivery-notice--parcel', !collectionOnly);\n    notice.classList.toggle('pp-sheet-delivery-notice--collection', collectionOnly);\n    var noticeText = collectionOnly\n      ? window.languages.cutSheetDeliveryCollection\n      : window.languages.cutSheetDeliveryParcel;\n    if (notice.textContent !== noticeText) notice.textContent = noticeText;\n\n    return true;\n  }\n\n  function initSheetDelivery() {\n    document.addEventListener('input', function (event) {\n      if (event.target.matches('#calculator input[data-identifier=\"Width (mm)\"], #calculator input[data-identifier=\"Height (mm)\"]')) {\n        syncSheetDelivery();\n      }\n    }, true);\n\n    document.addEventListener('change', function (event) {\n      if (event.target.matches('#calculator input[data-identifier=\"Width (mm)\"], #calculator input[data-identifier=\"Height (mm)\"]')) {\n        syncSheetDelivery();\n      }\n    }, true);\n\n    syncSheetDelivery();\n\n    new MutationObserver(function () {\n      syncSheetDelivery();\n    }).observe(document.body, { childList: true, subtree: true });\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', initSheetDelivery);\n  } else {\n    initSheetDelivery();\n  }\n})();\n\n(function () {\n  var CASE_PATH = '/products/bespoke-acrylic-display-case';\n  var LEGO_CASE_PATH = '/products/bespoke-lego-display-case';\n  var PLINTH_PATH = '/products/bespoke-acrylic-plinth';\n  var SIZE_LIMITS = { 3: 300, 4: 500, 5: 800, 6: 900, 8: 900, 10: 900 };\n  var isAdjustingThickness = false;\n  var ignoreManualThicknessUntil = 0;\n  var settledDimensionTimer = null;\n  var settledDimensionFollowupTimer = null;\n\n  function isCaseCalculatorPage() {\n    var productPath = window.location.pathname.replace(/\\/$/, '');\n    return (\n      (productPath === CASE_PATH || productPath === LEGO_CASE_PATH || productPath === PLINTH_PATH) &&\n      document.body.classList.contains('template-product')\n    );\n  }\n\n  function isDisplayCaseCalculatorPage() {\n    return window.location.pathname.replace(/\\/$/, '') === CASE_PATH;\n  }\n\n  function isPlinthCalculatorPage() {\n    return window.location.pathname.replace(/\\/$/, '') === PLINTH_PATH;\n  }\n\n  function ensureCalculatorStyles() {\n    if (document.getElementById('pp-calculator-safeguard-styles')) return;\n\n    var style = document.createElement('style');\n    style.id = 'pp-calculator-safeguard-styles';\n    style.textContent = [\n      '.pp-calculator-validation{grid-column:1/-1;padding:12px 14px;margin:0;background:#fff2f2;border:1px solid #ef3b3a;border-left:4px solid #ef3b3a;border-radius:6px;color:#681b1b;font-size:14px;font-weight:600;line-height:1.45}',\n      '.pp-calculator-validation[hidden]{display:none!important}',\n      '#calculator #alert-block.hide-element{display:none!important}',\n      '#calculator input.pp-calculator-invalid{border-color:#ef3b3a!important;box-shadow:0 0 0 2px rgba(239,59,58,.14)!important}',\n      '#calculator.pp-display-case-calculator>.element[data-element=\"Thickness\"]{order:-9}',\n      '#calculator.pp-display-case-calculator>.element[data-element=\"Width\"]{order:-8}',\n      '#calculator.pp-display-case-calculator>.element[data-element=\"Depth\"]{order:-7}',\n      '#calculator.pp-display-case-calculator>.element[data-element=\"Height\"]{order:-6}',\n      '#calculator.pp-display-case-calculator>.element[data-element=\"Add Base\"]{order:-5}',\n      '#calculator.pp-display-case-calculator>.element[data-element=\"Colour\"]{order:-4}',\n      '#calculator.pp-display-case-calculator>.element[data-element=\"Add Grass Effect\"]{order:-3}',\n      '#calculator.pp-display-case-calculator>.element[data-element=\"Add Mirror Backing\"]{order:-2}',\n      '#calculator.pp-display-case-calculator>.element[data-element=\"Fast Production\"]{order:-1}',\n      '#calculator>.pp-calculator-quote{order:-1;min-width:0;padding:10px;background:#fff;border:1px solid #dce0e5;border-radius:6px;display:flex;flex-direction:column;justify-content:center;gap:6px}',\n      '#calculator .pp-calculator-quote__label{margin:0;color:#101318;font-size:14px;font-weight:700;line-height:1.4}',\n      '#calculator .pp-calculator-quote__button{display:flex;align-items:center;justify-content:center;min-height:44px;padding:9px 10px;border:1px solid #c22f2e;border-radius:5px;background:#c22f2e;color:#fff;font-size:14px;font-weight:700;line-height:1.35;text-align:center;text-decoration:none;white-space:normal}',\n      '#calculator .pp-calculator-quote__button:hover{background:#a52625;border-color:#a52625}',\n      '#calculator .pp-calculator-quote__button:focus-visible{outline:3px solid #101318;outline-offset:3px}',\n      '.product-form__add-button{margin-top:12px!important}',\n      '.product-form__add-button:disabled{cursor:not-allowed;opacity:.55}'\n    ].join('');\n    document.head.appendChild(style);\n  }\n\n  function getAddButton() {\n    return document.querySelector('.product-form__add-button:not(.pp-permanent-add-to-cart):not(.pp-purchase-guard__button):not(.pp-apo-add-to-cart-proxy):not(.mw-apo-add-to-cart-cloned):not(.mw-apo-add-to-cart-custom)');\n  }\n\n  function setAddButtonState(state) {\n    var button = getAddButton();\n    if (!button) return;\n\n    if (!button.dataset.ppReadyText) {\n      button.dataset.ppReadyText = button.textContent.trim() || 'Add to cart';\n      button.dataset.ppInitiallyDisabled = String(button.disabled);\n    }\n\n    if (button.dataset.ppState === state) return;\n    button.dataset.ppState = state;\n\n    if (state === 'loading') {\n      button.disabled = true;\n      button.setAttribute('aria-disabled', 'true');\n      button.textContent = 'Loading calculator...';\n      return;\n    }\n\n    if (state === 'invalid') {\n      button.disabled = true;\n      button.setAttribute('aria-disabled', 'true');\n      button.textContent = 'Check measurements';\n      return;\n    }\n\n    button.disabled = button.dataset.ppInitiallyDisabled === 'true';\n    if (!button.disabled) button.removeAttribute('aria-disabled');\n    button.textContent = button.dataset.ppReadyText;\n  }\n\n  function syncGrassEffect() {\n    var baseSelect = document.querySelector('#calculator select[data-identifier=\"Add Base\"], #calculator select[data-identifier=\"Base Colour\"]');\n    var baseRadio = document.querySelector('#calculator input[type=\"radio\"][data-identifier=\"Add Base\"]:checked, #calculator input[type=\"radio\"][data-identifier=\"Base Colour\"]:checked');\n    var colourSelect = document.querySelector('#calculator select[data-identifier=\"Colour\"]');\n    var grassSelect = document.querySelector('#calculator select[data-identifier=\"Add Grass Effect\"]');\n    var grassField = grassSelect && grassSelect.closest('.element');\n    var baseControl = baseSelect || baseRadio;\n    var baseField = baseControl && baseControl.closest('.element');\n    var colourField = colourSelect && colourSelect.closest('.element');\n\n    if (!baseControl || !grassSelect || !grassField) return !isDisplayCaseCalculatorPage();\n\n    var selectedBase = baseSelect && baseSelect.options[baseSelect.selectedIndex];\n    var selectedValue = selectedBase\n      ? selectedBase.dataset.val || selectedBase.value || selectedBase.text\n      : baseRadio.value || baseRadio.dataset.label || baseRadio.dataset.val;\n    var normalizedValue = String(selectedValue || '').trim().toLowerCase();\n    var hasBase = normalizedValue !== '0' && normalizedValue !== 'no base';\n\n    if (colourSelect) {\n      Array.prototype.forEach.call(colourSelect.options, function (option) {\n        if (!option.dataset.ppOriginalVal) option.dataset.ppOriginalVal = option.dataset.val || '0';\n        option.dataset.val = hasBase ? option.dataset.ppOriginalVal : '0';\n      });\n    }\n\n    var noGrassOption = Array.prototype.find.call(grassSelect.options, function (option) {\n      return String(option.text || option.label || '').trim().toLowerCase() === 'no';\n    });\n\n    if (!hasBase && noGrassOption && grassSelect.value !== noGrassOption.value) {\n      grassSelect.value = noGrassOption.value;\n      grassSelect.dispatchEvent(new Event('input', { bubbles: true }));\n      grassSelect.dispatchEvent(new Event('change', { bubbles: true }));\n    }\n\n    grassField.hidden = !hasBase;\n    grassField.setAttribute('aria-hidden', String(!hasBase));\n    grassField.style.display = hasBase ? '' : 'none';\n    return true;\n  }\n\n  function syncCaseFieldLabels() {\n    if (!isDisplayCaseCalculatorPage()) return;\n\n    ['Width', 'Depth', 'Height'].forEach(function (name) {\n      var input = document.querySelector('#calculator input[data-identifier=\"' + name + '\"]');\n      var field = input && input.closest('.element');\n      var label = field && field.querySelector('label');\n      var labelText = name + ' (mm)';\n\n      if (label && label.textContent.trim() === name) label.textContent = labelText;\n      if (input && input.getAttribute('aria-label') !== labelText) input.setAttribute('aria-label', labelText);\n    });\n\n    var colourControl = document.querySelector('#calculator [data-identifier=\"Colour\"]');\n    var colourField = colourControl && colourControl.closest('.element');\n    var colourLabel = colourField && colourField.querySelector('label');\n\n    if (colourLabel && String(colourLabel.textContent || '').trim().toLowerCase() === 'colour') {\n      colourLabel.textContent = 'Base Colour';\n    }\n  }\n\n  function syncCaseQuoteLink(calculator) {\n    if (!isDisplayCaseCalculatorPage() || calculator.querySelector('.pp-calculator-quote')) return;\n\n    var fastProduction = calculator.querySelector('.element[data-element=\"Fast Production\"]');\n    if (!fastProduction) return;\n\n    var card = document.createElement('div');\n    card.className = 'pp-calculator-quote';\n    var label = document.createElement('p');\n    label.className = 'pp-calculator-quote__label';\n    label.textContent = 'Need a larger size?';\n    var link = document.createElement('a');\n    link.className = 'pp-calculator-quote__button';\n    link.href = '/pages/large-bespoke-quote';\n    link.textContent = 'Request a bespoke quote';\n    card.appendChild(label);\n    card.appendChild(link);\n    fastProduction.insertAdjacentElement('afterend', card);\n  }\n\n  function getValidationMessage(calculator) {\n    var message = calculator.querySelector('.pp-calculator-validation');\n    if (message) return message;\n\n    message = document.createElement('div');\n    message.id = 'pp-calculator-validation';\n    message.className = 'pp-calculator-validation';\n    message.setAttribute('role', 'alert');\n    message.hidden = true;\n\n    var price = calculator.querySelector('.price-marker');\n    calculator.insertBefore(message, price || null);\n    return message;\n  }\n\n  function optionThickness(option) {\n    var raw = option && (option.dataset.val || option.value || option.text);\n    var match = String(raw || '').match(/\\d+(?:\\.\\d+)?/);\n    return match ? Number(match[0]) : NaN;\n  }\n\n  function requiredThicknessFor(maximumDimension, thicknessSelect) {\n    var required = null;\n\n    Array.prototype.forEach.call(thicknessSelect.options, function (option) {\n      var thickness = optionThickness(option);\n      var limit = SIZE_LIMITS[thickness];\n\n      if (!limit || maximumDimension > limit) return;\n      if (required === null || thickness < required) required = thickness;\n    });\n\n    return required;\n  }\n\n  function syncPlinthMaterial(thicknessSelect) {\n    var result = {\n      isRestricted: false,\n      label: 'Clear'\n    };\n\n    if (!isPlinthCalculatorPage()) return result;\n\n    var acrylicColourSelect = document.querySelector(\n      '#calculator select[data-identifier=\"Acrylic Colour\"]'\n    );\n    var legacyColourSelect = document.querySelector(\n      '#calculator select[data-identifier=\"Colour\"]'\n    );\n\n    if (!acrylicColourSelect) return result;\n\n    var selectedColour = acrylicColourSelect.options[acrylicColourSelect.selectedIndex];\n    var colourLabel = String(\n      selectedColour && (selectedColour.text || selectedColour.label) || 'Clear'\n    ).trim();\n    var normalizedColour = colourLabel.toLowerCase();\n\n    result.label = colourLabel;\n    result.isRestricted = normalizedColour === 'black' || normalizedColour === 'white';\n\n    if (legacyColourSelect) {\n      var legacyField = legacyColourSelect.closest('.element');\n      var desiredLegacyColour = result.isRestricted ? 'coloured' : 'clear';\n      var desiredLegacyIndex = Array.prototype.findIndex.call(\n        legacyColourSelect.options,\n        function (option) {\n          return String(option.text || option.label || '').trim().toLowerCase() === desiredLegacyColour;\n        }\n      );\n\n      if (legacyField) {\n        legacyField.hidden = true;\n        legacyField.setAttribute('aria-hidden', 'true');\n        legacyField.style.display = 'none';\n      }\n\n      if (desiredLegacyIndex !== -1 && legacyColourSelect.selectedIndex !== desiredLegacyIndex) {\n        legacyColourSelect.selectedIndex = desiredLegacyIndex;\n        legacyColourSelect.dispatchEvent(new Event('input', { bubbles: true }));\n        legacyColourSelect.dispatchEvent(new Event('change', { bubbles: true }));\n      }\n    }\n\n    Array.prototype.forEach.call(thicknessSelect.options, function (option) {\n      var thickness = optionThickness(option);\n\n      if (!Object.prototype.hasOwnProperty.call(option.dataset, 'ppOriginalDisabled')) {\n        option.dataset.ppOriginalDisabled = String(option.disabled);\n      }\n\n      option.disabled = result.isRestricted\n        ? thickness !== 5\n        : option.dataset.ppOriginalDisabled === 'true';\n      option.hidden = result.isRestricted && thickness !== 5;\n    });\n\n    if (result.isRestricted) {\n      var fiveMillimetreIndex = Array.prototype.findIndex.call(\n        thicknessSelect.options,\n        function (option) {\n          return optionThickness(option) === 5;\n        }\n      );\n\n      if (fiveMillimetreIndex !== -1 && thicknessSelect.selectedIndex !== fiveMillimetreIndex) {\n        thicknessSelect.selectedIndex = fiveMillimetreIndex;\n        delete thicknessSelect.dataset.ppManualChoice;\n        thicknessSelect.dataset.ppAutoAdjusted = 'true';\n        isAdjustingThickness = true;\n        try {\n          thicknessSelect.dispatchEvent(new Event('input', { bubbles: true }));\n          thicknessSelect.dispatchEvent(new Event('change', { bubbles: true }));\n        } finally {\n          isAdjustingThickness = false;\n        }\n      }\n    }\n\n    return result;\n  }\n\n  function syncSizeRules() {\n    var calculator = document.querySelector('#calculator');\n    var thicknessSelect = document.querySelector(\n      '#calculator select[data-identifier=\"Thickness\"], ' +\n      '#calculator select[data-identifier=\"Thickness (mm)\"]'\n    );\n    var fields = ['Width', 'Height', 'Depth'];\n    var inputs = fields.map(function (name) {\n      return document.querySelector(\n        '#calculator input[data-identifier=\"' + name + '\"], ' +\n        '#calculator input[data-identifier=\"' + name + ' (mm)\"]'\n      );\n    });\n\n    if (!calculator || !thicknessSelect || inputs.some(function (input) { return !input; })) return null;\n\n    var plinthMaterial = syncPlinthMaterial(thicknessSelect);\n    var values = inputs.map(function (input) { return Number(input.value); });\n    var overallMaximum = Math.max.apply(null, Object.keys(SIZE_LIMITS).map(function (key) {\n      return SIZE_LIMITS[key];\n    }));\n    var permittedMaximum = plinthMaterial.isRestricted ? SIZE_LIMITS[5] : overallMaximum;\n    var hasMinimumDimensions = values.every(function (value) {\n      return Number.isFinite(value) && value >= 50;\n    });\n    var maximumDimension = hasMinimumDimensions ? Math.max.apply(null, values) : 0;\n    var requiredThickness = null;\n\n    if (hasMinimumDimensions) {\n      requiredThickness = plinthMaterial.isRestricted\n        ? maximumDimension <= permittedMaximum ? 5 : null\n        : requiredThicknessFor(maximumDimension, thicknessSelect);\n    }\n\n    var selectedThickness = optionThickness(thicknessSelect.options[thicknessSelect.selectedIndex]);\n    var hasManualThickness = thicknessSelect.dataset.ppManualChoice === 'true';\n    var selectedThicknessIsTooThin = requiredThickness && selectedThickness < requiredThickness;\n    var shouldAdjustThickness = requiredThickness && (\n      selectedThicknessIsTooThin ||\n      (!hasManualThickness && selectedThickness !== requiredThickness)\n    );\n\n    if (shouldAdjustThickness) {\n      var requiredIndex = Array.prototype.findIndex.call(thicknessSelect.options, function (option) {\n        return optionThickness(option) === requiredThickness;\n      });\n\n      if (requiredIndex !== -1) {\n        thicknessSelect.selectedIndex = requiredIndex;\n        selectedThickness = requiredThickness;\n        delete thicknessSelect.dataset.ppManualChoice;\n        thicknessSelect.dataset.ppAutoAdjusted = 'true';\n        if (selectedThicknessIsTooThin) ignoreManualThicknessUntil = Date.now() + 100;\n        isAdjustingThickness = true;\n        try {\n          thicknessSelect.dispatchEvent(new Event('input', { bubbles: true }));\n          thicknessSelect.dispatchEvent(new Event('change', { bubbles: true }));\n        } finally {\n          isAdjustingThickness = false;\n        }\n      }\n    }\n\n    var selectedMaximum = plinthMaterial.isRestricted\n      ? permittedMaximum\n      : SIZE_LIMITS[selectedThickness] || overallMaximum;\n    inputs.forEach(function (input) {\n      input.min = '50';\n      input.max = String(selectedMaximum);\n    });\n\n    var invalidFields = [];\n    inputs.forEach(function (input, index) {\n      var value = Number(input.value);\n      var invalid = !Number.isFinite(value) || value < 50 || value > permittedMaximum;\n      var message = fields[index] + ' must be between 50mm and ' + permittedMaximum + 'mm.';\n\n      input.setCustomValidity(invalid ? message : '');\n      input.classList.toggle('pp-calculator-invalid', invalid);\n      input.setAttribute('aria-invalid', String(invalid));\n\n      if (invalid) {\n        input.setAttribute('aria-describedby', 'pp-calculator-validation');\n        invalidFields.push(fields[index]);\n      } else {\n        input.removeAttribute('aria-describedby');\n      }\n    });\n\n    var validation = getValidationMessage(calculator);\n    if (invalidFields.length) {\n      if (plinthMaterial.isRestricted) {\n        validation.textContent = plinthMaterial.label + ' acrylic is only available in 5mm, so Width, Height and Depth must each be between 50mm and ' + permittedMaximum + 'mm.';\n      } else {\n        var invalidNames = invalidFields.join(', ');\n        var requirement = invalidFields.length === 1 ? ' must be ' : ' must each be ';\n        validation.textContent = invalidNames + requirement + 'between 50mm and ' + permittedMaximum + 'mm. Please adjust the measurements.';\n      }\n      validation.hidden = false;\n      setAddButtonState('invalid');\n    } else if (plinthMaterial.isRestricted) {\n      validation.textContent = plinthMaterial.label + ' acrylic is available in 5mm only. Material thickness has been set to 5mm.';\n      validation.hidden = false;\n      setAddButtonState('ready');\n    } else if (requiredThickness && thicknessSelect.dataset.ppAutoAdjusted === 'true') {\n      validation.textContent = 'Material thickness has been set to ' + requiredThickness + 'mm because the largest dimension is ' + maximumDimension + 'mm.';\n      validation.hidden = false;\n      setAddButtonState('ready');\n    } else if (requiredThickness && selectedThickness > requiredThickness) {\n      validation.textContent = selectedThickness + 'mm acrylic is selected. The minimum required for the largest dimension of ' + maximumDimension + 'mm is ' + requiredThickness + 'mm.';\n      validation.hidden = false;\n      setAddButtonState('ready');\n    } else {\n      validation.textContent = '';\n      validation.hidden = true;\n      setAddButtonState('ready');\n    }\n\n    return invalidFields.length === 0;\n  }\n\n  function syncCaseCalculator(eventTarget) {\n    var calculator = document.querySelector('#calculator');\n    if (!calculator) {\n      setAddButtonState('loading');\n      return false;\n    }\n\n    calculator.classList.toggle('pp-display-case-calculator', isDisplayCaseCalculatorPage());\n\n    var thicknessSelect = document.querySelector(\n      '#calculator select[data-identifier=\"Thickness\"], ' +\n      '#calculator select[data-identifier=\"Thickness (mm)\"]'\n    );\n    if (eventTarget && eventTarget === thicknessSelect && Date.now() > ignoreManualThicknessUntil) {\n      thicknessSelect.dataset.ppManualChoice = 'true';\n      delete thicknessSelect.dataset.ppAutoAdjusted;\n    }\n\n    syncCaseFieldLabels();\n    syncCaseQuoteLink(calculator);\n    var grassReady = syncGrassEffect();\n    var sizesReady = syncSizeRules();\n    return grassReady && sizesReady !== null;\n  }\n\n  function scheduleSettledDisplayCaseCalculation(input) {\n    if (\n      !isDisplayCaseCalculatorPage() ||\n      !input ||\n      !input.matches(\n        '#calculator input[data-identifier=\"Width\"], ' +\n        '#calculator input[data-identifier=\"Depth\"], ' +\n        '#calculator input[data-identifier=\"Height\"]'\n      )\n    ) {\n      return;\n    }\n\n    window.clearTimeout(settledDimensionTimer);\n    window.clearTimeout(settledDimensionFollowupTimer);\n\n    function requestCurrentPrice() {\n      if (!input.isConnected || (input.validity && !input.validity.valid)) return;\n      input.dispatchEvent(new Event('change', { bubbles: true }));\n    }\n\n    /*\n     * CPC queues a calculation for each keystroke. When several dimensions are\n     * entered quickly, an older response can otherwise overwrite the price for\n     * the final values until the shopper leaves the last field. Re-request the\n     * settled values, then repeat once after the older queue has drained.\n     */\n    settledDimensionTimer = window.setTimeout(requestCurrentPrice, 700);\n    settledDimensionFollowupTimer = window.setTimeout(requestCurrentPrice, 2800);\n  }\n\n  function init() {\n    if (document.querySelector('[data-pp-calc]') && document.body.classList.contains('template-product')) {\n      document.body.classList.add('pp-hide-price');\n    }\n\n    if (!isCaseCalculatorPage()) return;\n\n    ensureCalculatorStyles();\n    setAddButtonState('loading');\n\n    document.addEventListener('input', function (event) {\n      if (!isAdjustingThickness && event.target.matches('#calculator [data-identifier]')) {\n        syncCaseCalculator(event.target);\n        scheduleSettledDisplayCaseCalculation(event.target);\n      }\n    }, true);\n\n    document.addEventListener('change', function (event) {\n      if (!isAdjustingThickness && event.target.matches('#calculator [data-identifier]')) syncCaseCalculator(event.target);\n    }, true);\n\n    if (!syncCaseCalculator()) {\n      var observer = new MutationObserver(function () {\n        if (syncCaseCalculator()) observer.disconnect();\n      });\n      observer.observe(document.documentElement, { childList: true, subtree: true });\n    }\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n\n(function () {\n  var SHELVING_PATH = '/products/bespoke-acrylic-shelving';\n  var isUpdatingThickness = false;\n  var syncScheduled = false;\n\n  function isShelvingCalculatorPage() {\n    return (\n      window.location.pathname.replace(/\\/$/, '') === SHELVING_PATH &&\n      document.body.classList.contains('template-product')\n    );\n  }\n\n  function optionThickness(option) {\n    var raw = option && (option.dataset.val || option.value || option.text);\n    var match = String(raw || '').match(/\\d+(?:\\.\\d+)?/);\n    return match ? Number(match[0]) : NaN;\n  }\n\n  function getMessage(calculator) {\n    var message = calculator.querySelector('.pp-shelving-thickness-note');\n    if (message) return message;\n\n    message = document.createElement('div');\n    message.className = 'pp-shelving-thickness-note';\n    message.setAttribute('role', 'status');\n\n    var price = calculator.querySelector('.price-marker');\n    calculator.insertBefore(message, price || null);\n    return message;\n  }\n\n  function ensureStyles() {\n    if (document.getElementById('pp-shelving-thickness-styles')) return;\n\n    var style = document.createElement('style');\n    style.id = 'pp-shelving-thickness-styles';\n    style.textContent = '.pp-shelving-thickness-note{grid-column:1/-1;padding:10px 12px;margin:0;background:#fff7f7;border:1px solid #ef3b3a;border-left:4px solid #ef3b3a;border-radius:6px;color:#681b1b;font-size:13px;font-weight:600;line-height:1.4}';\n    document.head.appendChild(style);\n  }\n\n  function finishRules(finishLabel) {\n    var normalized = String(finishLabel || '').trim().toLowerCase();\n\n    if (normalized === 'coloured') {\n      return {\n        allowed: [5],\n        message: 'Coloured acrylic shelving is available in 5mm only.'\n      };\n    }\n\n    if (normalized === 'glass effect') {\n      return {\n        allowed: [5, 10],\n        message: 'Glass Effect acrylic shelving is available in 5mm or 10mm.'\n      };\n    }\n\n    return {\n      allowed: [5, 8, 10],\n      message: 'Clear acrylic shelving is available in 5mm, 8mm or 10mm.'\n    };\n  }\n\n  function syncShelvingThickness() {\n    if (!isShelvingCalculatorPage()) return false;\n\n    var calculator = document.querySelector('#calculator');\n    var finishSelect = document.querySelector('#calculator select[data-identifier=\"Finish\"]');\n    var thicknessSelect = document.querySelector('#calculator select[data-identifier=\"Thickness (mm)\"]');\n\n    if (!calculator || !finishSelect || !thicknessSelect) return false;\n\n    ensureStyles();\n\n    var selectedFinish = finishSelect.options[finishSelect.selectedIndex];\n    var rules = finishRules(selectedFinish && (selectedFinish.text || selectedFinish.label));\n    var selectedThickness = optionThickness(thicknessSelect.options[thicknessSelect.selectedIndex]);\n\n    Array.prototype.forEach.call(thicknessSelect.options, function (option) {\n      var thickness = optionThickness(option);\n\n      if (!Object.prototype.hasOwnProperty.call(option.dataset, 'ppShelvingOriginalDisabled')) {\n        option.dataset.ppShelvingOriginalDisabled = String(option.disabled);\n      }\n\n      var isAllowed = rules.allowed.indexOf(thickness) !== -1;\n      option.disabled = !isAllowed || option.dataset.ppShelvingOriginalDisabled === 'true';\n      option.hidden = !isAllowed;\n    });\n\n    if (rules.allowed.indexOf(selectedThickness) === -1) {\n      var fallbackIndex = Array.prototype.findIndex.call(thicknessSelect.options, function (option) {\n        return optionThickness(option) === 5;\n      });\n\n      if (fallbackIndex !== -1) {\n        thicknessSelect.selectedIndex = fallbackIndex;\n        isUpdatingThickness = true;\n        try {\n          thicknessSelect.dispatchEvent(new Event('input', { bubbles: true }));\n          thicknessSelect.dispatchEvent(new Event('change', { bubbles: true }));\n        } finally {\n          isUpdatingThickness = false;\n        }\n      }\n    }\n\n    getMessage(calculator).textContent = rules.message;\n    return true;\n  }\n\n  function scheduleSync() {\n    if (syncScheduled) return;\n    syncScheduled = true;\n    window.requestAnimationFrame(function () {\n      syncScheduled = false;\n      syncShelvingThickness();\n    });\n  }\n\n  function init() {\n    if (!isShelvingCalculatorPage()) return;\n\n    document.addEventListener('input', function (event) {\n      if (\n        !isUpdatingThickness &&\n        event.target.matches(\n          '#calculator select[data-identifier=\"Finish\"], ' +\n          '#calculator select[data-identifier=\"Thickness (mm)\"]'\n        )\n      ) {\n        syncShelvingThickness();\n      }\n    }, true);\n\n    document.addEventListener('change', function (event) {\n      if (\n        !isUpdatingThickness &&\n        event.target.matches(\n          '#calculator select[data-identifier=\"Finish\"], ' +\n          '#calculator select[data-identifier=\"Thickness (mm)\"]'\n        )\n      ) {\n        syncShelvingThickness();\n      }\n    }, true);\n\n    syncShelvingThickness();\n\n    new MutationObserver(scheduleSync).observe(document.documentElement, {\n      childList: true,\n      subtree: true\n    });\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n\n\n/* Puffin Myra staged option groups */\n(function () {\n  var vinylValidationSequence = 0;\n\n  function normalise(value) {\n    return (value || '').toLowerCase().replace(/[^a-z0-9]+/g, ' ').trim();\n  }\n\n  function stageFor(label, index, previousStage) {\n    var text = normalise(label);\n\n    if (/optional extras?/.test(text)) return 'extras';\n    if (/back (photo|image)/.test(text)) return 'back-photo';\n    if (/mirror.*(engraved|engraving|logo|crest)/.test(text)) return 'mirror-engraving';\n    if (/lid.*(engraved|engraving|logo|crest|position)/.test(text)) return 'lid-engraving';\n\n    if (\n      /(case )?vinyl writing/.test(text) ||\n      /(team|club) name/.test(text) ||\n      /personalisation text/.test(text) ||\n      /personalization text/.test(text) ||\n      /inscription/.test(text)\n    ) {\n      return 'personalisation';\n    }\n\n    if (\n      /vinyl lettering/.test(text) ||\n      /(team|club|case|vinyl|inscription|personalisation|personalization|name).*(font|colour|color|position)/.test(text)\n    ) {\n      return 'personalisation';\n    }\n\n    if (/(font|colour|color|position)/.test(text) && previousStage) {\n      return previousStage;\n    }\n\n    return 'option-' + index;\n  }\n\n  function syncInscriptionFont(parent) {\n    if (!parent) return;\n\n    var rows = Array.prototype.slice.call(parent.querySelectorAll(':scope > .mw-option'));\n    var inscriptionPlaqueRow = rows.find(function (row) {\n      var labelNode = row.querySelector('.mw-text--style-strong');\n      var label = normalise(labelNode ? labelNode.textContent : '');\n      return label === 'inscription plaque' || label === 'inscription plaque text';\n    });\n    var inscriptionFontRow = rows.find(function (row) {\n      var labelNode = row.querySelector('.mw-text--style-strong');\n      return normalise(labelNode ? labelNode.textContent : '') === 'inscription font';\n    });\n\n    if (!inscriptionPlaqueRow || !inscriptionFontRow) return;\n\n    var inscriptionControl = inscriptionPlaqueRow.querySelector('input:not([type=\"hidden\"]), textarea');\n    var fontControl = inscriptionFontRow.querySelector('select, input:not([type=\"hidden\"])');\n    if (!inscriptionControl || !fontControl) return;\n\n    var hasInscription = inscriptionControl.value.trim().length > 0;\n    var isPurchasePrime = fontControl.dataset.ppApoPurchasePrime === 'true';\n    fontControl.disabled = !hasInscription && !isPurchasePrime;\n    inscriptionFontRow.classList.toggle('pp-inscription-font-inactive', !hasInscription);\n\n    if (hasInscription || isPurchasePrime) {\n      fontControl.removeAttribute('aria-disabled');\n    } else {\n      fontControl.setAttribute('aria-disabled', 'true');\n    }\n  }\n\n  function primeBlankInscriptionFontsForPurchase(productForm) {\n    var primedControls = [];\n    if (!productForm) return function () {};\n\n    productForm.querySelectorAll('.mw-apo-container').forEach(function (parent) {\n      var rows = Array.prototype.slice.call(parent.querySelectorAll(':scope > .mw-option'));\n      var inscriptionPlaqueRow = rows.find(function (row) {\n        var labelNode = row.querySelector('.mw-text--style-strong');\n        var label = normalise(labelNode ? labelNode.textContent : '');\n        return label === 'inscription plaque' || label === 'inscription plaque text';\n      });\n      var inscriptionFontRow = rows.find(function (row) {\n        var labelNode = row.querySelector('.mw-text--style-strong');\n        return normalise(labelNode ? labelNode.textContent : '') === 'inscription font';\n      });\n      var inscriptionControl = inscriptionPlaqueRow\n        ? inscriptionPlaqueRow.querySelector('input:not([type=\"hidden\"]), textarea')\n        : null;\n      var fontControl = inscriptionFontRow ? inscriptionFontRow.querySelector('select') : null;\n\n      if (!inscriptionControl || inscriptionControl.value.trim() || !fontControl || fontControl.value) return;\n\n      var choices = Array.prototype.slice.call(fontControl.options).filter(function (option) {\n        return Boolean(option.value) && !option.disabled;\n      });\n      var fallback = choices.find(function (option) {\n        return normalise(option.textContent) === 'arial';\n      }) || choices[0];\n      if (!fallback) return;\n\n      fontControl.dataset.ppApoPurchasePrime = 'true';\n      fontControl.disabled = false;\n      fontControl.removeAttribute('aria-disabled');\n      fontControl.value = fallback.value;\n      fontControl.dispatchEvent(new Event('change', { bubbles: true }));\n      primedControls.push({ parent: parent, control: fontControl, value: fallback.value });\n    });\n\n    return function () {\n      primedControls.forEach(function (item) {\n        delete item.control.dataset.ppApoPurchasePrime;\n        if (item.control.value === item.value) {\n          item.control.value = '';\n          item.control.dispatchEvent(new Event('change', { bubbles: true }));\n        }\n        syncInscriptionFont(item.parent);\n      });\n    };\n  }\n\n  function getBlankInscriptionFontOptionIds() {\n    var optionIds = [];\n\n    document.querySelectorAll('.mw-apo-container').forEach(function (parent) {\n      var rows = Array.prototype.slice.call(parent.querySelectorAll(':scope > .mw-option'));\n      var inscriptionPlaqueRow = rows.find(function (row) {\n        var labelNode = row.querySelector('.mw-text--style-strong');\n        var label = normalise(labelNode ? labelNode.textContent : '');\n        return label === 'inscription plaque' || label === 'inscription plaque text';\n      });\n      var inscriptionFontRow = rows.find(function (row) {\n        var labelNode = row.querySelector('.mw-text--style-strong');\n        return normalise(labelNode ? labelNode.textContent : '') === 'inscription font';\n      });\n      var inscriptionControl = inscriptionPlaqueRow\n        ? inscriptionPlaqueRow.querySelector('input:not([type=\"hidden\"]), textarea')\n        : null;\n\n      if (\n        inscriptionControl &&\n        !inscriptionControl.value.trim() &&\n        inscriptionFontRow &&\n        inscriptionFontRow.dataset.optionId\n      ) {\n        optionIds.push(inscriptionFontRow.dataset.optionId);\n      }\n    });\n\n    return optionIds;\n  }\n\n  function removeBlankInscriptionFontsFromPayload(payload) {\n    var optionIds = getBlankInscriptionFontOptionIds();\n    if (!optionIds.length || !payload || !payload.state || !payload.state.values) return payload;\n\n    optionIds.forEach(function (blankOptionId) {\n      if (!payload.state.options) return;\n      var normalisedId = String(blankOptionId).replace(/^o_/, '');\n      var option = payload.state.options[blankOptionId] ||\n        payload.state.options[normalisedId] ||\n        payload.state.options['o_' + normalisedId];\n      if (option) option.is_required = false;\n    });\n\n    Object.keys(payload.state.values).forEach(function (valueId) {\n      var value = payload.state.values[valueId];\n      var optionId = value && String(value.option_id || '').replace(/^o_/, '');\n      var isBlankInscriptionFont = optionIds.some(function (blankOptionId) {\n        return optionId === String(blankOptionId).replace(/^o_/, '');\n      });\n\n      if (isBlankInscriptionFont) value.enabled = false;\n    });\n\n    return payload;\n  }\n\n  function vinylRequirementForRow(row) {\n    var labelNode = row.querySelector('.mw-text--style-strong');\n    var label = normalise(labelNode ? labelNode.textContent : '');\n\n    if (/vinyl.*font|lettering.*font/.test(label)) return 'font';\n    if (/vinyl.*colou?r|lettering.*colou?r/.test(label)) return 'colour';\n    if (/(team|club|case|vinyl).*position|name position/.test(label)) return 'position';\n    return '';\n  }\n\n  function vinylWritingRow(parent) {\n    return Array.prototype.find.call(parent.querySelectorAll(':scope > .mw-option'), function (row) {\n      var labelNode = row.querySelector('.mw-text--style-strong');\n      var label = normalise(labelNode ? labelNode.textContent : '');\n      return (\n        /(case )?vinyl writing|vinyl lettering text/.test(label) ||\n        (/(team|club) name/.test(label) && !/(font|colou?r|position)/.test(label))\n      );\n    });\n  }\n\n  function vinylFieldValidationMessage(row, control, requirement) {\n    var controlAnchor = control.parentElement\n      ? control.parentElement.querySelector(':scope > .selectCustom') || control\n      : control;\n    var messages = Array.prototype.slice.call(\n      row.querySelectorAll('.pp-vinyl-field-validation[data-pp-vinyl-requirement=\"' + requirement + '\"]')\n    );\n    var message = messages.shift();\n\n    messages.forEach(function (duplicate) {\n      duplicate.remove();\n    });\n\n    if (message) {\n      if (message.previousElementSibling !== controlAnchor) controlAnchor.insertAdjacentElement('afterend', message);\n      return message;\n    }\n\n    vinylValidationSequence += 1;\n    message = document.createElement('p');\n    message.id = 'pp-vinyl-field-validation-' + vinylValidationSequence;\n    message.className = 'pp-vinyl-field-validation';\n    message.dataset.ppVinylRequirement = requirement;\n    message.setAttribute('role', 'alert');\n    message.setAttribute('aria-live', 'polite');\n    message.hidden = true;\n    controlAnchor.insertAdjacentElement('afterend', message);\n    return message;\n  }\n\n  function setVinylButtonBlocked(button, blocked) {\n    if (!button) return;\n\n    if (blocked) {\n      if (!button.hasAttribute('data-pp-vinyl-blocked')) {\n        button.dataset.ppVinylPreviousDisabled = String(button.disabled);\n        button.dataset.ppVinylPreviousAriaDisabled = button.getAttribute('aria-disabled') || '';\n      }\n      button.dataset.ppVinylBlocked = 'true';\n      button.disabled = true;\n      button.setAttribute('aria-disabled', 'true');\n      return;\n    }\n\n    if (!button.hasAttribute('data-pp-vinyl-blocked')) return;\n\n    button.disabled = button.dataset.ppVinylPreviousDisabled === 'true';\n    if (button.dataset.ppVinylPreviousAriaDisabled) {\n      button.setAttribute('aria-disabled', button.dataset.ppVinylPreviousAriaDisabled);\n    } else if (!button.disabled) {\n      button.removeAttribute('aria-disabled');\n    }\n\n    delete button.dataset.ppVinylBlocked;\n    delete button.dataset.ppVinylPreviousDisabled;\n    delete button.dataset.ppVinylPreviousAriaDisabled;\n  }\n\n  function syncVinylWritingValidation(productForm) {\n    if (!productForm) return [];\n\n    var invalidStates = [];\n\n    productForm.querySelectorAll('.mw-apo-container').forEach(function (parent) {\n      var writingRow = vinylWritingRow(parent);\n      if (!writingRow) return;\n\n      parent.querySelectorAll(':scope > .pp-vinyl-validation').forEach(function (message) {\n        message.remove();\n      });\n\n      var writingControl = writingRow.querySelector('input:not([type=\"hidden\"]), textarea');\n      var hasWriting = Boolean(writingControl && writingControl.value.trim());\n      var requirements = { font: null, colour: null, position: null };\n\n      parent.querySelectorAll(':scope > .mw-option').forEach(function (row) {\n        var requirement = vinylRequirementForRow(row);\n        if (!requirement) return;\n\n        requirements[requirement] = {\n          row: row,\n          control: row.querySelector('select, input:not([type=\"hidden\"]), textarea')\n        };\n      });\n\n      var missing = [];\n      var firstMissingControl = null;\n\n      Object.keys(requirements).forEach(function (requirement) {\n        var item = requirements[requirement];\n        var isMissing = hasWriting && (!item || !item.control || !String(item.control.value || '').trim());\n\n        if (item && item.row && item.control) {\n          var fieldMessage = vinylFieldValidationMessage(item.row, item.control, requirement);\n          item.row.classList.toggle('pp-vinyl-required-missing', isMissing);\n\n          if (hasWriting) {\n            item.control.required = true;\n            item.control.setAttribute('aria-required', 'true');\n            item.control.dataset.ppVinylRequired = 'true';\n          } else if (item.control.dataset.ppVinylRequired === 'true') {\n            item.control.required = false;\n            item.control.removeAttribute('aria-required');\n            delete item.control.dataset.ppVinylRequired;\n          }\n\n          item.control.setAttribute('aria-invalid', String(isMissing));\n          if (isMissing) {\n            fieldMessage.textContent = 'Please select a vinyl lettering ' + requirement + '.';\n            fieldMessage.hidden = false;\n            item.control.setAttribute('aria-describedby', fieldMessage.id);\n          } else {\n            fieldMessage.textContent = '';\n            fieldMessage.hidden = true;\n            if (item.control.getAttribute('aria-describedby') === fieldMessage.id) {\n              item.control.removeAttribute('aria-describedby');\n            }\n          }\n        }\n\n        if (isMissing) {\n          missing.push(requirement);\n          if (!firstMissingControl && item && item.control) firstMissingControl = item.control;\n        }\n      });\n\n      if (missing.length) {\n        invalidStates.push({\n          control: firstMissingControl\n        });\n      }\n    });\n\n    return invalidStates;\n  }\n\n  function syncLidEngravingValidation(productForm) {\n    if (!productForm) return [];\n\n    var invalidStates = [];\n\n    productForm.querySelectorAll('.mw-apo-container').forEach(function (parent) {\n      var rows = Array.prototype.slice.call(parent.querySelectorAll(':scope > .mw-option'));\n      var engravingRow = rows.find(function (row) {\n        var labelNode = row.querySelector('.mw-text--style-strong');\n        var label = normalise(labelNode ? labelNode.textContent : '');\n        return /lid.*(engraved|engraving|logo|crest)/.test(label) && !/position/.test(label);\n      });\n      var positionRow = rows.find(function (row) {\n        var labelNode = row.querySelector('.mw-text--style-strong');\n        return /lid.*position/.test(normalise(labelNode ? labelNode.textContent : ''));\n      });\n\n      if (!engravingRow || !positionRow) return;\n\n      var fileControl = engravingRow.querySelector('input[type=\"file\"]');\n      var positionControl = positionRow.querySelector('select, input:not([type=\"hidden\"]), textarea');\n      if (!fileControl || !positionControl) return;\n\n      var uploadedFileControl = engravingRow.querySelector('input[type=\"hidden\"][name=\"file\"]');\n      var hasFile = Boolean(\n        (fileControl.files && fileControl.files.length) ||\n        String(fileControl.value || '').trim() ||\n        (uploadedFileControl && String(uploadedFileControl.value || '').trim()) ||\n        engravingRow.querySelector('.filepond--item')\n      );\n      var isMissing = hasFile && !String(positionControl.value || '').trim();\n      var fieldMessage = vinylFieldValidationMessage(positionRow, positionControl, 'lid-position');\n\n      positionRow.classList.toggle('pp-lid-position-required-missing', isMissing);\n\n      if (hasFile) {\n        positionControl.required = true;\n        positionControl.setAttribute('aria-required', 'true');\n        positionControl.dataset.ppLidPositionRequired = 'true';\n      } else if (positionControl.dataset.ppLidPositionRequired === 'true') {\n        positionControl.required = false;\n        positionControl.removeAttribute('aria-required');\n        delete positionControl.dataset.ppLidPositionRequired;\n      }\n\n      positionControl.setAttribute('aria-invalid', String(isMissing));\n      if (isMissing) {\n        fieldMessage.textContent = 'Please select a lid engraving position.';\n        fieldMessage.hidden = false;\n        positionControl.setAttribute('aria-describedby', fieldMessage.id);\n        invalidStates.push({ control: positionControl });\n      } else {\n        fieldMessage.textContent = '';\n        fieldMessage.hidden = true;\n        if (positionControl.getAttribute('aria-describedby') === fieldMessage.id) {\n          positionControl.removeAttribute('aria-describedby');\n        }\n      }\n    });\n\n    return invalidStates;\n  }\n\n  function syncIncludedInscriptionValidation(productForm) {\n    if (!productForm) return [];\n\n    var invalidStates = [];\n\n    productForm.querySelectorAll('.mw-apo-container').forEach(function (parent) {\n      var rows = Array.prototype.slice.call(parent.querySelectorAll(':scope > .mw-option'));\n      var textRow = rows.find(function (row) {\n        var labelNode = row.querySelector('.mw-text--style-strong');\n        return /^(personalisation|personalization|inscription) text$/.test(\n          normalise(labelNode ? labelNode.textContent : '')\n        );\n      });\n      var fontRow = rows.find(function (row) {\n        var labelNode = row.querySelector('.mw-text--style-strong');\n        return normalise(labelNode ? labelNode.textContent : '') === 'inscription font';\n      });\n\n      if (!textRow || !fontRow) return;\n\n      [\n        {\n          row: textRow,\n          control: textRow.querySelector('input:not([type=\"hidden\"]), textarea'),\n          requirement: 'included-text',\n          message: 'Please enter your inscription text.'\n        },\n        {\n          row: fontRow,\n          control: fontRow.querySelector('select, input:not([type=\"hidden\"]), textarea'),\n          requirement: 'included-font',\n          message: 'Please select an inscription font.'\n        }\n      ].forEach(function (item) {\n        if (!item.control) return;\n\n        var isMissing = !String(item.control.value || '').trim();\n        var fieldMessage = vinylFieldValidationMessage(\n          item.row,\n          item.control,\n          item.requirement\n        );\n\n        item.row.classList.toggle('pp-vinyl-required-missing', isMissing);\n        item.control.required = true;\n        item.control.setAttribute('aria-required', 'true');\n        item.control.setAttribute('aria-invalid', String(isMissing));\n\n        if (isMissing) {\n          fieldMessage.textContent = item.message;\n          fieldMessage.hidden = false;\n          item.control.setAttribute('aria-describedby', fieldMessage.id);\n          invalidStates.push({ control: item.control });\n        } else {\n          fieldMessage.textContent = '';\n          fieldMessage.hidden = true;\n          if (item.control.getAttribute('aria-describedby') === fieldMessage.id) {\n            item.control.removeAttribute('aria-describedby');\n          }\n        }\n      });\n    });\n\n    return invalidStates;\n  }\n\n  function syncProductOptionValidation(productForm, focusFirstMissing) {\n    if (!productForm) return true;\n\n    var invalidStates = syncVinylWritingValidation(productForm).concat(\n      syncLidEngravingValidation(productForm),\n      syncIncludedInscriptionValidation(productForm)\n    );\n\n    productForm.querySelectorAll('.mw-apo-add-to-cart-custom, .product-form__add-button').forEach(function (button) {\n      setVinylButtonBlocked(button, invalidStates.length > 0);\n    });\n\n    if (focusFirstMissing && invalidStates.length) {\n      var invalidState = invalidStates[0];\n      if (invalidState.control) {\n        invalidState.control.scrollIntoView({ behavior: 'smooth', block: 'center' });\n        invalidState.control.focus({ preventScroll: true });\n      }\n    }\n\n    return invalidStates.length === 0;\n  }\n\n  function installInscriptionCartRequestGuard() {\n    if (XMLHttpRequest.prototype.ppInscriptionCartRequestGuard) return;\n\n    var originalOpen = XMLHttpRequest.prototype.open;\n    var originalSend = XMLHttpRequest.prototype.send;\n\n    XMLHttpRequest.prototype.open = function (method, url) {\n      this.ppInscriptionCartRequestUrl = String(url || '');\n      return originalOpen.apply(this, arguments);\n    };\n\n    XMLHttpRequest.prototype.send = function (body) {\n      if (\n        /\\/product\\/[^/]+\\/cart(?:\\/[^/?]+)?(?:\\?|$)/.test(this.ppInscriptionCartRequestUrl || '') &&\n        typeof body === 'string'\n      ) {\n        try {\n          body = JSON.stringify(removeBlankInscriptionFontsFromPayload(JSON.parse(body)));\n        } catch (error) {\n          this.ppInscriptionCartRequestError = error;\n        }\n      }\n\n      return originalSend.call(this, body);\n    };\n\n    XMLHttpRequest.prototype.ppInscriptionCartRequestGuard = true;\n  }\n\n  function sourceIsVisible(source) {\n    if (!source || !source.isConnected) return false;\n\n    var rect = source.getBoundingClientRect();\n    return rect.width > 0 && rect.height > 0 && rect.bottom > 0 && rect.top < window.innerHeight;\n  }\n\n  function updateStickyPurchaseVisibility(tray) {\n    if (!tray) return;\n\n    var shouldHide =\n      !tray.ppStickyTopTotal ||\n      !tray.ppStickyAddToCart ||\n      sourceIsVisible(tray.ppStickyTopTotal) ||\n      sourceIsVisible(tray.ppStickyAddToCart);\n\n    if (tray.hidden !== shouldHide) tray.hidden = shouldHide;\n\n    var ariaHidden = shouldHide ? 'true' : 'false';\n    if (tray.getAttribute('aria-hidden') !== ariaHidden) tray.setAttribute('aria-hidden', ariaHidden);\n  }\n\n  function syncStickyPurchaseTray(productForm, topTotal, addToCart) {\n    if (!productForm) return;\n\n    var tray = productForm.querySelector(':scope > .pp-sticky-purchase');\n\n    if (!topTotal || !topTotal.isConnected || !addToCart || !addToCart.isConnected) {\n      if (tray) {\n        tray.ppStickyTopTotal = null;\n        tray.ppStickyAddToCart = null;\n        updateStickyPurchaseVisibility(tray);\n      }\n      return;\n    }\n\n    if (!tray) {\n      tray = document.createElement('div');\n      tray.className = 'pp-sticky-purchase';\n      tray.hidden = true;\n      tray.setAttribute('aria-hidden', 'true');\n      tray.innerHTML =\n        '<button type=\"button\" class=\"pp-sticky-purchase__button\"></button>' +\n        '<div class=\"pp-sticky-purchase__total\">' +\n        '<span class=\"pp-sticky-purchase__total-label\"></span>' +\n        '<span class=\"pp-sticky-purchase__total-value\"></span>' +\n        '</div>';\n\n      productForm.appendChild(tray);\n    }\n\n    var stickyButton = tray.querySelector('.pp-sticky-purchase__button');\n    var stickyLabel = tray.querySelector('.pp-sticky-purchase__total-label');\n    var stickyValue = tray.querySelector('.pp-sticky-purchase__total-value');\n    var sourceButtonLabel = addToCart.querySelector('.mw-text') || addToCart;\n    var sourceTotalLabel = topTotal.querySelector('.pp-apo-top-total__label');\n    var sourceTotalValue = topTotal.querySelector('.pp-apo-top-total__value');\n    var buttonText = sourceButtonLabel.textContent.trim();\n    var buttonDisabled = addToCart.disabled || addToCart.getAttribute('aria-disabled') === 'true';\n    var buttonBusy = addToCart.getAttribute('aria-busy');\n\n    if (stickyButton.textContent !== buttonText) stickyButton.textContent = buttonText;\n    if (stickyButton.disabled !== buttonDisabled) stickyButton.disabled = buttonDisabled;\n\n    if (buttonBusy === null) {\n      if (stickyButton.hasAttribute('aria-busy')) stickyButton.removeAttribute('aria-busy');\n    } else if (stickyButton.getAttribute('aria-busy') !== buttonBusy) {\n      stickyButton.setAttribute('aria-busy', buttonBusy);\n    }\n\n    if (sourceTotalLabel && stickyLabel.textContent !== sourceTotalLabel.textContent) {\n      stickyLabel.textContent = sourceTotalLabel.textContent;\n    }\n    if (sourceTotalValue && stickyValue.textContent !== sourceTotalValue.textContent) {\n      stickyValue.textContent = sourceTotalValue.textContent;\n    }\n\n    if (tray.ppStickyTopTotal !== topTotal || tray.ppStickyAddToCart !== addToCart) {\n      if (tray.ppStickyVisibilityObserver) tray.ppStickyVisibilityObserver.disconnect();\n      if (tray.ppStickyButtonObserver) tray.ppStickyButtonObserver.disconnect();\n\n      tray.ppStickyTopTotal = topTotal;\n      tray.ppStickyAddToCart = addToCart;\n\n      if ('IntersectionObserver' in window) {\n        tray.ppStickyVisibilityObserver = new IntersectionObserver(function () {\n          updateStickyPurchaseVisibility(tray);\n        }, { threshold: 0.01 });\n        tray.ppStickyVisibilityObserver.observe(topTotal);\n        tray.ppStickyVisibilityObserver.observe(addToCart);\n      }\n\n      tray.ppStickyButtonObserver = new MutationObserver(function () {\n        syncStickyPurchaseTray(productForm, tray.ppStickyTopTotal, tray.ppStickyAddToCart);\n      });\n      tray.ppStickyButtonObserver.observe(addToCart, {\n        attributes: true,\n        attributeFilter: ['disabled', 'aria-disabled', 'aria-busy']\n      });\n    }\n\n    updateStickyPurchaseVisibility(tray);\n  }\n\n  function groupOptions() {\n    document.querySelectorAll('.myra-option-set-parent').forEach(function (parent) {\n      var rows = Array.prototype.slice.call(parent.querySelectorAll(':scope > .myra-option-set-row'));\n      var previousStage = '';\n\n      rows.forEach(function (row, index) {\n        var labelNode = row.querySelector('.myra-label-on-product');\n        var stage = stageFor(labelNode ? labelNode.textContent : '', index, previousStage);\n\n        row.dataset.ppMyraStage = stage;\n        row.classList.remove('pp-myra-stage-first', 'pp-myra-stage-middle', 'pp-myra-stage-last');\n        previousStage = stage;\n      });\n\n      rows.forEach(function (row, index) {\n        var stage = row.dataset.ppMyraStage;\n        var isFirst = index === 0 || rows[index - 1].dataset.ppMyraStage !== stage;\n        var isLast = index === rows.length - 1 || rows[index + 1].dataset.ppMyraStage !== stage;\n\n        row.classList.add(isFirst ? 'pp-myra-stage-first' : 'pp-myra-stage-middle');\n        if (isLast) row.classList.add('pp-myra-stage-last');\n      });\n    });\n\n    document.querySelectorAll('.mw-apo-container').forEach(function (parent) {\n      var productForm = parent.closest('form.product-form');\n      var variantBlock = parent.closest('[data-block-type=\"variant-selector\"]');\n      var optionHost = productForm ? productForm.querySelector(':scope > .pp-apo-options-host') : null;\n\n      if (productForm && variantBlock) {\n        if (!optionHost) {\n          optionHost = document.createElement('div');\n          optionHost.className = 'product-info__block-item pp-apo-options-host';\n\n          var appBlock = productForm.querySelector(':scope > [data-block-type=\"@app\"]');\n          productForm.insertBefore(optionHost, appBlock || variantBlock.nextElementSibling);\n        }\n\n        if (parent.parentElement !== optionHost) optionHost.appendChild(parent);\n      }\n\n      var rows = Array.prototype.slice.call(parent.querySelectorAll(':scope > .mw-option'));\n      var currentProductPath = window.location.pathname.replace(/\\/$/, '');\n\n      if (currentProductPath === '/products/custom-stencil') {\n        rows.forEach(function (row) {\n          var uploadLabel = row.querySelector('.mw-text--style-strong');\n\n          if (normalise(uploadLabel ? uploadLabel.textContent : '') === 'upload your poster image') {\n            uploadLabel.textContent = 'Upload stencil artwork';\n          }\n        });\n      }\n\n      var optionForm = parent.closest('product-form');\n      var inscriptionPlaqueLabel = optionForm ? optionForm.dataset.ppInscriptionPlaqueLabel : '';\n      var lidPositionRow = rows.find(function (row) {\n        var labelNode = row.querySelector('.mw-text--style-strong');\n        return normalise(labelNode ? labelNode.textContent : '') === 'lid engraving position';\n      });\n      var lidEngravingRow = rows.find(function (row) {\n        var labelNode = row.querySelector('.mw-text--style-strong');\n        var label = normalise(labelNode ? labelNode.textContent : '');\n        return /lid.*(engraved|engraving|logo|crest)/.test(label) && !/position/.test(label);\n      });\n\n      if (lidPositionRow && lidEngravingRow && lidEngravingRow.nextElementSibling !== lidPositionRow) {\n        parent.insertBefore(lidPositionRow, lidEngravingRow.nextElementSibling);\n        rows = Array.prototype.slice.call(parent.querySelectorAll(':scope > .mw-option'));\n      }\n\n      var inscriptionFontRow = rows.find(function (row) {\n        var labelNode = row.querySelector('.mw-text--style-strong');\n        return normalise(labelNode ? labelNode.textContent : '') === 'inscription font';\n      });\n      var inscriptionPlaqueRow = rows.find(function (row) {\n        var labelNode = row.querySelector('.mw-text--style-strong');\n        var label = normalise(labelNode ? labelNode.textContent : '');\n        return label === 'inscription plaque' || label === 'inscription plaque text';\n      });\n\n      if (inscriptionPlaqueRow && inscriptionPlaqueLabel) {\n        var inscriptionPlaqueLabelNode = inscriptionPlaqueRow.querySelector('.mw-text--style-strong');\n        if (inscriptionPlaqueLabelNode && inscriptionPlaqueLabelNode.textContent !== inscriptionPlaqueLabel) {\n          inscriptionPlaqueLabelNode.textContent = inscriptionPlaqueLabel;\n        }\n      }\n\n      if (inscriptionFontRow && inscriptionPlaqueRow && inscriptionPlaqueRow.nextElementSibling !== inscriptionFontRow) {\n        parent.insertBefore(inscriptionFontRow, inscriptionPlaqueRow.nextElementSibling);\n        rows = Array.prototype.slice.call(parent.querySelectorAll(':scope > .mw-option'));\n      }\n\n      var previousStage = '';\n\n      rows.forEach(function (row, index) {\n        var labelNode = row.querySelector('.mw-text--style-strong');\n        var label = labelNode ? labelNode.textContent : '';\n        var stage = stageFor(label, index, previousStage);\n\n        if (normalise(label) === 'inscription font') {\n          row.classList.remove('mw-option--required');\n          row.querySelectorAll('.mw-text--style-negative').forEach(function (requiredMark) {\n            requiredMark.remove();\n          });\n          row.querySelectorAll('[required], [aria-required=\"true\"]').forEach(function (control) {\n            control.removeAttribute('required');\n            control.removeAttribute('aria-required');\n          });\n\n        }\n\n        row.dataset.ppApoStage = stage;\n        row.classList.remove('pp-apo-stage-first', 'pp-apo-stage-middle', 'pp-apo-stage-last');\n        previousStage = stage;\n      });\n\n      rows.forEach(function (row, index) {\n        var stage = row.dataset.ppApoStage;\n        var isFirst = index === 0 || rows[index - 1].dataset.ppApoStage !== stage;\n        var isLast = index === rows.length - 1 || rows[index + 1].dataset.ppApoStage !== stage;\n\n        row.classList.add(isFirst ? 'pp-apo-stage-first' : 'pp-apo-stage-middle');\n        if (isLast) row.classList.add('pp-apo-stage-last');\n      });\n\n      syncInscriptionFont(parent);\n\n      optionHost = optionHost || parent.parentElement;\n      var total = parent.querySelector('.mw-apo-price-custom');\n      var totalLabel = total ? total.querySelector('.mw-text:not(.mw-text--style-strong)') : null;\n      var totalValue = total ? total.querySelector('.mw-text--style-strong') : null;\n      var topTotal = optionHost ? optionHost.querySelector(':scope > .pp-apo-top-total') : null;\n\n      if (optionHost && totalLabel && totalValue) {\n        if (!topTotal) {\n          topTotal = document.createElement('div');\n          topTotal.className = 'pp-apo-top-total';\n          topTotal.setAttribute('role', 'status');\n          topTotal.setAttribute('aria-live', 'polite');\n          topTotal.innerHTML = '<span class=\"pp-apo-top-total__label\"></span><span class=\"pp-apo-top-total__value\"></span>';\n        }\n\n        var topLabel = topTotal.querySelector('.pp-apo-top-total__label');\n        var topValue = topTotal.querySelector('.pp-apo-top-total__value');\n\n        if (topLabel.textContent !== totalLabel.textContent) topLabel.textContent = totalLabel.textContent;\n        if (topValue.textContent !== totalValue.textContent) topValue.textContent = totalValue.textContent;\n        if (topTotal.nextElementSibling !== parent) optionHost.insertBefore(topTotal, parent);\n      } else if (topTotal) {\n        topTotal.remove();\n      }\n\n      if (productForm) {\n        var infoList = productForm.querySelector('.product-form__info-list');\n        var nativePrice = infoList ? infoList.querySelector(':scope > .product-form__info-item:first-child') : null;\n        var quantity = productForm.querySelector('.product-form__info-item--quantity');\n        var purchaseHost = optionHost ? optionHost.querySelector(':scope > .pp-apo-purchase-host') : null;\n        var addToCartButtons = Array.prototype.slice.call(productForm.querySelectorAll('.mw-apo-add-to-cart-custom, .mw-apo-add-to-cart-cloned'));\n        var addToCart = addToCartButtons.find(function (button) {\n          return !purchaseHost || button.parentElement !== purchaseHost;\n        }) || addToCartButtons[0];\n\n        if (nativePrice) {\n          nativePrice.classList.toggle('pp-apo-native-price', Boolean(totalLabel && totalValue));\n        }\n\n        var addToCartProxy = purchaseHost ? purchaseHost.querySelector(':scope > .pp-apo-add-to-cart-proxy') : null;\n\n        if (optionHost && addToCart) {\n          if (!purchaseHost) {\n            purchaseHost = document.createElement('div');\n            purchaseHost.className = 'pp-apo-purchase-host';\n            optionHost.insertBefore(purchaseHost, topTotal || parent);\n          }\n\n          if (!addToCartProxy) {\n            addToCartProxy = document.createElement('button');\n            addToCartProxy.type = 'button';\n            addToCartProxy.className = 'product-form__add-button button button--primary pp-apo-add-to-cart-proxy';\n            purchaseHost.appendChild(addToCartProxy);\n          }\n\n          addToCart.classList.add('pp-apo-source-button');\n\n          var addToCartLabel = addToCart.querySelector('.mw-text') || addToCart;\n          var addToCartText = addToCartLabel.textContent.trim() || 'Add to cart';\n          var addToCartDisabled = addToCart.disabled || addToCart.getAttribute('aria-disabled') === 'true';\n          var addToCartBusy = addToCart.getAttribute('aria-busy');\n\n          if (addToCartProxy.textContent !== addToCartText) addToCartProxy.textContent = addToCartText;\n          if (addToCartProxy.disabled !== addToCartDisabled) addToCartProxy.disabled = addToCartDisabled;\n          addToCartProxy.setAttribute('aria-disabled', String(addToCartDisabled));\n          if (addToCartBusy === null) {\n            addToCartProxy.removeAttribute('aria-busy');\n          } else {\n            addToCartProxy.setAttribute('aria-busy', addToCartBusy);\n          }\n        } else if (addToCartProxy) {\n          addToCartProxy.remove();\n          addToCartProxy = null;\n        }\n\n        if (quantity && addToCartProxy && purchaseHost) {\n          var previousQuantity = purchaseHost.querySelector(':scope > .product-form__info-item--quantity');\n\n          if (previousQuantity && previousQuantity !== quantity) {\n            var previousQuantityInput = previousQuantity.querySelector('[name=\"quantity\"]');\n            var quantityInput = quantity.querySelector('[name=\"quantity\"]');\n            if (previousQuantityInput && quantityInput) quantityInput.value = previousQuantityInput.value;\n            previousQuantity.remove();\n          }\n\n          if (quantity.parentElement !== purchaseHost || quantity.nextElementSibling !== addToCartProxy) {\n            purchaseHost.insertBefore(quantity, addToCartProxy);\n          }\n        }\n\n        syncProductOptionValidation(productForm, false);\n        syncStickyPurchaseTray(productForm, topTotal, addToCartProxy);\n      }\n    });\n  }\n\n  var scheduled = false;\n  function scheduleGrouping() {\n    if (scheduled) return;\n    scheduled = true;\n    requestAnimationFrame(function () {\n      scheduled = false;\n      groupOptions();\n    });\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', scheduleGrouping);\n  } else {\n    scheduleGrouping();\n  }\n\n  installInscriptionCartRequestGuard();\n\n  // Advanced Product Options rebuilds its cloned add-to-cart button whenever\n  // options or variants are re-initialised. Resolve that live clone on every\n  // click instead of retaining a reference that can become detached.\n  if (!window.ppApoProxyDelegationInstalled) {\n    window.ppApoProxyDelegationInstalled = true;\n    document.addEventListener('click', function (event) {\n      var proxy = event.target.closest && event.target.closest(\n        '.pp-apo-add-to-cart-proxy, .pp-sticky-purchase__button'\n      );\n      if (!proxy) return;\n\n      event.preventDefault();\n      var form = proxy.closest('form');\n      if (!form) return;\n\n      var source = Array.prototype.slice.call(form.querySelectorAll(\n        '.mw-apo-add-to-cart-cloned, .mw-apo-add-to-cart-custom'\n      )).find(function (button) {\n        return button.isConnected &&\n          !button.disabled &&\n          button.getAttribute('aria-disabled') !== 'true' &&\n          !button.classList.contains('mw-apo-in-progress');\n      });\n\n      if (source) {\n        var restoreBlankInscriptionFonts = primeBlankInscriptionFontsForPurchase(form);\n        var sawBusy = false;\n        var restored = false;\n        var sourceObserver;\n        var restoreOnce = function () {\n          if (restored) return;\n          restored = true;\n          if (sourceObserver) sourceObserver.disconnect();\n          restoreBlankInscriptionFonts();\n        };\n        var sourceIsBusy = function (button) {\n          return button.disabled ||\n            button.getAttribute('aria-busy') === 'true' ||\n            button.classList.contains('mw-apo-in-progress');\n        };\n        var observeSource = function (button) {\n          if (sourceObserver) sourceObserver.disconnect();\n          sourceObserver = new MutationObserver(function () {\n            var isBusy = sourceIsBusy(button);\n            if (isBusy) sawBusy = true;\n            if (sawBusy && !isBusy) restoreOnce();\n          });\n          sourceObserver.observe(button, {\n            attributes: true,\n            attributeFilter: ['class', 'disabled', 'aria-busy']\n          });\n        };\n        var startSource = function (button) {\n          source = button;\n          observeSource(button);\n          button.click();\n          if (sourceIsBusy(button)) sawBusy = true;\n          return sawBusy;\n        };\n\n        startSource(source);\n\n        // Firefox privacy protection can delay APO's click binding beyond the\n        // point where its cloned button is visible. If the first click did not\n        // synchronously enter APO's busy state, ask the app to bind the live\n        // clone and retry once. Never bypass APO or submit the form directly:\n        // paid/required option data must still be prepared by the app.\n        if (!sawBusy && window.mwApoInit && typeof window.mwApoInit.fireEvent === 'function') {\n          window.mwApoInit.fireEvent('mwApo::attachEvents::initAddToCart');\n          window.setTimeout(function () {\n            if (sawBusy || restored) return;\n\n            var refreshedSource = Array.prototype.slice.call(form.querySelectorAll(\n              '.mw-apo-add-to-cart-cloned, .mw-apo-add-to-cart-custom'\n            )).find(function (button) {\n              return button.isConnected &&\n                !button.disabled &&\n                button.getAttribute('aria-disabled') !== 'true' &&\n                !button.classList.contains('mw-apo-in-progress');\n            });\n\n            if (!refreshedSource || !startSource(refreshedSource)) restoreOnce();\n          }, 250);\n        } else if (!sawBusy) {\n          restoreOnce();\n        }\n\n        window.setTimeout(restoreOnce, 15000);\n        return;\n      }\n\n      // Ask the app to recreate its clone if a re-render briefly removed it.\n      if (window.mwApoInit && typeof window.mwApoInit.fireEvent === 'function') {\n        window.mwApoInit.fireEvent('mwApo::attachEvents::initAddToCart');\n        window.setTimeout(function () {\n          var refreshedSource = form.querySelector('.mw-apo-add-to-cart-cloned, .mw-apo-add-to-cart-custom');\n          if (refreshedSource && refreshedSource.isConnected && !refreshedSource.disabled) refreshedSource.click();\n        }, 250);\n      }\n    });\n  }\n\n  document.addEventListener('input', function (event) {\n    var parent = event.target.closest('.mw-apo-container');\n    if (parent) {\n      syncInscriptionFont(parent);\n      syncProductOptionValidation(parent.closest('form.product-form'), false);\n    }\n  }, true);\n\n  document.addEventListener('change', function (event) {\n    var parent = event.target.closest('.mw-apo-container');\n    if (parent) {\n      syncInscriptionFont(parent);\n      syncProductOptionValidation(parent.closest('form.product-form'), false);\n    }\n  }, true);\n\n  document.addEventListener('click', function (event) {\n    var button = event.target.closest('.mw-apo-add-to-cart-custom, .product-form__add-button, .pp-sticky-purchase__button');\n    if (!button) return;\n\n    var productForm = button.closest('form.product-form');\n    if (syncProductOptionValidation(productForm, true)) return;\n\n    event.preventDefault();\n    event.stopImmediatePropagation();\n  }, true);\n\n  document.addEventListener('submit', function (event) {\n    var productForm = event.target.closest('form.product-form');\n    if (!productForm || syncProductOptionValidation(productForm, true)) return;\n\n    event.preventDefault();\n    event.stopImmediatePropagation();\n  }, true);\n\n  new MutationObserver(function (mutations) {\n    var needsGrouping = mutations.some(function (mutation) {\n      if (mutation.type !== 'attributes') return true;\n\n      var button = mutation.target;\n      return (\n        button.matches &&\n        button.matches('.mw-apo-add-to-cart-custom, .product-form__add-button') &&\n        button.dataset.ppVinylBlocked === 'true' &&\n        !button.disabled\n      );\n    });\n\n    if (needsGrouping) scheduleGrouping();\n  }).observe(document.documentElement, {\n    childList: true,\n    subtree: true,\n    characterData: true,\n    attributes: true,\n    attributeFilter: ['disabled', 'aria-disabled']\n  });\n})();\n\n(function () {\n  var formStates = new WeakMap();\n  var scheduledForms = new Set();\n\n  function parseMoney(text) {\n    var match = String(text || '').replace(/\\u00a0/g, ' ').match(/-?\\d[\\d,]*(?:\\.\\d+)?/);\n    if (!match) return null;\n\n    var value = Number(match[0].replace(/,/g, ''));\n    return Number.isFinite(value) ? Math.round(value * 100) : null;\n  }\n\n  function formatMoney(template, cents) {\n    var text = String(template || '');\n    var match = text.replace(/\\u00a0/g, ' ').match(/-?\\d[\\d,]*(?:\\.\\d+)?/);\n    var amount = (Math.max(0, cents) / 100).toLocaleString('en-GB', {\n      minimumFractionDigits: 2,\n      maximumFractionDigits: 2\n    });\n\n    if (!match || typeof match.index !== 'number') return '\u00A3' + amount + ' GBP';\n    return text.slice(0, match.index) + amount + text.slice(match.index + match[0].length);\n  }\n\n  function quantityFor(form) {\n    var input = form.querySelector('[name=\"quantity\"]');\n    var quantity = input ? Number(input.value) : 1;\n    return Number.isFinite(quantity) && quantity > 0 ? Math.round(quantity) : 1;\n  }\n\n  function variantIdFor(form) {\n    var input = form.querySelector('[name=\"id\"]');\n    return input ? String(input.value || '') : '';\n  }\n\n  function priceNodesFor(form) {\n    return {\n      app: form.querySelector('.mw-apo-price-custom .mw-text--style-strong'),\n      top: form.querySelector('.pp-apo-top-total__value')\n    };\n  }\n\n  function variantsFor(form) {\n    var section = form.closest('.shopify-section');\n    var script = section ? section.querySelector('#mwsApoProduct') : null;\n    if (!script) script = document.querySelector('#mwsApoProduct');\n    if (!script) return {};\n\n    try {\n      var product = JSON.parse(script.textContent);\n      return (product.variants || []).reduce(function (variants, variant) {\n        variants[String(variant.id)] = Number(variant.price) || 0;\n        return variants;\n      }, {});\n    } catch (error) {\n      return {};\n    }\n  }\n\n  function displayedTotalFor(form) {\n    var nodes = priceNodesFor(form);\n    return parseMoney(nodes.app ? nodes.app.textContent : nodes.top ? nodes.top.textContent : '');\n  }\n\n  function stateFor(form) {\n    var state = formStates.get(form);\n    if (state) return state;\n\n    var quantity = quantityFor(form);\n    var variantId = variantIdFor(form);\n    var variants = variantsFor(form);\n    var variantPrice = variants[variantId] || 0;\n    var displayedTotal = displayedTotalFor(form);\n    var unitTotal = displayedTotal == null ? variantPrice : displayedTotal;\n\n    if (quantity > 1 && displayedTotal != null && displayedTotal >= variantPrice * quantity) {\n      unitTotal = Math.round(displayedTotal / quantity);\n    }\n\n    state = {\n      variants: variants,\n      variantId: variantId,\n      variantPrice: variantPrice,\n      unitTotal: Math.max(variantPrice, unitTotal),\n      quantity: quantity,\n      lastWrittenTotal: null,\n      lockUntil: 0\n    };\n    formStates.set(form, state);\n    return state;\n  }\n\n  function writeTotal(form, state) {\n    var nodes = priceNodesFor(form);\n    var total = Math.round(state.unitTotal * quantityFor(form));\n\n    [nodes.app, nodes.top].forEach(function (node) {\n      if (!node) return;\n\n      var current = parseMoney(node.textContent);\n      if (current === total) return;\n      node.textContent = formatMoney(node.textContent, total);\n    });\n\n    state.quantity = quantityFor(form);\n    state.lastWrittenTotal = total;\n  }\n\n  function syncVariant(form, variant) {\n    var state = stateFor(form);\n    var previousPrice = state.variantPrice;\n    var premium = Math.max(0, state.unitTotal - previousPrice);\n    var variantId = variant && variant.id ? String(variant.id) : variantIdFor(form);\n    var variantPrice = variant && Number.isFinite(Number(variant.price))\n      ? Number(variant.price)\n      : state.variants[variantId] || previousPrice;\n\n    state.variantId = variantId;\n    state.variantPrice = variantPrice;\n    state.unitTotal = Math.max(variantPrice, variantPrice + premium);\n    state.lockUntil = Date.now() + 800;\n    writeTotal(form, state);\n  }\n\n  function syncQuantity(form) {\n    var state = stateFor(form);\n    var currentVariantId = variantIdFor(form);\n\n    if (currentVariantId && currentVariantId !== state.variantId) {\n      syncVariant(form);\n      state = stateFor(form);\n    }\n\n    state.lockUntil = Date.now() + 600;\n    writeTotal(form, state);\n  }\n\n  function reconcileTotal(form) {\n    if (!form.isConnected || !form.querySelector('.mw-apo-container')) return;\n\n    var state = stateFor(form);\n    var currentVariantId = variantIdFor(form);\n    if (currentVariantId && currentVariantId !== state.variantId) {\n      syncVariant(form);\n      return;\n    }\n\n    var displayedTotal = displayedTotalFor(form);\n    if (displayedTotal == null || displayedTotal === state.lastWrittenTotal) return;\n\n    if (Date.now() < state.lockUntil) {\n      writeTotal(form, state);\n      return;\n    }\n\n    var quantity = quantityFor(form);\n    var minimumExtendedPrice = state.variantPrice * quantity;\n\n    if (quantity > 1 && displayedTotal < minimumExtendedPrice) {\n      state.unitTotal = Math.max(state.variantPrice, displayedTotal);\n    } else {\n      state.unitTotal = Math.max(state.variantPrice, Math.round(displayedTotal / quantity));\n    }\n\n    writeTotal(form, state);\n  }\n\n  function scheduleForm(form) {\n    if (!form || scheduledForms.has(form)) return;\n\n    scheduledForms.add(form);\n    requestAnimationFrame(function () {\n      scheduledForms.delete(form);\n      reconcileTotal(form);\n    });\n  }\n\n  function productFormFor(target) {\n    return target && (target.form || target.closest('form.product-form'));\n  }\n\n  document.addEventListener('variant:change', function (event) {\n    var form = productFormFor(event.target);\n    if (!form || !form.querySelector('.mw-apo-container')) return;\n    syncVariant(form, event.detail && event.detail.variant);\n  }, true);\n\n  document.addEventListener('input', function (event) {\n    var form = productFormFor(event.target);\n    if (!form || !form.querySelector('.mw-apo-container')) return;\n\n    if (event.target.matches('[name=\"quantity\"]')) {\n      syncQuantity(form);\n    } else if (event.target.closest('.mw-apo-container')) {\n      var state = stateFor(form);\n      state.lockUntil = 0;\n      state.lastWrittenTotal = null;\n      setTimeout(function () {\n        scheduleForm(form);\n      }, 100);\n    }\n  }, true);\n\n  document.addEventListener('change', function (event) {\n    var form = productFormFor(event.target);\n    if (!form || !form.querySelector('.mw-apo-container')) return;\n\n    if (event.target.matches('[name=\"quantity\"]')) {\n      syncQuantity(form);\n    } else if (event.target.closest('.mw-apo-container')) {\n      var state = stateFor(form);\n      state.lockUntil = 0;\n      state.lastWrittenTotal = null;\n      setTimeout(function () {\n        scheduleForm(form);\n      }, 100);\n    }\n  }, true);\n\n  new MutationObserver(function (mutations) {\n    mutations.forEach(function (mutation) {\n      var target = mutation.target.nodeType === Node.TEXT_NODE ? mutation.target.parentElement : mutation.target;\n      var form = target && target.closest ? target.closest('form.product-form') : null;\n      if (form && form.querySelector('.mw-apo-container')) scheduleForm(form);\n    });\n  }).observe(document.documentElement, {\n    childList: true,\n    subtree: true,\n    characterData: true\n  });\n})();\n\n/* Puffin base-colour swatches */\n(function () {\n  var baseColourImageStates = new WeakMap();\n  var exactBaseImageProducts = {\n    \"american-football-display-case-colour-base\": \"american-football-case\",\n    \"basketball-display-case-colour-base\": \"basketball-case\",\n    \"boxing-glove-display-case-double-portrait-colour-base\":\n      \"boxing-double-portrait-case\",\n    \"boxing-glove-display-case-single-landscape-colour-base\":\n      \"boxing-single-landscape-case\",\n    \"boxing-glove-display-case-single-portrait-colour-base\":\n      \"boxing-single-portrait-case\",\n    \"cap-display-case-colour-base\": \"cap-display-case\",\n    \"collectable-display-case-double-colour-base\": \"double-boot-case\",\n    \"collectable-shoe-display-case-single-colour-base\": \"single-boot-case\",\n    \"cricket-ball-tennis-ball-or-baseball-display-case\":\n      \"cricket-tennis-ball-case\",\n    \"cricket-ball-tennis-ball-or-baseball-display-case-colour-base\":\n      \"cricket-tennis-ball-case\",\n    \"football-boot-display-case-double-boot-colour-base\": \"double-boot-case\",\n    \"football-boot-display-case-single-colour-base\": \"single-boot-case\",\n    \"football-display-case-25mm-raised-base\": \"football-25mm-standard\",\n    \"football-display-case-25mm-raised-colour-base\": \"football-25mm-case\",\n    \"football-display-case-colour-base\": \"football-display-case\",\n    \"football-display-case-superior-base\": \"football-superior-standard\",\n    \"football-display-case-superior-colour-base\": \"football-superior-case\",\n    \"golf-ball-display-case-colour-base\": \"golf-ball-case\",\n    \"rugby-ball-display-case-colour-base\": \"rugby-landscape-case\",\n    \"rugby-boot-display-case-double-colour-base\": \"double-boot-case\",\n    \"rugby-boot-display-case-single-colour-base\": \"single-boot-case\",\n    \"trainer-display-case-double-colour-base\": \"double-boot-case\",\n    \"trainer-display-case-single-colour-base\": \"single-boot-case\"\n  };\n  var disabledBaseColourImageProducts = {\n    \"racing-helmet-display-case\": true,\n    \"child-trainer-display-case-double\": true,\n    \"child-trainer-display-case-single\": true,\n    \"boxing-glove-display-case-double-portrait\": true,\n    \"boxing-glove-display-case-double-portrait-mirror-backed\": true,\n    \"boxing-glove-display-case-single-landscape\": true,\n    \"boxing-glove-display-case-single-landscape-with-mirror-backing\": true,\n    \"boxing-glove-display-case-single-portrait-mirror-backed\": true,\n    \"cap-display-case\": true,\n    \"mma-glove-display-case\": true,\n    \"goalkeeper-glove-display-case-with-mirror-back\": true,\n    \"goalkeeper-display-case\": true,\n    \"trainer-display-case-double\": true,\n    \"trainer-display-case-double-with-mirror-back\": true,\n    \"trainer-display-case-single\": true,\n    \"trainer-display-case-single-with-mirror-back\": true\n  };\n  var exactBaseImageExtensions = {\n    \"football-display-case-superior-base:black\": \"jpg\"\n  };\n  var exactBaseImageRoot =\n    \"https://cdn.shopify.com/s/files/1/1059/7361/2885/files/\";\n  var exactBaseImageThemeRoot = (function () {\n    var script = document.querySelector('script[src*=\"/assets/custom.js\"]');\n    return script ? script.src.split(\"/assets/custom.js\")[0] + \"/assets/\" : \"\";\n  })();\n  var exactBaseImageOverrides = {\n    \"cap-display-case-colour-base:yellow\":\n      \"https://cdn.shopify.com/s/files/1/1059/7361/2885/files/cap-colour-yellow-white-background-2026.png?v=1789470465\",\n    \"cap-display-case-colour-base:orange\":\n      \"https://cdn.shopify.com/s/files/1/1059/7361/2885/files/cap-colour-orange-white-background-2026.png?v=1789470474\",\n    \"cap-display-case-colour-base:red\":\n      \"https://cdn.shopify.com/s/files/1/1059/7361/2885/files/cap-colour-red-white-background-2026.png?v=1789470484\",\n    \"cap-display-case-colour-base:green\":\n      \"https://cdn.shopify.com/s/files/1/1059/7361/2885/files/cap-colour-green-white-background-2026.png?v=1789470494\",\n    \"cap-display-case-colour-base:blue\":\n      \"https://cdn.shopify.com/s/files/1/1059/7361/2885/files/cap-colour-blue-white-background-2026.png?v=1789470506\",\n    \"cap-display-case-colour-base:violet\":\n      \"https://cdn.shopify.com/s/files/1/1059/7361/2885/files/cap-colour-violet-white-background-2026.png?v=1789470521\",\n    \"cap-display-case-colour-base:grey\":\n      \"https://cdn.shopify.com/s/files/1/1059/7361/2885/files/cap-colour-grey-white-background-2026.png?v=1789470532\",\n    \"basketball-display-case:black\":\n      exactBaseImageRoot + \"basketball-display-case.jpg?v=1784714293\",\n    \"basketball-display-case:white\":\n      exactBaseImageRoot + \"basketball-display-case-white-base.png?v=1787563328\",\n    \"football-display-case-black-base:black\":\n      exactBaseImageRoot + \"football-display-case-5mm-recessed-black-base.jpg?v=1784711690\",\n    \"football-display-case-black-base:white\":\n      exactBaseImageRoot + \"football-display-case-white-base.jpg?v=1784711781\",\n    \"deluxe-rugby-ball-display-case-mirror-backed:black\":\n      exactBaseImageThemeRoot + \"rugby-mirror-back-black-base-v1.png\",\n    \"deluxe-rugby-ball-display-case-mirror-backed:white\":\n      exactBaseImageRoot + \"deluxe-rugby-ball-display-case-mirror-backed.png?v=1784712550\",\n    \"deluxe-rugby-ball-display-case-mirror-backed:clear\":\n      exactBaseImageThemeRoot + \"rugby-mirror-back-clear-base-v1.png\",\n    \"golf-ball-display-case:black\":\n      exactBaseImageRoot + \"golf-ball-display-case.png?v=1784711936\",\n    \"golf-ball-display-case:white\":\n      exactBaseImageThemeRoot + \"golf-ball-case-white-base-v2.png\",\n    \"golf-ball-display-case:clear\":\n      exactBaseImageThemeRoot + \"golf-ball-case-clear-base-v2.png\"\n  };\n  var colourMap = {\n    \"glass effect\": \"#d3e6e1\",\n    \"greencast yellow\": \"#f4cf00\",\n    \"light blue\": \"#7bbbd7\",\n    \"greencast blue\": \"#1676b8\",\n    \"light green\": \"#8fcf9f\",\n    \"dark blue\": \"#1d4275\",\n    \"navy blue\": \"#16233f\",\n    \"emerald green\": \"#009b67\",\n    \"ivory\": \"#f2edd4\",\n    \"forest green\": \"#1e5a43\",\n    \"dark red\": \"#8b1e2d\",\n    \"burgundy\": \"#6d1d36\",\n    \"yellow\": \"#f4cf00\",\n    \"orange\": \"#ef6c23\",\n    \"red\": \"#d92532\",\n    \"green\": \"#1e5a43\",\n    \"blue\": \"#1676b8\",\n    \"violet\": \"#6f3e91\",\n    \"grey\": \"#686b70\",\n    \"yellow 229\": \"#f4cf00\",\n    \"orange 363\": \"#ef6c23\",\n    \"red 431\": \"#d92532\",\n    \"green 650\": \"#009b67\",\n    \"blue 727\": \"#1676b8\",\n    \"blue 744\": \"#1d4275\",\n    \"violet 886\": \"#6f3e91\",\n    \"green 6205\": \"#1e5a43\",\n    \"grey 9640\": \"#686b70\"\n  };\n  var baseMaskProfiles = {\n    \"deluxe-rugby-ball-display-case-colour-base\": {\n      sourceName: \"Grey\",\n      broad: true,\n      polygon: [[0.19, 0.61], [0.67, 0.61], [0.78, 0.93], [0.19, 0.93]],\n      exclusions: [],\n      protectedDarkRegions: [\n        { left: 0.39, top: 0.66, right: 0.55, bottom: 0.80, maximumLightness: 0.22 }\n      ]\n    }\n  };\n\n  function normalise(value) {\n    return (value || \"\").trim().toLowerCase().replace(/\\s+/g, \" \");\n  }\n\n  function displayColourName(name) {\n    return (name || \"\").replace(/\\s*(?:[-\u2013\u2014]\\s*)?[\\(\\[]?\\d+[\\)\\]]?\\s*$/, \"\").trim();\n  }\n\n  function colourFor(name) {\n    var key = normalise(name);\n    if (colourMap[key]) return colourMap[key];\n    if (/yellow/.test(key)) return \"#f4cf00\";\n    if (/orange/.test(key)) return \"#ef6c23\";\n    if (/red/.test(key)) return \"#d92532\";\n    if (/violet|purple/.test(key)) return \"#6f3e91\";\n    if (/pink/.test(key)) return \"#df478d\";\n    if (/turquoise|aqua|teal/.test(key)) return \"#10a6a5\";\n    if (/navy/.test(key)) return \"#1d4275\";\n    if (/blue/.test(key)) return \"#1676b8\";\n    if (/green/.test(key)) return \"#009b67\";\n    if (/grey|gray/.test(key)) return \"#686b70\";\n    if (/black/.test(key)) return \"#111111\";\n    if (/white|clear/.test(key)) return \"#ffffff\";\n    if (/mirror|silver/.test(key)) return \"#c8cbd0\";\n    return \"#d9dde3\";\n  }\n\n  function exactBaseImageUrl(name) {\n    var handleMatch = window.location.pathname.match(/^\\/products\\/([^/?#]+)/);\n    var handle = handleMatch && handleMatch[1];\n    var colour = normalise(displayColourName(name))\n      .replace(/\\bgray\\b/g, \"grey\")\n      .replace(/\\bpurple\\b/g, \"violet\")\n      .replace(/[^a-z]+/g, \"-\")\n      .replace(/^-|-$/g, \"\");\n    if (!colour) return \"\";\n\n    var exactOverride = exactBaseImageOverrides[handle + \":\" + colour];\n    if (exactOverride) return exactOverride;\n\n    var imagePrefix = handle && exactBaseImageProducts[handle];\n    if (!imagePrefix) return \"\";\n\n    var extension =\n      exactBaseImageExtensions[handle + \":\" + colour] || \"png\";\n\n    return (\n      exactBaseImageRoot +\n      imagePrefix +\n      \"-\" +\n      colour +\n      \"-base.\" +\n      extension\n    );\n  }\n\n  function showExactBaseImage(image, name) {\n    var url = exactBaseImageUrl(name);\n    if (!url) return false;\n\n    var state = baseColourImageStates.get(image);\n    if (state && state.canvas) state.canvas.hidden = true;\n\n    image.classList.remove(\"pp-base-colour-image--recoloured\");\n    image.removeAttribute(\"srcset\");\n    image.setAttribute(\"src\", url);\n    image.setAttribute(\"data-zoom\", url);\n    return true;\n  }\n\n  function hexToRgb(value) {\n    var hex = String(value || \"\").replace(\"#\", \"\");\n    if (hex.length === 3) {\n      hex = hex.split(\"\").map(function (character) {\n        return character + character;\n      }).join(\"\");\n    }\n\n    return {\n      r: parseInt(hex.slice(0, 2), 16) || 0,\n      g: parseInt(hex.slice(2, 4), 16) || 0,\n      b: parseInt(hex.slice(4, 6), 16) || 0\n    };\n  }\n\n  function rgbToHsl(red, green, blue) {\n    var r = red / 255;\n    var g = green / 255;\n    var b = blue / 255;\n    var max = Math.max(r, g, b);\n    var min = Math.min(r, g, b);\n    var lightness = (max + min) / 2;\n    var hue = 0;\n    var saturation = 0;\n\n    if (max !== min) {\n      var difference = max - min;\n      saturation = lightness > 0.5\n        ? difference / (2 - max - min)\n        : difference / (max + min);\n\n      if (max === r) hue = (g - b) / difference + (g < b ? 6 : 0);\n      if (max === g) hue = (b - r) / difference + 2;\n      if (max === b) hue = (r - g) / difference + 4;\n      hue /= 6;\n    }\n\n    return { h: hue, s: saturation, l: lightness };\n  }\n\n  function hslToRgb(hue, saturation, lightness) {\n    if (saturation === 0) {\n      var grey = Math.round(lightness * 255);\n      return { r: grey, g: grey, b: grey };\n    }\n\n    var hueToRgb = function (p, q, t) {\n      if (t < 0) t += 1;\n      if (t > 1) t -= 1;\n      if (t < 1 / 6) return p + (q - p) * 6 * t;\n      if (t < 1 / 2) return q;\n      if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n      return p;\n    };\n    var q = lightness < 0.5\n      ? lightness * (1 + saturation)\n      : lightness + saturation - lightness * saturation;\n    var p = 2 * lightness - q;\n\n    return {\n      r: Math.round(hueToRgb(p, q, hue + 1 / 3) * 255),\n      g: Math.round(hueToRgb(p, q, hue) * 255),\n      b: Math.round(hueToRgb(p, q, hue - 1 / 3) * 255)\n    };\n  }\n\n  function hueDistance(first, second) {\n    var distance = Math.abs(first - second);\n    return Math.min(distance, 1 - distance);\n  }\n\n  function pixelMatchesBase(red, green, blue, source, broad) {\n    var pixel = rgbToHsl(red, green, blue);\n    var hueTolerance = broad ? 0.13 : 0.095;\n\n    if (source.s > 0.22) {\n      var minimumSaturation = broad\n        ? Math.max(0.32, source.s * 0.47)\n        : Math.max(0.42, source.s * 0.58);\n      return (\n        pixel.s > minimumSaturation &&\n        hueDistance(pixel.h, source.h) < hueTolerance &&\n        Math.abs(pixel.l - source.l) < (broad ? 0.48 : 0.38)\n      );\n    }\n\n    if (source.l < 0.2) {\n      return pixel.s < (broad ? 0.48 : 0.34) && pixel.l < (broad ? 0.4 : 0.32);\n    }\n\n    if (source.l > 0.82) {\n      return pixel.s < (broad ? 0.32 : 0.2) && pixel.l > (broad ? 0.62 : 0.7);\n    }\n\n    var isCoolNeutral = blue >= red - 7 && blue >= green - 7;\n    return (\n      isCoolNeutral &&\n      pixel.s < (broad ? 0.38 : 0.3) &&\n      Math.abs(pixel.l - source.l) < (broad ? 0.34 : 0.25)\n    );\n  }\n\n  function findForegroundEllipse(pixels, width, height, maximumY, includeWarmNeutral) {\n    var candidates = new Uint8Array(width * height);\n    var visited = new Uint8Array(width * height);\n    var queue = new Int32Array(width * height);\n    var searchMaximumY = Math.min(height - 1, Math.ceil(maximumY));\n    var index;\n    var x;\n    var y;\n\n    for (y = 0; y <= searchMaximumY; y += 1) {\n      for (x = 0; x < width; x += 1) {\n        index = y * width + x;\n        var pixelIndex = index * 4;\n        if (pixels[pixelIndex + 3] <= 80) continue;\n\n        var pixel = rgbToHsl(\n          pixels[pixelIndex],\n          pixels[pixelIndex + 1],\n          pixels[pixelIndex + 2]\n        );\n        var warmness = pixels[pixelIndex] - pixels[pixelIndex + 2];\n        if (\n          pixel.s > 0.2 ||\n          pixel.l < 0.38 ||\n          (includeWarmNeutral && pixel.l < 0.93 && warmness > 8)\n        ) {\n          candidates[index] = 1;\n        }\n      }\n    }\n\n    var bestBounds = null;\n    var bestScore = 0;\n\n    for (y = 0; y <= searchMaximumY; y += 1) {\n      for (x = 0; x < width; x += 1) {\n        index = y * width + x;\n        if (!candidates[index] || visited[index]) continue;\n\n        var head = 0;\n        var tail = 0;\n        var minX = x;\n        var maxX = x;\n        var minY = y;\n        var maxY = y;\n\n        queue[tail] = index;\n        tail += 1;\n        visited[index] = 1;\n\n        while (head < tail) {\n          var current = queue[head];\n          head += 1;\n          var currentX = current % width;\n          var currentY = Math.floor(current / width);\n          minX = Math.min(minX, currentX);\n          maxX = Math.max(maxX, currentX);\n          minY = Math.min(minY, currentY);\n          maxY = Math.max(maxY, currentY);\n\n          var neighbour;\n          if (currentX > 0) {\n            neighbour = current - 1;\n            if (candidates[neighbour] && !visited[neighbour]) {\n              visited[neighbour] = 1;\n              queue[tail] = neighbour;\n              tail += 1;\n            }\n          }\n          if (currentX < width - 1) {\n            neighbour = current + 1;\n            if (candidates[neighbour] && !visited[neighbour]) {\n              visited[neighbour] = 1;\n              queue[tail] = neighbour;\n              tail += 1;\n            }\n          }\n          if (currentY > 0) {\n            neighbour = current - width;\n            if (candidates[neighbour] && !visited[neighbour]) {\n              visited[neighbour] = 1;\n              queue[tail] = neighbour;\n              tail += 1;\n            }\n          }\n          if (currentY < searchMaximumY) {\n            neighbour = current + width;\n            if (candidates[neighbour] && !visited[neighbour]) {\n              visited[neighbour] = 1;\n              queue[tail] = neighbour;\n              tail += 1;\n            }\n          }\n        }\n\n        var boundsWidth = maxX - minX + 1;\n        var boundsHeight = maxY - minY + 1;\n        if (boundsWidth < width * 0.16 || boundsHeight < height * 0.16) continue;\n\n        var score = tail * (boundsWidth / width + boundsHeight / height);\n        if (score <= bestScore) continue;\n\n        bestScore = score;\n        bestBounds = {\n          aspectRatio: boundsWidth / boundsHeight,\n          centreX: (minX + maxX) / 2,\n          centreY: (minY + maxY) / 2,\n          radiusX: boundsWidth * (includeWarmNeutral ? 0.52 : 0.42),\n          radiusY: boundsHeight * (includeWarmNeutral ? 0.52 : 0.42)\n        };\n      }\n    }\n\n    return bestBounds;\n  }\n\n  function createConvexHull(points) {\n    if (points.length < 3) return points;\n\n    var sorted = points.slice().sort(function (first, second) {\n      return first.x === second.x ? first.y - second.y : first.x - second.x;\n    });\n    var cross = function (origin, first, second) {\n      return (\n        (first.x - origin.x) * (second.y - origin.y) -\n        (first.y - origin.y) * (second.x - origin.x)\n      );\n    };\n    var lower = [];\n    var upper = [];\n\n    sorted.forEach(function (point) {\n      while (\n        lower.length >= 2 &&\n        cross(lower[lower.length - 2], lower[lower.length - 1], point) <= 0\n      ) {\n        lower.pop();\n      }\n      lower.push(point);\n    });\n\n    sorted.slice().reverse().forEach(function (point) {\n      while (\n        upper.length >= 2 &&\n        cross(upper[upper.length - 2], upper[upper.length - 1], point) <= 0\n      ) {\n        upper.pop();\n      }\n      upper.push(point);\n    });\n\n    lower.pop();\n    upper.pop();\n    return lower.concat(upper);\n  }\n\n  function pointInsidePolygon(x, y, polygon) {\n    var inside = false;\n\n    for (var current = 0, previous = polygon.length - 1; current < polygon.length; previous = current, current += 1) {\n      var currentPoint = polygon[current];\n      var previousPoint = polygon[previous];\n      var crossesRow = (currentPoint.y > y) !== (previousPoint.y > y);\n      var intersectionX =\n        ((previousPoint.x - currentPoint.x) * (y - currentPoint.y)) /\n          (previousPoint.y - currentPoint.y || 1) +\n        currentPoint.x;\n\n      if (crossesRow && x < intersectionX) inside = !inside;\n    }\n\n    return inside;\n  }\n\n  function pointInsideExclusion(x, y, exclusions) {\n    return exclusions.some(function (exclusion) {\n      var horizontalDistance = (x - exclusion.centreX) / exclusion.radiusX;\n      var verticalDistance = (y - exclusion.centreY) / exclusion.radiusY;\n      return horizontalDistance * horizontalDistance + verticalDistance * verticalDistance <= 1;\n    });\n  }\n\n  function createProfiledBaseMask(pixels, width, height, source, profile) {\n    var candidates = new Uint8Array(width * height);\n    var mask = new Uint8Array(width * height);\n    var queue = new Int32Array(width * height);\n    var polygon = profile.polygon.map(function (point) {\n      return { x: point[0] * width, y: point[1] * height };\n    });\n    var exclusions = (profile.exclusions || []).map(function (exclusion) {\n      return {\n        centreX: exclusion.centreX * width,\n        centreY: exclusion.centreY * height,\n        radiusX: exclusion.radiusX * width,\n        radiusY: exclusion.radiusY * height\n      };\n    });\n\n    for (var y = 0; y < height; y += 1) {\n      for (var x = 0; x < width; x += 1) {\n        if (!pointInsidePolygon(x, y, polygon) || pointInsideExclusion(x, y, exclusions)) continue;\n\n        var index = y * width + x;\n        var pixelIndex = index * 4;\n        if (pixels[pixelIndex + 3] <= 80) continue;\n\n        if (\n          pixelMatchesBase(\n            pixels[pixelIndex],\n            pixels[pixelIndex + 1],\n            pixels[pixelIndex + 2],\n            source,\n            Boolean(profile.broad)\n          )\n        ) {\n          candidates[index] = 1;\n        }\n      }\n    }\n\n    var polygonMaximumY = polygon.reduce(function (maximum, point) {\n      return Math.max(maximum, point.y);\n    }, 0);\n    var seedMinimumY = polygonMaximumY - height * 0.08;\n    var head = 0;\n    var tail = 0;\n\n    for (y = Math.max(0, Math.floor(seedMinimumY)); y < height; y += 1) {\n      for (x = 0; x < width; x += 1) {\n        var seedIndex = y * width + x;\n        if (!candidates[seedIndex] || mask[seedIndex]) continue;\n        mask[seedIndex] = 1;\n        queue[tail] = seedIndex;\n        tail += 1;\n      }\n    }\n\n    while (head < tail) {\n      var currentIndex = queue[head];\n      head += 1;\n      var currentX = currentIndex % width;\n      var currentY = Math.floor(currentIndex / width);\n      var neighbour;\n\n      if (currentX > 0) {\n        neighbour = currentIndex - 1;\n        if (candidates[neighbour] && !mask[neighbour]) {\n          mask[neighbour] = 1;\n          queue[tail] = neighbour;\n          tail += 1;\n        }\n      }\n      if (currentX < width - 1) {\n        neighbour = currentIndex + 1;\n        if (candidates[neighbour] && !mask[neighbour]) {\n          mask[neighbour] = 1;\n          queue[tail] = neighbour;\n          tail += 1;\n        }\n      }\n      if (currentY > 0) {\n        neighbour = currentIndex - width;\n        if (candidates[neighbour] && !mask[neighbour]) {\n          mask[neighbour] = 1;\n          queue[tail] = neighbour;\n          tail += 1;\n        }\n      }\n      if (currentY < height - 1) {\n        neighbour = currentIndex + width;\n        if (candidates[neighbour] && !mask[neighbour]) {\n          mask[neighbour] = 1;\n          queue[tail] = neighbour;\n          tail += 1;\n        }\n      }\n    }\n\n    (profile.protectedDarkRegions || []).forEach(function (region) {\n      var minimumX = Math.max(0, Math.floor(region.left * width));\n      var maximumX = Math.min(width - 1, Math.ceil(region.right * width));\n      var minimumY = Math.max(0, Math.floor(region.top * height));\n      var maximumY = Math.min(height - 1, Math.ceil(region.bottom * height));\n\n      for (var protectedY = minimumY; protectedY <= maximumY; protectedY += 1) {\n        for (var protectedX = minimumX; protectedX <= maximumX; protectedX += 1) {\n          var protectedIndex = protectedY * width + protectedX;\n          if (!mask[protectedIndex]) continue;\n          var protectedPixelIndex = protectedIndex * 4;\n          var protectedPixel = rgbToHsl(\n            pixels[protectedPixelIndex],\n            pixels[protectedPixelIndex + 1],\n            pixels[protectedPixelIndex + 2]\n          );\n          if (protectedPixel.l <= region.maximumLightness) mask[protectedIndex] = 0;\n        }\n      }\n    });\n\n    return { mask: mask, source: source };\n  }\n\n  function createBaseMask(pixels, width, height, sourceColour, handle) {\n    var source = rgbToHsl(sourceColour.r, sourceColour.g, sourceColour.b);\n    var profile = handle && baseMaskProfiles[handle];\n    if (profile) return createProfiledBaseMask(pixels, width, height, source, profile);\n\n    var candidates = new Uint8Array(width * height);\n    var visited = new Uint8Array(width * height);\n    var queue = new Int32Array(width * height);\n    var startY = Math.floor(height * 0.28);\n    var index;\n    var x;\n    var y;\n\n    for (y = startY; y < height; y += 1) {\n      for (x = 0; x < width; x += 1) {\n        index = y * width + x;\n        var pixelIndex = index * 4;\n        if (\n          pixels[pixelIndex + 3] > 80 &&\n          pixelMatchesBase(\n            pixels[pixelIndex],\n            pixels[pixelIndex + 1],\n            pixels[pixelIndex + 2],\n            source,\n            false\n          )\n        ) {\n          candidates[index] = 1;\n        }\n      }\n    }\n\n    var components = [];\n    var bestComponent = null;\n    var bestScore = 0;\n\n    for (y = startY; y < height; y += 1) {\n      for (x = 0; x < width; x += 1) {\n        index = y * width + x;\n        if (!candidates[index] || visited[index]) continue;\n\n        var head = 0;\n        var tail = 0;\n        var minX = x;\n        var maxX = x;\n        var minY = y;\n        var maxY = y;\n        var totalY = 0;\n        var touchesBorder = false;\n\n        queue[tail] = index;\n        tail += 1;\n        visited[index] = 1;\n\n        while (head < tail) {\n          var current = queue[head];\n          head += 1;\n          var currentX = current % width;\n          var currentY = Math.floor(current / width);\n\n          minX = Math.min(minX, currentX);\n          maxX = Math.max(maxX, currentX);\n          minY = Math.min(minY, currentY);\n          maxY = Math.max(maxY, currentY);\n          totalY += currentY;\n          if (\n            currentX === 0 ||\n            currentY === 0 ||\n            currentX === width - 1 ||\n            currentY === height - 1\n          ) {\n            touchesBorder = true;\n          }\n\n          var neighbour;\n          if (currentX > 0) {\n            neighbour = current - 1;\n            if (candidates[neighbour] && !visited[neighbour]) {\n              visited[neighbour] = 1;\n              queue[tail] = neighbour;\n              tail += 1;\n            }\n          }\n          if (currentX < width - 1) {\n            neighbour = current + 1;\n            if (candidates[neighbour] && !visited[neighbour]) {\n              visited[neighbour] = 1;\n              queue[tail] = neighbour;\n              tail += 1;\n            }\n          }\n          if (currentY > startY) {\n            neighbour = current - width;\n            if (candidates[neighbour] && !visited[neighbour]) {\n              visited[neighbour] = 1;\n              queue[tail] = neighbour;\n              tail += 1;\n            }\n          }\n          if (currentY < height - 1) {\n            neighbour = current + width;\n            if (candidates[neighbour] && !visited[neighbour]) {\n              visited[neighbour] = 1;\n              queue[tail] = neighbour;\n              tail += 1;\n            }\n          }\n        }\n\n        var widthFraction = (maxX - minX + 1) / width;\n        var centreY = totalY / tail / height;\n        if (tail < width * height * 0.00035 || widthFraction < 0.045 || centreY < 0.38) continue;\n        if (touchesBorder && source.l > 0.75) continue;\n\n        var borderWeight = touchesBorder ? 0.14 : 1;\n        var score = tail * (0.6 + widthFraction * 1.8 + centreY) * borderWeight;\n        var component = {\n          area: tail,\n          centreY: centreY,\n          maxY: maxY,\n          minY: minY,\n          pixels: queue.slice(0, tail),\n          score: score,\n          touchesBorder: touchesBorder,\n          widthFraction: widthFraction\n        };\n        components.push(component);\n        if (score <= bestScore) continue;\n\n        bestScore = score;\n        bestComponent = component;\n      }\n    }\n\n    if (!bestComponent || !bestComponent.pixels.length) return null;\n\n    var mask = new Uint8Array(width * height);\n    components.forEach(function (component) {\n      var isNeutralBaseSection =\n        source.s <= 0.22 &&\n        !component.touchesBorder &&\n        component.area >= width * height * 0.00008 &&\n        component.centreY > 0.42 &&\n        component.maxY / height > 0.52;\n      var isColouredBaseSection =\n        source.s > 0.22 &&\n        (\n          component === bestComponent ||\n          (\n            !component.touchesBorder &&\n            component.area >= Math.max(width * height * 0.0005, bestComponent.area * 0.025) &&\n            component.score >= bestScore * 0.01 &&\n            component.centreY > 0.4 &&\n            component.maxY >= bestComponent.minY &&\n            component.widthFraction >= 0.1\n          )\n        );\n      if (!isNeutralBaseSection && !isColouredBaseSection) return;\n\n      component.pixels.forEach(function (pixel) {\n        mask[pixel] = 1;\n      });\n    });\n\n    if (source.s <= 0.22) {\n      var baseMinimumY = height;\n      var hullPoints = [];\n      for (y = startY; y < height; y += 1) {\n        var anchorMinimum = width;\n        var anchorMaximum = -1;\n\n        for (x = 0; x < width; x += 1) {\n          if (!mask[y * width + x]) continue;\n          baseMinimumY = Math.min(baseMinimumY, y);\n          anchorMinimum = Math.min(anchorMinimum, x);\n          anchorMaximum = Math.max(anchorMaximum, x);\n        }\n\n        if (anchorMaximum >= anchorMinimum) {\n          hullPoints.push({ x: anchorMinimum, y: y });\n          hullPoints.push({ x: anchorMaximum, y: y });\n        }\n      }\n      var foregroundEllipse = findForegroundEllipse(\n        pixels,\n        width,\n        height,\n        Math.max(height * 0.5, baseMinimumY + height * 0.06),\n        false\n      );\n      if (!foregroundEllipse || foregroundEllipse.aspectRatio > 1.75) {\n        foregroundEllipse = findForegroundEllipse(\n          pixels,\n          width,\n          height,\n          Math.max(height * 0.72, baseMinimumY + height * 0.12),\n          true\n        ) || foregroundEllipse;\n      }\n      var hull = createConvexHull(hullPoints);\n\n      if (hull.length >= 3) {\n        var hullCentre = hull.reduce(function (centre, point) {\n          centre.x += point.x / hull.length;\n          centre.y += point.y / hull.length;\n          return centre;\n        }, { x: 0, y: 0 });\n        hull = hull.map(function (point) {\n          return {\n            x: Math.max(0, Math.min(width - 1, hullCentre.x + (point.x - hullCentre.x) * 1.08)),\n            y: Math.max(0, Math.min(height - 1, hullCentre.y + (point.y - hullCentre.y) * 1.05))\n          };\n        });\n        var hullMinimumY = Math.max(0, Math.floor(hull.reduce(function (minimum, point) {\n          return Math.min(minimum, point.y);\n        }, height - 1)));\n        var hullMaximumY = Math.min(height - 1, Math.ceil(hull.reduce(function (maximum, point) {\n          return Math.max(maximum, point.y);\n        }, 0)));\n\n        for (y = hullMinimumY; y <= hullMaximumY; y += 1) {\n          var intersections = [];\n\n          for (var edgeIndex = 0; edgeIndex < hull.length; edgeIndex += 1) {\n            var firstPoint = hull[edgeIndex];\n            var secondPoint = hull[(edgeIndex + 1) % hull.length];\n            if (\n              (firstPoint.y <= y && secondPoint.y > y) ||\n              (secondPoint.y <= y && firstPoint.y > y)\n            ) {\n              intersections.push(\n                firstPoint.x +\n                ((y - firstPoint.y) * (secondPoint.x - firstPoint.x)) /\n                (secondPoint.y - firstPoint.y)\n              );\n            }\n          }\n\n          if (intersections.length < 2) continue;\n          intersections.sort(function (first, second) {\n            return first - second;\n          });\n          var rowMinimum = Math.max(0, Math.ceil(intersections[0]));\n          var rowMaximum = Math.min(width - 1, Math.floor(intersections[intersections.length - 1]));\n\n          for (x = rowMinimum; x <= rowMaximum; x += 1) {\n            index = y * width + x;\n            var rowPixelIndex = index * 4;\n            var rowPixel = rgbToHsl(\n              pixels[rowPixelIndex],\n              pixels[rowPixelIndex + 1],\n              pixels[rowPixelIndex + 2]\n            );\n            var isForeground = false;\n\n            if (foregroundEllipse) {\n              var horizontalDistance = (x - foregroundEllipse.centreX) / foregroundEllipse.radiusX;\n              var verticalDistance = (y - foregroundEllipse.centreY) / foregroundEllipse.radiusY;\n              var foregroundWarmness =\n                pixels[rowPixelIndex] - pixels[rowPixelIndex + 2];\n              isForeground =\n                horizontalDistance * horizontalDistance +\n                verticalDistance * verticalDistance <= 1 &&\n                (\n                  (\n                    foregroundEllipse.aspectRatio > 1.75 &&\n                    verticalDistance < 0.35\n                  ) ||\n                  rowPixel.s > 0.18 ||\n                  rowPixel.l < 0.2 ||\n                  rowPixel.l > 0.68 ||\n                  (\n                    foregroundEllipse.aspectRatio > 1.75 &&\n                    rowPixel.l > 0.28 &&\n                    foregroundWarmness > 8\n                  )\n                );\n            }\n\n            if (\n              !isForeground &&\n              pixels[rowPixelIndex + 3] > 80 &&\n              (rowPixel.l < 0.82 || rowPixel.s > 0.12)\n            ) {\n              mask[index] = 1;\n            }\n          }\n        }\n      }\n    }\n\n    for (var pass = 0; pass < 2; pass += 1) {\n      var expanded = mask.slice();\n\n      for (y = startY; y < height; y += 1) {\n        for (x = 0; x < width; x += 1) {\n          index = y * width + x;\n          if (mask[index]) continue;\n\n          var hasMaskedNeighbour =\n            (x > 0 && mask[index - 1]) ||\n            (x < width - 1 && mask[index + 1]) ||\n            (y > startY && mask[index - width]) ||\n            (y < height - 1 && mask[index + width]);\n          if (!hasMaskedNeighbour) continue;\n\n          var expandedPixelIndex = index * 4;\n          if (\n            pixelMatchesBase(\n              pixels[expandedPixelIndex],\n              pixels[expandedPixelIndex + 1],\n              pixels[expandedPixelIndex + 2],\n              source,\n              true\n            )\n          ) {\n            expanded[index] = 1;\n          }\n        }\n      }\n\n      mask = expanded;\n    }\n\n    return {\n      mask: mask,\n      source: source\n    };\n  }\n\n  function renderBaseColourImage(state, name) {\n    state.pendingName = name;\n    if (!state.ready || !state.maskData) return;\n\n    if (normalise(displayColourName(name)) === normalise(displayColourName(state.sourceName))) {\n      state.canvas.hidden = true;\n      state.image.classList.remove(\"pp-base-colour-image--recoloured\");\n      return;\n    }\n\n    var targetName = normalise(displayColourName(name));\n    var isClear = /\\bclear\\b/.test(targetName);\n    var targetRgb = hexToRgb(colourFor(name));\n    var target = rgbToHsl(targetRgb.r, targetRgb.g, targetRgb.b);\n    var output = new ImageData(\n      new Uint8ClampedArray(state.originalPixels.data),\n      state.width,\n      state.height\n    );\n\n    for (var pixel = 0; pixel < state.maskData.mask.length; pixel += 1) {\n      if (!state.maskData.mask[pixel]) continue;\n\n      var pixelIndex = pixel * 4;\n      if (isClear) {\n        output.data[pixelIndex] = 248;\n        output.data[pixelIndex + 1] = 248;\n        output.data[pixelIndex + 2] = 248;\n        output.data[pixelIndex + 3] = Math.round(output.data[pixelIndex + 3] * 0.12);\n        continue;\n      }\n\n      var original = rgbToHsl(\n        state.originalPixels.data[pixelIndex],\n        state.originalPixels.data[pixelIndex + 1],\n        state.originalPixels.data[pixelIndex + 2]\n      );\n      var lightness = Math.max(\n        0.025,\n        Math.min(0.985, target.l + (original.l - state.maskData.source.l) * 0.72)\n      );\n      var recoloured = hslToRgb(target.h, target.s, lightness);\n\n      output.data[pixelIndex] = recoloured.r;\n      output.data[pixelIndex + 1] = recoloured.g;\n      output.data[pixelIndex + 2] = recoloured.b;\n    }\n\n    state.context.putImageData(output, 0, 0);\n    state.canvas.hidden = false;\n    state.image.classList.add(\"pp-base-colour-image--recoloured\");\n  }\n\n  function updateBaseColourImage(option, name) {\n    if (!option || !name) return;\n\n    var section = option.closest(\".shopify-section\");\n    var gallery = section\n      ? section.querySelector(\".product-gallery\")\n      : document.querySelector(\".product-gallery\");\n    var image = gallery && gallery.querySelector(\n      \".product-gallery__carousel-item.is-selected .product-gallery__image, .product-gallery__carousel-item .product-gallery__image\"\n    );\n    if (!image) return;\n    if (showExactBaseImage(image, name)) return;\n\n    var handleMatch = window.location.pathname.match(/^\\/products\\/([^/?#]+)/);\n    var handle = handleMatch && handleMatch[1];\n    var profile = handle && baseMaskProfiles[handle];\n    var firstLabel = option.querySelector(\n      \".block-swatch__item, .color-swatch__item, .variant-swatch__item\"\n    );\n    var sourceName = profile && profile.sourceName\n      ? profile.sourceName\n      : firstLabel\n      ? firstLabel.getAttribute(\"data-pp-base-colour-original-name\") ||\n        firstLabel.getAttribute(\"title\") ||\n        firstLabel.textContent ||\n        name\n      : name;\n    var state = baseColourImageStates.get(image);\n\n    if (!state) {\n      var canvas = document.createElement(\"canvas\");\n      canvas.className = \"pp-base-colour-image-preview\";\n      canvas.hidden = true;\n      canvas.setAttribute(\"aria-hidden\", \"true\");\n      image.insertAdjacentElement(\"afterend\", canvas);\n\n      state = {\n        canvas: canvas,\n        context: canvas.getContext(\"2d\", { willReadFrequently: true }),\n        image: image,\n        handle: handle,\n        maskData: null,\n        originalPixels: null,\n        pendingName: name,\n        ready: false,\n        sourceName: sourceName,\n        width: 0,\n        height: 0\n      };\n      baseColourImageStates.set(image, state);\n\n      var sourceImage = new Image();\n      sourceImage.crossOrigin = \"anonymous\";\n      sourceImage.onload = function () {\n        var maximumSize = 1100;\n        var scale = Math.min(1, maximumSize / Math.max(sourceImage.naturalWidth, sourceImage.naturalHeight));\n        state.width = Math.max(1, Math.round(sourceImage.naturalWidth * scale));\n        state.height = Math.max(1, Math.round(sourceImage.naturalHeight * scale));\n        state.canvas.width = state.width;\n        state.canvas.height = state.height;\n        state.context.drawImage(sourceImage, 0, 0, state.width, state.height);\n\n        try {\n          state.originalPixels = state.context.getImageData(0, 0, state.width, state.height);\n          state.maskData = createBaseMask(\n            state.originalPixels.data,\n            state.width,\n            state.height,\n            hexToRgb(colourFor(state.sourceName)),\n            state.handle\n          );\n          state.ready = true;\n          renderBaseColourImage(state, state.pendingName);\n        } catch (error) {\n          state.canvas.remove();\n          baseColourImageStates.delete(image);\n        }\n      };\n      sourceImage.onerror = function () {\n        state.canvas.remove();\n        baseColourImageStates.delete(image);\n      };\n      sourceImage.src = image.currentSrc || image.src;\n    }\n\n    renderBaseColourImage(state, name);\n  }\n\n  function clearPendingBaseColourChange(productForm) {\n    if (!productForm) return;\n\n    productForm.removeAttribute(\"data-pp-base-colour-change-pending\");\n    if (productForm.ppBaseColourChangeTimer) {\n      clearTimeout(productForm.ppBaseColourChangeTimer);\n      productForm.ppBaseColourChangeTimer = null;\n    }\n  }\n\n  function markPendingBaseColourChange(control) {\n    var productForm = control && (control.form || control.closest(\"form.product-form\"));\n    if (!productForm || !productForm.querySelector(\".mw-apo-container\")) return;\n\n    clearPendingBaseColourChange(productForm);\n    productForm.setAttribute(\"data-pp-base-colour-change-pending\", \"true\");\n    productForm.ppBaseColourChangeTimer = setTimeout(function () {\n      clearPendingBaseColourChange(productForm);\n    }, 10000);\n  }\n\n  function installBaseColourRerenderGuard(productForm) {\n    if (!productForm || productForm.ppBaseColourRerenderGuardInstalled) return;\n\n    productForm.ppBaseColourRerenderGuardInstalled = true;\n    productForm.addEventListener(\"product:rerender\", function (event) {\n      if (!productForm.hasAttribute(\"data-pp-base-colour-change-pending\")) return;\n\n      clearPendingBaseColourChange(productForm);\n      if (event.detail && event.detail.productChange) return;\n\n      /*\n       * APO owns the option controls and its Add to cart button. The theme has\n       * already updated the hidden variant ID and emitted variant:change before\n       * this event, so replacing the variant/buy-button blocks here is both\n       * unnecessary and destructive. Preserve the live APO form for guarded\n       * colour changes so existing extras and the purchase button remain usable.\n       */\n      event.stopImmediatePropagation();\n\n      requestAnimationFrame(function () {\n        applyBaseColourSwatches();\n        var option = productForm.querySelector(\".pp-base-colour-option\");\n        updateSelectedColour(option);\n      });\n    }, true);\n  }\n\n  function updateSelectedColour(option, label) {\n    if (!option) return;\n\n    var selectedLabel = label || option.querySelector(\".block-swatch__radio:checked + .block-swatch__item, .block-swatch__item.is-selected, .color-swatch__radio:checked + .color-swatch__item, .color-swatch__item.is-selected, .variant-swatch__radio:checked + .variant-swatch__item, .variant-swatch__item.is-selected\");\n    var selectedValue = option.querySelector(\".product-form__selected-value\");\n    if (!selectedLabel) return;\n\n    var name = selectedLabel.getAttribute(\"data-pp-base-colour-display-name\") || displayColourName(selectedLabel.getAttribute(\"title\") || selectedLabel.textContent || \"\");\n    if (!name) return;\n\n    if (selectedValue) {\n      selectedValue.setAttribute(\"aria-live\", \"polite\");\n      if ((selectedValue.textContent || \"\").trim() !== name) {\n        selectedValue.textContent = name;\n      }\n    }\n\n    if (!option.classList.contains(\"pp-base-colour-swatch-only\")) {\n      updateBaseColourImage(option, name);\n    }\n  }\n\n  function applyBaseColourSwatches() {\n    var handleMatch = window.location.pathname.match(/^\\/products\\/([^/?#]+)/);\n    var handle = handleMatch && handleMatch[1];\n    var isSlimRiser =\n      handle === \"football-display-slim-riser-plinth-clear\";\n    var isThinShelf =\n      handle &&\n      /^acrylic-shelf-.*-x-(?:3|5)mm(?:-|$)/.test(handle);\n\n    document.querySelectorAll(\".product-form__option\").forEach(function (option) {\n      var heading = option.querySelector(\".product-form__option-name\");\n      var headingText = heading && (heading.textContent || \"\");\n      var isBaseColour = /base colou?r/i.test(headingText || \"\");\n      var isSlimRiserColour =\n        isSlimRiser && /^\\s*colou?r\\b/i.test(headingText || \"\");\n      var isThinShelfColour =\n        isThinShelf && /^\\s*colou?r\\b/i.test(headingText || \"\");\n      if (!heading || (!isBaseColour && !isSlimRiserColour && !isThinShelfColour)) return;\n\n      option.classList.add(\"pp-base-colour-option\");\n      option.classList.toggle(\"pp-thin-shelf-colour-option\", isThinShelfColour);\n      option.classList.toggle(\n        \"pp-base-colour-swatch-only\",\n        isSlimRiserColour ||\n          isThinShelfColour ||\n          Boolean(handle && disabledBaseColourImageProducts[handle])\n      );\n      installBaseColourRerenderGuard(option.closest(\"form.product-form\"));\n\n      option.querySelectorAll(\".block-swatch\").forEach(function (swatch) {\n        var label = swatch.querySelector(\".block-swatch__item\");\n        if (!label) return;\n\n        var name = label.getAttribute(\"data-pp-base-colour-original-name\") || (label.getAttribute(\"title\") || label.textContent || \"\").trim();\n        if (!name) return;\n\n        var displayName = displayColourName(name);\n        swatch.classList.add(\"pp-base-colour-swatch\");\n        label.classList.toggle(\n          \"pp-base-colour-clear\",\n          /\\bclear\\b/.test(normalise(displayName))\n        );\n        label.style.setProperty(\"--pp-base-colour\", colourFor(name));\n        label.setAttribute(\"data-pp-base-colour-original-name\", name);\n        label.setAttribute(\"data-pp-base-colour-display-name\", displayName);\n        label.setAttribute(\"title\", displayName);\n        label.setAttribute(\"aria-label\", displayName);\n      });\n\n      option.querySelectorAll(\".color-swatch__item, .variant-swatch__item\").forEach(function (label) {\n        var name = label.getAttribute(\"data-pp-base-colour-original-name\") || (label.getAttribute(\"title\") || label.textContent || \"\").trim();\n        if (!name) return;\n\n        var displayName = displayColourName(name);\n        label.classList.toggle(\n          \"pp-base-colour-clear\",\n          /\\bclear\\b/.test(normalise(displayName))\n        );\n        label.style.setProperty(\"--pp-base-colour\", colourFor(name));\n        label.style.backgroundColor = colourFor(name);\n        label.setAttribute(\"data-pp-base-colour-original-name\", name);\n        label.setAttribute(\"data-pp-base-colour-display-name\", displayName);\n        label.setAttribute(\"title\", displayName);\n        label.setAttribute(\"aria-label\", displayName);\n      });\n\n      updateSelectedColour(option);\n    });\n  }\n\n  document.addEventListener(\"click\", function (event) {\n    var label = event.target.closest(\".pp-base-colour-option .block-swatch__item, .pp-base-colour-option .color-swatch__item, .pp-base-colour-option .variant-swatch__item\");\n    if (!label) return;\n    updateSelectedColour(label.closest(\".product-form__option\"), label);\n  });\n\n  document.addEventListener(\"change\", function (event) {\n    var input = event.target.closest(\".pp-base-colour-option .block-swatch__radio, .pp-base-colour-option .color-swatch__radio, .pp-base-colour-option .variant-swatch__radio\");\n    if (!input) return;\n    markPendingBaseColourChange(input);\n    updateSelectedColour(input.closest(\".product-form__option\"), input.nextElementSibling);\n  }, true);\n\n  function startBaseColourSwatches() {\n    applyBaseColourSwatches();\n    new MutationObserver(applyBaseColourSwatches).observe(document.body, {\n      childList: true,\n      subtree: true\n    });\n  }\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", startBaseColourSwatches);\n  } else {\n    startBaseColourSwatches();\n  }\n})();\n"],
  "mappings": "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",
  "names": ["p", "q", "component"]
}
