{"product_id":"sangle-ci","title":"Sangle Rotulienne CI","description":"\u003cscript\u003e\n      (function() {\n        \/\/ Capture host references before any artifact code runs: Window.parent\n        \/\/ is [Replaceable] (a top-level `var parent` in artifact code would\n        \/\/ replace the accessor with a data property), and a top-level\n        \/\/ `const crypto` would shadow the global — either would otherwise\n        \/\/ silently break the bridge for artifacts that worked before.\n        const realParent = window.parent;\n        const cryptoObj = window.crypto;\n        \/\/ html-to-image is only used by takeScreenshot: fetched on first use, not as a\n        \/\/ parser-blocking tag. Native fetch, captured before the proxy override below.\n        const realFetch = typeof window.fetch === 'function' ? window.fetch.bind(window) : null;\n        const HTML_TO_IMAGE_SRC = \"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/html-to-image\/1.11.13\/html-to-image.min.js\";\n        const HTML_TO_IMAGE_INTEGRITY = \"sha512-iZ2ORl595Wx6miw+GuadDet4WQbdSWS3JLMoNfY8cRGoEFy6oT3G9IbcrBeL6AfkgpA51ETt\/faX6yLV+\/gFJg==\";\n        let htmlToImageLoad = null;\n        const loadHtmlToImage = () =\u003e {\n          if (!htmlToImageLoad) {\n            htmlToImageLoad = (realFetch\n              ? realFetch(HTML_TO_IMAGE_SRC, { integrity: HTML_TO_IMAGE_INTEGRITY, credentials: 'omit', referrerPolicy: 'no-referrer' })\n              : Promise.reject(new Error('fetch unavailable'))\n            )\n              .then((res) =\u003e {\n                if (!res.ok) throw new Error('html-to-image failed to load (' + res.status + ')');\n                return res.text();\n              })\n              .then((source) =\u003e {\n                \/\/ UMD bundle: hide the artifact's AMD\/CommonJS globals so it takes the\n                \/\/ window-global branch; inline script text runs synchronously on insert.\n                const hidden = ['define', 'module', 'exports'].map((k) =\u003e {\n                  const entry = { k, own: Object.prototype.hasOwnProperty.call(window, k), v: window[k] };\n                  try { window[k] = undefined; } catch (e) {}\n                  return entry;\n                });\n                try {\n                  const el = document.createElement('script');\n                  el.text = source;\n                  (document.head || document.documentElement).appendChild(el);\n                } finally {\n                  hidden.forEach(({ k, own, v }) =\u003e {\n                    try { if (own) { window[k] = v; } else { delete window[k]; } } catch (e) {}\n                  });\n                }\n                if (!window.htmlToImage) throw new Error('html-to-image unavailable after load');\n                return window.htmlToImage;\n              });\n            \/\/ A failed load may be transient; let the next screenshot retry.\n            htmlToImageLoad.catch(() =\u003e { htmlToImageLoad = null; });\n          }\n          return htmlToImageLoad;\n        };\n        \/\/ crypto.randomUUID exists only in Secure Contexts; fall back to a\n        \/\/ unique non-crypto id elsewhere (http:\/\/LAN-IP dev flows) —\n        \/\/ uniqueness is what the bridge needs, unpredictability is\n        \/\/ defense-in-depth on top of the source guards.\n        const newRequestId =\n          cryptoObj \u0026\u0026 typeof cryptoObj.randomUUID === \"function\"\n            ? function () { return cryptoObj.randomUUID(); }\n            : function () { return Date.now() + \"-\" + Math.random(); };\n        const originalConsole = window.console;\n        window.console = {\n          log: (...args) =\u003e {\n            originalConsole.log(...args);\n            realParent.postMessage({ type: 'console', message: args.join(' ') }, '*');\n          },\n          error: (...args) =\u003e {\n            originalConsole.error(...args);\n            realParent.postMessage({ type: 'console', message: 'Error: ' + args.join(' ') }, '*');\n          },\n          warn: (...args) =\u003e {\n            originalConsole.warn(...args);\n            realParent.postMessage({ type: 'console', message: 'Warning: ' + args.join(' ') }, '*');\n          }\n        };\n\n        \/\/ Bridge request ids are crypto-random (not sequential) so they\n        \/\/ cannot be predicted by other frames in the tab.\n        let callbacksMap = new Map();\n        let streamControllers = new Map();\n        \n        window.claude = {\n          complete: (prompt) =\u003e {\n            return new Promise((resolve, reject) =\u003e {\n              const id = newRequestId();\n              callbacksMap.set(id, { resolve, reject });\n              realParent.postMessage({ type: 'claudeComplete', id, prompt }, '*');\n            });\n          }\n        };\n\n        window.storage = {\n          get: (key, shared = false) =\u003e {\n            return new Promise((resolve, reject) =\u003e {\n              const id = newRequestId();\n              callbacksMap.set(id, { resolve, reject });\n              realParent.postMessage({ type: 'storageGet', id, key, shared }, '*');\n            });\n          },\n          set: (key, value, shared = false) =\u003e {\n            return new Promise((resolve, reject) =\u003e {\n              const id = newRequestId();\n              callbacksMap.set(id, { resolve, reject });\n              realParent.postMessage({ type: 'storageSet', id, key, value, shared }, '*');\n            });\n          },\n          delete: (key, shared = false) =\u003e {\n            return new Promise((resolve, reject) =\u003e {\n              const id = newRequestId();\n              callbacksMap.set(id, { resolve, reject });\n              realParent.postMessage({ type: 'storageDelete', id, key, shared }, '*');\n            });\n          },\n          list: (prefix, shared = false) =\u003e {\n            return new Promise((resolve, reject) =\u003e {\n              const id = newRequestId();\n              callbacksMap.set(id, { resolve, reject });\n              realParent.postMessage({ type: 'storageList', id, prefix, shared }, '*');\n            });\n          }\n        };\n\n        let pendingBlobs = new Map();\n        URL.createObjectURL = (blob) =\u003e {\n          \/\/ Store the blob and create an ID and URL for it\n          const blobId = `blob-${Date.now()}-${Math.random()}`;\n          pendingBlobs.set(blobId, blob);\n          return `blob-request:\/\/${blobId}`;\n        };\n\n        URL.revokeObjectURL = (url) =\u003e {\n          \/\/ Remove the blob from our store\n          const blobId = url.replace(\"blob-request:\/\/\", \"\");\n          pendingBlobs.delete(blobId);\n        };\n\n        const getBlobFromURL = (url) =\u003e {\n          const blobId = url.replace(\"blob-request:\/\/\", \"\");\n          return pendingBlobs.get(blobId);\n        };\n\n        \/\/ Override global fetch with streaming support\n        window.fetch = (url, init = {}) =\u003e {\n          return new Promise((resolve, reject) =\u003e {\n            const id = newRequestId();\n            const channelId = `fetch-${id}-${Date.now()}`;\n            \n            callbacksMap.set(id, { \n              resolve: (response) =\u003e {\n                \/\/ Null-body statuses: Response(stream, {status: 204}) throws\n                \/\/ per the Fetch spec, which would escape this resolver and\n                \/\/ hang the artifact's await forever.\n                if (response.status === 204 || response.status === 205 || response.status === 304) {\n                  try {\n                    resolve(new Response(null, {\n                      status: response.status,\n                      statusText: response.statusText,\n                      headers: response.headers\n                    }));\n                  } catch (err) {\n                    \/\/ Invalid statusText\/header bytes can throw here too.\n                    reject(new TypeError(\n                      'Bridge fetch: unconstructable response (status ' + response.status + ')'\n                    ));\n                  }\n                  return;\n                }\n                \/\/ Create a ReadableStream for the response body\n                const stream = new ReadableStream({\n                  start(controller) {\n                    streamControllers.set(channelId, controller);\n                  },\n                  cancel() {\n                    streamControllers.delete(channelId);\n                  }\n                });\n                \n                \/\/ Create and return the Response with the stream. Response()\n                \/\/ requires status in [200, 599]; an opaque\/no-cors fetch\n                \/\/ forwards status 0, which would throw here and escape the\n                \/\/ resolver, hanging the artifact's await. Surface it as a\n                \/\/ network-error-shaped rejection instead.\n                try {\n                  resolve(new Response(stream, {\n                    status: response.status,\n                    statusText: response.statusText,\n                    headers: response.headers\n                  }));\n                } catch (err) {\n                  streamControllers.delete(channelId);\n                  reject(new TypeError(\n                    'Bridge fetch: unconstructable response (status ' + response.status + ')'\n                  ));\n                }\n              },\n              reject,\n              channelId\n            });\n            \n            realParent.postMessage({\n              type: 'proxyFetch',\n              id,\n              url,\n              init,\n              channelId\n            }, '*');\n          });\n        };\n\n        window.addEventListener('message', async (event) =\u003e {\n          \/\/ Only the embedding parent may drive the bridge — sibling and\n          \/\/ nested frames can also postMessage into this window.\n          if (event.source !== realParent) return;\n          if (event.data.type === 'takeScreenshot') {\n            \/\/ Echo the request's nonce so the requester can correlate the\n            \/\/ reply to ITS request — a reply without the expected nonce\n            \/\/ (e.g. from a stale pre-remount artifact) is ignored upstream.\n            const screenshotNonce = event.data.nonce;\n            const rootElement = document.getElementById('artifacts-component-root-html');\n            if (!rootElement) {\n              realParent.postMessage({\n                type: 'screenshotError',\n                nonce: screenshotNonce,\n                error: new Error('Root element not found'),\n              }, '*');\n              return;\n            }\n            \/\/ Catch CDN load failures and toPng errors so the parent always\n            \/\/ gets a response instead of hanging forever.\n            try {\n              const htmlToImage = await loadHtmlToImage();\n              const screenshot = await htmlToImage.toPng(rootElement, {\n                imagePlaceholder:\n                  \"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAA1JREFUGFdjePDgwX8ACOQDoNsk0PMAAAAASUVORK5CYII=\",\n              });\n              realParent.postMessage({\n                type: 'screenshotData',\n                nonce: screenshotNonce,\n                data: screenshot,\n              }, '*');\n            } catch (err) {\n              realParent.postMessage({\n                type: 'screenshotError',\n                nonce: screenshotNonce,\n                error: err instanceof Error ? err : new Error(String(err)),\n              }, '*');\n            }\n          } else if (event.data.type === 'claudeComplete') {\n            const callback = callbacksMap.get(event.data.id);\n            if (!callback) return;\n            if (event.data.error) {\n              callback.reject(new Error(event.data.error));\n            } else {\n              callback.resolve(event.data.completion);\n            }\n            callbacksMap.delete(event.data.id);\n          } else if (event.data.type === 'proxyFetchResponse') {\n            const callback = callbacksMap.get(event.data.id);\n            if (!callback) return;\n            if (event.data.error) {\n              callback.reject(new Error(event.data.error));\n              callbacksMap.delete(event.data.id);\n            } else {\n              \/\/ Initial response with headers, status, etc.\n              callback.resolve({\n                status: event.data.status,\n                statusText: event.data.statusText,\n                headers: event.data.headers\n              });\n              \/\/ Don't delete the callback yet if streaming\n              if (!event.data.body) {\n                callbacksMap.delete(event.data.id);\n              }\n            }\n          } else if (event.data.type === 'proxyFetchStream') {\n            \/\/ Handle streaming data chunks\n            const controller = streamControllers.get(event.data.channelId);\n            if (controller) {\n              if (event.data.error) {\n                controller.error(new Error(event.data.error));\n                streamControllers.delete(event.data.channelId);\n              } else if (event.data.done) {\n                controller.close();\n                streamControllers.delete(event.data.channelId);\n                \/\/ Clean up the callback\n                const callback = Array.from(callbacksMap.entries()).find(\n                  ([_, value]) =\u003e value.channelId === event.data.channelId\n                );\n                if (callback) {\n                  callbacksMap.delete(callback[0]);\n                }\n              } else if (event.data.chunk) {\n                controller.enqueue(new Uint8Array(event.data.chunk));\n              }\n            }\n          } else if (event.data.type === 'storageGet') {\n            const callback = callbacksMap.get(event.data.id);\n            if (!callback) return;\n            if (event.data.error) {\n              callback.reject(new Error(event.data.error));\n            } else {\n              callback.resolve(event.data.result);\n            }\n            callbacksMap.delete(event.data.id);\n          } else if (event.data.type === 'storageSet') {\n            const callback = callbacksMap.get(event.data.id);\n            if (!callback) return;\n            if (event.data.error) {\n              callback.reject(new Error(event.data.error));\n            } else {\n              callback.resolve(event.data.result);\n            }\n            callbacksMap.delete(event.data.id);\n          } else if (event.data.type === 'storageDelete') {\n            const callback = callbacksMap.get(event.data.id);\n            if (!callback) return;\n            if (event.data.error) {\n              callback.reject(new Error(event.data.error));\n            } else {\n              callback.resolve(event.data.result);\n            }\n            callbacksMap.delete(event.data.id);\n          } else if (event.data.type === 'storageList') {\n            const callback = callbacksMap.get(event.data.id);\n            if (!callback) return;\n            if (event.data.error) {\n              callback.reject(new Error(event.data.error));\n            } else {\n              callback.resolve(event.data.result);\n            }\n            callbacksMap.delete(event.data.id);\n          }\n        });\n\n        window.addEventListener('click', (event) =\u003e {\n          const isEl = event.target instanceof HTMLElement;\n          if (!isEl) return;\n    \n          \/\/ find ancestor links\n          const linkEl = event.target.closest(\"a\");\n          if (!linkEl || !linkEl.href) return;\n    \n          event.preventDefault();\n          event.stopImmediatePropagation();\n    \n          if (linkEl.href.startsWith(\"blob-request:\")) {\n            const blob = getBlobFromURL(linkEl.href);\n            if (!blob) return;\n            void blob.arrayBuffer().then((data) =\u003e {\n              realParent.postMessage({\n                type: \"downloadFile\",\n                filename: linkEl.download,\n                data,\n                mimeType: blob.type || \"application\/octet-stream\",\n              });\n            });\n          } else if (linkEl.href.startsWith(\"data:\")) {\n            const [header, base64Data] = linkEl.href.split(\",\");\n            const mimeMatch = header.match(\/data:([^;]+)\/);\n            const mimeType = mimeMatch ? mimeMatch[1] : \"application\/octet-stream\";\n            const binaryString = atob(base64Data);\n            const data = Uint8Array.from(binaryString, (c) =\u003e\n              c.charCodeAt(0),\n            ).buffer;\n            realParent.postMessage({\n              type: \"downloadFile\",\n              filename: linkEl.download,\n              data,\n              mimeType,\n            });\n          } else {\n            let linkUrl;\n            try {\n              linkUrl = new URL(linkEl.href);\n            } catch (error) {\n              return;\n            }\n    \n            if (linkUrl.hostname === window.location.hostname) return;\n      \n            realParent.postMessage({\n              type: 'openExternal',\n              href: linkEl.href,\n            }, '*');\n          }\n      });\n\n        const originalOpen = window.open;\n        window.open = function (url) {\n          realParent.postMessage({\n            type: \"openExternal\",\n            href: url,\n          }, \"*\");\n        };\n\n        window.addEventListener('error', (event) =\u003e {\n          realParent.postMessage({ type: 'console', message: 'Uncaught Error: ' + event.message }, '*');\n        });\n      })();\n    \u003c\/script\u003e\n  \u003clink href=\"https:\/\/fonts.googleapis.com\/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;0,600;1,400;1,500\u0026amp;family=Jost:wght@300;400;500;600\u0026amp;display=swap\" rel=\"stylesheet\"\u003e\n\u003cstyle\u003e\n#srt{\n  --nero:#0d0d0d;--oro:#c9a84c;--oro-light:#e0c477;--sfondo:#f5f0e8;\n  --bianco:#ffffff;--testo:#1a1a1a;--testo-chiaro:#4a4a4a;--grigio:#e5ddd0;\n  font-family:'Jost',sans-serif;color:var(--testo);font-size:16px;line-height:1.6;\n}\n#srt *,#srt *::before,#srt *::after{margin:0;padding:0;box-sizing:border-box}\n#srt h1,#srt h2,#srt h3,#srt h4{font-family:'Cormorant Garamond',serif}\n#srt img{max-width:100%;height:auto;display:block}\n\n\/* TOPBAR *\/\n#srt .topbar{background:var(--nero);color:var(--oro);text-align:center;padding:10px 20px;font-size:13px;font-weight:500;letter-spacing:1.5px}\n\n\/* HERO *\/\n#srt .hero{background:var(--nero);padding:60px 20px 70px;text-align:center;position:relative}\n#srt .hero-badge{display:inline-block;border:1px solid var(--oro);color:var(--oro);font-size:11px;font-weight:500;letter-spacing:2px;padding:6px 18px;border-radius:100px;margin-bottom:24px;text-transform:uppercase}\n#srt .hero h1{font-size:clamp(42px,8vw,72px);color:var(--bianco);font-weight:500;line-height:1.1;margin-bottom:20px}\n#srt .hero h1 em{color:var(--oro);font-style:italic}\n#srt .hero-sub{font-size:16px;color:rgba(255,255,255,0.75);max-width:580px;margin:0 auto 36px;font-weight:300;line-height:1.7}\n#srt .hero-garanties{display:flex;justify-content:center;gap:24px;margin-top:30px;flex-wrap:wrap}\n#srt .hero-garanties span{font-size:12px;color:rgba(255,255,255,0.6);display:flex;align-items:center;gap:6px}\n#srt .hero-garanties span::before{content:'✦';color:var(--oro);font-size:10px}\n#srt .hero-rating{display:inline-flex;align-items:center;gap:10px;margin-bottom:28px;padding:8px 18px;background:rgba(255,255,255,0.05);border:1px solid rgba(201,168,76,0.25);border-radius:100px}\n#srt .hero-rating .stars{color:var(--oro);letter-spacing:2px;font-size:14px}\n#srt .hero-rating .rtxt{font-size:12px;color:rgba(255,255,255,0.7)}\n\n\/* PHOTO BREAK *\/\n#srt .photo-break img{width:100%;height:auto;display:block}\n\n\/* SECTION BASE *\/\n#srt .section{padding:70px 20px}\n#srt .container{max-width:900px;margin:0 auto}\n#srt .section-label{font-size:11px;font-weight:600;letter-spacing:3px;text-transform:uppercase;color:var(--oro);margin-bottom:14px;display:block}\n#srt .section-title{font-size:clamp(30px,5vw,48px);font-weight:500;line-height:1.2;color:var(--nero);margin-bottom:20px}\n#srt .section-sub{font-size:16px;color:var(--testo-chiaro);line-height:1.8;max-width:700px}\n\n\/* PROBLEMA *\/\n#srt .problema{background:var(--bianco)}\n#srt .problema-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:20px;margin-top:40px}\n#srt .prob-card{background:var(--sfondo);border-left:3px solid var(--oro);padding:22px 24px;border-radius:0 8px 8px 0}\n#srt .prob-card .emoji{font-size:22px;margin-bottom:10px}\n#srt .prob-card h4{font-size:20px;color:var(--nero);margin-bottom:8px}\n#srt .prob-card p{font-size:14px;color:var(--testo-chiaro);line-height:1.7}\n\n\/* PRIMA\/DOPO *\/\n#srt .prima-dopo{background:var(--sfondo)}\n#srt .pd-grid{display:grid;grid-template-columns:1fr 1fr;gap:24px;margin-top:40px}\n#srt .pd-col{padding:32px;border-radius:12px}\n#srt .pd-prima{background:#ece5d8;border:1px solid #d8cfbd}\n#srt .pd-dopo{background:var(--nero);border:1px solid var(--nero)}\n#srt .pd-label{font-size:11px;font-weight:600;letter-spacing:2px;text-transform:uppercase;margin-bottom:16px;display:block}\n#srt .pd-prima .pd-label{color:#998}\n#srt .pd-dopo .pd-label{color:var(--oro)}\n#srt .pd-items{list-style:none;display:flex;flex-direction:column;gap:12px}\n#srt .pd-items li{font-size:14px;display:flex;align-items:flex-start;gap:10px;line-height:1.6}\n#srt .pd-prima .pd-items li{color:#887}\n#srt .pd-prima .pd-items li::before{content:'✗';color:#cc4444;font-weight:700;flex-shrink:0;margin-top:1px}\n#srt .pd-dopo .pd-items li{color:rgba(255,255,255,0.9)}\n#srt .pd-dopo .pd-items li::before{content:'✦';color:var(--oro);font-size:12px;flex-shrink:0;margin-top:3px}\n\n\/* BENEFICI *\/\n#srt .benefici{background:var(--bianco)}\n#srt .ben-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:24px;margin-top:40px}\n#srt .ben-card{text-align:center;padding:32px 20px;border-radius:12px;background:var(--sfondo);border:1px solid var(--grigio);transition:all 0.3s}\n#srt .ben-card:hover{transform:translateY(-4px);border-color:var(--oro)}\n#srt .ben-icon{width:56px;height:56px;border-radius:50%;background:var(--nero);display:flex;align-items:center;justify-content:center;font-size:22px;margin:0 auto 16px}\n#srt .ben-card h4{font-size:20px;color:var(--nero);margin-bottom:10px}\n#srt .ben-card p{font-size:13px;color:var(--testo-chiaro);line-height:1.7}\n\n\/* TESTIMONIANZE *\/\n#srt .testimonianze{background:var(--sfondo)}\n#srt .testi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:20px;margin-top:40px}\n#srt .testi-card{background:var(--bianco);border-radius:12px;padding:28px;border:1px solid var(--grigio)}\n#srt .stars{color:var(--oro);font-size:14px;margin-bottom:14px;letter-spacing:2px}\n#srt .testi-card p{font-size:18px;font-style:italic;color:var(--testo);line-height:1.6;margin-bottom:16px;font-family:'Cormorant Garamond',serif}\n#srt .testi-author{display:flex;align-items:center;gap:10px}\n#srt .testi-avatar{width:38px;height:38px;border-radius:50%;background:var(--nero);display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:600;color:var(--oro);font-family:'Jost',sans-serif}\n#srt .testi-name{font-size:13px;font-weight:600;color:var(--testo)}\n#srt .testi-detail{font-size:11px;color:#999}\n\n\/* SCIENZA *\/\n#srt .scienza{background:var(--nero)}\n#srt .scienza .section-title{color:var(--bianco)}\n#srt .scienza .section-sub{color:rgba(255,255,255,0.7)}\n#srt .scienza .section-label{color:var(--oro)}\n#srt .meccanismo{margin-top:40px;display:grid;grid-template-columns:1fr;gap:24px}\n#srt .mec-step{display:flex;gap:20px;align-items:flex-start;background:rgba(255,255,255,0.05);border:1px solid rgba(201,168,76,0.2);border-radius:12px;padding:24px}\n#srt .mec-num{font-size:36px;font-weight:500;color:var(--oro);line-height:1;flex-shrink:0;min-width:44px}\n#srt .mec-text h4{font-size:22px;color:var(--bianco);margin-bottom:8px}\n#srt .mec-text p{font-size:14px;color:rgba(255,255,255,0.65);line-height:1.7}\n\n\/* MATÉRIAUX *\/\n#srt .ingredienti{background:var(--bianco)}\n#srt .ing-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:20px;margin-top:40px}\n#srt .ing-card{border-radius:12px;overflow:hidden;border:1px solid var(--grigio)}\n#srt .ing-header{background:var(--nero);padding:20px;text-align:center}\n#srt .ing-header .ing-emoji{font-size:32px;margin-bottom:8px}\n#srt .ing-header h4{font-size:20px;color:var(--bianco)}\n#srt .ing-header small{font-size:11px;color:var(--oro);font-weight:500;letter-spacing:1px;text-transform:uppercase}\n#srt .ing-body{padding:20px}\n#srt .ing-body p{font-size:13px;color:var(--testo-chiaro);line-height:1.7;margin-bottom:12px}\n#srt .ing-dosage{font-size:11px;font-weight:600;color:var(--oro);letter-spacing:1px;text-transform:uppercase}\n\n\/* COMPARAZIONE *\/\n#srt .comparazione{background:var(--sfondo)}\n#srt .comp-table{width:100%;border-collapse:collapse;margin-top:40px;background:var(--bianco);border-radius:12px;overflow:hidden;border:1px solid var(--grigio)}\n#srt .comp-table th{padding:16px 18px;font-family:'Jost',sans-serif;font-size:13px;font-weight:600;text-align:left;background:var(--nero);color:var(--bianco)}\n#srt .comp-table th.nous{color:var(--oro)}\n#srt .comp-table td{padding:14px 18px;font-size:14px;border-bottom:1px solid var(--grigio);vertical-align:middle}\n#srt .comp-table tr:last-child td{border-bottom:none}\n#srt .comp-table td.feature{font-weight:500;color:var(--testo);font-size:13px}\n#srt .comp-table td.oui{color:#1a7a4a;font-weight:600}\n#srt .comp-table td.non{color:#cc4444}\n#srt .comp-table tr:nth-child(even) td{background:#faf8f4}\n\n\/* GARANZIE *\/\n#srt .garanzie{background:var(--nero);padding:70px 20px}\n#srt .gar-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:20px;margin-top:40px}\n#srt .gar-card{background:rgba(255,255,255,0.07);border:1px solid rgba(201,168,76,0.25);border-radius:12px;padding:28px;text-align:center}\n#srt .gar-icon{font-size:32px;margin-bottom:14px}\n#srt .gar-card h4{font-size:20px;color:var(--oro);margin-bottom:10px}\n#srt .gar-card p{font-size:13px;color:rgba(255,255,255,0.65);line-height:1.7}\n#srt .gar-card.paiement{border-color:var(--oro);background:rgba(201,168,76,0.08)}\n#srt .garanzie .section-title{color:var(--bianco)}\n#srt .garanzie .section-label{color:var(--oro)}\n\n\/* FAQ *\/\n#srt .faq{background:var(--bianco)}\n#srt .faq-list{margin-top:40px;display:flex;flex-direction:column;gap:12px;max-width:720px}\n#srt .faq-item{border:1px solid var(--grigio);border-radius:10px;overflow:hidden}\n#srt .faq-q{width:100%;background:none;border:none;padding:20px 24px;text-align:left;cursor:pointer;display:flex;justify-content:space-between;align-items:center;font-family:'Jost',sans-serif;font-size:15px;font-weight:500;color:var(--testo);transition:background 0.2s}\n#srt .faq-q:hover{background:var(--sfondo)}\n#srt .faq-q .faq-icon{font-size:18px;color:var(--oro);transition:transform 0.3s;flex-shrink:0;margin-left:12px}\n#srt .faq-q.open .faq-icon{transform:rotate(45deg)}\n#srt .faq-a{display:none;padding:0 24px 20px;font-size:14px;color:var(--testo-chiaro);line-height:1.8}\n#srt .faq-a.show{display:block}\n\n\/* MANIFESTO *\/\n#srt .manifesto{background:var(--sfondo);text-align:center;padding:80px 20px}\n#srt .manifesto .section-title{color:var(--nero);font-size:clamp(36px,5vw,54px)}\n#srt .manifesto-text{font-size:17px;color:var(--testo-chiaro);max-width:640px;margin:20px auto 40px;line-height:1.8;font-family:'Cormorant Garamond',serif;font-style:italic}\n#srt .manifesto-garantie{font-size:13px;color:#999;margin-top:8px}\n\n\/* DIVIDER *\/\n#srt .divider{display:flex;align-items:center;gap:12px;max-width:200px;margin:0 auto 16px}\n#srt .divider::before,#srt .divider::after{content:'';flex:1;height:1px;background:var(--oro);opacity:0.4}\n#srt .divider-ornament{color:var(--oro);font-size:12px}\n\n\/* DISCLAIMER *\/\n#srt .disclaimer{background:var(--nero);color:rgba(255,255,255,0.4);font-size:11px;line-height:1.7;text-align:center;padding:30px 24px;font-weight:300}\n\n@media(max-width:600px){\n  #srt .pd-grid{grid-template-columns:1fr}\n  #srt .ben-grid{grid-template-columns:1fr 1fr}\n  #srt .hero h1{font-size:38px}\n  #srt .comp-table{font-size:12px}\n  #srt .comp-table td,#srt .comp-table th{padding:10px 12px}\n  #srt .hero-garanties{gap:14px}\n  #srt .gar-grid{grid-template-columns:1fr 1fr}\n}\n\u003c\/style\u003e\n\n\u003cdiv id=\"srt\"\u003e\n\n\u003c!-- TOPBAR --\u003e\n\u003cdiv class=\"topbar\"\u003e✦ Livraison Express Gratuite Cette Semaine ✦ Soulagement Ciblé du Genou ✦\u003c\/div\u003e\n\n\u003c!-- HERO --\u003e\n\u003csection class=\"hero\"\u003e\n  \u003cdiv class=\"hero-badge\"\u003eSoutien Rotulien Ciblé\u003c\/div\u003e\n  \u003ch1\u003eRetrouvez le Plaisir\u003cbr\u003ede Marcher\u003cem\u003eSans Douleur\u003c\/em\u003e\n\u003c\/h1\u003e\n  \u003cdiv class=\"hero-rating\"\u003e\n\u003cspan class=\"stars\"\u003e★★★★★\u003c\/span\u003e\u003cspan class=\"rtxt\"\u003e4,73\/5 — plus de 200 avis vérifiés\u003c\/span\u003e\n\u003c\/div\u003e\n  \u003cp class=\"hero-sub\"\u003eElle ne serre pas tout le genou. Elle cible le point précis, juste sous la rotule, qui déclenche la douleur — et redirige la pression pour vous soulager à chaque pas.\u003c\/p\u003e\n  \u003cdiv class=\"hero-garanties\"\u003e\n    \u003cspan\u003eLivraison sous 48h\u003c\/span\u003e\n    \u003cspan\u003ePaiement à la livraison\u003c\/span\u003e\n    \u003cspan\u003eSatisfait ou remboursé 60 jours\u003c\/span\u003e\n    \u003cspan\u003eTaille unique ajustable\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- PHOTO BREAK 1 --\u003e\n\u003cdiv class=\"photo-break\"\u003e\n  \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0897\/1131\/3232\/files\/1_6fccc9e6-21da-4db5-8f4d-38f8ac1d5a45.png?v=1788370281\" alt=\"Sangle rotulienne\"\u003e\n\u003c\/div\u003e\n\n\u003c!-- PROBLÈME --\u003e\n\u003csection class=\"section problema\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cspan class=\"section-label\"\u003eLe Problème\u003c\/span\u003e\n    \u003ch2 class=\"section-title\"\u003eVotre genou n'est pas le problème.\u003cbr\u003eC'est l'endroit où va la force.\u003c\/h2\u003e\n    \u003cp class=\"section-sub\"\u003eÀ chaque pas, à chaque marche d'escalier, votre corps fait passer une force énorme par un seul point minuscule, juste sous la rotule. Les genouillères classiques enveloppent toute l'articulation — elles étalent la pression partout, sans jamais la cibler là où ça fait mal.\u003c\/p\u003e\n    \u003cdiv class=\"problema-grid\"\u003e\n      \u003cdiv class=\"prob-card\"\u003e\n\u003cdiv class=\"emoji\"\u003e🦵\u003c\/div\u003e\n\u003ch4\u003eDouleur sous la rotule\u003c\/h4\u003e\n\u003cp\u003eCette gêne aiguë qui revient à chaque mouvement, concentrée juste sous le genou, sur le tendon rotulien.\u003c\/p\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"prob-card\"\u003e\n\u003cdiv class=\"emoji\"\u003e🪜\u003c\/div\u003e\n\u003ch4\u003eEscaliers redoutés\u003c\/h4\u003e\n\u003cp\u003eMonter, descendre, se relever d'une chaise devient une épreuve. Chaque appui réveille la douleur.\u003c\/p\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"prob-card\"\u003e\n\u003cdiv class=\"emoji\"\u003e🏃\u003c\/div\u003e\n\u003ch4\u003eSport mis en pause\u003c\/h4\u003e\n\u003cp\u003eCourse, randonnée, vélo… vous avez ralenti ou arrêté, par peur d'aggraver votre genou.\u003c\/p\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"prob-card\"\u003e\n\u003cdiv class=\"emoji\"\u003e😤\u003c\/div\u003e\n\u003ch4\u003eGenouillères inconfortables\u003c\/h4\u003e\n\u003cp\u003eTrop chaudes, encombrantes, elles glissent et transforment la jambe en sauna en moins d'une heure.\u003c\/p\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- PRIMA\/DOPO --\u003e\n\u003csection class=\"section prima-dopo\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cspan class=\"section-label\"\u003eLa Transformation\u003c\/span\u003e\n    \u003ch2 class=\"section-title\"\u003eAvant \u0026amp; Après\u003cbr\u003ela Sangle Rotulienne\u003c\/h2\u003e\n    \u003cdiv class=\"pd-grid\"\u003e\n      \u003cdiv class=\"pd-col pd-prima\"\u003e\n        \u003cspan class=\"pd-label\"\u003eAvant\u003c\/span\u003e\n        \u003cul class=\"pd-items\"\u003e\n          \u003cli\u003eDouleur vive à chaque pas\u003c\/li\u003e\n          \u003cli\u003eEscaliers et descentes redoutés\u003c\/li\u003e\n          \u003cli\u003eSport et balades abandonnés\u003c\/li\u003e\n          \u003cli\u003eGrosses genouillères qui glissent et chauffent\u003c\/li\u003e\n          \u003cli\u003eAppréhension à chaque mouvement\u003c\/li\u003e\n          \u003cli\u003eLe sentiment de « ralentir » malgré soi\u003c\/li\u003e\n        \u003c\/ul\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"pd-col pd-dopo\"\u003e\n        \u003cspan class=\"pd-label\"\u003eAprès\u003c\/span\u003e\n        \u003cul class=\"pd-items\"\u003e\n          \u003cli\u003ePression ciblée, douleur soulagée\u003c\/li\u003e\n          \u003cli\u003eEscaliers et descentes retrouvés\u003c\/li\u003e\n          \u003cli\u003eRetour à la marche, la rando, la course\u003c\/li\u003e\n          \u003cli\u003eUn soutien léger et invisible sous les vêtements\u003c\/li\u003e\n          \u003cli\u003eLa confiance à chaque appui\u003c\/li\u003e\n          \u003cli\u003eLe plaisir de bouger, enfin retrouvé\u003c\/li\u003e\n        \u003c\/ul\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- PHOTO BREAK 2 --\u003e\n\u003cdiv class=\"photo-break\"\u003e\n  \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0897\/1131\/3232\/files\/4_ce66d883-85cd-4f65-a700-cf0265f61f62.webp?v=1788370281\" alt=\"Sangle rotulienne produit\"\u003e\n\u003c\/div\u003e\n\n\u003c!-- BENEFICI --\u003e\n\u003csection class=\"section benefici\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cspan class=\"section-label\"\u003eLes Bénéfices\u003c\/span\u003e\n    \u003ch2 class=\"section-title\"\u003e4 Raisons de Choisir\u003cbr\u003ela Sangle Rotulienne\u003c\/h2\u003e\n    \u003cdiv class=\"ben-grid\"\u003e\n      \u003cdiv class=\"ben-card\"\u003e\n\u003cdiv class=\"ben-icon\"\u003e🎯\u003c\/div\u003e\n\u003ch4\u003ePression Ciblée\u003c\/h4\u003e\n\u003cp\u003eElle applique une compression précise sur le tendon rotulien et redirige la force, là où la douleur se concentre vraiment.\u003c\/p\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"ben-card\"\u003e\n\u003cdiv class=\"ben-icon\"\u003e🔒\u003c\/div\u003e\n\u003ch4\u003eReste en Place\u003c\/h4\u003e\n\u003cp\u003eLe coussinet en silicone accroche à la peau et se verrouille. Elle ne glisse pas, ne s'enroule pas, même en plein effort.\u003c\/p\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"ben-card\"\u003e\n\u003cdiv class=\"ben-icon\"\u003e🌬️\u003c\/div\u003e\n\u003ch4\u003eRespirante Toute la Journée\u003c\/h4\u003e\n\u003cp\u003eLe tissu aéré laisse circuler l'air. Pas de transpiration, pas de démangeaisons, même après 10 heures.\u003c\/p\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"ben-card\"\u003e\n\u003cdiv class=\"ben-icon\"\u003e📏\u003c\/div\u003e\n\u003ch4\u003eTaille Unique Ajustable\u003c\/h4\u003e\n\u003cp\u003eLa sangle velcro s'adapte à toutes les morphologies. Pas de mesures, pas de tableau de tailles : on enroule et c'est réglé.\u003c\/p\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- TESTIMONIANZE --\u003e\n\u003csection class=\"section testimonianze\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"divider\"\u003e\u003cspan class=\"divider-ornament\"\u003e✦\u003c\/span\u003e\u003c\/div\u003e\n    \u003cspan class=\"section-label\"\u003eIls Ont Retrouvé Leur Mobilité\u003c\/span\u003e\n    \u003ch2 class=\"section-title\"\u003eCe Que Disent\u003cbr\u003eNos Clients\u003c\/h2\u003e\n    \u003cdiv class=\"testi-grid\"\u003e\n      \u003cdiv class=\"testi-card\"\u003e\n\u003cdiv class=\"stars\"\u003e★★★★★\u003c\/div\u003e\n\u003cp\u003e« J'ai 68 ans et une arthrose avancée. Je boitais en marchant. Cette petite sangle se met en 30 secondes et je remarche normalement. Un vrai soulagement. »\u003c\/p\u003e\n\u003cdiv class=\"testi-author\"\u003e\n\u003cdiv class=\"testi-avatar\"\u003eMD\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cdiv class=\"testi-name\"\u003eMonique D.\u003c\/div\u003e\n\u003cdiv class=\"testi-detail\"\u003eCliente vérifiée ✓\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"testi-card\"\u003e\n\u003cdiv class=\"stars\"\u003e★★★★★\u003c\/div\u003e\n\u003cp\u003e« Genoux opérés et réopérés, je travaille debout toute la journée. Ces sangles maintiennent juste là où il faut, et plus de douleurs. Je ne reviendrai pas en arrière. »\u003c\/p\u003e\n\u003cdiv class=\"testi-author\"\u003e\n\u003cdiv class=\"testi-avatar\"\u003eEL\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cdiv class=\"testi-name\"\u003eEstelle L.\u003c\/div\u003e\n\u003cdiv class=\"testi-detail\"\u003eCliente vérifiée ✓\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"testi-card\"\u003e\n\u003cdiv class=\"stars\"\u003e★★★★★\u003c\/div\u003e\n\u003cp\u003e« Je pensais devoir arrêter de courir à cause d'une arthrose. Cette sangle m'a permis de continuer. Le maintien est bon, ça ne glisse pas. Idéal à 58 ans. »\u003c\/p\u003e\n\u003cdiv class=\"testi-author\"\u003e\n\u003cdiv class=\"testi-avatar\"\u003ePG\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cdiv class=\"testi-name\"\u003ePhilippe G.\u003c\/div\u003e\n\u003cdiv class=\"testi-detail\"\u003eClient vérifié ✓\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- PHOTO BREAK 3 --\u003e\n\u003cdiv class=\"photo-break\"\u003e\n  \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0897\/1131\/3232\/files\/3_41d3ea39-1c57-4346-ae44-459272fe84ae.webp?v=1788370280\" alt=\"Conception sangle rotulienne\"\u003e\n\u003c\/div\u003e\n\n\u003c!-- SCIENZA --\u003e\n\u003csection class=\"section scienza\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cspan class=\"section-label\"\u003eLe Mécanisme\u003c\/span\u003e\n    \u003ch2 class=\"section-title\"\u003eComment la Sangle\u003cbr\u003eSoulage Votre Genou\u003c\/h2\u003e\n    \u003cp class=\"section-sub\"\u003eContrairement à une genouillère qui comprime toute l'articulation, la sangle rotulienne agit sur un seul point précis — et c'est justement ce qui la rend efficace.\u003c\/p\u003e\n    \u003cdiv class=\"meccanismo\"\u003e\n      \u003cdiv class=\"mec-step\"\u003e\n\u003cdiv class=\"mec-num\"\u003e01\u003c\/div\u003e\n\u003cdiv class=\"mec-text\"\u003e\n\u003ch4\u003eElle Cible le Tendon Rotulien\u003c\/h4\u003e\n\u003cp\u003eLe coussinet se place deux doigts sous la rotule, exactement là où la force se concentre à chaque appui — un point de la taille d'une pièce d'un euro.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"mec-step\"\u003e\n\u003cdiv class=\"mec-num\"\u003e02\u003c\/div\u003e\n\u003cdiv class=\"mec-text\"\u003e\n\u003ch4\u003eElle Redirige la Pression\u003c\/h4\u003e\n\u003cp\u003eEn appliquant une compression ciblée, la sangle redistribue la tension exercée sur le tendon et allège la charge sur le point douloureux.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"mec-step\"\u003e\n\u003cdiv class=\"mec-num\"\u003e03\u003c\/div\u003e\n\u003cdiv class=\"mec-text\"\u003e\n\u003ch4\u003eElle Stabilise le Mouvement\u003c\/h4\u003e\n\u003cp\u003eLe maintien accompagne le genou pendant l'effort — marche, escaliers, course, descente — sans limiter l'amplitude ni gêner l'articulation.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"mec-step\"\u003e\n\u003cdiv class=\"mec-num\"\u003e04\u003c\/div\u003e\n\u003cdiv class=\"mec-text\"\u003e\n\u003ch4\u003eElle Reste Discrète\u003c\/h4\u003e\n\u003cp\u003eFine et légère, elle se porte sous un pantalon, un legging ou une chaussette de sport. Personne ne la voit — mais votre genou, lui, la sent.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- MATÉRIAUX --\u003e\n\u003csection class=\"section ingredienti\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cspan class=\"section-label\"\u003eMatériaux \u0026amp; Conception\u003c\/span\u003e\n    \u003ch2 class=\"section-title\"\u003ePensée pour Tenir,\u003cbr\u003eS'adapter et Durer\u003c\/h2\u003e\n    \u003cdiv class=\"ing-grid\"\u003e\n      \u003cdiv class=\"ing-card\"\u003e\n\u003cdiv class=\"ing-header\"\u003e\n\u003cdiv class=\"ing-emoji\"\u003e⚪\u003c\/div\u003e\n\u003ch4\u003eCoussinet Silicone\u003c\/h4\u003e\n\u003csmall\u003eQualité Médicale\u003c\/small\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"ing-body\"\u003e\n\u003cp\u003eUn coussinet en silicone antidérapant qui accroche à la peau et verrouille la sangle en place, sans glisser même en sport intense.\u003c\/p\u003e\n\u003cdiv class=\"ing-dosage\"\u003eAnti-glissement\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"ing-card\"\u003e\n\u003cdiv class=\"ing-header\"\u003e\n\u003cdiv class=\"ing-emoji\"\u003e🌬️\u003c\/div\u003e\n\u003ch4\u003eTissu Respirant\u003c\/h4\u003e\n\u003csmall\u003eAéré \u0026amp; Confortable\u003c\/small\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"ing-body\"\u003e\n\u003cp\u003eUne sangle en tissu aéré qui laisse circuler l'air et garde la peau au frais, pour un confort qui dure toute la journée.\u003c\/p\u003e\n\u003cdiv class=\"ing-dosage\"\u003eSans transpiration\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"ing-card\"\u003e\n\u003cdiv class=\"ing-header\"\u003e\n\u003cdiv class=\"ing-emoji\"\u003e⚙️\u003c\/div\u003e\n\u003ch4\u003eBoucles Inoxydables\u003c\/h4\u003e\n\u003csmall\u003eAcier Résistant\u003c\/small\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"ing-body\"\u003e\n\u003cp\u003eDes boucles de réglage en acier inoxydable, robustes et durables, qui maintiennent la tension exactement où vous la réglez.\u003c\/p\u003e\n\u003cdiv class=\"ing-dosage\"\u003eMaintien durable\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"ing-card\"\u003e\n\u003cdiv class=\"ing-header\"\u003e\n\u003cdiv class=\"ing-emoji\"\u003e🔧\u003c\/div\u003e\n\u003ch4\u003eCoupe Ajustable\u003c\/h4\u003e\n\u003csmall\u003eVelcro Universel\u003c\/small\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"ing-body\"\u003e\n\u003cp\u003eUn réglage velcro qui s'adapte à tous les tours de genou, de la jambe fine à la plus forte. On enroule, on serre, c'est terminé.\u003c\/p\u003e\n\u003cdiv class=\"ing-dosage\"\u003eTaille unique\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- PHOTO BREAK 4 --\u003e\n\u003cdiv class=\"photo-break\"\u003e\n  \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0897\/1131\/3232\/files\/2_696577ee-a430-43ce-a66d-8639aa89ac28.webp?v=1788370282\" alt=\"Sangle rotulienne lifestyle\"\u003e\n\u003c\/div\u003e\n\n\u003c!-- COMPARAZIONE --\u003e\n\u003csection class=\"section comparazione\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cspan class=\"section-label\"\u003eLa Différence\u003c\/span\u003e\n    \u003ch2 class=\"section-title\"\u003eSangle Ciblée ou\u003cbr\u003eGenouillère Classique ?\u003c\/h2\u003e\n    \u003ctable class=\"comp-table\"\u003e\n      \u003cthead\u003e\u003ctr\u003e\n\u003cth\u003eCritère\u003c\/th\u003e\n\u003cth class=\"nous\"\u003e✦ Sangle Rotulienne\u003c\/th\u003e\n\u003cth\u003eGenouillère classique\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n      \u003ctbody\u003e\n        \u003ctr\u003e\n\u003ctd class=\"feature\"\u003eCible le point douloureux\u003c\/td\u003e\n\u003ctd class=\"oui\"\u003e✦ Pression ciblée\u003c\/td\u003e\n\u003ctd class=\"non\"\u003e✗ Compresse tout\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd class=\"feature\"\u003eReste en place à l'effort\u003c\/td\u003e\n\u003ctd class=\"oui\"\u003e✦ Coussinet silicone\u003c\/td\u003e\n\u003ctd class=\"non\"\u003e✗ Glisse et s'enroule\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd class=\"feature\"\u003eConfort \u0026amp; respirabilité\u003c\/td\u003e\n\u003ctd class=\"oui\"\u003e✦ Tissu aéré\u003c\/td\u003e\n\u003ctd class=\"non\"\u003e✗ Chaude, effet sauna\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd class=\"feature\"\u003eDiscrétion sous les vêtements\u003c\/td\u003e\n\u003ctd class=\"oui\"\u003e✦ Fine et invisible\u003c\/td\u003e\n\u003ctd class=\"non\"\u003e✗ Volumineuse\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd class=\"feature\"\u003eLiberté de mouvement\u003c\/td\u003e\n\u003ctd class=\"oui\"\u003e✦ Amplitude préservée\u003c\/td\u003e\n\u003ctd class=\"non\"\u003e✗ Articulation bloquée\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd class=\"feature\"\u003ePaiement à la livraison\u003c\/td\u003e\n\u003ctd class=\"oui\"\u003e✦ Disponible\u003c\/td\u003e\n\u003ctd class=\"non\"\u003e✗ Rarement proposé\u003c\/td\u003e\n\u003c\/tr\u003e\n      \u003c\/tbody\u003e\n    \u003c\/table\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- GARANZIE --\u003e\n\u003csection class=\"garanzie\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cspan class=\"section-label\"\u003eNos Engagements\u003c\/span\u003e\n    \u003ch2 class=\"section-title\"\u003eVous Commandez\u003cbr\u003een Toute Sérénité\u003c\/h2\u003e\n    \u003cdiv class=\"gar-grid\"\u003e\n      \u003cdiv class=\"gar-card\"\u003e\n\u003cdiv class=\"gar-icon\"\u003e🏆\u003c\/div\u003e\n\u003ch4\u003eSatisfait ou Remboursé\u003c\/h4\u003e\n\u003cp\u003e60 jours pour l'essayer. Si elle ne vous convient pas, vous êtes remboursé intégralement — sans justification, sans formulaire.\u003c\/p\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"gar-card\"\u003e\n\u003cdiv class=\"gar-icon\"\u003e🚀\u003c\/div\u003e\n\u003ch4\u003eLivraison Express\u003c\/h4\u003e\n\u003cp\u003eVotre commande est expédiée et livrée sous 48h. Suivi en temps réel inclus.\u003c\/p\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"gar-card paiement\"\u003e\n\u003cdiv class=\"gar-icon\"\u003e💳\u003c\/div\u003e\n\u003ch4\u003ePaiement à la Livraison\u003c\/h4\u003e\n\u003cp\u003eVous payez uniquement à la réception de votre colis. Notre équipe vous appellera pour confirmer votre commande avant expédition.\u003c\/p\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"gar-card\"\u003e\n\u003cdiv class=\"gar-icon\"\u003e📏\u003c\/div\u003e\n\u003ch4\u003eTaille Unique Ajustable\u003c\/h4\u003e\n\u003cp\u003eUn seul modèle qui s'adapte à toutes les morphologies. Pas de mesures à prendre, pas de mauvaise taille possible.\u003c\/p\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- FAQ --\u003e\n\u003csection class=\"section faq\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cspan class=\"section-label\"\u003eQuestions Fréquentes\u003c\/span\u003e\n    \u003ch2 class=\"section-title\"\u003eTout Ce Que Vous\u003cbr\u003eDevez Savoir\u003c\/h2\u003e\n    \u003cdiv class=\"faq-list\"\u003e\n      \u003cdiv class=\"faq-item\"\u003e\n\u003cbutton class=\"faq-q\" onclick=\"srtFaq(this)\"\u003e\u003cspan\u003eEn quoi est-elle différente d'une genouillère ?\u003c\/span\u003e\u003cspan class=\"faq-icon\"\u003e+\u003c\/span\u003e\u003c\/button\u003e\u003cdiv class=\"faq-a\"\u003eUne genouillère enveloppe toute l'articulation et compresse tout : elle limite les mouvements, tient chaud et ne cible pas le vrai problème. La sangle rotulienne applique une pression précise sur le tendon rotulien et redirige la force pour la soulager, là où ça compte.\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"faq-item\"\u003e\n\u003cbutton class=\"faq-q\" onclick=\"srtFaq(this)\"\u003e\u003cspan\u003eJ'ai déjà essayé des genouillères sans succès. Pourquoi celle-ci ?\u003c\/span\u003e\u003cspan class=\"faq-icon\"\u003e+\u003c\/span\u003e\u003c\/button\u003e\u003cdiv class=\"faq-a\"\u003eParce que ces produits ne visaient pas le bon endroit. Les manchons compressent tout le genou, les genouillères verrouillent toute l'articulation — aucun ne cible le tendon, là où la force se concentre. Cette sangle vise précisément ce point, et pour la plupart des gens, cela suffit.\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"faq-item\"\u003e\n\u003cbutton class=\"faq-q\" onclick=\"srtFaq(this)\"\u003e\u003cspan\u003eElle a l'air petite. Est-elle vraiment efficace ?\u003c\/span\u003e\u003cspan class=\"faq-icon\"\u003e+\u003c\/span\u003e\u003c\/button\u003e\u003cdiv class=\"faq-a\"\u003eLa taille n'est pas la question, la précision l'est. Un pansement aussi est petit. La sangle est compacte parce qu'elle n'a besoin de cibler qu'un seul point — le tendon rotulien — au lieu d'envelopper toute la jambe inutilement.\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"faq-item\"\u003e\n\u003cbutton class=\"faq-q\" onclick=\"srtFaq(this)\"\u003e\u003cspan\u003eEst-ce qu'elle ira sur mon genou ?\u003c\/span\u003e\u003cspan class=\"faq-icon\"\u003e+\u003c\/span\u003e\u003c\/button\u003e\u003cdiv class=\"faq-a\"\u003eOui. La sangle ajustable en velcro s'adapte à toutes les morphologies — jambe fine, athlétique ou plus forte. Pas de tableau de tailles, pas de mètre ruban : on enroule, on serre, c'est terminé.\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"faq-item\"\u003e\n\u003cbutton class=\"faq-q\" onclick=\"srtFaq(this)\"\u003e\u003cspan\u003eVa-t-elle glisser pendant l'effort ?\u003c\/span\u003e\u003cspan class=\"faq-icon\"\u003e+\u003c\/span\u003e\u003c\/button\u003e\u003cdiv class=\"faq-a\"\u003eNon. Le coussinet silicone accroche à la peau et reste verrouillé en place. Des clients l'ont portée sur un 10 km complet ou quatre jours de randonnée sur sentiers boueux — sans qu'elle bouge d'un millimètre.\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"faq-item\"\u003e\n\u003cbutton class=\"faq-q\" onclick=\"srtFaq(this)\"\u003e\u003cspan\u003ePuis-je la porter toute la journée ?\u003c\/span\u003e\u003cspan class=\"faq-icon\"\u003e+\u003c\/span\u003e\u003c\/button\u003e\u003cdiv class=\"faq-a\"\u003eSans problème. Le tissu respirant évite la transpiration, les démangeaisons et l'inconfort, même après 10 heures. Portez-la sous un pantalon, un legging ou une chaussette de sport : invisible, mais efficace.\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"faq-item\"\u003e\n\u003cbutton class=\"faq-q\" onclick=\"srtFaq(this)\"\u003e\u003cspan\u003eComment la mettre en place correctement ?\u003c\/span\u003e\u003cspan class=\"faq-icon\"\u003e+\u003c\/span\u003e\u003c\/button\u003e\u003cdiv class=\"faq-a\"\u003eEn trois étapes : repérez votre rotule, placez le coussinet silicone deux doigts en dessous, puis serrez jusqu'à ce que ce soit bien ajusté sans excès. Dix secondes suffisent.\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"faq-item\"\u003e\n\u003cbutton class=\"faq-q\" onclick=\"srtFaq(this)\"\u003e\u003cspan\u003eComment fonctionne le paiement à la livraison ?\u003c\/span\u003e\u003cspan class=\"faq-icon\"\u003e+\u003c\/span\u003e\u003c\/button\u003e\u003cdiv class=\"faq-a\"\u003ePassez commande en ligne et notre équipe vous contactera par téléphone pour confirmer votre commande avant l'expédition. Vous réglez directement au livreur à la réception de votre colis — sans risque, sans engagement.\u003c\/div\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- MANIFESTO --\u003e\n\u003csection class=\"manifesto\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"divider\"\u003e\u003cspan class=\"divider-ornament\"\u003e✦\u003c\/span\u003e\u003c\/div\u003e\n    \u003cspan class=\"section-label\" style=\"text-align:center;display:block\"\u003eNotre Philosophie\u003c\/span\u003e\n    \u003ch2 class=\"section-title\"\u003eConçue pour Ceux\u003cbr\u003equi Refusent de Ralentir\u003c\/h2\u003e\n    \u003cp class=\"manifesto-text\"\u003eVous n'avez pas besoin d'une genouillère de plus, encombrante et chaude. Vous avez besoin d'un soutien qui cible le bon point, reste en place et se fait oublier. La sangle rotulienne rend cela possible — pour retrouver vos escaliers, vos balades, vos week-ends.\u003c\/p\u003e\n    \u003cdiv class=\"manifesto-garantie\"\u003e✦ Livraison sous 48h · Paiement à la livraison · Remboursé sous 60 jours ✦\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c\/div\u003e\n\n\u003c!-- DISCLAIMER --\u003e\n\u003cdiv id=\"srt\"\u003e\u003cdiv class=\"disclaimer\"\u003eCe produit est un dispositif de soutien et de maintien. Il ne constitue pas un dispositif médical et ne remplace pas un avis, un diagnostic ou un traitement médical. En cas de douleur persistante, de blessure ou de pathologie du genou, consultez un professionnel de santé. Les résultats peuvent varier d'une personne à l'autre.\u003c\/div\u003e\u003c\/div\u003e\n\n\u003c!-- COPY BUTTON --\u003e\n\u003cdiv id=\"srt-copy-bar\" style=\"position: fixed; bottom: 24px; right: 24px; z-index: 9999; display: none;\"\u003e\n  \u003cbutton onclick=\"srtCopy()\" id=\"srt-copy-btn\" style=\"display:flex;align-items:center;gap:10px;background:#c9a84c;color:#0d0d0d;border:none;padding:12px 22px;border-radius:100px;font-size:14px;font-weight:600;cursor:pointer;box-shadow:0 8px 28px rgba(201,168,76,.5);font-family:'Jost',sans-serif;transition:all .2s;\"\u003e\n    \u003cspan\u003e📋\u003c\/span\u003e\u003cspan id=\"srt-copy-txt\"\u003eCopia codice\u003c\/span\u003e\n  \u003c\/button\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\nfunction srtFaq(btn){\n  var a=btn.nextElementSibling;\n  var isOpen=a.classList.contains('show');\n  document.querySelectorAll('#srt .faq-a').forEach(function(x){x.classList.remove('show')});\n  document.querySelectorAll('#srt .faq-q').forEach(function(x){x.classList.remove('open')});\n  if(!isOpen){a.classList.add('show');btn.classList.add('open');}\n}\nfunction srtCopy(){\n  var btn=document.getElementById('srt-copy-btn'),txt=document.getElementById('srt-copy-txt'),bar=document.getElementById('srt-copy-bar');\n  bar.style.display='none';var code=document.documentElement.outerHTML;bar.style.display='';\n  navigator.clipboard.writeText(code).then(function(){\n    txt.textContent='✓ Copiato!';btn.style.background='#0d0d0d';btn.style.color='#c9a84c';\n    setTimeout(function(){txt.textContent='Copia codice';btn.style.background='#c9a84c';btn.style.color='#0d0d0d';},2500);\n  }).catch(function(){\n    var ta=document.createElement('textarea');ta.value=code;document.body.appendChild(ta);ta.select();document.execCommand('copy');document.body.removeChild(ta);\n    txt.textContent='✓ Copiato!';btn.style.background='#0d0d0d';btn.style.color='#c9a84c';\n    setTimeout(function(){txt.textContent='Copia codice';btn.style.background='#c9a84c';btn.style.color='#0d0d0d';},2500);\n  });\n}\n\u003c\/script\u003e\n","brand":"NaayaLab","offers":[{"title":"Default Title","offer_id":53535034704208,"sku":null,"price":19900.0,"currency_code":"XOF","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0897\/1131\/3232\/files\/1_1a8152d9-4205-4983-ba4d-60c688a66c8b.png?v=1788370411","url":"https:\/\/naayalab.com\/products\/sangle-ci","provider":"NaayaLab","version":"1.0","type":"link"}