{"title":"Équipe Européenne","description":"","products":[{"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":"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":"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-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-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":"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-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-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-copie-copie-copie-copie","title":"Maillot Espagne 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":57353087549817,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"M \/ Sans Flocage","offer_id":57353087582585,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Flocage","offer_id":57353087615353,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"L \/ Sans Flocage","offer_id":57353087648121,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Flocage","offer_id":57353087680889,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"XL \/ Sans Flocage","offer_id":57353087713657,"sku":null,"price":24.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Flocage","offer_id":57353087746425,"sku":null,"price":29.99,"currency_code":"EUR","in_stock":true},{"title":"2XL \/ Sans Flocage","offer_id":57353087779193,"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-477.jpg?v=1780152681"}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1002\/3354\/4057\/collections\/ChatGPT_Image_30_mai_2026_a_23_21_02.png?v=1780178237","url":"https:\/\/lafabriquedumaillot.com\/collections\/equipe-europeenne.oembed","provider":"Lafabriquedumaillot","version":"1.0","type":"link"}