can you create a fun and interactive presentation on how fatigue and lazziness are different, reasons behind it, how to overcome it, its effects on health and how exercises helps to overcome it.

Reading File
Reading File
Running Command

mkdir -p /tmp/workspace/fatigue-vs-laziness && ls /tmp/workspace/fatigue-vs-laziness/

Writing File

~/fatigue-vs-laziness/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.oxml.ns import qn
from pptx.util import Inches, Pt
import copy
from lxml import etree

# ── Colour Palette ──────────────────────────────────────────────
C_BG_DARK   = RGBColor(0x12, 0x12, 0x2E)   # deep navy
C_BG_MID    = RGBColor(0x1A, 0x1A, 0x40)   # mid navy
C_ACCENT1   = RGBColor(0xFF, 0x6B, 0x6B)   # coral-red  (fatigue)
C_ACCENT2   = RGBColor(0x4E, 0xC9, 0xB0)   # teal-green (laziness)
C_ACCENT3   = RGBColor(0xFF, 0xD1, 0x66)   # golden yellow
C_ACCENT4   = RGBColor(0x9B, 0x59, 0xB6)   # purple
C_ACCENT5   = RGBColor(0x3A, 0xC9, 0xFF)   # sky blue
C_WHITE     = RGBColor(0xFF, 0xFF, 0xFF)
C_LIGHT     = RGBColor(0xE0, 0xE0, 0xF0)
C_CARD1     = RGBColor(0x20, 0x20, 0x50)   # card background
C_CARD2     = RGBColor(0x18, 0x18, 0x44)

W = Inches(13.333)
H = Inches(7.5)

prs = Presentation()
prs.slide_width  = W
prs.slide_height = H
blank_layout = prs.slide_layouts[6]


# ── Helpers ─────────────────────────────────────────────────────

def add_slide():
    return prs.slides.add_slide(blank_layout)

def fill_bg(slide, color):
    bg = slide.background
    fill = bg.fill
    fill.solid()
    fill.fore_color.rgb = color

def add_rect(slide, x, y, w, h, color, alpha=None):
    shape = slide.shapes.add_shape(1, x, y, w, h)  # MSO_SHAPE_TYPE.RECTANGLE = 1
    shape.fill.solid()
    shape.fill.fore_color.rgb = color
    shape.line.fill.background()
    return shape

def add_textbox(slide, text, x, y, w, h,
                font_name="Calibri", size=20, bold=False, italic=False,
                color=None, align=PP_ALIGN.LEFT, v_anchor=MSO_ANCHOR.TOP,
                wrap=True):
    if color is None:
        color = C_WHITE
    tb = slide.shapes.add_textbox(x, y, w, h)
    tf = tb.text_frame
    tf.word_wrap = wrap
    tf.vertical_anchor = v_anchor
    tf.margin_left = 0
    tf.margin_right = 0
    tf.margin_top = 0
    tf.margin_bottom = 0
    p = tf.paragraphs[0]
    p.alignment = align
    run = p.add_run()
    run.text = text
    run.font.name = font_name
    run.font.size = Pt(size)
    run.font.bold = bold
    run.font.italic = italic
    run.font.color.rgb = color
    return tb

def add_multiline_textbox(slide, lines, x, y, w, h,
                          font_name="Calibri", size=18, bold=False,
                          color=None, align=PP_ALIGN.LEFT,
                          v_anchor=MSO_ANCHOR.TOP, line_space=None):
    """lines: list of (text, bold_override, size_override, color_override)"""
    if color is None:
        color = C_WHITE
    tb = slide.shapes.add_textbox(x, y, w, h)
    tf = tb.text_frame
    tf.word_wrap = True
    tf.vertical_anchor = v_anchor
    tf.margin_left = 0
    tf.margin_right = 0
    tf.margin_top = 0
    tf.margin_bottom = 0
    first = True
    for item in lines:
        if isinstance(item, str):
            text, b, s, c = item, bold, size, color
        else:
            text = item[0]
            b    = item[1] if len(item) > 1 else bold
            s    = item[2] if len(item) > 2 else size
            c    = item[3] if len(item) > 3 else color
        if first:
            p = tf.paragraphs[0]
            first = False
        else:
            p = tf.add_paragraph()
        p.alignment = align
        run = p.add_run()
        run.text = text
        run.font.name = font_name
        run.font.size = Pt(s)
        run.font.bold = b
        run.font.color.rgb = c
        if line_space:
            from pptx.util import Pt as Pt2
            from pptx.oxml.ns import qn
            pPr = p._p.get_or_add_pPr()
            lnSpc = etree.SubElement(pPr, qn('a:lnSpc'))
            spcPts = etree.SubElement(lnSpc, qn('a:spcPts'))
            spcPts.set('val', str(int(line_space * 100)))
    return tb

def rounded_rect(slide, x, y, w, h, color, radius_emu=200000):
    """Add a rounded rectangle."""
    from pptx.util import Emu
    sp = slide.shapes.add_shape(5, x, y, w, h)   # 5 = ROUNDED_RECTANGLE
    sp.fill.solid()
    sp.fill.fore_color.rgb = color
    sp.line.fill.background()
    # Adjust corner radius via XML
    sp_elem = sp._element
    spPr = sp_elem.find(qn('p:spPr'))
    prstGeom = spPr.find(qn('a:prstGeom'))
    if prstGeom is not None:
        avLst = prstGeom.find(qn('a:avLst'))
        if avLst is None:
            avLst = etree.SubElement(prstGeom, qn('a:avLst'))
        gd = etree.SubElement(avLst, qn('a:gd'))
        gd.set('name', 'adj')
        gd.set('fmla', 'val 30000')
    return sp

