{"id":200181,"date":"2025-10-17T09:11:43","date_gmt":"2025-10-17T07:11:43","guid":{"rendered":"https:\/\/fivemx.com\/?p=200181"},"modified":"2025-12-23T16:42:44","modified_gmt":"2025-12-23T15:42:44","slug":"editeur-de-maniabilite-du-vehicule-fivem","status":"publish","type":"post","link":"https:\/\/fivemx.com\/fr\/fivem-vehicle-handling-editor\/","title":{"rendered":"\u00c9diteur de comportement des v\u00e9hicules FiveM \u2013 Personnaliser la physique des voitures"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">This tool allows to modify your vehicle handling file<\/p>\n\n\n\n<!-- FiveM Handling Editor \u2013 Pure HTML\/JS (no PHP) -->\n\n  .fhe-wrap{&#8211;bg:#0f1115;&#8211;fg:#e6e8eb;&#8211;muted:#97a1ab;&#8211;acc:#4f8cff;&#8211;accent2:#00c2a8;&#8211;border:#1b1f2a;&#8211;card:#141822;&#8211;warn:#ffcc00;font-family:system-ui,-apple-system,Segoe UI,Roboto,Inter,Arial,sans-serif;color:var(&#8211;fg)}\n  .fhe-wrap{background:var(&#8211;bg);padding:24px;border-radius:16px;box-shadow:0 10px 30px rgba(0,0,0,.35);max-width:1100px;margin:24px auto;border:1px solid var(&#8211;border)}\n  .fhe-top{display:flex;gap:12px;flex-wrap:wrap;align-items:center;justify-content:space-between;margin-bottom:16px}\n  .fhe-title{font-size:18px;font-weight:700;letter-spacing:.2px}\n  .fhe-controls{display:flex;gap:8px;flex-wrap:wrap}\n  .fhe-btn{background:var(&#8211;card);border:1px solid var(&#8211;border);color:var(&#8211;fg);padding:8px 12px;border-radius:10px;cursor:pointer;transition:.15s;line-height:1}\n  .fhe-btn:hover{border-color:#2d3342;transform:translateY(-1px)}\n  .fhe-btn.primary{background:linear-gradient(180deg,var(&#8211;acc),#2b5fd9);border-color:#2b5fd9;color:white}\n  .fhe-btn.secondary{background:linear-gradient(180deg,var(&#8211;accent2),#0aa890);border-color:#0aa890;color:white}\n  .fhe-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}\n  @media (max-width:1000px){.fhe-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}\n  @media (max-width:640px){.fhe-grid{grid-template-columns:1fr}}\n  .fhe-card{background:var(&#8211;card);border:1px solid var(&#8211;border);border-radius:14px;padding:14px}\n  .fhe-card h3{margin:0 0 10px;font-size:14px;color:#c7d2e1;letter-spacing:.3px}\n  .fhe-field{display:flex;flex-direction:column;gap:6px}\n  .fhe-label{display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(&#8211;muted)}\n  .fhe-input{width:100%;padding:8px 10px;border-radius:10px;border:1px solid #2a3141;background:#0e121a;color:var(&#8211;fg);outline:none}\n  .fhe-input:focus{border-color:var(&#8211;acc);box-shadow:0 0 0 3px rgba(79,140,255,.15)}\n  .fhe-metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-top:10px}\n  @media (max-width:1000px){.fhe-metrics{grid-template-columns:repeat(2,minmax(0,1fr))}}\n  @media (max-width:640px){.fhe-metrics{grid-template-columns:1fr}}\n  .fhe-kpi{background:linear-gradient(180deg,#121725,#0d111a);border:1px solid var(&#8211;border);border-radius:12px;padding:12px}\n  .fhe-kpi .kpi-h{font-size:11px;color:#9aa7b5;margin-bottom:6px}\n  .fhe-kpi .kpi-v{font-size:18px;font-weight:700}\n  .fhe-row{display:flex;gap:12px;flex-wrap:wrap;margin-top:16px}\n  .fhe-col{flex:1;min-width:280px}\n  textarea.fhe-text{width:100%;min-height:180px;background:#0e121a;color:var(&#8211;fg);border:1px solid #2a3141;border-radius:12px;padding:10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}\n  .fhe-subtle{font-size:12px;color:var(&#8211;muted)}\n  .fhe-badge{display:inline-block;background:#0e243f;border:1px solid #163a6b;color:#a7c5ff;padding:2px 8px;border-radius:999px;font-size:11px;margin-left:8px}\n  .fhe-help{font-size:12px;color:#99a7b8;margin-top:8px}\n  .fhe-sep{height:1px;background:var(&#8211;border);margin:14px 0}\n  .fhe-note{background:#1b1f2a;border:1px dashed #2e3446;color:#dfdfdf;border-radius:12px;padding:10px;font-size:12px}\n  .fhe-warn{color:var(&#8211;warn)}\n\n\n<div class=\"fhe-wrap\" id=\"fhe-root\">\n  <div class=\"fhe-top\">\n    <div class=\"fhe-title\">FiveM Handling Editor <span class=\"fhe-badge\">Lite \u2022 Embed<\/span><\/div>\n    <div class=\"fhe-controls\">\n      <button class=\"fhe-btn\" data-action=\"load-example\">Load Example<\/button>\n      <button class=\"fhe-btn\" data-action=\"reset\">Reset<\/button>\n      <button class=\"fhe-btn\" data-action=\"save\">Save<\/button>\n      <button class=\"fhe-btn\" data-action=\"export-xml\" title=\"Export handling.xml\">Export XML<\/button>\n      <button class=\"fhe-btn\" data-action=\"export-kv\" title=\"Export key=value\">Export KV<\/button>\n      <button class=\"fhe-btn secondary\" data-action=\"copy-output\">Copy Output<\/button>\n      <button class=\"fhe-btn primary\" data-action=\"download-xml\">Download XML<\/button>\n    <\/div>\n  <\/div>\n\n  <div class=\"fhe-metrics\" id=\"fhe-metrics\"><\/div>\n  <div class=\"fhe-grid\" id=\"fhe-grid\"><\/div>\n\n  <div class=\"fhe-row\">\n    <div class=\"fhe-col fhe-card\">\n      <h3>Import<\/h3>\n      <div class=\"fhe-field\">\n        <label class=\"fhe-label\">Paste XML (&lt;Item&gt; or &lt;HandlingData&gt;) or key\/value (e.g., <em>fMass=1600.0<\/em>)<\/label>\n        <textarea class=\"fhe-text\" id=\"fhe-import\"><\/textarea>\n      <\/div>\n      <div class=\"fhe-row\" style=\"margin-top:10px\">\n        <button class=\"fhe-btn\" data-action=\"import-xml\">Parse XML<\/button>\n        <button class=\"fhe-btn\" data-action=\"import-kv\">Parse KV<\/button>\n      <\/div>\n      <div class=\"fhe-help\">KV formats: <code>fMass=1600.0<\/code>, <code>fMass 1600.0<\/code>, or <code>&lt;fMass value=&quot;1600.0&quot;\/&gt;<\/code>.<\/div>\n    <\/div>\n    <div class=\"fhe-col fhe-card\">\n      <h3>Output<\/h3>\n      <textarea class=\"fhe-text\" id=\"fhe-output\" readonly><\/textarea>\n      <div class=\"fhe-help\">Use <b>Copy Output<\/b> or <b>Download XML<\/b>.<\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"fhe-sep\"><\/div>\n  <div class=\"fhe-note\">\n    <b>Notes<\/b>: Estimates are indicative. Test in-game. Values persist locally (localStorage).\n    <br>AWD\/RWD: <code>fDriveBiasFront<\/code> \u2192 0 = RWD, 1 = FWD, 0.5 = AWD.\n    <br><span class=\"fhe-warn\">Privacy:<\/span> 100% client-side. No data leaves the page.\n  <\/div>\n<\/div>\n\n\n(function(){\n  const KEY = &#8216;fhe_state_v1&#8217;;\n  const $ = (s, r=document)=&gt;r.querySelector(s);\n  const root = $(&#8216;#fhe-root&#8217;);\n  if(!root) return;\n\n  const FIELDS = {\n    HandlingName: { label: &#8216;HandlingName&#8217;, type:&#8217;text&#8217; },\n    fMass: { label: &#8216;fMass&#8217;, min:1, max:10000, step:1 },\n    fInitialDragCoeff: { label: &#8216;fInitialDragCoeff&#8217;, min:0, max:100, step:0.1 },\n    fPercentSubmerged: { label: &#8216;fPercentSubmerged&#8217;, min:0, max:200, step:1 },\n    fDriveBiasFront: { label: &#8216;fDriveBiasFront (0=RWD,1=FWD)&#8217;, min:0, max:1, step:0.01 },\n    nInitialDriveGears: { label: &#8216;nInitialDriveGears&#8217;, min:1, max:10, step:1 },\n    fInitialDriveForce: { label: &#8216;fInitialDriveForce&#8217;, min:0, max:2, step:0.01 },\n    fDriveInertia: { label: &#8216;fDriveInertia&#8217;, min:0.1, max:5, step:0.01 },\n    fClutchChangeRateScaleUpShift: { label: &#8216;fClutchChangeRateScaleUpShift&#8217;, min:0, max:10, step:0.1 },\n    fClutchChangeRateScaleDownShift: { label: &#8216;fClutchChangeRateScaleDownShift&#8217;, min:0, max:10, step:0.1 },\n    fInitialDriveMaxFlatVel: { label: &#8216;fInitialDriveMaxFlatVel (approx m\/s)&#8217;, min:1, max:500, step:0.1 },\n    fBrakeForce: { label: &#8216;fBrakeForce&#8217;, min:0, max:10, step:0.01 },\n    fHandBrakeForce: { label: &#8216;fHandBrakeForce&#8217;, min:0, max:10, step:0.01 },\n    fSteeringLock: { label: &#8216;fSteeringLock (deg)&#8217;, min:1, max:90, step:0.1 },\n    fTractionCurveMax: { label: &#8216;fTractionCurveMax&#8217;, min:0, max:10, step:0.01 },\n    fTractionCurveMin: { label: &#8216;fTractionCurveMin&#8217;, min:0, max:10, step:0.01 },\n    fSuspensionForce: { label: &#8216;fSuspensionForce&#8217;, min:0, max:20, step:0.1 },\n    fSuspensionCompDamp: { label: &#8216;fSuspensionCompDamp&#8217;, min:0, max:10, step:0.1 },\n    fSuspensionReboundDamp: { label: &#8216;fSuspensionReboundDamp&#8217;, min:0, max:10, step:0.1 },\n    fRollCentreHeightFront: { label: &#8216;fRollCentreHeightFront&#8217;, min:-1, max:2, step:0.01 },\n    fRollCentreHeightRear: { label: &#8216;fRollCentreHeightRear&#8217;, min:-1, max:2, step:0.01 }\n  };\n\n  const DEFAULTS = {\n    HandlingName: &#8216;ADDER&#8217;,\n    fMass: 1600,\n    fInitialDragCoeff: 7.0,\n    fPercentSubmerged: 85,\n    fDriveBiasFront: 0.0,\n    nInitialDriveGears: 6,\n    fInitialDriveForce: 0.35,\n    fDriveInertia: 1.0,\n    fClutchChangeRateScaleUpShift: 2.5,\n    fClutchChangeRateScaleDownShift: 2.0,\n    fInitialDriveMaxFlatVel: 150.0,\n    fBrakeForce: 1.0,\n    fHandBrakeForce: 0.7,\n    fSteeringLock: 40.0,\n    fTractionCurveMax: 2.30,\n    fTractionCurveMin: 2.10,\n    fSuspensionForce: 2.50,\n    fSuspensionCompDamp: 1.40,\n    fSuspensionReboundDamp: 1.70,\n    fRollCentreHeightFront: 0.30,\n    fRollCentreHeightRear: 0.30\n  };\n\n  const grid = $(&#8216;#fhe-grid&#8217;);\n  const metrics = $(&#8216;#fhe-metrics&#8217;);\n  const outArea = $(&#8216;#fhe-output&#8217;);\n  const inArea = $(&#8216;#fhe-import&#8217;);\n\n  let state = load() || {&#8230;DEFAULTS};\n\n  function load(){ try{ const raw = localStorage.getItem(KEY); return raw? JSON.parse(raw):null; }catch(e){ return null; } }\n  function save(){ try{ localStorage.setItem(KEY, JSON.stringify(state)); }catch(e){} }\n\n  function fmt(n,d=3){ return (typeof n===&#8217;number&#8217;&amp;&amp;isFinite(n)) ? Number(n.toFixed(d)).toString() : &#8216;\u2014&#8217;; }\n  function clamp(v,min,max){ return Math.max(min, Math.min(max, v)); }\n  function escapeAttr(s){ return String(s).replace(\/&amp;\/g,&#8217;&amp;&#8217;).replace(\/&#8221;\/g,&#8217;&quot;&#8217;).replace(\/{\n      const value = state[k] ?? &#8221;;\n      const isText = m.type===&#8217;text&#8217;;\n      const card = document.createElement(&#8216;div&#8217;);\n      card.className = &#8216;fhe-card&#8217;;\n      card.innerHTML = `\n        <div class=\"fhe-field\">\n          <div class=\"fhe-label\"><span>${m.label}<\/span><span class=\"fhe-subtle\">${k}<\/span><\/div>\n          \n        <\/div>`;\n      grid.appendChild(card);\n    });\n    Object.keys(FIELDS).forEach(k=&gt;{\n      const el = $(&#8216;#fhe-&#8216;+cssEscape(k));\n      el.addEventListener(&#8216;input&#8217;,()=&gt;{\n        const meta = FIELDS[k];\n        if(meta.type===&#8217;text&#8217;){ state[k] = el.value.trim(); }\n        else { const n = Number(el.value); if(!isNaN(n)) state[k]=n; }\n        save(); renderMetrics();\n      },{passive:true});\n    });\n  }\n\n  function renderMetrics(){\n    const kmh = state.fInitialDriveMaxFlatVel * 3.6;\n    const accelScore = clamp((state.fInitialDriveForce * state.fDriveInertia * 900)\/Math.max(500,state.fMass),0,10);\n    const gripScore  = clamp(((state.fTractionCurveMin+state.fTractionCurveMax)\/2)*(1.6 &#8211; (state.fMass\/4000)),0,10);\n    const brakeScore = clamp(state.fBrakeForce * (1600\/state.fMass) * 3,0,10);\n    metrics.innerHTML = `\n      <div class=\"fhe-kpi\"><div class=\"kpi-h\">Estimated Top Speed<\/div><div class=\"kpi-v\">${fmt(kmh,0)} km\/h<\/div><div class=\"fhe-help\"><code>fInitialDriveMaxFlatVel \u00d7 3.6<\/code><\/div><\/div>\n      <div class=\"fhe-kpi\"><div class=\"kpi-h\">Accel Score<\/div><div class=\"kpi-v\">${fmt(accelScore,1)} \/ 10<\/div><div class=\"fhe-help\">Mass \u2022 Force \u2022 Inertia<\/div><\/div>\n      <div class=\"fhe-kpi\"><div class=\"kpi-h\">Grip Score<\/div><div class=\"kpi-v\">${fmt(gripScore,1)} \/ 10<\/div><div class=\"fhe-help\">Traction &amp; mass<\/div><\/div>\n      <div class=\"fhe-kpi\"><div class=\"kpi-h\">Brake Score<\/div><div class=\"kpi-v\">${fmt(brakeScore,1)} \/ 10<\/div><div class=\"fhe-help\">Brake force &amp; mass<\/div><\/div>\n    `;\n  }\n\n  function toXML(){\n    const x=(k,v)=&gt;`    `;\n    const body = Object.keys(FIELDS).map(k=&gt;x(k,state[k]??&#8221;)).join(&#8216;\\n&#8217;);\n    const header = &#8221;; \/* avoid &#8216;&lt;?xml&#039; *\/\n    return `${header}\n\n  \n${body}\n  \n`;\n  }\n  function toKV(){\n    return Object.keys(FIELDS).map(k=&gt;{\n      const v = state[k]??&#8221;; return `${k}=${typeof v===&#8217;number&#8217;?Number(v).toFixed(6):v}`;\n    }).join(&#8216;\\n&#8217;);\n  }\n\n  function parseXML(text){\n    try{\n      const doc = new DOMParser().parseFromString(text,&#8217;application\/xml&#8217;);\n      if(doc.querySelector(&#8216;parsererror&#8217;)) return null;\n      const next = {&#8230;state};\n      Object.keys(FIELDS).forEach(k=&gt;{\n        const el = doc.querySelector(k); if(!el) return;\n        let val = el.getAttribute(&#8216;value&#8217;); if(val==null) val = el.textContent;\n        if(val==null) return;\n        const meta = FIELDS[k];\n        if(meta.type===&#8217;text&#8217;) next[k] = String(val).trim();\n        else { const n = Number(val); if(!isNaN(n)) next[k]=n; }\n      });\n      return next;\n    }catch(e){ return null; }\n  }\n  function parseKV(text){\n    const next = {&#8230;state};\n    const lines = text.split(\/\\r?\\n\/).map(s=&gt;s.trim()).filter(Boolean);\n    for(const line of lines){\n      let m = line.match(\/^\\s*([a-zA-Z0-9_]+)\\s*=\\s*(&#8220;?)([^&#8221;]+)\\2\\s*$\/)\n           || line.match(\/^\\s*([a-zA-Z0-9_]+)\\s+([^\\s]+)\\s*$\/)\n           || line.match(\/^\\s*]*\\bvalue\\s*=\\s*&#8221;(.*?)&#8221;[^&gt;]*\\\/?&gt;\\s*$\/);\n      if(!m) continue;\n      const key = m[1], val = m[3] ?? m[2];\n      if(!(key in FIELDS)) continue;\n      const meta = FIELDS[key];\n      if(meta.type===&#8217;text&#8217;) next[key]=String(val).trim();\n      else { const n = Number(val); if(!isNaN(n)) next[key]=n; }\n    }\n    return next;\n  }\n  function setState(next){\n    state = {&#8230;state, &#8230;next};\n    save(); renderFields(); renderMetrics();\n  }\n  function download(filename,content){\n    const blob = new Blob([content],{type:&#8217;application\/xml;charset=utf-8&#8242;});\n    const url = URL.createObjectURL(blob);\n    const a = document.createElement(&#8216;a&#8217;); a.href=url; a.download=filename; a.click();\n    setTimeout(()=&gt;URL.revokeObjectURL(url),5000);\n  }\n\n  document.getElementById(&#8216;fhe-root&#8217;).addEventListener(&#8216;click&#8217;, (e)=&gt;{\n    const btn = e.target.closest(&#8216;.fhe-btn&#8217;); if(!btn) return;\n    const a = btn.getAttribute(&#8216;data-action&#8217;);\n    if(a===&#8217;reset&#8217;){ setState({&#8230;DEFAULTS}); document.getElementById(&#8216;fhe-output&#8217;).value=&#8221;; document.getElementById(&#8216;fhe-import&#8217;).value=&#8221;; }\n    if(a===&#8217;save&#8217;){ save(); btn.textContent=&#8217;Saved&#8217;; setTimeout(()=&gt;btn.textContent=&#8217;Save&#8217;,900); }\n    if(a===&#8217;load-example&#8217;){\n      setState({\n        HandlingName:&#8217;GODMODEX&#8217;,\n        fMass:1450,fInitialDragCoeff:6.4,fPercentSubmerged:85,fDriveBiasFront:0.05,nInitialDriveGears:7,\n        fInitialDriveForce:0.40,fDriveInertia:1.15,fClutchChangeRateScaleUpShift:3.2,fClutchChangeRateScaleDownShift:2.6,\n        fInitialDriveMaxFlatVel:165,fBrakeForce:1.10,fHandBrakeForce:0.9,fSteeringLock:38.0,fTractionCurveMax:2.45,\n        fTractionCurveMin:2.20,fSuspensionForce:2.7,fSuspensionCompDamp:1.5,fSuspensionReboundDamp:1.8,\n        fRollCentreHeightFront:0.32,fRollCentreHeightRear:0.32\n      });\n    }\n    if(a===&#8217;export-xml&#8217;){ document.getElementById(&#8216;fhe-output&#8217;).value = toXML(); document.getElementById(&#8216;fhe-output&#8217;).scrollIntoView({behavior:&#8217;smooth&#8217;,block:&#8217;center&#8217;}); }\n    if(a===&#8217;export-kv&#8217;){ document.getElementById(&#8216;fhe-output&#8217;).value = toKV(); document.getElementById(&#8216;fhe-output&#8217;).scrollIntoView({behavior:&#8217;smooth&#8217;,block:&#8217;center&#8217;}); }\n    if(a===&#8217;copy-output&#8217;){\n      const ta = document.getElementById(&#8216;fhe-output&#8217;);\n      if(!ta.value) ta.value = toXML();\n      ta.select(); document.execCommand(&#8216;copy&#8217;);\n      btn.textContent=&#8217;Copied&#8217;; setTimeout(()=&gt;btn.textContent=&#8217;Copy Output&#8217;,900);\n    }\n    if(a===&#8217;download-xml&#8217;){ const xml = toXML(); const name = (state.HandlingName||&#8217;handling&#8217;) + &#8216;.xml&#8217;; download(name, xml); }\n  });\n\n  document.querySelector(&#8216;#fhe-root [data-action=&#8221;import-xml&#8221;]&#8217;).addEventListener(&#8216;click&#8217;, ()=&gt;{\n    const txt = document.getElementById(&#8216;fhe-import&#8217;).value.trim(); if(!txt){ alert(&#8216;Paste XML into the Import box.&#8217;); return; }\n    const next = parseXML(txt); if(!next){ alert(&#8216;Could not parse XML.&#8217;); return; }\n    setState(next);\n  });\n  document.querySelector(&#8216;#fhe-root [data-action=&#8221;import-kv&#8221;]&#8217;).addEventListener(&#8216;click&#8217;, ()=&gt;{\n    const txt = document.getElementById(&#8216;fhe-import&#8217;).value.trim(); if(!txt){ alert(&#8216;Paste KV lines into the Import box.&#8217;); return; }\n    const next = parseKV(txt); setState(next);\n  });\n\n  renderFields();\n  renderMetrics();\n})();\n\n\n","protected":false},"excerpt":{"rendered":"<p>This tool allows to modify your vehicle handling file .fhe-wrap{&#8211;bg:#0f1115;&#8211;fg:#e6e8eb;&#8211;muted:#97a1ab;&#8211;acc:#4f8cff;&#8211;accent2:#00c2a8;&#8211;border:#1b1f2a;&#8211;card:#141822;&#8211;warn:#ffcc00;font-family:system-ui,-apple-system,Segoe UI,Roboto,Inter,Arial,sans-serif;color:var(&#8211;fg)} .fhe-wrap{background:var(&#8211;bg);padding:24px;border-radius:16px;box-shadow:0 10px 30px rgba(0,0,0,.35);max-width:1100px;margin:24px auto;border:1px solid var(&#8211;border)} .fhe-top{display:flex;gap:12px;flex-wrap:wrap;align-items:center;justify-content:space-between;margin-bottom:16px} .fhe-title{font-size:18px;font-weight:700;letter-spacing:.2px} .fhe-controls{display:flex;gap:8px;flex-wrap:wrap} .fhe-btn{background:var(&#8211;card);border:1px solid var(&#8211;border);color:var(&#8211;fg);padding:8px 12px;border-radius:10px;cursor:pointer;transition:.15s;line-height:1} .fhe-btn:hover{border-color:#2d3342;transform:translateY(-1px)} .fhe-btn.primary{background:linear-gradient(180deg,var(&#8211;acc),#2b5fd9);border-color:#2b5fd9;color:white} .fhe-btn.secondary{background:linear-gradient(180deg,var(&#8211;accent2),#0aa890);border-color:#0aa890;color:white} .fhe-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px} @media (max-width:1000px){.fhe-grid{grid-template-columns:repeat(2,minmax(0,1fr))}} @media (max-width:640px){.fhe-grid{grid-template-columns:1fr}} .fhe-card{background:var(&#8211;card);border:1px solid var(&#8211;border);border-radius:14px;padding:14px} .fhe-card h3{margin:0 0 10px;font-size:14px;color:#c7d2e1;letter-spacing:.3px} .fhe-field{display:flex;flex-direction:column;gap:6px} .fhe-label{display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(&#8211;muted)} .fhe-input{width:100%;padding:8px 10px;border-radius:10px;border:1px solid #2a3141;background:#0e121a;color:var(&#8211;fg);outline:none} .fhe-input:focus{border-color:var(&#8211;acc);box-shadow:0 0 0 3px rgba(79,140,255,.15)} .fhe-metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-top:10px} @media (max-width:1000px){.fhe-metrics{grid-template-columns:repeat(2,minmax(0,1fr))}} @media [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":200182,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2340,2881,2305,2297],"tags":[],"class_list":["post-200181","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-lua-scripting","category-performance","category-cars","category-free"],"blocksy_meta":{"page_structure_type":"type-4","disable_featured_image":"yes","styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":6}},"_links":{"self":[{"href":"https:\/\/fivemx.com\/fr\/wp-json\/wp\/v2\/posts\/200181","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fivemx.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fivemx.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fivemx.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fivemx.com\/fr\/wp-json\/wp\/v2\/comments?post=200181"}],"version-history":[{"count":0,"href":"https:\/\/fivemx.com\/fr\/wp-json\/wp\/v2\/posts\/200181\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fivemx.com\/fr\/wp-json\/wp\/v2\/media\/200182"}],"wp:attachment":[{"href":"https:\/\/fivemx.com\/fr\/wp-json\/wp\/v2\/media?parent=200181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fivemx.com\/fr\/wp-json\/wp\/v2\/categories?post=200181"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fivemx.com\/fr\/wp-json\/wp\/v2\/tags?post=200181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}