✶ Une histoire pour Léonie ✶

Léonie et les dauphins de la lune

Racontée rien que pour Léonie · 1 min 45

0:00/1 min 45

Léonie, blottie contre son doudou Pilou, regarde par la fenêtre. La nuit commence à étendre son manteau bleu sur le ciel, et les étoiles clignent comme des lucioles timides.

Soudain, une douce lueur dorée danse sur le mur. C’est Pilou qui s’anime ! Ses longues oreilles frémissent, et il murmure à Léonie : « Ce soir, les dauphins de la lune nous attendent. »

Léonie n’hésite pas. Elle serre Pilou contre elle, et hop ! Les deux amis glissent sur un nuage soyeux. En bas, l’océan brille comme un miroir, et des dauphins sautent en dessinant des arcs-en-ciel dans l’eau.

Un dauphin à la nageoire argentée s’approche. « Bienvenue, Léonie ! » dit-il en riant. « Nous avons besoin de toi pour allumer les étoiles égarées. » Léonie tend la main, et chaque étoile qu’elle touche s’illumine d’un éclat joyeux.

Peu à peu, le ciel se remplit de lumière. Plus aucun coin d’ombre ne reste. Les dauphins chantent une mélodie apaisante, et Léonie se sent légère, comme si elle flottait sur une berceuse.

Pilou lui chuchote : « Regarde, Léonie, la nuit est une amie. Elle berce le monde pour qu’il se repose, tout comme toi. » Les dauphins font un dernier saut, et leur éclaboussure forme une couverture de brume douce autour d’eux.

Léonie bâille. Le nuage les ramène doucement vers sa chambre. La lune veille à la fenêtre, et les étoiles, maintenant bien en place, sourient à travers la vitre.

Pilou se blottit de nouveau contre elle. « Bonne nuit, Léonie. La nuit est pleine de magie… et de douceurs. » Ses paupières devenant lourdes, Léonie ferme les yeux, bercée par le chant lointain des dauphins.

Et tandis qu’elle s’endort, une petite étoile brille juste pour elle, comme un clin d’œil complice.

✶ Histoire offerte — les vôtres seront tout aussi magiques ✶

Et vous, pour qui est l'histoire ?

Encore une histoire offerte ?

Télécharger l'audio 🌙 Mode enfant 🔄 Variante Créer une autre histoire

Comment tu te sens ce soir ?

Note

✦ Notes du soir

La veillée assombrit l'écran pour la chambre et endort doucement le volume à la fin de l'histoire.