def add_emoji_text(slide, emoji, x, y, w, h, size=36):
    """Add an emoji / symbol as large text."""
    tb = slide.shapes.add_textbox(x, y, w, h)
    tf = tb.text_frame
    tf.word_wrap = False
    tf.margin_left = 0; tf.margin_right = 0
    tf.margin_top = 0; tf.margin_bottom = 0
    p = tf.paragraphs[0]
    p.alignment = PP_ALIGN.CENTER
    run = p.add_run()
    run.text = emoji
    run.font.size = Pt(size)
    return tb

def add_gradient_header(slide, title, subtitle=None):
    """Add a coloured header bar with title."""
    add_rect(slide, 0, 0, W, Inches(1.3), C_CARD1)
    add_textbox(slide, title,
                Inches(0.4), Inches(0.12), Inches(12.5), Inches(0.75),
                font_name="Calibri", size=34, bold=True,
                color=C_ACCENT3, align=PP_ALIGN.LEFT)
    if subtitle:
        add_textbox(slide, subtitle,
                    Inches(0.4), Inches(0.82), Inches(12.5), Inches(0.45),
                    font_name="Calibri", size=16, bold=False,
                    color=C_LIGHT, align=PP_ALIGN.LEFT)

def add_pill(slide, text, x, y, w, h, bg_color, text_color=None, size=15):
    if text_color is None: text_color = C_WHITE
    rr = rounded_rect(slide, x, y, w, h, bg_color)
    add_textbox(slide, text,
                x + Inches(0.08), y + Inches(0.05), w - Inches(0.16), h - Inches(0.1),
                font_name="Calibri", size=size, bold=True,
                color=text_color, align=PP_ALIGN.CENTER,
                v_anchor=MSO_ANCHOR.MIDDLE)

def add_card(slide, lines, x, y, w, h, card_color=None, title_color=None, body_color=None,
             font_name="Calibri", title_size=18, body_size=15):
    """Generic content card."""
    if card_color is None: card_color = C_CARD1
    if title_color is None: title_color = C_ACCENT3
    if body_color is None: body_color = C_LIGHT
    rounded_rect(slide, x, y, w, h, card_color)
    formatted = []
    for i, line in enumerate(lines):
        if i == 0:
            formatted.append((line, True, title_size, title_color))
        else:
            formatted.append((line, False, body_size, body_color))
    add_multiline_textbox(slide, formatted,
                          x + Inches(0.15), y + Inches(0.12),
                          w - Inches(0.3), h - Inches(0.24),
                          font_name=font_name, align=PP_ALIGN.LEFT,
                          v_anchor=MSO_ANCHOR.TOP)


# ══════════════════════════════════════════════════════════════
#  SLIDE 1 — TITLE SLIDE
# ══════════════════════════════════════════════════════════════
s1 = add_slide()
fill_bg(s1, C_BG_DARK)

# Decorative background circles (simulate with rectangles)
for (cx, cy, sz, col) in [
    (Inches(12.5), Inches(0.5), Inches(3), RGBColor(0x20, 0x10, 0x50)),
    (Inches(0.2),  Inches(6.5), Inches(2), RGBColor(0x10, 0x20, 0x45)),
    (Inches(6.5),  Inches(7.0), Inches(1.5), RGBColor(0x1A, 0x1A, 0x50)),
]:
    sh = s1.shapes.add_shape(9, cx, cy, sz, sz)  # 9 = OVAL
    sh.fill.solid(); sh.fill.fore_color.rgb = col
    sh.line.fill.background()

# Main Title
add_textbox(s1, "😴 vs 😒",
            Inches(1), Inches(0.6), Inches(11), Inches(1.4),
            font_name="Calibri", size=72, bold=True,
            color=C_WHITE, align=PP_ALIGN.CENTER)

add_textbox(s1, "FATIGUE  vs  LAZINESS",
            Inches(1), Inches(1.9), Inches(11), Inches(0.9),
            font_name="Calibri", size=42, bold=True,
            color=C_ACCENT3, align=PP_ALIGN.CENTER)

add_textbox(s1, "What's the difference? Why does it happen? How do you beat it?",
            Inches(1.5), Inches(2.75), Inches(10), Inches(0.55),
            font_name="Calibri", size=20, bold=False,
            color=C_LIGHT, align=PP_ALIGN.CENTER)

# Divider line
r = s1.shapes.add_shape(1, Inches(3.5), Inches(3.45), Inches(6.333), Inches(0.04))
r.fill.solid(); r.fill.fore_color.rgb = C_ACCENT3
r.line.fill.background()

# Topic pills
topics = [
    ("🔍 Key Differences",  C_ACCENT1),
    ("⚡ Root Causes",       C_ACCENT2),
    ("💊 Health Effects",   C_ACCENT4),
    ("🏃 Exercise Fix",     C_ACCENT5),
    ("🛠 How to Overcome",  C_ACCENT3),
]
pill_w = Inches(2.1)
pill_h = Inches(0.52)
start_x = Inches(0.5)
gap = Inches(0.25)
for i, (label, col) in enumerate(topics):
    px = start_x + i * (pill_w + gap)
    add_pill(s1, label, px, Inches(3.7), pill_w, pill_h, col, size=13)

add_textbox(s1, "An interactive guide to understanding your body & mind",
            Inches(1.5), Inches(4.55), Inches(10), Inches(0.45),
            font_name="Calibri", size=16, bold=False, italic=True,
            color=RGBColor(0xAA, 0xAA, 0xCC), align=PP_ALIGN.CENTER)

# Speaker note
s1.notes_slide.notes_text_frame.text = (
    "Welcome slide. Ask the audience: 'How many of you have hit the snooze button today?' "
    "Use the poll as an icebreaker."
)


# ══════════════════════════════════════════════════════════════
#  SLIDE 2 — WHAT IS FATIGUE vs LAZINESS? (Side-by-side)
# ══════════════════════════════════════════════════════════════
s2 = add_slide()
fill_bg(s2, C_BG_DARK)
add_gradient_header(s2, "🔍  What Are We Talking About?",
                    "Understanding the two — they are NOT the same thing!")

