{"product_id":"honduras-efren-sanchez","title":"HONDURAS - EFREN SANCHEZ","description":"\u003cp\u003e\u0026nbsp;\u003c\/p\u003e\n\u003c!-- =========================================================\n  SECTION 1 : TASTING NOTES\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;\"\u003eTasting Notes\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 + BUTTERSCOTCH + COCOA\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- ========= END SECTION 1 ========= --\u003e\n\u003cp\u003e\u0026nbsp;\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\/nOn5ieggbhM?si=Gdcr1YJ6tFaneKhL\" 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\u0026nbsp;\u003c\/p\u003e\n\u003c!-- =========================================================\n  SECTION 2 : SOURCING\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;\"\u003eSourcing\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%;\"\u003eORIGIN\u003c\/td\u003e\n\u003ctd\u003eEl Paraíso municipality, El Paraíso department, Honduras\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePRODUCER\u003c\/td\u003e\n\u003ctd\u003eEfren Nefrali Sanchez\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFARM\u003c\/td\u003e\n\u003ctd\u003eLa Esmeranda\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eVARIETY\u003c\/td\u003e\n\u003ctd\u003eParainema\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePROCESS\u003c\/td\u003e\n\u003ctd\u003eWashed\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\u003ePARTNERS\u003c\/td\u003e\n\u003ctd\u003eSemilla\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eVOLUME PURCHASED\u003c\/td\u003e\n\u003ctd\u003e552 kg\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFOB\u003c\/td\u003e\n\u003ctd\u003e$4.50 US\/lb\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDELIVERED PRICE\u003c\/td\u003e\n\u003ctd\u003e$10.04 CAD\/lb\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRELATIONSHIP\u003c\/td\u003e\n\u003ctd\u003e1 year\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003c\/div\u003e\n\u003c!-- ========= END SECTION 2 ========= --\u003e\n\u003cp\u003e\u0026nbsp;\u003c\/p\u003e\n\u003c!-- =========================================================\n  SECTION 3 : ABOUT THIS COFFEE\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;\"\u003eAbout This Coffee\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 is a young coffee producer carrying on a family tradition passed down through generations. Coming from a coffee-growing family, he learned the craft from his grandparents, whose knowledge and experience continue to shape his work today. After spending many years working alongside his family, he began managing his own plot about a decade ago and has since devoted himself to producing high-quality coffee under his own name.\u003c\/p\u003e\n\u003cp style=\"margin: 0;\"\u003eHis goal is to create a distinctive product that not only reflects the potential of his farm but also allows him to increase his income, reinvest in his operation, and reach new markets around the world. 2025 marks an important milestone for Efren, as it is the first year he is exporting coffee through Semilla, our importing partner. It is so exciting to witness this journey and we are so excited to see his coffee being enjoyed far beyond Honduras!\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- ========= END SECTION 3 ========= --\u003e\n\u003cp\u003e\u0026nbsp;\u003c\/p\u003e\n\u003c!-- =========================================================\n  SECTION 4 : EXTRACTION PARAMETERS — 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 — Recommended Parameters\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);\"\u003eGround coffee\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);\"\u003eCoffee in the cup\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;\"\u003eExtraction time\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\u003cstrong\u003eNote —\u003c\/strong\u003e Recipe optimized for an \u003cstrong\u003e18 g\u003c\/strong\u003e basket. Check your machine's manual for your basket's capacity.\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c\/div\u003e\n\u003c!-- ========= END SECTION 4 ========= --\u003e\n\u003cp\u003e\u0026nbsp;\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 – Recipe\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\u003cstrong\u003eWater temperature:\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\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;\"\u003eStart\u003c\/button\u003e \u003cbutton id=\"v60StopBtn-laesmeranda\" type=\"button\" disabled=\"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\u003c\/div\u003e\n\u003cdiv style=\"display: flex; gap: 10px; align-items: baseline; line-height: 1;\"\u003e\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\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ℹ️ Press \"Start\" to keep the screen awake.\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\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);\"\u003ePour for 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\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\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);\"\u003ePour for 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\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\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);\"\u003ePour for 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\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;\"\u003eTotal drawdown time\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\u003cstrong\u003eℹ️ Tip —\u003c\/strong\u003e If the total time is shorter, your grind is likely too coarse. If it's longer, your grind is likely too fine.\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c\/div\u003e\n\u003c!-- ========= END 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 = '⚠️ Your browser does not support keeping the screen awake.'; return Promise.resolve(); }\n    return navigator.wakeLock.request('screen').then(function(wl) {\n      wakeLock = wl; statusEl.textContent = '✅ Screen kept awake during the recipe.';\n      wakeLock.addEventListener('release', function() { statusEl.textContent = 'ℹ️ Screen wake mode released.'; });\n    }).catch(function() { statusEl.textContent = '⚠️ Unable to enable screen wake mode.'; 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 = '✅ Recipe complete — screen released.'; timerEl.textContent = fmt(END_AT); }\n    else { statusEl.textContent = 'ℹ️ Recipe stopped — screen released.'; }\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\/en\/products\/honduras-efren-sanchez","provider":"Zab Café","version":"1.0","type":"link"}