🎬 Title The Happy Animal Adventure | 15 Minutes of Fun Nursery Rhymes for Kids Target Age: 2–5 years Animation Style: Bright 3D cartoon Big expressive eyes Rainbow colors Smooth animation Cute animals Happy facial expressions Gentle camera movement INTRO (0:00–0:30) Scene 1 (0:00–0:05) Rainbow appears in the sky. Text: "Welcome Little Friends!" Scene 2 (0:05–0:10) Happy Sun smiles. Clouds wave. Birds fly. Scene 3 (0:10–0:15) Your channel logo appears. Sparkles everywhere. Scene 4 (0:15–0:30) Five kids run into the playground. All wave toward the audience. Music begins. RHYME 1 – Animal Parade (0:30–3:00) Scene 5 Lion dancing. "Roar Roar!" Scene 6 Elephant sprays water. Rainbow appears. Scene 7 Monkey swinging. Bananas fall. Scene 8 Bunny hopping. Flowers bloom. Scene 9 Bird flying. Butterflies follow. Scene 10 All animals dance together. Children clap. RHYME 2 – ABC Adventure (3:00–5:30) Scene 11 Letter A becomes an Apple. Scene 12 B becomes Ball. Scene 13 C becomes Cat. Continue until Z with fun animated transformations, showing one or two letters every 10–15 seconds. RHYME 3 – Numbers Song (5:30–8:00) Scene 14 One happy balloon. Scene 15 Two ducks. Scene 16 Three stars. Continue to Ten using colorful objects, counting with cheerful narration. RHYME 4 – Colors Song (8:00–10:30) Red apple Blue sky Green tree Yellow sun Purple butterfly Pink flowers Orange fish Rainbow ending Each color gets its own short animated sequence. RHYME 5 – Shapes Song (10:30–12:30) Circle Square Triangle Rectangle Heart Star Each shape transforms into familiar objects (e.g., circle β†’ ball, triangle β†’ mountain). GRAND FINALE (12:30–15:00) Scene 1 Animals return. Everyone sings together. Scene 2 Children dance. Confetti falls. Scene 3 Rainbow spins. Camera zooms out. Scene 4 Subscribe animation. Large colorful text: ⭐ Subscribe for More Rhymes! 🎨 Main Characters πŸ‘¦ Tommy (boy in blue) πŸ‘§ Lily (girl in pink) 🦁 Leo the Lion 🐘 Ellie the Elephant 🐡 Momo the Monkey 🐰 Bella the Bunny 🐦 Bluey the Bird β˜€οΈ Smiley Sun 🌈 Happy Rainbow 🎡 Background Music Tempo: 120–130 BPM Instruments: Ukulele, xylophone, bells, claps, whistles Children's choir singing the chorus Gentle sound effects (bird chirps, bubbles, laughter) πŸŽ₯ Viral Retention Tips Change scenes every 5–8 seconds. Use bright colors and exaggerated expressions. Add floating stars, bubbles, and sparkles. Include simple dance moves children can copy. Repeat catchy choruses to encourage singing along. End with a fun teaser: "See you in the next adventure!"

Asking for Preferences
Reading File
Reading File
Running Command

mkdir -p /tmp/workspace/happy-animal-adventure && ls -la /tmp/workspace/

Writing File

~/happy-animal-adventure/build_pptx.py

from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.util import Inches, Pt
import math

prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
blank_layout = prs.slide_layouts[6]

# ─────────────────────────────────────────────
# COLOR PALETTE
# ─────────────────────────────────────────────
C = {
    "sky_blue":    RGBColor(0x87, 0xCE, 0xEB),
    "deep_blue":   RGBColor(0x1A, 0x6A, 0xC8),
    "sunny_yellow":RGBColor(0xFF, 0xD7, 0x00),
    "warm_orange": RGBColor(0xFF, 0x85, 0x00),
    "grass_green": RGBColor(0x4C, 0xBB, 0x17),
    "dark_green":  RGBColor(0x22, 0x8B, 0x22),
    "hot_pink":    RGBColor(0xFF, 0x69, 0xB4),
    "light_pink":  RGBColor(0xFF, 0xB6, 0xC1),
    "purple":      RGBColor(0x9B, 0x59, 0xB6),
    "red":         RGBColor(0xE7, 0x4C, 0x3C),
    "white":       RGBColor(0xFF, 0xFF, 0xFF),
    "black":       RGBColor(0x1A, 0x1A, 0x1A),
    "gold":        RGBColor(0xFF, 0xC1, 0x07),
    "teal":        RGBColor(0x00, 0xBF, 0xBF),
    "coral":       RGBColor(0xFF, 0x6B, 0x6B),
    "lavender":    RGBColor(0xCC, 0xAA, 0xFF),
    "mint":        RGBColor(0x98, 0xFF, 0xD2),
    "rainbow1":    RGBColor(0xFF, 0x00, 0x00),
    "rainbow2":    RGBColor(0xFF, 0x7F, 0x00),
    "rainbow3":    RGBColor(0xFF, 0xFF, 0x00),
    "rainbow4":    RGBColor(0x00, 0xFF, 0x00),
    "rainbow5":    RGBColor(0x00, 0x00, 0xFF),
    "rainbow6":    RGBColor(0x8B, 0x00, 0xFF),
    "dark_navy":   RGBColor(0x0D, 0x1B, 0x4B),
    "light_blue":  RGBColor(0xAD, 0xD8, 0xE6),
}