# Left card — Fatigue
rounded_rect(s2, Inches(0.3), Inches(1.5), Inches(6.0), Inches(5.5),
             RGBColor(0x2A, 0x10, 0x20))
add_textbox(s2, "😴  FATIGUE",
            Inches(0.5), Inches(1.65), Inches(5.6), Inches(0.7),
            size=28, bold=True, color=C_ACCENT1, align=PP_ALIGN.CENTER)

fatigue_def = [
    "A physical or mental state of extreme",
    "tiredness caused by exertion, illness,",
    "stress, or inadequate rest.",
    "",
    "🧠  Involves the brain & body",
    "⚡  Reduces capacity to function",
    "🩺  Can be a medical symptom",
    "😔  Not a matter of willpower",
    "🔄  Needs rest + recovery to resolve",
]
add_multiline_textbox(s2, fatigue_def,
                      Inches(0.5), Inches(2.4), Inches(5.6), Inches(4.2),
                      size=17, color=C_LIGHT, align=PP_ALIGN.LEFT)

# Right card — Laziness
rounded_rect(s2, Inches(7.0), Inches(1.5), Inches(6.0), Inches(5.5),
             RGBColor(0x10, 0x25, 0x20))
add_textbox(s2, "😒  LAZINESS",
            Inches(7.2), Inches(1.65), Inches(5.6), Inches(0.7),
            size=28, bold=True, color=C_ACCENT2, align=PP_ALIGN.CENTER)

lazy_def = [
    "An unwillingness to exert effort or",
    "take action, despite having the energy",
    "and capacity to do so.",
    "",
    "🎯  Involves motivation & mindset",
    "💭  Often a behavioural habit",
    "🧩  Linked to boredom / fear / avoidance",
    "✅  Can be changed with intention",
    "🔧  Requires habit-building to resolve",
]
add_multiline_textbox(s2, lazy_def,
                      Inches(7.2), Inches(2.4), Inches(5.6), Inches(4.2),
                      size=17, color=C_LIGHT, align=PP_ALIGN.LEFT)

# VS badge in the middle
sh = s2.shapes.add_shape(9, Inches(6.2), Inches(3.5), Inches(0.9), Inches(0.9))
sh.fill.solid(); sh.fill.fore_color.rgb = C_ACCENT3
sh.line.fill.background()
add_textbox(s2, "VS", Inches(6.2), Inches(3.55), Inches(0.9), Inches(0.8),
            size=20, bold=True, color=C_BG_DARK, align=PP_ALIGN.CENTER)


# ══════════════════════════════════════════════════════════════
#  SLIDE 3 — KEY DIFFERENCES TABLE
# ══════════════════════════════════════════════════════════════
s3 = add_slide()
fill_bg(s3, C_BG_DARK)
add_gradient_header(s3, "📊  Key Differences at a Glance",
                    "Side-by-side comparison across 6 dimensions")

headers   = ["Dimension", "FATIGUE 😴", "LAZINESS 😒"]
rows = [
    ["Origin",         "Physical / mental depletion",    "Lack of motivation / avoidance"],
    ["Energy Level",   "Genuinely low energy",            "Normal energy, just unused"],
    ["Willpower",      "Effort doesn't help much",        "Effort CAN overcome it"],
    ["Solution",       "Rest, sleep, nutrition, treatment","Habit change, goal-setting"],
    ["Duration",       "Resolves with adequate recovery", "Can persist without intervention"],
    ["Medical risk",   "Can signal illness or burnout",   "Rarely a medical condition"],
]

col_widths = [Inches(2.8), Inches(4.6), Inches(4.6)]
row_h = Inches(0.67)
start_y = Inches(1.45)
start_x = Inches(0.6)

header_colors = [C_CARD1, C_ACCENT1, C_ACCENT2]
text_colors   = [C_ACCENT3, C_LIGHT, C_LIGHT]

# Header row
x = start_x
for i, (hdr, bg, tc) in enumerate(zip(headers, header_colors, text_colors)):
    rounded_rect(s3, x, start_y, col_widths[i], row_h, bg)
    add_textbox(s3, hdr, x + Inches(0.1), start_y + Inches(0.1),
                col_widths[i] - Inches(0.2), row_h - Inches(0.2),
                size=17, bold=True, color=tc, align=PP_ALIGN.CENTER,
                v_anchor=MSO_ANCHOR.MIDDLE)
    x += col_widths[i] + Inches(0.05)

# Data rows
for ri, row in enumerate(rows):
    y = start_y + (ri + 1) * (row_h + Inches(0.06))
    x = start_x
    bg_row = [RGBColor(0x1E, 0x1E, 0x44), RGBColor(0x28, 0x12, 0x1A), RGBColor(0x12, 0x22, 0x1A)]
    tc_row = [C_ACCENT3, C_LIGHT, C_LIGHT]
    for ci, (cell, bg, tc) in enumerate(zip(row, bg_row, tc_row)):
        rounded_rect(s3, x, y, col_widths[ci], row_h, bg)
        add_textbox(s3, cell,
                    x + Inches(0.1), y + Inches(0.08),
                    col_widths[ci] - Inches(0.2), row_h - Inches(0.16),
                    size=15, bold=(ci == 0), color=tc,
                    align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE)
        x += col_widths[ci] + Inches(0.05)


# ══════════════════════════════════════════════════════════════
#  SLIDE 4 — CAUSES OF FATIGUE
# ══════════════════════════════════════════════════════════════
s4 = add_slide()
fill_bg(s4, C_BG_DARK)
add_gradient_header(s4, "⚡  Causes of Fatigue",
                    "Why does your body/mind run out of fuel?")

