[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-simulateur-revision-pre-vacances-fr":83,"footer-cities-fr":123},[4,14,22,30,38,45,53,60,67,75],{"seo_content":5,"id":8,"name":9,"slug":10,"parentId":7,"lang":11,"_count":12},[6],{"page_slug":7},null,"cmkzhl7xm00dbulbc93h4qog5","Juridique","avocats","fr-FR",{"experts":13},8,{"seo_content":15,"id":17,"name":18,"slug":19,"parentId":7,"lang":11,"_count":20},[16],{"page_slug":7},"cmkzhl84700djulbcbv6pzu9e","Informatique","informaticiens",{"experts":21},3,{"seo_content":23,"id":25,"name":26,"slug":27,"parentId":7,"lang":11,"_count":28},[24],{"page_slug":7},"cmkzhlaos00gnulbc07i9jrco","Amélioration de la Maison","artisans",{"experts":29},4,{"seo_content":31,"id":33,"name":34,"slug":35,"parentId":7,"lang":11,"_count":36},[32],{"page_slug":7},"cmkzhlaqg00gpulbcx38bwoc2","Général","divers-generalistes",{"experts":37},0,{"seo_content":39,"id":41,"name":42,"slug":43,"parentId":7,"lang":11,"_count":44},[40],{"page_slug":7},"cmkzhlbvq00i3ulbcutdbcz50","Électronique Grand Public","techniciens-electronique",{"experts":21},{"seo_content":46,"id":48,"name":49,"slug":50,"parentId":7,"lang":11,"_count":51},[47],{"page_slug":7},"cmkzhlcaw00ilulbc38pxoogr","Santé","medecins",{"experts":52},5,{"seo_content":54,"id":56,"name":57,"slug":58,"parentId":7,"lang":11,"_count":59},[55],{"page_slug":7},"cmkzhlcmi00izulbcxva1m47f","Gestion de Patrimoine","conseillers-patrimoniaux",{"experts":21},{"seo_content":61,"id":63,"name":64,"slug":65,"parentId":7,"lang":11,"_count":66},[62],{"page_slug":7},"cmkzhldcv00jvulbcmcd5a7mk","Animaux et Vétérinaires","veterinaires",{"experts":21},{"seo_content":68,"id":70,"name":71,"slug":72,"parentId":7,"lang":11,"_count":73},[69],{"page_slug":7},"cmkzhldrr00kdulbchxfo67eg","Mécanique et Réparation","mecaniciens",{"experts":74},1,{"seo_content":76,"id":78,"name":79,"slug":80,"parentId":7,"lang":11,"_count":81},[77],{"page_slug":7},"cmkzhl9l300fbulbcv3i8q8p3","Aide aux Devoirs","professeurs-particuliers",{"experts":82},6,{"slug":84,"title":85,"page_title":86,"description":87,"content_md":88,"local_slug":84,"json_ld":89,"faq":102,"tool_html":118,"source":119,"category":7,"audience":120,"publish_mode":121,"hero_image":122,"hero_image_alt":85},"simulateur-revision-pre-vacances","Simulateur budget révision avant vacances","Simulateur budget révision voiture vacances 2026 — Expert Zoom","Estimez le coût de votre révision préventive avant les vacances d'été : vidange, filtres, freins, pneus. Fourchettes de prix moyens garage France 2026.","Préparer sa voiture avant les vacances d'été commence par anticiper les coûts d'entretien. Ce simulateur vous aide à estimer le budget d'une révision préventive poste par poste : vidange, filtres, plaquettes de frein, essuie-glaces et pneumatiques. Les fourchettes de prix sont basées sur les tarifs moyens constatés en France en 2026.",[90],{"name":91,"@type":92,"offers":93,"@context":97,"inLanguage":98,"description":99,"operatingSystem":100,"applicationCategory":101},"Simulateur budget révision voiture avant vacances 2026","WebApplication",{"@type":94,"price":95,"priceCurrency":96},"Offer","0","EUR","https:\u002F\u002Fschema.org","fr","Estimez le coût d'une révision préventive avant les vacances d'été. Sélectionnez les postes d'entretien (vidange, filtres, freins, pneus) et obtenez une fourchette de prix basée sur les tarifs moyens France 2026.","Web","UtilitiesApplication",[103,106,109,112,115],{"a":104,"q":105},"En France en 2026, une révision complète (vidange, filtres, contrôle freins, essuie-glaces) coûte entre 200 et 400 € selon le garage et le véhicule. Utilisez ce simulateur pour estimer votre budget poste par poste.","Combien coûte une révision complète avant les vacances d'été ?",{"a":107,"q":108},"Les points clés sont : niveau d'huile et vidange si nécessaire, pression et usure des pneus, liquide de frein, essuie-glaces, liquide de refroidissement et éclairage. Le simulateur couvre tous ces postes.","Quelles sont les vérifications indispensables avant un long trajet ?",{"a":110,"q":111},"Les centres auto (Norauto, Midas, Feu Vert…) proposent généralement des tarifs plus compétitifs que les concessions, notamment sur la vidange et les pneumatiques. Comparez les devis avant de vous engager.","Est-il moins cher de faire réviser sa voiture chez un garagiste ou en centre auto ?",{"a":113,"q":114},"Les pneus doivent être remplacés lorsque la profondeur des sculptures atteint 3 mm (2 mm en dessous du minimum légal de 1,6 mm) ou tous les 5 à 7 ans même sans usure visible, car le caoutchouc vieillit.","À quelle fréquence faut-il changer les pneus ?",{"a":116,"q":117},"Oui, certains points sont accessibles au particulier : vérification du niveau d'huile, des liquides, de la pression des pneus et de l'état des essuie-glaces. En revanche, la vidange, les freins et les bougies nécessitent un outillage adapté.","Peut-on faire soi-même une partie de la révision ?","\u003C!DOCTYPE html>\n\u003Chtml lang=\"fr\">\n\u003Chead>\n  \u003Cmeta charset=\"utf-8\">\n  \u003Cmeta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n  \u003Ctitle>Simulateur budget révision voiture avant vacances 2026\u003C\u002Ftitle>\n  \u003Cscript src=\"https:\u002F\u002Funpkg.com\u002Flucide@latest\u002Fdist\u002Fumd\u002Flucide.min.js\">\u003C\u002Fscript>\n  \u003Cstyle>\n    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n    :root {\n      --stone-50: #fafaf9; --stone-100: #f5f5f4; --stone-200: #e7e5e4;\n      --stone-400: #a8a29e; --stone-600: #57534e; --stone-700: #44403c; --stone-800: #292524;\n      --blue-50: #eff6ff; --blue-100: #dbeafe; --blue-600: #2563eb;\n      --green-50: #f0fdf4; --green-600: #16a34a;\n      --amber-50: #fffbeb; --amber-200: #fde68a; --amber-600: #d97706;\n      --red-50: #fef2f2; --red-600: #dc2626;\n    }\n    body { font-family: system-ui,-apple-system,sans-serif; background: var(--stone-50); color: var(--stone-800); font-size: 15px; line-height: 1.5; }\n    .tool-root { max-width: 560px; margin: 0 auto; padding: 20px 16px 24px; }\n    .tool-header { margin-bottom: 20px; }\n    .tool-title { display: flex; align-items: center; gap: 10px; font-size: 18px; font-weight: 700; margin-bottom: 4px; }\n    .tool-title [data-lucide] { color: var(--blue-600); flex-shrink: 0; }\n    .tool-subtitle { color: var(--stone-600); font-size: 13.5px; }\n    .tabs { display: flex; border-bottom: 2px solid var(--stone-200); margin-bottom: 20px; }\n    .tab-btn { background: none; border: none; padding: 9px 14px; font-size: 13.5px; font-weight: 500; color: var(--stone-600); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -2px; transition: color .15s, border-color .15s; white-space: nowrap; }\n    .tab-btn:hover { color: var(--stone-800); }\n    .tab-btn.active { color: var(--blue-600); border-bottom-color: var(--blue-600); font-weight: 600; }\n    .tab-panel { display: none; }\n    .tab-panel.active { display: block; }\n    .callout { background: var(--blue-50); border: 1px solid var(--blue-100); border-radius: 10px; padding: 11px 13px; font-size: 13px; color: var(--stone-700); display: flex; gap: 8px; align-items: flex-start; margin-bottom: 18px; }\n    .callout [data-lucide] { color: var(--blue-600); flex-shrink: 0; margin-top: 2px; }\n    .service-list { display: flex; flex-direction: column; gap: 10px; }\n    .service-item { background: white; border: 1.5px solid var(--stone-200); border-radius: 10px; padding: 12px 14px; display: flex; align-items: center; gap: 12px; cursor: pointer; transition: border-color .15s; }\n    .service-item:hover { border-color: var(--stone-400); }\n    .service-item.checked { border-color: var(--blue-600); background: var(--blue-50); }\n    .service-checkbox { width: 18px; height: 18px; border: 2px solid var(--stone-300); border-radius: 4px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; transition: background .15s, border-color .15s; }\n    .service-item.checked .service-checkbox { background: var(--blue-600); border-color: var(--blue-600); }\n    .service-checkbox [data-lucide] { display: none; }\n    .service-item.checked .service-checkbox [data-lucide] { display: block; }\n    .service-info { flex: 1; }\n    .service-name { font-size: 14px; font-weight: 600; color: var(--stone-800); }\n    .service-desc { font-size: 12px; color: var(--stone-500); margin-top: 1px; }\n    .service-price { font-size: 13px; font-weight: 600; color: var(--stone-600); font-variant-numeric: tabular-nums; white-space: nowrap; }\n    .form-group { margin-bottom: 16px; }\n    .form-label { display: flex; justify-content: space-between; align-items: center; font-size: 13.5px; font-weight: 600; color: var(--stone-700); margin-bottom: 7px; }\n    .form-value { font-size: 13px; font-weight: 700; color: var(--blue-600); font-variant-numeric: tabular-nums; }\n    input[type=range] { width: 100%; height: 6px; -webkit-appearance: none; background: var(--stone-200); border-radius: 3px; outline: none; cursor: pointer; }\n    input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; width: 18px; height: 18px; border-radius: 50%; background: var(--blue-600); cursor: pointer; box-shadow: 0 1px 3px rgba(0,0,0,.2); }\n    .tire-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 16px; }\n    .tire-card { background: white; border: 1.5px solid var(--stone-200); border-radius: 10px; padding: 12px 14px; cursor: pointer; transition: border-color .15s; }\n    .tire-card.selected { border-color: var(--blue-600); background: var(--blue-50); }\n    .tire-card-title { font-size: 13.5px; font-weight: 600; color: var(--stone-800); }\n    .tire-card-sub { font-size: 12px; color: var(--stone-500); margin-top: 2px; }\n    .tire-card-price { font-size: 13px; font-weight: 600; color: var(--stone-600); margin-top: 6px; }\n    .result-card { background: white; border: 2px solid var(--blue-100); border-radius: 12px; padding: 18px 20px; margin-top: 20px; }\n    .result-title { font-size: 13px; font-weight: 600; color: var(--stone-600); margin-bottom: 12px; text-transform: uppercase; letter-spacing: .04em; }\n    .result-range { font-size: 28px; font-weight: 800; color: var(--stone-800); font-variant-numeric: tabular-nums; margin-bottom: 4px; }\n    .result-sub { font-size: 12.5px; color: var(--stone-500); }\n    .total-lines { display: flex; flex-direction: column; gap: 8px; margin-bottom: 14px; }\n    .total-line { display: flex; justify-content: space-between; align-items: center; font-size: 13.5px; }\n    .total-line-label { color: var(--stone-600); }\n    .total-line-value { font-weight: 600; color: var(--stone-800); font-variant-numeric: tabular-nums; }\n    .total-divider { height: 1px; background: var(--stone-200); margin: 4px 0; }\n    .total-grand { display: flex; justify-content: space-between; align-items: center; font-size: 16px; font-weight: 700; }\n    .total-grand-value { color: var(--blue-600); font-variant-numeric: tabular-nums; }\n    .empty-state { text-align: center; padding: 28px 16px; color: var(--stone-400); font-size: 13.5px; }\n    .empty-state [data-lucide] { margin: 0 auto 8px; display: block; }\n    .source { margin-top: 18px; font-size: 11.5px; color: var(--stone-400); display: flex; align-items: center; gap: 5px; flex-wrap: wrap; }\n    .source a { color: var(--stone-400); }\n    .source [data-lucide] { flex-shrink: 0; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\u003Cmain class=\"tool-root\">\n  \u003Cdiv class=\"tool-header\">\n    \u003Cdiv class=\"tool-title\">\n      \u003Ci data-lucide=\"wrench\" style=\"width:22px;height:22px\">\u003C\u002Fi>\n      Budget révision avant vacances\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"tool-subtitle\">Estimez le coût d'une révision préventive avant les grands départs 2026\u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003Cdiv class=\"tabs\">\n    \u003Cbutton class=\"tab-btn active\" data-tab=\"entretien\">Entretien\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"pneumatiques\">Pneumatiques\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"total\">Total estimé\u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n\n  \u003C!-- Tab Entretien -->\n  \u003Cdiv class=\"tab-panel active\" id=\"tab-entretien\">\n    \u003Cdiv class=\"callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:15px;height:15px\">\u003C\u002Fi>\n      \u003Cspan>Cochez les opérations à prévoir. Les prix sont des fourchettes moyennes constatées en France (2026).\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"service-list\" id=\"service-list\">\u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- Tab Pneumatiques -->\n  \u003Cdiv class=\"tab-panel\" id=\"tab-pneumatiques\">\n    \u003Cdiv class=\"callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:15px;height:15px\">\u003C\u002Fi>\n      \u003Cspan>Pneus avec &lt; 3 mm de profondeur ou &gt; 5 ans : à remplacer avant un long trajet.\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-group\">\n      \u003Cdiv class=\"form-label\">\n        \u003Cspan>Nombre de pneus à remplacer\u003C\u002Fspan>\n        \u003Cspan class=\"form-value\" id=\"v-tires\">0\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cinput type=\"range\" id=\"r-tires\" min=\"0\" max=\"4\" step=\"1\" value=\"0\"\n        oninput=\"state.tires=+this.value;render()\">\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-group\">\n      \u003Cdiv class=\"form-label\">\u003Cspan>Gamme de pneu choisie\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"tire-grid\" id=\"tire-grid\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\" id=\"tire-result\">\n      \u003Cdiv class=\"result-title\">Estimation pneumatiques\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-range\" id=\"tire-cost-display\">0 €\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"tire-cost-sub\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- Tab Total -->\n  \u003Cdiv class=\"tab-panel\" id=\"tab-total\">\n    \u003Cdiv class=\"callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:15px;height:15px\">\u003C\u002Fi>\n      \u003Cspan>Récapitulatif des postes sélectionnés dans les deux onglets précédents.\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv id=\"total-empty\" class=\"empty-state\" style=\"display:none\">\n        \u003Ci data-lucide=\"package-open\" style=\"width:28px;height:28px;color:#a8a29e\">\u003C\u002Fi>\n        Aucun poste sélectionné.\u003Cbr>Cochez des éléments dans les onglets Entretien et Pneumatiques.\n      \u003C\u002Fdiv>\n      \u003Cdiv id=\"total-content\">\n        \u003Cdiv class=\"total-lines\" id=\"total-lines\">\u003C\u002Fdiv>\n        \u003Cdiv class=\"total-divider\">\u003C\u002Fdiv>\n        \u003Cdiv class=\"total-grand\">\n          \u003Cspan>Total estimé\u003C\u002Fspan>\n          \u003Cspan class=\"total-grand-value\" id=\"grand-total\">—\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003Cdiv class=\"source\">\n    \u003Ci data-lucide=\"link\" style=\"width:11px;height:11px\">\u003C\u002Fi>\n    Sources : \u003Ca href=\"https:\u002F\u002Fwww.midas.fr\u002Fentretien-auto\u002Frevision\" target=\"_blank\" rel=\"noopener\">midas.fr\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fwww.bymycar.fr\u002Fwebzine\u002Fcombien-coute-une-revision-voiture\u002F\" target=\"_blank\" rel=\"noopener\">bymycar.fr\u003C\u002Fa> — Fourchettes moyennes France 2026 &bull; Tarifs indicatifs, variables selon le garage et le véhicule\n  \u003C\u002Fdiv>\n\u003C\u002Fmain>\n\n\u003Cscript>\nconst fmtEur = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', minimumFractionDigits: 0, maximumFractionDigits: 0 });\n\nconst SERVICES = [\n  { id: 'vidange', name: 'Vidange + filtre à huile', desc: 'Opération de base, recommandée tous les 15 000 km', min: 80, max: 150 },\n  { id: 'filtre_air', name: 'Filtre à air', desc: 'Améliore les performances moteur et la consommation', min: 30, max: 60 },\n  { id: 'filtre_hab', name: 'Filtre habitacle', desc: 'Qualité de l\\'air dans l\\'habitacle, poussières et pollens', min: 30, max: 60 },\n  { id: 'bougies', name: 'Bougies d\\'allumage', desc: 'Moteur essence uniquement — à prévoir tous les 30 000–60 000 km', min: 50, max: 120 },\n  { id: 'liq_frein', name: 'Liquide de frein', desc: 'Se dégrade avec l\\'humidité — à changer tous les 2 ans', min: 30, max: 60 },\n  { id: 'essuies', name: 'Balais essuie-glaces', desc: 'Sécurité en cas d\\'orage ou de pluie sur autoroute', min: 20, max: 50 },\n  { id: 'liq_refr', name: 'Liquide de refroidissement', desc: 'Indispensable par forte chaleur en été', min: 30, max: 60 },\n  { id: 'freins', name: 'Plaquettes de frein (1 essieu)', desc: 'Contrôler l\\'usure avant un trajet chargé', min: 80, max: 200 },\n];\n\nconst TIRE_RANGES = [\n  { id: 'eco', name: 'Entrée de gamme', sub: 'Pneu standard, usage quotidien', min: 60, max: 90 },\n  { id: 'mid', name: 'Milieu de gamme', sub: 'Bon rapport qualité-prix (Hankook, Falken…)', min: 90, max: 140 },\n  { id: 'prem', name: 'Haut de gamme', sub: 'Michelin, Bridgestone, Continental…', min: 130, max: 200 },\n];\n\nconst state = {\n  checked: new Set(),\n  tires: 0,\n  tire_range: 'mid'\n};\n\nfunction serviceMin() {\n  return [...state.checked].reduce((s, id) => s + (SERVICES.find(x => x.id === id)?.min || 0), 0);\n}\nfunction serviceMax() {\n  return [...state.checked].reduce((s, id) => s + (SERVICES.find(x => x.id === id)?.max || 0), 0);\n}\nfunction tireRange() {\n  const t = TIRE_RANGES.find(r => r.id === state.tire_range);\n  return t ? { min: t.min * state.tires, max: t.max * state.tires } : { min: 0, max: 0 };\n}\n\nfunction render() {\n  \u002F\u002F Service list\n  const list = document.getElementById('service-list');\n  list.innerHTML = SERVICES.map(s => `\n    \u003Cdiv class=\"service-item${state.checked.has(s.id) ? ' checked' : ''}\" onclick=\"toggleService('${s.id}')\">\n      \u003Cdiv class=\"service-checkbox\">\n        \u003Ci data-lucide=\"check\" style=\"width:12px;height:12px;color:white\">\u003C\u002Fi>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"service-info\">\n        \u003Cdiv class=\"service-name\">${s.name}\u003C\u002Fdiv>\n        \u003Cdiv class=\"service-desc\">${s.desc}\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"service-price\">${fmtEur.format(s.min)}–${fmtEur.format(s.max)}\u003C\u002Fdiv>\n    \u003C\u002Fdiv>`).join('');\n  lucide.createIcons();\n\n  \u002F\u002F Tires\n  document.getElementById('v-tires').textContent = state.tires + (state.tires > 1 ? ' pneus' : state.tires === 1 ? ' pneu' : ' pneu');\n  const tg = document.getElementById('tire-grid');\n  tg.innerHTML = TIRE_RANGES.map(r => `\n    \u003Cdiv class=\"tire-card${state.tire_range === r.id ? ' selected' : ''}\" onclick=\"state.tire_range='${r.id}';render()\">\n      \u003Cdiv class=\"tire-card-title\">${r.name}\u003C\u002Fdiv>\n      \u003Cdiv class=\"tire-card-sub\">${r.sub}\u003C\u002Fdiv>\n      \u003Cdiv class=\"tire-card-price\">${fmtEur.format(r.min)}–${fmtEur.format(r.max)} \u002F pneu\u003C\u002Fdiv>\n    \u003C\u002Fdiv>`).join('');\n\n  const tr = tireRange();\n  const tireDisplay = document.getElementById('tire-cost-display');\n  const tireSub = document.getElementById('tire-cost-sub');\n  if (state.tires === 0) {\n    tireDisplay.textContent = '0 €';\n    tireSub.textContent = 'Sélectionnez un nombre de pneus à remplacer';\n  } else {\n    tireDisplay.textContent = fmtEur.format(tr.min) + ' – ' + fmtEur.format(tr.max);\n    tireSub.textContent = state.tires + ' pneu' + (state.tires > 1 ? 's' : '') + ' × gamme ' + TIRE_RANGES.find(r => r.id === state.tire_range)?.name.toLowerCase();\n  }\n\n  \u002F\u002F Total\n  const sm = serviceMin(), sM = serviceMax();\n  const { min: tm, max: tM } = tireRange();\n  const grandMin = sm + tm;\n  const grandMax = sM + tM;\n  const totalLines = document.getElementById('total-lines');\n  const totalEmpty = document.getElementById('total-empty');\n  const totalContent = document.getElementById('total-content');\n  const grandTotalEl = document.getElementById('grand-total');\n\n  const lines = [];\n  SERVICES.forEach(s => {\n    if (state.checked.has(s.id)) {\n      lines.push({ label: s.name, min: s.min, max: s.max });\n    }\n  });\n  if (state.tires > 0) {\n    const t = TIRE_RANGES.find(r => r.id === state.tire_range);\n    lines.push({ label: state.tires + ' pneu' + (state.tires > 1 ? 's' : '') + ' (' + t?.name + ')', min: tm, max: tM });\n  }\n\n  if (lines.length === 0) {\n    totalEmpty.style.display = 'block';\n    totalContent.style.display = 'none';\n  } else {\n    totalEmpty.style.display = 'none';\n    totalContent.style.display = 'block';\n    totalLines.innerHTML = lines.map(l => `\n      \u003Cdiv class=\"total-line\">\n        \u003Cspan class=\"total-line-label\">${l.label}\u003C\u002Fspan>\n        \u003Cspan class=\"total-line-value\">${fmtEur.format(l.min)}–${fmtEur.format(l.max)}\u003C\u002Fspan>\n      \u003C\u002Fdiv>`).join('');\n    grandTotalEl.textContent = fmtEur.format(grandMin) + ' – ' + fmtEur.format(grandMax);\n    lucide.createIcons();\n  }\n}\n\nfunction toggleService(id) {\n  if (state.checked.has(id)) state.checked.delete(id);\n  else state.checked.add(id);\n  render();\n}\n\ndocument.querySelectorAll('.tab-btn').forEach(btn => {\n  btn.addEventListener('click', () => {\n    document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));\n    document.querySelectorAll('.tab-panel').forEach(p => p.classList.remove('active'));\n    btn.classList.add('active');\n    document.getElementById('tab-' + btn.dataset.tab).classList.add('active');\n    lucide.createIcons();\n    setTimeout(() => {\n      const h = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n      parent.postMessage({ type: 'resize', height: h }, '*');\n    }, 50);\n  });\n});\n\ndocument.addEventListener('DOMContentLoaded', () => {\n  lucide.createIcons();\n  render();\n  const ro = new ResizeObserver(() => {\n    const h = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n    parent.postMessage({ type: 'resize', height: h }, '*');\n  });\n  ro.observe(document.documentElement);\n});\n\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","generated","consumer","both","https:\u002F\u002Fpub-bdebbd2dad294475a2da0eb657815b6b.r2.dev\u002Ftools\u002Fsimulateur-revision-pre-vacances-864fcd5df0.webp",[]]