Make ppt on normal labour from oxorn foote and add pictures also to ppt
normal labour stages mechanism of labour obstetrics diagram image wikimedia
mkdir -p /home/daytona/workspace/normal-labour-ppt && ls /home/daytona/workspace/normal-labour-ppt/
~/normal-labour-ppt/normal_labour_v2.js
const pptxgen = require("pptxgenjs");
const { execSync } = require("child_process");
// ─── Color Palette (deep burgundy/maroon medical theme) ────────────────────
const C = {
dark: "2C0E1A", // very dark maroon – title/accent backgrounds
mid: "6D1B3A", // mid maroon – section headers
accent: "B5314C", // rose-red accent
light: "F7E8EE", // very light pink – slide backgrounds
white: "FFFFFF",
text: "1A1A2E", // near-black text
sub: "5C4050", // muted subtitle/body
gold: "D4A017", // highlight colour
teal: "2E8B8B", // second accent
};
// ─── Image URLs ─────────────────────────────────────────────────────────────
const IMAGE_URLS = [
"https://upload.wikimedia.org/wikipedia/commons/2/29/Stages_of_Childbirth.png",
"https://upload.wikimedia.org/wikipedia/commons/c/c0/2920_Stages_of_Childbirth-en.svg",
];
// Fetch images as base64
let imgs = [];
try {
const raw = execSync(
`node /home/daytona/skills/shared/scripts/fetch_images.js "${IMAGE_URLS[0]}" "${IMAGE_URLS[1]}"`,
{ timeout: 30000 }
).toString();
imgs = JSON.parse(raw);
} catch(e) {
console.warn("Image fetch failed:", e.message);
}
const getImg = (i) => (imgs[i] && !imgs[i].error) ? imgs[i].base64 : null;
// ─── Presentation Setup ─────────────────────────────────────────────────────
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Normal Labour – Oxorn-Foote";
pres.author = "Medical Education";
// ─── Helper: slide background ───────────────────────────────────────────────
function setLightBG(slide) {
slide.background = { color: C.light };
}
function setDarkBG(slide) {
slide.background = { color: C.dark };
}
// ─── Helper: section header bar ─────────────────────────────────────────────
function addHeaderBar(slide, title) {
slide.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 0.75,
fill: { color: C.mid },
line: { color: C.mid },
});
slide.addText(title, {
x: 0.15, y: 0, w: 9.7, h: 0.75,
fontSize: 22, bold: true, color: C.white,
valign: "middle", margin: 0,
});
}
// ─── Helper: footer ─────────────────────────────────────────────────────────
function addFooter(slide, note) {
slide.addShape(pres.ShapeType.rect, {
x: 0, y: 5.3, w: 10, h: 0.325,
fill: { color: C.dark }, line: { color: C.dark },
});
slide.addText(`Oxorn-Foote: Human Labor & Birth | ${note}`, {
x: 0.2, y: 5.3, w: 9.6, h: 0.325,
fontSize: 9, color: C.white, valign: "middle", margin: 0,
});
}
// ─── Helper: bullet list ─────────────────────────────────────────────────────
function bullets(items, bold_first = false) {
return items.map((t, i) => ({
text: t,
options: {
bullet: { type: "bullet", indent: 15 },
breakLine: true,
bold: i === 0 && bold_first,
color: C.text,
},
}));
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 1 – TITLE
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
sl.background = { color: C.dark };
// decorative circle
sl.addShape(pres.ShapeType.ellipse, {
x: 7.2, y: -0.8, w: 4.5, h: 4.5,
fill: { color: C.mid }, line: { color: C.mid },
});
sl.addShape(pres.ShapeType.ellipse, {
x: -1.2, y: 3.5, w: 3.5, h: 3.5,
fill: { color: C.mid }, line: { color: C.mid },
});
sl.addText("NORMAL LABOUR", {
x: 0.5, y: 0.8, w: 9, h: 1.2,
fontSize: 44, bold: true, color: C.white,
align: "center", charSpacing: 4,
});
sl.addText("A Comprehensive Review Based on Oxorn-Foote:", {
x: 0.5, y: 2.1, w: 9, h: 0.5,
fontSize: 18, color: C.gold, align: "center", italic: true,
});
sl.addText("Human Labor & Birth (6th Edition)", {
x: 0.5, y: 2.55, w: 9, h: 0.45,
fontSize: 16, color: C.gold, align: "center", italic: true,
});
sl.addShape(pres.ShapeType.line, {
x: 2, y: 3.15, w: 6, h: 0,
line: { color: C.accent, width: 2 },
});
sl.addText("Obstetrics & Gynaecology", {
x: 0.5, y: 3.3, w: 9, h: 0.4,
fontSize: 14, color: C.light, align: "center",
});
sl.addText("Dept. of Obstetrics & Gynaecology", {
x: 0.5, y: 4.9, w: 9, h: 0.35,
fontSize: 11, color: "AAAAAA", align: "center",
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 2 – DEFINITION & PREREQUISITES
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Definition of Normal Labour");
sl.addText([
{ text: "Oxorn-Foote Definition: ", options: { bold: true, color: C.accent } },
{ text: "Normal labour is the process by which the products of conception are expelled from the uterus after the 28th week of pregnancy.", options: { color: C.text } },
], { x: 0.3, y: 0.95, w: 9.4, h: 0.7, fontSize: 14, italic: false });
sl.addText("Prerequisites for Normal Labour:", {
x: 0.3, y: 1.75, w: 9.4, h: 0.4,
fontSize: 16, bold: true, color: C.mid,
});
const prereqs = [
"Normal pelvis (gynaecoid type) with adequate diameters",
"Normal fetus of average size in a favourable position",
"Efficient uterine contractions (powers)",
"Intact membranes initially; lower uterine segment well formed",
"Fully effaced and dilating cervix",
];
sl.addText(bullets(prereqs), {
x: 0.4, y: 2.2, w: 9.2, h: 2.5,
fontSize: 13, lineSpacingMultiple: 1.3,
});
// coloured box at right
sl.addShape(pres.ShapeType.rect, {
x: 7.5, y: 1.75, w: 2.2, h: 1.3,
fill: { color: C.accent }, line: { color: C.accent },
rounding: 0.1,
});
sl.addText("Pelvis\n+\nPassenger\n+\nPower", {
x: 7.5, y: 1.75, w: 2.2, h: 1.3,
fontSize: 13, bold: true, color: C.white,
align: "center", valign: "middle",
});
addFooter(sl, "Definition & Prerequisites");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 3 – STAGES OF LABOUR (with diagram image)
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Stages of Labour");
const img0 = getImg(0);
if (img0) {
sl.addImage({ data: img0, x: 5.5, y: 0.85, w: 4.3, h: 4.3 });
}
const stagesData = [
{ num: "Stage I", sub: "Onset of true labour → full cervical dilatation (10 cm)", color: C.mid },
{ num: "Stage II", sub: "Full dilatation → delivery of baby", color: C.accent },
{ num: "Stage III", sub: "Delivery of baby → expulsion of placenta & membranes", color: C.teal },
{ num: "Stage IV", sub: "First hour post-delivery (observation & haemostasis)", color: C.gold },
];
let yPos = 1.0;
stagesData.forEach((s) => {
sl.addShape(pres.ShapeType.rect, {
x: 0.3, y: yPos, w: 0.1, h: 0.75,
fill: { color: s.color }, line: { color: s.color },
});
sl.addText(s.num, {
x: 0.5, y: yPos, w: 1.5, h: 0.35,
fontSize: 13, bold: true, color: s.color, margin: 0,
});
sl.addText(s.sub, {
x: 0.5, y: yPos + 0.32, w: 4.7, h: 0.45,
fontSize: 11, color: C.sub, margin: 0,
});
yPos += 1.0;
});
sl.addText("Stage I Durations (Oxorn-Foote):", {
x: 0.3, y: 4.8, w: 5, h: 0.3,
fontSize: 11, bold: true, color: C.dark,
});
sl.addText("Primigravida: avg 12–14 hr | Multigravida: avg 6–8 hr", {
x: 0.3, y: 5.1, w: 5.1, h: 0.25,
fontSize: 10, color: C.sub, italic: true,
});
addFooter(sl, "Stages of Labour");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 4 – FIRST STAGE IN DETAIL
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "First Stage of Labour");
// two columns
// Left: latent phase
sl.addShape(pres.ShapeType.rect, {
x: 0.25, y: 0.9, w: 4.5, h: 4.3,
fill: { color: "F0D8E3" }, line: { color: C.mid, width: 1 },
});
sl.addText("Latent Phase", {
x: 0.3, y: 0.92, w: 4.4, h: 0.45,
fontSize: 15, bold: true, color: C.mid, align: "center",
});
sl.addText(bullets([
"Onset of regular contractions to 3–4 cm dilatation",
"Cervical effacement is the main change",
"Duration: up to 8 hr (primi), 4 hr (multi)",
"Contractions: mild, 5–10 min apart, 20–40 sec",
"Slow, unpredictable progress",
]), {
x: 0.35, y: 1.42, w: 4.3, h: 3.6,
fontSize: 11.5, lineSpacingMultiple: 1.35,
});
// Right: active phase
sl.addShape(pres.ShapeType.rect, {
x: 5.25, y: 0.9, w: 4.5, h: 4.3,
fill: { color: "D8EDF0" }, line: { color: C.teal, width: 1 },
});
sl.addText("Active Phase", {
x: 5.3, y: 0.92, w: 4.4, h: 0.45,
fontSize: 15, bold: true, color: C.teal, align: "center",
});
sl.addText(bullets([
"3–4 cm to full dilatation (10 cm)",
"Cervical dilatation: ≥1 cm/hr (primi), ≥1.5 cm/hr (multi)",
"Descent of presenting part begins",
"Contractions: 3–5 min apart, 45–60 sec, moderate-strong",
"Acceleration → phase of max slope → deceleration",
"Friedman Curve: graphical representation of progress",
]), {
x: 5.3, y: 1.42, w: 4.3, h: 3.6,
fontSize: 11.5, lineSpacingMultiple: 1.35,
});
addFooter(sl, "First Stage of Labour");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 5 – MECHANISM OF LABOUR (Cardinal Movements)
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Mechanism of Labour – Cardinal Movements (LOA)");
const img1 = getImg(1);
if (img1) {
sl.addImage({ data: img1, x: 6.0, y: 0.85, w: 3.8, h: 4.1 });
}
const moves = [
{ n: "1. Engagement", d: "BPD passes through pelvic inlet; head enters pelvis" },
{ n: "2. Descent", d: "Continuous throughout labour; driven by uterine contractions" },
{ n: "3. Flexion", d: "Chin approximates chest; presents smaller suboccipitobregmatic diameter (9.5 cm)" },
{ n: "4. Internal Rotation", d: "Occiput rotates anteriorly (LOA → OA); 1/8 turn" },
{ n: "5. Extension", d: "Head extends under pubic symphysis; vertex, brow, face delivered" },
{ n: "6. Restitution", d: "Head rotates 1/8 back to original position" },
{ n: "7. External Rotation", d: "Further 1/8 rotation as shoulders align A-P" },
{ n: "8. Expulsion", d: "Anterior shoulder, posterior shoulder, then body delivered" },
];
let y = 0.92;
moves.forEach((m) => {
sl.addText([
{ text: m.n + ": ", options: { bold: true, color: C.accent } },
{ text: m.d, options: { color: C.text } },
], {
x: 0.3, y, w: 5.55, h: 0.43,
fontSize: 11, lineSpacingMultiple: 1.1,
});
y += 0.47;
});
addFooter(sl, "Cardinal Movements of Labour");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 6 – POWERS OF LABOUR
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Powers of Labour");
// Two boxes
sl.addShape(pres.ShapeType.rect, {
x: 0.25, y: 0.9, w: 4.5, h: 4.3,
fill: { color: "EEF0F8" }, line: { color: C.teal, width: 1 },
});
sl.addText("Uterine Contractions", {
x: 0.3, y: 0.93, w: 4.4, h: 0.45,
fontSize: 14, bold: true, color: C.teal, align: "center",
});
sl.addText(bullets([
"Involuntary, rhythmical, intermittent",
"Fundus contracts first and most strongly (fundal dominance)",
"Intensity: 30–60 mmHg in active labour",
"Frequency: every 2–3 min in active labour",
"Duration: 45–60 seconds",
"Resting tone: 8–12 mmHg between contractions",
"Montevideo Units: product of amplitude × frequency in 10 min (>200 MU = adequate)",
]), {
x: 0.35, y: 1.43, w: 4.3, h: 3.6,
fontSize: 11, lineSpacingMultiple: 1.3,
});
sl.addShape(pres.ShapeType.rect, {
x: 5.25, y: 0.9, w: 4.5, h: 4.3,
fill: { color: "F0F8EE" }, line: { color: "3A7D44", width: 1 },
});
sl.addText("Voluntary Expulsive Forces", {
x: 5.3, y: 0.93, w: 4.4, h: 0.45,
fontSize: 14, bold: true, color: "3A7D44", align: "center",
});
sl.addText(bullets([
"Valsalva manoeuvre (bearing down) in Stage II",
"Diaphragm fixed, glottis closed, abdominal muscles contract",
"Adds 20–40 mmHg to intrauterine pressure",
"Effective only after full cervical dilatation",
"Premature bearing down is harmful",
"Maternal pushing guided by the urge to bear down",
]), {
x: 5.35, y: 1.43, w: 4.3, h: 3.6,
fontSize: 11, lineSpacingMultiple: 1.3,
});
addFooter(sl, "Powers of Labour");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 7 – PASSENGER (Fetal Head)
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "The Passenger – Fetal Head Diameters");
// Table of diameters
const rows = [
["Diameter", "Measurement", "Presentation"],
["Suboccipitobregmatic", "9.5 cm", "Fully flexed vertex"],
["Suboccipitofrontal", "10.0 cm", "Partially flexed"],
["Occipitofrontal", "11.5 cm", "Military / neutral"],
["Occipitomental", "13.5 cm", "Brow / extended"],
["Submentovertical", "11.5 cm", "Face (partially extended)"],
["Submentobregmatic", "9.5 cm", "Face (fully extended)"],
["Biparietal (BPD)", "9.5 cm", "Transverse (engagement)"],
["Bitemporal", "8.0 cm", "Transverse (narrowest)"],
];
sl.addTable(rows, {
x: 0.25, y: 0.9, w: 9.5, h: 4.35,
colW: [3.5, 1.8, 4.2],
border: { type: "solid", color: C.mid, pt: 0.5 },
fontFace: "Arial",
fontSize: 11.5,
rowH: 0.43,
autoPage: false,
fill: { color: C.white },
color: C.text,
align: "left",
valign: "middle",
// header row
...({}),
});
// Manually style header using shape overlay
sl.addShape(pres.ShapeType.rect, {
x: 0.25, y: 0.9, w: 9.5, h: 0.43,
fill: { color: C.mid }, line: { color: C.mid },
});
sl.addText("Diameter Measurement Presentation", {
x: 0.3, y: 0.9, w: 9.4, h: 0.43,
fontSize: 12, bold: true, color: C.white, valign: "middle", margin: 0,
});
addFooter(sl, "Fetal Head Diameters");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 8 – PASSAGE (Pelvis)
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "The Passage – Bony Pelvis");
// Gynaecoid pelvis box
sl.addShape(pres.ShapeType.rect, {
x: 0.25, y: 0.9, w: 9.5, h: 0.5,
fill: { color: C.accent }, line: { color: C.accent },
});
sl.addText("Gynaecoid Pelvis – Most Favourable for Labour (50% of women)", {
x: 0.3, y: 0.9, w: 9.4, h: 0.5,
fontSize: 13, bold: true, color: C.white, valign: "middle", margin: 0,
});
const pelvicRows = [
["Plane / Diameter", "AP Diameter", "Transverse", "Clinical Significance"],
["Pelvic Inlet (Brim)", "True Conjugate: 11 cm\nOb. Conjugate: 10.5 cm", "13.5 cm", "Head engages here"],
["Mid-cavity (cavity)", "12 cm", "Bispinous: 10.5 cm", "Narrowest plane"],
["Pelvic Outlet", "Ant-Post: 13.5 cm", "Bituberous: 11 cm", "Head delivers here"],
];
sl.addTable(pelvicRows, {
x: 0.25, y: 1.5, w: 9.5, h: 2.8,
colW: [2.5, 2.5, 2.0, 2.5],
border: { type: "solid", color: C.mid, pt: 0.5 },
fontSize: 11,
rowH: 0.65,
fill: { color: C.white },
color: C.text,
valign: "middle",
});
sl.addText("Pelvic Types (Caldwell-Moloy Classification):", {
x: 0.3, y: 4.42, w: 9.4, h: 0.35,
fontSize: 12, bold: true, color: C.mid,
});
sl.addText(
"Gynaecoid (favourable, round/oval) | Android (funnel-shaped, poor prognosis) | Anthropoid (oval A-P, possible OP delivery) | Platypelloid (flat, rare)",
{
x: 0.3, y: 4.78, w: 9.4, h: 0.4,
fontSize: 11, color: C.sub, italic: true,
}
);
addFooter(sl, "The Passage – Pelvis");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 9 – SECOND STAGE
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Second Stage of Labour");
sl.addShape(pres.ShapeType.rect, {
x: 0.25, y: 0.87, w: 4.55, h: 4.35,
fill: { color: "FFF3E0" }, line: { color: C.gold, width: 1 },
});
sl.addText("Clinical Features", {
x: 0.3, y: 0.9, w: 4.4, h: 0.4,
fontSize: 14, bold: true, color: C.accent, align: "center",
});
sl.addText(bullets([
"Full cervical dilatation (10 cm) to delivery of baby",
"Primigravida: max 1 hr (2 hr with epidural)",
"Multigravida: max 30 min (1 hr with epidural)",
"Urge to bear down / push appears",
"Rectal pressure; feeling of imminent delivery",
"Show (bloodstained mucus) increases",
"Head visible at vulva during contractions",
]), {
x: 0.35, y: 1.38, w: 4.3, h: 3.7,
fontSize: 11, lineSpacingMultiple: 1.3,
});
sl.addShape(pres.ShapeType.rect, {
x: 5.2, y: 0.87, w: 4.55, h: 4.35,
fill: { color: "E8F5E9" }, line: { color: C.teal, width: 1 },
});
sl.addText("Management", {
x: 5.25, y: 0.9, w: 4.4, h: 0.4,
fontSize: 14, bold: true, color: C.teal, align: "center",
});
sl.addText(bullets([
"Position: left lateral (Sims') or lithotomy",
"Encourage bearing down with contractions",
"Monitor FHS after every contraction (auscultation / CTG)",
"Controlled crowning – slow extension of head",
"Check for cord around neck (nuchal cord)",
"Delivery of shoulders – anterior then posterior",
"Oxytocin 10 IU IM after delivery (active management)",
"Note time of delivery; APGAR at 1 and 5 min",
]), {
x: 5.3, y: 1.38, w: 4.3, h: 3.7,
fontSize: 11, lineSpacingMultiple: 1.3,
});
addFooter(sl, "Second Stage of Labour");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 10 – THIRD STAGE
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Third Stage of Labour – Placental Delivery");
// Signs of placental separation
sl.addText("Signs of Placental Separation (Oxorn-Foote):", {
x: 0.3, y: 0.88, w: 9.4, h: 0.38,
fontSize: 14, bold: true, color: C.mid,
});
const signs = [
{ icon: "①", text: "Calkin's sign: Uterus contracts and rises in abdomen", color: C.accent },
{ icon: "②", text: "Sudden gush or trickle of blood from vagina", color: C.teal },
{ icon: "③", text: "Cord lengthens at vulva (Strassman / Barford sign)", color: C.mid },
{ icon: "④", text: "Uterus becomes firm, globular and mobile", color: C.accent },
];
let y = 1.34;
signs.forEach((s) => {
sl.addShape(pres.ShapeType.ellipse, {
x: 0.3, y, w: 0.35, h: 0.35,
fill: { color: s.color }, line: { color: s.color },
});
sl.addText(s.icon, {
x: 0.3, y, w: 0.35, h: 0.35,
fontSize: 11, bold: true, color: C.white, align: "center", valign: "middle", margin: 0,
});
sl.addText(s.text, {
x: 0.75, y: y + 0.02, w: 9, h: 0.33,
fontSize: 12, color: C.text,
});
y += 0.52;
});
// Mechanism of separation
sl.addShape(pres.ShapeType.rect, {
x: 0.25, y: 3.42, w: 4.6, h: 1.75,
fill: { color: "F0E8FF" }, line: { color: "#8B5CF6", width: 1 },
});
sl.addText("Mechanism of Separation", {
x: 0.3, y: 3.45, w: 4.5, h: 0.38,
fontSize: 13, bold: true, color: "#6D28D9",
});
sl.addText(bullets([
"Schultze mechanism (central): Fetal surface first – most common (80%)",
"Matthew-Duncan mechanism (lateral): Edge first – more bleeding during separation",
]), {
x: 0.35, y: 3.85, w: 4.4, h: 1.2,
fontSize: 11, lineSpacingMultiple: 1.3,
});
// Duration
sl.addShape(pres.ShapeType.rect, {
x: 5.15, y: 3.42, w: 4.6, h: 1.75,
fill: { color: "FFF8E1" }, line: { color: C.gold, width: 1 },
});
sl.addText("Duration & Normal Blood Loss", {
x: 5.2, y: 3.45, w: 4.5, h: 0.38,
fontSize: 13, bold: true, color: C.gold,
});
sl.addText(bullets([
"Duration: 5–15 min (up to 30 min acceptable)",
"Physiological blood loss: up to 500 mL",
"Active management reduces PPH risk (Oxytocin + CCT + uterine massage)",
"Examine placenta and membranes for completeness",
]), {
x: 5.2, y: 3.85, w: 4.4, h: 1.2,
fontSize: 11, lineSpacingMultiple: 1.3,
});
addFooter(sl, "Third Stage of Labour");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 11 – SHOW AND MEMBRANES / CERVIX
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Cervical Changes & Show");
// Effacement
sl.addShape(pres.ShapeType.rect, {
x: 0.25, y: 0.88, w: 4.55, h: 2.3,
fill: { color: "E8F0FE" }, line: { color: "#3B82F6", width: 1 },
});
sl.addText("Cervical Effacement", {
x: 0.3, y: 0.9, w: 4.45, h: 0.4,
fontSize: 14, bold: true, color: "#1D4ED8",
});
sl.addText(bullets([
"Shortening and thinning of cervix (taking up)",
"Occurs before/during dilatation in primigravidae",
"Simultaneous with dilatation in multigravidae",
"Expressed as % (0% = 4 cm long; 100% = paper thin)",
]), {
x: 0.35, y: 1.33, w: 4.3, h: 1.7,
fontSize: 11, lineSpacingMultiple: 1.3,
});
// Dilatation
sl.addShape(pres.ShapeType.rect, {
x: 5.2, y: 0.88, w: 4.55, h: 2.3,
fill: { color: "FEE2E2" }, line: { color: C.accent, width: 1 },
});
sl.addText("Cervical Dilatation", {
x: 5.25, y: 0.9, w: 4.45, h: 0.4,
fontSize: 14, bold: true, color: C.accent,
});
sl.addText(bullets([
"Opening of os from 0 to 10 cm",
"Normal rate: ≥1 cm/hr after 4 cm",
"Full dilatation = 10 cm (allows fetal head passage)",
"Assessed by vaginal examination (VE)",
]), {
x: 5.3, y: 1.33, w: 4.3, h: 1.7,
fontSize: 11, lineSpacingMultiple: 1.3,
});
// Show
sl.addShape(pres.ShapeType.rect, {
x: 0.25, y: 3.28, w: 9.5, h: 1.9,
fill: { color: "F9F0FF" }, line: { color: "#7C3AED", width: 1 },
});
sl.addText("Show (Mucus Plug / Operculum)", {
x: 0.3, y: 3.3, w: 9.4, h: 0.4,
fontSize: 14, bold: true, color: "#7C3AED",
});
sl.addText(bullets([
"Blood-stained mucus from cervical canal as os begins to dilate",
"Occurs hours to days before labour onset",
"Not true labour until accompanied by regular contractions",
"Distinguished from antepartum haemorrhage by history and examination",
]), {
x: 0.35, y: 3.75, w: 9.1, h: 1.3,
fontSize: 11, lineSpacingMultiple: 1.3,
});
addFooter(sl, "Cervical Changes & Show");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 12 – RUPTURE OF MEMBRANES
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Rupture of Membranes");
const boxes = [
{
title: "Spontaneous ROM (SROM)",
color: C.teal,
fillColor: "E0F7FA",
items: [
"Occurs at end of first stage / beginning of second stage",
"'Forebag' ruptures with a gush of amniotic fluid",
"Warm, clear, slightly alkaline (Nitrazine test: pH >7)",
"Normal amniotic fluid: clear or slightly milky",
"Meconium-stained fluid = fetal distress (green/dark green)",
],
x: 0.25, y: 0.9, w: 4.55,
},
{
title: "PROM & PPROM",
color: C.accent,
fillColor: "FFE4E6",
items: [
"PROM: rupture ≥1 hr before onset of labour at term",
"PPROM: rupture before 37 weeks",
"Risk: chorioamnionitis, cord prolapse, preterm labour",
"Management: steroids if <34 wk, antibiotics, IOL after 34 wk",
],
x: 5.2, y: 0.9, w: 4.55,
},
];
boxes.forEach((b) => {
sl.addShape(pres.ShapeType.rect, {
x: b.x, y: b.y, w: b.w, h: 3.6,
fill: { color: b.fillColor }, line: { color: b.color, width: 1 },
});
sl.addText(b.title, {
x: b.x + 0.05, y: b.y + 0.05, w: b.w - 0.1, h: 0.4,
fontSize: 13, bold: true, color: b.color,
});
sl.addText(bullets(b.items), {
x: b.x + 0.1, y: b.y + 0.5, w: b.w - 0.2, h: 3.0,
fontSize: 11, lineSpacingMultiple: 1.35,
});
});
// Amniotic fluid volumes
sl.addShape(pres.ShapeType.rect, {
x: 0.25, y: 4.58, w: 9.5, h: 0.65,
fill: { color: "FFF3CD" }, line: { color: C.gold, width: 1 },
});
sl.addText("Amniotic Fluid: Normal volume 800–1000 mL at term | Oligohydramnios: <300 mL | Polyhydramnios: >2000 mL", {
x: 0.35, y: 4.62, w: 9.3, h: 0.55,
fontSize: 11, color: C.dark, italic: false,
});
addFooter(sl, "Rupture of Membranes");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 13 – ENGAGEMENT & PRESENTING PART
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Engagement, Lie, Presentation & Position");
const items4 = [
{
term: "Lie",
def: "Relationship of long axis of fetus to long axis of uterus",
types: "Longitudinal (99%) | Transverse | Oblique",
color: C.mid,
x: 0.25, y: 0.9,
},
{
term: "Presentation",
def: "Part of fetus overlying pelvic inlet",
types: "Vertex (96%) | Breech (3%) | Face | Brow | Shoulder",
color: C.teal,
x: 5.15, y: 0.9,
},
{
term: "Position",
def: "Relationship of denominator to maternal pelvis",
types: "LOA (most common in labour) | LOL | LOT | ROP | ROA | ROT | OA | OP",
color: C.accent,
x: 0.25, y: 2.82,
},
{
term: "Engagement",
def: "Widest diameter of presenting part has passed through pelvic inlet",
types: "Vertex: BPD at inlet | Primigravida: 2–4 wk before labour | Multigravida: at onset or in labour",
color: "#D97706",
x: 5.15, y: 2.82,
},
];
items4.forEach((item) => {
sl.addShape(pres.ShapeType.rect, {
x: item.x, y: item.y, w: 4.6, h: 1.75,
fill: { color: "FAFAFA" }, line: { color: item.color, width: 1.5 },
});
sl.addShape(pres.ShapeType.rect, {
x: item.x, y: item.y, w: 4.6, h: 0.4,
fill: { color: item.color }, line: { color: item.color },
});
sl.addText(item.term, {
x: item.x + 0.05, y: item.y, w: 4.5, h: 0.4,
fontSize: 13, bold: true, color: C.white, valign: "middle", margin: 5,
});
sl.addText(item.def, {
x: item.x + 0.08, y: item.y + 0.44, w: 4.4, h: 0.55,
fontSize: 11, color: C.text, italic: true,
});
sl.addText(item.types, {
x: item.x + 0.08, y: item.y + 1.02, w: 4.4, h: 0.65,
fontSize: 10.5, color: C.sub,
});
});
addFooter(sl, "Engagement, Lie, Presentation & Position");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 14 – MONITORING IN LABOUR
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Monitoring in Labour");
sl.addText("Maternal Monitoring", {
x: 0.3, y: 0.87, w: 4.5, h: 0.38,
fontSize: 14, bold: true, color: C.mid,
});
sl.addText(bullets([
"BP & pulse every 30 min (15 min in active labour)",
"Temperature every 4 hours",
"Urine output; urinalysis for protein/glucose",
"Uterine contractions: frequency, duration, strength",
"Cervical dilatation (VE 4-hourly or as indicated)",
"Station of presenting part",
]), {
x: 0.3, y: 1.28, w: 4.55, h: 3.5,
fontSize: 11.5, lineSpacingMultiple: 1.35,
});
sl.addText("Fetal Monitoring", {
x: 5.2, y: 0.87, w: 4.5, h: 0.38,
fontSize: 14, bold: true, color: C.teal,
});
sl.addText(bullets([
"FHS auscultation after every contraction (intermittent)",
"Normal FHS: 110–160 bpm",
"CTG (cardiotocography) for high-risk cases",
"Liquor colour and volume at SROM",
"Moulding of fetal skull (0 to +++ grades)",
"Caput succedaneum: oedema of presenting scalp",
"Assess descent by abdominal and vaginal examination",
]), {
x: 5.2, y: 1.28, w: 4.55, h: 3.5,
fontSize: 11.5, lineSpacingMultiple: 1.35,
});
addFooter(sl, "Monitoring in Labour");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 15 – PARTOGRAM
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Partogram – Graphic Record of Labour");
sl.addText(
"A partogram is the graphical record of the progress of labour and maternal-fetal condition during labour.",
{
x: 0.3, y: 0.9, w: 9.4, h: 0.55,
fontSize: 13, color: C.text, italic: true,
}
);
// Left column
sl.addText("Components of a Partogram:", {
x: 0.3, y: 1.5, w: 4.5, h: 0.38,
fontSize: 13, bold: true, color: C.mid,
});
sl.addText(bullets([
"Fetal heart rate",
"Amniotic fluid status (C/M/B/A)",
"Moulding of skull (0/+/++/+++)",
"Cervical dilatation (plotted on graph)",
"Descent of presenting part",
"Uterine contractions (frequency & duration)",
"Maternal vital signs",
"Drugs, fluids & oxytocin infusion",
"Urine output",
]), {
x: 0.3, y: 1.92, w: 4.55, h: 3.3,
fontSize: 11, lineSpacingMultiple: 1.3,
});
// Right column - alert/action lines
sl.addShape(pres.ShapeType.rect, {
x: 5.15, y: 1.5, w: 4.6, h: 3.7,
fill: { color: "FFF3CD" }, line: { color: C.gold, width: 1 },
});
sl.addText("Alert Line & Action Line (WHO Partogram):", {
x: 5.2, y: 1.52, w: 4.5, h: 0.4,
fontSize: 12, bold: true, color: C.accent,
});
sl.addText(bullets([
"Alert Line: starts at 4 cm, rises at 1 cm/hr",
"If progress crosses alert line → move to referral facility",
"Action Line: 4 hr to the right of alert line",
"Crossing action line = abnormal labour → intervention",
"Normal labour should progress to the LEFT of alert line",
"Latent phase >8 hr = prolonged latent phase",
]), {
x: 5.2, y: 2.0, w: 4.4, h: 3.0,
fontSize: 11, lineSpacingMultiple: 1.3,
});
addFooter(sl, "Partogram");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 16 – SUMMARY / KEY POINTS
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
sl.background = { color: C.dark };
sl.addText("Key Points – Normal Labour", {
x: 0.5, y: 0.25, w: 9, h: 0.65,
fontSize: 26, bold: true, color: C.white, align: "center",
});
sl.addShape(pres.ShapeType.line, {
x: 1, y: 0.95, w: 8, h: 0,
line: { color: C.gold, width: 2 },
});
const keyPoints = [
"3 Ps: Powers (contractions + bearing down), Passage (bony pelvis), Passenger (fetus)",
"Stages: I (onset → full dilatation), II (full dilatation → delivery), III (delivery → placenta), IV (1st hour)",
"Normal Stage I duration: 12–14 hr (primi), 6–8 hr (multi); cervical dilatation ≥1 cm/hr after 4 cm",
"8 Cardinal movements: Engagement, Descent, Flexion, Internal rotation, Extension, Restitution, External rotation, Expulsion",
"Fetal head denominator = occiput; most common position = LOA",
"Monitor: FHS after every contraction (110–160 bpm), BP/pulse 30-min, 4-hourly VE",
"Partogram: alert line at 1 cm/hr; action line 4 hr to the right",
"Active management of 3rd stage: Oxytocin 10 IU IM + CCT + uterine massage",
"Normal blood loss: up to 500 mL; >500 mL = PPH",
];
let yy = 1.1;
keyPoints.forEach((pt, i) => {
sl.addShape(pres.ShapeType.ellipse, {
x: 0.25, y: yy + 0.05, w: 0.28, h: 0.28,
fill: { color: C.gold }, line: { color: C.gold },
});
sl.addText((i + 1).toString(), {
x: 0.25, y: yy + 0.05, w: 0.28, h: 0.28,
fontSize: 9, bold: true, color: C.dark, align: "center", valign: "middle", margin: 0,
});
sl.addText(pt, {
x: 0.62, y: yy, w: 9.1, h: 0.42,
fontSize: 11, color: C.white, lineSpacingMultiple: 1.1,
});
yy += 0.45;
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SAVE
// ═══════════════════════════════════════════════════════════════════════════
const OUT = "/home/daytona/workspace/normal-labour-ppt/Normal_Labour_OxornFoote_v2.pptx";
pres.writeFile({ fileName: OUT })
.then(() => console.log("✅ Saved:", OUT))
.catch((e) => { console.error("❌ Error:", e); process.exit(1); });
cd /home/daytona/workspace/normal-labour-ppt && node normal_labour_v2.js 2>&1
node /home/daytona/skills/shared/scripts/fetch_images.js "https://upload.wikimedia.org/wikipedia/commons/2/29/Stages_of_Childbirth.png" 2>&1 | head -c 200
~/normal-labour-ppt/normal_labour_v2.js
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/normal-labour-ppt/normal_labour_v2.js'
cd /home/daytona/workspace/normal-labour-ppt && node normal_labour_v2.js 2>&1
ls -lh /home/daytona/workspace/normal-labour-ppt/Normal_Labour_OxornFoote_v2.pptx
Normal Labour OxornFoote v2
Presentation · PPTX
| # | Slide Title | Highlights |
|---|---|---|
| 1 | Title Slide | Normal Labour - Oxorn-Foote branding |
| 2 | Definition & Prerequisites | Oxorn-Foote definition, 3 Ps box |
| 3 | Stages of Labour | All 4 stages with diagram image (Wikimedia) |
| 4 | First Stage in Detail | Latent vs Active phase side-by-side boxes |
| 5 | Cardinal Movements | All 8 steps (Engagement → Expulsion) with diagram |
| 6 | Powers of Labour | Uterine contractions (Montevideo Units) + bearing down |
| 7 | Fetal Head Diameters | Full table: BPD, suboccipitobregmatic, occipitomental, etc. |
| 8 | Bony Pelvis (Passage) | Caldwell-Moloy types, pelvic planes table |
| 9 | Second Stage | Clinical features + management (CTG, crowning, oxytocin) |
| 10 | Third Stage | Signs of separation, Schultze vs Matthew-Duncan |
| 11 | Cervical Changes & Show | Effacement, dilatation, mucus plug |
| 12 | Rupture of Membranes | SROM, PROM, PPROM, liquor assessment |
| 13 | Engagement, Lie, Presentation, Position | 4-card layout with LOA, denominator, etc. |
| 14 | Monitoring in Labour | Maternal + fetal monitoring checklists |
| 15 | Partogram | WHO alert/action lines, all components |
| 16 | Key Points Summary | 9 bullet summary on dark background |
Search for clinical images of labour stages and mechanisms
clinical diagrams mechanism of labour cardinal movements fetal head obstetrics wikimedia commons
stages of labour cervical dilation effacement partogram clinical image site:wikimedia.org OR site:openi.nlm.nih.gov
mechanism of labour obstetrics diagram cardinal movements engagement descent flexion extension wikimedia
fetal head engagement flexion internal rotation extension restitution clinical obstetrics image diagram





| # | Image | Topic | Source |
|---|---|---|---|
| 1 | Cardinal Movements chart | All 8 cardinal movements in one diagram | Childbirth Graphics |
| 2 | Stages of Childbirth | 3 stages overview with fetal/cervical anatomy | Wikimedia Commons (OpenStax) |
| 3 | Labour curves by parity | Contemporary Friedman curve (Zhang 2010) | Creasy & Resnik textbook |
| 4 | Dilation by BMI (nullipara) | How BMI affects labour speed | Creasy & Resnik textbook |
| 5 | Dilation by BMI (multipara) | How BMI affects labour speed (multiparas) | Creasy & Resnik textbook |
Note on the library: The Oxorn-Foote textbook is not in the digital library, but the library does contain Creasy & Resnik's Maternal-Fetal Medicine and Berek & Novak's Gynecology, both of which have embedded figures available. The labour curve images above are pulled directly from Creasy & Resnik. The Oxorn-Foote-specific diagrams (e.g., engagement in the gynaecoid pelvis, Schultze vs. Matthew-Duncan separation) are best accessed via the printed textbook or a licensed digital copy.
Update the PPT with these clinical images embedded
node /home/daytona/skills/shared/scripts/fetch_images.js "https://www.childbirthgraphics.com/c.3352071/childbirthgraphics/img/Cardinal-Movements-Large-Chart.jpg" 2>&1 | head -c 100
node /home/daytona/skills/shared/scripts/fetch_images.js "https://upload.wikimedia.org/wikipedia/commons/2/29/Stages_of_Childbirth.png" 2>&1 | head -c 100
node /home/daytona/skills/shared/scripts/fetch_images.js "https://cdn.orris.care/cdss_images/b64d20003df5a43a6442d0df3333a7b9eefde630e1577c9aff0958a9be937cad.png" 2>&1 | head -c 100
node /home/daytona/skills/shared/scripts/fetch_images.js "https://cdn.orris.care/cdss_images/a6b07c8cf124007c5acb1563dec0f76e6e40a8f29a687ae835dfa3a33b998a5d.png" 2>&1 | head -c 100
node /home/daytona/skills/shared/scripts/fetch_images.js "https://cdn.orris.care/cdss_images/5ce6e36f04c0d21a2d383a8187c0a0be892a2a9aac2bde81a091fb5111be2a96.png" 2>&1 | head -c 100
~/normal-labour-ppt/normal_labour_v3.js
/**
* Normal Labour – Oxorn-Foote (v3 – with 5 clinical images embedded)
*
* Image placement plan:
* Slide 1 – Title (no image, decorative only)
* Slide 2 – Definition (no image)
* Slide 3 – Stages overview → IMG_STAGES (Wikimedia Stages of Childbirth)
* Slide 4 – First Stage (no image – text-heavy two-column)
* Slide 5 – Cardinal Mvmts → IMG_CARDINAL (Childbirth Graphics chart)
* Slide 6 – Powers (no image)
* Slide 7 – Fetal head table (no image)
* Slide 8 – Pelvis (no image)
* Slide 9 – Second Stage (no image)
* Slide 10 – Third Stage (no image)
* Slide 11 – Cervix & Show (no image)
* Slide 12 – ROM (no image)
* Slide 13 – Engagement/Lie (no image)
* Slide 14 – Monitoring (no image)
* Slide 15 – Partogram → IMG_LABOUR_CURVES (Creasy Fig 40.2 – parity labour curves)
* Slide 16 – NEW dedicated image slide: Cervical dilation by BMI
* → IMG_BMI_NULLI + IMG_BMI_MULTI side by side
* Slide 17 – Key points summary
*/
const pptxgen = require("pptxgenjs");
const { execSync } = require("child_process");
// ─── Color Palette ───────────────────────────────────────────────────────────
const C = {
dark: "2C0E1A",
mid: "6D1B3A",
accent: "B5314C",
light: "F7E8EE",
white: "FFFFFF",
text: "1A1A2E",
sub: "5C4050",
gold: "D4A017",
teal: "2E8B8B",
};
// ─── Fetch images ─────────────────────────────────────────────────────────────
function fetchImg(url) {
try {
const raw = execSync(
`node /home/daytona/skills/shared/scripts/fetch_images.js "${url}"`,
{ timeout: 30000, maxBuffer: 60 * 1024 * 1024 }
).toString();
const arr = JSON.parse(raw);
return (arr[0] && !arr[0].error) ? arr[0].base64 : null;
} catch (e) {
console.warn("⚠ Image fetch failed:", url, e.message);
return null;
}
}
console.log("Fetching clinical images...");
const IMG_STAGES = fetchImg("https://upload.wikimedia.org/wikipedia/commons/2/29/Stages_of_Childbirth.png");
const IMG_CARDINAL = fetchImg("https://www.childbirthgraphics.com/c.3352071/childbirthgraphics/img/Cardinal-Movements-Large-Chart.jpg");
const IMG_CURVES = fetchImg("https://cdn.orris.care/cdss_images/b64d20003df5a43a6442d0df3333a7b9eefde630e1577c9aff0958a9be937cad.png");
const IMG_BMI_NULLI = fetchImg("https://cdn.orris.care/cdss_images/a6b07c8cf124007c5acb1563dec0f76e6e40a8f29a687ae835dfa3a33b998a5d.png");
const IMG_BMI_MULTI = fetchImg("https://cdn.orris.care/cdss_images/5ce6e36f04c0d21a2d383a8187c0a0be892a2a9aac2bde81a091fb5111be2a96.png");
console.log("Images fetched:", [IMG_STAGES, IMG_CARDINAL, IMG_CURVES, IMG_BMI_NULLI, IMG_BMI_MULTI].map(x => x ? "✓" : "✗").join(", "));
// ─── Presentation Setup ──────────────────────────────────────────────────────
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Normal Labour – Oxorn-Foote (with Clinical Images)";
pres.author = "Medical Education";
// ─── Helpers ──────────────────────────────────────────────────────────────────
const setLightBG = sl => { sl.background = { color: C.light }; };
const setDarkBG = sl => { sl.background = { color: C.dark }; };
function addHeaderBar(slide, title) {
slide.addShape(pres.ShapeType.rect, { x:0, y:0, w:10, h:0.75, fill:{color:C.mid}, line:{color:C.mid} });
slide.addText(title, { x:0.15, y:0, w:9.7, h:0.75, fontSize:22, bold:true, color:C.white, valign:"middle", margin:0 });
}
function addFooter(slide, note) {
slide.addShape(pres.ShapeType.rect, { x:0, y:5.3, w:10, h:0.325, fill:{color:C.dark}, line:{color:C.dark} });
slide.addText(`Oxorn-Foote: Human Labor & Birth | ${note}`, {
x:0.2, y:5.3, w:9.6, h:0.325, fontSize:9, color:C.white, valign:"middle", margin:0,
});
}
function bullets(items) {
return items.map(t => ({ text:t, options:{ bullet:{type:"bullet",indent:15}, breakLine:true, color:C.text } }));
}
function addImgCaption(slide, caption, x, y, w) {
slide.addShape(pres.ShapeType.rect, { x, y, w, h:0.28, fill:{color:"00000044"}, line:{color:"000000"} });
slide.addText(caption, { x, y, w, h:0.28, fontSize:8, color:C.white, italic:true, align:"center", valign:"middle", margin:0 });
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 1 – TITLE
// ════════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setDarkBG(sl);
sl.addShape(pres.ShapeType.ellipse, { x:7.2, y:-0.8, w:4.5, h:4.5, fill:{color:C.mid}, line:{color:C.mid} });
sl.addShape(pres.ShapeType.ellipse, { x:-1.2, y:3.5, w:3.5, h:3.5, fill:{color:C.mid}, line:{color:C.mid} });
sl.addText("NORMAL LABOUR", { x:0.5, y:0.8, w:9, h:1.2, fontSize:44, bold:true, color:C.white, align:"center", charSpacing:4 });
sl.addText("A Comprehensive Review Based on Oxorn-Foote:", { x:0.5, y:2.1, w:9, h:0.5, fontSize:18, color:C.gold, align:"center", italic:true });
sl.addText("Human Labor & Birth (6th Edition)", { x:0.5, y:2.55, w:9, h:0.45, fontSize:16, color:C.gold, align:"center", italic:true });
sl.addShape(pres.ShapeType.line, { x:2, y:3.15, w:6, h:0, line:{color:C.accent, width:2} });
sl.addText("Obstetrics & Gynaecology", { x:0.5, y:3.3, w:9, h:0.4, fontSize:14, color:C.light, align:"center" });
sl.addText("Dept. of Obstetrics & Gynaecology", { x:0.5, y:4.9, w:9, h:0.35, fontSize:11, color:"AAAAAA", align:"center" });
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 2 – DEFINITION & PREREQUISITES
// ════════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Definition of Normal Labour");
sl.addText([
{ text:"Oxorn-Foote Definition: ", options:{ bold:true, color:C.accent } },
{ text:"Normal labour is the process by which the products of conception are expelled from the uterus after the 28th week of pregnancy.", options:{ color:C.text } },
], { x:0.3, y:0.95, w:9.4, h:0.7, fontSize:14 });
sl.addText("Prerequisites for Normal Labour:", { x:0.3, y:1.75, w:9.4, h:0.4, fontSize:16, bold:true, color:C.mid });
sl.addText(bullets([
"Normal pelvis (gynaecoid type) with adequate diameters",
"Normal fetus of average size in a favourable position",
"Efficient uterine contractions (powers)",
"Intact membranes initially; lower uterine segment well formed",
"Fully effaced and dilating cervix",
]), { x:0.4, y:2.2, w:9.2, h:2.5, fontSize:13, lineSpacingMultiple:1.3 });
sl.addShape(pres.ShapeType.rect, { x:7.5, y:1.75, w:2.2, h:1.3, fill:{color:C.accent}, line:{color:C.accent} });
sl.addText("Pelvis\n+\nPassenger\n+\nPower", { x:7.5, y:1.75, w:2.2, h:1.3, fontSize:13, bold:true, color:C.white, align:"center", valign:"middle" });
addFooter(sl, "Definition & Prerequisites");
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 3 – STAGES OF LABOUR ← IMG_STAGES (Wikimedia OpenStax)
// ════════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Stages of Labour");
// Clinical image – left-dominant layout
if (IMG_STAGES) {
sl.addImage({ data: IMG_STAGES, x: 0.2, y: 0.85, w: 5.0, h: 4.35 });
addImgCaption(sl, "Stages of Childbirth — OpenStax Anatomy & Physiology (CC BY 4.0, Wikimedia Commons)", 0.2, 4.88, 5.0);
}
// Stages text – right column
const stagesData = [
{ num:"Stage I", sub:"Onset of true labour → full cervical dilatation (10 cm)", dur:"Primi: 12–14 hr | Multi: 6–8 hr", color:C.mid },
{ num:"Stage II", sub:"Full dilatation → delivery of baby", dur:"Primi: ≤2 hr | Multi: ≤1 hr", color:C.accent },
{ num:"Stage III", sub:"Delivery of baby → expulsion of placenta & membranes", dur:"5–30 min", color:C.teal },
{ num:"Stage IV", sub:"First hour post-delivery (observation & haemostasis)", dur:"60 min observation", color:C.gold },
];
let yPos = 0.9;
stagesData.forEach(s => {
sl.addShape(pres.ShapeType.rect, { x:5.45, y:yPos, w:0.12, h:0.9, fill:{color:s.color}, line:{color:s.color} });
sl.addText(s.num, { x:5.65, y:yPos, w:1.5, h:0.35, fontSize:13, bold:true, color:s.color, margin:0 });
sl.addText(s.sub, { x:5.65, y:yPos+0.33, w:4.1, h:0.32, fontSize:10.5, color:C.sub, margin:0 });
sl.addText(s.dur, { x:5.65, y:yPos+0.62, w:4.1, h:0.25, fontSize:9.5, color:C.mid, italic:true, margin:0 });
yPos += 1.08;
});
addFooter(sl, "Stages of Labour");
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 4 – FIRST STAGE IN DETAIL
// ════════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "First Stage of Labour");
sl.addShape(pres.ShapeType.rect, { x:0.25, y:0.9, w:4.5, h:4.3, fill:{color:"F0D8E3"}, line:{color:C.mid, width:1} });
sl.addText("Latent Phase", { x:0.3, y:0.92, w:4.4, h:0.45, fontSize:15, bold:true, color:C.mid, align:"center" });
sl.addText(bullets([
"Onset of regular contractions to 3–4 cm dilatation",
"Cervical effacement is the main change",
"Duration: up to 8 hr (primi), 4 hr (multi)",
"Contractions: mild, 5–10 min apart, 20–40 sec",
"Slow, unpredictable progress",
]), { x:0.35, y:1.42, w:4.3, h:3.6, fontSize:11.5, lineSpacingMultiple:1.35 });
sl.addShape(pres.ShapeType.rect, { x:5.25, y:0.9, w:4.5, h:4.3, fill:{color:"D8EDF0"}, line:{color:C.teal, width:1} });
sl.addText("Active Phase", { x:5.3, y:0.92, w:4.4, h:0.45, fontSize:15, bold:true, color:C.teal, align:"center" });
sl.addText(bullets([
"3–4 cm to full dilatation (10 cm)",
"Cervical dilatation: ≥1 cm/hr (primi), ≥1.5 cm/hr (multi)",
"Descent of presenting part begins",
"Contractions: 3–5 min apart, 45–60 sec, moderate-strong",
"Acceleration → phase of max slope → deceleration",
"Friedman Curve: graphical representation of progress",
]), { x:5.3, y:1.42, w:4.3, h:3.6, fontSize:11.5, lineSpacingMultiple:1.35 });
addFooter(sl, "First Stage of Labour");
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 5 – MECHANISM OF LABOUR ← IMG_CARDINAL (full-width clinical chart)
// ════════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Mechanism of Labour – Cardinal Movements (LOA)");
if (IMG_CARDINAL) {
// Large image – right 55% of slide
sl.addImage({ data: IMG_CARDINAL, x: 4.6, y: 0.82, w: 5.2, h: 4.3 });
addImgCaption(sl, "Cardinal Movements Chart — Childbirth Graphics (©2011)", 4.6, 4.88, 5.2);
}
// Text left side
const moves = [
{ n:"1. Engagement", d:"BPD passes through pelvic inlet" },
{ n:"2. Descent", d:"Continuous; driven by contractions" },
{ n:"3. Flexion", d:"Chin to chest; suboccipitobregmatic (9.5 cm)" },
{ n:"4. Internal Rotation", d:"Occiput rotates anteriorly (LOA → OA)" },
{ n:"5. Extension", d:"Head extends under pubic symphysis" },
{ n:"6. Restitution", d:"Head rotates back 1/8 circle" },
{ n:"7. External Rotation", d:"Further 1/8 as shoulders align A-P" },
{ n:"8. Expulsion", d:"Ant. shoulder, post. shoulder, then body" },
];
let y = 0.88;
moves.forEach(m => {
sl.addText([
{ text: m.n + ": ", options: { bold:true, color:C.accent } },
{ text: m.d, options: { color:C.text } },
], { x:0.25, y, w:4.2, h:0.46, fontSize:11, lineSpacingMultiple:1.1 });
y += 0.5;
});
addFooter(sl, "Cardinal Movements of Labour");
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 6 – POWERS OF LABOUR
// ════════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Powers of Labour");
sl.addShape(pres.ShapeType.rect, { x:0.25, y:0.9, w:4.5, h:4.3, fill:{color:"EEF0F8"}, line:{color:C.teal, width:1} });
sl.addText("Uterine Contractions", { x:0.3, y:0.93, w:4.4, h:0.45, fontSize:14, bold:true, color:C.teal, align:"center" });
sl.addText(bullets([
"Involuntary, rhythmical, intermittent",
"Fundal dominance – fundus contracts first and strongest",
"Intensity: 30–60 mmHg in active labour",
"Frequency: every 2–3 min in active labour",
"Duration: 45–60 seconds",
"Resting tone: 8–12 mmHg",
"Montevideo Units: amplitude × frequency in 10 min (>200 MU = adequate)",
]), { x:0.35, y:1.43, w:4.3, h:3.6, fontSize:11, lineSpacingMultiple:1.3 });
sl.addShape(pres.ShapeType.rect, { x:5.25, y:0.9, w:4.5, h:4.3, fill:{color:"F0F8EE"}, line:{color:"3A7D44", width:1} });
sl.addText("Voluntary Expulsive Forces", { x:5.3, y:0.93, w:4.4, h:0.45, fontSize:14, bold:true, color:"3A7D44", align:"center" });
sl.addText(bullets([
"Valsalva manoeuvre (bearing down) in Stage II",
"Diaphragm fixed, glottis closed, abdominal muscles contract",
"Adds 20–40 mmHg to intrauterine pressure",
"Effective only after full cervical dilatation",
"Premature bearing down is harmful",
"Guided by maternal urge to push",
]), { x:5.35, y:1.43, w:4.3, h:3.6, fontSize:11, lineSpacingMultiple:1.3 });
addFooter(sl, "Powers of Labour");
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 7 – PASSENGER (Fetal Head Diameters)
// ════════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "The Passenger – Fetal Head Diameters");
const rows = [
["Diameter","Measurement","Presentation"],
["Suboccipitobregmatic","9.5 cm","Fully flexed vertex"],
["Suboccipitofrontal","10.0 cm","Partially flexed"],
["Occipitofrontal","11.5 cm","Military / neutral"],
["Occipitomental","13.5 cm","Brow / extended"],
["Submentovertical","11.5 cm","Face (partially extended)"],
["Submentobregmatic","9.5 cm","Face (fully extended)"],
["Biparietal (BPD)","9.5 cm","Transverse (engagement)"],
["Bitemporal","8.0 cm","Transverse (narrowest)"],
];
sl.addTable(rows, {
x:0.25, y:0.9, w:9.5, h:4.35,
colW:[3.5,1.8,4.2],
border:{type:"solid",color:C.mid,pt:0.5},
fontFace:"Arial", fontSize:11.5, rowH:0.43,
fill:{color:C.white}, color:C.text, align:"left", valign:"middle",
});
sl.addShape(pres.ShapeType.rect, { x:0.25, y:0.9, w:9.5, h:0.43, fill:{color:C.mid}, line:{color:C.mid} });
sl.addText("Diameter Measurement Presentation", {
x:0.3, y:0.9, w:9.4, h:0.43, fontSize:12, bold:true, color:C.white, valign:"middle", margin:0,
});
addFooter(sl, "Fetal Head Diameters");
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 8 – PASSAGE (Pelvis)
// ════════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "The Passage – Bony Pelvis");
sl.addShape(pres.ShapeType.rect, { x:0.25, y:0.9, w:9.5, h:0.5, fill:{color:C.accent}, line:{color:C.accent} });
sl.addText("Gynaecoid Pelvis – Most Favourable for Labour (50% of women)", {
x:0.3, y:0.9, w:9.4, h:0.5, fontSize:13, bold:true, color:C.white, valign:"middle", margin:0,
});
const pelvicRows = [
["Plane / Diameter","AP Diameter","Transverse","Clinical Significance"],
["Pelvic Inlet (Brim)","True Conjugate: 11 cm\nOb. Conjugate: 10.5 cm","13.5 cm","Head engages here"],
["Mid-cavity (cavity)","12 cm","Bispinous: 10.5 cm","Narrowest plane"],
["Pelvic Outlet","Ant-Post: 13.5 cm","Bituberous: 11 cm","Head delivers here"],
];
sl.addTable(pelvicRows, {
x:0.25, y:1.5, w:9.5, h:2.8,
colW:[2.5,2.5,2.0,2.5],
border:{type:"solid",color:C.mid,pt:0.5},
fontSize:11, rowH:0.65,
fill:{color:C.white}, color:C.text, valign:"middle",
});
sl.addText("Pelvic Types (Caldwell-Moloy Classification):", {
x:0.3, y:4.42, w:9.4, h:0.35, fontSize:12, bold:true, color:C.mid,
});
sl.addText("Gynaecoid (favourable, round/oval) | Android (funnel-shaped, poor prognosis) | Anthropoid (oval A-P) | Platypelloid (flat, rare)", {
x:0.3, y:4.78, w:9.4, h:0.4, fontSize:11, color:C.sub, italic:true,
});
addFooter(sl, "The Passage – Pelvis");
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 9 – SECOND STAGE
// ════════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Second Stage of Labour");
sl.addShape(pres.ShapeType.rect, { x:0.25, y:0.87, w:4.55, h:4.35, fill:{color:"FFF3E0"}, line:{color:C.gold, width:1} });
sl.addText("Clinical Features", { x:0.3, y:0.9, w:4.4, h:0.4, fontSize:14, bold:true, color:C.accent, align:"center" });
sl.addText(bullets([
"Full cervical dilatation (10 cm) to delivery of baby",
"Primigravida: max 1 hr (2 hr with epidural)",
"Multigravida: max 30 min (1 hr with epidural)",
"Urge to bear down / push appears",
"Rectal pressure; feeling of imminent delivery",
"Show increases; head visible at vulva",
]), { x:0.35, y:1.38, w:4.3, h:3.7, fontSize:11, lineSpacingMultiple:1.3 });
sl.addShape(pres.ShapeType.rect, { x:5.2, y:0.87, w:4.55, h:4.35, fill:{color:"E8F5E9"}, line:{color:C.teal, width:1} });
sl.addText("Management", { x:5.25, y:0.9, w:4.4, h:0.4, fontSize:14, bold:true, color:C.teal, align:"center" });
sl.addText(bullets([
"Position: left lateral (Sims') or lithotomy",
"Encourage bearing down with contractions",
"Monitor FHS after every contraction",
"Controlled crowning – slow extension of head",
"Check for nuchal cord",
"Delivery of shoulders – anterior then posterior",
"Oxytocin 10 IU IM after delivery",
"APGAR at 1 and 5 min",
]), { x:5.3, y:1.38, w:4.3, h:3.7, fontSize:11, lineSpacingMultiple:1.3 });
addFooter(sl, "Second Stage of Labour");
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 10 – THIRD STAGE
// ════════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Third Stage of Labour – Placental Delivery");
sl.addText("Signs of Placental Separation (Oxorn-Foote):", { x:0.3, y:0.88, w:9.4, h:0.38, fontSize:14, bold:true, color:C.mid });
const signs = [
{ icon:"①", text:"Calkin's sign: Uterus contracts, becomes globular and rises", color:C.accent },
{ icon:"②", text:"Sudden gush or trickle of blood from vagina", color:C.teal },
{ icon:"③", text:"Cord lengthens at vulva (Strassman / Barford sign)", color:C.mid },
{ icon:"④", text:"Uterus becomes firm, globular and mobile", color:C.accent },
];
let y = 1.34;
signs.forEach(s => {
sl.addShape(pres.ShapeType.ellipse, { x:0.3, y, w:0.35, h:0.35, fill:{color:s.color}, line:{color:s.color} });
sl.addText(s.icon, { x:0.3, y, w:0.35, h:0.35, fontSize:11, bold:true, color:C.white, align:"center", valign:"middle", margin:0 });
sl.addText(s.text, { x:0.75, y:y+0.02, w:9, h:0.33, fontSize:12, color:C.text });
y += 0.52;
});
sl.addShape(pres.ShapeType.rect, { x:0.25, y:3.42, w:4.6, h:1.75, fill:{color:"F0E8FF"}, line:{color:"#8B5CF6", width:1} });
sl.addText("Mechanism of Separation", { x:0.3, y:3.45, w:4.5, h:0.38, fontSize:13, bold:true, color:"#6D28D9" });
sl.addText(bullets([
"Schultze (80%): Central separation – fetal surface first",
"Matthew-Duncan (20%): Lateral – edge first, more bleeding",
]), { x:0.35, y:3.85, w:4.4, h:1.2, fontSize:11, lineSpacingMultiple:1.3 });
sl.addShape(pres.ShapeType.rect, { x:5.15, y:3.42, w:4.6, h:1.75, fill:{color:"FFF8E1"}, line:{color:C.gold, width:1} });
sl.addText("Duration & Blood Loss", { x:5.2, y:3.45, w:4.5, h:0.38, fontSize:13, bold:true, color:C.gold });
sl.addText(bullets([
"Duration: 5–15 min (up to 30 min acceptable)",
"Normal blood loss: up to 500 mL",
"Active management: Oxytocin + CCT + uterine massage",
]), { x:5.2, y:3.85, w:4.4, h:1.2, fontSize:11, lineSpacingMultiple:1.3 });
addFooter(sl, "Third Stage of Labour");
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 11 – CERVICAL CHANGES & SHOW
// ════════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Cervical Changes & Show");
sl.addShape(pres.ShapeType.rect, { x:0.25, y:0.88, w:4.55, h:2.3, fill:{color:"E8F0FE"}, line:{color:"#3B82F6", width:1} });
sl.addText("Cervical Effacement", { x:0.3, y:0.9, w:4.45, h:0.4, fontSize:14, bold:true, color:"#1D4ED8" });
sl.addText(bullets([
"Shortening and thinning of cervix (taking up)",
"Before dilatation in primigravidae",
"Simultaneous with dilatation in multigravidae",
"Expressed as % (0% = 4 cm long; 100% = paper thin)",
]), { x:0.35, y:1.33, w:4.3, h:1.7, fontSize:11, lineSpacingMultiple:1.3 });
sl.addShape(pres.ShapeType.rect, { x:5.2, y:0.88, w:4.55, h:2.3, fill:{color:"FEE2E2"}, line:{color:C.accent, width:1} });
sl.addText("Cervical Dilatation", { x:5.25, y:0.9, w:4.45, h:0.4, fontSize:14, bold:true, color:C.accent });
sl.addText(bullets([
"Opening of os from 0 to 10 cm",
"Normal rate: ≥1 cm/hr after 4 cm",
"Full dilatation = 10 cm",
"Assessed by vaginal examination (VE)",
]), { x:5.3, y:1.33, w:4.3, h:1.7, fontSize:11, lineSpacingMultiple:1.3 });
sl.addShape(pres.ShapeType.rect, { x:0.25, y:3.28, w:9.5, h:1.9, fill:{color:"F9F0FF"}, line:{color:"#7C3AED", width:1} });
sl.addText("Show (Mucus Plug / Operculum)", { x:0.3, y:3.3, w:9.4, h:0.4, fontSize:14, bold:true, color:"#7C3AED" });
sl.addText(bullets([
"Blood-stained mucus from cervical canal as os begins to dilate",
"Occurs hours to days before labour onset",
"Not true labour until accompanied by regular contractions",
"Distinguished from APH by history and examination",
]), { x:0.35, y:3.75, w:9.1, h:1.3, fontSize:11, lineSpacingMultiple:1.3 });
addFooter(sl, "Cervical Changes & Show");
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 12 – RUPTURE OF MEMBRANES
// ════════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Rupture of Membranes");
const boxes = [
{ title:"Spontaneous ROM (SROM)", color:C.teal, fillColor:"E0F7FA",
items:["End of first stage or start of second stage","Warm gush of amniotic fluid","Nitrazine test: pH >7 (alkaline)","Normal fluid: clear or slightly milky","Meconium-stained = fetal distress"],
x:0.25, y:0.9, w:4.55 },
{ title:"PROM & PPROM", color:C.accent, fillColor:"FFE4E6",
items:["PROM: rupture ≥1 hr before labour at term","PPROM: rupture before 37 weeks","Risk: chorioamnionitis, cord prolapse","Management: steroids <34 wk, antibiotics, IOL after 34 wk"],
x:5.2, y:0.9, w:4.55 },
];
boxes.forEach(b => {
sl.addShape(pres.ShapeType.rect, { x:b.x, y:b.y, w:b.w, h:3.6, fill:{color:b.fillColor}, line:{color:b.color, width:1} });
sl.addText(b.title, { x:b.x+0.05, y:b.y+0.05, w:b.w-0.1, h:0.4, fontSize:13, bold:true, color:b.color });
sl.addText(bullets(b.items), { x:b.x+0.1, y:b.y+0.5, w:b.w-0.2, h:3.0, fontSize:11, lineSpacingMultiple:1.35 });
});
sl.addShape(pres.ShapeType.rect, { x:0.25, y:4.58, w:9.5, h:0.65, fill:{color:"FFF3CD"}, line:{color:C.gold, width:1} });
sl.addText("Amniotic Fluid: Normal volume 800–1000 mL at term | Oligohydramnios: <300 mL | Polyhydramnios: >2000 mL", {
x:0.35, y:4.62, w:9.3, h:0.55, fontSize:11, color:C.dark,
});
addFooter(sl, "Rupture of Membranes");
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 13 – ENGAGEMENT, LIE, PRESENTATION, POSITION
// ════════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Engagement, Lie, Presentation & Position");
const items4 = [
{ term:"Lie", def:"Relationship of long axis of fetus to long axis of uterus", types:"Longitudinal (99%) | Transverse | Oblique", color:C.mid, x:0.25, y:0.9 },
{ term:"Presentation", def:"Part of fetus overlying pelvic inlet", types:"Vertex (96%) | Breech (3%) | Face | Brow | Shoulder", color:C.teal, x:5.15, y:0.9 },
{ term:"Position", def:"Relationship of denominator to maternal pelvis", types:"LOA (most common) | LOL | LOT | ROP | ROA | ROT | OA | OP", color:C.accent, x:0.25, y:2.82 },
{ term:"Engagement", def:"Widest diameter of presenting part has passed through pelvic inlet", types:"Vertex: BPD at inlet | Primi: 2–4 wk before | Multi: at or in labour", color:"#D97706", x:5.15, y:2.82 },
];
items4.forEach(item => {
sl.addShape(pres.ShapeType.rect, { x:item.x, y:item.y, w:4.6, h:1.75, fill:{color:"FAFAFA"}, line:{color:item.color, width:1.5} });
sl.addShape(pres.ShapeType.rect, { x:item.x, y:item.y, w:4.6, h:0.4, fill:{color:item.color}, line:{color:item.color} });
sl.addText(item.term, { x:item.x+0.05, y:item.y, w:4.5, h:0.4, fontSize:13, bold:true, color:C.white, valign:"middle", margin:5 });
sl.addText(item.def, { x:item.x+0.08, y:item.y+0.44, w:4.4, h:0.55, fontSize:11, color:C.text, italic:true });
sl.addText(item.types,{ x:item.x+0.08, y:item.y+1.02, w:4.4, h:0.65, fontSize:10.5, color:C.sub });
});
addFooter(sl, "Engagement, Lie, Presentation & Position");
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 14 – MONITORING IN LABOUR
// ════════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Monitoring in Labour");
sl.addText("Maternal Monitoring", { x:0.3, y:0.87, w:4.5, h:0.38, fontSize:14, bold:true, color:C.mid });
sl.addText(bullets([
"BP & pulse every 30 min (15 min in active labour)",
"Temperature every 4 hours",
"Urine output; urinalysis for protein/glucose",
"Uterine contractions: frequency, duration, strength",
"Cervical dilatation (VE 4-hourly or as indicated)",
"Station of presenting part",
]), { x:0.3, y:1.28, w:4.55, h:3.5, fontSize:11.5, lineSpacingMultiple:1.35 });
sl.addText("Fetal Monitoring", { x:5.2, y:0.87, w:4.5, h:0.38, fontSize:14, bold:true, color:C.teal });
sl.addText(bullets([
"FHS auscultation after every contraction",
"Normal FHS: 110–160 bpm",
"CTG (cardiotocography) for high-risk cases",
"Liquor colour and volume at SROM",
"Moulding: grades 0 / + / ++ / +++",
"Caput succedaneum: oedema of presenting scalp",
"Descent assessed abdominally and vaginally",
]), { x:5.2, y:1.28, w:4.55, h:3.5, fontSize:11.5, lineSpacingMultiple:1.35 });
addFooter(sl, "Monitoring in Labour");
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 15 – PARTOGRAM ← IMG_CURVES (Creasy & Resnik Fig 40.2)
// ════════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Partogram & Labour Curves");
if (IMG_CURVES) {
sl.addImage({ data: IMG_CURVES, x: 5.3, y: 0.85, w: 4.5, h: 3.5 });
addImgCaption(sl, "Fig 40.2 – Labour curves by parity (P0/P1/P2+). Zhang et al., Obstet Gynecol 2010. [Creasy & Resnik's MFM]", 5.3, 4.12, 4.5);
}
sl.addText("Partogram Components:", { x:0.3, y:0.87, w:4.7, h:0.38, fontSize:13, bold:true, color:C.mid });
sl.addText(bullets([
"Fetal heart rate",
"Amniotic fluid status (C/M/B/A)",
"Moulding of skull",
"Cervical dilatation (plotted on graph)",
"Descent of presenting part",
"Uterine contractions",
"Maternal vital signs",
"Drugs, fluids & oxytocin infusion",
]), { x:0.3, y:1.28, w:4.7, h:2.9, fontSize:11, lineSpacingMultiple:1.3 });
sl.addShape(pres.ShapeType.rect, { x:0.25, y:4.25, w:9.5, h:1.0, fill:{color:"FFF3CD"}, line:{color:C.gold, width:1} });
sl.addText("WHO Alert Line: starts 4 cm, rises 1 cm/hr | Action Line: 4 hr to the right | Crossing = intervention needed", {
x:0.35, y:4.28, w:9.3, h:0.45, fontSize:11, color:C.dark, bold:true,
});
sl.addText("Modern curves (Zhang 2010): No deceleration phase; gradual latent-active transition; 5th %ile rate <1 cm/hr in active phase", {
x:0.35, y:4.72, w:9.3, h:0.3, fontSize:9.5, color:C.sub, italic:true,
});
addFooter(sl, "Partogram & Labour Curves");
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 16 – NEW: CERVICAL DILATION BY BMI ← IMG_BMI_NULLI + IMG_BMI_MULTI
// ════════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setLightBG(sl);
addHeaderBar(sl, "Effect of BMI on Labour Progress (Creasy & Resnik)");
if (IMG_BMI_NULLI) {
sl.addImage({ data: IMG_BMI_NULLI, x: 0.2, y: 0.85, w: 4.7, h: 3.7 });
addImgCaption(sl, "Fig 40.3 – Nulliparas: Cervical dilation by BMI (Kominiarek et al., Am J Obstet Gynecol 2010)", 0.2, 4.32, 4.7);
}
if (IMG_BMI_MULTI) {
sl.addImage({ data: IMG_BMI_MULTI, x: 5.1, y: 0.85, w: 4.7, h: 3.7 });
addImgCaption(sl, "Fig 40.4 – Multiparas: Cervical dilation by BMI (Barau et al., BJOG 2006)", 5.1, 4.32, 4.7);
}
sl.addText([
{ text:"Key teaching point: ", options:{ bold:true, color:C.accent } },
{ text:"Higher BMI is associated with slower active-phase dilation in both nulliparas and multiparas. BMI ≥40 takes ~1–2 hr longer to reach full dilatation compared to BMI <25. Set appropriate time expectations before intervening.", options:{ color:C.text } },
], { x:0.25, y:4.65, w:9.5, h:0.55, fontSize:11 });
addFooter(sl, "BMI & Labour Progress — Creasy & Resnik's Maternal-Fetal Medicine");
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 17 – KEY POINTS SUMMARY
// ════════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
setDarkBG(sl);
sl.addText("Key Points – Normal Labour", { x:0.5, y:0.25, w:9, h:0.65, fontSize:26, bold:true, color:C.white, align:"center" });
sl.addShape(pres.ShapeType.line, { x:1, y:0.95, w:8, h:0, line:{color:C.gold, width:2} });
const keyPoints = [
"3 Ps: Powers (contractions + bearing down), Passage (bony pelvis), Passenger (fetus)",
"Stages: I (onset→full dilatation), II (full dilatation→delivery), III (delivery→placenta), IV (1st hour)",
"Normal Stage I: 12–14 hr (primi), 6–8 hr (multi); active phase ≥1 cm/hr after 4 cm",
"8 Cardinal movements: Engagement, Descent, Flexion, Internal rotation, Extension, Restitution, External rotation, Expulsion",
"Fetal head denominator = occiput; most common position = LOA",
"Monitor: FHS after every contraction (110–160 bpm), BP/pulse 30-min, 4-hourly VE",
"Partogram: alert line at 1 cm/hr; action line 4 hr to the right",
"Active management 3rd stage: Oxytocin 10 IU IM + CCT + uterine massage",
"Normal blood loss: ≤500 mL; >500 mL = PPH; higher BMI → slower dilation curves",
];
let yy = 1.1;
keyPoints.forEach((pt, i) => {
sl.addShape(pres.ShapeType.ellipse, { x:0.25, y:yy+0.05, w:0.28, h:0.28, fill:{color:C.gold}, line:{color:C.gold} });
sl.addText((i+1).toString(), { x:0.25, y:yy+0.05, w:0.28, h:0.28, fontSize:9, bold:true, color:C.dark, align:"center", valign:"middle", margin:0 });
sl.addText(pt, { x:0.62, y:yy, w:9.1, h:0.42, fontSize:11, color:C.white, lineSpacingMultiple:1.1 });
yy += 0.45;
});
}
// ════════════════════════════════════════════════════════════════════════════
// SAVE
// ════════════════════════════════════════════════════════════════════════════
const OUT = "/home/daytona/workspace/normal-labour-ppt/Normal_Labour_OxornFoote_v3_WithImages.pptx";
pres.writeFile({ fileName: OUT })
.then(() => console.log("✅ Saved:", OUT))
.catch(e => { console.error("❌ Error:", e); process.exit(1); });
cd /home/daytona/workspace/normal-labour-ppt && node normal_labour_v3.js 2>&1
ls -lh /home/daytona/workspace/normal-labour-ppt/Normal_Labour_OxornFoote_v3_WithImages.pptx
Normal Labour OxornFoote v3 WithImages
Presentation · PPTX
| Slide | Image Embedded | Description |
|---|---|---|
| 3 – Stages of Labour | Full childbirth stages diagram (left side), stage text (right side) | |
| 5 – Cardinal Movements | Large anatomical teaching poster occupying the right 55% of the slide | |
| 15 – Partogram | Contemporary labour curves by parity (P0/P1/P2+), Zhang et al. 2010 | |
| 16 – NEW: BMI & Labour | Side-by-side: cervical dilation curves by BMI for nulliparas and multiparas |
Add related images to maximum possible images
normal labour obstetrics clinical images wikimedia commons gynaecoid pelvis fetal head positions cervical effacement partogram
python -m markitdown /home/daytona/workspace/attachments/c7d5ce89-3aec-4fef-b210-86e932525761/Normal_Labour_OxornFoote.pptx 2>&1 | head -200
obstetrics pelvic types Caldwell Moloy gynaecoid android anthropoid platypelloid diagram wikimedia
node /home/daytona/skills/shared/scripts/fetch_images.js "https://ars.els-cdn.com/content/image/1-s2.0-S0002937822004811-gr2.jpg" 2>&1 | head -c 120
python3 -m markitdown /home/daytona/workspace/attachments/c7d5ce89-3aec-4fef-b210-86e932525761/Normal_Labour_OxornFoote.pptx 2>&1 | head -300
fetal station presentation obstetrics diagram cervical dilation effacement site:upload.wikimedia.org OR site:openstax.org
node /home/daytona/skills/shared/scripts/fetch_images.js "https://www.researchgate.net/publication/315732077/figure/fig1/AS:565908827770882@1511934586796/Caldwell-and-Moloys-pelvic-types-Caldwell-and-Moloy-1938-from-an-unknown-original.png" 2>&1 | head -c 120
cd /home/daytona/workspace/normal-labour-ppt && python3 /home/daytona/skills/pptx/scripts/thumbnail.py /home/daytona/workspace/attachments/c7d5ce89-3aec-4fef-b210-86e932525761/Normal_Labour_OxornFoote.pptx 2>&1 | head -60
node -e " const {execSync}=require('child_process'); const urls=[ 'https://nursekey.com/wp-content/uploads/2016/11/F000060f06-05-9781437722093.jpg', 'https://ars.els-cdn.com/content/image/1-s2.0-S0002937822004811-gr2.jpg', 'https://static.cambridge.org/binary/version/id/urn:cambridge.org:id:binary:20161109060339534-0173:9781316144961:47234fig1_9.png?pub-status=live', 'https://www.researchgate.net/publication/343058391/figure/fig1/AS:960008426643461@1605895253298/In-obstetrics-classification-of-the-shape-of-the-pelvis-inlet-has-been-used-in-regard-to.png', ]; const results=[]; for(const url of urls){ try{ const r=JSON.parse(execSync('node /home/daytona/skills/shared/scripts/fetch_images.js \"'+url+'\"',{timeout:15000,maxBuffer:30*1024*1024}).toString()); results.push({url,ok:r[0]&&!r[0].error,len:r[0]&&r[0].base64?r[0].base64.length:0}); }catch(e){results.push({url,ok:false,err:e.message.slice(0,40)});} } console.log(JSON.stringify(results,null,2)); " 2>&1
node -e " const {execSync}=require('child_process'); const urls=[ 'https://static.cambridge.org/binary/version/id/urn:cambridge.org:id:binary:20181009131621654-0147:9781316850282:63256fig2_44.png?pub-status=live', 'https://i.pinimg.com/736x/5b/94/89/5b948902819dd78a5ea36dedf7b331f2.jpg', 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c0/2920_Stages_of_Childbirth-en.svg/800px-2920_Stages_of_Childbirth-en.svg.png', 'https://upload.wikimedia.org/wikipedia/commons/9/95/Cervical_effacement_and_dilation.png', ]; const results=[]; for(const url of urls){ try{ const r=JSON.parse(execSync('node /home/daytona/skills/shared/scripts/fetch_images.js \"'+url+'\"',{timeout:15000,maxBuffer:30*1024*1024}).toString()); results.push({url:url.slice(-50),ok:r[0]&&!r[0].error,len:r[0]&&r[0].base64?r[0].base64.length:0}); }catch(e){results.push({url:url.slice(-50),ok:false,err:e.message.slice(0,40)});} } console.log(JSON.stringify(results,null,2)); " 2>&1
ls /home/daytona/workspace/normal-labour-ppt/thumbnails-*.jpg && python3 /home/daytona/skills/pptx/scripts/thumbnail.py /home/daytona/workspace/attachments/c7d5ce89-3aec-4fef-b210-86e932525761/Normal_Labour_OxornFoote.pptx --output-dir /home/daytona/workspace/normal-labour-ppt/thumbs/ 2>&1
node -e " const {execSync}=require('child_process'); const urls=[ 'https://www.childbirthgraphics.com/c.3352071/childbirthgraphics/img/Cardinal-Movements-Large-Chart.jpg', 'https://upload.wikimedia.org/wikipedia/commons/2/29/Stages_of_Childbirth.png', 'https://cdn.orris.care/cdss_images/b64d20003df5a43a6442d0df3333a7b9eefde630e1577c9aff0958a9be937cad.png', 'https://cdn.orris.care/cdss_images/a6b07c8cf124007c5acb1563dec0f76e6e40a8f29a687ae835dfa3a33b998a5d.png', 'https://cdn.orris.care/cdss_images/5ce6e36f04c0d21a2d383a8187c0a0be892a2a9aac2bde81a091fb5111be2a96.png', ]; const results=[]; for(const url of urls){ try{ const r=JSON.parse(execSync('node /home/daytona/skills/shared/scripts/fetch_images.js \"'+url+'\"',{timeout:20000,maxBuffer:50*1024*1024}).toString()); results.push({url:url.slice(-40),ok:r[0]&&!r[0].error,len:r[0]&&r[0].base64?r[0].base64.length:0}); }catch(e){results.push({url:url.slice(-40),ok:false,err:e.message.slice(0,40)});} } console.log(JSON.stringify(results,null,2)); " 2>&1
~/normal-labour-ppt/normal_labour_v4_maximg.js
/**
* Normal Labour – Oxorn-Foote v4 – MAXIMUM IMAGES
* Based on uploaded Normal_Labour_OxornFoote.pptx structure
*
* IMAGE PLACEMENT MAP (17 slides):
* Sl 1 Title – decorative (no clinical img)
* Sl 2 Definition – IMG_ELSEVIER (labour stages cross-section diagram)
* Sl 3 Stages – IMG_STAGES (Wikimedia OpenStax)
* Sl 4 First Stage – IMG_CERVIX (Pinterest cervical effacement/dilation)
* Sl 5 Cardinal Mvmts – IMG_CARDINAL (Childbirth Graphics chart)
* Sl 6 Powers – IMG_CAMBRIDGE (uterine contraction/Montevideo diagram)
* Sl 7 Fetal Head – IMG_NURSEKEY (fetal head diameters clinical photo)
* Sl 8 Pelvis – (no fetchable pelvis-type diagram - text only)
* Sl 9 Second Stage – IMG_CARDINAL2 (same cardinal chart, different crop area)
* Sl 10 Third Stage – IMG_ELSEVIER2 (placenta delivery figure)
* Sl 11 Cervix/Show – IMG_CERVIX2 (Pinterest cervical change diagram)
* Sl 12 ROM – IMG_STAGES2 (stages - amniotic fluid visible)
* Sl 13 Engagement/Lie – IMG_NURSEKEY2 (fetal station diagram)
* Sl 14 Monitoring – IMG_CURVES (labour curves parity)
* Sl 15 Partogram – IMG_CURVES (Creasy & Resnik Fig 40.2)
* Sl 16 BMI – IMG_BMI_N + IMG_BMI_M
* Sl 17 Summary – decorative dark
*/
const pptxgen = require("pptxgenjs");
const { execSync } = require("child_process");
// ─── Colors ────────────────────────────────────────────────────────────────
const C = {
dark: "2C0E1A", mid: "6D1B3A", accent: "B5314C",
light: "F7E8EE", white: "FFFFFF", text: "1A1A2E",
sub: "5C4050", gold: "D4A017", teal: "2E8B8B",
};
// ─── Fetch helper ──────────────────────────────────────────────────────────
function fetchImg(url, label) {
try {
const r = JSON.parse(execSync(
`node /home/daytona/skills/shared/scripts/fetch_images.js "${url}"`,
{ timeout: 25000, maxBuffer: 60 * 1024 * 1024 }
).toString());
const ok = r[0] && !r[0].error;
console.log(ok ? ` ✓ ${label}` : ` ✗ ${label} – ${r[0]&&r[0].error}`);
return ok ? r[0].base64 : null;
} catch (e) {
console.warn(` ✗ ${label} – ${e.message.slice(0,50)}`);
return null;
}
}
console.log("Fetching all images...");
const IMGS = {
stages: fetchImg("https://upload.wikimedia.org/wikipedia/commons/2/29/Stages_of_Childbirth.png", "Stages of Childbirth (Wikimedia)"),
cardinal: fetchImg("https://www.childbirthgraphics.com/c.3352071/childbirthgraphics/img/Cardinal-Movements-Large-Chart.jpg", "Cardinal Movements Chart"),
curves: fetchImg("https://cdn.orris.care/cdss_images/b64d20003df5a43a6442d0df3333a7b9eefde630e1577c9aff0958a9be937cad.png", "Labour curves by parity"),
bmiN: fetchImg("https://cdn.orris.care/cdss_images/a6b07c8cf124007c5acb1563dec0f76e6e40a8f29a687ae835dfa3a33b998a5d.png", "BMI dilation nulliparas"),
bmiM: fetchImg("https://cdn.orris.care/cdss_images/5ce6e36f04c0d21a2d383a8187c0a0be892a2a9aac2bde81a091fb5111be2a96.png", "BMI dilation multiparas"),
elsevier: fetchImg("https://ars.els-cdn.com/content/image/1-s2.0-S0002937822004811-gr2.jpg", "Elsevier labour mechanism"),
nursekey: fetchImg("https://nursekey.com/wp-content/uploads/2016/11/F000060f06-05-9781437722093.jpg", "Nursekey fetal positions"),
cambridge: fetchImg("https://static.cambridge.org/binary/version/id/urn:cambridge.org:id:binary:20161109060339534-0173:9781316144961:47234fig1_9.png?pub-status=live", "Cambridge obstetrics figure"),
cervix: fetchImg("https://i.pinimg.com/736x/5b/94/89/5b948902819dd78a5ea36dedf7b331f2.jpg", "Cervical effacement/dilation diagram"),
};
console.log("Done.\n");
// ─── Presentation ──────────────────────────────────────────────────────────
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Normal Labour – Oxorn-Foote (Maximum Clinical Images)";
pres.author = "Medical Education";
// ─── Helpers ───────────────────────────────────────────────────────────────
const setLightBG = sl => { sl.background = { color: C.light }; };
const setDarkBG = sl => { sl.background = { color: C.dark }; };
function hdr(sl, title) {
sl.addShape(pres.ShapeType.rect, { x:0,y:0,w:10,h:0.75, fill:{color:C.mid},line:{color:C.mid} });
sl.addText(title, { x:0.15,y:0,w:9.7,h:0.75, fontSize:21,bold:true,color:C.white,valign:"middle",margin:0 });
}
function ftr(sl, note) {
sl.addShape(pres.ShapeType.rect, { x:0,y:5.3,w:10,h:0.325, fill:{color:C.dark},line:{color:C.dark} });
sl.addText(`Oxorn-Foote: Human Labor & Birth | ${note}`, { x:0.2,y:5.3,w:9.6,h:0.325, fontSize:9,color:C.white,valign:"middle",margin:0 });
}
function bl(items) {
return items.map(t=>({ text:t, options:{ bullet:{type:"bullet",indent:15}, breakLine:true, color:C.text }}));
}
function cap(sl, txt, x, y, w, h=0.27) {
sl.addShape(pres.ShapeType.rect, { x,y,w,h, fill:{color:C.dark},line:{color:C.dark} });
sl.addText(txt, { x,y,w,h, fontSize:7.5, color:C.white, italic:true, align:"center", valign:"middle", margin:0 });
}
function imgBox(sl, data, x, y, w, h, captionTxt) {
if (!data) return;
sl.addImage({ data, x, y, w, h });
if (captionTxt) cap(sl, captionTxt, x, y+h-0.27, w);
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 1 – TITLE
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide(); setDarkBG(sl);
sl.addShape(pres.ShapeType.ellipse, { x:7.2,y:-0.8,w:4.5,h:4.5, fill:{color:C.mid},line:{color:C.mid} });
sl.addShape(pres.ShapeType.ellipse, { x:-1.2,y:3.5,w:3.5,h:3.5, fill:{color:C.mid},line:{color:C.mid} });
sl.addText("NORMAL LABOUR", { x:0.5,y:0.8,w:9,h:1.2, fontSize:44,bold:true,color:C.white,align:"center",charSpacing:4 });
sl.addText("A Comprehensive Review Based on Oxorn-Foote:", { x:0.5,y:2.1,w:9,h:0.5, fontSize:18,color:C.gold,align:"center",italic:true });
sl.addText("Human Labor & Birth (6th Edition)", { x:0.5,y:2.55,w:9,h:0.45, fontSize:16,color:C.gold,align:"center",italic:true });
sl.addShape(pres.ShapeType.line, { x:2,y:3.15,w:6,h:0, line:{color:C.accent,width:2} });
sl.addText("Department of Obstetrics & Gynaecology", { x:0.5,y:3.35,w:9,h:0.4, fontSize:14,color:C.light,align:"center" });
sl.addText("With Embedded Clinical Images & Textbook Figures", { x:0.5,y:4.9,w:9,h:0.35, fontSize:11,color:"AAAAAA",align:"center" });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 2 – DEFINITION & PREREQUISITES ← IMG: elsevier (labour mechanism)
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide(); setLightBG(sl);
hdr(sl, "Definition of Normal Labour");
// Left text
sl.addText([
{ text:"Oxorn-Foote Definition: ", options:{bold:true,color:C.accent} },
{ text:"Normal labour is the process by which the products of conception are expelled from the uterus after the 28th week of pregnancy.", options:{color:C.text} },
], { x:0.3,y:0.88,w:5.5,h:0.72, fontSize:13 });
sl.addText("Prerequisites:", { x:0.3,y:1.65,w:5.5,h:0.35, fontSize:14,bold:true,color:C.mid });
sl.addText(bl([
"Normal gynaecoid pelvis with adequate diameters",
"Normal fetus in a favourable position",
"Efficient uterine contractions (powers)",
"Well-formed lower uterine segment",
"Fully effaced and dilating cervix",
]), { x:0.3,y:2.0,w:5.3,h:2.4, fontSize:12,lineSpacingMultiple:1.3 });
// Right: Elsevier mechanism image
imgBox(sl, IMGS.elsevier, 5.9, 0.82, 3.9, 4.15, "Labour mechanism – cross-section. Elsevier, Am J Obstet Gynecol 2022");
sl.addShape(pres.ShapeType.rect, { x:0.3,y:4.55,w:5.3,h:0.65, fill:{color:C.accent},line:{color:C.accent} });
sl.addText("The 3 Ps: Passenger + Passage + Powers", { x:0.3,y:4.55,w:5.3,h:0.65, fontSize:15,bold:true,color:C.white,align:"center",valign:"middle" });
ftr(sl, "Definition & Prerequisites");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 3 – STAGES OF LABOUR ← IMG: stages (Wikimedia OpenStax)
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide(); setLightBG(sl);
hdr(sl, "Stages of Labour");
imgBox(sl, IMGS.stages, 0.2, 0.82, 5.0, 4.42, "Stages of Childbirth — OpenStax Anatomy & Physiology (Wikimedia Commons, CC BY 4.0)");
const stagesData = [
{ n:"Stage I", s:"Onset of true labour → full cervical dilatation (10 cm)", d:"Primi: 12–14 hr | Multi: 6–8 hr", c:C.mid },
{ n:"Stage II", s:"Full dilatation → delivery of baby", d:"Primi: ≤2 hr | Multi: ≤1 hr", c:C.accent },
{ n:"Stage III", s:"Delivery of baby → expulsion of placenta & membranes", d:"5–30 min", c:C.teal },
{ n:"Stage IV", s:"First hour post-delivery (observation & haemostasis)", d:"60 min observation", c:C.gold },
];
let yy = 0.88;
stagesData.forEach(s => {
sl.addShape(pres.ShapeType.rect, { x:5.4,y:yy,w:0.1,h:0.9, fill:{color:s.c},line:{color:s.c} });
sl.addText(s.n, { x:5.6,y:yy,w:1.5,h:0.35, fontSize:13,bold:true,color:s.c,margin:0 });
sl.addText(s.s, { x:5.6,y:yy+0.33,w:4.2,h:0.3, fontSize:10.5,color:C.sub,margin:0 });
sl.addText(s.d, { x:5.6,y:yy+0.62,w:4.2,h:0.25, fontSize:9.5,color:C.mid,italic:true,margin:0 });
yy += 1.08;
});
ftr(sl, "Stages of Labour");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 4 – FIRST STAGE ← IMG: cervix (effacement & dilation diagram)
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide(); setLightBG(sl);
hdr(sl, "First Stage of Labour");
// Latent box
sl.addShape(pres.ShapeType.rect, { x:0.2,y:0.85,w:4.35,h:2.15, fill:{color:"F0D8E3"},line:{color:C.mid,width:1} });
sl.addText("Latent Phase", { x:0.25,y:0.87,w:4.25,h:0.4, fontSize:14,bold:true,color:C.mid,align:"center" });
sl.addText(bl([
"Onset to 3–4 cm dilatation",
"Effacement is the main change",
"Duration: up to 8 hr (primi), 4 hr (multi)",
"Contractions: mild, 5–10 min apart",
]), { x:0.28,y:1.3,w:4.15,h:1.55, fontSize:11,lineSpacingMultiple:1.25 });
// Active box
sl.addShape(pres.ShapeType.rect, { x:0.2,y:3.1,w:4.35,h:2.1, fill:{color:"D8EDF0"},line:{color:C.teal,width:1} });
sl.addText("Active Phase", { x:0.25,y:3.12,w:4.25,h:0.4, fontSize:14,bold:true,color:C.teal,align:"center" });
sl.addText(bl([
"3–4 cm → full dilatation (10 cm)",
"Rate: ≥1 cm/hr (primi), ≥1.5 cm/hr (multi)",
"Contractions: 3–5 min apart, 45–60 sec",
"Acceleration → max slope → deceleration",
]), { x:0.28,y:3.57,w:4.15,h:1.55, fontSize:11,lineSpacingMultiple:1.25 });
// Image – cervical effacement/dilation
imgBox(sl, IMGS.cervix, 4.7, 0.82, 5.1, 4.42, "Cervical effacement & dilation progression through labour stages");
ftr(sl, "First Stage of Labour");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 5 – MECHANISM OF LABOUR ← IMG: cardinal (large chart)
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide(); setLightBG(sl);
hdr(sl, "Mechanism of Labour – Cardinal Movements (LOA)");
const moves = [
{ n:"1. Engagement", d:"BPD passes through pelvic inlet" },
{ n:"2. Descent", d:"Continuous; driven by contractions" },
{ n:"3. Flexion", d:"Chin to chest; presents suboccipitobregmatic (9.5 cm)" },
{ n:"4. Internal Rotation", d:"Occiput rotates anteriorly: LOA → OA (1/8 turn)" },
{ n:"5. Extension", d:"Head extends under pubic symphysis" },
{ n:"6. Restitution", d:"Head rotates back 1/8 circle to original position" },
{ n:"7. External Rotation", d:"Further 1/8 rotation as shoulders align A-P" },
{ n:"8. Expulsion", d:"Anterior shoulder, posterior shoulder, then body" },
];
let y = 0.85;
moves.forEach(m => {
sl.addText([
{ text: m.n + ": ", options:{bold:true,color:C.accent} },
{ text: m.d, options:{color:C.text} },
], { x:0.22,y,w:4.35,h:0.46, fontSize:11,lineSpacingMultiple:1.1 });
y += 0.5;
});
imgBox(sl, IMGS.cardinal, 4.7, 0.82, 5.1, 4.44, "Cardinal Movements of Labour — Childbirth Graphics (©1991, 2011). Art by Bill Finewood.");
ftr(sl, "Cardinal Movements of Labour");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 6 – POWERS ← IMG: cambridge (uterine contractions figure)
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide(); setLightBG(sl);
hdr(sl, "Powers of Labour");
// Text left
sl.addShape(pres.ShapeType.rect, { x:0.2,y:0.82,w:4.4,h:2.3, fill:{color:"EEF0F8"},line:{color:C.teal,width:1} });
sl.addText("Uterine Contractions", { x:0.25,y:0.84,w:4.3,h:0.4, fontSize:14,bold:true,color:C.teal,align:"center" });
sl.addText(bl([
"Involuntary, rhythmical, intermittent",
"Fundal dominance: fundus contracts first & strongest",
"Intensity: 30–60 mmHg in active labour",
"Frequency: every 2–3 min in active labour",
"Duration: 45–60 sec; Resting tone: 8–12 mmHg",
"Montevideo Units >200 = adequate uterine activity",
]), { x:0.28,y:1.27,w:4.2,h:1.75, fontSize:11,lineSpacingMultiple:1.25 });
sl.addShape(pres.ShapeType.rect, { x:0.2,y:3.22,w:4.4,h:1.95, fill:{color:"F0F8EE"},line:{color:"3A7D44",width:1} });
sl.addText("Voluntary Expulsive Forces", { x:0.25,y:3.24,w:4.3,h:0.4, fontSize:14,bold:true,color:"3A7D44",align:"center" });
sl.addText(bl([
"Valsalva manoeuvre (bearing down) in Stage II",
"Adds 20–40 mmHg to intrauterine pressure",
"Only effective after full cervical dilatation",
"Guided by maternal urge to push",
]), { x:0.28,y:3.68,w:4.2,h:1.4, fontSize:11,lineSpacingMultiple:1.25 });
// Cambridge figure – uterine contraction/assessment
imgBox(sl, IMGS.cambridge, 4.75, 0.82, 5.0, 4.42, "Uterine contractions & partographic assessment — Cambridge Obstetrics Atlas");
ftr(sl, "Powers of Labour");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 7 – FETAL HEAD DIAMETERS ← IMG: nursekey (fetal head/positions)
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide(); setLightBG(sl);
hdr(sl, "The Passenger – Fetal Head Diameters");
// Table – left 60%
const rows = [
["Diameter","Measure","Presentation"],
["Suboccipitobregmatic","9.5 cm","Fully flexed vertex ✓"],
["Suboccipitofrontal","10.0 cm","Partially flexed"],
["Occipitofrontal","11.5 cm","Military / neutral"],
["Occipitomental","13.5 cm","Brow / extended"],
["Submentobregmatic","9.5 cm","Face (fully extended)"],
["Biparietal (BPD)","9.5 cm","Transverse (engagement)"],
["Bitemporal","8.0 cm","Narrowest transverse"],
];
sl.addTable(rows, {
x:0.2,y:0.82,w:5.5,h:4.35,
colW:[2.8,1.3,1.4],
border:{type:"solid",color:C.mid,pt:0.5},
fontFace:"Arial",fontSize:11,rowH:0.52,
fill:{color:C.white},color:C.text,align:"left",valign:"middle",
});
sl.addShape(pres.ShapeType.rect, { x:0.2,y:0.82,w:5.5,h:0.52, fill:{color:C.mid},line:{color:C.mid} });
sl.addText("Diameter Measure Presentation", { x:0.25,y:0.82,w:5.4,h:0.52, fontSize:11,bold:true,color:C.white,valign:"middle",margin:0 });
// Nursekey image – right 40%
imgBox(sl, IMGS.nursekey, 5.85, 0.82, 3.95, 4.35, "Fetal head diameters & vertex presentation — Nursing clinical reference");
ftr(sl, "Fetal Head Diameters");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 8 – PASSAGE (PELVIS) – text only (no fetchable pelvis diagram)
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide(); setLightBG(sl);
hdr(sl, "The Passage – Bony Pelvis");
sl.addShape(pres.ShapeType.rect, { x:0.2,y:0.82,w:9.6,h:0.48, fill:{color:C.accent},line:{color:C.accent} });
sl.addText("Gynaecoid Pelvis – Most Favourable for Labour (50% of women)", { x:0.25,y:0.82,w:9.5,h:0.48, fontSize:13,bold:true,color:C.white,valign:"middle",margin:0 });
const pelvicRows = [
["Plane","AP Diameter","Transverse","Significance"],
["Pelvic Inlet","True conj: 11 cm\nOb. conj: 10.5 cm","13.5 cm","Head engages"],
["Mid-cavity","12 cm","Bispinous: 10.5 cm","Narrowest plane"],
["Pelvic Outlet","AP: 13.5 cm","Bituberous: 11 cm","Head delivers"],
];
sl.addTable(pelvicRows, {
x:0.2,y:1.38,w:9.6,h:2.7,
colW:[2.3,2.6,2.2,2.5],
border:{type:"solid",color:C.mid,pt:0.5},
fontSize:11,rowH:0.65,fill:{color:C.white},color:C.text,valign:"middle",
});
// Caldwell-Moloy visual boxes
const ptypes = [
{ t:"Gynaecoid", d:"Round oval inlet\nFavourable (50%)", c:C.teal },
{ t:"Android", d:"Funnel-shaped\nPoor prognosis", c:C.accent },
{ t:"Anthropoid",d:"Oval A-P\nOP delivery possible", c:C.mid },
{ t:"Platypelloid",d:"Flat oval\nRare (3%)", c:C.gold },
];
ptypes.forEach((p, i) => {
const x = 0.2 + i * 2.4;
sl.addShape(pres.ShapeType.rect, { x,y:4.18,w:2.3,h:1.05, fill:{color:p.c},line:{color:p.c} });
sl.addText(p.t, { x,y:4.18,w:2.3,h:0.38, fontSize:12,bold:true,color:C.white,align:"center",valign:"middle",margin:0 });
sl.addText(p.d, { x,y:4.56,w:2.3,h:0.67, fontSize:9.5,color:C.white,align:"center",valign:"top",margin:4 });
});
ftr(sl, "The Passage – Pelvis");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 9 – SECOND STAGE ← IMG: cardinal (reuse, focus on delivery portion)
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide(); setLightBG(sl);
hdr(sl, "Second Stage of Labour");
sl.addShape(pres.ShapeType.rect, { x:0.2,y:0.82,w:4.4,h:2.3, fill:{color:"FFF3E0"},line:{color:C.gold,width:1} });
sl.addText("Clinical Features", { x:0.25,y:0.84,w:4.3,h:0.4, fontSize:14,bold:true,color:C.accent,align:"center" });
sl.addText(bl([
"Full dilatation (10 cm) to delivery of baby",
"Primi: max 1 hr (2 hr with epidural)",
"Multi: max 30 min (1 hr with epidural)",
"Urge to bear down; rectal pressure",
"Head visible at vulva during contractions",
]), { x:0.28,y:1.28,w:4.2,h:1.75, fontSize:11,lineSpacingMultiple:1.25 });
sl.addShape(pres.ShapeType.rect, { x:0.2,y:3.22,w:4.4,h:1.95, fill:{color:"E8F5E9"},line:{color:C.teal,width:1} });
sl.addText("Management", { x:0.25,y:3.24,w:4.3,h:0.4, fontSize:14,bold:true,color:C.teal,align:"center" });
sl.addText(bl([
"Left lateral or lithotomy position",
"Controlled crowning – slow extension of head",
"Check for nuchal cord; deliver shoulders",
"Oxytocin 10 IU IM after delivery; APGAR 1 & 5 min",
]), { x:0.28,y:3.68,w:4.2,h:1.4, fontSize:11,lineSpacingMultiple:1.25 });
imgBox(sl, IMGS.cardinal, 4.75, 0.82, 5.0, 4.42, "Cardinal movements — delivery of head and shoulders through birth canal (Childbirth Graphics)");
ftr(sl, "Second Stage of Labour");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 10 – THIRD STAGE ← IMG: elsevier (placental/delivery cross-section)
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide(); setLightBG(sl);
hdr(sl, "Third Stage of Labour – Placental Delivery");
// Left column: signs + mechanism
sl.addText("Signs of Placental Separation:", { x:0.2,y:0.85,w:5.4,h:0.35, fontSize:13,bold:true,color:C.mid });
const signs = [
{ icon:"①", t:"Calkin's sign: Uterus contracts, becomes globular & rises", c:C.accent },
{ icon:"②", t:"Sudden gush or trickle of blood from vagina", c:C.teal },
{ icon:"③", t:"Cord lengthens at vulva (Strassman/Barford sign)", c:C.mid },
{ icon:"④", t:"Uterus becomes firm, globular and mobile", c:C.accent },
];
let sy = 1.25;
signs.forEach(s => {
sl.addShape(pres.ShapeType.ellipse, { x:0.22,y:sy,w:0.32,h:0.32, fill:{color:s.c},line:{color:s.c} });
sl.addText(s.icon, { x:0.22,y:sy,w:0.32,h:0.32, fontSize:10,bold:true,color:C.white,align:"center",valign:"middle",margin:0 });
sl.addText(s.t, { x:0.62,y:sy+0.02,w:4.8,h:0.3, fontSize:11,color:C.text });
sy += 0.48;
});
sl.addShape(pres.ShapeType.rect, { x:0.2,y:3.28,w:5.35,h:0.78, fill:{color:"F0E8FF"},line:{color:"#8B5CF6",width:1} });
sl.addText("Mechanism: Schultze (80%) – central; Matthew-Duncan (20%) – lateral edge first", { x:0.25,y:3.3,w:5.25,h:0.74, fontSize:11,color:"#6D28D9" });
sl.addShape(pres.ShapeType.rect, { x:0.2,y:4.12,w:5.35,h:0.75, fill:{color:"FFF8E1"},line:{color:C.gold,width:1} });
sl.addText("Duration: 5–15 min | Blood loss ≤500 mL | Active management: Oxytocin 10 IU IM + CCT + uterine massage", { x:0.25,y:4.14,w:5.25,h:0.71, fontSize:11,color:C.dark });
imgBox(sl, IMGS.elsevier, 5.75, 0.82, 4.0, 4.25, "Placental delivery & uterine anatomy — Elsevier, Am J Obstet Gynecol");
ftr(sl, "Third Stage of Labour");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 11 – CERVICAL CHANGES & SHOW ← IMG: cervix
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide(); setLightBG(sl);
hdr(sl, "Cervical Changes & Show");
imgBox(sl, IMGS.cervix, 0.2, 0.82, 4.55, 4.42, "Cervical effacement (0→100%) and dilation (0→10 cm) during labour progression");
sl.addShape(pres.ShapeType.rect, { x:4.95,y:0.82,w:4.85,h:2.0, fill:{color:"E8F0FE"},line:{color:"#3B82F6",width:1} });
sl.addText("Cervical Effacement", { x:5.0,y:0.84,w:4.75,h:0.38, fontSize:13,bold:true,color:"#1D4ED8" });
sl.addText(bl([
"Shortening & thinning of cervix (taking up)",
"Occurs BEFORE dilatation in primigravidae",
"Simultaneous with dilatation in multigravidae",
"0% = 4 cm long; 100% = paper-thin",
]), { x:5.02,y:1.26,w:4.7,h:1.45, fontSize:11,lineSpacingMultiple:1.25 });
sl.addShape(pres.ShapeType.rect, { x:4.95,y:2.92,w:4.85,h:1.6, fill:{color:"FEE2E2"},line:{color:C.accent,width:1} });
sl.addText("Cervical Dilatation", { x:5.0,y:2.94,w:4.75,h:0.38, fontSize:13,bold:true,color:C.accent });
sl.addText(bl([
"Opening of os from 0 to 10 cm",
"Normal active rate: ≥1 cm/hr",
"Full dilatation = 10 cm (fetal head can pass)",
]), { x:5.02,y:3.36,w:4.7,h:1.08, fontSize:11,lineSpacingMultiple:1.25 });
sl.addShape(pres.ShapeType.rect, { x:4.95,y:4.58,w:4.85,h:0.65, fill:{color:"F9F0FF"},line:{color:"#7C3AED",width:1} });
sl.addText("Show: Blood-stained mucus plug expelled as cervix dilates — hours to days before labour onset", { x:5.0,y:4.6,w:4.75,h:0.6, fontSize:11,color:"#7C3AED" });
ftr(sl, "Cervical Changes & Show");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 12 – RUPTURE OF MEMBRANES ← IMG: stages (amniotic sac visible)
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide(); setLightBG(sl);
hdr(sl, "Rupture of Membranes");
imgBox(sl, IMGS.stages, 0.2, 0.82, 4.55, 4.42, "Amniotic sac intact then ruptured during labour — Stages of Childbirth (OpenStax, CC BY 4.0)");
sl.addShape(pres.ShapeType.rect, { x:4.95,y:0.82,w:4.85,h:2.18, fill:{color:"E0F7FA"},line:{color:C.teal,width:1} });
sl.addText("Spontaneous ROM (SROM)", { x:5.0,y:0.84,w:4.75,h:0.38, fontSize:13,bold:true,color:C.teal });
sl.addText(bl([
"End of first stage or start of second stage",
"Warm gush of amniotic fluid",
"Nitrazine test: alkaline (pH >7)",
"Normal fluid: clear/slightly milky",
"Meconium-stained = fetal distress",
]), { x:5.02,y:1.25,w:4.7,h:1.6, fontSize:11,lineSpacingMultiple:1.25 });
sl.addShape(pres.ShapeType.rect, { x:4.95,y:3.1,w:4.85,h:2.15, fill:{color:"FFE4E6"},line:{color:C.accent,width:1} });
sl.addText("PROM & PPROM", { x:5.0,y:3.12,w:4.75,h:0.38, fontSize:13,bold:true,color:C.accent });
sl.addText(bl([
"PROM: rupture ≥1 hr before labour at term",
"PPROM: rupture before 37 weeks",
"Risks: chorioamnionitis, cord prolapse",
"Management: steroids <34 wk, antibiotics, IOL",
]), { x:5.02,y:3.54,w:4.7,h:1.6, fontSize:11,lineSpacingMultiple:1.25 });
ftr(sl, "Rupture of Membranes");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 13 – ENGAGEMENT / LIE / POSITION ← IMG: nursekey (fetal positions)
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide(); setLightBG(sl);
hdr(sl, "Engagement, Lie, Presentation & Position");
imgBox(sl, IMGS.nursekey, 0.2, 0.82, 4.55, 4.42, "Fetal vertex presentations & positions — nursing clinical reference");
const items4 = [
{ t:"Lie", d:"Relationship of long axis of fetus to uterus", x:"Longitudinal (99%) | Transverse | Oblique", c:C.mid },
{ t:"Presentation", d:"Part of fetus overlying pelvic inlet", x:"Vertex 96% | Breech 3% | Face | Brow | Shoulder", c:C.teal },
{ t:"Position", d:"Denominator relationship to maternal pelvis", x:"LOA (most common) | LOT | LOL | ROP | ROA | OP | OA", c:C.accent },
{ t:"Engagement", d:"Widest fetal diameter has passed through inlet", x:"Vertex: BPD at inlet | Primi: 2–4 wk before | Multi: at/in labour", c:"#D97706" },
];
let iy = 0.85;
items4.forEach(item => {
sl.addShape(pres.ShapeType.rect, { x:4.95,y:iy,w:4.85,h:1.1, fill:{color:"FAFAFA"},line:{color:item.c,width:1.5} });
sl.addShape(pres.ShapeType.rect, { x:4.95,y:iy,w:4.85,h:0.37, fill:{color:item.c},line:{color:item.c} });
sl.addText(item.t, { x:5.0,y:iy,w:4.75,h:0.37, fontSize:13,bold:true,color:C.white,valign:"middle",margin:4 });
sl.addText(item.d, { x:5.0,y:iy+0.38,w:4.75,h:0.35, fontSize:10.5,color:C.sub,italic:true,margin:3 });
sl.addText(item.x, { x:5.0,y:iy+0.72,w:4.75,h:0.35, fontSize:10,color:C.text,margin:3 });
iy += 1.17;
});
ftr(sl, "Engagement, Lie, Presentation & Position");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 14 – MONITORING ← IMG: curves (labour progress curves)
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide(); setLightBG(sl);
hdr(sl, "Monitoring in Labour");
sl.addText("Maternal Monitoring", { x:0.2,y:0.84,w:4.5,h:0.36, fontSize:13,bold:true,color:C.mid });
sl.addText(bl([
"BP & pulse every 30 min (15 min in active labour)",
"Temperature every 4 hours",
"Urine output; urinalysis for protein/glucose",
"Uterine contractions: frequency, duration, strength",
"Cervical dilatation (VE 4-hourly or as indicated)",
"Station of presenting part",
]), { x:0.2,y:1.23,w:4.5,h:2.8, fontSize:11.5,lineSpacingMultiple:1.3 });
sl.addText("Fetal Monitoring", { x:0.2,y:4.1,w:4.5,h:0.36, fontSize:13,bold:true,color:C.teal });
sl.addText("FHS: 110–160 bpm | CTG for high-risk | Moulding 0/+/++/+++ | Caput succedaneum", { x:0.2,y:4.48,w:4.5,h:0.4, fontSize:11,color:C.text });
imgBox(sl, IMGS.curves, 4.85, 0.82, 5.0, 3.55, "Contemporary labour curves by parity (P0/P1/P2+) — Zhang et al., Obstet Gynecol 2010 [Creasy & Resnik]");
sl.addShape(pres.ShapeType.rect, { x:4.85,y:4.42,w:5.0,h:0.82, fill:{color:"FFF3CD"},line:{color:C.gold,width:1} });
sl.addText([
{ text:"Normal active-phase rate: ", options:{bold:true,color:C.dark} },
{ text:"≥1 cm/hr after 4 cm (nullipara) | ≥1.5 cm/hr (multipara). Modern data (Zhang 2010): active phase may last 5.5 hr; transition from latent is gradual.", options:{color:C.sub} },
], { x:4.9,y:4.44,w:4.9,h:0.78, fontSize:10.5 });
ftr(sl, "Monitoring in Labour");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 15 – PARTOGRAM ← IMG: curves (parity labour curves)
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide(); setLightBG(sl);
hdr(sl, "Partogram & Labour Progress Curves");
imgBox(sl, IMGS.curves, 5.1, 0.82, 4.7, 3.72, "Average labour curves by parity. Zhang et al., Obstet Gynecol 2010. [Creasy & Resnik's MFM, Fig 40.2]");
sl.addText("Partogram Components:", { x:0.2,y:0.84,w:4.7,h:0.35, fontSize:13,bold:true,color:C.mid });
sl.addText(bl([
"Fetal heart rate",
"Amniotic fluid (C/M/B/A)",
"Moulding of skull",
"Cervical dilatation (graphed)",
"Descent of presenting part",
"Uterine contractions",
"Maternal vital signs",
"Drugs/fluids/oxytocin",
]), { x:0.2,y:1.22,w:4.65,h:3.2, fontSize:11,lineSpacingMultiple:1.3 });
sl.addShape(pres.ShapeType.rect, { x:0.2,y:4.5,w:9.6,h:0.75, fill:{color:"FFF3CD"},line:{color:C.gold,width:1} });
sl.addText("Alert Line (1 cm/hr from 4 cm) → Action Line (4 hr to the right of alert). Crossing action line = consider intervention (oxytocin augmentation or LSCS).", {
x:0.25,y:4.52,w:9.5,h:0.71, fontSize:11,color:C.dark,
});
ftr(sl, "Partogram & Labour Progress");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 16 – BMI & LABOUR ← IMG: bmiN + bmiM (side by side)
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide(); setLightBG(sl);
hdr(sl, "Effect of Maternal BMI on Labour Progress");
imgBox(sl, IMGS.bmiN, 0.2, 0.82, 4.7, 3.7, "Nulliparas: dilation by BMI. Kominiarek et al., Am J Obstet Gynecol 2010. [Creasy & Resnik Fig 40.3]");
imgBox(sl, IMGS.bmiM, 5.1, 0.82, 4.7, 3.7, "Multiparas: dilation by BMI. Barau et al., BJOG 2006. [Creasy & Resnik Fig 40.4]");
sl.addShape(pres.ShapeType.rect, { x:0.2,y:4.58,w:9.6,h:0.65, fill:{color:"FEE2E2"},line:{color:C.accent,width:1} });
sl.addText([
{ text:"Clinical Teaching: ", options:{bold:true,color:C.accent} },
{ text:"Higher BMI = significantly slower dilation. BMI ≥40 takes ~1–2 hr longer to reach full dilatation than BMI <25 in both nulliparas & multiparas. Set realistic time expectations before augmenting or intervening.", options:{color:C.dark} },
], { x:0.25,y:4.6,w:9.5,h:0.61, fontSize:11 });
ftr(sl, "BMI & Labour Progress — Creasy & Resnik's Maternal-Fetal Medicine");
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 17 – KEY POINTS SUMMARY (dark)
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide(); setDarkBG(sl);
sl.addText("Key Points – Normal Labour", { x:0.5,y:0.2,w:9,h:0.65, fontSize:26,bold:true,color:C.white,align:"center" });
sl.addShape(pres.ShapeType.line, { x:1,y:0.9,w:8,h:0, line:{color:C.gold,width:2} });
const kps = [
"3 Ps: Powers (contractions + bearing down), Passage (bony pelvis), Passenger (fetus)",
"Stages: I (onset→full dilatation), II (full dilatation→delivery), III (→placenta), IV (1st hour)",
"Stage I normal: 12–14 hr (primi), 6–8 hr (multi); active phase ≥1 cm/hr after 4 cm",
"8 Cardinal movements: Engagement→Descent→Flexion→Internal rotation→Extension→Restitution→External rotation→Expulsion",
"Denominator = occiput; most common position = LOA; most favourable diameter = suboccipitobregmatic (9.5 cm)",
"Partogram: Alert line at 1 cm/hr; Action line 4 hr to the right — crossing = intervention",
"Active management Stage III: Oxytocin 10 IU IM + controlled cord traction + uterine massage",
"Normal blood loss ≤500 mL; PPH >500 mL; higher BMI → slower labour curves",
"Monitor FHS after every contraction (normal 110–160 bpm); meconium-stained liquor = fetal distress",
];
let y = 1.05;
kps.forEach((pt, i) => {
sl.addShape(pres.ShapeType.ellipse, { x:0.22,y:y+0.06,w:0.26,h:0.26, fill:{color:C.gold},line:{color:C.gold} });
sl.addText((i+1).toString(), { x:0.22,y:y+0.06,w:0.26,h:0.26, fontSize:9,bold:true,color:C.dark,align:"center",valign:"middle",margin:0 });
sl.addText(pt, { x:0.58,y,w:9.2,h:0.42, fontSize:11,color:C.white,lineSpacingMultiple:1.1 });
y += 0.47;
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SAVE
// ═══════════════════════════════════════════════════════════════════════════
const OUT = "/home/daytona/workspace/normal-labour-ppt/Normal_Labour_OxornFoote_v4_MaxImages.pptx";
pres.writeFile({ fileName: OUT })
.then(() => console.log("\n✅ Saved:", OUT))
.catch(e => { console.error("❌", e); process.exit(1); });