# ─────────────────────────────────────────────
# HELPERS
# ─────────────────────────────────────────────
def add_bg(slide, color):
    bg = slide.shapes.add_shape(1, 0, 0, prs.slide_width, prs.slide_height)
    bg.fill.solid()
    bg.fill.fore_color.rgb = color
    bg.line.fill.background()
    return bg

def add_rect(slide, left, top, w, h, fill_color, line_color=None, radius=None):
    from pptx.util import Pt as Ptx
    shp = slide.shapes.add_shape(1, Inches(left), Inches(top), Inches(w), Inches(h))
    shp.fill.solid()
    shp.fill.fore_color.rgb = fill_color
    if line_color:
        shp.line.color.rgb = line_color
        shp.line.width = Pt(2)
    else:
        shp.line.fill.background()
    return shp

def add_rounded_rect(slide, left, top, w, h, fill_color, line_color=None):
    shp = slide.shapes.add_shape(5, Inches(left), Inches(top), Inches(w), Inches(h))
    shp.fill.solid()
    shp.fill.fore_color.rgb = fill_color
    if line_color:
        shp.line.color.rgb = line_color
        shp.line.width = Pt(2.5)
    else:
        shp.line.fill.background()
    return shp

def add_ellipse(slide, left, top, w, h, fill_color, line_color=None):
    shp = slide.shapes.add_shape(9, Inches(left), Inches(top), Inches(w), Inches(h))
    shp.fill.solid()
    shp.fill.fore_color.rgb = fill_color
    if line_color:
        shp.line.color.rgb = line_color
        shp.line.width = Pt(2)
    else:
        shp.line.fill.background()
    return shp

def add_star(slide, left, top, w, h, fill_color):
    shp = slide.shapes.add_shape(12, Inches(left), Inches(top), Inches(w), Inches(h))
    shp.fill.solid()
    shp.fill.fore_color.rgb = fill_color
    shp.line.fill.background()
    return shp

def add_text(slide, text, left, top, w, h,
             font_size=24, bold=False, color=None,
             align=PP_ALIGN.CENTER, font_name="Comic Sans MS",
             wrap=True, italic=False):
    if color is None:
        color = C["black"]
    tb = slide.shapes.add_textbox(Inches(left), Inches(top), Inches(w), Inches(h))
    tf = tb.text_frame
    tf.word_wrap = wrap
    tf.vertical_anchor = MSO_ANCHOR.MIDDLE
    tf.margin_left = Pt(4)
    tf.margin_right = Pt(4)
    tf.margin_top = Pt(2)
    tf.margin_bottom = Pt(2)
    p = tf.paragraphs[0]
    p.alignment = align
    run = p.add_run()
    run.text = text
    run.font.name = font_name
    run.font.size = Pt(font_size)
    run.font.bold = bold
    run.font.italic = italic
    run.font.color.rgb = color
    return tb

def add_badge(slide, text, left, top, w, h, bg_color, text_color, font_size=13):
    add_rounded_rect(slide, left, top, w, h, bg_color)
    add_text(slide, text, left, top, w, h, font_size=font_size, bold=True,
             color=text_color, align=PP_ALIGN.CENTER)

def add_header_bar(slide, title, subtitle, bg_color, title_color, sub_color):
    add_rect(slide, 0, 0, 13.333, 1.5, bg_color)
    add_text(slide, title, 0.3, 0.05, 12.7, 0.85,
             font_size=36, bold=True, color=title_color)
    add_text(slide, subtitle, 0.3, 0.85, 12.7, 0.6,
             font_size=18, bold=False, color=sub_color, italic=True)

def add_scene_card(slide, scene_num, timestamp, scene_desc, x, y, w=3.8, h=1.9,
                   card_color=None, text_color=None, accent=None):
    if card_color is None: card_color = C["white"]
    if text_color is None: text_color = C["dark_navy"]
    if accent is None: accent = C["deep_blue"]
    # card shadow
    add_rounded_rect(slide, x+0.07, y+0.07, w, h, RGBColor(0xCC,0xCC,0xCC))
    # main card
    add_rounded_rect(slide, x, y, w, h, card_color, accent)
    # accent top strip
    add_rect(slide, x, y, w, 0.32, accent)
    # scene number pill
    add_ellipse(slide, x+0.1, y+0.04, 0.7, 0.25, C["gold"])
    add_text(slide, f"Scene {scene_num}", x+0.05, y+0.03, 0.9, 0.25,
             font_size=10, bold=True, color=C["dark_navy"])
    # timestamp
    add_text(slide, timestamp, x+2.8, y+0.03, 1.0, 0.25,
             font_size=10, bold=False, color=C["white"], align=PP_ALIGN.RIGHT)
    # description
    add_text(slide, scene_desc, x+0.15, y+0.38, w-0.3, h-0.5,
             font_size=13, bold=False, color=text_color,
             align=PP_ALIGN.LEFT, wrap=True)

def add_divider(slide, y, color):
    add_rect(slide, 0.4, y, 12.5, 0.04, color)

def add_emoji_box(slide, emoji, label, x, y, size=1.1, bg=None):
    if bg is None: bg = C["light_blue"]
    add_ellipse(slide, x, y, size, size, bg)
    add_text(slide, emoji, x, y-0.05, size, size*0.55, font_size=28, bold=False,
             color=C["black"], align=PP_ALIGN.CENTER)
    add_text(slide, label, x-0.1, y+size*0.55, size+0.2, 0.4, font_size=12,
             bold=True, color=C["dark_navy"], align=PP_ALIGN.CENTER)

