{"product_id":"anneau-addon-coco-mariposa-en-argent-pour-bague-mood-interchangeable","title":"Anneau (addon) \"🥥 Coco - Mariposa\" en argent pour bague mood interchangeable","description":"\u003c!-- 🌴 LE JEU DE L'ÉTÉ MOOD — Puzzle nouveauté avec modal 🌴 --\u003e\n\u003clink href=\"https:\/\/fonts.googleapis.com\/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;1,400;1,500\u0026amp;display=swap\" rel=\"stylesheet\"\u003e\n\n\u003cstyle\u003e\n\/* ─────────── MINI-TEASER POPUP (bottom-right, montre le puzzle) ─────────── *\/\n.mp-teaser{position:fixed;bottom:24px;right:24px;width:300px;background:#fff;border:1px solid #e7e2da;border-radius:8px;padding:0;box-shadow:0 10px 40px rgba(0,0,0,.18);z-index:9997;font-family:-apple-system,\"Helvetica Neue\",Helvetica,Arial,sans-serif;overflow:hidden;animation:mpTeaserIn .5s cubic-bezier(.2,.8,.4,1) both;animation-delay:1s;transition:transform .35s cubic-bezier(.2,.8,.4,1),opacity .35s}\n.mp-teaser.hidden{transform:translateX(120%);opacity:0;pointer-events:none}\n@keyframes mpTeaserIn{from{transform:translateX(120%);opacity:0}to{transform:translateX(0);opacity:1}}\n.mp-teaser-close{position:absolute;top:6px;right:8px;background:rgba(255,255,255,.95);border:1px solid #e7e2da;width:26px;height:26px;font-size:18px;line-height:1;cursor:pointer;color:#161616;display:flex;align-items:center;justify-content:center;transition:all .2s;font-family:inherit;padding:0;border-radius:50%;z-index:5}\n.mp-teaser-close:hover{background:#161616;color:#fff;transform:rotate(90deg)}\n.mp-teaser-head{padding:16px 18px 10px}\n.mp-teaser-eyebrow{font-size:10px;letter-spacing:.24em;text-transform:uppercase;color:#dc1f26;font-weight:600;margin-bottom:6px}\n.mp-teaser-title{font-family:\"Cormorant Garamond\",\"EB Garamond\",Georgia,serif;font-size:18px;font-weight:500;line-height:1.18;color:#161616;letter-spacing:-.005em}\n.mp-teaser-title .it{font-style:italic;color:#dc1f26}\n.mp-teaser-preview{position:relative;cursor:pointer;background:#efeae0;margin:0 12px;border-radius:4px;overflow:hidden;border:1px solid #d9d2c5;aspect-ratio:1\/1}\n.mp-teaser-preview:hover .mp-teaser-play-overlay{opacity:1}\n.mp-teaser-preview:hover .mp-mini-board{transform:scale(1.02)}\n.mp-mini-board{display:grid;grid-template-columns:repeat(3,1fr);gap:2px;width:100%;height:100%;padding:2px;background:#d9d2c5;transition:transform .25s}\n.mp-mini-tile{background-image:var(--mp-mini-img);background-size:300% 300%;background-repeat:no-repeat;border-radius:2px}\n.mp-teaser-play-overlay{position:absolute;inset:0;background:rgba(220,31,38,.92);color:#fff;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;opacity:0;transition:opacity .25s;font-size:11px;letter-spacing:.22em;text-transform:uppercase;font-weight:600;pointer-events:none}\n.mp-teaser-play-icon{display:inline-flex;align-items:center;justify-content:center;width:42px;height:42px;border-radius:50%;background:#fff;color:#dc1f26;font-size:14px;padding-left:3px}\n.mp-teaser-foot{padding:10px 18px 14px;text-align:center}\n.mp-teaser-sub{font-size:11px;color:#8a7d6c;font-style:italic;font-family:\"Cormorant Garamond\",serif;margin-bottom:6px}\n.mp-teaser-skip{font-size:10px;color:#a8a098;font-style:italic;font-family:\"Cormorant Garamond\",serif}\n.mp-teaser-skip a{color:#8a7d6c;text-decoration:underline;cursor:pointer}\n.mp-teaser-skip a:hover{color:#161616}\n@media (max-width:560px){.mp-teaser{bottom:12px;right:12px;left:12px;width:auto}}\n\n\/* ─────────── MODAL ─────────── *\/\n.mp-modal-overlay{position:fixed;inset:0;background:rgba(15,15,15,.88);z-index:2147483647;display:none;align-items:center;justify-content:center;padding:16px 12px;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}\n.mp-modal-overlay.show{display:flex;animation:mpOverlayIn .25s ease}\n@keyframes mpOverlayIn{from{opacity:0}to{opacity:1}}\n.mp-modal-content{position:relative;background:#faf8f5;border-radius:8px;max-width:560px;width:100%;max-height:calc(100dvh - 32px);max-height:calc(100vh - 32px);padding:0;animation:mpModalIn .35s cubic-bezier(.2,.8,.4,1);box-shadow:0 30px 80px rgba(0,0,0,.5);display:flex;flex-direction:column;overflow:hidden}\n@keyframes mpModalIn{from{opacity:0;transform:translateY(20px) scale(.97)}to{opacity:1;transform:translateY(0) scale(1)}}\n.mp-modal-close{position:absolute;top:10px;right:10px;background:rgba(255,255,255,.95);border:1px solid #e7e2da;width:34px;height:34px;border-radius:50%;font-size:17px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#161616;z-index:10;transition:all .2s;font-family:inherit;flex-shrink:0;box-shadow:0 2px 8px rgba(0,0,0,.1)}\n.mp-modal-close:hover{background:#161616;color:#fff;transform:rotate(90deg)}\n.mp-modal-content \u003e .mp-wrap{overflow-y:auto;flex:1;min-height:0}\n\n\/* ─────────── PUZZLE WIDGET (inside modal) ─────────── *\/\n.mp-wrap{padding:0;color:#161616;font-family:-apple-system,\"Helvetica Neue\",Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased}\n.mp-wrap *{box-sizing:border-box}\n.mp-card{padding:24px 22px}\n\n.mp-head{text-align:center;margin-bottom:14px;position:sticky;top:0;background:linear-gradient(180deg,#faf8f5 0%,#faf8f5 85%,rgba(250,248,245,0) 100%);padding:20px 0 14px;z-index:4;margin-top:-20px}\n.mp-head .eyebrow{font-size:10px;letter-spacing:.32em;text-transform:uppercase;color:#dc1f26;font-weight:600;margin-bottom:8px}\n.mp-head h2{font-family:\"Cormorant Garamond\",serif;font-size:22px;font-weight:500;line-height:1.15;margin:0 0 8px;letter-spacing:-.005em;color:#161616}\n.mp-head h2 .it{font-style:italic;color:#dc1f26}\n.mp-head .lede{font-family:\"Cormorant Garamond\",serif;font-style:italic;font-size:13px;color:#5a5550;max-width:440px;margin:0 auto;line-height:1.4}\n.mp-head .mp-skip{margin-top:14px;font-size:12px;color:#8a7d6c;font-style:italic;font-family:\"Cormorant Garamond\",serif}\n.mp-head .mp-skip a{color:#8a7d6c;text-decoration:underline;cursor:pointer;font-weight:500;transition:color .15s}\n.mp-head .mp-skip a:hover{color:#161616}\n\n.mp-head-row{display:flex;align-items:center;gap:12px;margin:10px 0 8px;text-align:left}\n.mp-target-thumb{flex-shrink:0;width:44px;height:44px;background-size:cover;background-position:center;background-repeat:no-repeat;border-radius:3px;border:1px solid #d9d2c5}\n.mp-head-row .lede{margin:0;font-size:12px;line-height:1.4;text-align:left;flex:1;min-width:0}\n\n.mp-difficulty{display:flex;justify-content:center;gap:6px;margin-bottom:18px;flex-wrap:wrap}\n.mp-difficulty button{background:#fff;border:1px solid #d9d2c5;padding:7px 14px;font-size:11px;letter-spacing:.12em;text-transform:uppercase;font-weight:600;cursor:pointer;border-radius:2px;color:#5a5550;font-family:inherit;transition:all .15s}\n.mp-difficulty button:hover{border-color:#161616;color:#161616}\n.mp-difficulty button.active{background:#161616;color:#fff;border-color:#161616}\n\n.mp-status{display:flex;justify-content:space-between;align-items:center;margin-bottom:14px;padding:0 4px;font-size:11px;letter-spacing:.06em;color:#5a5550;font-weight:500}\n.mp-status .chrono{font-family:\"Cormorant Garamond\",serif;font-size:22px;font-weight:500;color:#dc1f26;font-variant-numeric:tabular-nums;letter-spacing:.02em}\n.mp-status .moves{font-style:italic;color:#8a7d6c}\n\n.mp-board-wrap{position:relative;width:100%;max-width:min(380px, 55vh);aspect-ratio:1\/1;background:#efeae0;border-radius:4px;overflow:hidden;border:1px solid #d9d2c5;margin:0 auto}\n.mp-board{display:grid;width:100%;height:100%;gap:2px;background:#d9d2c5;padding:2px}\n.mp-tile{cursor:pointer;background-image:var(--mp-img);background-size:var(--mp-bg-size);background-repeat:no-repeat;border-radius:2px;transition:transform .12s, box-shadow .12s;position:relative}\n.mp-tile:hover{transform:scale(1.02);z-index:2;box-shadow:0 4px 12px rgba(0,0,0,.15)}\n.mp-tile.selected{outline:3px solid #dc1f26;outline-offset:-3px;transform:scale(1.04);z-index:3;box-shadow:0 6px 20px rgba(220,31,38,.3)}\n.mp-tile.correct{opacity:.97}\n\n.mp-preview-toggle{margin-top:14px;text-align:center;font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:#8a7d6c;font-weight:600;cursor:pointer}\n.mp-preview-toggle:hover{color:#dc1f26}\n\n.mp-actions{display:flex;justify-content:center;gap:10px;margin-top:18px}\n.mp-actions button{background:transparent;color:#5a5550;border:1px solid #d9d2c5;padding:9px 18px;font-size:11px;letter-spacing:.14em;text-transform:uppercase;font-weight:600;cursor:pointer;border-radius:2px;font-family:inherit;transition:all .2s}\n.mp-actions button:hover{background:#161616;color:#fff;border-color:#161616}\n\n.mp-help{text-align:center;font-size:11px;color:#8a7d6c;margin-top:12px;font-style:italic;font-family:\"Cormorant Garamond\",serif}\n\n.mp-success{display:none;background:linear-gradient(180deg,#fff 0%,#faf3e8 100%);border:1px solid #dc1f26;padding:24px 20px;margin-top:20px;border-radius:4px;text-align:center}\n.mp-success.show{display:block;animation:mpFadeIn .5s ease}\n@keyframes mpFadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\n.mp-success .ico{font-size:32px;margin-bottom:10px}\n.mp-success h3{font-family:\"Cormorant Garamond\",serif;font-size:26px;font-weight:400;margin:0 0 10px;letter-spacing:-.005em}\n.mp-success h3 .it{font-style:italic;color:#dc1f26}\n.mp-success .result{font-size:13px;color:#5a5550;margin-bottom:18px;font-style:italic}\n.mp-success .result strong{color:#161616;font-style:normal;font-weight:600}\n.mp-reward{background:#fff;border:2px solid #dc1f26;border-radius:2px;padding:12px 18px;margin:0 auto 18px;max-width:340px;display:inline-block}\n.mp-reward .lbl{font-size:9px;letter-spacing:.24em;text-transform:uppercase;color:#8a7d6c;font-weight:600;margin-bottom:4px}\n.mp-reward .amt{font-family:\"Cormorant Garamond\",serif;font-size:24px;font-weight:500;color:#dc1f26}\n.mp-reward .amt .it-amt{font-style:italic}\n.mp-reward .amt .dash{font-size:18px;color:#8a7d6c;font-style:italic;margin:0 4px}\n.mp-reward .reward-sub{font-size:11px;color:#8a7d6c;font-style:italic;font-family:\"Cormorant Garamond\",serif;margin-top:4px}\n.mp-name-form{background:#fff;border:1px solid #e7e2da;border-radius:4px;padding:14px 16px;margin:0 auto 14px;max-width:340px;text-align:left}\n.mp-name-label{display:block;font-size:10px;letter-spacing:.22em;text-transform:uppercase;color:#5a5550;font-weight:600;margin-bottom:6px}\n.mp-name-input{display:block;width:100%;border:none;border-bottom:1px solid #d9d2c5;padding:8px 4px;font-family:\"Cormorant Garamond\",serif;font-size:20px;background:transparent;color:#161616;font-style:italic;outline:none;transition:border-color .2s}\n.mp-name-input:focus{border-bottom-color:#dc1f26}\n.mp-name-input::placeholder{color:#b8aea0;font-style:italic}\n.mp-name-shake{animation:mpShake .4s ease}\n@keyframes mpShake{0%,100%{transform:translateX(0)}25%{transform:translateX(-6px)}75%{transform:translateX(6px)}}\n.mp-wa-btn{display:inline-flex;align-items:center;gap:10px;background:#25d366;color:#fff;padding:14px 28px;font-size:12px;letter-spacing:.16em;text-transform:uppercase;font-weight:600;text-decoration:none;border-radius:2px;transition:all .2s;font-family:inherit;border:none;cursor:pointer}\n.mp-wa-btn:hover{background:#1ea854;transform:translateY(-2px);box-shadow:0 6px 16px rgba(37,211,102,.3)}\n.mp-wa-btn:disabled{background:#cccccc;cursor:not-allowed;transform:none;box-shadow:none}\n.mp-foot{font-size:10px;color:#8a7d6c;margin-top:14px;letter-spacing:.04em;font-style:italic}\n\n@media (max-width:520px){.mp-head h2{font-size:22px}.mp-card{padding:20px 16px}}\n@media (max-height:720px){.mp-head{margin-bottom:12px}.mp-head h2{font-size:22px}.mp-head .lede{font-size:13px}.mp-head .badge{margin-top:6px}.mp-target-row{padding:8px 12px;margin-bottom:10px}.mp-target-thumb{width:48px;height:48px}.mp-difficulty{margin-bottom:12px}.mp-difficulty button{padding:6px 12px;font-size:10px}.mp-status{margin-bottom:10px}.mp-status .chrono{font-size:18px}.mp-board-wrap{max-width:min(320px,48vh)}.mp-card{padding:18px 18px}}\n\u003c\/style\u003e\n\n\u003c!-- MINI-TEASER bottom-right (s'auto-affiche, montre directement le puzzle) --\u003e\n\u003cdiv class=\"mp-teaser\" id=\"mp-teaser\" role=\"dialog\" aria-labelledby=\"mp-teaser-title\"\u003e\n  \u003cbutton type=\"button\" class=\"mp-teaser-close\" onclick=\"window.mpTeaserClose()\" aria-label=\"Fermer\"\u003e×\u003c\/button\u003e\n  \u003cdiv class=\"mp-teaser-head\"\u003e\n    \u003cdiv class=\"mp-teaser-eyebrow\"\u003e🌴 Jeu de l'été 2026\u003c\/div\u003e\n    \u003cdiv class=\"mp-teaser-title\" id=\"mp-teaser-title\"\u003eDes bons cadeaux et \u003cspan class=\"it\"\u003edes surprises\u003c\/span\u003e à gagner tout l'été 🎁\u003c\/div\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"mp-teaser-preview\" onclick=\"window.mpOpen()\" title=\"Cliquer pour jouer\"\u003e\n    \u003cdiv class=\"mp-mini-board\" id=\"mp-mini-board\"\u003e\u003c\/div\u003e\n    \u003cdiv class=\"mp-teaser-play-overlay\"\u003e\n      \u003cspan class=\"mp-teaser-play-icon\"\u003e▶\u003c\/span\u003e\n      \u003cspan\u003eJouer maintenant\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"mp-teaser-foot\"\u003e\n    \u003cdiv class=\"mp-teaser-sub\"\u003eReconstitue la pépite · clique pour jouer · tente ta chance\u003c\/div\u003e\n    \u003cdiv class=\"mp-teaser-skip\"\u003eTu ne veux pas jouer ? \u003ca href=\"#\" onclick=\"event.preventDefault(); window.mpTeaserClose();\"\u003eFerme.\u003c\/a\u003e\n\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- MODAL avec le puzzle dedans --\u003e\n\u003cdiv class=\"mp-modal-overlay\" id=\"mp-modal-overlay\" onclick=\"if(event.target===this) window.mpClose()\"\u003e\n  \u003cdiv class=\"mp-modal-content\"\u003e\n    \u003cbutton type=\"button\" class=\"mp-modal-close\" onclick=\"window.mpClose()\" aria-label=\"Fermer\"\u003e×\u003c\/button\u003e\n    \u003cdiv class=\"mp-wrap\"\u003e\n    \u003cdiv class=\"mp-card\"\u003e\n\n      \u003cdiv class=\"mp-head\"\u003e\n        \u003cdiv class=\"eyebrow\"\u003e🌴 Jeu de l'été Mood\u003c\/div\u003e\n        \u003ch2\u003eDes bons cadeaux et \u003cspan class=\"it\"\u003edes surprises\u003c\/span\u003e à gagner tout l'été 🎁\u003c\/h2\u003e\n        \u003cdiv class=\"mp-head-row\"\u003e\n          \u003cdiv class=\"mp-target-thumb\" id=\"mp-target-thumb\"\u003e\u003c\/div\u003e\n          \u003cp class=\"lede\"\u003eReconstitue la pépite pour tenter ta chance · clique 2 morceaux pour les échanger\u003c\/p\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"mp-skip\"\u003eTu ne veux pas jouer ? \u003ca href=\"#\" onclick=\"event.preventDefault(); window.mpClose();\"\u003eFerme.\u003c\/a\u003e\n\u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"mp-difficulty\"\u003e\n        \u003cbutton data-difficulty=\"3\" class=\"active\"\u003eFacile · 3×3\u003c\/button\u003e\n        \u003cbutton data-difficulty=\"4\"\u003eNormal · 4×4\u003c\/button\u003e\n        \u003cbutton data-difficulty=\"5\"\u003eExpert · 5×5\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"mp-status\"\u003e\n        \u003cdiv class=\"chrono\" id=\"mp-chrono\"\u003e00:00\u003c\/div\u003e\n        \u003cdiv class=\"moves\"\u003e\n\u003cspan id=\"mp-moves\"\u003e0\u003c\/span\u003e coups\u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"mp-board-wrap\"\u003e\n        \u003cdiv class=\"mp-board\" id=\"mp-board\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"mp-preview-toggle\" id=\"mp-preview-toggle\"\u003e👁 Voir le modèle (3 sec)\u003c\/div\u003e\n\n      \u003cdiv class=\"mp-actions\"\u003e\n        \u003cbutton id=\"mp-shuffle\"\u003e↻ Mélanger\u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"mp-help\"\u003eAstuce — clique sur 2 morceaux pour les échanger\u003c\/div\u003e\n\n      \u003cdiv class=\"mp-success\" id=\"mp-success\"\u003e\n        \u003cdiv class=\"ico\"\u003e🌴 ✨\u003c\/div\u003e\n        \u003ch3\u003eBravo, tu as \u003cspan class=\"it\"\u003ereconstitué la pépite !\u003c\/span\u003e\n\u003c\/h3\u003e\n        \u003cdiv class=\"result\"\u003eTerminée en \u003cstrong id=\"mp-final-time\"\u003e—\u003c\/strong\u003e avec \u003cstrong id=\"mp-final-moves\"\u003e—\u003c\/strong\u003e coups\u003c\/div\u003e\n        \u003cdiv class=\"mp-reward\"\u003e\n          \u003cdiv class=\"lbl\"\u003eTu es dans le tirage 🎁\u003c\/div\u003e\n          \u003cdiv class=\"amt\"\u003eDes bons cadeaux et \u003cspan class=\"it-amt\"\u003esurprises\u003c\/span\u003e\n\u003c\/div\u003e\n          \u003cdiv class=\"reward-sub\"\u003eà gagner tout l'été — envoie ton nom sur WhatsApp\u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"mp-name-form\"\u003e\n          \u003clabel for=\"mp-player-name\" class=\"mp-name-label\"\u003eComment t'appelles-tu ?\u003c\/label\u003e\n          \u003cinput type=\"text\" id=\"mp-player-name\" class=\"mp-name-input\" placeholder=\"Ton prénom\" autocomplete=\"given-name\" maxlength=\"40\"\u003e\n        \u003c\/div\u003e\n        \u003cbutton type=\"button\" class=\"mp-wa-btn\" id=\"mp-wa-submit\"\u003e\n          \u003cspan\u003e💬\u003c\/span\u003e\n          \u003cspan\u003eTenter ma chance sur WhatsApp\u003c\/span\u003e\n        \u003c\/button\u003e\n        \u003cp class=\"mp-foot\"\u003eAttention, ne triche pas... on te retrouvera 😉\u003c\/p\u003e\n      \u003c\/div\u003e\n\n    \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n(function(){\n  const IMG = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0798\/2303\/files\/Capture_d_ecran_2026-06-24_a_16.34.30.png?v=1782334414';\n\n  \/\/ ─────────── MOVE OVERLAY + TEASER TO BODY ROOT to escape stacking-context issues ───────────\n  function moveToBody(selector) {\n    const el = document.querySelector(selector);\n    if (el \u0026\u0026 el.parentElement !== document.body) document.body.appendChild(el);\n  }\n  moveToBody('.mp-modal-overlay');\n  moveToBody('.mp-teaser');\n\n  let N = 3;\n  let order = [];\n  let selected = null;\n  let moves = 0;\n  let startTime = null;\n  let chronoInterval = null;\n  let solved = false;\n\n  const board = document.getElementById('mp-board');\n  const chronoEl = document.getElementById('mp-chrono');\n  const movesEl = document.getElementById('mp-moves');\n  const successEl = document.getElementById('mp-success');\n  const finalTimeEl = document.getElementById('mp-final-time');\n  const finalMovesEl = document.getElementById('mp-final-moves');\n  const overlay = document.getElementById('mp-modal-overlay');\n\n  function shuffleArray(arr){\n    for (let i = arr.length-1; i \u003e 0; i--){\n      const j = Math.floor(Math.random()*(i+1));\n      [arr[i], arr[j]] = [arr[j], arr[i]];\n    }\n    return arr;\n  }\n  function isCorrect(){\n    for (let i = 0; i \u003c order.length; i++) if (order[i] !== i) return false;\n    return true;\n  }\n  function formatTime(seconds){\n    const m = Math.floor(seconds\/60); const s = seconds%60;\n    return String(m).padStart(2,'0') + ':' + String(s).padStart(2,'0');\n  }\n  function updateChrono(){\n    if (!startTime) return;\n    const elapsed = Math.floor((Date.now()-startTime)\/1000);\n    chronoEl.textContent = formatTime(elapsed);\n  }\n  function startChrono(){\n    if (startTime) return;\n    startTime = Date.now();\n    chronoInterval = setInterval(updateChrono, 500);\n  }\n  function stopChrono(){\n    if (chronoInterval){ clearInterval(chronoInterval); chronoInterval = null; }\n  }\n\n  function buildBoard(){\n    solved = false;\n    moves = 0;\n    movesEl.textContent = '0';\n    chronoEl.textContent = '00:00';\n    stopChrono(); startTime = null;\n    successEl.classList.remove('show');\n    selected = null;\n\n    order = [];\n    const total = N*N;\n    for (let i = 0; i \u003c total; i++) order.push(i);\n    do { shuffleArray(order); } while (isCorrect());\n\n    board.style.gridTemplateColumns = `repeat(${N}, 1fr)`;\n    board.innerHTML = '';\n    for (let i = 0; i \u003c total; i++){\n      const tile = document.createElement('div');\n      tile.className = 'mp-tile';\n      tile.dataset.idx = i;\n      board.appendChild(tile);\n    }\n    renderTiles();\n  }\n\n  function renderTiles(){\n    const total = N*N;\n    const tiles = board.querySelectorAll('.mp-tile');\n    for (let i = 0; i \u003c total; i++){\n      const tile = tiles[i];\n      const correctPos = order[i];\n      const col = correctPos % N;\n      const row = Math.floor(correctPos \/ N);\n      tile.style.setProperty('--mp-img', `url(${IMG})`);\n      tile.style.setProperty('--mp-bg-size', `${N*100}% ${N*100}%`);\n      tile.style.backgroundPosition = `${(col\/(N-1))*100}% ${(row\/(N-1))*100}%`;\n      tile.classList.toggle('correct', correctPos === i);\n    }\n  }\n\n  board.addEventListener('click', (e) =\u003e {\n    if (solved) return;\n    const tile = e.target.closest('.mp-tile');\n    if (!tile) return;\n    const idx = parseInt(tile.dataset.idx, 10);\n    startChrono();\n    if (selected === null){\n      selected = idx;\n      tile.classList.add('selected');\n      return;\n    }\n    if (selected === idx){\n      tile.classList.remove('selected');\n      selected = null;\n      return;\n    }\n    [order[selected], order[idx]] = [order[idx], order[selected]];\n    moves++;\n    movesEl.textContent = String(moves);\n    document.querySelector(`.mp-tile.selected`)?.classList.remove('selected');\n    selected = null;\n    renderTiles();\n    if (isCorrect()){\n      solved = true;\n      stopChrono();\n      const elapsed = Math.floor((Date.now()-startTime)\/1000);\n      finalTimeEl.textContent = formatTime(elapsed);\n      finalMovesEl.textContent = String(moves);\n      setTimeout(() =\u003e {\n        successEl.classList.add('show');\n        successEl.scrollIntoView({behavior:'smooth', block:'center'});\n        document.getElementById('mp-player-name')?.focus();\n      }, 300);\n    }\n  });\n\n  \/\/ ─────────── WHATSAPP SUBMIT (name + score → pre-filled WhatsApp) ───────────\n  document.getElementById('mp-wa-submit')?.addEventListener('click', () =\u003e {\n    const nameInput = document.getElementById('mp-player-name');\n    const name = (nameInput?.value || '').trim();\n    if (!name){\n      nameInput?.focus();\n      nameInput?.classList.add('mp-name-shake');\n      setTimeout(() =\u003e nameInput?.classList.remove('mp-name-shake'), 500);\n      return;\n    }\n    const time = finalTimeEl.textContent || '—';\n    const movesTxt = finalMovesEl.textContent || '—';\n    const lines = [\n      '🌴 Jeu de l\\'été Mood',\n      '',\n      `Nom : ${name}`,\n      `Score : ${time} · ${movesTxt} coups · ${N}×${N}`,\n      'Pépite reconstituée 💎',\n      '',\n      'Je tente ma chance pour les bons cadeaux et surprises du jour',\n      '',\n      '(attention, ne triche pas... on te retrouvera 😉)'\n    ];\n    const msg = encodeURIComponent(lines.join('\\n'));\n    const waUrl = `https:\/\/api.whatsapp.com\/send\/?phone=41792063704\u0026text=${msg}\u0026type=phone_number\u0026app_absent=0`;\n    window.open(waUrl, '_blank', 'noopener');\n  });\n\n  document.querySelectorAll('.mp-difficulty button').forEach(btn =\u003e {\n    btn.onclick = () =\u003e {\n      document.querySelectorAll('.mp-difficulty button').forEach(b =\u003e b.classList.remove('active'));\n      btn.classList.add('active');\n      N = parseInt(btn.dataset.difficulty, 10);\n      buildBoard();\n    };\n  });\n\n  document.getElementById('mp-shuffle').onclick = buildBoard;\n  document.getElementById('mp-preview-toggle').onclick = () =\u003e {\n    if (solved) return;\n    const saved = order.slice();\n    for (let i = 0; i \u003c order.length; i++) order[i] = i;\n    renderTiles();\n    setTimeout(() =\u003e { order = saved; renderTiles(); }, 3000);\n  };\n\n  const teaser = document.getElementById('mp-teaser');\n\n  \/\/ ─────────── TEASER OPEN \/ CLOSE ───────────\n  window.mpTeaserClose = function(){\n    if (teaser) teaser.classList.add('hidden');\n  };\n\n  \/\/ ─────────── FULL MODAL OPEN \/ CLOSE ───────────\n  window.mpOpen = function(){\n    if (teaser) teaser.classList.add('hidden');\n    overlay.classList.add('show');\n    document.body.style.overflow = 'hidden';\n    if (order.length === 0) buildBoard();\n    \/\/ Force scroll-to-top several times to override any auto-focus \/ browser behavior\n    const scrollTop = () =\u003e {\n      const wrap = overlay.querySelector('.mp-wrap');\n      if (wrap) wrap.scrollTop = 0;\n      const content = overlay.querySelector('.mp-modal-content');\n      if (content) content.scrollTop = 0;\n      overlay.scrollTop = 0;\n    };\n    scrollTop();\n    requestAnimationFrame(scrollTop);\n    setTimeout(scrollTop, 100);\n    setTimeout(scrollTop, 300);\n  };\n  window.mpClose = function(){\n    overlay.classList.remove('show');\n    document.body.style.overflow = '';\n  };\n\n  \/\/ Escape key\n  document.addEventListener('keydown', (e) =\u003e {\n    if (e.key === 'Escape'){\n      if (overlay.classList.contains('show')) window.mpClose();\n      else if (teaser \u0026\u0026 !teaser.classList.contains('hidden')) window.mpTeaserClose();\n    }\n  });\n\n  \/\/ Set the target preview thumbnail\n  const thumb = document.getElementById('mp-target-thumb');\n  if (thumb) thumb.style.backgroundImage = `url(${IMG})`;\n\n  \/\/ ─────────── BUILD MINI-BOARD inside teaser (3×3 shuffled preview) ───────────\n  function buildMiniBoard(){\n    const mini = document.getElementById('mp-mini-board');\n    if (!mini) return;\n    const miniOrder = [0,1,2,3,4,5,6,7,8];\n    do { shuffleArray(miniOrder); } while (miniOrder.every((v,i) =\u003e v===i));\n    mini.innerHTML = '';\n    mini.style.setProperty('--mp-mini-img', `url(${IMG})`);\n    for (let i = 0; i \u003c 9; i++){\n      const tile = document.createElement('div');\n      tile.className = 'mp-mini-tile';\n      const correctPos = miniOrder[i];\n      const col = correctPos % 3;\n      const row = Math.floor(correctPos \/ 3);\n      tile.style.backgroundPosition = `${(col\/2)*100}% ${(row\/2)*100}%`;\n      mini.appendChild(tile);\n    }\n  }\n  buildMiniBoard();\n\n  buildBoard();\n})();\n\u003c\/script\u003e\n\n\n\u003ch1 style=\"font-size: 2em; font-weight: bold; margin-bottom: 0.5em;\"\u003e🥥 Coco - Mariposa\u003c\/h1\u003e\n\u003cp\u003eMariposa coco — nos addons se parent de brun chocolat pour une collection éphémère. Découvrez l’addon en argent Mariposa\u003c\/p\u003e\n\u003ch3\u003eCompatibilité\u003c\/h3\u003e\n\u003cul\u003e\n\u003cli\u003eSur base \u003cstrong\u003esmall\u003c\/strong\u003e ou \u003cstrong\u003elarge\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003e⚠️ Non compatible avec la base extra small (9mm)\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003ch3\u003eCaractéristiques\u003c\/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFormat : addon\u003c\/li\u003e\n\u003cli\u003eMatière : argent 925\u003c\/li\u003e\n\u003cli\u003eGarantie à vie\u003c\/li\u003e\n\u003cli\u003eConçu et assemblé en Suisse\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003ch3\u003ePrécautions et informations\u003c\/h3\u003e\n\u003cp\u003eNous vous rendons attentifs au fait que la couleur de l'addon et de ses dessins peuvent varier selon la lumière.\u003c\/p\u003e","brand":"Mood Collection","offers":[{"title":"50","offer_id":63826851692921,"sku":"AD-ARGENT-COCOMARIPOSA-50","price":161.0,"currency_code":"CHF","in_stock":true},{"title":"52","offer_id":63826851725689,"sku":"AD-ARGENT-COCOMARIPOSA-52","price":161.0,"currency_code":"CHF","in_stock":true},{"title":"54","offer_id":63826851758457,"sku":"AD-ARGENT-COCOMARIPOSA-54","price":161.0,"currency_code":"CHF","in_stock":true},{"title":"56","offer_id":63826851791225,"sku":"AD-ARGENT-COCOMARIPOSA-56","price":161.0,"currency_code":"CHF","in_stock":true},{"title":"58","offer_id":63826851823993,"sku":"AD-ARGENT-COCOMARIPOSA-58","price":161.0,"currency_code":"CHF","in_stock":true},{"title":"60","offer_id":63826851856761,"sku":"AD-ARGENT-COCOMARIPOSA-60","price":161.0,"currency_code":"CHF","in_stock":true},{"title":"62","offer_id":63826851889529,"sku":"AD-ARGENT-COCOMARIPOSA-62","price":161.0,"currency_code":"CHF","in_stock":true},{"title":"64","offer_id":63826851922297,"sku":"AD-ARGENT-COCOMARIPOSA-64","price":161.0,"currency_code":"CHF","in_stock":true},{"title":"66","offer_id":63826851955065,"sku":"AD-ARGENT-COCOMARIPOSA-66","price":161.0,"currency_code":"CHF","in_stock":true},{"title":"68","offer_id":63826851987833,"sku":"AD-ARGENT-COCOMARIPOSA-68","price":161.0,"currency_code":"CHF","in_stock":true},{"title":"70","offer_id":63826852020601,"sku":"AD-ARGENT-COCOMARIPOSA-70","price":161.0,"currency_code":"CHF","in_stock":true},{"title":"72","offer_id":63826852053369,"sku":"AD-ARGENT-COCOMARIPOSA-72","price":161.0,"currency_code":"CHF","in_stock":true},{"title":"taille inconnue","offer_id":63826852086137,"sku":"AD-ARGENT-COCOMARIPOSA-00","price":161.0,"currency_code":"CHF","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0798\/2303\/files\/Capture_d_ecran_2026-06-24_a_16.34.30.png?v=1782334414","url":"https:\/\/www.yourmood.net\/products\/anneau-addon-coco-mariposa-en-argent-pour-bague-mood-interchangeable","provider":"Mood Collection","version":"1.0","type":"link"}