{"product_id":"sage-force-crew","title":"Sage Force Crew","description":"\u003cstyle\u003e\n.faq-container {\n  font-family: Arial, sans-serif;\n  margin-top: 1rem;\n}\n.faq-container h3 {\n  font-size: 20px;\n  margin-bottom: 10px;\n}\n.faq-item {\n  border-bottom: 1px solid #ddd;\n  margin-bottom: 8px;\n}\n.faq-item summary {\n  font-weight: bold;\n  cursor: pointer;\n  padding: 10px;\n  background: #f7f7f7;\n  border-radius: 6px;\n  transition: background 0.3s;\n  list-style: none;\n  position: relative;\n}\n.faq-item summary:hover {\n  background: #eee;\n}\n.faq-item summary::after {\n  content: \"+\";\n  position: absolute;\n  right: 15px;\n  font-weight: bold;\n  transition: transform 0.3s;\n}\n.faq-item[open] summary::after {\n  content: \"-\";\n}\n.faq-item p {\n  margin: 8px 0 12px 0;\n  padding-left: 10px;\n  color: #444;\n}\n.whatsapp-btn {\n  display: inline-block;\n  margin-top: 10px;\n  padding: 10px 16px;\n  background: #25D366;\n  color: white;\n  text-decoration: none;\n  font-weight: bold;\n  border-radius: 6px;\n  transition: background 0.3s;\n}\n.whatsapp-btn:hover {\n  background: #1DA851;\n}\n\n\n\/* simulateur *\/\n.simulator-box {\n  margin-top: 10px;\n  padding: 10px;\n  background: #f9f9f9;\n  border-radius: 6px;\n}\n.simulator-box label {\n  display: block;\n  margin: 6px 0 2px;\n  font-size: 14px;\n}\n.simulator-box input {\n  width: 100%;\n  padding: 6px;\n  margin-bottom: 8px;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n}\n.simulator-box button {\n  width: 100%;\n  padding: 10px;\n  background: #333;\n  color: white;\n  font-weight: bold;\n  border: none;\n  border-radius: 6px;\n  cursor: pointer;\n  transition: background 0.3s;\n}\n.simulator-box button:hover {\n  background: #000;\n}\n.simulator-result {\n  margin-top: 10px;\n  font-weight: bold;\n  color: #222;\n}\n\u003c\/style\u003e\n\u003cstyle\u003e\n.sim-link-btn{\n  display:inline-block;padding:8px 12px;border-radius:6px;\n  background:#0b5fff;color:#fff;text-decoration:none;font-weight:700\n}\n.sim-link-btn:hover{background:#0b5fff}\n\u003c\/style\u003e\n\u003cscript\u003e\nfunction openSimulator(e){\n  if(e) e.preventDefault();\n  var d=document.getElementById('size-sim');\n  if(!d) return false;\n  d.setAttribute('open','open');\n  d.scrollIntoView({behavior:'smooth',block:'start'});\n  return false;\n}\n\/\/ Si l’URL contient #size-sim, ouvrir Q1 automatiquement\nif(location.hash==='#size-sim'){ openSimulator(); }\n\u003c\/script\u003e\n\n\u003c!-- JSON intégré : 1 mesure par taille --\u003e\n\u003cscript type=\"application\/json\" id=\"size-data\"\u003e\n{\n  \"size_order\": [\"S\",\"M\",\"L\",\"XL\"],\n  \"chemise\": {\n    \"S\": { \"chest_cm\": 95, \"shoulders_cm\": 44, \"sleeve_cm\": 62, \"length_cm\": 70 },\n    \"M\": { \"chest_cm\": 102, \"shoulders_cm\": 46, \"sleeve_cm\": 63, \"length_cm\": 72 },\n    \"L\": { \"chest_cm\": 108, \"shoulders_cm\": 48, \"sleeve_cm\": 64, \"length_cm\": 74 },\n    \"XL\": { \"chest_cm\": 113, \"shoulders_cm\": 50, \"sleeve_cm\": 65, \"length_cm\": 76 }\n  },\n  \"hoodie\": {\n    \"S\": { \"chest_cm\": 101, \"shoulders_cm\": 45, \"sleeve_cm\": 61, \"length_cm\": 68 },\n    \"M\": { \"chest_cm\": 107, \"shoulders_cm\": 47, \"sleeve_cm\": 62, \"length_cm\": 70 },\n    \"L\": { \"chest_cm\": 113, \"shoulders_cm\": 49, \"sleeve_cm\": 63, \"length_cm\": 72 },\n    \"XL\": { \"chest_cm\": 119, \"shoulders_cm\": 51, \"sleeve_cm\": 64, \"length_cm\": 74 }\n  },\n  \"tshirt\": {\n    \"S\": { \"chest_cm\": 95, \"shoulders_cm\": 43, \"length_cm\": 69 },\n    \"M\": { \"chest_cm\": 102, \"shoulders_cm\": 45, \"length_cm\": 71 },\n    \"L\": { \"chest_cm\": 108, \"shoulders_cm\": 47, \"length_cm\": 73 },\n    \"XL\": { \"chest_cm\": 113, \"shoulders_cm\": 49, \"length_cm\": 75 }\n  },\n  \"pantalon_jogger\": {\n    \"S\": { \"waist_cm\": 76, \"hips_cm\": 92, \"outseam_cm\": 100 },\n    \"M\": { \"waist_cm\": 85, \"hips_cm\": 100, \"outseam_cm\": 102 },\n    \"L\": { \"waist_cm\": 93, \"hips_cm\": 108, \"outseam_cm\": 104 },\n    \"XL\": { \"waist_cm\": 101, \"hips_cm\": 116, \"outseam_cm\": 106 }\n  }\n}\n\u003c\/script\u003e\n\n\u003cdiv class=\"faq-container\"\u003e\n\n  \u003c!-- Q1 déplacée en premier --\u003e\n  \u003cdetails class=\"faq-item\" id=\"size-sim\"\u003e\n    \u003csummary\u003eComment savoir ma taille idéale ?\u003c\/summary\u003e\n    \u003cdiv class=\"simulator-box\"\u003e\n      \u003clabel for=\"height\"\u003eVotre taille (cm)\u003c\/label\u003e\n      \u003cinput type=\"number\" id=\"height\" placeholder=\"ex: 175\"\u003e\n\n      \u003clabel for=\"weight\"\u003eVotre poids (kg)\u003c\/label\u003e\n      \u003cinput type=\"number\" id=\"weight\" placeholder=\"ex: 72\"\u003e\n\n      \u003clabel for=\"age\"\u003eVotre âge\u003c\/label\u003e\n      \u003cinput type=\"number\" id=\"age\" placeholder=\"ex: 28\"\u003e\n\n      \u003cbutton onclick=\"simulateSize()\"\u003eVoir ma taille recommandée\u003c\/button\u003e\n      \u003cdiv id=\"result\" class=\"simulator-result\"\u003e\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/details\u003e\n\n  \u003cdetails class=\"faq-item\"\u003e\n    \u003csummary\u003eEst-ce que les photos du produit sont réelles ?\u003c\/summary\u003e\n    \u003cp\u003eOui, les photos sont 100% réelles et vous pouvez vérifier le colis avant de payer.\u003c\/p\u003e\n  \u003c\/details\u003e\n\n  \u003cdetails class=\"faq-item\"\u003e\n    \u003csummary\u003eEn combien de temps vais-je recevoir ma commande ?\u003c\/summary\u003e\n    \u003cp\u003eLe délai de livraison est généralement entre 24h et 48h ouvrables selon la ville.\u003c\/p\u003e\n  \u003c\/details\u003e\n\n  \u003cdetails class=\"faq-item\"\u003e\n    \u003csummary\u003ePuis-je changer la taille si elle ne me va pas ?\u003c\/summary\u003e\n    \u003cp\u003e\n  Oui, l’échange de taille est possible sous 48 h avec des frais de 29 DH si le produit est dans son état initial.\n  \u003ca href=\"#size-sim\" class=\"sim-link-btn\" onclick=\"return openSimulator(event)\"\u003e📏 Ouvrir le simulateur\u003c\/a\u003e\n\u003c\/p\u003e\n  \u003c\/details\u003e\n\n  \u003cdetails class=\"faq-item\"\u003e\n    \u003csummary\u003eEt si le produit a un défaut ?\u003c\/summary\u003e\n    \u003cp\u003eL’échange est gratuit sous 48h après réception en cas de défaut confirmé.\u003c\/p\u003e\n  \u003c\/details\u003e\n\n  \u003cdetails class=\"faq-item\"\u003e\n    \u003csummary\u003eSi je veux plus de détails ou commander via WhatsApp, est-ce possible ?\u003c\/summary\u003e\n    \u003cp\u003eOui, vous pouvez nous contacter directement via WhatsApp pour poser vos questions ou passer commande.\u003c\/p\u003e\n    \u003ca class=\"whatsapp-btn\" href=\"https:\/\/wa.me\/212665074565\" target=\"_blank\"\u003e💬 Contacter sur WhatsApp\u003c\/a\u003e\n  \u003c\/details\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/\/ ➤ RENSEIGNE le type de produit ici : \"chemise\" | \"hoodie\" | \"tshirt\" | \"pantalon_jogger\"\nconst PRODUCT_TYPE = \"chemise\";\n\n(function(){\n  function getData(){ try { return JSON.parse(document.getElementById(\"size-data\").textContent); } catch(e){ return null; } }\n\n  \/\/ estimation morphologique interne (non affichée)\n  function estimateMeasures(heightCm, weightKg, ageYears){\n    \/\/ poitrine estimée\n    let chest = (weightKg \/ heightCm) * 230;\n    if (ageYears \u003e= 30 \u0026\u0026 ageYears \u003c 45) chest += 2;\n    if (ageYears \u003e= 45) chest += 4;\n    const waist = chest * 0.85;\n    const hips  = chest * 0.95;\n    return { chest: chest, waist: waist, hips: hips };\n  }\n\n  function sizeOrderIndex(size, order){ return order.indexOf(size); }\n\n  function pickNearestTop(chestEst, table, order){\n    let best = null, bestDiff = Infinity, bestIdx = 999;\n    for (const size in table){\n      const chest = table[size].chest_cm;\n      if (typeof chest !== \"number\") continue;\n      const diff = Math.abs(chestEst - chest);\n      const idx = sizeOrderIndex(size, order);\n      if (diff \u003c bestDiff || (diff === bestDiff \u0026\u0026 idx \u003e bestIdx)) {\n        best = size; bestDiff = diff; bestIdx = idx;\n      }\n    }\n    \/\/ en cas d’estimation entre tailles, on privilégie une demi-taille au-dessus pour le confort\n    \/\/ si la poitrine estimée dépasse la valeur de la taille choisie et qu’il existe une taille au-dessus\n    const idxChosen = sizeOrderIndex(best, order);\n    const next = order[idxChosen + 1];\n    if (next \u0026\u0026 chestEst \u003e table[best].chest_cm) return next;\n    return best;\n  }\n\n  function pickNearestBottom(waistEst, hipsEst, table, order){\n    let best = null, bestScore = Infinity, bestIdx = 999;\n    for (const size in table){\n      const w = table[size].waist_cm, h = table[size].hips_cm;\n      if (typeof w !== \"number\" || typeof h !== \"number\") continue;\n      const score = Math.pow(waistEst - w, 2) + Math.pow(hipsEst - h, 2);\n      const idx = sizeOrderIndex(size, order);\n      if (score \u003c bestScore || (score === bestScore \u0026\u0026 idx \u003e bestIdx)) {\n        best = size; bestScore = score; bestIdx = idx;\n      }\n    }\n    \/\/ confort: si une des estimations dépasse la taille choisie, on monte d’une taille si possible\n    const idxChosen = sizeOrderIndex(best, order);\n    const next = order[idxChosen + 1];\n    if (next) {\n      const wChosen = table[best].waist_cm, hChosen = table[best].hips_cm;\n      if (waistEst \u003e wChosen || hipsEst \u003e hChosen) return next;\n    }\n    return best;\n  }\n\n  window.simulateSize = function(){\n    const data = getData();\n    const out = document.getElementById(\"result\");\n    const height = parseFloat(document.getElementById(\"height\").value);\n    const weight = parseFloat(document.getElementById(\"weight\").value);\n    const age    = parseFloat(document.getElementById(\"age\").value);\n\n    if (!data || !height || !weight || !age) {\n      out.innerHTML = \"⚠️ Merci de remplir tous les champs.\";\n      return;\n    }\n\n    const order = Array.isArray(data.size_order) ? data.size_order : [\"S\",\"M\",\"L\",\"XL\"];\n    const est = estimateMeasures(height, weight, age);\n\n    let rec = \"\";\n    if (PRODUCT_TYPE === \"pantalon_jogger\") {\n      rec = pickNearestBottom(est.waist, est.hips, data[\"pantalon_jogger\"], order);\n    } else if (PRODUCT_TYPE === \"chemise\" || PRODUCT_TYPE === \"hoodie\" || PRODUCT_TYPE === \"tshirt\") {\n      rec = pickNearestTop(est.chest, data[PRODUCT_TYPE], order);\n    } else {\n      out.innerHTML = \"⚠️ Type de produit non défini.\";\n      return;\n    }\n\n    out.innerHTML = \"✅ Taille recommandée : \u003cb\u003e\" + rec + \"\u003c\/b\u003e\";\n  };\n})();\n\u003c\/script\u003e\n","brand":"VERZAYA","offers":[{"title":"Gri \/ S","offer_id":42760481013837,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":true},{"title":"Gri \/ M","offer_id":42760481046605,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":true},{"title":"Gri \/ L","offer_id":42760481079373,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":true},{"title":"Gri \/ XL","offer_id":42760481112141,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":false},{"title":"Gri \/ 2XL","offer_id":42760481144909,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":false},{"title":"Noir \/ S","offer_id":42760495300685,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":true},{"title":"Noir \/ M","offer_id":42760495333453,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":true},{"title":"Noir \/ L","offer_id":42760495366221,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":true},{"title":"Noir \/ XL","offer_id":42760495398989,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":true},{"title":"Noir \/ 2XL","offer_id":42760495431757,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":true},{"title":"Marron \/ S","offer_id":42760480849997,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":true},{"title":"Marron \/ M","offer_id":42760480882765,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":true},{"title":"Marron \/ L","offer_id":42760480915533,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":false},{"title":"Marron \/ XL","offer_id":42760480948301,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":false},{"title":"Marron \/ 2XL","offer_id":42760480981069,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":true},{"title":"Bordeaux \/ S","offer_id":42779065581645,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":true},{"title":"Bordeaux \/ M","offer_id":42779065614413,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":true},{"title":"Bordeaux \/ L","offer_id":42779065647181,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":true},{"title":"Bordeaux \/ XL","offer_id":42779065679949,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":true},{"title":"Bordeaux \/ 2XL","offer_id":42779065712717,"sku":null,"price":279.0,"currency_code":"MAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0657\/4184\/8653\/files\/0216_16.jpg?v=1772921897","url":"https:\/\/www.verzaya.com\/products\/sage-force-crew","provider":"VERZAYA","version":"1.0","type":"link"}