{
  "version": 3,
  "sources": ["/cdn/shop/t/26/assets/product.js?lumis-cart-fix=2"],
  "sourcesContent": ["/* ========================================================================\n   INFORMATIONS G\u00C9N\u00C9RALES SUR LE SITE\n   Propri\u00E9t\u00E9 de \u00A9 2019/2024 Shopiweb.fr\n   Pour plus d'informations, visitez : https://www.shopiweb.fr\n   ======================================================================== */\n\n/* =====================\n   Donn\u00E9es de variantes\n   ===================== */\n// Shopify peut ne pas ex\u00E9cuter un script inline inject\u00E9 dans une section.\n// Le JSON pr\u00E9sent dans la page garantit que le s\u00E9lecteur dispose toujours\n// des variantes n\u00E9cessaires pour renseigner l'identifiant envoy\u00E9 au panier.\nconst initializeLumisProductVariants = () => {\n  if (Array.isArray(window.productVariants) && window.productVariants.length > 0) return;\n\n  const variantsJson = document.querySelector(\"#lumis-product-variants-json\")?.textContent?.trim();\n  if (!variantsJson) return;\n\n  try {\n    window.productVariants = JSON.parse(variantsJson);\n\n    const productForm = document.querySelector('form[action*=\"/cart/add\"]');\n    const variantIdInput = productForm?.querySelector('[name=\"id\"]');\n    const firstVariant = window.productVariants.find((variant) => variant.available) || window.productVariants[0];\n    if (variantIdInput && !variantIdInput.value && firstVariant?.id) {\n      variantIdInput.value = firstVariant.id;\n    }\n  } catch (error) {\n    console.warn(\"Lumis: variantes produit illisibles\", error);\n    window.productVariants = [];\n  }\n};\n\nif (document.readyState === \"loading\") {\n  document.addEventListener(\"DOMContentLoaded\", initializeLumisProductVariants, { once: true });\n} else {\n  initializeLumisProductVariants();\n}\n\n/* =====================\n   Formulaire (ATC) bas\u00E9 sur la variante\n   ===================== */\nwindow.handleAtcFormVariantClick = async (btn, event) => {\n  const form = btn.closest(\"form\");\n  form.querySelector('[name=\"id\"]').value = btn.dataset.variantId;\n\n  window.handleAddToCartFormSubmit(form, event);\n};\n\n/* =====================\n   Formulaire principal d'ajout au panier (ATC)\n   ===================== */\nwindow.handleAddToCartFormSubmit = async (form, event) => {\n  event.preventDefault();\n\n  const btn = form.querySelector(\".btn-atc\");\n\n  btn.innerHTML = `\n        <div class=\"spinner-border spinner-border-sm\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n    `;\n\n  form.classList.add(\"loading\");\n\n  const response = await fetch(\"/cart/add.js\", {\n    method: \"POST\",\n    body: new FormData(form),\n  });\n\n  form.classList.remove(\"loading\");\n  btn.innerHTML = window.theme.product.addedToCart;\n\n  setTimeout(() => {\n    btn.innerHTML = btn.dataset.textAddToCart;\n  }, 2000);\n\n  window.updateCartContents(response);\n\n  if (form.hasAttribute(\"data-shopiweb-upsell-modal\")) return;\n  if (btn.closest(\".modal\")) return;\n\n  if (document.querySelector(\"#offcanvas-cart\")) {\n    bootstrap.Offcanvas.getOrCreateInstance(\"#offcanvas-cart\").show();\n  }\n};\n\n/* =====================\n   Mise \u00E0 jour de divers \u00E9l\u00E9ments en cas de changement de variante n\u00E9cessitant une nouvelle recherche de documents\n   ===================== */\nwindow.addEventListener(\"variantChange.shopiweb.product\", async (event) => {\n  const inventoryBar = document.querySelector(\"#inventory-bar\");\n\n  if (inventoryBar) {\n    inventoryBar.style.opacity = \".25\";\n  }\n\n  const respoonse = await fetch(window.location.href);\n  const text = await respoonse.text();\n  const newDocument = new DOMParser().parseFromString(text, \"text/html\");\n\n  document\n    .querySelector(\"#inventory-bar\")\n    ?.replaceWith(newDocument.querySelector(\"#inventory-bar\"));\n  document\n    .querySelector(\"#product-qty-breaks\")\n    ?.replaceWith(newDocument.querySelector(\"#product-qty-breaks\"));\n\n  document\n    .querySelector(\"#product-qty-bundle\")\n    ?.replaceWith(newDocument.querySelector(\"#product-qty-bundle\"));\n\n  document\n    .querySelector(\"#product-store-availability-wrapper\")\n    ?.replaceWith(\n      newDocument.querySelector(\"#product-store-availability-wrapper\")\n    );\n\n  if (document.querySelector('.page-type-product')) {\n      document.querySelector('.product-variant-selector')\n          ?.replaceWith(newDocument.querySelector('.product-variant-selector'))\n      initializeLumisOptionAccordions();\n      initializeLumisHorizonLotCards();\n  }\n\n  initializeInventoryBar();\n  initializeQantityBreaks();\n  initializeBundleWithVariants();\n\n  document.querySelectorAll('[role=\"tooltip\"]').forEach((el) => el.remove());\n\n  document\n    .querySelectorAll('.product-options [data-bs-toggle=\"tooltip\"]')\n    .forEach((el) => new bootstrap.Tooltip(el));\n});\n\n/* =====================\n   Options d'achat (plans de vente/abonnement)\n   ===================== */\nconst initializePurchaseOptions = () => {\n  const wrapper = document.querySelector(\"#purchase-options-product\");\n\n  if (!wrapper) return;\n\n  wrapper.querySelectorAll('[name=\"purchase_option\"]').forEach((input) => {\n    input.addEventListener(\"change\", () => {\n      if (input.id === \"purchase-options-one-time\") {\n        wrapper\n          .querySelector(\"#purchase-delivery-options\")\n          .setAttribute(\"hidden\", \"hidden\");\n        wrapper.querySelector('[name=\"selling_plan\"]').disabled = true;\n\n        if (input.closest(\"#product-template\")) {\n          const url = new URL(window.location);\n          url.searchParams.delete(\"selling_plan\");\n          window.history.replaceState({}, \"\", url);\n        }\n        const btnAtcPrice = input.closest('form').querySelector('.btn-atc-price')\n\n        if (btnAtcPrice) {\n            btnAtcPrice.textContent = Shopify.formatMoney(input.dataset.price)\n        }\n      } else {\n        wrapper\n          .querySelector(\"#purchase-delivery-options\")\n          .removeAttribute(\"hidden\");\n        wrapper.querySelector('[name=\"selling_plan\"]').disabled = false;\n\n        if (input.closest(\"#product-template\")) {\n          const url = new URL(window.location);\n          url.searchParams.set(\n            \"variant\",\n            wrapper.closest(\".product-content\").querySelector('[name=\"id\"]')\n              .value\n          );\n          url.searchParams.set(\n            \"selling_plan\",\n            wrapper.querySelector('[name=\"selling_plan\"]').value\n          );\n          window.history.replaceState({}, \"\", url);\n        }\n\n        const btnAtcPrice = input.closest('form').querySelector('.btn-atc-price')\n\n        if (btnAtcPrice) {\n            btnAtcPrice.textContent = Shopify.formatMoney(input.dataset.price)\n        }\n      }\n    });\n  });\n\n  const selectDeliverEvery = wrapper.querySelector(\n    \"#options-select-purchase-delivery\"\n  );\n\n  if (selectDeliverEvery) {\n    selectDeliverEvery.addEventListener(\"change\", () => {\n      if (selectDeliverEvery.closest(\"#product-template\")) {\n        const url = new URL(window.location);\n        url.searchParams.set(\n          \"selling_plan\",\n          wrapper.querySelector('[name=\"selling_plan\"]').value\n        );\n        window.history.replaceState({}, \"\", url);\n      }\n    });\n  }\n\n  if (wrapper.dataset.subSelectedFirst === \"true\") {\n    wrapper.querySelector(\"input#purchase-options-subscription\").checked = true;\n    wrapper\n      .querySelector(\"input#purchase-options-subscription\")\n      .dispatchEvent(new Event(\"change\"));\n  }\n};\ninitializePurchaseOptions();\n\n/* =====================\n   S\u00E9lecteur d'options de produits - \u00C9couter les \u00E9v\u00E9nements de changement\n   ===================== */\nconst normalizeLumisHorizonToken = (value) =>\n  String(value || \"\")\n    .toLowerCase()\n    .replace(/\\s+/g, \"\")\n    .normalize(\"NFD\")\n    .replace(/[\\u0300-\\u036f]/g, \"\");\n\nconst setLumisImageWidth = (source, width) => {\n  if (!source) return source;\n\n  try {\n    const url = new URL(source, window.location.origin);\n    url.searchParams.set(\"width\", String(width));\n    return url.toString();\n  } catch (error) {\n    return source;\n  }\n};\n\nconst updateLumisHorizonLotCards = (form) => {\n  const horizonInput = form.querySelector(\"[data-lumis-horizon-shape]\");\n  const selectedLength = form.querySelector(\n    \".lumis-option-group--composition .product-option:checked\"\n  );\n  const lotInputs = form.querySelectorAll(\n    \".lumis-option-group--finish input[data-lumis-horizon-lot]\"\n  );\n\n  if (!horizonInput || !selectedLength || !lotInputs.length) return 0;\n\n  const productId = horizonInput.dataset.productId;\n  const gallery = document.querySelector(\n    `.product-gallery[data-product-id=\"${productId}\"]`\n  );\n  if (!gallery) return 0;\n\n  const slides = [...gallery.querySelectorAll(\".main-splide .splide__slide\")];\n  const shape = horizonInput.dataset.lumisHorizonShape;\n  const length = normalizeLumisHorizonToken(selectedLength.value);\n  let selectedLotPosition = 0;\n\n  lotInputs.forEach((lotInput) => {\n    const lot = lotInput.dataset.lumisHorizonLot;\n    const mediaNeedle = `horizon_${shape}_${length}_${lot}_`;\n    const slideIndex = slides.findIndex((slide) =>\n      [...slide.querySelectorAll(\"img, a\")].some((mediaElement) => {\n        const mediaSource =\n          mediaElement.currentSrc || mediaElement.src || mediaElement.href || \"\";\n        return mediaSource.toLowerCase().includes(mediaNeedle);\n      })\n    );\n\n    if (slideIndex < 0) return;\n\n    const slide = slides[slideIndex];\n    const slideImage = slide.querySelector(\"img\");\n    const cardImage = lotInput\n      .closest(\".lumis-option-card\")\n      ?.querySelector(\".lumis-option-card__media img\");\n\n    if (slideImage && cardImage) {\n      const source = slideImage.currentSrc || slideImage.src;\n      cardImage.src = setLumisImageWidth(source, 360);\n      cardImage.srcset = `${setLumisImageWidth(source, 180)} 180w, ${setLumisImageWidth(source, 360)} 360w`;\n    }\n\n    lotInput.dataset.mediaPosition = String(slideIndex + 1);\n    if (lotInput.checked) selectedLotPosition = slideIndex + 1;\n  });\n\n  return selectedLotPosition;\n};\n\nconst initializeLumisHorizonLotCards = () => {\n  document.querySelectorAll('form[action*=\"/cart/add\"]').forEach((form) => {\n    if (form.querySelector(\"[data-lumis-horizon-shape]\")) {\n      updateLumisHorizonLotCards(form);\n    }\n  });\n};\n\nif (document.readyState === \"loading\") {\n  document.addEventListener(\"DOMContentLoaded\", initializeLumisHorizonLotCards, {\n    once: true,\n  });\n} else {\n  initializeLumisHorizonLotCards();\n}\nwindow.addEventListener(\"load\", initializeLumisHorizonLotCards, { once: true });\n\nconst updateLumisCableGalleryPreview = (input) => {\n  const cableGroup = input.closest(\".lumis-option-group--cable\");\n  const cardImage = cableGroup\n    ?.querySelector(`label[for=\"${input.id}\"] .lumis-option-card__media img`);\n  const imageUrl = cardImage?.currentSrc || cardImage?.src || \"\";\n\n  window.dispatchEvent(\n    new CustomEvent(\"lumisCableGalleryPreview\", {\n      detail: {\n        productId: String(input.dataset.productId || \"\"),\n        imageUrl: cableGroup ? imageUrl : \"\",\n        alt: cableGroup ? input.value : \"\",\n      },\n    })\n  );\n};\n\nif (!window.lumisCableGalleryClickBound) {\n  window.lumisCableGalleryClickBound = true;\n\n  document.addEventListener(\"click\", (event) => {\n    const label = event.target.closest(\n      \".lumis-option-group--cable .lumis-option-card__label\"\n    );\n    if (!label) return;\n\n    const input =\n      label.control || document.getElementById(label.getAttribute(\"for\"));\n    if (!input) return;\n\n    window.setTimeout(() => {\n      updateLumisCableGalleryPreview(input);\n    }, 0);\n  });\n}\n\nwindow.handleProductOptionChange = async (input) => {\n  const selectedOptions = [];\n\n  input\n    .closest(\"form\")\n    .querySelectorAll(\".product-option\")\n    .forEach((elem) => {\n      if (elem.type === \"radio\") {\n        if (elem.checked) {\n          selectedOptions.push(elem.value);\n        }\n      } else {\n        selectedOptions.push(elem.value);\n      }\n    });\n\n  const variantSelected = window.productVariants.find(\n    (variant) =>\n      JSON.stringify(variant.options) === JSON.stringify(selectedOptions)\n  );\n\n  console.log(variantSelected);\n\n  const btn = input.closest(\"form\").querySelector(\".btn-atc\");\n\n  if (variantSelected) {\n    input.closest(\"form\").querySelector('[name=\"id\"]').value =\n      variantSelected.id;\n\n    const variantAvailable =\n      variantSelected.available || window.lumisMadeToOrder === true;\n\n    if (variantAvailable) {\n      btn.disabled = false;\n      btn.querySelector('.btn-atc-text').textContent = window.theme.product.addToCart\n    } else {\n      btn.disabled = true;\n      btn.querySelector('.btn-atc-text').textContent = window.theme.product.soldOut\n    }\n\n    if (variantSelected.compare_at_price > variantSelected.price) {\n      input\n        .closest(\".product-content\")\n        .querySelector(\".product-price\").innerHTML = `\n                  <span class=\"product-price-final me-3\">\n                      <span class=\"visually-hidden\">\n                          ${window.theme.product.priceSale} &nbsp;\n                      </span>\n                      ${Shopify.formatMoney(variantSelected.price)}\n                  </span>\n                  <span class=\"product-price-compare text-muted\">\n                      <span class=\"visually-hidden\">\n                          ${window.theme.product.priceFrom} &nbsp;\n                      </span>\n                      <s>\n                          ${Shopify.formatMoney(\n                            variantSelected.compare_at_price\n                          )}\n                      </s>\n                  </span>\n              `;\n    } else {\n      input\n        .closest(\".product-content\")\n        .querySelector(\".product-price\").innerHTML = `\n                  <span class=\"product-price-final\">\n                      ${Shopify.formatMoney(variantSelected.price)}\n                  </span>\n              `;\n    }\n    if (variantAvailable && variantSelected.compare_at_price) {\n      input\n        .closest(\".product-content\")\n        .querySelector(\".product-price\")\n        .insertAdjacentHTML(\n          \"beforeend\",\n          `\n                  <span class=\"price-badge-sale badge\">\n                      ${window.theme.product.save}: ${Math.round(\n            (1 - variantSelected.price / variantSelected.compare_at_price) * 100\n          )}%\n                  </span>    \n              `\n        );\n    } else if (!variantAvailable) {\n      input\n        .closest(\".product-content\")\n        .querySelector(\".product-price\")\n        .insertAdjacentHTML(\n          \"beforeend\",\n          `\n                  <span class=\"price-badge-sold-out badge\">\n                      ${window.theme.product.soldOut}\n                  </span>\n              `\n        );\n    }\n\n    const purchaseOptionsWrapper = document.querySelector(\n      \"#purchase-options-product\"\n    );\n\n    if (purchaseOptionsWrapper) {\n      purchaseOptionsWrapper.querySelector(\n        \"input#purchase-options-one-time + label [data-price]\"\n      ).textContent = Shopify.formatMoney(variantSelected.price);\n      purchaseOptionsWrapper.querySelector(\n        \"input#purchase-options-subscription + label [data-price]\"\n      ).textContent = Shopify.formatMoney(\n        variantSelected.selling_plan_allocations[0].price\n      );\n    }\n\n    const skuWrapper = input\n      .closest(\".product-content\")\n      .querySelector(\".current-variant-sku\");\n\n    if (skuWrapper) {\n      if (variantSelected.sku.length) {\n        skuWrapper.textContent = variantSelected.sku;\n        skuWrapper.removeAttribute(\"hidden\");\n      } else {\n        skuWrapper.setAttribute(\"hidden\", \"hidden\");\n      }\n    }\n\n    if (input.closest(\"#product-template\")) {\n      const url = new URL(window.location);\n      url.searchParams.set(\"variant\", variantSelected.id);\n      window.history.replaceState({}, \"\", url);\n    }\n\n    if (btn.querySelector('.btn-atc-price')) {\n        btn.querySelector('.btn-atc-price').textContent = Shopify.formatMoney(variantSelected.price)\n    }\n\n    const customEvent = new CustomEvent(\"variantChange.shopiweb.product\", {\n      detail: variantSelected,\n    });\n    window.dispatchEvent(customEvent);\n    updateLumisCableGalleryPreview(input);\n\n    const horizonLotMediaPosition = updateLumisHorizonLotCards(\n      input.closest(\"form\")\n    );\n    const mediaPosition =\n      horizonLotMediaPosition || Number(input.dataset.mediaPosition || 0);\n    if (mediaPosition > 0) {\n      window.setTimeout(() => {\n        window.dispatchEvent(new CustomEvent(\"lumisProductOptionMedia\", {\n          detail: { position: mediaPosition },\n        }));\n      }, 450);\n    }\n  } else {\n    btn.disabled = true;\n    btn.querySelector('.btn-atc-text').textContent = window.theme.product.unavailable\n  }\n\n  if (input.closest(\".color-swatches\")) {\n    input\n      .closest(\".product-option-wrapper\")\n      .querySelector(\".color-swatches-title span\").textContent = input.value;\n  }\n\n  if (input.closest(\".size-buttons\")) {\n    input\n      .closest(\".product-option-wrapper\")\n      .querySelector(\".size-buttons-title span\").textContent = input.value;\n  }\n};\n\n/* =====================\n   Options visuelles Lumis - panneaux mobiles c\u00E2ble et rosace/pavillon\n   ===================== */\nconst initializeLumisOptionAccordions = () => {\n  const isMobile = window.matchMedia(\"(max-width: 767px)\").matches;\n\n  document\n    .querySelectorAll(\".lumis-option-group--collapsible\")\n    .forEach((group) => {\n      const toggle = group.querySelector(\".lumis-option-toggle\");\n      if (!toggle) return;\n\n      if (isMobile) {\n        group.classList.add(\"is-collapsed\");\n        toggle.setAttribute(\"aria-expanded\", \"false\");\n      } else {\n        group.classList.remove(\"is-collapsed\");\n        toggle.setAttribute(\"aria-expanded\", \"true\");\n      }\n    });\n};\n\nif (!window.lumisOptionAccordionEventsBound) {\n  window.lumisOptionAccordionEventsBound = true;\n\n  document.addEventListener(\"click\", (event) => {\n    const toggle = event.target.closest(\".lumis-option-toggle\");\n    if (!toggle || !window.matchMedia(\"(max-width: 767px)\").matches) return;\n\n    const group = toggle.closest(\".lumis-option-group--collapsible\");\n    if (!group) return;\n\n    const willOpen = group.classList.contains(\"is-collapsed\");\n    const selector = group.closest(\".product-variant-selector\");\n\n    selector\n      ?.querySelectorAll(\".lumis-option-group--collapsible\")\n      .forEach((item) => {\n        item.classList.add(\"is-collapsed\");\n        item.querySelector(\".lumis-option-toggle\")\n          ?.setAttribute(\"aria-expanded\", \"false\");\n      });\n\n    if (willOpen) {\n      group.classList.remove(\"is-collapsed\");\n      toggle.setAttribute(\"aria-expanded\", \"true\");\n    }\n  });\n\n  window.addEventListener(\"resize\", initializeLumisOptionAccordions);\n  document.addEventListener(\"shopify:section:load\", initializeLumisOptionAccordions);\n}\n\ninitializeLumisOptionAccordions();\n\n/* =====================\n   Article - Changement de la variante\n   ===================== */\nwindow.handleProductItemVariantChange = (select, event) => {\n  if (select.options[select.selectedIndex].dataset.variantImage?.length) {\n    select.closest(\".product-item\").querySelector(\".product-item-img\").src =\n      select.options[select.selectedIndex].dataset.variantImage;\n  }\n\n  const compareAtPrice =\n    select.options[select.selectedIndex].dataset.compareAtPrice;\n  const price = select.options[select.selectedIndex].dataset.price;\n\n  if (compareAtPrice.length) {\n    select\n      .closest(\".product-item\")\n      .querySelector(\".product-item-price\").innerHTML = `\n            <span class=\"product-item-price-final me-1\">\n                <span class=\"visually-hidden\">\n                    ${window.theme.product.priceSale} &nbsp;\n                </span>\n                ${Shopify.formatMoney(price)}\n            </span>\n            <span class=\"product-item-price-compare text-muted\">\n                <span class=\"visually-hidden\">\n                    ${window.theme.product.priceFrom} &nbsp;\n                </span>\n                <s>\n                    ${Shopify.formatMoney(compareAtPrice)}\n                </s>\n            </span>\n        `;\n  } else {\n    select\n      .closest(\".product-item\")\n      .querySelector(\".product-item-price\").innerHTML = `\n            <span class=\"product-item-price-final\">\n                ${Shopify.formatMoney(price)}\n            </span>\n        `;\n  }\n};\n\n/* =====================\n   Bouton (Acheter maintenant)\n   ===================== */\nwindow.handleBuyButtonClick = (btn) => {\n  btn.innerHTML = `\n        <div class=\"spinner-border spinner-border-sm\" role=\"status\">\n            <span class=\"visually-hidden\">Loading...</span>\n        </div>\n    `;\n  const form = btn.closest(\"form\");\n  const variantId = form.querySelector('[name=\"id\"]').value;\n  const qty = Number(form.querySelector('input[name=\"quantity\"]')?.value || 1);\n  window.location.href = `/cart/${variantId}:${qty}`;\n};\n\n/* =====================\n   Galerie de produits\n   ===================== */\nconst initializeProductGallery = () => {\n  document\n    .querySelectorAll(\".product-gallery:not(.init)\")\n    .forEach((gallery) => {\n      gallery.classList.add(\"init\");\n\n      const main = new Splide(gallery.querySelector(\".main-splide\"), {\n        start: Number(gallery.dataset.start),\n        rewind: true,\n        arrows: Number(gallery.dataset.mediaCount > 1) && gallery.dataset.arrows === 'main-slider',\n        rewindByDrag: true,\n        pagination: false,\n        noDrag: \"model-viewer\",\n        mediaQuery: \"min\",\n        breakpoints: {\n          0: {\n            padding: {\n              right: gallery.dataset.showThumbsMobile === \"false\" ? \"4rem\" : 0,\n            },\n          },\n          992: { padding: 0 },\n        },\n        direction: document.documentElement.getAttribute(\"dir\"),\n      });\n\n      const totalSlides = gallery.querySelectorAll(\n        \".main-splide .splide__slide\"\n      ).length;\n\n      const thumbs = new Splide(gallery.querySelector(\".thumbs-splide\"), {\n        start: Number(gallery.dataset.start),\n        arrows: Number(gallery.dataset.mediaCount > 3) && gallery.dataset.arrows === 'thumbs-slider',\n        gap: \".5rem\",\n        rewind: true,\n        rewindByDrag: true,\n        pagination: false,\n        isNavigation: true,\n        focus: totalSlides > 5 ? \"center\" : 0,\n        mediaQuery: \"min\",\n        breakpoints: {\n          0: { perPage: 5 },\n          576: { perPage: 5 },\n          768: { perPage: 5 },\n          992: { perPage: 5 },\n          1200: { perPage: 5 },\n          1400: { perPage: 5 },\n        },\n        direction: document.documentElement.getAttribute(\"dir\"),\n      });\n\n      main.on(\"move\", (newIndex, prevIndex) => {\n        const prevSlide = gallery.querySelector(`.splide__slide:nth-child(${prevIndex + 1})`);\n        const currentSlide = gallery.querySelector(`.splide__slide:nth-child(${newIndex + 1})`);\n      \n        if (prevSlide) {\n          const iframe = prevSlide.querySelector(\"iframe\");\n          const video = prevSlide.querySelector(\"video\");\n          if (iframe) iframe.src = iframe.src;\n          if (video) video.pause();\n        }\n      \n        const autoplay = gallery.dataset.autoplayVideo === \"true\";\n      \n        if (currentSlide && autoplay) {\n          const video = currentSlide.querySelector(\"video\");\n          if (video) {\n            video.play().catch((e) => {\n              console.warn(\"Lecture automatique bloqu\u00E9e :\", e);\n            });\n          }\n        }\n      });\n\n      window.addEventListener(\n        \"variantChange.shopiweb.product\",\n        (event) => {\n          const variantSelected = event.detail;\n\n          if (variantSelected.featured_media) {\n            main.go(variantSelected.featured_media.position - 1);\n          }\n        },\n        false\n      );\n\n      window.addEventListener(\n        \"lumisProductOptionMedia\",\n        (event) => {\n          const position = Number(event.detail?.position || 0);\n          if (position > 0) main.go(position - 1);\n        },\n        false\n      );\n\n      window.addEventListener(\n        \"lumisCableGalleryPreview\",\n        (event) => {\n          const productId = String(event.detail?.productId || \"\");\n          if (productId !== String(gallery.dataset.productId || \"\")) return;\n\n          const track = gallery.querySelector(\".main-splide .splide__track\");\n          if (!track) return;\n\n          let preview = track.querySelector(\".lumis-cable-gallery-preview\");\n          const imageUrl = event.detail?.imageUrl || \"\";\n\n          if (!imageUrl) {\n            preview?.remove();\n            return;\n          }\n\n          if (!preview) {\n            preview = document.createElement(\"div\");\n            preview.className = \"lumis-cable-gallery-preview\";\n            preview.innerHTML = '<img alt=\"\" width=\"1200\" height=\"1200\">';\n            track.appendChild(preview);\n          }\n\n          const previewImage = preview.querySelector(\"img\");\n          previewImage.src = setLumisImageWidth(imageUrl, 1200);\n          previewImage.alt = event.detail?.alt\n            ? `C\u00E2ble textile ${event.detail.alt}`\n            : \"\";\n        },\n        false\n      );\n\n      main.on(\"move\", () => {\n        gallery\n          .querySelector(\".lumis-cable-gallery-preview\")\n          ?.remove();\n      });\n\n      main.sync(thumbs);\n      main.mount();\n      thumbs.mount();\n\n      if (window.matchMedia(\"(min-width: 992px)\").matches) {\n        const navbarHeight =\n          document.querySelector('[id*=\"__navbar\"].sticky-top')?.clientHeight ||\n          0;\n        const announcementBarHeight =\n          document.querySelector('[id*=\"__announcement-bar\"].sticky-top')\n            ?.clientHeight || 0;\n\n        const galleryWrapper = gallery.closest(\".product-gallery-wrapper\");\n        if (!galleryWrapper) return;\n        galleryWrapper.style.position = \"sticky\";\n        galleryWrapper.style.top = `${\n          navbarHeight + announcementBarHeight + 20\n        }px`;\n        galleryWrapper.style.zIndex = \"1\";\n      }\n\n      if (window.GLightbox) {\n        // eslint-disable-next-line no-unused-vars\n        const lightbox = GLightbox({\n          selector: `[data-gallery=\"product-gallery-${gallery.dataset.productId}\"]`,\n          videosWidth: \"1290px\",\n          loop: true,\n        });\n        lightbox.on(\"open\", () => {\n          gallery.querySelectorAll(\"video\").forEach((video) => {\n            video.pause();\n          });\n        });\n        lightbox.on(\"slide_changed\", ({ prev, current }) => {\n          main.go(current.index);\n        });\n      }\n\n      const modelViewer = gallery.querySelector(\"model-viewer\");\n\n      if (modelViewer) {\n        const increaseBtn = gallery.querySelector(\n          \"[data-model-3d-increase-zoom]\"\n        );\n        const decreaseBtn = gallery.querySelector(\n          \"[data-model-3d-decrease-zoom]\"\n        );\n        const fullscreenBtn = gallery.querySelector(\n          \"[data-model-3d-fullscreen]\"\n        );\n\n        increaseBtn.addEventListener(\"click\", () => {\n          modelViewer.zoom(1);\n        });\n\n        decreaseBtn.addEventListener(\"click\", () => {\n          modelViewer.zoom(-1);\n        });\n\n        fullscreenBtn.addEventListener(\"click\", () => {\n          if (document.fullscreenElement) {\n            document.exitFullscreen();\n            fullscreenBtn\n              .querySelector(\".bi-fullscreen\")\n              .removeAttribute(\"hidden\");\n            fullscreenBtn\n              .querySelector(\".bi-fullscreen-exit\")\n              .setAttribute(\"hidden\", \"hidden\");\n          } else {\n            modelViewer\n              .closest(\".product-gallery-model-3d\")\n              .requestFullscreen();\n            fullscreenBtn\n              .querySelector(\".bi-fullscreen\")\n              .setAttribute(\"hidden\", \"hidden\");\n            fullscreenBtn\n              .querySelector(\".bi-fullscreen-exit\")\n              .removeAttribute(\"hidden\");\n          }\n        });\n      }\n    });\n};\ninitializeProductGallery();\n\n// Ajout du script pour g\u00E9rer le texte rotatif s\u00E9par\u00E9ment\nconst initializeSpinningText = () => {\n  const textElement = document.querySelector('.spinning-text p');\n  if (textElement && textElement.textContent.trim() !== \"\") {\n    const chars = textElement.textContent.split('');\n    // Remplacer le texte par des spans individuels avec transformation\n    textElement.innerHTML = chars.map((char, i) => {\n      return `<span style=\"transform: rotate(${i * 360 / chars.length}deg) translateY(-30px);\">${char}</span>`;\n    }).join('');\n  }\n};\n\n// Appel du script au chargement de la section Shopify et de la page\ndocument.addEventListener(\"DOMContentLoaded\", initializeSpinningText);\ndocument.addEventListener(\"shopify:section:load\", initializeSpinningText);\ndocument.addEventListener(\"shopify:section:load\", (e) => {\n  if (e.target.querySelector(\".product-gallery\")) {\n    initializeProductGallery();\n  }\n});\n\nwindow.addEventListener(\n  \"updated.shopiweb.collection\",\n  initializeProductGallery\n);\n\n/* =====================\n   Barre d'inventaire\n   ===================== */\nconst initializeInventoryBar = () => {\n  const wrapper = document.querySelector(\"#inventory-bar\");\n\n  if (!wrapper) return;\n\n  const progressBar = wrapper.querySelector(\".progress-bar\");\n\n  setTimeout(() => {\n    progressBar.style.width = progressBar.dataset.width;\n  }, 250);\n};\ninitializeInventoryBar();\n\ndocument.addEventListener(\"shopify:section:load\", (e) => {\n  if (e.target.querySelector(\"#inventory-bar\")) {\n    initializeInventoryBar();\n  }\n});\n\n/* =====================\n   Upsell modal\n   ===================== */\nconst initializeUpsellModal = () => {\n  const modal = document.querySelector(\"#modal-upsell-product\");\n  if (!modal) return;\n\n  const form = document.querySelector(\n    '#product-content form[onsubmit*=\"handleAddToCartFormSubmit\"]'\n  );\n  if (!form) return;\n\n  form.setAttribute(\"data-shopiweb-upsell-modal\", \"true\");\n\n  form.addEventListener(\"submit\", (e) => {\n    const modal = bootstrap.Modal.getOrCreateInstance(\"#modal-upsell-product\");\n    modal.show();\n  });\n\n  document.querySelectorAll(\"#modal-upsell-product .btn-atc\").forEach((btn) => {\n    btn.addEventListener(\"click\", () => {\n      const footerBtn = document.querySelector(\n        \"#modal-upsell-product .modal-footer .btn\"\n      );\n      footerBtn.classList.remove(footerBtn.dataset.defaultClass);\n      footerBtn.classList.add(footerBtn.dataset.activeClass);\n    });\n  });\n\n  modal.addEventListener(\"hidden.bs.modal\", () => {\n    if (document.querySelector(\"#offcanvas-cart\")) {\n      const offcanvasCart =\n        bootstrap.Offcanvas.getOrCreateInstance(\"#offcanvas-cart\");\n      offcanvasCart.show();\n    }\n  });\n};\ninitializeUpsellModal();\n\ndocument.addEventListener(\"shopify:section:load\", (e) => {\n  if (e.target.querySelector(\"#modal-upsell-product\")) {\n    initializeUpsellModal();\n  }\n});\n\n/* =====================\n   Achet\u00E9s ensemble\n   ===================== */\nconst initializeBoughtTogether = () => {\n  if (!document.querySelector(\"#bought-product-together\")) return;\n\n  const setTotalPrice = () => {\n    let totalCompareAtPrice = 0;\n    let totalPrice = 0;\n\n    document\n      .querySelectorAll(\"#bought-product-together .product-item-price\")\n      .forEach((elem) => {\n        if (\n          elem\n            .closest(\".product-item\")\n            .querySelector(\".check-bought-together:checked\")\n        ) {\n          totalCompareAtPrice += elem.dataset.compareAtPrice.length\n            ? Number(elem.dataset.compareAtPrice)\n            : Number(elem.dataset.price);\n          totalPrice += Number(elem.dataset.price);\n        }\n      });\n\n    const totalElem = document.querySelector(\"#bought-together-total\");\n\n    if (totalCompareAtPrice > totalPrice) {\n      totalElem.innerHTML = `\n                ${totalElem.dataset.textTotalPrice}: \n                <span class=\"bought-together-total-price text-success me-2\">\n                    <span class=\"visually-hidden\">\n                        ${window.theme.product.priceSale} &nbsp;\n                    </span>\n                    ${Shopify.formatMoney(totalPrice)}\n                </span>\n                <span class=\"bought-together-total-compare-price text-muted\">\n                    <span class=\"visually-hidden\">\n                        ${window.theme.product.priceFrom} &nbsp;\n                    </span>\n                    <s>\n                        ${Shopify.formatMoney(totalCompareAtPrice)}\n                    </s>\n                </span>\n            `;\n    } else {\n      totalElem.innerHTML = `\n                ${totalElem.dataset.textTotalPrice}: \n                <span class=\"bought-together-total-price\">\n                    ${Shopify.formatMoney(totalPrice)}\n                </span>\n            `;\n    }\n  };\n\n  document.querySelectorAll(\".check-bought-together\").forEach((checkbox) => {\n    checkbox.addEventListener(\"change\", () => {\n      if (checkbox.checked) {\n        checkbox.closest(\".product-item\").style.opacity = \"1\";\n      } else {\n        checkbox.closest(\".product-item\").style.opacity = \".5\";\n      }\n\n      if (document.querySelector(\".check-bought-together:checked\")) {\n        document.querySelector(\"#add-to-cart-bought-together\").disabled = false;\n      } else {\n        document.querySelector(\"#add-to-cart-bought-together\").disabled = true;\n      }\n\n      setTotalPrice();\n    });\n  });\n\n  document\n    .querySelectorAll('#bought-product-together select[name=\"id\"]')\n    .forEach((select) => {\n      select.addEventListener(\"change\", () => {\n        const compareAtPrice =\n          select.options[select.selectedIndex].dataset.compareAtPrice;\n        const price = select.options[select.selectedIndex].dataset.price;\n\n        select\n          .closest(\".product-item\")\n          .querySelector(\".product-item-price\")\n          .setAttribute(\"data-compare-at-price\", compareAtPrice);\n        select\n          .closest(\".product-item\")\n          .querySelector(\".product-item-price\")\n          .setAttribute(\"data-price\", price);\n\n        setTotalPrice();\n      });\n    });\n\n  document\n    .querySelector(\"#add-to-cart-bought-together\")\n    .addEventListener(\"click\", async (e) => {\n      const btn = e.target;\n\n      btn.style.width = btn.clientWidth + 4 + \"px\";\n      btn.innerHTML = `\n            <div class=\"spinner-border spinner-border-sm\" role=\"status\">\n                <span class=\"visually-hidden\">Loading...</span>\n            </div>\n        `;\n\n      const items = [];\n\n      document\n        .querySelectorAll(\"#bought-product-together .product-item\")\n        .forEach((elem) => {\n          if (elem.querySelector(\".check-bought-together:checked\")) {\n            items.push({\n              id: Number(elem.querySelector('[name=\"id\"]').value),\n              quantity: 1,\n            });\n          }\n        });\n\n      const response = await fetch(\"/cart/add.js\", {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify({ items }),\n      });\n\n      btn.innerHTML = window.theme.product.addedToCart;\n\n      setTimeout(() => {\n        btn.innerHTML = btn.dataset.textAddToCart;\n      }, 2000);\n\n      window.updateCartContents(response);\n\n      bootstrap.Offcanvas.getOrCreateInstance(\"#offcanvas-cart\").show();\n    });\n};\ninitializeBoughtTogether();\n\n/* =====================\n   Produits pr\u00E9c\u00E9dents/suivants (ne s'affiche que si le produit fait partie d'une collection)\n   ===================== */\nconst inititializeButtonsPrevNext = async () => {\n  const wrapper = document.querySelector(\"#product-prev-next\");\n\n  if (!wrapper) return;\n\n  if (!window.matchMedia(\"(max-width: 1599px)\").matches) return;\n\n  await new Promise((resolve) => setTimeout(resolve, 1000));\n\n  const threshold =\n    document\n      .querySelector('.product-content form[action*=\"/cart/add\"]')\n      .getBoundingClientRect().bottom + window.scrollY;\n\n  window.addEventListener(\"scroll\", () => {\n    if (window.scrollY > threshold) {\n      wrapper.classList.add(\"show\");\n    } else {\n      wrapper.classList.remove(\"show\");\n    }\n  });\n};\ninititializeButtonsPrevNext();\n\n/* =====================\n   Pack quantit\u00E9 (Qty Breaks)\n   ===================== */\nconst initializeQantityBreaks = () => {\n  document.querySelectorAll('[name=\"product-qty-breaks\"]').forEach((radio) => {\n    radio.addEventListener(\"change\", () => {\n      const qty = Number(radio.dataset.qty);\n\n      const qtyField = radio.closest(\"form\").querySelector('[name=\"quantity\"]');\n      const form = radio.closest(\"form\");\n      const btn = form.querySelector('button[name=\"add\"]');\n\n      if (!qtyField) return;\n\n      qtyField.value = qty;\n      qtyField.dispatchEvent(new Event(\"change\"));\n\n      setTimeout(() => {\n        btn.classList.add(\"animate__animated\", \"animate__shakeX\");\n      }, 250);\n\n      setTimeout(() => {\n        btn.classList.remove(\"animate__animated\", \"animate__shakeX\");\n      }, 1500);\n\n      if (form.querySelector('.btn-atc-price')) {\n        form.querySelector('.btn-atc-price').textContent = radio.dataset.price\n      }\n\n      document.querySelectorAll('[name=\"product-qty-breaks\"]').forEach(radio => {\n        radio.closest('.form-check').classList.remove('form-check-is-checked')\n      })\n\n      radio.closest('.form-check').classList.add('form-check-is-checked')\n    });\n  });\n  document.querySelectorAll('[name=\"product-qty-breaks\"]').forEach(radio => {\n    const formCheck = radio.closest('.form-check');\n    if (!formCheck) return; // V\u00E9rification si .form-check est introuvable\n  \n    const label = formCheck.querySelector('label');\n    if (!label) return; // V\u00E9rification si label est introuvable\n  \n    label.addEventListener('click', () => {\n      if (formCheck.classList.contains('form-check-is-checked')) {\n        formCheck.classList.remove('form-check-is-checked');\n  \n        setTimeout(() => {\n          document.querySelectorAll('[name=\"product-qty-breaks\"]').forEach(radio => {\n            radio.checked = false;\n          });\n  \n          const qtyField = radio.closest('form').querySelector('[name=\"quantity\"]');\n          qtyField.value = '1';\n  \n          const form = radio.closest('form');\n          const qtyBreaksList = radio.closest('#product-qty-breaks-list');\n  \n          if (form.querySelector('.btn-atc-price')) {\n            form.querySelector('.btn-atc-price').textContent = qtyBreaksList.dataset.currentVariantPrice;\n          }\n        }, 100);\n      }\n    });\n  });\n};\ninitializeQantityBreaks();\n\n/* =====================\n   Pack quantit\u00E9 avec variantes (Qty Breaks Variants)\n   ===================== */\n\n// G\u00E8re l'affichage du bundle s\u00E9lectionn\u00E9 (type ShopiBundle)\nfunction toggleBundle(header) {\n  document.querySelectorAll('.shopibundle-box').forEach(el => {\n    el.classList.remove('active');\n    el.querySelector('.accordion-collapse').classList.remove('show');\n  });\n  const box = header.closest('.shopibundle-box');\n  box.classList.add('active');\n  box.querySelector('.accordion-collapse').classList.add('show');\n\n  // \u2705 Met \u00E0 jour le prix dans le bouton ATC selon l'option\n  const btn = document.querySelector('.btn-atc-bundle');\n  const price = box.dataset.finalPrice;\n  const defaultText = btn.dataset.textAddToCart || 'Ajouter au panier';\n  const showPrice = btn.dataset.showPrice === 'true';\n\n  if (btn) {\n    if (showPrice && price) {\n      btn.innerHTML = `${defaultText} \u2013 <span class=\"btn-atc-price\">${price}</span>`;\n    } else {\n      btn.innerHTML = defaultText;\n    }\n  }\n}\n\n// Ajoute le bundle s\u00E9lectionn\u00E9 au panier (fonction native th\u00E8me)\nfunction submitSelectedBundle(event) {\n  const btn = event?.currentTarget;\n  if (btn) btn.disabled = true;\n\n  const box = document.querySelector('.shopibundle-box.active');\n  if (!box) {\n    if (btn) btn.disabled = false;\n    return alert(\"Veuillez s\u00E9lectionner une offre.\");\n  }\n\n  const selects = box.querySelectorAll('.bundle-variant-select');\n  const variantCount = {};\n  let valid = true;\n  const bundleVariantIds = [];\n\n  selects.forEach(sel => {\n    const variantId = parseInt(sel.value);\n    if (!variantId || isNaN(variantId)) {\n      valid = false;\n      return;\n    }\n    variantCount[variantId] = (variantCount[variantId] || 0) + 1;\n    bundleVariantIds.push(variantId); // Ajoute chaque variante s\u00E9lectionn\u00E9e \u00E0 la liste\n  });\n\n  // Ajout du cadeau si pr\u00E9sent\n  const giftVariantId = box.getAttribute('data-gift-variant-id');\n  if (giftVariantId && !isNaN(parseInt(giftVariantId))) {\n    variantCount[parseInt(giftVariantId)] = 1;\n  }\n\n  // Met \u00E0 jour le data-attribute bundle pour le script panier\n  const bundleData = document.getElementById('shopibundle-bundle-data');\n  if (bundleData) {\n    bundleData.dataset.bundleVariantIds = JSON.stringify(bundleVariantIds);\n    bundleData.dataset.giftVariantId = giftVariantId || \"\";\n  }\n\n  if (!valid || Object.keys(variantCount).length === 0) {\n    if (btn) btn.disabled = false;\n    return alert(\"Veuillez s\u00E9lectionner toutes les variantes.\");\n  }\n\n  const items = Object.entries(variantCount).map(([id, qty], i) => {\n    const item = {\n      id: parseInt(id),\n      quantity: qty\n    };\n    if (i === 0) {\n      item.properties = {\n        _shopibundle: JSON.stringify(bundleVariantIds),\n        _shopibundle_gift: giftVariantId || \"\"\n      };\n    }\n    return item;\n  });\n\n  fetch('/cart/add.js', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify({ items })\n  })\n    .then(response => {\n      if (document.querySelector(\"#offcanvas-cart\")) {\n        bootstrap.Offcanvas.getOrCreateInstance(\"#offcanvas-cart\").show();\n      }\n      if (typeof window.updateCartContents === \"function\") {\n        window.updateCartContents(response);\n      }\n      window.dispatchEvent(new CustomEvent(\"updated.shopiweb.cart\"));\n      if (btn) btn.disabled = false;\n    })\n    .catch(error => {\n      if (btn) btn.disabled = false;\n      alert(\"Erreur : \" + error.message);\n    });\n}\n\nfunction formatMoneyCents(cents) {\n  if (window.Shopify && typeof Shopify.formatMoney === 'function') {\n    const mf = window.theme?.moneyFormat || window.Shopify?.money_format || \"{{ shop.money_format | escape }}\";\n    return Shopify.formatMoney(cents, mf);\n  }\n  const n = (cents / 100).toFixed(2).replace('.', ',');\n  return n + ' \u20AC';\n}\n\nfunction recalcActiveBundlePrice(box) {\n  if (!box) return;\n  const selects = box.querySelectorAll('.bundle-variant-select');\n  let totalCents = 0;\n  let valid = true;\n\n  selects.forEach(sel => {\n    const p = parseInt(sel.options[sel.selectedIndex]?.dataset.price, 10);\n    if (isNaN(p)) { valid = false; return; }\n    totalCents += p;\n  });\n  if (!valid) return;\n\n  const discountPct = parseInt(box.dataset.discount || '0', 10);\n  const finalCents = Math.round(totalCents * (100 - discountPct) / 100);\n\n  // UI : prix bloc\n  const priceWrap = box.querySelector('.bundle-price-display');\n  if (priceWrap) {\n    const main = priceWrap.querySelector('span'); // 1er span = prix final\n    if (main) main.textContent = formatMoneyCents(finalCents);\n    const strike = priceWrap.querySelector('.text-decoration-line-through');\n    if (strike) {\n      if (discountPct > 0) {\n        strike.textContent = formatMoneyCents(totalCents);\n        strike.style.display = '';\n      } else {\n        strike.style.display = 'none';\n      }\n    }\n  }\n\n  // datasets + bouton ATC\n  box.dataset.finalPrice = formatMoneyCents(finalCents);\n  box.dataset.finalPriceCents = String(finalCents);\n\n  const btn = document.querySelector('.btn-atc-bundle');\n  if (btn) {\n    const defaultText = btn.dataset.textAddToCart || 'Ajouter au panier';\n    const showPrice = btn.dataset.showPrice === 'true';\n    btn.innerHTML = showPrice\n      ? `${defaultText} \u2013 <span class=\"btn-atc-price\">${box.dataset.finalPrice}</span>`\n      : defaultText;\n  }\n}\n\n// Initialisation globale \u00E0 appeler au chargement ET au section reload Shopify\nfunction initializeBundleWithVariants() {\n  // Toggle pack + recalcul\n  document.querySelectorAll('.shopibundle-header').forEach(header => {\n    header.onclick = () => {\n      toggleBundle(header);\n      recalcActiveBundlePrice(header.closest('.shopibundle-box'));\n    };\n  });\n\n  // Selects variantes : thumbnail + recalcul \u00E0 chaque change + init\n  document.querySelectorAll('.accordion-body').forEach(body => {\n    const selects = body.querySelectorAll('.bundle-variant-select');\n    const thumbs  = body.querySelectorAll('.variant-thumbnail');\n\n    selects.forEach((select, index) => {\n      const updateThumbAndPrice = () => {\n        const option = select.options[select.selectedIndex];\n        const url = option?.dataset.image;\n        if (url && thumbs[index]) thumbs[index].src = url;\n\n        recalcActiveBundlePrice(select.closest('.shopibundle-box'));\n      };\n      select.onchange = updateThumbAndPrice;\n      updateThumbAndPrice(); // init\n    });\n  });\n\n  // Bouton ATC\n  document.querySelectorAll('.btn-atc-bundle').forEach(btn => {\n    btn.onclick = submitSelectedBundle;\n  });\n\n  // Init depuis le pack actif\n  const activeBox = document.querySelector('.shopibundle-box.active');\n  if (activeBox) recalcActiveBundlePrice(activeBox);\n}\n\n// On bind l'init au chargement ET \u00E0 chaque rechargement de section Shopify\ndocument.addEventListener(\"DOMContentLoaded\", initializeBundleWithVariants);\ndocument.addEventListener(\"shopify:section:load\", initializeBundleWithVariants);\n\n\n/* =====================\n   Personnalisation (propri\u00E9t\u00E9s personnalis\u00E9es)\n   ===================== */\nconst initializePersonalization = () => {\n  document\n    .querySelectorAll('.product-personalization-field[data-type=\"checkbox\"]')\n    .forEach((elem) => {\n      let values = [];\n\n      elem.querySelectorAll(\"input\").forEach((checkbox) => {\n        checkbox.addEventListener(\"change\", () => {\n          if (checkbox.checked) {\n            values.push(checkbox.value);\n          } else {\n            values = values.filter((item) => item !== checkbox.value);\n          }\n\n          elem.querySelector('[type=\"hidden\"]').value = values.join(\", \");\n        });\n      });\n    });\n};\ninitializePersonalization();\n\n/* =====================\n   Synchroniser la quantit\u00E9 entre la fiche produit, Sticky ATC, etc.\n   ===================== */\nconst initializeSyncQty = () => {\n  const productFormQtyInput = document.querySelector(\n    '.product-buy-buttons input[name=\"quantity\"]'\n  );\n\n  if (!productFormQtyInput) return;\n\n  productFormQtyInput.addEventListener(\"change\", () => {\n    const stickyAtcQtyInput = document.querySelector(\n      '#sticky-atc input[name=\"quantity\"]'\n    );\n\n    if (!stickyAtcQtyInput) return;\n\n    stickyAtcQtyInput.value = productFormQtyInput.value;\n  });\n};\ninitializeSyncQty();\n\n/* =====================\n   Offre limit\u00E9e, Visiteurs en direct, Livraison estim\u00E9e\n   ===================== */\nconst initializeLimitedOffer = () => {\n  const blocks = document.querySelectorAll(\n    \"#product-limited-offer, #product-live-visitors, #product-estimated-delivery\"\n  );\n\n  if (!blocks.length) return;\n\n  blocks.forEach((block) => {\n    const icon = block.querySelector(\".block-icon\");\n\n    setInterval(() => {\n      icon.classList.add(\"animate__animated\", \"animate__tada\");\n\n      setTimeout(() => {\n        icon.classList.remove(\"animate__animated\", \"animate__tada\");\n      }, 1500);\n    }, 3000);\n  });\n};\n\ninitializeLimitedOffer();\n\n/* =====================\n   Bloc produit T\u00E9moignages\n   ===================== */\n//Inject\u00E9 dans product-block-testimonials.liquid\n\n/* =====================\n   Estimation livraison Shopiweb\n   ===================== */\nconst initializeEstimatedDelivery = () => {\n  const container = document.querySelector(\"#product-estimated-delivery\");\n  if (!container) return;\n\n  const startDays = parseInt(container.dataset.startDays || \"3\");\n  const endDays = parseInt(container.dataset.endDays || \"6\");\n  const lang = container.dataset.lang === \"fr\" ? \"fr-FR\" : \"en-US\";\n  const color = container.dataset.color || \"#000\";\n  const excludeSundays = container.dataset.excludeSundays === \"true\";\n  const msg = container.dataset.message || (lang === \"fr-FR\"\n    ? \"Livraison estim\u00E9e entre le\"\n    : \"Estimated delivery between\");\n\n  const addDaysSmart = (baseDate, days, excludeSunday) => {\n    const result = new Date(baseDate);\n    let added = 0;\n    while (added < days) {\n      result.setDate(result.getDate() + 1);\n      if (!excludeSunday || result.getDay() !== 0) {\n        added++;\n      }\n    }\n    return result;\n  };\n\n  const today = new Date();\n  const startDate = addDaysSmart(today, startDays, excludeSundays);\n  const endDate = addDaysSmart(today, endDays, excludeSundays);\n\n  const options = { weekday: \"long\", day: \"numeric\", month: \"long\" };\n  const startStr = startDate.toLocaleDateString(lang, options);\n  const endStr = endDate.toLocaleDateString(lang, options);\n  const connector = lang === \"fr-FR\" ? \"et\" : \"and\";\n\n  container.querySelector(\".delivery-message\").innerHTML = `\n    ${msg} <span style=\"color:${color}; font-weight:bold;\">${startStr}</span> ${connector} <span style=\"color:${color}; font-weight:bold;\">${endStr}</span>.\n  `;\n};\n\ninitializeEstimatedDelivery();\n\ndocument.addEventListener(\"shopify:section:load\", (e) => {\n  if (e.target.querySelector(\"#product-estimated-delivery\")) {\n    initializeEstimatedDelivery();\n  }\n});\n\n/* =====================\n   Bloc produit score progression\n   ===================== */\ndocument.addEventListener('DOMContentLoaded', function() {\n  const productProgressScore = document.querySelectorAll('.product-progress-circle');\n  productProgressScore.forEach(circle => {\n    const targetPercentage = parseInt(circle.dataset.percentage);\n    const valueDisplay = circle.querySelector('.progress-value');\n    let currentPercentage = 0;\n\n    const animateProgress = () => {\n      if (currentPercentage < targetPercentage) {\n        currentPercentage++;\n        circle.style.setProperty('--percentage', currentPercentage + '%');\n        valueDisplay.textContent = currentPercentage + '%';\n        requestAnimationFrame(animateProgress);\n      }\n    };\n\n    setTimeout(animateProgress, 100);\n  });\n});\n\n/* =====================\n   Pop-up de vente\n   ===================== */\n(() => {\n  if (window.shopiwebSalesPopupInitialized) return;\n  window.shopiwebSalesPopupInitialized = true;\n  const popup = document.getElementById('shopiweb-sales-popup');\n  if (!popup) return;\n  const staticBlocks = popup.querySelectorAll('.static-block');\n  const config = {\n    initialDelay: parseInt(popup.dataset.delay) * 1000,\n    idleDelay: parseInt(popup.dataset.idleDelay) * 3600000,\n    rotateInterval: parseInt(popup.dataset.rotateInterval) * 1000,\n    showDuration: parseInt(popup.dataset.showDuration) * 1000,\n    popupStyle: popup.dataset.popupStyle || \"standard\"\n  };\n  const lastClosed = localStorage.getItem('shopiweb-sales-popup-last-closed');\n  if (lastClosed && (Number(lastClosed) + config.idleDelay) > Date.now()) return;\n  let rotationTimeout = null, currentIndex = 0, activeBlocks = [], isRotating = false;\n  function showBlock(block) {\n    if (config.popupStyle === 'slide') {\n      block.classList.add('slide-style', 'preparing');\n      block.style.display = 'flex';\n      requestAnimationFrame(() => {\n        block.classList.remove('preparing');\n        block.classList.add('slide-in');\n        block.classList.remove('slide-out');\n      });\n    } else {\n      block.classList.add('standard-style');\n      block.classList.remove('hidden');\n      block.style.display = 'flex';\n    }\n  }\n  function hideBlock(block) {\n    if (config.popupStyle === 'slide') {\n      block.classList.remove('slide-in');\n      block.classList.add('slide-out');\n      setTimeout(() => {\n        block.style.display = 'none';\n        block.classList.remove('slide-style', 'slide-out');\n      }, 400);\n    } else {\n      block.classList.add('hidden');\n      setTimeout(() => {\n        block.style.display = 'none';\n        block.classList.remove('standard-style', 'hidden');\n      }, 300);\n    }\n  }\n  function rotateToNext() {\n    if (activeBlocks.length <= 1 || !isRotating) return;\n    hideBlock(activeBlocks[currentIndex]);\n    currentIndex = (currentIndex + 1) % activeBlocks.length;\n    const delay = config.popupStyle === 'slide' ? 800 : 500;\n    const nextDelay = config.popupStyle === 'slide' ? config.showDuration : config.rotateInterval;\n    setTimeout(() => {\n      showBlock(activeBlocks[currentIndex]);\n      rotationTimeout = setTimeout(rotateToNext, nextDelay);\n    }, delay);\n  }\n  function setupPopupRotation(blocks) {\n    if (!blocks.length) return;\n    activeBlocks = blocks;\n    currentIndex = 0;\n    isRotating = true;\n    activeBlocks.forEach(block => {\n      if (block.dataset.url) block.classList.add('clickable');\n    });\n    showBlock(activeBlocks[0]);\n    if (activeBlocks.length > 1) {\n      const initialDelay = config.popupStyle === 'slide' ? config.showDuration : config.rotateInterval;\n      rotationTimeout = setTimeout(rotateToNext, initialDelay);\n    }\n  }\n  function stopRotation() {\n    isRotating = false;\n    if (rotationTimeout) clearTimeout(rotationTimeout);\n    for (let i = 0; i < activeBlocks.length; i++) {\n      const block = activeBlocks[i];\n      if (block.style.display !== 'none') hideBlock(block);\n    }\n    localStorage.setItem('shopiweb-sales-popup-last-closed', Date.now().toString());\n  }\n  function setupEventListeners() {\n    popup.addEventListener('click', (e) => {\n      const target = e.target;\n      const popupItem = target.closest('.shopiweb-sales-popup-item');\n      if (!popupItem) return;\n      if (target.classList.contains('shopiweb-sales-popup-close')) {\n        e.stopPropagation();\n        stopRotation();\n      } else if (popupItem.dataset.url && popupItem.classList.contains('clickable')) {\n        window.open(popupItem.dataset.url, '_blank', 'noopener,noreferrer');\n      }\n    });\n  }\n  function init() {\n    setTimeout(() => {\n      const blocks = Array.from(staticBlocks);\n      if (blocks.length) {\n        setupPopupRotation(blocks);\n        setupEventListeners();\n      }\n    }, config.initialDelay);\n  }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);\n  else init();\n  window.addEventListener('beforeunload', () => {\n    if (rotationTimeout) clearTimeout(rotationTimeout);\n  });\n})();\n\n/* =====================\n   Discount code\n   ===================== */\nfunction initializeCouponCopy() {\n  document.querySelectorAll(\".coupon-copy-btn\").forEach(btn => {\n\n    const textEl = btn.querySelector(\".btn-text\");\n    const iconEl = btn.querySelector(\".btn-icon\");\n\n    const originalText = btn.dataset.text;\n    const copiedText   = btn.dataset[\"textCopied\"];\n    const originalIcon = iconEl.innerHTML;\n    const confettiOn   = btn.dataset.confetti === \"true\";\n\n    const originalClass = btn.className;\n\n    const checkSVG = `\n      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\n           fill=\"currentColor\" viewBox=\"0 0 16 16\">\n        <path d=\"M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0m-3.97-3.03\n                 a.75.75 0 0 0-1.08.022L7.477 9.417 5.384 7.323a.75.75\n                 0 0 0-1.06 1.06L6.97 11.03a.75.75\n                 0 0 0 1.079-.02l3.992-4.99a.75.75\n                 0 0 0-.01-1.05z\"/>\n      </svg>\n    `;\n\n    function launchConfetti() {\n      if (!confettiOn || typeof confetti !== \"function\") return;\n\n      const duration = 800;\n      const end = Date.now() + duration;\n\n      (function frame() {\n        confetti({ particleCount: 6, startVelocity: 25, spread: 50, angle: 60, origin: { x: 0 } });\n        confetti({ particleCount: 6, startVelocity: 25, spread: 50, angle: 120, origin: { x: 1 } });\n\n        if (Date.now() < end) requestAnimationFrame(frame);\n      })();\n    }\n\n    btn.addEventListener(\"click\", () => {\n\n      const code = btn.dataset.code.trim();\n      navigator.clipboard.writeText(code).then(() => {\n\n        textEl.textContent = copiedText;\n        iconEl.innerHTML = checkSVG;\n\n        // \uD83D\uDD25 Supprimer toutes les classes btn-XXX existantes\n        btn.classList.forEach(cls => {\n          if (cls.startsWith(\"btn-\") && cls !== \"btn\" && cls !== \"btn-sm\") {\n            btn.classList.remove(cls);\n          }\n        });\n\n        // \uD83D\uDC9A Ajouter le vert\n        btn.classList.add(\"btn-success\", \"copied-anim\");\n\n        launchConfetti();\n\n        // Retour normal\n        setTimeout(() => {\n          btn.className = originalClass;\n          textEl.textContent = originalText;\n          iconEl.innerHTML = originalIcon;\n        }, 1500);\n      });\n    });\n  });\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", initializeCouponCopy);\ndocument.addEventListener(\"shopify:section:load\", initializeCouponCopy);\n"],
  "mappings": "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",
  "names": ["slide", "radio"]
}
