{
  "version": 3,
  "sources": ["/cdn/shop/t/168/assets/beleaev-custom.js?october=20261010"],
  "sourcesContent": ["/* Beleaev \u2014 Layout: move inner <quantity-input> into product-form__buttons\n   so it sits beside ADD TO CART. Buy with Shop stays below.\n   Also: wrap \"From \" prefix in card prices for Petrossian-style typography. */\n(function() {\n  'use strict';\n\n  function restructure() {\n    document.querySelectorAll('product-info, [id^=\"ProductInfo-\"]').forEach(function(root) {\n      if (!root.isConnected) return;\n      const primaryBtn = root.querySelector('.product-form__submit.button--primary');\n      const quantity = root.querySelector('.product-form__quantity-top quantity-input');\n      const buttons = primaryBtn && primaryBtn.closest('.product-form__buttons');\n      const form = primaryBtn && primaryBtn.closest('form');\n      const input = quantity && quantity.querySelector('input[name=\"quantity\"]');\n      if (!buttons || !quantity || !input || !form || input.getAttribute('form') !== form.getAttribute('id')) return;\n      if (quantity.contains(buttons)) return;\n      if (quantity.parentElement !== buttons) buttons.insertBefore(quantity, primaryBtn);\n      buttons.classList.add('beleaev-buttons-row');\n    });\n  }\n\n  /* Add curator badges (Top Seller / Sommelier's Choice / Beginner's Pick /\n     Best Value) to the four caviar grades. Pill in top-left corner of media.\n     Specific (full-handle) matchers come FIRST so they win over generic regex. */\n  const BELEAEV_BADGES = [\n    /* --- Signature Tasting Set: three thematic labels by grammage (10.07.2026).\n       Handle-specific (4x125g / 4x50g) FIRST so they win over the generic\n       signature-tasting-set matcher (which then catches the base 4x30g). --- */\n    {\n      match: /signature-tasting-set-4x125g/i,\n      label: \"Connoisseur's Choice\",\n      tone: 'gold',\n      icon: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 2.6l1.7 4.1 4.4.3-3.4 2.9 1.1 4.3L12 12.9l-3.8 1.3 1.1-4.3-3.4-2.9 4.4-.3L12 2.6z\" fill=\"currentColor\"/><path d=\"M4.2 12c0 4.1 3.1 7.2 8 8.3-4-3.1-5-5.2-5-8.1 0-1 .2-2 .2-2C5.4 11 4.2 12 4.2 12z\" fill=\"currentColor\" opacity=\".55\"/><path d=\"M19.8 12c0 4.1-3.1 7.2-8 8.3 4-3.1 5-5.2 5-8.1 0-1-.2-2-.2-2C18.6 11 19.8 12 19.8 12z\" fill=\"currentColor\" opacity=\".55\"/></svg>'\n    },\n    {\n      match: /signature-tasting-set-4x50g/i,\n      label: 'Grand Tasting',\n      tone: 'gold',\n      icon: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 1.5l2.7 6.6 7.1.6-5.4 4.7 1.7 6.9L12 16.6l-6.1 3.7 1.7-6.9-5.4-4.7 7.1-.6L12 1.5z\" fill=\"currentColor\"/></svg>'\n    },\n    {\n      match: /signature-tasting-set/i,\n      label: 'Tasting Flight',\n      tone: 'gold',\n      icon: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><circle cx=\"4\" cy=\"12\" r=\"2.4\" fill=\"currentColor\"/><circle cx=\"9.3\" cy=\"12\" r=\"2.4\" fill=\"currentColor\"/><circle cx=\"14.7\" cy=\"12\" r=\"2.4\" fill=\"currentColor\"/><circle cx=\"20\" cy=\"12\" r=\"2.4\" fill=\"currentColor\"/></svg>'\n    },\n    /* --- Specific matchers for Beleaev's 3 newest grades (28.04.2026) --- */\n    {\n      match: /almaz-diamond|almaz/i,\n      label: 'Diamond Tier',\n      tone: 'gold',\n      icon: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 2L22 10 12 22 2 10z\" fill=\"currentColor\"/></svg>'\n    },\n    {\n      match: /beluga-xxl|xxl-special-reserve|beluga[\\s-]xxl/i,\n      label: 'XXL Grand Cru',\n      tone: 'gold',\n      icon: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 1.5l2.7 6.6 7.1.6-5.4 4.7 1.7 6.9L12 16.6l-6.1 3.7 1.7-6.9-5.4-4.7 7.1-.6L12 1.5z\" fill=\"currentColor\"/></svg>'\n    },\n    {\n      match: /golden-oscietra|gold[\\s-]oscietra|oscietra[\\s-]special/i,\n      label: 'Gold Prestige',\n      tone: 'gold',\n      icon: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M3 8l4 4 5-7 5 7 4-4-2 11H5L3 8z\" fill=\"currentColor\"/></svg>'\n    },\n    /* --- Generic matchers for the four classic grades --- */\n    {\n      match: /imperial/i,\n      label: 'Top Seller',\n      tone: 'gold',\n      icon: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M3 8l4 4 5-7 5 7 4-4-2 11H5L3 8zm2 13h14v1.5H5V21z\" fill=\"currentColor\"/></svg>'\n    },\n    {\n      match: /beluga/i,\n      label: \"Sommelier's Choice\",\n      tone: 'cream',\n      icon: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 2.5l2.7 6.6 7.1.6-5.4 4.7 1.7 6.9L12 17.6l-6.1 3.7 1.7-6.9-5.4-4.7 7.1-.6L12 2.5z\" fill=\"currentColor\"/></svg>'\n    },\n    {\n      match: /baerii?\\b/i,\n      label: \"Beginner's Pick\",\n      tone: 'cream',\n      icon: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 22s-1-3-1-7c0-5 4-8 9-8 0 4-2 8-5 10-1.5 1-3 5-3 5zm-3-4c-3-1-5-4-5-8 4 0 7 2 8 5-1 1-2 2-3 3z\" fill=\"currentColor\"/></svg>'\n    },\n    {\n      match: /oscietra|ossetra/i,\n      label: 'Best Value',\n      tone: 'gold',\n      icon: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 3h12l4 6-10 12L2 9l4-6zm0 6h12l-3-4H9L6 9zm5 1l-3 0 4 8 4-8h-3l-1 2-1-2z\" fill=\"currentColor\"/></svg>'\n    },\n    {\n      match: /wild[\\s-]salmon|salmon[\\s-]roe/i,\n      label: 'Family Choice',\n      tone: 'gold',\n      icon: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 11a2.8 2.8 0 100-5.6 2.8 2.8 0 000 5.6zm6 0a2.8 2.8 0 100-5.6 2.8 2.8 0 000 5.6zm-6 1.4c-2.8 0-5.6 1.4-5.6 3.7V18h11.2v-1.9c0-2.3-2.8-3.7-5.6-3.7zm6 0c-.6 0-1.4.1-2.1.3 1.3 1 2.1 2.1 2.1 3.4V18H21v-1.9c0-2.3-2.8-3.7-6-3.7z\" fill=\"currentColor\"/></svg>'\n    }\n  ];\n\n  /* Localised labels for the dark caviar badges (10.07.2026). English is the\n     default/fallback; ES uses usted-neutral nouns, DE uses Sie-neutral nouns. */\n  var BELEAEV_BADGE_I18N = {\n    es: {\n      \"Tasting Flight\": \"Degustaci\u00F3n\", \"Grand Tasting\": \"Gran Degustaci\u00F3n\", \"Connoisseur's Choice\": \"Selecci\u00F3n Experta\",\n      \"Best Value\": \"Mejor Valor\", \"Beginner's Pick\": \"Para Iniciarse\", \"Top Seller\": \"M\u00E1s Vendido\",\n      \"Sommelier's Choice\": \"Selecci\u00F3n Sommelier\", \"Diamond Tier\": \"Nivel Diamante\", \"XXL Grand Cru\": \"Grand Cru XXL\",\n      \"Gold Prestige\": \"Prestigio Oro\", \"Family Choice\": \"Para la Familia\"\n    },\n    de: {\n      \"Tasting Flight\": \"Verkostung\", \"Grand Tasting\": \"Gro\u00DFe Verkostung\", \"Connoisseur's Choice\": \"F\u00FCr Kenner\",\n      \"Best Value\": \"Top Preis-Leistung\", \"Beginner's Pick\": \"F\u00FCr Einsteiger\", \"Top Seller\": \"Bestseller\",\n      \"Sommelier's Choice\": \"Sommelier-Wahl\", \"Diamond Tier\": \"Diamant-Klasse\", \"XXL Grand Cru\": \"XXL Grand Cru\",\n      \"Gold Prestige\": \"Gold-Prestige\", \"Family Choice\": \"Familienfavorit\"\n    }\n  };\n  function beleaevBadgeLabel(en) {\n    var lang = (document.documentElement.lang || 'en').slice(0, 2).toLowerCase();\n    var map = BELEAEV_BADGE_I18N[lang];\n    return (map && map[en]) ? map[en] : en;\n  }\n\n  function getProductHandle(card) {\n    const a = card.querySelector('a[href*=\"/products/\"]');\n    if (!a) return '';\n    const m = a.getAttribute('href').match(/\\/products\\/([^/?#]+)/);\n    return m ? m[1] : '';\n  }\n\n  function getCardTitle(card) {\n    const h = card.querySelector('.card__heading a, .card__heading, h3 a, h3');\n    return h ? (h.textContent || '').trim() : '';\n  }\n\n  /* Keep a mobile gallery plaque below the sticky header while its image is visible. */\n  let galleryBadgeFrame = 0;\n  function positionGalleryCuratorBadges() {\n    galleryBadgeFrame = 0;\n    const mobile = window.matchMedia('(max-width: 749px)').matches;\n    let headerBottom = 0;\n    if (mobile) {\n      document.querySelectorAll('.section-header, .announcement-bar-section').forEach((header) => {\n        const rect = header.getBoundingClientRect();\n        if (rect.top <= 100 && rect.bottom > 0) headerBottom = Math.max(headerBottom, rect.bottom);\n      });\n    }\n    document.querySelectorAll('.beleaev-pdp-badge-host').forEach((host) => {\n      const badge = host.querySelector('.beleaev-pdp-curator-badge');\n      const imageList = host.querySelector('.product__media-list');\n      if (!badge || !imageList) return;\n      if (!mobile) { badge.style.removeProperty('--beleaev-curator-offset'); return; }\n      const hostRect = host.getBoundingClientRect();\n      const imageRect = imageList.getBoundingClientRect();\n      const maxTop = Math.max(20, imageRect.bottom - hostRect.top - badge.offsetHeight - 12);\n      const top = Math.min(maxTop, Math.max(20, headerBottom + 12 - hostRect.top));\n      badge.style.setProperty('--beleaev-curator-offset', top + 'px');\n    });\n  }\n  function scheduleGalleryBadgePosition() {\n    if (!galleryBadgeFrame) galleryBadgeFrame = requestAnimationFrame(positionGalleryCuratorBadges);\n  }\n  window.addEventListener('scroll', scheduleGalleryBadgePosition, { passive: true });\n  window.addEventListener('resize', scheduleGalleryBadgePosition, { passive: true });\n  window.addEventListener('load', scheduleGalleryBadgePosition, { once: true });\n\n  /* Reuse collection curator labels and icons on the product's main gallery. */\n  function addGalleryCuratorBadges() {\n    document.querySelectorAll('media-gallery[data-beleaev-curator-product]').forEach((gallery) => {\n      const host = gallery.querySelector('slider-component[id^=\"GalleryViewer-\"]');\n      if (!host || host.querySelector('.beleaev-pdp-curator-badge')) return;\n      const haystack = gallery.dataset.beleaevCuratorProduct + ' ' + gallery.dataset.beleaevCuratorTitle;\n      const match = BELEAEV_BADGES.find((entry) => entry.match.test(haystack));\n      if (!match) return;\n      const badge = document.createElement('span');\n      badge.className = 'beleaev-badge beleaev-badge--' + match.tone + ' beleaev-pdp-curator-badge';\n      const icon = document.createElement('span');\n      icon.className = 'beleaev-badge__icon';\n      icon.setAttribute('aria-hidden', 'true');\n      icon.innerHTML = match.icon;\n      const label = document.createElement('span');\n      label.className = 'beleaev-badge__text';\n      label.textContent = beleaevBadgeLabel(match.label);\n      badge.append(icon, label);\n      host.classList.add('beleaev-pdp-badge-host');\n      host.appendChild(badge);\n      scheduleGalleryBadgePosition();\n    });\n  }\n\n  function addProductBadges() {\n    addGalleryCuratorBadges();\n    const cards = document.querySelectorAll('.card-wrapper, .grid__item');\n    cards.forEach((card) => {\n      if (card.querySelector('.beleaev-badge')) return;\n      /* Skip FAQ accordion and other non-product grid items */\n      if (card.querySelector('details, summary, .accordion')) return;\n      const haystack = (getProductHandle(card) + ' ' + getCardTitle(card)).toLowerCase();\n      const match = BELEAEV_BADGES.find((b) => b.match.test(haystack));\n      if (!match) return;\n      // Append to card-wrapper / card \u2014 NOT to .card__media (which has overflow:hidden\n      // and clips the absolute-positioned badge when card is narrow).\n      const host = card.querySelector('.card__inner') || (card.classList.contains('card-wrapper') ? card : (card.querySelector('.card-wrapper') || card.querySelector('.card') || card));\n      if (!host) return;\n      if (getComputedStyle(host).position === 'static') {\n        host.style.position = 'relative';\n      }\n      const badge = document.createElement('span');\n      badge.className = 'beleaev-badge beleaev-badge--' + match.tone;\n      badge.setAttribute('aria-label', match.label);\n      badge.innerHTML =\n        '<span class=\"beleaev-badge__icon\">' + match.icon + '</span>' +\n        '<span class=\"beleaev-badge__text\">' + beleaevBadgeLabel(match.label) + '</span>';\n      host.appendChild(badge);\n    });\n  }\n\n  /* Move .quick-add (bag icon) inline beside .price by wrapping both in\n     .beleaev-price-row flex container. Saves vertical space on mobile. */\n  function inlineBagWithPrice() {\n    const cards = document.querySelectorAll('.card-wrapper, .grid__item');\n    cards.forEach((card) => {\n      if (card.querySelector('details, summary, .accordion')) return;\n      const price = card.querySelector('.price');\n      const quickAdd = card.querySelector('.quick-add');\n      if (!price || !quickAdd) return;\n      if (price.parentElement && price.parentElement.classList.contains('beleaev-price-row')) return;\n      const wrap = document.createElement('div');\n      wrap.className = 'beleaev-price-row';\n      price.parentNode.insertBefore(wrap, price);\n      wrap.appendChild(price);\n      wrap.appendChild(quickAdd);\n    });\n  }\n\n  /* Wrap \"From \" prefix in <span class=\"price__from\"> so it can be styled\n     smaller than the actual price (Petrossian-style cards). */\n  function wrapFromPrefix() {\n    const items = document.querySelectorAll(\n      '.card-wrapper .price__regular .price-item--regular, ' +\n      '.card .price__regular .price-item--regular, ' +\n      '.grid__item .price__regular .price-item--regular'\n    );\n    items.forEach((el) => {\n      if (el.dataset.beleaevFrom === '1') return;\n      const txt = (el.textContent || '').trim();\n      const m = txt.match(/^From\\s+(.+)$/i);\n      if (!m) {\n        // No \"From\" \u2014 still mark price__amount for consistent styling\n        if (txt) {\n          el.innerHTML = '<span class=\"price__amount\">' +\n            txt.replace(/&/g, '&amp;').replace(/</g, '&lt;') + '</span>';\n          el.dataset.beleaevFrom = '1';\n        }\n        return;\n      }\n      el.innerHTML =\n        '<span class=\"price__from\">From</span><span class=\"price__amount\">' +\n        m[1].replace(/&/g, '&amp;').replace(/</g, '&lt;') +\n        '</span>';\n      el.dataset.beleaevFrom = '1';\n    });\n  }\n\n  function wrapCardCurrencyCodes() {\n    document.querySelectorAll('.card-wrapper .price-item, .card-wrapper .price__amount').forEach((amount) => {\n      const walker = document.createTreeWalker(amount, NodeFilter.SHOW_TEXT);\n      const nodes = [];\n      while (walker.nextNode()) {\n        const node = walker.currentNode;\n        if (!node.parentElement.closest('.beleaev-card-currency') && /\\s+GBP\\s*$/.test(node.textContent)) nodes.push(node);\n      }\n      nodes.forEach((node) => {\n        const match = node.textContent.match(/\\s+GBP\\s*$/);\n        const code = document.createElement('span');\n        code.className = 'beleaev-card-currency';\n        code.textContent = match[0];\n        node.textContent = node.textContent.slice(0, -match[0].length);\n        node.parentNode.insertBefore(code, node.nextSibling);\n      });\n    });\n  }\n\n  /* Lift the From label on mobile. Center label and price at full card width,\n     then place the bag below to prevent overlaps on narrow product cards.\n     Desktop layout is owned by CSS after inline styles are cleared. */\n  function liftFromLabelMobile() {\n    var isMobile = window.matchMedia('(max-width: 749px)').matches;\n    document.querySelectorAll('.product-card-wrapper').forEach((wrap) => {\n      const row = wrap.querySelector('.beleaev-price-row');\n      if (!row) return;\n      const octVisual = row.querySelector(':scope > .beleaev-oct-card-price');\n      if (octVisual) {\n        const octQuickAdd = row.querySelector(':scope > .quick-add');\n        const octNativePrice = row.querySelector(':scope > .price');\n        if (octQuickAdd) row.insertBefore(octVisual, octQuickAdd);\n        if (octNativePrice) octNativePrice.style.setProperty('display', 'none', 'important');\n        const liftedLabel = row.querySelector(':scope > .beleaev-from-label-mobile');\n        row.style.setProperty('display', 'flex', 'important');\n        ['grid-template-columns', 'grid-template-areas', 'column-gap', 'row-gap'].forEach((property) => row.style.removeProperty(property));\n        row.style.setProperty('align-items', 'center', 'important');\n        row.style.setProperty('justify-content', 'space-between', 'important');\n        row.style.setProperty('gap', '0.6rem', 'important');\n        if (liftedLabel) liftedLabel.style.setProperty('display', 'none', 'important');\n        octVisual.style.setProperty('flex', '1 1 auto', 'important');\n        octVisual.style.setProperty('min-width', '0', 'important');\n        if (octQuickAdd) {\n          ['grid-area', 'align-self', 'position', 'inset'].forEach((property) => octQuickAdd.style.removeProperty(property));\n          octQuickAdd.style.setProperty('position', 'relative', 'important');\n          octQuickAdd.style.setProperty('inset', 'auto', 'important');\n          octQuickAdd.style.setProperty('flex', '0 0 auto', 'important');\n        }\n        return;\n      }\n      const from = row.querySelector('.price__from');\n      // Cleanup legacy labels left as siblings outside the row\n      wrap.querySelectorAll('.beleaev-from-label-mobile').forEach((el) => {\n        if (el.parentElement !== row) el.remove();\n      });\n      // Insert lifted label if \"From\" prefix exists and not already inserted\n      if (from && !row.querySelector(':scope > .beleaev-from-label-mobile')) {\n        const label = document.createElement('span');\n        label.className = 'beleaev-from-label-mobile';\n        label.textContent = 'From';\n        const priceEl = row.querySelector('.price');\n        if (priceEl) {\n          row.insertBefore(label, priceEl);\n        } else {\n          row.appendChild(label);\n        }\n      }\n      // Apply inline grid layout on mobile (beats any cascade conflict)\n      const qa = row.querySelector('.quick-add');\n      const label = row.querySelector(':scope > .beleaev-from-label-mobile');\n      const priceEl = row.querySelector('.price');\n      const inlineFrom = row.querySelector('.price__from');\n      if (isMobile) {\n        row.style.setProperty('display', 'grid', 'important');\n        row.style.setProperty('grid-template-columns', '32px minmax(0, 1fr) 32px', 'important');\n        // Single row: small \"From\" sits inline before the amount, keeping the price close to the reviews\n        row.style.setProperty('grid-template-areas', '\". price icon\"', 'important');\n        row.style.setProperty('column-gap', '0.7rem', 'important');\n        row.style.setProperty('row-gap', '0', 'important');\n        row.style.setProperty('align-items', 'center', 'important');\n        if (qa) {\n          qa.style.setProperty('grid-area', 'icon', 'important');\n          qa.style.setProperty('align-self', 'center', 'important');\n          qa.style.setProperty('position', 'relative', 'important');\n          qa.style.setProperty('inset', 'auto', 'important');\n        }\n        if (label) label.style.setProperty('display', 'none', 'important');\n        if (priceEl) {\n          priceEl.style.setProperty('grid-area', 'price', 'important');\n          priceEl.style.setProperty('text-align', 'left', 'important');\n          priceEl.style.setProperty('align-self', 'center', 'important');\n          priceEl.style.setProperty('margin', '0', 'important');\n        }\n        if (inlineFrom) {\n          inlineFrom.style.setProperty('display', 'inline', 'important');\n          inlineFrom.style.setProperty('font-size', '10px', 'important');\n          inlineFrom.style.setProperty('font-weight', '400', 'important');\n          inlineFrom.style.setProperty('margin-right', '4px', 'important');\n        }\n      } else {\n        // Desktop: remove inline styles so the stylesheet owns the layout\n        ['display','grid-template-columns','grid-template-areas','column-gap','row-gap','align-items'].forEach(p => row.style.removeProperty(p));\n        if (qa) ['grid-area','align-self','position','inset'].forEach(p => qa.style.removeProperty(p));\n        if (label) ['display','grid-area','text-align','align-self'].forEach(p => label.style.removeProperty(p));\n        if (priceEl) ['grid-area','text-align','align-self','margin'].forEach(p => priceEl.style.removeProperty(p));\n        if (inlineFrom) ['display','font-size','font-weight','margin-right'].forEach(p => inlineFrom.style.removeProperty(p));\n      }\n    });\n  }\n  // Re-run on viewport resize crossing 749px boundary\n  if (window.matchMedia) {\n    window.matchMedia('(max-width: 749px)').addEventListener('change', liftFromLabelMobile);\n  }\n\n  /* Add UK flag emblem to \"British Quality Control\" heading */\n  const UK_FLAG_SVG =\n    '<svg viewBox=\"0 0 60 30\" aria-hidden=\"true\">' +\n    '<clipPath id=\"bqc-clip\"><path d=\"M0,0v30h60V0z\"/></clipPath>' +\n    '<clipPath id=\"bqc-clip2\"><path d=\"M30,15h30v15zv15h-30zh-30v-15zv-15h30z\"/></clipPath>' +\n    '<g clip-path=\"url(#bqc-clip)\">' +\n    '<path d=\"M0,0v30h60V0z\" fill=\"#012169\"/>' +\n    '<path d=\"M0,0L60,30M60,0L0,30\" stroke=\"#fff\" stroke-width=\"6\"/>' +\n    '<path d=\"M0,0L60,30M60,0L0,30\" clip-path=\"url(#bqc-clip2)\" stroke=\"#C8102E\" stroke-width=\"4\"/>' +\n    '<path d=\"M30,0v30M0,15h60\" stroke=\"#fff\" stroke-width=\"10\"/>' +\n    '<path d=\"M30,0v30M0,15h60\" stroke=\"#C8102E\" stroke-width=\"6\"/>' +\n    '</g></svg>';\n\n  function decorateBritishQualityControl() {\n    const headings = document.querySelectorAll(\n      '.image-with-text__heading, h1, h2'\n    );\n    headings.forEach((h) => {\n      if (h.dataset.beleaevBqc === '1') return;\n      const txt = (h.textContent || '').trim();\n      if (!/british\\s+quality\\s+control/i.test(txt)) return;\n      const flag = document.createElement('span');\n      flag.className = 'beleaev-uk-flag';\n      flag.setAttribute('aria-label', 'UK quality control');\n      flag.innerHTML = UK_FLAG_SVG;\n      h.insertBefore(flag, h.firstChild);\n      h.classList.add('beleaev-bqc-heading');\n      const sec = h.closest('section, .shopify-section, [class*=\"section-template\"]');\n      if (sec) sec.classList.add('beleaev-bqc-section');\n      h.dataset.beleaevBqc = '1';\n    });\n  }\n\n  /* SEO + visible H1 on homepage: styled brand subtitle bar between header and hero. */\n  function ensureHomepageH1() {\n    const isHome =\n      document.body.classList.contains('template-index') ||\n      location.pathname === '/' ||\n      location.pathname === '';\n    if (!isHome) return;\n    const existing = Array.from(document.querySelectorAll('h1')).find(\n      (h) => (h.textContent || '').trim() && !h.classList.contains('beleaev-h1')\n    );\n    if (existing) return;\n    if (document.querySelector('h1.beleaev-h1')) return;\n    const h1 = document.createElement('h1');\n    h1.className = 'beleaev-h1';\n    /* Rotating phrases: fade in/hold/fade out, one at a time (Petrossian-style).\n       Each item gets a CSS animation-delay equal to slot index \u00D7 per-slot duration. */\n    const phrases = [\n      'The Finest Caviar, Hand-Delivered in 24h Across the UK, EU & the UAE',\n      'Free delivery on orders over 200\u00A3',\n      'Secure card payment'\n    ];\n    const PHRASE_DURATION = 4; /* seconds visible per phrase (incl. fade) */\n    const items = phrases.map(function(p, i) {\n      return '<span class=\"beleaev-h1__item\" style=\"animation-delay:' + (i * PHRASE_DURATION) + 's\">' + p + '</span>';\n    }).join('');\n    h1.innerHTML = '<span class=\"beleaev-h1__track\" style=\"--bb-cycle:' + (phrases.length * PHRASE_DURATION) + 's\">' + items + '</span>';\n    /* Insert INSIDE the theme's <sticky-header> element as the first child.\n       This way the theme's own sticky behaviour drags the marquee with the logo + menu,\n       no conflict with absolutely-positioned logo, no body padding hack needed. */\n    const stickyHeader = document.querySelector('sticky-header');\n    if (stickyHeader) {\n      stickyHeader.insertBefore(h1, stickyHeader.firstChild);\n    } else {\n      document.body.insertBefore(h1, document.body.firstChild);\n    }\n    document.body.classList.add('beleaev-has-h1');\n  }\n\n  /* Cart drawer footer: compact payment icons row.\n     Visa / MC / Amex / PayPal / Apple Pay / Google Pay / Klarna / Shop Pay */\n  const PAYMENT_ICONS = {\n    visa:    '<svg viewBox=\"0 0 38 24\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"38\" height=\"24\" rx=\"3\" fill=\"#1A1F71\"/><path d=\"M15.6 16.8l1.7-9.6h2.7l-1.7 9.6h-2.7zm12.7-9.4c-.5-.2-1.4-.4-2.4-.4-2.7 0-4.6 1.4-4.6 3.4 0 1.5 1.4 2.3 2.4 2.8 1 .5 1.4.8 1.4 1.3 0 .7-.9 1-1.7 1-1.1 0-1.7-.2-2.6-.6l-.4-.2-.4 2.4c.7.3 2 .6 3.3.6 2.9 0 4.7-1.4 4.7-3.5 0-1.2-.7-2-2.3-2.7-1-.5-1.6-.8-1.6-1.3 0-.5.5-1 1.6-1 .9 0 1.6.2 2.1.4l.3.1.4-2.3zm6.9-.2h-2c-.6 0-1.1.2-1.4.8L26.7 16.8h2.9s.5-1.3.6-1.6h3.5c.1.4.3 1.6.3 1.6h2.6l-2.3-9.4zm-3.5 6.2c.2-.6 1.1-3 1.1-3l.3-.8.1.7s.5 2.6.6 3.1h-2.1zM13.3 7.2L10.7 13.7l-.3-1.4c-.5-1.6-2-3.4-3.7-4.3l2.4 8.8h2.9l4.4-9.6h-3.1z\" fill=\"#fff\"/></svg>',\n    mc:      '<svg viewBox=\"0 0 38 24\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"38\" height=\"24\" rx=\"3\" fill=\"#fff\"/><circle cx=\"14\" cy=\"12\" r=\"6.5\" fill=\"#EB001B\"/><circle cx=\"24\" cy=\"12\" r=\"6.5\" fill=\"#F79E1B\"/><path d=\"M19 7.2a6.5 6.5 0 010 9.6 6.5 6.5 0 010-9.6z\" fill=\"#FF5F00\"/></svg>',\n    amex:    '<svg viewBox=\"0 0 38 24\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"38\" height=\"24\" rx=\"3\" fill=\"#016FD0\"/><path d=\"M19 6.5l-2.4 5.4-2.4-5.4h-3.5v8h2.1V8.6l2.4 5.9h2.6l2.4-5.9v5.9h2.1V6.5h-3.3zm6.7 8L23 6.5h2.4l2.7 8h-2.4z\" fill=\"#fff\"/></svg>',\n    paypal:  '<svg viewBox=\"0 0 38 24\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"38\" height=\"24\" rx=\"3\" fill=\"#fff\"/><path d=\"M14.5 7.5c.5-.4 1.2-.6 2-.6h3.6c1 0 1.8.3 2.2 1 .4.6.5 1.5.2 2.5-.5 1.6-2 2.6-3.8 2.6h-1.4l-.6 3.5h-2L14.5 7.5z\" fill=\"#003087\"/><path d=\"M22.5 9.5c-.5 1.6-2 2.6-3.8 2.6h-1.4l-.6 3.5h-1.4l-.7 4.4c0 .2.1.3.3.3h1.5c.2 0 .4-.1.5-.4l.5-3.1c0-.2.2-.4.5-.4h.7c1.8 0 3.3-1 3.8-2.6.4-1.4 0-2.5-.9-3.1-.4-.3-.4-.6-.5-1.2 0-.1.1-.1 0 0z\" fill=\"#0070E0\"/></svg>',\n    apple:   '<svg viewBox=\"0 0 38 24\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"38\" height=\"24\" rx=\"3\" fill=\"#000\"/><path d=\"M13 9.7c.5-.6.8-1.4.7-2.2-.7 0-1.5.4-2 1-.4.5-.8 1.4-.7 2.1.8.1 1.5-.3 2-.9zm.7.4c-1.1-.1-2 .6-2.5.6-.5 0-1.3-.6-2.2-.6-1.1 0-2.2.7-2.7 1.7-1.2 2-.3 5 .9 6.6.6.8 1.3 1.7 2.2 1.7s1.2-.6 2.2-.6 1.3.6 2.2.6 1.5-.8 2.1-1.6c.7-.9 1-1.8 1-1.8s-1.9-.7-2-2.9c0-1.8 1.5-2.7 1.6-2.7-.9-1.3-2.2-1.4-2.7-1.5zM21 7.5h2c2 0 3.4 1.4 3.4 3.4s-1.4 3.4-3.5 3.4h-1.4v3.2h-2V7.5h1.5zm.5 5.1h1.2c1.1 0 1.8-.6 1.8-1.7s-.7-1.7-1.8-1.7h-1.2v3.4z\" fill=\"#fff\"/></svg>',\n    google:  '<svg viewBox=\"0 0 38 24\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"38\" height=\"24\" rx=\"3\" fill=\"#fff\" stroke=\"#e1e1e1\"/><path d=\"M18.6 12.2c0-.3 0-.6-.1-.9h-3.4v1.7h2c-.1.5-.4.9-.8 1.2v1h1.3c.7-.7 1-1.7 1-3z\" fill=\"#4285F4\"/><path d=\"M15.1 15.7c1 0 1.8-.3 2.4-.9l-1.3-1c-.3.2-.7.4-1.1.4-.9 0-1.6-.6-1.8-1.4h-1.3v1c.5 1.2 1.7 1.9 3.1 1.9z\" fill=\"#34A853\"/><path d=\"M13.3 12.8c-.1-.2-.1-.5-.1-.8s0-.6.1-.8v-1H12c-.3.6-.5 1.2-.5 1.9s.2 1.3.5 1.9l1.3-1.1z\" fill=\"#FBBC05\"/><path d=\"M15.1 9.7c.5 0 1 .2 1.4.5l1.1-1c-.7-.6-1.5-1-2.5-1-1.4 0-2.6.7-3.1 1.9l1.3 1c.2-.7.9-1.4 1.8-1.4z\" fill=\"#EA4335\"/><path d=\"M22.4 9.3c-1.2 0-2.4.8-2.4 2.4 0 1.4.9 2.4 2.4 2.4.6 0 1-.1 1.4-.4v.4h1V9.7h-1V10c-.4-.4-.9-.7-1.4-.7zm.2 1c.7 0 1.3.6 1.3 1.4s-.6 1.4-1.3 1.4-1.4-.6-1.4-1.4.7-1.4 1.4-1.4z\" fill=\"#5F6368\"/></svg>',\n    klarna:  '<svg viewBox=\"0 0 38 24\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"38\" height=\"24\" rx=\"3\" fill=\"#FFB3C7\"/><path d=\"M14 8.6c0 1.5-.7 2.9-1.9 3.8l1.7 2.4h-1.7l-1.5-2c0 0-.1 0-.1 0v2H9.1V6.9h1.4v3.7c.9-.5 1.4-1.4 1.4-2.5h1.4l.7.5zm1.9-1.7v8h1.4v-8h-1.4zm5.7 4.2c0-.9-.7-1.4-1.5-1.4-.7 0-1.3.3-1.6.9V9.7h-1.3v5.1h1.3v-2.5c0-.5.4-.9.9-.9s.9.4.9.9v2.5h1.3v-2.7zm5.4 1.7c0 1-.7 1.5-1.5 1.5-.5 0-.9-.2-1.2-.5l.6-.8c.1.2.4.3.6.3.3 0 .5-.1.5-.4 0-.5-1.6-.4-1.6-1.5 0-.7.6-1.2 1.4-1.2.5 0 .9.2 1.2.5l-.6.8c-.2-.1-.4-.3-.6-.3-.2 0-.4.1-.4.3 0 .4 1.6.3 1.6 1.3z\" fill=\"#0a0a0a\"/></svg>'\n  };\n\n  function injectPaymentIcons() {\n    const drawers = document.querySelectorAll('cart-drawer, .drawer__inner, #CartDrawer, .cart-drawer');\n    drawers.forEach((drawer) => {\n      if (drawer.querySelector('.beleaev-pay-row')) return;\n      const target =\n        drawer.querySelector('.drawer__footer') ||\n        drawer.querySelector('.cart-drawer__footer') ||\n        drawer.querySelector('[class*=\"footer\"]') ||\n        drawer;\n      if (!target) return;\n      const row = document.createElement('div');\n      row.className = 'beleaev-pay-row';\n      row.setAttribute('aria-label', 'Accepted payment methods');\n      const order = ['visa', 'mc', 'amex', 'paypal', 'apple', 'google', 'klarna'];\n      row.innerHTML = order.map((k) =>\n        '<span class=\"beleaev-pay-icon\" data-pay=\"' + k + '\">' + PAYMENT_ICONS[k] + '</span>'\n      ).join('');\n      target.appendChild(row);\n    });\n\n    /* Also on /cart page */\n    const cartPage = document.querySelector('.cart__footer, main-cart-footer, .cart-page__footer');\n    if (cartPage && !cartPage.querySelector('.beleaev-pay-row')) {\n      const row = document.createElement('div');\n      row.className = 'beleaev-pay-row beleaev-pay-row--page';\n      row.setAttribute('aria-label', 'Accepted payment methods');\n      const order = ['visa', 'mc', 'amex', 'paypal', 'apple', 'google', 'klarna'];\n      row.innerHTML = order.map((k) =>\n        '<span class=\"beleaev-pay-icon\" data-pay=\"' + k + '\">' + PAYMENT_ICONS[k] + '</span>'\n      ).join('');\n      cartPage.appendChild(row);\n    }\n  }\n\n  /* Mobile sticky ADD-TO-CART bar at bottom of viewport on PDP.\n     Mirrors the primary product form \u2014 taps it to submit. */\n  function setupStickyMobileATC() {\n    const isPDP = document.body.classList.contains('template-product') ||\n                  document.querySelector('.product__info-container, main-product, [data-product-id]');\n    if (!isPDP) return;\n    if (document.getElementById('beleaev-sticky-atc')) return;\n    const scope = document.querySelector('main section[id^=\"MainProduct-\"], main product-info, main .product');\n    if (!scope) return;\n    const getPrimary = () => Array.from(scope.querySelectorAll('.product-form__submit'))\n      .find(button => button.getClientRects().length && !button.closest('quick-add-modal, product-recommendations'));\n    if (!getPrimary()) return;\n\n    const bar = document.createElement('div');\n    bar.id = 'beleaev-sticky-atc';\n    bar.className = 'beleaev-sticky-atc';\n    bar.setAttribute('role', 'region');\n    bar.setAttribute('aria-label', 'Quick add to cart');\n    bar.innerHTML =\n      '<div class=\"beleaev-sticky-atc__info\">' +\n        '<span class=\"beleaev-sticky-atc__title\"></span>' +\n        '<span class=\"beleaev-sticky-atc__price\"></span>' +\n      '</div>' +\n      '<button type=\"button\" class=\"beleaev-sticky-atc__btn\">' + (window.beleaevAddToCartLabel || 'Add to cart').replace(/[&<>\"']/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]; }) + '</button>';\n    document.body.appendChild(bar);\n\n    const btn = bar.querySelector('.beleaev-sticky-atc__btn');\n    btn.addEventListener('click', (e) => {\n      e.preventDefault();\n      const primary = getPrimary();\n      if (!primary || primary.disabled || btn.disabled) return;\n      primary.click();\n    });\n\n    /* BELEAEV_INP_OPTIMIZATION_2026_08_30: avoid forced layout reads on every scroll. */\n    const setPrimaryVisibility = (inView) => {\n      bar.classList.toggle('beleaev-sticky-atc--show', !inView);\n    };\n    let watchedButton;\n    const observer = 'IntersectionObserver' in window ? new IntersectionObserver((entries) => {\n        setPrimaryVisibility(Boolean(entries[0] && entries[0].isIntersecting));\n      }) : null;\n    const visible = element => element && getComputedStyle(element).display !== 'none' && element.getClientRects().length;\n    const priceText = () => {\n      const owned = scope.querySelector('[data-blv-price-owner=\"allocation\"] beleaev-subscription-prices:not([hidden]) [data-blv-allocation-amount]');\n      if (owned) return owned.textContent.trim();\n      const subscribed = scope.querySelector('.appstle_subscription_radio_wrapper input:checked');\n      const subscription = Array.from(scope.querySelectorAll('.beleaev-sub-line')).find(visible);\n      if (subscription?.firstElementChild) return subscription.firstElementChild.textContent.trim();\n      if (subscribed) {\n        const amount = scope.querySelector('.appstle_subscription_amount_wrapper .appstle_subscription_amount');\n        if (amount) return amount.textContent.trim();\n      }\n      const custom = Array.from(scope.querySelectorAll('.beleaev-price-bottom__value, [data-beleaev-total], .beleaev-total, .beleaev-total-tasting')).find(visible);\n      if (custom) return custom.textContent.trim();\n      const price = scope.querySelector('.price');\n      const amount = price?.classList.contains('price--on-sale')\n        ? price.querySelector('.price__sale .price-item--sale, .price__sale .price-item--last')\n        : price?.querySelector('.price__regular .price-item--regular');\n      return amount?.textContent.trim() || '';\n    };\n    const syncBar = () => {\n      const primary = getPrimary();\n      const title = scope.querySelector('h1')?.textContent.trim() || '';\n      const value = priceText().replace(/\\s+/g, ' ');\n      const titleNode = bar.querySelector('.beleaev-sticky-atc__title');\n      const priceNode = bar.querySelector('.beleaev-sticky-atc__price');\n      if (titleNode.textContent !== title) titleNode.textContent = title;\n      if (priceNode.textContent !== value) priceNode.textContent = value;\n      btn.disabled = !primary || primary.disabled;\n      if (primary?.textContent.trim() && btn.textContent !== primary.textContent.trim()) btn.textContent = primary.textContent.trim();\n      if (observer && primary !== watchedButton) {\n        observer.disconnect();\n        if (primary) observer.observe(primary);\n        watchedButton = primary;\n      }\n    };\n    let priceSyncPending = false;\n    const schedulePriceSync = () => {\n      if (priceSyncPending) return;\n      priceSyncPending = true;\n      requestAnimationFrame(() => { priceSyncPending = false; syncBar(); });\n    };\n    new MutationObserver(schedulePriceSync).observe(scope, {\n      childList: true, characterData: true, subtree: true, attributes: true,\n      attributeFilter: ['disabled', 'hidden', 'style', 'class', 'checked']\n    });\n    ['change', 'input', 'beleaev:purchase-change', 'beleaev:purchase-state-sync'].forEach(name => scope.addEventListener(name, schedulePriceSync));\n    syncBar();\n    if (!observer) {\n      let visibilityPending = false;\n      const updateVisibility = () => {\n        if (visibilityPending) return;\n        visibilityPending = true;\n        requestAnimationFrame(() => {\n          const rect = getPrimary()?.getBoundingClientRect();\n          if (!rect) { visibilityPending = false; return; }\n          setPrimaryVisibility(rect.top < window.innerHeight && rect.bottom > 0);\n          visibilityPending = false;\n        });\n      };\n      updateVisibility();\n      window.addEventListener('scroll', updateVisibility, { passive: true });\n      window.addEventListener('resize', updateVisibility);\n    }\n  }\n\n  /* PDP per-serving price under main price.\n     Derives servings from variant title grams (1 serving = 10g caviar). */\n  function addPerServingPrice() {\n    if (!document.body.classList.contains('template-product') &&\n        !document.querySelector('.product__info-container, main-product')) return;\n    if (document.querySelector('.beleaev-per-serving')) return;\n    const priceWrap =\n      document.querySelector('.product__info-container .price') ||\n      document.querySelector('.product__info-container [id^=\"price-\"]') ||\n      document.querySelector('main-product .price');\n    if (!priceWrap) return;\n    /* Try to read first variant from window product, else parse current price + variant title */\n    let grams = 0;\n    let priceNumber = 0;\n    const productData = window.product || (window.ShopifyAnalytics && window.ShopifyAnalytics.meta && window.ShopifyAnalytics.meta.product);\n    if (productData && productData.variants && productData.variants.length) {\n      const v = productData.variants[0];\n      const m = String(v.title || v.option1 || '').match(/(\\d+)\\s*g/i);\n      if (m) grams = parseInt(m[1], 10);\n      priceNumber = v.price ? v.price / 100 : 0;\n    }\n    if (!grams || !priceNumber) {\n      /* Fallback: parse rendered price + variant pill labels */\n      const priceText = (priceWrap.textContent || '').match(/\u00A3\\s*([\\d.,]+)/);\n      if (priceText) priceNumber = parseFloat(priceText[1].replace(',', ''));\n      const variantLabels = Array.from(document.querySelectorAll(\n        'fieldset.product-form__input--pill label, .product-form__input--pill input + label, [class*=\"variant\"] label'\n      ));\n      for (const lab of variantLabels) {\n        const m = (lab.textContent || '').match(/(\\d+)\\s*g/i);\n        if (m) { grams = parseInt(m[1], 10); break; }\n      }\n    }\n    if (!grams || !priceNumber) return;\n    const servings = Math.max(1, Math.floor(grams / 10));\n    const perServing = (priceNumber / servings).toFixed(2);\n    const el = document.createElement('div');\n    el.className = 'beleaev-per-serving';\n    el.innerHTML =\n      '<span class=\"beleaev-per-serving__amount\">\u00A3' + perServing + '</span> ' +\n      '<span class=\"beleaev-per-serving__label\">per serving</span>' +\n      '<span class=\"beleaev-per-serving__sep\"> \u00B7 </span><span class=\"beleaev-per-serving__hint\" title=\"Approx. 10g per portion\">~' + servings + ' servings</span>';\n    priceWrap.parentElement.insertBefore(el, priceWrap.nextSibling);\n  }\n\n  /* Make entire product card clickable to its product page (image, badges area, etc).\n     Standard Dawn pattern relies on .full-unstyled-link absolute overlay; in this theme it has zero size.\n     We add an explicit click handler that avoids quick-add / explicit interactive elements. */\n  function ensureCardClickable() {\n    const cards = document.querySelectorAll('.card-wrapper, .grid__item');\n    cards.forEach((card) => {\n      if (card.dataset.beleaevClickable === '1') return;\n      /* Skip FAQ accordions and other non-product grid items (Dawn uses .grid__item for many layouts) */\n      if (card.querySelector('details, summary, .accordion')) return;\n      const productLink = card.querySelector('a[href*=\"/products/\"]');\n      if (!productLink) return;\n      const href = productLink.getAttribute('href');\n      const media = card.querySelector('.card__media, .media, .card__inner') || card;\n      media.style.cursor = 'pointer';\n      media.addEventListener('click', (e) => {\n        /* Skip if user clicked the quick-add bag, badge, button, or an existing link */\n        if (e.target.closest('.quick-add, .quick-add__submit, button, a, [data-callback], summary, details')) return;\n        e.preventDefault();\n        window.location.href = href;\n      });\n      card.dataset.beleaevClickable = '1';\n    });\n  }\n\n  \n  function addPdpSommelierBubble() {\n    if (!document.body.classList.contains('template-product')) return;\n    if (document.querySelector('.beleaev-sommelier-bubble')) return;\n    var phone = '447376579988';\n    var msg = encodeURIComponent(\"Hi Anna, I'd love your guidance on choosing the right caviar for me.\");\n    var wa = 'https://wa.me/' + phone + '?text=' + msg;\n    var btn = document.createElement('a');\n    btn.className = 'beleaev-sommelier-bubble';\n    btn.href = wa;\n    btn.target = '_blank';\n    btn.rel = 'noopener';\n    btn.setAttribute('aria-label', 'Chat with Anna, our caviar sommelier on WhatsApp');\n    btn.innerHTML = '<span class=\"beleaev-bubble-icon\" aria-hidden=\"true\">' +\n      '<svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" fill=\"currentColor\"><path d=\"M20.52 3.48A11.93 11.93 0 0 0 12.04 0C5.4 0 0 5.4 0 12.04c0 2.12.55 4.18 1.6 6L0 24l6.16-1.6a12 12 0 0 0 5.88 1.49h.01c6.64 0 12.04-5.4 12.04-12.04 0-3.21-1.25-6.23-3.57-8.37zM12.04 21.7h-.01a9.87 9.87 0 0 1-5.03-1.38l-.36-.21-3.66.96.98-3.56-.23-.37a9.86 9.86 0 0 1-1.51-5.18c0-5.46 4.45-9.91 9.92-9.91 2.65 0 5.14 1.04 7.01 2.91a9.85 9.85 0 0 1 2.9 7.01c0 5.46-4.44 9.91-9.91 9.91zm5.43-7.42c-.3-.15-1.76-.87-2.03-.97-.27-.1-.47-.15-.67.15s-.77.97-.94 1.17c-.17.2-.35.22-.65.07-.3-.15-1.25-.46-2.39-1.47-.88-.78-1.48-1.75-1.65-2.05-.17-.3-.02-.46.13-.6.13-.13.3-.35.45-.52.15-.17.2-.3.3-.5.1-.2.05-.37-.02-.52-.07-.15-.67-1.62-.92-2.22-.24-.58-.49-.5-.67-.51-.17 0-.37-.02-.57-.02-.2 0-.52.07-.79.37-.27.3-1.04 1.02-1.04 2.49s1.07 2.89 1.22 3.09c.15.2 2.1 3.21 5.09 4.5.71.31 1.27.5 1.7.64.71.23 1.36.2 1.87.12.57-.08 1.76-.72 2-1.41.25-.69.25-1.28.17-1.41-.07-.12-.27-.2-.57-.35z\"/></svg>' +\n      '</span>' +\n      '<span class=\"beleaev-bubble-text\">' +\n        '<span class=\"beleaev-bubble-name\">Ask Anna</span>' +\n        '<span class=\"beleaev-bubble-sub\">Caviar sommelier \u00B7 WhatsApp</span>' +\n      '</span>';\n    document.body.appendChild(btn);\n  }\n\n\n  /* SEO + a11y: fill missing alt attributes on <img> with contextual fallback. Idempotent. */\n  function ensureImageAlt() {\n    document.querySelectorAll('img').forEach(function(img) {\n      if (img.alt && img.alt.trim()) return;\n      var productLink = img.closest('a[href*=\"/products/\"]');\n      if (productLink) {\n        var card = productLink.closest('.card-wrapper, .grid__item') || productLink;\n        var titleEl = card.querySelector('.card__heading, [class*=\"card__title\"], [class*=\"product__title\"], [class*=\"product-title\"]');\n        if (titleEl && titleEl.innerText.trim()) {\n          img.alt = titleEl.innerText.trim().slice(0, 120);\n          return;\n        }\n        var ariaLabel = productLink.getAttribute('aria-label');\n        if (ariaLabel && ariaLabel.trim()) {\n          img.alt = ariaLabel.trim().slice(0, 120);\n          return;\n        }\n      }\n      if (img.closest('.product__media, .product-media, [class*=\"product__media\"]')) {\n        var h1 = document.querySelector('h1');\n        if (h1 && h1.innerText.trim()) {\n          img.alt = h1.innerText.trim().slice(0, 120) + ' \u2014 Beleaev Caviar';\n          return;\n        }\n      }\n      if (img.closest('.header__heading, [class*=\"header__logo\"]') || /logo/i.test(img.src||'') || /logo/i.test(img.className||'')) {\n        img.alt = 'Beleaev Caviar & Gourmet';\n        return;\n      }\n      img.alt = '';\n    });\n  }\n\n\n  /* Mega menu sits below header without gap. .mega-menu uses position:fixed top:102px hardcoded for index header height (103px). On non-index pages header is shorter (61px) -> 41px gap. Fix: dynamically set top to actual header bottom. */\n  function attachMegaMenuToHeader() {\n    var header = document.querySelector('[id*=\"shopify-section-sections--\"][id$=\"__header\"]');\n    var menu = document.querySelector('section.mega-menu');\n    if (!header || !menu) return;\n    var pos = window.getComputedStyle(menu).position;\n    if (pos !== 'fixed' && pos !== 'sticky') return;\n    var hb = header.getBoundingClientRect().bottom;\n    if (hb >= 0 && Math.abs((parseFloat(menu.style.top || menu.style.getPropertyValue('top') || '0')) - hb) > 0.5) {\n      menu.style.setProperty('top', Math.round(hb) + 'px', 'important');\n    }\n  }\n\n\n  /* Mobile overlap fixes for card price-row + trust bar wrap. Idempotent CSS injection. */\n  function injectMobileFixCSS() {\n    if (document.getElementById('beleaev-mobile-fix-css')) return;\n    var style = document.createElement('style');\n    style.id = 'beleaev-mobile-fix-css';\n    style.textContent = \".product-card-wrapper .card__subtitle, .card-wrapper .card__subtitle, .card__information .card__subtitle, .beleaev-bento .card__subtitle { display: none !important; height: 0 !important; margin: 0 !important; padding: 0 !important; overflow: hidden !important; } .shopify-section.beleaev-trust-bar-wrap, .shopify-section.beleaev-split-wrap, .shopify-section.beleaev-bento-section, .shopify-section.beleaev-recipes-wrap, .shopify-section.section-follow-along { padding-bottom: 0 !important; margin-bottom: 0 !important; } .shopify-section.beleaev-split-wrap, .shopify-section.beleaev-bento-section, .shopify-section.beleaev-recipes-wrap, .shopify-section.section-follow-along { padding-top: 16px !important; margin-top: 0 !important; } .beleaev-trust-bar { padding-bottom: 16px !important; } .beleaev-split, .beleaev-bento, .beleaev-recipes { padding-bottom: 16px !important; } .shopify-section .collection .title-wrapper { margin-bottom: 16px !important; padding-bottom: 0 !important; text-align: center !important; } .shopify-section .collection .collection__title { margin-bottom: 12px !important; padding-bottom: 0 !important; text-align: center !important; width: 100% !important; } .shopify-section .collection .slider, .shopify-section .collection .product-grid { margin-top: 0 !important; padding-top: 0 !important; } .shopify-section .collection { padding-top: 0 !important; padding-bottom: 0 !important; } .card-wrapper, .product-card-wrapper { display: flex !important; flex-direction: column !important; height: 100% !important; } .card-wrapper .card__information, .card-wrapper .card-information { display: flex !important; flex-direction: column !important; flex: 1 1 auto !important; } .card__information .beleaev-price-row, .card-information .beleaev-price-row { margin-top: auto !important; } @media (max-width: 749px) {   .beleaev-price-row { display: flex !important; flex-wrap: nowrap !important; align-items: center !important; gap: 8px !important; min-width: 0 !important; }   .beleaev-price-row > * { min-width: 0 !important; }   .beleaev-price-row .price { flex: 1 1 auto !important; min-width: 0 !important; white-space: normal !important; word-break: keep-all !important; overflow: visible !important; }   .beleaev-price-row .quick-add, .beleaev-price-row .card-information__bag, .beleaev-price-row [class*=\\\"bag\\\"] { flex: 0 0 auto !important; position: relative !important; left: auto !important; transform: none !important; }   .card__information .beleaev-price-row, .card-information .beleaev-price-row { margin-top: 8px !important; }   .card__heading { margin-bottom: 4px !important; }   .shopify-section .collection { padding-top: 8px !important; padding-bottom: 8px !important; }   .shopify-section .collection .title-wrapper { padding: 0 !important; margin: 0 0 12px 0 !important; text-align: center !important; display: flex !important; flex-direction: column !important; align-items: center !important; }   .shopify-section .collection .collection__title { margin: 0 !important; padding: 0 !important; text-align: center !important; width: 100% !important; font-size: 1.6rem !important; line-height: 1.2 !important; }   .sommelier-banner__actions { display: flex !important; flex-direction: column !important; align-items: stretch !important; gap: 6px !important; width: 100% !important; }   .sommelier-banner__cta { padding: 9px 16px !important; font-size: 13px !important; width: auto !important; max-width: 220px !important; margin: 0 auto !important; text-align: center !important; }   .sommelier-banner__phone { display: flex !important; flex-direction: column !important; align-items: center !important; gap: 2px !important; width: 100% !important; text-align: center !important; padding: 0 !important; margin-top: 4px !important; }   .sommelier-banner__phone-number { display: block !important; font-size: 15px !important; font-weight: 600 !important; color: #d4af37 !important; line-height: 1.2 !important; }   .sommelier-banner__phone-caption { display: block !important; font-size: 11px !important; opacity: 0.78 !important; line-height: 1.2 !important; }   .shopify-section.beleaev-bento-section { padding-top: 8px !important; padding-bottom: 0 !important; }   .beleaev-bento { padding-top: 0 !important; padding-bottom: 0 !important; }   .beleaev-bento__inner { padding: 0 16px !important; }   .beleaev-bento__head { padding-bottom: 8px !important; margin-bottom: 12px !important; padding-top: 0 !important; }   .beleaev-bento__heading { font-size: 1.5rem !important; line-height: 1.1 !important; margin: 0 !important; padding: 0 !important; text-align: center !important; }   .beleaev-bento__viewall { margin-top: 16px !important; }   .beleaev-trust-bar__grid { display: grid !important; grid-template-columns: repeat(2, 1fr) !important; gap: 18px 12px !important; overflow-x: visible !important; padding-left: 12px !important; padding-right: 12px !important; }   .beleaev-trust-bar__item { width: auto !important; padding: 0 !important; text-align: center !important; box-sizing: border-box !important; }   .beleaev-trust-bar__title { font-size: 0.85rem !important; line-height: 1.2 !important; margin: 8px 0 4px !important; }   .beleaev-trust-bar__proof { font-size: 0.72rem !important; line-height: 1.3 !important; }   .beleaev-trust-bar__seal { width: 56px !important; height: 56px !important; margin: 0 auto !important; } }\";\n    document.head.appendChild(style);\n  }\n\n\n  /* Wire enhanced variant picker: on radio change, update hidden form id, price, URL, ATC. Additive, no DOM rewrite. */\n  var __beleaevProductCache = null;\n  function wireVariantPicker() {\n    var labels = document.querySelectorAll(\".variant-label\");\n    if (!labels.length) return;\n    labels.forEach(function(l) {\n      if (l.closest(\"quick-add-modal\") || l.dataset.beleaevLabelWired) return;\n      l.dataset.beleaevLabelWired = \"1\";\n      l.addEventListener(\"click\", function(e) {\n        var targetId = l.getAttribute(\"for\");\n        if (!targetId) return;\n        var target = document.getElementById(targetId);\n        if (!target || target.type !== \"radio\") return;\n        e.preventDefault();\n        e.stopPropagation();\n        applyBeleaevVariant(target, l);\n      });\n    });\n  }\n  function applyBeleaevVariant(radio, label) {\n    var scope = radio.closest('product-info, [id^=\"ProductInfo-\"], section[id^=\"MainProduct-\"]');\n    if (!scope || radio.closest(\"quick-add-modal\")) return;\n    var variantId = radio.value;\n    scope.querySelectorAll('input[type=\"radio\"]').forEach(function(rr) { if (rr.name === radio.name) rr.checked = false; });\n    radio.checked = true;\n    scope.querySelectorAll(\".variant-label\").forEach(function(ll) { ll.classList.remove(\"beleaev-selected\"); });\n    if (label) label.classList.add(\"beleaev-selected\");\n    var mainAtcBtn = scope.querySelector('.product__info-container .product-form__submit');\n    var mainForm = mainAtcBtn ? mainAtcBtn.closest(\"form\") : null;\n    var hiddenId = mainForm ? mainForm.querySelector('input[name=\"id\"]') : null;\n    if (hiddenId) hiddenId.value = variantId;\n    try {\n      var url = new URL(location.href);\n      url.searchParams.set(\"variant\", variantId);\n      history.replaceState({}, \"\", url);\n    } catch (e) {}\n    fetchBeleaevProduct(function(product) {\n      if (!scope.isConnected || !radio.checked || hiddenId?.value !== variantId || !product || !product.variants) return;\n      var variant = product.variants.find(function(v) { return String(v.id) === String(variantId); });\n      if (!variant) return;\n      var priceEls = scope.querySelectorAll('.product__info-container .price-item--regular, .product__info-container .price__regular .price-item');\n      var formattedPrice = \"\u00A3\" + (variant.price / 100).toFixed(2) + \" GBP\";\n      priceEls.forEach(function(el) { el.textContent = formattedPrice; });\n      if (mainAtcBtn) {\n        mainAtcBtn.disabled = !variant.available;\n        var sp = mainAtcBtn.querySelector(\"span\");\n        if (sp) sp.textContent = variant.available ? \"ADD TO CART\" : \"SOLD OUT\";\n      }\n      var existingPS = scope.querySelector(\".beleaev-per-serving\");\n      if (scope.dataset.blvPriceOwner !== 'allocation') {\n        if (existingPS) existingPS.remove();\n        if (typeof addPerServingPrice === \"function\") addPerServingPrice();\n      }\n      if (typeof setupQuantityTotal === \"function\") {\n        var qtyInput = scope.querySelector(\".product__info-container .quantity__input\");\n        if (qtyInput) qtyInput.dispatchEvent(new Event(\"input\", {bubbles:true}));\n      }\n    });\n  }\n  function onBeleaevVariantChange(e) { /* no-op: handled via label click directly */ }\n  function fetchBeleaevProduct(cb) {\n    if (__beleaevProductCache) { cb(__beleaevProductCache); return; }\n    var match = location.pathname.match(/\\/products\\/([^\\/?#]+)/);\n    if (!match) return;\n    fetch(\"/products/\" + match[1] + \".js\", { credentials: \"include\" })\n      .then(function(r) { return r.json(); })\n      .then(function(p) { __beleaevProductCache = p; cb(p); })\n      .catch(function() {});\n  }\n\n  /* Show quantity multiplied price next to qty selector. Updates on qty input or variant change. Idempotent. */\n  function setupQuantityTotal() {\n    if (!document.body.classList.contains(\"template-product\") && !document.querySelector(\".product__info-container\")) return;\n    var qtyInput = document.querySelector(\".product__info-container .quantity__input, .product__info-container input[name=\\\"quantity\\\"]\");\n    if (!qtyInput) return;\n    if (qtyInput.dataset.beleaevQtyTotal) return;\n    qtyInput.dataset.beleaevQtyTotal = \"1\";\n    var totalEl = document.createElement(\"span\");\n    totalEl.className = \"beleaev-qty-total\";\n    totalEl.style.cssText = \"display:inline-block;margin-left:14px;font-weight:600;color:#d4af37;white-space:nowrap;align-self:center;font-size:1.05em;\";\n    var qtyContainer = qtyInput.closest(\"quantity-input, .quantity, .product-form__quantity-top\") || qtyInput.parentElement;\n    if (qtyContainer && qtyContainer.parentElement) {\n      qtyContainer.parentElement.insertBefore(totalEl, qtyContainer.nextSibling);\n    }\n    function getCurrentPrice() {\n      var owned = document.querySelector('[data-blv-price-owner=\"allocation\"] beleaev-subscription-prices:not([hidden])');\n      if (owned) return Number(owned.dataset.unitCents) / 100;\n      var priceEl = document.querySelector(\".product__info-container .price-item--regular, .product__info-container .price-item.price-item--regular\");\n      if (!priceEl) return 0;\n      var match = priceEl.innerText.replace(/,/g, \"\").match(/([0-9]+(?:.[0-9]+)?)/);\n      return match ? parseFloat(match[1]) : 0;\n    }\n    function updateTotal() {\n      var qty = parseInt(qtyInput.value, 10) || 1;\n      var price = getCurrentPrice();\n      if (price <= 0) { totalEl.textContent = \"\"; return; }\n      if (qty <= 1) { totalEl.textContent = \"\"; return; }\n      var owned = document.querySelector('[data-blv-price-owner=\"allocation\"] beleaev-subscription-prices:not([hidden])');\n      var total = owned\n        ? new Intl.NumberFormat(owned.dataset.locale, { style: 'currency', currency: owned.dataset.currency }).format(price * qty)\n        : \"\u00A3\" + (price * qty).toFixed(2);\n      totalEl.textContent = \"= \" + total;\n    }\n    qtyInput.addEventListener(\"input\", updateTotal);\n    qtyInput.addEventListener(\"change\", updateTotal);\n    qtyInput.closest('product-info, [id^=\"ProductInfo-\"]')?.addEventListener('beleaev:display-price-change', updateTotal);\n    var qContainer = qtyInput.closest(\"quantity-input, .quantity\");\n    if (qContainer) {\n      qContainer.querySelectorAll(\"button.quantity__button, button[name=\\\"plus\\\"], button[name=\\\"minus\\\"]\").forEach(function(b) {\n        b.addEventListener(\"click\", function() { setTimeout(updateTotal, 80); });\n      });\n    }\n    document.querySelectorAll(\"input[type=\\\"radio\\\"][name=\\\"variant\\\"]\").forEach(function(r) {\n      r.addEventListener(\"change\", function() { setTimeout(updateTotal, 700); });\n    });\n    updateTotal();\n  }\n\n  /* Hide product card subtitles via inline style (beats any external !important rule). Idempotent. */\n  function hideCardSubtitles() {\n    var isHome = document.body.classList.contains(\"template-index\") || location.pathname === \"/\" || location.pathname === \"\";\n    if (isHome) {\n      document.querySelectorAll(\".card__subtitle\").forEach(function(s) { s.style.removeProperty(\"display\"); });\n      return;\n    }\n    document.querySelectorAll(\".card__subtitle\").forEach(function(s) {\n      s.style.setProperty(\"display\", \"none\", \"important\");\n    });\n  }\n\n  /* Cleanup: \u0443\u0431\u0438\u0440\u0430\u0435\u043C inline-\u0441\u0442\u0438\u043B\u0438 \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0440\u0430\u043D\u044C\u0448\u0435 \u043F\u0440\u0438\u043D\u0443\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043F\u0440\u0438\u0436\u0438\u043C\u0430\u043B\u0438\n     price-row \u043A \u043D\u0438\u0437\u0443 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 (\u0441\u043E\u0437\u0434\u0430\u0432\u0430\u043B\u0438 \u0431\u043E\u043B\u044C\u0448\u043E\u0439 gap \u043C\u0435\u0436\u0434\u0443 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435\u043C \u0438 \u0446\u0435\u043D\u043E\u0439\n     \u043A\u043E\u0433\u0434\u0430 subtitle \u043A\u043E\u0440\u043E\u0442\u043A\u0438\u0439). Layout \u0442\u0435\u043F\u0435\u0440\u044C \u043F\u043E\u043B\u043D\u043E\u0441\u0442\u044C\u044E \u0443\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F CSS \u0438\u0437\n     card-product.liquid {% style %}. */\n  function alignCardPriceRows() {\n    document.querySelectorAll(\".card-wrapper, .product-card-wrapper\").forEach(function(card) {\n      var priceRow = card.querySelector(\".beleaev-price-row\");\n      if (!priceRow) return;\n      // Remove inline overrides set by older versions\n      var info = card.querySelector(\".card__information\");\n      var info2 = card.querySelector(\".card-information\");\n      [card, info, info2, priceRow.parentElement].forEach(function(el) {\n        if (!el) return;\n        el.style.removeProperty(\"display\");\n        el.style.removeProperty(\"flex-direction\");\n        el.style.removeProperty(\"flex\");\n      });\n      priceRow.style.removeProperty(\"margin-top\");\n    });\n  }\n  /* === Beleaev qty submission fix (2026-05-04) ===\n   * Bug: PDP renders TWO <form id=\"product-form-{section.id}\"> with same ID:\n   *   1) inline form in main-product.liquid (always rendered)\n   *   2) form in buy_buttons block via buy-buttons.liquid (Shop Pay support)\n   * <input form=\"...\"> on the qty input binds to the FIRST form via\n   * getElementById. When user clicks the OTHER form's submit button, the\n   * browser's FormData(otherForm) excludes the qty input \u2014 so /cart/add\n   * receives default quantity=1 regardless of selected qty. Same problem\n   * occurs inside the quick-add modal (PDP HTML cloned with ids prefixed).\n   *\n   * Fix: capture-phase document-level submit listener. Before product-form.js\n   * submit handler runs (bubble phase), if the submitting /cart/add form has\n   * no form-associated quantity input with value > 0, inject a hidden\n   * <input name=\"quantity\"> as a direct child of the form with the visible\n   * page qty value. Idempotent. Additive \u2014 does NOT touch Tatiana's custom\n   * code, theme liquid, or template JSON. */\n  function installQtySubmissionFix() {\n    if (window.__beleaevQtyFixInstalled) return;\n\n    function getVisibleQty() {\n      var inputs = document.querySelectorAll('input[name=\"quantity\"][type=\"number\"]');\n      var fallback = 1;\n      for (var i = 0; i < inputs.length; i++) {\n        var el = inputs[i];\n        var v = parseInt(el.value || '1', 10);\n        if (!(v > 0)) continue;\n        var rect = el.getBoundingClientRect();\n        if (rect.width > 0 && rect.height > 0) return v;\n        if (i === 0) fallback = v;\n      }\n      return fallback;\n    }\n\n    function onSubmitCapture(e) {\n      var form = e.target;\n      if (!form || form.tagName !== 'FORM') return;\n      var action = form.getAttribute('action') || '';\n      if (action.indexOf('/cart/add') === -1) return;\n\n      // Does the form already own a usable, non-disabled quantity input\n      // (descendant or form=\"...\" associated)?\n      var hasQty = false;\n      try {\n        var existing = form.elements && form.elements.namedItem\n          ? form.elements.namedItem('quantity')\n          : null;\n        if (existing) {\n          var first = existing.length !== undefined && existing[0] ? existing[0] : existing;\n          if (!first.disabled) {\n            var vv = parseInt(first.value || '0', 10);\n            if (vv > 0) hasQty = true;\n          }\n        }\n      } catch (err) { /* defensive */ }\n\n      if (hasQty) return;\n\n      var qty = getVisibleQty();\n      var hidden = form.querySelector('input[name=\"quantity\"][data-beleaev-qty-fix]');\n      if (!hidden) {\n        hidden = document.createElement('input');\n        hidden.type = 'hidden';\n        hidden.name = 'quantity';\n        hidden.setAttribute('data-beleaev-qty-fix', '1');\n        form.appendChild(hidden);\n      }\n      hidden.value = String(qty);\n    }\n\n    document.addEventListener('submit', onSubmitCapture, true); // capture phase\n    window.__beleaevQtyFixInstalled = true;\n  }\n\n  /* Quick Add modal fix (2026-05-04): mirrors the visible quantity input and\n   * the selected variant into the form's hidden inputs in real time. Origin\n   * theme renders the qty input as a sibling of the form (HTML5 form-association\n   * is broken in this template), so the form submits qty=1 by default and\n   * adds the wrong variant when the user selects a different size in the modal.\n   * This fix patches both at the source (additive, scoped per modal). */\n  function wireQuickAddModals() {\n    document.querySelectorAll('quick-add-modal').forEach(function(modal) {\n      var selected = modal.querySelector('.variant-input:checked');\n      var quantity = modal.querySelector('quantity-input input[name=\"quantity\"]');\n      var association = selected ? selected.getAttribute('form') : quantity && quantity.getAttribute('form');\n      var root = (selected || quantity)?.closest('product-info, [id^=\"ProductInfo-\"]');\n      var productId = root && root.dataset.productId;\n      if (!association || !productId) return;\n      var form = Array.from(modal.querySelectorAll('form[action*=\"/cart/add\"]')).find(function(candidate) {\n        var owner = candidate.querySelector('input[name=\"product-id\"]');\n        return candidate.getAttribute('id') === association && owner && owner.value === productId && root.contains(candidate);\n      });\n      if (!form || form.dataset.beleaevQaWired === '1') return;\n      form.dataset.beleaevQaWired = '1';\n\n      var visibleQty = modal.querySelector('input.quantity__input, input[name=\"quantity\"][type=\"number\"]');\n      var formId = form.querySelector('input[name=\"id\"]');\n\n      // 1) Mirror visible qty into hidden form input (kept in sync on every change).\n      var hiddenQty = null;\n      if (visibleQty && !form.contains(visibleQty)) {\n        hiddenQty = form.querySelector('input[name=\"quantity\"][data-beleaev-qty-mirror]');\n        if (!hiddenQty) {\n          hiddenQty = document.createElement('input');\n          hiddenQty.type = 'hidden';\n          hiddenQty.name = 'quantity';\n          hiddenQty.setAttribute('data-beleaev-qty-mirror', '1');\n          form.appendChild(hiddenQty);\n        }\n        var syncQty = function() {\n          var v = parseInt(visibleQty.value, 10);\n          hiddenQty.value = (v > 0) ? String(v) : '1';\n        };\n        visibleQty.addEventListener('input', syncQty);\n        visibleQty.addEventListener('change', syncQty);\n        modal.querySelectorAll('button[name=\"plus\"], button[name=\"minus\"], .quantity__button').forEach(function(b) {\n          b.addEventListener('click', function() { setTimeout(syncQty, 60); });\n        });\n        syncQty();\n      }\n\n      // 2) Sync variant id to form's hidden id input on label click (capture phase\n      //    so it runs before applyBeleaevVariant's stopPropagation).\n      modal.querySelectorAll('.variant-label').forEach(function(label) {\n        label.addEventListener('click', function() {\n          var radioId = label.getAttribute('for');\n          if (!radioId || !formId) return;\n          var radio = modal.querySelector('#' + (CSS && CSS.escape ? CSS.escape(radioId) : radioId.replace(/([^\\w-])/g,'\\\\$1')));\n          if (radio && radio.value) formId.value = radio.value;\n        }, true);\n      });\n\n      // 3) Belt-and-suspenders: re-sync at submit time.\n      form.addEventListener('submit', function() {\n        if (visibleQty && hiddenQty) {\n          var v = parseInt(visibleQty.value, 10);\n          hiddenQty.value = (v > 0) ? String(v) : '1';\n        }\n        var checked = modal.querySelector('input[name=\"variant\"]:checked, input.variant-input:checked');\n        if (checked && formId) formId.value = checked.value;\n      }, true);\n    });\n  }\n\n  /* === Beleaev qty mirror across duplicate inputs (2026-05-04) ===\n   * Bug: on some PDPs (e.g. Golden Oscietra), the section renders TWO\n   * <quantity-input> elements with the same id=\"Quantity-{section.id}\",\n   * both inside .product-form__buttons of two same-id forms. User typing in\n   * one input doesn't mirror to the other \u2014 the visible \"+/- N\" widgets\n   * desync. Sync values so any change propagates to all qty inputs in the\n   * same product scope. Document-level event delegation \u2014 robust against\n   * late DOM mutations (variant change re-renders, modal late-injection).\n   * Idempotent. Additive \u2014 does NOT touch Tatiana's custom code.\n   * Complements wireQuickAddModals (visible\u2192hidden inside ONE form) by\n   * syncing across MULTIPLE visible duplicates. */\n  function setupQtyMirror() {\n    if (window.__beleaevQtyMirrorInstalled) return;\n    window.__beleaevQtyMirrorInstalled = true;\n    function syncAcrossScope(target) {\n      if (window.__beleaevMirroring) return;\n      if (!target || !target.matches) return;\n      if (!target.matches('input[name=\"quantity\"][type=\"number\"]')) return;\n      var scope = target.closest('quick-add-modal, product-info, section[id^=\"MainProduct-\"]');\n      if (!scope) return;\n      var siblings = scope.querySelectorAll('input[name=\"quantity\"][type=\"number\"]');\n      if (siblings.length < 2) return;\n      window.__beleaevMirroring = true;\n      try {\n        var v = target.value;\n        Array.prototype.forEach.call(siblings, function (inp) {\n          if (inp !== target && inp.value !== v) {\n            inp.value = v;\n            inp.dispatchEvent(new Event('input', { bubbles: true }));\n            inp.dispatchEvent(new Event('change', { bubbles: true }));\n          }\n        });\n      } finally {\n        window.__beleaevMirroring = false;\n      }\n    }\n    document.addEventListener('input', function (e) { syncAcrossScope(e.target); }, true);\n    document.addEventListener('change', function (e) { syncAcrossScope(e.target); }, true);\n  }\n\n  /* === Beleaev free-shipping format consistency (2026-05-04) ===\n   * Bug: cart-drawer.liquid renders \"\u00A3163.00 left to enjoy free delivery!\" via\n   * Liquid `| money` filter, but its inline JS updateFreeShippingBar uses\n   * Shopify.formatMoney (returns \"163.00\u00A3\", suffix \u00A3) AND different copy\n   * (\"away from free shipping!\"). After any cart change the text reformats,\n   * creating jank that founder reports as \"architecture breaks\".\n   * Fix: monkey-patch updateFreeShippingBar to render the same prefix\n   * format and copy as the Liquid render. Additive \u2014 does not edit\n   * cart-drawer.liquid. */\n  function installFreeShippingFormatFix() {\n    if (window.__beleaevFsFormatFixInstalled) return;\n    function fmt(amountCents) {\n      var code = (window.Shopify && window.Shopify.currency && window.Shopify.currency.active) || 'GBP';\n      var prefix, decSep;\n      switch (code) {\n        case 'EUR': prefix = '\u20AC'; decSep = ','; break;\n        case 'USD': prefix = '$'; decSep = '.'; break;\n        case 'GBP': prefix = '\u00A3'; decSep = '.'; break;\n        case 'AED': prefix = 'AED '; decSep = '.'; break;\n        default:    prefix = code + ' '; decSep = '.';\n      }\n      var n = (amountCents / 100).toFixed(2);\n      if (decSep === ',') n = n.replace('.', ',');\n      return prefix + n;\n    }\n    function applyOverride() {\n      if (typeof window.updateFreeShippingBar !== 'function') return false;\n      if (window.updateFreeShippingBar.__beleaevPatched) return true;\n      var orig = window.updateFreeShippingBar;\n      var patched = function (cart) {\n        var container = document.querySelector('.free-shipping-container');\n        if (!container || !cart) return orig.apply(this, arguments);\n        container.hidden = !Array.isArray(cart.items) || !cart.items.some(function (item) { return item.requires_shipping === true && item.quantity > 0; });\n        if (container.hidden) return;\n        var threshold = parseInt(container.getAttribute('data-threshold'), 10);\n        var lang = container.getAttribute('data-lang') || 'en';\n        var total = cart.total_price || 0;\n        var count = cart.item_count || 0;\n        var remaining = threshold - total;\n        var progress = Math.min((total / threshold) * 100, 100);\n        var textElement = container.querySelector('.fs-text');\n        var fillElement = container.querySelector('.fs-progress-fill');\n        if (fillElement) fillElement.style.width = progress + '%';\n        if (!textElement) return;\n        var formatted = fmt(remaining);\n        var copy;\n        if (count === 0 || total === 0) {\n          if (lang === 'de') copy = 'F\u00FCgen Sie Artikel hinzu, um <strong>kostenlosen Versand</strong> ab ' + fmt(threshold) + ' zu erhalten!';\n          else if (lang === 'es') copy = '\u00A1A\u00F1ade art\u00EDculos para obtener <strong>env\u00EDo gratis</strong> a partir de ' + fmt(threshold) + '!';\n          else copy = 'Add items to get <strong class=\"beleaev-free-delivery-label\">Free Next Day Delivery</strong> over ' + fmt(threshold) + '!';\n        } else if (remaining > 0) {\n          if (lang === 'de') copy = 'Nur noch <strong>' + formatted + '</strong> bis zum kostenlosen Versand!';\n          else if (lang === 'es') copy = '\u00A1Solo faltan <strong>' + formatted + '</strong> para disfrutar de env\u00EDo gratis!';\n          else copy = 'Only <strong>' + formatted + '</strong> left to enjoy <strong class=\"beleaev-free-delivery-label\">Free Next Day Delivery</strong>!';\n        } else {\n          if (lang === 'de') copy = 'Sie haben den <strong>kostenlosen Versand</strong> freigeschaltet!';\n          else if (lang === 'es') copy = '\u00A1Has desbloqueado el <strong>env\u00EDo gratuito!</strong>';\n          else copy = \"You've unlocked <strong class=\\\"beleaev-free-delivery-label\\\">Free Next Day Delivery</strong>!\";\n        }\n        textElement.innerHTML = copy;\n      };\n      patched.__beleaevPatched = true;\n      window.updateFreeShippingBar = patched;\n      return true;\n    }\n    if (!applyOverride()) {\n      var attempts = 0;\n      var iv = setInterval(function () {\n        attempts++;\n        if (applyOverride() || attempts > 20) clearInterval(iv);\n      }, 200);\n    }\n    window.__beleaevFsFormatFixInstalled = true;\n  }\n\n  function runAll() {\n    restructure();\n    wrapFromPrefix();\n    inlineBagWithPrice();\n    liftFromLabelMobile();\n    wrapCardCurrencyCodes();\n    addProductBadges();\n    decorateBritishQualityControl();\n    ensureHomepageH1();\n    injectPaymentIcons();\n    setupStickyMobileATC();\n    addPerServingPrice();\n    ensureCardClickable();\n    addPdpSommelierBubble();\n    wireVariantPicker();\n    setupQuantityTotal();\n    attachMegaMenuToHeader();\n    injectMobileFixCSS();\n    ensureImageAlt();\n    hideCardSubtitles();\n    alignCardPriceRows();\n    installQtySubmissionFix();\n    wireQuickAddModals();\n    setupQtyMirror();\n    installFreeShippingFormatFix();\n    injectCartDrawerEmptyFix();\n  }\n\n  /* === Beleaev cart drawer empty-state fix (2026-05-04, v2) ===\n   * Bug: When cart becomes empty, multiple elements overlap visually:\n   *  1) <cart-drawer-items class=\"is-empty\"> stays h=1838px at y=-175 (huge\n   *     upward overflow) and renders the upsell list through entire drawer.\n   *  2) drawer__inner-empty (Tatiana's \"Your cart is empty\" message) gets\n   *     placed in CSS Grid row 1 (280px) but its content is 317px \u2192 spills.\n   *  3) free-shipping bar shows the wrong message stacked at top.\n   *  4) Result: \"Continue shopping\" pill, \"Your cart\" text, and X close all\n   *     float on top of the upsell list, looking broken.\n   * Fix v2: When .is-empty, force a clean linear stack via flex column on\n   *  drawer__inner: header \u2192 empty message \u2192 upsell list. Hide overflowing\n   *  free-shipping. Constrain cart-drawer-items height + clear its negative\n   *  offset so upsell sits BELOW empty message, not on top of it.\n   * Idempotent. Additive. */\n  function injectCartDrawerEmptyFix() {\n    if (document.getElementById('beleaev-cart-empty-fix-css')) return;\n    var css = [\n      /* Switch grid \u2192 flex stack when cart is empty so source order is honoured */\n      'cart-drawer.is-empty .drawer__inner {',\n      '  display: flex !important;',\n      '  flex-direction: column !important;',\n      '  grid-template-rows: none !important;',\n      '  grid-template-columns: none !important;',\n      '}',\n      /* Header first, normal height */\n      'cart-drawer.is-empty .drawer__header {',\n      '  order: 0 !important;',\n      '  display: flex !important;',\n      '  position: relative !important;',\n      '  top: 0 !important;',\n      '}',\n      /* Empty-state message second, no min-height clamp, no negative Y */\n      'cart-drawer.is-empty .drawer__inner-empty {',\n      '  order: 1 !important;',\n      '  position: relative !important;',\n      '  top: 0 !important;',\n      '  height: auto !important;',\n      '  min-height: 0 !important;',\n      '  max-height: none !important;',\n      '  padding: 32px 20px 24px !important;',\n      '  margin: 0 !important;',\n      '  overflow: visible !important;',\n      '  flex: 0 0 auto !important;',\n      '  display: flex !important;',\n      '  flex-direction: column !important;',\n      '  align-items: center !important;',\n      '  justify-content: flex-start !important;',\n      '}',\n      'cart-drawer.is-empty .drawer__inner-empty .cart-drawer__warnings {',\n      '  width: 100% !important;',\n      '  text-align: center !important;',\n      '  gap: 14px !important;',\n      '}',\n      /* Upsell area (cart-drawer-items) third, normal flow, no negative Y */\n      'cart-drawer.is-empty cart-drawer-items {',\n      '  order: 2 !important;',\n      '  position: relative !important;',\n      '  top: 0 !important;',\n      '  height: auto !important;',\n      '  max-height: none !important;',\n      '  margin: 0 !important;',\n      '  flex: 1 1 auto !important;',\n      '  overflow-y: auto !important;',\n      '}',\n      'cart-drawer.is-empty cart-drawer-items::before {',\n      '  content: \"\" !important;',\n      '  display: block !important;',\n      '  border-top: 1px solid rgba(255,255,255,0.1) !important;',\n      '  margin: 8px 16px 0 !important;',\n      '}',\n      /* Hide free-shipping when cart is empty */\n      'cart-drawer.is-empty .free-shipping-container {',\n      '  display: none !important;',\n      '}'\n    ].join('\\n');\n    var style = document.createElement('style');\n    style.id = 'beleaev-cart-empty-fix-css';\n    style.textContent = css;\n    document.head.appendChild(style);\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', runAll);\n  } else {\n    runAll();\n  }\n\n  /* BELEAEV_INP_OPTIMIZATION_2026_08_30: keep dynamic-card support without rescanning the whole page\n     ten times after load or after every unrelated third-party DOM mutation. */\n  function runDynamicEnhancements() {\n    wrapFromPrefix();\n    inlineBagWithPrice();\n    liftFromLabelMobile();\n    wrapCardCurrencyCodes();\n    addProductBadges();\n    injectPaymentIcons();\n    ensureCardClickable();\n    hideCardSubtitles();\n    alignCardPriceRows();\n    restructure();\n    wireQuickAddModals();\n  }\n\n  document.addEventListener('beleaev:quick-add-ready', runDynamicEnhancements);\n\n  let dynamicPending = false;\n  function scheduleDynamicEnhancements() {\n    if (dynamicPending) return;\n    dynamicPending = true;\n    const execute = () => {\n      dynamicPending = false;\n      runDynamicEnhancements();\n    };\n    if ('requestIdleCallback' in window) {\n      requestIdleCallback(execute, { timeout: 500 });\n    } else {\n      setTimeout(execute, 60);\n    }\n  }\n\n  window.addEventListener('load', function () {\n    setTimeout(scheduleDynamicEnhancements, 600);\n    setTimeout(scheduleDynamicEnhancements, 2000);\n  }, { once: true });\n\n  let resizePending = false;\n  window.addEventListener('resize', function () {\n    if (resizePending) return;\n    resizePending = true;\n    requestAnimationFrame(function () {\n      resizePending = false;\n      attachMegaMenuToHeader();\n      liftFromLabelMobile();\n    wrapCardCurrencyCodes();\n    });\n  });\n\n  /* Only product/cart insertions need enhancement work. */\n  if (typeof MutationObserver !== 'undefined') {\n    const dynamicSelector = '.card-wrapper, .product-card-wrapper, quick-add-modal, cart-drawer, #CartDrawer';\n    const mo = new MutationObserver((records) => {\n      const relevant = records.some((record) => Array.from(record.addedNodes).some((node) => (\n        node.nodeType === 1 && (\n          (node.matches && node.matches(dynamicSelector)) ||\n          (node.querySelector && node.querySelector(dynamicSelector))\n        )\n      )));\n      if (relevant) scheduleDynamicEnhancements();\n    });\n    mo.observe(document.body, { childList: true, subtree: true });\n  }\n\n  /* Curator badge restore after QUICK-ADD closes (fix 2026-06-04).\n   * Opening quick-add relocates a grid card's .beleaev-badge into the\n   * cloned modal; on close the modal clears its content (innerHTML='')\n   * and the badge is gone from the grid until the next page load. The\n   * rAF-based observer above does not fire while the tab is throttled,\n   * so re-inject explicitly on the 'modalClosed' event (dispatched by\n   * ModalDialog.hide -> super.hide) using setTimeout (visibility-proof).\n   * runAll() is idempotent (skips cards that already have a badge). */\n  document.body.addEventListener('modalClosed', function () {\n    setTimeout(scheduleDynamicEnhancements, 60);\n    setTimeout(scheduleDynamicEnhancements, 350);\n  });\n})();\n\n/* ============================================\n   Judge.me preview_badge click \u2192 scroll to review widget\n   (added 2026-05-14 \u2014 fixes mobile click on stars under\n   product title landing on \"More to enjoy\" instead of\n   jdgm-rev-widg. Capture phase intercepts before Judge.me)\n   ============================================ */\n(function () {\n  'use strict';\n  var HEADER_OFFSET = 80;\n  document.addEventListener('click', function (e) {\n    var trigger = e.target.closest && e.target.closest('.jdgm-prev-badge, .jdgm-prev-badge__stars, .jdgm-prev-badge__text');\n    if (!trigger) return;\n    var target = document.querySelector('.jdgm-rev-widg__title, .jdgm-rev-widg, .jdgm-review-widget, [data-from-snippet=\"review_widget\"]');\n    if (!target) return;\n    e.preventDefault();\n    e.stopImmediatePropagation();\n    var y = target.getBoundingClientRect().top + window.scrollY - HEADER_OFFSET;\n    window.scrollTo({ top: y, behavior: 'smooth' });\n  }, true);\n})();\n\n\n/* October 2026 caviar promotion: prices, collection cards and badges. */\n(function () {\n  'use strict';\n  return; var PROMO = window.BeleaevOctoberPromo = Object.assign(window.BeleaevOctoberPromo || {}, {\n    'almaz-diamond-caviar': [[16300,14670,10],[27300,23205,15],[68200,57970,15],[136500,116025,15],[546000,464100,15]],\n    'almaz-diamond-caviar-set': [[16300,14670,10],[27300,23205,15],[68200,57970,15],[136500,116025,15],[546000,464100,15]],\n    'royal-beluga-caviar': [[11000,9900,10],[18000,15300,15],[45000,38250,15],[90000,76500,15],[357000,303450,15]],\n    'royal-beluga-caviar-copy': [[11000,9900,10],[18000,15300,15],[45000,38250,15],[90000,76500,15],[357000,303450,15]],\n    'beluga-caviar-set': [[11000,9900,10],[18000,15300,15],[45000,38250,15],[90000,76500,15],[357000,303450,15]],\n    'beluga-xxl-special-reserve': [[13100,11790,10],[21800,18530,15],[54600,46410,15],[109200,92820,15],[436800,371280,15]],\n    'beluga-xxl-caviar-set': [[13100,11790,10],[21800,18530,15],[54600,46410,15],[109200,92820,15],[436800,371280,15]],\n    'golden-oscietra-special-reserve': [[5100,4590,10],[8100,6885,15],[20000,16000,20],[39400,31520,20],[157500,126000,20]],\n    'golden-oscietra-caviar-set': [[5100,4590,10],[8100,6885,15],[20000,17000,15],[39400,33490,15],[157500,133875,15]],\n    'royal-imperial-caviar': [[5200,4680,10],[8500,7225,15],[21000,17850,15],[42700,36295,15],[171000,145350,15]],\n    'royal-imperial-caviar-copy': [[5200,4680,10],[8500,7225,15],[21000,17850,15],[42700,36295,15],[171000,145350,15]],\n    'royal-oscietra-caviar': [[4800,4320,10],[7800,6630,15],[19500,15600,20],[39000,31200,20],[147000,117600,20]],\n    'royal-oscietra-caviar-copy': [[4800,4320,10],[7800,6630,15],[19500,15600,20],[39000,31200,20],[147000,117600,20]],\n    'royal-baerii-caviar': [[3700,3330,10],[6300,5355,15],[15700,12560,20],[31500,25200,20],[122000,97600,20]],\n    'baeri-festive-caviar-set': [[3700,3330,10],[6300,5355,15],[15700,13345,15],[31500,26775,15],[122000,103700,15]],\n    'wild-salmon-roe': [[7200,6120,15],[18000,15300,15]],\n    'wild-salmon-festive-caviar-set': [[7200,6120,15],[18000,15300,15]],\n    'caviar-brunch-box': [[7695,6541,15]],\n    'happy-birthday-hamper': [[7753,6590,15]],\n    'caviar-birthday-gift': [[7753,6590,15]],\n    'the-grand-caviar-board': [[25575,21739,15]],\n    'beluga-caviar-gift-board': [[25575,21739,15]],\n    'the-beleaev-signature-tasting-set-4x125g': [[99900,84915,15]],\n    'the-beleaev-signature-tasting-set': [[24700,20995,15]],\n    'the-beleaev-signature-tasting-set-4x50g': [[39900,33915,15]]\n  });\n  function money(cents) { return '\u00A3' + (cents / 100).toLocaleString('en-GB', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); }\n  function handle(card) {\n    var link = card.querySelector('a[href*=\"/products/\"]');\n    var match = link && link.getAttribute('href').match(/\\/products\\/([^?#/]+)/);\n    return match && match[1];\n  }\n  function decorate(card) {\n    var key = handle(card), rows = key && PROMO[key];\n    if (!rows || card.classList.contains('beleaev-oct-card')) return;\n    var lowest = rows.reduce(function (best, row) { return row[1] < best[1] ? row : best; }, rows[0]);\n    var maximum = rows.reduce(function (best, row) { return Math.max(best, row[2]); }, 0);\n    var media = card.querySelector('.card__media, .card__inner, .media') || card;\n    var price = card.querySelector('.price');\n    var target = card.querySelector('.beleaev-price-row') || card.querySelector('.card__information, .card-information, .card__content') || card;\n    card.classList.add('beleaev-oct-card');\n    if (price) price.style.display = 'none';\n    var badge = document.createElement('span');\n    badge.className = 'beleaev-oct-badge';\n    badge.textContent = 'SAVE UP TO ' + maximum + '%';\n    media.appendChild(badge);\n    var visual = document.createElement('div');\n    visual.className = 'beleaev-oct-card-price';\n    visual.innerHTML = '<span class=\"beleaev-oct-was\">From ' + money(lowest[0]) + '</span><span class=\"beleaev-oct-now\">' + money(lowest[1]) + '</span>';\n    target.appendChild(visual);\n    if (target.classList.contains('beleaev-price-row')) {\n      var quickAdd = target.querySelector(':scope > .quick-add');\n      var nativePrice = target.querySelector(':scope > .price');\n      if (quickAdd) target.insertBefore(visual, quickAdd);\n      if (nativePrice) nativePrice.style.setProperty('display', 'none', 'important');\n      var liftedLabel = target.querySelector(':scope > .beleaev-from-label-mobile');\n      target.style.setProperty('display', 'flex', 'important');\n      ['grid-template-columns', 'grid-template-areas', 'column-gap', 'row-gap'].forEach(function (property) { target.style.removeProperty(property); });\n      target.style.setProperty('align-items', 'center', 'important');\n      target.style.setProperty('justify-content', 'space-between', 'important');\n      target.style.setProperty('gap', '0.6rem', 'important');\n      if (liftedLabel) liftedLabel.style.setProperty('display', 'none', 'important');\n      visual.style.setProperty('flex', '1 1 auto', 'important');\n      visual.style.setProperty('min-width', '0', 'important');\n      if (quickAdd) {\n        ['grid-area', 'align-self', 'position', 'inset'].forEach(function (property) { quickAdd.style.removeProperty(property); });\n        quickAdd.style.setProperty('position', 'relative', 'important');\n        quickAdd.style.setProperty('inset', 'auto', 'important');\n        quickAdd.style.setProperty('flex', '0 0 auto', 'important');\n      }\n    }\n  }\n  function decorateCards(root) {\n    (root || document).querySelectorAll('.card-wrapper.product-card-wrapper').forEach(decorate);\n  }\n  function installStyle() {\n    if (document.getElementById('beleaev-october-card-style')) return;\n    var style = document.createElement('style');\n    style.id = 'beleaev-october-card-style';\n    style.textContent = '.beleaev-oct-card{position:relative}.beleaev-oct-badge{position:absolute;z-index:4;left:8px;bottom:8px;padding:5px 8px;border-radius:999px;background:#d5ad4d;color:#050505;font:700 10px/1 var(--font-body-family);letter-spacing:.04em}.beleaev-oct-card-price{display:flex;align-items:baseline;gap:7px;white-space:nowrap;margin-top:7px;font-family:var(--font-body-family)}.beleaev-oct-was{color:rgba(var(--color-foreground),.62);text-decoration:line-through}.beleaev-oct-now{color:#d5ad4d;font-weight:700}@media(max-width:749px){.beleaev-oct-badge{font-size:8px;padding:4px 6px}.beleaev-oct-card-price{gap:5px;font-size:.92rem}}';\n    document.head.appendChild(style);\n  }\n  (function () {\n    if (window.__beleaevOctoberOneTimePromo) return;\n    window.__beleaevOctoberOneTimePromo = true;\n    function money(cents) { return '\\u00a3' + (cents / 100).toLocaleString('en-GB', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); }\n    function ensureStyle() {\n      if (document.getElementById('beleaev-october-one-time-style')) return;\n      var style = document.createElement('style');\n      style.id = 'beleaev-october-one-time-style';\n      style.textContent = '#MainContent .appstle_one_time_details_wrapper .appstle_one_time_price_wrapper{display:none!important}#MainContent .appstle_subscription_wrapper_option .beleaev-oct-one-time{display:table!important;margin:5px 0 0 28px!important;padding:3px 8px!important;border:1px solid #c9a961!important;border-radius:999px!important;color:#c9a961!important;font:700 10px/1.15 var(--font-body-family)!important;letter-spacing:.04em!important;white-space:nowrap!important}#MainContent .appstle_subscription_wrapper_option .beleaev-oct-one-time-price{display:inline-flex!important;align-items:baseline!important;gap:5px!important;margin:0 0 0 auto!important;font-family:var(--font-body-family)!important;font-size:16px!important;white-space:nowrap!important}.beleaev-oct-one-time-price .beleaev-oct-was{text-decoration:line-through;color:rgba(255,255,255,.72)}.beleaev-oct-one-time-price .beleaev-oct-now{color:#c9a961;font-weight:700}';\n      document.head.appendChild(style);\n    }\n    function apply() {\n      var match = location.pathname.match(/^\\/products\\/([^?#/]+)/), handle = match && match[1], rows = window.BeleaevOctoberPromo && window.BeleaevOctoberPromo[handle];\n      var selected = document.querySelector('.variant-input:checked'), dataNode = document.querySelector('beleaev-purchase-options script[type=\"application/json\"]'), data = null;\n      if (!selected && rows && dataNode) try {\n        data = JSON.parse(dataNode.textContent);\n        if (data.variants && data.variants.length === 1) selected = { value: String(data.variants[0].id) };\n      } catch (error) {}\n      var cache = window.__beleaevOctoberRowsByVariant || (window.__beleaevOctoberRowsByVariant = {}), key = selected && handle + ':' + selected.value;\n      if (!selected || !rows) return;\n      if (!Object.prototype.hasOwnProperty.call(cache, key)) {\n        fetch('/products/' + handle + '.js').then(function (response) { return response.json(); }).then(function (product) {\n          var variant = product.variants.filter(function (item) { return String(item.id) === String(selected.value); })[0];\n          cache[key] = variant ? (rows.filter(function (item) { return item[0] === variant.price; })[0] || null) : null;\n          apply();\n        }).catch(function () { cache[key] = null; });\n        return;\n      }\n      var row = cache[key];\n      var option = Array.prototype.slice.call(document.querySelectorAll('.appstle_subscription_wrapper_option')).filter(function (item) { return !!item.querySelector('.appstle_one_time_details_wrapper'); })[0];\n      if (!row || !option) return;\n      ensureStyle();\n      var badge = option.querySelector('.beleaev-oct-one-time');\n      if (!badge) { badge = document.createElement('span'); badge.className = 'beleaev-oct-one-time'; (option.querySelector('.appstle_radio_label') || option).appendChild(badge); }\n      badge.textContent = 'CAVIAR - ' + row[2] + '%';\n      var visual = option.querySelector('.beleaev-oct-one-time-price');\n      if (!visual) { visual = document.createElement('span'); visual.className = 'beleaev-oct-one-time-price'; option.querySelector('.appstle_one_time_details_wrapper').appendChild(visual); }\n      visual.innerHTML = '<span class=\"beleaev-oct-was\">' + money(row[0]) + '</span><span class=\"beleaev-oct-now\">' + money(row[1]) + '</span>';\n    }\n    apply();\n    var queued = false;\n    new MutationObserver(function () { if (!queued) { queued = true; requestAnimationFrame(function () { queued = false; apply(); }); } }).observe(document.body, { childList: true, subtree: true });\n    document.addEventListener('change', function () { window.setTimeout(apply, 0); });\n  }());\n  function boot() { installStyle(); decorateCards(); }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot, { once: true }); else boot();\n  new MutationObserver(function (records) { records.forEach(function (record) { record.addedNodes.forEach(function (node) { if (node.nodeType === 1) decorateCards(node); }); }); }).observe(document.documentElement, { childList: true, subtree: true });\n}());\n\n\n/* October 2026 caviar promotion: prices, collection cards and badges. */\n(function () {\n  'use strict';\n  return; var PROMO = window.BeleaevOctoberPromo = Object.assign(window.BeleaevOctoberPromo || {}, {\n    'almaz-diamond-caviar': [[16300,14670,10],[27300,23205,15],[68200,57970,15],[136500,116025,15],[546000,464100,15]],\n    'almaz-diamond-caviar-set': [[16300,14670,10],[27300,23205,15],[68200,57970,15],[136500,116025,15],[546000,464100,15]],\n    'royal-beluga-caviar': [[11000,9900,10],[18000,15300,15],[45000,38250,15],[90000,76500,15],[357000,303450,15]],\n    'royal-beluga-caviar-copy': [[11000,9900,10],[18000,15300,15],[45000,38250,15],[90000,76500,15],[357000,303450,15]],\n    'beluga-caviar-set': [[11000,9900,10],[18000,15300,15],[45000,38250,15],[90000,76500,15],[357000,303450,15]],\n    'beluga-xxl-special-reserve': [[13100,11790,10],[21800,18530,15],[54600,46410,15],[109200,92820,15],[436800,371280,15]],\n    'beluga-xxl-caviar-set': [[13100,11790,10],[21800,18530,15],[54600,46410,15],[109200,92820,15],[436800,371280,15]],\n    'golden-oscietra-special-reserve': [[5100,4590,10],[8100,6885,15],[20000,16000,20],[39400,31520,20],[157500,126000,20]],\n    'golden-oscietra-caviar-set': [[5100,4590,10],[8100,6885,15],[20000,17000,15],[39400,33490,15],[157500,133875,15]],\n    'royal-imperial-caviar': [[5200,4680,10],[8500,7225,15],[21000,17850,15],[42700,36295,15],[171000,145350,15]],\n    'royal-imperial-caviar-copy': [[5200,4680,10],[8500,7225,15],[21000,17850,15],[42700,36295,15],[171000,145350,15]],\n    'royal-oscietra-caviar': [[4800,4320,10],[7800,6630,15],[19500,15600,20],[39000,31200,20],[147000,117600,20]],\n    'royal-oscietra-caviar-copy': [[4800,4320,10],[7800,6630,15],[19500,15600,20],[39000,31200,20],[147000,117600,20]],\n    'royal-baerii-caviar': [[3700,3330,10],[6300,5355,15],[15700,12560,20],[31500,25200,20],[122000,97600,20]],\n    'baeri-festive-caviar-set': [[3700,3330,10],[6300,5355,15],[15700,13345,15],[31500,26775,15],[122000,103700,15]],\n    'wild-salmon-roe': [[7200,6120,15],[18000,15300,15]],\n    'wild-salmon-festive-caviar-set': [[7200,6120,15],[18000,15300,15]],\n    'caviar-brunch-box': [[7695,6541,15]],\n    'happy-birthday-hamper': [[7753,6590,15]],\n    'caviar-birthday-gift': [[7753,6590,15]],\n    'the-grand-caviar-board': [[25575,21739,15]],\n    'beluga-caviar-gift-board': [[25575,21739,15]],\n    'the-beleaev-signature-tasting-set-4x125g': [[99900,84915,15]],\n    'the-beleaev-signature-tasting-set': [[24700,20995,15]],\n    'the-beleaev-signature-tasting-set-4x50g': [[39900,33915,15]]\n  });\n  function money(cents) { return '\u00A3' + (cents / 100).toLocaleString('en-GB', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); }\n  function handle(card) {\n    var link = card.querySelector('a[href*=\"/products/\"]');\n    var href = link && link.getAttribute('href');\n    var match = href && href.match(new RegExp('/products/([^?#/]+)'));\n    return match && match[1];\n  }\n  function decorate(card) {\n    var key = handle(card), rows = key && PROMO[key];\n    if (!rows || card.classList.contains('beleaev-oct-card')) return;\n    var lowest = rows.reduce(function (best, row) { return row[1] < best[1] ? row : best; }, rows[0]);\n    var maximum = rows.reduce(function (best, row) { return Math.max(best, row[2]); }, 0);\n    var media = card.querySelector('.card__media, .card__inner, .media') || card;\n    var price = card.querySelector('.price');\n    var target = card.querySelector('.beleaev-price-row') || card.querySelector('.card__information, .card-information, .card__content') || card;\n    card.classList.add('beleaev-oct-card');\n    if (price) price.style.display = 'none';\n    var badge = document.createElement('span');\n    badge.className = 'beleaev-oct-badge';\n    badge.textContent = 'SAVE UP TO ' + maximum + '%';\n    media.appendChild(badge);\n    var visual = document.createElement('div');\n    visual.className = 'beleaev-oct-card-price';\n    visual.innerHTML = '<span class=\"beleaev-oct-was\">From ' + money(lowest[0]) + '</span><span class=\"beleaev-oct-now\">' + money(lowest[1]) + '</span>';\n    target.appendChild(visual);\n    if (target.classList.contains('beleaev-price-row')) {\n      var quickAdd = target.querySelector(':scope > .quick-add');\n      var nativePrice = target.querySelector(':scope > .price');\n      if (quickAdd) target.insertBefore(visual, quickAdd);\n      if (nativePrice) nativePrice.style.setProperty('display', 'none', 'important');\n      var liftedLabel = target.querySelector(':scope > .beleaev-from-label-mobile');\n      target.style.setProperty('display', 'flex', 'important');\n      ['grid-template-columns', 'grid-template-areas', 'column-gap', 'row-gap'].forEach(function (property) { target.style.removeProperty(property); });\n      target.style.setProperty('align-items', 'center', 'important');\n      target.style.setProperty('justify-content', 'space-between', 'important');\n      target.style.setProperty('gap', '0.6rem', 'important');\n      if (liftedLabel) liftedLabel.style.setProperty('display', 'none', 'important');\n      visual.style.setProperty('flex', '1 1 auto', 'important');\n      visual.style.setProperty('min-width', '0', 'important');\n      if (quickAdd) {\n        ['grid-area', 'align-self', 'position', 'inset'].forEach(function (property) { quickAdd.style.removeProperty(property); });\n        quickAdd.style.setProperty('position', 'relative', 'important');\n        quickAdd.style.setProperty('inset', 'auto', 'important');\n        quickAdd.style.setProperty('flex', '0 0 auto', 'important');\n      }\n    }\n  }\n  function decorateCards(root) {\n    (root || document).querySelectorAll('.card-wrapper.product-card-wrapper').forEach(decorate);\n  }\n  function installStyle() {\n    if (document.getElementById('beleaev-october-card-style')) return;\n    var style = document.createElement('style');\n    style.id = 'beleaev-october-card-style';\n    style.textContent = '.beleaev-oct-card{position:relative}.beleaev-oct-badge{position:absolute;z-index:4;left:8px;bottom:8px;padding:5px 8px;border-radius:999px;background:#d5ad4d;color:#050505;font:700 10px/1 var(--font-body-family);letter-spacing:.04em}.beleaev-oct-card-price{display:flex;align-items:baseline;gap:7px;white-space:nowrap;margin-top:7px;font-family:var(--font-body-family)}.beleaev-oct-was{color:rgba(var(--color-foreground),.62);text-decoration:line-through}.beleaev-oct-now{color:#d5ad4d;font-weight:700}@media(max-width:749px){.beleaev-oct-badge{font-size:8px;padding:4px 6px}.beleaev-oct-card-price{gap:5px;font-size:.92rem}}.beleaev-oct-badge{display:none}';\n    document.head.appendChild(style);\n  }\n  function boot() { installStyle(); decorateCards(); }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot, { once: true }); else boot();\n  new MutationObserver(function (records) { records.forEach(function (record) { record.addedNodes.forEach(function (node) { if (node.nodeType === 1) decorateCards(node); }); }); }).observe(document.documentElement, { childList: true, subtree: true });\n}());\n"],
  "mappings": "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",
  "names": ["label", "priceEl", "amount"]
}