causes_fatigue = [
    ("😴  Sleep Deprivation",      "Not getting 7-9 hours of quality sleep — the #1 cause"),
    ("🩸  Anaemia / Low Iron",     "Reduced oxygen delivery to muscles and brain"),
    ("🧠  Mental Overload",        "Prolonged stress, anxiety, depression drain cognitive reserves"),
    ("🍔  Poor Nutrition",         "Vitamin deficiencies (B12, D, Iron), sugar crashes"),
    ("🦠  Illness / Infection",    "Immune response, viral load (e.g. post-COVID fatigue)"),
    ("💊  Medications",            "Antihistamines, beta-blockers, antidepressants can cause fatigue"),
    ("🪑  Sedentary Lifestyle",    "Lack of movement reduces cardiovascular efficiency"),
    ("🔥  Overtraining",           "Too much exercise without adequate recovery"),
]

cw = Inches(5.9)
ch = Inches(0.66)
sx = Inches(0.35)
sy = Inches(1.5)
gap_x = Inches(0.45)
gap_y = Inches(0.08)

for i, (title, desc) in enumerate(causes_fatigue):
    col = i % 2
    row = i // 2
    x = sx + col * (cw + gap_x)
    y = sy + row * (ch + gap_y)
    bg = RGBColor(0x2A, 0x14, 0x20) if col == 0 else RGBColor(0x14, 0x20, 0x30)
    rounded_rect(s4, x, y, cw, ch, bg)
    add_textbox(s4, title,
                x + Inches(0.12), y + Inches(0.05),
                cw - Inches(0.24), Inches(0.3),
                size=15, bold=True, color=C_ACCENT1, align=PP_ALIGN.LEFT)
    add_textbox(s4, desc,
                x + Inches(0.12), y + Inches(0.33),
                cw - Inches(0.24), Inches(0.28),
                size=12.5, bold=False, color=C_LIGHT, align=PP_ALIGN.LEFT)


# ══════════════════════════════════════════════════════════════
#  SLIDE 5 — CAUSES OF LAZINESS
# ══════════════════════════════════════════════════════════════
s5 = add_slide()
fill_bg(s5, C_BG_DARK)
add_gradient_header(s5, "🧠  Causes of Laziness",
                    "What actually stops you from getting things done?")

causes_lazy = [
    ("😰  Fear of Failure",        "Avoiding tasks to escape the possibility of doing them wrong"),
    ("🎯  Lack of Clear Goals",    "No defined purpose = no motivation to start"),
    ("📱  Instant Gratification",  "Dopamine hijacking — scrolling is easier than working"),
    ("😞  Low Self-Efficacy",      "Belief that effort won't lead to success"),
    ("🔁  Bad Habits & Routines",  "Grooved neural pathways that default to inaction"),
    ("😐  Boredom / Disengagement","Task feels meaningless or unstimulating"),
    ("🧩  Perfectionism",          "Paralysis by analysis — waiting for the 'right moment'"),
    ("💬  Negative Self-Talk",     "'I'll do it later' — chronic procrastination loop"),
]

for i, (title, desc) in enumerate(causes_lazy):
    col = i % 2
    row = i // 2
    x = sx + col * (cw + gap_x)
    y = sy + row * (ch + gap_y)
    bg = RGBColor(0x12, 0x25, 0x20) if col == 0 else RGBColor(0x18, 0x1A, 0x30)
    rounded_rect(s5, x, y, cw, ch, bg)
    add_textbox(s5, title,
                x + Inches(0.12), y + Inches(0.05),
                cw - Inches(0.24), Inches(0.3),
                size=15, bold=True, color=C_ACCENT2, align=PP_ALIGN.LEFT)
    add_textbox(s5, desc,
                x + Inches(0.12), y + Inches(0.33),
                cw - Inches(0.24), Inches(0.28),
                size=12.5, bold=False, color=C_LIGHT, align=PP_ALIGN.LEFT)


# ══════════════════════════════════════════════════════════════
#  SLIDE 6 — HEALTH EFFECTS
# ══════════════════════════════════════════════════════════════
s6 = add_slide()
fill_bg(s6, C_BG_DARK)
add_gradient_header(s6, "💊  Effects on Health",
                    "Both can seriously hurt you if left unchecked")

health_items = [
    ("❤️  Cardiovascular Risk",   C_ACCENT1,
     "Chronic fatigue linked to hypertension, heart disease & stroke"),
    ("🧠  Mental Health Decline", C_ACCENT4,
     "Both fatigue & laziness worsen depression, anxiety & cognitive fog"),
    ("⚖️  Weight Gain",           C_ACCENT3,
     "Sedentary behaviour disrupts metabolism & increases obesity risk"),
    ("🦴  Muscle Weakness",       C_ACCENT2,
     "Fatigue causes muscle atrophy; laziness leads to deconditioning"),
    ("🩸  Hormonal Imbalance",    C_ACCENT5,
     "Sleep deprivation raises cortisol; disrupts insulin & thyroid hormones"),
    ("🛡️  Weakened Immunity",     RGBColor(0xFF, 0x99, 0x66),
     "Chronic fatigue suppresses immune function, raising infection risk"),
    ("😴  Sleep Disorders",       RGBColor(0xAA, 0x88, 0xFF),
     "Poor habits feed insomnia & sleep apnea in a vicious cycle"),
    ("📉  Productivity & Quality of Life",  RGBColor(0x66, 0xCC, 0xFF),
     "Both reduce work performance, relationships & life satisfaction"),
]

card_w = Inches(5.9)
card_h = Inches(0.66)
gx = Inches(0.45)
gy = Inches(0.08)

for i, (label, accent, desc) in enumerate(health_items):
    col = i % 2
    row = i // 2
    x = Inches(0.35) + col * (card_w + gx)
    y = Inches(1.5) + row * (card_h + gy)
    rounded_rect(s6, x, y, card_w, card_h, RGBColor(0x18, 0x18, 0x40))
    # left accent bar
    rr = s6.shapes.add_shape(1, x, y, Inches(0.07), card_h)
    rr.fill.solid(); rr.fill.fore_color.rgb = accent
    rr.line.fill.background()
    add_textbox(s6, label,
                x + Inches(0.18), y + Inches(0.05),
                card_w - Inches(0.3), Inches(0.3),
                size=15, bold=True, color=accent, align=PP_ALIGN.LEFT)
    add_textbox(s6, desc,
                x + Inches(0.18), y + Inches(0.33),
                card_w - Inches(0.3), Inches(0.28),
                size=12.5, color=C_LIGHT, align=PP_ALIGN.LEFT)


