{
  "version": 3,
  "sources": ["/cdn/shop/t/42/assets/product-interactions.js?cb=1787240829"],
  "sourcesContent": ["class AveyProductFaq extends HTMLElement {\n  connectedCallback() {\n    if (this.dataset.initialized === 'true') return;\n    this.dataset.initialized = 'true';\n    this.prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)');\n    this.addEventListener('click', this.onClick);\n  }\n\n  disconnectedCallback() {\n    this.removeEventListener('click', this.onClick);\n  }\n\n  onClick = (event) => {\n    const summary = event.target.closest('summary');\n    const item = summary?.closest('details');\n    const answer = item?.querySelector('.avey-product-faq__answer');\n    const answerInner = item?.querySelector('.avey-product-faq__answer-inner');\n    if (!summary || !item || !answer || !answerInner || !this.contains(item)) return;\n\n    event.preventDefault();\n    if (item.dataset.animating === 'true') return;\n\n    const opening = !item.open;\n    if (this.prefersReducedMotion.matches) {\n      item.open = opening;\n      return;\n    }\n\n    if (opening) item.open = true;\n    item.dataset.animating = 'true';\n\n    const expandedHeight = answerInner.scrollHeight;\n    const animation = answer.animate(\n      opening\n        ? [\n            { height: '0px', opacity: 0, transform: 'translateY(-4px)' },\n            { height: `${expandedHeight}px`, opacity: 1, transform: 'translateY(0)' },\n          ]\n        : [\n            { height: `${expandedHeight}px`, opacity: 1, transform: 'translateY(0)' },\n            { height: '0px', opacity: 0, transform: 'translateY(-4px)' },\n          ],\n      {\n        duration: 260,\n        easing: 'cubic-bezier(0.22, 1, 0.36, 1)',\n      },\n    );\n\n    animation.finished\n      .catch(() => {})\n      .finally(() => {\n        if (!opening) item.open = false;\n        delete item.dataset.animating;\n        animation.cancel();\n      });\n  };\n}\n\nclass AveyProductTabs extends HTMLElement {\n  connectedCallback() {\n    if (this.dataset.initialized === 'true') return;\n    this.dataset.initialized = 'true';\n\n    this.bar = this.querySelector('.avey-product-tabs__bar');\n    this.links = [...this.querySelectorAll('[data-tab-target]')];\n    this.sections = [...this.querySelectorAll('[data-product-information-section]')];\n    this.headings = [...this.querySelectorAll('.avey-product-tabs__heading')];\n    this.frame = null;\n    this.scrollFrame = null;\n    this.pendingTargetId = null;\n    this.prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)');\n\n    this.addEventListener('click', this.onClick);\n    window.addEventListener('scroll', this.scheduleActiveSectionUpdate, { passive: true });\n    window.addEventListener('resize', this.scheduleLayout, { passive: true });\n    document.addEventListener('avey:overlay:close', this.scheduleLayout);\n\n    if ('ResizeObserver' in window) {\n      this.resizeObserver = new ResizeObserver(this.scheduleLayout);\n      if (this.bar) this.resizeObserver.observe(this.bar);\n    }\n    this.scheduleLayout();\n    this.activateRequestedTab();\n  }\n\n  disconnectedCallback() {\n    this.removeEventListener('click', this.onClick);\n    window.removeEventListener('scroll', this.scheduleActiveSectionUpdate);\n    window.removeEventListener('resize', this.scheduleLayout);\n    document.removeEventListener('avey:overlay:close', this.scheduleLayout);\n    window.removeEventListener('wheel', this.releaseActiveLink);\n    window.removeEventListener('touchstart', this.releaseActiveLink);\n    window.removeEventListener('pointerdown', this.releaseActiveLink);\n    this.resizeObserver?.disconnect();\n    this.sectionObserver?.disconnect();\n    if (this.frame) cancelAnimationFrame(this.frame);\n    if (this.scrollFrame) cancelAnimationFrame(this.scrollFrame);\n    if (this.sectionScrollFrame) cancelAnimationFrame(this.sectionScrollFrame);\n  }\n\n  onClick = (event) => {\n    const link = event.target.closest('[data-tab-target]');\n    if (!link || !this.contains(link)) return;\n\n    const section = this.querySelector(`#${CSS.escape(link.dataset.tabTarget)}`);\n    if (!section) return;\n\n    event.preventDefault();\n    this.setActiveLink(link, { center: true });\n    this.lockActiveLink(link);\n    this.scrollToSection(section, { preferNativeScroll: true });\n  };\n\n  activateRequestedTab() {\n    // The review module positions the expanded form after Judge.me has loaded.\n    if (new URLSearchParams(window.location.search).get('review') === 'write') return;\n    const requestedParameter = new URLSearchParams(window.location.search).get('product_tab');\n    const requestedHash = decodeURIComponent(window.location.hash.slice(1)).toLowerCase();\n    const requestedKind =\n      requestedHash === 'avis' || requestedHash === 'reviews' || requestedHash === 'judgeme_product_reviews'\n        ? 'reviews'\n        : requestedHash === 'composition'\n          ? 'composition'\n          : requestedParameter;\n\n    if (!requestedKind) return;\n\n    const section = this.sections.find(\n      (candidate) => candidate.dataset.productInformationKind === requestedKind,\n    );\n    if (!section) return;\n\n    const link = this.links.find((candidate) => candidate.dataset.tabTarget === section.id);\n    if (!link) return;\n\n    this.setActiveLink(link, { center: true });\n    this.lockActiveLink(link);\n\n    const activateLink = () => {\n      requestAnimationFrame(() => {\n        requestAnimationFrame(() => this.scrollToSection(section));\n      });\n    };\n\n    if (document.readyState === 'complete') activateLink();\n    else window.addEventListener('pageshow', activateLink, { once: true });\n  }\n\n  scrollToSection(\n    section,\n    { preferNativeScroll = false, anticipateAnnouncementCollapse = false } = {},\n  ) {\n    if (this.sectionScrollFrame) cancelAnimationFrame(this.sectionScrollFrame);\n\n    const scrollMargin = () => Number.parseFloat(getComputedStyle(section).scrollMarginTop) || 0;\n    const remainingAnnouncementHeight = () => {\n      if (!anticipateAnnouncementCollapse) return 0;\n\n      const announcement = document.querySelector('avey-announcement');\n      const progress = window.matchMedia('(min-width: 1024px)').matches\n        ? Number.parseFloat(\n          getComputedStyle(document.documentElement).getPropertyValue('--avey-announcement-progress'),\n        )\n        : Number(document.documentElement.hasAttribute('data-avey-announcement-hidden'));\n      if (!announcement || !Number.isFinite(progress)) return 0;\n\n      const clampedProgress = Math.min(1, Math.max(0, progress));\n      return announcement.getBoundingClientRect().height * (1 - clampedProgress);\n    };\n    const targetPosition = () =>\n      window.scrollY\n      + section.getBoundingClientRect().top\n      - scrollMargin()\n      + remainingAnnouncementHeight();\n\n    if (preferNativeScroll && window.matchMedia('(max-width: 767px)').matches) {\n      window.scrollTo({\n        top: Math.max(0, targetPosition()),\n        behavior: this.prefersReducedMotion.matches ? 'auto' : 'smooth',\n      });\n      return;\n    }\n\n    if (this.prefersReducedMotion.matches) {\n      window.scrollTo({ top: Math.max(0, targetPosition()), behavior: 'auto' });\n      return;\n    }\n\n    const startPosition = window.scrollY;\n    const startedAt = performance.now();\n    const duration = 600;\n\n    const animate = (currentTime) => {\n      const progress = Math.min(1, (currentTime - startedAt) / duration);\n      const easedProgress = 1 - Math.pow(1 - progress, 3);\n      const target = Math.max(0, targetPosition());\n\n      window.scrollTo({\n        top: Math.round(startPosition + (target - startPosition) * easedProgress),\n        behavior: 'auto',\n      });\n\n      if (progress < 1) {\n        this.sectionScrollFrame = requestAnimationFrame(animate);\n      } else {\n        window.scrollTo({ top: Math.round(target), behavior: 'auto' });\n        this.sectionScrollFrame = null;\n      }\n    };\n\n    this.sectionScrollFrame = requestAnimationFrame(animate);\n  }\n\n  scheduleActiveSectionUpdate = () => {\n    if (this.scrollFrame) return;\n    this.scrollFrame = requestAnimationFrame(() => {\n      this.scrollFrame = null;\n      this.updateActiveSection();\n    });\n  };\n\n  scheduleLayout = () => {\n    if (this.frame) return;\n    this.frame = requestAnimationFrame(() => {\n      this.frame = null;\n      this.updateGeometry();\n      this.createSectionObserver();\n      this.updateActiveSection();\n    });\n  };\n\n  updateGeometry() {\n    const barHeight = Math.ceil(this.bar?.getBoundingClientRect().height || 50);\n    this.style.setProperty('--avey-product-tabs-height', `${barHeight}px`);\n  }\n\n  get stickyOffset() {\n    const barTop = Number.parseFloat(this.bar ? getComputedStyle(this.bar).top : '');\n    const root = getComputedStyle(document.documentElement);\n    const rootHeaderHeight = Number.parseFloat(root.getPropertyValue('--avey-header-height'));\n    const headerHeight = Number.isFinite(barTop)\n      ? barTop\n      : (Number.isFinite(rootHeaderHeight) ? rootHeaderHeight : 0);\n    const barHeight = Math.ceil(this.bar?.getBoundingClientRect().height || 50);\n    return headerHeight + barHeight;\n  }\n\n  createSectionObserver() {\n    this.sectionObserver?.disconnect();\n    if (!('IntersectionObserver' in window) || this.sections.length === 0) return;\n\n    const offset = Math.ceil(this.stickyOffset);\n    const bottomMargin = Math.max(0, window.innerHeight - offset - 2);\n    this.sectionObserver = new IntersectionObserver(this.updateActiveSection, {\n      rootMargin: `${-offset}px 0px ${-bottomMargin}px 0px`,\n      threshold: 0,\n    });\n\n    this.sections.forEach((section) => this.sectionObserver.observe(section));\n  }\n\n  updateActiveSection = () => {\n    const engagedHeadingIndex = this.updateStickyHeadings();\n    if (this.sections.length === 0) return;\n\n    if (this.pendingTargetId) {\n      const pendingLink = this.links.find((link) => link.dataset.tabTarget === this.pendingTargetId);\n      if (pendingLink) this.setActiveLink(pendingLink);\n      return;\n    }\n\n    const activationLine = this.stickyOffset + 1;\n    let activeSection = this.sections[0];\n    const pageBottom = Math.ceil(window.scrollY + window.innerHeight);\n    const documentBottom = document.documentElement.scrollHeight;\n\n    if (pageBottom >= documentBottom - 2) {\n      activeSection = this.sections[this.sections.length - 1];\n    } else {\n      this.sections.forEach((section) => {\n        const rect = section.getBoundingClientRect();\n        if (rect.top <= activationLine && rect.bottom > activationLine) activeSection = section;\n      });\n\n      if (Number.isInteger(engagedHeadingIndex)) {\n        activeSection = this.sections[engagedHeadingIndex] || activeSection;\n      }\n    }\n\n    const activeLink = this.links.find((link) => link.dataset.tabTarget === activeSection.id);\n    if (activeLink) this.setActiveLink(activeLink);\n  };\n\n  updateStickyHeadings() {\n    let engagedHeadingIndex = null;\n\n    this.headings.forEach((heading, index) => {\n      const section = heading.closest('[data-product-information-section]');\n      const stickyTop = Number.parseFloat(getComputedStyle(heading).top);\n      const headingRect = heading.getBoundingClientRect();\n      const sectionRect = section?.getBoundingClientRect();\n      const isPinned =\n        Number.isFinite(stickyTop)\n        && headingRect.top <= stickyTop + 1\n        && sectionRect\n        && sectionRect.bottom > stickyTop + headingRect.height;\n\n      if (isPinned) engagedHeadingIndex = index;\n      if (Number.isFinite(stickyTop) && headingRect.top < stickyTop - 1 && this.headings[index + 1]) {\n        engagedHeadingIndex = index + 1;\n      }\n    });\n\n    this.headings.forEach((heading, index) => {\n      heading.classList.toggle('is-sticky', index === engagedHeadingIndex);\n    });\n\n    return engagedHeadingIndex;\n  }\n\n  lockActiveLink(link) {\n    this.pendingTargetId = link.dataset.tabTarget;\n    window.addEventListener('wheel', this.releaseActiveLink, { passive: true });\n    window.addEventListener('touchstart', this.releaseActiveLink, { passive: true });\n    window.addEventListener('pointerdown', this.releaseActiveLink, { passive: true });\n  }\n\n  releaseActiveLink = () => {\n    this.pendingTargetId = null;\n    if (this.sectionScrollFrame) {\n      cancelAnimationFrame(this.sectionScrollFrame);\n      this.sectionScrollFrame = null;\n    }\n    window.removeEventListener('wheel', this.releaseActiveLink);\n    window.removeEventListener('touchstart', this.releaseActiveLink);\n    window.removeEventListener('pointerdown', this.releaseActiveLink);\n    this.updateActiveSection();\n  };\n\n  setActiveLink(activeLink, { center = false } = {}) {\n    const wasActive = activeLink.getAttribute('aria-current') === 'location';\n\n    if (!wasActive) {\n      this.links.forEach((link) => {\n        if (link === activeLink) link.setAttribute('aria-current', 'location');\n        else link.removeAttribute('aria-current');\n      });\n    }\n\n    this.keepActiveLinkVisible(activeLink, { center });\n  }\n\n  keepActiveLinkVisible(activeLink, { center = false } = {}) {\n    if (!this.bar) return;\n\n    const barRect = this.bar.getBoundingClientRect();\n    const linkRect = activeLink.getBoundingClientRect();\n    const outsideVisibleArea = linkRect.left < barRect.left || linkRect.right > barRect.right;\n    if (!center && !outsideVisibleArea) return;\n\n    const targetLeft = activeLink.offsetLeft - (this.bar.clientWidth - activeLink.offsetWidth) / 2;\n    this.bar.scrollTo({\n      left: Math.max(0, targetLeft),\n      behavior: this.prefersReducedMotion.matches ? 'auto' : 'smooth',\n    });\n  }\n}\n\nfunction updateAveyShadeSelectVisual(select) {\n  const visual = select.closest('[data-shade-select]')?.querySelector('[data-shade-select-visual]');\n  const option = select.selectedOptions[0];\n  if (!visual || !option) return;\n\n  const image = option.dataset.shadeImage || '';\n  visual.classList.toggle('avey-shade-select__visual--fallback', !image);\n  visual.style.setProperty('--avey-shade-image', image ? `url(\"${image}\")` : 'none');\n}\n\nclass AveyProduct extends HTMLElement {\n  connectedCallback() {\n    if (this.dataset.initialized === 'true') return;\n    this.dataset.initialized = 'true';\n    this.variantData = this.readVariantData();\n    this.optionSelectors = [...this.querySelectorAll('[data-option-position]')];\n    this.ratingLink = this.querySelector('.avey-product__rating[href^=\"#\"]');\n    this.backToTop = this.querySelector('[data-product-back-to-top]');\n    this.backToTopFrame = null;\n    this.backToTopScrollFrame = null;\n    this.optionSelectors.forEach((selector) => selector.addEventListener('change', this.onOptionChange));\n    this.ratingLink?.addEventListener('click', this.onRatingClick);\n    this.backToTop?.addEventListener('click', this.onBackToTop);\n    if (this.backToTop) {\n      window.addEventListener('scroll', this.scheduleBackToTop, { passive: true });\n      window.addEventListener('resize', this.scheduleBackToTop, { passive: true });\n      this.scheduleBackToTop();\n    }\n  }\n\n  disconnectedCallback() {\n    this.optionSelectors?.forEach((selector) => selector.removeEventListener('change', this.onOptionChange));\n    this.ratingLink?.removeEventListener('click', this.onRatingClick);\n    this.backToTop?.removeEventListener('click', this.onBackToTop);\n    window.removeEventListener('scroll', this.scheduleBackToTop);\n    window.removeEventListener('resize', this.scheduleBackToTop);\n    if (this.backToTopFrame) cancelAnimationFrame(this.backToTopFrame);\n    if (this.backToTopScrollFrame) cancelAnimationFrame(this.backToTopScrollFrame);\n  }\n\n  onRatingClick = (event) => {\n    const targetId = this.ratingLink?.hash.slice(1);\n    if (!targetId) return;\n\n    const target = document.getElementById(targetId);\n    if (!target) return;\n    event.preventDefault();\n\n    const tabLink = this.querySelector(\n      `[data-tab-target=\"${CSS.escape(targetId)}\"]`,\n    );\n    if (tabLink) {\n      const tabs = tabLink.closest('avey-product-tabs');\n      if (tabs?.scrollToSection) {\n        tabs.setActiveLink(tabLink, { center: true });\n        tabs.lockActiveLink(tabLink);\n        tabs.scrollToSection(target, {\n          preferNativeScroll: true,\n          anticipateAnnouncementCollapse: true,\n        });\n      } else {\n        tabLink.click();\n      }\n      return;\n    }\n\n    const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    target.scrollIntoView({ behavior: reduceMotion ? 'auto' : 'smooth', block: 'start' });\n  };\n\n  onBackToTop = () => {\n    const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    const startPosition = window.scrollY;\n    if (reduceMotion || startPosition <= 0) {\n      window.scrollTo({ top: 0, behavior: 'auto' });\n      return;\n    }\n\n    if (this.backToTopScrollFrame) cancelAnimationFrame(this.backToTopScrollFrame);\n    const startedAt = performance.now();\n    const duration = 320;\n\n    const animate = (currentTime) => {\n      const progress = Math.min(1, (currentTime - startedAt) / duration);\n      const easedProgress = 1 - Math.pow(1 - progress, 3);\n      window.scrollTo({ top: Math.round(startPosition * (1 - easedProgress)), behavior: 'auto' });\n\n      if (progress < 1) {\n        this.backToTopScrollFrame = requestAnimationFrame(animate);\n      } else {\n        this.backToTopScrollFrame = null;\n      }\n    };\n\n    this.backToTopScrollFrame = requestAnimationFrame(animate);\n  };\n\n  scheduleBackToTop = () => {\n    if (this.backToTopFrame) return;\n    this.backToTopFrame = requestAnimationFrame(() => {\n      this.backToTopFrame = null;\n      this.updateBackToTop();\n    });\n  };\n\n  updateBackToTop() {\n    if (!this.backToTop) return;\n    const desktop = window.matchMedia('(min-width: 1024px)').matches;\n    const productTabs = this.querySelector('.avey-product-tabs');\n    const productTabsBar = productTabs?.querySelector('.avey-product-tabs__bar');\n    const tabsStickyTop = Number.parseFloat(productTabsBar ? getComputedStyle(productTabsBar).top : '') || 0;\n    const tabsBarRect = productTabsBar?.getBoundingClientRect();\n\n    if (desktop && tabsBarRect) {\n      const viewportInset = 8;\n      const buttonSize = Math.round(tabsBarRect.height);\n      const left = Math.max(viewportInset, tabsBarRect.left - buttonSize);\n      const positionProperties = {\n        '--avey-product-back-to-top-left': `${left}px`,\n        '--avey-product-back-to-top-top': `${tabsStickyTop}px`,\n        '--avey-product-back-to-top-size': `${buttonSize}px`,\n      };\n\n      Object.entries(positionProperties).forEach(([property, value]) => {\n        if (this.backToTop.style.getPropertyValue(property) !== value) {\n          this.backToTop.style.setProperty(property, value);\n        }\n      });\n    }\n\n    const hasReachedTabs =\n      productTabs\n      && productTabs.getBoundingClientRect().top <= tabsStickyTop + 1;\n    const tabsBarIsPinned =\n      tabsBarRect\n      && tabsBarRect.top >= tabsStickyTop - 1;\n    const exitsTowardHeader =\n      desktop\n      && hasReachedTabs\n      && !tabsBarIsPinned;\n    const visible =\n      desktop\n      && hasReachedTabs\n      && tabsBarIsPinned;\n\n    this.backToTop.classList.toggle('is-visible', visible);\n    this.backToTop.classList.toggle('is-exiting-at-footer', exitsTowardHeader);\n    this.backToTop.toggleAttribute('inert', !visible);\n    this.backToTop.setAttribute('aria-hidden', String(!visible));\n    this.backToTop.tabIndex = visible ? 0 : -1;\n  }\n\n  readVariantData() {\n    const node = this.querySelector('[data-product-variants]');\n    if (!node) return [];\n    try {\n      return JSON.parse(node.textContent);\n    } catch (error) {\n      console.warn('Avey product variants could not be read.', error);\n      return [];\n    }\n  }\n\n  onOptionChange = (event) => {\n    if (event?.target?.matches('[data-product-shade]')) {\n      updateAveyShadeSelectVisual(event.target);\n    }\n    const selectedOptions = this.optionSelectors.map((selector) => selector.value);\n    const variant = this.variantData.find((candidate) =>\n      candidate.options.every((option, index) => option === selectedOptions[index])\n    );\n    if (!variant) return;\n\n    this.updateVariant(variant);\n  };\n\n  updateVariant(variant) {\n    const form = this.querySelector('[data-product-form]');\n    const idInput = form?.querySelector('[data-variant-id]');\n    const price = this.querySelector('[data-product-price]');\n    const comparePrice = this.querySelector('[data-compare-price]');\n    const button = form?.querySelector('[data-add-to-cart]');\n    const label = form?.querySelector('[data-add-to-cart-label]');\n    const buttonPrice = form?.querySelector('[data-add-to-cart-price]');\n    const buttonSeparator = form?.querySelector('[data-add-to-cart-separator]');\n\n    if (idInput) idInput.value = variant.id;\n    if (price) price.textContent = variant.price;\n    if (comparePrice) {\n      comparePrice.hidden = !variant.compareAtPrice;\n      comparePrice.textContent = variant.compareAtPrice || '';\n    }\n    if (button) button.disabled = !variant.available;\n    if (buttonPrice) {\n      buttonPrice.textContent = variant.price;\n      buttonPrice.hidden = !variant.available;\n    }\n    if (buttonSeparator) buttonSeparator.hidden = !variant.available;\n    if (label) {\n      label.textContent = variant.available\n        ? button?.dataset.availableLabel || 'Add to cart'\n        : button?.dataset.soldOutLabel || 'Sold out';\n    }\n\n    if (variant.featuredMediaId) {\n      this.querySelector('avey-product-gallery')?.showMedia(variant.featuredMediaId);\n    }\n\n    this.dispatchEvent(new CustomEvent('avey:variant:change', {\n      bubbles: true,\n      detail: { total: variant.price, available: variant.available },\n    }));\n\n    const url = new URL(window.location.href);\n    url.searchParams.set('variant', variant.id);\n    window.history.replaceState({}, '', url);\n  }\n}\n\nclass AveyBundleSelector extends HTMLElement {\n  connectedCallback() {\n    if (this.dataset.initialized === 'true') return;\n    window.AveyBottleExperiment?.prepareProduct(this);\n    this.dataset.initialized = 'true';\n\n    this.form = this.querySelector('[data-bundle-form]');\n    this.cards = [...this.querySelectorAll('[data-bundle-card]')];\n\n    // Shopify's storefront HTML optimizer currently removes WebMCP attributes\n    // emitted by Liquid. Restore them on the live component without adding\n    // another request or changing the customer's submission flow.\n    if (this.form) {\n      this.form.setAttribute('toolname', 'configure_avey_bundle');\n      this.form.setAttribute(\n        'tooldescription',\n        'Configure an Avey product bundle by choosing the number of products and the shade for each item, then add the configured bundle to the cart.',\n      );\n    }\n    this.cards.forEach((card, cardIndex) => {\n      const offerNumber = cardIndex + 1;\n      const radio = card.querySelector('[data-bundle-radio]');\n      radio?.setAttribute('toolparamdescription', 'Select this bundle offer.');\n\n      card.querySelectorAll('[data-bundle-shade]').forEach((select, shadeIndex) => {\n        select.name = `bundle_${offerNumber}_shade_${shadeIndex + 1}`;\n        select.setAttribute(\n          'toolparamdescription',\n          `Choose the shade for item ${shadeIndex + 1} in bundle offer ${offerNumber}.`,\n        );\n      });\n    });\n    this.submitButton = this.querySelector('[data-add-to-cart]');\n    this.submitLabel = this.querySelector('[data-add-to-cart-label]');\n    this.submitPrice = this.querySelector('[data-add-to-cart-price]');\n    this.submitSeparator = this.querySelector('[data-add-to-cart-separator]');\n    this.error = this.querySelector('[data-bundle-error]');\n\n    this.addEventListener('change', this.onChange);\n    this.form?.addEventListener('submit', this.onSubmit);\n    this.restoreLinkedQuantity();\n    this.updateSelection({ announce: false });\n  }\n\n  disconnectedCallback() {\n    this.removeEventListener('change', this.onChange);\n    this.form?.removeEventListener('submit', this.onSubmit);\n  }\n\n  get selectedCard() {\n    const selectedRadio = this.querySelector('[data-bundle-radio]:checked');\n    return selectedRadio?.closest('[data-bundle-card]') || this.cards[0] || null;\n  }\n\n  restoreLinkedQuantity() {\n    const requested = new URLSearchParams(window.location.search).get('bundle_quantity');\n    if (!/^[1-9]\\d*$/.test(requested || '') || !Number.isSafeInteger(Number(requested))) return;\n    const available = this.cards.filter((card) => {\n      const radio = card.querySelector('[data-bundle-radio]');\n      return radio && !radio.disabled;\n    });\n    const card = available.find((item) => Number(item.dataset.quantity) === Number(requested))\n      || available.find((item) => Number(item.dataset.quantity) === 1);\n    if (card) card.querySelector('[data-bundle-radio]').checked = true;\n  }\n\n  onChange = (event) => {\n    if (!event.target.matches('[data-bundle-radio], [data-bundle-shade]')) return;\n    if (event.target.matches('[data-bundle-shade]')) {\n      updateAveyShadeSelectVisual(event.target);\n    }\n    this.updateSelection();\n  };\n\n  updateSelection({ announce = true } = {}) {\n    const selectedCard = this.selectedCard;\n    if (!selectedCard) return;\n\n    this.cards.forEach((card) => {\n      const active = card === selectedCard;\n      card.classList.toggle('is-selected', active);\n      const configuration = card.querySelector('[data-bundle-configuration]');\n      if (configuration) configuration.hidden = !active;\n    });\n\n    const selectedVariants = this.selectedVariantIds;\n    const product = this.closest('avey-product');\n    const firstVariant = product?.variantData?.find(\n      (variant) => String(variant.id) === selectedVariants[0]\n    );\n    if (firstVariant) product.updateVariant(firstVariant);\n\n    const allAvailable = selectedVariants.length === Number(selectedCard.dataset.quantity)\n      && selectedVariants.every((id) =>\n        product?.variantData?.some((variant) => String(variant.id) === id && variant.available)\n      );\n    if (this.submitButton) this.submitButton.disabled = !allAvailable;\n    if (this.submitPrice) this.submitPrice.textContent = selectedCard.dataset.bundleTotal || '';\n\n    if (announce) {\n      this.dispatchEvent(new CustomEvent('avey:bundle:change', {\n        bubbles: true,\n        detail: {\n          quantity: Number(selectedCard.dataset.quantity),\n          label: selectedCard.dataset.bundleLabel,\n          total: selectedCard.dataset.bundleTotal,\n          unit: selectedCard.dataset.bundleUnit,\n          shadesLabel: selectedCard.dataset.shadesLabel,\n          variantIds: selectedVariants,\n        },\n      }));\n    }\n  }\n\n  get selectedVariantIds() {\n    const card = this.selectedCard;\n    if (!card) return [];\n    const selectors = [...card.querySelectorAll('[data-bundle-shade]')];\n    if (selectors.length > 0) return selectors.map((selector) => selector.value);\n\n    const product = this.closest('avey-product');\n    const firstVariant = product?.variantData?.find((variant) => variant.available);\n    const quantity = Number(card.dataset.quantity || 1);\n    return firstVariant ? Array(quantity).fill(String(firstVariant.id)) : [];\n  }\n\n  buildItems() {\n    const quantitiesByVariant = new Map();\n    this.selectedVariantIds.forEach((id) => {\n      quantitiesByVariant.set(id, (quantitiesByVariant.get(id) || 0) + 1);\n    });\n    const giftVariantId = Number(this.selectedCard?.dataset.giftVariantId || 0);\n    const offerSource = this.selectedCard?.dataset.offerSource || '';\n    const offerQualifyingTotalCents = this.selectedCard?.dataset.offerQualifyingTotalCents || '';\n    const items = [...quantitiesByVariant].map(([id, quantity]) => {\n      const item = { id: Number(id), quantity };\n      if (offerSource) {\n        item.properties = {\n          _avey_offer_source: offerSource,\n          _avey_offer_qualifying_total_cents: offerQualifyingTotalCents,\n        };\n      }\n      return item;\n    });\n\n    if (giftVariantId) {\n      items.push({\n        id: giftVariantId,\n        quantity: 1,\n        properties: {\n          _avey_add_source: this.selectedCard.dataset.giftSource,\n        },\n      });\n    }\n\n    return items;\n  }\n\n  onSubmit = async (event) => {\n    event.preventDefault();\n    if (this.submitButton?.disabled || this.dataset.submitting === 'true') return;\n\n    const items = this.buildItems();\n    const attribution = window.AveyBottleExperiment?.properties() || {};\n    if (Object.keys(attribution).length) items.forEach(item => { item.properties = { ...item.properties, ...attribution }; });\n    if (items.length === 0) return;\n\n    this.dataset.submitting = 'true';\n    this.setButtonState('loading');\n    this.setError('');\n\n    try {\n      const drawer = document.querySelector('[data-cart-drawer-section]');\n      const sectionId = drawer?.dataset.sectionId;\n      const payload = { items };\n      if (sectionId) {\n        payload.sections = [sectionId];\n        payload.sections_url = window.location.pathname;\n      }\n\n      const response = await fetch(`${window.Shopify.routes.root}cart/add.js`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          Accept: 'application/json',\n        },\n        body: JSON.stringify(payload),\n      });\n\n      const result = await response.json();\n      if (!response.ok) throw new Error(result.description || result.message || 'Cart error');\n\n      const cartResponse = await fetch(`${window.Shopify.routes.root}cart.js`, {\n        headers: { Accept: 'application/json' },\n      });\n      const cart = cartResponse.ok ? await cartResponse.json() : null;\n\n      this.setButtonState('success');\n      if (cart) this.updateCartCount(cart.item_count);\n      await new Promise((resolve) => window.setTimeout(resolve, 420));\n      document.dispatchEvent(new CustomEvent('avey:cart:added', {\n        detail: {\n          items: result.items || [],\n          cart,\n          sections: result.sections || {},\n          source: 'product-bundle',\n          opener: this.submitButton,\n        },\n      }));\n\n      window.setTimeout(() => this.setButtonState('available'), 900);\n    } catch (error) {\n      this.setButtonState('error');\n      this.setError(error.message);\n      window.setTimeout(() => this.setButtonState('available'), 1600);\n    } finally {\n      this.dataset.submitting = 'false';\n    }\n  };\n\n  setButtonState(state) {\n    if (!this.submitButton || !this.submitLabel) return;\n\n    const labels = {\n      available: this.submitButton.dataset.availableLabel,\n      loading: this.submitButton.dataset.loadingLabel,\n      success: this.submitButton.dataset.successLabel,\n      error: this.submitButton.dataset.errorLabel,\n    };\n    this.submitButton.dataset.addState = state;\n    this.submitLabel.textContent = labels[state] || labels.available;\n    if (this.submitPrice) this.submitPrice.hidden = state !== 'available';\n    if (this.submitSeparator) this.submitSeparator.hidden = state !== 'available';\n    this.submitButton.setAttribute('aria-busy', String(state === 'loading'));\n    this.submitButton.disabled = state === 'loading';\n    this.dispatchEvent(new CustomEvent('avey:cart:add-state', {\n      bubbles: true,\n      detail: { state, label: this.submitLabel.textContent },\n    }));\n  }\n\n  setError(message) {\n    if (!this.error) return;\n    this.error.textContent = message;\n    this.error.hidden = !message;\n  }\n\n  updateCartCount(itemCount) {\n    document.querySelectorAll('.avey-header__cart').forEach((cartLink) => {\n      let count = cartLink.querySelector('.avey-header__cart-count');\n      if (itemCount <= 0) {\n        count?.remove();\n        return;\n      }\n\n      if (!count) {\n        count = document.createElement('span');\n        count.className = 'avey-header__cart-count';\n        cartLink.append(count);\n      }\n      count.textContent = String(itemCount);\n    });\n  }\n}\n\nclass AveyShadeGuide extends HTMLElement {\n  connectedCallback() {\n    if (this.dataset.initialized === 'true') return;\n    this.dataset.initialized = 'true';\n    this.product = this.closest('avey-product');\n    this.overlay = this.closest('dialog[data-avey-overlay]');\n    this.premium = this.classList.contains('avey-shade-guide--premium');\n    this.previewImage = this.querySelector('[data-avey-shade-preview-image]');\n    this.previewMedia = this.querySelector('[data-avey-shade-preview-media]');\n    this.previewTrack = this.querySelector('[data-avey-shade-preview-track]');\n    this.previewSlides = [...this.querySelectorAll('[data-avey-shade-slide]')];\n    this.previewPreviousButton = this.querySelector('[data-avey-shade-previous]');\n    this.previewNextButton = this.querySelector('[data-avey-shade-next]');\n    this.previewLabel = this.querySelector('[data-avey-shade-preview-label]');\n    this.previewDescription = this.querySelector('[data-avey-shade-preview-description]');\n    this.confirmButton = this.querySelector('[data-avey-shade-confirm]');\n    this.profileButtons = [...this.querySelectorAll('[data-avey-shade-profile]')];\n    this.activeProfile = this.profileButtons.find((button) => button.getAttribute('aria-pressed') === 'true')\n      ?.dataset.aveyShadeProfile || 'female';\n    this.previewPreloads = [];\n    this.secondaryProfilePreload = null;\n    this.isOverlayOpen = false;\n    this.addEventListener('click', this.onClick);\n    this.addEventListener('keydown', this.onKeydown);\n    this.overlay?.addEventListener('avey:overlay:request-close', this.onOverlayRequestClose);\n    this.previewTrack?.addEventListener('scroll', this.onPreviewTrackScroll, { passive: true });\n    document.addEventListener('avey:overlay:open', this.onOverlayOpen);\n    document.addEventListener('avey:overlay:close', this.onOverlayClose);\n    this.product?.addEventListener('avey:bundle:change', this.onProductChange);\n    this.product?.addEventListener('avey:variant:change', this.onProductChange);\n    this.updateAvailability();\n    this.updateSelection();\n  }\n\n  disconnectedCallback() {\n    this.removeEventListener('click', this.onClick);\n    this.removeEventListener('keydown', this.onKeydown);\n    this.overlay?.removeEventListener('avey:overlay:request-close', this.onOverlayRequestClose);\n    this.previewTrack?.removeEventListener('scroll', this.onPreviewTrackScroll);\n    document.removeEventListener('avey:overlay:open', this.onOverlayOpen);\n    document.removeEventListener('avey:overlay:close', this.onOverlayClose);\n    this.product?.removeEventListener('avey:bundle:change', this.onProductChange);\n    this.product?.removeEventListener('avey:variant:change', this.onProductChange);\n    window.clearTimeout(this.confirmationTimer);\n    window.cancelAnimationFrame(this.previewTrackFrame);\n  }\n\n  normalize(value) {\n    return value.trim().toLocaleLowerCase(document.documentElement.lang || undefined);\n  }\n\n  findOption(select, shadeName) {\n    const normalizedShade = this.normalize(shadeName);\n    return [...select.options].find(\n      (option) => this.normalize(option.dataset.optionName || option.textContent) === normalizedShade,\n    );\n  }\n\n  get activeShadeSelectors() {\n    const selectedCard = this.product?.querySelector('[data-bundle-card].is-selected');\n    if (selectedCard) return [...selectedCard.querySelectorAll('[data-bundle-shade]')];\n    return [...(this.product?.querySelectorAll('[data-product-shade]') || [])];\n  }\n\n  get proShadeFields() {\n    return [...(this.product?.querySelectorAll('[data-pro-shade-name]') || [])];\n  }\n\n  findProShade(shadeName) {\n    return this.proShadeFields.find((field) => this.normalize(field.dataset.proShadeName) === this.normalize(shadeName));\n  }\n\n  updateAvailability() {\n    const referenceSelect = this.activeShadeSelectors[0];\n    this.querySelectorAll('[data-avey-shade-name]').forEach((button) => {\n      const option = this.proShadeFields.length\n        ? this.findProShade(button.dataset.aveyShadeName)\n        : referenceSelect && this.findOption(referenceSelect, button.dataset.aveyShadeName);\n      button.disabled = !option || option.disabled;\n    });\n  }\n\n  updateSelection() {\n    const selectors = this.activeShadeSelectors;\n    const selectedNames = this.proShadeFields.length\n      ? this.proShadeFields.filter((field) => !field.disabled && Number(field.value) > 0).map((field) => this.normalize(field.dataset.proShadeName))\n      : selectors\n      .map((select) => select.selectedOptions[0]?.dataset.optionName || select.selectedOptions[0]?.textContent || '')\n      .filter(Boolean)\n      .map((name) => this.normalize(name));\n    const sharedShade = selectedNames.length > 0 && selectedNames.every((name) => name === selectedNames[0])\n      ? selectedNames[0]\n      : '';\n    const previewShade = sharedShade || selectedNames[0] || '';\n\n    let selectedButton = null;\n    this.querySelectorAll('[data-avey-shade-name]').forEach((button) => {\n      const current = sharedShade !== '' && this.normalize(button.dataset.aveyShadeName) === sharedShade;\n      const previewed = previewShade !== '' && this.normalize(button.dataset.aveyShadeName) === previewShade;\n      button.toggleAttribute('data-current-shade', current);\n      if (previewed) selectedButton = button;\n      if (!this.premium) button.setAttribute('aria-pressed', String(current));\n    });\n\n    if (this.premium) {\n      const fallbackButton = this.querySelector('[data-avey-shade-name]:not(:disabled)');\n      this.setPreview(selectedButton || fallbackButton);\n    }\n  }\n\n  setPreview(button, { syncTrack = true, animateTrack = false, instant = false } = {}) {\n    if (!this.premium || !button || button.disabled) return;\n\n    this.previewButton = button;\n    this.querySelectorAll('[data-avey-shade-name]').forEach((item) => {\n      item.setAttribute('aria-pressed', String(item === button));\n    });\n\n    if (this.previewLabel) this.previewLabel.textContent = button.dataset.aveyShadeName || '';\n    if (this.previewDescription) {\n      this.previewDescription.textContent = button.dataset.aveyShadeDescription || '';\n    }\n    if (this.confirmButton) {\n      this.confirmButton.textContent = button.dataset.aveyShadeConfirmLabel || '';\n    }\n    this.updatePreviewControls(button);\n\n    if (syncTrack) this.syncPreviewTrack(button, animateTrack);\n\n    const source = button.dataset.aveyShadePreviewSrc;\n    if (!this.previewImage || !source) return;\n    this.previewImage.alt = button.dataset.aveyShadePreviewAlt || button.dataset.aveyShadeName || '';\n    if (!this.isOverlayOpen) return;\n    if (this.previewImage.getAttribute('src') === source) return;\n\n    if (instant) {\n      this.previewMedia?.classList.remove('is-loading');\n    } else {\n      this.previewMedia?.classList.add('is-loading');\n      this.previewImage.addEventListener('load', this.onPreviewLoad, { once: true });\n      this.previewImage.addEventListener('error', this.onPreviewLoad, { once: true });\n    }\n    this.previewImage.src = source;\n  }\n\n  updatePreviewControls(button = this.previewButton) {\n    const buttons = [...this.querySelectorAll('[data-avey-shade-name]')].filter((item) => !item.disabled);\n    const index = buttons.indexOf(button);\n    if (this.previewPreviousButton) this.previewPreviousButton.disabled = index <= 0;\n    if (this.previewNextButton) this.previewNextButton.disabled = index < 0 || index >= buttons.length - 1;\n  }\n\n  showRelativePreview(direction) {\n    const buttons = [...this.querySelectorAll('[data-avey-shade-name]')].filter((item) => !item.disabled);\n    const currentIndex = buttons.indexOf(this.previewButton);\n    const target = buttons[currentIndex + direction];\n    if (!target) return;\n    this.setPreview(target, { syncTrack: true, animateTrack: false, instant: true });\n  }\n\n  setProfile(profile) {\n    if (!this.premium || !['female', 'male'].includes(profile) || profile === this.activeProfile) return;\n\n    this.activeProfile = profile;\n    this.profileButtons.forEach((button) => {\n      button.setAttribute('aria-pressed', String(button.dataset.aveyShadeProfile === profile));\n    });\n\n    this.querySelectorAll('[data-avey-shade-name]').forEach((button) => {\n      const source = profile === 'male'\n        ? button.dataset.aveyShadePreviewSrcMale\n        : button.dataset.aveyShadePreviewSrcFemale;\n      const alt = profile === 'male'\n        ? button.dataset.aveyShadePreviewAltMale\n        : button.dataset.aveyShadePreviewAltFemale;\n      if (source) button.dataset.aveyShadePreviewSrc = source;\n      if (alt) button.dataset.aveyShadePreviewAlt = alt;\n    });\n\n    this.previewSlides.forEach((image) => {\n      const source = profile === 'male'\n        ? image.dataset.aveyShadeSlideSrcMale\n        : image.dataset.aveyShadeSlideSrcFemale;\n      const alt = profile === 'male'\n        ? image.dataset.aveyShadeSlideAltMale\n        : image.dataset.aveyShadeSlideAltFemale;\n      image.removeAttribute('src');\n      if (source) image.dataset.src = source;\n      if (alt) image.alt = alt;\n    });\n\n    this.previewPreloads = [];\n    if (this.isOverlayOpen) this.preloadAllPreviews();\n    this.setPreview(this.previewButton || this.querySelector('[data-avey-shade-name]:not(:disabled)'), {\n      syncTrack: true,\n      instant: false,\n    });\n  }\n\n  clearConfirmation() {\n    window.clearTimeout(this.confirmationTimer);\n    this.querySelectorAll('.is-confirmed').forEach((button) => button.classList.remove('is-confirmed'));\n  }\n\n  onOverlayOpen = (event) => {\n    if (!event.detail?.overlay?.contains(this)) return;\n    this.isOverlayOpen = true;\n    this.preloadAllPreviews();\n    this.clearConfirmation();\n    this.updateAvailability();\n    this.updateSelection();\n    this.preloadSecondaryProfilePreview();\n  };\n\n  onOverlayClose = (event) => {\n    if (!event.detail?.overlay?.contains(this)) return;\n    this.isOverlayOpen = false;\n    this.closeInfo(false);\n    this.clearConfirmation();\n  };\n\n  onProductChange = () => {\n    this.updateAvailability();\n    this.updateSelection();\n  };\n\n  onPreviewLoad = () => {\n    this.previewMedia?.classList.remove('is-loading');\n  };\n\n  onPreviewTrackScroll = () => {\n    window.cancelAnimationFrame(this.previewTrackFrame);\n    this.previewTrackFrame = window.requestAnimationFrame(() => {\n      if (!this.previewTrack || this.previewSlides.length === 0) return;\n      const slideWidth = this.previewTrack.clientWidth;\n      if (slideWidth <= 0) return;\n      const index = Math.max(0, Math.min(this.previewSlides.length - 1, Math.round(this.previewTrack.scrollLeft / slideWidth)));\n      const shadeName = this.previewSlides[index]?.dataset.aveyShadeSlideName;\n      const button = [...this.querySelectorAll('[data-avey-shade-name]')].find(\n        (item) => this.normalize(item.dataset.aveyShadeName) === this.normalize(shadeName || ''),\n      );\n      if (button && button !== this.previewButton) this.setPreview(button, { syncTrack: false });\n    });\n  };\n\n  syncPreviewTrack(button, animate = false) {\n    if (!this.previewTrack || !window.matchMedia('(max-width: 767px)').matches) return;\n    const index = this.previewSlides.findIndex(\n      (slide) => this.normalize(slide.dataset.aveyShadeSlideName) === this.normalize(button.dataset.aveyShadeName),\n    );\n    if (index < 0) return;\n    this.previewTrack.scrollTo({\n      left: index * this.previewTrack.clientWidth,\n      behavior: animate && !window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'smooth' : 'auto',\n    });\n  }\n\n  preloadAllPreviews() {\n    if (!this.premium || this.previewPreloads.length > 0) return;\n    if (this.previewSlides.length > 0) {\n      this.previewSlides.forEach((image) => {\n        if (!image.getAttribute('src')) image.src = image.dataset.src || '';\n      });\n      this.previewPreloads = this.previewSlides;\n      return;\n    }\n    const sources = new Set(\n      [...this.querySelectorAll('[data-avey-shade-preview-src]')]\n        .map((button) => button.dataset.aveyShadePreviewSrc)\n        .filter(Boolean),\n    );\n    this.previewPreloads = [...sources].map((source) => {\n      const image = new Image();\n      image.decoding = 'async';\n      image.src = source;\n      return image;\n    });\n  }\n\n  preloadSecondaryProfilePreview() {\n    if (!this.premium || !this.previewButton) return;\n\n    const profile = this.activeProfile === 'male' ? 'female' : 'male';\n    const source = profile === 'male'\n      ? this.previewButton.dataset.aveyShadePreviewSrcMale\n      : this.previewButton.dataset.aveyShadePreviewSrcFemale;\n    if (!source || this.secondaryProfilePreload?.src === source) return;\n\n    const image = new Image();\n    image.decoding = 'async';\n    image.src = source;\n    this.secondaryProfilePreload = image;\n  }\n\n  openInfo(kind, opener) {\n    const layer = this.querySelector(`[data-avey-shade-info=\"${CSS.escape(kind || '')}\"]`);\n    if (!layer) return;\n    this.closeInfo(false);\n    this.activeInfoLayer = layer;\n    this.infoOpener = opener;\n    this.classList.add('is-info-open');\n    opener?.setAttribute('aria-expanded', 'true');\n    layer.hidden = false;\n    window.requestAnimationFrame(() => layer.querySelector('.avey-shade-guide__info-card')?.focus({ preventScroll: true }));\n  }\n\n  closeInfo(restoreFocus = true) {\n    if (!this.activeInfoLayer) return;\n    this.activeInfoLayer.hidden = true;\n    this.classList.remove('is-info-open');\n    this.infoOpener?.setAttribute('aria-expanded', 'false');\n    if (restoreFocus && this.infoOpener?.isConnected) this.infoOpener.focus({ preventScroll: true });\n    this.activeInfoLayer = null;\n    this.infoOpener = null;\n  }\n\n  onOverlayRequestClose = (event) => {\n    if (event.detail?.overlay !== this.overlay || !this.activeInfoLayer) return;\n    event.preventDefault();\n    this.closeInfo();\n  };\n\n  onKeydown = (event) => {\n    if (!this.activeInfoLayer) return;\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      event.stopPropagation();\n      this.closeInfo();\n      return;\n    }\n    if (event.key !== 'Tab') return;\n    const focusable = [...this.activeInfoLayer.querySelectorAll('button:not([disabled]), a[href], [tabindex]:not([tabindex=\"-1\"])')];\n    if (focusable.length !== 1) return;\n    event.preventDefault();\n    focusable[0].focus({ preventScroll: true });\n  };\n\n  applyShade(button) {\n    if (!button || button.disabled) return false;\n\n    const selectors = this.activeShadeSelectors;\n    if (selectors.length === 0) return false;\n\n    const changedSelectors = [];\n    selectors.forEach((select) => {\n      const option = this.findOption(select, button.dataset.aveyShadeName);\n      if (option && !option.disabled) {\n        select.value = option.value;\n        changedSelectors.push(select);\n      }\n    });\n    changedSelectors.forEach((select) => select.dispatchEvent(new Event('change', { bubbles: true })));\n    return changedSelectors.length > 0;\n  }\n\n  onClick = (event) => {\n    const infoTrigger = event.target.closest('[data-avey-shade-info-open]');\n    if (infoTrigger && this.contains(infoTrigger)) {\n      this.openInfo(infoTrigger.dataset.aveyShadeInfoOpen, infoTrigger);\n      return;\n    }\n\n    const infoClose = event.target.closest('[data-avey-shade-info-close]');\n    if (infoClose && this.contains(infoClose)) {\n      this.closeInfo();\n      return;\n    }\n\n    if (this.activeInfoLayer && event.target === this.activeInfoLayer) {\n      this.closeInfo();\n      return;\n    }\n\n    if (event.target.closest('[data-avey-shade-previous]')) {\n      this.showRelativePreview(-1);\n      return;\n    }\n\n    if (event.target.closest('[data-avey-shade-next]')) {\n      this.showRelativePreview(1);\n      return;\n    }\n\n    const profileButton = event.target.closest('[data-avey-shade-profile]');\n    if (profileButton && this.contains(profileButton)) {\n      this.setProfile(profileButton.dataset.aveyShadeProfile);\n      return;\n    }\n\n    const button = event.target.closest('[data-avey-shade-name]');\n    if (this.premium && button && this.contains(button)) {\n      this.setPreview(button, { animateTrack: false, instant: true });\n      return;\n    }\n\n    const confirmButton = event.target.closest('[data-avey-shade-confirm]');\n    const shadeButton = this.premium ? this.previewButton : button;\n    if (this.premium && (!confirmButton || !this.contains(confirmButton))) return;\n    if (!shadeButton || shadeButton.disabled || !this.contains(shadeButton)) return;\n    const proField = this.findProShade(shadeButton.dataset.aveyShadeName);\n    if (proField && !proField.disabled) {\n      const dialog = this.closest('dialog[data-avey-overlay]');\n      Promise.resolve(window.AveyOverlayManager?.close(dialog, { restoreFocus: false })).then(() => {\n        const control = proField.closest('avey-pro-quantity')?.querySelector('select') || proField;\n        control.focus();\n      });\n      return;\n    }\n    if (!this.applyShade(shadeButton)) return;\n\n    this.updateSelection();\n    this.clearConfirmation();\n    shadeButton.classList.add('is-confirmed');\n\n    const dialog = this.closest('dialog[data-avey-overlay]');\n    this.confirmationTimer = window.setTimeout(() => {\n      window.AveyOverlayManager?.close(dialog);\n    }, 420);\n  };\n}\n\nclass AveyStickyPurchase extends HTMLElement {\n  connectedCallback() {\n    if (this.dataset.initialized === 'true') return;\n    this.dataset.initialized = 'true';\n\n    this.product = this.closest('avey-product');\n    this.sourceButton = this.product?.querySelector('.avey-bundles__submit, [data-product-form] [data-add-to-cart]');\n    this.threshold = this.product?.querySelector('[data-bundle-card]')\n      || this.product?.querySelector('[data-sticky-purchase-threshold]');\n    this.submitButton = this.querySelector('[data-sticky-purchase-submit]');\n    this.label = this.querySelector('[data-sticky-purchase-label]');\n    this.buttonPrice = this.querySelector('[data-sticky-purchase-button-price]');\n    this.buttonSeparator = this.querySelector('[data-sticky-purchase-separator]');\n    this.summary = this.querySelector('[data-sticky-purchase-summary]');\n    this.summaryLabel = this.querySelector('[data-sticky-purchase-label-text]');\n    this.summaryPrice = this.querySelector('[data-sticky-purchase-price]');\n    this.shades = this.querySelector('[data-sticky-purchase-shades]');\n    this.shadesToggle = this.querySelector('[data-sticky-purchase-shades-toggle]');\n    this.shadePanel = null;\n    this.shadeTitle = null;\n    this.shadeFields = null;\n    this.shadeSubmit = null;\n    this.shadeSubmitLabel = null;\n    this.shadeSubmitting = false;\n    this.shadeEditing = false;\n    this.shadeAdvanceTimer = null;\n    this.shadeCloseTimer = null;\n    this.hasSeenSourceButton = false;\n    this.frame = null;\n\n    this.submitButton?.addEventListener('click', this.onSubmit);\n    this.shadesToggle?.addEventListener('click', this.onShadesToggle);\n    this.resolveShadePanel();\n    this.product?.addEventListener('avey:bundle:change', this.onBundleChange);\n    this.product?.addEventListener('avey:variant:change', this.onVariantChange);\n    this.product?.addEventListener('avey:cart:add-state', this.onAddState);\n    document.addEventListener('avey:overlay:open', this.onOverlayOpen);\n    document.addEventListener('avey:overlay:close', this.onOverlayClose);\n    document.addEventListener('avey:overlay:request-close', this.onOverlayRequestClose);\n    window.addEventListener('scroll', this.scheduleUpdate, { passive: true });\n    window.addEventListener('resize', this.scheduleUpdate, { passive: true });\n\n    this.updateFromSelectedBundle();\n    this.scheduleUpdate();\n  }\n\n  disconnectedCallback() {\n    this.submitButton?.removeEventListener('click', this.onSubmit);\n    this.shadesToggle?.removeEventListener('click', this.onShadesToggle);\n    this.shadeSubmit?.removeEventListener('click', this.onShadeSubmit);\n    if (this.shadeAdvanceTimer) window.clearTimeout(this.shadeAdvanceTimer);\n    if (this.shadeCloseTimer) window.clearTimeout(this.shadeCloseTimer);\n    this.product?.removeEventListener('avey:bundle:change', this.onBundleChange);\n    this.product?.removeEventListener('avey:variant:change', this.onVariantChange);\n    this.product?.removeEventListener('avey:cart:add-state', this.onAddState);\n    document.removeEventListener('avey:overlay:open', this.onOverlayOpen);\n    document.removeEventListener('avey:overlay:close', this.onOverlayClose);\n    document.removeEventListener('avey:overlay:request-close', this.onOverlayRequestClose);\n    window.removeEventListener('scroll', this.scheduleUpdate);\n    window.removeEventListener('resize', this.scheduleUpdate);\n    if (this.frame) cancelAnimationFrame(this.frame);\n  }\n\n  onSubmit = () => {\n    if (!this.sourceButton?.disabled) this.sourceButton?.click();\n  };\n\n  onShadesToggle = (event) => {\n    if (this.shadesToggle?.disabled) {\n      event.preventDefault();\n      return;\n    }\n    if (!this.resolveShadePanel()) {\n      event.preventDefault();\n      return;\n    }\n    this.renderShadeRecap();\n  };\n\n  onShadeSubmit = () => {\n    if (this.shadeSubmitting || this.shadeSubmit?.disabled || this.sourceButton?.disabled) return;\n    this.shadeSubmitting = true;\n    this.setShadeSubmitState('loading');\n    this.onSubmit();\n  };\n\n  setShadeSubmitState(state) {\n    if (!this.shadeSubmit || !this.shadeSubmitLabel) return;\n\n    const labels = {\n      available: this.shadeSubmit.dataset.availableLabel,\n      loading: this.shadeSubmit.dataset.loadingLabel,\n      success: this.shadeSubmit.dataset.successLabel,\n      error: this.shadeSubmit.dataset.errorLabel,\n    };\n    this.shadeSubmit.dataset.addState = state;\n    this.shadeSubmitLabel.textContent = labels[state] || labels.available;\n    this.shadeSubmit.setAttribute('aria-busy', String(state === 'loading'));\n    this.shadeSubmit.disabled = state === 'loading' || state === 'success';\n  }\n\n  closeShadePanel = () => {\n    this.resolveShadePanel();\n    if (!this.shadePanel) return;\n    this.shadesToggle?.setAttribute('aria-expanded', 'false');\n    return window.AveyOverlayManager?.close(this.shadePanel);\n  };\n\n  resolveShadePanel() {\n    const panel = document.getElementById(this.dataset.shadeOverlayId);\n    if (!panel?.matches('dialog[data-avey-overlay]')) return false;\n    if (panel === this.shadePanel) return true;\n\n    this.shadeSubmit?.removeEventListener('click', this.onShadeSubmit);\n    this.shadePanel = panel;\n    this.shadeTitle = panel.querySelector('.avey-overlay__title');\n    this.shadeFields = panel.querySelector('[data-sticky-purchase-shade-fields]');\n    this.shadeSubmit = panel.querySelector('[data-sticky-purchase-shades-submit]');\n    this.shadeSubmitLabel = panel.querySelector('[data-sticky-purchase-shades-submit-label]');\n    this.shadeSubmit?.addEventListener('click', this.onShadeSubmit);\n    return true;\n  }\n\n  shadeVisualFor(option) {\n    const source = option?.dataset.shadeImage;\n    if (!source) return null;\n\n    const visual = new Image(48, 48);\n    visual.src = source;\n    visual.decoding = 'async';\n    return visual;\n  }\n\n  translated(template, values = {}) {\n    return Object.entries(values).reduce(\n      (label, [key, value]) => label.replace(`__${key.toUpperCase()}__`, String(value)),\n      template || '',\n    );\n  }\n\n  renderShadeRecap() {\n    if (!this.shadeFields) return;\n    this.shadeEditing = false;\n    this.shadeFields.replaceChildren();\n\n    const sourceSelectors = this.selectedShadeSelectors;\n    if (this.shadeTitle) {\n      this.shadeTitle.textContent = sourceSelectors.length > 1\n        ? this.dataset.multipleShadesTitle\n        : this.dataset.singleShadeTitle;\n    }\n\n    const recap = document.createElement('div');\n    recap.className = 'avey-sticky-purchase__shade-recap';\n\n    sourceSelectors.forEach((sourceSelect, index) => {\n      const option = sourceSelect.selectedOptions[0];\n      const button = document.createElement('button');\n      button.className = 'avey-sticky-purchase__shade-line';\n      button.type = 'button';\n      button.setAttribute('aria-label', sourceSelect.getAttribute('aria-label') || `Shade ${index + 1}`);\n      button.addEventListener('click', () => this.renderShadePicker(index));\n\n      if (sourceSelectors.length > 1) {\n        const bottle = document.createElement('span');\n        bottle.className = 'avey-sticky-purchase__shade-bottle';\n        bottle.textContent = this.translated(this.dataset.bottleLabel, { index: index + 1 });\n        button.append(bottle);\n      } else {\n        button.classList.add('avey-sticky-purchase__shade-line--single');\n      }\n\n      const visual = this.shadeVisualFor(option)?.cloneNode(true);\n      if (visual) {\n        visual.className = 'avey-sticky-purchase__shade-thumbnail';\n        visual.removeAttribute('loading');\n        visual.alt = '';\n      } else {\n        button.classList.add('avey-sticky-purchase__shade-line--without-visual');\n      }\n\n      const name = document.createElement('span');\n      name.className = 'avey-sticky-purchase__shade-name';\n      name.textContent = option?.dataset.optionName || option?.textContent?.trim() || '';\n\n      const chevron = document.createElement('span');\n      chevron.className = 'avey-sticky-purchase__shade-line-chevron';\n      chevron.setAttribute('aria-hidden', 'true');\n      chevron.textContent = '\u203A';\n\n      if (visual) button.append(visual);\n      button.append(name, chevron);\n      recap.append(button);\n    });\n\n    this.shadeFields.append(recap);\n\n    if (this.shadeSubmit) this.shadeSubmit.hidden = false;\n  }\n\n  renderShadePicker(index) {\n    const selectors = this.selectedShadeSelectors;\n    const sourceSelect = selectors[index];\n    if (!sourceSelect || !this.shadeFields) return;\n\n    this.shadeEditing = true;\n    this.shadeFields.replaceChildren();\n    if (this.shadeSubmit) this.shadeSubmit.hidden = true;\n\n    if (this.shadeTitle) this.shadeTitle.textContent = this.dataset.singleShadeTitle;\n\n    if (selectors.length > 1) {\n      const progress = document.createElement('p');\n      progress.className = 'avey-sticky-purchase__shade-progress';\n      progress.textContent = this.translated(this.dataset.shadeStepLabel, {\n        index: index + 1,\n        count: selectors.length,\n      });\n      this.shadeFields.append(progress);\n    }\n\n    const grid = document.createElement('div');\n    grid.className = 'avey-sticky-purchase__shade-grid';\n\n    [...sourceSelect.options].forEach((option) => {\n      const button = document.createElement('button');\n      const selected = option.value === sourceSelect.value;\n      button.className = 'avey-sticky-purchase__shade-option';\n      button.type = 'button';\n      button.disabled = option.disabled;\n      button.dataset.variantId = option.value;\n      button.setAttribute('aria-pressed', String(selected));\n\n      const visual = this.shadeVisualFor(option)?.cloneNode(true);\n      if (visual) {\n        visual.className = 'avey-sticky-purchase__shade-option-image';\n        visual.removeAttribute('loading');\n        visual.alt = '';\n      }\n\n      const name = document.createElement('span');\n      name.textContent = option.dataset.optionName || option.textContent.trim();\n      if (visual) button.append(visual);\n      button.append(name);\n      button.addEventListener('click', () => this.selectStickyShade(sourceSelect, option, button));\n      grid.append(button);\n    });\n\n    this.shadeFields.append(grid);\n  }\n\n  selectStickyShade(sourceSelect, option, button) {\n    if (button.disabled) return;\n    sourceSelect.value = option.value;\n    sourceSelect.dispatchEvent(new Event('change', { bubbles: true }));\n    button.parentElement.querySelectorAll('[aria-pressed]').forEach((shadeButton) => {\n      shadeButton.setAttribute('aria-pressed', String(shadeButton === button));\n      shadeButton.classList.toggle('is-confirmed', shadeButton === button);\n    });\n\n    if (this.shadeAdvanceTimer) window.clearTimeout(this.shadeAdvanceTimer);\n    this.shadeAdvanceTimer = window.setTimeout(() => {\n      this.renderShadeRecap();\n    }, 420);\n  }\n\n  get selectedShadeSelectors() {\n    const selectedCard = this.product?.querySelector('[data-bundle-card].is-selected');\n    if (selectedCard) return [...selectedCard.querySelectorAll('[data-bundle-shade]')];\n    return [...(this.product?.querySelectorAll('[data-product-shade]') || [])];\n  }\n\n  onBundleChange = (event) => {\n    this.updateSummary(event.detail);\n    this.scheduleUpdate();\n  };\n\n  onVariantChange = (event) => {\n    this.updateFromSelectedBundle(event.detail);\n    if (this.submitButton) this.submitButton.disabled = event.detail?.available === false;\n  };\n\n  onAddState = (event) => {\n    const state = event.detail?.state || 'available';\n\n    if (this.shadeSubmitting) {\n      this.setShadeSubmitState(state);\n\n      if (state === 'success') {\n        if (this.shadeCloseTimer) window.clearTimeout(this.shadeCloseTimer);\n        this.shadeCloseTimer = window.setTimeout(async () => {\n          await this.closeShadePanel();\n          this.shadeSubmitting = false;\n          this.setShadeSubmitState('available');\n        }, 220);\n      } else if (state === 'available') {\n        this.shadeSubmitting = false;\n        this.setShadeSubmitState('available');\n      }\n      return;\n    }\n\n    if (!this.label || !this.submitButton) return;\n    this.submitButton.dataset.addState = state;\n    this.label.textContent = event.detail?.label || this.submitButton.dataset.availableLabel;\n    const loading = state === 'loading';\n    const available = state === 'available';\n    if (this.buttonPrice) this.buttonPrice.hidden = !available;\n    if (this.buttonSeparator) this.buttonSeparator.hidden = !available;\n    this.submitButton.disabled = loading;\n    this.submitButton.setAttribute('aria-busy', String(loading));\n  };\n\n  onOverlayClose = (event) => {\n    if (event.detail?.overlay === this.shadePanel) {\n      this.shadesToggle?.setAttribute('aria-expanded', 'false');\n      if (this.shadeAdvanceTimer) window.clearTimeout(this.shadeAdvanceTimer);\n      this.shadeEditing = false;\n    }\n  };\n\n  onOverlayRequestClose = (event) => {\n    if (event.detail?.overlay !== this.shadePanel || !this.shadeEditing) return;\n\n    event.preventDefault();\n    if (this.shadeAdvanceTimer) window.clearTimeout(this.shadeAdvanceTimer);\n    this.renderShadeRecap();\n    this.shadeFields?.querySelector('button')?.focus({ preventScroll: true });\n  };\n\n  onOverlayOpen = (event) => {\n    if (event.detail?.overlay === this.shadePanel) {\n      this.shadesToggle?.setAttribute('aria-expanded', 'true');\n    }\n  };\n\n  updateFromSelectedBundle(variant = {}) {\n    const card = this.product?.querySelector('[data-bundle-card].is-selected');\n    if (!card) {\n      this.updateSummary({\n        label: this.dataset.productTitle,\n        total: variant.total ?? this.summaryPrice?.textContent,\n        shadesLabel: this.shades?.textContent,\n      });\n      return;\n    }\n    this.updateSummary({\n      label: card.dataset.bundleLabel,\n      total: card.dataset.bundleTotal,\n      shadesLabel: card.dataset.shadesLabel,\n    });\n  }\n\n  updateSummary(detail = {}) {\n    const label = this.product?.querySelector('.avey-bundles--single-preview')?.dataset.singleBottleTitle || detail.label;\n    if (this.summaryLabel && label) this.summaryLabel.textContent = label;\n    if (this.summaryPrice && detail.total) this.summaryPrice.textContent = detail.total;\n    if (this.buttonPrice && detail.total) this.buttonPrice.textContent = detail.total;\n    if (this.shades) this.shades.textContent = detail.shadesLabel || '';\n    if (this.shadesToggle) this.shadesToggle.disabled = this.selectedShadeSelectors.length === 0;\n    if (this.shadePanel?.open && !this.shadeEditing) this.renderShadeRecap();\n  }\n\n  scheduleUpdate = () => {\n    if (this.frame) return;\n    this.frame = requestAnimationFrame(() => {\n      this.frame = null;\n      this.updateVisibility();\n    });\n  };\n\n  updateVisibility() {\n    if (!this.sourceButton || !this.threshold) return;\n\n    const sourceRect = this.sourceButton.getBoundingClientRect();\n    const stickyHeader = document.querySelector('.avey-header-shell--sticky');\n    const stickyHeaderRect = stickyHeader?.getBoundingClientRect();\n    const visibleViewportTop = stickyHeaderRect\n      ? Math.min(window.innerHeight, Math.max(0, stickyHeaderRect.bottom))\n      : 0;\n    const sourceVisibleHeight =\n      Math.min(sourceRect.bottom, window.innerHeight)\n      - Math.max(sourceRect.top, visibleViewportTop);\n    const minimumActionableHeight = Math.min(44, sourceRect.height);\n    const sourceVisible = sourceVisibleHeight >= minimumActionableHeight;\n    if (sourceVisible) this.hasSeenSourceButton = true;\n    const thresholdRect = this.threshold.getBoundingClientRect();\n    const desktop = window.matchMedia('(min-width: 1024px)').matches;\n    const footer = document.querySelector('.shopify-section-group-footer-group');\n    const complements = document.querySelector('.avey-product-complements');\n    const purchaseBoundary = complements || footer;\n    const purchaseBoundaryOffset = complements ? 24 : 300;\n    // Recommendations start a new purchase context, so the main-product bar\n    // leaves before their actions enter the viewport. The footer remains the fallback.\n    const purchaseBoundaryReached =\n      desktop\n      && purchaseBoundary\n      && purchaseBoundary.getBoundingClientRect().top <= window.innerHeight - purchaseBoundaryOffset;\n    const purchaseColumn = this.product?.querySelector('.avey-product__info');\n\n    if (desktop && purchaseColumn) {\n      const purchaseColumnRect = purchaseColumn.getBoundingClientRect();\n      const productTabs = this.product?.querySelector('.avey-product-tabs');\n      const productTabsBar = productTabs?.querySelector('.avey-product-tabs__bar');\n      const tabsStickyTop = Number.parseFloat(productTabsBar ? getComputedStyle(productTabsBar).top : '') || 0;\n      const usesClassicInformationLayout = productTabs && !purchaseColumn.contains(productTabs);\n      const descriptionReached =\n        usesClassicInformationLayout\n        && productTabs.getBoundingClientRect().top <= tabsStickyTop + 1;\n      const stickyLeftValue = descriptionReached ? 0 : purchaseColumnRect.left;\n      const stickyWidthValue = window.innerWidth - stickyLeftValue;\n      const contentOffsetValue = descriptionReached\n        ? (window.innerWidth - purchaseColumnRect.width) / 2 - 1\n        : purchaseColumnRect.left - stickyLeftValue - 1;\n      const properties = {\n        '--avey-sticky-purchase-left': `${stickyLeftValue.toFixed(2)}px`,\n        '--avey-sticky-purchase-width': `${stickyWidthValue.toFixed(2)}px`,\n        '--avey-sticky-purchase-column-width': `${purchaseColumnRect.width.toFixed(2)}px`,\n        '--avey-sticky-purchase-content-offset': `${contentOffsetValue.toFixed(2)}px`,\n      };\n      Object.entries(properties).forEach(([property, value]) => {\n        if (this.style.getPropertyValue(property) !== value) {\n          this.style.setProperty(property, value);\n        }\n      });\n    } else {\n      this.style.removeProperty('--avey-sticky-purchase-left');\n      this.style.removeProperty('--avey-sticky-purchase-width');\n      this.style.removeProperty('--avey-sticky-purchase-column-width');\n      this.style.removeProperty('--avey-sticky-purchase-content-offset');\n    }\n\n    const activationMargin = desktop ? 20 : 10;\n    const activationDistance = this.offsetHeight + activationMargin;\n    const thresholdPassed = desktop\n      ? thresholdRect.bottom < -activationDistance\n      : thresholdRect.bottom < window.innerHeight - activationDistance;\n\n    const visible = this.hasSeenSourceButton\n      && !sourceVisible\n      && (!desktop || !purchaseBoundaryReached);\n    if (!visible) this.closeShadePanel();\n    const visibilityChanged = this.classList.contains('is-visible') !== visible;\n    const thresholdChanged = this.classList.contains('is-past-threshold') !== thresholdPassed;\n    this.classList.toggle('is-visible', visible);\n    this.classList.toggle('is-past-threshold', thresholdPassed);\n    this.toggleAttribute('inert', !visible);\n    this.setAttribute('aria-hidden', String(!visible));\n\n    if (visibilityChanged || thresholdChanged) {\n      window.dispatchEvent(\n        new CustomEvent('avey:sticky-purchase:visibility', {\n          detail: {\n            visible,\n            navigationVisible: visible && thresholdPassed,\n            height: visible ? this.getBoundingClientRect().height : 0,\n          },\n        }),\n      );\n    }\n  }\n}\n\nclass AveyDeliveryEstimate extends HTMLElement {\n  connectedCallback() {\n    if (this.dataset.initialized === 'true') return;\n    this.dataset.initialized = 'true';\n    this.output = this.querySelector('[data-delivery-estimate-text]');\n    this.renderEstimate();\n  }\n\n  renderEstimate() {\n    if (!this.output) return;\n\n    const minDays = Math.max(1, Number(this.dataset.minBusinessDays || 1));\n    const cutoffHour = Number(this.dataset.cutoffHour || 7);\n    const timeZone = this.dataset.timeZone || 'Europe/Paris';\n    const locale = document.documentElement.lang || 'fr';\n    const now = new Date();\n    const baseDate = this.dateInTimeZone(now, timeZone);\n    const currentHour = this.hourInTimeZone(now, timeZone);\n    const weekday = baseDate.getUTCDay();\n    const canDispatchToday = weekday > 0 && weekday < 6 && currentHour < cutoffHour;\n    const dispatchDate = new Date(baseDate.getTime());\n\n    if (!canDispatchToday) dispatchDate.setUTCDate(dispatchDate.getUTCDate() + 1);\n    while (dispatchDate.getUTCDay() === 0 || dispatchDate.getUTCDay() === 6) {\n      dispatchDate.setUTCDate(dispatchDate.getUTCDate() + 1);\n    }\n\n    const deliveryDate = new Date(dispatchDate.getTime());\n    deliveryDate.setUTCDate(deliveryDate.getUTCDate() + minDays);\n    if (deliveryDate.getUTCDay() === 0) deliveryDate.setUTCDate(deliveryDate.getUTCDate() + 1);\n\n    const formatter = new Intl.DateTimeFormat(locale, {\n      weekday: 'long',\n      day: 'numeric',\n      month: 'long',\n      timeZone: 'UTC',\n    });\n    const formatDate = (date) => {\n      const value = formatter.format(date);\n      return locale.toLowerCase().startsWith('es') ? value.replace(',', '') : value;\n    };\n\n    this.renderTemplate(\n      this.dataset.estimateSingleTemplate || this.dataset.estimateTemplate || '__DATE__',\n      {\n        DATE: formatDate(deliveryDate),\n        START: formatDate(deliveryDate),\n      },\n    );\n  }\n\n  renderTemplate(template, values) {\n    const fragment = document.createDocumentFragment();\n    const tokenPattern = /__(DATE|START)__/g;\n    let cursor = 0;\n    let match;\n\n    while ((match = tokenPattern.exec(template)) !== null) {\n      fragment.append(document.createTextNode(template.slice(cursor, match.index)));\n      const date = document.createElement('strong');\n      date.textContent = values[match[1]] || '';\n      fragment.append(date);\n      cursor = match.index + match[0].length;\n    }\n\n    fragment.append(document.createTextNode(template.slice(cursor)));\n    this.output.replaceChildren(fragment);\n  }\n\n  dateInTimeZone(date, timeZone) {\n    const parts = new Intl.DateTimeFormat('en-CA', {\n      year: 'numeric',\n      month: '2-digit',\n      day: '2-digit',\n      timeZone,\n    }).formatToParts(date);\n    const values = Object.fromEntries(parts.map((part) => [part.type, part.value]));\n    return new Date(Date.UTC(Number(values.year), Number(values.month) - 1, Number(values.day), 12));\n  }\n\n  hourInTimeZone(date, timeZone) {\n    const hour = new Intl.DateTimeFormat('en-GB', {\n      hour: '2-digit',\n      hourCycle: 'h23',\n      timeZone,\n    }).format(date);\n    return Number(hour);\n  }\n\n}\n\nclass AveyTrustpilot extends HTMLElement {\n  connectedCallback() {\n    if (this.dataset.initialized === 'true') return;\n    this.dataset.initialized = 'true';\n\n    this.mainWidget = this.querySelector('.avey-product-trustpilot__main');\n    this.mobileCount = this.querySelector('.avey-product-trustpilot__mobile-count');\n    this.updateMobileCount = this.updateMobileCount.bind(this);\n\n    if ('ResizeObserver' in window && this.mainWidget) {\n      this.resizeObserver = new ResizeObserver(this.updateMobileCount);\n      this.resizeObserver.observe(this.mainWidget);\n    }\n    window.addEventListener('resize', this.updateMobileCount, { passive: true });\n\n    if ('IntersectionObserver' in window) {\n      this.intersectionObserver = new IntersectionObserver(\n        (entries) => {\n          if (!entries.some((entry) => entry.isIntersecting)) return;\n          this.intersectionObserver.disconnect();\n          this.load();\n        },\n        { rootMargin: '400px 0px' },\n      );\n      this.intersectionObserver.observe(this);\n    } else {\n      this.load();\n    }\n  }\n\n  disconnectedCallback() {\n    this.intersectionObserver?.disconnect();\n    this.resizeObserver?.disconnect();\n    window.removeEventListener('resize', this.updateMobileCount);\n  }\n\n  async load() {\n    await AveyTrustpilot.loadScript();\n    this.querySelectorAll('.trustpilot-widget').forEach((widget) => {\n      window.Trustpilot?.loadFromElement(widget, true);\n    });\n    this.updateMobileCount();\n  }\n\n  updateMobileCount() {\n    if (!this.mobileCount || !this.mainWidget) return;\n    const compact = window.matchMedia('(max-width: 749px)').matches\n      && this.mainWidget.getBoundingClientRect().width < 420;\n    this.mobileCount.classList.toggle('is-visible', compact);\n  }\n\n  static loadScript() {\n    if (window.Trustpilot) return Promise.resolve();\n    if (window.aveyTrustpilotLoader) return window.aveyTrustpilotLoader;\n\n    window.aveyTrustpilotLoader = new Promise((resolve, reject) => {\n      const source = 'https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js';\n      const existing = document.querySelector(`script[src=\"${source}\"]`);\n      const script = existing || document.createElement('script');\n      let checks = 0;\n      const ready = () => {\n        if (window.Trustpilot) {\n          resolve();\n          return;\n        }\n        checks += 1;\n        if (checks < 40) window.setTimeout(ready, 50);\n        else resolve();\n      };\n\n      if (!existing) {\n        script.src = source;\n        script.async = true;\n        document.head.append(script);\n      }\n      script.addEventListener('load', ready, { once: true });\n      script.addEventListener('error', reject, { once: true });\n      ready();\n    });\n\n    return window.aveyTrustpilotLoader;\n  }\n}\n\nif (!customElements.get('avey-product-gallery')) customElements.define('avey-product-gallery', AveyProductGallery);\nif (!customElements.get('avey-product-faq')) customElements.define('avey-product-faq', AveyProductFaq);\nif (!customElements.get('avey-product-tabs')) customElements.define('avey-product-tabs', AveyProductTabs);\nif (!customElements.get('avey-product')) customElements.define('avey-product', AveyProduct);\nif (!customElements.get('avey-bundle-selector')) customElements.define('avey-bundle-selector', AveyBundleSelector);\nif (!customElements.get('avey-shade-guide')) customElements.define('avey-shade-guide', AveyShadeGuide);\n\n// Account shade help opens the existing product guide without changing a selection.\nif (window.location?.search && new URLSearchParams(window.location.search).get('shade-guide') === 'open') {\n  const openRequestedShadeGuide = () => {\n    const opener = document.querySelector('[data-avey-overlay-open^=\"shade-guide-\"]');\n    const dialog = opener && document.getElementById(opener.dataset.aveyOverlayOpen);\n    if (dialog && window.AveyOverlayManager) window.AveyOverlayManager.open(dialog, opener);\n  };\n  if (document.readyState === 'complete') openRequestedShadeGuide();\n  else window.addEventListener('load', openRequestedShadeGuide, { once: true });\n}\nif (!customElements.get('avey-sticky-purchase')) customElements.define('avey-sticky-purchase', AveyStickyPurchase);\nif (!customElements.get('avey-delivery-estimate')) customElements.define('avey-delivery-estimate', AveyDeliveryEstimate);\nif (!customElements.get('avey-trustpilot')) customElements.define('avey-trustpilot', AveyTrustpilot);\n"],
  "mappings": "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",
  "names": ["card", "dialog"]
}
