{
  "version": 3,
  "sources": ["/cdn/shop/t/37/assets/native-fbt.js?bt_rev=20260728_fbt_page_step"],
  "sourcesContent": ["class NativeFbt extends HTMLElement {\n  constructor() {\n    super();\n    this.limit = Number(this.dataset.limit || 4);\n    this.list = this.querySelector('[data-native-fbt-list]');\n    this.previousButton = this.querySelector('[data-native-fbt-previous]');\n    this.nextButton = this.querySelector('[data-native-fbt-next]');\n    this.onChange = this.updateVariant.bind(this);\n    this.onClick = this.addRecommendation.bind(this);\n    this.onScroll = this.updateCarouselState.bind(this);\n  }\n\n  connectedCallback() {\n    this.addEventListener('change', this.onChange);\n    this.addEventListener('click', this.onClick);\n    this.list?.addEventListener('scroll', this.onScroll, { passive: true });\n    this.prepare();\n  }\n\n  disconnectedCallback() {\n    this.removeEventListener('change', this.onChange);\n    this.removeEventListener('click', this.onClick);\n    this.list?.removeEventListener('scroll', this.onScroll);\n  }\n\n  get cards() {\n    return [...this.querySelectorAll('[data-native-fbt-card]')];\n  }\n\n  excludedIds() {\n    return new Set(\n      (this.dataset.excludedProductIds || '')\n        .split('|')\n        .filter(Boolean),\n    );\n  }\n\n  removeDuplicateAndExcludedCards() {\n    const seen = this.excludedIds();\n    this.cards.forEach((card) => {\n      const productId = card.dataset.productId;\n      if (!productId || seen.has(productId)) {\n        card.remove();\n        return;\n      }\n      seen.add(productId);\n    });\n  }\n\n  async prepare() {\n    this.removeDuplicateAndExcludedCards();\n\n    if (this.cards.length < this.limit && this.dataset.fallbackUrl) {\n      await this.loadNativeFallback();\n      this.removeDuplicateAndExcludedCards();\n    }\n\n    this.cards.slice(this.limit).forEach((card) => card.remove());\n    if (this.cards.length > 0) {\n      this.dataset.ready = 'true';\n      this.dataset.slideCount = String(this.cards.length);\n      this.updateCarouselState();\n    }\n  }\n\n  currentSlideIndex() {\n    if (!this.list || this.cards.length === 0) return 0;\n\n    return this.cards.reduce((closestIndex, card, index) => {\n      const cardDistance = Math.abs(card.offsetLeft - this.list.offsetLeft - this.list.scrollLeft);\n      const closestCard = this.cards[closestIndex];\n      const closestDistance = Math.abs(\n        closestCard.offsetLeft - this.list.offsetLeft - this.list.scrollLeft,\n      );\n      return cardDistance < closestDistance ? index : closestIndex;\n    }, 0);\n  }\n\n  visibleCardCount() {\n    const firstCard = this.cards[0];\n    if (!this.list || !firstCard) return 1;\n\n    const styles = getComputedStyle(this.list);\n    const gap = Number.parseFloat(styles.columnGap || styles.gap) || 0;\n    return Math.max(\n      1,\n      Math.floor((this.list.clientWidth + gap) / (firstCard.offsetWidth + gap)),\n    );\n  }\n\n  updateCarouselState() {\n    const scrollStart = this.list?.scrollLeft || 0;\n    const scrollEnd = scrollStart + (this.list?.clientWidth || 0);\n    const maxScroll = Math.max(0, (this.list?.scrollWidth || 0) - (this.list?.clientWidth || 0));\n    if (this.previousButton) this.previousButton.disabled = scrollStart <= 1;\n    if (this.nextButton) this.nextButton.disabled = scrollStart >= maxScroll - 1;\n\n    this.cards.forEach((card, cardIndex) => {\n      const cardStart = card.offsetLeft - this.list.offsetLeft;\n      const cardEnd = cardStart + card.offsetWidth;\n      const isInactive = cardEnd <= scrollStart + 1 || cardStart >= scrollEnd - 1;\n      card.toggleAttribute('inert', isInactive);\n      card.setAttribute('role', 'group');\n      card.setAttribute('aria-roledescription', this.dataset.slideDescription || 'slide');\n      card.setAttribute(\n        'aria-label',\n        (this.dataset.slideLabel || 'Slide __CURRENT__ of __TOTAL__')\n          .replace('__CURRENT__', String(cardIndex + 1))\n          .replace('__TOTAL__', String(this.cards.length)),\n      );\n    });\n  }\n\n  moveSlide(direction) {\n    const pageSize = this.visibleCardCount();\n    const targetIndex = Math.max(\n      0,\n      Math.min(this.cards.length - 1, this.currentSlideIndex() + (direction * pageSize)),\n    );\n    const target = this.cards[targetIndex];\n    if (!target || !this.list) return;\n\n    this.list.scrollTo({\n      left: target.offsetLeft - this.list.offsetLeft,\n      behavior: window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth',\n    });\n  }\n\n  async loadNativeFallback() {\n    try {\n      const response = await fetch(this.dataset.fallbackUrl, {\n        headers: { Accept: 'text/html' },\n      });\n      if (!response.ok) return;\n\n      const parsed = new DOMParser().parseFromString(await response.text(), 'text/html');\n      const fallback = parsed.querySelector('[data-native-fbt-fallback]');\n      if (!fallback) return;\n\n      [...fallback.querySelectorAll('[data-native-fbt-card]')]\n        .forEach((card) => this.list.append(card));\n    } catch (_error) {\n      // Stored recommendations remain usable if Shopify's optional fallback is unavailable.\n    }\n  }\n\n  updateVariant(event) {\n    const selector = event.target.closest('[data-native-fbt-variant]');\n    if (!selector || selector.tagName !== 'SELECT') return;\n\n    const card = selector.closest('[data-native-fbt-card]');\n    const selected = selector.options[selector.selectedIndex];\n    const price = card?.querySelector('[data-native-fbt-price]');\n    const image = card?.querySelector('[data-native-fbt-image]');\n\n    if (price && selected?.dataset.price) price.textContent = selected.dataset.price;\n    if (image && selected?.dataset.image) {\n      image.src = selected.dataset.image;\n      image.alt = selected.dataset.imageAlt || image.alt;\n      image.removeAttribute('srcset');\n    }\n  }\n\n  async addRecommendation(event) {\n    if (event.target.closest('[data-native-fbt-previous]')) {\n      this.moveSlide(-1);\n      return;\n    }\n    if (event.target.closest('[data-native-fbt-next]')) {\n      this.moveSlide(1);\n      return;\n    }\n\n    const button = event.target.closest('[data-native-fbt-add]');\n    if (!button) return;\n\n    const card = button.closest('[data-native-fbt-card]');\n    const variantInput = card?.querySelector('[data-native-fbt-variant]');\n    const status = card?.querySelector('[data-native-fbt-status]');\n    const variantId = Number(variantInput?.value);\n    if (!variantId) return;\n\n    button.disabled = true;\n    button.setAttribute('aria-busy', 'true');\n    if (status) status.textContent = this.dataset.statusAdding || 'Adding...';\n\n    try {\n      const response = await fetch(this.dataset.addUrl, {\n        method: 'POST',\n        headers: {\n          Accept: 'application/json',\n          'Content-Type': 'application/json',\n          'X-Requested-With': 'XMLHttpRequest',\n        },\n        body: JSON.stringify({\n          items: [{ id: variantId, quantity: 1 }],\n        }),\n      });\n      const payload = await response.json();\n      if (!response.ok) {\n        throw new Error(payload.description || this.dataset.statusError || 'Unable to add this item.');\n      }\n\n      if (status) status.textContent = this.dataset.statusAdded || 'Added to cart';\n      document.dispatchEvent(new CustomEvent('on:cart:add', {\n        bubbles: true,\n        detail: { variantId },\n      }));\n      document.dispatchEvent(new CustomEvent('on:cart:change', {\n        bubbles: true,\n        cancelable: false,\n      }));\n    } catch (error) {\n      if (status) status.textContent = error.message;\n    } finally {\n      button.disabled = false;\n      button.removeAttribute('aria-busy');\n    }\n  }\n}\n\nif (!customElements.get('native-fbt')) {\n  customElements.define('native-fbt', NativeFbt);\n}\n"],
  "mappings": "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",
  "names": []
}
