Create presentation on how to read nest and about partograph charting

Asking for Preferences
Reading File
Reading File
Reading File
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Reading File
Finding Sources
Reading File
Finding Sources
Reading File
Finding Sources
Loading Image
Searching the Web

partograph charting components WHO labor monitoring action line alert line

Running Command

mkdir -p /home/daytona/workspace/nst-partograph-presentation && ls /home/daytona/workspace/nst-partograph-presentation/

Writing File

~/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); });
Running Command

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)"

Running Command

cd /home/daytona/workspace/nst-partograph-presentation && node build.js 2>&1

Running Command

ls -lh /home/daytona/workspace/nst-partograph-presentation/ && echo "PPTX size: $(du -sh /home/daytona/workspace/nst-partograph-presentation/NST_and_Partograph.pptx)"

Running Command

libreoffice --headless --convert-to pdf --outdir /home/daytona/workspace/nst-partograph-presentation/ /home/daytona/workspace/nst-partograph-presentation/NST_and_Partograph.pptx 2>&1

Running Command

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/

Running Command

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"

Both files are ready. Here are your downloads:

✅ Presentation Complete

Download your files:
  • NST and Partograph

    Presentation · PPTX

    (703 KB)
  • NST and Partograph

    PDF Document · PDF

    (464 KB)

What's inside (17 slides):

Part 1 - Non-Stress Test (NST)
  1. Title slide + agenda overview
  2. What is the NST? - physiological basis
  3. Indications for NST - with frequency guidelines
  4. Equipment & patient setup (positioning, pre-test prep)
  5. Step-by-step technique (VAS use, timing)
  6. Reactive vs. Non-reactive criteria - term and preterm standards
  7. NST Strip examples - actual tracing image (reactive A + non-reactive B with annotated overlays)
  8. Non-reactive management flowchart (BPP, CST, modified BPP)
  9. Interpretation quick-reference table
Part 2 - Partograph Charting 10. What is a partograph? - WHO history 11. All 5 components of the WHO partograph 12. Alert & Action Line zones - Green / Amber / Red color-coded 13. Fetal head descent (fifths) + Moulding (0 to +++) 14. Uterine contractions - shading method 15. FHR + Liquor (I/C/M/A) two-column layout 16. Abnormal labor interpretation (3 Ps framework) 17. Maternal vitals monitoring 18. Clinical decision guide table 19. NST vs. Partograph comparison + Key Take-Aways + References
This is a shared conversation. Sign in to Orris to start your own chat.