# ══════════════════════════════════════════════════════════════
#  SLIDE 7 — HOW EXERCISE HELPS
# ══════════════════════════════════════════════════════════════
s7 = add_slide()
fill_bg(s7, C_BG_DARK)
add_gradient_header(s7, "🏃  How Exercise Fights Both Fatigue & Laziness",
                    "Science-backed mechanisms — move more, feel better!")

exercise_cards = [
    ("💨 Boosts Oxygen Delivery",
     "Cardio improves VO2max, meaning your heart & muscles work more efficiently — less effort for the same task."),
    ("🧠 Releases Feel-Good Hormones",
     "Exercise triggers endorphins, serotonin & dopamine — natural mood lifters that crush procrastination."),
    ("😴 Improves Sleep Quality",
     "Regular moderate exercise deepens slow-wave sleep, the most restorative stage — wake up truly refreshed."),
    ("⚡ Builds Mitochondria",
     "Aerobic training creates more mitochondria in cells — literally more energy production capacity."),
    ("🔋 Reduces Mental Fatigue",
     "Even a 20-minute walk increases cerebral blood flow and reduces brain fog within minutes."),
    ("🏋️ Fights Deconditioning",
     "Strength training reverses muscle atrophy, making daily tasks require less effort and feel less tiring."),
]

ew = Inches(3.9)
eh = Inches(1.45)
egx = Inches(0.27)
egy = Inches(0.18)

for i, (title, desc) in enumerate(exercise_cards):
    col = i % 3
    row = i // 3
    x = Inches(0.35) + col * (ew + egx)
    y = Inches(1.5) + row * (eh + egy)
    bg = [RGBColor(0x14, 0x24, 0x38),
          RGBColor(0x18, 0x22, 0x34),
          RGBColor(0x1A, 0x20, 0x30)][col]
    rounded_rect(s7, x, y, ew, eh, bg)
    # accent top bar
    bar = s7.shapes.add_shape(1, x, y, ew, Inches(0.07))
    bar.fill.solid(); bar.fill.fore_color.rgb = C_ACCENT5
    bar.line.fill.background()
    add_textbox(s7, title,
                x + Inches(0.12), y + Inches(0.12),
                ew - Inches(0.24), Inches(0.4),
                size=15, bold=True, color=C_ACCENT5, align=PP_ALIGN.LEFT)
    add_textbox(s7, desc,
                x + Inches(0.12), y + Inches(0.55),
                ew - Inches(0.24), Inches(0.82),
                size=13, color=C_LIGHT, align=PP_ALIGN.LEFT, wrap=True)

# Bottom callout
rounded_rect(s7, Inches(0.35), Inches(6.55), Inches(12.6), Inches(0.72),
             RGBColor(0x20, 0x30, 0x50))
add_textbox(s7,
            "🎯  Recommended: 150 min moderate cardio/week + 2x strength training  "
            "— even 10-minute walks make a measurable difference!",
            Inches(0.5), Inches(6.6), Inches(12.3), Inches(0.62),
            size=15, bold=True, color=C_ACCENT3, align=PP_ALIGN.CENTER)


# ══════════════════════════════════════════════════════════════
#  SLIDE 8 — BEST EXERCISES
# ══════════════════════════════════════════════════════════════
s8 = add_slide()
fill_bg(s8, C_BG_DARK)
add_gradient_header(s8, "🏋️  Best Exercises to Combat Fatigue & Laziness",
                    "Pick what you enjoy — consistency beats intensity!")

exercises = [
    ("🚶 Walking",         "20-30 min daily",  "Lowest barrier, immediate mood lift, reduces fatigue by 65% in studies"),
    ("🧘 Yoga / Stretching","15-45 min",       "Reduces cortisol, improves flexibility & mental calm"),
    ("🚴 Cycling",         "30-45 min",        "Low-impact cardio that builds endurance & mitochondrial density"),
    ("🏊 Swimming",        "20-40 min",        "Full-body workout, especially good for fatigue from chronic conditions"),
    ("🏃 Running/Jogging", "20-30 min",        "High endorphin release, strongest anti-depression effect"),
    ("🏋️ Strength Training","30-45 min, 2-3x", "Reverses deconditioning, boosts testosterone & confidence"),
    ("🤸 HIIT",            "15-20 min",        "Max efficiency — especially useful for 'I have no time' laziness"),
    ("🕺 Dancing",         "Any duration",     "Fun factor = highest adherence; dopamine + social reward"),
]

ew2 = Inches(5.85)
eh2 = Inches(0.68)
gx2 = Inches(0.45)
gy2 = Inches(0.1)

for i, (name, duration, benefit) in enumerate(exercises):
    col = i % 2
    row = i // 2
    x = Inches(0.35) + col * (ew2 + gx2)
    y = Inches(1.5) + row * (eh2 + gy2)
    rounded_rect(s8, x, y, ew2, eh2, RGBColor(0x18, 0x20, 0x40))
    # Duration pill
    add_pill(s8, duration,
             x + Inches(0.12), y + Inches(0.13),
             Inches(1.4), Inches(0.26),
             RGBColor(0x20, 0x50, 0x40), text_color=C_ACCENT2, size=11)
    add_textbox(s8, name,
                x + Inches(1.62), y + Inches(0.07),
                Inches(1.8), Inches(0.28),
                size=15, bold=True, color=C_ACCENT3, align=PP_ALIGN.LEFT)
    add_textbox(s8, benefit,
                x + Inches(0.12), y + Inches(0.42),
                ew2 - Inches(0.24), Inches(0.24),
                size=12, color=C_LIGHT, align=PP_ALIGN.LEFT)


