✶ Une histoire pour Gabin ✶

Gabin et le voyage au pays des tracteurs chantants

Racontée rien que pour Gabin · 1 min 50

0:00/1 min 50

« Gabin, as-tu entendu ce bruit joyeux ce matin ? » chuchota la brise en caressant ses cheveux blonds.

Gabin, les yeux grands ouverts, écoute : un bourdonnement mélodieux résonne au loin, comme un tracteur qui s’éveille. Une odeur de foin coupé et de pain chaud flotte dans l’air.

Soudain, un petit tracteur rouge, tout luisant, apparaît au bout du chemin. « Monte, Gabin ! » semble-t-il murmurer. Le siège est moelleux, comme un nuage de coton.

Le tracteur s’élance, soulevant une poussière parfumée de terre humide. Gabin rit en sentant le vent frais sur son visage. Autour d’eux, les champs défilent, remplis de coquelicots et de blés qui dansent.

Voici la ferme merveilleuse : les vaches meuglent en rythme, les poules picorent des graines sucrées, et les moutons bêlent une berceuse. Gabin descend, ébahi, et tend la main vers une pomme juteuse pendue à un arbre.

Un chaton aux pattes de velours lui apporte une coupelle de lait crémeux. Gabin goûte : c’est le lait le plus onctueux qu’il ait jamais bu. Les odeurs de foin, de miel et de pain frais l’enveloppent comme une couverture.

« C’est l’heure de rentrer, Gabin », murmure le tracteur en démarrant doucement. Le soleil couchant peint le ciel de rose. Gabin s’installe, le cœur léger, et sent à nouveau le vent jouer avec ses cheveux.

De retour dans sa chambre, Gabin se blottit sous ses couettes. Le parfum de la ferme reste autour de lui, comme un doux souvenir. Ses paupières deviennent lourdes, lourdes...

Et tandis que le tracteur rouge s’endort aussi, quelque part dans ses rêves, Gabin ferme les yeux en souriant. Bonne nuit, petit Gabin.

✶ 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/fce4b47483bb.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