✶ Une histoire pour Rose ✶

Rose et le Ballet des Étoiles Parfumées

Racontée rien que pour Rose · 3 min 56

0:00/3 min 56

Rose, as-tu déjà senti l’odeur de la journée qui se réveille ? Ce matin-là, le soleil effleurait à peine les rideaux de ta chambre, et une brise légère apportait le parfum des fleurs du jardin. Mistigri, blotti contre toi, ronronnait comme un petit moteur endormi.

Tu t’es étirée, et soudain, une idée délicieuse t’a frôlée : et si aujourd’hui, tu dansais avec le vent ? Tu as enfilé ta robe de danse préférée, celle qui tourbillonne comme une feuille d’automne, et tu es sortie pieds nus sur l’herbe humide.

L’air sentait le miel et la terre mouillée, et chaque pas te faisait sourire. Mistigri, curieux, a trottiné derrière toi, la queue haute. Tu as commencé par un petit pas chassé, puis un tour sur toi-même… et là, quelque chose de magique est arrivé.

Le jardin s’est mis à briller. Des pétales de roses, aussi fragiles que des biscuits à la vanille, se sont détachés des buissons et ont dansé autour de toi. Une mélodie douce, comme un chant de mère, s’est élevée dans l’air. Tu as reconnu cette musique : c’était celle que tu entends parfois en rêve, quand tu imagines voler.

Mistigri a miaulé joyeusement et s’est mis à bondir entre les pétales, comme s’il connaît le pas de la valse. Tu as ri, et ton rire a fait naître des bulles de lumière qui claquaient comme des cerises croquées sous la dent. « Aujourd’hui, tout est possible ! » as-tu murmuré.

Soudain, une petite porte en bois de santal est apparue entre deux arbres. Elle sentait le pain chaud et la cannelle. Sans hésiter, tu as poussé le battant, et te voilà transportée dans une clairière où des lucioles, aussi vives que des paillettes, traçaient des chemins dans le ciel.

Au centre, une scène était dressée, recouverte de pétales de pavot. Des enfants, vêtus de tuniques aux couleurs de l’arc-en-ciel, t’attendaient en souriant. « Nous t’attendions, Rose ! » a dit une petite fille aux cheveux de lin. « Veux-tu danser avec nous le Ballet des Étoiles Parfumées ? »

Tu as hoché la tête, le cœur battant comme un tambourin. La musique a commencé, et tu as sentit tes pieds se soulever, comme portés par une brise sucrée. Mistigri, toujours près de toi, a bondi sur ton épaule et t’a whispered à l’oreille un « miaou » encourageant.

Les autres enfants ont formé un cercle autour de toi, et leurs pas dessinaient des motifs dans l’air, comme des rubans de caramel. L’odeur des fleurs de tilleul enveloppait la clairière, et chaque mouvement te faisait découvrir un nouveau parfum : la lavande, le muguet, puis le chèvrefeuille.

Au milieu de la danse, tu as aperçu un miroir d’eau posés sur un piédestal. Il reflétait non pas ton visage, mais une version de toi, plus grande, plus assurée, qui dansait avec grâce devant toute une classe d’enfants émerveillés. « C’est toi, Rose, dans quelques années, a chuchoté une voix. Tu vois comme tu oses ? »

Ton cœur s’est gonflé de joie. Tu as compris que cette danse magique était un cadeau, une promesse. Peu importe les hésitations du présent, un jour, tu danseras avec la même assurance devant tes camarades, devant le monde.

La musique a ralenti, et les lucioles ont commencé à s’éteindre doucement, comme des bougies qu’on souffle une à une. La clairière s’est fanée, et tu t’es retrouvée de nouveau dans ton jardin, Mistigri toujours sur ton épaule.

Le soleil était haut dans le ciel, et l’odeur du déjeuner montait de la cuisine. Tu as fait un dernier tour sur toi-même, et Mistigri a bondi par terre en ronronnant. « À ce soir, pour une nouvelle aventure », as-tu murmuré en le caressant.

Et puis, tu as sentis tes paupières devenir lourdes, comme si la magie de la danse t’avait enveloppée d’une douce torpeur. Tu es rentrée dans la maison, et en te glissant sous ta couette, tu as souri en repensant à la clairière, aux lucioles, et à cette Rose du futur qui dansait sans peur.

Mistigri s’est lové contre tes pieds, et son ronronnement a bercé tes pensées. « Bonne nuit, petite danseuse », a semblé dire le vent en caressant ta fenêtre. Et toi, Rose, tu t’es endormie, le cœur léger et les rêves pleins d’étoiles parfumées.

✶ 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/5f3a4e2f4f63.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