# ══════════════════════════════════════════════════════════════
#  SLIDE 9 — HOW TO OVERCOME FATIGUE
# ══════════════════════════════════════════════════════════════
s9 = add_slide()
fill_bg(s9, C_BG_DARK)
add_gradient_header(s9, "🛠  Overcoming FATIGUE — A Recovery Toolkit",
                    "Science-backed strategies to restore your energy")

fatigue_tips = [
    ("1️⃣", "Prioritise Sleep",
     "7–9 hrs, consistent schedule, dark/cool room, no screens 1 hr before bed"),
    ("2️⃣", "Optimise Nutrition",
     "Iron, B12, Vitamin D, complex carbs, hydration (even mild dehydration causes fatigue)"),
    ("3️⃣", "Manage Stress",
     "Mindfulness, journaling, therapy — chronic stress depletes your energy reserves"),
    ("4️⃣", "Light Exercise",
     "Counter-intuitive but true: gentle movement actually restores energy levels"),
    ("5️⃣", "Check Medical Causes",
     "Rule out anaemia, thyroid disease, diabetes, sleep apnea, depression"),
    ("6️⃣", "Strategic Rest",
     "Short 20-min naps (no longer!) boost alertness without causing grogginess"),
]

tw = Inches(5.9)
th = Inches(0.82)
tgx = Inches(0.45)
tgy = Inches(0.12)

for i, (num, title, tip) in enumerate(fatigue_tips):
    col = i % 2
    row = i // 2
    x = Inches(0.35) + col * (tw + tgx)
    y = Inches(1.5) + row * (th + tgy)
    rounded_rect(s9, x, y, tw, th, RGBColor(0x25, 0x10, 0x18))
    add_textbox(s9, num,
                x + Inches(0.1), y + Inches(0.12),
                Inches(0.45), Inches(0.58),
                size=22, bold=True, color=C_ACCENT1, align=PP_ALIGN.CENTER)
    add_textbox(s9, title,
                x + Inches(0.6), y + Inches(0.05),
                tw - Inches(0.72), Inches(0.3),
                size=15, bold=True, color=C_ACCENT1, align=PP_ALIGN.LEFT)
    add_textbox(s9, tip,
                x + Inches(0.6), y + Inches(0.35),
                tw - Inches(0.72), Inches(0.44),
                size=12.5, color=C_LIGHT, align=PP_ALIGN.LEFT)


# ══════════════════════════════════════════════════════════════
#  SLIDE 10 — HOW TO OVERCOME LAZINESS
# ══════════════════════════════════════════════════════════════
s10 = add_slide()
fill_bg(s10, C_BG_DARK)
add_gradient_header(s10, "🚀  Overcoming LAZINESS — A Motivation Playbook",
                    "Behavioural science tricks to get yourself moving!")

lazy_tips = [
    ("1️⃣", "2-Minute Rule",
     "If it takes < 2 minutes, do it NOW. This breaks the avoidance loop immediately"),
    ("2️⃣", "Implementation Intentions",
     "'I will do X at Y time in Z place' — specificity triples follow-through rate"),
    ("3️⃣", "Shrink the Task",
     "Start with just 5 minutes. Starting IS the hardest part — momentum does the rest"),
    ("4️⃣", "Remove Friction",
     "Set out workout clothes the night before. Make the right choice the easy choice"),
    ("5️⃣", "Reward Loops",
     "Pair boring tasks with something enjoyable — your favourite podcast + a task"),
    ("6️⃣", "Social Accountability",
     "Tell someone your goal. Public commitment raises completion rates by 65%"),
]

for i, (num, title, tip) in enumerate(lazy_tips):
    col = i % 2
    row = i // 2
    x = Inches(0.35) + col * (tw + tgx)
    y = Inches(1.5) + row * (th + tgy)
    rounded_rect(s10, x, y, tw, th, RGBColor(0x10, 0x22, 0x18))
    add_textbox(s10, num,
                x + Inches(0.1), y + Inches(0.12),
                Inches(0.45), Inches(0.58),
                size=22, bold=True, color=C_ACCENT2, align=PP_ALIGN.CENTER)
    add_textbox(s10, title,
                x + Inches(0.6), y + Inches(0.05),
                tw - Inches(0.72), Inches(0.3),
                size=15, bold=True, color=C_ACCENT2, align=PP_ALIGN.LEFT)
    add_textbox(s10, tip,
                x + Inches(0.6), y + Inches(0.35),
                tw - Inches(0.72), Inches(0.44),
                size=12.5, color=C_LIGHT, align=PP_ALIGN.LEFT)


# ══════════════════════════════════════════════════════════════
#  SLIDE 11 — QUICK SELF-CHECK QUIZ
# ══════════════════════════════════════════════════════════════
s11 = add_slide()
fill_bg(s11, C_BG_DARK)
add_gradient_header(s11, "🎯  Quick Self-Check — Which Are YOU Experiencing?",
                    "Answer honestly — no judgement here! 😄")

q_title = "Ask yourself these 4 questions:"
add_textbox(s11, q_title,
            Inches(0.5), Inches(1.45), Inches(12.3), Inches(0.4),
            size=18, bold=True, color=C_ACCENT3, align=PP_ALIGN.LEFT)

questions = [
    ("Q1", "Do you feel tired even after a full night's sleep?",
     "YES → Likely Fatigue", "NO → Might be Laziness"),
    ("Q2", "Do you feel too tired to do things you actually ENJOY?",
     "YES → Likely Fatigue", "NO → Might be Laziness"),
    ("Q3", "Has this been going on for more than 2 weeks?",
     "YES → See a doctor!", "NO → Try motivation strategies"),
    ("Q4", "Does rest make you feel better?",
     "YES → Classic Fatigue pattern", "NO → Explore motivation & habit"),
]

qw = Inches(5.85)
qh = Inches(1.05)
qgx = Inches(0.45)
qgy = Inches(0.15)