// IT299 — Save audio for offline listening (function initOfflineSave() { var btn = document.getElementById("offline-save-btn"); if (!btn || !("caches" in window)) { if (btn) btn.hidden = true; return; } var AUDIO_V = "millet-a40"; var audioUrl = "/audio/4a0de0a8560c.mp3"; var isEn = (typeof storyLang !== "undefined" && storyLang === "en"); if (!audioUrl || audioUrl.indexOf("{{") !== -1) { btn.hidden = true; return; } if (isEn && btn.dataset.en) btn.textContent = btn.dataset.en; caches.open(AUDIO_V).then(function(cache) { return cache.match(audioUrl); }).then(function(hit) { if (hit) { btn.textContent = isEn ? "✓ Saved offline" : "✓ En mémoire"; btn.classList.add("saved"); } }).catch(function() {}); btn.addEventListener("click", async function() { if (btn.classList.contains("saving") || btn.classList.contains("saved")) return; btn.textContent = isEn ? "Saving…" : "Sauvegarde…"; btn.classList.add("saving"); try { var cache = await caches.open(AUDIO_V); await cache.add(audioUrl); btn.textContent = isEn ? "✓ Saved offline" : "✓ En mémoire"; btn.classList.remove("saving"); btn.classList.add("saved"); try { navigator.sendBeacon("/api/event", new Blob([JSON.stringify({ name: "offline-save" })], { type: "application/json" })); } catch {} } catch { btn.textContent = isEn ? "💾 Save offline" : "💾 Hors ligne"; btn.classList.remove("saving"); } }); })(); // IT366 — Mid-listen reaction strip at 50% mark (function initMidReact() { var strip = document.getElementById("mid-react-strip"); var labelEl = document.getElementById("mrs-label"); if (!strip) return; var storyId = location.pathname.split("/").pop(); var REACT_KEY = "milleettoi-kid-reaction-" + storyId; try { if (localStorage.getItem(REACT_KEY)) return; } catch {} var isEn = (typeof storyLang !== "undefined" && storyLang === "en"); if (isEn && labelEl) labelEl.textContent = "Enjoying it?"; var _shown = false, _dismissed = false; var autoTimer = null; function dismiss() { if (_dismissed) return; _dismissed = true; strip.hidden = true; clearTimeout(autoTimer); } audio.addEventListener("timeupdate", function() { if (_shown || _dismissed || !audio.duration) return; if (audio.currentTime / audio.duration >= 0.5) { _shown = true; strip.hidden = false; autoTimer = setTimeout(dismiss, 8000); } }); strip.querySelectorAll(".mrs-btn").forEach(function(btn) { btn.addEventListener("click", function() { var react = btn.getAttribute("data-react"); try { localStorage.setItem(REACT_KEY, react); } catch {} strip.querySelectorAll(".mrs-btn").forEach(function(b) { b.classList.remove("mrs-picked"); }); btn.classList.add("mrs-picked"); try { navigator.sendBeacon("/api/event", JSON.stringify({ name: "mid-react", reaction: react, story_id: storyId })); } catch {} setTimeout(dismiss, 600); }); }); })(); // IT362 — Parent handoff overlay before child mode (function initHandoff() { var kidLink = document.querySelector('.story-actions a[href*="/enfant"]'); var overlay = document.getElementById("handoff-overlay"); if (!kidLink || !overlay) return; var isEn = (typeof storyLang !== "undefined" && storyLang === "en"); var subEl = document.getElementById("handoff-sub"); kidLink.addEventListener("click", function(e) { e.preventDefault(); var href = kidLink.href; if (subEl) subEl.textContent = isEn ? "Story time! 🌟" : "C’est l’heure des histoires 🌟"; overlay.hidden = false; try { navigator.sendBeacon("/api/event", JSON.stringify({ name: "handoff-to-child" })); } catch {} setTimeout(function() { window.location.href = href; }, 2000); }); })(); // IT359 — Share a quote button (function initShareQuote() { var btn = document.getElementById("share-quote-btn"); var osd = document.getElementById("seek-osd"); if (!btn) return; var isEn = (typeof storyLang !== "undefined" && storyLang === "en"); var osdTimer = null; function showOsd(txt) { if (!osd) return; osd.textContent = txt; osd.classList.add("visible"); clearTimeout(osdTimer); osdTimer = setTimeout(function() { osd.classList.remove("visible"); }, 2000); } btn.addEventListener("click", function() { var paras = Array.from(document.querySelectorAll(".story-paper p")).filter(function(p) { return p.textContent.trim().length > 40; }); if (!paras.length) return; var idx = Math.floor(paras.length / 2); var quote = paras[idx].textContent.trim().slice(0, 180); if (quote.length === 180) quote = quote.slice(0, quote.lastIndexOf(" ") || 180) + "…"; var title = document.querySelector("h1.story-title"); var titleTxt = title ? title.textContent.trim() : "Mille et Toi"; var text = "“" + quote + "”\n\n— " + titleTxt + " 🌙\nhttps://milleettoi.fr"; if (navigator.share) { navigator.share({ text: text }).catch(function() {}); } else if (navigator.clipboard) { navigator.clipboard.writeText(text).then(function() { showOsd(isEn ? "Quote copied!" : "Extrait copié !"); try { navigator.sendBeacon("/api/event", JSON.stringify({ name: "share-quote" })); } catch {} }).catch(function() { showOsd(isEn ? "Copy failed" : "Échec de copie"); }); } }); })(); // IT356 — Push notification opt-in after 90s of listening (function initPushOptinCard() { if (!("PushManager" in window) || !("serviceWorker" in navigator)) return; if (window.location.pathname.startsWith("/enfant")) return; try { if (localStorage.getItem("milleettoi-push-optin-story-shown")) return; } catch {} if (typeof Notification !== "undefined" && Notification.permission !== "default") return; const card = document.getElementById("push-optin-card"); const closeBtn = document.getElementById("push-optin-close"); const noBtn = document.getElementById("push-optin-no"); const yesBtn = document.getElementById("push-optin-yes"); const titleEl = document.getElementById("push-optin-title"); const subEl = document.getElementById("push-optin-sub"); const okEl = document.getElementById("push-optin-ok"); if (!card) return; const isEn = (typeof storyLang !== "undefined" && storyLang === "en"); if (isEn) { if (titleEl) titleEl.textContent = "A reminder tonight?"; if (subEl) subEl.textContent = "Get a nudge at story time."; if (yesBtn) yesBtn.textContent = "Yes, enable 🌙"; if (noBtn) noBtn.textContent = "Not now"; if (okEl) okEl.textContent = "✶ Done!"; } let _listenedSec = 0, _lastTime = null, _shown = false; function _urlB64(b64) { var pad = "=".repeat((4 - b64.length % 4) % 4); var raw = atob((b64 + pad).replace(/-/g, "+").replace(/_/g, "/")); var arr = new Uint8Array(raw.length); for (var i = 0; i < raw.length; i++) arr[i] = raw.charCodeAt(i); return arr; } audio.addEventListener("play", function() { _lastTime = audio.currentTime; }); audio.addEventListener("pause", function() { _lastTime = null; }); audio.addEventListener("timeupdate", function() { if (_shown) return; if (_lastTime !== null && audio.currentTime > _lastTime) _listenedSec += audio.currentTime - _lastTime; _lastTime = audio.currentTime; if (_listenedSec >= 90) { _shown = true; card.hidden = false; try { localStorage.setItem("milleettoi-push-optin-story-shown", "1"); } catch {} } }); function dismiss() { card.hidden = true; } if (closeBtn) closeBtn.addEventListener("click", dismiss); if (noBtn) noBtn.addEventListener("click", dismiss); if (yesBtn) yesBtn.addEventListener("click", async function() { yesBtn.disabled = true; try { const perm = await Notification.requestPermission(); if (perm !== "granted") { dismiss(); return; } const reg = await navigator.serviceWorker.ready; const keyRes = await fetch("/api/push/key"); if (!keyRes.ok) { dismiss(); return; } const { publicKey } = await keyRes.json(); const sub = await reg.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: _urlB64(publicKey) }); const lib = (() => { try { return JSON.parse(localStorage.getItem("milleettoi-bibliotheque") || "[]"); } catch { return []; } })(); const prenom = (lib[lib.length - 1] || {}).prenom || ""; const hour = (() => { try { return localStorage.getItem("milleettoi-reminder-time") || "20:30"; } catch { return "20:30"; } })(); const lang = isEn ? "en" : "fr"; await fetch("/api/push/subscribe?prenom=" + encodeURIComponent(prenom) + "&lang=" + lang + "&hour=" + encodeURIComponent(hour), { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(sub.toJSON()), }); if (yesBtn) yesBtn.hidden = true; if (noBtn) noBtn.hidden = true; if (okEl) okEl.hidden = false; try { navigator.sendBeacon("/api/event", JSON.stringify({ name: "push-optin-story" })); } catch {} setTimeout(dismiss, 2500); } catch { dismiss(); } }); })(); // IT300 — Touch swipe to seek (mobile: swipe left/right = ±15s) (function initSwipeSeek() { var osd = document.getElementById("seek-osd"); var touchStartX = 0, touchStartY = 0; var osdTimer = null; function showOsd(text) { if (!osd) return; osd.textContent = text; osd.classList.add("visible"); clearTimeout(osdTimer); osdTimer = setTimeout(function() { osd.classList.remove("visible"); }, 1200); } document.addEventListener("touchstart", function(e) { touchStartX = e.touches[0].clientX; touchStartY = e.touches[0].clientY; }, { passive: true }); document.addEventListener("touchend", function(e) { var dx = e.changedTouches[0].clientX - touchStartX; var dy = e.changedTouches[0].clientY - touchStartY; if (Math.abs(dy) > Math.abs(dx) * 1.4 || Math.abs(dx) < 70) return; var el = e.target; if (el && (el.closest("input, button, a, select") || el.closest(".player") || el.closest(".story-actions"))) return; var isEn = (typeof storyLang !== "undefined" && storyLang === "en"); if (dx > 0) { audio.currentTime = Math.min(audio.duration || 0, audio.currentTime + 15); showOsd("→ +15s"); } else { audio.currentTime = Math.max(0, audio.currentTime - 15); showOsd(isEn ? "← −15s" : "−15s ←"); } }, { passive: true }); })(); // IT384 — Reading background cream toggle (function initReadingBg() { var btn = document.getElementById("reading-bg-btn"); var page = document.querySelector(".story-page"); var labelEl = document.getElementById("reading-bg-label"); if (!btn || !page) return; var isEn = (typeof storyLang !== "undefined" && storyLang === "en"); var BG_KEY = "milleettoi-paper-bg"; var cream = false; try { cream = localStorage.getItem(BG_KEY) === "cream"; } catch {} function apply() { page.classList.toggle("paper-cream", cream); btn.textContent = (cream ? "🌙 " : "🌞 ") + (isEn ? "Reading mode" : "Fond lecture"); btn.classList.toggle("active", cream); } apply(); btn.addEventListener("click", function() { cream = !cream; apply(); try { localStorage.setItem(BG_KEY, cream ? "cream" : ""); } catch {} }); })(); // IT385 — Per-paragraph copy button on hover (function initParaCopy() { var isEn = (typeof storyLang !== "undefined" && storyLang === "en"); var osd = document.getElementById("seek-osd"); var osdTimer = null; function flash(msg) { if (!osd) return; osd.textContent = msg; osd.classList.add("visible"); clearTimeout(osdTimer); osdTimer = setTimeout(function() { osd.classList.remove("visible"); }, 1500); } document.querySelectorAll(".story-paper p").forEach(function(p) { var wrap = document.createElement("span"); wrap.className = "para-copy-wrap"; p.parentNode.insertBefore(wrap, p); wrap.appendChild(p); var copyBtn = document.createElement("button"); copyBtn.className = "para-copy-btn"; copyBtn.type = "button"; copyBtn.textContent = "📋"; copyBtn.title = isEn ? "Copy paragraph" : "Copier le paragraphe"; copyBtn.addEventListener("click", function(e) { e.stopPropagation(); var text = p.textContent.trim(); navigator.clipboard && navigator.clipboard.writeText(text).then(function() { flash(isEn ? "✓ Copied!" : "✓ Copié !"); }).catch(function() {}); }); wrap.appendChild(copyBtn); }); })(); // IT381 — Play count badge (function initPlayCount() { var badge = document.getElementById("story-plays-badge"); if (!badge) return; var storyId = location.pathname.split("/").pop(); var isEn = (typeof storyLang !== "undefined" && storyLang === "en"); var plays = 0; try { plays = parseInt(localStorage.getItem("milleettoi-plays-" + storyId) || "0", 10); } catch {} if (plays < 1) return; badge.textContent = isEn ? "✶ Listened " + plays + " time" + (plays > 1 ? "s" : "") : "✶ Écoutée " + plays + " fois"; badge.hidden = false; })(); // IT380 — Named chapters navigation popup (function initChapNav() { var btn = document.getElementById("chap-nav-btn"); var popup = document.getElementById("chap-nav-popup"); if (!btn || !popup) return; var isEn = (typeof storyLang !== "undefined" && storyLang === "en"); function buildPopup() { if (!audio.duration) return; popup.innerHTML = ""; var chapters = [ { label: isEn ? "⏮ Beginning" : "⏮ Début", t: 0 }, { label: isEn ? "▶ Part 2" : "▶ Partie 2", t: audio.duration * (1/3) }, { label: isEn ? "▶ Part 3" : "▶ Partie 3", t: audio.duration * (2/3) } ]; chapters.forEach(function(ch) { var item = document.createElement("button"); item.className = "chap-nav-item"; item.innerHTML = ch.label + ' ' + fmt(ch.t) + ""; item.addEventListener("click", function() { audio.currentTime = ch.t; audio.play().catch(function(){}); popup.hidden = true; showOsd(ch.label); }); popup.appendChild(item); }); } audio.addEventListener("loadedmetadata", buildPopup); if (audio.duration) buildPopup(); btn.addEventListener("click", function(e) { e.stopPropagation(); if (popup.hidden) { buildPopup(); popup.hidden = false; } else { popup.hidden = true; } }); document.addEventListener("click", function() { popup.hidden = true; }); })(); // IT379 — Lire en famille read-aloud mode (function initReadAloud() { var openBtn = document.getElementById("read-aloud-btn"); var overlay = document.getElementById("read-aloud-overlay"); var closeBtn = document.getElementById("rao-close"); var textEl = document.getElementById("rao-text"); var prevBtn = document.getElementById("rao-prev"); var nextBtn = document.getElementById("rao-next"); var progressEl = document.getElementById("rao-progress"); if (!openBtn || !overlay || !textEl) return; var isEn = (typeof storyLang !== "undefined" && storyLang === "en"); if (isEn) overlay.querySelectorAll("[data-en]").forEach(function(el) { el.textContent = el.getAttribute("data-en"); }); var paras = Array.from(document.querySelectorAll(".story-paper p")).map(function(p) { return p.textContent.trim(); }).filter(Boolean); var idx = 0; function show() { if (!paras.length) return; textEl.textContent = paras[idx]; progressEl.textContent = (idx + 1) + " / " + paras.length; if (prevBtn) prevBtn.disabled = idx === 0; if (nextBtn) nextBtn.disabled = idx === paras.length - 1; } function open() { idx = 0; show(); overlay.hidden = false; if (closeBtn) closeBtn.focus(); } function close() { overlay.hidden = true; } openBtn.addEventListener("click", open); if (closeBtn) closeBtn.addEventListener("click", close); if (prevBtn) prevBtn.addEventListener("click", function() { if (idx > 0) { idx--; show(); } }); if (nextBtn) nextBtn.addEventListener("click", function() { if (idx < paras.length - 1) { idx++; show(); } }); overlay.addEventListener("keydown", function(e) { if (e.key === "Escape") close(); if (e.key === "ArrowLeft" && idx > 0) { idx--; show(); } if (e.key === "ArrowRight" && idx < paras.length - 1) { idx++; show(); } }); // Swipe support for mobile var _sx = 0; overlay.addEventListener("touchstart", function(e) { _sx = e.touches[0].clientX; }, { passive: true }); overlay.addEventListener("touchend", function(e) { var dx = e.changedTouches[0].clientX - _sx; if (Math.abs(dx) < 50) return; if (dx < 0 && idx < paras.length - 1) { idx++; show(); } else if (dx > 0 && idx > 0) { idx--; show(); } }, { passive: true }); })(); // IT375 — Timestamp bookmarks (function initBookmarks() { var btn = document.getElementById("bookmark-btn"); var bmEl = document.getElementById("player-bookmarks"); var barEl = document.getElementById("bar"); if (!btn || !bmEl || !barEl) return; var storyId = location.pathname.split("/").pop(); var BM_KEY = "milleettoi-bookmarks-" + storyId; var isEn = (typeof storyLang !== "undefined" && storyLang === "en"); var labelEl = document.getElementById("bookmark-label"); if (isEn && labelEl) labelEl.textContent = "Bookmark"; var bookmarks = []; try { bookmarks = JSON.parse(localStorage.getItem(BM_KEY) || "[]"); } catch {} function renderMarkers() { bmEl.innerHTML = ""; if (!audio.duration) return; bookmarks.forEach(function(t, i) { var pct = (t / audio.duration) * 100; var dot = document.createElement("button"); dot.className = "player-bm"; dot.style.left = pct + "%"; dot.title = fmt(t); dot.setAttribute("aria-label", (isEn ? "Bookmark at " : "Marque à ") + fmt(t)); dot.addEventListener("click", function(e) { e.stopPropagation(); audio.currentTime = t; audio.play().catch(function() {}); showOsd("📍 " + fmt(t)); }); bmEl.appendChild(dot); }); btn.textContent = bookmarks.length > 0 ? "📍 " + bookmarks.length : "📍 " + (isEn ? "Bookmark" : "Marquer"); } audio.addEventListener("loadedmetadata", renderMarkers); if (audio.duration) renderMarkers(); btn.addEventListener("click", function() { if (!audio.duration) return; var t = Math.round(audio.currentTime); if (!bookmarks.includes(t)) { bookmarks.push(t); bookmarks.sort(function(a, b) { return a - b; }); try { localStorage.setItem(BM_KEY, JSON.stringify(bookmarks)); } catch {} renderMarkers(); showOsd("📍 " + (isEn ? "Bookmarked at " : "Marqué à ") + fmt(t)); } }); })(); // IT373 — Keyboard shortcuts overlay (? key) (function initShortcuts() { var overlay = document.getElementById("shortcuts-overlay"); var closeBtn = document.getElementById("shortcuts-close"); if (!overlay) return; var isEn = (typeof storyLang !== "undefined" && storyLang === "en"); if (isEn) { overlay.querySelectorAll("[data-en]").forEach(function(el) { el.textContent = el.getAttribute("data-en"); }); } function openOverlay() { overlay.hidden = false; closeBtn && closeBtn.focus(); } function closeOverlay() { overlay.hidden = true; } document.addEventListener("keydown", function(e) { if (e.key === "?" && !["INPUT","TEXTAREA"].includes(e.target.tagName)) { overlay.hidden ? openOverlay() : closeOverlay(); } if (e.key === "Escape" && !overlay.hidden) closeOverlay(); if (e.key === "l" && !["INPUT","BUTTON","A","SELECT","TEXTAREA"].includes(e.target.tagName)) { document.getElementById("loop-btn") && document.getElementById("loop-btn").click(); } if ((e.key === "+" || e.key === "=") && !["INPUT","BUTTON","A","SELECT","TEXTAREA"].includes(e.target.tagName)) { document.getElementById("font-size-btn") && document.getElementById("font-size-btn").click(); } if (e.key === "m" && !["INPUT","BUTTON","A","SELECT","TEXTAREA"].includes(e.target.tagName)) { document.getElementById("music") && document.getElementById("music").click(); } }); overlay.addEventListener("click", function(e) { if (e.target === overlay) closeOverlay(); }); if (closeBtn) closeBtn.addEventListener("click", closeOverlay); })(); // IT374 — Related articles (ambiance-based) (function initRelatedArticles() { var container = document.getElementById("related-articles"); var linksEl = document.getElementById("ra-links"); if (!container || !linksEl) return; var ambiance = (document.body.dataset && document.body.dataset.ambiance) || "magique"; var isEn = (typeof storyLang !== "undefined" && storyLang === "en"); if (isEn) container.querySelectorAll("[data-en]").forEach(function(el) { el.textContent = el.getAttribute("data-en"); }); var ARTICLES = { aventure: [ { fr: "Le courage de mon enfant", en: "Raising a courageous child", url: "/articles/cauchemars-enfant-que-faire" }, { fr: "Préparer la rentrée sereinement", en: "A calm back-to-school", url: "/articles/preparer-rentree-maternelle" } ], magique: [ { fr: "Quelle histoire raconter ce soir ?", en: "Which story tonight?", url: "/articles/quelle-histoire-raconter-ce-soir" }, { fr: "Activités calmes avant le coucher", en: "Calming bedtime activities", url: "/articles/activites-calmes-avant-coucher" } ], rigolo: [ { fr: "Mon enfant ne veut pas dormir", en: "My child won’t sleep", url: "/articles/mon-enfant-ne-veut-pas-dormir" }, { fr: "Activités calmes avant le coucher", en: "Calming bedtime activities", url: "/articles/activites-calmes-avant-coucher" } ], calme: [ { fr: "Mon enfant ne veut pas dormir", en: "My child won’t sleep", url: "/articles/mon-enfant-ne-veut-pas-dormir" }, { fr: "Cauchemars : que faire ?", en: "Children’s nightmares: what to do?", url: "/articles/cauchemars-enfant-que-faire" } ] }; var list = ARTICLES[ambiance] || ARTICLES["magique"]; linksEl.innerHTML = list.map(function(a) { return '' + (isEn ? a.en : a.fr) + ''; }).join(""); container.hidden = false; })(); // IT370 — Mot du soir vocabulary enrichment (function initMotDuSoir() { var card = document.getElementById("mot-du-soir"); var wordEl = document.getElementById("mds-word"); var defEl = document.getElementById("mds-def"); var labelEl = document.getElementById("mds-label"); if (!card || !wordEl || !defEl) return; var ambiance = (document.body.dataset && document.body.dataset.ambiance) || "magique"; var isEn = (typeof storyLang !== "undefined" && storyLang === "en"); if (isEn && labelEl) labelEl.textContent = "Word of the night"; var WORDS = { aventure: [ { w: "intrépide", e: "intrepid", dFr: "Quelqu’un de courageux qui n’a peur de rien.", dEn: "Someone who is fearless and daring." }, { w: "péripétie", e: "adventure", dFr: "Un événement inattendu qui change tout dans une histoire.", dEn: "An unexpected turn that changes everything in a story." }, { w: "bravoure", e: "bravery", dFr: "La force dans le cœur pour affronter ce qui fait peur.", dEn: "The strength in your heart to face what is scary." } ], magique: [ { w: "enchantement", e: "enchantment", dFr: "Un sort magique qui transforme le monde en quelque chose de merveilleux.", dEn: "A magical spell that turns the world into something wonderful." }, { w: "féerie", e: "fairy magic", dFr: "Un monde de rêve habité par les fées et les merveilles.", dEn: "A dream world full of fairies and wonders." }, { w: "mystère", e: "mystery", dFr: "Une chose secrète que l’on cherche à comprendre.", dEn: "A secret thing we are trying to understand." } ], rigolo: [ { w: "espiègle", e: "mischievous", dFr: "Quelqu’un de malicieux qui aime faire des blagues gentilles.", dEn: "Someone playful who loves harmless pranks." }, { w: "facétieux", e: "playful", dFr: "Quelqu’un qui dit des choses drôles pour faire rire les autres.", dEn: "Someone who says funny things to make others laugh." }, { w: "farfelu", e: "wacky", dFr: "Une idée ou une personne un peu bizarre mais adorable.", dEn: "A slightly unusual but lovable idea or person." } ], calme: [ { w: "sérénité", e: "serenity", dFr: "Un sentiment de paix intérieure, comme une mer sans vagues.", dEn: "A feeling of inner peace, like a calm sea." }, { w: "quiétude", e: "quietude", dFr: "Le silence doux et reposant du soir.", dEn: "The soft, restful silence of the evening." }, { w: "bienveillance", e: "kindness", dFr: "Vouloir le bien de tous, sans attendre rien en retour.", dEn: "Wishing good things for everyone, without expecting anything back." } ] }; var list = WORDS[ambiance] || WORDS["magique"]; var shown = false; var played30 = false; audio.addEventListener("timeupdate", function() { if (shown || played30) return; if (audio.currentTime >= 30) { played30 = true; var pick = list[Math.floor(Math.random() * list.length)]; wordEl.textContent = isEn ? pick.e : pick.w; defEl.textContent = isEn ? pick.dEn : pick.dFr; card.hidden = false; shown = true; } }); })();
🔦
Clique pour allumer la torche...
Niveau: 0/6
🪶
Notes: 0
🪢
L’histoire est emmelee, demele-la!
Noeuds: 0/6
📜
Revelations: 0
🦄
Choisis l’humeur de la licorne!
Humeurs: 0
🌰
Collectionne des glands pour vivre des aventures!
Glands: 0/10
🦬
Choisis ton animal totem pour recevoir sa force!
Esprits: 0
🖊️
Mots ecrits: 0
🌊
Clique pour faire surgir les vagues!
Vagues: 0
🏚️
Clique sur un personnage pour entendre son histoire!
Histoires: 0
🦣
Grimpe les sommets avec le yeti!
Sommets: 0/7
🐪
Traverse les dunes pour atteindre l’oasis!
Dunes: 0/6
🔮
Active le prisme pour voir l’arc-en-ciel!
Couleurs: 0/7
🥚
Chauffe l’oeuf de dragon pour le faire eclore!
Chaleur: 0/7
🚢
Plonge et explore les fonds marins!
Zones: 0/6
Voyage dans le temps avec ta machine magique!
Epoques: 0/6
🏰
Construis ton chateau pierre par pierre!
Pierres: 0/7
🗺️
Cartographie le ciel nocturne!
Points: 0/12
🛸
Grave les runes sur le drakkar viking!
Runes: 0/6
🥚
Le phoenix attend de renaitre de ses cendres!
Flammes: 0/7
🧭
Oriente-toi avec la boussole de navigation!
Directions: 0/8
Retourne le sablier et observe le temps passer!
Grains: 0/8

