{
  "version": 3,
  "sources": ["/cdn/shop/t/49/assets/custom.js?cb=1"],
  "sourcesContent": ["$(document).ready(function() {\n      if($(\"body\").hasClass(\"template-product-gift-card\")){\n            $('.template-product-gift-card fieldset .form__label__value, fieldset label span').each(function(){\n            var amountText = $(this).text().trim();\n            var amount = parseFloat(amountText.replace(/[^0-9.-]+/g, ''));\n            if (!isNaN(amount)) {\n            var formattedAmount = window.formatMoney(amount * 100, theme.settings.money_with_currency_format);\n            $(this).text(formattedAmount);\n            }\n            });\n            \n            $('.variations label').on('click', function() {\n            var denomination_price = $(this).find(\"span\").text(); \n            setTimeout(function() {\n            $(\".gift-card-selected-var\").text(denomination_price);\n            }, 300);\n            });\n               \n            const intervalId = setInterval(() => {\n            const popupBackdrop = document.querySelector('.Rise-popup-backdrop');\n            if (popupBackdrop && popupBackdrop.classList.contains('show')) {\n            document.documentElement.dispatchEvent(new CustomEvent('cart:refresh', {\n            bubbles: true\n            }));\n            } \n            }, 100);\n      }\n document.addEventListener(\"product:variant-change\", function (evt) {\n  const newVariant = event.detail.variant;\n\n  if (newVariant && typeof newVariant.inventory_quantity !== 'undefined') {\n    const newQty = newVariant.inventory_quantity;\n\n    // Find the span inside the cstm-inventory-content and update it\n    const qtySpan = document.querySelector('.cstm-inventory-content .inventory_quantity');\n\n    if (qtySpan) {\n      qtySpan.textContent = newQty;\n    } else {\n      console.warn('inventory_quantity span not found.');\n    }\n  } else {\n    console.warn('No inventory_quantity on variant.');\n  }\nsetTimeout(() => {\n  const getThreshold = document.querySelector(\".product-inventory-notice--bar-new.new-threshold\");\n\n  if (getThreshold) {\n\n    getThreshold.classList.add(\"new-threshold-bar\");\n\n    const getAttribute = getThreshold.getAttribute(\"threshold\"); \n\n    if (getAttribute) {\n\n      let numberValue = parseFloat(getAttribute); \n\n      if(numberValue >500){\n          numberValue = 500;\n      }\n      let percentValue = (numberValue / 500) * 100;\n      const spanInside = getThreshold.querySelector(\"span\");\n      if (spanInside) {\n        \n        spanInside.style.setProperty('width', percentValue + \"%\", 'important');\n      }\n    }\n  } else {\n    console.warn(\"Element '.new-threshold' not found. load\");\n  }\n}, 1400); \n});\n\n\n\n\n\nconst getThreshold = document.querySelector(\".product-inventory-notice--bar-new.new-threshold\");\nif (getThreshold) {\n\n    getThreshold.classList.add(\"new-threshold-bar-load\");\n\n    const getAttribute = getThreshold.getAttribute(\"threshold\"); \n\n    if (getAttribute) {\n\n      let numberValue = parseFloat(getAttribute); \n\n        if(numberValue >500){\n          numberValue = 500;\n      }\n      let percentValue = (numberValue / 500) * 100;\n      const spanInside = getThreshold.querySelector(\"span\");\n      if (spanInside) {\n        \n        spanInside.style.setProperty('width', percentValue + \"%\", 'important');\n      }\n    }\n  } else {\n    console.warn(\"Element '.new-threshold' not found.\");\n  }\n});\n\n\n\n// document.addEventListener(\"product:variant-change\", function (evt) {\n//   console.log(\"Variant-change\")\n//     const variant = evt.detail.variant;\n//     console.log(\"variant\",variant);\n//     if (variant.featured_media && variant.featured_media.preview_image && variant.featured_media.preview_image.src) {\n//         let featuredSrc = variant.featured_media.preview_image.src;\n\n//         // Select the img inside the div with class 'product-single__media-image'\n//         const imgEl = document.querySelector(\".product-single__media-image img\");\n\n//         if (imgEl) {\n//             imgEl.src = featuredSrc;\n//             imgEl.srcset = featuredSrc;\n\n//             console.log(\"Updated image src and srcset:\", featuredSrc);\n//         }\n//     } else {\n//         console.log(\"No featured media src found for this variant.\");\n//     }\n// });\n\n\n\n\n// document.addEventListener(\"product:variant-change\", function (evt) {\n//     const variant = evt.detail.variant;\n//     if (\n//         variant.featured_media &&\n//         variant.featured_media.preview_image &&\n//         variant.featured_media.preview_image.src\n//     ) {\n//         let featuredSrc = variant.featured_media.preview_image.src;\n//         const imgEl = document.querySelector(\".product-single__media-image img\");\n\n//         if (imgEl) {\n//             const currentSrc = imgEl.src;\n//             const newSrcAbsolute = new URL(featuredSrc, window.location.origin).href;\n//             if (currentSrc === newSrcAbsolute) {\n//                 return;\n//             }\n//             imgEl.src = featuredSrc;\n//             imgEl.srcset = featuredSrc;\n//         }\n//     }\n// });\n\n\n\n\n\n// document.addEventListener(\"product:variant-change\", function (evt) {\n//     if (window.innerWidth < 1024) {\n//         console.log(\"Skipping variant change logic on mobile/tablet\");\n//         return; \n//     }\n\n//     console.log(\"Variant-change\");\n//     const variant = evt.detail.variant;\n\n//     if (\n//         variant.featured_media &&\n//         variant.featured_media.preview_image &&\n//         variant.featured_media.preview_image.src\n//     ) {\n//         let featuredSrc = variant.featured_media.preview_image.src;\n//         const newSrcAbsolute = new URL(featuredSrc, window.location.origin).href;\n\n//         const imgEl = document.querySelector(\".product-single__media-image img\");\n\n//         if (imgEl) {\n//             const currentSrc = imgEl.src;\n\n//             if (currentSrc === newSrcAbsolute) {\n//                 console.log(\"Image src already matches. No update needed.\");\n//             } else {\n//                 imgEl.src = featuredSrc;\n//                 imgEl.srcset = featuredSrc;\n//                 console.log(\"Updated image src and srcset:\", featuredSrc);\n//             }\n//         }\n\n//         const normalizeShopifyImageUrl = (url) => {\n//             return url\n//                 .replace(/_[0-9]+x[0-9]+_crop_center/, '')\n//                 .split('?')[0];\n//         };\n\n//         const all_cstm_elements = document.querySelectorAll('.product-images__slide.product-images__slide-image');\n//         const elementsExceptFirst = Array.from(all_cstm_elements).slice(1);\n\n//         elementsExceptFirst.forEach((element, index) => {\n//             const img = element.querySelector('img');\n//             if (!img) return;\n\n//             const imgSrcAbsolute = new URL(img.src, window.location.origin).href;\n\n//             const normalizedImgSrc = normalizeShopifyImageUrl(imgSrcAbsolute);\n//             const normalizedNewSrc = normalizeShopifyImageUrl(newSrcAbsolute);\n\n//             console.log(\"normalizedImgSrc:\", normalizedImgSrc);\n//             console.log(\"normalizedNewSrc:\", normalizedNewSrc);\n\n//             if (normalizedImgSrc === normalizedNewSrc) {\n//                 console.log(`Removing element #${index + 1} because image src matches featured src.`);\n//                 setTimeout(function () {\n//                     element.remove();\n//                 }, 500);\n//             }\n//         });\n\n//     } else {\n//         console.log(\"No featured media src found for this variant.\");\n//     }\n// });\n\n\ndocument.addEventListener(\"product:variant-change\", function (evt) {\n  const variant = evt.detail.variant;\n  if (\n    variant.featured_media &&\n    variant.featured_media.preview_image &&\n    variant.featured_media.preview_image.src\n  ) {\n    const featuredSrc = variant.featured_media.preview_image.src;\n    const imgEl = document.querySelector(\".variant_image img\");\n    if (imgEl) {\n      if (imgEl.src === featuredSrc) {\n        return;\n      } else {\n        imgEl.src = featuredSrc;\n        imgEl.srcset = `\n          ${featuredSrc}_375x469_crop_center.webp 375w,\n          ${featuredSrc}_640x800_crop_center.webp 640w,\n          ${featuredSrc}_960x1200_crop_center.webp 960w\n        `;\n      }\n    } else {\n    }\n  } else {\n  }\n  \n\n});\n\ndocument.addEventListener(\"product:variant-change\", function (evt) {\n  setTimeout(function(){\n     const variant = evt.detail.variant;\n  if (\n    variant.featured_media &&\n    variant.featured_media.preview_image &&\n    variant.featured_media.preview_image.src\n  ) {\n    const featuredSrcmobile = variant.featured_media.preview_image.src;\n      const imgElmobile = document.querySelector(\".Nav_variant_img img\");\n    if (imgElmobile) {\n      if (imgElmobile.src === featuredSrcmobile) {\n        return;\n      } else {\n        imgElmobile.src = featuredSrcmobile;\n        imgElmobile.srcset = `\n          ${featuredSrcmobile}_375x469_crop_center.webp 375w,\n          ${featuredSrcmobile}_640x800_crop_center.webp 640w,\n          ${featuredSrcmobile}_960x1200_crop_center.webp 960w\n        `;\n      }\n    } else {\n    }\n  } else {\n  }\n\n    },500)\n\n          const flickityElementMainImg = document.querySelector('#Product-Slider');\n\n      if (flickityElementMainImg && typeof Flickity !== 'undefined') {\n        const flktyMainImg = Flickity.data(flickityElementMainImg);\n          //  alert(22);\n        if (flktyMainImg) {\n          flktyMainImg.reloadCells();\n          flktyMainImg.resize();\n          flktyMainImg.select(0);\n        }\n      }\n\n});\n\n\n// document.addEventListener('DOMContentLoaded', function() {\n//   const not_change_imgs = Array.from(document.querySelectorAll('.product-images__slide:not(.variant_image)'));\n//   not_change_imgs.forEach(img => {\n//     console.log(img);\n//   });\n// });\n\n// document.addEventListener('DOMContentLoaded', function() {\n//   const variantSrcDiv = document.querySelector('.cstm-all-variant-src');\n//   console.log(\"variantSrcDiv\",variantSrcDiv);\n//   const variantSrcText = variantSrcDiv ? variantSrcDiv.innerText : '';\n//   const variantUrls = variantSrcText\n//     .split('\\n')\n//     .map(line => line.trim())\n//     .filter(line => line && !line.includes('No image'))\n//     .map(line => line.split(' - ')[1]);\n//    console.log(\"variantUrls\",variantUrls);\n\n\n//   const notChangeImgs = Array.from(document.querySelectorAll('.product-images__slide:not(.variant_image)'));\n//   notChangeImgs.forEach(slide => {\n//     const img = slide.querySelector('img');\n//     console.log('img',img);\n//     if (variantUrls.includes(img.src)) {\n//       setTimeout(function(){\n//       slide.style.display = 'none';\n//       },1000)\n//     }\n//   });\n// });\n\n// document.addEventListener('DOMContentLoaded', function () {\n//   // Run only on desktop (e.g. width >= 768px)\n//   // if (window.innerWidth < 768) {\n//   //   console.log('Skipping script on mobile');\n//   //   return;\n//   // }\n//   // Extract unique image ID from filename (e.g. 5132c918-3d78-4273-a15b-c93070121c9b)\n//   function extractImageId(url) {\n//     try {\n//       const cleanUrl = url.split('?')[0]; // remove query string\n//       const parts = cleanUrl.split('/');\n//       const filename = parts[parts.length - 1]; // get filename\n//       const idMatch = filename.match(/_(\\w{8}-\\w{4}-\\w{4}-\\w{4}-\\w{12})_/);\n//       return idMatch ? idMatch[1] : null;\n//     } catch (e) {\n//       return null;\n//     }\n//   }\n//   // Get all variant image IDs\n//   const variantSrcItems = document.querySelectorAll('.cstm-all-variant-src li[data-src]');\n//   const variantImageIds = Array.from(variantSrcItems)\n//     .map(li => extractImageId(li.getAttribute('data-src')))\n//     .filter(id => id);\n\n//   console.log(\"Variant image IDs:\", variantImageIds);\n\n//   // Find and remove slides with matching image IDs\n//   const slides = document.querySelectorAll('.product-images__slide:not(.variant_image)');\n//   slides.forEach(slide => {\n//     const img = slide.querySelector('img');\n//     if (img) {\n//       const imgId = extractImageId(img.src);\n//       console.log('Image ID:', imgId);\n//       if (variantImageIds.includes(imgId)) {\n//         console.log('Removing slide with image ID:', imgId);\n//         slide.remove(); // uncomment to actually remove\n//       }\n//     }\n//   });\n\n//   const slidesMobiles = document.querySelectorAll('.product-thumbnail.product-images__slide-item--variant:not(.Nav_variant_img)');\n//     slidesMobiles.forEach(slidesMobile => {\n//     const imgMobile = slidesMobile.querySelector('img');\n//     if (imgMobile) {\n//       const imgIdMobile = extractImageId(imgMobile.src);\n//       console.log('Image ID Mobile:', imgIdMobile);\n//       if (variantImageIds.includes(imgIdMobile)) {\n//         console.log('Removing slide with image ID Mobile:', imgIdMobile);\n//         slidesMobile.parentNode.remove();\n//       }\n//     }\n//   });\n\n// });\n\n\n\n\ndocument.addEventListener('DOMContentLoaded', function () {\n  // Extract unique image ID from filename (e.g. 5132c918-3d78-4273-a15b-c93070121c9b)\n  function extractImageId(url) {\n    try {\n      const cleanUrl = url.split('?')[0]; // remove query string\n      const parts = cleanUrl.split('/');\n      const filename = parts[parts.length - 1]; // get filename\n      const idMatch = filename.match(/_(\\w{8}-\\w{4}-\\w{4}-\\w{4}-\\w{12})_/);\n      return idMatch ? idMatch[1] : null;\n    } catch (e) {\n      return null;\n    }\n  }\n\n  // Get all variant image IDs\n  const variantSrcItems = document.querySelectorAll('.cstm-all-variant-src li[data-src]');\n  const variantImageIds = Array.from(variantSrcItems)\n    .map(li => extractImageId(li.getAttribute('data-src')))\n    .filter(id => id);\n\n\n  // Find and remove slides with matching image IDs (desktop)\n  const slides = document.querySelectorAll('.product-images__slide:not(.variant_image)');\n  slides.forEach(slide => {\n    const img = slide.querySelector('img');\n    if (img) {\n      const imgId = extractImageId(img.src);\n\n      if (variantImageIds.includes(imgId)) {\n\n        slide.remove();\n      }\n    }\n  });\n\n\n\n       \n      const flickityElementMainImg = document.querySelector('#Product-Slider');\n\n      if (flickityElementMainImg && typeof Flickity !== 'undefined') {\n        const flktyMainImg = Flickity.data(flickityElementMainImg);\n          //  alert(1);\n        if (flktyMainImg) {\n          flktyMainImg.reloadCells();\n          flktyMainImg.resize();\n          flktyMainImg.select(0);\n        }\n      }\n \n\n\n\n\n  // Find and remove slides with matching image IDs (mobile thumbnails)\n  const slidesMobiles = document.querySelectorAll('.product-thumbnail.product-images__slide-item--variant:not(.Nav_variant_img)');\n  slidesMobiles.forEach(slidesMobile => {\n    const imgMobile = slidesMobile.querySelector('img');\n    if (imgMobile) {\n      const imgIdMobile = extractImageId(imgMobile.src);\n      if (variantImageIds.includes(imgIdMobile)) {\n        // Remove the slide item itself\n        slidesMobile.parentNode.remove();\n      }\n    }\n  });\n\n\n\n\n const flickityContainer = document.querySelector('#Product-Thumbnails .product-thumbnail-container--inner');\n  if (flickityContainer && typeof Flickity !== 'undefined') {\n    const flkty = Flickity.data(flickityContainer); // Get existing Flickity instance\n    if (flkty) {\n      // alert(2);\n      flkty.reloadCells();\n      flkty.resize();\n      flkty.select(0);\n    }\n  }\n\n});\n\nfunction waitUntil(conditionFn) {\n  return new Promise((resolve) => {\n    function checkCondition() {\n      if (conditionFn()) {\n        resolve();\n      } else {\n        requestAnimationFrame(checkCondition);\n      }\n    }\n    checkCondition();\n  });\n}\nwaitUntil(() => document.querySelector(\".template-new-product .main_container_metafield .size_detail\")).then(() => {\n\n      const blocks = document.querySelectorAll('.main_container_metafield .size_detail');\n\n      blocks.forEach((block, index) => {\n        const header = block.querySelector('.detail');\n        const content = block.querySelector('.metafield-rich_text_field');\n\n        // Inject SVG icon once\n        if (!header.querySelector('.cp-acc-icon')) {\n          const icon = document.createElement('span');\n          icon.className = \"cp-acc-icon\";\n          icon.innerHTML = `\n        <svg width=\"8\" height=\"4\" viewBox=\"0 0 8 4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n          <path d=\"M1 0.5L4 3.5L7 0.5\" stroke=\"black\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n        </svg>\n      `;\n          header.appendChild(icon);\n        }\n\n        // \u2705 Close all by default\n        if (index !== 0) content.style.display = \"none\";\n        else block.classList.add(\"cp-active-accordion\"); // first open\n\n        header.addEventListener('click', () => {\n          const isActive = block.classList.contains('cp-active-accordion');\n\n          // Close all first\n          blocks.forEach(b => {\n            //b.classList.remove('cp-active-accordion');\n            //b.querySelector('.metafield-rich_text_field').style.display = \"none\";\n          });\n\n          // Toggle selected\n          if (!isActive) {\n            block.classList.add('cp-active-accordion');\n            content.style.display = \"block\";\n          } else {\n            block.classList.remove('cp-active-accordion');\n            content.style.display = \"none\";\n          }\n        });\n      });\n\n    });\n\n\nfunction waitForElement(selector, callback, timeout = 8000) {\n  const start = Date.now();\n  const check = () => {\n    const el = document.querySelector(selector);\n    if (el) return callback(el);\n\n    if (Date.now() - start >= timeout) return;\n    requestAnimationFrame(check);\n  };\n  check();\n}\n\n\n// waitForElement(\".CP-video-section\", () => {\n// waitForElement(\"[id*=loox_reviews]\", () => {\n// waitForElement('.cstm_icon_with_content.icon_with_content_wrapper', () => {\n\n//   // SELECT ALL pill bars\n//   const pillBars = document.querySelectorAll(\".CP-pill\");\n\n//   pillBars.forEach((pillBar) => {\n//     const pillDelivery  = pillBar.querySelector(\".CP-delivery-pill\");\n//     const pillReview    = pillBar.querySelector(\".CP-review-pill\");\n//     const pillDetail    = pillBar.querySelector(\".CP-detail-pill\");\n\n//     const videoSection   = document.querySelector(\"#AddToCart\");\n//     const reviewSection  = document.querySelector(\"[id*=loox_reviews]\");\n//     const detailsSection = document.querySelector('[id*=\"image_text_pdp\"] .main-contaner-image_text');\n\n//     if (!pillDelivery || !pillReview || !pillDetail) {\n//       return;\n//     }\n\n//     function setActive(pill) {\n//       pillBar.querySelectorAll(\"span\").forEach(p => p.classList.remove(\"CP-active\"));\n//       pill.classList.add(\"CP-active\");\n//     }\n\n// function scrollToVideoSection() {\n//   const isMobile = window.innerWidth <= 768;\n\n//   // MOBILE TARGET \u2192 #AddToCart\n//   if (isMobile) {\n//     const videoSection = document.querySelector(\"#AddToCart\");\n//     if (!videoSection) return;\n\n//     // const offset = -30;\n//      if (document.body.classList.contains('template-product-new-product')) {\n//   offset = -30;\n// } else if (document.body.classList.contains('template-product-hybrid')) {\n//   offset = -17;\n// } else if (document.body.classList.contains('template-product-edc-product')) {\n//   offset = -5;\n// }else if (document.body.classList.contains('template-product-new-product-burgundy-matte')) {\n//   offset = -55;\n// }\n//     const top = videoSection.getBoundingClientRect().top + window.scrollY - offset;\n\n//     window.scrollTo({\n//       top,\n//       behavior: \"smooth\"\n//     });\n\n//     return; // stop here for mobile\n//   }\n\n//   // DESKTOP TARGET \u2192 .CP-video-section\n//   const target = document.querySelector(\".CP-video-section\");\n//   if (!target) return;\n\n//   const activeBar = document.querySelector('.cstm_icon_with_content.icon_with_content_wrapper[style*=\"block\"]');\n\n//   let targetTop = target.getBoundingClientRect().top + window.scrollY;\n\n//   if (activeBar) {\n//     const activeHeight = activeBar.offsetHeight || 0;\n//     targetTop -= (activeHeight + 160);\n//   }\n\n//   window.scrollTo({\n//     top: targetTop,\n//     behavior: \"smooth\"\n//   });\n// }\n\n// // Call the function\n// scrollToVideoSection();\n\n\n\n\n//     // Reviews\n//     function scrollToReviews() {\n//       const offset = window.innerWidth <= 768 ? 90 : 61;\n//       const top = reviewSection.getBoundingClientRect().top + window.scrollY - offset;\n//       window.scrollTo({ top, behavior: \"smooth\" });\n//     }\n\n//     // Details\n//     function scrollToDetails() {\n//       const offset = window.innerWidth <= 768 ? 130 : 140;\n//       const top = detailsSection.getBoundingClientRect().top + window.scrollY - offset;\n//       window.scrollTo({ top, behavior: \"smooth\" });\n//     }\n\n\n//     // Attach Events\n//     pillDelivery.addEventListener(\"click\", () => {\n//       setActive(pillDelivery);\n//       scrollToVideoSection();\n//     });\n\n//     pillReview.addEventListener(\"click\", () => {\n//       setActive(pillReview);\n//       scrollToReviews();\n//     });\n\n//     pillDetail.addEventListener(\"click\", () => {\n//       setActive(pillDetail);\n//       scrollToDetails();\n//     });\n//   });\n\n// });\n// });\n// });\n\n/* =========================================================\n   PILL 1 \u2014 DELIVERY / VIDEO SECTION SCROLL\n   Independent block. Only depends on .CP-pill existing.\n   ========================================================= */\n  //  waitForElement(\".CP-pill\", () => {\n  //   const pillBars = document.querySelectorAll(\".CP-pill\");\n  \n  //   pillBars.forEach((pillBar) => {\n  //     const pillDelivery = pillBar.querySelector(\".CP-delivery-pill\");\n  //     if (!pillDelivery) return;\n  \n  //     function setActive(pill) {\n  //       pillBar.querySelectorAll(\"span\").forEach(p => p.classList.remove(\"CP-active\"));\n  //       pill.classList.add(\"CP-active\");\n  //     }\n  \n  //     function scrollToVideoSection() {\n  //       const isMobile = window.innerWidth <= 768;\n  \n  //       // MOBILE TARGET \u2192 #AddToCart\n  //       if (isMobile) {\n  //         const videoSection = document.querySelector(\"#AddToCart\");\n  //         if (!videoSection) return;\n  \n  //         let offset = 0;\n  //         if (document.body.classList.contains('template-product-new-product')) {\n  //           offset = -30;\n  //         } else if (document.body.classList.contains('template-product-hybrid')) {\n  //           offset = -17;\n  //         } else if (document.body.classList.contains('template-product-edc-product')) {\n  //           offset = -5;\n  //         } else if (document.body.classList.contains('template-product-new-product-burgundy-matte')) {\n  //           offset = -55;\n  //         }\n  \n  //         const top = videoSection.getBoundingClientRect().top + window.scrollY - offset;\n  \n  //         window.scrollTo({\n  //           top,\n  //           behavior: \"smooth\"\n  //         });\n  \n  //         return; // stop here for mobile\n  //       }\n  \n  //       // DESKTOP TARGET \u2192 .CP-video-section\n  //       const target = document.querySelector(\".CP-video-section\");\n  //       if (!target) return;\n  \n  //       // NOTE: this lookup is safe even if the element no longer exists in the DOM \u2014\n  //       // it just resolves to null and the offset adjustment below is skipped.\n  //       const activeBar = document.querySelector('.cstm_icon_with_content.icon_with_content_wrapper[style*=\"block\"]');\n  \n  //       let targetTop = target.getBoundingClientRect().top + window.scrollY;\n  \n  //       if (activeBar) {\n  //         const activeHeight = activeBar.offsetHeight || 0;\n  //         targetTop -= (activeHeight + 160);\n  //       }\n  \n  //       window.scrollTo({\n  //         top: targetTop,\n  //         behavior: \"smooth\"\n  //       });\n  //     }\n  \n  //     pillDelivery.addEventListener(\"click\", () => {\n  //       setActive(pillDelivery);\n  //       scrollToVideoSection();\n  //     });\n  //   });\n  // });\n\n  /*\n  waitForElement(\".CP-pill\", () => {\n    const pillBars = document.querySelectorAll(\".CP-pill\");\n  \n    pillBars.forEach((pillBar) => {\n      const pillDelivery = pillBar.querySelector(\".CP-delivery-pill\");\n      if (!pillDelivery) return;\n  \n      function setActive(pill) {\n        pillBar.querySelectorAll(\"span\").forEach(p => p.classList.remove(\"CP-active\"));\n        pill.classList.add(\"CP-active\");\n      }\n  \n      function scrollToDeliverySection() {\n        const target = document.querySelector('[class*=\"product_default_accordion-Delivery\"]');\n        if (!target) return;\n  \n        // 1. Force the accordion open immediately\n        if (!target.hasAttribute('open')) {\n          target.setAttribute('open', '');\n        }\n  \n        // 2. Clear any sticky headers/sections by creating a safe cushion above the element\n        // If 200px is too much or too little, adjust this single number below\n        target.style.scrollMarginTop = \"400px\";\n  \n        // 3. Let the native browser engine handle the scroll tracking dynamically\n        // This ignores layout shifts caused by the opening animation!\n        target.scrollIntoView({\n          behavior: \"smooth\",\n          block: \"start\"\n        });\n      }\n  \n      pillDelivery.addEventListener(\"click\", () => {\n        setActive(pillDelivery);\n        scrollToDeliverySection();\n      });\n    });\n  });\n  */\n\n  /** \n  waitForElement(\".CP-pill\", () => {\n    const pillBars = document.querySelectorAll(\".CP-pill\");\n\n    pillBars.forEach((pillBar) => {\n      const pillDelivery = pillBar.querySelector(\".CP-delivery-pill\");\n      if (!pillDelivery) return;\n\n      function setActive(pill) {\n        pillBar.querySelectorAll(\"span\").forEach(p => p.classList.remove(\"CP-active\"));\n        pill.classList.add(\"CP-active\");\n      }\n\n      // pick the VISIBLE Delivery accordion, not the first one in the DOM\n      function getVisibleDelivery() {\n        const all = document.querySelectorAll('[class*=\"product_default_accordion-Delivery\"]');\n        return Array.from(all).find(el => el.offsetParent !== null) || all[0];\n      }\n\n      function scrollToDeliverySection() {\n        const target = getVisibleDelivery();\n        if (!target) {\n          console.warn(\"[CP] Delivery section not found.\");\n          return;\n        }\n\n        const details = target.querySelector(\"details\") || target;\n        if (!details.hasAttribute(\"open\")) details.setAttribute(\"open\", \"\");\n\n        const OFFSET = 400;\n\n        const doScroll = () => {\n          const top = target.getBoundingClientRect().top + window.pageYOffset - OFFSET;\n          window.scrollTo({ top: Math.max(0, top), behavior: \"smooth\" });\n        };\n\n        requestAnimationFrame(() => requestAnimationFrame(doScroll));\n      }\n\n      pillDelivery.addEventListener(\"click\", () => {\n        setActive(pillDelivery);\n        scrollToDeliverySection();\n      });\n    });\n  });\n  **/\n\n  /*\n     PDP pill navigation. All product templates use the same three controls, but\n     their section IDs vary. Find the visible destination by its content instead\n     of relying on a single template-specific ID or class name.\n  */\nfunction initPdpPillNavigation() {\n    const isVisible = (element) => element && element.getClientRects().length > 0;\n    const firstVisible = (elements) => Array.from(elements).find(isVisible) || elements[0];\n\n    const getDeliverySection = () => firstVisible(\n      document.querySelectorAll('[data-pdp-delivery-section]')\n    ) || firstVisible(Array.from(document.querySelectorAll('.product__accordion')).filter((accordion) => {\n      const summary = accordion.querySelector('summary');\n      return summary && summary.textContent.trim().toLowerCase() === 'delivery';\n    }));\n\n    // Details pill goes to the \"About this Product\" accordion. Matched by its summary\n    // text so it works on every product template, with the old image_text_pdp section\n    // kept as a fallback for templates that do not have that accordion.\n    const getDetailsSection = () => firstVisible(\n      Array.from(document.querySelectorAll('.product__accordion')).filter((row) => {\n        const summary = row.querySelector('summary');\n        return summary && summary.textContent.trim().toLowerCase() === 'about this product';\n      }).concat(Array.from(document.querySelectorAll('[data-pdp-details-section], [id*=\"image_text_pdp\"]')))\n    );\n\n    const getReviewsSection = () => firstVisible(\n      document.querySelectorAll('[id*=\"loox_reviews\"], #shopify-product-reviews, .product_review_heading')\n    );\n\n    const scrollToSection = (section, openAccordion = false, offset = 0) => {\n      if (!section) return;\n\n      if (openAccordion) {\n        const details = section.querySelector('details');\n        if (details) details.open = true;\n      }\n\n      requestAnimationFrame(() => requestAnimationFrame(() => {\n        const start = window.scrollY;\n\n        // Desktop keeps the product info column in a position:sticky wrapper, so the\n        // section keeps moving while the window scrolls and one rect.top + scrollY hop\n        // lands hundreds of pixels short. Probe with instant scrolls (no paint happens\n        // between them) to find the scroll position that really puts the section at the\n        // wanted offset, restore, then animate there once.\n        for (let i = 0; i < 30; i += 1) {\n          const delta = section.getBoundingClientRect().top - offset;\n          if (Math.abs(delta) <= 1) break;\n          const next = Math.max(0, window.scrollY + delta);\n          if (next === window.scrollY) break;\n          window.scrollTo({ top: next, behavior: 'instant' });\n        }\n\n        const target = window.scrollY;\n        if (target === start) return;\n\n        window.scrollTo({ top: start, behavior: 'instant' });\n        requestAnimationFrame(() => window.scrollTo({ top: target, behavior: 'smooth' }));\n      }));\n    };\n\n    document.querySelectorAll('.CP-pill:not([data-pdp-navigation-bound])').forEach((pillBar) => {\n      pillBar.dataset.pdpNavigationBound = 'true';\n\n      const setActive = (pill) => {\n        pillBar.querySelectorAll('.CP-delivery-pill, .CP-detail-pill, .CP-review-pill').forEach((item) => {\n          item.classList.remove('CP-active');\n        });\n        pill.classList.add('CP-active');\n      };\n\n      const destinations = [\n        ['.CP-delivery-pill', getDeliverySection, true, () => window.innerWidth <= 768 ? 90 : 61],\n        ['.CP-detail-pill', getDetailsSection, true, () => window.innerWidth <= 768 ? 90 : 61],\n        ['.CP-review-pill', getReviewsSection, false, () => window.innerWidth <= 768 ? 90 : 61]\n      ];\n\n      destinations.forEach(([selector, getSection, opensAccordion, getOffset]) => {\n        const pill = pillBar.querySelector(selector);\n        if (!pill) return;\n\n        pill.addEventListener('click', () => {\n          const section = getSection();\n          if (!section) return;\n          setActive(pill);\n          scrollToSection(section, opensAccordion, getOffset());\n        });\n      });\n    });\n  } \n\n  initPdpPillNavigation();\n  document.addEventListener('shopify:section:load', initPdpPillNavigation);\n\n\ndocument.addEventListener(\"DOMContentLoaded\", initCPVideoSection);\ndocument.addEventListener(\"shopify:section:load\", initCPVideoSection);\n\nfunction initCPVideoSection() {\n  const wrappers = document.querySelectorAll(\".CP-video-wrapper\");\n\n  if (!wrappers.length) {\n    return;\n  }\n\n  wrappers.forEach(wrapper => {\n    const video = wrapper.querySelector(\"video\");\n    const playBtn = wrapper.querySelector(\".CP-play-btn\");\n\n    if (!video || !playBtn) {\n      console.warn(\"\u26D4 Missing video or play button\");\n      return;\n    }\n\n    // Force mobile attributes\n    video.setAttribute(\"playsinline\", \"\");\n    video.setAttribute(\"muted\", \"\");\n    video.setAttribute(\"preload\", \"metadata\");\n\n    // Icons\n    const playIcon = `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24\" viewBox=\"0 -960 960 960\" width=\"24\" fill=\"#fff\"><path d=\"m380-300 280-180-280-180v360Z\"></path></svg>`;\n    const pauseIcon = `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24\" viewBox=\"0 -960 960 960\" width=\"24\" fill=\"#fff\"><path d=\"M360-320h80v-320h-80v320Zm160 0h80v-320h-80v320Z\"></path></svg>`;\n\n    playBtn.addEventListener(\"click\", (e) => {\n      e.stopPropagation();\n\n      if (video.paused) {\n        video.play().then(() => {\n          playBtn.innerHTML = pauseIcon;\n        }).catch(err => console.log(\"Play error:\", err));\n      } else {\n        video.pause();\n        playBtn.innerHTML = playIcon;\n      }\n    });\n\n    // Click wrapper to toggle\n    wrapper.addEventListener(\"click\", (e) => {\n      if (e.target.closest(\".CP-play-btn\")) return;\n\n      if (video.paused) {\n        video.play().then(() => {\n          playBtn.innerHTML = pauseIcon;\n        });\n      } else {\n        video.pause();\n        playBtn.innerHTML = playIcon;\n      }\n    });\n\n    // Auto-pause on scroll out\n    const observer = new IntersectionObserver((entries) => {\n      entries.forEach(entry => {\n        if (!entry.isIntersecting && !video.paused) {\n          video.pause();\n          playBtn.innerHTML = playIcon;\n        }\n      });\n    }, { threshold: 0.25 });\n\n    observer.observe(video);\n  });\n\n}\n\n\n(function () {\n  if (window.innerWidth >= 768) return; // mobile only\n\n  function initVideoAutoplay() {\n    const slider = document.querySelector('#Product-Slider');\n    if (!slider) return false;\n\n    const flkty = Flickity.data(slider);\n    if (!flkty) return false;\n\n    function pauseAllVideos() {\n      slider.querySelectorAll('video').forEach(video => {\n        video.pause();\n      });\n    }\n\n    function playActiveVideo() {\n      const slide = flkty.selectedElement;\n      if (!slide) return;\n\n      const video = slide.querySelector('video');\n      if (!video) return;\n\n      // iOS autoplay requirements\n      video.muted = true;\n      video.playsInline = true;\n\n      try {\n        video.currentTime = 0;\n      } catch (e) {}\n\n      // iOS Safari needs delayed play AFTER settle\n      setTimeout(() => {\n        const playPromise = video.play();\n        if (playPromise) playPromise.catch(() => {});\n      }, 250);\n    }\n\n    // Initial autoplay (very important for iOS)\n    setTimeout(playActiveVideo, 500);\n\n    // \uD83D\uDD11 Play video ONLY after Flickity finishes sliding\n    flkty.on('settle', function () {\n      pauseAllVideos();\n      playActiveVideo();\n    });\n\n    return true;\n  }\n\n  // Wait until Flickity is actually initialized\n  function waitForFlickity() {\n    if (!initVideoAutoplay()) {\n      setTimeout(waitForFlickity, 200);\n    }\n  }\n\n  waitForFlickity();\n})(); \n \n\n\n(function CP_NOOE_07_MINICART_ADVANCED() {\n  \"use strict\";\n  \n  document.body.classList.add('body_MinicartRevamp');\n\n  /* -----------------------------------\n     HELPERS\n  ----------------------------------- */\n\n  const doc = document;\n  const qs = (s, c = doc) => c.querySelector(s);\n  const qsa = (s, c = doc) => Array.from(c.querySelectorAll(s));\n\n  const onReady = (selector, cb) => {\n    const el = qs(selector);\n    if (el) return cb(el);\n    const mo = new MutationObserver(() => {\n      const node = qs(selector);\n      if (node) { mo.disconnect(); cb(node); }\n    });\n    mo.observe(doc.documentElement, { childList: true, subtree: true });\n  };\n\n  const loadScript = (src) => {\n    return new Promise((resolve, reject) => {\n      if (doc.querySelector(`script[src=\"${src}\"]`)) { resolve(); return; }\n      const s = doc.createElement(\"script\");\n      s.src = src; s.onload = resolve; s.onerror = reject;\n      doc.head.appendChild(s);\n    });\n  };\n\n  const loadCSS = (href) => {\n    if (!doc.querySelector(`link[href=\"${href}\"]`)) {\n      const l = doc.createElement(\"link\");\n      l.rel = \"stylesheet\"; l.href = href;\n      doc.head.appendChild(l);\n    }\n  };\n\n  const formatMoney = cents =>\n    window.formatMoney(cents, theme.settings.money_with_currency_format);\n\n  const fetchJSON = async url => {\n    const res = await fetch(url);\n    return res.ok ? res.json() : null;\n  };\n\n  /* ============ LOOX RATING BADGE (HTML parsing approach) ============ */\n  const _looxBadgeCache = {};\n\n  async function renderLooxBadge(ratingHolder, productId, productUrl) {\n    if (!ratingHolder) return;\n\n    if (_looxBadgeCache[productId]) {\n      ratingHolder.innerHTML = _looxBadgeCache[productId];\n      ratingHolder.style.display = \"\";\n      return;\n    }\n\n    try {\n      const res = await fetch(productUrl);\n      if (!res.ok) { ratingHolder.style.display = \"none\"; return; }\n      const html = await res.text();\n\n      const block = html.match(/loox-rating[\\s\\S]{0,600}?>/);\n      if (!block) { ratingHolder.style.display = \"none\"; return; }\n\n      const ratingMatch = block[0].match(/data-rating=[\"']([\\d.]+)[\"']/);\n      const ratersMatch = block[0].match(/data-raters=[\"'](\\d+)[\"']/);\n      if (!ratingMatch || !ratersMatch) { ratingHolder.style.display = \"none\"; return; }\n\n      const rating = parseFloat(ratingMatch[1]);\n      const count = parseInt(ratersMatch[1], 10);\n      if (!rating || !count) { ratingHolder.style.display = \"none\"; return; }\n\n      const full = Math.round(rating);\n      const empty = 5 - full;\n      const starFull = `<svg viewBox=\"0 0 24 24\" class=\"cp-rating-star\"><path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\" fill=\"#000\"/></svg>`;\n      const starEmpty = `<svg viewBox=\"0 0 24 24\" class=\"cp-rating-star\"><path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\" fill=\"none\" stroke=\"#000\" stroke-width=\"1.5\"/></svg>`;\n\n      const output = `<span class=\"cp-rating-stars\">${starFull.repeat(full)}${starEmpty.repeat(empty)}</span><span class=\"cp-rating-text\">${rating.toFixed(1)} (${count})</span>`;\n\n      _looxBadgeCache[productId] = output;\n      ratingHolder.innerHTML = output;\n      ratingHolder.style.display = \"\";\n    } catch (e) {\n      console.warn(\"[rating] failed:\", e);\n      ratingHolder.style.display = \"none\";\n    }\n  }\n\n  const colorNameToCSS = (name) => {\n    const n = (name || \"\").toLowerCase().trim();\n    const map = {\n      \"black\": \"#000\", \"carbon black\": \"#1a1a1a\",\n      \"white\": \"#fff\", \"ivory\": \"#f5f0e6\", \"cream\": \"#f1e9d6\",\n      \"clay\": \"#b2a59b\", \"tan\": \"#d2b48c\", \"beige\": \"#d8c3a5\",\n      \"brown\": \"#6b4423\", \"olive\": \"#7d7438\",\n      \"fir green\": \"#655529\", \"green\": \"#2e7d32\",\n      \"navy\": \"#1f3a5f\", \"blue\": \"#3b6ea5\", \"copen blue\": \"#526b85\", \"sky blue\": \"#87b5d4\",\n      \"red\": \"#b3261e\", \"maroon\": \"#5b1a1a\", \"burgundy\": \"#6a2433\", \"wine\": \"#722f37\",\n      \"grey\": \"#9e9e9e\", \"gray\": \"#9e9e9e\", \"silver\": \"#c0c0c0\",\n      \"gold\": \"#c8a951\", \"pink\": \"#e8a3b0\", \"yellow\": \"#e8c547\", \"orange\": \"#d97742\"\n    };\n    return map[n] || n;\n  };\n\n  const isColorOption = (optName) => /colou?r/i.test(optName || \"\");\n\n  /* ---------------- Feedback Slider ---------------- */\n\n  function initFeedbackSlider() {\n    const slider = qs(\".cp-feedback-inner\");\n    if (!slider) return;\n    if (slider.classList.contains(\"slick-initialized\")) return;\n    if (slider.getBoundingClientRect().width === 0) return;\n\n    loadCSS(\"https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css\");\n    loadCSS(\"https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick-theme.css\");\n    loadScript(\"https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js\")\n      .then(() => {\n        if (!window.jQuery || !jQuery.fn.slick) return;\n        if (slider.classList.contains(\"slick-initialized\")) return;\n        jQuery(slider).slick({\n          slidesToShow: 1, slidesToScroll: 1, dots: true, arrows: false,\n          infinite: false, autoplay: true, autoplaySpeed: 3000,\n          adaptiveHeight: true, variableWidth: true\n        });\n      })\n      .catch(err => console.error(\"Slick load failed:\", err));\n  }\n\n  function destroyFeedbackSlider() {\n    const slider = qs(\".cp-feedback-inner\");\n    if (slider && window.jQuery && jQuery.fn.slick && slider.classList.contains(\"slick-initialized\")) {\n      jQuery(slider).slick(\"unslick\");\n    }\n  }\n\n  onReady(\".cart-drawer\", drawer => {\n    initFeedbackSlider();\n    new MutationObserver(() => initFeedbackSlider()).observe(drawer, {\n      attributes: true,\n      attributeFilter: [\"class\", \"style\", \"aria-hidden\", \"open\"],\n      childList: true,\n      subtree: true\n    });\n  });\n\n  /* -----------------------------------\n     ENHANCE CART ITEMS\n  ----------------------------------- */\n\n  function enhanceCartItems() {\n    const items = qsa(\".cart-drawer .product-cart-item\");\n\n    items.forEach(item => {\n      if (item.dataset.cpEnhanced) return;\n\n      const infoInner = qs(\".product-cart-item-info--inner\", item);\n      if (!infoInner) return;\n\n      const productLink = qs(\".cart-product-link\", item);\n      const productURL = productLink?.getAttribute(\"href\") || \"\";\n\n      const groupWrap = doc.createElement(\"div\");\n      groupWrap.className = \"quick-removeedit-group\";\n\n      const quickBtn = doc.createElement(\"button\");\n      quickBtn.className = \"cp-quickview-btn\";\n      quickBtn.type = \"button\";\n      quickBtn.textContent = \"Quick View\";\n      quickBtn.dataset.url = productURL;\n      groupWrap.appendChild(quickBtn);\n\n      const removeBtn = qs(\"a.remove\", item);\n      if (removeBtn) {\n        const wrap = doc.createElement(\"div\");\n        wrap.className = \"removeedit-icons\";\n\n        const editBtn = doc.createElement(\"button\");\n        editBtn.className = \"cp-edit-btn\";\n        editBtn.type = \"button\";\n        editBtn.innerHTML = `<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1.25 16.25H18.75V17.5H1.25V16.25ZM15.875 5.625C16.375 5.125 16.375 4.375 15.875 3.875L13.625 1.625C13.125 1.125 12.375 1.125 11.875 1.625L2.5 11V15H6.5L15.875 5.625ZM12.75 2.5L15 4.75L13.125 6.625L10.875 4.375L12.75 2.5ZM3.75 13.75V11.5L10 5.25L12.25 7.5L6 13.75H3.75Z\" fill=\"black\"></path></svg>`;\n        editBtn.dataset.url = productURL;\n        editBtn.dataset.line = removeBtn.dataset.index || \"\";\n\n        wrap.appendChild(editBtn);\n        wrap.appendChild(removeBtn);\n        groupWrap.appendChild(wrap);\n      }\n\n      infoInner.appendChild(groupWrap);\n      item.dataset.cpEnhanced = \"true\";\n    });\n  }\n\n  onReady(\".cart-drawer\", drawer => {\n    enhanceCartItems();\n    new MutationObserver(() => enhanceCartItems())\n      .observe(drawer, { childList: true, subtree: true });\n  });\n\n  /* -----------------------------------\n     QUICK VIEW MODAL\n  ----------------------------------- */\n\n  function createModal() {\n    if (qs(\".cp-product-modal\")) return;\n    const modal = doc.createElement(\"div\");\n    modal.className = \"cp-product-modal\";\n    modal.innerHTML = `\n      <div class=\"cp-modal-overlay\"></div>\n      <div class=\"cp-modal-content\">\n        <button class=\"cp-modal-close\">\u00D7</button>\n        <div class=\"cp-modal-body\"></div>\n      </div>\n    `;\n    doc.body.appendChild(modal);\n    modal.addEventListener(\"click\", e => {\n      if (e.target.classList.contains(\"cp-modal-overlay\") ||\n          e.target.classList.contains(\"cp-modal-close\")) {\n        modal.classList.remove(\"active\");\n      }\n    });\n  }\n  createModal();\n\n  /* -----------------------------------\n     EDIT SIDE PANEL\n  ----------------------------------- */\n\n  function createEditPanel() {\n    if (qs(\".cp-edit-panel\")) return;\n    const panel = doc.createElement(\"div\");\n    panel.className = \"cp-edit-panel\";\n    panel.innerHTML = `\n      <div class=\"cp-edit-overlay\"></div>\n      <div class=\"cp-edit-side\">\n        <div class=\"cp-edit-head\">\n          <span>Select options</span>\n          <button class=\"cp-edit-close\" type=\"button\" aria-label=\"Close\">\n            <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n              <path d=\"M13 1L1 13M13 13L1 1\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n            </svg>\n          </button>\n        </div>\n        <div class=\"cp-edit-content\"></div>\n      </div>\n    `;\n    doc.body.appendChild(panel);\n\n    const closePanel = () => panel.classList.remove(\"active\");\n\n    qs(\".cp-edit-overlay\", panel).addEventListener(\"click\", closePanel);\n    qs(\".cp-edit-close\", panel).addEventListener(\"click\", closePanel);\n\n    doc.addEventListener(\"keydown\", (e) => {\n      if (e.key === \"Escape\" && panel.classList.contains(\"active\")) {\n        closePanel();\n      }\n    });\n  }\n  createEditPanel();\n\n  /* -----------------------------------\n     BUILD VARIANTS (for quick-view dropdowns)\n  ----------------------------------- */\n\n  function buildVariantHTML(product, selectedOptions = []) {\n    const isValueAvailable = (optIdx, value) => {\n      return product.variants.some(v => {\n        if (!v.available) return false;\n        const opts = [v.option1, v.option2, v.option3];\n        for (let i = 0; i < product.options.length; i++) {\n          if (i === optIdx) { if (opts[i] !== value) return false; }\n          else if (selectedOptions[i] && opts[i] !== selectedOptions[i]) return false;\n        }\n        return true;\n      });\n    };\n\n    return `\n      <div class=\"cp-variants\">\n        ${product.options.map((opt, idx) => `\n          <div class=\"cp-option\">\n            <label>${opt.name}</label>\n            <select data-index=\"${idx}\">\n              ${opt.values\n                .filter(val => isValueAvailable(idx, val))\n                .map(val => `\n                  <option value=\"${val}\" ${val === selectedOptions[idx] ? \"selected\" : \"\"}>\n                    ${val}\n                  </option>\n                `).join(\"\")}\n            </select>\n          </div>\n        `).join(\"\")}\n      </div>\n    `;\n  }\n\n  function getSelectedVariant(product, selects) {\n    const values = selects.map(s => s.value);\n    return product.variants.find(v =>\n      v.options.every((opt, i) => opt === values[i])\n    );\n  }\n\n  /* -----------------------------------\n     openProductModal \u2014 for Quick View AND engraving/gift edit\n  ----------------------------------- */\n\n  async function openProductModal(url, isEdit = false, line = null) {\n    const modal = qs(\".cp-product-modal\");\n    const body = qs(\".cp-modal-body\");\n\n    modal.classList.add(\"active\");\n    body.innerHTML = \"Loading...\";\n\n    const product = await fetchJSON(url.split(\"?\")[0] + \".js\");\n    if (!product) return;\n\n    let cartItem = null;\n    if (isEdit && line) {\n      const cart = await fetchJSON(\"/cart.js\");\n      cartItem = cart?.items?.[line - 1];\n    }\n\n    const currentVariant = cartItem\n      ? product.variants.find(v => v.id === cartItem.variant_id)\n      : product.variants[0];\n\n    let isEngraving = false, isGift = false;\n    if (isEdit) {\n      const titleLower = product.title.toLowerCase();\n      isEngraving = titleLower.includes(\"engraving\") || product.product_type === \"engraving\";\n      isGift = titleLower.includes(\"birthday\") || titleLower.includes(\"gift\") || product.product_type === \"giftit\";\n    }\n\n    if (isEdit && (isEngraving || isGift)) {\n      const existingProperty =\n        cartItem?.properties?.[\"Engraving Text\"] ||\n        cartItem?.properties?.[\"Gift Message\"] ||\n        \"\";\n\n      body.innerHTML = `\n        <div class=\"cp-modal-grid\">\n          <img src=\"${currentVariant.featured_image?.src || product.images[0]}\" />\n          <div>\n            <h3>${product.title}</h3>\n            <div class=\"cp-custom-field\">\n              <label>${isEngraving ? \"Engraving Text\" : \"Gift Message\"}</label>\n              ${isEngraving ? `\n                <div class=\"cp-input-error\" style=\"display:none;color:red;font-size:12px;margin-bottom:6px;\">\n                  Please enter up to 3 characters.\n                </div>\n              ` : ``}\n              <input type=\"text\" class=\"cp-custom-input\"\n                     ${isEngraving ? 'maxlength=\"3\"' : ''}\n                     placeholder=\"${isEngraving ? 'ABC' : ''}\"\n                     value=\"${existingProperty || \"\"}\" />\n            </div>\n            <div class=\"cp-qty\">\n              <button type=\"button\" class=\"cp-qty-minus\" aria-label=\"Decrease\">\u2212</button>\n              <input type=\"number\" min=\"1\" value=\"${cartItem?.quantity || 1}\" />\n              <button type=\"button\" class=\"cp-qty-plus\" aria-label=\"Increase\">+</button>\n            </div>\n            <button class=\"cp-updatecart\" data-line=\"${line}\">Update</button>\n          </div>\n        </div>\n      `;\n\n      initVariantLogic(product, body, true, {\n        isEngraving, isGift, line, variantId: currentVariant.id\n      });\n      return;\n    }\n\n    body.innerHTML = `\n      <div class=\"cp-modal-grid\">\n        <img src=\"${currentVariant.featured_image?.src || product.images[0]}\" />\n        <div>\n          <h3>${product.title}</h3>\n          <div class=\"cp-price\">\n            ${formatMoney(currentVariant.price)}\n            ${currentVariant.compare_at_price\n              ? `<del>${formatMoney(currentVariant.compare_at_price)}</del>`\n              : \"\"}\n          </div>\n          ${buildVariantHTML(product, currentVariant.options)}\n          <div class=\"cp-qty\">\n            <button type=\"button\" class=\"cp-qty-minus\" aria-label=\"Decrease\">\u2212</button>\n            <input type=\"number\" min=\"1\" value=\"${cartItem?.quantity || 1}\" />\n            <button type=\"button\" class=\"cp-qty-plus\" aria-label=\"Increase\">+</button>\n          </div>\n          <button class=\"cp-addtocart\" ${currentVariant.available ? \"\" : \"disabled\"}>${currentVariant.available ? \"Add to Cart\" : \"Sold Out\"}</button>\n          <a href=\"${product.url}\" class=\"cp-viewfull\">View Full Details</a>\n        </div>\n      </div>\n    `;\n\n    initVariantLogic(product, body, false, {\n      isEngraving: false, isGift: false, line, variantId: currentVariant.id\n    });\n  }\n\n  /* -----------------------------------\n     openEditPanel\n  ----------------------------------- */\n\n  async function openEditPanel(url, line) {\n    const panel = qs(\".cp-edit-panel\");\n    const content = qs(\".cp-edit-content\", panel);\n\n    panel.classList.add(\"active\");\n    content.innerHTML = `<div class=\"cp-edit-loading\">Loading...</div>`;\n\n    const product = await fetchJSON(url.split(\"?\")[0] + \".js\");\n    if (!product) return;\n\n    const cart = await fetchJSON(\"/cart.js\");\n    const cartLine = parseInt(line, 10);\n    const cartItem = cart?.items?.[cartLine - 1];\n    if (!cartItem) {\n      console.error(\"[edit-panel] cart item not found\");\n      return;\n    }\n\n    let currentVariant = product.variants.find(v => v.id === cartItem.variant_id)\n                       || product.variants[0];\n    let selectedOptions = currentVariant.options.slice();\n\n    const media = [];\n\n    if (product.media && product.media.length) {\n      product.media.forEach(m => {\n        if (m.media_type === \"video\") {\n          const mp4 = m.sources?.find(s => s.format === \"mp4\") || m.sources?.[0];\n          if (mp4?.url) {\n            media.push({ type: \"video\", src: mp4.url, poster: m.preview_image?.src || \"\" });\n          }\n        } else if (m.media_type === \"external_video\") {\n          if (m.external_id) {\n            media.push({\n              type: \"external_video\",\n              host: m.host,\n              externalId: m.external_id,\n              poster: m.preview_image?.src || \"\"\n            });\n          }\n        } else {\n          const src = m.src || m.preview_image?.src;\n          if (src) media.push({ type: \"image\", src });\n        }\n      });\n    }\n\n    if (!media.length && product.images && product.images.length) {\n      product.images.forEach(src => {\n        if (src) media.push({ type: \"image\", src });\n      });\n    }\n\n    if (!media.length && currentVariant.featured_image?.src) {\n      media.push({ type: \"image\", src: currentVariant.featured_image.src });\n    }\n\n    content.innerHTML = `\n      <div class=\"cp-edit-gallery\">\n        <div class=\"cp-edit-flickity\">\n          ${media.map(m => {\n            if (m.type === \"video\") {\n              return `\n                <div class=\"cp-edit-slide cp-edit-slide-video\">\n                  <video src=\"${m.src}\" poster=\"${m.poster}\"\n                        playsinline muted loop preload=\"metadata\"\n                        controls></video>\n                </div>\n              `;\n            }\n            if (m.type === \"external_video\") {\n              const embedUrl = m.host === \"youtube\"\n                ? `https://www.youtube.com/embed/${m.externalId}?rel=0&playsinline=1`\n                : `https://player.vimeo.com/video/${m.externalId}`;\n              return `\n                <div class=\"cp-edit-slide cp-edit-slide-video\">\n                  <iframe src=\"${embedUrl}\" frameborder=\"0\"\n                          allow=\"autoplay; encrypted-media; picture-in-picture\"\n                          allowfullscreen></iframe>\n                </div>\n              `;\n            }\n            return `\n              <div class=\"cp-edit-slide\">\n                <img src=\"${m.src}\" alt=\"${product.title}\" loading=\"lazy\" draggable=\"false\" />\n              </div>\n            `;\n          }).join(\"\")}\n        </div>\n        ${media.length > 1 ? `<div class=\"cp-edit-progress\"><div class=\"cp-edit-progress-bar\"></div></div>` : \"\"}\n      </div>\n\n      <div class=\"cp-edit-body\">\n        <h3 class=\"cp-edit-title\">${product.title}</h3>\n        <div class=\"cp-edit-rating\" data-product-url=\"${product.url}\"></div>\n        ${buildEditOptionsHTML(product, selectedOptions)}\n        <div class=\"cp-edit-footer\">\n          <div class=\"cp-edit-qty\">\n            <button type=\"button\" class=\"cp-edit-qty-minus\" aria-label=\"Decrease\">\u2212</button>\n            <input type=\"number\" min=\"1\" value=\"${cartItem.quantity}\" />\n            <button type=\"button\" class=\"cp-edit-qty-plus\" aria-label=\"Increase\">+</button>\n          </div>\n          <button type=\"button\" class=\"cp-edit-update\" data-line=\"${cartLine}\">UPDATE</button>\n        </div>\n        <a href=\"${product.url}\" class=\"cp-edit-viewfull\">View product details</a>\n      </div>\n    `;\n\n    initEditPanelLogic(product, content, panel, cartLine, currentVariant, selectedOptions);\n  }\n\n  function buildEditOptionsHTML(product, selectedOptions) {\n    const isValueAvailable = (optIdx, value) => {\n      return product.variants.some(v => {\n        if (!v.available) return false;\n        const opts = [v.option1, v.option2, v.option3];\n        for (let i = 0; i < product.options.length; i++) {\n          if (i === optIdx) { if (opts[i] !== value) return false; }\n          else if (selectedOptions[i] && opts[i] !== selectedOptions[i]) return false;\n        }\n        return true;\n      });\n    };\n\n    return product.options.map((opt, idx) => {\n      const isColor = isColorOption(opt.name);\n      const sel = selectedOptions[idx] || \"\";\n\n      return `\n        <div class=\"cp-edit-option ${isColor ? \"is-color\" : \"is-pill\"}\">\n          <div class=\"cp-edit-option-head\">\n            <span class=\"cp-edit-option-name\">${(isColor ? \"SELECTED \" : \"\") + opt.name.toUpperCase()}:</span>\n            <span class=\"cp-edit-option-value\" data-opt-idx=\"${idx}\">${sel}</span>\n          </div>\n          <div class=\"cp-edit-option-values\" data-opt-idx=\"${idx}\">\n            ${opt.values.map(val => {\n              const available = isValueAvailable(idx, val);\n              const soldClass = available ? \"\" : \"sold-out\";\n              const titleSuffix = available ? \"\" : \" (Sold out)\";\n              return isColor\n                ? `<button type=\"button\" class=\"cp-edit-swatch ${val === sel ? \"selected\" : \"\"} ${soldClass}\"\n                          data-opt-idx=\"${idx}\" data-value=\"${val}\"\n                          style=\"background:${colorNameToCSS(val)}\"\n                          aria-label=\"${val}${titleSuffix}\" title=\"${val}${titleSuffix}\"></button>`\n                : `<button type=\"button\" class=\"cp-edit-pill ${val === sel ? \"selected\" : \"\"} ${soldClass}\"\n                          data-opt-idx=\"${idx}\" data-value=\"${val}\">${val}</button>`;\n            }).join(\"\")}\n          </div>\n        </div>\n      `;\n    }).join(\"\");\n  }\n\n  function initEditPanelLogic(product, content, panel, cartLine, initialVariant, initialOptions) {\n    let currentVariant = initialVariant;\n    let selectedOptions = initialOptions.slice();\n\n    const flickityEl = qs(\".cp-edit-flickity\", content);\n    const slides = qsa(\".cp-edit-slide\", content);\n    const progressBar = qs(\".cp-edit-progress-bar\", content);\n    let flkty = null;\n    const titleEl = qs(\".cp-edit-title\", content);\n    const updateBtn = qs(\".cp-edit-update\", content);\n    const qtyInput = qs(\".cp-edit-qty input\", content);\n\n    /* FLICKITY GALLERY */\n    let currentSlide = 0;\n\n    const goToSlide = (i) => {\n      if (!flkty || !slides.length) return;\n      flkty.select(i, false, false);\n    };\n\n    const initFlickity = () => {\n      if (!window.Flickity) return;\n      if (flkty) return;\n\n      flkty = new Flickity(flickityEl, {\n        cellAlign: \"left\",\n        contain: true,\n        pageDots: false,\n        prevNextButtons: false,\n        wrapAround: false,\n        draggable: true,\n        freeScroll: false,\n        setGallerySize: false,\n        adaptiveHeight: false\n      });\n\n      flkty.on(\"select\", () => {\n        currentSlide = flkty.selectedIndex;\n        qsa(\"video\", flickityEl).forEach(v => v.pause());\n      });\n\n      flkty.on(\"scroll\", (progress) => {\n        if (!progressBar) return;\n        const clamped = Math.max(0, Math.min(1, progress));\n        progressBar.style.width = (clamped * 100) + \"%\";\n      });\n\n      setTimeout(() => {\n        flkty.resize();\n        if (progressBar && slides.length > 1) {\n          progressBar.style.width = (1 / slides.length * 100) + \"%\";\n        }\n      }, 50);\n    };\n\n    if (window.Flickity) {\n      initFlickity();\n    } else {\n      loadCSS(\"https://unpkg.com/flickity@2.3.0/dist/flickity.min.css\");\n      loadScript(\"https://unpkg.com/flickity@2.3.0/dist/flickity.pkgd.min.js\").then(() => {\n        initFlickity();\n      }).catch(err => console.error(\"Flickity load failed\", err));\n    }\n\n    /* SWATCH / PILL CLICKS */\n    const bindOptionClicks = () => {\n      qsa(\".cp-edit-swatch, .cp-edit-pill\", content).forEach(btn => {\n        btn.addEventListener(\"click\", () => {\n          const idx = parseInt(btn.dataset.optIdx, 10);\n          selectedOptions[idx] = btn.dataset.value;\n\n          const oldOptions = qsa(\".cp-edit-option\", content);\n          oldOptions.forEach(el => el.remove());\n\n          const ratingEl = qs(\".cp-edit-rating\", content);\n          const anchor = ratingEl || titleEl;\n          anchor.insertAdjacentHTML(\"afterend\", buildEditOptionsHTML(product, selectedOptions));\n          bindOptionClicks();\n\n          updateCurrentVariant();\n        });\n      });\n    };\n\n    let isInitialRender = true;\n\n    const updateCurrentVariant = () => {\n      const v = product.variants.find(variant =>\n        variant.options.every((o, i) => o === selectedOptions[i])\n      );\n      if (v) {\n        currentVariant = v;\n        if (!isInitialRender && v.featured_image && v.featured_image.src) {\n          const targetFile = v.featured_image.src.split(\"?\")[0].split(\"/\").pop();\n          const matchIdx = slides.findIndex(s => {\n            const mediaEl = qs(\"img, video\", s);\n            const src = mediaEl?.src || mediaEl?.getAttribute(\"poster\") || \"\";\n            return src.includes(targetFile);\n          });\n          if (matchIdx >= 0) {\n            if (flkty) goToSlide(matchIdx);\n            else setTimeout(() => goToSlide(matchIdx), 300);\n          }\n        }\n        updateBtn.disabled = !v.available;\n        updateBtn.textContent = v.available ? \"UPDATE\" : \"SOLD OUT\";\n      } else {\n        currentVariant = null;\n        updateBtn.disabled = true;\n        updateBtn.textContent = \"UNAVAILABLE\";\n      }\n      isInitialRender = false;\n    };\n\n    bindOptionClicks();\n    updateCurrentVariant();\n\n    /* RATING \u2014 fetch product page and render stars */\n    const ratingHolder = qs(\".cp-edit-rating\", content);\n    if (ratingHolder && ratingHolder.dataset.productUrl) {\n      ratingHolder.innerHTML = `<span class=\"cp-rating-loading\">Loading reviews\u2026</span>`;\n      renderLooxBadge(ratingHolder, product.id, ratingHolder.dataset.productUrl);\n    }\n\n    /* QTY +/- */\n    const qtyMinus = qs(\".cp-edit-qty-minus\", content);\n    const qtyPlus = qs(\".cp-edit-qty-plus\", content);\n    qtyMinus?.addEventListener(\"click\", () => {\n      const v = parseInt(qtyInput.value, 10) || 1;\n      if (v > 1) qtyInput.value = v - 1;\n    });\n    qtyPlus?.addEventListener(\"click\", () => {\n      qtyInput.value = (parseInt(qtyInput.value, 10) || 1) + 1;\n    });\n\n    /* UPDATE BUTTON */\n    let isUpdating = false;\n    updateBtn.addEventListener(\"click\", async () => {\n      if (isUpdating || updateBtn.disabled) return;\n      if (!currentVariant || !currentVariant.available) return;\n\n      isUpdating = true;\n      const originalText = updateBtn.textContent;\n      updateBtn.disabled = true;\n      updateBtn.innerHTML = `<span class=\"cp-edit-spinner\"></span> Updating...`;\n\n      try {\n        const res = await fetch(\"/cart/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application/json\" },\n          body: JSON.stringify({\n            line: cartLine,\n            quantity: parseInt(qtyInput.value, 10) || 1,\n            id: currentVariant.id\n          })\n        });\n\n        if (!res.ok) {\n          await fetch(\"/cart/change.js\", {\n            method: \"POST\", headers: { \"Content-Type\": \"application/json\" },\n            body: JSON.stringify({ line: cartLine, quantity: 0 })\n          });\n          await fetch(\"/cart/add.js\", {\n            method: \"POST\", headers: { \"Content-Type\": \"application/json\" },\n            body: JSON.stringify({ id: currentVariant.id, quantity: parseInt(qtyInput.value, 10) || 1 })\n          });\n        }\n\n        await refreshCartDrawer();\n        panel.classList.remove(\"active\");\n      } catch (err) {\n        console.error(\"[edit-panel] update failed\", err);\n        updateBtn.disabled = false;\n        updateBtn.textContent = originalText;\n        isUpdating = false;\n      }\n    });\n  }\n\n  /* -----------------------------------\n     GLOBAL CLICK HANDLER\n  ----------------------------------- */\n\n  doc.addEventListener(\"click\", async e => {\n    const quick = e.target.closest(\".cp-quickview-btn\");\n    if (quick) {\n      return openProductModal(quick.dataset.url);\n    }\n\n    const edit = e.target.closest(\".cp-edit-btn\");\n    if (edit) {\n      const url = edit.dataset.url;\n      const line = edit.dataset.line;\n\n      const product = await fetchJSON(url.split(\"?\")[0] + \".js\");\n      if (!product) return;\n\n      const titleLower = (product.title || \"\").toLowerCase();\n      const isEngraving = titleLower.includes(\"engraving\") || product.product_type === \"engraving\";\n      const isGift = titleLower.includes(\"birthday\") || titleLower.includes(\"gift\") || product.product_type === \"giftit\";\n\n      if (isEngraving || isGift) {\n        return openProductModal(url, true, line);\n      }\n\n      return openEditPanel(url, line);\n    }\n  });\n\n  /* -----------------------------------\n     CART REFRESH\n  ----------------------------------- */\n\n  async function refreshCartDrawer() {\n    try {\n      destroyFeedbackSlider();\n      const res = await fetch(\"/?sections=cart-drawer\");\n      const data = await res.json();\n      const parser = new DOMParser();\n      const html = parser.parseFromString(data[\"cart-drawer\"], \"text/html\");\n      const newDrawer = html.querySelector(\".cart-drawer\");\n      const currentDrawer = document.querySelector(\".cart-drawer\");\n      if (newDrawer && currentDrawer) {\n        currentDrawer.innerHTML = newDrawer.innerHTML;\n      }\n      enhanceCartItems();\n      initFeedbackSlider();\n    } catch (err) {\n      console.error(\"Cart refresh failed\", err);\n    }\n  }\n\n  /* -----------------------------------\n     VARIANT LOGIC (for Quick View + engraving edit)\n  ----------------------------------- */\n\n  function initVariantLogic(product, container, isEdit, ctx = {}) {\n    const selects = qsa(\".cp-variants select\", container);\n    const priceWrap = qs(\".cp-price\", container);\n    const img = qs(\"img\", container);\n\n    let currentVariant =\n      product.variants.find(v => v.id === ctx.variantId) || product.variants[0];\n\n    const addBtn    = qs(\".cp-addtocart\", container);\n    const updateBtn = qs(\".cp-updatecart\", container);\n\n    const withLoading = async (btn, fn) => {\n      if (!btn || btn.disabled) return;\n      const originalHTML = btn.innerHTML;\n      btn.disabled = true;\n      btn.classList.add(\"cp-btn-loading\");\n      btn.innerHTML = `<span class=\"cp-spinner\"></span> Loading...`;\n      try {\n        await fn();\n      } catch (err) {\n        console.error(err);\n        btn.disabled = false;\n        btn.classList.remove(\"cp-btn-loading\");\n        btn.innerHTML = originalHTML;\n      }\n    };\n\n    const updateView = () => {\n      const v = getSelectedVariant(product, selects);\n      if (v) {\n        currentVariant = v;\n        if (priceWrap) priceWrap.innerHTML = formatMoney(v.price);\n        if (v.featured_image && img) img.src = v.featured_image.src;\n        if (addBtn) {\n          addBtn.disabled = !v.available;\n          addBtn.textContent = v.available ? \"Add to Cart\" : \"Sold Out\";\n        }\n      } else {\n        if (priceWrap) priceWrap.innerHTML = \"Unavailable\";\n        if (addBtn) {\n          addBtn.disabled = true;\n          addBtn.textContent = \"Unavailable\";\n        }\n      }\n    };\n\n    selects.forEach(sel => sel.addEventListener(\"change\", updateView));\n\n    // sync currentVariant/button state to whatever the browser auto-selected,\n    // since buildVariantHTML filters out sold-out option values and the\n    // default selection can differ from the variant currentVariant started as.\n    updateView();\n\n    const qtyInput = qs(\".cp-qty input\", container);\n    const qtyMinus = qs(\".cp-qty-minus\", container);\n    const qtyPlus  = qs(\".cp-qty-plus\", container);\n\n    if (qtyMinus && qtyInput) {\n      qtyMinus.addEventListener(\"click\", () => {\n        const current = parseInt(qtyInput.value, 10) || 1;\n        if (current > 1) qtyInput.value = current - 1;\n      });\n    }\n    if (qtyPlus && qtyInput) {\n      qtyPlus.addEventListener(\"click\", () => {\n        const current = parseInt(qtyInput.value, 10) || 1;\n        qtyInput.value = current + 1;\n      });\n    }\n\n    if (addBtn) {\n      addBtn.addEventListener(\"click\", () => withLoading(addBtn, async () => {\n        if (!currentVariant || !currentVariant.available) return;\n        const qty = qs(\".cp-qty input\", container).value;\n        await fetch(\"/cart/add.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application/json\" },\n          body: JSON.stringify({ id: currentVariant.id, quantity: qty })\n        });\n        await refreshCartDrawer();\n        document.querySelector(\".cp-product-modal\").classList.remove(\"active\");\n      }));\n    }\n\n    if (updateBtn) {\n      updateBtn.addEventListener(\"click\", () => withLoading(updateBtn, async () => {\n        const cartLine = parseInt(updateBtn.dataset.line, 10);\n        const qty = parseInt(qs(\".cp-qty input\", container).value, 10);\n\n        const cart = await fetchJSON(\"/cart.js\");\n        const cartItem = cart?.items?.[cartLine - 1];\n        if (!cartItem) throw new Error(\"Cart item not found\");\n\n        const variantId = currentVariant.id;\n        const inputEl = qs(\".cp-custom-input\", container);\n        const errorEl = qs(\".cp-input-error\", container);\n        let inputValue = inputEl?.value.trim() || \"\";\n\n        if (cartItem.product_type === \"engraving\") {\n          inputValue = inputValue.toUpperCase().replace(/[^A-Z0-9]/g, \"\").slice(0, 3);\n          if (inputEl) inputEl.value = inputValue;\n          if (!inputValue) {\n            if (errorEl) errorEl.style.display = \"block\";\n            throw new Error(\"Empty engraving\");\n          } else if (errorEl) {\n            errorEl.style.display = \"none\";\n          }\n        }\n\n        await fetch(\"/cart/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application/json\" },\n          body: JSON.stringify({ line: cartLine, quantity: 0 })\n        });\n\n        const properties = {};\n        if (cartItem.product_type === \"engraving\") properties[\"Engraving Text\"] = inputValue;\n        if (cartItem.product_type === \"giftit\")    properties[\"Gift Message\"]   = inputValue;\n\n        await fetch(\"/cart/add.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application/json\" },\n          body: JSON.stringify({ id: variantId, quantity: qty, properties })\n        });\n\n        await refreshCartDrawer();\n        qs(\".cp-product-modal\").classList.remove(\"active\");\n      }));\n    }\n  }\n\n})(); \n\n\n\n\n/* comparing the bags */\n(function initProductCompare() {\n  \n  // Terms to match (the shorter ones already cover their longer variants)\n  var terms = [\n    'Hybrid Laptop Bag',\n    'Hybrid Laptop',\n    'Hybrid Bag',\n    'Frame Messenger',\n    'Fathom Briefcase',\n    'Archive Laptop',\n    'Noma Shoulder Bag',\n    'Noma Shoulder',\n    'Noma Bag'\n  ];\n  // Normalize: lowercase + turn any non-alphanumeric char into a single space\n  function normalize(str) {\n    return (str || '').toLowerCase().replace(/[^a-z0-9]+/g, ' ').trim();\n  }\n  // Grab the product title (adjust selector to your theme if needed)\n  var titleEl = document.querySelector('.product-title, .product__title, [itemprop=\"name\"], h1');\n  var titleText = titleEl ? titleEl.textContent : '';\n  // Haystack = product title + full URL\n  var haystack = normalize(titleText + ' ' + window.location.href);\n  var match = terms.some(function (term) {\n    return haystack.indexOf(normalize(term)) !== -1;\n  });\n\n\n\n  /* =====================================\n    section functionality\n  ===================================== */\n  const compareId = \"cp-product-compare\";\n\n  if (document.getElementById(compareId)) return;\n\n  /* =====================================\n      PRODUCT DATA\n  ===================================== */\n  const compareProducts = [\n    {\n      title: \"Hybrid Laptop Bag\",\n      handle: \"hybrid-laptop-bag-14-inches\",\n      capacityImage: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Hybrid_Laptop_bag_-_Capacity_Image.png?v=1776770732\",\n      capacityText: \"Laptop 13\u201D, Phone, <br>Charger, Mouse, Perfume\",\n      materialImage: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Material-Icon.png\",\n      materialText: \"Next-Gen <br>Vegan Leather\",\n      wear: [\n        { image: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Crossbody_sling_-_Icon_5b8f4c91-765b-4062-aedb-5bbc6c20cc6c.png\", text: \"Crossbody sling\" },\n        { image: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Portfolio_sleeve_Icon_a950bd35-d994-4235-943b-a43b5e988e3c.png\", text: \"Portfolio sleeve\" }\n      ]\n    },\n    {\n      title: \"Frame Messenger Bag 14\u201D\",\n      handle: \"frame-messenger\",\n      variantId: \"44417081737285\",\n      capacityImage: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Frame_Messenger_Bag_14_-_Capacity_Image.png?v=1776770732\",\n      capacityText: \"Laptop 13\u201D, Phone, <br>Charger, Mouse, Perfume\",\n      materialImage: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Material-Icon.png\",\n      materialText: \"Next-Gen <br>Vegan Leather\",\n      wear: [\n        { image: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Crossbody_sling_-_Icon_5b8f4c91-765b-4062-aedb-5bbc6c20cc6c.png\", text: \"Crossbody sling\" },\n        { image: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Carry_Icon_f6304e52-3033-4f09-bc59-7929b96764e9.png?v=1776770719\", text: \"Carry\" }\n      ]\n    },\n    {\n      title: \"Frame Messenger Bag 11\u201D\",\n      handle: \"frame-messenger\",\n      variantId: \"44417078132805\",\n      capacityImage: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Frame_Messenger_Bag_11_-_Capacity_Image.png?v=1776770731\",\n      capacityText: \"iPad 11\u201D, Phone, <br>Charger, Perfume\",\n      materialImage: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Material-Icon.png\",\n      materialText: \"Next-Gen <br>Vegan Leather\",\n      wear: [\n        { image: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Crossbody_sling_-_Icon_5b8f4c91-765b-4062-aedb-5bbc6c20cc6c.png\", text: \"Crossbody sling\" },\n        { image: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Carry_Icon_f6304e52-3033-4f09-bc59-7929b96764e9.png?v=1776770719\", text: \"Carry\" }\n      ]\n    },\n    {\n      title: \"Fathom Briefcase 16\u201D\",\n      handle: \"fathom-briefcase\",\n      variantId: \"44417088225349\",\n      capacityImage: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Fathom_Briefcase_16_-_Capacity_Image.png?v=1776770732\",\n      capacityText: \"Laptop 16\u201D, iPad 11\u201D, Journal, <br>Phone, Charger, Mouse, Perfume\",\n      materialImage: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Material-Icon.png\",\n      materialText: \"Next-Gen <br>Vegan Leather\",\n      wear: [\n        { image: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Crossbody_sling_-_Icon_5b8f4c91-765b-4062-aedb-5bbc6c20cc6c.png\", text: \"Crossbody sling\" },\n        { image: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Carry_Icon_f6304e52-3033-4f09-bc59-7929b96764e9.png?v=1776770719\", text: \"Carry\" }\n      ]\n    },\n    {\n      title: \"Fathom Briefcase 14\u201D\",\n      handle: \"fathom-briefcase\",\n      variantId: \"44417088192581\",\n      capacityImage: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Fathom_Briefcase_14_-_Capacity_Image.png?v=1776770732\",\n      capacityText: \"Laptop 14\u201D, Phone, Charger, <br>Mouse, Perfume\",\n      materialImage: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Material-Icon.png\",\n      materialText: \"Next-Gen <br>Vegan Leather\",\n      wear: [\n        { image: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Crossbody_sling_-_Icon_5b8f4c91-765b-4062-aedb-5bbc6c20cc6c.png\", text: \"Crossbody sling\" },\n        { image: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Carry_Icon_f6304e52-3033-4f09-bc59-7929b96764e9.png?v=1776770719\", text: \"Carry\" }\n      ]\n    },\n    {\n      title: \"Archive Laptop Sleeve 16\u201D\",\n      handle: \"archive-laptop-sleeve-13-inches\",\n      variantId: \"43970587426885\",\n      capacityImage: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Archive_Laptop_Sleeve_16_-_Capacity_Image.png?v=1776770731\",\n      capacityText: \"Laptop 13\u201D, Charger\",\n      materialImage: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Material-Icon.png\",\n      materialText: \"Next-Gen <br>Vegan Leather\",\n      wear: [\n      \t{ image: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Portfolio_sleeve_Icon_a950bd35-d994-4235-943b-a43b5e988e3c.png\", text: \"Portfolio sleeve\" }\n    \t]\n    },\n    {\n      title: \"Archive Laptop Sleeve 14\u201D\",\n      handle: \"archive-laptop-sleeve-13-inches\",\n      variantId: \"42081104461893\",\n      capacityImage: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Archive_Laptop_Sleeve_13_-_Capacity_Image.png?v=1776770731\",\n      capacityText: \"Laptop 13\u201D, Charger\",\n      materialImage: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Material-Icon.png\",\n      materialText: \"Next-Gen <br>Vegan Leather\",\n      wear: [\n      \t{ image: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Portfolio_sleeve_Icon_a950bd35-d994-4235-943b-a43b5e988e3c.png\", text: \"Portfolio sleeve\" }\n    \t]\n    },\n    {\n      title: \"Noma Shoulder Bag\",\n      handle: \"noma-shoulder-bag\",\n      capacityImage: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Noma_Shoulder_Bag_-_Capacity_Image.png?v=1776770732\",\n      capacityText: \"Phone, Charger, Perfume, <br>Lipstick, Earbud\",\n      materialImage: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Material-Icon.png\",\n      materialText: \"Next-Gen <br>Vegan Leather\",\n      wear: [\n      \t{ image: \"https://cdn.shopify.com/s/files/1/0563/5401/3253/files/Crossbody_sling_-_Icon_5b8f4c91-765b-4062-aedb-5bbc6c20cc6c.png\", text: \"Crossbody sling\" }\n    \t]\n    }\n  ];\n\n  let selectedProducts = [\n    compareProducts[0],\n    compareProducts[1],\n    compareProducts[3]\n  ];\n\n  /* =====================================\n      HTML\n  ===================================== */\n  const section = document.createElement(\"section\");\n  section.id = compareId;\n\n  section.innerHTML = `\n    <div class=\"cp-container\">\n      <h2>Which one is for you</h2>\n      <div class=\"cp-compare-wrap\"></div>\n    </div>\n  `;\n\n  /*\n  const collapsibleContent = document.querySelector(\".shopify-section .collapsible-content\");\n  const productFeaturesSection = document.querySelector(\".product-featuresSlider-wrapper\");\n\n  const target = collapsibleContent || productFeaturesSection;;\n\n  const targetRow = target.closest(\".shopify-section\");\n\n  targetRow.insertAdjacentElement(\"afterend\", section);\n  */\n  const sharkSection = document.querySelector(\".cp-shark-section\"); if (!sharkSection) { document.addEventListener(\"DOMContentLoaded\", initProductCompare, { once: true }); return; }\n  const targetRow = sharkSection.closest(\".shopify-section\");\n\n  const prevSibling = targetRow.previousElementSibling;\n\n  if (prevSibling && prevSibling.classList.contains(\"metafield-cp-review-wrapper\")) {\n    prevSibling.insertAdjacentElement(\"beforebegin\", section);\n  } else {\n    targetRow.insertAdjacentElement(\"beforebegin\", section);\n  }\n\n  const wrap = section.querySelector(\".cp-compare-wrap\");\n\n  /* =====================================\n      HELPERS\n  ===================================== */\n\n  function fetchProduct(handle) {\n    return fetch(\"/products/\" + handle + \".js\").then((r) => r.json());\n  }\n\n  function colorMap(name) {\n    const val = name.toLowerCase();\n\n    if (val.includes(\"black\")) return \"#111\";\n    if (val.includes(\"carbon\")) return \"#111\";\n    if (val.includes(\"midnight\")) return \"#111\";\n    if (val.includes(\"clay\")) return \"#d8cec4\";\n    if (val.includes(\"green\")) return \"#6f7658\";\n    if (val.includes(\"fir\")) return \"#6f7658\";\n    if (val.includes(\"blue\")) return \"#a8bfd1\";\n    if (val.includes(\"burgundy\")) return \"#7b2948\";\n\n    return \"#ddd\";\n  }\n\n  async function getProductData(product) {\n    const json = await fetchProduct(product.handle);\n\n    let selectedVariant = null;\n\n    if (product.variantId) {\n      selectedVariant = json.variants.find(\n        (item) => String(item.id) === String(product.variantId)\n      );\n    }\n\n    if (!selectedVariant) {\n      selectedVariant =\n        json.variants.find((item) => item.available) ||\n        json.variants[0];\n    }\n\n    const swatches = [];\n    const used = {};\n\n    json.variants.forEach((variant) => {\n      const color = variant.option1;\n\n      if (!used[color]) {\n        used[color] = true;\n\n        swatches.push({\n          name: color,\n          image:\n            (variant.featured_image &&\n              (variant.featured_image.src ||\n                variant.featured_image.url)) ||\n            json.images[0]\n        });\n      }\n    });\n\n    return {\n      product,\n      image:\n        (selectedVariant.featured_image &&\n          (selectedVariant.featured_image.src ||\n            selectedVariant.featured_image.url)) ||\n        json.images[0],\n      activeColor: selectedVariant.option1,\n      swatches: swatches\n    };\n  }\n\n  function headingRow(title) {\n    return `\n      <div class=\"cp-heading-row ${title}\">\n        <h3>${title}</h3>\n      </div>\n    `;\n  }\n\n  /* =====================================\n      RENDER\n  ===================================== */\n\n  async function renderCompare() {\n    const productsData = await Promise.all(\n      selectedProducts.map((item) => getProductData(item))\n    );\n\n    wrap.innerHTML = `\n      \n      <!-- FIRST ROW -->\n      <div class=\"cp-first-row cp-grid-3\">\n        ${productsData\n          .map(\n            (item, index) => `\n          <div class=\"cp-col cp-first-product-image-select\">\n            <img src=\"${item.image}\" class=\"cp-main-image\" data-index=\"${index}\">\n            \n            <select class=\"cp-select\" data-index=\"${index}\">\n              ${compareProducts\n                .map(\n                  (p) => `\n                <option value=\"${p.title}\" ${\n                    p.title === item.product.title\n                      ? \"selected\"\n                      : \"\"\n                  }>\n                  ${p.title}\n                </option>\n              `\n                )\n                .join(\"\")}\n            </select>\n          </div>\n        `\n          )\n          .join(\"\")}\n      </div>\n\n      ${headingRow(\"Colours\")}\n\n      <!-- SECOND ROW -->\n      <div class=\"cp-second-row cp-grid-3\">\n        ${productsData\n          .map(\n            (item, index) => `\n          <div class=\"cp-col\">\n            <div class=\"cp-swatches\" data-index=\"${index}\">\n              ${item.swatches\n                .map(\n                  (swatch) => `\n                <span \n                  class=\"cp-swatch ${\n                    swatch.name === item.activeColor\n                      ? \"active\"\n                      : \"\"\n                  }\"\n                  data-index=\"${index}\"\n                  data-image=\"${swatch.image}\"\n                  style=\"background:${colorMap(\n                    swatch.name\n                  )}\">\n                </span>\n              `\n                )\n                .join(\"\")}\n            </div>\n\n            <div class=\"cp-color-name\">\n              ${item.swatches\n                .map((x) => x.name)\n                .join(\", \")}\n            </div>\n          </div>\n        `\n          )\n          .join(\"\")}\n      </div>\n\n      ${headingRow(\"Capacity\")}\n\n      <!-- THIRD ROW -->\n      <div class=\"cp-third-row cp-grid-3\">\n        ${productsData\n          .map(\n            (item) => `\n          <div class=\"cp-col cp-info-block\">\n            <img src=\"${item.product.capacityImage}\">\n            <p>${item.product.capacityText}</p>\n          </div>\n        `\n          )\n          .join(\"\")}\n      </div>\n\n      ${headingRow(\"Material\")}\n\n      <!-- FOURTH ROW -->\n      <div class=\"cp-fourth-row cp-grid-3\">\n        ${productsData\n          .map(\n            (item) => `\n          <div class=\"cp-col cp-info-block\">\n            <img src=\"${item.product.materialImage}\">\n            <p>${item.product.materialText}</p>\n          </div>\n        `\n          )\n          .join(\"\")}\n      </div>\n\n      ${headingRow(\"Ways to wear\")}\n\n      <!-- FIFTH ROW -->\n      <div class=\"cp-fifth-row cp-grid-3\">\n        ${productsData\n          .map(\n            (item) => `\n          <div class=\"cp-col cp-wear-list\">\n            ${item.product.wear\n              .map(\n                (wear) => `\n              <div class=\"cp-wear-item\">\n                <img src=\"${wear.image}\">\n                <span>${wear.text}</span>\n              </div>\n            `\n              )\n              .join(\"\")}\n          </div>\n        `\n          )\n          .join(\"\")}\n      </div>\n    `;\n\n    bindEvents();\n  }\n\n  /* =====================================\n      EVENTS\n  ===================================== */\n\n  function bindEvents() {\n    /* dropdown */\n    wrap.querySelectorAll(\".cp-select\").forEach((select) => {\n      select.addEventListener(\"change\", function () {\n        const index = Number(this.dataset.index);\n\n        const found = compareProducts.find(\n          (item) => item.title === this.value\n        );\n\n        if (!found) return;\n\n        selectedProducts[index] = found;\n\n        renderCompare();\n      });\n    });\n\n    /* swatches */\n    wrap.querySelectorAll(\".cp-swatch\").forEach((swatch) => {\n      swatch.addEventListener(\"click\", function () {\n        const index = this.dataset.index;\n        const image = this.dataset.image;\n\n        const img = wrap.querySelector(\n          '.cp-main-image[data-index=\"' + index + '\"]'\n        );\n\n        if (img) img.src = image;\n\n        wrap\n          .querySelectorAll(\n            '.cp-swatch[data-index=\"' + index + '\"]'\n          )\n          .forEach((item) =>\n            item.classList.remove(\"active\")\n          );\n\n        this.classList.add(\"active\");\n      });\n    });\n  }\n\n\n  if (match) {\n    document.body.classList.add('show-compare');\n    /* =====================================\n        INIT\n    ===================================== */\n    renderCompare();\n  }\n})();\n\n"],
  "mappings": "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",
  "names": ["getThreshold"]
}