for i, (qnum, question, yes_ans, no_ans) in enumerate(questions):
    col = i % 2
    row = i // 2
    x = Inches(0.35) + col * (qw + qgx)
    y = Inches(1.98) + row * (qh + qgy)
    rounded_rect(s11, x, y, qw, qh, RGBColor(0x1A, 0x1A, 0x42))
    # question number badge
    sh = s11.shapes.add_shape(9, x + Inches(0.1), y + Inches(0.12), Inches(0.52), Inches(0.52))
    sh.fill.solid(); sh.fill.fore_color.rgb = C_ACCENT4
    sh.line.fill.background()
    add_textbox(s11, qnum, x + Inches(0.1), y + Inches(0.12),
                Inches(0.52), Inches(0.52),
                size=13, bold=True, color=C_WHITE, align=PP_ALIGN.CENTER,
                v_anchor=MSO_ANCHOR.MIDDLE)
    add_textbox(s11, question,
                x + Inches(0.75), y + Inches(0.1),
                qw - Inches(0.87), Inches(0.45),
                size=14, bold=True, color=C_LIGHT, align=PP_ALIGN.LEFT)
    # YES / NO answers
    add_pill(s11, "✅ " + yes_ans, x + Inches(0.12), y + Inches(0.6),
             Inches(2.5), Inches(0.3), RGBColor(0x10, 0x40, 0x20),
             text_color=C_ACCENT2, size=11)
    add_pill(s11, "❌ " + no_ans, x + Inches(2.75), y + Inches(0.6),
             Inches(2.9), Inches(0.3), RGBColor(0x35, 0x10, 0x10),
             text_color=C_ACCENT1, size=11)

# Bottom note
rounded_rect(s11, Inches(0.35), Inches(6.52), Inches(12.6), Inches(0.72),
             RGBColor(0x18, 0x18, 0x40))
add_textbox(s11,
            "⚠️  If you scored mostly YES — please consult a healthcare professional. "
            "Chronic fatigue can indicate an underlying medical condition.",
            Inches(0.5), Inches(6.57), Inches(12.3), Inches(0.62),
            size=14, bold=False, italic=True, color=RGBColor(0xFF, 0xCC, 0x66),
            align=PP_ALIGN.CENTER)


# ══════════════════════════════════════════════════════════════
#  SLIDE 12 — DAILY ROUTINE PLAN
# ══════════════════════════════════════════════════════════════
s12 = add_slide()
fill_bg(s12, C_BG_DARK)
add_gradient_header(s12, "📅  Your 7-Day Energy Reset Plan",
                    "A practical daily routine to beat both fatigue AND laziness")

plan = [
    ("🌅  Morning",   "7:00 AM",  "Wake same time daily. 5 min stretch. Drink water before coffee.",              C_ACCENT3),
    ("🧘  Movement",  "7:30 AM",  "10-20 min walk or yoga. Even 5 min counts — just START.",                      C_ACCENT2),
    ("🥗  Breakfast", "8:00 AM",  "Protein + complex carbs + fruit. Avoid sugary cereals.",                        RGBColor(0xFF, 0x99, 0x44)),
    ("🎯  Work Block","9:00 AM",  "Tackle hardest task first (peak energy). 25 min work + 5 min break (Pomodoro).", C_ACCENT5),
    ("🚶  Midday",    "12:30 PM", "Short walk after lunch. Avoid heavy carb-only meals.",                          C_ACCENT2),
    ("💪  Exercise",  "5:00 PM",  "30 min workout (your choice). This is non-negotiable!",                         C_ACCENT1),
    ("📵  Evening",   "9:00 PM",  "Screen-free wind-down. Read, meditate, gentle stretching.",                     C_ACCENT4),
    ("😴  Sleep",     "10:30 PM", "Consistent bedtime. Cool dark room. No phone in bed.",                          C_ACCENT5),
]

pw = Inches(5.85)
ph = Inches(0.64)
pgx = Inches(0.45)
pgy = Inches(0.1)

for i, (phase, time_str, desc, col) in enumerate(plan):
    c = i % 2
    r = i // 2
    x = Inches(0.35) + c * (pw + pgx)
    y = Inches(1.5) + r * (ph + pgy)
    rounded_rect(s12, x, y, pw, ph, RGBColor(0x16, 0x18, 0x38))
    # Time badge
    add_pill(s12, time_str,
             x + Inches(0.08), y + Inches(0.14),
             Inches(1.0), Inches(0.28),
             col, size=11)
    add_textbox(s12, phase,
                x + Inches(1.18), y + Inches(0.06),
                Inches(1.5), Inches(0.28),
                size=14, bold=True, color=col, align=PP_ALIGN.LEFT)
    add_textbox(s12, desc,
                x + Inches(0.1), y + Inches(0.36),
                pw - Inches(0.2), Inches(0.24),
                size=12, color=C_LIGHT, align=PP_ALIGN.LEFT)


# ══════════════════════════════════════════════════════════════
#  SLIDE 13 — KEY TAKEAWAYS
# ══════════════════════════════════════════════════════════════
s13 = add_slide()
fill_bg(s13, C_BG_DARK)
add_gradient_header(s13, "🌟  Key Takeaways",
                    "What you should walk away knowing today")

takeaways = [
    (C_ACCENT1, "Fatigue ≠ Laziness",
     "One is a physiological/psychological state. The other is a behavioural pattern. "
     "Confusing them leads to guilt, shame, and zero progress."),
    (C_ACCENT2, "Both are fixable",
     "Fatigue responds to rest, nutrition, sleep & medical treatment. "
     "Laziness responds to habit design, accountability & motivation science."),
    (C_ACCENT3, "Exercise is the universal tool",
     "Regular physical activity is one of the only interventions proven to help "
     "both conditions — it boosts energy, mood, sleep, and willpower simultaneously."),
    (C_ACCENT5, "Start small, start now",
     "You don't need a perfect plan. A 10-minute walk TODAY does more than a perfect "
     "workout you plan for Monday and never do."),
]

