✶ Une histoire pour Marius ✶

Marius et le Jardin des Dinosaures Lumineux

Racontée rien que pour Marius · 4 min 13

0:00/4 min 13

BOUM ! Un bruit sourd fit sursauter Marius dans son lit. Pas un bruit effrayant, non, plutôt comme un pas lourd, joyeux, qui résonnait dans le jardin. Il se redressa, les yeux grands ouverts, et vit par la fenêtre une lueur rose et orange danser entre les arbres.

C’était le soleil qui se levait, mais aujourd’hui, il semblait porter une robe arc-en-ciel. Marius n’hésita pas une seconde. Il enfila ses petites baskets et sortit en pyjama, les pieds nus sur l’herbe encore fraîche. L’air sentait la terre et les fleurs, comme après une pluie d’été.

En approchant, il découvrit quelque chose d’extraordinaire : des empreintes de dinosaures brillaient sur le sol, comme tracées à la peinture argentée. Elles menaient vers la vieille cabane au fond du jardin, celle où il rangeait ses jouets. Mais ce matin, la porte était grande ouverte, et une lumière dorée en sortait.

Marius avança, le cœur battant un peu, mais surtout très excité. À l’intérieur, ce n’était plus une cabane, mais un jardin immense, rempli de plantes hautes aux feuilles violettes et de fleurs qui changeaient de couleur en le voyant passer. Et là, au milieu de tout cela, un petit dinosaure à plumes bleues le fixait avec des yeux ronds comme des boutons.

— Bonjour, Marius ! dit le dinosaure d’une voix chantante. Je m’appelle Luminos. Tu veux voir quelque chose de magique ? Marius hocha la tête, trop émerveillé pour parler. Luminos lui montra alors un chemin de pierres qui brillait comme des étoiles. Au bout, un volcan miniature, haut comme lui, fumait doucement, et sur ses pentes, des dinosaures de toutes tailles jouaient et riaient.

— Ce sont les gardiens du volcan, expliqua Luminos. Ils veillent sur la lumière qui dort en lui. Mais aujourd’hui, ils ont besoin de toi. Le volcan a peur de briller trop fort, et il a besoin de courage pour se montrer tel qu’il est. Marius écouta, un peu surpris. Un volcan qui avait peur ?

— Moi, je peux l’aider ! s’exclama-t-il. J’aime les volcans, et je sais qu’ils sont formidables. Luminos sourit, et ensemble, ils grimpèrent les pentes douces du volcan. Les dinosaures les regardaient avec admiration, et Marius se sentit grand, fort, prêt à tout. Devant la bouche fumante, il prit une profonde inspiration.

— Volcan, tu es magnifique ! dit-il d’une voix claire. Tes couleurs sont comme un feu d’artifice, et ta lumière éclaire tout ce qui t’entoure. Tu n’as pas à avoir peur, nous sommes là pour toi. Aussitôt, le volcan émit un doux murmure, comme un ronronnement satisfait. Une lueur chaude et apaisante en jaillit, et les dinosaures se mirent à danser autour.

Marius rit de bonheur. Il avait aidé le volcan à trouver son courage, et maintenant, tout le jardin brillait de mille feux. Les couleurs dansaient, les dinosaures chantaient, et même le vent semblait plus léger. Luminos lui offrit une plume bleue de sa queue en signe d’amitié. — Tu es très courageux, Marius, murmura-t-il.

Le soleil était désormais haut dans le ciel, et Marius sentit que son aventure touchait à sa fin. Il remercia Luminos et ses nouveaux amis, puis suivit le chemin des empreintes argentées qui le ramena à sa cabane. Quand il en sortit, il était de retour dans son jardin, comme si rien ne s’était passé… sauf la plume bleue qu’il serrait dans sa main.

Il rentra dans la maison, le sourire aux lèvres. Dans la cuisine, sa maman préparait le petit-déjeuner. — Tu as bien dormi, mon champion ? demanda-t-elle. Marius hocha la tête, les yeux brillants. Il ne dit rien de son aventure, mais il savait, au fond de lui, qu’il avait appris quelque chose d’important ce matin : le courage, c’est comme une petite flamme, il grandit quand on l’utilise.

Ce soir-là, en se couchant, Marius posa la plume bleue sur sa table de chevet. Les lumières de sa chambre semblaient plus douces, et les ombres, moins effrayantes. Il ferma les yeux, entendant encore le rire des dinosaures et le murmure du volcan. Ses paupières devinrent lourdes, lourdes… et il s’endormit, le sourire aux lèvres, prêt à rêver à de nouvelles aventures.

✶ 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/41aed44ad37b.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