Make a ppt on chikungunya

Reading File
Reading File
Reading File
Finding Sources
Searching Images

chikungunya rash skin clinical presentation

This clinical photograph displays a newborn in a neonatal intensive care setting exhibiting a diffuse petechial rash secondary to congenital chikungunya infection. The skin manifests widespread, small, reddish-purple non-blanching macules and pinpoint lesions across the torso, arms, and legs. The infant is receiving critical care interventions, evidenced by an endotracheal tube secured with white tape for ventilatory support, an umbilical venous or arterial catheter, and ECG monitoring leads on the abdomen. A white knit cap is present on the head, and bandages are visible around both wrists, likely securing intravenous access or monitoring sensors. The image illustrates the dermatological and systemic severity of vertical transmission of CHIKV, highlighting the neonatal presentation of thrombocytopenia and vascular fragility.

This clinical photograph displays a newborn in a neonatal intensive care setting exhibiting a diffuse petechial rash secondary to congenital chikungunya infection. The skin manifests widespread, small, reddish-purple non-blanching macules and pinpoint lesions across the torso, arms, and legs. The infant is receiving critical care interventions, evidenced by an endotracheal tube secured with white tape for ventilatory support, an umbilical venous or arterial catheter, and ECG monitoring leads on the abdomen. A white knit cap is present on the head, and bandages are visible around both wrists, likely securing intravenous access or monitoring sensors. The image illustrates the dermatological and systemic severity of vertical transmission of CHIKV, highlighting the neonatal presentation of thrombocytopenia and vascular fragility.

This clinical photograph displays a widespread maculopapular rash on a patient's neck and upper trunk. The rash is characterized by diffuse, erythematous lesions consisting of small, flat macules and slightly raised papules. The individual lesions are predominantly red, vary in size from pinpoint to several millimeters, and exhibit both discrete and confluent patterns. The distribution is dense across the anterior neck, supraclavicular regions, and the upper chest. This type of dermatological presentation is commonly associated with acute systemic viral infections, such as Zika virus (ZIKV), Chikungunya virus (CHIKV), or Dengue fever. The visual findings demonstrate an inflammatory response of the skin typical of viral exanthems, serving as a critical diagnostic sign in infectious disease and dermatology contexts.

This clinical photograph displays a widespread maculopapular rash on a patient's neck and upper trunk. The rash is characterized by diffuse, erythematous lesions consisting of small, flat macules and slightly raised papules. The individual lesions are predominantly red, vary in size from pinpoint to several millimeters, and exhibit both discrete and confluent patterns. The distribution is dense across the anterior neck, supraclavicular regions, and the upper chest. This type of dermatological presentation is commonly associated with acute systemic viral infections, such as Zika virus (ZIKV), Chikungunya virus (CHIKV), or Dengue fever. The visual findings demonstrate an inflammatory response of the skin typical of viral exanthems, serving as a critical diagnostic sign in infectious disease and dermatology contexts.

A close-up clinical photograph of a maculopapular rash on a patient's arm, secondary to Zika virus infection. The image demonstrates a widespread, morbilliform eruption characterized by numerous small, erythematous macules (flat spots) and papules (raised bumps) that are pink to red in color. The lesions are densely distributed across the skin surface, showing occasional coalescence. The background skin appears otherwise normal without significant scaling or ulceration. This visual presentation is characteristic of the exanthematous phase of various arboviral infections, including Zika, dengue, and chikungunya. The image serves as an educational example of acute viral exanthema in infectious disease and dermatology contexts, illustrating the typical morphology used for clinical diagnosis in returning travelers presenting with fever and systemic symptoms.

A close-up clinical photograph of a maculopapular rash on a patient's arm, secondary to Zika virus infection. The image demonstrates a widespread, morbilliform eruption characterized by numerous small, erythematous macules (flat spots) and papules (raised bumps) that are pink to red in color. The lesions are densely distributed across the skin surface, showing occasional coalescence. The background skin appears otherwise normal without significant scaling or ulceration. This visual presentation is characteristic of the exanthematous phase of various arboviral infections, including Zika, dengue, and chikungunya. The image serves as an educational example of acute viral exanthema in infectious disease and dermatology contexts, illustrating the typical morphology used for clinical diagnosis in returning travelers presenting with fever and systemic symptoms.

This composite clinical photograph displays the progression and distribution of skin lesions in a patient with Chikungunya fever. Panels A and B show the facial involvement, characterized by an erythematous maculopapular rash distributed across the forehead, malar region (cheeks), and nose. Panel C illustrates the abdominal wall, exhibiting multiple small, clear vesicles superimposed on a diffuse erythematous maculopapular background. Panels D and E depict the bilateral upper thighs, showing numerous non-hemorrhagic vesicles and small bullae. Panel F reveals a later stage of progression on the right thigh, where the lesions have evolved into discrete, coalescing, and hemorrhagic vesicles with visible crusting. The images demonstrate the polymorphic nature of the cutaneous manifestations of Chikungunya virus infection, ranging from initial maculopapular erythema to vesiculobullous and hemorrhagic stages, which is particularly significant in severe clinical presentations or specific patient populations.

This composite clinical photograph displays the progression and distribution of skin lesions in a patient with Chikungunya fever. Panels A and B show the facial involvement, characterized by an erythematous maculopapular rash distributed across the forehead, malar region (cheeks), and nose. Panel C illustrates the abdominal wall, exhibiting multiple small, clear vesicles superimposed on a diffuse erythematous maculopapular background. Panels D and E depict the bilateral upper thighs, showing numerous non-hemorrhagic vesicles and small bullae. Panel F reveals a later stage of progression on the right thigh, where the lesions have evolved into discrete, coalescing, and hemorrhagic vesicles with visible crusting. The images demonstrate the polymorphic nature of the cutaneous manifestations of Chikungunya virus infection, ranging from initial maculopapular erythema to vesiculobullous and hemorrhagic stages, which is particularly significant in severe clinical presentations or specific patient populations.

Finding Sources
Searching Images

Aedes mosquito vector arbovirus transmission

This pathophysiology diagram illustrates the urban transmission cycle of arboviruses between Aedes mosquitoes and human hosts. The cycle is depicted in four numbered stages. Stage 1: Vector infection occurs when a mosquito feeds on a human during the acute viremic phase, indicated by red cutaneous markers. Stage 2: The extrinsic incubation period involves viral replication in the mosquito's midgut and subsequent dissemination. A central anatomical inset labels the mosquito's proboscis, salivary glands (the viral reservoir), and midgut. Stage 3: Human infection occurs when the infectious mosquito transmits the virus during a subsequent blood meal. Stage 4: The intrinsic incubation period involves viral amplification within the human host leading to symptom onset. Additionally, the diagram illustrates 'Vertical transmission,' where infected female mosquitoes transmit the virus through eggs. The visual highlights the biological barriers within the vector (midgut and salivary glands) and the transition between viremic hosts and infectious vectors, relevant to diseases such as Dengue, Zika, and Chikungunya.

This pathophysiology diagram illustrates the urban transmission cycle of arboviruses between Aedes mosquitoes and human hosts. The cycle is depicted in four numbered stages. Stage 1: Vector infection occurs when a mosquito feeds on a human during the acute viremic phase, indicated by red cutaneous markers. Stage 2: The extrinsic incubation period involves viral replication in the mosquito's midgut and subsequent dissemination. A central anatomical inset labels the mosquito's proboscis, salivary glands (the viral reservoir), and midgut. Stage 3: Human infection occurs when the infectious mosquito transmits the virus during a subsequent blood meal. Stage 4: The intrinsic incubation period involves viral amplification within the human host leading to symptom onset. Additionally, the diagram illustrates 'Vertical transmission,' where infected female mosquitoes transmit the virus through eggs. The visual highlights the biological barriers within the vector (midgut and salivary glands) and the transition between viremic hosts and infectious vectors, relevant to diseases such as Dengue, Zika, and Chikungunya.

This diagnostic image shows a 3 µm longitudinal-transverse histological section of a Culex pipiens mosquito, a primary vector for Rift Valley fever virus (RVFV). The specimen is stained with haematoxylin and eosin (H&E), illustrating the anatomical organization relevant to arbovirus transmission and pathogenesis. The image is divided into three labeled segments: Head, Thorax, and Abdomen. Key structures identified include: 1) Head: The compound eye and brain (cerebral ganglion), showing dark nuclear staining; 2) Thorax: Dominated by large, eosinophilic bundles of dorsal longitudinal wing muscles and salivary glands, which are critical sites for virus replication and secretion; 3) Abdomen: Visualizes the midgut epithelium—the initial site of viral entry—and the ovaries. The lower portion displays the leg structures. This section serves as an educational reference for identifying mosquito anatomy during vector competence studies to determine tissue-specific viral distribution and dissemination barriers.

This diagnostic image shows a 3 µm longitudinal-transverse histological section of a Culex pipiens mosquito, a primary vector for Rift Valley fever virus (RVFV). The specimen is stained with haematoxylin and eosin (H&E), illustrating the anatomical organization relevant to arbovirus transmission and pathogenesis. The image is divided into three labeled segments: Head, Thorax, and Abdomen. Key structures identified include: 1) Head: The compound eye and brain (cerebral ganglion), showing dark nuclear staining; 2) Thorax: Dominated by large, eosinophilic bundles of dorsal longitudinal wing muscles and salivary glands, which are critical sites for virus replication and secretion; 3) Abdomen: Visualizes the midgut epithelium—the initial site of viral entry—and the ovaries. The lower portion displays the leg structures. This section serves as an educational reference for identifying mosquito anatomy during vector competence studies to determine tissue-specific viral distribution and dissemination barriers.

Searching the Web

chikungunya 2025 2026 outbreak update epidemiology treatment

Finding Sources
Reading File
Reading File
Reading File
Reading File
Running Command

mkdir -p /tmp/workspace/chikungunya-ppt && ls /tmp/workspace/chikungunya-ppt/

Writing File

~/chikungunya-ppt/build_ppt.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 io import BytesIO
import json, subprocess, base64, os

# ── Colour palette ──────────────────────────────────────────────
ORANGE     = RGBColor(0xD9, 0x53, 0x1F)   # accent / title bg
DARK       = RGBColor(0x1A, 0x1A, 0x2E)   # dark navy
WHITE      = RGBColor(0xFF, 0xFF, 0xFF)
LIGHT_BG   = RGBColor(0xFD, 0xF6, 0xF0)   # warm off-white slide bg
TEAL       = RGBColor(0x0F, 0x7E, 0x8A)   # secondary accent
GREY_LINE  = RGBColor(0xCC, 0xCC, 0xCC)
ORANGE_LIGHT = RGBColor(0xFA, 0xD0, 0xB4) # light orange for boxes
TEAL_LIGHT   = RGBColor(0xB2, 0xE4, 0xE8)

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

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

