SLIDE 21 Emergency Response to PPH First 5 Minutes: "Golden Minutes" PPH is a medical emergency. Immediate action saves lives. Immediate Actions Recognize excessive bleeding. Activate the PPH emergency protocol. Call for senior obstetrician, anesthetist, pediatrician, blood bank, and nursing staff. Inform the operation theatre. Assign roles to team members. Record the time of diagnosis. Team Roles Team Member Responsibility Obstetrician Diagnose cause and control bleeding Anaesthetist Airway, circulation, resuscitation Nurses IV access, medications, monitoring Blood Bank Arrange blood and blood products Clinical Pearl: Never manage severe PPH alone. SLIDE 22 ABCDE Assessment A – Airway Ensure airway is patent. Position patient appropriately. Intubate if unconscious or airway is compromised. B – Breathing Administer 100% oxygen (10–15 L/min) via non-rebreather mask. Monitor SpO₂ continuously. C – Circulation Assess pulse and blood pressure. Insert two wide-bore (14G–16G) IV cannulas. Send blood for investigations. Start rapid fluid resuscitation. D – Disability Assess consciousness (AVPU/GCS). Check blood glucose if altered sensorium. E – Exposure Examine patient completely. Keep the patient warm to prevent hypothermia. SLIDE 23 Initial Resuscitation IV Access Two 14G–16G IV cannulas. Blood Samples CBC Blood grouping and cross-match PT/INR aPTT Fibrinogen Renal function tests Liver function tests ABG (if available) Monitoring Pulse Blood pressure Respiratory rate ECG SpO₂ Urine output Mental status Goal Restore circulating volume while controlling bleeding. SLIDE 24 Fluid Resuscitation Initial Fluids Warm isotonic crystalloids: Normal saline Ringer's lactate Recommendation Infuse 1–2 liters rapidly while arranging blood. Avoid Excessive crystalloids (>3 L) Delayed blood transfusion Monitoring Pulse Blood pressure Urine output Capillary refill Lactate (if available) Clinical Pearl Fluids temporarily restore circulation but do not replace blood loss. SLIDE 25 Blood and Blood Product Replacement Indications Continued bleeding Hemodynamic instability Hb <7 g/dL (or higher threshold if symptomatic) Blood Products Product Purpose Packed RBCs Restore oxygen-carrying capacity Fresh Frozen Plasma (FFP) Replace clotting factors Platelets Treat thrombocytopenia Cryoprecipitate Replace fibrinogen Massive Transfusion Protocol Approximate ratio: PRBC : FFP : Platelets = 1 : 1 : 1 Target Maintain: Hb >7–8 g/dL Platelets >50,000/µL Fibrinogen >2 g/L SLIDE 26 Uterine Massage Purpose Stimulates uterine contraction and reduces bleeding. Technique Place one hand over the uterine fundus. Massage using firm circular movements. Continue until the uterus becomes firm. Benefits Simple Immediate Effective in uterine atony Can be repeated Important Always perform uterine massage while preparing uterotonic drugs. Suggested Image: Technique of fundal massage. SLIDE 27 Uterotonic Drugs First-Line Medical Treatment Drug Dose Route Oxytocin 10 IU IM or slow IV Oxytocin infusion 20–40 IU in 1 L NS/RL IV infusion Methylergometrine 0.2 mg IM/slow IV Carboprost 250 µg IM (repeat every 15–90 min; max 8 doses) Misoprostol 800–1000 µg Rectal or sublingual Principle Use uterotonics early and do not delay escalation if bleeding continues. SLIDE 28 Oxytocin – Drug of Choice Mechanism Stimulates rhythmic uterine contractions. Compresses uterine blood vessels. Promotes hemostasis. Dose 10 IU IM after delivery OR 10 IU slow IV OR 20–40 IU in 1 L crystalloid as IV infusion. Advantages Rapid onset Highly effective Safe Few adverse effects Side Effects Hypotension (rapid IV bolus) Water intoxication (prolonged high-dose infusion) Clinical Pearl Oxytocin is the first-line uterotonic recommended by WHO. SLIDE 29 Other Uterotonics Methylergometrine Dose: 0.2 mg IM Contraindication: Hypertension Preeclampsia Heart disease Carboprost (15-methyl PGF₂α) Dose: 250 µg IM Repeat every 15–90 minutes Maximum: 8 doses Contraindication: Asthma Misoprostol Dose: 800–1000 µg Rectal or sublingual Advantages: Cheap Heat stable Useful in low-resource settings SLIDE 30 Tranexamic Acid (TXA) Mechanism Antifibrinolytic drug Prevents clot breakdown Stabilizes formed clots WHO Recommendation Administer within 3 hours of childbirth in women with PPH. Dose 1 g IV over 10 minutes Repeat 1 g if bleeding continues after 30 minutes or restarts within 24 hours. Benefits Reduces death due to bleeding Decreases need for surgery Effective for all causes of PPH when used early Contraindications Active thromboembolic disease (relative) Known hypersensitivity Key Message TXA should be given as early as possible along with standard PPH treatment—it is not a substitute for uterotonics or surgery.
ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace not found"
mkdir -p /home/daytona/workspace/pph-slides
~/pph-slides/create_pph_slides.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Emergency Response to PPH";
// ─── THEME ──────────────────────────────────────────────────────────────────
const C = {
darkBg: "1A1F2E", // deep navy – title/accent slides
midBg: "1E3A5F", // mid blue – section header variant
lightBg: "F0F4F8", // near-white – body slides
accent: "E63946", // emergency red
gold: "F4A261", // warm amber – clinical pearl
teal: "2A9D8F", // teal – tables / highlights
textDark: "1A1F2E",
textLight: "FFFFFF",
textGray: "4A5568",
tableHdr: "1E3A5F",
tableAlt: "E8F0F7",
};
// ─── HELPERS ─────────────────────────────────────────────────────────────────
function slideTitle(slide, title, subtitle) {
// Red left bar
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.18, h: 5.625, fill: { color: C.accent } });
slide.addText(title, {
x: 0.35, y: 0.18, w: 9.4, h: 0.62,
fontSize: 22, bold: true, color: C.darkBg, fontFace: "Calibri",
margin: 0,
});
if (subtitle) {
slide.addText(subtitle, {
x: 0.35, y: 0.82, w: 9.4, h: 0.32,
fontSize: 12, color: C.accent, fontFace: "Calibri", bold: true,
margin: 0, charSpacing: 1,
});
}
// thin divider
slide.addShape(pres.ShapeType.rect, { x: 0.35, y: 1.18, w: 9.3, h: 0.04, fill: { color: C.accent } });
}
function slideNumber(slide, num) {
slide.addText(`${num}`, {
x: 9.3, y: 5.3, w: 0.6, h: 0.24,
fontSize: 9, color: C.textGray, align: "right", fontFace: "Calibri",
});
}
function pearl(slide, text, x, y, w, h) {
slide.addShape(pres.ShapeType.rect, { x, y, w, h: h || 0.55, fill: { color: "FFF3E0" }, line: { color: C.gold, width: 1.5 } });
slide.addText([
{ text: "★ Clinical Pearl: ", options: { bold: true, color: C.gold } },
{ text, options: { color: "5D4037" } },
], { x: x + 0.1, y: y + 0.04, w: w - 0.2, h: (h || 0.55) - 0.08, fontSize: 10, fontFace: "Calibri" });
}
function bulletList(slide, items, x, y, w, h, size) {
const parts = items.map((it, i) => ({
text: it,
options: { bullet: { code: "25CF", color: C.accent }, breakLine: i < items.length - 1, color: C.textDark, fontSize: size || 12, fontFace: "Calibri" },
}));
slide.addText(parts, { x, y, w, h });
}
function subBulletList(slide, groups, x, y, w, h) {
// groups = [{label, items:[]}]
const parts = [];
groups.forEach((g, gi) => {
parts.push({ text: g.label, options: { bullet: { code: "25CF", color: C.accent }, bold: true, color: C.textDark, fontSize: 12, fontFace: "Calibri", breakLine: true } });
g.items.forEach((it, ii) => {
const isLast = gi === groups.length - 1 && ii === g.items.length - 1;
parts.push({ text: it, options: { bullet: { indent: 20, code: "2013" }, color: C.textGray, fontSize: 11, fontFace: "Calibri", indentLevel: 1, breakLine: !isLast } });
});
});
slide.addText(parts, { x, y, w, h });
}
// ─── SLIDE 21 ──────────────────────────────────────────────────────────────
(function slide21() {
const s = pres.addSlide();
// dark navy bg
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.darkBg } });
// red top bar
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.6, fill: { color: C.accent } });
s.addText("SLIDE 21 | Emergency Response to PPH", {
x: 0.3, y: 0.1, w: 9.4, h: 0.4,
fontSize: 13, bold: true, color: C.textLight, fontFace: "Calibri",
});
s.addText("First 5 Minutes: Golden Minutes", {
x: 0.5, y: 0.78, w: 9, h: 0.5,
fontSize: 20, bold: true, color: C.gold, fontFace: "Calibri", charSpacing: 1,
});
s.addText("PPH is a medical emergency. Immediate action saves lives.", {
x: 0.5, y: 1.28, w: 9, h: 0.35,
fontSize: 13, italic: true, color: "90CAF9", fontFace: "Calibri",
});
// LEFT col – Immediate Actions
s.addShape(pres.ShapeType.rect, { x: 0.4, y: 1.75, w: 4.3, h: 0.38, fill: { color: C.accent } });
s.addText("Immediate Actions", { x: 0.4, y: 1.75, w: 4.3, h: 0.38, fontSize: 13, bold: true, color: C.textLight, align: "center", fontFace: "Calibri" });
const leftItems = [
"Recognize excessive bleeding",
"Activate the PPH emergency protocol",
"Call for senior obstetrician, anaesthetist,\npediatrician, blood bank & nursing staff",
"Inform the operation theatre",
"Assign roles to team members",
"Record the time of diagnosis",
];
const leftParts = leftItems.map((it, i) => ({
text: it,
options: { bullet: { code: "25CF", color: C.gold }, breakLine: i < leftItems.length - 1, color: C.textLight, fontSize: 11, fontFace: "Calibri" },
}));
s.addText(leftParts, { x: 0.4, y: 2.18, w: 4.3, h: 2.8 });
// RIGHT col – Team Roles table
s.addShape(pres.ShapeType.rect, { x: 5.1, y: 1.75, w: 4.5, h: 0.38, fill: { color: C.teal } });
s.addText("Team Roles", { x: 5.1, y: 1.75, w: 4.5, h: 0.38, fontSize: 13, bold: true, color: C.textLight, align: "center", fontFace: "Calibri" });
const tableRows = [
[{ text: "Team Member", options: { bold: true, color: C.textLight, fontSize: 11, fill: C.tableHdr } }, { text: "Responsibility", options: { bold: true, color: C.textLight, fontSize: 11, fill: C.tableHdr } }],
[{ text: "Obstetrician", options: { fontSize: 10 } }, { text: "Diagnose cause and control bleeding", options: { fontSize: 10 } }],
[{ text: "Anaesthetist", options: { fontSize: 10 } }, { text: "Airway, circulation, resuscitation", options: { fontSize: 10 } }],
[{ text: "Nurses", options: { fontSize: 10 } }, { text: "IV access, medications, monitoring", options: { fontSize: 10 } }],
[{ text: "Blood Bank", options: { fontSize: 10 } }, { text: "Arrange blood and blood products", options: { fontSize: 10 } }],
];
s.addTable(tableRows, {
x: 5.1, y: 2.18, w: 4.5, h: 2.0,
colW: [1.8, 2.7],
border: { type: "solid", color: "455A64", pt: 0.5 },
fill: { color: "263238" },
fontFace: "Calibri",
align: "left",
});
// Clinical pearl
s.addShape(pres.ShapeType.rect, { x: 0.4, y: 4.85, w: 9.2, h: 0.52, fill: { color: "1C2B1A" }, line: { color: C.gold, width: 1.5 } });
s.addText([
{ text: "★ Clinical Pearl: ", options: { bold: true, color: C.gold } },
{ text: "Never manage severe PPH alone.", options: { color: "A5D6A7" } },
], { x: 0.5, y: 4.88, w: 9, h: 0.44, fontSize: 11, fontFace: "Calibri" });
slideNumber(s, 21);
})();
// ─── SLIDE 22 ──────────────────────────────────────────────────────────────
(function slide22() {
const s = pres.addSlide();
s.background = { color: C.lightBg };
slideTitle(s, "ABCDE Assessment", "SLIDE 22");
const steps = [
{ letter: "A", label: "Airway", color: "C62828", items: ["Ensure airway is patent", "Position patient appropriately", "Intubate if unconscious or airway compromised"] },
{ letter: "B", label: "Breathing", color: "1565C0", items: ["Administer 100% O₂ (10–15 L/min) via non-rebreather mask", "Monitor SpO₂ continuously"] },
{ letter: "C", label: "Circulation", color: "2E7D32", items: ["Assess pulse and blood pressure", "Insert two wide-bore (14G–16G) IV cannulas", "Send blood for investigations", "Start rapid fluid resuscitation"] },
{ letter: "D", label: "Disability", color: "6A1B9A", items: ["Assess consciousness (AVPU/GCS)", "Check blood glucose if altered sensorium"] },
{ letter: "E", label: "Exposure", color: "E65100", items: ["Examine patient completely", "Keep patient warm to prevent hypothermia"] },
];
const boxW = 1.82;
const boxH = 3.8;
const startX = 0.22;
steps.forEach((step, i) => {
const x = startX + i * (boxW + 0.06);
// colored header
s.addShape(pres.ShapeType.rect, { x, y: 1.32, w: boxW, h: 0.72, fill: { color: step.color }, rectRadius: 0 });
s.addText(`${step.letter} — ${step.label}`, { x, y: 1.32, w: boxW, h: 0.72, fontSize: 13, bold: true, color: C.textLight, align: "center", valign: "middle", fontFace: "Calibri" });
// white card
s.addShape(pres.ShapeType.rect, { x, y: 2.05, w: boxW, h: boxH - 0.73, fill: { color: "FFFFFF" }, line: { color: "CFD8DC", width: 0.5 } });
const pts = step.items.map((it, ii) => ({
text: it,
options: { bullet: { code: "2022", color: step.color }, breakLine: ii < step.items.length - 1, color: C.textDark, fontSize: 9.5, fontFace: "Calibri" },
}));
s.addText(pts, { x: x + 0.08, y: 2.1, w: boxW - 0.16, h: boxH - 0.9 });
});
slideNumber(s, 22);
})();
// ─── SLIDE 23 ──────────────────────────────────────────────────────────────
(function slide23() {
const s = pres.addSlide();
s.background = { color: C.lightBg };
slideTitle(s, "Initial Resuscitation", "SLIDE 23");
// 3-column layout
const colY = 1.35;
const colH = 3.55;
// Col 1 – IV Access + Blood Samples
s.addShape(pres.ShapeType.rect, { x: 0.3, y: colY, w: 3.0, h: 0.38, fill: { color: C.teal } });
s.addText("IV Access", { x: 0.3, y: colY, w: 3.0, h: 0.38, fontSize: 12, bold: true, color: C.textLight, align: "center", fontFace: "Calibri" });
s.addShape(pres.ShapeType.rect, { x: 0.3, y: colY + 0.38, w: 3.0, h: 0.5, fill: { color: "FFFFFF" }, line: { color: "B0BEC5" } });
s.addText("Two 14G–16G IV cannulas", { x: 0.35, y: colY + 0.42, w: 2.9, h: 0.42, fontSize: 11, color: C.textDark, fontFace: "Calibri" });
s.addShape(pres.ShapeType.rect, { x: 0.3, y: colY + 1.0, w: 3.0, h: 0.38, fill: { color: C.teal } });
s.addText("Blood Samples", { x: 0.3, y: colY + 1.0, w: 3.0, h: 0.38, fontSize: 12, bold: true, color: C.textLight, align: "center", fontFace: "Calibri" });
const bloodItems = ["CBC", "Blood grouping & cross-match", "PT/INR", "aPTT", "Fibrinogen", "Renal function tests", "Liver function tests", "ABG (if available)"];
const bloodParts = bloodItems.map((it, i) => ({
text: it,
options: { bullet: { code: "25BA", color: C.teal }, breakLine: i < bloodItems.length - 1, color: C.textDark, fontSize: 10.5, fontFace: "Calibri" },
}));
s.addShape(pres.ShapeType.rect, { x: 0.3, y: colY + 1.38, w: 3.0, h: 2.5, fill: { color: "FFFFFF" }, line: { color: "B0BEC5" } });
s.addText(bloodParts, { x: 0.38, y: colY + 1.44, w: 2.84, h: 2.4 });
// Col 2 – Monitoring
s.addShape(pres.ShapeType.rect, { x: 3.6, y: colY, w: 3.0, h: 0.38, fill: { color: C.accent } });
s.addText("Monitoring", { x: 3.6, y: colY, w: 3.0, h: 0.38, fontSize: 12, bold: true, color: C.textLight, align: "center", fontFace: "Calibri" });
const monItems = ["Pulse", "Blood pressure", "Respiratory rate", "ECG", "SpO₂", "Urine output", "Mental status"];
const monParts = monItems.map((it, i) => ({
text: it,
options: { bullet: { code: "25CF", color: C.accent }, breakLine: i < monItems.length - 1, color: C.textDark, fontSize: 11, fontFace: "Calibri" },
}));
s.addShape(pres.ShapeType.rect, { x: 3.6, y: colY + 0.38, w: 3.0, h: 2.0, fill: { color: "FFFFFF" }, line: { color: "B0BEC5" } });
s.addText(monParts, { x: 3.68, y: colY + 0.44, w: 2.84, h: 1.9 });
// Col 3 – Goal
s.addShape(pres.ShapeType.rect, { x: 6.9, y: colY, w: 2.8, h: 0.38, fill: { color: C.darkBg } });
s.addText("Goal", { x: 6.9, y: colY, w: 2.8, h: 0.38, fontSize: 12, bold: true, color: C.textLight, align: "center", fontFace: "Calibri" });
s.addShape(pres.ShapeType.rect, { x: 6.9, y: colY + 0.38, w: 2.8, h: 1.2, fill: { color: C.darkBg } });
s.addText("Restore circulating volume while controlling bleeding.", {
x: 7.0, y: colY + 0.44, w: 2.6, h: 1.1,
fontSize: 12, color: C.textLight, fontFace: "Calibri", align: "center", valign: "middle", italic: true,
});
slideNumber(s, 23);
})();
// ─── SLIDE 24 ──────────────────────────────────────────────────────────────
(function slide24() {
const s = pres.addSlide();
s.background = { color: C.lightBg };
slideTitle(s, "Fluid Resuscitation", "SLIDE 24");
// Cards row
const cards = [
{ title: "Initial Fluids", color: C.teal, items: ["Warm isotonic crystalloids:", "• Normal saline", "• Ringer's lactate"] },
{ title: "Recommendation", color: C.accent, items: ["Infuse 1–2 liters rapidly while arranging blood."] },
{ title: "Avoid", color: "C62828", items: ["Excessive crystalloids (>3 L)", "Delayed blood transfusion"] },
{ title: "Monitoring", color: C.midBg, items: ["Pulse", "Blood pressure", "Urine output", "Capillary refill", "Lactate (if available)"] },
];
cards.forEach((card, i) => {
const x = 0.3 + i * 2.38;
s.addShape(pres.ShapeType.rect, { x, y: 1.35, w: 2.2, h: 0.42, fill: { color: card.color } });
s.addText(card.title, { x, y: 1.35, w: 2.2, h: 0.42, fontSize: 12, bold: true, color: C.textLight, align: "center", valign: "middle", fontFace: "Calibri" });
s.addShape(pres.ShapeType.rect, { x, y: 1.77, w: 2.2, h: 2.6, fill: { color: "FFFFFF" }, line: { color: "CFD8DC" } });
const pts = card.items.map((it, ii) => ({
text: it,
options: { bullet: it.startsWith("•") ? false : { code: "25CF", color: card.color }, breakLine: ii < card.items.length - 1, color: C.textDark, fontSize: 10.5, fontFace: "Calibri" },
}));
s.addText(pts, { x: x + 0.1, y: 1.83, w: 2.0, h: 2.5 });
});
// Clinical pearl
s.addShape(pres.ShapeType.rect, { x: 0.3, y: 4.7, w: 9.4, h: 0.62, fill: { color: "FFF8E1" }, line: { color: C.gold, width: 1.5 } });
s.addText([
{ text: "★ Clinical Pearl: ", options: { bold: true, color: C.gold } },
{ text: "Fluids temporarily restore circulation but do not replace blood loss.", options: { color: "5D4037" } },
], { x: 0.4, y: 4.73, w: 9.2, h: 0.54, fontSize: 11, fontFace: "Calibri" });
slideNumber(s, 24);
})();
// ─── SLIDE 25 ──────────────────────────────────────────────────────────────
(function slide25() {
const s = pres.addSlide();
s.background = { color: C.lightBg };
slideTitle(s, "Blood and Blood Product Replacement", "SLIDE 25");
// Indications
s.addShape(pres.ShapeType.rect, { x: 0.3, y: 1.35, w: 3.0, h: 0.36, fill: { color: C.accent } });
s.addText("Indications", { x: 0.3, y: 1.35, w: 3.0, h: 0.36, fontSize: 12, bold: true, color: C.textLight, align: "center", fontFace: "Calibri" });
const indItems = ["Continued bleeding", "Hemodynamic instability", "Hb <7 g/dL (or higher threshold if symptomatic)"];
const indParts = indItems.map((it, i) => ({
text: it, options: { bullet: { code: "25CF", color: C.accent }, breakLine: i < indItems.length - 1, color: C.textDark, fontSize: 11, fontFace: "Calibri" },
}));
s.addShape(pres.ShapeType.rect, { x: 0.3, y: 1.71, w: 3.0, h: 0.9, fill: { color: "FFFFFF" }, line: { color: "CFD8DC" } });
s.addText(indParts, { x: 0.38, y: 1.75, w: 2.84, h: 0.82 });
// Blood Products table
s.addShape(pres.ShapeType.rect, { x: 3.6, y: 1.35, w: 6.1, h: 0.36, fill: { color: C.tableHdr } });
s.addText("Blood Products", { x: 3.6, y: 1.35, w: 6.1, h: 0.36, fontSize: 12, bold: true, color: C.textLight, align: "center", fontFace: "Calibri" });
const prodRows = [
[{ text: "Product", options: { bold: true, color: C.textLight, fill: C.teal, fontSize: 10 } }, { text: "Purpose", options: { bold: true, color: C.textLight, fill: C.teal, fontSize: 10 } }],
[{ text: "Packed RBCs", options: { fontSize: 10 } }, { text: "Restore oxygen-carrying capacity", options: { fontSize: 10 } }],
[{ text: "Fresh Frozen Plasma (FFP)", options: { fontSize: 10 } }, { text: "Replace clotting factors", options: { fontSize: 10 } }],
[{ text: "Platelets", options: { fontSize: 10 } }, { text: "Treat thrombocytopenia", options: { fontSize: 10 } }],
[{ text: "Cryoprecipitate", options: { fontSize: 10 } }, { text: "Replace fibrinogen", options: { fontSize: 10 } }],
];
s.addTable(prodRows, {
x: 3.6, y: 1.71, w: 6.1, h: 1.5,
colW: [2.8, 3.3],
border: { type: "solid", color: "B0BEC5", pt: 0.5 },
fontFace: "Calibri",
align: "left",
});
// MTP section
s.addShape(pres.ShapeType.rect, { x: 0.3, y: 2.75, w: 4.5, h: 0.36, fill: { color: C.midBg } });
s.addText("Massive Transfusion Protocol (MTP)", { x: 0.3, y: 2.75, w: 4.5, h: 0.36, fontSize: 11, bold: true, color: C.textLight, align: "center", fontFace: "Calibri" });
s.addShape(pres.ShapeType.rect, { x: 0.3, y: 3.11, w: 4.5, h: 0.78, fill: { color: "FFFFFF" }, line: { color: "B0BEC5" } });
s.addText([
{ text: "PRBC : FFP : Platelets", options: { bold: true, color: C.textDark, fontSize: 13 } },
{ text: "\n = 1 : 1 : 1", options: { bold: true, color: C.accent, fontSize: 18 } },
], { x: 0.4, y: 3.13, w: 4.3, h: 0.72, fontFace: "Calibri" });
// Targets
s.addShape(pres.ShapeType.rect, { x: 5.1, y: 2.75, w: 4.6, h: 0.36, fill: { color: C.teal } });
s.addText("Targets", { x: 5.1, y: 2.75, w: 4.6, h: 0.36, fontSize: 11, bold: true, color: C.textLight, align: "center", fontFace: "Calibri" });
s.addShape(pres.ShapeType.rect, { x: 5.1, y: 3.11, w: 4.6, h: 0.78, fill: { color: "FFFFFF" }, line: { color: "B0BEC5" } });
const tgtParts = [
{ text: "Hb > 7–8 g/dL", options: { bullet: { code: "25CF", color: C.teal }, breakLine: true, color: C.textDark, fontSize: 11, fontFace: "Calibri" } },
{ text: "Platelets > 50,000/µL", options: { bullet: { code: "25CF", color: C.teal }, breakLine: true, color: C.textDark, fontSize: 11, fontFace: "Calibri" } },
{ text: "Fibrinogen > 2 g/L", options: { bullet: { code: "25CF", color: C.teal }, color: C.textDark, fontSize: 11, fontFace: "Calibri" } },
];
s.addText(tgtParts, { x: 5.18, y: 3.15, w: 4.42, h: 0.7 });
slideNumber(s, 25);
})();
// ─── SLIDE 26 ──────────────────────────────────────────────────────────────
(function slide26() {
const s = pres.addSlide();
s.background = { color: C.lightBg };
slideTitle(s, "Uterine Massage", "SLIDE 26");
// Purpose
s.addShape(pres.ShapeType.rect, { x: 0.3, y: 1.35, w: 4.4, h: 0.36, fill: { color: C.teal } });
s.addText("Purpose", { x: 0.3, y: 1.35, w: 4.4, h: 0.36, fontSize: 12, bold: true, color: C.textLight, align: "center", fontFace: "Calibri" });
s.addShape(pres.ShapeType.rect, { x: 0.3, y: 1.71, w: 4.4, h: 0.5, fill: { color: "FFFFFF" }, line: { color: "B0BEC5" } });
s.addText("Stimulates uterine contraction and reduces bleeding.", { x: 0.38, y: 1.74, w: 4.24, h: 0.44, fontSize: 11, color: C.textDark, fontFace: "Calibri" });
// Technique
s.addShape(pres.ShapeType.rect, { x: 0.3, y: 2.3, w: 4.4, h: 0.36, fill: { color: C.accent } });
s.addText("Technique", { x: 0.3, y: 2.3, w: 4.4, h: 0.36, fontSize: 12, bold: true, color: C.textLight, align: "center", fontFace: "Calibri" });
const techItems = ["Place one hand over the uterine fundus", "Massage using firm circular movements", "Continue until the uterus becomes firm"];
const techParts = techItems.map((it, i) => ({
text: it, options: { bullet: { code: "25CF", color: C.accent }, breakLine: i < techItems.length - 1, color: C.textDark, fontSize: 11, fontFace: "Calibri" },
}));
s.addShape(pres.ShapeType.rect, { x: 0.3, y: 2.66, w: 4.4, h: 1.0, fill: { color: "FFFFFF" }, line: { color: "B0BEC5" } });
s.addText(techParts, { x: 0.38, y: 2.70, w: 4.24, h: 0.9 });
// Benefits
s.addShape(pres.ShapeType.rect, { x: 0.3, y: 3.76, w: 4.4, h: 0.36, fill: { color: C.midBg } });
s.addText("Benefits", { x: 0.3, y: 3.76, w: 4.4, h: 0.36, fontSize: 12, bold: true, color: C.textLight, align: "center", fontFace: "Calibri" });
const benParts = ["Simple", "Immediate", "Effective in uterine atony", "Can be repeated"].map((it, i, arr) => ({
text: it, options: { bullet: { code: "2714", color: C.teal }, breakLine: i < arr.length - 1, color: C.textDark, fontSize: 11, fontFace: "Calibri" },
}));
s.addShape(pres.ShapeType.rect, { x: 0.3, y: 4.12, w: 4.4, h: 0.8, fill: { color: "FFFFFF" }, line: { color: "B0BEC5" } });
s.addText(benParts, { x: 0.38, y: 4.15, w: 4.24, h: 0.74 });
// Important note (right side)
s.addShape(pres.ShapeType.rect, { x: 5.1, y: 1.35, w: 4.6, h: 3.6, fill: { color: C.darkBg } });
s.addText("Important", { x: 5.1, y: 1.35, w: 4.6, h: 0.38, fontSize: 12, bold: true, color: C.gold, align: "center", fontFace: "Calibri" });
s.addText("Always perform uterine massage while preparing uterotonic drugs.", {
x: 5.2, y: 1.82, w: 4.4, h: 0.7, fontSize: 12, color: C.textLight, fontFace: "Calibri", italic: true,
});
// Diagram placeholder
s.addShape(pres.ShapeType.rect, { x: 5.3, y: 2.65, w: 4.0, h: 2.0, fill: { color: "263238" }, line: { color: C.teal, width: 1 } });
s.addText("[ Diagram: Fundal Massage Technique ]", {
x: 5.3, y: 2.65, w: 4.0, h: 2.0, fontSize: 11, color: C.teal, align: "center", valign: "middle", fontFace: "Calibri", italic: true,
});
slideNumber(s, 26);
})();
// ─── SLIDE 27 ──────────────────────────────────────────────────────────────
(function slide27() {
const s = pres.addSlide();
s.background = { color: C.lightBg };
slideTitle(s, "Uterotonic Drugs", "SLIDE 27 | First-Line Medical Treatment");
const drugRows = [
[
{ text: "Drug", options: { bold: true, color: C.textLight, fill: C.tableHdr, fontSize: 11 } },
{ text: "Dose", options: { bold: true, color: C.textLight, fill: C.tableHdr, fontSize: 11 } },
{ text: "Route", options: { bold: true, color: C.textLight, fill: C.tableHdr, fontSize: 11 } },
],
[
{ text: "Oxytocin", options: { bold: true, fontSize: 11 } },
{ text: "10 IU", options: { fontSize: 11 } },
{ text: "IM or slow IV", options: { fontSize: 11 } },
],
[
{ text: "Oxytocin infusion", options: { fontSize: 11 } },
{ text: "20–40 IU in 1 L NS/RL", options: { fontSize: 11 } },
{ text: "IV infusion", options: { fontSize: 11 } },
],
[
{ text: "Methylergometrine", options: { bold: true, fontSize: 11 } },
{ text: "0.2 mg", options: { fontSize: 11 } },
{ text: "IM / slow IV", options: { fontSize: 11 } },
],
[
{ text: "Carboprost", options: { bold: true, fontSize: 11 } },
{ text: "250 µg (repeat q15–90 min; max 8 doses)", options: { fontSize: 11 } },
{ text: "IM", options: { fontSize: 11 } },
],
[
{ text: "Misoprostol", options: { bold: true, fontSize: 11 } },
{ text: "800–1000 µg", options: { fontSize: 11 } },
{ text: "Rectal or sublingual", options: { fontSize: 11 } },
],
];
s.addTable(drugRows, {
x: 0.3, y: 1.35, w: 9.4, h: 2.6,
colW: [2.2, 4.0, 3.2],
border: { type: "solid", color: "B0BEC5", pt: 0.5 },
fontFace: "Calibri",
align: "left",
});
// Principle
s.addShape(pres.ShapeType.rect, { x: 0.3, y: 4.08, w: 9.4, h: 0.38, fill: { color: C.midBg } });
s.addText("Principle", { x: 0.3, y: 4.08, w: 9.4, h: 0.38, fontSize: 12, bold: true, color: C.textLight, align: "center", fontFace: "Calibri" });
s.addShape(pres.ShapeType.rect, { x: 0.3, y: 4.46, w: 9.4, h: 0.58, fill: { color: "FFFFFF" }, line: { color: "B0BEC5" } });
s.addText("Use uterotonics early and do not delay escalation if bleeding continues.", {
x: 0.4, y: 4.49, w: 9.2, h: 0.52, fontSize: 12, bold: true, italic: true, color: C.accent, fontFace: "Calibri", align: "center",
});
slideNumber(s, 27);
})();
// ─── SLIDE 28 ──────────────────────────────────────────────────────────────
(function slide28() {
const s = pres.addSlide();
s.background = { color: C.lightBg };
slideTitle(s, "Oxytocin – Drug of Choice", "SLIDE 28");
// Four boxes
const boxes = [
{ title: "Mechanism", color: C.teal, items: ["Stimulates rhythmic uterine contractions", "Compresses uterine blood vessels", "Promotes hemostasis"] },
{ title: "Dose", color: C.midBg, items: ["10 IU IM after delivery OR", "10 IU slow IV OR", "20–40 IU in 1 L crystalloid as IV infusion"] },
{ title: "Advantages", color: "2E7D32", items: ["Rapid onset", "Highly effective", "Safe", "Few adverse effects"] },
{ title: "Side Effects", color: "C62828", items: ["Hypotension (rapid IV bolus)", "Water intoxication (prolonged high-dose infusion)"] },
];
boxes.forEach((box, i) => {
const x = 0.3 + i * 2.38;
s.addShape(pres.ShapeType.rect, { x, y: 1.35, w: 2.2, h: 0.4, fill: { color: box.color } });
s.addText(box.title, { x, y: 1.35, w: 2.2, h: 0.4, fontSize: 12, bold: true, color: C.textLight, align: "center", valign: "middle", fontFace: "Calibri" });
s.addShape(pres.ShapeType.rect, { x, y: 1.75, w: 2.2, h: 2.7, fill: { color: "FFFFFF" }, line: { color: "CFD8DC" } });
const pts = box.items.map((it, ii) => ({
text: it, options: { bullet: { code: "25CF", color: box.color }, breakLine: ii < box.items.length - 1, color: C.textDark, fontSize: 10.5, fontFace: "Calibri" },
}));
s.addText(pts, { x: x + 0.08, y: 1.8, w: 2.04, h: 2.6 });
});
// Pearl
s.addShape(pres.ShapeType.rect, { x: 0.3, y: 4.65, w: 9.4, h: 0.62, fill: { color: "FFF8E1" }, line: { color: C.gold, width: 1.5 } });
s.addText([
{ text: "★ Clinical Pearl: ", options: { bold: true, color: C.gold } },
{ text: "Oxytocin is the first-line uterotonic recommended by WHO.", options: { color: "5D4037" } },
], { x: 0.4, y: 4.68, w: 9.2, h: 0.54, fontSize: 11, fontFace: "Calibri" });
slideNumber(s, 28);
})();
// ─── SLIDE 29 ──────────────────────────────────────────────────────────────
(function slide29() {
const s = pres.addSlide();
s.background = { color: C.lightBg };
slideTitle(s, "Other Uterotonics", "SLIDE 29");
// 3 cards
const drugs = [
{
name: "Methylergometrine",
color: "6A1B9A",
rows: [
{ label: "Dose", val: "0.2 mg IM" },
{ label: "Contraindications", val: "Hypertension\nPreeclampsia\nHeart disease" },
],
},
{
name: "Carboprost (15-methyl PGF₂α)",
color: "1565C0",
rows: [
{ label: "Dose", val: "250 µg IM" },
{ label: "Repeat", val: "Every 15–90 minutes\nMaximum: 8 doses" },
{ label: "Contraindication", val: "Asthma" },
],
},
{
name: "Misoprostol",
color: "2E7D32",
rows: [
{ label: "Dose", val: "800–1000 µg rectal or sublingual" },
{ label: "Advantages", val: "Cheap\nHeat stable\nUseful in low-resource settings" },
],
},
];
drugs.forEach((drug, i) => {
const x = 0.3 + i * 3.18;
s.addShape(pres.ShapeType.rect, { x, y: 1.35, w: 3.0, h: 0.42, fill: { color: drug.color } });
s.addText(drug.name, { x, y: 1.35, w: 3.0, h: 0.42, fontSize: 11, bold: true, color: C.textLight, align: "center", valign: "middle", fontFace: "Calibri" });
s.addShape(pres.ShapeType.rect, { x, y: 1.77, w: 3.0, h: 3.45, fill: { color: "FFFFFF" }, line: { color: "B0BEC5" } });
let yOff = 1.84;
drug.rows.forEach(row => {
s.addText(row.label, { x: x + 0.1, y: yOff, w: 2.8, h: 0.28, fontSize: 10, bold: true, color: drug.color, fontFace: "Calibri" });
yOff += 0.3;
s.addText(row.val, { x: x + 0.2, y: yOff, w: 2.6, h: 0.6, fontSize: 10.5, color: C.textDark, fontFace: "Calibri" });
yOff += 0.65;
});
});
slideNumber(s, 29);
})();
// ─── SLIDE 30 ──────────────────────────────────────────────────────────────
(function slide30() {
const s = pres.addSlide();
// Dark background for impact
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.darkBg } });
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.55, fill: { color: C.accent } });
s.addText("SLIDE 30 | Tranexamic Acid (TXA)", {
x: 0.3, y: 0.09, w: 9.4, h: 0.38,
fontSize: 13, bold: true, color: C.textLight, fontFace: "Calibri",
});
// Mechanism + WHO box
const leftItems = [
{ title: "Mechanism", color: C.teal, content: "Antifibrinolytic drug\nPrevents clot breakdown\nStabilizes formed clots" },
{ title: "WHO Recommendation", color: C.gold, content: "Administer within 3 hours of childbirth in women with PPH." },
{ title: "Contraindications", color: C.accent, content: "Active thromboembolic disease (relative)\nKnown hypersensitivity" },
];
leftItems.forEach((item, i) => {
const y = 0.7 + i * 1.45;
s.addShape(pres.ShapeType.rect, { x: 0.3, y, w: 4.2, h: 0.34, fill: { color: item.color } });
s.addText(item.title, { x: 0.3, y, w: 4.2, h: 0.34, fontSize: 11, bold: true, color: C.textLight, align: "center", valign: "middle", fontFace: "Calibri" });
s.addShape(pres.ShapeType.rect, { x: 0.3, y: y + 0.34, w: 4.2, h: 1.0, fill: { color: "1C2635" } });
s.addText(item.content, { x: 0.4, y: y + 0.38, w: 4.0, h: 0.92, fontSize: 11, color: "B0BEC5", fontFace: "Calibri" });
});
// Dose box
s.addShape(pres.ShapeType.rect, { x: 5.0, y: 0.7, w: 4.7, h: 0.34, fill: { color: C.midBg } });
s.addText("Dose", { x: 5.0, y: 0.7, w: 4.7, h: 0.34, fontSize: 11, bold: true, color: C.textLight, align: "center", valign: "middle", fontFace: "Calibri" });
s.addShape(pres.ShapeType.rect, { x: 5.0, y: 1.04, w: 4.7, h: 1.0, fill: { color: "1C2635" } });
s.addText([
{ text: "1 g IV", options: { bold: true, color: C.gold, fontSize: 16 } },
{ text: " over 10 minutes\n", options: { color: "B0BEC5", fontSize: 11 } },
{ text: "Repeat 1 g", options: { bold: true, color: C.gold, fontSize: 13 } },
{ text: " if bleeding continues after 30 min\nor restarts within 24 hours", options: { color: "B0BEC5", fontSize: 10 } },
], { x: 5.1, y: 1.07, w: 4.5, h: 0.9, fontFace: "Calibri" });
// Benefits
s.addShape(pres.ShapeType.rect, { x: 5.0, y: 2.15, w: 4.7, h: 0.34, fill: { color: "2E7D32" } });
s.addText("Benefits", { x: 5.0, y: 2.15, w: 4.7, h: 0.34, fontSize: 11, bold: true, color: C.textLight, align: "center", valign: "middle", fontFace: "Calibri" });
s.addShape(pres.ShapeType.rect, { x: 5.0, y: 2.49, w: 4.7, h: 1.0, fill: { color: "1C2635" } });
const benParts = [
{ text: "Reduces death due to bleeding", options: { bullet: { code: "2714", color: "66BB6A" }, breakLine: true, color: "B0BEC5", fontSize: 11, fontFace: "Calibri" } },
{ text: "Decreases need for surgery", options: { bullet: { code: "2714", color: "66BB6A" }, breakLine: true, color: "B0BEC5", fontSize: 11, fontFace: "Calibri" } },
{ text: "Effective for all causes when used early", options: { bullet: { code: "2714", color: "66BB6A" }, color: "B0BEC5", fontSize: 11, fontFace: "Calibri" } },
];
s.addText(benParts, { x: 5.1, y: 2.53, w: 4.5, h: 0.92 });
// Key message banner
s.addShape(pres.ShapeType.rect, { x: 0.3, y: 4.72, w: 9.4, h: 0.7, fill: { color: C.accent }, line: { color: C.gold, width: 1.5 } });
s.addText([
{ text: "Key Message: ", options: { bold: true, color: C.gold, fontSize: 11 } },
{ text: "TXA should be given as early as possible alongside standard PPH treatment — it is NOT a substitute for uterotonics or surgery.", options: { color: C.textLight, fontSize: 11 } },
], { x: 0.4, y: 4.75, w: 9.2, h: 0.64, fontFace: "Calibri" });
slideNumber(s, 30);
})();
// ─── WRITE FILE ──────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/pph-slides/PPH_Emergency_Response_Slides_21-30.pptx" })
.then(() => console.log("SUCCESS: File written."))
.catch(e => { console.error("ERROR:", e); process.exit(1); });
cd /home/daytona/workspace/pph-slides && node create_pph_slides.js 2>&1
ls -lh /home/daytona/workspace/pph-slides/PPH_Emergency_Response_Slides_21-30.pptx
PPH Emergency Response Slides 21 30
Presentation · PPTX
| Slide | Design Approach |
|---|---|
| 21 | Dark navy background with red top bar; two-column layout - Immediate Actions (bullet list) + Team Roles (table) |
| 22 | 5 vertical ABCDE cards, each with a distinct color header (red/blue/green/purple/orange) and white content panels |
| 23 | 3-column layout: IV Access + Blood Samples / Monitoring / Goal box in dark navy |
| 24 | 4 card columns for Initial Fluids / Recommendation / Avoid / Monitoring; amber clinical pearl footer |
| 25 | Indications panel + Blood Products table (4 products) + MTP ratio box + Targets box |
| 26 | Purpose / Technique / Benefits panels on left; dark panel on right with a diagram placeholder for fundal massage |
| 27 | Full-width uterotonic drug table (5 drugs with dose + route); red principle banner at bottom |
| 28 | 4 side-by-side cards: Mechanism / Dose / Advantages / Side Effects; WHO pearl at bottom |
| 29 | 3 drug cards: Methylergometrine / Carboprost / Misoprostol, each with structured dose + contraindication rows |
| 30 | Dark-background impact slide; TXA Mechanism / WHO Rec / Contraindications on left; Dose + Benefits on right; bold red Key Message banner |