ty = Inches(1.5)
for i, (col, title, desc) in enumerate(takeaways):
    rounded_rect(s13, Inches(0.35), ty, Inches(12.6), Inches(1.12),
                 RGBColor(0x16, 0x18, 0x3A))
    # Left accent bar
    bar = s13.shapes.add_shape(1, Inches(0.35), ty, Inches(0.1), Inches(1.12))
    bar.fill.solid(); bar.fill.fore_color.rgb = col
    bar.line.fill.background()
    add_textbox(s13, title,
                Inches(0.6), ty + Inches(0.08),
                Inches(12.0), Inches(0.35),
                size=18, bold=True, color=col, align=PP_ALIGN.LEFT)
    add_textbox(s13, desc,
                Inches(0.6), ty + Inches(0.45),
                Inches(12.0), Inches(0.58),
                size=14, color=C_LIGHT, align=PP_ALIGN.LEFT)
    ty += Inches(1.22)


# ══════════════════════════════════════════════════════════════
#  SLIDE 14 — CLOSING / CALL TO ACTION
# ══════════════════════════════════════════════════════════════
s14 = add_slide()
fill_bg(s14, C_BG_DARK)

# decorative ovals
for (cx, cy, sz, col) in [
    (Inches(11.5), Inches(0.3), Inches(4), RGBColor(0x1E, 0x10, 0x48)),
    (Inches(0.0),  Inches(5.0), Inches(3), RGBColor(0x10, 0x22, 0x44)),
    (Inches(5.0),  Inches(6.5), Inches(2), RGBColor(0x12, 0x18, 0x3A)),
]:
    sh = s14.shapes.add_shape(9, cx, cy, sz, sz)
    sh.fill.solid(); sh.fill.fore_color.rgb = col
    sh.line.fill.background()

add_textbox(s14, "🚀",
            Inches(5.6), Inches(0.5), Inches(2), Inches(1.2),
            size=60, align=PP_ALIGN.CENTER)

add_textbox(s14, "Your Energy Journey Starts NOW",
            Inches(1), Inches(1.6), Inches(11.2), Inches(0.85),
            size=36, bold=True, color=C_ACCENT3, align=PP_ALIGN.CENTER)

add_textbox(s14, "One small action, taken consistently, changes everything.",
            Inches(2), Inches(2.5), Inches(9.2), Inches(0.5),
            size=20, italic=True, color=C_LIGHT, align=PP_ALIGN.CENTER)

# 3 action pills
actions = [
    ("😴  Fix your sleep tonight", C_ACCENT1),
    ("🏃  Move for 10 mins tomorrow", C_ACCENT5),
    ("🎯  Write ONE goal down right now", C_ACCENT2),
]
aw = Inches(3.6)
ah = Inches(0.65)
ax_start = Inches(0.9)
for i, (act, col) in enumerate(actions):
    ax = ax_start + i * Inches(4.0)
    add_pill(s14, act, ax, Inches(3.25), aw, ah, col, size=14)

# Quote
rounded_rect(s14, Inches(1.2), Inches(4.2), Inches(10.9), Inches(1.1),
             RGBColor(0x1C, 0x1C, 0x40))
add_textbox(s14,
            '"The secret of getting ahead is getting started."',
            Inches(1.4), Inches(4.3), Inches(10.5), Inches(0.55),
            size=18, bold=True, italic=True,
            color=C_ACCENT3, align=PP_ALIGN.CENTER)
add_textbox(s14, "— Mark Twain",
            Inches(1.4), Inches(4.82), Inches(10.5), Inches(0.35),
            size=14, italic=True, color=C_LIGHT, align=PP_ALIGN.CENTER)

add_textbox(s14,
            "Thank you  •  Questions?  •  Let's discuss!",
            Inches(1), Inches(5.55), Inches(11.2), Inches(0.5),
            size=20, bold=True, color=C_ACCENT4, align=PP_ALIGN.CENTER)

add_textbox(s14,
            "😴 vs 😒  |  Fatigue vs Laziness  |  Know the difference, own your energy",
            Inches(0.5), Inches(6.85), Inches(12.3), Inches(0.4),
            size=13, italic=True, color=RGBColor(0x88, 0x88, 0xAA),
            align=PP_ALIGN.CENTER)


# ── Save ────────────────────────────────────────────────────────
out_path = "/tmp/workspace/fatigue-vs-laziness/Fatigue_vs_Laziness.pptx"
from io import BytesIO
buf = BytesIO()
prs.save(buf)
with open(out_path, "wb") as f:
    f.write(buf.getvalue())

print(f"✅  Saved: {out_path}")
print(f"   Slides: {len(prs.slides)}")
Running Command

cd /tmp/workspace/fatigue-vs-laziness && python build_pptx.py 2>&1

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

Fatigue vs Laziness

Presentation · PPTX


What's Inside - 14 Slides

#SlideHighlights
1Title SlideFun emoji header, topic pills, icebreaker note
2What Are We Talking About?Side-by-side definition cards with VS badge
3Key Differences Table6-dimension colour-coded comparison grid
4Causes of Fatigue8 science-backed root causes with icons
5Causes of Laziness8 psychological/behavioural causes with icons
6Health Effects8 health impacts with accent-colour bars
7How Exercise Helps6 mechanism cards + WHO recommendation callout
8Best Exercises8 exercises with duration badges and benefits
9Overcoming Fatigue6-step recovery toolkit
10Overcoming Laziness6 behavioural science strategies
11Self-Check Quiz4 interactive YES/NO diagnostic questions
127-Day Energy Reset PlanHour-by-hour daily routine with time badges
13Key Takeaways4 core messages with accent bars
14Closing / Call to ActionQuote, 3 action pills, thank-you
Design: Deep navy dark theme, coral-red for fatigue topics, teal-green for laziness topics, golden yellow for emphasis - all in 16:9 widescreen format with rounded cards and pill badges throughout.
This is a shared conversation. Sign in to Orris to start your own chat.