def rainbow_stripe(slide, y, stripe_h=0.18):
    colors = [C["rainbow1"],C["rainbow2"],C["rainbow3"],C["rainbow4"],C["rainbow5"],C["rainbow6"]]
    w = 13.333 / len(colors)
    for i, col in enumerate(colors):
        add_rect(slide, i*w, y, w+0.02, stripe_h, col)

# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 1 β€” TITLE / COVER
# ─────────────────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, C["sky_blue"])

# rainbow stripes at top
rainbow_stripe(slide, 0, 0.22)
rainbow_stripe(slide, 7.28, 0.22)

# sun circle top-right
add_ellipse(slide, 11.2, 0.4, 1.8, 1.8, C["sunny_yellow"])
add_text(slide, "β˜€οΈ", 11.2, 0.4, 1.8, 1.8, font_size=60, bold=False, color=C["warm_orange"])

# title box
add_rounded_rect(slide, 0.8, 1.1, 11.6, 2.4, RGBColor(0xFF,0xFF,0xAA), C["warm_orange"])
add_text(slide, "🎬 The Happy Animal Adventure", 0.9, 1.15, 11.4, 1.3,
         font_size=40, bold=True, color=C["warm_orange"])
add_text(slide, "15 Minutes of Fun Nursery Rhymes for Kids",
         0.9, 2.35, 11.4, 0.9, font_size=22, bold=False, color=C["deep_blue"])

# sub info strip
add_rounded_rect(slide, 1.5, 3.6, 10.3, 0.75, C["deep_blue"])
add_text(slide, "🎯  Target Age: 2–5 Years   |   🎨  Bright 3D Cartoon Animation   |   ⏱  Total Runtime: 15 Minutes",
         1.5, 3.6, 10.3, 0.75, font_size=16, bold=True, color=C["white"])

# character emoji row
chars = [("🦁","Leo"),("🐘","Ellie"),("🐡","Momo"),("🐰","Bella"),("🐦","Bluey"),
         ("πŸ‘¦","Tommy"),("πŸ‘§","Lily"),("β˜€οΈ","Sun"),("🌈","Rainbow")]
x_start = 0.6
for i, (em, nm) in enumerate(chars):
    add_emoji_box(slide, em, nm, x_start + i*1.36, 4.55, size=0.9,
                  bg=C["sunny_yellow"] if i % 2 == 0 else C["hot_pink"])

# music & style tags
add_rounded_rect(slide, 0.5, 5.7, 5.8, 1.2, C["purple"])
add_text(slide, "🎡 Music: 120–130 BPM | Ukulele, Xylophone, Bells\nChildren's Choir | Bird Chirps & Laughter",
         0.6, 5.7, 5.6, 1.2, font_size=14, bold=False, color=C["white"])

add_rounded_rect(slide, 7.0, 5.7, 5.8, 1.2, C["grass_green"])
add_text(slide, "🎨 Animation: Big Eyes · Rainbow Colors\nSmooth 3D Cartoon · Happy Expressions",
         7.1, 5.7, 5.6, 1.2, font_size=14, bold=False, color=C["white"])

# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 2 β€” TABLE OF CONTENTS
# ─────────────────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xF0, 0xF8, 0xFF))
rainbow_stripe(slide, 0, 0.18)

add_header_bar(slide, "πŸ“‹  Storyboard Overview", "15-Minute Structure at a Glance",
               C["deep_blue"], C["gold"], C["light_blue"])

sections = [
    ("🌈  INTRO",             "0:00–0:30",  "Rainbow Β· Sun Β· Channel Logo Β· Kids in Playground",        C["teal"],       C["white"]),
    ("🦁  RHYME 1 – Animal Parade",  "0:30–3:00",  "Lion Β· Elephant Β· Monkey Β· Bunny Β· Bird Β· All Dance",      C["grass_green"],C["white"]),
    ("πŸ”€  RHYME 2 – ABC Adventure",  "3:00–5:30",  "Aβ†’Apple … Z with animated letter transformations",         C["deep_blue"],  C["white"]),
    ("πŸ”’  RHYME 3 – Numbers Song",   "5:30–8:00",  "1 Balloon β†’ 10 Stars, counting with colorful objects",     C["purple"],     C["white"]),
    ("🎨  RHYME 4 – Colors Song",    "8:00–10:30", "Red Β· Blue Β· Green Β· Yellow Β· Purple Β· Pink Β· Rainbow",    C["warm_orange"],C["white"]),
    ("πŸ”·  RHYME 5 – Shapes Song",    "10:30–12:30","Circleβ†’Ball Β· Square Β· Triangleβ†’Mountain Β· Heart Β· Star",  C["hot_pink"],   C["white"]),
    ("πŸŽ‰  GRAND FINALE",      "12:30–15:00","All Characters Β· Confetti Β· Rainbow Spin Β· Subscribe CTA",  C["coral"],      C["white"]),
]

for i, (title, ts, desc, bg, fg) in enumerate(sections):
    y = 1.6 + i * 0.75
    add_rounded_rect(slide, 0.5, y, 12.3, 0.66, bg)
    add_text(slide, title, 0.65, y, 3.5, 0.66, font_size=16, bold=True, color=fg)
    add_text(slide, ts, 4.1, y, 1.6, 0.66, font_size=14, bold=True, color=C["gold"])
    add_text(slide, desc, 5.8, y, 6.8, 0.66, font_size=13, bold=False, color=fg,
             align=PP_ALIGN.LEFT)

# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 3 β€” INTRO STORYBOARD (0:00–0:30)
# ─────────────────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xE8, 0xF4, 0xFF))
rainbow_stripe(slide, 0, 0.18)

add_header_bar(slide, "🌈  INTRO", "Timestamp: 0:00 – 0:30",
               C["teal"], C["white"], C["mint"])

scenes_intro = [
    ("1", "0:00–0:05", "🌈 Rainbow appears in the sky.\n\"Welcome Little Friends!\" text floats in with sparkles.", 0.4, 1.7),
    ("2", "0:05–0:10", "β˜€οΈ Happy Sun smiles warmly.\nClouds wave side-to-side.\nBirds fly across the screen.", 6.8, 1.7),
    ("3", "0:10–0:15", "🌟 Channel logo appears center screen.\nSparkles burst all around.\nJingle sound effect.", 0.4, 4.05),
    ("4", "0:15–0:30", "πŸ‘¦πŸ‘§ Five kids run into the playground.\nAll wave toward the audience.\n🎡 Background music begins!", 6.8, 4.05),
]
for (sn, ts, desc, x, y) in scenes_intro:
    add_scene_card(slide, sn, ts, desc, x, y, w=6.0, h=2.05,
                   card_color=C["white"], text_color=C["dark_navy"], accent=C["teal"])

# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 4 β€” RHYME 1: ANIMAL PARADE (0:30–3:00)
# ─────────────────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xF0, 0xFF, 0xF0))
add_rect(slide, 0, 0, 13.333, 0.18, C["grass_green"])

add_header_bar(slide, "🦁  RHYME 1 – Animal Parade", "Timestamp: 0:30 – 3:00",
               C["grass_green"], C["white"], C["mint"])

scenes_r1 = [
    ("5","0:30–1:00","🦁 Leo the Lion dances!\n\"Roar Roar!\" speech bubble appears.\nMane bounces with the beat."),
    ("6","1:00–1:30","🐘 Ellie the Elephant sprays water.\nRainbow forms in the mist.\nCrowd cheers!"),
    ("7","1:30–2:00","🐡 Momo swings on a vine.\nBananas fall and bounce.\nComical wobble animation."),
    ("8","2:00–2:30","🐰 Bella the Bunny hops along.\nColorful flowers bloom with each hop.\nBell sound effects."),
    ("9","2:30–2:45","🐦 Bluey the Bird soars high.\nButterflies trail behind.\nWhistling melody plays."),
    ("10","2:45–3:00","πŸŽ‰ ALL animals dance together!\nChildren clap along.\nConfetti burst β€” chorus repeats!"),
]
cols = 3
for i, (sn, ts, desc) in enumerate(scenes_r1):
    col = i % cols
    row = i // cols
    x = 0.4 + col * 4.3
    y = 1.7 + row * 2.4
    add_scene_card(slide, sn, ts, desc, x, y, w=4.0, h=2.1,
                   card_color=RGBColor(0xFF,0xFF,0xEE), text_color=C["dark_navy"], accent=C["grass_green"])

# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 5 β€” RHYME 2: ABC ADVENTURE (3:00–5:30)
# ─────────────────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xEE, 0xEE, 0xFF))
add_rect(slide, 0, 0, 13.333, 0.18, C["deep_blue"])

add_header_bar(slide, "πŸ”€  RHYME 2 – ABC Adventure", "Timestamp: 3:00 – 5:30  |  Scene 11",
               C["deep_blue"], C["white"], C["lavender"])

# Intro description card
add_rounded_rect(slide, 0.5, 1.65, 12.3, 1.0, C["deep_blue"])
add_text(slide, "Each letter transforms into a fun animated object with a bounce + sparkle transition.\nOne or two letters every 10–15 seconds β€” children say the letter aloud then see its object!",
         0.7, 1.65, 12.0, 1.0, font_size=15, bold=False, color=C["white"])

# ABC grid
alphabet = [
    ("A","🍎 Apple"),("B","⚽ Ball"),("C","🐱 Cat"),("D","🐢 Dog"),("E","🐘 Elephant"),
    ("F","🐸 Frog"),("G","πŸ‡ Grapes"),("H","🏠 House"),("I","🍦 Ice Cream"),("J","🀹 Juggler"),
    ("K","πŸͺ Kite"),("L","🦁 Lion"),("M","πŸ’ Monkey"),("N","πŸŒ™ Night"),("O","🟠 Orange"),
    ("P","🐧 Penguin"),("Q","πŸ‘Έ Queen"),("R","🌈 Rainbow"),("S","⭐ Star"),("T","🐯 Tiger"),
    ("U","β˜” Umbrella"),("V","🎻 Violin"),("W","🌊 Wave"),("X","πŸŽ‰ Xylophone"),("Y","πŸͺ€ Yo-yo"),("Z","πŸ¦“ Zebra"),
]
cols = 9
letter_colors = [C["red"],C["warm_orange"],C["sunny_yellow"],C["grass_green"],C["teal"],
                 C["deep_blue"],C["purple"],C["hot_pink"],C["coral"]]
