{"product_id":"nicaragua-masseration-for-the-masses","title":"NICARAGUA - MACÉRATION POUR LES MASSES","description":"\u003c!-- =========================================================\n  FICHE PRODUIT CAFÉ — Nicaragua \/ Gold Mountain Coffee Growers\n========================================================= --\u003e\n\n\u003cp\u003e \u003c\/p\u003e\n\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;\"\u003eRAISIN BLANC + CERISE + MIEL\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- ========= FIN SECTION 1 ========= --\u003e\n\n\u003cp\u003e \u003c\/p\u003e\n\n\u003cdiv style=\"position: relative; width: 100%; padding-bottom: 56.25%; height: 0; border-radius: 8px;\"\u003e\n  \u003ciframe style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0; border-radius: 8px;\" src=\"https:\/\/www.youtube.com\/embed\/n-s_yYWfP6I?si=LzFxuOKeeSOdjwHp\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; fullscreen\" allowfullscreen\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\n\u003cp\u003e \u003c\/p\u003e\n\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 border=\"3\" cellpadding=\"1\" cellspacing=\"1\" style=\"width: 100%; border-collapse: collapse; background: transparent;\"\u003e\n    \u003ctbody\u003e\n      \u003ctr\u003e\n        \u003ctd style=\"width: 20%;\"\u003eORIGINE\u003c\/td\u003e\n        \u003ctd\u003eRégions de Matagalpa et Jinotega, Nicaragua\u003c\/td\u003e\n      \u003c\/tr\u003e\n      \u003ctr\u003e\n        \u003ctd\u003ePRODUCTEURS\u003c\/td\u003e\n        \u003ctd\u003ePlusieurs petit.es producteur.ices\u003c\/td\u003e\n      \u003c\/tr\u003e\n      \u003ctr\u003e\n        \u003ctd\u003eVARIÉTÉS\u003c\/td\u003e\n        \u003ctd\u003eCatuai rouge, Caturra estrella et Pacas\u003c\/td\u003e\n      \u003c\/tr\u003e\n      \u003ctr\u003e\n        \u003ctd\u003ePROCÉDÉ\u003c\/td\u003e\n        \u003ctd\u003eNaturel avec macération carbonique\u003c\/td\u003e\n      \u003c\/tr\u003e\n      \u003ctr\u003e\n        \u003ctd\u003eALTITUDE\u003c\/td\u003e\n        \u003ctd\u003e1300 – 1600 m\u003c\/td\u003e\n      \u003c\/tr\u003e\n      \u003ctr\u003e\n        \u003ctd\u003ePARTENAIRES\u003c\/td\u003e\n        \u003ctd\u003eGold Mountain Coffee Growers\u003c\/td\u003e\n      \u003c\/tr\u003e\n      \u003ctr\u003e\n        \u003ctd\u003eVOLUME ACHETÉ\u003c\/td\u003e\n        \u003ctd\u003e138 kg\u003c\/td\u003e\n      \u003c\/tr\u003e\n      \u003ctr\u003e\n        \u003ctd\u003ePRIX LIVRÉ\u003c\/td\u003e\n        \u003ctd\u003e15,64 $ 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\n\u003cp\u003e \u003c\/p\u003e\n\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\n    \u003cp style=\"margin: 0 0 12px 0;\"\u003eUne tasse avec une belle acidité vibrante, portée par une texture crémeuse qui reste longtemps en bouche. D'abord, on goûte le sucre et la complexité du raisin blanc, puis l'acidité s'étire doucement, comme un sirop de cerise. C'est sucré, éclatant, mais surtout hyper texturé, un peu comme une cuillère de miel. C'est vraiment un café qui gagne en saveur avec le temps — laissez-le reposer un bon 4 semaines avant de le déguster !\u003c\/p\u003e\n    \u003cp style=\"margin: 0 0 12px 0;\"\u003eInspirée d'une technique utilisée à l'origine en vinification, la macération carbonique est une méthode de fermentation du café qui met en valeur son côté juteux, ainsi qu'un profil plus fruité. Après plusieurs années d'expérimentation, Gold Mountain Coffee Growers, l'exportateur de ce café, a affiné ce procédé pour en arriver à ce résultat final.\u003c\/p\u003e\n    \u003cp style=\"margin: 0 0 12px 0;\"\u003eCe lot est assemblé par Gold Mountain à partir de cafés produits par plusieurs petit.es producteur.rices avec qui ils collaborent. L'idée est de proposer un café fruité, juteux et sucré, qui reste accessible, tout en apportant de bons retours aux producteur.rices au Nicaragua.\u003c\/p\u003e\n    \u003cp style=\"margin: 0;\"\u003e\u003cstrong\u003eTemps de vieillissement recommandé :\u003c\/strong\u003e 4 semaines\u003c\/p\u003e\n\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- ========= FIN SECTION 3 ========= --\u003e\n\n\u003cp\u003e \u003c\/p\u003e\n\n\u003c!-- =========================================================\n  SECTION 4 : PARAMÈTRES D'EXTRACTION — ESPRESSO\n========================================================= --\u003e\n\u003cdiv style=\"width: 100%; margin: 0 auto;\"\u003e\n  \u003cdetails open=\"\" style=\"border: 2px solid #000; border-radius: 12px; overflow: hidden; margin: 0 0 12px 0; background: rgba(255,255,255,0.5);\"\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);\"\u003e40 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;\"\u003e25 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.\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/details\u003e\n\u003c\/div\u003e\n\u003c!-- ========= FIN SECTION 4 ========= --\u003e\n\n\u003cp\u003e \u003c\/p\u003e\n\n\u003c!-- =========================================================\n  SECTION 5 : V60\n========================================================= --\u003e\n\u003cdiv style=\"width: 100%; margin: 0 auto;\"\u003e\n  \u003cdetails id=\"v60Details-nicaragua\" open=\"\" style=\"border: 2px solid #000; border-radius: 12px; overflow: hidden; margin: 0 0 12px 0; background: rgba(255,255,255,0.5);\"\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\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 — Mouture #6.6\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 92 °C\u003c\/div\u003e\n      \u003c\/div\u003e\n\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 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;\" type=\"button\" id=\"v60StartBtn-nicaragua\"\u003eDémarrer\u003c\/button\u003e\n          \u003cbutton 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;\" disabled type=\"button\" id=\"v60StopBtn-nicaragua\"\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\n          \u003cspan style=\"font-weight: 950; font-size: 28px; letter-spacing: .01em;\" id=\"v60Timer-nicaragua\"\u003e0:00\u003c\/span\u003e\n        \u003c\/div\u003e\n        \u003cdiv style=\"flex-basis: 100%; opacity: .6; font-size: 12px; line-height: 1.3; margin-top: 2px;\" id=\"v60WakeStatus-nicaragua\"\u003eℹ️ Appuie sur \"Démarrer\" pour garder l'écran allumé.\u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv style=\"margin-top: 8px; display: grid; gap: 10px;\"\u003e\n\n        \u003c!-- Phase 1 — Bloom --\u003e\n        \u003cdiv style=\"border: 1px solid rgba(0,0,0,.18); border-radius: 12px; padding: 10px 12px;\" id=\"v60-card-1-nicaragua\"\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 style=\"padding: 5px 9px; border-radius: 999px; background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.12);\" id=\"v60-pill-1-nicaragua\"\u003eVerser pendant 0:10s\u003c\/span\u003e\n            \u003cspan style=\"padding: 5px 9px; border-radius: 999px; background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.12);\"\u003eTotal 50 g\u003c\/span\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n\n        \u003c!-- Phase 2 --\u003e\n        \u003cdiv style=\"border: 1px solid rgba(0,0,0,.18); border-radius: 12px; padding: 10px 12px;\" id=\"v60-card-2-nicaragua\"\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 style=\"padding: 5px 9px; border-radius: 999px; background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.12);\" id=\"v60-pill-2-nicaragua\"\u003eVerser pendant 0:10s\u003c\/span\u003e\n            \u003cspan style=\"padding: 5px 9px; border-radius: 999px; background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.12);\"\u003eTotal 110 g\u003c\/span\u003e\n            \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+60 g\u003c\/span\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n\n        \u003c!-- Phase 3 --\u003e\n        \u003cdiv style=\"border: 1px solid rgba(0,0,0,.18); border-radius: 12px; padding: 10px 12px;\" id=\"v60-card-3-nicaragua\"\u003e\n          \u003cdiv style=\"display: flex; gap: 10px; align-items: baseline; margin-bottom: 6px;\"\u003e\n            \u003cdiv style=\"font-weight: 900;\"\u003e1:10\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 style=\"padding: 5px 9px; border-radius: 999px; background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.12);\" id=\"v60-pill-3-nicaragua\"\u003eVerser pendant 0:10s\u003c\/span\u003e\n            \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\n            \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+60 g\u003c\/span\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n\n        \u003c!-- Phase 4 --\u003e\n        \u003cdiv style=\"border: 1px solid rgba(0,0,0,.18); border-radius: 12px; padding: 10px 12px;\" id=\"v60-card-4-nicaragua\"\u003e\n          \u003cdiv style=\"display: flex; gap: 10px; align-items: baseline; margin-bottom: 6px;\"\u003e\n            \u003cdiv style=\"font-weight: 900;\"\u003e1:40\u003c\/div\u003e\n            \u003cdiv style=\"font-weight: 900;\"\u003ePhase 4\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 style=\"padding: 5px 9px; border-radius: 999px; background: rgba(0,0,0,.05); border: 1px solid rgba(0,0,0,.12);\" id=\"v60-pill-4-nicaragua\"\u003eVerser pendant 0:15s\u003c\/span\u003e\n            \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\n            \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\n      \u003c\/div\u003e\n\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:20\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.\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n    \u003c\/div\u003e\n  \u003c\/details\u003e\n\u003c\/div\u003e\n\u003c!-- ========= FIN SECTION 5 ========= --\u003e\n\n\u003csvg style=\"display: none;\"\u003e\n\u003cstyle\u003e\n  @keyframes v60PulsePhase {\n    0%   { transform: scale(1);    box-shadow: 0 0 0 0 rgba(200,169,126,.35); }\n    50%  { transform: scale(1.06); box-shadow: 0 0 0 10px rgba(200,169,126,0); }\n    100% { transform: scale(1);    box-shadow: 0 0 0 0 rgba(200,169,126,0); }\n  }\n  .v60-pulse {\n    animation: v60PulsePhase 700ms ease-out 1;\n    transform-origin: center;\n    will-change: transform;\n  }\n  @keyframes v60BlinkPill {\n    0%, 100% { opacity: 1; transform: scale(1); }\n    50%      { opacity: .22; transform: scale(1.03); }\n  }\n  .v60-pill-pour-active {\n    background: #ffe7b7 !important;\n    border: 2px solid #d2a44a !important;\n    color: #3b2a12 !important;\n    font-weight: 900 !important;\n    letter-spacing: .02em;\n    animation: v60BlinkPill 2500ms ease-in-out infinite;\n    box-shadow:\n      0 0 0 2px rgba(210,164,74,.18) inset,\n      0 10px 22px rgba(0,0,0,.12),\n      0 0 0 6px rgba(210,164,74,.10);\n  }\n  @media (prefers-reduced-motion: reduce) {\n    .v60-pill-pour-active { animation: none; }\n    .v60-pulse { animation: none; }\n  }\n\u003c\/style\u003e\n\u003cscript\u003e\n(function() {\n  var SUFFIX = '-nicaragua';\n  var END_AT = 140; \/* 2:20 *\/\n  var phases = [\n    { key: 1, t: 0,   pourLen: 10 },\n    { key: 2, t: 40,  pourLen: 10 },\n    { key: 3, t: 70,  pourLen: 10 },\n    { key: 4, t: 100, pourLen: 15 }\n  ];\n  var latte = {\n    cardBg:     '#f6f1ea',\n    cardBorder: '#c8a97e',\n    pillBg:     '#eadfce'\n  };\n\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\n  var pills = {\n    1: document.getElementById('v60-pill-1' + SUFFIX),\n    2: document.getElementById('v60-pill-2' + SUFFIX),\n    3: document.getElementById('v60-pill-3' + SUFFIX),\n    4: document.getElementById('v60-pill-4' + SUFFIX)\n  };\n  var cards = {\n    1: document.getElementById('v60-card-1' + SUFFIX),\n    2: document.getElementById('v60-card-2' + SUFFIX),\n    3: document.getElementById('v60-card-3' + SUFFIX),\n    4: document.getElementById('v60-card-4' + SUFFIX)\n  };\n\n  function setCardActive(key) {\n    Object.keys(cards).forEach(function(k) {\n      var c = cards[k];\n      if (!c) return;\n      if (parseInt(k) === key) {\n        c.style.borderColor = latte.cardBorder;\n        c.style.background  = latte.cardBg;\n        c.style.boxShadow   = '0 0 0 2px rgba(200,169,126,.25) inset, 0 8px 22px rgba(200,169,126,.28)';\n      } else {\n        c.style.borderColor = 'rgba(0,0,0,.18)';\n        c.style.background  = 'transparent';\n        c.style.boxShadow   = 'none';\n      }\n    });\n  }\n\n  function setPillPhaseActive(key, doPulse) {\n    Object.keys(pills).forEach(function(k) {\n      var p = pills[k];\n      if (!p) return;\n      p.style.background  = 'rgba(0,0,0,.05)';\n      p.style.borderColor = 'rgba(0,0,0,.12)';\n      p.style.boxShadow   = 'none';\n      p.classList.remove('v60-pulse');\n    });\n    var pill = pills[key];\n    if (pill) {\n      pill.style.background  = latte.pillBg;\n      pill.style.borderColor = latte.cardBorder;\n      pill.style.boxShadow   = '0 0 0 2px rgba(200,169,126,.25) inset';\n      if (doPulse) {\n        pill.classList.remove('v60-pulse');\n        void pill.offsetWidth;\n        pill.classList.add('v60-pulse');\n      }\n    }\n  }\n\n  function resetPourPills() {\n    Object.values(pills).forEach(function(p) {\n      if (!p) return;\n      p.classList.remove('v60-pill-pour-active');\n    });\n  }\n\n  function setPourPillActive(key) {\n    resetPourPills();\n    if (!key) return;\n    var pill = pills[key];\n    if (pill) pill.classList.add('v60-pill-pour-active');\n  }\n\n  function clearAll() {\n    Object.values(cards).forEach(function(c) {\n      if (!c) return;\n      c.style.borderColor = 'rgba(0,0,0,.18)';\n      c.style.background  = 'transparent';\n      c.style.boxShadow   = 'none';\n    });\n    Object.values(pills).forEach(function(p) {\n      if (!p) return;\n      p.style.background  = 'rgba(0,0,0,.05)';\n      p.style.borderColor = 'rgba(0,0,0,.12)';\n      p.style.boxShadow   = 'none';\n      p.classList.remove('v60-pulse');\n      p.classList.remove('v60-pill-pour-active');\n    });\n  }\n\n  var wakeLock  = null;\n  var startTime = null;\n  var rafId     = null;\n  var lastPhaseKey = null;\n  var lastPourKey  = null;\n\n  function fmt(sec) {\n    sec = Math.max(0, Math.floor(sec));\n    var m = Math.floor(sec \/ 60);\n    var s = sec % 60;\n    return m + ':' + (s \u003c 10 ? '0' : '') + s;\n  }\n\n  function getCurrentPhaseKey(elapsed) {\n    var current = phases[0].key;\n    for (var i = 0; i \u003c phases.length; i++) if (elapsed \u003e= phases[i].t) current = phases[i].key;\n    return current;\n  }\n\n  function getPourKey(elapsed) {\n    for (var i = phases.length - 1; i \u003e= 0; i--) {\n      var p = phases[i];\n      if (elapsed \u003e= p.t \u0026\u0026 elapsed \u003c (p.t + p.pourLen)) return p.key;\n    }\n    return null;\n  }\n\n  function enableWakeLock() {\n    if (!('wakeLock' in navigator)) {\n      statusEl.textContent = '⚠️ Ton navigateur ne supporte pas le mode écran allumé.';\n      return Promise.resolve();\n    }\n    return navigator.wakeLock.request('screen').then(function(wl) {\n      wakeLock = wl;\n      statusEl.textContent = '✅ Écran maintenu allumé pendant la recette.';\n      wakeLock.addEventListener('release', function() {\n        statusEl.textContent = 'ℹ️ Mode écran allumé relâché.';\n      });\n    }).catch(function() {\n      statusEl.textContent = '⚠️ Impossible d\\'activer le mode écran allumé.';\n      wakeLock = null;\n    });\n  }\n\n  function disableWakeLock() {\n    if (wakeLock) { wakeLock.release(); wakeLock = null; }\n  }\n\n  function setButtons(running) {\n    startBtn.disabled = running;\n    stopBtn.disabled  = !running;\n    stopBtn.style.opacity = running ? '1' : '.5';\n  }\n\n  function tick() {\n    var elapsed = (Date.now() - startTime) \/ 1000;\n    timerEl.textContent = fmt(elapsed);\n    var phaseKey = getCurrentPhaseKey(elapsed);\n    if (phaseKey !== lastPhaseKey) {\n      setCardActive(phaseKey);\n      setPillPhaseActive(phaseKey, lastPhaseKey !== null);\n      lastPhaseKey = phaseKey;\n    }\n    var pourKey = getPourKey(elapsed);\n    if (pourKey !== lastPourKey) {\n      setPourPillActive(pourKey);\n      lastPourKey = pourKey;\n    }\n    if (elapsed \u003e= END_AT) { stopRecipe(true); return; }\n    rafId = requestAnimationFrame(tick);\n  }\n\n  function startRecipe() {\n    setButtons(true);\n    timerEl.textContent = '0:00';\n    lastPhaseKey = null;\n    lastPourKey  = null;\n    enableWakeLock().then(function() {\n      setCardActive(1);\n      setPillPhaseActive(1, false);\n      setPourPillActive(1);\n      lastPhaseKey = 1;\n      lastPourKey  = 1;\n      startTime = Date.now();\n      if (rafId) cancelAnimationFrame(rafId);\n      rafId = requestAnimationFrame(tick);\n    });\n  }\n\n  function stopRecipe(autoEnded) {\n    if (rafId) cancelAnimationFrame(rafId);\n    rafId     = null;\n    startTime = null;\n    disableWakeLock();\n    setButtons(false);\n    clearAll();\n    lastPhaseKey = null;\n    lastPourKey  = null;\n    if (autoEnded) {\n      statusEl.textContent = '✅ Recette terminée — écran libéré.';\n      timerEl.textContent  = fmt(END_AT);\n    } else {\n      statusEl.textContent = 'ℹ️ Recette arrêtée — écran libéré.';\n    }\n  }\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() {\n    if (document.visibilityState === 'visible' \u0026\u0026 startTime \u0026\u0026 !wakeLock) enableWakeLock();\n  });\n})();\n\u003c\/script\u003e\n\u003c\/svg\u003e","brand":"ZAB","offers":[{"title":"250g","offer_id":52379331690805,"sku":"CAF-SIN-MFTM-250","price":19.95,"currency_code":"EUR","in_stock":true},{"title":"808g","offer_id":52379331723573,"sku":"CAF-SIN-MFTM-808","price":53.95,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/2716\/1842\/files\/maceration-250g.jpg?v=1772636742","url":"https:\/\/zabcafe.com\/products\/nicaragua-masseration-for-the-masses","provider":"Zab Café","version":"1.0","type":"link"}