{
  "version": 3,
  "sources": ["/cdn/shop/t/21/assets/collection-tabs.js?section_id=collection-tabs-ajax"],
  "sourcesContent": ["/**\n *  @class\n *  @function CollectionTabs\n */\n\nif (!customElements.get('collection-tabs')) {\n  class CollectionTabs extends HTMLElement {\n    constructor() {\n      super();\n      this._onResize = null;\n      this._onBlockSelect = null;\n      this._fetchCache = new Map();\n      this._fetchPromises = new Map();\n    }\n\n    connectedCallback() {\n      requestAnimationFrame(() => {\n        this.buttons = Array.from(this.querySelectorAll('button'));\n        let sectionHeader = this.closest('.section-header');\n        this.links = sectionHeader ? Array.from(sectionHeader.querySelectorAll('.linked-to-tab')) : [];\n        this.target = this.dataset.target;\n        this.slider = document.getElementById(this.target);\n\n        if (!this.slider) return;\n\n        this.productLimit = parseInt(this.slider.dataset.productLimit, 10) || 6;\n        // Cache items grouped by collection handle\n        this.collectionMap = new Map();\n        this.allItems = this.slider.querySelectorAll('[data-collection]');\n        this.allItems.forEach((item) => {\n          let handle = item.dataset.collection;\n          if (!this.collectionMap.has(handle)) {\n            this.collectionMap.set(handle, []);\n          }\n          this.collectionMap.get(handle).push(item);\n        });\n\n        // Event delegation instead of per-button listeners\n        this.addEventListener('click', (event) => {\n          let button = event.target.closest('button');\n          if (!button) return;\n          event.preventDefault();\n          let index = this.buttons.indexOf(button);\n          if (index === -1) return;\n          this.toggleButtons(index);\n          this.toggleLinks(index);\n          if (button.dataset.collection) {\n            this.handleTabClick(button);\n          }\n        });\n\n        // Debounce resize to avoid excessive Flickity recalculations\n        this._onResize = debounce(() => {\n          let flkty = this.getFlickity();\n          if (flkty) {\n            flkty.resize();\n          }\n        }, 150);\n        window.addEventListener('resize', this._onResize);\n\n        if (Shopify.designMode) {\n          this._onBlockSelect = (event) => {\n            const index = this.buttons.indexOf(event.target);\n            if (index !== -1) {\n              this.buttons[index].dispatchEvent(new Event('click'));\n            }\n          };\n          this.addEventListener('shopify:block:select', this._onBlockSelect);\n        }\n\n        // Lazy-load inactive tabs after page load\n        if (!Shopify.designMode) {\n          this.prefetchInactiveTabs();\n        }\n      });\n    }\n\n    disconnectedCallback() {\n      if (this._onResize) {\n        window.removeEventListener('resize', this._onResize);\n      }\n      if (this._onBlockSelect) {\n        this.removeEventListener('shopify:block:select', this._onBlockSelect);\n      }\n    }\n\n    getFlickity() {\n      if (!this.slider) return null;\n      return Flickity.data(this.slider) || null;\n    }\n\n    toggleButtons(index) {\n      this.buttons.forEach((button) => button.classList.remove('active'));\n      this.buttons[index].classList.add('active');\n    }\n\n    toggleLinks(index) {\n      if (this.links.length && this.links[index]) {\n        this.links.forEach((link) => link.classList.remove('active'));\n        this.links[index].classList.add('active');\n      }\n    }\n\n    toggleCollection(handle) {\n      if (!this.slider) return;\n      let flkty = this.getFlickity();\n      let activeItems = this.collectionMap.get(handle) || [];\n\n      // Remove carousel__slide from all\n      this.allItems.forEach((item) => item.classList.remove('carousel__slide'));\n\n      // Add carousel__slide to active items and ensure they're in the flickity-slider container\n      let flickitySlider = flkty ? this.slider.querySelector('.flickity-slider') : null;\n      activeItems.forEach((item) => {\n        item.classList.add('carousel__slide');\n        if (flickitySlider && item.parentNode !== flickitySlider) {\n          flickitySlider.appendChild(item);\n        }\n      });\n\n      if (flkty) {\n        flkty.reloadCells();\n        flkty.select(0, false, true);\n        flkty.resize();\n      }\n    }\n\n    handleTabClick(button) {\n      let handle = button.dataset.collection;\n      if (this.collectionMap.has(handle)) {\n        this.toggleCollection(handle);\n        return;\n      }\n      // Products not loaded yet \u2014 fetch on demand\n      let url = button.dataset.collectionUrl;\n      if (!url) {\n        this.toggleCollection(handle);\n        return;\n      }\n      this.fetchCollection(handle, url).then(() => {\n        this.toggleCollection(handle);\n      });\n    }\n\n    prefetchInactiveTabs() {\n      let loadTabs = () => {\n        this.buttons.forEach((button, index) => {\n          if (index === 0) return;\n          let handle = button.dataset.collection;\n          let url = button.dataset.collectionUrl;\n          if (!handle || !url || this.collectionMap.has(handle)) return;\n          this.fetchCollection(handle, url);\n        });\n      };\n\n      if (document.readyState === 'complete') {\n        loadTabs();\n      } else {\n        window.addEventListener('load', loadTabs, { once: true });\n      }\n    }\n\n    fetchCollection(handle, collectionUrl) {\n      if (this._fetchCache.has(handle)) {\n        return Promise.resolve();\n      }\n      if (this._fetchPromises.has(handle)) {\n        return this._fetchPromises.get(handle);\n      }\n\n      let fetchUrl = collectionUrl + '?section_id=collection-tabs-ajax';\n      let promise = fetch(fetchUrl)\n        .then((response) => response.text())\n        .then((html) => {\n          let parser = new DOMParser();\n          let doc = parser.parseFromString(html, 'text/html');\n          let items = Array.from(doc.querySelectorAll('[data-collection]')).slice(0, this.productLimit);\n\n          // Check for a pre-rendered promotion template for this collection\n          let sectionId = this.slider.dataset.id;\n          let promotionTemplate = document.querySelector(\n            `template[data-promotion-section=\"${sectionId}\"][data-promotion-collection=\"${handle}\"]`\n          );\n          let promotionItems = [];\n          if (promotionTemplate) {\n            let promoClone = promotionTemplate.content.cloneNode(true);\n            promotionItems = Array.from(promoClone.querySelectorAll('[data-collection]'));\n            promotionTemplate.remove();\n          }\n\n          let allNewItems = [...promotionItems, ...items];\n\n          // Insert into the Flickity slider container (or slider root if Flickity not initialized)\n          let flickitySlider = this.slider.querySelector('.flickity-slider');\n          let container = flickitySlider || this.slider;\n          allNewItems.forEach((item) => {\n            container.appendChild(item);\n          });\n\n          // Initialize lazy-loaded images\n          container.querySelectorAll('.lazyload').forEach((img) => {\n            lazySizes.loader.unveil(img);\n          });\n\n          // Update collectionMap and allItems\n          if (!this.collectionMap.has(handle)) {\n            this.collectionMap.set(handle, []);\n          }\n          allNewItems.forEach((item) => {\n            this.collectionMap.get(handle).push(item);\n          });\n          this.allItems = this.slider.querySelectorAll('[data-collection]');\n          this._fetchCache.set(handle, true);\n          this._fetchPromises.delete(handle);\n        })\n        .catch(() => {\n          this._fetchPromises.delete(handle);\n        });\n\n      this._fetchPromises.set(handle, promise);\n      return promise;\n    }\n  }\n  customElements.define('collection-tabs', CollectionTabs);\n}\n"],
  "mappings": "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",
  "names": []
}