🔮 La Mosaïque des Étoiles

Clique pour révéler la mosaïque !
0 / 9 tuiles illuminées

🌺 L’Oracle des Pétales

🌸
Effeuille la fleur pour connaître ton destin...
8 pétales restants

🌊 Les Marées de la Lune

🌑
La mer attend l’appel de la lune...
Marée 0 / 6

🌿 L’Acacia des Histoires

🌱
Chaque clic plante une feuille de ta saga...
0 / 9 feuilles

🌿 La Fougère des Récits

🌱
La fougère attend de raconter son histoire...
0 / 7 frondes déroulées

🌳 Le Bois Sacré

🧚
Les arbres anciens attendent d’être appelés...
0 / 7 arbres éveillés

🌊 Le Lagon Mystérieux

Le lagon cache des couleurs secrètes...
0 / 9 sources révélées

❄️ La Dérive des Flocons

Le ciel attend de s’habiller de blanc...
0 chutes de neige

🔮 Le Prisme de Lumière

🔮
La lumière blanche cache un arc-en-ciel...
0 / 7 rayons

🧊 Le Glacier des Secrets

🏔️
Sous la glace se cachent des merveilles...
0 / 6 couches

☄️ La Comète Voyageuse

🌑
Une comète traverse la nuit étoilée...
0 / 7 segments

