{"product_id":"trottinette-electrique-tout-terrain-g63-gyroor-1200w-copie","title":"Trottinette électrique G63 Double Moteur –2400W nominal \/ 3000W crête","description":"\u003cdiv id='\"__root\"'\u003e\u003c\/div\u003e\n\u003ch1 class=\"text-[1.375rem] font-bold mt-4 pt-5 mb-5 text-zinc-900 dark:text-zinc-100 first:mt-0 first:pt-0 tracking-tight\"\u003e[G63 DUAL MOTOR] La Force Brute Tout-Terrain — 2400W ⚡\u003c\/h1\u003e\n\u003cp class=\"!mt-2 !mb-2 leading-relaxed\"\u003e\u003cstrong class=\"font-semibold text-zinc-900 dark:text-zinc-100\"\u003eDominez chaque relief. Sans compromis.\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp class=\"!mt-2 !mb-2 leading-relaxed\"\u003eLa G63 Dual Motor n'est pas une simple trottinette électrique ; c'est un engin de franchissement conçu pour ceux qui ne veulent pas choisir entre puissance urbaine et aventure tout-terrain. Avec ses deux moteurs haute performance, elle redéfinit les standards du segment \"Heavy Duty\".\u003c\/p\u003e\n\u003chr class=\"my-6 border-zinc-200\/80 dark:border-zinc-700\/80\"\u003e\n\u003ch2 class=\"text-[1.2rem] font-bold mt-4 pt-4 mb-4 text-zinc-800 dark:text-zinc-200 first:mt-0 first:pt-0 tracking-tight\"\u003e🏗️ L'ADN \"TANK\" : CONSTRUITE POUR DURER\u003c\/h2\u003e\n\u003cp class=\"!mt-2 !mb-2 leading-relaxed\"\u003eFidèle à son héritage, la G63 conserve sa structure en alliage d'aluminium de qualité aéronautique. Son design robuste et agressif n'est pas seulement esthétique : il est conçu pour encaisser les chocs et les vibrations des terrains les plus difficiles.\u003c\/p\u003e\n\u003ch3 class=\"text-base font-semibold mt-3 pt-3 mb-3 text-zinc-800 dark:text-zinc-200 first:mt-0 first:pt-0 tracking-tight\"\u003e🚀 Puissance X2 : La Motricité Intégrale\u003c\/h3\u003e\n\u003cp class=\"!mt-2 !mb-2 leading-relaxed\"\u003eÉquipée de\u003cspan\u003e \u003c\/span\u003e\u003cstrong class=\"font-semibold text-zinc-900 dark:text-zinc-100\"\u003edeux moteurs Brushless de 1200W\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e(2400W nominal \/ 3000W crête), la G63 Dual Motor offre un couple instantané capable de vous propulser en haut des pentes les plus raides (jusqu'à 35°) sans aucune perte de régime.\u003c\/p\u003e\n\u003cul class=\"my-5 space-y-3 leading-[1.85] pl-5\"\u003e\n\u003cli class=\"leading-[1.85] pl-1\"\u003e\n\u003cstrong class=\"font-semibold text-zinc-900 dark:text-zinc-100\"\u003eMode Single\/Dual\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e: Passez d'une conduite fluide et économique à une puissance dévastatrice d'une simple pression sur le commutateur.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003ch3 class=\"text-base font-semibold mt-3 pt-3 mb-3 text-zinc-800 dark:text-zinc-200 first:mt-0 first:pt-0 tracking-tight\"\u003e🔋 Modularité \u0026amp; Endurance\u003c\/h3\u003e\n\u003cul class=\"my-5 space-y-3 leading-[1.85] pl-5\"\u003e\n\u003cli class=\"leading-[1.85] pl-1\"\u003e\n\u003cstrong class=\"font-semibold text-zinc-900 dark:text-zinc-100\"\u003eBatterie Amovible 48V 20Ah (ou 60V)\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e: Système de verrouillage sécurisé permettant de recharger votre batterie n'importe où sans transporter la trottinette.\u003c\/li\u003e\n\u003cli class=\"leading-[1.85] pl-1\"\u003e\n\u003cstrong class=\"font-semibold text-zinc-900 dark:text-zinc-100\"\u003eDesign Étanche IP54\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e: Roulez sereinement sous la pluie fine ou sur sol humide grâce à la protection renforcée des composants électroniques.\n\u003cdiv id='\"__root\"'\u003e\u003c\/div\u003e\n\u003cscript\u003e(function(){\nvar root=document.getElementById('__root');\nvar _t=null,_gt=null,_st=null,_first=true;\nfunction scheduleGeometry(){if(_gt)clearTimeout(_gt);_gt=setTimeout(_geo,60);}\nfunction scheduleHeight(){if(_st)return;_st=setTimeout(function(){_st=null;_h();},60);}\nvar _finalized=false;\nvar _frozen=false;\n\/\/ Runaway layout-loop detector (e.g. a Chart.js responsive canvas reflowing\n\/\/ every frame). Freeze only when the high reflow rate PERSISTS across several\n\/\/ consecutive windows: a cold-load settle is a one-off burst that then stops,\n\/\/ so requiring persistence avoids freezing healthy widgets mid-settle at a\n\/\/ too-small height.\nvar _hWinStart=0,_hCalls=0,_hBusyWins=0;\nvar _HOT_PER_WIN=20,_HOT_WINS=4;\nvar _fSamples=[],_fInt=null,_fRecs=0;\nvar _pinned=[];\nvar _evalStability=(function Mi(e,t,r){if(typeof r\u003e\u0026quot;u\u0026quot;\u0026amp;\u0026amp;(r=20),e.length\u003c2)return{status:\u0026quot;undecided\u0026quot;};var a=e[e.length-1],o=e[e.length-2];return a-o\u003e20?{status:\u0026quot;runaway\u0026quot;}:Math.abs(a-o)\u003c4\u0026amp;\u0026amp;Math.abs(a-t)\u003e8?{status:\u0026quot;stable\u0026quot;,stableHeight:a}:e.length\u003e=r?{status:\u0026quot;runaway\u0026quot;}:e.length\u003c5?{status:\u0026quot;undecided\u0026quot;}:{status:\u0026quot;runaway\u0026quot;}});\nfunction _thaw(){\n_frozen=false;\ntry{\nfor(var j=0;j\u003c_pinned.length;j++){\nvar item=_pinned[j];\nfor(var k=0;k\u003citem.p.length;k++)item.el.style.removeProperty(item.p[k]);\n}\n}catch(e){}finally{\n_pinned=[];\n_hBusyWins=0;_hCalls=0;_hWinStart=0;\nif(_fInt){clearInterval(_fInt);_fInt=null;}\n_fSamples=[];\ntry{\n_ro.observe(document.body);\n_ro.observe(document.documentElement);\nif(root)_ro.observe(root);\n}catch(e2){}\n}\n}\nfunction _selfFreeze(){\nif(_frozen)return;\n_frozen=true;\nif(_t){clearTimeout(_t);_t=null;}\ntry{_ro.disconnect();}catch(_e){}\n\/\/ The feedback engine is the chart library's OWN ResizeObserver, which\n\/\/ watches the canvas's PARENT (responsive:true). By the time we get here\n\/\/ the loop has already inflated the canvas\/ancestors to a huge height, so\n\/\/ we must NOT pin them at their current (runaway) size — that locks in the\n\/\/ giant empty box seen in the wild. Instead: (1) cap each canvas to a sane\n\/\/ height derived from its own width (a chart wider than tall is the norm),\n\/\/ (2) reflow so ancestors collapse to fit, (3) THEN pin the collapsed\n\/\/ ancestors so the library reads a constant parent size and the circular\n\/\/ reference resolves.\ntry{\n_pinned=[];\nvar cs=root?root.querySelectorAll('canvas'):[];\nfor(var i=0;i\u003ccs.length;i++){\nvar node=cs[i];\nvar cw=node.getBoundingClientRect().width||node.offsetWidth||0;\n\/\/ Cap to the canvas width but never taller than 420px; a runaway chart is\n\/\/ always inflated past this, a healthy one never reaches freeze at all.\nvar cap=cw\u003e0?Math.min(cw,420):360;\nnode.style.setProperty('height',cap+'px','important');\nnode.style.setProperty('max-height',cap+'px','important');\n_pinned.push({el:node,p:['height','max-height']});\n}\n\/\/ Force reflow so ancestor heights recompute against the capped canvases.\nif(root)void root.getBoundingClientRect();\nfor(var k=0;k\u003ccs.length;k++){\nvar anc=cs[k].parentElement;\nwhile(anc\u0026amp;\u0026amp;anc!==root.parentElement){\nvar ah=anc.getBoundingClientRect().height||anc.offsetHeight||0;\nif(ah\u003e0){\nanc.style.setProperty('height',ah+'px','important');\nanc.style.setProperty('overflow','hidden','important');\n_pinned.push({el:anc,p:['height','overflow']});\n}\nif(anc===root)break;\nanc=anc.parentElement;\n}\n}\n}catch(_e2){}\nif(root){\nroot.style.setProperty('overflow','hidden','important');\n_pinned.push({el:root,p:['overflow']});\n}\n\/\/ Report the now-stable height once so the host locks the iframe.\nvar fh=root?Math.max(root.getBoundingClientRect().height,root.scrollHeight,root.offsetHeight):0;\nif(fh\u003e0)parent.postMessage({type:'widget:resize',height:fh,frozen:true},'*');\n\n\/\/ Recovery mechanism: check if layout stabilizes at a different height after freeze.\n\/\/ Why: pin 后完全定格的布局对 scrollHeight 采样是盲的（样本恒等于冻结高度），\n\/\/ 此机制只能恢复 freeze 误落在 settle 进行中的场景。\nif(_fRecs\u003c2\u0026amp;\u0026amp;!_fInt){\n_fSamples=[];\n_fInt=setInterval(function(){\nif(!root)return;\nvar sh=root.scrollHeight;\n_fSamples.push(sh);\nvar res=_evalStability(_fSamples,fh);\nif(res.status==='stable'){\n_fRecs++;\n_thaw();\nparent.postMessage({type:'widget:resize',height:res.stableHeight,recovered:true},'*');\n}else if(res.status==='runaway'){\nclearInterval(_fInt);_fInt=null;\n}\n},1000);\n}\n}\nfunction _h(){\nif(_frozen)return;\nvar _now=Date.now();\nif(_now-_hWinStart\u003e400){\n\/\/ Window closed: extend the hot streak if it was hot, else reset it.\nif(_hCalls\u003e_HOT_PER_WIN)_hBusyWins++;else _hBusyWins=0;\n_hWinStart=_now;_hCalls=1;\n}else{\n_hCalls++;\nif(_hCalls\u003e_HOT_PER_WIN\u0026amp;\u0026amp;_hBusyWins\u003e=_HOT_WINS-1){_selfFreeze();return;}\n}\nif(_t)clearTimeout(_t);\n_t=setTimeout(function(){\nvar bodyStyle=document.body ? getComputedStyle(document.body) : null;\nvar bodyPadding=bodyStyle\n  ? (parseFloat(bodyStyle.paddingTop||'0')||0) + (parseFloat(bodyStyle.paddingBottom||'0')||0)\n  : 0;\nvar rootH=Math.max(\n  root ? root.getBoundingClientRect().height : 0,\n  root ? root.scrollHeight : 0,\n  root ? root.offsetHeight : 0\n);\nvar bodyH=Math.max(\n  document.body ? document.body.scrollHeight : 0,\n  document.body ? document.body.offsetHeight : 0\n);\nvar h=rootH\u003e0 ? rootH + bodyPadding : Math.min(bodyH,360);\nif(h\u003c=0){\n  var vh=Math.max(\n    window.innerHeight||0,\n    document.documentElement ? document.documentElement.clientHeight : 0\n  );\n  h=Math.min(vh,360);\n}\nif(h\u003e0)parent.postMessage({type:'widget:resize',height:h,first:_first},'*');\n_first=false;\n},60);\n}\nvar _ro=new ResizeObserver(_h);\n_ro.observe(document.body);\n_ro.observe(document.documentElement);\nif(root)_ro.observe(root);\n\nfunction _geo(){\ntry{\nvar svgs=root.querySelectorAll('svg[viewBox]');\nvar issues=[];\nfor(var i=0;i\u003csvgs.length;i++){\nvar svg=svgs[i];\nif(svg.parentElement\u0026amp;\u0026amp;svg.parentElement.closest('svg'))continue;\ntry{\nvar bb=svg.getBBox();\nvar vbStr=svg.getAttribute('viewBox');\nvar vb=vbStr.split(\/[\\s,]+\/).map(parseFloat);\nif(vb.length!==4||isNaN(vb[0])||isNaN(vb[1])||isNaN(vb[2])||isNaN(vb[3]))continue;\nvar E=0;\ntry{\nvar els=svg.querySelectorAll('*');\nvar maxSW=0;\nfor(var j=0;j\u003cels.length;j++){\nvar swStr=els[j].getAttribute('stroke-width')||els[j].style.strokeWidth;\nif(swStr){\nvar sw=parseFloat(swStr);\nif(!isNaN(sw)\u0026amp;\u0026amp;sw\u003emaxSW)maxSW=sw;\n}\n}\nE=maxSW\/2;\nif(svg.querySelector('[marker-end],[marker-start],[marker-mid]'))E+=12;\n}catch(e){E=0;}\nvar vx=vb[0],vy=vb[1],vw=vb[2],vh=vb[3],PAD=24,EPS=2;\nvar left=bb.x-E,top=bb.y-E,right=bb.x+bb.width+E,bottom=bb.y+bb.height+E;\nvar isOv=left\u003cvx-EPS||top\u003cvy-EPS||right\u003evx+vw+EPS||bottom\u003evy+vh+EPS;\nif(isOv){\nvar nvx=Math.min(vx,left-PAD),nvy=Math.min(vy,top-PAD);\nvar nvw=Math.max(vx+vw,right+PAD)-nvx,nvh=Math.max(vy+vh,bottom+PAD)-nvy;\nvar nvbStr=[nvx,nvy,nvw,nvh].join(' ');\nif(nvbStr!==vbStr){\nsvg.setAttribute('viewBox',nvbStr);\nif(left\u003cvx-EPS)issues.push({kind:'overflow',direction:'left',amount:Math.round(vx-left)});\nif(top\u003cvy-EPS)issues.push({kind:'overflow',direction:'top',amount:Math.round(vy-top)});\nif(right\u003evx+vw+EPS)issues.push({kind:'overflow',direction:'right',amount:Math.round(right-(vx+vw))});\nif(bottom\u003evy+vh+EPS)issues.push({kind:'overflow',direction:'bottom',amount:Math.round(bottom-(vy+vh))});\n}\n}\n}catch(e){}\n}\nif(issues.length)parent.postMessage({type:'widget:geometry',fixed:true,issues:issues},'*');\n}catch(e){}\n}\n\nfunction applyHtml(html){\nif(_finalized)return;\nroot.innerHTML=html;\n_h();\n}\n\nfunction finalizeHtml(html){\n_finalized=true;\n_thaw();\n\/\/ Parse finalized HTML in a temp container to separate scripts from content\nvar tmp=document.createElement('div');\ntmp.innerHTML=html;\nvar ss=tmp.querySelectorAll('script');\nvar scripts=[];\nfor(var i=0;i\u003css.length;i++){\nscripts.push({src:ss[i].src||'',text:ss[i].textContent||'',attrs:[]});\nfor(var j=0;j\u003css[i].attributes.length;j++){\nvar a=ss[i].attributes[j];\nif(a.name!=='src')scripts[scripts.length-1].attrs.push({name:a.name,value:a.value});\n}\nss[i].remove();\n}\n\/\/ Update non-script content only if it differs (avoids repaint flash)\nvar visualHtml=tmp.innerHTML;\nif(root.innerHTML!==visualHtml)root.innerHTML=visualHtml;\n\/\/ Execute scripts in sequence so inline init code waits for external CDNs.\nfunction runNext(idx){\nif(idx\u003e=scripts.length){\nscheduleGeometry();\n_h();\nparent.postMessage({type:'widget:styled'},'*');\nreturn;\n}\nvar s=scripts[idx];\nvar n=document.createElement('script');\nfor(var j=0;j\u003cs.attrs.length;j++)n.setAttribute(s.attrs[j].name,s.attrs[j].value);\nif(s.src){\nn.onload=function(){runNext(idx+1);};\nn.onerror=function(){runNext(idx+1);};\nn.src=s.src;\nroot.appendChild(n);\nreturn;\n}\nif(s.text)n.textContent=s.text;\nroot.appendChild(n);\nrunNext(idx+1);\n}\nrunNext(0);\n}\n\nwindow.addEventListener('message',function(e){\nif(!e.data)return;\nswitch(e.data.type){\ncase 'widget:update':\napplyHtml(e.data.html);\nbreak;\ncase 'widget:finalize':\nfinalizeHtml(e.data.html);\nsetTimeout(_h,150);\nbreak;\ncase 'widget:theme':\nif(typeof e.data.isDark==='boolean')document.documentElement.className=e.data.isDark?'dark':'';\nsetTimeout(_h,100);\nbreak;\ncase 'widget:measure':\n_thaw();\n_h();\nbreak;\ncase 'widget:screenshot':\n(function(){\nif(!root){parent.postMessage({type:'widget:screenshotData',error:'empty'},'*');return;}\ntry{\nvar clone=root.cloneNode(true);\nvar origCanvases=root.querySelectorAll('canvas');\nvar cloneCanvases=clone.querySelectorAll('canvas');\nfor(var ci=0;ci\u003corigCanvases.length;ci++){\ntry{\nvar cImg=document.createElement('img');\ncImg.src=origCanvases[ci].toDataURL('image\/png');\ncImg.width=origCanvases[ci].offsetWidth||origCanvases[ci].width;\ncImg.height=origCanvases[ci].offsetHeight||origCanvases[ci].height;\ncImg.style.cssText=cloneCanvases[ci].style.cssText;\ncImg.className=cloneCanvases[ci].className;\ncloneCanvases[ci].parentNode.replaceChild(cImg,cloneCanvases[ci]);\n}catch(ce){}\n}\nvar origImgs=root.querySelectorAll('img');\nvar cloneImgs=clone.querySelectorAll('img');\nfor(var ii=0;ii\u003corigImgs.length;ii++){\ntry{\nif(origImgs[ii].src\u0026amp;\u0026amp;origImgs[ii].src.indexOf('data:')!==0\u0026amp;\u0026amp;origImgs[ii].naturalWidth\u003e0){\nvar cv=document.createElement('canvas');\ncv.width=origImgs[ii].naturalWidth;\ncv.height=origImgs[ii].naturalHeight;\ncv.getContext('2d').drawImage(origImgs[ii],0,0);\ncloneImgs[ii].src=cv.toDataURL('image\/png');\n}\n}catch(ie){}\n}\nvar styles='';\nvar sheets=document.styleSheets;\nfor(var si=0;si\u003csheets.length;si++){\ntry{\nvar rules=sheets[si].cssRules;\nfor(var ri=0;ri\u003crules.length;ri++)styles+=rules[ri].cssText+' ';\n}catch(se){}\n}\nvar rect=root.getBoundingClientRect();\nparent.postMessage({type:'widget:screenshotData',html:clone.innerHTML,css:styles,width:Math.ceil(rect.width),height:Math.ceil(rect.height)},'*');\n}catch(ex){\nparent.postMessage({type:'widget:screenshotData',error:String(ex)},'*');\n}\n})();\nbreak;\n}\n});\n\ndocument.addEventListener('click',function(e){\nvar a=e.target\u0026amp;\u0026amp;e.target.closest?e.target.closest('a[href]'):null;\nif(!a)return;var h=a.getAttribute('href');\nif(!h||h.charAt(0)==='#')return;\ne.preventDefault();\nparent.postMessage({type:'widget:link',href:h},'*');\n});\n\nwindow.__widgetSendMessage=function(t){\nif(typeof t!=='string'||t.length\u003e500)return;\nparent.postMessage({type:'widget:sendMessage',text:t},'*');\n};\n\ntry{\nvar _mo=new MutationObserver(function(muts){\nvar sh=false,gh=false;\nfor(var i=0;i\u003cmuts.length;i++){\nvar m=muts[i];\nif(m.type==='attributes'\u0026amp;\u0026amp;m.attributeName){\nvar an=m.attributeName.toLowerCase();\nif(an.indexOf('data-')===0||an.indexOf('aria-')===0)continue;\nif(an==='title'||an==='alt'||an==='role'||an==='placeholder')continue;\n          if(m.target\u0026amp;\u0026amp;m.target.closest\u0026amp;\u0026amp;m.target.closest('svg')\u0026amp;\u0026amp;an==='viewbox')continue;\n}\nsh=true;\nif(m.target\u0026amp;\u0026amp;m.target.closest\u0026amp;\u0026amp;m.target.closest('svg'))gh=true;\n}\nif(sh)scheduleHeight();if(gh)scheduleGeometry();\n});\n_mo.observe(root,{childList:true,subtree:true,attributes:true,characterData:true});\n}catch(e){}\nwindow.addEventListener('load',function(e){\nvar tn=e.target\u0026amp;\u0026amp;e.target.tagName?e.target.tagName.toUpperCase():'';\nif(tn==='IMG'||tn==='IFRAME')_h();\n},true);\nif(document.fonts\u0026amp;\u0026amp;document.fonts.ready)document.fonts.ready.then(function(){_h();scheduleGeometry();});\n\nparent.postMessage({type:'widget:ready'},'*');\n})();\u003c\/script\u003e\n\u003cdiv id='\"__root\"'\u003e\u003c\/div\u003e\n\u003cscript\u003e(function(){\nvar root=document.getElementById('__root');\nvar _t=null,_gt=null,_st=null,_first=true;\nfunction scheduleGeometry(){if(_gt)clearTimeout(_gt);_gt=setTimeout(_geo,60);}\nfunction scheduleHeight(){if(_st)return;_st=setTimeout(function(){_st=null;_h();},60);}\nvar _finalized=false;\nvar _frozen=false;\n\/\/ Runaway layout-loop detector (e.g. a Chart.js responsive canvas reflowing\n\/\/ every frame). Freeze only when the high reflow rate PERSISTS across several\n\/\/ consecutive windows: a cold-load settle is a one-off burst that then stops,\n\/\/ so requiring persistence avoids freezing healthy widgets mid-settle at a\n\/\/ too-small height.\nvar _hWinStart=0,_hCalls=0,_hBusyWins=0;\nvar _HOT_PER_WIN=20,_HOT_WINS=4;\nvar _fSamples=[],_fInt=null,_fRecs=0;\nvar _pinned=[];\nvar _evalStability=(function Mi(e,t,r){if(typeof r\u003e\u0026quot;u\u0026quot;\u0026amp;\u0026amp;(r=20),e.length\u003c2)return{status:\u0026quot;undecided\u0026quot;};var a=e[e.length-1],o=e[e.length-2];return a-o\u003e20?{status:\u0026quot;runaway\u0026quot;}:Math.abs(a-o)\u003c4\u0026amp;\u0026amp;Math.abs(a-t)\u003e8?{status:\u0026quot;stable\u0026quot;,stableHeight:a}:e.length\u003e=r?{status:\u0026quot;runaway\u0026quot;}:e.length\u003c5?{status:\u0026quot;undecided\u0026quot;}:{status:\u0026quot;runaway\u0026quot;}});\nfunction _thaw(){\n_frozen=false;\ntry{\nfor(var j=0;j\u003c_pinned.length;j++){\nvar item=_pinned[j];\nfor(var k=0;k\u003citem.p.length;k++)item.el.style.removeProperty(item.p[k]);\n}\n}catch(e){}finally{\n_pinned=[];\n_hBusyWins=0;_hCalls=0;_hWinStart=0;\nif(_fInt){clearInterval(_fInt);_fInt=null;}\n_fSamples=[];\ntry{\n_ro.observe(document.body);\n_ro.observe(document.documentElement);\nif(root)_ro.observe(root);\n}catch(e2){}\n}\n}\nfunction _selfFreeze(){\nif(_frozen)return;\n_frozen=true;\nif(_t){clearTimeout(_t);_t=null;}\ntry{_ro.disconnect();}catch(_e){}\n\/\/ The feedback engine is the chart library's OWN ResizeObserver, which\n\/\/ watches the canvas's PARENT (responsive:true). By the time we get here\n\/\/ the loop has already inflated the canvas\/ancestors to a huge height, so\n\/\/ we must NOT pin them at their current (runaway) size — that locks in the\n\/\/ giant empty box seen in the wild. Instead: (1) cap each canvas to a sane\n\/\/ height derived from its own width (a chart wider than tall is the norm),\n\/\/ (2) reflow so ancestors collapse to fit, (3) THEN pin the collapsed\n\/\/ ancestors so the library reads a constant parent size and the circular\n\/\/ reference resolves.\ntry{\n_pinned=[];\nvar cs=root?root.querySelectorAll('canvas'):[];\nfor(var i=0;i\u003ccs.length;i++){\nvar node=cs[i];\nvar cw=node.getBoundingClientRect().width||node.offsetWidth||0;\n\/\/ Cap to the canvas width but never taller than 420px; a runaway chart is\n\/\/ always inflated past this, a healthy one never reaches freeze at all.\nvar cap=cw\u003e0?Math.min(cw,420):360;\nnode.style.setProperty('height',cap+'px','important');\nnode.style.setProperty('max-height',cap+'px','important');\n_pinned.push({el:node,p:['height','max-height']});\n}\n\/\/ Force reflow so ancestor heights recompute against the capped canvases.\nif(root)void root.getBoundingClientRect();\nfor(var k=0;k\u003ccs.length;k++){\nvar anc=cs[k].parentElement;\nwhile(anc\u0026amp;\u0026amp;anc!==root.parentElement){\nvar ah=anc.getBoundingClientRect().height||anc.offsetHeight||0;\nif(ah\u003e0){\nanc.style.setProperty('height',ah+'px','important');\nanc.style.setProperty('overflow','hidden','important');\n_pinned.push({el:anc,p:['height','overflow']});\n}\nif(anc===root)break;\nanc=anc.parentElement;\n}\n}\n}catch(_e2){}\nif(root){\nroot.style.setProperty('overflow','hidden','important');\n_pinned.push({el:root,p:['overflow']});\n}\n\/\/ Report the now-stable height once so the host locks the iframe.\nvar fh=root?Math.max(root.getBoundingClientRect().height,root.scrollHeight,root.offsetHeight):0;\nif(fh\u003e0)parent.postMessage({type:'widget:resize',height:fh,frozen:true},'*');\n\n\/\/ Recovery mechanism: check if layout stabilizes at a different height after freeze.\n\/\/ Why: pin 后完全定格的布局对 scrollHeight 采样是盲的（样本恒等于冻结高度），\n\/\/ 此机制只能恢复 freeze 误落在 settle 进行中的场景。\nif(_fRecs\u003c2\u0026amp;\u0026amp;!_fInt){\n_fSamples=[];\n_fInt=setInterval(function(){\nif(!root)return;\nvar sh=root.scrollHeight;\n_fSamples.push(sh);\nvar res=_evalStability(_fSamples,fh);\nif(res.status==='stable'){\n_fRecs++;\n_thaw();\nparent.postMessage({type:'widget:resize',height:res.stableHeight,recovered:true},'*');\n}else if(res.status==='runaway'){\nclearInterval(_fInt);_fInt=null;\n}\n},1000);\n}\n}\nfunction _h(){\nif(_frozen)return;\nvar _now=Date.now();\nif(_now-_hWinStart\u003e400){\n\/\/ Window closed: extend the hot streak if it was hot, else reset it.\nif(_hCalls\u003e_HOT_PER_WIN)_hBusyWins++;else _hBusyWins=0;\n_hWinStart=_now;_hCalls=1;\n}else{\n_hCalls++;\nif(_hCalls\u003e_HOT_PER_WIN\u0026amp;\u0026amp;_hBusyWins\u003e=_HOT_WINS-1){_selfFreeze();return;}\n}\nif(_t)clearTimeout(_t);\n_t=setTimeout(function(){\nvar bodyStyle=document.body ? getComputedStyle(document.body) : null;\nvar bodyPadding=bodyStyle\n  ? (parseFloat(bodyStyle.paddingTop||'0')||0) + (parseFloat(bodyStyle.paddingBottom||'0')||0)\n  : 0;\nvar rootH=Math.max(\n  root ? root.getBoundingClientRect().height : 0,\n  root ? root.scrollHeight : 0,\n  root ? root.offsetHeight : 0\n);\nvar bodyH=Math.max(\n  document.body ? document.body.scrollHeight : 0,\n  document.body ? document.body.offsetHeight : 0\n);\nvar h=rootH\u003e0 ? rootH + bodyPadding : Math.min(bodyH,360);\nif(h\u003c=0){\n  var vh=Math.max(\n    window.innerHeight||0,\n    document.documentElement ? document.documentElement.clientHeight : 0\n  );\n  h=Math.min(vh,360);\n}\nif(h\u003e0)parent.postMessage({type:'widget:resize',height:h,first:_first},'*');\n_first=false;\n},60);\n}\nvar _ro=new ResizeObserver(_h);\n_ro.observe(document.body);\n_ro.observe(document.documentElement);\nif(root)_ro.observe(root);\n\nfunction _geo(){\ntry{\nvar svgs=root.querySelectorAll('svg[viewBox]');\nvar issues=[];\nfor(var i=0;i\u003csvgs.length;i++){\nvar svg=svgs[i];\nif(svg.parentElement\u0026amp;\u0026amp;svg.parentElement.closest('svg'))continue;\ntry{\nvar bb=svg.getBBox();\nvar vbStr=svg.getAttribute('viewBox');\nvar vb=vbStr.split(\/[\\s,]+\/).map(parseFloat);\nif(vb.length!==4||isNaN(vb[0])||isNaN(vb[1])||isNaN(vb[2])||isNaN(vb[3]))continue;\nvar E=0;\ntry{\nvar els=svg.querySelectorAll('*');\nvar maxSW=0;\nfor(var j=0;j\u003cels.length;j++){\nvar swStr=els[j].getAttribute('stroke-width')||els[j].style.strokeWidth;\nif(swStr){\nvar sw=parseFloat(swStr);\nif(!isNaN(sw)\u0026amp;\u0026amp;sw\u003emaxSW)maxSW=sw;\n}\n}\nE=maxSW\/2;\nif(svg.querySelector('[marker-end],[marker-start],[marker-mid]'))E+=12;\n}catch(e){E=0;}\nvar vx=vb[0],vy=vb[1],vw=vb[2],vh=vb[3],PAD=24,EPS=2;\nvar left=bb.x-E,top=bb.y-E,right=bb.x+bb.width+E,bottom=bb.y+bb.height+E;\nvar isOv=left\u003cvx-EPS||top\u003cvy-EPS||right\u003evx+vw+EPS||bottom\u003evy+vh+EPS;\nif(isOv){\nvar nvx=Math.min(vx,left-PAD),nvy=Math.min(vy,top-PAD);\nvar nvw=Math.max(vx+vw,right+PAD)-nvx,nvh=Math.max(vy+vh,bottom+PAD)-nvy;\nvar nvbStr=[nvx,nvy,nvw,nvh].join(' ');\nif(nvbStr!==vbStr){\nsvg.setAttribute('viewBox',nvbStr);\nif(left\u003cvx-EPS)issues.push({kind:'overflow',direction:'left',amount:Math.round(vx-left)});\nif(top\u003cvy-EPS)issues.push({kind:'overflow',direction:'top',amount:Math.round(vy-top)});\nif(right\u003evx+vw+EPS)issues.push({kind:'overflow',direction:'right',amount:Math.round(right-(vx+vw))});\nif(bottom\u003evy+vh+EPS)issues.push({kind:'overflow',direction:'bottom',amount:Math.round(bottom-(vy+vh))});\n}\n}\n}catch(e){}\n}\nif(issues.length)parent.postMessage({type:'widget:geometry',fixed:true,issues:issues},'*');\n}catch(e){}\n}\n\nfunction applyHtml(html){\nif(_finalized)return;\nroot.innerHTML=html;\n_h();\n}\n\nfunction finalizeHtml(html){\n_finalized=true;\n_thaw();\n\/\/ Parse finalized HTML in a temp container to separate scripts from content\nvar tmp=document.createElement('div');\ntmp.innerHTML=html;\nvar ss=tmp.querySelectorAll('script');\nvar scripts=[];\nfor(var i=0;i\u003css.length;i++){\nscripts.push({src:ss[i].src||'',text:ss[i].textContent||'',attrs:[]});\nfor(var j=0;j\u003css[i].attributes.length;j++){\nvar a=ss[i].attributes[j];\nif(a.name!=='src')scripts[scripts.length-1].attrs.push({name:a.name,value:a.value});\n}\nss[i].remove();\n}\n\/\/ Update non-script content only if it differs (avoids repaint flash)\nvar visualHtml=tmp.innerHTML;\nif(root.innerHTML!==visualHtml)root.innerHTML=visualHtml;\n\/\/ Execute scripts in sequence so inline init code waits for external CDNs.\nfunction runNext(idx){\nif(idx\u003e=scripts.length){\nscheduleGeometry();\n_h();\nparent.postMessage({type:'widget:styled'},'*');\nreturn;\n}\nvar s=scripts[idx];\nvar n=document.createElement('script');\nfor(var j=0;j\u003cs.attrs.length;j++)n.setAttribute(s.attrs[j].name,s.attrs[j].value);\nif(s.src){\nn.onload=function(){runNext(idx+1);};\nn.onerror=function(){runNext(idx+1);};\nn.src=s.src;\nroot.appendChild(n);\nreturn;\n}\nif(s.text)n.textContent=s.text;\nroot.appendChild(n);\nrunNext(idx+1);\n}\nrunNext(0);\n}\n\nwindow.addEventListener('message',function(e){\nif(!e.data)return;\nswitch(e.data.type){\ncase 'widget:update':\napplyHtml(e.data.html);\nbreak;\ncase 'widget:finalize':\nfinalizeHtml(e.data.html);\nsetTimeout(_h,150);\nbreak;\ncase 'widget:theme':\nif(typeof e.data.isDark==='boolean')document.documentElement.className=e.data.isDark?'dark':'';\nsetTimeout(_h,100);\nbreak;\ncase 'widget:measure':\n_thaw();\n_h();\nbreak;\ncase 'widget:screenshot':\n(function(){\nif(!root){parent.postMessage({type:'widget:screenshotData',error:'empty'},'*');return;}\ntry{\nvar clone=root.cloneNode(true);\nvar origCanvases=root.querySelectorAll('canvas');\nvar cloneCanvases=clone.querySelectorAll('canvas');\nfor(var ci=0;ci\u003corigCanvases.length;ci++){\ntry{\nvar cImg=document.createElement('img');\ncImg.src=origCanvases[ci].toDataURL('image\/png');\ncImg.width=origCanvases[ci].offsetWidth||origCanvases[ci].width;\ncImg.height=origCanvases[ci].offsetHeight||origCanvases[ci].height;\ncImg.style.cssText=cloneCanvases[ci].style.cssText;\ncImg.className=cloneCanvases[ci].className;\ncloneCanvases[ci].parentNode.replaceChild(cImg,cloneCanvases[ci]);\n}catch(ce){}\n}\nvar origImgs=root.querySelectorAll('img');\nvar cloneImgs=clone.querySelectorAll('img');\nfor(var ii=0;ii\u003corigImgs.length;ii++){\ntry{\nif(origImgs[ii].src\u0026amp;\u0026amp;origImgs[ii].src.indexOf('data:')!==0\u0026amp;\u0026amp;origImgs[ii].naturalWidth\u003e0){\nvar cv=document.createElement('canvas');\ncv.width=origImgs[ii].naturalWidth;\ncv.height=origImgs[ii].naturalHeight;\ncv.getContext('2d').drawImage(origImgs[ii],0,0);\ncloneImgs[ii].src=cv.toDataURL('image\/png');\n}\n}catch(ie){}\n}\nvar styles='';\nvar sheets=document.styleSheets;\nfor(var si=0;si\u003csheets.length;si++){\ntry{\nvar rules=sheets[si].cssRules;\nfor(var ri=0;ri\u003crules.length;ri++)styles+=rules[ri].cssText+' ';\n}catch(se){}\n}\nvar rect=root.getBoundingClientRect();\nparent.postMessage({type:'widget:screenshotData',html:clone.innerHTML,css:styles,width:Math.ceil(rect.width),height:Math.ceil(rect.height)},'*');\n}catch(ex){\nparent.postMessage({type:'widget:screenshotData',error:String(ex)},'*');\n}\n})();\nbreak;\n}\n});\n\ndocument.addEventListener('click',function(e){\nvar a=e.target\u0026amp;\u0026amp;e.target.closest?e.target.closest('a[href]'):null;\nif(!a)return;var h=a.getAttribute('href');\nif(!h||h.charAt(0)==='#')return;\ne.preventDefault();\nparent.postMessage({type:'widget:link',href:h},'*');\n});\n\nwindow.__widgetSendMessage=function(t){\nif(typeof t!=='string'||t.length\u003e500)return;\nparent.postMessage({type:'widget:sendMessage',text:t},'*');\n};\n\ntry{\nvar _mo=new MutationObserver(function(muts){\nvar sh=false,gh=false;\nfor(var i=0;i\u003cmuts.length;i++){\nvar m=muts[i];\nif(m.type==='attributes'\u0026amp;\u0026amp;m.attributeName){\nvar an=m.attributeName.toLowerCase();\nif(an.indexOf('data-')===0||an.indexOf('aria-')===0)continue;\nif(an==='title'||an==='alt'||an==='role'||an==='placeholder')continue;\n          if(m.target\u0026amp;\u0026amp;m.target.closest\u0026amp;\u0026amp;m.target.closest('svg')\u0026amp;\u0026amp;an==='viewbox')continue;\n}\nsh=true;\nif(m.target\u0026amp;\u0026amp;m.target.closest\u0026amp;\u0026amp;m.target.closest('svg'))gh=true;\n}\nif(sh)scheduleHeight();if(gh)scheduleGeometry();\n});\n_mo.observe(root,{childList:true,subtree:true,attributes:true,characterData:true});\n}catch(e){}\nwindow.addEventListener('load',function(e){\nvar tn=e.target\u0026amp;\u0026amp;e.target.tagName?e.target.tagName.toUpperCase():'';\nif(tn==='IMG'||tn==='IFRAME')_h();\n},true);\nif(document.fonts\u0026amp;\u0026amp;document.fonts.ready)document.fonts.ready.then(function(){_h();scheduleGeometry();});\n\nparent.postMessage({type:'widget:ready'},'*');\n})();\u003c\/script\u003e\n\u003ch2 class=\"text-[1.2rem] font-bold mt-4 pt-4 mb-4 text-zinc-800 dark:text-zinc-200 first:mt-0 first:pt-0 tracking-tight\"\u003e🛠️ SPÉCIFICATIONS TECHNIQUES\u003c\/h2\u003e\n\u003cdiv class=\"my-5 relative flex-1 min-h-0 min-w-0 hover:cursor-default overflow-x-auto overflow-y-hidden phoenix-scrollbar\"\u003e\n\u003cdiv\u003e\n\u003ctable class=\"min-w-full border-collapse text-sm\"\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2 bg-zinc-50 dark:bg-zinc-800\/80 font-semibold text-left text-zinc-700 dark:text-zinc-300\"\u003eCaractéristique\u003c\/th\u003e\n\u003cth class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2 bg-zinc-50 dark:bg-zinc-800\/80 font-semibold text-left text-zinc-700 dark:text-zinc-300\"\u003eSpécification G63 Dual Motor\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2\"\u003e\u003cstrong class=\"font-semibold text-zinc-900 dark:text-zinc-100\"\u003ePuissance Moteur\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2\"\u003e2 x 1200W (Total 2400W Nominal \/ 3000W+ Crête)\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2\"\u003e\u003cstrong class=\"font-semibold text-zinc-900 dark:text-zinc-100\"\u003eBatterie\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2\"\u003e48V 20Ah (Cellules haute densité, amovible)\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2\"\u003e\u003cstrong class=\"font-semibold text-zinc-900 dark:text-zinc-100\"\u003eVitesse Max\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2\"\u003e25 km\/h (Légal) \/ Débridable sur voie privée\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2\"\u003e\u003cstrong class=\"font-semibold text-zinc-900 dark:text-zinc-100\"\u003eAutonomie\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2\"\u003eJusqu'à 60-70 km (Selon mode et terrain)\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2\"\u003e\u003cstrong class=\"font-semibold text-zinc-900 dark:text-zinc-100\"\u003eFreinage\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2\"\u003eDouble disques hydrauliques + E-ABS\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2\"\u003e\u003cstrong class=\"font-semibold text-zinc-900 dark:text-zinc-100\"\u003eSuspensions\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2\"\u003eSystème Triple C-Spring avant\/arrière\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2\"\u003e\u003cstrong class=\"font-semibold text-zinc-900 dark:text-zinc-100\"\u003ePneus\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2\"\u003e11 pouces Off-Road (Vacuum Tubeless)\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2\"\u003e\u003cstrong class=\"font-semibold text-zinc-900 dark:text-zinc-100\"\u003eCharge Max\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2\"\u003e150 kg\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2\"\u003e\u003cstrong class=\"font-semibold text-zinc-900 dark:text-zinc-100\"\u003ePoids\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd class=\"border border-zinc-200 dark:border-zinc-700 px-3 py-2\"\u003e38 kg\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003chr class=\"my-6 border-zinc-200\/80 dark:border-zinc-700\/80\"\u003e\n\u003ch2 class=\"text-[1.2rem] font-bold mt-4 pt-4 mb-4 text-zinc-800 dark:text-zinc-200 first:mt-0 first:pt-0 tracking-tight\"\u003e🛡️ SÉCURITÉ \u0026amp; CONFORMITÉ LÉGALE (FRANCE)\u003c\/h2\u003e\n\u003cp class=\"!mt-2 !mb-2 leading-relaxed\"\u003eChez\u003cspan\u003e \u003c\/span\u003e\u003cstrong class=\"font-semibold text-zinc-900 dark:text-zinc-100\"\u003eTous et Riens\u003c\/strong\u003e, nous ne transigeons pas avec la sécurité.\u003c\/p\u003e\n\u003cul class=\"my-5 space-y-3 leading-[1.85] pl-5\"\u003e\n\u003cli class=\"leading-[1.85] pl-1\"\u003e\n\u003cstrong class=\"font-semibold text-zinc-900 dark:text-zinc-100\"\u003eConformité EDPM\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e: La trottinette est livrée bridée électroniquement à\u003cspan\u003e \u003c\/span\u003e\u003cstrong class=\"font-semibold text-zinc-900 dark:text-zinc-100\"\u003e25 km\/h\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003econformément au décret n° 2019-1082.\u003c\/li\u003e\n\u003cli class=\"leading-[1.85] pl-1\"\u003e\n\u003cstrong class=\"font-semibold text-zinc-900 dark:text-zinc-100\"\u003eÉclairage 360°\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e: Phares LED ultra-puissants à l'avant, feux de position latéraux et feu stop arrière pour une visibilité maximale.\u003c\/li\u003e\n\u003cli class=\"leading-[1.85] pl-1\"\u003e\n\u003cstrong class=\"font-semibold text-zinc-900 dark:text-zinc-100\"\u003eAssurance\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e: Nous vous rappelons que l'assurance Responsabilité Civile (RC) est obligatoire pour circuler sur la voie publique en France.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003chr class=\"my-6 border-zinc-200\/80 dark:border-zinc-700\/80\"\u003e\n\u003ch3 class=\"text-base font-semibold mt-3 pt-3 mb-3 text-zinc-800 dark:text-zinc-200 first:mt-0 first:pt-0 tracking-tight\"\u003e📦 Contenu du pack :\u003c\/h3\u003e\n\u003col class=\"my-5 space-y-3 leading-[1.85] [\u0026amp;_li\u0026gt;p:first-child]:inline [\u0026amp;_li\u0026gt;p:first-child]:m-0\" style=\"box-sizing: border-box; border: 0px solid; margin: 0px; padding: 0px 0px 0px 20px; list-style: decimal; margin-block: calc(var(--spacing)*1.5); --tw-leading: 1.85; line-height: 1.85; scrollbar-width: none; overflow-wrap: break-word; max-width: 100%; color: oklch(0.274 0.006 286.033); font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'SF Pro', Inter, 'Segoe UI', 'PingFang SC', 'Noto Sans CJK SC', 'Source Han Sans SC', 'WenQuanYi Micro Hei', 'Noto Sans', Roboto, 'Helvetica Neue', Helvetica, Arial, 'Microsoft YaHei', sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\"\u003e\n\u003cli class=\"leading-[1.85] pl-1\"\u003eTrottinette G63 Dual Motor\u003c\/li\u003e\n\u003cli class=\"leading-[1.85] pl-1\"\u003eBatterie amovible\u003c\/li\u003e\n\u003cli class=\"leading-[1.85] pl-1\"\u003eChargeur rapide intelligent\u003c\/li\u003e\n\u003cli class=\"leading-[1.85] pl-1\"\u003eKit d'outils de maintenance\u003c\/li\u003e\n\u003cli class=\"leading-[1.85] pl-1\"\u003eManuel d'utilisation (FR)\u003c\/li\u003e\n\u003c\/ol\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"tousetriens.com","offers":[{"title":"CM","offer_id":64239665742201,"sku":null,"price":945.88,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0961\/8404\/1849\/files\/ChatGPTImage16aout2026_00_20_30.png?v=1786903075","url":"https:\/\/www.tousetriens.com\/products\/trottinette-electrique-tout-terrain-g63-gyroor-1200w-copie","provider":"tousetriens.com","version":"1.0","type":"link"}