{"product_id":"honduras-efren-sanchez","title":"HONDURAS - EFREN SANCHEZ","description":"\u003cp\u003e \u003c\/p\u003e\n\u003c!-- =========================================================\n  SECTION 1 : NOTES DE DÉGUSTATION\n========================================================= --\u003e\n\u003cdiv style=\"width: 100%; margin: 0 auto 12px auto; border: 2px solid #000; border-radius: 12px; overflow: hidden;\"\u003e\n\u003cdiv style=\"padding: 10px 14px; font-weight: 800; text-transform: uppercase; font-size: 14px; letter-spacing: .02em; background: #000; color: #fff; text-align: center;\"\u003eNotes de dégustation\u003c\/div\u003e\n\u003cdiv style=\"padding: 16px 14px; font-weight: 900; text-transform: uppercase; font-size: 28px; letter-spacing: .05em; text-align: center; background: transparent;\"\u003eTANGERINE + CARAMEL AU BEURRE + CACAO\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- ========= FIN SECTION 1 ========= --\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cdiv style=\"position: relative; width: 100%; padding-bottom: 56.25%; height: 0; overflow: hidden; border-radius: 8px;\"\u003e\u003ciframe src=\"https:\/\/www.youtube.com\/embed\/Ah07vnT9SOY?si=xF-JkRB42Cw0sJeg\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0; border-radius: 8px;\"\u003e\u003c\/iframe\u003e\u003c\/div\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003c!-- =========================================================\n  SECTION 2 : APPROVISIONNEMENT\n========================================================= --\u003e\n\u003cdiv style=\"width: 100%; margin: 0 auto 12px auto;\"\u003e\n\u003cdiv style=\"padding: 12px 14px; font-weight: 800; text-transform: uppercase; font-size: 14px; letter-spacing: .02em; background: #000; color: #fff; text-align: center; border-radius: 12px 12px 0 0;\"\u003eApprovisionnement\u003c\/div\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; background: transparent;\" cellspacing=\"1\" cellpadding=\"1\" border=\"3\"\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"width: 20%;\"\u003eORIGINE\u003c\/td\u003e\n\u003ctd\u003eMunicipalité de El Paraíso, département de El Paraíso, Honduras\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePRODUCTEURS\u003c\/td\u003e\n\u003ctd\u003eEfren Nefrali Sanchez\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFERME\u003c\/td\u003e\n\u003ctd\u003eLa Esmeranda\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eVARIÉTÉ\u003c\/td\u003e\n\u003ctd\u003eParainema\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePROCÉDÉ\u003c\/td\u003e\n\u003ctd\u003eLavé\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eALTITUDE\u003c\/td\u003e\n\u003ctd\u003e1400 m\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePARTENAIRES\u003c\/td\u003e\n\u003ctd\u003eSemilla\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eVOLUME ACHETÉ\u003c\/td\u003e\n\u003ctd\u003e552 kg\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFAB\u003c\/td\u003e\n\u003ctd\u003e4,50 $ US\/lb\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePRIX LIVRÉ\u003c\/td\u003e\n\u003ctd\u003e10,04 $ CAD\/LB\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRELATION\u003c\/td\u003e\n\u003ctd\u003e1 an\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003c\/div\u003e\n\u003c!-- ========= FIN SECTION 2 ========= --\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003c!-- =========================================================\n  SECTION 3 : INFORMATIONS SUR LE CAFÉ\n========================================================= --\u003e\n\u003cdiv style=\"width: 100%; margin: 0 auto 12px auto;\"\u003e\n\u003cdiv style=\"padding: 12px 14px; font-weight: 800; text-transform: uppercase; font-size: 14px; letter-spacing: .02em; background: #000; color: #fff; text-align: center; border-radius: 12px 12px 0 0;\"\u003eInformations sur le café\u003c\/div\u003e\n\u003cdiv style=\"border: 2px solid #000; border-top: none; border-radius: 0 0 12px 12px; padding: 16px 14px; background: transparent;\"\u003e\n\u003cp style=\"margin: 0 0 12px 0;\"\u003eEfren est un jeune producteur de café qui perpétue une tradition familiale transmise de génération en génération. Issu d'une famille caféicultrice, il a appris le métier auprès de ses grands-parents, dont les connaissances et l'expérience continuent d'influencer son travail aujourd'hui. Après avoir travaillé de nombreuses années aux côtés de sa famille, il a commencé à gérer sa propre parcelle il y a une dizaine d'années et se consacre depuis à la production de cafés de grande qualité sous son propre nom.\u003c\/p\u003e\n\u003cp style=\"margin: 0;\"\u003eSon objectif est de créer un produit distinctif qui reflète tout le potentiel de sa ferme, tout en lui permettant d'augmenter ses revenus, de réinvestir dans son exploitation et d'accéder à de nouveaux marchés à travers le monde. L'année 2025 marque une étape importante pour Efren, puisqu'il s'agit de sa première exportation de café par l'entremise de Semilla, notre partenaire importateur. C'est un privilège de pouvoir l'accompagner dans cette aventure, et nous sommes ravis de voir ses cafés être dégustés bien au-delà des frontières du Honduras.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- ========= FIN SECTION 3 ========= --\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003c!-- =========================================================\n  SECTION 4 : PARAMÈTRES D'EXTRACTION — ESPRESSO\n========================================================= --\u003e\n\u003cdiv style=\"width: 100%; margin: 0 auto;\"\u003e\n\u003cdetails style=\"border: 2px solid #000; border-radius: 12px; overflow: hidden; margin: 0 0 12px 0; background: rgba(255,255,255,0.5);\" open=\"\"\u003e\n\u003csummary style=\"cursor: pointer; list-style: none; padding: 12px 14px; font-weight: 800; text-transform: uppercase; font-size: 14px; letter-spacing: .02em; background: #000; color: #fff; text-align: center;\"\u003eEspresso — paramètres recommandés\u003c\/summary\u003e\n\u003cdiv style=\"padding: 12px 14px;\"\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; background: transparent;\"\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding: 10px 0; font-weight: 800; border-bottom: 1px solid rgba(0,0,0,.2);\"\u003eCafé moulu\u003c\/td\u003e\n\u003ctd style=\"padding: 10px 0; text-align: right; border-bottom: 1px solid rgba(0,0,0,.2);\"\u003e18 g\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding: 10px 0; font-weight: 800; border-bottom: 1px solid rgba(0,0,0,.2);\"\u003eCafé dans la tasse\u003c\/td\u003e\n\u003ctd style=\"padding: 10px 0; text-align: right; border-bottom: 1px solid rgba(0,0,0,.2);\"\u003e35 g\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding: 10px 0; font-weight: 800;\"\u003eTemps d'extraction\u003c\/td\u003e\n\u003ctd style=\"padding: 10px 0; text-align: right;\"\u003e26 sec\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cdiv style=\"margin-top: 10px; padding: 8px 10px; border-radius: 8px; background: rgba(0,0,0,.04); border: 1px dashed rgba(0,0,0,.2); font-size: 12px; opacity: .7; line-height: 1.4;\"\u003e\n\u003cstrong\u003eÀ noter —\u003c\/strong\u003e Recette optimisée pour un panier de \u003cstrong\u003e18 g\u003c\/strong\u003e. Consultez le manuel de votre machine pour connaître la capacité de votre panier.\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c\/div\u003e\n\u003c!-- ========= FIN SECTION 4 ========= --\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003c!-- =========================================================\n  SECTION 5 : V60\n========================================================= --\u003e\n\u003cdiv style=\"width: 100%; margin: 0 auto;\"\u003e\n\u003cdetails style=\"border: 2px solid #000; border-radius: 12px; overflow: hidden; margin: 0 0 12px 0; background: rgba(255,255,255,0.5);\" open=\"\" id=\"v60Details-laesmeranda\"\u003e\n\u003csummary style=\"cursor: pointer; list-style: none; padding: 12px 14px; font-weight: 800; text-transform: uppercase; font-size: 14px; letter-spacing: .02em; background: #000; color: #fff; text-align: center;\"\u003eV60 – Recette\u003c\/summary\u003e\n\u003cdiv style=\"padding: 12px 14px;\"\u003e\n\u003cdiv style=\"padding: 10px 0 10px; border-bottom: 1px solid rgba(0,0,0,.2);\"\u003e\n\u003cdiv style=\"font-weight: 900; font-size: 16px;\"\u003eRatio 1:15\u003c\/div\u003e\n\u003cdiv style=\"margin-top: 4px; opacity: .7; font-size: 13px;\"\u003e15 g in – 225 g out\u003c\/div\u003e\n\u003cdiv style=\"margin-top: 6px; font-size: 13px;\"\u003e\n\u003cstrong\u003eTempérature de l'eau :\u003c\/strong\u003e 90 °C\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv style=\"display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; padding: 10px 0 8px;\"\u003e\n\u003cdiv style=\"display: flex; gap: 8px; align-items: center; flex-wrap: wrap;\"\u003e\n\u003cbutton id=\"v60StartBtn-laesmeranda\" type=\"button\" style=\"cursor: pointer; border: 2px solid #000; background: #000; color: #fff; font-weight: 900; padding: 8px 10px; border-radius: 10px; text-transform: uppercase; letter-spacing: .02em; font-size: 12px;\"\u003eDémarrer\u003c\/button\u003e \u003cbutton id=\"v60StopBtn-laesmeranda\" type=\"button\" disabled style=\"cursor: pointer; border: 2px solid #000; background: #fff; color: #000; font-weight: 900; padding: 8px 10px; border-radius: 10px; text-transform: uppercase; letter-spacing: .02em; font-size: 12px; opacity: .5;\"\u003eStop\u003c\/button\u003e\n\u003c\/div\u003e\n\u003cdiv style=\"display: flex; gap: 10px; align-items: baseline; line-height: 1;\"\u003e\n\u003cspan style=\"opacity: .70; font-size: 12px; font-weight: 800; text-transform: uppercase; letter-spacing: .04em;\"\u003eTimer\u003c\/span\u003e \u003cspan id=\"v60Timer-laesmeranda\" style=\"font-weight: 950; font-size: 28px; letter-spacing: .01em;\"\u003e0:00\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv id=\"v60WakeStatus-laesmeranda\" style=\"flex-basis: 100%; opacity: .6; font-size: 12px; line-height: 1.3; margin-top: 2px;\"\u003eℹ️ Appuie sur \"Démarrer\" pour garder l'écran allumé.\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv style=\"margin-top: 8px; display: grid; gap: 10px;\"\u003e\n\u003cdiv id=\"v60-card-1-laesmeranda\" style=\"border: 1px solid rgba(0,0,0,.18); border-radius: 12px; padding: 10px 12px;\"\u003e\n\u003cdiv style=\"display: flex; gap: 10px; align-items: baseline; margin-bottom: 6px;\"\u003e\n\u003cdiv style=\"font-weight: 900;\"\u003e0:00\u003c\/div\u003e\n\u003cdiv style=\"font-weight: 900;\"\u003ePhase 1 — Bloom\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv style=\"display: flex; gap: 8px; flex-wrap: wrap; font-size: 12.5px; font-weight: 800;\"\u003e\n\u003cspan id=\"v60-pill-1-laesmeranda\" style=\"padding: 5px 9px; border-radius: 999px; background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.12);\"\u003eVerser pendant 0:10s\u003c\/span\u003e \u003cspan style=\"padding: 5px 9px; border-radius: 999px; background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.12);\"\u003eTotal 35 g\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv id=\"v60-card-2-laesmeranda\" style=\"border: 1px solid rgba(0,0,0,.18); border-radius: 12px; padding: 10px 12px;\"\u003e\n\u003cdiv style=\"display: flex; gap: 10px; align-items: baseline; margin-bottom: 6px;\"\u003e\n\u003cdiv style=\"font-weight: 900;\"\u003e0:40\u003c\/div\u003e\n\u003cdiv style=\"font-weight: 900;\"\u003ePhase 2\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv style=\"display: flex; gap: 8px; flex-wrap: wrap; font-size: 12.5px; font-weight: 800;\"\u003e\n\u003cspan id=\"v60-pill-2-laesmeranda\" style=\"padding: 5px 9px; border-radius: 999px; background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.12);\"\u003eVerser pendant 0:30s\u003c\/span\u003e \u003cspan style=\"padding: 5px 9px; border-radius: 999px; background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.12);\"\u003eTotal 170 g\u003c\/span\u003e \u003cspan style=\"padding: 5px 9px; border-radius: 999px; background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.12); opacity: .6;\"\u003e+135 g\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv id=\"v60-card-3-laesmeranda\" style=\"border: 1px solid rgba(0,0,0,.18); border-radius: 12px; padding: 10px 12px;\"\u003e\n\u003cdiv style=\"display: flex; gap: 10px; align-items: baseline; margin-bottom: 6px;\"\u003e\n\u003cdiv style=\"font-weight: 900;\"\u003e1:25\u003c\/div\u003e\n\u003cdiv style=\"font-weight: 900;\"\u003ePhase 3\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv style=\"display: flex; gap: 8px; flex-wrap: wrap; font-size: 12.5px; font-weight: 800;\"\u003e\n\u003cspan id=\"v60-pill-3-laesmeranda\" style=\"padding: 5px 9px; border-radius: 999px; background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.12);\"\u003eVerser pendant 0:30s\u003c\/span\u003e \u003cspan style=\"padding: 5px 9px; border-radius: 999px; background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.12);\"\u003eTotal 225 g\u003c\/span\u003e \u003cspan style=\"padding: 5px 9px; border-radius: 999px; background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.12); opacity: .6;\"\u003e+55 g\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv style=\"margin-top: 12px; border-top: 1px solid rgba(0,0,0,.2); padding-top: 10px;\"\u003e\n\u003cdiv style=\"display: flex; gap: 10px; align-items: baseline;\"\u003e\n\u003cdiv style=\"font-weight: 900;\"\u003e2:50\u003c\/div\u003e\n\u003cdiv style=\"font-weight: 900;\"\u003eTemps final écoulement complet\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv style=\"margin-top: 8px; padding: 8px 10px; border-radius: 8px; background: rgba(0,0,0,.04); border: 1px dashed rgba(0,0,0,.2); font-size: 12px; opacity: .6; line-height: 1.4;\"\u003e\n\u003cstrong\u003eℹ️ Astuce —\u003c\/strong\u003e Si le temps total est plus court, la mouture est probablement trop grosse. S'il est plus long, la mouture est probablement trop fine.\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c\/div\u003e\n\u003c!-- ========= FIN SECTION 5 ========= --\u003e\u003csvg style=\"display: none;\"\u003e\n\u003cstyle\u003e\n  @keyframes v60PulsePhase { 0% { transform: scale(1); box-shadow: 0 0 0 0 rgba(200,169,126,.35); } 50% { transform: scale(1.06); box-shadow: 0 0 0 10px rgba(200,169,126,0); } 100% { transform: scale(1); box-shadow: 0 0 0 0 rgba(200,169,126,0); } }\n  .v60-pulse { animation: v60PulsePhase 700ms ease-out 1; transform-origin: center; will-change: transform; }\n  @keyframes v60BlinkPill { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: .22; transform: scale(1.03); } }\n  .v60-pill-pour-active { background: #ffe7b7 !important; border: 2px solid #d2a44a !important; color: #3b2a12 !important; font-weight: 900 !important; letter-spacing: .02em; animation: v60BlinkPill 2500ms ease-in-out infinite; box-shadow: 0 0 0 2px rgba(210,164,74,.18) inset, 0 10px 22px rgba(0,0,0,.12), 0 0 0 6px rgba(210,164,74,.10); }\n  @media (prefers-reduced-motion: reduce) { .v60-pill-pour-active { animation: none; } .v60-pulse { animation: none; } }\n\u003c\/style\u003e\n\u003cscript\u003e\n(function() {\n  var SUFFIX = '-laesmeranda';\n  var END_AT = 170;\n  var phases = [ { key: 1, t: 0, pourLen: 10 }, { key: 2, t: 40, pourLen: 30 }, { key: 3, t: 85, pourLen: 30 } ];\n  var latte = { cardBg: '#f6f1ea', cardBorder: '#c8a97e', pillBg: '#eadfce' };\n  var details = document.getElementById('v60Details' + SUFFIX);\n  var startBtn = document.getElementById('v60StartBtn' + SUFFIX);\n  var stopBtn = document.getElementById('v60StopBtn' + SUFFIX);\n  var timerEl = document.getElementById('v60Timer' + SUFFIX);\n  var statusEl = document.getElementById('v60WakeStatus' + SUFFIX);\n  var pills = { 1: document.getElementById('v60-pill-1' + SUFFIX), 2: document.getElementById('v60-pill-2' + SUFFIX), 3: document.getElementById('v60-pill-3' + SUFFIX) };\n  var cards = { 1: document.getElementById('v60-card-1' + SUFFIX), 2: document.getElementById('v60-card-2' + SUFFIX), 3: document.getElementById('v60-card-3' + SUFFIX) };\n  function setCardActive(key) {\n    Object.keys(cards).forEach(function(k) {\n      var c = cards[k]; if (!c) return;\n      if (parseInt(k) === key) { c.style.borderColor = latte.cardBorder; c.style.background = latte.cardBg; c.style.boxShadow = '0 0 0 2px rgba(200,169,126,.25) inset, 0 8px 22px rgba(200,169,126,.28)'; }\n      else { c.style.borderColor = 'rgba(0,0,0,.18)'; c.style.background = 'transparent'; c.style.boxShadow = 'none'; }\n    });\n  }\n  function setPillPhaseActive(key, doPulse) {\n    Object.keys(pills).forEach(function(k) {\n      var p = pills[k]; if (!p) return;\n      p.style.background = 'rgba(0,0,0,.05)'; p.style.borderColor = 'rgba(0,0,0,.12)'; p.style.boxShadow = 'none'; p.classList.remove('v60-pulse');\n    });\n    var pill = pills[key];\n    if (pill) {\n      pill.style.background = latte.pillBg; pill.style.borderColor = latte.cardBorder; pill.style.boxShadow = '0 0 0 2px rgba(200,169,126,.25) inset';\n      if (doPulse) { pill.classList.remove('v60-pulse'); void pill.offsetWidth; pill.classList.add('v60-pulse'); }\n    }\n  }\n  function resetPourPills() { Object.values(pills).forEach(function(p) { if (!p) return; p.classList.remove('v60-pill-pour-active'); }); }\n  function setPourPillActive(key) { resetPourPills(); if (!key) return; var pill = pills[key]; if (pill) pill.classList.add('v60-pill-pour-active'); }\n  function clearAll() {\n    Object.values(cards).forEach(function(c) { if (!c) return; c.style.borderColor = 'rgba(0,0,0,.18)'; c.style.background = 'transparent'; c.style.boxShadow = 'none'; });\n    Object.values(pills).forEach(function(p) { if (!p) return; p.style.background = 'rgba(0,0,0,.05)'; p.style.borderColor = 'rgba(0,0,0,.12)'; p.style.boxShadow = 'none'; p.classList.remove('v60-pulse'); p.classList.remove('v60-pill-pour-active'); });\n  }\n  var wakeLock = null; var startTime = null; var rafId = null; var lastPhaseKey = null; var lastPourKey = null;\n  function fmt(sec) { sec = Math.max(0, Math.floor(sec)); var m = Math.floor(sec \/ 60); var s = sec % 60; return m + ':' + (s \u0026lt; 10 ? '0' : '') + s; }\n  function getCurrentPhaseKey(elapsed) { var current = phases[0].key; for (var i = 0; i \u0026lt; phases.length; i++) if (elapsed \u0026gt;= phases[i].t) current = phases[i].key; return current; }\n  function getPourKey(elapsed) { for (var i = phases.length - 1; i \u0026gt;= 0; i--) { var p = phases[i]; if (elapsed \u0026gt;= p.t \u0026amp;\u0026amp; elapsed \u0026lt; (p.t + p.pourLen)) return p.key; } return null; }\n  function enableWakeLock() {\n    if (!('wakeLock' in navigator)) { statusEl.textContent = '⚠️ Ton navigateur ne supporte pas le mode écran allumé.'; return Promise.resolve(); }\n    return navigator.wakeLock.request('screen').then(function(wl) {\n      wakeLock = wl; statusEl.textContent = '✅ Écran maintenu allumé pendant la recette.';\n      wakeLock.addEventListener('release', function() { statusEl.textContent = 'ℹ️ Mode écran allumé relâché.'; });\n    }).catch(function() { statusEl.textContent = '⚠️ Impossible d\\'activer le mode écran allumé.'; wakeLock = null; });\n  }\n  function disableWakeLock() { if (wakeLock) { wakeLock.release(); wakeLock = null; } }\n  function setButtons(running) { startBtn.disabled = running; stopBtn.disabled = !running; stopBtn.style.opacity = running ? '1' : '.5'; }\n  function tick() {\n    var elapsed = (Date.now() - startTime) \/ 1000;\n    timerEl.textContent = fmt(elapsed);\n    var phaseKey = getCurrentPhaseKey(elapsed);\n    if (phaseKey !== lastPhaseKey) { setCardActive(phaseKey); setPillPhaseActive(phaseKey, lastPhaseKey !== null); lastPhaseKey = phaseKey; }\n    var pourKey = getPourKey(elapsed);\n    if (pourKey !== lastPourKey) { setPourPillActive(pourKey); lastPourKey = pourKey; }\n    if (elapsed \u0026gt;= END_AT) { stopRecipe(true); return; }\n    rafId = requestAnimationFrame(tick);\n  }\n  function startRecipe() {\n    setButtons(true); timerEl.textContent = '0:00'; lastPhaseKey = null; lastPourKey = null;\n    enableWakeLock().then(function() {\n      setCardActive(1); setPillPhaseActive(1, false); setPourPillActive(1); lastPhaseKey = 1; lastPourKey = 1;\n      startTime = Date.now(); if (rafId) cancelAnimationFrame(rafId); rafId = requestAnimationFrame(tick);\n    });\n  }\n  function stopRecipe(autoEnded) {\n    if (rafId) cancelAnimationFrame(rafId); rafId = null; startTime = null; disableWakeLock(); setButtons(false); clearAll(); lastPhaseKey = null; lastPourKey = null;\n    if (autoEnded) { statusEl.textContent = '✅ Recette terminée — écran libéré.'; timerEl.textContent = fmt(END_AT); }\n    else { statusEl.textContent = 'ℹ️ Recette arrêtée — écran libéré.'; }\n  }\n  startBtn.addEventListener('click', startRecipe);\n  stopBtn.addEventListener('click', function() { stopRecipe(false); });\n  details.addEventListener('toggle', function() { if (!details.open) stopRecipe(false); });\n  document.addEventListener('visibilitychange', function() { if (document.visibilityState === 'visible' \u0026amp;\u0026amp; startTime \u0026amp;\u0026amp; !wakeLock) enableWakeLock(); });\n})();\n\u003c\/script\u003e\n\u003c\/svg\u003e","brand":"ZAB","offers":[{"title":"300g","offer_id":53138912969013,"sku":"CAF-SIN-EFRE-300","price":19.95,"currency_code":"EUR","in_stock":true},{"title":"808g","offer_id":53138913001781,"sku":"CAF-SIN-EFRE-808","price":48.95,"currency_code":"EUR","in_stock":true},{"title":"2268g (5lbs)","offer_id":53138913034549,"sku":"CAF-SIN-EFRE-2268","price":127.95,"currency_code":"EUR","in_stock":true},{"title":"100g","offer_id":53138913067317,"sku":"CAF-SIN-EFRE-100","price":9.95,"currency_code":"EUR","in_stock":true},{"title":"Bucket - 5lbs (Livraison locale seulement)","offer_id":53138913100085,"sku":"CAF-SIN-EFRE-BUCK-5","price":142.95,"currency_code":"EUR","in_stock":true},{"title":"Bucket - 15lbs (Livraison locale seulement)","offer_id":53138913132853,"sku":"CAF-SIN-EFRE-BUCK-15","price":419.95,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/2716\/1842\/files\/efren-300g-new_688646da-96f4-414d-a259-1debf75ec865.jpg?v=1784319933","url":"https:\/\/zabcafe.com\/products\/honduras-efren-sanchez","provider":"Zab Café","version":"1.0","type":"link"}