🐙 La Pieuvre Artiste

🌑
La pieuvre prépare son encre magique...
0 / 8 jets d’encre

🦆 L’Ornithorynque Mystérieux

L’animal le plus mystérieux du monde attend...
0 / 8 secrets

🦥 Le Paresseux Zen

😴
Prends ton temps... rien ne presse.
0 / 7 mouvements

🐾 Le Pangolin Blindé

🌙
Le pangolin se cache sous ses écailles...
0 / 8 écailles

🌊 Le Lamantin Paisible

🌊
Le lamantin broute l’herbe de mer...
0 / 8 touffes
🐋
🦃
👁️
🦄
🐠
🐡
🐍
🐾
🐸
🐡
🐠

🎈 Le Blobfish

🐟
0/6 blobs dégoulinants

🐍 Le Poisson-Vipère

🐟
0/6 dents montrées

💡 Le Poisson-Lanterne

🐟
0/6 lanternes allumées

🦷 Le Poisson-Croc

🐟
0/6 dents plantées

🌈 Le Poisson-Dragon

🐠
0/6 couleurs allumées

🏈 Le Footballfish

🐟
0/6 leurres allumés

😤 Le Poisson-Frange

🐟
0/6 épines déployées
🐠
🦈
🐍
🐳
🎸
🐠
🐘
🐟
🐚

