{
  "version": 3,
  "sources": ["/cdn/shop/t/15/assets/s-quick-view.js?nc=20631"],
  "sourcesContent": ["// <s-quick-view id=\"quick-view\"> opens a product preview dialog on the `--open` command.\n// The source button carries data-handle; the preview is the product's quick-view template\n// (templates/product.quick-view.liquid) fetched as HTML, so photos, option buttons and\n// prices come straight from Liquid. This script wires the thumbnails and option buttons.\nclass SQuickView extends HTMLElement {\n  #controller = null;\n  #request = null;\n  #returnFocus = null;\n\n  connectedCallback() {\n    this.#controller = new AbortController();\n    const { signal } = this.#controller;\n    this.addEventListener('command', (event) => {\n      if (event.command !== '--open') return;\n      const handle = event.source?.getAttribute('data-handle');\n      if (handle) this.#open(handle, event.source);\n    }, { signal });\n    const dialog = this.#dialog;\n    dialog?.addEventListener('click', (event) => {\n      if (event.target === dialog) dialog.close();\n    }, { signal });\n    dialog?.addEventListener('close', () => {\n      this.#request?.abort();\n      this.#returnFocus?.focus?.();\n    }, { signal });\n  }\n\n  disconnectedCallback() {\n    this.#controller?.abort();\n    this.#request?.abort();\n  }\n\n  get #dialog() {\n    return this.querySelector('dialog');\n  }\n\n  #message(text, className, href) {\n    const wrap = document.createElement('div');\n    wrap.className = 'flex flex-col items-start gap-4 p-8';\n    const p = document.createElement('p');\n    p.className = className;\n    p.textContent = text;\n    wrap.append(p);\n    if (href) {\n      const link = document.createElement('a');\n      link.href = href;\n      link.className = 'text-sm font-bold uppercase tracking-wider underline underline-offset-4 hover:no-underline';\n      link.textContent = this.dataset.labelDetails || '';\n      wrap.append(link);\n    }\n    return wrap;\n  }\n\n  async #open(handle, source) {\n    const dialog = this.#dialog;\n    const body = this.querySelector('[data-quick-view-body]');\n    if (!dialog || !body) return;\n    this.#returnFocus = source;\n    this.#request?.abort();\n    this.#request = new AbortController();\n    const { signal } = this.#request;\n\n    const root = (this.dataset.rootUrl || '/').replace(/\\/?$/, '/');\n    const productUrl = `${root}products/${encodeURIComponent(handle)}`;\n    body.replaceChildren(this.#message(this.dataset.labelLoading || '', 'text-sm text-on-surface-secondary'));\n    if (!dialog.open) dialog.showModal();\n\n    try {\n      // Prefer the light ?view=quick-view fragment; fall back to the copy the full product page carries.\n      let content = await this.#load(`${productUrl}?view=quick-view&qv=3`, signal);\n      if (!content && !signal.aborted) content = await this.#load(productUrl, signal);\n      if (signal.aborted) return;\n      if (!content) throw new Error('Missing quick view content');\n      const node = document.importNode(content, true);\n      body.replaceChildren(node);\n      this.#wire(node);\n    } catch (error) {\n      if (signal.aborted) return;\n      console.error('Quick view failed to load', error);\n      body.replaceChildren(this.#message(this.dataset.labelError || '', 'text-sm text-sale', productUrl));\n    }\n  }\n\n  async #load(url, signal) {\n    const response = await fetch(url, { signal, headers: { Accept: 'text/html' } });\n    if (!response.ok) return null;\n    const doc = new DOMParser().parseFromString(await response.text(), 'text/html');\n    const direct = doc.querySelector('[data-quick-view-content]');\n    if (direct) return direct;\n    const source = doc.querySelector('template[data-quick-view-source]');\n    return source?.content.querySelector('[data-quick-view-content]') || null;\n  }\n\n  #wire(root) {\n    let variants = [];\n    try {\n      variants = JSON.parse(root.querySelector('[data-qv-variants]')?.textContent || '[]');\n    } catch {\n      variants = [];\n    }\n    const labels = root.querySelector('[data-qv-labels]')?.dataset || {};\n    const main = root.querySelector('[data-qv-main]');\n    const thumbs = [...root.querySelectorAll('[data-qv-thumb]')];\n    const idInput = root.querySelector('[data-qv-variant-id]');\n    const price = root.querySelector('[data-qv-price]');\n    const add = root.querySelector('[data-qv-add]');\n    const addLabel = root.querySelector('[data-qv-add-label]');\n    const checkout = root.querySelector('[data-qv-checkout]');\n    const radios = [...root.querySelectorAll('[data-qv-option]')];\n\n    const showImage = (src, mediaId) => {\n      if (main && src) {\n        main.src = src;\n        main.removeAttribute('srcset');\n      }\n      thumbs.forEach((thumb) => {\n        const match = mediaId != null ? thumb.dataset.mediaId === String(mediaId) : thumb.dataset.src === src;\n        thumb.setAttribute('aria-pressed', String(match));\n      });\n    };\n\n    thumbs.forEach((thumb) => {\n      thumb.addEventListener('click', () => showImage(thumb.dataset.src, thumb.dataset.mediaId));\n    });\n\n    const selected = () => {\n      const positions = [...new Set(radios.map((radio) => radio.dataset.qvOption))].sort();\n      return positions.map((position) => radios.find((radio) => radio.dataset.qvOption === position && radio.checked)?.value);\n    };\n\n    const markUnavailable = (chosen) => {\n      radios.forEach((radio) => {\n        const index = Number(radio.dataset.qvOption) - 1;\n        const trial = [...chosen];\n        trial[index] = radio.value;\n        const variant = variants.find((v) => v.options.every((value, i) => value === trial[i]));\n        radio.toggleAttribute('data-unavailable', !variant || !variant.available);\n      });\n    };\n\n    const sync = () => {\n      const chosen = selected();\n      root.querySelectorAll('[data-qv-option-label]').forEach((label) => {\n        label.textContent = chosen[Number(label.dataset.qvOptionLabel) - 1] || '';\n      });\n      markUnavailable(chosen);\n      const variant = variants.find((v) => v.options.every((value, i) => value === chosen[i]));\n      const available = Boolean(variant?.available);\n      if (idInput && variant) idInput.value = String(variant.id);\n      if (price && variant) {\n        const priceTemplate = root.querySelector(`template[data-qv-price-for=\"${variant.id}\"]`);\n        if (priceTemplate) price.replaceChildren(priceTemplate.content.cloneNode(true));\n      }\n      if (add) add.disabled = !available;\n      if (checkout) checkout.disabled = !available;\n      if (addLabel) addLabel.textContent = available ? labels.add || '' : labels.soldOut || '';\n      if (variant?.image) showImage(variant.image, variant.mediaId);\n    };\n\n    radios.forEach((radio) => radio.addEventListener('change', sync));\n    if (radios.length) markUnavailable(selected());\n  }\n}\n\nif (!customElements.get('s-quick-view')) customElements.define('s-quick-view', SQuickView);\n"],
  "mappings": "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",
  "names": []
}
