{"title":"Page d'accueil","description":null,"products":[{"product_id":"maillots-algerie","title":"Maillot Algérie 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57328665592185,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57328707436921,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57328665624953,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57328707469689,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57328665657721,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57328707502457,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57328665690489,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57328707535225,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/de12320a-7543-490c-8260-78c649dfff55.jpg?v=1779733317"},{"product_id":"maillots-algerie-copie","title":"Maillot Brésil 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345611366777,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345611399545,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345611432313,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345611465081,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345611497849,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345611530617,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345611563385,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345611596153,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/edd75f14-fa82-49ad-a676-641c86a030e9.jpg?v=1780010711"},{"product_id":"maillots-algerie-copie-copie","title":"Veste Brésil Turquoise 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display: none;\"\u003e\n\u003cdiv class=\"maillot-info\"\u003e\n\u003cp class=\"flocage-title\"\u003e🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\u003c\/p\u003e\n\u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv id=\"flocage-box\" style=\"display: none;\"\u003e\n\u003clabel\u003eNom du joueur\u003c\/label\u003e \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : RONALDO\"\u003e \u003clabel\u003eNuméro\u003c\/label\u003e \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 7\"\u003e \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex : MADRID\"\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\u003cp\u003e \u003c\/p\u003e","brand":"My Store 8","offers":[{"title":"M","offer_id":57345618051449,"sku":null,"price":45.0,"currency_code":"EUR","in_stock":true},{"title":"L","offer_id":57345618116985,"sku":null,"price":45.0,"currency_code":"EUR","in_stock":true},{"title":"XL","offer_id":57345618182521,"sku":null,"price":45.0,"currency_code":"EUR","in_stock":true},{"title":"2XL","offer_id":57345618248057,"sku":null,"price":45.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-26-23-03-21.jpg?v=1780068971"},{"product_id":"maillots-algerie-copie-copie-copie","title":"Veste Brésil Cyan 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display: none;\"\u003e\n\u003cdiv class=\"maillot-info\"\u003e\n\u003cp class=\"flocage-title\"\u003e🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\u003c\/p\u003e\n\u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv id=\"flocage-box\" style=\"display: none;\"\u003e\n\u003clabel\u003eNom du joueur\u003c\/label\u003e \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : RONALDO\"\u003e \u003clabel\u003eNuméro\u003c\/label\u003e \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 7\"\u003e \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex : MADRID\"\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\u003cp\u003e \u003c\/p\u003e","brand":"My Store 8","offers":[{"title":"M","offer_id":57345618379129,"sku":null,"price":45.0,"currency_code":"EUR","in_stock":true},{"title":"L","offer_id":57345618444665,"sku":null,"price":45.0,"currency_code":"EUR","in_stock":true},{"title":"XL","offer_id":57345618510201,"sku":null,"price":45.0,"currency_code":"EUR","in_stock":true},{"title":"2XL","offer_id":57345618575737,"sku":null,"price":45.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-26-23-03-224.jpg?v=1780069074"},{"product_id":"maillots-algerie-copie-copie-copie-copie","title":"Veste Brésil Blanche 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display: none;\"\u003e\n\u003cdiv class=\"maillot-info\"\u003e\n\u003cp class=\"flocage-title\"\u003e🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\u003c\/p\u003e\n\u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv id=\"flocage-box\" style=\"display: none;\"\u003e\n\u003clabel\u003eNom du joueur\u003c\/label\u003e \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : RONALDO\"\u003e \u003clabel\u003eNuméro\u003c\/label\u003e \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 7\"\u003e \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex : MADRID\"\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\u003cp\u003e \u003c\/p\u003e","brand":"My Store 8","offers":[{"title":"M","offer_id":57345628799353,"sku":null,"price":45.0,"currency_code":"EUR","in_stock":true},{"title":"L","offer_id":57345628864889,"sku":null,"price":45.0,"currency_code":"EUR","in_stock":true},{"title":"XL","offer_id":57345628930425,"sku":null,"price":45.0,"currency_code":"EUR","in_stock":true},{"title":"2XL","offer_id":57345628995961,"sku":null,"price":45.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-26-23-03-227.jpg?v=1780069175"},{"product_id":"maillots-algerie-copie-copie-copie-copie-copie","title":"Maillot Croatie 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345629716857,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345629749625,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345629782393,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345629815161,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345629847929,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345629880697,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345629913465,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345629946233,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-408.jpg?v=1780069393"},{"product_id":"maillots-algerie-copie-1","title":"Maillot Suisse Vert 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345632993657,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345633026425,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345633059193,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345633091961,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345633124729,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345633157497,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345633190265,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345633223033,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-402.jpg?v=1780069692"},{"product_id":"maillots-algerie-copie-copie-1","title":"Maillot Brésil Jaune 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345635484025,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345635516793,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345635549561,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345635582329,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345635615097,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345635647865,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345635680633,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345635713401,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-26-23-03-214.jpg?v=1780069790"},{"product_id":"maillots-algerie-copie-copie-copie-1","title":"Maillot Brésil Blanc 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345637056889,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345637089657,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345637122425,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345637155193,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345637187961,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345637220729,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345637253497,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345637286265,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-26-23-03-223.jpg?v=1780069901"},{"product_id":"maillots-algerie-copie-copie-copie-copie-1","title":"Maillot Tunisie 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345637843321,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345637876089,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345637908857,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345637941625,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345637974393,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345638007161,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345638039929,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345638072697,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-4010.jpg?v=1780070006"},{"product_id":"maillots-algerie-copie-copie-copie-copie-copie-1","title":"Maillot Maroc 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345638138233,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345638171001,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345638203769,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345638236537,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345638269305,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345638302073,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345638334841,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345638367609,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-4014_96e570f9-75c7-4d74-a4f4-bd58a92b2ff3.jpg?v=1780070109"},{"product_id":"maillots-algerie-copie-copie-copie-copie-copie-copie","title":"Maillot Côte d'Ivoire 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345638728057,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345638760825,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345638793593,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345638826361,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345638859129,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345638891897,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345638924665,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345638957433,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-4012.jpg?v=1780070282"},{"product_id":"maillot-bresil-2026-2027-copie","title":"Maillot République démocratique du Congo 2026\/2027 (RDC)","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345661403513,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345661436281,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345661469049,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345661501817,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345661534585,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345661567353,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345661600121,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345661632889,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-4023.jpg?v=1780070386"},{"product_id":"maillot-bresil-2026-2027-copie-copie","title":"Maillot Maroc Blanc 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345665007993,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345665040761,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345665073529,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345665106297,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345665139065,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345665171833,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345665204601,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345665237369,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-4017.jpg?v=1780070554"},{"product_id":"maillot-bresil-2026-2027-copie-copie-copie","title":"Maillot Canada 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345670939001,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345670971769,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345671004537,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345671037305,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345671070073,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345671102841,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345671135609,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345671168377,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-404.jpg?v=1780070628"},{"product_id":"maillot-bresil-2026-2027-copie-copie-copie-copie","title":"Maillot Côte d'Ivoire Blanc 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345675493753,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345675526521,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345675559289,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345675592057,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345675624825,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345675657593,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345675690361,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345675723129,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-4021.jpg?v=1780070740"},{"product_id":"maillot-bresil-2026-2027-copie-copie-copie-copie-copie","title":"Maillot République démocratique du Congo Blanc 2026\/2027 (RDC)","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345677263225,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345677295993,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345677328761,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345677361529,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345677394297,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345677427065,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345677459833,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345677492601,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-4024.jpg?v=1780070899"},{"product_id":"maillot-bresil-2026-2027-copie-copie-copie-copie-copie-copie","title":"Maillot Brésil Noir 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345678410105,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345678442873,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345678475641,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345678508409,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345678541177,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345678573945,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345678606713,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345678639481,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-26-23-03-22.jpg?v=1780071042"},{"product_id":"maillot-bresil-2026-2027-copie-copie-copie-copie-copie-copie-copie","title":"Maillot Costa Rica Rouge 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345678705017,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345678737785,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345678770553,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345678803321,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345678836089,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345678868857,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345678901625,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345678934393,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-452.jpg?v=1780071142"},{"product_id":"maillot-bresil-2026-2027-copie-copie-copie-copie-copie-copie-copie-copie","title":"Maillot Costa Rica Bleu 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345678967161,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345678999929,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345679032697,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345679065465,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345679098233,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345679131001,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345679163769,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345679196537,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/160771c7-9129-4841-ac18-121b9d995310.jpg?v=1780071283"},{"product_id":"maillot-bresil-2026-2027-copie-copie-copie-copie-copie-copie-copie-copie-copie","title":"Maillot Argentine 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345679262073,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345679294841,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345679327609,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345679360377,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345679393145,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345679425913,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345679458681,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345679491449,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/081d1c89-d03b-4cac-a8a9-9c61bfa084a0.jpg?v=1780071430"},{"product_id":"maillot-bresil-2026-2027-copie-copie-copie-copie-copie-copie-copie-copie-copie-copie","title":"Maillot Japon 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345680212345,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345680245113,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345680277881,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345680310649,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345680343417,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345680376185,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345680408953,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345680441721,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/bd30353e-cb6c-4307-b0a1-8ca8a278dafd.jpg?v=1780071549"},{"product_id":"maillot-bresil-2026-2027-copie-1","title":"Maillot Portugal 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345680736633,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345680769401,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345680802169,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345680834937,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345680867705,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345680900473,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345680933241,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345680966009,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/19af5fd5-fa56-4684-9059-462314c19c05.jpg?v=1780071658"},{"product_id":"maillot-bresil-2026-2027-copie-copie-1","title":"Maillot Mexique 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57345680998777,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57345681031545,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57345681064313,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57345681097081,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57345681129849,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57345681162617,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57345681195385,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57345681228153,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/ce7444d5-af58-4c72-84fc-786e5bcb8441.jpg?v=1780071890"},{"product_id":"maillots-algerie-2026-2027-copie","title":"Maillot Pays-Bas Orange 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57349541527929,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57349541560697,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57349541593465,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57349541626233,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57349541659001,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57349541691769,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57349541724537,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57349541757305,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/33459627-28e5-4419-be01-9659183977ac.jpg?v=1780072358"},{"product_id":"maillots-algerie-2026-2027-copie-copie","title":"Maillot Angleterre 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57349541888377,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57349541921145,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57349541953913,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57349541986681,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57349542019449,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57349542052217,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57349542084985,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57349542117753,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/51fcef9e-c721-4ca8-b9d2-56c61e473b8c.jpg?v=1780072542"},{"product_id":"maillots-algerie-2026-2027-copie-copie-copie","title":"Maillots Ecosse 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57349542248825,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57349542281593,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57349542314361,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57349542347129,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57349542379897,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57349542412665,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57349542445433,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57349542478201,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/384903b7-4d9e-49db-9120-9136c21419ed.jpg?v=1780072693"},{"product_id":"maillot-algerie-2026-2027-copie","title":"Maillot Alllemagne 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57349911085433,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57349911118201,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57349911150969,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57349911183737,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57349911216505,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57349911249273,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57349911282041,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57349911314809,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-12-5522.jpg?v=1780076854"},{"product_id":"maillot-algerie-2026-2027-copie-copie","title":"Maillot Mexique 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57349911675257,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57349911708025,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57349911740793,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57349911773561,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57349911806329,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57349911839097,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57349911871865,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57349911904633,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-352.jpg?v=1780077502"},{"product_id":"maillot-algerie-2026-2027-copie-copie-copie","title":"Maillot Angleterre Rouge 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57349913018745,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57349913051513,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57349913084281,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57349913117049,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57349913149817,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57349913182585,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57349913215353,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57349913248121,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-357.jpg?v=1780077724"},{"product_id":"maillot-algerie-2026-2027-copie-copie-copie-copie","title":"Maillot Angleterre 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57349915672953,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57349915705721,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57349915738489,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57349915771257,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57349915804025,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57349915836793,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57349915869561,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57349915902329,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-356.jpg?v=1780078534"},{"product_id":"maillot-algerie-2026-2027-copie-copie-copie-copie-copie","title":"Maillot Colombie Jaune 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57349916197241,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57349916230009,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57349916262777,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57349916295545,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57349916328313,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57349916361081,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57349916393849,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57349916426617,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-365.jpg?v=1780078674"},{"product_id":"maillot-algerie-2026-2027-copie-copie-copie-copie-copie-copie","title":"Maillot Colombie Bleu 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57349916524921,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57349916557689,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57349916590457,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57349916623225,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57349916655993,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57349916688761,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57349916721529,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57349916754297,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-366_732316aa-7979-4174-aad8-f970197e4f9a.jpg?v=1780078921"},{"product_id":"maillot-algerie-2026-2027-copie-copie-copie-copie-copie-copie-copie","title":"Maillot Italie 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57349917540729,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57349917573497,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57349917606265,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57349917639033,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57349917671801,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57349917704569,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57349917737337,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57349917770105,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-36.jpg?v=1780079200"},{"product_id":"maillot-algerie-2026-2027-copie-copie-copie-copie-copie-copie-copie-copie","title":"Maillot Belgique 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57349917933945,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57349917966713,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57349917999481,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57349918032249,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57349918065017,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57349918097785,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57349918130553,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57349918163321,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-369.jpg?v=1780079295"},{"product_id":"veste-bresil-turquoise-2026-2027-copie","title":"Veste Brésil Noir 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display: none;\"\u003e\n\u003cdiv class=\"maillot-info\"\u003e\n\u003cp class=\"flocage-title\"\u003e🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\u003c\/p\u003e\n\u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv id=\"flocage-box\" style=\"display: none;\"\u003e\n\u003clabel\u003eNom du joueur\u003c\/label\u003e \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : RONALDO\"\u003e \u003clabel\u003eNuméro\u003c\/label\u003e \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 7\"\u003e \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex : MADRID\"\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\u003cp\u003e \u003c\/p\u003e","brand":"My Store 8","offers":[{"title":"M","offer_id":57349954240889,"sku":null,"price":45.0,"currency_code":"EUR","in_stock":true},{"title":"L","offer_id":57349954273657,"sku":null,"price":45.0,"currency_code":"EUR","in_stock":true},{"title":"XL","offer_id":57349954306425,"sku":null,"price":45.0,"currency_code":"EUR","in_stock":true},{"title":"2XL","offer_id":57349954339193,"sku":null,"price":45.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/26e2b255-618f-419a-83a3-6a4e1eb87bb0.jpg?v=1780078410"},{"product_id":"maillot-belgique-2026-2027-copie","title":"Maillot Algérie Blanc 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57350509986169,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57350510018937,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57350510051705,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57350510084473,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57350510117241,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57350510150009,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57350510182777,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57350510215545,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-395.jpg?v=1780079628"},{"product_id":"maillot-belgique-2026-2027-copie-copie","title":"Maillot Suisse Rouge 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57350510248313,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57350510281081,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57350510313849,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57350510346617,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57350510379385,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57350510412153,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57350510444921,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57350510477689,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/Suisse1.jpg?v=1780080093"},{"product_id":"maillot-belgique-2026-2027-copie-copie-copie","title":"Maillot Japon Bleu 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57350510707065,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57350510739833,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57350510772601,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57350510805369,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57350510838137,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57350510870905,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57350510903673,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57350510936441,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/9d301fc9-9af0-48b6-aa65-1c760bd5fbbd_d71e4137-91d1-490c-a81a-68e4791b9c13.jpg?v=1780080293"},{"product_id":"maillot-belgique-2026-2027-copie-copie-copie-copie","title":"Maillot Espagne 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57350511985017,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57350512017785,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57350512050553,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57350512083321,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57350512116089,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57350512148857,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57350512181625,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57350512214393,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-12-546.jpg?v=1780080420"},{"product_id":"maillot-belgique-2026-2027-copie-copie-copie-copie-copie","title":"Maillot Portugal Rouge 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57350512345465,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57350512378233,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57350512411001,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57350512443769,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57350512476537,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57350512509305,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57350512542073,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57350512574841,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/45214c93-3281-433d-8b77-b124f5fd415a.jpg?v=1780080564"},{"product_id":"maillot-belgique-2026-2027-copie-copie-copie-copie-copie-copie","title":"Maillot Portugal Noir 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57350512804217,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57350512836985,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57350512869753,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57350512902521,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57350512935289,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57350512968057,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57350513000825,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57350513033593,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-12-5514.jpg?v=1780080641"},{"product_id":"maillot-belgique-2026-2027-copie-copie-copie-copie-copie-copie-copie","title":"Maillot Brésil Bleu 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57350513590649,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57350513623417,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57350513656185,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57350513688953,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57350513721721,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57350513754489,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57350513787257,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57350513820025,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/3b342982-b061-4f5d-b3d9-e31779aded1f.jpg?v=1780080896"},{"product_id":"maillot-belgique-2026-2027-copie-copie-copie-copie-copie-copie-copie-copie","title":"Maillot Mexique Vert 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57350514803065,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57350514835833,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57350514868601,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57350514901369,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57350514934137,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57350514966905,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57350514999673,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57350515032441,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-12-5530.jpg?v=1780080994"},{"product_id":"maillot-mexique-vert-2026-2027-copie","title":"Maillot France 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57350560383353,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57350560416121,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57350560448889,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57350560481657,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57350560514425,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57350560547193,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57350560579961,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57350560612729,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-12-5526.jpg?v=1780081563"},{"product_id":"maillot-mexique-vert-2026-2027-copie-copie","title":"Maillot Allemagne Bleu 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57350560645497,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57350560678265,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57350560711033,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57350560743801,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57350560776569,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57350560809337,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57350560842105,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57350560874873,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-12-5553_df9df7f6-cce7-477e-9a73-34e73dba3f79.jpg?v=1780081656"},{"product_id":"maillot-mexique-vert-2026-2027-copie-copie-copie","title":"Maillot France Vert 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57350561759609,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57350561792377,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57350561825145,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57350561857913,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57350561890681,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57350561923449,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57350561956217,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57350561988985,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-12-5558_6e0e5314-72bd-4580-b743-2ac1115dc5a1.jpg?v=1780081822"},{"product_id":"maillot-mexique-vert-2026-2027-copie-copie-copie-copie","title":"Maillot Italie Blanc 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display: none;\"\u003e\n\u003cdiv class=\"maillot-info\"\u003e\n\u003cp class=\"flocage-title\"\u003e🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\u003c\/p\u003e\n\u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv id=\"flocage-box\" style=\"display: none;\"\u003e\n\u003clabel\u003eNom du joueur\u003c\/label\u003e \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e \u003clabel\u003eNuméro\u003c\/label\u003e \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\u003cp\u003e \u003c\/p\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57350562283897,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57350562316665,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57350562349433,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57350562382201,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57350562414969,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57350562447737,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57350562480505,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57350562513273,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/Italie1.jpg?v=1780082094"},{"product_id":"maillot-mexique-vert-2026-2027-copie-copie-copie-copie-copie","title":"Maillot Croatie Blanc 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57350562775417,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57350562808185,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57350562840953,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57350562873721,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57350562906489,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57350562939257,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57350562972025,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57350563004793,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-22-16-40-406.jpg?v=1780082318"},{"product_id":"maillot-croatie-blanc-2026-2027-copie","title":"Maillot USA Bleu 2026\/2027","description":"\u003c!-- BLOC FLOCAGE PERSONNALISÉ --\u003e\n\u003cdiv class=\"custom-flocage-wrapper\" style=\"display:none;\"\u003e\n\n  \u003cdiv class=\"maillot-info\"\u003e\n    \u003cp class=\"flocage-title\"\u003e\n      🔥 \u003cstrong\u003eFlocage personnalisé disponible pour seulement 5€\u003c\/strong\u003e 🔥\n    \u003c\/p\u003e\n    \u003cp\u003e⚽ \u003cstrong\u003eQualité Joueur – Maillots Premium\u003c\/strong\u003e\u003c\/p\u003e\n    \u003cp\u003eNos maillots sont conçus en qualité joueur, identique à celle portée par les professionnels sur le terrain.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv id=\"flocage-box\" style=\"display:none;\"\u003e\n    \u003clabel\u003eNom du joueur\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-nom\" placeholder=\"Ex : Fiére\"\u003e\n    \u003clabel\u003eNuméro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-numero\" placeholder=\"Ex : 2\"\u003e\n    \u003clabel\u003eInscription sous le numéro\u003c\/label\u003e\n    \u003cinput type=\"text\" id=\"flocage-inscription\" placeholder=\"Ex :Malade\"\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n.custom-flocage-wrapper { margin-top: 15px; margin-bottom: 15px; }\n.maillot-info { margin-bottom: 18px; font-size: 14px; line-height: 1.7; color: #000; }\n.flocage-title { color: #ff1493; font-size: 16px; font-weight: 700; margin-bottom: 12px; }\n#flocage-box { margin-top: 15px; }\n#flocage-box label { display: block; margin-top: 12px; margin-bottom: 5px; font-weight: 600; color: #000; }\n#flocage-box input {\n  width: 100%; padding: 12px; border: 1px solid #dcdcdc;\n  border-radius: 8px; font-size: 14px; outline: none;\n  transition: 0.2s; box-sizing: border-box;\n}\n#flocage-box input:focus { border-color: #ff1493; }\n#flocage-box input:disabled {\n  background-color: #f5f5f5;\n  cursor: not-allowed;\n  color: #aaa;\n}\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n\n  var MAX_WAIT = 8000;\n  var POLL_INTERVAL = 200;\n  var elapsed = 0;\n\n  function isFlocageSelected() {\n    var checked = document.querySelectorAll('select option:checked, input[type=\"radio\"]:checked');\n    for (var i = 0; i \u003c checked.length; i++) {\n      var v = checked[i].value.toLowerCase();\n      if (\n        (v.includes(\"flocage\") || v.includes(\"personnalis\")) \u0026\u0026\n        !v.includes(\"sans\")\n      ) return true;\n    }\n    return false;\n  }\n\n  function getFlocageProperties() {\n    var nom = (document.getElementById(\"flocage-nom\") || {}).value || \"\";\n    var num = (document.getElementById(\"flocage-numero\") || {}).value || \"\";\n    var ins = (document.getElementById(\"flocage-inscription\") || {}).value || \"\";\n    var props = {};\n    if (nom.trim()) props[\"Nom du joueur\"] = nom.trim();\n    if (num.trim()) props[\"Numéro\"] = num.trim();\n    if (ins.trim()) props[\"Inscription sous le numéro\"] = ins.trim();\n    return props;\n  }\n\n  function getVariantId() {\n    var input = document.querySelector('input[name=\"id\"]');\n    if (input \u0026\u0026 input.value) return input.value;\n    var urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get(\"variant\")) return urlParams.get(\"variant\");\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  function getQuantity() {\n    var q = document.querySelector('input[name=\"quantity\"]');\n    return q ? (parseInt(q.value) || 1) : 1;\n  }\n\n  function positionFlocageBlock() {\n    var wrapper = document.querySelector(\".custom-flocage-wrapper\");\n    if (!wrapper) return false;\n\n    var addBtn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n\n    if (!addBtn) return false;\n\n    var btnContainer = addBtn.closest(\".product-form__buttons\") ||\n                       addBtn.closest(\".shopify-payment-button\") ||\n                       addBtn.parentElement;\n\n    if (btnContainer \u0026\u0026 !wrapper._positioned) {\n      btnContainer.insertAdjacentElement(\"beforebegin\", wrapper);\n      wrapper.style.display = \"block\";\n      wrapper._positioned = true;\n    }\n\n    return true;\n  }\n\n  function addToCartWithProperties(variantId, quantity, properties, originalBtn) {\n    if (originalBtn) {\n      originalBtn.disabled = true;\n      originalBtn._originalText = originalBtn.innerText;\n      originalBtn.innerText = \"Ajout en cours...\";\n    }\n\n    fetch(\"\/cart\/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ id: variantId, quantity: quantity, properties: properties })\n    })\n    .then(function (res) { return res.json(); })\n    .then(function (item) {\n      if (item \u0026\u0026 item.key) {\n        return fetch(\"\/cart\/change.js\", {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application\/json\" },\n          body: JSON.stringify({ id: item.key, quantity: quantity, properties: properties })\n        });\n      }\n    })\n    .then(function () {\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      [\"cart:refresh\", \"cart:updated\", \"theme:cart:open\", \"kaching:refresh\"].forEach(function(ev) {\n        document.dispatchEvent(new CustomEvent(ev));\n        window.dispatchEvent(new CustomEvent(ev));\n      });\n      setTimeout(function () {\n        var kachingOpen =\n          document.querySelector(\"[data-kaching-cart-open]\") ||\n          document.querySelector(\".kaching-cart__toggle\") ||\n          document.querySelector(\"[data-cart-open]\");\n        if (kachingOpen) kachingOpen.click();\n        if (!document.querySelector(\".kaching-cart\")) {\n          window.location.href = \"\/cart\";\n        }\n      }, 400);\n    })\n    .catch(function (err) {\n      console.error(\"[Flocage] Erreur:\", err);\n      if (originalBtn) {\n        originalBtn.disabled = false;\n        originalBtn.innerText = originalBtn._originalText || \"Ajouter au panier\";\n      }\n      alert(\"Une erreur est survenue, veuillez réessayer.\");\n    });\n  }\n\n  function hookButton(btn) {\n    if (btn._flocageHooked) return;\n    btn._flocageHooked = true;\n\n    btn.addEventListener(\"click\", function (e) {\n      if (!isFlocageSelected()) return;\n\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      e.stopPropagation();\n\n      var variantId = getVariantId();\n      if (!variantId) { console.warn(\"[Flocage] Variant ID introuvable\"); return; }\n\n      addToCartWithProperties(variantId, getQuantity(), getFlocageProperties(), btn);\n    }, true);\n  }\n\n  function findAndHookButton() {\n    var btn =\n      document.querySelector('button[name=\"add\"]') ||\n      document.querySelector(\".product-form__submit\") ||\n      document.querySelector('product-form button[type=\"submit\"]') ||\n      document.querySelector('form[action=\"\/cart\/add\"] button[type=\"submit\"]');\n    if (btn) { hookButton(btn); return true; }\n    return false;\n  }\n\n  function checkFlocageVisibility() {\n    var box = document.getElementById(\"flocage-box\");\n    if (!box) return;\n    var selected = isFlocageSelected();\n    box.style.display = selected ? \"block\" : \"none\";\n    box.querySelectorAll(\"input\").forEach(function(i) {\n      i.disabled = !selected;\n      if (!selected) i.value = \"\";\n    });\n  }\n\n  var pollTimer = setInterval(function () {\n    elapsed += POLL_INTERVAL;\n    var positioned = positionFlocageBlock();\n    var hooked = findAndHookButton();\n    if ((positioned \u0026\u0026 hooked) || elapsed \u003e= MAX_WAIT) clearInterval(pollTimer);\n  }, POLL_INTERVAL);\n\n  var observer = new MutationObserver(function () {\n    positionFlocageBlock();\n    findAndHookButton();\n    checkFlocageVisibility();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\"change\", checkFlocageVisibility);\n  checkFlocageVisibility();\n\n})();\n\u003c\/script\u003e","brand":"My Store 8","offers":[{"title":"M \/ Flocage","offer_id":57353084830073,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57353084862841,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57353084895609,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57353084928377,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57353084961145,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57353084993913,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57353085026681,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57353085059449,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/files\/PHOTO-2026-05-29-23-19-46.jpg?v=1780152085"}],"url":"https:\/\/lafabriquedumaillot.com\/collections\/frontpage.oembed?page=3","provider":"Lafabriquedumaillot","version":"1.0","type":"link"}