for i, (ltr, obj) in enumerate(alphabet):
    c = i % cols
    r = i // cols
    x = 0.35 + c * 1.41
    y = 2.85 + r * 1.55
    bg = letter_colors[i % len(letter_colors)]
    add_ellipse(slide, x, y, 1.1, 1.1, bg)
    add_text(slide, ltr, x, y, 1.1, 0.55, font_size=32, bold=True, color=C["white"])
    add_text(slide, obj, x-0.1, y+0.55, 1.3, 0.55, font_size=9, bold=True, color=C["dark_navy"],
             align=PP_ALIGN.CENTER)

# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 6 β€” RHYME 3: NUMBERS SONG (5:30–8:00)
# ─────────────────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xFF, 0xF5, 0xEE))
add_rect(slide, 0, 0, 13.333, 0.18, C["warm_orange"])

add_header_bar(slide, "πŸ”’  RHYME 3 – Numbers Song", "Timestamp: 5:30 – 8:00  |  Scenes 14–23",
               C["warm_orange"], C["white"], RGBColor(0xFF,0xEB,0xD5))

add_rounded_rect(slide, 0.5, 1.65, 12.3, 0.75, C["warm_orange"])
add_text(slide, "Each number gets its own colorful animated sequence (β‰ˆ15 sec each). Cheerful narration counts aloud.",
         0.7, 1.65, 12.0, 0.75, font_size=15, bold=False, color=C["white"])

numbers = [
    ("1","🎈 One Balloon","red"),
    ("2","πŸ¦†πŸ¦† Two Ducks","deep_blue"),
    ("3","⭐⭐⭐ Three Stars","sunny_yellow"),
    ("4","🌸🌸🌸🌸 Four Flowers","hot_pink"),
    ("5","🐝🐝🐝🐝🐝 Five Bees","gold"),
    ("6","🐟🐟🐟🐟🐟🐟 Six Fish","teal"),
    ("7","🌈 Seven Rainbow Colors","purple"),
    ("8","πŸ¦‹πŸ¦‹πŸ¦‹πŸ¦‹πŸ¦‹πŸ¦‹πŸ¦‹πŸ¦‹ Eight Butterflies","grass_green"),
    ("9","🌟 Nine Sparkling Stars","coral"),
    ("10","πŸŽ‰ Ten Balloons Burst!","warm_orange"),
]
for i, (num, obj, col_key) in enumerate(numbers):
    c = i % 5
    r = i // 5
    x = 0.4 + c * 2.55
    y = 2.6 + r * 2.25
    bg = C[col_key]
    add_rounded_rect(slide, x, y, 2.3, 2.0, bg)
    add_ellipse(slide, x+0.65, y+0.1, 1.0, 1.0, C["white"])
    add_text(slide, num, x+0.65, y+0.12, 1.0, 0.9, font_size=38, bold=True, color=bg)
    add_text(slide, obj, x+0.05, y+1.18, 2.2, 0.75, font_size=11, bold=True, color=C["white"],
             align=PP_ALIGN.CENTER)

# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 7 β€” RHYME 4: COLORS SONG (8:00–10:30)
# ─────────────────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, C["white"])
rainbow_stripe(slide, 0, 0.22)
rainbow_stripe(slide, 7.28, 0.22)

add_header_bar(slide, "🎨  RHYME 4 – Colors Song", "Timestamp: 8:00 – 10:30",
               C["hot_pink"], C["white"], C["light_pink"])

colors_data = [
    ("RED",    C["red"],          "🍎 Apple",        "Bouncing apple rolls in with sparkles"),
    ("BLUE",   C["deep_blue"],    "🌀 Sky",           "Camera pans up to sunny blue sky"),
    ("GREEN",  C["grass_green"],  "🌳 Tree",          "Tree grows from seed in time-lapse"),
    ("YELLOW", C["sunny_yellow"], "β˜€οΈ Sun",            "Smiley Sun does a little wiggle dance"),
    ("PURPLE", C["purple"],       "πŸ¦‹ Butterfly",     "Purple butterfly flutters across screen"),
    ("PINK",   C["hot_pink"],     "🌸 Flowers",       "Pink flowers bloom with pop sound"),
    ("ORANGE", C["warm_orange"],  "🐠 Fish",          "Orange fish blows bubbles in the sea"),
    ("RAINBOW","🌈",              "Rainbow Ending",   "All colors unite β€” mega rainbow finale!"),
]
for i, (col_name, col_rgb, obj, action) in enumerate(colors_data):
    c = i % 4
    r = i // 4
    x = 0.35 + c * 3.2
    y = 1.65 + r * 2.7
    if col_name == "RAINBOW":
        add_rounded_rect(slide, x, y, 2.9, 2.35, C["sky_blue"])
        rainbow_stripe(slide, y, 0.22)
        rainbow_stripe(slide, y+2.13, 0.22)
    else:
        add_rounded_rect(slide, x, y, 2.9, 2.35, col_rgb)
    add_text(slide, obj, x+0.1, y+0.05, 2.7, 0.9, font_size=30, bold=False,
             color=C["white"], align=PP_ALIGN.CENTER)
    add_text(slide, col_name, x+0.1, y+0.88, 2.7, 0.65, font_size=22, bold=True,
             color=C["white"], align=PP_ALIGN.CENTER)
    add_text(slide, action, x+0.1, y+1.5, 2.7, 0.75, font_size=11, bold=False,
             color=C["white"], align=PP_ALIGN.CENTER)

# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 8 β€” RHYME 5: SHAPES SONG (10:30–12:30)
# ─────────────────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xF5, 0xF0, 0xFF))
add_rect(slide, 0, 0, 13.333, 0.18, C["purple"])