🦪 Huître purificatrice

🦪

La Baleine 🎵 🐋

🐋
Clique pour découvrir la baleine !
0 chant

La Pieuvre Génie 🐙

🐙
Clique pour découvrir la pieuvre !
0 camouflage

La Sauterelle Acrobate 🦗

🦗
Clique pour découvrir la sauterelle !
0 saut

Le Cerf Élégant 🦌

🦌
Clique pour découvrir le cerf !
0 saut

Le Lion Roi 🦁

🦁
Clique pour découvrir le lion !
0 rugissement

Le Dodo Disparu 🦤

🦤
Clique pour découvrir le dodo !
0 hochement

Le Yak de l’Himalaya 🦬

🦬
Clique pour découvrir le yak !
0 ruade

Le Triton Régénérateur 🦎

🦎
Clique pour découvrir le triton !
0 frisson

Le Cobra Royal 🐍

🐍
Clique pour découvrir le cobra !
0 capuche

Le Blaireau Terrassier 🦡

🦡
Clique pour découvrir le blaireau !
0 galerie

Le Calao au Grand Bec 🐦

🐦
Clique pour découvrir le calao !
0 bouchée

L Émeu Géant 🦃

🦃
Clique pour découvrir l émeu !
0 foulée

L Ibis Sacré 🦢

