{"id":7931,"date":"2025-01-09T17:34:53","date_gmt":"2025-01-09T17:34:53","guid":{"rendered":"https:\/\/www.revellia.com\/?p=7931"},"modified":"2025-08-27T19:23:07","modified_gmt":"2025-08-27T19:23:07","slug":"calculateur-de-boisson-anniversaire","status":"publish","type":"post","link":"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/","title":{"rendered":"Calculateur de Boissons pour Anniversaire et Soir\u00e9e"},"content":{"rendered":"<!DOCTYPE html>\r\n<html lang=\"fr\">\r\n<head>\r\n  <meta charset=\"UTF-8\"\/>\r\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\/>\r\n  <title>Calculateur Ultime de Boissons<\/title>\r\n  <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Lora:wght@700&family=Open+Sans&display=swap\" rel=\"stylesheet\"\/>\r\n\r\n  <style>\r\n    :root{\r\n      --brand:#cca385;\r\n      --brand-ink:#fff;\r\n      --ink:#303030;\r\n      --muted:#666;\r\n      --line:#e9e1db;\r\n      --chip-bg:#f7f3ef;\r\n      --card:#faf8f6;\r\n    }\r\n\r\n    body{font-family:'Open Sans',sans-serif;color:var(--ink);margin:40px}\r\n    .container{max-width:820px;margin:0 auto}\r\n    h1{font-family:'Lora',serif;margin:0 0 10px}\r\n    .row{display:flex;gap:20px;flex-wrap:wrap;margin-bottom:16px;align-items:flex-end}\r\n    .col{min-width:240px;max-width:280px}\r\n\r\n    \/* Champs : margin-bottom global plus l\u00e9ger + labels compacts *\/\r\n    label,input,button,select{display:block;width:100%;margin-bottom:6px;font-size:16px}\r\n    label{font-size:14px;line-height:1.25;color:#333}\r\n    input[type=\"number\"],select{\r\n      box-sizing:border-box;height:40px;padding:0 10px;border:1px solid #ccc;border-radius:8px;\r\n      max-width:260px; \/* r\u00e9duit l\u00e9g\u00e8rement la largeur per\u00e7ue pour un alignement visuel *\/\r\n    }\r\n    select{\r\n      appearance:none;padding-right:40px;\r\n      background:url(\"data:image\/svg+xml,%3Csvg%20viewBox%3D'0%200%20140%20140'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2Fsvg'%3E%3Cpath%20d%3D'M%2040%2050%20L%2070%2090%20L%20100%2050'%20stroke%3D'%23000000'%20stroke-width%3D'10'%20fill%3D'none'%2F%3E%3C%2Fsvg%3E\") no-repeat 95% 50%;\r\n      background-size:15px 15px\r\n    }\r\n\r\n    .section{border:1px solid #eee;padding:14px;border-radius:12px;margin:12px 0;background:#fff}\r\n    .section h3{margin:0 0 10px;font-family:'Lora',serif;font-size:18px}\r\n    .inline-help{font-size:13px;color:var(--muted);margin:-2px 0 8px}\r\n    .drink-grid{display:flex;flex-wrap:wrap;gap:8px;margin-top:4px}\r\n    \/* Ajoute de l\u2019air entre la grille et l\u2019astuce *\/\r\n    .drink-grid + .inline-help{margin-top:10px}\r\n\r\n    button{font-family:'Lora',serif;background:var(--brand);color:var(--brand-ink);padding:10px;border:none;border-radius:8px;cursor:pointer;transition:.2s;margin-top:8px}\r\n    button:hover{background:#b0886c}\r\n    .drink-option{display:inline-block;padding:10px 14px;border:1px solid #ccc;background:#f9f9f9;color:var(--ink);border-radius:999px;cursor:pointer;user-select:none}\r\n    .drink-option.selected{background:var(--brand);color:var(--brand-ink);border-color:var(--brand)}\r\n    .result{margin-top:18px}\r\n    .muted{color:#777;font-size:13px}\r\n    .units{font-size:14px;color:#333}\r\n    .footer-note{font-size:12px;color:#777;margin-top:8px}\r\n    .badge{display:inline-block;background:#f1ebe6;color:#7a5a45;border:1px solid #e7d7cc;padding:2px 8px;border-radius:999px;font-size:12px;margin-left:6px}\r\n    .sum-note{font-size:12px;color:#666;margin-top:6px}\r\n\r\n    \/* Onglets *\/\r\n    .tabs{display:flex;gap:8px;margin:6px 0 10px}\r\n    .tab{padding:6px 10px;border:1px solid #ddd;border-radius:999px;font-size:13px;background:#f8f8f8;cursor:pointer}\r\n    .tab.active{background:var(--brand);color:#fff;border-color:var(--brand)}\r\n\r\n    \/* SIMPLE: carte + segmented pill centr\u00e9 *\/\r\n    .simple-mode{\r\n      background:var(--card);\r\n      border:1px solid var(--line);\r\n      border-radius:12px;\r\n      padding:12px;\r\n      margin-top:6px;\r\n    }\r\n    .simple-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;justify-content:center}\r\n    .segment{\r\n      position:relative;\r\n      display:flex;\r\n      justify-content:space-between;\r\n      width:360px;max-width:100%;\r\n      background:#fff;\r\n      border:1px solid var(--line);\r\n      border-radius:999px;\r\n      padding:3px;\r\n      margin:0 auto;\r\n      box-shadow:0 1px 0 #eee inset;\r\n    }\r\n    \/* Corrige l'effet du margin-bottom global dans le segment *\/\r\n    .segment label{margin-bottom:0}\r\n\r\n    .segment input{display:none}\r\n    .segment label{\r\n      flex:1;\r\n      text-align:center;\r\n      padding:10px 0;\r\n      font-size:14px;\r\n      cursor:pointer;\r\n      z-index:1;\r\n      user-select:none;\r\n      color:#5b4b40;\r\n    }\r\n    .segment .thumb{\r\n      position:absolute; top:3px; bottom:3px;\r\n      width:calc(50% - 3px);\r\n      background:var(--brand); border-radius:999px;\r\n      transition:transform .18s ease;\r\n    }\r\n    \/* \u00e9tats *\/\r\n    #alc_equal:checked ~ .thumb,\r\n    #nonalc_equal:checked ~ .thumb { transform:translateX(0); }\r\n    #alc_baseline:checked ~ .thumb,\r\n    #nonalc_baseline:checked ~ .thumb { transform:translateX(100%); }\r\n    .segment input:checked + label{ color:#fff; font-weight:600 }\r\n\r\n    .mode-note{font-size:12px;color:var(--muted);margin:8px 0 4px;text-align:center}\r\n\r\n    .preview{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px;justify-content:center}\r\n    .preview .chip{display:inline-block;padding:4px 10px;border:1px solid var(--line);\r\n      border-radius:999px;background:var(--chip-bg);color:#5b4b40;font-size:13px}\r\n\r\n    \/* AVANC\u00c9: sliders *\/\r\n    .mix-rows{display:grid;grid-template-columns:1fr 1fr auto;gap:8px 12px;align-items:center}\r\n    .mix-row{display:contents}\r\n    .mix-row[data-hidden=\"true\"]{display:none}\r\n    .lock{border:1px solid #ddd;background:#fff;border-radius:8px;padding:6px 8px;cursor:pointer;font-size:12px}\r\n    .lock[data-locked=\"true\"]{background:#ffd9a8;border-color:#e6b676}\r\n    .percent{width:70px}\r\n    .range{width:100%}\r\n  <\/style>\r\n<\/head>\r\n<body>\r\n  <div class=\"container\">\r\n    <p class=\"description\">\r\n      Ce calculateur vous aide \u00e0 estimer les quantit\u00e9s de boissons n\u00e9cessaires \r\n      pour votre anniversaire ou votre soir\u00e9e, en tenant compte du nombre d\u2019adultes, d\u2019enfants, du \r\n      pourcentage de buveurs d\u2019alcool, du niveau de consommation et de la dur\u00e9e.\r\n    <\/p>\r\n\r\n    <div class=\"row\">\r\n      <div class=\"col\">\r\n        <label for=\"adults\">Nombre d'adultes<\/label>\r\n        <input type=\"number\" id=\"adults\" value=\"10\" min=\"0\">\r\n      <\/div>\r\n      <div class=\"col\">\r\n        <label for=\"children\">Nombre d'enfants<\/label>\r\n        <input type=\"number\" id=\"children\" value=\"0\" min=\"0\">\r\n      <\/div>\r\n      <div class=\"col\">\r\n        <label for=\"alcohol_percentage\">% d'adultes qui boivent de l'alcool<\/label>\r\n        <input type=\"number\" id=\"alcohol_percentage\" value=\"100\" min=\"0\" max=\"100\">\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"row\">\r\n      <div class=\"col\">\r\n        <label for=\"drinkers_level\">Niveau de consommation<\/label>\r\n        <select id=\"drinkers_level\">\r\n          <option value=\"1\">Petit buveur<\/option>\r\n          <option value=\"2\">Buveur mod\u00e9r\u00e9<\/option>\r\n          <option value=\"3\" selected>Buveur moyen<\/option>\r\n          <option value=\"4\">Bon buveur<\/option>\r\n          <option value=\"5\">Tr\u00e8s bon buveur<\/option>\r\n        <\/select>\r\n      <\/div>\r\n      <div class=\"col\">\r\n        <label for=\"duration\">Dur\u00e9e (heures)<\/label>\r\n        <input type=\"number\" id=\"duration\" value=\"4\" min=\"0\">\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"section\">\r\n      <h3>Boissons \u00e0 inclure<\/h3>\r\n      <div class=\"drink-grid\" id=\"drinkGrid\">\r\n        <div class=\"drink-option selected\" data-drink=\"wine\">Vin<\/div>\r\n        <div class=\"drink-option selected\" data-drink=\"champagne\">Champagne<\/div>\r\n        <div class=\"drink-option selected\" data-drink=\"beer\">Bi\u00e8re<\/div>\r\n        <div class=\"drink-option\" data-drink=\"spirits\">Alcool fort<\/div>\r\n        <div class=\"drink-option\" data-drink=\"cocktails\">Cocktails<\/div>\r\n        <div class=\"drink-option selected\" data-drink=\"water\">Eau<\/div>\r\n        <div class=\"drink-option selected\" data-drink=\"soft_drinks\">Softs<\/div>\r\n        <div class=\"drink-option\" data-drink=\"coffee\">Caf\u00e9<\/div>\r\n      <\/div>\r\n      <div class=\"inline-help\">Astuce : s\u00e9lectionnez seulement ce que vous comptez r\u00e9ellement servir.<\/div>\r\n    <\/div>\r\n\r\n    <!-- --- Alcohol mix --- -->\r\n    <div class=\"section\" id=\"alcMixSection\">\r\n      <h3>R\u00e9partition des alcools (total 100%)<\/h3>\r\n\r\n      <div class=\"tabs\" data-target=\"alc\">\r\n        <div class=\"tab active\" data-mode=\"simple\">Simple (auto)<\/div>\r\n        <div class=\"tab\" data-mode=\"advanced\">Avanc\u00e9 (sliders)<\/div>\r\n      <\/div>\r\n\r\n      <div class=\"simple-mode\" id=\"alcSimple\">\r\n        <div class=\"simple-head\">\r\n          <div class=\"segment\" data-scope=\"alc\">\r\n            <input type=\"radio\" name=\"alc_mode\" id=\"alc_equal\" value=\"equal\" \/>\r\n            <label for=\"alc_equal\">R\u00e9partition \u00e9gale<\/label>\r\n\r\n            <input type=\"radio\" name=\"alc_mode\" id=\"alc_baseline\" value=\"baseline\" checked \/>\r\n            <label for=\"alc_baseline\">R\u00e9partition r\u00e9aliste<\/label>\r\n\r\n            <div class=\"thumb\"><\/div>\r\n          <\/div>\r\n          <div class=\"mode-note\">Choisissez entre parts \u00e9gales ou proportions r\u00e9alistes (r\u00e9f\u00e9rences moyennes).<\/div>\r\n        <\/div>\r\n        <div class=\"preview\" id=\"alcPreview\"><\/div>\r\n        <div class=\"sum-note\" id=\"alcSumNote\">Somme actuelle : 100%<\/div>\r\n      <\/div>\r\n\r\n      <div class=\"advanced-mode\" id=\"alcAdvanced\" style=\"display:none\">\r\n        <div class=\"mix-rows\" id=\"alcMix\"><!-- rows g\u00e9n\u00e9r\u00e9s en JS --><\/div>\r\n        <div class=\"sum-note\" id=\"alcSumNoteAdv\">Somme actuelle : 100%<\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- --- Non-alcohol mix --- -->\r\n    <div class=\"section\" id=\"nonAlcMixSection\">\r\n      <h3>R\u00e9partition des boissons non alcoolis\u00e9es (total 100%)<\/h3>\r\n\r\n      <div class=\"tabs\" data-target=\"nonAlc\">\r\n        <div class=\"tab active\" data-mode=\"simple\">Simple (auto)<\/div>\r\n        <div class=\"tab\" data-mode=\"advanced\">Avanc\u00e9 (sliders)<\/div>\r\n      <\/div>\r\n\r\n    <div class=\"simple-mode\" id=\"nonAlcSimple\">\r\n        <div class=\"simple-head\">\r\n          <div class=\"segment\" data-scope=\"nonAlc\">\r\n            <input type=\"radio\" name=\"nonalc_mode\" id=\"nonalc_equal\" value=\"equal\" \/>\r\n            <label for=\"nonalc_equal\">R\u00e9partition \u00e9gale<\/label>\r\n\r\n            <input type=\"radio\" name=\"nonalc_mode\" id=\"nonalc_baseline\" value=\"baseline\" checked \/>\r\n            <label for=\"nonalc_baseline\">R\u00e9partition r\u00e9aliste<\/label>\r\n\r\n            <div class=\"thumb\"><\/div>\r\n          <\/div>\r\n          <div class=\"mode-note\">Aucune saisie : les parts s\u2019ajustent automatiquement selon vos s\u00e9lections.<\/div>\r\n        <\/div>\r\n        <div class=\"preview\" id=\"nonAlcPreview\"><\/div>\r\n        <div class=\"sum-note\" id=\"nonAlcSumNote\">Somme actuelle : 100%<\/div>\r\n      <\/div>\r\n\r\n      <div class=\"advanced-mode\" id=\"nonAlcAdvanced\" style=\"display:none\">\r\n        <div class=\"mix-rows\" id=\"nonAlcMix\"><!-- rows g\u00e9n\u00e9r\u00e9s en JS --><\/div>\r\n        <div class=\"sum-note\" id=\"nonAlcSumNoteAdv\">Somme actuelle : 100%<\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <button id=\"calcBtn\" type=\"button\">Calculer<\/button>\r\n    <div class=\"result\" id=\"result\"><\/div>\r\n    <div class=\"footer-note muted\">R\u00e9f\u00e9rences pour un adulte \u201cmoyen\u201d sur 4h. Ajust\u00e9es par niveau et dur\u00e9e.<\/div>\r\n  <\/div>\r\n\r\n  <script>\r\n    \/\/ --- R\u00e9f\u00e9rences ---\r\n    const adultBaselineAlc4h    = { wine:0.3, champagne:0.3, beer:0.5, spirits:0.2, cocktails:0.4 };\r\n    const adultBaselineNonAlc4h = { water:0.6, soft_drinks:0.4, coffee:0.1 };\r\n    const childBaselineNonAlc4h = { water:0.4, soft_drinks:0.3, coffee:0 };\r\n\r\n    \/\/ --- Multiplicateurs ---\r\n    const drinkerLevelAlc = {1:0.6, 2:0.85, 3:1.0, 4:1.2, 5:1.45};\r\n    const drinkerLevelNonAlc = {1:1.0, 2:1.0, 3:1.05, 4:1.1, 5:1.15};\r\n\r\n    \/\/ --- \u00c9tat des onglets ---\r\n    const mode = { alc: 'simple', nonAlc: 'simple' };\r\n\r\n    \/\/ --- Helpers DOM ---\r\n    const resultEl = document.getElementById('result');\r\n    const drinkGrid = document.getElementById('drinkGrid');\r\n    const labels = { wine:'Vin', champagne:'Champagne', beer:'Bi\u00e8re', spirits:'Alcool fort', cocktails:'Cocktails',\r\n                     water:'Eau', soft_drinks:'Softs', coffee:'Caf\u00e9' };\r\n\r\n    \/\/ Utils\r\n    function getSelectedDrinks(){\r\n      return Array.from(document.querySelectorAll('.drink-option.selected')).map(o=>o.dataset.drink);\r\n    }\r\n    function taperedDurationFactor(hours){\r\n      if (hours <= 0) return 0;\r\n      const h1 = Math.min(hours, 2);\r\n      const h2 = Math.min(Math.max(hours-2,0),2);\r\n      const h3 = Math.max(hours-4,0);\r\n      return (h1*1.2 + h2*1.0 + h3*0.6) \/ 4;\r\n    }\r\n    function roundUpUnits(totalLiters, unitLiters){\r\n      return Math.ceil((totalLiters + 1e-9)\/unitLiters);\r\n    }\r\n    function debounce(fn, delay=120){ let t; return (...a)=>{ clearTimeout(t); t=setTimeout(()=>fn(...a), delay); }; }\r\n    function preventWheelOnNumberInputs(){\r\n      document.querySelectorAll('input[type=\"number\"]').forEach(inp=>{\r\n        inp.addEventListener('wheel', e=>{ e.preventDefault(); inp.blur(); }, {passive:false});\r\n      });\r\n    }\r\n\r\n    \/\/ Build advanced rows\r\n    function buildAdvancedRows(){\r\n      const alcMix = document.getElementById('alcMix');\r\n      const nonAlcMix = document.getElementById('nonAlcMix');\r\n      const makeRow = (key) => {\r\n        const row = document.createElement('div');\r\n        row.className = 'mix-row'; row.dataset.mix = key;\r\n\r\n        const lab = document.createElement('label'); lab.textContent = labels[key];\r\n\r\n        const control = document.createElement('div');\r\n        control.style.display='flex'; control.style.gap='8px'; control.style.alignItems='center';\r\n        const range = Object.assign(document.createElement('input'), {type:'range', min:0, max:100, step:1, value:0, className:'range'});\r\n        const num   = Object.assign(document.createElement('input'), {type:'number', min:0, max:100, step:1, value:0, className:'percent'});\r\n\r\n        const lock  = document.createElement('button'); lock.type='button'; lock.className='lock'; lock.textContent='\ud83d\udd13'; lock.dataset.locked='false';\r\n\r\n        const syncPair = (v)=>{ range.value=v; num.value=v; };\r\n        range.addEventListener('input', ()=>{ syncPair(range.value); rebalanceForChange(row.closest('.mix-rows').id, key); });\r\n        num  .addEventListener('input', ()=>{ syncPair(num.value);   rebalanceForChange(row.closest('.mix-rows').id, key); });\r\n        lock .addEventListener('click', ()=>{ const L=lock.dataset.locked==='true'; lock.dataset.locked=(!L).toString(); lock.textContent=L?'\ud83d\udd13':'\ud83d\udd12'; });\r\n\r\n        control.appendChild(range); control.appendChild(num);\r\n        row.appendChild(lab); row.appendChild(control); row.appendChild(lock);\r\n        return row;\r\n      };\r\n\r\n      Object.keys(adultBaselineAlc4h).forEach(k=>alcMix.appendChild(makeRow(k)));\r\n      Object.keys(adultBaselineNonAlc4h).forEach(k=>nonAlcMix.appendChild(makeRow(k)));\r\n    }\r\n\r\n    \/\/ Visibility for advanced rows\r\n    function syncVisibility(){\r\n      const selected = getSelectedDrinks();\r\n      ['alcMix','nonAlcMix'].forEach(containerId=>{\r\n        Array.from(document.querySelectorAll(`#${containerId} .mix-row`)).forEach(r=>{\r\n          const show = selected.includes(r.dataset.mix);\r\n          r.dataset.hidden = show ? 'false' : 'true';\r\n          if (!show){\r\n            r.querySelector('.range').value = 0;\r\n            r.querySelector('.percent').value = 0;\r\n          }\r\n        });\r\n      });\r\n    }\r\n\r\n    \/\/ Sliders value I\/O\r\n    function writeAdvancedValues(scope, obj){\r\n      const containerId = scope==='alc' ? 'alcMix' : 'nonAlcMix';\r\n      Array.from(document.querySelectorAll(`#${containerId} .mix-row`)).forEach(r=>{\r\n        const k = r.dataset.mix, v = (obj && obj[k]!=null) ? obj[k] : 0;\r\n        r.querySelector('.range').value = v;\r\n        r.querySelector('.percent').value = v;\r\n      });\r\n    }\r\n    function readMix(scope){\r\n      const containerId = scope==='alc' ? 'alcMix' : 'nonAlcMix';\r\n      const selected = getSelectedDrinks();\r\n      const rows = Array.from(document.querySelectorAll(`#${containerId} .mix-row`)).filter(r=>selected.includes(r.dataset.mix));\r\n      const out={}; let sum=0;\r\n      rows.forEach(r=>{ const v=Math.max(0,Math.min(100,+r.querySelector('.percent').value||0)); out[r.dataset.mix]=v; sum+=v; });\r\n      if (sum<=0) return {};\r\n      const norm={}; Object.entries(out).forEach(([k,v])=>norm[k]=v\/sum); return norm;\r\n    }\r\n\r\n    \/\/ Rebalance (advanced)\r\n    function rebalanceForChange(containerId, changedKey){\r\n      const rowsAll = Array.from(document.querySelectorAll(`#${containerId} .mix-row`)).filter(r=>r.dataset.hidden!=='true');\r\n      if (!rowsAll.length) return;\r\n      const entries = rowsAll.map(r=>{\r\n        const key=r.dataset.mix, val=+r.querySelector('.percent').value||0, locked=r.querySelector('.lock').dataset.locked==='true';\r\n        return {key, val:Math.max(0,Math.min(100,Math.round(val))), locked, row:r};\r\n      });\r\n      let delta = 100 - entries.reduce((a,e)=>a+e.val,0);\r\n      let pool = entries.filter(e=>!e.locked && e.key!==changedKey); if (!pool.length) pool = entries.filter(e=>!e.locked);\r\n      while(delta!==0 && pool.length){\r\n        for(let i=0;i<pool.length && delta!==0;i++){\r\n          const e=pool[i], next=e.val + (delta>0?1:-1);\r\n          if(next>=0 && next<=100){ e.val=next; delta += (delta>0?-1:+1); }\r\n        }\r\n        pool = pool.filter(e => (delta>0 ? e.val<100 : e.val>0));\r\n        if(!pool.length && delta!==0){\r\n          const ch=entries.find(e=>e.key===changedKey && !e.locked);\r\n          if(ch){ const n=ch.val + (delta>0?1:-1); if(n>=0 && n<=100){ ch.val=n; delta += (delta>0?-1:+1); } }\r\n        }\r\n      }\r\n      entries.forEach(e=>{ e.row.querySelector('.range').value=e.val; e.row.querySelector('.percent').value=e.val; });\r\n      updateSumLabels(); calculateDrinks();\r\n    }\r\n\r\n    \/\/ SIMPLE (auto)\r\n    function percentMapToChips(scope, map){\r\n      const el = document.getElementById(scope==='alc' ? 'alcPreview' : 'nonAlcPreview');\r\n      const entries = Object.entries(map).filter(([_,v])=>v>0);\r\n      el.innerHTML = entries.map(([k,v])=>`<span class=\"chip\">${labels[k]} ${v}%<\/span>`).join(' ');\r\n    }\r\n    function autoMix(scope, style='baseline'){\r\n      const selected = getSelectedDrinks();\r\n      const keysAll = scope==='alc' ? Object.keys(adultBaselineAlc4h) : Object.keys(adultBaselineNonAlc4h);\r\n      const base    = scope==='alc' ? adultBaselineAlc4h : adultBaselineNonAlc4h;\r\n      const visible = keysAll.filter(k=>selected.includes(k));\r\n\r\n      let weights = {};\r\n      if (style==='equal' || !visible.length){ visible.forEach(k=>weights[k]=1); }\r\n      else { visible.forEach(k=>weights[k]=base[k]||0); }\r\n\r\n      const sum = Object.values(weights).reduce((a,b)=>a+b,0) || 1;\r\n      let rounded = visible.map(k => ({k, v: Math.round(weights[k]*100\/sum)}));\r\n      let delta = 100 - rounded.reduce((a,o)=>a+o.v,0);\r\n      if (rounded.length) rounded[rounded.length-1].v += delta;\r\n\r\n      const obj = Object.fromEntries(rounded.map(o=>[o.k,o.v]));\r\n      writeAdvancedValues(scope, obj);\r\n      percentMapToChips(scope, obj);\r\n      updateSumLabels();\r\n    }\r\n\r\n    \/\/ Labels de somme\r\n    function updateSumLabels(){\r\n      [\r\n        {advId:'alcMix', noteSimple:'alcSumNote', noteAdv:'alcSumNoteAdv'},\r\n        {advId:'nonAlcMix', noteSimple:'nonAlcSumNote', noteAdv:'nonAlcSumNoteAdv'}\r\n      ].forEach(s=>{\r\n        const rows = Array.from(document.querySelectorAll(`#${s.advId} .mix-row`)).filter(r=>r.dataset.hidden!=='true');\r\n        const total = rows.reduce((a,r)=> a + (+r.querySelector('.percent').value || 0), 0);\r\n        const t = Math.round(total);\r\n        const ns = document.getElementById(s.noteSimple); if (ns) ns.textContent = `Somme actuelle : ${t}%`;\r\n        const na = document.getElementById(s.noteAdv);    if (na) na.textContent = `Somme actuelle : ${t}%`;\r\n      });\r\n    }\r\n\r\n    \/\/ Calcul principal\r\n    function calculateDrinks(){\r\n      const adults = +document.getElementById('adults').value || 0;\r\n      const children = +document.getElementById('children').value || 0;\r\n      const duration = +document.getElementById('duration').value || 1;\r\n      const level = +document.getElementById('drinkers_level').value || 3;\r\n      const alcohol_percentage = Math.min(100, Math.max(0, +document.getElementById('alcohol_percentage').value || 0));\r\n\r\n      const selected = getSelectedDrinks();\r\n      const alcohol_drinkers = adults * (alcohol_percentage\/100);\r\n\r\n      const durF = taperedDurationFactor(duration);\r\n      const alcMult = drinkerLevelAlc[level] ?? 1;\r\n      const nonAlcMult = drinkerLevelNonAlc[level] ?? 1;\r\n\r\n      let html = \"<h2>Quantit\u00e9s recommand\u00e9es<\/h2>\";\r\n\r\n      \/\/ Alcool\r\n      const alcoholicKeys = Object.keys(adultBaselineAlc4h).filter(k=>selected.includes(k));\r\n      if (alcoholicKeys.length){\r\n        const adultAlcPool = alcoholicKeys.reduce((a,k)=>a+adultBaselineAlc4h[k],0);\r\n        const totalAlcPerAdult = adultAlcPool * alcMult * durF;\r\n        const totalAlc = totalAlcPerAdult * alcohol_drinkers;\r\n        const alcMix = readMix('alc');\r\n\r\n        alcoholicKeys.forEach(drink=>{\r\n          const liters = totalAlc * (alcMix[drink] || 0);\r\n          const L = liters;\r\n          if (drink==='wine' || drink==='champagne'){\r\n            const bottles = roundUpUnits(L, 0.75);\r\n            html += `<p>${drink==='wine'?'Vin':'Champagne'} : <span class=\"units\">\u2248 ${L.toFixed(1)} L<\/span> (\u2248 <b>${bottles}<\/b> \u00d7 75 cL)<\/p>`;\r\n          } else if (drink==='beer'){\r\n            const b33 = roundUpUnits(L, 0.33);\r\n            const k20 = roundUpUnits(L, 20);\r\n            html += `<p>Bi\u00e8re : <span class=\"units\">\u2248 ${L.toFixed(1)} L<\/span> (\u2248 <b>${b33}<\/b> \u00d7 33 cL, ou <b>${k20}<\/b> f\u00fbt(s) de 20 L)<\/p>`;\r\n          } else if (drink==='spirits'){\r\n            const b70 = roundUpUnits(L, 0.7);\r\n            html += `<p>Alcool fort : <span class=\"units\">\u2248 ${L.toFixed(1)} L<\/span> (\u2248 <b>${b70}<\/b> bouteilles de 70 cL)<\/p>`;\r\n          } else {\r\n            html += `<p>Cocktails (pr\u00e9-mix) : <span class=\"units\">\u2248 ${L.toFixed(1)} L<\/span><\/p>`;\r\n          }\r\n        });\r\n      }\r\n\r\n      \/\/ Non alcool\r\n      const nonAlcKeys = Object.keys(adultBaselineNonAlc4h).filter(k=>selected.includes(k));\r\n      if (nonAlcKeys.length){\r\n        const adultNonAlcPool = nonAlcKeys.reduce((a,k)=>a+(adultBaselineNonAlc4h[k]||0),0);\r\n        const totalNonAlcPerAdult = adultNonAlcPool * nonAlcMult * durF;\r\n        const totalNonAlcAdults = totalNonAlcPerAdult * adults;\r\n\r\n        const childPool = nonAlcKeys.reduce((a,k)=>a+(childBaselineNonAlc4h[k]||0),0);\r\n        const totalNonAlcChildren = childPool * (duration\/4) * children;\r\n\r\n        const totalNonAlc = (totalNonAlcAdults + totalNonAlcChildren);\r\n        const nonAlcMix = readMix('nonAlc');\r\n\r\n        nonAlcKeys.forEach(drink=>{\r\n          const share = nonAlcMix[drink] || 0;\r\n          const liters = totalNonAlc * share;\r\n          const L = liters;\r\n          if (drink==='water'){\r\n            const bot15 = roundUpUnits(L, 1.5);\r\n            html += `<p>Eau : <span class=\"units\">\u2248 ${L.toFixed(1)} L<\/span> (\u2248 <b>${bot15}<\/b> \u00d7 1,5 L)<\/p>`;\r\n          } else if (drink==='soft_drinks'){\r\n            const bot1 = roundUpUnits(L, 1);\r\n            html += `<p>Softs : <span class=\"units\">\u2248 ${L.toFixed(1)} L<\/span> (\u2248 <b>${bot1}<\/b> \u00d7 1 L)<\/p>`;\r\n          } else if (drink==='coffee'){\r\n            const cups = Math.ceil(L \/ 0.125);\r\n            html += `<p>Caf\u00e9 : <span class=\"units\">\u2248 ${cups}<\/span> tasses<\/p>`;\r\n          }\r\n        });\r\n      }\r\n\r\n      if (!alcoholicKeys.length && !nonAlcKeys.length){ html += \"<p>Aucune boisson s\u00e9lectionn\u00e9e.<\/p>\"; }\r\n      resultEl.innerHTML = html;\r\n    }\r\n\r\n    \/\/ Tabs\r\n    function bindTabs(){\r\n      document.querySelectorAll('.tabs').forEach(tabs=>{\r\n        const target = tabs.dataset.target;\r\n        tabs.addEventListener('click', e=>{\r\n          const tab = e.target.closest('.tab'); if (!tab) return;\r\n          tabs.querySelectorAll('.tab').forEach(t=>t.classList.remove('active'));\r\n          tab.classList.add('active');\r\n          mode[target] = tab.dataset.mode;\r\n\r\n          const simpleEl = document.getElementById(target==='alc'?'alcSimple':'nonAlcSimple');\r\n          const advEl    = document.getElementById(target==='alc'?'alcAdvanced':'nonAlcAdvanced');\r\n          if (mode[target]==='simple'){ simpleEl.style.display=''; advEl.style.display='none'; }\r\n          else { simpleEl.style.display='none'; advEl.style.display=''; }\r\n\r\n          if (mode[target]==='simple') {\r\n            const val = (target==='alc'\r\n              ? document.querySelector('#alcSimple .segment input:checked')?.value\r\n              : document.querySelector('#nonAlcSimple .segment input:checked')?.value) || 'baseline';\r\n            autoMix(target, val);\r\n          }\r\n          updateSumLabels(); calculateDrinks();\r\n        });\r\n      });\r\n    }\r\n\r\n    \/\/ Radios simple\r\n    function bindSimpleRadios(){\r\n      document.querySelectorAll('.segment').forEach(seg=>{\r\n        seg.addEventListener('change', ()=>{\r\n          const scope = seg.dataset.scope;\r\n          const val = seg.querySelector('input:checked')?.value || 'baseline';\r\n          autoMix(scope, val); calculateDrinks();\r\n        });\r\n      });\r\n    }\r\n\r\n    \/\/ S\u00e9lection boissons\r\n    function bindDrinks(){\r\n      drinkGrid.addEventListener('click', (e)=>{\r\n        const node = e.target.closest('.drink-option'); if (!node) return;\r\n        node.classList.toggle('selected');\r\n        syncVisibility();\r\n        if (mode.alc==='simple'){\r\n          const v = document.querySelector('#alcSimple .segment input:checked')?.value || 'baseline';\r\n          autoMix('alc', v);\r\n        }\r\n        if (mode.nonAlc==='simple'){\r\n          const v = document.querySelector('#nonAlcSimple .segment input:checked')?.value || 'baseline';\r\n          autoMix('nonAlc', v);\r\n        }\r\n        updateSumLabels(); calculateDrinks();\r\n      });\r\n    }\r\n\r\n    \/\/ Globals\r\n    function bindGlobals(){\r\n      const recalcIds = ['adults','children','alcohol_percentage','drinkers_level','duration'];\r\n      const debounced = debounce(()=>{ updateSumLabels(); calculateDrinks(); }, 120);\r\n      recalcIds.forEach(id=>{\r\n        const el = document.getElementById(id);\r\n        if (el) el.addEventListener('input', debounced);\r\n      });\r\n      document.getElementById('calcBtn').addEventListener('click', ()=>{ updateSumLabels(); calculateDrinks(); });\r\n    }\r\n\r\n    \/\/ Init\r\n    (function init(){\r\n      buildAdvancedRows();\r\n      preventWheelOnNumberInputs();\r\n      bindTabs(); bindSimpleRadios(); bindDrinks(); bindGlobals();\r\n      syncVisibility();\r\n      autoMix('alc','baseline');\r\n      autoMix('nonAlc','baseline');\r\n      updateSumLabels();\r\n      calculateDrinks();\r\n    })();\r\n  <\/script>\r\n<\/body>\r\n<\/html>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><em><strong>Attention :<\/strong> Ces estimations, bas\u00e9es sur des r\u00e9f\u00e9rences pour un adulte, sont des rep\u00e8res d&#8217;aide \u00e0 la d\u00e9cision, non des mesures pr\u00e9cises. De nombreux facteurs (climat, app\u00e9tit, moment de la journ\u00e9e, pr\u00e9f\u00e9rences personnelles, etc.) peuvent influencer les besoins r\u00e9els. <strong>Ajustez<\/strong> toujours en fonction de vos <strong>circonstances<\/strong> sp\u00e9cifiques et de votre <strong>exp\u00e9rience<\/strong>.<\/em><\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<h2><\/h2>\n<h2>Besoin d&#8217;une id\u00e9e cadeau pour un anniversaire ? \ud83c\udf81<\/h2>\n<p><a href=\"https:\/\/www.revellia.com\/fr\/posters\/carte-ciel-etoile-personnalisee\/\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" class=\"aligncenter\" style=\"width: 400px;\" src=\"https:\/\/www.revellia.com\/wp-content\/themes\/flat-lea\/img\/poster-page\/starmap\/mosaic\/4.jpg\" alt=\"A woman holding a starmap poster\" \/><\/a><\/p>\n<p>Surprenez vos proches avec une <a href=\"https:\/\/www.revellia.com\/fr\/posters\/carte-ciel-etoile-personnalisee\/\" target=\"_blank\" rel=\"noopener\"><strong>Affiche Carte du Ciel \u00c9toil\u00e9 Personnalis\u00e9e<\/strong><\/a>. Offrez une repr\u00e9sentation des \u00e9toiles telles qu\u2019elles \u00e9taient le jour de leur naissance ou d\u2019un moment important de leur vie. Simple, original et rempli d\u2019\u00e9motion, c\u2019est le cadeau parfait pour rendre un anniversaire inoubliable.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<h2><\/h2>\n<h2>Explications des calculs<\/h2>\n<div class=\"flex-1 overflow-hidden @container\/thread\">\n<div class=\"h-full\">\n<div class=\"react-scroll-to-bottom--css-gcgxg-79elbk h-full\">\n<div class=\"react-scroll-to-bottom--css-gcgxg-1n7m0yu\">\n<div class=\"flex flex-col text-sm md:pb-9\">\n<article class=\"w-full scroll-mb-[var(--thread-trailing-height,150px)] text-token-text-primary focus-visible:outline-2 focus-visible:outline-offset-[-4px]\" dir=\"auto\" data-testid=\"conversation-turn-9\" data-scroll-anchor=\"true\">\n<div class=\"m-auto text-base py-[18px] px-3 md:px-4 w-full md:px-5 lg:px-4 xl:px-5\">\n<div class=\"mx-auto flex flex-1 gap-4 text-base md:gap-5 lg:gap-6 md:max-w-3xl lg:max-w-[40rem] xl:max-w-[48rem]\">\n<div class=\"group\/conversation-turn relative flex w-full min-w-0 flex-col agent-turn\">\n<div class=\"flex-col gap-1 md:gap-3\">\n<div class=\"flex max-w-full flex-col flex-grow\">\n<div class=\"min-h-8 text-message flex w-full flex-col items-end gap-2 whitespace-normal break-words text-start [.text-message+&amp;]:mt-5\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"938970a3-69ee-4917-811b-6e838003726e\" data-message-model-slug=\"gpt-4o\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[3px]\">\n<div class=\"markdown prose w-full break-words dark:prose-invert dark\">\n<p>Les estimations sont bas\u00e9es sur des valeurs de r\u00e9f\u00e9rence pour un adulte \u00ab\u202fbuveur moyen\u202f\u00bb sur 4 heures. Par exemple\u202f: 0,3 L de vin, 0,3 L de champagne, 0,5 L de bi\u00e8re, 0,6 L d&#8217;eau, 0,4 L de softs et 0,1 L de caf\u00e9. Ces quantit\u00e9s sont ajust\u00e9es selon plusieurs param\u00e8tres\u202f:<\/p>\n<p><strong>1. Niveau de consommation<\/strong>\u202f: Vous choisissez un profil (petit \u00e0 tr\u00e8s bon buveur) qui applique un multiplicateur aux quantit\u00e9s de base. Par exemple, un petit buveur consomme environ 60 % de la r\u00e9f\u00e9rence, un tr\u00e8s bon buveur environ 145 %.<\/p>\n<p><strong>2. Dur\u00e9e de l&#8217;\u00e9v\u00e9nement<\/strong>\u202f: Les besoins sont ajust\u00e9s en fonction de la dur\u00e9e, avec une augmentation progressive mais moins forte apr\u00e8s 4 heures. Par exemple, pour un \u00e9v\u00e9nement de 6 heures, les quantit\u00e9s augmentent d&#8217;environ 40 %.<\/p>\n<p><strong>3. Pourcentage de buveurs d&#8217;alcool<\/strong>\u202f: Seul ce pourcentage est pris en compte pour r\u00e9partir les boissons alcoolis\u00e9es. Tous les adultes contribuent aux besoins en boissons non alcoolis\u00e9es.<\/p>\n<p><strong>4. R\u00e9partition des boissons<\/strong>\u202f: Les volumes totaux sont r\u00e9partis entre les boissons s\u00e9lectionn\u00e9es. Pour cela, vous pouvez choisir une r\u00e9partition \u00e9gale, une r\u00e9partition r\u00e9aliste bas\u00e9e sur des r\u00e9f\u00e9rences, ou bien d\u00e9finir manuellement les pourcentages.<\/p>\n<p><strong>5. Enfants<\/strong>\u202f: Ils sont pris en compte s\u00e9par\u00e9ment pour les boissons non alcoolis\u00e9es (par exemple, 0,4 L d&#8217;eau et 0,3 L de softs par enfant sur 4 heures, ajust\u00e9s proportionnellement \u00e0 la dur\u00e9e).<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; &nbsp; Attention : Ces estimations, bas\u00e9es sur des r\u00e9f\u00e9rences pour un adulte, sont des rep\u00e8res d&#8217;aide \u00e0 la d\u00e9cision, non des mesures pr\u00e9cises. De nombreux facteurs (climat, app\u00e9tit, moment de la journ\u00e9e, pr\u00e9f\u00e9rences personnelles, etc.) peuvent influencer les besoins r\u00e9els. Ajustez toujours en fonction de vos circonstances sp\u00e9cifiques et de votre exp\u00e9rience. &nbsp; Besoin [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":7947,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"powered_cache_disable_cache":false,"footnotes":""},"categories":[80],"tags":[],"class_list":["post-7931","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-calculateur"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Calculateur de Boissons pour Anniversaire et Soir\u00e9e - Revellia<\/title>\n<meta name=\"description\" content=\"Estimez facilement les quantit\u00e9s de boissons pour votre anniversaire : alcoolis\u00e9es, softs et plus, pour une f\u00eate r\u00e9ussie !\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Calculateur de Boissons pour Anniversaire et Soir\u00e9e - Revellia\" \/>\n<meta property=\"og:description\" content=\"Estimez facilement les quantit\u00e9s de boissons pour votre anniversaire : alcoolis\u00e9es, softs et plus, pour une f\u00eate r\u00e9ussie !\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/\" \/>\n<meta property=\"og:site_name\" content=\"Revellia\" \/>\n<meta property=\"article:published_time\" content=\"2025-01-09T17:34:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-27T19:23:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.revellia.com\/wp-content\/uploads\/2025\/01\/calculateur-boissons-anniversaire.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1312\" \/>\n\t<meta property=\"og:image:height\" content=\"736\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"revellia\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"revellia\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/\"},\"author\":{\"name\":\"revellia\",\"@id\":\"https:\/\/www.revellia.com\/fr\/#\/schema\/person\/ed93b9acee6a9c6926b15f3432b75107\"},\"headline\":\"Calculateur de Boissons pour Anniversaire et Soir\u00e9e\",\"datePublished\":\"2025-01-09T17:34:53+00:00\",\"dateModified\":\"2025-08-27T19:23:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/\"},\"wordCount\":374,\"publisher\":{\"@id\":\"https:\/\/www.revellia.com\/fr\/#organization\"},\"articleSection\":[\"Calculateur\"],\"inLanguage\":\"fr-FR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/\",\"url\":\"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/\",\"name\":\"Calculateur de Boissons pour Anniversaire et Soir\u00e9e - Revellia\",\"isPartOf\":{\"@id\":\"https:\/\/www.revellia.com\/fr\/#website\"},\"datePublished\":\"2025-01-09T17:34:53+00:00\",\"dateModified\":\"2025-08-27T19:23:07+00:00\",\"description\":\"Estimez facilement les quantit\u00e9s de boissons pour votre anniversaire : alcoolis\u00e9es, softs et plus, pour une f\u00eate r\u00e9ussie !\",\"breadcrumb\":{\"@id\":\"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.revellia.com\/fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Calculateur de Boissons pour Anniversaire et Soir\u00e9e\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.revellia.com\/fr\/#website\",\"url\":\"https:\/\/www.revellia.com\/fr\/\",\"name\":\"Revellia\",\"description\":\"Personalized original posters\",\"publisher\":{\"@id\":\"https:\/\/www.revellia.com\/fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.revellia.com\/fr\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.revellia.com\/fr\/#organization\",\"name\":\"Revellia\",\"url\":\"https:\/\/www.revellia.com\/fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/www.revellia.com\/fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.revellia.com\/wp-content\/uploads\/2023\/01\/cropped-favicon-base.png\",\"contentUrl\":\"https:\/\/www.revellia.com\/wp-content\/uploads\/2023\/01\/cropped-favicon-base.png\",\"width\":512,\"height\":512,\"caption\":\"Revellia\"},\"image\":{\"@id\":\"https:\/\/www.revellia.com\/fr\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.revellia.com\/fr\/#\/schema\/person\/ed93b9acee6a9c6926b15f3432b75107\",\"name\":\"revellia\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/www.revellia.com\/fr\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d184db90857a130f33fa4ed972562208697f2cbbb8b5a04cc51dc3a4bd861728?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d184db90857a130f33fa4ed972562208697f2cbbb8b5a04cc51dc3a4bd861728?s=96&d=mm&r=g\",\"caption\":\"revellia\"},\"sameAs\":[\"https:\/\/www.revellia.com\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Calculateur de Boissons pour Anniversaire et Soir\u00e9e - Revellia","description":"Estimez facilement les quantit\u00e9s de boissons pour votre anniversaire : alcoolis\u00e9es, softs et plus, pour une f\u00eate r\u00e9ussie !","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/","og_locale":"fr_FR","og_type":"article","og_title":"Calculateur de Boissons pour Anniversaire et Soir\u00e9e - Revellia","og_description":"Estimez facilement les quantit\u00e9s de boissons pour votre anniversaire : alcoolis\u00e9es, softs et plus, pour une f\u00eate r\u00e9ussie !","og_url":"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/","og_site_name":"Revellia","article_published_time":"2025-01-09T17:34:53+00:00","article_modified_time":"2025-08-27T19:23:07+00:00","og_image":[{"width":1312,"height":736,"url":"https:\/\/www.revellia.com\/wp-content\/uploads\/2025\/01\/calculateur-boissons-anniversaire.jpg","type":"image\/jpeg"}],"author":"revellia","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"revellia","Dur\u00e9e de lecture estim\u00e9e":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/#article","isPartOf":{"@id":"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/"},"author":{"name":"revellia","@id":"https:\/\/www.revellia.com\/fr\/#\/schema\/person\/ed93b9acee6a9c6926b15f3432b75107"},"headline":"Calculateur de Boissons pour Anniversaire et Soir\u00e9e","datePublished":"2025-01-09T17:34:53+00:00","dateModified":"2025-08-27T19:23:07+00:00","mainEntityOfPage":{"@id":"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/"},"wordCount":374,"publisher":{"@id":"https:\/\/www.revellia.com\/fr\/#organization"},"articleSection":["Calculateur"],"inLanguage":"fr-FR"},{"@type":"WebPage","@id":"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/","url":"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/","name":"Calculateur de Boissons pour Anniversaire et Soir\u00e9e - Revellia","isPartOf":{"@id":"https:\/\/www.revellia.com\/fr\/#website"},"datePublished":"2025-01-09T17:34:53+00:00","dateModified":"2025-08-27T19:23:07+00:00","description":"Estimez facilement les quantit\u00e9s de boissons pour votre anniversaire : alcoolis\u00e9es, softs et plus, pour une f\u00eate r\u00e9ussie !","breadcrumb":{"@id":"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.revellia.com\/fr\/calculateur-de-boisson-anniversaire\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.revellia.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Calculateur de Boissons pour Anniversaire et Soir\u00e9e"}]},{"@type":"WebSite","@id":"https:\/\/www.revellia.com\/fr\/#website","url":"https:\/\/www.revellia.com\/fr\/","name":"Revellia","description":"Personalized original posters","publisher":{"@id":"https:\/\/www.revellia.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.revellia.com\/fr\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/www.revellia.com\/fr\/#organization","name":"Revellia","url":"https:\/\/www.revellia.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.revellia.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/www.revellia.com\/wp-content\/uploads\/2023\/01\/cropped-favicon-base.png","contentUrl":"https:\/\/www.revellia.com\/wp-content\/uploads\/2023\/01\/cropped-favicon-base.png","width":512,"height":512,"caption":"Revellia"},"image":{"@id":"https:\/\/www.revellia.com\/fr\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.revellia.com\/fr\/#\/schema\/person\/ed93b9acee6a9c6926b15f3432b75107","name":"revellia","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.revellia.com\/fr\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d184db90857a130f33fa4ed972562208697f2cbbb8b5a04cc51dc3a4bd861728?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d184db90857a130f33fa4ed972562208697f2cbbb8b5a04cc51dc3a4bd861728?s=96&d=mm&r=g","caption":"revellia"},"sameAs":["https:\/\/www.revellia.com"]}]}},"jetpack_featured_media_url":"https:\/\/www.revellia.com\/wp-content\/uploads\/2025\/01\/calculateur-boissons-anniversaire.jpg","_links":{"self":[{"href":"https:\/\/www.revellia.com\/fr\/wp-json\/wp\/v2\/posts\/7931","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.revellia.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.revellia.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.revellia.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.revellia.com\/fr\/wp-json\/wp\/v2\/comments?post=7931"}],"version-history":[{"count":17,"href":"https:\/\/www.revellia.com\/fr\/wp-json\/wp\/v2\/posts\/7931\/revisions"}],"predecessor-version":[{"id":9482,"href":"https:\/\/www.revellia.com\/fr\/wp-json\/wp\/v2\/posts\/7931\/revisions\/9482"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.revellia.com\/fr\/wp-json\/wp\/v2\/media\/7947"}],"wp:attachment":[{"href":"https:\/\/www.revellia.com\/fr\/wp-json\/wp\/v2\/media?parent=7931"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.revellia.com\/fr\/wp-json\/wp\/v2\/categories?post=7931"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.revellia.com\/fr\/wp-json\/wp\/v2\/tags?post=7931"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}