{
  "version": 3,
  "sources": ["/cdn/shop/t/4/assets/pivot-product.js?x=1"],
  "sourcesContent": ["/* Pivot: product page. Carousel dots (mobile), the Description / Sizing / Shipping pills,\n   and Add to Cart without leaving the page (updates the menu's cart count and fill). */\nif (!customElements.get('pivot-product')) {\n  customElements.define(\n    'pivot-product',\n    class PivotProduct extends HTMLElement {\n      connectedCallback() {\n        this.reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)');\n        this.initCarousel();\n        this.initTabs();\n        this.initForm();\n        this.initSizes();\n      }\n\n      // The theme editor re-renders sections; don't leave a listener behind\n      disconnectedCallback() {\n        if (this.onCartUpdated) document.removeEventListener('pivot:cart-updated', this.onCartUpdated);\n      }\n\n      /* ---------- Carousel: one dot per photo, filled = the photo showing ---------- */\n\n      initCarousel() {\n        const carousel = this.querySelector('[data-pivot-carousel]');\n        const dots = [...this.querySelectorAll('[data-pivot-dots] button')];\n        if (!carousel || !dots.length) return;\n\n        const current = () => Math.round(carousel.scrollLeft / carousel.clientWidth);\n        const goTo = (index) =>\n          carousel.scrollTo({\n            left: Math.max(0, Math.min(index, dots.length - 1)) * carousel.clientWidth,\n            behavior: this.reduceMotion.matches ? 'auto' : 'smooth',\n          });\n\n        let frame;\n        carousel.addEventListener('scroll', () => {\n          cancelAnimationFrame(frame);\n          frame = requestAnimationFrame(() => {\n            const index = current();\n            dots.forEach((dot, i) => dot.setAttribute('aria-current', i === index));\n          });\n        });\n        dots.forEach((dot, i) => dot.addEventListener('click', () => goTo(i)));\n\n        // Touch and trackpads swipe natively (scroll-snap). A mouse can't drag a scroll area,\n        // so click-and-drag is added here; a short flick is enough to move one photo.\n        let drag = null;\n        carousel.addEventListener('pointerdown', (event) => {\n          if (event.pointerType !== 'mouse' || carousel.scrollWidth <= carousel.clientWidth) return;\n          drag = { x: event.clientX, scroll: carousel.scrollLeft, start: current(), moved: false };\n          carousel.classList.add('is-dragging');\n          try {\n            carousel.setPointerCapture(event.pointerId); // keep the drag going if the pointer leaves the photo\n          } catch (e) {}\n        });\n        carousel.addEventListener('pointermove', (event) => {\n          if (!drag) return;\n          const dx = event.clientX - drag.x;\n          if (Math.abs(dx) > 3) drag.moved = true;\n          carousel.scrollLeft = drag.scroll - dx;\n        });\n        const endDrag = (event) => {\n          if (!drag) return;\n          const dx = event.clientX - drag.x;\n          const threshold = carousel.clientWidth * 0.15;\n          const target = dx < -threshold ? drag.start + 1 : dx > threshold ? drag.start - 1 : drag.start;\n          carousel.classList.remove('is-dragging');\n          goTo(target);\n          drag = null;\n        };\n        carousel.addEventListener('pointerup', endDrag);\n        carousel.addEventListener('pointercancel', endDrag);\n        carousel.addEventListener('dragstart', (event) => event.preventDefault());\n      }\n\n      /* ---------- Pills: one open at a time; the space below slides open ---------- */\n\n      initTabs() {\n        this.tabs = this.querySelector('[data-pivot-tabs]');\n        if (!this.tabs) return;\n        this.wrap = this.tabs.querySelector('[data-pivot-tab-wrap]');\n        this.openPanel = this.tabs.querySelector('[data-pivot-panel]:not([hidden])');\n        this.tabs.querySelectorAll('[data-pivot-tab]').forEach((button) =>\n          button.addEventListener('click', () => this.toggleTab(button))\n        );\n      }\n\n      toggleTab(button) {\n        const opening = button.getAttribute('aria-expanded') !== 'true';\n        const from = this.tabs.classList.contains('has-open') ? this.wrap.getBoundingClientRect().height : 0;\n        this.animation?.cancel();\n\n        this.tabs.querySelectorAll('[data-pivot-tab]').forEach((tab) => {\n          const active = opening && tab === button;\n          tab.setAttribute('aria-expanded', active);\n          this.tabs.querySelector(`[data-pivot-panel=\"${tab.dataset.pivotTab}\"]`).hidden = !active;\n        });\n\n        if (opening) this.tabs.classList.add('has-open');\n        const to = opening ? this.wrap.scrollHeight : 0;\n        const closingPanel = opening ? null : this.openPanel;\n        this.openPanel = opening ? this.tabs.querySelector(`[data-pivot-panel=\"${button.dataset.pivotTab}\"]`) : null;\n\n        if (this.reduceMotion.matches) {\n          if (!opening) this.tabs.classList.remove('has-open');\n          return;\n        }\n\n        // Keep the closing panel's text in place while the space shrinks\n        closingPanel?.removeAttribute('hidden');\n        this.animation = this.wrap.animate(\n          { height: [`${from}px`, `${to}px`] },\n          { duration: 320, easing: 'cubic-bezier(0.2, 0, 0, 1)' }\n        );\n        this.animation.onfinish = () => {\n          this.animation = null;\n          if (!opening) {\n            closingPanel?.setAttribute('hidden', '');\n            this.tabs.classList.remove('has-open');\n          }\n        };\n      }\n\n      /* ---------- Size picker: switches the variant (price, availability, URL) ---------- */\n\n      initSizes() {\n        const group = this.querySelector('[data-pivot-sizes]');\n        const data = this.querySelector('[data-pivot-variants]');\n        if (!group || !data) return;\n        const variants = JSON.parse(data.textContent);\n        const position = Number(group.dataset.position) - 1;\n        const form = this.querySelector('[data-pivot-product-form]');\n        const idInput = form.querySelector('input[name=\"id\"]');\n        const button = form.querySelector('[data-pivot-add]');\n        const price = this.querySelector('[data-pivot-price]');\n\n        group.addEventListener('click', (event) => {\n          const choice = event.target.closest('[data-value]');\n          if (!choice) return;\n          const current = variants.find((v) => String(v.id) === idInput.value) || variants[0];\n          const wanted = current.options.map((value, i) => (i === position ? choice.dataset.value : value));\n          const variant =\n            variants.find((v) => v.options.every((value, i) => value === wanted[i])) ||\n            variants.find((v) => v.options[position] === choice.dataset.value);\n          if (!variant) return;\n\n          group.querySelectorAll('[data-value]').forEach((b) => b.setAttribute('aria-pressed', b === choice));\n          idInput.value = variant.id;\n          price.textContent = variant.available ? this.formatPrice(variant.price) : price.dataset.soldOut;\n          this.renderAddButton(variant.available);\n          form.querySelector('[data-pivot-add-error]').hidden = true;\n          const url = new URL(window.location.href);\n          url.searchParams.set('variant', variant.id);\n          history.replaceState(null, '', url);\n        });\n      }\n\n      formatPrice(cents) {\n        const formatted = (cents / 100).toLocaleString(undefined, { style: 'currency', currency: window.Shopify?.currency?.active || 'USD' });\n        return formatted.replace(/\\.00(?=\\D*$)/, '');\n      }\n\n      /* ---------- Add to cart ---------- */\n\n      /* One of a kind: a piece already in the cart shows Added! and can't be added again.\n         Removing it from the cart (panel or /cart) turns the button back into Add to cart. */\n      renderAddButton(available = this.variantAvailable) {\n        const form = this.querySelector('[data-pivot-product-form]');\n        if (!form) return;\n        const button = form.querySelector('[data-pivot-add]');\n        const id = form.querySelector('input[name=\"id\"]').value;\n        this.variantAvailable = available;\n        const inCart = this.cartVariants.has(id);\n        button.disabled = !available || inCart;\n        if (!available) button.textContent = button.dataset.labelSoldOut;\n        else button.textContent = inCart ? button.dataset.labelAdded : button.dataset.labelAdd;\n      }\n\n      initForm() {\n        const form = this.querySelector('[data-pivot-product-form]');\n        if (!form) return;\n        const button = form.querySelector('[data-pivot-add]');\n        const error = form.querySelector('[data-pivot-add-error]');\n        this.cartVariants = new Set((button.dataset.cartVariants || '').split(',').filter(Boolean));\n        this.variantAvailable = !button.disabled || this.cartVariants.has(form.querySelector('input[name=\"id\"]').value);\n\n        this.onCartUpdated = (event) => {\n          this.cartVariants = new Set((event.detail?.items || []).map((item) => String(item.variant_id)));\n          this.renderAddButton();\n        };\n        document.addEventListener('pivot:cart-updated', this.onCartUpdated);\n\n        form.addEventListener('submit', async (event) => {\n          event.preventDefault();\n          if (button.disabled) return;\n          button.disabled = true;\n          error.hidden = true;\n\n          try {\n            const addUrl = `${window.routes?.cart_add_url || '/cart/add'}.js`;\n            const response = await fetch(addUrl, {\n              method: 'POST',\n              headers: { Accept: 'application/json' },\n              body: new FormData(form),\n            });\n            const result = await response.json();\n            if (!response.ok) throw new Error(result.description || result.message);\n\n            const cart = await (await fetch(`${window.routes?.cart_url || '/cart'}.js`)).json();\n            document.dispatchEvent(new CustomEvent('pivot:cart-updated', { detail: cart }));\n          } catch (e) {\n            error.textContent = e.message;\n            error.hidden = false;\n            button.disabled = false;\n          }\n        });\n      }\n    }\n  );\n}\n"],
  "mappings": "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",
  "names": []
}
