Create presentation on how to read nest and about partograph charting
partograph charting components WHO labor monitoring action line alert line
mkdir -p /home/daytona/workspace/nst-partograph-presentation && ls /home/daytona/workspace/nst-partograph-presentation/
~/nst-partograph-presentation/build.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "NST Reading & Partograph Charting";
pres.author = "Medical Education";
// ─── COLOUR PALETTE ───────────────────────────────────────────────────────────
const C = {
navy: "0A2342", // dominant dark background
teal: "1A7A8A", // section headers / accents
sky: "5BC0EB", // highlight
white: "FFFFFF",
offwhite:"F0F4F8",
amber: "F4A261",
green: "2D9B6A",
red: "D62828",
slate: "2C3E50",
ltgray: "D9E3EA",
};
// ─── HELPER FUNCTIONS ─────────────────────────────────────────────────────────
function addTitleSlide(pres, title, subtitle) {
const sl = pres.addSlide();
// Full background gradient rectangle
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { type: "solid", color: C.navy } });
// Decorative teal bar left
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.18, h: 5.625, fill: { type: "solid", color: C.teal } });
// Decorative sky accent bottom bar
sl.addShape(pres.ShapeType.rect, { x: 0, y: 5.1, w: 10, h: 0.525, fill: { type: "solid", color: C.teal } });
// Circle decoration
sl.addShape(pres.ShapeType.ellipse, { x: 7.5, y: -1, w: 4, h: 4, fill: { type: "solid", color: "0D2E4E" }, line: { color: C.teal, width: 2 } });
sl.addText(title, {
x: 0.6, y: 1.5, w: 8.8, h: 1.5,
fontSize: 38, bold: true, color: C.white, fontFace: "Calibri",
align: "left", valign: "middle", margin: 0
});
sl.addText(subtitle, {
x: 0.6, y: 3.1, w: 8.8, h: 0.7,
fontSize: 20, color: C.sky, fontFace: "Calibri",
align: "left", margin: 0
});
sl.addText("For Medical Students | Obstetrics & Fetal Surveillance", {
x: 0.6, y: 5.15, w: 9, h: 0.4,
fontSize: 13, color: C.white, fontFace: "Calibri", align: "left", margin: 0
});
}
function addSectionDivider(pres, sectionNum, sectionTitle, description) {
const sl = pres.addSlide();
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { type: "solid", color: C.teal } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.08, fill: { type: "solid", color: C.sky } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 5.545, w: 10, h: 0.08, fill: { type: "solid", color: C.sky } });
// Large section number watermark
sl.addText(sectionNum, {
x: 6.5, y: 0.5, w: 3.2, h: 4.5,
fontSize: 180, color: "1E8A9A", bold: true, fontFace: "Calibri",
align: "center", valign: "middle", margin: 0, transparency: 50
});
sl.addText("SECTION " + sectionNum, {
x: 0.6, y: 1.5, w: 7, h: 0.55,
fontSize: 16, color: C.sky, bold: true, fontFace: "Calibri",
align: "left", charSpacing: 5, margin: 0
});
sl.addText(sectionTitle, {
x: 0.6, y: 2.1, w: 7.5, h: 1.4,
fontSize: 34, bold: true, color: C.white, fontFace: "Calibri",
align: "left", margin: 0
});
sl.addText(description, {
x: 0.6, y: 3.7, w: 7, h: 1,
fontSize: 17, color: C.offwhite, fontFace: "Calibri",
align: "left", margin: 0
});
}
function addContentSlide(pres, title, bullets, opts = {}) {
const sl = pres.addSlide();
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { type: "solid", color: C.offwhite } });
// Top header bar
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.85, fill: { type: "solid", color: C.navy } });
// Teal accent line
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0.85, w: 10, h: 0.06, fill: { type: "solid", color: C.teal } });
sl.addText(title, {
x: 0.3, y: 0.05, w: 9.4, h: 0.75,
fontSize: 22, bold: true, color: C.white, fontFace: "Calibri",
align: "left", valign: "middle", margin: 0
});
const bulletItems = bullets.map((b, i) => {
if (typeof b === "string") {
return { text: b, options: { bullet: { type: "bullet" }, fontSize: 17, color: C.slate, fontFace: "Calibri", breakLine: i < bullets.length - 1, paraSpaceAfter: 8 } };
}
return b;
});
sl.addText(bulletItems, {
x: opts.x || 0.4, y: opts.y || 1.05, w: opts.w || 9.2, h: opts.h || 4.3,
valign: "top", margin: [0, 10, 0, 10]
});
if (opts.note) {
sl.addShape(pres.ShapeType.rect, { x: 0.4, y: 5.0, w: 9.2, h: 0.45, fill: { type: "solid", color: C.ltgray }, line: { color: C.ltgray } });
sl.addText(opts.note, { x: 0.5, y: 5.02, w: 9, h: 0.4, fontSize: 11, color: C.slate, italic: true, fontFace: "Calibri", margin: 0 });
}
return sl;
}
function addTwoColumnSlide(pres, title, leftTitle, leftItems, rightTitle, rightItems, leftColor, rightColor) {
const sl = pres.addSlide();
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { type: "solid", color: C.offwhite } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.85, fill: { type: "solid", color: C.navy } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0.85, w: 10, h: 0.06, fill: { type: "solid", color: C.teal } });
sl.addText(title, {
x: 0.3, y: 0.05, w: 9.4, h: 0.75,
fontSize: 22, bold: true, color: C.white, fontFace: "Calibri", align: "left", valign: "middle", margin: 0
});
// Left column
sl.addShape(pres.ShapeType.rect, { x: 0.3, y: 0.98, w: 4.5, h: 4.4, fill: { type: "solid", color: leftColor || C.ltgray }, line: { color: leftColor || C.ltgray } });
sl.addText(leftTitle, { x: 0.3, y: 0.98, w: 4.5, h: 0.45, fontSize: 14, bold: true, color: C.white, fontFace: "Calibri", align: "center", valign: "middle",
fill: { type: "solid", color: C.teal }, margin: 0 });
const lItems = leftItems.map((t, i) => ({ text: t, options: { bullet: { type: "bullet" }, fontSize: 15, color: C.slate, fontFace: "Calibri", breakLine: i < leftItems.length - 1, paraSpaceAfter: 6 } }));
sl.addText(lItems, { x: 0.4, y: 1.5, w: 4.3, h: 3.7, valign: "top", margin: [0, 8, 0, 8] });
// Right column
sl.addShape(pres.ShapeType.rect, { x: 5.2, y: 0.98, w: 4.5, h: 4.4, fill: { type: "solid", color: rightColor || C.ltgray }, line: { color: rightColor || C.ltgray } });
sl.addText(rightTitle, { x: 5.2, y: 0.98, w: 4.5, h: 0.45, fontSize: 14, bold: true, color: C.white, fontFace: "Calibri", align: "center", valign: "middle",
fill: { type: "solid", color: C.amber }, margin: 0 });
const rItems = rightItems.map((t, i) => ({ text: t, options: { bullet: { type: "bullet" }, fontSize: 15, color: C.slate, fontFace: "Calibri", breakLine: i < rightItems.length - 1, paraSpaceAfter: 6 } }));
sl.addText(rItems, { x: 5.3, y: 1.5, w: 4.3, h: 3.7, valign: "top", margin: [0, 8, 0, 8] });
return sl;
}
function addTableSlide(pres, title, headers, rows) {
const sl = pres.addSlide();
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { type: "solid", color: C.offwhite } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.85, fill: { type: "solid", color: C.navy } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0.85, w: 10, h: 0.06, fill: { type: "solid", color: C.teal } });
sl.addText(title, {
x: 0.3, y: 0.05, w: 9.4, h: 0.75,
fontSize: 22, bold: true, color: C.white, fontFace: "Calibri", align: "left", valign: "middle", margin: 0
});
const tableRows = [
headers.map(h => ({ text: h, options: { bold: true, color: C.white, fill: C.teal, fontSize: 14, fontFace: "Calibri", align: "center" } })),
...rows.map((row, ri) => row.map(cell => ({
text: cell,
options: { color: C.slate, fontSize: 13, fontFace: "Calibri", fill: ri % 2 === 0 ? C.white : C.ltgray, align: "center" }
})))
];
sl.addTable(tableRows, { x: 0.3, y: 1.0, w: 9.4, h: 4.35, border: { pt: 1, color: C.ltgray }, rowH: 0.5 });
}
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE 1: Title
// ──────────────────────────────────────────────────────────────────────────────
addTitleSlide(pres,
"NST & Partograph Charting",
"Fetal Surveillance & Labor Monitoring for Medical Students"
);
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE 2: Overview / Agenda
// ──────────────────────────────────────────────────────────────────────────────
{
const sl = pres.addSlide();
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { type: "solid", color: C.navy } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0.85, w: 10, h: 0.06, fill: { type: "solid", color: C.sky } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.85, fill: { type: "solid", color: C.slate } });
sl.addText("Presentation Overview", { x: 0.3, y: 0.05, w: 9, h: 0.75, fontSize: 22, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
const parts = [
{ num: "01", label: "Non-Stress Test (NST)", sub: "Purpose, setup, technique" },
{ num: "02", label: "Reading the NST Strip", sub: "Reactive vs. non-reactive, interpretation" },
{ num: "03", label: "NST Management", sub: "What to do with results" },
{ num: "04", label: "Introduction to Partograph", sub: "Purpose, WHO framework" },
{ num: "05", label: "Charting the Partograph", sub: "Components, plotting, alert/action lines" },
{ num: "06", label: "Interpreting Abnormal Labor", sub: "Prolonged labor, dystocia, interventions" },
];
const cols = [
{ x: 0.3, items: [parts[0], parts[1], parts[2]] },
{ x: 5.2, items: [parts[3], parts[4], parts[5]] },
];
cols.forEach(col => {
col.items.forEach((p, i) => {
const y = 1.05 + i * 1.4;
sl.addShape(pres.ShapeType.rect, { x: col.x, y, w: 4.5, h: 1.2, fill: { type: "solid", color: "0D2E4E" }, line: { color: C.teal, width: 1.5 } });
sl.addShape(pres.ShapeType.rect, { x: col.x, y, w: 0.7, h: 1.2, fill: { type: "solid", color: C.teal } });
sl.addText(p.num, { x: col.x, y, w: 0.7, h: 1.2, fontSize: 20, bold: true, color: C.white, fontFace: "Calibri", align: "center", valign: "middle", margin: 0 });
sl.addText(p.label, { x: col.x + 0.8, y: y + 0.1, w: 3.6, h: 0.5, fontSize: 15, bold: true, color: C.sky, fontFace: "Calibri", margin: 0 });
sl.addText(p.sub, { x: col.x + 0.8, y: y + 0.62, w: 3.6, h: 0.45, fontSize: 12, color: C.offwhite, fontFace: "Calibri", margin: 0 });
});
});
}
// ──────────────────────────────────────────────────────────────────────────────
// SECTION DIVIDER: NST
// ──────────────────────────────────────────────────────────────────────────────
addSectionDivider(pres, "1", "Non-Stress Test (NST)", "Antepartum fetal surveillance using fetal heart rate monitoring");
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: What is the NST?
// ──────────────────────────────────────────────────────────────────────────────
addContentSlide(pres, "What is the Non-Stress Test (NST)?", [
"The NST monitors fetal heart rate (FHR) accelerations associated with fetal movements",
"Introduced in the USA in the early 1970s — now the workhorse of antepartum fetal surveillance",
"Based on the principle: FHR accelerations with movement indicate an intact neurological pathway and adequate oxygenation",
"Absent or infrequent FHR accelerations correlate with progressive fetal hypoxia",
"Non-invasive, no known contraindications — can begin as early as 26 weeks; routinely used from 32 weeks",
"Usually the first-line test in high-risk pregnancy evaluation",
], { note: "Source: Pfenninger & Fowler's Procedures for Primary Care, 3rd Ed." });
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: Indications
// ──────────────────────────────────────────────────────────────────────────────
addContentSlide(pres, "Indications for NST", [
"Suspected or confirmed Intrauterine Growth Restriction (IUGR) — may also use umbilical artery Doppler",
"Maternal or gestational diabetes mellitus",
"Hypertensive disorders of pregnancy (gestational HTN, preeclampsia, chronic HTN)",
"Prolonged or post-term pregnancy (>41 weeks)",
"Decreased fetal movement reported by mother",
"Maternal trauma",
"Other high-risk conditions: renal disease, multiple gestation, substance abuse, prior fetal demise",
"Testing frequency: twice-weekly for high-risk cases; daily or more frequently for severe preeclampsia remote from term",
], { note: "Interval originally set at 7 days; more frequent testing now advocated for deteriorating conditions" });
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: Equipment & Setup
// ──────────────────────────────────────────────────────────────────────────────
addContentSlide(pres, "Equipment & Patient Setup", [
"External fetal heart rate monitor (Doppler transducer) + tocodynamometer for uterine contractions",
"Blood pressure cuff — check BP every 10-15 min during the test",
"Ultrasonic gel, event marker button for patient to record fetal movement",
"Fetal stimulation device: vibroacoustic stimulator (VAS) / artificial larynx",
"Bed or reclining chair",
"",
"Patient Positioning:",
" • Semi-recumbent (semi-Fowler's) at 30-45°, slightly tilted left",
" • Or seated in reclining chair — NEVER flat supine (causes supine hypotension → false non-reactive result)",
"",
"Pre-test instructions: eat ~2 hours before, avoid sedatives/narcotics, remain sedentary 1 hour before",
], { note: "Medications such as narcotics and barbiturates can suppress FHR reactivity — always document current medications" });
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: Technique Step by Step
// ──────────────────────────────────────────────────────────────────────────────
addContentSlide(pres, "NST Technique — Step by Step", [
"1. Position patient in semi-recumbent position with left lateral tilt",
"2. Apply external Doppler and tocodynamometer; record baseline BP",
"3. Ask patient to press event marker button each time she feels fetal movement",
"4. Monitor for a baseline 30-minute period",
"5. If non-reactive in first 30 min → extend monitoring for up to 90 minutes total",
"6. If still insufficient movement → use VAS (vibroacoustic stimulation) for 3 seconds; may repeat up to 3 times",
" - VAS shortens average NST duration from 24 → 15 minutes",
" - Does NOT decrease sensitivity or increase false-reactive results",
"7. Interpret the tracing (reactive vs. non-reactive criteria)",
], { note: "VAS evidence: multiple RCTs support use for inducing fetal movements without compromising test sensitivity (ACOG)" });
// ──────────────────────────────────────────────────────────────────────────────
// SECTION DIVIDER: Reading NST
// ──────────────────────────────────────────────────────────────────────────────
addSectionDivider(pres, "2", "Reading the NST Strip", "Criteria for reactive, non-reactive, and equivocal results");
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: Reactive NST Criteria
// ──────────────────────────────────────────────────────────────────────────────
addContentSlide(pres, "Reactive (Normal) NST — Criteria", [
"TERM (≥32 weeks): At least 2 FHR accelerations within a 20-minute window",
" • Each acceleration must rise ≥15 bpm above baseline",
" • Each must last ≥15 seconds and <2 minutes",
" • ACOG: accelerations WITHOUT fetal movement also count as reactive",
"",
"PRETERM (<32 weeks): Lower criteria apply",
" • Acceleration of ≥10 bpm above baseline",
" • Lasting ≥10 seconds",
" • (NICHD 1997 definition)",
"",
"Key principle: Reactivity indicates intact neurological pathway, fetal arousal, and adequate oxygenation",
], { note: "Source: Pfenninger & Fowler's Procedures for Primary Care; Creasy & Resnik's Maternal-Fetal Medicine" });
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: NST Tracing image
// ──────────────────────────────────────────────────────────────────────────────
{
const sl = pres.addSlide();
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { type: "solid", color: C.offwhite } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.85, fill: { type: "solid", color: C.navy } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0.85, w: 10, h: 0.06, fill: { type: "solid", color: C.teal } });
sl.addText("NST Strip Examples: Reactive (A) vs. Non-Reactive (B)", {
x: 0.3, y: 0.05, w: 9.4, h: 0.75, fontSize: 20, bold: true, color: C.white, fontFace: "Calibri", align: "left", valign: "middle", margin: 0
});
try {
sl.addImage({ path: "/home/daytona/workspace/nst-partograph-presentation/nst_tracing.png", x: 0.5, y: 0.95, w: 5.5, h: 4.3 });
} catch(e) {}
// Annotation boxes
sl.addShape(pres.ShapeType.rect, { x: 6.2, y: 1.0, w: 3.5, h: 1.8, fill: { type: "solid", color: C.green }, line: { color: C.green } });
sl.addText([
{ text: "A - REACTIVE\n", options: { bold: true, breakLine: true } },
{ text: "• ≥2 accelerations\n", options: { breakLine: true } },
{ text: "• ≥15 bpm rise\n", options: { breakLine: true } },
{ text: "• ≥15 sec duration\n", options: { breakLine: true } },
{ text: "• FHR rises with movement", options: {} },
], { x: 6.25, y: 1.05, w: 3.4, h: 1.7, fontSize: 13, color: C.white, fontFace: "Calibri", valign: "top", margin: [5, 8, 5, 8] });
sl.addShape(pres.ShapeType.rect, { x: 6.2, y: 3.0, w: 3.5, h: 2.0, fill: { type: "solid", color: C.red }, line: { color: C.red } });
sl.addText([
{ text: "B - NON-REACTIVE\n", options: { bold: true, breakLine: true } },
{ text: "• Mother marks movement\n", options: { breakLine: true } },
{ text: "• NO FHR accelerations\n", options: { breakLine: true } },
{ text: "• Requires further evaluation\n", options: { breakLine: true } },
{ text: "• Extend to 90 min or use VAS", options: {} },
], { x: 6.25, y: 3.05, w: 3.4, h: 1.9, fontSize: 13, color: C.white, fontFace: "Calibri", valign: "top", margin: [5, 8, 5, 8] });
}
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: Non-Reactive NST
// ──────────────────────────────────────────────────────────────────────────────
addContentSlide(pres, "Non-Reactive (Abnormal) NST", [
"Definition: Does NOT meet criteria for reactive within 20-40 minute window",
"Most common cause of non-reactivity: fetal sleep cycle (20-40 min cycles) — not pathological",
"Management of non-reactive result:",
" • Extend observation to 90 minutes total",
" • Use VAS to stimulate fetus",
" • Check patient position (avoid supine hypotension → false positive)",
"",
"If persistently non-reactive after 90 minutes:",
" • Biophysical Profile (BPP)",
" • Contraction Stress Test (CST)",
" • Consider delivery if mature fetus with favorable cervix",
" • Modified BPP (NST + Amniotic Fluid Index) — false-negative rate 0.8 per 1000",
], { note: "Positive predictive value of abnormal NST: 15% (post-term) to 69% (IUGR) — false positives are common" });
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: NST Interpretation Summary Table
// ──────────────────────────────────────────────────────────────────────────────
addTableSlide(pres, "NST Interpretation — Quick Reference",
["Feature", "Reactive (Normal)", "Non-Reactive (Abnormal)"],
[
["Accelerations", "≥2 in 20 min window", "< 2 accelerations"],
["Amplitude", "≥15 bpm rise", "< 15 bpm"],
["Duration", "≥15 sec, <2 min", "< 15 seconds"],
["Preterm (<32 wk)", "≥10 bpm for ≥10 sec", "Does not meet criteria"],
["Interpretation", "Reassuring — fetal wellbeing", "Further testing required"],
["False-negative rate", "2 per 1000", "Not applicable"],
["Next step if abnormal", "Extend / VAS / BPP / CST", "BPP, CST, or delivery"],
]
);
// ──────────────────────────────────────────────────────────────────────────────
// SECTION DIVIDER: PARTOGRAPH
// ──────────────────────────────────────────────────────────────────────────────
addSectionDivider(pres, "3", "Partograph Charting", "Monitoring labor progress and maternal-fetal wellbeing");
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: What is a Partograph?
// ──────────────────────────────────────────────────────────────────────────────
addContentSlide(pres, "What is a Partograph?", [
"A graphical tool for monitoring, recording, and evaluating progress of labor and maternal-fetal condition",
"Used during the ACTIVE PHASE of the first stage of labor",
"Central feature: a cervicograph — graphical recording of cervical dilation over time",
"WHO introduced the partograph in 1972; multiple revisions since (1994, 2000, 2018 Labor Care Guide)",
"Designed for use at ANY level of care — from health centers to tertiary hospitals",
"Purpose: early detection of prolonged labor, maternal deterioration, fetal compromise",
"Evidence: WHO multicenter trial (1994) showed partograph use reduced prolonged labor, emergency C-sections, and fetal asphyxia",
], { note: "WHO Labor Care Guide (LCG) is the 2018 evolution of the partograph with woman-centered additions" });
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: Components of Partograph
// ──────────────────────────────────────────────────────────────────────────────
addContentSlide(pres, "Components of the WHO Partograph", [
"SECTION 1 — Patient Information: Name, parity, hospital number, date/time of admission, time of ruptured membranes",
"",
"SECTION 2 — Fetal Condition:",
" • Fetal Heart Rate (FHR) — recorded every 30 minutes (normal: 110-160 bpm)",
" • Liquor (amniotic fluid): I = intact, C = clear, M = meconium, A = absent",
" • Moulding: 0, +, ++, +++ (overlapping of fetal skull bones)",
"",
"SECTION 3 — Labor Progress (the CERVICOGRAPH):",
" • Cervical dilation plotted with 'X' — start at 4-5 cm active phase",
" • Descent of fetal head plotted with 'O' (in fifths above pelvic brim)",
" • Uterine contractions: frequency, duration, intensity (shading)",
"",
"SECTION 4 — Medications: Oxytocin, IV fluids, drugs given",
"",
"SECTION 5 — Maternal Condition: BP, pulse, temperature, urine output, protein, acetone",
], { note: "Source: MSF Medical Guidelines; WHO Partograph Manual; Park's Textbook of Preventive & Social Medicine" });
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: Alert and Action Lines
// ──────────────────────────────────────────────────────────────────────────────
{
const sl = pres.addSlide();
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { type: "solid", color: C.offwhite } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.85, fill: { type: "solid", color: C.navy } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0.85, w: 10, h: 0.06, fill: { type: "solid", color: C.teal } });
sl.addText("Alert Line & Action Line", {
x: 0.3, y: 0.05, w: 9.4, h: 0.75, fontSize: 22, bold: true, color: C.white, fontFace: "Calibri", align: "left", valign: "middle", margin: 0
});
// Three zones
const zones = [
{ x: 0.3, color: C.green, title: "GREEN ZONE", sub: "Left of Alert Line", points: ["Normal labor progress", "Dilation ≥1 cm/hr", "Continue monitoring", "No intervention needed"] },
{ x: 3.65, color: C.amber, title: "AMBER ZONE", sub: "Between Alert & Action Lines", points: ["Labor slowing down", "Increased vigilance required", "Consider transfer if peripheral facility", "Prepare for possible intervention"] },
{ x: 7.0, color: C.red, title: "RED ZONE", sub: "Right of Action Line", points: ["Labor dangerously slow", "Immediate action required", "Augmentation (oxytocin/ARM)", "C-section if indicated"] },
];
zones.forEach(z => {
sl.addShape(pres.ShapeType.rect, { x: z.x, y: 0.95, w: 3.1, h: 4.45, fill: { type: "solid", color: z.color }, line: { color: z.color } });
sl.addText(z.title, { x: z.x, y: 0.95, w: 3.1, h: 0.52, fontSize: 14, bold: true, color: C.white, fontFace: "Calibri", align: "center", valign: "middle", margin: 0 });
sl.addText(z.sub, { x: z.x + 0.05, y: 1.5, w: 3.0, h: 0.38, fontSize: 11, italic: true, color: C.white, fontFace: "Calibri", align: "center", margin: 0 });
const pts = z.points.map((p, i) => ({ text: p, options: { bullet: { type: "bullet" }, fontSize: 13, color: C.white, fontFace: "Calibri", breakLine: i < z.points.length - 1, paraSpaceAfter: 6 } }));
sl.addText(pts, { x: z.x + 0.1, y: 1.95, w: 2.9, h: 3.2, valign: "top", margin: [0, 6, 0, 6] });
});
sl.addText("Alert Line: from 4-5 cm dilation at 1 cm/hr rate | Action Line: 4 hours to the right of Alert Line", {
x: 0.3, y: 5.12, w: 9.4, h: 0.45, fontSize: 11, italic: true, color: C.slate, fontFace: "Calibri", align: "center", margin: 0
});
}
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: Fetal Head Descent & Moulding
// ──────────────────────────────────────────────────────────────────────────────
addContentSlide(pres, "Fetal Head Descent & Moulding on Partograph", [
"HEAD DESCENT — recorded as 'O' in fifths palpable above the pelvic brim:",
" 5/5 = head entirely above pelvic brim (free/floating)",
" 4/5 = just palpable above brim",
" 3/5 = head at brim",
" 2/5 = head entered pelvis",
" 1/5 = most of head in pelvis",
" 0/5 = head fully engaged / not palpable abdominally",
"",
"MOULDING — assesses overlap of fetal skull bones during labor:",
" 0 = sutures felt separately (normal)",
" + = sutures just touching (acceptable)",
" ++ = sutures overlapping (concerning)",
"+++ = severe overlapping (sign of cephalopelvic disproportion — urgent review)",
], { note: "Moulding >++ with failure to progress = strong indicator of CPD — consider operative delivery" });
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: Uterine Contractions
// ──────────────────────────────────────────────────────────────────────────────
addContentSlide(pres, "Recording Uterine Contractions on the Partograph", [
"Assessed every 30 minutes during active labor — record in the 10-minute grid",
"Count: Number of contractions in 10 minutes",
"Duration: How long each contraction lasts",
"",
"Intensity recorded by SHADING the box:",
" • Dotted/stippled box = <20 seconds (mild, short)",
" • Hatched/lined box = 20-40 seconds (moderate)",
" • Solid/filled box = >40 seconds (strong, prolonged)",
"",
"Normal active labor: 3-5 contractions per 10 minutes, lasting >40 seconds",
"Hyperstimulation: >5 contractions per 10 minutes or contractions >90 sec (especially with oxytocin) — STOP oxytocin",
"Inadequate contractions: <3 per 10 min of <40 sec → consider augmentation if labor not progressing",
], { note: "Always correlate contraction quality with cervical progress on the cervicograph" });
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: Liquor and Fetal Heart Rate
// ──────────────────────────────────────────────────────────────────────────────
addTwoColumnSlide(pres,
"Fetal Heart Rate & Liquor on Partograph",
"Fetal Heart Rate (FHR)",
[
"Auscultate every 30 min in active phase (every 15 min in second stage)",
"Record immediately AFTER a contraction",
"Normal range: 110-160 bpm",
"Bradycardia <110 bpm: fetal distress",
"Tachycardia >160 bpm: infection, hypoxia, drugs",
"Decelerations after contractions: late decels = uteroplacental insufficiency",
"Variable decels: cord compression",
],
"Amniotic Fluid (Liquor)",
[
"I = Intact membranes",
"C = Clear fluid (normal)",
"M = Meconium-stained (fetal distress risk)",
"M+ or M++ = thick/particulate meconium — high risk",
"A = Absent fluid (oligohydramnios, dry)",
"Meconium + abnormal FHR = emergency — prepare for delivery",
"Foul-smelling fluid suggests chorioamnionitis",
]
);
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: Interpreting Abnormal Labor
// ──────────────────────────────────────────────────────────────────────────────
addContentSlide(pres, "Interpreting Abnormal Labor on Partograph", [
"PROLONGED LATENT PHASE: >8 hours without entering active labor — assess, rehydrate, consider sedation/oxytocin",
"",
"ACTIVE PHASE DISORDERS:",
" • Protraction disorder: cervical dilation <1 cm/hr (crosses alert line) — assess CPD, augment if appropriate",
" • Arrest disorder: no dilation for ≥2 hours (crosses action line) — urgent review, consider C-section",
"",
"SECONDARY ARREST (second stage): No descent for >1 hr (nullipara) or >30 min (multipara) — assess position, consider instrumental/operative delivery",
"",
"Causes of failure to progress: Cephalopelvic Disproportion (CPD), malposition (OP, face), inefficient uterine activity, full bladder",
"",
"3 Ps Framework: Power (contractions), Passenger (position, moulding, size), Passage (pelvis)",
], { note: "Always review ALL partograph parameters together — no single finding in isolation drives management" });
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: Maternal Vitals on Partograph
// ──────────────────────────────────────────────────────────────────────────────
addContentSlide(pres, "Maternal Monitoring on the Partograph", [
"Blood Pressure: Every 30 minutes in active labor",
" • Hypertension ≥140/90: preeclampsia — urgent treatment, consider MgSO₄",
" • Hypotension: aortocaval compression, hemorrhage, epidural",
"",
"Pulse: Every 30 minutes",
" • Tachycardia >100 bpm: pain, dehydration, hemorrhage, sepsis",
"",
"Temperature: Every 4 hours (every 2 hours if membranes ruptured >18 hrs)",
" • Fever >38°C: chorioamnionitis — blood cultures, antibiotics, expedite delivery",
"",
"Urine: Volume, protein, acetone",
" • Proteinuria: preeclampsia",
" • Ketonuria: dehydration/starvation — IV fluids",
" • Oliguria <30 mL/hr: renal compromise, hemorrhage",
]);
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: Clinical Decision Framework
// ──────────────────────────────────────────────────────────────────────────────
addTableSlide(pres, "Partograph Findings — Clinical Decision Guide",
["Finding", "Likely Cause", "Action"],
[
["Dilation curve crosses Alert line", "Slow labor progress", "Increased monitoring; transfer if peripheral"],
["Dilation curve crosses Action line", "Prolonged labor / CPD", "Augment labor or C-section"],
["Moulding +++", "CPD / malposition", "Urgent obstetric review; consider C-section"],
["FHR <110 or >160 bpm", "Fetal distress", "Position change, O₂, stop oxytocin, delivery"],
["Thick meconium + abnormal FHR", "Severe fetal compromise", "Emergency delivery (LSCS or instrumental)"],
["Fever >38°C + purulent liquor", "Chorioamnionitis", "Antibiotics, expedite delivery"],
["BP ≥160/110 + proteinuria", "Severe preeclampsia", "MgSO₄, antihypertensives, deliver"],
]
);
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: Key Differences — NST vs Partograph
// ──────────────────────────────────────────────────────────────────────────────
addTwoColumnSlide(pres,
"NST vs. Partograph — At a Glance",
"Non-Stress Test (NST)",
[
"WHEN: Antenatal (before labor onset)",
"PURPOSE: Assess fetal wellbeing",
"SETTING: OPD / antenatal clinic",
"DURATION: 20-90 minutes",
"MONITORS: Fetal heart rate + movements",
"RESULT: Reactive (normal) or Non-reactive",
"NEXT STEP if abnormal: BPP, CST, delivery",
],
"Partograph",
[
"WHEN: During active labor",
"PURPOSE: Monitor labor progress + fetal/maternal status",
"SETTING: Labor ward / delivery room",
"DURATION: Entire active labor phase",
"MONITORS: Cervical dilation, descent, FHR, contractions, maternal vitals",
"RESULT: Normal / Alert / Action zone",
"NEXT STEP if abnormal: Augment or operative delivery",
]
);
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: Summary & Key Take-aways
// ──────────────────────────────────────────────────────────────────────────────
{
const sl = pres.addSlide();
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { type: "solid", color: C.navy } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.85, fill: { type: "solid", color: C.teal } });
sl.addText("Key Take-Aways", {
x: 0.3, y: 0.1, w: 9.4, h: 0.65, fontSize: 24, bold: true, color: C.white, fontFace: "Calibri", align: "left", valign: "middle", margin: 0
});
const points = [
{ icon: "✦", text: "NST is REACTIVE when ≥2 FHR accelerations of ≥15 bpm lasting ≥15 sec occur within 20 min (term fetus)" },
{ icon: "✦", text: "A non-reactive NST most often reflects fetal sleep — extend monitoring or use VAS before declaring fetal distress" },
{ icon: "✦", text: "Modified BPP (NST + AFI) is highly sensitive with a false-negative rate of only 0.8 per 1000" },
{ icon: "✦", text: "Partograph is started at 4-5 cm cervical dilation (active phase of labor)" },
{ icon: "✦", text: "Alert line = 1 cm/hr dilation rate from 4-5 cm; Action line is 4 hours to the right" },
{ icon: "✦", text: "Crossing the action line demands immediate decision: augmentation, ARM, or C-section" },
{ icon: "✦", text: "Always assess the 3 Ps when labor fails to progress: Power, Passenger, Passage" },
];
points.forEach((p, i) => {
sl.addShape(pres.ShapeType.rect, { x: 0.3, y: 0.95 + i * 0.64, w: 9.4, h: 0.58,
fill: { type: "solid", color: i % 2 === 0 ? "0D2E4E" : "0F3562" }, line: { color: C.teal, width: 0.5 } });
sl.addText(p.icon + " " + p.text, {
x: 0.4, y: 0.97 + i * 0.64, w: 9.2, h: 0.54,
fontSize: 13.5, color: C.sky, fontFace: "Calibri", valign: "middle", margin: 0
});
});
}
// ──────────────────────────────────────────────────────────────────────────────
// SLIDE: References
// ──────────────────────────────────────────────────────────────────────────────
addContentSlide(pres, "References", [
"Pfenninger & Fowler's Procedures for Primary Care, 3rd Edition — Chapter 165: Non-Stress Test",
"Creasy & Resnik's Maternal-Fetal Medicine: Principles and Practice — Fetal Heart Rate Monitoring",
"Tietz Textbook of Laboratory Medicine, 7th Edition — Laboratory Testing in Pregnancy",
"Park's Textbook of Preventive and Social Medicine — Maternal Health & Intra-natal Care",
"WHO Partograph Manual (1994 multicenter trial; 2000 simplified partograph)",
"MSF Medical Guidelines 5.2 — Monitoring Labour and Delivery",
"WHO Intrapartum Care Guidelines 2018 — Labor Care Guide (LCG)",
"ACOG Practice Bulletins — Antepartum Fetal Surveillance",
"NICHD (1997) — Fetal Heart Rate Monitoring Definitions",
], { note: "This presentation is intended for educational purposes for medical students. Clinical decisions must follow local guidelines." });
// ──────────────────────────────────────────────────────────────────────────────
// WRITE FILE
// ──────────────────────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/nst-partograph-presentation/NST_and_Partograph.pptx" })
.then(() => console.log("✅ PPTX written successfully"))
.catch(err => { console.error("❌ Error:", err); process.exit(1); });
cd /home/daytona/workspace/nst-partograph-presentation && curl -s "https://cdn.orris.care/cdss_images/cbd66009a6ad16964def7c7bb3baab41a42b9ff89383bc51d5fef072dc2be660.png" -o nst_tracing.png && echo "Downloaded: $(ls -lh nst_tracing.png)"
cd /home/daytona/workspace/nst-partograph-presentation && node build.js 2>&1
ls -lh /home/daytona/workspace/nst-partograph-presentation/ && echo "PPTX size: $(du -sh /home/daytona/workspace/nst-partograph-presentation/NST_and_Partograph.pptx)"
libreoffice --headless --convert-to pdf --outdir /home/daytona/workspace/nst-partograph-presentation/ /home/daytona/workspace/nst-partograph-presentation/NST_and_Partograph.pptx 2>&1
mkdir -p /home/daytona/workspace/nst-partograph-presentation/pdf-out && libreoffice --headless --convert-to pdf --outdir /home/daytona/workspace/nst-partograph-presentation/pdf-out/ /home/daytona/workspace/nst-partograph-presentation/NST_and_Partograph.pptx 2>&1 && ls -lh /home/daytona/workspace/nst-partograph-presentation/pdf-out/
cp /home/daytona/workspace/nst-partograph-presentation/NST_and_Partograph.pptx /tmp/nst.pptx && libreoffice --headless --convert-to pdf --outdir /tmp/ /tmp/nst.pptx 2>&1 && ls -lh /tmp/nst.pdf && cp /tmp/nst.pdf /home/daytona/workspace/nst-partograph-presentation/NST_and_Partograph.pdf && echo "PDF copied to workspace"
NST and Partograph
Presentation · PPTX
NST and Partograph
PDF Document · PDF