{
  "_comment": "The Dream Machine library, migrated from sparkletreestudio.com. Adding a book is a JSON edit only: the homepage renders its cards from this file. tier 'free' books carry the whole story; tier 'premium' books are KDP titles and carry only a short sneak peek plus an 'amazon' link. The premium preview pages are written from each book's published Amazon description; swap them for the real opening spreads of the KDP interiors when those are available. Any page may add a \"scene\" (an animated illustration: background, actors, effects and a timeline of cues, documented at the top of js/dm-stage.js) and/or a \"video\" clip (self-hosted, with optional \"poster\", \"videoLoop\" and \"videoDuration\"). Books with scenes get the Animated badge; pages without one get a gentle automatic scene built from their motif. Free story text is the studio's draft copy and can be replaced with final manuscripts without changing any field names. Covers are image stems: <cover>-400.webp and <cover>-800.webp must both exist; coverW/coverH are the 800px version's intrinsic size.",
  "books": [
    {
      "slug": "enchanted-adventures-poppy",
      "title": "Enchanted Adventures of Poppy",
      "author": "Eliza Dragonthorpe",
      "ages": "3-7",
      "kind": "Storybook",
      "tier": "free",
      "tags": ["free", "poppy"],
      "cover": "images/stories/enchanted-adventures-poppy",
      "coverW": 800,
      "coverH": 1422,
      "blurb": "Poppy the dragon wishes she could fly fast — and finds something better.",
      "pages": [
        { "motif": "🐲", "text": "Poppy the Dragon sat on the highest branch of the Sparkle Tree, watching the comets race across the sky. \"I wish I could fly as fast as that,\" she whispered.", "scene": {"bg": "night", "duration": 7, "fx": ["stars", "comets"], "actors": [{"id": "moon", "type": "moon", "x": 82, "y": 16, "size": 16, "anchor": "center", "enter": "fade"}, {"id": "tree", "type": "tree", "x": 50, "y": 104, "size": 95, "enter": "fade", "z": 1}, {"id": "poppy", "type": "poppy", "x": 50, "y": 47, "size": 30, "mood": "happy", "enter": "pop", "loop": "breathe", "z": 3}], "cues": [{"at": 2.2, "actor": "poppy", "mood": "surprised"}, {"at": 3.6, "actor": "poppy", "mood": "sad"}, {"at": 5.2, "actor": "poppy", "mood": "happy"}]} },
        { "motif": "🌌", "text": "A streak of gold burst overhead. Something small tumbled out of it and disappeared into the glowing leaves below with a soft, surprised *ping*.", "scene": {"bg": "night", "duration": 5.5, "fx": ["stars"], "actors": [{"id": "tree", "type": "tree", "x": 50, "y": 104, "size": 95, "enter": "fade", "z": 1}, {"id": "poppy", "type": "poppy", "x": 26, "y": 50, "size": 26, "mood": "happy", "enter": "none", "loop": "breathe", "z": 3}, {"id": "star", "type": "babystar", "x": 92, "y": -8, "size": 10, "anchor": "center", "enter": "none", "trail": true, "z": 4}], "cues": [{"at": 0.8, "actor": "star", "move": [56, 42], "path": [[76, 10]], "dur": 1.6, "sound": "whoosh"}, {"at": 1.0, "actor": "poppy", "mood": "surprised"}, {"at": 2.4, "fx": "sparkle", "x": 56, "y": 42, "sound": "twinkle"}, {"at": 2.4, "actor": "star", "hide": true}, {"at": 2.7, "actor": "poppy", "say": "Ping!", "dur": 1.4}, {"at": 3.8, "actor": "poppy", "mood": "nervous"}]} },
        { "motif": "🌳", "text": "Poppy climbed down through the branches, the little lights on her wings flickering. \"Hello?\" she chirped. \"Is anyone there?\"", "scene": {"bg": "canopy", "duration": 6, "fx": ["fireflies"], "actors": [{"id": "leaf1", "type": "emoji", "x": 10, "y": 16, "size": 14, "char": "🍃", "anchor": "center", "loop": "sway"}, {"id": "leaf2", "type": "emoji", "x": 88, "y": 72, "size": 14, "char": "🍃", "anchor": "center", "loop": "sway", "flip": true}, {"id": "poppy", "type": "poppy", "x": 60, "y": 30, "size": 32, "anchor": "center", "pose": "fly", "mood": "nervous", "enter": "fall", "z": 3}], "cues": [{"at": 0.6, "actor": "poppy", "move": [44, 66], "path": [[62, 48]], "dur": 2.4}, {"at": 1.2, "actor": "poppy", "say": "Hello?", "dur": 1.6}, {"at": 3.1, "actor": "poppy", "pose": "sit"}, {"at": 3.4, "actor": "poppy", "say": "Is anyone there?", "dur": 2.2}]} },
        { "motif": "⭐", "text": "There it sat: a tiny baby star, caught on a mossy twig, crying small golden tears that rolled away and turned into fireflies.", "scene": {"bg": "canopy", "duration": 5, "fx": ["fireflies", "sparkles"], "actors": [{"id": "twig", "type": "emoji", "x": 60, "y": 64, "size": 22, "char": "🌿", "anchor": "center", "loop": "sway"}, {"id": "star", "type": "babystar", "x": 60, "y": 50, "size": 24, "anchor": "center", "mood": "cry", "enter": "fade", "loop": "twinkle", "z": 3}, {"id": "poppy", "type": "poppy", "x": 22, "y": 96, "size": 34, "mood": "surprised", "enter": "fly-left", "loop": "breathe", "z": 4}], "cues": [{"at": 2.6, "actor": "poppy", "mood": "sad"}]} },
        { "motif": "🤝", "text": "\"Don't be scared,\" said Poppy. She held out her tail, very carefully. \"I'm not the fastest flyer. But I know the way to every corner of this sky.\"", "scene": {"bg": "canopy", "duration": 6.5, "fx": ["fireflies"], "actors": [{"id": "poppy", "type": "poppy", "x": 34, "y": 96, "size": 46, "mood": "happy", "enter": "fade", "loop": "breathe", "z": 3}, {"id": "star", "type": "babystar", "x": 74, "y": 48, "size": 18, "anchor": "center", "mood": "cry", "enter": "fade", "loop": "twinkle", "z": 4}], "cues": [{"at": 1.0, "actor": "poppy", "action": "nod"}, {"at": 2.6, "actor": "poppy", "action": "wave"}, {"at": 4.0, "actor": "star", "mood": "happy"}, {"at": 4.1, "fx": "hearts", "x": 74, "y": 40}, {"at": 5.0, "actor": "poppy", "mood": "joy"}]} },
        { "motif": "🪶", "text": "They flew together, slowly, past the cloud gardens and over the singing river. The little star held on tight and stopped crying somewhere near the top.", "scene": {"bg": "river", "duration": 6.5, "fx": ["sparkles"], "actors": [{"id": "cloud1", "type": "cloud", "x": 20, "y": 20, "size": 26, "anchor": "center", "loop": "float", "enter": "fade"}, {"id": "cloud2", "type": "cloud", "x": 82, "y": 30, "size": 22, "anchor": "center", "loop": "float", "enter": "fade"}, {"id": "poppy", "type": "poppy", "x": -12, "y": 62, "size": 30, "anchor": "center", "pose": "fly", "mood": "happy", "enter": "none", "trail": true, "z": 3}, {"id": "star", "type": "babystar", "x": -4, "y": 50, "size": 9, "anchor": "center", "mood": "cry", "enter": "none", "z": 4}], "cues": [{"at": 0.3, "actor": "poppy", "move": [62, 38], "path": [[30, 58]], "dur": 5}, {"at": 0.3, "actor": "star", "move": [70, 26], "path": [[38, 46]], "dur": 5}, {"at": 3.2, "actor": "star", "mood": "happy"}, {"at": 3.6, "actor": "poppy", "mood": "joy"}]} },
        { "motif": "🌠", "text": "At the very top, the constellations were waiting. They rang like bells when they saw their smallest one coming home.", "scene": {"bg": "sky", "duration": 5.5, "fx": ["stars"], "actors": [{"id": "c1", "type": "constellation", "x": 24, "y": 24, "size": 34, "anchor": "center", "enter": "fade"}, {"id": "c2", "type": "constellation", "x": 76, "y": 18, "size": 28, "anchor": "center", "enter": "fade", "flip": true}, {"id": "c3", "type": "constellation", "x": 62, "y": 48, "size": 24, "anchor": "center", "enter": "fade", "delay": 0.6}, {"id": "poppy", "type": "poppy", "x": 36, "y": 84, "size": 24, "anchor": "center", "pose": "fly", "mood": "happy", "enter": "rise", "z": 3}, {"id": "star", "type": "babystar", "x": 50, "y": 88, "size": 10, "anchor": "center", "mood": "happy", "enter": "rise", "trail": true, "z": 4}], "cues": [{"at": 0.6, "actor": "star", "move": [60, 40], "dur": 2.4}, {"at": 0.8, "actor": "poppy", "move": [38, 62], "dur": 2.4}, {"at": 3.1, "fx": "sparkle", "x": 60, "y": 40, "sound": "chime"}, {"at": 3.2, "actor": "poppy", "mood": "joy"}]} },
        { "motif": "✨", "text": "Poppy flew back down alone, and she was still not the fastest dragon in the sky. But she left a trail of stardust behind her, and she did not mind at all. The End.", "scene": {"bg": "night", "duration": 7, "fx": ["stars", "comets"], "actors": [{"id": "tree", "type": "tree", "x": 70, "y": 104, "size": 70, "enter": "fade", "z": 1}, {"id": "poppy", "type": "poppy", "x": 18, "y": 14, "size": 24, "anchor": "center", "pose": "fly", "mood": "happy", "enter": "fade", "trail": true, "z": 3}], "cues": [{"at": 0.3, "actor": "poppy", "move": [62, 46], "path": [[30, 36], [48, 28]], "dur": 4.6}, {"at": 5.0, "actor": "poppy", "pose": "sit"}, {"at": 5.1, "actor": "poppy", "mood": "joy"}, {"at": 5.6, "fx": "sparkle", "x": 62, "y": 34, "sound": "yay"}]} }
      ]
    },
    {
      "slug": "glowberry-moon-seed",
      "title": "Glowberry and the Moon Seed",
      "author": "Eliza Dragonthorpe",
      "ages": "4-8",
      "kind": "Storybook",
      "tier": "free",
      "tags": ["free", "new"],
      "cover": "images/stories/glowberry-moon-seed",
      "coverW": 800,
      "coverH": 1422,
      "blurb": "A tiny seed falls from the moon, and only Glowberry believes it can grow.",
      "pages": [
        { "motif": "🌙", "text": "High above the Sparkle Tree, the moon dropped something small and silver. It fell and fell, and landed in Glowberry's watering can." },
        { "motif": "🫐", "text": "Glowberry was the smallest creature in the whole forest. She had round eyes, soft blue fur, and a lantern-tail that hummed when she was happy." },
        { "motif": "🌱", "text": "\"It's a moon seed,\" she whispered. \"If I plant it, a piece of the sky will grow right here.\" The older animals laughed. Seeds from the sky did not grow, they said." },
        { "motif": "💧", "text": "But Glowberry planted it anyway. She watered it at dawn. She sang to it at dusk. She sat beside it when the rain came sideways and the wind was loud." },
        { "motif": "🌘", "text": "Seven nights passed and nothing happened. Glowberry's lantern-tail dimmed. \"Maybe they were right,\" she said, very quietly, to the empty patch of earth." },
        { "motif": "✨", "text": "On the eighth night, the ground began to glow. A shoot pushed up — pale and silver — and unfolded one small leaf shaped exactly like a crescent moon." },
        { "motif": "🌳", "text": "By morning it was taller than Glowberry. By evening it was taller than the oldest owl. Its leaves gave off a gentle light that made the whole forest silver." },
        { "motif": "🌟", "text": "The animals came from everywhere to sit beneath it. And Glowberry, the smallest creature in the forest, sat right in the middle, glowing brightest of all. The End." }
      ]
    },
    {
      "slug": "sparkle-tree-first-star",
      "title": "The Sparkle Tree and the First Star",
      "author": "Eliza Dragonthorpe",
      "ages": "4-8",
      "kind": "Storybook",
      "tier": "free",
      "tags": ["free", "new"],
      "cover": "images/stories/sparkle-tree-first-star",
      "coverW": 800,
      "coverH": 1422,
      "blurb": "How the Sparkle Tree got its light, long before anyone was watching.",
      "pages": [
        { "motif": "🌑", "text": "Long ago, before there were any stories, the sky was completely dark. Not frightening-dark. Just empty. Nothing had thought to put anything in it yet." },
        { "motif": "🌲", "text": "On the hill stood one small tree. It had no name, because there was nobody about to name it, and no light to see it by." },
        { "motif": "🫧", "text": "The tree grew one round fruit. It was heavy and warm, and it glowed very faintly, like something asleep and dreaming." },
        { "motif": "🦉", "text": "An owl came from far away to look. \"Keep it,\" she said. \"Hold it close. A light like that is precious.\" And she flew off into the dark." },
        { "motif": "💭", "text": "The tree thought about it for a long time. Holding it close would mean only the tree could see it. And the sky, it noticed, was still completely empty." },
        { "motif": "🍃", "text": "So the tree stretched up as tall as it could, opened its highest branch, and let go." },
        { "motif": "⭐", "text": "The light went up and up and did not come back down. It stopped near the top of everything and stayed there, burning steadily. The very first star." },
        { "motif": "✨", "text": "And where it had grown, the tree began to shine all over — every leaf, every root. That is why we call it the Sparkle Tree, and why it gives its light away every single night. The End." }
      ]
    },
    {
      "slug": "rainbow-bridge",
      "title": "The Rainbow Bridge",
      "author": "Eliza Dragonthorpe",
      "ages": "5-9",
      "kind": "Storybook",
      "tier": "free",
      "tags": ["free"],
      "cover": "images/stories/rainbow-bridge",
      "coverW": 800,
      "coverH": 1422,
      "blurb": "Two friends on opposite banks build something neither could build alone.",
      "pages": [
        { "motif": "🏞️", "text": "The river was too wide to swim and too loud to shout across. On one side lived Mira. On the other lived a girl she had never spoken to." },
        { "motif": "👋", "text": "They waved every morning. That was all they could do. Mira had waved across that river every morning for as long as she could remember." },
        { "motif": "🎨", "text": "One day Mira had an idea. She painted a long red stripe on a plank of wood and pushed it out into the water, pointing at the other bank." },
        { "motif": "🟠", "text": "The next morning the plank had come back — and beside the red stripe there was an orange one. Mira laughed out loud, alone, on her side of the river." },
        { "motif": "🟡", "text": "Yellow. Green. Blue. Back and forth the plank went, and every colour was a sentence neither of them could say." },
        { "motif": "🌉", "text": "By the time they reached violet, the plank was too heavy to float. So they each cut a new one. And another. And another after that." },
        { "motif": "🤝", "text": "It took the whole summer. When the last plank went down they met in the middle, and the first thing either of them said was, \"Hello. I'm Mira.\"" },
        { "motif": "🌈", "text": "The bridge is still there. It is not the strongest bridge in the world. But you can see its colours from a very long way off. The End." }
      ]
    },
    {
      "slug": "brave-little-pixel",
      "title": "The Brave Little Pixel",
      "author": "Eliza Dragonthorpe",
      "ages": "4-8",
      "kind": "Storybook",
      "tier": "free",
      "tags": ["free", "new"],
      "cover": "images/stories/brave-little-pixel",
      "coverW": 800,
      "coverH": 1422,
      "blurb": "One square of light decides the picture is worth being wrong for.",
      "pages": [
        { "motif": "🟦", "text": "In a very large picture there lived a very small pixel. Her name was Pip, and her whole job was to be exactly one shade of blue." },
        { "motif": "🖼️", "text": "Pip was good at her job. Every pixel around her was blue too. Together they made a sky, though none of them had ever seen the whole thing." },
        { "motif": "👀", "text": "One day Pip noticed something. Down in the corner, where the sky met the hill, there was a gap. A little hole where no pixel was lit at all." },
        { "motif": "❓", "text": "\"That's not my part of the picture,\" said the pixel beside her. \"We are sky. The corner belongs to somebody else.\" But nobody came to fill it." },
        { "motif": "🚶", "text": "So Pip did something no pixel had ever done. She left her place in the sky and went down to the corner, all by herself." },
        { "motif": "😬", "text": "It was the wrong colour for a corner. A blue square sitting in a green hill looks like a mistake, and Pip knew everyone could see her." },
        { "motif": "🐦", "text": "But when the picture was viewed from far away — properly far, all at once — the blue square in the corner was not a mistake at all. It was a bird." },
        { "motif": "✨", "text": "Nobody ever knew it was Pip. She did not mind. She had seen the whole picture once, from the corner, and it was beautiful. The End." }
      ]
    },
    {
      "slug": "poppy-who-sneezed-glitter",
      "aliases": ["poppy-sneezed-glitter"],
      "title": "Poppy the Dragon Who Sneezed Glitter",
      "author": "Eliza Dragonthorpe",
      "ages": "3-7",
      "kind": "Picture Book",
      "tier": "premium",
      "tags": ["premium", "poppy"],
      "cover": "images/opt/sneezed-glitter",
      "coverW": 800,
      "coverH": 994,
      "amazon": "https://www.amazon.co.uk/dp/B0GTJM4K3J?tag=sparkletreest-21",
      "blurb": "Every sneeze blasts out a swirling storm of glitter. A joyful read-aloud about loving the parts of you that shine.",
      "pages": [
        { "motif": "🐉", "text": "Meet Poppy. She is a tiny dragon with one big problem.", "scene": {"bg": "day", "duration": 4, "fx": ["sparkles"], "actors": [{"id": "poppy", "type": "poppy", "x": 50, "y": 94, "size": 54, "mood": "happy", "enter": "pop", "loop": "breathe"}], "cues": [{"at": 1.0, "actor": "poppy", "action": "wave"}, {"at": 2.6, "actor": "poppy", "mood": "nervous"}]} },
        { "motif": "🤧", "text": "Every time she sneezes — AH-CHOO! — out blasts a swirling storm of glitter.", "scene": {"bg": "day", "duration": 5, "fx": ["sparkles"], "actors": [{"id": "poppy", "type": "poppy", "x": 46, "y": 94, "size": 54, "mood": "surprised", "enter": "fade", "loop": "breathe"}], "cues": [{"at": 0.5, "actor": "poppy", "say": "Ah… ah…", "dur": 1.3}, {"at": 1.2, "actor": "poppy", "action": "sneeze"}, {"at": 1.8, "actor": "poppy", "say": "CHOO!", "dur": 1.2}, {"at": 1.8, "fx": "glitter", "x": 52, "y": 44}, {"at": 2.0, "fx": "glitter", "x": 38, "y": 36}, {"at": 2.7, "actor": "poppy", "mood": "nervous"}, {"at": 3.8, "actor": "poppy", "mood": "joy"}]} },
        { "motif": "💭", "text": "What do you do when the thing that makes you different is the thing you most want to hide? Poppy is about to find out.", "scene": {"bg": "dusk", "duration": 4, "fx": ["sparkles"], "actors": [{"id": "poppy", "type": "poppy", "x": 44, "y": 94, "size": 46, "mood": "sad", "enter": "fade", "loop": "breathe"}, {"id": "think", "type": "emoji", "x": 74, "y": 28, "size": 18, "char": "💭", "anchor": "center", "enter": "pop", "loop": "float", "delay": 1}], "cues": [{"at": 2.8, "actor": "poppy", "mood": "nervous"}]} },
        { "motif": "✨", "cta": true, "text": "Want to see what happens next? The whole story — with every glittery illustration — is waiting in the book.", "scene": {"bg": "day", "duration": 3, "fx": ["sparkles"], "actors": [{"id": "poppy", "type": "poppy", "x": 50, "y": 94, "size": 50, "mood": "excited", "enter": "pop", "loop": "breathe"}], "cues": [{"at": 0.8, "fx": "glitter", "x": 50, "y": 40}, {"at": 1.0, "actor": "poppy", "action": "wave"}, {"at": 2.0, "fx": "glitter", "x": 30, "y": 30}]} }
      ]
    },
    {
      "slug": "colours-of-the-rainbow",
      "title": "Poppy the Dragon: Colours of the Rainbow",
      "author": "Eliza Dragonthorpe",
      "ages": "0-3",
      "kind": "Board Book",
      "tier": "premium",
      "tags": ["premium", "poppy", "early"],
      "cover": "images/opt/colours-of-rainbow",
      "coverW": 800,
      "coverH": 800,
      "amazon": "https://www.amazon.co.uk/dp/B0GTXCC77X?tag=sparkletreest-21",
      "blurb": "A bright, magical journey through the colours of the rainbow for babies and toddlers.",
      "pages": [
        { "motif": "🌈", "text": "Poppy the Dragon is off on a bright and magical journey — right through the colours of the rainbow!", "scene": {"bg": "day", "duration": 4, "fx": ["sparkles"], "actors": [{"id": "rainbow", "type": "rainbow", "x": 50, "y": 76, "size": 90, "enter": "none"}, {"id": "poppy", "type": "poppy", "x": 50, "y": 30, "size": 26, "anchor": "center", "pose": "fly", "mood": "joy", "enter": "fly-left", "z": 3}], "cues": []} },
        { "motif": "🔴", "text": "Red, orange, yellow, green, blue, indigo and violet. Can you spot each colour as Poppy flies by?", "scene": {"bg": "day", "duration": 5, "fx": ["sparkles"], "actors": [{"id": "rainbow", "type": "rainbow", "x": 50, "y": 70, "size": 84, "enter": "none"}, {"id": "poppy", "type": "poppy", "x": 8, "y": 52, "size": 22, "anchor": "center", "pose": "fly", "mood": "happy", "enter": "fade", "trail": true, "z": 3}], "cues": [{"at": 0.4, "actor": "poppy", "move": [92, 44], "path": [[50, 20]], "dur": 4}, {"at": 2.4, "actor": "poppy", "mood": "joy"}]} },
        { "motif": "✨", "cta": true, "text": "Soft, gentle pictures made for little hands and first words. Find the whole rainbow in the book.", "scene": {"bg": "day", "duration": 3, "fx": ["sparkles"], "actors": [{"id": "rainbow", "type": "rainbow", "x": 62, "y": 62, "size": 70, "enter": "none"}, {"id": "poppy", "type": "poppy", "x": 36, "y": 94, "size": 44, "mood": "excited", "enter": "pop", "loop": "breathe", "z": 3}], "cues": [{"at": 1.0, "fx": "glitter", "x": 60, "y": 40}, {"at": 1.2, "actor": "poppy", "action": "wave"}]} }
      ]
    },
    {
      "slug": "count-to-10",
      "title": "Poppy the Dragon: Count to 10",
      "author": "Eliza Dragonthorpe",
      "ages": "0-3",
      "kind": "Board Book",
      "tier": "premium",
      "tags": ["premium", "poppy", "early"],
      "cover": "images/opt/count-to-10",
      "coverW": 800,
      "coverH": 800,
      "amazon": "https://www.amazon.co.uk/dp/B0GTSCWMJ7?tag=sparkletreest-21",
      "blurb": "A delightful counting journey from 1 to 10 with simple, rhythmic text.",
      "pages": [
        { "motif": "1️⃣", "text": "Poppy, the little pixie dragon, is ready to count. Are you ready too?" },
        { "motif": "🔢", "text": "Every page brings a brand-new number, with simple, rhythmic words that are fun to say out loud." },
        { "motif": "✨", "cta": true, "text": "Count all the way from 1 to 10 with Poppy in the book." }
      ]
    },
    {
      "slug": "count-along-with-poppy",
      "title": "Poppy the Dragon: Count along with Poppy",
      "author": "Eliza Dragonthorpe",
      "ages": "0-3",
      "kind": "Board Book",
      "tier": "premium",
      "tags": ["premium", "poppy", "early", "new"],
      "cover": "images/opt/count-with-poppy",
      "coverW": 800,
      "coverH": 800,
      "amazon": "https://www.amazon.co.uk/dp/B0GXGTNPNH?tag=sparkletreest-21",
      "blurb": "A magical counting adventure that ends with a peaceful bedtime.",
      "pages": [
        { "motif": "🐲", "text": "Poppy the friendly green dragon has things to count — lots of them!" },
        { "motif": "🧺", "text": "Fun, everyday things to count from 1 to 10, painted in soft watercolours." },
        { "motif": "🌙", "cta": true, "text": "And when the counting is done, it's time for a peaceful bedtime. Snuggle up with the whole book." }
      ]
    }
  ]
}