add_header_bar(slide, "πŸ”·  RHYME 5 – Shapes Song", "Timestamp: 10:30 – 12:30",
               C["purple"], C["white"], C["lavender"])

shapes_data = [
    ("β­• CIRCLE",   "β†’ πŸ€ Ball",   "Circle bounces and becomes a basketball"),
    ("⬛ SQUARE",   "β†’ πŸ“¦ Box",    "Square folds into a colorful gift box"),
    ("πŸ”Ί TRIANGLE", "β†’ πŸ” Mountain","Triangle stretches tall into a snowy peak"),
    ("β–¬ RECTANGLE", "β†’ πŸšͺ Door",   "Rectangle opens like a door β€” surprise inside!"),
    ("❀️ HEART",    "β†’ πŸ’ Love",   "Heart pulses and showers confetti"),
    ("⭐ STAR",     "β†’ 🌟 Wish",   "Star twinkles and flies across the sky"),
]
for i, (shp, obj, action) in enumerate(shapes_data):
    c = i % 3
    r = i // 3
    x = 0.5 + c * 4.2
    y = 1.7 + r * 2.6
    bg_colors = [C["teal"], C["purple"], C["deep_blue"], C["grass_green"], C["coral"], C["hot_pink"]]
    add_rounded_rect(slide, x, y, 3.8, 2.3, bg_colors[i])
    # shape emoji big
    add_text(slide, shp, x+0.1, y+0.05, 3.6, 1.0, font_size=32, bold=True,
             color=C["white"], align=PP_ALIGN.CENTER)
    # transform arrow
    add_text(slide, obj, x+0.1, y+1.0, 3.6, 0.6, font_size=20, bold=True,
             color=C["gold"], align=PP_ALIGN.CENTER)
    add_text(slide, action, x+0.1, y+1.6, 3.6, 0.65, font_size=11, bold=False,
             color=C["white"], align=PP_ALIGN.CENTER)

# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 9 β€” GRAND FINALE (12:30–15:00)
# ─────────────────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xFF, 0xFF, 0xCC))
rainbow_stripe(slide, 0, 0.22)
rainbow_stripe(slide, 7.28, 0.22)

add_header_bar(slide, "πŸŽ‰  GRAND FINALE", "Timestamp: 12:30 – 15:00",
               C["coral"], C["white"], C["sunny_yellow"])

finale_scenes = [
    ("F1","12:30–13:15","🦁🐘🐡🐰🐦 All animals return to the stage.\nEveryone sings the mega chorus together.\nColorful spotlights sweep the scene."),
    ("F2","13:15–14:00","πŸ‘¦πŸ‘§ Children dance in a circle.\n🎊 Confetti rains from above.\nBalloons float upward β€” crowd cheer SFX!"),
    ("F3","14:00–14:30","🌈 Giant rainbow spins slowly.\nCamera zooms out to full sky view.\nAll characters wave goodbye."),
    ("F4","14:30–15:00","πŸ“£ SUBSCRIBE animation bounces onto screen.\n⭐ \"Subscribe for More Rhymes!\"\n🎨 Colorful bouncing text CTA.\n\"See you in the next adventure!\""),
]
for i, (sn, ts, desc) in enumerate(finale_scenes):
    c = i % 2
    r = i // 2
    x = 0.5 + c * 6.4
    y = 1.7 + r * 2.6
    add_scene_card(slide, sn, ts, desc, x, y, w=6.0, h=2.35,
                   card_color=C["white"], text_color=C["dark_navy"], accent=C["coral"])

# Subscribe CTA highlight
add_rounded_rect(slide, 2.5, 6.65, 8.3, 0.7, C["red"])
add_text(slide, "⭐  SUBSCRIBE FOR MORE RHYMES!   |   🎨  New episodes every week!",
         2.6, 6.65, 8.1, 0.7, font_size=18, bold=True, color=C["white"])

# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 10 β€” CHARACTERS & CAST
# ─────────────────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xFE, 0xF9, 0xE7))
rainbow_stripe(slide, 0, 0.18)

add_header_bar(slide, "🎨  Main Characters & Cast", "Animation Style Reference",
               C["sunny_yellow"], C["dark_navy"], C["warm_orange"])

chars_full = [
    ("πŸ‘¦","Tommy","Boy in Blue","Energetic leader, always first to dance","deep_blue"),
    ("πŸ‘§","Lily","Girl in Pink","Sweet & curious, loves singing","hot_pink"),
    ("🦁","Leo","The Lion","Bold, roars on beat, fluffy mane","warm_orange"),
    ("🐘","Ellie","The Elephant","Gentle giant, water-spray specialist","teal"),
    ("🐡","Momo","The Monkey","Cheeky acrobat, loves bananas","grass_green"),
    ("🐰","Bella","The Bunny","Hoppy & cheerful, flowers follow her","light_pink"),
    ("🐦","Bluey","The Bird","Sky dancer, butterflies follow","deep_blue"),
    ("β˜€οΈ","Smiley","The Sun","Always smiling, lights up scenes","sunny_yellow"),
    ("🌈","Happy","The Rainbow","Grand finale host, spans the whole sky","purple"),
]
cols = 3
for i, (em, name, role, trait, col_key) in enumerate(chars_full):
    c = i % cols
    r = i // cols
    x = 0.4 + c * 4.3
    y = 1.65 + r * 1.9
    add_rounded_rect(slide, x, y, 4.0, 1.75, C[col_key])
    add_text(slide, em, x+0.05, y+0.1, 1.0, 1.4, font_size=40, bold=False,
             color=C["white"], align=PP_ALIGN.CENTER)
    add_text(slide, name, x+1.1, y+0.08, 2.8, 0.55, font_size=18, bold=True,
             color=C["white"], align=PP_ALIGN.LEFT)
    add_text(slide, role, x+1.1, y+0.6, 2.8, 0.45, font_size=13, bold=False,
             color=C["gold"], align=PP_ALIGN.LEFT, italic=True)
    add_text(slide, trait, x+1.1, y+1.05, 2.8, 0.6, font_size=12, bold=False,
             color=C["white"], align=PP_ALIGN.LEFT)

# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 11 β€” MUSIC & ANIMATION SPEC
# ─────────────────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xF0, 0xFF, 0xF4))
add_rect(slide, 0, 0, 13.333, 0.18, C["grass_green"])

add_header_bar(slide, "🎡  Music & Animation Production Specs", "Technical Reference for the Animation Team",
               C["dark_green"], C["white"], C["mint"])

# Music column
add_rounded_rect(slide, 0.5, 1.6, 5.9, 5.6, C["deep_blue"])
add_text(slide, "🎡  MUSIC SPEC", 0.6, 1.65, 5.7, 0.55, font_size=20, bold=True,
         color=C["gold"])
music_lines = [
    "Tempo:  120–130 BPM",
    "Key Instruments:",
    "  🎸 Ukulele (main melody)",
    "  πŸ”” Xylophone (accent notes)",
    "  πŸ”” Bells (magical moments)",
    "  πŸ‘ Hand Claps (rhythm)",
    "  🎡 Whistles (bird sections)",
    "Vocals:",
    "  πŸ‘Ά Children's Choir β€” chorus",
    "  πŸ“’ Lead narrator β€” counting/letters",
    "Sound FX:",
    "  🐦 Bird chirps | 🫧 Bubbles",
    "  πŸ˜„ Laughter | 🎊 Confetti pop",
    "  πŸ’§ Water splash | ⭐ Sparkle tinkle",
]
for i, line in enumerate(music_lines):
    add_text(slide, line, 0.65, 2.25 + i*0.29, 5.6, 0.3,
             font_size=12, bold=(":" in line and not line.startswith(" ")),
             color=C["white"], align=PP_ALIGN.LEFT)

# Animation column
add_rounded_rect(slide, 6.9, 1.6, 5.9, 5.6, C["purple"])
add_text(slide, "🎬  ANIMATION SPEC", 7.0, 1.65, 5.7, 0.55, font_size=20, bold=True,
         color=C["gold"])
anim_lines = [
    "Style:  Bright 3D Cartoon",
    "Character Design:",
    "  πŸ‘ Big expressive eyes",
    "  😊 Happy facial expressions",
    "  🎨 Rainbow color palette",
    "Camera:",
    "  πŸ“Ή Gentle smooth movement",
    "  πŸ”­ Zoom out for finales",
    "  πŸ”„ Pan for parade scenes",
    "Scene Pacing:",
    "  ⏱ Change every 5–8 seconds",
    "  ✨ Floating stars & sparkles",
    "  🫧 Bubbles in background",
    "  πŸ’ƒ Simple copy-able dance moves",
    "  🎡 Repeat catchy choruses",
]
for i, line in enumerate(anim_lines):
    add_text(slide, line, 7.05, 2.25 + i*0.29, 5.6, 0.3,
             font_size=12, bold=(":" in line and not line.startswith(" ")),
             color=C["white"], align=PP_ALIGN.LEFT)

# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 12 β€” VIRAL RETENTION TIPS
# ─────────────────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xFF, 0xF0, 0xFA))
rainbow_stripe(slide, 0, 0.18)

add_header_bar(slide, "πŸ“ˆ  Viral Retention Strategy", "5 Key Techniques to Maximise Watch Time",
               C["coral"], C["white"], C["light_pink"])

tips = [
    ("🎬","Scene Changes Every 5–8 Seconds",
     "Short scene cuts keep toddlers' attention locked in. Never let a single shot last beyond 8 seconds without motion change.",
     C["red"]),
    ("🌈","Bright Colors & Exaggerated Expressions",
     "High-saturation visuals and over-the-top emoji-style reactions trigger dopamine responses in young viewers.",
     C["warm_orange"]),
    ("✨","Floating Stars, Bubbles & Sparkles",
     "Persistent ambient particle effects (15–20% screen coverage) maintain visual excitement between action beats.",
     C["purple"]),
    ("πŸ’ƒ","Simple Copy-able Dance Moves",
     "Design 2–3 repeating moves children can physically mirror. Physical engagement dramatically increases retention.",
     C["grass_green"]),
    ("🎡","Repeat Catchy Choruses",
     "Repeat each rhyme's chorus at least 3Γ— per segment. Familiarity = comfort = rewatch behavior in 2–5 year olds.",
     C["deep_blue"]),
]
for i, (icon, title, body, bg) in enumerate(tips):
    y = 1.65 + i * 1.07
    add_rounded_rect(slide, 0.5, y, 12.3, 0.95, bg)
    add_ellipse(slide, 0.55, y+0.1, 0.75, 0.75, C["white"])
    add_text(slide, icon, 0.55, y+0.1, 0.75, 0.75, font_size=26, bold=False,
             color=bg, align=PP_ALIGN.CENTER)
    add_text(slide, title, 1.45, y+0.05, 5.5, 0.5, font_size=16, bold=True,
             color=C["white"], align=PP_ALIGN.LEFT)
    add_text(slide, body, 1.45, y+0.48, 11.1, 0.45, font_size=12, bold=False,
             color=C["white"], align=PP_ALIGN.LEFT)

