{
  "version": 3,
  "sources": ["/cdn/shop/t/6/assets/main.js?codex_launch=20260609_priority5"],
  "sourcesContent": ["/**\n * Shrine Pro \u00E2\u20AC\u201D Clean Replacement main.js\n *\n * This file replaces the original obfuscated main.js.\n * Written in plain vanilla JavaScript. No dependencies. No external calls.\n *\n * Shopify AJAX endpoints used (internal only):\n *   /cart/add.js\n *   /cart/change.js\n *   /cart/update.js\n *   /cart.js\n *   /recommendations/products.json (Shopify native)\n *   window.routes.predictive_search_url (Shopify native, set in theme.liquid)\n *\n * All custom elements check for DOM existence before running.\n * Missing sections or markup will not throw errors.\n */\n\n'use strict';\n\n/* ============================================================\n   SECTION 1 \u00E2\u20AC\u201D UTILITIES\n   ============================================================ */\n\n/**\n * Debounce: delays fn execution until after `wait` ms of inactivity.\n */\nfunction debounce(fn, wait) {\n  let timeout;\n  return function (...args) {\n    clearTimeout(timeout);\n    timeout = setTimeout(() => fn.apply(this, args), wait);\n  };\n}\n\n/**\n * Safe querySelector \u00E2\u20AC\u201D returns null instead of throwing if selector is invalid.\n */\nfunction qs(selector, parent) {\n  try {\n    return (parent || document).querySelector(selector);\n  } catch (e) {\n    return null;\n  }\n}\n\n/**\n * Safe querySelectorAll \u00E2\u20AC\u201D returns empty NodeList if selector is invalid.\n */\nfunction qsa(selector, parent) {\n  try {\n    return (parent || document).querySelectorAll(selector);\n  } catch (e) {\n    return document.querySelectorAll('___no_match___');\n  }\n}\n\n/**\n * Trap keyboard focus inside an element (accessibility).\n */\nfunction trapFocus(el, focusEl) {\n  if (!el) return;\n  const focusable = el.querySelectorAll(\n    'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n  );\n  if (!focusable.length) return;\n  const first = focusable[0];\n  const last = focusable[focusable.length - 1];\n  function handleTab(e) {\n    if (e.key !== 'Tab') return;\n    if (e.shiftKey) {\n      if (document.activeElement === first) { e.preventDefault(); last.focus(); }\n    } else {\n      if (document.activeElement === last) { e.preventDefault(); first.focus(); }\n    }\n  }\n  el.addEventListener('keydown', handleTab);\n  el._trapFocusHandler = handleTab;\n  (focusEl || first).focus();\n}\n\nfunction removeTrapFocus(el) {\n  if (!el || !el._trapFocusHandler) return;\n  el.removeEventListener('keydown', el._trapFocusHandler);\n  delete el._trapFocusHandler;\n}\n\n/**\n * Pause all media (video/audio) inside an element.\n */\nfunction pauseAllMedia() {\n  qsa('video').forEach(v => { try { v.pause(); } catch(e){} });\n  qsa('.js-youtube').forEach(el => { el.contentWindow && el.contentWindow.postMessage('{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}', '*'); });\n  qsa('.js-vimeo').forEach(el => { el.contentWindow && el.contentWindow.postMessage('{\"method\":\"pause\"}', '*'); });\n}\n\n/**\n * Fetch wrapper \u00E2\u20AC\u201D only allows Shopify-internal paths or window.routes values.\n */\nfunction safeFetch(url, options) {\n  const allowedPrefixes = [\n    '/cart', '/recommendations', '/search', '/collections', '/products',\n    window.shopUrl || ''\n  ];\n  const isAllowed = allowedPrefixes.some(prefix => url.startsWith(prefix) || (prefix && url.startsWith(prefix)));\n  if (!isAllowed) {\n    console.warn('[main.js] Blocked external fetch to:', url);\n    return Promise.reject(new Error('External fetch blocked'));\n  }\n  return fetch(url, options);\n}\n\nfunction cartAddJsonUrl() {\n  const route = (window.routes && window.routes.cart_add_url) || '/cart/add';\n  if (/\\.js($|\\?)/.test(route)) return route;\n  return route.replace(/\\/cart\\/add($|\\?)/, '/cart/add.js$1');\n}\n\nfunction cartChangeUrl() {\n  const route = (window.routes && window.routes.cart_change_url) || '/cart/change';\n  if (/\\.js($|\\?)/.test(route)) return route;\n  return route.replace(/\\/cart\\/change($|\\?)/, '/cart/change.js$1');\n}\n\n/* ============================================================\n   FREE GIFT \u00E2\u20AC\u201D auto-add a $0 gift product whenever the cart\n   contains a paid item; remove it when the cart no longer\n   qualifies. Keeps the gift at quantity 1.\n   ============================================================ */\n\nconst FREE_GIFT = { variantId: 47157377630345, handle: 'guzzleguts-free-travel-bag-gift' };\nlet _giftSyncInFlight = false;\n\nfunction injectGiftStyles() {\n  if (document.getElementById('gg-free-gift-style')) return;\n  const s = document.createElement('style');\n  s.id = 'gg-free-gift-style';\n  s.textContent =\n    '.cart-item--product-' + FREE_GIFT.handle + ' .cart-item__name::after{' +\n    'content:\"FREE GIFT\";display:inline-block;margin-left:.6rem;background:#F5A623;color:#fff;' +\n    'font-size:1rem;font-weight:700;letter-spacing:.02em;padding:.2rem .6rem;border-radius:.5rem;' +\n    'vertical-align:middle;line-height:1.4;}';\n  document.head.appendChild(s);\n}\n\nfunction _applyGiftDrawer(sections, itemCount) {\n  const cd = qs('cart-drawer');\n  if (cd && sections && sections['cart-drawer']) {\n    const fresh = new DOMParser().parseFromString(sections['cart-drawer'], 'text/html').querySelector('cart-drawer');\n    if (fresh) {\n      cd.innerHTML = fresh.innerHTML;\n      if (itemCount != null) cd.classList.toggle('is-empty', itemCount === 0);\n    }\n  }\n  if (itemCount == null) return;\n  qsa('.cart-count-bubble').forEach(el => {\n    const inner = qs('[aria-hidden]', el);\n    if (itemCount > 0) { el.removeAttribute('hidden'); if (inner) inner.textContent = itemCount; }\n    else { el.setAttribute('hidden', ''); }\n  });\n}\n\nfunction syncFreeGift() {\n  if (_giftSyncInFlight) return Promise.resolve();\n  _giftSyncInFlight = true;\n  const opts = body => ({\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' },\n    body: JSON.stringify(body),\n  });\n  return fetch('/cart.js')\n    .then(r => r.json())\n    .then(cart => {\n      const gift = cart.items.find(i => i.handle === FREE_GIFT.handle);\n      const qualifies = cart.items.some(i => i.handle !== FREE_GIFT.handle && i.final_price > 0);\n      const sectionMeta = { sections: ['cart-drawer', 'cart-icon-bubble'], sections_url: window.location.pathname };\n\n      if (qualifies && !gift) {\n        return safeFetch(cartAddJsonUrl(), opts(Object.assign({ id: FREE_GIFT.variantId, quantity: 1 }, sectionMeta)))\n          .then(r => r.json())\n          .then(res => fetch('/cart.js').then(r => r.json()).then(c => _applyGiftDrawer(res.sections, c.item_count)));\n      }\n      if (gift && (!qualifies || gift.quantity > 1)) {\n        return safeFetch(cartChangeUrl(), opts(Object.assign({ id: gift.key, quantity: qualifies ? 1 : 0 }, sectionMeta)))\n          .then(r => r.json())\n          .then(c => _applyGiftDrawer(c.sections, c.item_count));\n      }\n      return null;\n    })\n    .catch(() => {})\n    .then(v => { _giftSyncInFlight = false; return v; });\n}\n\nif (document.readyState !== 'loading') injectGiftStyles();\nelse document.addEventListener('DOMContentLoaded', injectGiftStyles);\n\n/* ============================================================\n   SECTION 2 \u00E2\u20AC\u201D CUSTOM ELEMENT: QuantityInput\n   ============================================================ */\n\nclass QuantityInput extends HTMLElement {\n  connectedCallback() {\n    this.input = qs('input[type=\"number\"]', this);\n    this.decrementBtn = qs('[name=\"minus\"]', this);\n    this.incrementBtn = qs('[name=\"plus\"]', this);\n    if (!this.input) return;\n    this.decrementBtn && this.decrementBtn.addEventListener('click', () => this._change(-1));\n    this.incrementBtn && this.incrementBtn.addEventListener('click', () => this._change(1));\n  }\n\n  _change(delta) {\n    const current = parseInt(this.input.value, 10) || 1;\n    const min = parseInt(this.input.getAttribute('min'), 10) || 1;\n    const max = parseInt(this.input.getAttribute('max'), 10) || Infinity;\n    const next = Math.min(Math.max(current + delta, min), max);\n    this.input.value = next;\n    this.input.dispatchEvent(new Event('change', { bubbles: true }));\n  }\n}\ncustomElements.define('quantity-input', QuantityInput);\n\n/* ============================================================\n   SECTION 3 \u00E2\u20AC\u201D CUSTOM ELEMENT: ProductForm\n   ============================================================ */\n\nclass ProductForm extends HTMLElement {\n  connectedCallback() {\n    this.form = qs('form[data-type=\"add-to-cart-form\"]', this);\n    if (!this.form) return;\n    this.form.addEventListener('submit', this.handleSubmit.bind(this));\n    this.cartNotification = qs('cart-notification') || qs('[id^=\"cart-notification\"]');\n  }\n\n  handleSubmit(e) {\n    e.preventDefault();\n    const submitBtn = qs('[type=\"submit\"]', this.form);\n    const variantId = qs('[name=\"id\"]', this.form);\n    if (!variantId || !variantId.value) return;\n\n    if (submitBtn) {\n      submitBtn.setAttribute('aria-disabled', 'true');\n      submitBtn.classList.add('loading');\n    }\n\n    const body = JSON.stringify({\n      id: variantId.value,\n      quantity: parseInt((qs('[name=\"quantity\"]', this.form) || {}).value, 10) || 1,\n      sections: this._getSectionsToRender().map(s => s.section),\n      sections_url: window.location.pathname,\n    });\n\n    safeFetch(cartAddJsonUrl(), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' },\n      body,\n    })\n      .then(async r => JSON.parse(await r.text()))\n      .then(async response => {\n        if (response.status) {\n          this._handleError(response, submitBtn);\n          return;\n        }\n        this._updateSections(response);\n        this._openCartDrawer();\n        syncFreeGift();\n        const cart = response.item_count != null ? response : await safeFetch('/cart.js').then(r => r.json());\n        this._updateCartBubble(cart.item_count);\n      })\n      .catch(err => {\n        console.warn('[ProductForm] cart/add.js warning:', err);\n        this._handleError({ description: window.cartStrings && window.cartStrings.error }, submitBtn);\n      })\n      .finally(() => {\n        if (submitBtn) {\n          submitBtn.removeAttribute('aria-disabled');\n          submitBtn.classList.remove('loading');\n        }\n      });\n  }\n\n  _getSectionsToRender() {\n    // Sections to re-render after ATC. Override if cart-drawer is present.\n    const sections = [];\n    if (qs('cart-drawer')) sections.push({ section: 'cart-drawer', selector: 'cart-drawer' });\n    if (qs('[id^=\"shopify-section-cart-icon-bubble\"]')) {\n      sections.push({ section: 'cart-icon-bubble', selector: '.shopify-section-cart-icon-bubble' });\n    }\n    return sections;\n  }\n\n  _updateSections(response) {\n    const sections = response.sections || {};\n    Object.keys(sections).forEach(key => {\n      const html = sections[key];\n      if (!html) return;\n      const parser = new DOMParser();\n      const doc = parser.parseFromString(html, 'text/html');\n      const cartDrawer = qs('cart-drawer');\n      if (cartDrawer && key.includes('cart-drawer')) {\n        const newDrawer = doc.querySelector('cart-drawer');\n        if (newDrawer) cartDrawer.innerHTML = newDrawer.innerHTML;\n      }\n    });\n  }\n\n  _openCartDrawer() {\n    const cartDrawer = qs('cart-drawer');\n    if (cartDrawer && typeof cartDrawer.open === 'function') {\n      cartDrawer.open();\n    }\n  }\n\n  _updateCartBubble(count) {\n    qsa('.cart-count-bubble').forEach(el => {\n      if (count > 0) {\n        el.removeAttribute('hidden');\n        const countEl = qs('[aria-hidden]', el);\n        if (countEl) countEl.textContent = count;\n      } else {\n        el.setAttribute('hidden', '');\n      }\n    });\n  }\n\n  _handleError(error, submitBtn) {\n    const wrapper = qs('.product-form__error-message-wrapper', this);\n    const msg = qs('.product-form__error-message', this);\n    if (wrapper && msg) {\n      wrapper.removeAttribute('hidden');\n      msg.textContent = error.description || (window.cartStrings && window.cartStrings.error) || 'Error adding to cart.';\n    }\n  }\n}\ncustomElements.define('product-form', ProductForm);\n\n/* ============================================================\n   SECTION 4 \u00E2\u20AC\u201D CUSTOM ELEMENT: VariantSelects\n   ============================================================ */\n\nclass VariantSelects extends HTMLElement {\n  connectedCallback() {\n    this.addEventListener('change', this.onVariantChange.bind(this));\n  }\n\n  onVariantChange() {\n    this.updateOptions();\n    this.updateMasterId();\n    this.toggleAddButton(true, '');\n    this.updatePickupAvailability();\n    if (!this.currentVariant) {\n      this.toggleAddButton(true, '');\n      this.setUnavailable();\n    } else {\n      this.updateMedia();\n      this.updateURL();\n      this.updateVariantInput();\n      this.renderProductInfo();\n      this.updateShareUrl();\n    }\n  }\n\n  updateOptions() {\n    this.options = Array.from(this.querySelectorAll('select, fieldset')).map(el => {\n      if (el.tagName === 'SELECT') return el.value;\n      const checked = el.querySelector('input[type=\"radio\"]:checked');\n      return checked ? checked.value : '';\n    });\n  }\n\n  updateMasterId() {\n    const productDataEl = qs('[id^=\"ProductJSON-\"]');\n    if (!productDataEl) { this.currentVariant = null; return; }\n    try {\n      const product = JSON.parse(productDataEl.textContent);\n      this.currentVariant = product.variants.find(v =>\n        v.options.every((opt, i) => opt === this.options[i])\n      ) || null;\n    } catch (e) {\n      this.currentVariant = null;\n    }\n  }\n\n  updateMedia() {\n    if (!this.currentVariant) return;\n\n    const rawMediaId =\n      (this.currentVariant.featured_media && this.currentVariant.featured_media.id) ||\n      (this.currentVariant.featured_image && this.currentVariant.featured_image.id) ||\n      this.currentVariant.image_id;\n\n    if (!rawMediaId) return;\n\n    const sectionId = this.dataset.section;\n    const mediaId = sectionId ? `${sectionId}-${rawMediaId}` : String(rawMediaId);\n    const gallery =\n      (sectionId && document.getElementById(`MediaGallery-${sectionId}`)) ||\n      (this.closest('.product') && this.closest('.product').querySelector('media-gallery')) ||\n      qs('media-gallery');\n\n    if (gallery && typeof gallery.setActiveMedia === 'function') {\n      gallery.setActiveMedia(mediaId, true, this.dataset.hasFiltering === 'true', this.currentVariant);\n      return;\n    }\n\n    const mediaEl =\n      qs(`[data-media-id=\"${mediaId}\"]`) ||\n      qs(`[data-media-id$=\"-${rawMediaId}\"]`) ||\n      qs(`[data-media-id=\"${rawMediaId}\"]`);\n\n    if (!mediaEl) return;\n\n    const slide = mediaEl.closest('.product__media-item, .slider__slide') || mediaEl;\n    const slider = slide.parentElement;\n    if (slider && typeof slider.scrollTo === 'function') {\n      slider.scrollTo({ left: slide.offsetLeft, behavior: 'smooth' });\n    } else {\n      slide.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n    }\n  }\n\n  updateURL() {\n    if (!this.currentVariant) return;\n    window.history.replaceState({}, '', `${window.location.pathname}?variant=${this.currentVariant.id}`);\n  }\n\n  updateVariantInput() {\n    const input = qs('.product-variant-id');\n    if (input && this.currentVariant) input.value = this.currentVariant.id;\n  }\n\n  updateShareUrl() {\n    const shareBtn = qs('share-button');\n    if (!shareBtn || !this.currentVariant) return;\n    const url = qs('[data-share-url]', shareBtn);\n    if (url) url.value = `${window.location.origin}${window.location.pathname}?variant=${this.currentVariant.id}`;\n  }\n\n  renderProductInfo() {\n    if (!this.currentVariant) return;\n    const sectionId = this.dataset.section;\n\n    // Update price\n    const priceEl = qs(`#price-${sectionId}`);\n    if (priceEl) {\n      const regular = priceEl.querySelector('.price__regular');\n      const sale = priceEl.querySelector('.price__sale');\n      const regularAmount = priceEl.querySelector('.price-item--regular');\n      const saleAmount = priceEl.querySelector('.price-item--sale');\n      const compareAmount = priceEl.querySelector('.price-item--compare');\n      const v = this.currentVariant;\n\n      if (v.compare_at_price > v.price) {\n        if (regular) regular.classList.add('hidden');\n        if (sale) sale.classList.remove('hidden');\n        if (saleAmount) saleAmount.textContent = this._formatMoney(v.price);\n        if (compareAmount) compareAmount.textContent = this._formatMoney(v.compare_at_price);\n      } else {\n        if (regular) regular.classList.remove('hidden');\n        if (sale) sale.classList.add('hidden');\n        if (regularAmount) regularAmount.textContent = this._formatMoney(v.price);\n      }\n    }\n\n    // Update SKU\n    const skuEl = qs(`#Sku-${sectionId}`);\n    if (skuEl) {\n      const value = skuEl.querySelector('.variant-sku');\n      if (value) value.textContent = this.currentVariant.sku || '';\n    }\n\n    // Update inventory\n    const invEl = qs(`#Inventory-${sectionId}`);\n    if (invEl) {\n      invEl.classList.toggle('visibility-hidden',\n        this.currentVariant.inventory_management !== 'shopify');\n    }\n\n    this.toggleAddButton(\n      !this.currentVariant.available,\n      this.currentVariant.available\n        ? (window.variantStrings && window.variantStrings.addToCart) || 'Add to cart'\n        : (window.variantStrings && window.variantStrings.soldOut) || 'Sold out'\n    );\n  }\n\n  _formatMoney(cents) {\n    return '$' + (cents / 100).toFixed(2).replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n  }\n\n  toggleAddButton(disable, text) {\n    const btn = qs('[id^=\"ProductSubmitButton\"]');\n    if (!btn) return;\n    if (disable) {\n      btn.setAttribute('disabled', 'disabled');\n      if (text) {\n        const label = btn.querySelector('.button__label') || btn;\n        label.textContent = text;\n      }\n    } else {\n      btn.removeAttribute('disabled');\n      if (text) {\n        const label = btn.querySelector('.button__label') || btn;\n        label.textContent = text;\n      }\n    }\n  }\n\n  setUnavailable() {\n    const btn = qs('[id^=\"ProductSubmitButton\"]');\n    if (!btn) return;\n    btn.setAttribute('disabled', 'disabled');\n    const label = btn.querySelector('.button__label') || btn;\n    label.textContent = (window.variantStrings && window.variantStrings.unavailable) || 'Unavailable';\n  }\n\n  updatePickupAvailability() {\n    const pickup = qs('pickup-availability');\n    if (!pickup) return;\n    if (this.currentVariant && this.currentVariant.available) {\n      pickup.fetchAvailability(this.currentVariant.id);\n    } else {\n      pickup.removeAttribute('available');\n      qs('pickup-availability-preview', pickup) && (qs('pickup-availability-preview', pickup).innerHTML = '');\n    }\n  }\n}\ncustomElements.define('variant-selects', VariantSelects);\n\nclass CardVariantSelects extends VariantSelects {}\ncustomElements.define('card-variant-selects', CardVariantSelects);\n\n/* ============================================================\n   SECTION 5 \u00E2\u20AC\u201D CUSTOM ELEMENT: ModalDialog\n   ============================================================ */\n\nclass ModalDialog extends HTMLElement {\n  connectedCallback() {\n    this.dialog = qs('[role=\"dialog\"]', this) || qs('details', this);\n    this.closeBtn = qs('[id^=\"ModalClose\"]', this) || qs('[data-close-modal]', this);\n    this.closeBtn && this.closeBtn.addEventListener('click', () => this.hide());\n    this.addEventListener('keydown', e => { if (e.key === 'Escape') this.hide(); });\n  }\n\n  show(opener) {\n    this._opener = opener;\n    this.removeAttribute('hidden');\n    this.setAttribute('open', '');\n    this.querySelector('[tabindex=\"-1\"]') && this.querySelector('[tabindex=\"-1\"]').removeAttribute('tabindex');\n    trapFocus(this);\n    document.body.classList.add('overflow-hidden');\n  }\n\n  hide() {\n    this.setAttribute('hidden', '');\n    this.removeAttribute('open');\n    removeTrapFocus(this);\n    document.body.classList.remove('overflow-hidden');\n    if (this._opener) { this._opener.focus(); this._opener = null; }\n    pauseAllMedia();\n  }\n}\ncustomElements.define('modal-dialog', ModalDialog);\n\n/* ============================================================\n   SECTION 6 \u00E2\u20AC\u201D CUSTOM ELEMENT: ModalOpener\n   ============================================================ */\n\nclass ModalOpener extends HTMLElement {\n  connectedCallback() {\n    const btn = qs('button', this);\n    if (!btn) return;\n    btn.addEventListener('click', () => {\n      const targetId = this.dataset.modal;\n      const modal = targetId ? qs(`#${targetId}`) : null;\n      if (modal && typeof modal.show === 'function') modal.show(btn);\n    });\n  }\n}\ncustomElements.define('modal-opener', ModalOpener);\n\n/* ============================================================\n   SECTION 7 \u00E2\u20AC\u201D CUSTOM ELEMENT: DetailsModal (accordion/tabs)\n   ============================================================ */\n\nclass DetailsModal extends HTMLElement {\n  connectedCallback() {\n    this.detailsEl = qs('details', this);\n    if (!this.detailsEl) return;\n    this.summary = qs('summary', this.detailsEl);\n    this.content = this.detailsEl.querySelector('[id^=\"Details-Content\"]');\n    this.summary && this.summary.addEventListener('click', e => this._toggle(e));\n    this.addEventListener('keydown', e => {\n      if (e.key === 'Escape' && this.detailsEl.hasAttribute('open')) {\n        this.close();\n      }\n    });\n  }\n\n  _toggle(e) {\n    if (this.detailsEl.hasAttribute('open')) {\n      e.preventDefault();\n      this.detailsEl.removeAttribute('open');\n    }\n  }\n\n  open(opener) {\n    this.detailsEl = this.detailsEl || qs('details', this);\n    this.summary = this.summary || (this.detailsEl && qs('summary', this.detailsEl));\n    this.openedBy = opener || this.summary;\n    if (this.detailsEl) this.detailsEl.setAttribute('open', '');\n  }\n\n  close(focusToggle = true) {\n    this.detailsEl = this.detailsEl || qs('details', this);\n    this.summary = this.summary || (this.detailsEl && qs('summary', this.detailsEl));\n    if (this.detailsEl) this.detailsEl.removeAttribute('open');\n    if (focusToggle && this.summary) this.summary.focus();\n  }\n}\ncustomElements.define('details-modal', DetailsModal);\n\n/* ============================================================\n   SECTION 8 \u00E2\u20AC\u201D CUSTOM ELEMENT: CartDrawer\n   ============================================================ */\n\nclass CartDrawer extends HTMLElement {\n  connectedCallback() {\n    this.addEventListener('keydown', e => { if (e.key === 'Escape') this.close(); });\n    const overlay = qs('.cart-drawer__overlay', this);\n    overlay && overlay.addEventListener('click', () => this.close());\n    qs('[data-close-drawer]', this) && qs('[data-close-drawer]', this).addEventListener('click', () => this.close());\n    qsa('[aria-controls=\"CartDrawer\"]').forEach(el => el.addEventListener('click', () => this.open()));\n  }\n\n  open() {\n    this.setAttribute('aria-expanded', 'true');\n    this.classList.add('active');\n    document.body.classList.add('overflow-hidden');\n    trapFocus(this);\n    this.refreshCart();\n    syncFreeGift();\n  }\n\n  close() {\n    this.setAttribute('aria-expanded', 'false');\n    this.classList.remove('active');\n    document.body.classList.remove('overflow-hidden');\n    removeTrapFocus(this);\n  }\n\n  refreshCart() {\n    safeFetch('/cart.js')\n      .then(r => r.json())\n      .then(cart => {\n        this.classList.toggle('is-empty', cart.item_count === 0);\n        const countEls = qsa('.cart-count-bubble');\n        countEls.forEach(el => {\n          const inner = qs('[aria-hidden]', el);\n          if (cart.item_count > 0) {\n            el.removeAttribute('hidden');\n            if (inner) inner.textContent = cart.item_count;\n          } else {\n            el.setAttribute('hidden', '');\n          }\n        });\n      })\n      .catch(() => {});\n  }\n}\ncustomElements.define('cart-drawer', CartDrawer);\n\n/* ============================================================\n   SECTION 9 \u00E2\u20AC\u201D CUSTOM ELEMENT: CartItems\n   ============================================================ */\n\nclass CartItems extends HTMLElement {\n  connectedCallback() {\n    this.debouncedChange = debounce(this._onChange.bind(this), 300);\n    this.addEventListener('change', this.debouncedChange);\n  }\n\n  _onChange(e) {\n    const input = e.target.closest('input[name=\"updates[]\"], .quantity__input');\n    if (!input) return;\n    const line = parseInt(input.dataset.index, 10);\n    const qty = parseInt(input.value, 10);\n    if (isNaN(line) || isNaN(qty)) return;\n    this.updateQuantity(line, qty);\n  }\n\n  updateQuantity(line, quantity) {\n    this._setLoading(line, true);\n    // Decide what to re-render based on WHICH element this is:\n    // the drawer (<cart-drawer-items>) re-renders the drawer; the /cart page\n    // (<cart-items>) re-renders the cart page sections. Both <cart-drawer> and\n    // the page can coexist in the DOM, so branch on tag, not on presence.\n    const isDrawer = this.tagName.toLowerCase() === 'cart-drawer-items';\n    const itemsEl = document.getElementById('main-cart-items');\n    const footerEl = document.getElementById('main-cart-footer');\n    const pageItemsId = itemsEl ? itemsEl.dataset.id : null;\n    const pageFooterId = footerEl ? footerEl.dataset.id : null;\n    const sections = isDrawer\n      ? ['cart-drawer', 'cart-icon-bubble']\n      : [pageItemsId, pageFooterId].filter(Boolean);\n\n    const body = { line, quantity, sections_url: window.location.pathname };\n    if (sections.length) body.sections = sections;\n\n    safeFetch(cartChangeUrl(), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' },\n      body: JSON.stringify(body),\n    })\n      .then(r => r.json())\n      .then(cart => {\n        if (cart.status) { this._setLoading(line, false); return; }\n        if (isDrawer) {\n          if (cart.sections && cart.sections['cart-drawer']) this._renderDrawer(cart);\n          syncFreeGift();\n        } else {\n          this._renderPage(cart, pageItemsId, pageFooterId);\n        }\n      })\n      .catch(() => this._setLoading(line, false));\n  }\n\n  _renderPage(cart, itemsId, footerId) {\n    if (cart.item_count === 0) { window.location.reload(); return; }\n    [['main-cart-items', itemsId], ['main-cart-footer', footerId]].forEach(([elId, secId]) => {\n      if (!secId || !cart.sections || !cart.sections[secId]) return;\n      const parsed = new DOMParser().parseFromString(cart.sections[secId], 'text/html');\n      const src = parsed.querySelector('.js-contents');\n      const host = document.getElementById(elId);\n      const dest = host && host.querySelector('.js-contents');\n      if (src && dest) dest.innerHTML = src.innerHTML;\n    });\n    this._updateBubble(cart.item_count);\n  }\n\n  _renderDrawer(cart) {\n    const cartDrawer = qs('cart-drawer');\n    const html = cart.sections['cart-drawer'];\n    const fresh = new DOMParser().parseFromString(html, 'text/html').querySelector('cart-drawer');\n    if (cartDrawer && fresh) {\n      cartDrawer.innerHTML = fresh.innerHTML;\n      cartDrawer.classList.toggle('is-empty', cart.item_count === 0);\n    }\n    this._updateBubble(cart.item_count);\n  }\n\n  _updateBubble(count) {\n    qsa('.cart-count-bubble').forEach(el => {\n      const inner = qs('[aria-hidden]', el);\n      if (count > 0) {\n        el.removeAttribute('hidden');\n        if (inner) inner.textContent = count;\n      } else {\n        el.setAttribute('hidden', '');\n      }\n    });\n  }\n\n  _setLoading(line, on) {\n    const item = this.querySelector(`[id$=\"-Item-${line}\"]`) || this.querySelector(`[data-index=\"${line}\"]`);\n    const overlay = item && qs('.loading-overlay', item);\n    if (overlay) overlay.classList.toggle('hidden', !on);\n  }\n}\ncustomElements.define('cart-items', CartItems);\n\n// Cart drawer uses <cart-drawer-items>; reuse the same logic via a subclass.\nclass CartDrawerItems extends CartItems {}\ncustomElements.define('cart-drawer-items', CartDrawerItems);\n\nclass CartRemoveButton extends HTMLElement {\n  connectedCallback() {\n    this.addEventListener('click', e => {\n      e.preventDefault();\n      const line = parseInt(this.dataset.index, 10);\n      if (isNaN(line)) return;\n      const container = this.closest('cart-drawer-items, cart-items');\n      if (container && typeof container.updateQuantity === 'function') {\n        container.updateQuantity(line, 0);\n        return;\n      }\n      safeFetch(cartChangeUrl(), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' },\n        body: JSON.stringify({ line, quantity: 0, sections_url: window.location.pathname }),\n      })\n        .then(r => r.json())\n        .then(() => { window.location.reload(); })\n        .catch(() => {});\n    });\n  }\n}\ncustomElements.define('cart-remove-button', CartRemoveButton);\n\n/* ============================================================\n   SECTION 10 \u00E2\u20AC\u201D CUSTOM ELEMENT: HeaderDrawer (mobile nav)\n   ============================================================ */\n\nclass MenuDrawer extends HTMLElement {\n  connectedCallback() {\n    this.mainDetailsToggle = qs('details', this);\n    this._summaryClickHandler = this._summaryClickHandler || this._onSummaryClick.bind(this);\n    this._keyUpHandler = this._keyUpHandler || this._onKeyUp.bind(this);\n    this._focusOutHandler = this._focusOutHandler || this._onFocusOut.bind(this);\n\n    qsa('summary', this).forEach(s => {\n      s.setAttribute('role', 'button');\n      s.addEventListener('click', this._summaryClickHandler);\n      s.addEventListener('keydown', e => {\n        if (e.key === 'Enter') {\n          e.preventDefault();\n          const details = s.closest('details');\n          if (details === this.mainDetailsToggle) {\n            details.hasAttribute('open') ? this.closeMenuDrawer(e, s) : this.openMenuDrawer(s);\n          } else if (details) {\n            details.hasAttribute('open') ? this.closeSubmenu(details) : this.openSubmenu(details, s);\n          }\n        }\n      });\n    });\n\n    qsa('.menu-drawer__close-btn', this).forEach(btn => {\n      btn.addEventListener('click', e => this.closeMenuDrawer(e, this.mainDetailsToggle && this.mainDetailsToggle.querySelector('summary')));\n    });\n    qsa('button:not(.menu-drawer__close-menu-btn)', this).forEach(btn => {\n      btn.addEventListener('click', e => this.closeSubmenu(e.currentTarget.closest('details')));\n    });\n    this.addEventListener('keyup', this._keyUpHandler);\n    this.addEventListener('focusout', this._focusOutHandler);\n  }\n\n  _onSummaryClick(e) {\n    const summary = e.currentTarget;\n    const details = summary.closest('details');\n    if (!details) return;\n    const isOpen = details.hasAttribute('open');\n\n    if (details === this.mainDetailsToggle) {\n      e.preventDefault();\n      isOpen ? this.closeMenuDrawer(e, summary) : this.openMenuDrawer(summary);\n      return;\n    }\n\n    if (isOpen) {\n      e.preventDefault();\n      this.closeSubmenu(details);\n      return;\n    }\n\n    setTimeout(() => this.openSubmenu(details, summary), 100);\n  }\n\n  _onKeyUp(e) {\n    if (e.code && e.code.toUpperCase() !== 'ESCAPE') return;\n    const details = e.target.closest('details[open]');\n    if (!details) return;\n\n    if (details === this.mainDetailsToggle) {\n      this.closeMenuDrawer(e, this.mainDetailsToggle.querySelector('summary'));\n    } else {\n      this.closeSubmenu(details);\n    }\n  }\n\n  _onFocusOut() {\n    setTimeout(() => {\n      if (this.mainDetailsToggle && this.mainDetailsToggle.hasAttribute('open') && !this.mainDetailsToggle.contains(document.activeElement)) {\n        this.closeMenuDrawer();\n      }\n    });\n  }\n\n  openSubmenu(details, summary) {\n    if (!details || !summary) return;\n    const parentMenu = details.closest('.has-submenu');\n    details.classList.add('menu-opening');\n    summary.setAttribute('aria-expanded', 'true');\n    if (parentMenu) parentMenu.classList.add('submenu-open');\n\n    const submenu = summary.nextElementSibling;\n    if (!submenu) return;\n\n    const focusTarget = details.querySelector('button');\n    const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)');\n    const focusSubmenu = () => {\n      trapFocus(submenu, focusTarget);\n      submenu.removeEventListener('transitionend', focusSubmenu);\n    };\n\n    if (prefersReducedMotion.matches) {\n      focusSubmenu();\n    } else {\n      submenu.addEventListener('transitionend', focusSubmenu);\n    }\n  }\n\n  openMenuDrawer(btn) {\n    this._opener = btn;\n    if (this.mainDetailsToggle) {\n      this.mainDetailsToggle.setAttribute('open', '');\n      requestAnimationFrame(() => {\n        this.mainDetailsToggle.classList.add('menu-opening');\n      });\n    }\n    if (btn) btn.setAttribute('aria-expanded', 'true');\n\n    const header = document.querySelector('.section-header');\n    if (header) {\n      header.classList.add('menu-open');\n      const headerWrapper = this.closest('.header-wrapper');\n      const borderOffset = headerWrapper && headerWrapper.classList.contains('header-wrapper--border-bottom') ? 1 : 0;\n      document.documentElement.style.setProperty('--header-bottom-position', `${parseInt(header.getBoundingClientRect().bottom - borderOffset, 10)}px`);\n    }\n\n    if (window.matchMedia('(max-width: 990px)').matches) {\n      document.documentElement.style.setProperty('--viewport-height', `${window.innerHeight}px`);\n    }\n\n    document.body.classList.add('overflow-hidden', `overflow-hidden-${this.dataset.breakpoint || 'tablet'}`);\n    trapFocus(this.mainDetailsToggle || this, btn);\n  }\n\n  closeMenuDrawer(event, focusElement = false) {\n    if (this.mainDetailsToggle) {\n      this.mainDetailsToggle.classList.remove('menu-opening');\n      this.mainDetailsToggle.querySelectorAll('details').forEach(details => {\n        details.removeAttribute('open');\n        details.classList.remove('menu-opening');\n      });\n      this.mainDetailsToggle.querySelectorAll('.submenu-open').forEach(submenu => {\n        submenu.classList.remove('submenu-open');\n      });\n      const summary = this.mainDetailsToggle.querySelector('summary');\n      if (summary) summary.setAttribute('aria-expanded', 'false');\n      this.closeAnimation(this.mainDetailsToggle);\n    }\n\n    const header = document.querySelector('.section-header');\n    if (header) header.classList.remove('menu-open');\n\n    document.body.classList.remove('overflow-hidden', `overflow-hidden-${this.dataset.breakpoint || 'tablet'}`);\n    removeTrapFocus(focusElement || this._opener || false);\n    if (this._opener) { this._opener.focus(); this._opener = null; }\n  }\n\n  closeSubmenu(details) {\n    if (!details) return;\n    const parentMenu = details.closest('.submenu-open');\n    if (parentMenu) parentMenu.classList.remove('submenu-open');\n    details.classList.remove('menu-opening');\n    const summary = details.querySelector('summary');\n    if (summary) summary.setAttribute('aria-expanded', 'false');\n    removeTrapFocus(summary || false);\n    this.closeAnimation(details);\n  }\n\n  closeAnimation(details) {\n    if (!details) return;\n    let animationStart;\n    const handleAnimation = now => {\n      if (animationStart === undefined) animationStart = now;\n      if (now - animationStart < 400) {\n        window.requestAnimationFrame(handleAnimation);\n      } else {\n        details.removeAttribute('open');\n        const openParent = details.closest('details[open]');\n        if (openParent) trapFocus(openParent, details.querySelector('summary'));\n      }\n    };\n    window.requestAnimationFrame(handleAnimation);\n  }\n}\ncustomElements.define('menu-drawer', MenuDrawer);\n\nclass HeaderDrawer extends MenuDrawer {\n  connectedCallback() {\n    super.connectedCallback();\n    qsa('.menu-drawer__close-menu-btn', this).forEach(btn => {\n      btn.addEventListener('click', e => {\n        this.closeMenuDrawer(e, this.mainDetailsToggle && this.mainDetailsToggle.querySelector('summary'));\n        const expandedToggle = qs('.header__icon--menu[aria-expanded=\"true\"]', this);\n        if (expandedToggle) expandedToggle.setAttribute('aria-expanded', 'false');\n      });\n    });\n  }\n}\ncustomElements.define('header-drawer', HeaderDrawer);\n\n/* ============================================================\n   SECTION 11 \u00E2\u20AC\u201D CUSTOM ELEMENT: SliderComponent\n   ============================================================ */\n\nclass SliderComponent extends HTMLElement {\n  connectedCallback() {\n    this.slider = qs('[id^=\"Slider-\"]', this) || qs('.slider', this);\n    this.sliderItems = this.slider ? Array.from(this.slider.children) : [];\n    this.prevBtn = qs('[name=\"previous\"]', this) || qs('.slider-button--prev', this);\n    this.nextBtn = qs('[name=\"next\"]', this) || qs('.slider-button--next', this);\n    if (!this.slider || !this.sliderItems.length) return;\n\n    this.prevBtn && this.prevBtn.addEventListener('click', () => this._slide(-1));\n    this.nextBtn && this.nextBtn.addEventListener('click', () => this._slide(1));\n    this.slider.addEventListener('scroll', debounce(this._updateButtons.bind(this), 100));\n    this._updateButtons();\n  }\n\n  _slide(dir) {\n    const itemWidth = this.sliderItems[0] ? this.sliderItems[0].offsetWidth : 0;\n    this.slider.scrollBy({ left: dir * itemWidth, behavior: 'smooth' });\n  }\n\n  _updateButtons() {\n    if (!this.slider) return;\n    const atStart = this.slider.scrollLeft <= 0;\n    const atEnd = this.slider.scrollLeft + this.slider.offsetWidth >= this.slider.scrollWidth - 1;\n    this.prevBtn && this.prevBtn.classList.toggle('slider-button--disabled', atStart);\n    this.nextBtn && this.nextBtn.classList.toggle('slider-button--disabled', atEnd);\n  }\n}\ncustomElements.define('slider-component', SliderComponent);\n\n/* ============================================================\n   SECTION 12 \u00E2\u20AC\u201D CUSTOM ELEMENT: SlideshowComponent\n   ============================================================ */\n\nclass SlideshowComponent extends SliderComponent {\n  connectedCallback() {\n    super.connectedCallback();\n    this.autoplaySpeed = parseInt(this.dataset.autoplay, 10) || 0;\n    this._currentIndex = 0;\n    this._autoplayInterval = null;\n\n    const playBtn = qs('.slideshow__control--play', this);\n    const pauseBtn = qs('.slideshow__control--pause', this);\n    playBtn && playBtn.addEventListener('click', () => this.play());\n    pauseBtn && pauseBtn.addEventListener('click', () => this.pause());\n\n    if (this.autoplaySpeed > 0) this.play();\n  }\n\n  play() {\n    if (this._autoplayInterval) return;\n    this._autoplayInterval = setInterval(() => this._slide(1), this.autoplaySpeed);\n    this.setAttribute('aria-live', 'off');\n  }\n\n  pause() {\n    clearInterval(this._autoplayInterval);\n    this._autoplayInterval = null;\n    this.setAttribute('aria-live', 'polite');\n  }\n\n  disconnectedCallback() {\n    this.pause();\n  }\n}\ncustomElements.define('slideshow-component', SlideshowComponent);\n\n/* ============================================================\n   SECTION 13 \u00E2\u20AC\u201D CUSTOM ELEMENT: DeferredMedia\n   ============================================================ */\n\nclass DeferredMedia extends HTMLElement {\n  connectedCallback() {\n    const poster = qs('[id^=\"Deferred-Poster\"]', this);\n    poster && poster.addEventListener('click', () => this.loadContent());\n  }\n\n  loadContent(focus = true) {\n    const template = qs('template', this);\n    if (!template) return;\n    const content = template.content.firstElementChild;\n    if (!content) return;\n    this.appendChild(content.cloneNode(true));\n    template.remove();\n    if (focus) {\n      const media = qs('video, iframe', this);\n      media && media.focus();\n    }\n  }\n}\ncustomElements.define('deferred-media', DeferredMedia);\n\n/* ============================================================\n   SECTION 14 \u00E2\u20AC\u201D CUSTOM ELEMENT: ProductInfo\n   ============================================================ */\n\nclass ProductInfo extends HTMLElement {\n  connectedCallback() {\n    // Wire up sticky ATC if present\n    const stickyAtc = qs('sticky-atc', document);\n    if (stickyAtc) {\n      const atcBtn = qs('[id^=\"ProductSubmitButton\"]', this);\n      if (atcBtn) {\n        const observer = new IntersectionObserver(([entry]) => {\n          stickyAtc.classList.toggle('is-visible', !entry.isIntersecting);\n        });\n        observer.observe(atcBtn);\n      }\n    }\n  }\n}\ncustomElements.define('product-info', ProductInfo);\n\n/* ============================================================\n   SECTION 15 \u00E2\u20AC\u201D CUSTOM ELEMENT: StickyAtc\n   ============================================================ */\n\nclass StickyAtc extends HTMLElement {\n  connectedCallback() {\n    this.atcBtn = qs('[id^=\"SectionAtcBtn\"]', this);\n  }\n}\ncustomElements.define('sticky-atc', StickyAtc);\n\n/* ============================================================\n   SECTION 16 \u00E2\u20AC\u201D CUSTOM ELEMENT: MediaGallery\n   ============================================================ */\n\nclass MediaGallery extends HTMLElement {\n  connectedCallback() {\n    this.main = qs('[id^=\"GalleryStatus\"]', this) || qs('.product__media-wrapper', this);\n    const thumbnails = qsa('[data-thumbnail-id]', this);\n    thumbnails.forEach(thumb => {\n      thumb.addEventListener('click', () => {\n        const mediaId = thumb.dataset.thumbnailId;\n        this._setActiveMedia(mediaId);\n      });\n    });\n  }\n\n  _setActiveMedia(mediaId) {\n    const media = qs(`[data-media-id=\"${mediaId}\"]`, this);\n    if (!media) return;\n    qsa('[data-media-id]', this).forEach(m => m.classList.remove('is-active'));\n    media.classList.add('is-active');\n    qsa('[data-thumbnail-id]', this).forEach(t => {\n      const isActive = t.dataset.thumbnailId === mediaId;\n      t.classList.toggle('media-thumbnail--active', isActive);\n      // Stock thumbnail highlight styles key off button[aria-current], not a class.\n      const btn = qs('button', t) || t;\n      if (isActive) {\n        btn.setAttribute('aria-current', 'true');\n      } else {\n        btn.removeAttribute('aria-current');\n      }\n    });\n  }\n}\ncustomElements.define('media-gallery', MediaGallery);\n\n/* ============================================================\n   SECTION 17 \u00E2\u20AC\u201D CUSTOM ELEMENT: PredictiveSearch\n   ============================================================ */\n\nclass PredictiveSearch extends HTMLElement {\n  connectedCallback() {\n    this.input = qs('input[type=\"search\"]', this);\n    this.resultsList = qs('[id^=\"predictive-search-results\"]', this);\n    if (!this.input) return;\n\n    this.input.addEventListener('input', debounce(this._onInput.bind(this), 300));\n    this.input.addEventListener('focus', () => {\n      if (this.input.value.length > 0) this._search(this.input.value);\n    });\n    document.addEventListener('click', e => {\n      if (!this.contains(e.target)) this._close();\n    });\n    this.input.addEventListener('keydown', e => {\n      if (e.key === 'Escape') this._close();\n    });\n  }\n\n  _onInput(e) {\n    const q = e.target.value.trim();\n    if (q.length < 2) { this._close(); return; }\n    this._search(q);\n  }\n\n  _search(q) {\n    const url = `${window.routes && window.routes.predictive_search_url}?q=${encodeURIComponent(q)}&resources[type]=product,collection,article,page&section_id=predictive-search`;\n    safeFetch(url)\n      .then(r => r.text())\n      .then(html => {\n        const parser = new DOMParser();\n        const doc = parser.parseFromString(html, 'text/html');\n        const results = doc.querySelector('.predictive-search__results');\n        if (this.resultsList && results) {\n          this.resultsList.innerHTML = results.innerHTML;\n          this.resultsList.removeAttribute('hidden');\n        }\n      })\n      .catch(() => {});\n  }\n\n  _close() {\n    this.resultsList && this.resultsList.setAttribute('hidden', '');\n  }\n}\ncustomElements.define('predictive-search', PredictiveSearch);\n\n/* ============================================================\n   SECTION 18 \u00E2\u20AC\u201D CUSTOM ELEMENT: ShareButton\n   ============================================================ */\n\nclass ShareButton extends HTMLElement {\n  connectedCallback() {\n    this.shareBtn = qs('[data-share-button]', this) || qs('button', this);\n    this.urlInput = qs('[data-share-url]', this);\n    this.successMsg = qs('[data-success-message]', this);\n    if (!this.shareBtn) return;\n\n    this.shareBtn.addEventListener('click', () => {\n      const url = (this.urlInput && this.urlInput.value) || window.location.href;\n      if (navigator.share) {\n        navigator.share({ url }).catch(() => {});\n      } else {\n        navigator.clipboard && navigator.clipboard.writeText(url).then(() => {\n          if (this.successMsg) {\n            this.successMsg.removeAttribute('hidden');\n            setTimeout(() => this.successMsg.setAttribute('hidden', ''), 2000);\n          }\n        }).catch(() => {});\n      }\n    });\n  }\n}\ncustomElements.define('share-button', ShareButton);\n\n/* ============================================================\n   SECTION 19 \u00E2\u20AC\u201D CUSTOM ELEMENT: ShowMoreButton\n   ============================================================ */\n\nclass ShowMoreButton extends HTMLElement {\n  connectedCallback() {\n    const btn = qs('button', this);\n    if (!btn) return;\n    btn.addEventListener('click', () => {\n      const targetId = this.dataset.targetId;\n      const target = targetId ? qs(`#${targetId}`) : null;\n      if (target) {\n        target.removeAttribute('hidden');\n        this.setAttribute('hidden', '');\n      }\n    });\n  }\n}\nif (!document.querySelector('script[src*=\"show-more.js\"]') && !customElements.get('show-more-button')) {\n  customElements.define('show-more-button', ShowMoreButton);\n}\n\n/* ============================================================\n   SECTION 20 \u00E2\u20AC\u201D CUSTOM ELEMENT: CopyButton\n   ============================================================ */\n\nclass CopyButton extends HTMLElement {\n  connectedCallback() {\n    this.addEventListener('click', () => {\n      const text = this.dataset.copyText || '';\n      navigator.clipboard && navigator.clipboard.writeText(text).catch(() => {});\n      const success = qs('[data-success]', this);\n      if (success) {\n        success.removeAttribute('hidden');\n        setTimeout(() => success.setAttribute('hidden', ''), 2000);\n      }\n    });\n  }\n}\ncustomElements.define('copy-button', CopyButton);\n\n/* ============================================================\n   SECTION 21 \u00E2\u20AC\u201D CUSTOM ELEMENT: ProductRecommendations\n   ============================================================ */\n\nclass ProductRecommendations extends HTMLElement {\n  connectedCallback() {\n    const productId = this.dataset.productId;\n    const sectionId = this.dataset.sectionId;\n    if (!productId || !sectionId) return;\n\n    const url = `/recommendations/products.json?product_id=${productId}&limit=4&section_id=${sectionId}`;\n    safeFetch(url)\n      .then(r => r.json())\n      .then(data => {\n        if (!data.products || data.products.length === 0) {\n          this.setAttribute('hidden', '');\n        }\n      })\n      .catch(() => this.setAttribute('hidden', ''));\n  }\n}\ncustomElements.define('product-recommendations', ProductRecommendations);\n\n/* ============================================================\n   SECTION 22 \u00E2\u20AC\u201D CUSTOM ELEMENT: PickupAvailability (stub)\n   ============================================================ */\n\nclass PickupAvailability extends HTMLElement {\n  connectedCallback() {}\n\n  fetchAvailability(variantId) {\n    if (!variantId) return;\n    safeFetch(`/variants/${variantId}/?section_id=pickup-availability`)\n      .then(r => r.text())\n      .then(html => {\n        const preview = qs('pickup-availability-preview', this);\n        if (preview) preview.innerHTML = html;\n        this.setAttribute('available', '');\n      })\n      .catch(() => {});\n  }\n}\ncustomElements.define('pickup-availability', PickupAvailability);\n\n/* ============================================================\n   SECTION 23 \u00E2\u20AC\u201D ANNOUNCEMENT BAR / PROMO POPUP (vanilla JS)\n   ============================================================ */\n\ndocument.addEventListener('DOMContentLoaded', () => {\n\n  // Announcement bar close button\n  const announcementClose = qs('.announcement-bar__close');\n  const announcementBar = qs('.announcement-bar');\n  if (announcementClose && announcementBar) {\n    announcementClose.addEventListener('click', () => {\n      announcementBar.style.display = 'none';\n    });\n  }\n\n  // Generic accordion \u00E2\u20AC\u201D <details> / <summary> pairs not in custom elements\n  qsa('details.accordion').forEach(details => {\n    const summary = qs('summary', details);\n    summary && summary.addEventListener('click', e => {\n      if (details.hasAttribute('open')) {\n        e.preventDefault();\n        details.removeAttribute('open');\n      }\n    });\n  });\n\n  // Image drag prevention (common Shrine feature)\n  qsa('.product__media img').forEach(img => {\n    img.addEventListener('dragstart', e => e.preventDefault());\n  });\n\n  // No-JS class removal\n  document.documentElement.className = document.documentElement.className.replace('no-js', 'js');\n\n  // Scroll-to-top button\n  const scrollTopBtn = qs('.scroll-to-top-btn');\n  if (scrollTopBtn) {\n    window.addEventListener('scroll', debounce(() => {\n      scrollTopBtn.classList.toggle('is-visible', window.scrollY > 400);\n    }, 100));\n    scrollTopBtn.addEventListener('click', () => {\n      window.scrollTo({ top: 0, behavior: 'smooth' });\n    });\n  }\n\n  // Header cart icon + any CartDrawer trigger -> open the drawer (not the /cart page)\n  qsa('#cart-icon-bubble, [aria-controls=\"CartDrawer\"]').forEach(trigger => {\n    trigger.addEventListener('click', e => {\n      const cartDrawer = qs('cart-drawer');\n      if (cartDrawer && typeof cartDrawer.open === 'function') {\n        e.preventDefault();\n        cartDrawer.open();\n      }\n    });\n  });\n\n  // Mobile header toggle (hamburger)\n  const menuToggle = qs('[aria-controls=\"menu-drawer\"]');\n  const menuDrawer = qs('menu-drawer') || qs('header-drawer');\n  if (menuToggle && menuDrawer) {\n    menuToggle.addEventListener('click', () => {\n      const isOpen = menuToggle.getAttribute('aria-expanded') === 'true';\n      menuToggle.setAttribute('aria-expanded', !isOpen);\n      if (!isOpen) {\n        menuDrawer.openMenuDrawer && menuDrawer.openMenuDrawer(menuToggle);\n      } else {\n        menuDrawer.closeMenuDrawer && menuDrawer.closeMenuDrawer();\n      }\n    });\n  }\n\n  // Close all overlays on ESC\n  document.addEventListener('keydown', e => {\n    if (e.key !== 'Escape') return;\n    const cartDrawer = qs('cart-drawer');\n    if (cartDrawer && cartDrawer.classList.contains('active')) cartDrawer.close();\n    const menuDrawerEl = qs('menu-drawer') || qs('header-drawer');\n    if (menuDrawerEl) menuDrawerEl.closeMenuDrawer && menuDrawerEl.closeMenuDrawer();\n  });\n\n});\n\n/* ============================================================\n   SECTION 24 \u00E2\u20AC\u201D SHOPIFY THEME EDITOR COMPATIBILITY\n   ============================================================ */\n\ndocument.addEventListener('shopify:section:load', e => {\n  // Re-run animations if applicable\n  if (typeof initAnimations === 'function') initAnimations(e.target, true);\n});\n\ndocument.addEventListener('shopify:block:select', e => {\n  const block = e.target;\n  if (block.classList.contains('slideshow__slide')) {\n    const slideshow = block.closest('slideshow-component');\n    if (slideshow && slideshow.pause) slideshow.pause();\n  }\n});\n\ndocument.addEventListener('shopify:block:deselect', e => {\n  const block = e.target;\n  const slideshow = block && block.closest('slideshow-component');\n  if (slideshow && slideshow.play && slideshow.autoplaySpeed > 0) slideshow.play();\n});\n\n/* ============================================================\n   SECTION 25 \u00E2\u20AC\u201D LOCALIZATION FORM STUB\n   ============================================================ */\n\nclass GGLocalizationForm extends HTMLElement {\n  connectedCallback() {\n    this.form = qs('form', this);\n    this.inputEl = qs('input[name=\"locale_code\"]', this) || qs('input[name=\"country_code\"]', this);\n    qsa('a[data-value]', this).forEach(link => {\n      link.addEventListener('click', e => {\n        e.preventDefault();\n        if (this.inputEl) this.inputEl.value = link.dataset.value;\n        this.form && this.form.submit();\n      });\n    });\n  }\n}\nif (!customElements.get('localization-form')) {\n  customElements.define('localization-form', GGLocalizationForm);\n}\n"],
  "mappings": "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",
  "names": []
}
