{
  "version": 3,
  "sources": ["/cdn/shop/t/380/assets/product-video-modal.js?section_id=video-modal"],
  "sourcesContent": ["/**\n * Product Video Modal\n *\n * Opens a YouTube video modal with a product lockup bar when triggered\n * from product cards. Lazily creates modals on first click to avoid\n * pre-fetching for every product card on collection pages.\n *\n * Reuses: <lite-youtube> web component, .video-modal__container CSS,\n * and the video-modal.liquid snippet HTML.\n */\n(function () {\n  let sectionHtmlPromise = null;\n  const modals = new Map();\n\n  function fetchSectionHtml() {\n    if (!sectionHtmlPromise) {\n      sectionHtmlPromise = fetch(\"?section_id=video-modal\")\n        .then((r) => r.text())\n        .catch(() => {\n          sectionHtmlPromise = null;\n          return \"\";\n        });\n    }\n    return sectionHtmlPromise;\n  }\n\n  function pauseAllYouTube() {\n    document.querySelectorAll(\"lite-youtube iframe\").forEach((iframe) => {\n      iframe.contentWindow.postMessage(\n        '{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}',\n        \"*\"\n      );\n    });\n  }\n\n  function closeModal(container) {\n    if (!container) return;\n    pauseAllYouTube();\n    container.classList.remove(\"active\");\n  }\n\n  function buildLockup(trigger, data) {\n    const url = data?.url ?? trigger.dataset.productUrl ?? \"\";\n    const vendor = data?.vendor ?? trigger.dataset.productVendor ?? \"\";\n    const title = data?.title ?? trigger.dataset.productTitle ?? \"\";\n    const image = data?.image ?? trigger.dataset.productImage ?? \"\";\n\n    const lockup = document.createElement(\"div\");\n    lockup.className = \"video-modal__product-lockup\";\n\n    // Product info link (image + vendor + title)\n    const infoLink = document.createElement(\"a\");\n    infoLink.href = url;\n    infoLink.className = \"video-modal__product-info\";\n\n    if (image) {\n      const img = document.createElement(\"img\");\n      img.src = image;\n      img.alt = \"\";\n      img.className = \"video-modal__product-img\";\n      img.loading = \"lazy\";\n      infoLink.appendChild(img);\n    }\n\n    const textWrap = document.createElement(\"div\");\n    textWrap.className = \"video-modal__product-text\";\n\n    const vendorEl = document.createElement(\"span\");\n    vendorEl.className = \"video-modal__product-vendor\";\n    vendorEl.textContent = vendor;\n    textWrap.appendChild(vendorEl);\n\n    const titleEl = document.createElement(\"span\");\n    titleEl.className = \"video-modal__product-title\";\n    titleEl.textContent = title;\n    textWrap.appendChild(titleEl);\n\n    infoLink.appendChild(textWrap);\n    lockup.appendChild(infoLink);\n\n    // CTA \u2014 clone from <template> (product card or PDP) or PDP primary button\n    const tpl = trigger\n      .closest(\".product-item, .compare-cell\")\n      ?.querySelector(\".video-review-cta-tpl\")\n      || document.querySelector(\".pdp-video-cta-tpl\");\n\n    if (tpl) {\n      const ctaWrap = document.createElement(\"div\");\n      ctaWrap.className = \"video-modal__product-cta\";\n      const clone = tpl.content.cloneNode(true);\n\n      // Fix tabindex (card buttons use -1 because they're inside a link)\n      clone.querySelectorAll(\"[tabindex]\").forEach((el) => {\n        el.removeAttribute(\"tabindex\");\n      });\n\n      ctaWrap.appendChild(clone);\n      lockup.appendChild(ctaWrap);\n    } else {\n      // Fallback: clone PDP primary CTA button\n      const pdpCta = document.querySelector(\"[data-inline-buttons] .button--primary\");\n      if (pdpCta) {\n        const ctaWrap = document.createElement(\"div\");\n        ctaWrap.className = \"video-modal__product-cta\";\n        const wrapper = pdpCta.closest(\"cart-add\") || pdpCta.closest(\"form\") || pdpCta;\n        const clone = wrapper.cloneNode(true);\n        clone.querySelectorAll(\"[tabindex]\").forEach((el) => el.removeAttribute(\"tabindex\"));\n        ctaWrap.appendChild(clone);\n        lockup.appendChild(ctaWrap);\n      }\n    }\n\n    return lockup;\n  }\n\n  async function getOrCreateModal(trigger) {\n    const videoId = trigger.dataset.videoId;\n    if (!videoId) return null;\n\n    if (modals.has(videoId)) return modals.get(videoId);\n\n    const html = await fetchSectionHtml();\n    if (!html) return null;\n\n    const wrapper = document.createElement(\"div\");\n    const params = \"autoplay=1&enablejsapi=1\";\n    wrapper.innerHTML = html\n      .replace('videoid=\"\"', `videoid=\"${videoId}\"`)\n      .replace(params, params);\n\n    // Append the Shopify section wrapper to the body\n    const sectionWrapper = wrapper.firstElementChild;\n    if (!sectionWrapper) return null;\n    document.body.appendChild(sectionWrapper);\n\n    // The actual modal container is inside the Shopify section wrapper\n    const container =\n      sectionWrapper.querySelector(\".video-modal__container\") || sectionWrapper;\n\n    // Insert product lockup after the video wrapper\n    const content = container.querySelector(\".video-modal__content\");\n    if (content) {\n      content.appendChild(buildLockup(trigger));\n    }\n\n    // Close handlers\n    container.querySelector(\".video-modal__veil\")?.addEventListener(\"click\", () => {\n      closeModal(container);\n    });\n\n    container.addEventListener(\"keyup\", (e) => {\n      if (e.key === \"Escape\") closeModal(container);\n    });\n\n    modals.set(videoId, container);\n    return container;\n  }\n\n  function fireTrackingEvents(trigger, source) {\n    const videoId = trigger.dataset.videoId || trigger.dataset.id || \"\";\n    const vendor = trigger.dataset.productVendor || \"\";\n    const title = trigger.dataset.productTitle || \"\";\n    const url = trigger.dataset.productUrl || \"\";\n    const fullUrl = url ? window.location.origin + url : window.location.href;\n\n    if (window.klaviyo) {\n      window.klaviyo.push([\n        \"track\",\n        \"Watched Video Review\",\n        {\n          ProductName: title,\n          ProductVendor: vendor,\n          ProductURL: fullUrl,\n          VideoID: videoId,\n          Source: source,\n        },\n      ]);\n    }\n\n    if (typeof gtag === \"function\") {\n      // gtag(\"event\", \"watched_video_review\", {\n      //   product_name: title,\n      //   product_vendor: vendor,\n      //   product_url: fullUrl,\n      //   video_id: videoId,\n      //   source: source,\n      // });\n      window.LeafCustomEvents.publish(\"watched_video_review\", {\n        product_name: title,\n        product_vendor: vendor,\n        product_url: fullUrl,\n        video_id: videoId,\n        source: source,\n      });\n    }\n  }\n\n  // Product card triggers \u2014 lazy modal creation\n  document.addEventListener(\"click\", async (e) => {\n    const trigger = e.target.closest(\".video-review-trigger\");\n    if (!trigger) return;\n\n    e.preventDefault();\n    e.stopPropagation();\n\n    const container = await getOrCreateModal(trigger);\n    if (!container) return;\n\n    container.classList.add(\"active\");\n\n    const liteYt = container.querySelector(\"lite-youtube\");\n    if (liteYt) {\n      liteYt.dispatchEvent(\n        new MouseEvent(\"click\", { bubbles: true, cancelable: true })\n      );\n    }\n\n    const source = trigger.closest(\".product-item\") ? \"Product Card\" : \"PDP\";\n    fireTrackingEvents(trigger, source);\n  });\n\n  // PDP video modal \u2014 inject lockup bar + Klaviyo tracking\n  document.addEventListener(\n    \"click\",\n    (e) => {\n      const trigger = e.target.closest(\n        \".video-modal__play:not(.video-review-trigger)\"\n      );\n      if (!trigger) return;\n\n      const videoId = trigger.dataset.id || \"\";\n      if (!videoId) return;\n\n      if (document.body.dataset.pageType !== \"product\") return;\n\n      let vendor = trigger.dataset.productVendor || \"\";\n      let title = trigger.dataset.productTitle || \"\";\n      let url = trigger.dataset.productUrl || \"\";\n      let image = trigger.dataset.productImage || \"\";\n\n      // Fallback: read from any element with product data attrs (e.g. wishlist button)\n      if (!vendor || !image) {\n        const el = document.querySelector(\"[data-product-vendor]\");\n        if (el) {\n          vendor = vendor || el.dataset.productVendor || \"\";\n          title = title || el.dataset.productTitle || \"\";\n          url = url || el.dataset.productUrl || \"\";\n          image = image || el.dataset.productImage || \"\";\n        }\n      }\n      if (!title) {\n        const el = document.querySelector(\"h1\");\n        if (el) title = el.textContent.trim();\n      }\n      if (!url) url = window.location.pathname;\n\n      const lockupData = { url, vendor, title, image };\n\n      // Inject product lockup bar after video-modal.js opens the modal\n      requestAnimationFrame(() => {\n        const liteYt = Array.from(\n          document.querySelectorAll(\".video-modal__container lite-youtube\")\n        ).find((el) => el.getAttribute(\"videoid\") === videoId);\n        if (!liteYt) return;\n\n        const content = liteYt.closest(\".video-modal__content\");\n        if (!content || content.querySelector(\".video-modal__product-lockup\")) return;\n\n        content.appendChild(buildLockup(trigger, lockupData));\n      });\n\n      // Klaviyo tracking\n      fireTrackingEvents(trigger, \"PDP\");\n    },\n    true\n  );\n})();\n"],
  "mappings": "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",
  "names": []
}
