[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-calculateur-hydratation-canicule-fr":83,"footer-cities-fr":126},[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":7,"json_ld":89,"faq":104,"tool_html":120,"source":121,"category":122,"audience":99,"publish_mode":123,"hero_image":124,"hero_image_alt":125},"calculateur-hydratation-canicule","Calculateur de besoins en eau par temps chaud","Calculateur hydratation canicule : besoins en eau selon votre profil — Expert Zoom","Estimez vos besoins quotidiens en eau par temps chaud selon votre poids, la température, l'activité physique et l'âge. Basé sur les recommandations EFSA et ANSES 2024.","Cet outil calcule vos besoins personnalisés en eau lors des épisodes de chaleur, en s'appuyant sur la formule EFSA (35 ml\u002Fkg de poids corporel) corrigée par des bonus chaleur et activité validés par l'ANSES. Il indique le nombre de verres et bouteilles à consommer, le rythme d'hydratation horaire, et détaille comment l'âge (seniors, enfants) modifie ces besoins.",[90],{"name":85,"@type":91,"offers":92,"@context":96,"audience":97,"inLanguage":100,"description":101,"operatingSystem":102,"applicationCategory":103},"WebApplication",{"@type":93,"price":94,"priceCurrency":95},"Offer","0","EUR","https:\u002F\u002Fschema.org",{"@type":98,"audienceType":99},"Audience","consumer","fr","Estimez vos besoins quotidiens en eau selon votre poids, la température, l'activité physique et l'âge. Basé sur les recommandations EFSA et ANSES.","Any","HealthApplication",[105,108,111,114,117],{"a":106,"q":107},"L'outil applique la recommandation EFSA : 35 ml par kg de poids corporel comme base, majorée d'un bonus chaleur (jusqu'à +1 L au-dessus de 35 °C), d'un bonus activité physique (jusqu'à +1,5 L pour les sportifs intensifs) et d'un ajustement pour les seniors (+200 ml pour compenser la diminution de la sensation de soif).","Comment sont calculés mes besoins quotidiens en eau ?",{"a":109,"q":110},"Non, les besoins hydriques incluent toutes les boissons non alcoolisées et l'eau contenue dans les aliments (environ 20 % des apports totaux). Cependant, évitez l'alcool, le café en excès et les sodas sucrés qui favorisent la déshydratation. En canicule, l'eau plate ou légèrement pétillante reste la meilleure option.","Doit-on boire uniquement de l'eau ?",{"a":112,"q":113},"La sensation de soif s'atténue avec l'âge. Un senior peut être déjà déshydraté à 2 % sans ressentir la soif — un stade qui altère déjà la fonction rénale et cardiovasculaire. Il faut donc proposer à boire toutes les heures, sans attendre la demande.","Pourquoi les seniors doivent-ils boire plus en été ?",{"a":115,"q":116},"L'hyponatrémie (excès d'eau sans sel) est possible chez les sportifs d'endurance qui boivent massivement. Pour la chaleur quotidienne non sportive, ce risque est négligeable. Si vous transpirez beaucoup, associez l'hydratation à des aliments salés (soupe froide, olives, jambon).","Peut-on boire trop d'eau en canicule ?",{"a":118,"q":119},"Oui, significativement. Concombre (96 % d'eau), pastèque (92 %), tomate (94 %), fraise (91 %) et laitue (95 %) contribuent directement à votre apport hydrique. En canicule, augmenter leur consommation est une stratégie efficace et agréable.","Les fruits et légumes comptent-ils dans l'hydratation ?","\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>Calculateur de besoins en eau par temps chaud\u003C\u002Ftitle>\n  \u003Cscript src=\"https:\u002F\u002Funpkg.com\u002Flucide@latest\u002Fdist\u002Fumd\u002Flucide.min.js\">\u003C\u002Fscript>\n  \u003Cstyle>\n    :root {\n      --bg: #fafaf9;\n      --card: #ffffff;\n      --accent: #2563eb;\n      --accent-light: #eff6ff;\n      --text: #1c1917;\n      --muted: #78716c;\n      --border: #e7e5e4;\n      --water: #0ea5e9;\n    }\n    * { box-sizing: border-box; margin: 0; padding: 0; }\n    body { font-family: system-ui, -apple-system, sans-serif; background: var(--bg); color: var(--text); font-size: 15px; line-height: 1.5; }\n    .tool-root { max-width: 620px; margin: 0 auto; padding: 20px 16px 32px; }\n    .tool-header { margin-bottom: 20px; }\n    .tool-title { font-size: 20px; font-weight: 700; display: flex; align-items: center; gap: 8px; margin-bottom: 4px; }\n    .tool-subtitle { font-size: 13px; color: var(--muted); }\n    .tab-bar { display: flex; border-bottom: 2px solid var(--border); margin-bottom: 20px; }\n    .tab-btn { background: none; border: none; cursor: pointer; padding: 10px 18px; font-size: 14px; font-weight: 500; color: var(--muted); border-bottom: 2px solid transparent; margin-bottom: -2px; transition: all 0.15s; }\n    .tab-btn.active { color: var(--accent); border-bottom-color: var(--accent); }\n    .tab-btn:hover:not(.active) { color: var(--text); }\n    .tab-panel { display: none; }\n    .tab-panel.active { display: block; }\n    .callout { background: var(--accent-light); border-left: 3px solid var(--accent); border-radius: 8px; padding: 10px 14px; font-size: 12.5px; color: #1e40af; margin-bottom: 20px; display: flex; gap: 8px; align-items: flex-start; }\n    .callout svg { flex-shrink: 0; margin-top: 2px; }\n    .field { margin-bottom: 18px; }\n    .field-label { display: flex; justify-content: space-between; font-size: 13px; font-weight: 600; margin-bottom: 8px; }\n    .field-label span { font-weight: 400; color: var(--muted); font-variant-numeric: tabular-nums; }\n    input[type=range] { width: 100%; accent-color: var(--accent); cursor: pointer; }\n    select { width: 100%; padding: 9px 12px; border: 1.5px solid var(--border); border-radius: 8px; font-size: 14px; background: white url(\"data:image\u002Fsvg+xml,%3Csvg xmlns='http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2378716c' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'\u002F%3E%3C\u002Fsvg%3E\") no-repeat right 12px center; appearance: none; cursor: pointer; }\n    .result-card { background: var(--card); border: 1.5px solid var(--border); border-radius: 12px; overflow: hidden; margin-top: 20px; }\n    .result-hero { padding: 20px; text-align: center; background: linear-gradient(135deg, #eff6ff 0%, #e0f2fe 100%); border-bottom: 1px solid var(--border); }\n    .result-hero-val { font-size: 52px; font-weight: 800; color: var(--water); font-variant-numeric: tabular-nums; line-height: 1; }\n    .result-hero-unit { font-size: 22px; font-weight: 600; color: var(--water); }\n    .result-hero-label { font-size: 13px; color: var(--muted); margin-top: 6px; }\n    .water-bottles { display: flex; justify-content: center; gap: 6px; margin-top: 12px; flex-wrap: wrap; }\n    .bottle { display: flex; flex-direction: column; align-items: center; gap: 2px; }\n    .bottle-icon { color: var(--water); }\n    .bottle-label { font-size: 10px; color: var(--muted); }\n    .result-row { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; border-bottom: 1px solid var(--border); }\n    .result-row:last-child { border-bottom: none; }\n    .result-label { font-size: 13px; color: var(--muted); }\n    .result-value { font-size: 16px; font-weight: 700; font-variant-numeric: tabular-nums; }\n    .breakdown-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; padding: 14px; border-top: 1px solid var(--border); }\n    .breakdown-item { background: #f8fafc; border-radius: 8px; padding: 10px; text-align: center; }\n    .breakdown-val { font-size: 16px; font-weight: 700; color: var(--accent); }\n    .breakdown-label { font-size: 11px; color: var(--muted); margin-top: 2px; }\n    .advice-box { background: #f8fafc; padding: 14px 16px; font-size: 13px; color: var(--text); line-height: 1.7; border-top: 1px solid var(--border); }\n    .symptom-list { display: flex; flex-direction: column; gap: 8px; }\n    .symptom-item { border: 1.5px solid var(--border); border-radius: 10px; overflow: hidden; }\n    .symptom-header { padding: 10px 14px; font-size: 13px; font-weight: 600; display: flex; align-items: center; gap: 8px; }\n    .symptom-body { padding: 10px 14px; font-size: 13px; color: var(--muted); border-top: 1px solid var(--border); background: #fafaf9; }\n    .badge { display: inline-flex; align-items: center; gap: 5px; padding: 3px 10px; border-radius: 100px; font-size: 12px; font-weight: 600; }\n    .level-low  { background: #fef9c3; color: #854d0e; }\n    .level-mod  { background: #fed7aa; color: #9a3412; }\n    .level-high { background: #fee2e2; color: #991b1b; }\n    .source { margin-top: 20px; font-size: 11px; color: var(--muted); line-height: 1.7; }\n    .source a { color: var(--accent); text-decoration: none; }\n    .rhythm-bar { display: flex; gap: 4px; margin-top: 10px; }\n    .rhythm-slot { flex: 1; text-align: center; font-size: 10px; }\n    .rhythm-slot-bar { height: 24px; border-radius: 4px; margin-bottom: 3px; }\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=\"droplets\" width=\"22\" height=\"22\" color=\"#0ea5e9\">\u003C\u002Fi>\n      Besoins en eau par temps chaud\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"tool-subtitle\">Calculez vos besoins quotidiens d'hydratation selon votre profil, la chaleur et votre activité\u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003Cdiv class=\"tab-bar\">\n    \u003Cbutton class=\"tab-btn active\" data-tab=\"besoins\">Mes besoins\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"alertes\">Signes d'alerte\u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n\n  \u003C!-- TAB 1 : Besoins -->\n  \u003Cdiv id=\"tab-besoins\" class=\"tab-panel active\">\n    \u003Cdiv class=\"callout\">\n      \u003Ci data-lucide=\"info\" width=\"15\" height=\"15\">\u003C\u002Fi>\n      \u003Cdiv>\n        \u003Cstrong>Formule EFSA\u002FANSES :\u003C\u002Fstrong> base = 35 ml\u002Fkg + bonus chaleur + bonus activité + ajustement âge.\u003Cbr>\n        Au-dessus de 30 °C, les besoins peuvent doubler par rapport au seuil de base.\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Cdiv class=\"field-label\">Poids corporel \u003Cspan>\u003Cspan id=\"poids-display\">70\u003C\u002Fspan> kg\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cinput type=\"range\" id=\"poids-slider\" min=\"30\" max=\"130\" value=\"70\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Cdiv class=\"field-label\">Température extérieure \u003Cspan>\u003Cspan id=\"temp-display\">30\u003C\u002Fspan> °C\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cinput type=\"range\" id=\"temp-slider\" min=\"15\" max=\"45\" value=\"30\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Cdiv class=\"field-label\">Niveau d'activité\u003C\u002Fdiv>\n      \u003Cselect id=\"activite-select\">\n        \u003Coption value=\"0\">Sédentaire (travail de bureau, repos)\u003C\u002Foption>\n        \u003Coption value=\"250\">Légère (marche quotidienne, tâches ménagères)\u003C\u002Foption>\n        \u003Coption value=\"500\" selected>Modérée (sport 2-3×\u002Fsem., travail debout)\u003C\u002Foption>\n        \u003Coption value=\"1000\">Intense (sport quotidien, travail physique)\u003C\u002Foption>\n        \u003Coption value=\"1500\">Très intense (athlète, 2 entraînements\u002Fjour)\u003C\u002Foption>\n      \u003C\u002Fselect>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Cdiv class=\"field-label\">Âge\u003C\u002Fdiv>\n      \u003Cselect id=\"age-select\">\n        \u003Coption value=\"enfant\">Enfant (6-12 ans)\u003C\u002Foption>\n        \u003Coption value=\"ado\">Adolescent (13-17 ans)\u003C\u002Foption>\n        \u003Coption value=\"adulte\" selected>Adulte (18-64 ans)\u003C\u002Foption>\n        \u003Coption value=\"senior\">Senior (65 ans et plus)\u003C\u002Foption>\n      \u003C\u002Fselect>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-hero\">\n        \u003Cdiv>\n          \u003Cspan class=\"result-hero-val\" id=\"total-litres\">—\u003C\u002Fspan>\n          \u003Cspan class=\"result-hero-unit\"> L\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-hero-label\">d'eau par jour (boissons + alimentation hydratante)\u003C\u002Fdiv>\n        \u003Cdiv class=\"water-bottles\" id=\"water-bottles\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv id=\"result-besoins-rows\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"breakdown-grid\" id=\"breakdown-grid\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- TAB 2 : Signes d'alerte -->\n  \u003Cdiv id=\"tab-alertes\" class=\"tab-panel\">\n    \u003Cdiv class=\"callout\">\n      \u003Ci data-lucide=\"alert-triangle\" width=\"15\" height=\"15\">\u003C\u002Fi>\n      \u003Cdiv>La soif est un signal tardif : à ce stade, vous êtes déjà légèrement déshydraté. Apprenez à reconnaître les signes précoces.\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"symptom-list\">\n      \u003Cdiv class=\"symptom-item\">\n        \u003Cdiv class=\"symptom-header\" style=\"background:#fef9c3; color:#854d0e\">\n          \u003Ci data-lucide=\"droplet\" width=\"16\" height=\"16\">\u003C\u002Fi>\n          Déshydratation légère (1-2 % du poids corporel)\n          \u003Cspan class=\"badge level-low\" style=\"margin-left:auto\">Vigilance\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"symptom-body\">\n          Soif, urine foncée (jaune ambré), bouche sèche, légère fatigue, difficultés de concentration.\n          \u003Cbr>\u003Cstrong>Action :\u003C\u002Fstrong> Buvez 1 à 2 grands verres d'eau immédiatement. Cherchez un endroit frais.\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"symptom-item\">\n        \u003Cdiv class=\"symptom-header\" style=\"background:#fed7aa; color:#9a3412\">\n          \u003Ci data-lucide=\"zap\" width=\"16\" height=\"16\">\u003C\u002Fi>\n          Déshydratation modérée (3-5 %)\n          \u003Cspan class=\"badge level-mod\" style=\"margin-left:auto\">Danger\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"symptom-body\">\n          Maux de tête, vertiges, nausées, crampes musculaires, battements cardiaques accélérés, urine très foncée ou absente.\n          \u003Cbr>\u003Cstrong>Action :\u003C\u002Fstrong> Arrêtez toute activité. Eau fraîche en petites gorgées fréquentes. Consultez un médecin si les symptômes persistent.\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"symptom-item\">\n        \u003Cdiv class=\"symptom-header\" style=\"background:#fee2e2; color:#991b1b\">\n          \u003Ci data-lucide=\"flame\" width=\"16\" height=\"16\">\u003C\u002Fi>\n          Coup de chaleur — urgence médicale\n          \u003Cspan class=\"badge level-high\" style=\"margin-left:auto\">Urgence\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"symptom-body\">\n          Confusion mentale, peau chaude et sèche (ou très moite), température corporelle > 39 °C, perte de conscience possible.\n          \u003Cbr>\u003Cstrong>Action immédiate :\u003C\u002Fstrong> Appelez le \u003Cstrong>15 (SAMU)\u003C\u002Fstrong>. Allongez la personne à l'ombre. Refroidissez avec linges humides froids sur nuque, aisselles et aine. Ne donnez rien à boire à une personne inconsciente.\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"symptom-item\">\n        \u003Cdiv class=\"symptom-header\" style=\"background:#f5f3ff; color:#7c3aed\">\n          \u003Ci data-lucide=\"baby\" width=\"16\" height=\"16\">\u003C\u002Fi>\n          Signes spéciaux chez le nourrisson\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"symptom-body\">\n          Fontanelle creuse, pleurs sans larmes, couches sèches depuis > 6h, yeux enfoncés, irritabilité extrême.\n          \u003Cbr>\u003Cstrong>Action :\u003C\u002Fstrong> Consultez aux urgences pédiatriques sans attendre. Les nourrissons se déshydratent très rapidement.\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"symptom-item\">\n        \u003Cdiv class=\"symptom-header\" style=\"background:#ecfeff; color:#0e7490\">\n          \u003Ci data-lucide=\"clock\" width=\"16\" height=\"16\">\u003C\u002Fi>\n          Rythme d'hydratation conseillé en canicule\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"symptom-body\">\n          Buvez un grand verre (250 ml) toutes les 30-45 minutes, sans attendre la soif. Eau fraîche (pas glacée).\n          Complétez avec des aliments riches en eau : concombre (96 %), pastèque (92 %), fraise (91 %), tomate (94 %).\n          \u003Cbr>Évitez l'alcool, le café et les sodas sucrés qui accélèrent la déshydratation.\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003Cdiv class=\"source\">\n    Sources : \u003Ca href=\"https:\u002F\u002Fwww.anses.fr\" target=\"_blank\">ANSES — Recommandations apports en eau 2024\u003C\u002Fa> ·\n    \u003Ca href=\"https:\u002F\u002Fwww.nutripro.nestle.fr\u002Farticle\u002Fbesoins-hydration-chez-adulte-et-seniors\" target=\"_blank\">Nestlé NutriPro — Hydratation adulte et senior\u003C\u002Fa> ·\n    Formule EFSA 35 ml\u002Fkg · Ajustements chaleur : Santé Publique France. Indicatif uniquement.\n  \u003C\u002Fdiv>\n\u003C\u002Fmain>\n\n\u003Cscript>\nconst state = { poids: 70, temp: 30, activite: 500, age: 'adulte' };\n\nfunction calcBesoins(poids, temp, activite, age) {\n  \u002F\u002F Base: 35 ml\u002Fkg (EFSA)\n  let base;\n  if (age === 'enfant')  base = poids * 40; \u002F\u002F children need more per kg\n  else if (age === 'ado') base = poids * 38;\n  else                   base = poids * 35;\n\n  \u002F\u002F Temperature bonus (ml)\n  let tempBonus = 0;\n  if (temp >= 35)      tempBonus = 1000;\n  else if (temp >= 30) tempBonus = 750;\n  else if (temp >= 25) tempBonus = 500;\n  else if (temp >= 20) tempBonus = 200;\n\n  \u002F\u002F Activity bonus (already in state as ml)\n  const actBonus = activite;\n\n  \u002F\u002F Age adjustment\n  let ageBonus = 0;\n  if (age === 'senior') ageBonus = 200; \u002F\u002F reduced thirst sensation\n\n  const total = base + tempBonus + actBonus + ageBonus;\n  return { total, base, tempBonus, actBonus, ageBonus };\n}\n\nfunction formatL(ml) {\n  return (ml \u002F 1000).toFixed(1);\n}\n\nfunction render() {\n  \u002F\u002F Sync UI\n  document.getElementById('poids-display').textContent = state.poids;\n  document.getElementById('temp-display').textContent  = state.temp;\n\n  const b = calcBesoins(state.poids, state.temp, state.activite, state.age);\n  const totalL = b.total \u002F 1000;\n  const glasses = Math.ceil(b.total \u002F 250);\n  const bottles150 = (b.total \u002F 1500).toFixed(1);\n  const perHour = Math.ceil(b.total \u002F 16 \u002F 50) * 50; \u002F\u002F spread over 16 active hours, round to 50ml\n\n  document.getElementById('total-litres').textContent = totalL.toFixed(1);\n\n  \u002F\u002F Water bottle icons\n  const bottleCount = Math.min(6, Math.round(b.total \u002F 1500));\n  const partialPct = Math.round((totalL \u002F (bottleCount > 0 ? bottleCount : 1)) % 1 * 100);\n  let bottlesHTML = '';\n  for (let i = 0; i \u003C Math.max(1, bottleCount); i++) {\n    bottlesHTML += `\u003Cdiv class=\"bottle\">\u003Ci data-lucide=\"bottle-water\" width=\"28\" height=\"28\" class=\"bottle-icon\">\u003C\u002Fi>\u003Cdiv class=\"bottle-label\">1,5 L\u003C\u002Fdiv>\u003C\u002Fdiv>`;\n  }\n  document.getElementById('water-bottles').innerHTML = bottlesHTML;\n\n  \u002F\u002F Result rows\n  document.getElementById('result-besoins-rows').innerHTML = `\n    \u003Cdiv class=\"result-row\">\n      \u003Cspan class=\"result-label\">En verres de 250 ml\u003C\u002Fspan>\n      \u003Cspan class=\"result-value\" style=\"color:var(--water)\">${glasses} verres\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\n      \u003Cspan class=\"result-label\">En bouteilles de 1,5 L\u003C\u002Fspan>\n      \u003Cspan class=\"result-value\">${bottles150} bouteilles\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\n      \u003Cspan class=\"result-label\">Rythme recommandé\u003C\u002Fspan>\n      \u003Cspan class=\"result-value\" style=\"font-size:14px\">~${perHour} ml \u002F 30 min\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n  `;\n\n  \u002F\u002F Breakdown\n  document.getElementById('breakdown-grid').innerHTML = `\n    \u003Cdiv class=\"breakdown-item\">\n      \u003Cdiv class=\"breakdown-val\">${formatL(b.base)} L\u003C\u002Fdiv>\n      \u003Cdiv class=\"breakdown-label\">Base (35 ml\u002Fkg)\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"breakdown-item\">\n      \u003Cdiv class=\"breakdown-val\">${b.tempBonus > 0 ? '+' + formatL(b.tempBonus) + ' L' : '—'}\u003C\u002Fdiv>\n      \u003Cdiv class=\"breakdown-label\">Bonus chaleur (${state.temp} °C)\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"breakdown-item\">\n      \u003Cdiv class=\"breakdown-val\">${b.actBonus > 0 ? '+' + formatL(b.actBonus) + ' L' : '—'}\u003C\u002Fdiv>\n      \u003Cdiv class=\"breakdown-label\">Bonus activité\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"breakdown-item\">\n      \u003Cdiv class=\"breakdown-val\">${b.ageBonus > 0 ? '+' + formatL(b.ageBonus) + ' L' : '—'}\u003C\u002Fdiv>\n      \u003Cdiv class=\"breakdown-label\">Ajustement âge\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  `;\n\n  lucide.createIcons();\n}\n\n\u002F\u002F Listeners\ndocument.getElementById('poids-slider').addEventListener('input', e => { state.poids = +e.target.value; render(); });\ndocument.getElementById('temp-slider').addEventListener('input',  e => { state.temp  = +e.target.value; render(); });\ndocument.getElementById('activite-select').addEventListener('change', e => { state.activite = +e.target.value; render(); });\ndocument.getElementById('age-select').addEventListener('change', e => { state.age = e.target.value; render(); });\n\n\u002F\u002F Tab switching\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  });\n});\n\nrender();\nlucide.createIcons();\n\nconst ro = new ResizeObserver(() => {\n  const h = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n  parent.postMessage({ type: 'resize', height: h }, '*');\n});\nro.observe(document.documentElement);\n\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","generated","sante","both","https:\u002F\u002Fpub-bdebbd2dad294475a2da0eb657815b6b.r2.dev\u002Ftools\u002Fcalculateur-hydratation-canicule-96274e3460-1779404181.webp","",[]]