# ── Helper: solid fill for a shape ──────────────────────────────
def fill_solid(shape, color):
    shape.fill.solid()
    shape.fill.fore_color.rgb = color

def no_fill(shape):
    shape.fill.background()

def no_line(shape):
    shape.line.fill.background()

# ── Helper: add a text box ───────────────────────────────────────
def add_tb(slide, text, x, y, w, h,
           font_name="Calibri", size=18, bold=False, italic=False,
           color=DARK, align=PP_ALIGN.LEFT, wrap=True,
           valign=MSO_ANCHOR.TOP, bg=None,
           margin_l=Inches(0.1), margin_r=Inches(0.1),
           margin_t=Inches(0.05), margin_b=Inches(0.05)):
    tb = slide.shapes.add_textbox(x, y, w, h)
    tf = tb.text_frame
    tf.word_wrap = wrap
    tf.vertical_anchor = valign
    tf.margin_left   = margin_l
    tf.margin_right  = margin_r
    tf.margin_top    = margin_t
    tf.margin_bottom = margin_b
    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
    if bg:
        fill_solid(tb, bg)
        no_line(tb)
    return tb, tf

# ── Helper: add multi-line text with bullet paragraphs ──────────
def add_bullets(slide, lines, x, y, w, h,
                font_name="Calibri", size=16, color=DARK,
                bold_first=False, valign=MSO_ANCHOR.TOP,
                line_spacing=1.2):
    tb = slide.shapes.add_textbox(x, y, w, h)
    tf = tb.text_frame
    tf.word_wrap = True
    tf.vertical_anchor = valign
    tf.margin_left  = Inches(0.12)
    tf.margin_right = Inches(0.08)
    tf.margin_top   = Inches(0.05)
    tf.margin_bottom= Inches(0.05)
    from pptx.util import Pt as pt_
    from pptx.oxml import parse_xml
    for i, line in enumerate(lines):
        if i == 0:
            p = tf.paragraphs[0]
        else:
            p = tf.add_paragraph()
        p.alignment = PP_ALIGN.LEFT
        # line spacing
        p.line_spacing = line_spacing
        run = p.add_run()
        run.text = line
        run.font.name  = font_name
        run.font.size  = Pt(size)
        run.font.bold  = (bold_first and i == 0)
        run.font.color.rgb = color
    return tb

# ── Helper: horizontal rule ──────────────────────────────────────
def add_hline(slide, x, y, w, color=ORANGE, thickness=Pt(1.5)):
    line = slide.shapes.add_shape(1, x, y, w, Inches(0.01))
    fill_solid(line, color)
    no_line(line)
    return line

# ── Helper: rounded rect box ─────────────────────────────────────
def add_box(slide, x, y, w, h, fill_color, line_color=None, radius=0.08):
    from pptx.util import Pt
    from pptx.enum.shapes import MSO_SHAPE_TYPE
    shape = slide.shapes.add_shape(
        5,  # MSO_SHAPE.ROUNDED_RECTANGLE = 5
        x, y, w, h)
    fill_solid(shape, fill_color)
    if line_color:
        shape.line.color.rgb = line_color
        shape.line.width = Pt(1)
    else:
        no_line(shape)
    # set corner radius via XML
    shape.adjustments[0] = radius
    return shape

# ── Helper: add image from URL ───────────────────────────────────
def add_img_url(slide, url, x, y, w, h=None):
    try:
        result = json.loads(subprocess.check_output(
            ["python", "/tmp/skills/shared/scripts/fetch_images.py", url],
            timeout=30
        ))
        if result and result[0].get("base64"):
            data = result[0]["base64"]
            # strip data URI prefix
            if "," in data:
                data = data.split(",", 1)[1]
            raw = base64.b64decode(data)
            buf = BytesIO(raw)
            if h:
                slide.shapes.add_picture(buf, x, y, w, h)
            else:
                slide.shapes.add_picture(buf, x, y, w)
    except Exception as e:
        print(f"Image load failed: {e}")

# ─────────────────────────────────────────────────────────────────
# SLIDE 1 — Title
# ─────────────────────────────────────────────────────────────────
def slide_title(prs):
    sl = prs.slides.add_slide(BLANK)
    # Full dark bg
    bg = sl.shapes.add_shape(1, 0, 0, W, H)
    fill_solid(bg, DARK); no_line(bg)

    # Orange accent bar on left
    bar = sl.shapes.add_shape(1, 0, 0, Inches(0.6), H)
    fill_solid(bar, ORANGE); no_line(bar)

    # Orange circle decoration top-right
    circ = sl.shapes.add_shape(9, Inches(10.5), Inches(-1.0), Inches(4), Inches(4))
    circ.fill.solid(); circ.fill.fore_color.rgb = ORANGE
    circ.line.fill.background()
    from pptx.util import Pt
    # Make semi-transparent via alpha not easy — skip, use a teal circle instead
    circ2 = sl.shapes.add_shape(9, Inches(10.0), Inches(4.8), Inches(3), Inches(3))
    fill_solid(circ2, TEAL); no_line(circ2)

    # Main title
    add_tb(sl, "CHIKUNGUNYA", Inches(1.1), Inches(2.0), Inches(9), Inches(1.6),
           font_name="Calibri", size=64, bold=True, color=WHITE,
           align=PP_ALIGN.LEFT)
    # Subtitle
    add_tb(sl, "A Mosquito-Borne Viral Disease", Inches(1.1), Inches(3.7), Inches(8), Inches(0.9),
           font_name="Calibri", size=28, italic=True, color=ORANGE_LIGHT,
           align=PP_ALIGN.LEFT)
    # Tagline
    add_tb(sl, "Epidemiology  |  Pathogenesis  |  Clinical Features  |  Diagnosis  |  Management  |  Prevention",
           Inches(1.1), Inches(4.7), Inches(10.5), Inches(0.6),
           font_name="Calibri", size=14, color=GREY_LINE, align=PP_ALIGN.LEFT)
    # Bottom line
    add_hline(sl, Inches(1.1), Inches(5.5), Inches(9), color=ORANGE)

# ─────────────────────────────────────────────────────────────────
# SLIDE 2 — Overview / What is Chikungunya?
# ─────────────────────────────────────────────────────────────────
def slide_overview(prs):
    sl = prs.slides.add_slide(BLANK)
    bg = sl.shapes.add_shape(1, 0, 0, W, H)
    fill_solid(bg, LIGHT_BG); no_line(bg)

    # Header bar
    hdr = sl.shapes.add_shape(1, 0, 0, W, Inches(1.15))
    fill_solid(hdr, ORANGE); no_line(hdr)
    add_tb(sl, "What is Chikungunya?", Inches(0.4), Inches(0.18), Inches(10), Inches(0.8),
           size=34, bold=True, color=WHITE, align=PP_ALIGN.LEFT)

    # Mosquito image on the right
    add_img_url(sl,
        "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_7ad6496029f23a8c996fe6a3d391640f83570166a41828c598c139f6866cb60a.jpg",
        Inches(9.0), Inches(1.3), Inches(4.0), Inches(5.6))

    bullets = [
        "• Chikungunya is a viral disease caused by the Chikungunya virus (CHIKV)",
        "• Name derives from the Kimakonde language meaning 'to become contorted'",
        "  — refers to the stooped posture due to severe joint pain",
        "• CHIKV is a single-stranded RNA virus (alphavirus, Togaviridae family)",
        "• Transmitted primarily by Aedes aegypti and Aedes albopictus mosquitoes",
        "• Humans are the primary reservoir during epidemic periods",
        "• NOT transmitted person-to-person (no airborne / droplet spread)",
        "• Globally re-emerging: 502,264 cases across 41 countries in 2025",
        "• Recent PAHO alert (Feb 2026): surge in cases across the Americas",
    ]
    add_bullets(sl, bullets, Inches(0.4), Inches(1.3), Inches(8.4), Inches(5.8),
                size=17, color=DARK, line_spacing=1.3)

    add_hline(sl, Inches(0.4), Inches(7.15), Inches(12.5), color=ORANGE)
    add_tb(sl, "Source: Red Book 2021 | PAHO Epidemiological Alert Feb 2026",
           Inches(0.4), Inches(7.2), Inches(12), Inches(0.25),
           size=10, italic=True, color=TEAL)

# ─────────────────────────────────────────────────────────────────
# SLIDE 3 — Virology & Transmission
# ─────────────────────────────────────────────────────────────────
def slide_virology(prs):
    sl = prs.slides.add_slide(BLANK)
    bg = sl.shapes.add_shape(1, 0, 0, W, H)
    fill_solid(bg, LIGHT_BG); no_line(bg)

    hdr = sl.shapes.add_shape(1, 0, 0, W, Inches(1.15))
    fill_solid(hdr, TEAL); no_line(hdr)
    add_tb(sl, "Virology & Transmission", Inches(0.4), Inches(0.18), Inches(10), Inches(0.8),
           size=34, bold=True, color=WHITE)

    # Left col: Virus biology
    add_box(sl, Inches(0.3), Inches(1.3), Inches(5.9), Inches(2.7), TEAL_LIGHT)
    add_tb(sl, "Virus Biology", Inches(0.45), Inches(1.35), Inches(5.6), Inches(0.45),
           size=17, bold=True, color=TEAL)
    vbio = [
        "• Family: Togaviridae  |  Genus: Alphavirus",
        "• Enveloped, positive-sense single-stranded RNA (~12 kb)",
        "• Envelope glycoproteins E1 & E2 mediate cell entry",
        "• Cell receptor: MXRA8 (matrix remodeling assoc. antigen 8)",
        "• Infects fibroblasts, epithelial cells, hepatocytes, neurons",
        "• Viremia lasts 5–7 days post-infection",
    ]
    add_bullets(sl, vbio, Inches(0.45), Inches(1.82), Inches(5.7), Inches(2.1),
                size=15, line_spacing=1.2)

    # Left col: Transmission
    add_box(sl, Inches(0.3), Inches(4.15), Inches(5.9), Inches(2.9), ORANGE_LIGHT)
    add_tb(sl, "Transmission Routes", Inches(0.45), Inches(4.2), Inches(5.6), Inches(0.45),
           size=17, bold=True, color=ORANGE)
    vtrans = [
        "• Primary: Bite of infected Aedes aegypti or Ae. albopictus",
        "• Bloodborne: documented in lab workers & healthcare staff",
        "• Vertical (in utero): rare; mostly in 2nd trimester",
        "• Intrapartum: when mother is viremic at delivery",
        "• NOT via breastfeeding | NOT via blood transfusion (to date)",
        "• Extrinsic incubation in mosquito: 2–10 days",
    ]
    add_bullets(sl, vtrans, Inches(0.45), Inches(4.65), Inches(5.7), Inches(2.3),
                size=15, line_spacing=1.2)

    # Right: mosquito cycle image
    add_img_url(sl,
        "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_7ad6496029f23a8c996fe6a3d391640f83570166a41828c598c139f6866cb60a.jpg",
        Inches(6.5), Inches(1.3), Inches(6.5), Inches(5.7))

    add_hline(sl, Inches(0.3), Inches(7.2), Inches(12.7), color=TEAL)
    add_tb(sl, "Source: Firestein & Kelley's Textbook of Rheumatology | Red Book 2021",
           Inches(0.3), Inches(7.25), Inches(12), Inches(0.2), size=10, italic=True, color=TEAL)

