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