# end tease
add_rounded_rect(slide, 2.0, 7.0, 9.3, 0.42, C["coral"])
add_text(slide, "🎬 End with: \"See you in the next adventure!\" β€” teaser clip of the next video plays",
         2.1, 7.0, 9.1, 0.42, font_size=14, bold=True, color=C["white"])

# ─────────────────────────────────────────────────────────────────────────────
# SAVE
# ─────────────────────────────────────────────────────────────────────────────
output = "/tmp/workspace/happy-animal-adventure/Happy_Animal_Adventure_Storyboard.pptx"
prs.save(output)
print(f"Saved to: {output}")
Running Command

cd /tmp/workspace/happy-animal-adventure && python build_pptx.py 2>&1

Running Command

python3 -c " from pptx import Presentation prs = Presentation('/tmp/workspace/happy-animal-adventure/Happy_Animal_Adventure_Storyboard.pptx') print(f'Slides: {len(prs.slides)}') for i, slide in enumerate(prs.slides, 1): texts = [s.text_frame.text.strip()[:60] for s in slide.shapes if s.has_text_frame and s.text_frame.text.strip()] print(f' Slide {i}: {texts[0] if texts else \"(no text)\"}') import os size = os.path.getsize('/tmp/workspace/happy-animal-adventure/Happy_Animal_Adventure_Storyboard.pptx') print(f'File size: {size/1024:.1f} KB') "

Your storyboard presentation is ready! Here's the download link:

Happy Animal Adventure Storyboard

Presentation Β· PPTX


What's Inside β€” 12 Slides

SlideContent
1 - CoverFull title card with all 9 characters displayed, music & style tags, rainbow stripes
2 - Table of ContentsColor-coded section overview with timestamps for all 7 segments
3 - INTRO (0:00–0:30)4 scene cards β€” Rainbow, Sun/Clouds, Logo, Kids entering playground
4 - Rhyme 1: Animal Parade (0:30–3:00)6 scene cards β€” Leo, Ellie, Momo, Bella, Bluey, All Dance
5 - Rhyme 2: ABC Adventure (3:00–5:30)Full A–Z grid with emoji object for every letter (A=Apple β†’ Z=Zebra)
6 - Rhyme 3: Numbers Song (5:30–8:00)10 number cards (1 Balloon β†’ 10 Balloons Burst) with color blocks
7 - Rhyme 4: Colors Song (8:00–10:30)8 color panels β€” Red/Blue/Green/Yellow/Purple/Pink/Orange/Rainbow ending
8 - Rhyme 5: Shapes Song (10:30–12:30)6 shape cards with transform arrows (Circleβ†’Ball, Triangleβ†’Mountain, etc.)
9 - Grand Finale (12:30–15:00)4 finale scenes + big red "Subscribe for More Rhymes!" CTA bar
10 - Characters & Cast9 character cards (Tommy, Lily, Leo, Ellie, Momo, Bella, Bluey, Sun, Rainbow) with roles & traits
11 - Music & Animation SpecTwo-column reference β€” music instruments/BPM/SFX + animation style/camera/pacing
12 - Viral Retention Tips5 illustrated strategy cards with explanations for watch-time maximization

Design highlights:
  • 16:9 widescreen layout with Comic Sans MS font for a fun, kid-friendly look
  • Every section uses its own distinct color theme (teal for Intro, green for Animals, blue for ABC, orange for Numbers, pink for Colors, purple for Shapes, coral for Finale)
  • Rainbow stripe accents on relevant slides
  • All 26 alphabet letters and all 10 numbers are mapped out in visual grids ready for animation reference

Can u give it

Here it is! Click the link below to download your file:

Happy Animal Adventure Storyboard

Presentation Β· PPTX

If the file doesn't open, let me know and I'll regenerate it for you! 🎬🌈

I'm asking you a full video

I understand what you're looking for, but I have to be straightforward with you.
I cannot generate a full video. Here's why:
  • Producing a 15-minute animated 3D cartoon requires professional animation software like Blender, Maya, or Cinema 4D, a rendering farm, voice actors, music composers, and typically weeks to months of production time.
  • I don't have access to video generation or rendering engines in this environment.

What I can do to help you get this video made:

Option 1 - AI Video Tools (You do it yourself)

These tools can generate short animated clips from prompts:
  • Kling AI / Runway ML / Pika Labs - text-to-video AI
  • Canva - has animated kids' templates
  • Vyond or Animaker - purpose-built for cartoon explainer/kids' videos

Option 2 - Hire a Freelancer

  • Fiverr or Upwork - search "kids nursery rhyme animation" - budgets typically $200–$2,000 for a 5–15 min video
  • Your storyboard PPTX I made is exactly what freelancers need to quote and execute the job

Option 3 - YouTube Script Package

I can produce a complete production-ready package for you:
  • Full narration script with lyrics for all 5 rhymes
  • Scene-by-scene animation direction notes
  • Character design descriptions
  • Music tempo & chord suggestions

Would you like me to build out the full lyrics + narration script as a Word document or PDF that you can hand directly to an animator or AI tool?
This is a shared conversation. Sign in to Orris to start your own chat.