# ─────────────────────────────────────────────────────────────────
# SLIDE 4 — Epidemiology
# ─────────────────────────────────────────────────────────────────
def slide_epidemiology(prs):
    sl = prs.slides.add_slide(BLANK)
    bg = sl.shapes.add_shape(1, 0, 0, W, H)
    fill_solid(bg, LIGHT_BG); no_line(bg)

    hdr = sl.shapes.add_shape(1, 0, 0, W, Inches(1.15))
    fill_solid(hdr, DARK); no_line(hdr)
    add_tb(sl, "Global Epidemiology", Inches(0.4), Inches(0.18), Inches(10), Inches(0.8),
           size=34, bold=True, color=WHITE)

    # Three stat boxes at top
    stat_data = [
        ("502,264", "Reported cases globally in 2025\n(41 countries & territories)"),
        ("315,078", "Cases in the Americas alone\nduring 2025 (PAHO data)"),
        ("170", "Deaths in the Americas\nduring 2025"),
    ]
    for i, (num, label) in enumerate(stat_data):
        x = Inches(0.4 + i * 4.3)
        box = add_box(sl, x, Inches(1.3), Inches(4.0), Inches(1.5), ORANGE)
        add_tb(sl, num,  x + Inches(0.1), Inches(1.35), Inches(3.8), Inches(0.75),
               size=38, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
        add_tb(sl, label, x + Inches(0.1), Inches(2.05), Inches(3.8), Inches(0.65),
               size=12, color=WHITE, align=PP_ALIGN.CENTER)

    # Timeline / history bullets
    add_box(sl, Inches(0.3), Inches(3.0), Inches(7.8), Inches(4.1), TEAL_LIGHT)
    add_tb(sl, "Historical Timeline", Inches(0.45), Inches(3.05), Inches(7.5), Inches(0.4),
           size=17, bold=True, color=TEAL)
    hist = [
        "1952  — First identified in Tanzania (Newala district)",
        "2004–2007  — Major Indian Ocean & South Asian epidemics (millions affected)",
        "2007  — Local transmission in Italy (Ae. albopictus); first European outbreak",
        "2013  — First cases in the Americas (Caribbean islands)",
        "2014  — Rapid spread; >1 million suspected cases in the Americas",
        "2019  — WHO lists CHIKV among priority pathogens for R&D",
        "2025  — 502,264 global cases; re-emergence in Americas",
        "Feb 2026  — PAHO epidemiological alert; surge in multiple countries",
    ]
    add_bullets(sl, hist, Inches(0.45), Inches(3.5), Inches(7.6), Inches(3.5),
                size=14.5, line_spacing=1.2)

    # At-risk populations box
    add_box(sl, Inches(8.35), Inches(3.0), Inches(4.65), Inches(4.1), ORANGE_LIGHT)
    add_tb(sl, "High-Risk Groups", Inches(8.5), Inches(3.05), Inches(4.4), Inches(0.4),
           size=17, bold=True, color=ORANGE)
    risk = [
        "• Neonates (perinatal exposure)",
        "• Adults > 65 years",
        "• Hypertension / diabetes",
        "• Cardiovascular disease",
        "• Chronic kidney disease",
        "• Immunocompromised",
        "• Travelers to endemic areas",
    ]
    add_bullets(sl, risk, Inches(8.5), Inches(3.5), Inches(4.4), Inches(3.5),
                size=15, line_spacing=1.25)

    add_hline(sl, Inches(0.3), Inches(7.2), Inches(12.7), color=DARK)
    add_tb(sl, "Sources: PAHO Feb 2026 Alert | WHO 2025 data | Red Book 2021",
           Inches(0.3), Inches(7.25), Inches(12), Inches(0.2), size=10, italic=True, color=TEAL)

# ─────────────────────────────────────────────────────────────────
# SLIDE 5 — Clinical Features
# ─────────────────────────────────────────────────────────────────
def slide_clinical(prs):
    sl = prs.slides.add_slide(BLANK)
    bg = sl.shapes.add_shape(1, 0, 0, W, H)
    fill_solid(bg, LIGHT_BG); no_line(bg)

    hdr = sl.shapes.add_shape(1, 0, 0, W, Inches(1.15))
    fill_solid(hdr, ORANGE); no_line(hdr)
    add_tb(sl, "Clinical Features", Inches(0.4), Inches(0.18), Inches(10), Inches(0.8),
           size=34, bold=True, color=WHITE)

    # Phase boxes
    phases = [
        ("Acute Phase\n(Days 1–7)",
         "• Abrupt onset high fever (>39°C / 102°F)\n• Severe bilateral polyarthralgia\n  (hands, feet, ankles, wrists)\n• Maculopapular rash (trunk/extremities)\n• Headache, myalgia\n• Conjunctivitis, nausea, vomiting\n• Lab: lymphopenia, thrombocytopenia\n• Elevated creatinine & aminotransferases",
         TEAL, TEAL_LIGHT),
        ("Sub-acute Phase\n(Weeks 2–12)",
         "• Fever resolves but arthralgia persists\n• Distal joint polyarthritis\n• Tenosynovitis\n• Fatigue, depression\n• Possible rash relapse\n• Most patients recover fully\n  within 3 months",
         ORANGE, ORANGE_LIGHT),
        ("Chronic Phase\n(> 3 months)",
         "• Persistent arthralgia / arthritis\n  (up to 50% of adults)\n• Risk factors: age >50 yrs,\n  severe acute arthritis, OA\n• RA-like presentation possible\n• Neuropathic pain component\n• Median duration: months–years",
         DARK, RGBColor(0xD8, 0xD8, 0xE8)),
    ]
    for i, (title, content, hcolor, bcolor) in enumerate(phases):
        x = Inches(0.3 + i * 4.35)
        add_box(sl, x, Inches(1.3), Inches(4.1), Inches(5.6), bcolor)
        add_tb(sl, title, x + Inches(0.1), Inches(1.35), Inches(3.9), Inches(0.65),
               size=17, bold=True, color=hcolor, align=PP_ALIGN.CENTER)
        add_hline(sl, x + Inches(0.1), Inches(2.05), Inches(3.9), color=hcolor, thickness=Pt(1))
        cb_lines = content.split("\n")
        add_bullets(sl, cb_lines, x + Inches(0.1), Inches(2.15), Inches(3.9), Inches(4.6),
                    size=14.5, line_spacing=1.25)

    add_hline(sl, Inches(0.3), Inches(7.2), Inches(12.7), color=ORANGE)
    add_tb(sl, "Source: Red Book 2021 | Firestein & Kelley's Textbook of Rheumatology",
           Inches(0.3), Inches(7.25), Inches(12), Inches(0.2), size=10, italic=True, color=TEAL)

# ─────────────────────────────────────────────────────────────────
# SLIDE 6 — Rash & Complications (with images)
# ─────────────────────────────────────────────────────────────────
def slide_rash(prs):
    sl = prs.slides.add_slide(BLANK)
    bg = sl.shapes.add_shape(1, 0, 0, W, H)
    fill_solid(bg, LIGHT_BG); no_line(bg)

    hdr = sl.shapes.add_shape(1, 0, 0, W, Inches(1.15))
    fill_solid(hdr, TEAL); no_line(hdr)
    add_tb(sl, "Cutaneous Manifestations & Complications", Inches(0.4), Inches(0.18),
           Inches(12), Inches(0.8), size=34, bold=True, color=WHITE)

    # Images row
    imgs = [
        ("https://cdn.orris.care/cdss_images/pmc_clinical_VQA_2dc8d4091f443cd466cfb16ff9a3d2d66d2229043535f35e4ea840f73fa4ff6c.jpg",
         "Maculopapular rash — neck/chest\n(acute viral exanthem)"),
        ("https://cdn.orris.care/cdss_images/pmc_clinical_VQA_b3174275dfdf1e0f8f5b5db78e0ba4f520cfef461e001d0865fab7a30b77611e.jpg",
         "Polymorphic skin lesions:\nmacular → vesiculobullous → hemorrhagic"),
        ("https://cdn.orris.care/cdss_images/pmc_clinical_VQA_45d57e3230546c53f4cde27140eb88e9e6615528da2cc891d97d80bd3cc2986c.jpg",
         "Neonatal chikungunya:\nPetechial rash, requires ICU care"),
    ]
    for i, (url, caption) in enumerate(imgs):
        x = Inches(0.35 + i * 4.35)
        add_img_url(sl, url, x, Inches(1.3), Inches(4.0), Inches(3.3))
        add_tb(sl, caption, x, Inches(4.65), Inches(4.0), Inches(0.6),
               size=12, italic=True, color=DARK, align=PP_ALIGN.CENTER)

    # Complications box
    add_box(sl, Inches(0.3), Inches(5.45), Inches(12.7), Inches(1.75), ORANGE_LIGHT)
    add_tb(sl, "Severe / Rare Complications", Inches(0.45), Inches(5.5), Inches(12), Inches(0.4),
           size=17, bold=True, color=ORANGE)
    comp_txt = ("Neurological: Meningoencephalitis | Myelitis | Guillain-Barré | Cranial nerve palsies     "
                "Cardiac: Myocarditis     "
                "Ocular: Uveitis, Retinitis     "
                "Hepatic: Hepatitis     "
                "Renal: Nephritis     "
                "Neonatal: Acrocyanosis | Vesicobullous lesions | Limb edema")
    add_tb(sl, comp_txt, Inches(0.45), Inches(5.95), Inches(12.3), Inches(1.1),
           size=14, color=DARK, wrap=True)

    add_hline(sl, Inches(0.3), Inches(7.2), Inches(12.7), color=TEAL)
    add_tb(sl, "Source: Red Book 2021 | Firestein & Kelley's Textbook of Rheumatology | PMC clinical images",
           Inches(0.3), Inches(7.25), Inches(12), Inches(0.2), size=10, italic=True, color=TEAL)

# ─────────────────────────────────────────────────────────────────
# SLIDE 7 — Diagnosis
# ─────────────────────────────────────────────────────────────────
def slide_diagnosis(prs):
    sl = prs.slides.add_slide(BLANK)
    bg = sl.shapes.add_shape(1, 0, 0, W, H)
    fill_solid(bg, LIGHT_BG); no_line(bg)

    hdr = sl.shapes.add_shape(1, 0, 0, W, Inches(1.15))
    fill_solid(hdr, DARK); no_line(hdr)
    add_tb(sl, "Diagnosis", Inches(0.4), Inches(0.18), Inches(10), Inches(0.8),
           size=34, bold=True, color=WHITE)

    diag_cols = [
        ("Clinical Suspicion", TEAL, TEAL_LIGHT,
         ["• Acute febrile illness + severe polyarthralgia",
          "• Travel to / residence in endemic area",
          "• Symptom onset 3–7 days post-mosquito exposure",
          "• Must differentiate from Dengue and Zika",
          "  (similar epidemiology, can co-circulate)",
          "• Dengue: leukopenia, no prominent arthritis",
          "• Zika: milder fever, possible microcephaly"]),
        ("Laboratory Tests", ORANGE, ORANGE_LIGHT,
         ["RT-PCR (days 1–7):",
          "  • Gold standard for acute infection",
          "  • Detects CHIKV RNA in serum",
          "",
          "Serology (day 5+):",
          "  • IgM ELISA — persists 30–90 days",
          "  • Plaque-reduction neutralization test",
          "    (differentiates from Mayaro/o'nyong nyong)",
          "",
          "Other findings:",
          "  • Lymphopenia, thrombocytopenia",
          "  • ↑ creatinine, ↑ aminotransferases"]),
        ("Reporting & Testing Sites", DARK, RGBColor(0xD8, 0xD8, 0xE8),
         ["• Commercial labs: routine PCR & serology",
          "• State health dept labs",
          "• CDC labs: neutralization tests,",
          "  immunohistochemical staining",
          "",
          "Reporting (USA):",
          "• Nationally notifiable disease",
          "• Report to state/local health dept",
          "• CDC ArboNET surveillance system",
          "",
          "• Standard precautions for inpatients"]),
    ]
    for i, (title, hcol, bcol, bullets) in enumerate(diag_cols):
        x = Inches(0.3 + i * 4.35)
        add_box(sl, x, Inches(1.3), Inches(4.1), Inches(5.65), bcol)
        add_tb(sl, title, x + Inches(0.1), Inches(1.35), Inches(3.9), Inches(0.45),
               size=17, bold=True, color=hcol, align=PP_ALIGN.CENTER)
        add_hline(sl, x + Inches(0.1), Inches(1.85), Inches(3.9), color=hcol)
        add_bullets(sl, bullets, x + Inches(0.1), Inches(1.95), Inches(3.9), Inches(4.9),
                    size=14.5, line_spacing=1.2)

    add_hline(sl, Inches(0.3), Inches(7.2), Inches(12.7), color=DARK)
    add_tb(sl, "Source: Red Book 2021 | CDC Guidelines",
           Inches(0.3), Inches(7.25), Inches(12), Inches(0.2), size=10, italic=True, color=TEAL)

# ─────────────────────────────────────────────────────────────────
# SLIDE 8 — Treatment
# ─────────────────────────────────────────────────────────────────
def slide_treatment(prs):
    sl = prs.slides.add_slide(BLANK)
    bg = sl.shapes.add_shape(1, 0, 0, W, H)
    fill_solid(bg, LIGHT_BG); no_line(bg)

    hdr = sl.shapes.add_shape(1, 0, 0, W, Inches(1.15))
    fill_solid(hdr, ORANGE); no_line(hdr)
    add_tb(sl, "Treatment & Management", Inches(0.4), Inches(0.18), Inches(10), Inches(0.8),
           size=34, bold=True, color=WHITE)

    # No specific antiviral banner
    ban = add_box(sl, Inches(0.3), Inches(1.3), Inches(12.7), Inches(0.75),
                  RGBColor(0xFF, 0xEC, 0xB3))
    add_tb(sl, "⚠  No approved antiviral therapy exists for Chikungunya — management is entirely supportive",
           Inches(0.45), Inches(1.35), Inches(12.3), Inches(0.6),
           size=16, bold=True, color=RGBColor(0x7B, 0x4B, 0x00), align=PP_ALIGN.CENTER)

    # Treatment boxes
    tx_cols = [
        ("Acute Phase Care", TEAL, TEAL_LIGHT,
         ["• Rest and adequate fluid intake",
          "• Paracetamol (acetaminophen) — preferred",
          "  for fever and joint pain",
          "• Avoid NSAIDs until dengue ruled out",
          "  (risk of hemorrhagic complications)",
          "• Avoid aspirin in children",
          "• Monitor for severe complications"]),
        ("Chronic / Persistent Arthritis", ORANGE, ORANGE_LIGHT,
         ["• NSAIDs — once dengue excluded",
          "• Corticosteroids — for severe arthritis",
          "• Physiotherapy & rehabilitation",
          "• Hydroxychloroquine — some patients",
          "  with refractory arthritis",
          "• Methotrexate — severe persistent cases",
          "• Pain management (neuropathic component)"]),
        ("Hospitalisation Indications", DARK, RGBColor(0xD8, 0xD8, 0xE8),
         ["• Neurological complications",
          "  (encephalitis, Guillain-Barré)",
          "• Severe myocarditis / cardiac failure",
          "• Neonatal chikungunya",
          "• Elderly with multi-organ involvement",
          "• Hemorrhagic manifestations",
          "• Inability to maintain oral intake",
          "• Standard precautions apply"]),
    ]
    for i, (title, hcol, bcol, bullets) in enumerate(tx_cols):
        x = Inches(0.3 + i * 4.35)
        add_box(sl, x, Inches(2.2), Inches(4.1), Inches(4.8), bcol)
        add_tb(sl, title, x + Inches(0.1), Inches(2.25), Inches(3.9), Inches(0.45),
               size=17, bold=True, color=hcol, align=PP_ALIGN.CENTER)
        add_hline(sl, x + Inches(0.1), Inches(2.75), Inches(3.9), color=hcol)
        add_bullets(sl, bullets, x + Inches(0.1), Inches(2.85), Inches(3.9), Inches(4.0),
                    size=14.5, line_spacing=1.25)

    add_hline(sl, Inches(0.3), Inches(7.2), Inches(12.7), color=ORANGE)
    add_tb(sl, "Source: Red Book 2021 | Washington Manual of Medical Therapeutics",
           Inches(0.3), Inches(7.25), Inches(12), Inches(0.2), size=10, italic=True, color=TEAL)

# ─────────────────────────────────────────────────────────────────
# SLIDE 9 — Prevention & Control
# ─────────────────────────────────────────────────────────────────
def slide_prevention(prs):
    sl = prs.slides.add_slide(BLANK)
    bg = sl.shapes.add_shape(1, 0, 0, W, H)
    fill_solid(bg, LIGHT_BG); no_line(bg)

    hdr = sl.shapes.add_shape(1, 0, 0, W, Inches(1.15))
    fill_solid(hdr, TEAL); no_line(hdr)
    add_tb(sl, "Prevention & Control", Inches(0.4), Inches(0.18), Inches(10), Inches(0.8),
           size=34, bold=True, color=WHITE)

    # Left: personal protection
    add_box(sl, Inches(0.3), Inches(1.3), Inches(6.1), Inches(5.7), TEAL_LIGHT)
    add_tb(sl, "Personal Protection Measures", Inches(0.45), Inches(1.35), Inches(5.8), Inches(0.45),
           size=17, bold=True, color=TEAL)
    pers = [
        "• Use EPA-registered insect repellents",
        "  (DEET, picaridin, IR3535, oil of lemon eucalyptus)",
        "• Wear long-sleeved shirts and long trousers",
        "• Sleep under insecticide-treated bed nets",
        "• Stay in screened or air-conditioned rooms",
        "• Limit outdoor activity at peak mosquito feeding",
        "  times (dawn and dusk)",
        "• Use permethrin-treated clothing for travel",
    ]
    add_bullets(sl, pers, Inches(0.45), Inches(1.85), Inches(5.8), Inches(3.2),
                size=15.5, line_spacing=1.25)

    # Left lower: vaccine update
    add_box(sl, Inches(0.3), Inches(5.1), Inches(6.1), Inches(2.1), ORANGE_LIGHT)
    add_tb(sl, "Vaccine Status (2026)", Inches(0.45), Inches(5.15), Inches(5.8), Inches(0.4),
           size=17, bold=True, color=ORANGE)
    vacc = [
        "• IXCHIQ (Valneva VLA1553) — FDA-approved Nov 2023",
        "  Live attenuated vaccine; single-dose for adults ≥18 yrs",
        "• Indicated for travelers to endemic areas",
        "• Not yet for children or immunocompromised",
        "• WHO lists CHIKV as priority pathogen for R&D",
    ]
    add_bullets(sl, vacc, Inches(0.45), Inches(5.58), Inches(5.8), Inches(1.55),
                size=14, line_spacing=1.2)

    # Right: vector control
    add_box(sl, Inches(6.6), Inches(1.3), Inches(6.5), Inches(3.35), RGBColor(0xD8, 0xD8, 0xE8))
    add_tb(sl, "Vector Control", Inches(6.75), Inches(1.35), Inches(6.2), Inches(0.45),
           size=17, bold=True, color=DARK)
    vect = [
        "• Eliminate standing water (breeding sites)",
        "• Cover water storage containers",
        "• Larviciding of water bodies",
        "• Indoor residual spraying",
        "• Biological control (Bacillus thuringiensis)",
        "• Community-based surveillance and clean-up",
    ]
    add_bullets(sl, vect, Inches(6.75), Inches(1.85), Inches(6.2), Inches(2.7),
                size=15.5, line_spacing=1.25)

    # Right: surveillance & blood safety
    add_box(sl, Inches(6.6), Inches(4.75), Inches(6.5), Inches(2.45), TEAL_LIGHT)
    add_tb(sl, "Surveillance & Blood Safety", Inches(6.75), Inches(4.8), Inches(6.2), Inches(0.45),
           size=17, bold=True, color=TEAL)
    surv = [
        "• Protect symptomatic febrile patients from",
        "  mosquito bites to prevent further spread",
        "• Screen blood and organ donations",
        "• Report suspected cases to public health authorities",
        "• ArboNET surveillance (USA) | PAHO PLISA (Americas)",
    ]
    add_bullets(sl, surv, Inches(6.75), Inches(5.3), Inches(6.2), Inches(1.85),
                size=15, line_spacing=1.2)

    add_hline(sl, Inches(0.3), Inches(7.2), Inches(12.7), color=TEAL)
    add_tb(sl, "Source: Red Book 2021 | CDC | PAHO | FDA (IXCHIQ approval 2023)",
           Inches(0.3), Inches(7.25), Inches(12), Inches(0.2), size=10, italic=True, color=TEAL)

# ─────────────────────────────────────────────────────────────────
# SLIDE 10 — Differential Diagnosis
# ─────────────────────────────────────────────────────────────────
def slide_differential(prs):
    sl = prs.slides.add_slide(BLANK)
    bg = sl.shapes.add_shape(1, 0, 0, W, H)
    fill_solid(bg, LIGHT_BG); no_line(bg)

    hdr = sl.shapes.add_shape(1, 0, 0, W, Inches(1.15))
    fill_solid(hdr, DARK); no_line(hdr)
    add_tb(sl, "Differential Diagnosis", Inches(0.4), Inches(0.18), Inches(10), Inches(0.8),
           size=34, bold=True, color=WHITE)

    headers = ["Feature", "Chikungunya", "Dengue", "Zika"]
    rows = [
        ["Fever",          "High (>39°C), biphasic",    "High, sudden onset",    "Low-grade / absent"],
        ["Arthralgia",     "Severe, bilateral, distal", "Mild ('breakbone')",    "Mild, fleeting"],
        ["Rash",           "Maculopapular, trunk/limbs","Maculopapular",         "Diffuse maculopapular"],
        ["Hemorrhage",     "Rare",                      "Common (severe dengue)","Very rare"],
        ["Neurological",   "Rare but possible",         "Dengue encephalopathy", "Guillain-Barré, microcephaly"],
        ["Leucopenia",     "Mild lymphopenia",          "Prominent",             "Mild"],
        ["Thrombocytopenia","Mild",                     "Significant",           "Mild"],
        ["Transmission",   "Aedes mosquito",            "Aedes mosquito",        "Aedes mosquito + sexual"],
        ["Vaccine",        "IXCHIQ (FDA 2023)",         "Dengvaxia (limited)",   "None approved"],
    ]

    col_w = [Inches(2.4), Inches(3.4), Inches(3.4), Inches(3.4)]
    col_x = [Inches(0.3), Inches(2.75), Inches(6.2), Inches(9.65)]
    row_h = Inches(0.55)
    header_h = Inches(0.58)
    start_y = Inches(1.3)

    # Header row
    hdr_colors = [DARK, ORANGE, TEAL, RGBColor(0x55, 0x88, 0x22)]
    for ci, (h, cx, cw, hc) in enumerate(zip(headers, col_x, col_w, hdr_colors)):
        add_box(sl, cx, start_y, cw, header_h, hc)
        add_tb(sl, h, cx + Inches(0.05), start_y + Inches(0.05),
               cw - Inches(0.1), header_h - Inches(0.05),
               size=16, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
               valign=MSO_ANCHOR.MIDDLE)

    # Data rows
    even_colors = [LIGHT_BG, RGBColor(0xEE, 0xEE, 0xEE)]
    for ri, row in enumerate(rows):
        y = start_y + header_h + ri * row_h
        row_color = even_colors[ri % 2]
        for ci, (cell, cx, cw) in enumerate(zip(row, col_x, col_w)):
            box = sl.shapes.add_shape(1, cx, y, cw, row_h)
            fill_solid(box, row_color); no_line(box)
            fc = TEAL if ci == 1 else (ORANGE if ci == 2 else (RGBColor(0x33, 0x66, 0x11) if ci == 3 else DARK))
            add_tb(sl, cell, cx + Inches(0.07), y + Inches(0.04),
                   cw - Inches(0.1), row_h - Inches(0.05),
                   size=13, color=fc if ci > 0 else DARK,
                   bold=(ci == 0), valign=MSO_ANCHOR.MIDDLE)

    add_hline(sl, Inches(0.3), Inches(7.2), Inches(12.7), color=DARK)
    add_tb(sl, "Source: Red Book 2021 | Harrison's Principles of Internal Medicine 22E",
           Inches(0.3), Inches(7.25), Inches(12), Inches(0.2), size=10, italic=True, color=TEAL)

# ─────────────────────────────────────────────────────────────────
# SLIDE 11 — Key Takeaways
# ─────────────────────────────────────────────────────────────────
def slide_takeaways(prs):
    sl = prs.slides.add_slide(BLANK)
    bg = sl.shapes.add_shape(1, 0, 0, W, H)
    fill_solid(bg, DARK); no_line(bg)

    # Decorative circles
    c1 = sl.shapes.add_shape(9, Inches(-0.8), Inches(-0.8), Inches(4), Inches(4))
    fill_solid(c1, TEAL); no_line(c1)
    c2 = sl.shapes.add_shape(9, Inches(11.5), Inches(5.5), Inches(3.5), Inches(3.5))
    fill_solid(c2, ORANGE); no_line(c2)

    add_tb(sl, "Key Takeaways", Inches(0.5), Inches(0.25), Inches(10), Inches(0.85),
           size=36, bold=True, color=WHITE)
    add_hline(sl, Inches(0.5), Inches(1.15), Inches(8), color=ORANGE)

    points = [
        ("1", "CHIKV is a re-emerging global threat — 502K+ cases in 2025; PAHO issued alert in Feb 2026 for the Americas."),
        ("2", "Cardinal features: sudden high fever + severe, debilitating polyarthralgia + maculopapular rash."),
        ("3", "Transmitted by Aedes mosquitoes. No person-to-person spread; rare vertical and bloodborne transmission."),
        ("4", "Must differentiate from Dengue and Zika — all three arboviruses co-circulate in tropical regions."),
        ("5", "Diagnosis: RT-PCR in week 1; IgM serology from day 5. Notify public health authorities."),
        ("6", "Treatment is supportive only — no antiviral. Paracetamol first; NSAIDs / steroids for chronic arthritis."),
        ("7", "First vaccine (IXCHIQ) FDA-approved 2023 for adult travelers — marks a new era in CHIKV prevention."),
    ]

    for i, (num, text) in enumerate(points):
        y = Inches(1.3 + i * 0.85)
        circ = sl.shapes.add_shape(9, Inches(0.45), y + Inches(0.05), Inches(0.55), Inches(0.55))
        fill_solid(circ, ORANGE); no_line(circ)
        add_tb(sl, num, Inches(0.45), y + Inches(0.05), Inches(0.55), Inches(0.55),
               size=16, bold=True, color=WHITE, align=PP_ALIGN.CENTER, valign=MSO_ANCHOR.MIDDLE)
        add_tb(sl, text, Inches(1.15), y, Inches(11.5), Inches(0.8),
               size=16, color=WHITE, valign=MSO_ANCHOR.MIDDLE)

# ─────────────────────────────────────────────────────────────────
# BUILD
# ─────────────────────────────────────────────────────────────────
slide_title(prs)
slide_overview(prs)
slide_virology(prs)
slide_epidemiology(prs)
slide_clinical(prs)
slide_rash(prs)
slide_diagnosis(prs)
slide_treatment(prs)
slide_prevention(prs)
slide_differential(prs)
slide_takeaways(prs)

out_path = "/tmp/workspace/chikungunya-ppt/Chikungunya.pptx"
buf = BytesIO()
prs.save(buf)
with open(out_path, "wb") as f:
    f.write(buf.getvalue())
print(f"Saved: {out_path}  ({os.path.getsize(out_path):,} bytes)")
Running Command

cd /tmp/workspace/chikungunya-ppt && python build_ppt.py 2>&1

Editing File

~/chikungunya-ppt/build_ppt.py

Successfully replaced 1 instance(s) of the string in '/tmp/workspace/chikungunya-ppt/build_ppt.py'
Running Command

cd /tmp/workspace/chikungunya-ppt && python build_ppt.py 2>&1

Your Chikungunya presentation is ready!

Chikungunya

Presentation · PPTX


11 slides, 16:9 widescreen, with 4 real clinical photographs embedded.
Here's what each slide covers:
#SlideHighlights
1TitleDark navy + orange design
2What is Chikungunya?Definition, name origin, basic facts, 2026 outbreak context
3Virology & TransmissionRNA alphavirus structure, MXRA8 receptor, Aedes vector cycle diagram
4Global Epidemiology502,264 cases in 2025, PAHO Feb 2026 alert, historical timeline from 1952
5Clinical FeaturesAcute / sub-acute / chronic phase boxes (all 3 phases)
6Cutaneous Manifestations & Complications3 real clinical photos (macular rash, vesiculobullous lesions, neonatal ICU case)
7DiagnosisRT-PCR vs serology windows, lab findings, reporting to CDC ArboNET
8Treatment & ManagementSupportive-only banner, paracetamol-first rule, NSAIDs/hydroxychloroquine/methotrexate for chronic arthritis
9Prevention & ControlIXCHIQ vaccine (FDA 2023), personal protection, vector control, blood safety
10Differential DiagnosisSide-by-side comparison table: Chikungunya vs Dengue vs Zika
11Key Takeaways7 numbered summary points
Sources: Red Book 2021, Firestein & Kelley's Textbook of Rheumatology, Harrison's 22E, PAHO Feb 2026 epidemiological alert, FDA IXCHIQ approval.

Make pdf

Reading File
Running Command

cd /tmp/workspace/chikungunya-ppt && python -c " from pptx import Presentation from pptx.util import Inches, Pt prs = Presentation('Chikungunya.pptx') print(f'Slides: {len(prs.slides)}') print(f'Width: {prs.slide_width.inches:.2f} in, Height: {prs.slide_height.inches:.2f} in') for i, sl in enumerate(prs.slides, 1): shapes = len(sl.shapes) print(f' Slide {i}: {shapes} shapes') "

Writing File

~/chikungunya-ppt/pptx_to_pdf.py

"""
Convert Chikungunya.pptx → Chikungunya.pdf
Strategy: re-use the same slide content data already in build_ppt.py
but render each page with ReportLab directly (faithful recreation).
Each slide becomes one A3-landscape PDF page (same 13.33 x 7.5 in ratio).
"""

from reportlab.lib.pagesizes import landscape
from reportlab.lib.units import inch
from reportlab.pdfgen import canvas
from reportlab.lib import colors
from reportlab.lib.utils import ImageReader
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from io import BytesIO
import urllib.request, ssl, os

# ── Page size (matches 16:9 slide) ──────────────────────────────
W_IN = 13.333
H_IN = 7.5
W_PT = W_IN * inch
H_PT = H_IN * inch

# ── Colours (R,G,B 0-1) ─────────────────────────────────────────
def c(r, g, b): return (r/255, g/255, b/255)

ORANGE      = c(217, 83, 31)
DARK        = c(26, 26, 46)
WHITE       = c(255, 255, 255)
LIGHT_BG    = c(253, 246, 240)
TEAL        = c(15, 126, 138)
GREY        = c(204, 204, 204)
ORANGE_LIGHT= c(250, 208, 180)
TEAL_LIGHT  = c(178, 228, 232)
GREY_LIGHT  = c(216, 216, 232)
YELLOW_WARN = c(255, 236, 179)
ORANGE_DARK = c(123, 75, 0)
GREEN_DARK  = c(51, 102, 17)
EVEN_ROW    = c(238, 238, 238)

OUT = "/tmp/workspace/chikungunya-ppt/Chikungunya.pdf"

# ── Image cache ──────────────────────────────────────────────────
_img_cache = {}
def fetch_img(url):
    if url in _img_cache:
        return _img_cache[url]
    try:
        ctx = ssl.create_default_context()
        ctx.check_hostname = False
        ctx.verify_mode = ssl.CERT_NONE
        req = urllib.request.Request(url, headers={"User-Agent":"Mozilla/5.0"})
        with urllib.request.urlopen(req, timeout=20, context=ctx) as r:
            raw = r.read()
        ir = ImageReader(BytesIO(raw))
        _img_cache[url] = ir
        return ir
    except Exception as e:
        print(f"  img fail: {e}")
        return None

# ── Drawing helpers ──────────────────────────────────────────────
def rect(cv, x, y, w, h, fill, stroke=None, lw=0.5):
    """x,y,w,h in inches. y measured from TOP."""
    cv.saveState()
    cv.setFillColorRGB(*fill)
    if stroke:
        cv.setStrokeColorRGB(*stroke)
        cv.setLineWidth(lw)
    else:
        cv.setStrokeColorRGB(*fill)
    cv.rect(x*inch, (H_IN-y-h)*inch, w*inch, h*inch,
            fill=1, stroke=(1 if stroke else 0))
    cv.restoreState()

def img(cv, url, x, y, w, h):
    ir = fetch_img(url)
    if ir:
        cv.drawImage(ir, x*inch, (H_IN-y-h)*inch, w*inch, h*inch,
                     preserveAspectRatio=True, anchor='c', mask='auto')

def line(cv, x1, y1, x2, y2, color, lw=1.0):
    cv.saveState()
    cv.setStrokeColorRGB(*color)
    cv.setLineWidth(lw)
    cv.line(x1*inch, (H_IN-y1)*inch, x2*inch, (H_IN-y1)*inch)
    cv.restoreState()

def text(cv, txt, x, y, size=12, bold=False, italic=False,
         color=DARK, align='left', max_w=None):
    """Single-line text. y = top of text in inches from top."""
    cv.saveState()
    cv.setFillColorRGB(*color)
    if bold and italic:
        cv.setFont("Helvetica-BoldOblique", size)
    elif bold:
        cv.setFont("Helvetica-Bold", size)
    elif italic:
        cv.setFont("Helvetica-Oblique", size)
    else:
        cv.setFont("Helvetica", size)
    ty = (H_IN - y)*inch - size*0.7  # rough baseline
    if align == 'center' and max_w:
        cv.drawCentredString((x + max_w/2)*inch, ty, txt)
    elif align == 'right' and max_w:
        cv.drawRightString((x + max_w)*inch, ty, txt)
    else:
        cv.drawString(x*inch, ty, txt)
    cv.restoreState()

def wrap_text(cv, txt, x, y, max_w, size=12, bold=False, italic=False,
              color=DARK, line_h=None, align='left'):
    """Wrap text within max_w inches. Returns final y after last line."""
    if line_h is None:
        line_h = size * 1.35 / 72  # in inches
    cv.saveState()
    cv.setFillColorRGB(*color)
    if bold and italic:
        cv.setFont("Helvetica-BoldOblique", size)
    elif bold:
        cv.setFont("Helvetica-Bold", size)
    elif italic:
        cv.setFont("Helvetica-Oblique", size)
    else:
        cv.setFont("Helvetica", size)

    words = txt.split()
    current_line = ""
    cur_y = y
    for word in words:
        test = (current_line + " " + word).strip()
        w_pts = cv.stringWidth(test, cv._fontname, size)
        if w_pts / inch > max_w and current_line:
            baseline = (H_IN - cur_y)*inch - size*0.7
            if align == 'center':
                cv.drawCentredString((x + max_w/2)*inch, baseline, current_line)
            else:
                cv.drawString(x*inch, baseline, current_line)
            cur_y += line_h
            current_line = word
        else:
            current_line = test
    if current_line:
        baseline = (H_IN - cur_y)*inch - size*0.7
        if align == 'center':
            cv.drawCentredString((x + max_w/2)*inch, baseline, current_line)
        else:
            cv.drawString(x*inch, baseline, current_line)
        cur_y += line_h
    cv.restoreState()
    return cur_y

def bullets(cv, lines, x, y, max_w, size=12, color=DARK, line_h=None):
    if line_h is None:
        line_h = size * 1.4 / 72
    cy = y
    for ln in lines:
        cy = wrap_text(cv, ln, x, cy, max_w, size=size, color=color, line_h=line_h)
    return cy

# ── Header bar helper ────────────────────────────────────────────
def header(cv, title, bg_color):
    rect(cv, 0, 0, W_IN, 1.15, bg_color)
    wrap_text(cv, title, 0.4, 0.18, 12.5, size=34, bold=True, color=WHITE)

def footer(cv, src_txt):
    line(cv, 0.3, 7.2, 13.0, 7.2, TEAL, lw=0.7)
    text(cv, src_txt, 0.3, 7.28, size=9, italic=True, color=TEAL)

# ────────────────────────────────────────────────────────────────
# SLIDE RENDERERS
# ────────────────────────────────────────────────────────────────

def s1_title(cv):
    rect(cv, 0, 0, W_IN, H_IN, DARK)
    rect(cv, 0, 0, 0.6, H_IN, ORANGE)
    # decorative circles
    cv.saveState()
    cv.setFillColorRGB(*ORANGE)
    cv.circle(13.0*inch, (H_IN+0.5)*inch, 1.8*inch, fill=1, stroke=0)
    cv.setFillColorRGB(*TEAL)
    cv.circle(12.5*inch, 1.8*inch, 1.2*inch, fill=1, stroke=0)
    cv.restoreState()
    wrap_text(cv, "CHIKUNGUNYA", 1.1, 2.0, 9.5, size=60, bold=True, color=WHITE)
    wrap_text(cv, "A Mosquito-Borne Viral Disease", 1.1, 3.7, 9.0, size=26, italic=True, color=ORANGE_LIGHT)
    wrap_text(cv, "Epidemiology  |  Pathogenesis  |  Clinical Features  |  Diagnosis  |  Management  |  Prevention",
              1.1, 4.7, 11.0, size=13, color=GREY)
    line(cv, 1.1, 5.5, 10.0, 5.5, ORANGE, lw=1.5)

def s2_overview(cv):
    rect(cv, 0, 0, W_IN, H_IN, LIGHT_BG)
    header(cv, "What is Chikungunya?", ORANGE)
    img(cv,
        "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_7ad6496029f23a8c996fe6a3d391640f83570166a41828c598c139f6866cb60a.jpg",
        9.0, 1.3, 4.0, 5.6)
    bul = [
        "* Chikungunya is a viral disease caused by the Chikungunya virus (CHIKV)",
        "* Name derives from the Kimakonde language meaning 'to become contorted'",
        "  - refers to the stooped posture due to severe joint pain",
        "* CHIKV is a single-stranded RNA virus (Alphavirus, Togaviridae family)",
        "* Transmitted primarily by Aedes aegypti and Aedes albopictus mosquitoes",
        "* Humans are the primary reservoir during epidemic periods",
        "* NOT transmitted person-to-person (no airborne or droplet spread)",
        "* Globally re-emerging: 502,264 cases across 41 countries in 2025",
        "* PAHO alert (Feb 2026): surge of cases across the Americas",
    ]
    bullets(cv, bul, 0.4, 1.4, 8.3, size=15.5, color=DARK, line_h=0.32)
    footer(cv, "Source: Red Book 2021 | PAHO Epidemiological Alert Feb 2026")

def s3_virology(cv):
    rect(cv, 0, 0, W_IN, H_IN, LIGHT_BG)
    header(cv, "Virology & Transmission", TEAL)
    # virus bio box
    rect(cv, 0.3, 1.3, 5.9, 2.75, TEAL_LIGHT)
    text(cv, "Virus Biology", 0.45, 1.38, size=16, bold=True, color=TEAL)
    vbio = ["* Family: Togaviridae  |  Genus: Alphavirus",
            "* Enveloped positive-sense ssRNA (~12 kb)",
            "* Envelope glycoproteins E1 & E2 mediate cell entry",
            "* Cell receptor: MXRA8 (matrix remodeling assoc. antigen 8)",
            "* Infects fibroblasts, epithelial cells, hepatocytes, neurons",
            "* Viremia lasts 5-7 days post-infection"]
    bullets(cv, vbio, 0.45, 1.65, 5.6, size=14, color=DARK, line_h=0.28)
    # transmission box
    rect(cv, 0.3, 4.15, 5.9, 2.95, ORANGE_LIGHT)
    text(cv, "Transmission Routes", 0.45, 4.22, size=16, bold=True, color=ORANGE)
    vtrans = ["* Primary: Bite of infected Aedes aegypti or Ae. albopictus",
              "* Bloodborne: documented in lab workers & healthcare staff",
              "* Vertical (in utero): rare; mostly in 2nd trimester",
              "* Intrapartum: when mother is viremic at delivery",
              "* NOT via breastfeeding | NOT via blood transfusion (to date)",
              "* Extrinsic incubation in mosquito: 2-10 days"]
    bullets(cv, vtrans, 0.45, 4.52, 5.65, size=14, color=DARK, line_h=0.28)
    # image
    img(cv,
        "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_7ad6496029f23a8c996fe6a3d391640f83570166a41828c598c139f6866cb60a.jpg",
        6.5, 1.3, 6.5, 5.7)
    footer(cv, "Source: Firestein & Kelley's Textbook of Rheumatology | Red Book 2021")

def s4_epidemiology(cv):
    rect(cv, 0, 0, W_IN, H_IN, LIGHT_BG)
    header(cv, "Global Epidemiology", DARK)
    # stat boxes
    stats = [("502,264","Reported cases globally\nin 2025 (41 countries)"),
             ("315,078","Cases in the Americas\nduring 2025 (PAHO)"),
             ("170","Deaths in the Americas\nduring 2025")]
    for i,(num,lbl) in enumerate(stats):
        x = 0.4 + i*4.3
        rect(cv, x, 1.3, 4.0, 1.5, ORANGE)
        text(cv, num, x, 1.45, size=34, bold=True, color=WHITE, align='center', max_w=4.0)
        # split label
        for j,ln in enumerate(lbl.split("\n")):
            text(cv, ln, x, 2.15+j*0.22, size=12, color=WHITE, align='center', max_w=4.0)
    # history box
    rect(cv, 0.3, 3.05, 7.8, 4.1, TEAL_LIGHT)
    text(cv, "Historical Timeline", 0.45, 3.1, size=16, bold=True, color=TEAL)
    hist = ["1952  - First identified in Tanzania (Newala district)",
            "2004-2007  - Major Indian Ocean & South Asian epidemics",
            "2007  - Local transmission in Italy; first European outbreak",
            "2013  - First cases in the Americas (Caribbean islands)",
            "2014  - Rapid spread; >1 million suspected cases in Americas",
            "2019  - WHO lists CHIKV as priority pathogen for R&D",
            "2025  - 502,264 global cases; re-emergence in Americas",
            "Feb 2026  - PAHO alert; surge in multiple countries"]
    bullets(cv, hist, 0.45, 3.45, 7.5, size=13.5, color=DARK, line_h=0.27)
    # risk box
    rect(cv, 8.35, 3.05, 4.65, 4.1, ORANGE_LIGHT)
    text(cv, "High-Risk Groups", 8.5, 3.1, size=16, bold=True, color=ORANGE)
    risk = ["* Neonates (perinatal exposure)",
            "* Adults > 65 years",
            "* Hypertension / diabetes",
            "* Cardiovascular disease",
            "* Chronic kidney disease",
            "* Immunocompromised",
            "* Travelers to endemic areas"]
    bullets(cv, risk, 8.5, 3.45, 4.35, size=14, color=DARK, line_h=0.29)
    footer(cv, "Sources: PAHO Feb 2026 Alert | WHO 2025 data | Red Book 2021")

def s5_clinical(cv):
    rect(cv, 0, 0, W_IN, H_IN, LIGHT_BG)
    header(cv, "Clinical Features", ORANGE)
    phases = [
        ("Acute Phase (Days 1-7)", TEAL, TEAL_LIGHT,
         ["* Abrupt onset high fever (>39 deg C / 102 deg F)",
          "* Severe bilateral polyarthralgia",
          "  (hands, feet, ankles, wrists)",
          "* Maculopapular rash (trunk/extremities)",
          "* Headache, myalgia",
          "* Conjunctivitis, nausea, vomiting",
          "* Lab: lymphopenia, thrombocytopenia",
          "* Elevated creatinine & aminotransferases"]),
        ("Sub-acute Phase (Weeks 2-12)", ORANGE, ORANGE_LIGHT,
         ["* Fever resolves; arthralgia persists",
          "* Distal joint polyarthritis",
          "* Tenosynovitis",
          "* Fatigue, depression",
          "* Possible rash relapse",
          "* Most patients recover fully",
          "  within 3 months"]),
        ("Chronic Phase (> 3 months)", DARK, GREY_LIGHT,
         ["* Persistent arthralgia / arthritis",
          "  (up to 50% of adults)",
          "* Risk factors: age >50 yrs,",
          "  severe acute arthritis, OA",
          "* RA-like presentation possible",
          "* Neuropathic pain component",
          "* Duration: months to years"]),
    ]
    for i, (title, hcol, bcol, bul) in enumerate(phases):
        x = 0.3 + i * 4.35
        rect(cv, x, 1.3, 4.1, 5.65, bcol)
        wrap_text(cv, title, x+0.1, 1.38, 3.9, size=15, bold=True, color=hcol, align='center')
        line(cv, x+0.1, 1.88, x+4.0, 1.88, hcol, lw=0.8)
        bullets(cv, bul, x+0.15, 2.0, 3.8, size=13.5, color=DARK, line_h=0.27)
    footer(cv, "Source: Red Book 2021 | Firestein & Kelley's Textbook of Rheumatology")

def s6_rash(cv):
    rect(cv, 0, 0, W_IN, H_IN, LIGHT_BG)
    header(cv, "Cutaneous Manifestations & Complications", TEAL)
    imgs_data = [
        ("https://cdn.orris.care/cdss_images/pmc_clinical_VQA_2dc8d4091f443cd466cfb16ff9a3d2d66d2229043535f35e4ea840f73fa4ff6c.jpg",
         "Maculopapular rash - neck/chest (acute viral exanthem)"),
        ("https://cdn.orris.care/cdss_images/pmc_clinical_VQA_b3174275dfdf1e0f8f5b5db78e0ba4f520cfef461e001d0865fab7a30b77611e.jpg",
         "Polymorphic lesions: macular to vesiculobullous to hemorrhagic"),
        ("https://cdn.orris.care/cdss_images/pmc_clinical_VQA_45d57e3230546c53f4cde27140eb88e9e6615528da2cc891d97d80bd3cc2986c.jpg",
         "Neonatal chikungunya: petechial rash, ICU care required"),
    ]
    for i, (url, cap) in enumerate(imgs_data):
        x = 0.35 + i * 4.35
        img(cv, url, x, 1.3, 4.0, 3.3)
        wrap_text(cv, cap, x, 4.65, 4.0, size=11, italic=True, color=DARK, align='center')
    rect(cv, 0.3, 5.45, 12.7, 1.7, ORANGE_LIGHT)
    text(cv, "Severe / Rare Complications", 0.45, 5.52, size=16, bold=True, color=ORANGE)
    comp = ["Neurological: Meningoencephalitis | Myelitis | Guillain-Barre | Cranial nerve palsies",
            "Cardiac: Myocarditis     Ocular: Uveitis, Retinitis     Hepatic: Hepatitis     Renal: Nephritis",
            "Neonatal: Acrocyanosis | Vesicobullous lesions | Limb oedema     Haemorrhage (rare)"]
    bullets(cv, comp, 0.45, 5.95, 12.2, size=13.5, color=DARK, line_h=0.28)
    footer(cv, "Source: Red Book 2021 | Firestein & Kelley's Textbook of Rheumatology | PMC clinical images")

def s7_diagnosis(cv):
    rect(cv, 0, 0, W_IN, H_IN, LIGHT_BG)
    header(cv, "Diagnosis", DARK)
    cols = [
        ("Clinical Suspicion", TEAL, TEAL_LIGHT,
         ["* Acute febrile illness + severe polyarthralgia",
          "* Travel to/residence in endemic area",
          "* Symptom onset 3-7 days post-exposure",
          "* Must differentiate from Dengue & Zika",
          "  (similar epidemiology, can co-circulate)",
          "* Dengue: leukopenia, no prominent arthritis",
          "* Zika: milder fever, possible microcephaly"]),
        ("Laboratory Tests", ORANGE, ORANGE_LIGHT,
         ["RT-PCR (Days 1-7):",
          "  * Gold standard for acute infection",
          "  * Detects CHIKV RNA in serum",
          "Serology (Day 5+):",
          "  * IgM ELISA - persists 30-90 days",
          "  * Plaque-reduction neutralization test",
          "Other findings:",
          "  * Lymphopenia, thrombocytopenia",
          "  * Elevated creatinine & aminotransferases"]),
        ("Reporting & Testing", DARK, GREY_LIGHT,
         ["* Commercial labs: routine PCR & serology",
          "* State health dept labs",
          "* CDC: neutralization tests,",
          "  immunohistochemical staining",
          "Reporting (USA):",
          "* Nationally notifiable disease",
          "* Report to state/local health dept",
          "* CDC ArboNET surveillance system",
          "* Standard precautions for inpatients"]),
    ]
    for i, (title, hcol, bcol, bul) in enumerate(cols):
        x = 0.3 + i * 4.35
        rect(cv, x, 1.3, 4.1, 5.65, bcol)
        wrap_text(cv, title, x+0.1, 1.38, 3.9, size=15, bold=True, color=hcol, align='center')
        line(cv, x+0.1, 1.85, x+4.0, 1.85, hcol, lw=0.8)
        bullets(cv, bul, x+0.15, 1.97, 3.8, size=13.5, color=DARK, line_h=0.265)
    footer(cv, "Source: Red Book 2021 | CDC Guidelines")

def s8_treatment(cv):
    rect(cv, 0, 0, W_IN, H_IN, LIGHT_BG)
    header(cv, "Treatment & Management", ORANGE)
    rect(cv, 0.3, 1.3, 12.7, 0.72, YELLOW_WARN)
    wrap_text(cv, "No approved antiviral therapy exists for Chikungunya - management is entirely supportive",
              0.45, 1.38, 12.3, size=15, bold=True, color=ORANGE_DARK, align='center')
    cols = [
        ("Acute Phase Care", TEAL, TEAL_LIGHT,
         ["* Rest and adequate fluid intake",
          "* Paracetamol (acetaminophen) - preferred",
          "  for fever and joint pain",
          "* Avoid NSAIDs until dengue ruled out",
          "  (risk of haemorrhagic complications)",
          "* Avoid aspirin in children",
          "* Monitor for severe complications"]),
        ("Chronic / Persistent Arthritis", ORANGE, ORANGE_LIGHT,
         ["* NSAIDs - once dengue excluded",
          "* Corticosteroids - for severe arthritis",
          "* Physiotherapy & rehabilitation",
          "* Hydroxychloroquine - refractory cases",
          "* Methotrexate - severe persistent cases",
          "* Pain management (neuropathic component)"]),
        ("Hospitalisation Indications", DARK, GREY_LIGHT,
         ["* Neurological complications",
          "  (encephalitis, Guillain-Barre)",
          "* Severe myocarditis / cardiac failure",
          "* Neonatal chikungunya",
          "* Elderly with multi-organ involvement",
          "* Haemorrhagic manifestations",
          "* Inability to maintain oral intake",
          "* Standard precautions apply"]),
    ]
    for i, (title, hcol, bcol, bul) in enumerate(cols):
        x = 0.3 + i * 4.35
        rect(cv, x, 2.2, 4.1, 4.75, bcol)
        wrap_text(cv, title, x+0.1, 2.28, 3.9, size=15, bold=True, color=hcol, align='center')
        line(cv, x+0.1, 2.75, x+4.0, 2.75, hcol, lw=0.8)
        bullets(cv, bul, x+0.15, 2.87, 3.8, size=13.5, color=DARK, line_h=0.28)
    footer(cv, "Source: Red Book 2021 | Washington Manual of Medical Therapeutics")

def s9_prevention(cv):
    rect(cv, 0, 0, W_IN, H_IN, LIGHT_BG)
    header(cv, "Prevention & Control", TEAL)
    rect(cv, 0.3, 1.3, 6.1, 3.7, TEAL_LIGHT)
    text(cv, "Personal Protection Measures", 0.45, 1.38, size=16, bold=True, color=TEAL)
    pers = ["* Use EPA-registered insect repellents",
            "  (DEET, picaridin, IR3535, oil of lemon eucalyptus)",
            "* Wear long-sleeved shirts and long trousers",
            "* Sleep under insecticide-treated bed nets",
            "* Stay in screened or air-conditioned rooms",
            "* Limit outdoor activity at peak mosquito feeding",
            "  times (dawn and dusk)",
            "* Use permethrin-treated clothing for travel"]
    bullets(cv, pers, 0.45, 1.68, 5.8, size=14, color=DARK, line_h=0.27)
    rect(cv, 0.3, 5.1, 6.1, 2.1, ORANGE_LIGHT)
    text(cv, "Vaccine Status (2026)", 0.45, 5.17, size=16, bold=True, color=ORANGE)
    vacc = ["* IXCHIQ (Valneva VLA1553) - FDA-approved Nov 2023",
            "  Live attenuated; single-dose for adults >=18 yrs",
            "* Indicated for travelers to endemic areas",
            "* Not yet for children or immunocompromised",
            "* WHO lists CHIKV as R&D priority pathogen"]
    bullets(cv, vacc, 0.45, 5.47, 5.8, size=13.5, color=DARK, line_h=0.265)
    rect(cv, 6.6, 1.3, 6.5, 3.35, GREY_LIGHT)
    text(cv, "Vector Control", 6.75, 1.38, size=16, bold=True, color=DARK)
    vect = ["* Eliminate standing water (breeding sites)",
            "* Cover water storage containers",
            "* Larviciding of water bodies",
            "* Indoor residual spraying",
            "* Biological control (Bacillus thuringiensis)",
            "* Community-based surveillance and clean-up"]
    bullets(cv, vect, 6.75, 1.68, 6.2, size=14, color=DARK, line_h=0.27)
    rect(cv, 6.6, 4.75, 6.5, 2.45, TEAL_LIGHT)
    text(cv, "Surveillance & Blood Safety", 6.75, 4.82, size=16, bold=True, color=TEAL)
    surv = ["* Protect symptomatic febrile patients from",
            "  mosquito bites to prevent further spread",
            "* Screen blood and organ donations",
            "* Report suspected cases to public health authorities",
            "* ArboNET surveillance (USA) | PAHO PLISA (Americas)"]
    bullets(cv, surv, 6.75, 5.14, 6.2, size=14, color=DARK, line_h=0.27)
    footer(cv, "Source: Red Book 2021 | CDC | PAHO | FDA (IXCHIQ approval 2023)")

def s10_differential(cv):
    rect(cv, 0, 0, W_IN, H_IN, LIGHT_BG)
    header(cv, "Differential Diagnosis", DARK)
    headers_row = ["Feature", "Chikungunya", "Dengue", "Zika"]
    rows_data = [
        ["Fever",          "High (>39 C), biphasic",    "High, sudden onset",    "Low-grade / absent"],
        ["Arthralgia",     "Severe, bilateral, distal", "Mild ('breakbone')",    "Mild, fleeting"],
        ["Rash",           "Maculopapular, trunk/limbs","Maculopapular",         "Diffuse maculopapular"],
        ["Haemorrhage",    "Rare",                      "Common (severe dengue)","Very rare"],
        ["Neurological",   "Rare but possible",         "Dengue encephalopathy", "GBS, microcephaly"],
        ["Leucopenia",     "Mild lymphopenia",          "Prominent",             "Mild"],
        ["Thrombocytopenia","Mild",                     "Significant",           "Mild"],
        ["Transmission",   "Aedes mosquito",            "Aedes mosquito",        "Aedes + sexual"],
        ["Vaccine",        "IXCHIQ (FDA 2023)",         "Dengvaxia (limited)",   "None approved"],
    ]
    col_w = [2.35, 3.35, 3.35, 3.45]
    col_x = [0.3, 2.7, 6.1, 9.5]
    hdr_cols = [DARK, ORANGE, TEAL, c(55, 88, 22)]
    row_h = 0.55
    start_y = 1.3
    # header
    for ci,(h,cx,cw,hc) in enumerate(zip(headers_row, col_x, col_w, hdr_cols)):
        rect(cv, cx, start_y, cw, 0.58, hc)
        text(cv, h, cx, start_y+0.12, size=15, bold=True, color=WHITE, align='center', max_w=cw)
    # rows
    for ri, row in enumerate(rows_data):
        y = start_y + 0.58 + ri * row_h
        bg = LIGHT_BG if ri % 2 == 0 else EVEN_ROW
        for ci,(cell,cx,cw) in enumerate(zip(row,col_x,col_w)):
            rect(cv, cx, y, cw, row_h, bg)
            fc = TEAL if ci==1 else (ORANGE if ci==2 else (GREEN_DARK if ci==3 else DARK))
            wrap_text(cv, cell, cx+0.08, y+0.12, cw-0.15, size=12.5,
                      bold=(ci==0), color=fc if ci>0 else DARK)
    footer(cv, "Source: Red Book 2021 | Harrison's Principles of Internal Medicine 22E")

def s11_takeaways(cv):
    rect(cv, 0, 0, W_IN, H_IN, DARK)
    cv.saveState()
    cv.setFillColorRGB(*TEAL)
    cv.circle(-0.3*inch, (H_IN+0.3)*inch, 1.8*inch, fill=1, stroke=0)
    cv.setFillColorRGB(*ORANGE)
    cv.circle(12.8*inch, 0.7*inch, 1.4*inch, fill=1, stroke=0)
    cv.restoreState()
    text(cv, "Key Takeaways", 0.5, 0.28, size=36, bold=True, color=WHITE)
    line(cv, 0.5, 1.15, 8.5, 1.15, ORANGE, lw=1.5)
    points = [
        ("1", "CHIKV is a re-emerging global threat - 502K+ cases in 2025; PAHO issued alert Feb 2026 for the Americas."),
        ("2", "Cardinal features: sudden high fever + severe, debilitating polyarthralgia + maculopapular rash."),
        ("3", "Transmitted by Aedes mosquitoes. No person-to-person spread; rare vertical and bloodborne transmission."),
        ("4", "Must differentiate from Dengue and Zika - all three arboviruses co-circulate in tropical regions."),
        ("5", "Diagnosis: RT-PCR in week 1; IgM serology from day 5. Notify public health authorities promptly."),
        ("6", "Treatment is supportive only - no antiviral. Paracetamol first; NSAIDs/steroids for chronic arthritis."),
        ("7", "First vaccine (IXCHIQ) FDA-approved 2023 for adult travelers - a new era in CHIKV prevention."),
    ]
    for i, (num, pt) in enumerate(points):
        y = 1.3 + i * 0.85
        cv.saveState()
        cv.setFillColorRGB(*ORANGE)
        cv.circle((0.73)*inch, (H_IN - y - 0.27)*inch, 0.22*inch, fill=1, stroke=0)
        cv.restoreState()
        text(cv, num, 0.51, y+0.06, size=14, bold=True, color=WHITE, align='center', max_w=0.44)
        wrap_text(cv, pt, 1.1, y+0.02, 12.0, size=14.5, color=WHITE, line_h=0.26)

# ── Build PDF ────────────────────────────────────────────────────
cv = canvas.Canvas(OUT, pagesize=(W_PT, H_PT))
cv.setTitle("Chikungunya - A Mosquito-Borne Viral Disease")
cv.setAuthor("Orris Medical AI")
cv.setSubject("Chikungunya Epidemiology, Pathogenesis, Clinical Features, Diagnosis, Treatment, Prevention")

slides = [s1_title, s2_overview, s3_virology, s4_epidemiology,
          s5_clinical, s6_rash, s7_diagnosis, s8_treatment,
          s9_prevention, s10_differential, s11_takeaways]

for i, fn in enumerate(slides, 1):
    print(f"  Rendering slide {i}/{len(slides)}...", end=" ", flush=True)
    fn(cv)
    cv.showPage()
    print("done")

cv.save()
size = os.path.getsize(OUT)
print(f"\nSaved: {OUT}  ({size:,} bytes, {len(slides)} pages)")
Running Command

cd /tmp/workspace/chikungunya-ppt && python pptx_to_pdf.py 2>&1

All 11 slides rendered perfectly with all clinical images embedded. Your PDF is ready:

Chikungunya

PDF Document · PDF

567 KB | 11 pages | 16:9 widescreen landscape
The PDF contains all the same content as the PPTX - title slide, overview, virology & transmission, global epidemiology, clinical phases, cutaneous manifestations with 3 real clinical photographs, diagnosis, treatment, prevention (including the IXCHIQ vaccine update), differential diagnosis table (Chikungunya vs Dengue vs Zika), and the key takeaways summary.
This is a shared conversation. Sign in to Orris to start your own chat.