🦢
Clique pour découvrir l ibis !
0 fouille

Le Rouge-Gorge Observateur 🐦

🐦
Clique pour découvrir le rouge-gorge !
0 note

L Hirondelle Voyageuse 🐦

🐦
Clique pour découvrir l hirondelle !
0 migration

L Hirondelle de Fenêtre 🐦

🐦
Clique pour découvrir l hirondelle de fenêtre !
0 vol

L Épervier Chasseur 🦅

🦅
Clique pour découvrir l épervier !
0 piqué

Le Balbuzard Pêcheur 🦅

🦅
Clique pour découvrir le balbuzard !
0 plongeon

Le Tournepierre 🐦

🐦
Clique pour découvrir le tournepierre !
0 retournement

Le Combattant Varié 🐦

🐦
Clique pour découvrir le combattant varié !
0 parade

Le Bécasseau Minute 🐦

🐦
Clique pour découvrir le bécasseau minute !
0 pique

Le Grimpereau Spirale 🐦

🐦
Clique pour découvrir le grimpereau !
0 spirale

Le Tarin Acrobate 🐦

🐦
Clique pour découvrir le tarin !
0 acrobatie

Le Rougequeue Queue 🐦

🐦
Clique pour découvrir le rougequeue !
0 frisson

Le Pouillot Veloce 🐦

🐦
Clique pour découvrir le pouillot !
0 chiff

La Locustelle Insecte 🐦

🐦
Clique pour découvrir la locustelle !
0 bourdonnement

La Fauvette Mélodieuse 🐦

🐦
Clique pour découvrir la fauvette mélodieuse !
0 melodie

Le Grimpereau des Jardins 🐦

🐦
Clique pour découvrir le grimpereau !
0 spirale

Le Cincle Plongeur 🐦

🐦
Clique pour découvrir le cincle plongeur !
0 plongeon

Le Pinson du Nord 🐦

🐦
Clique pour découvrir le pinson du nord !
0 migration