How to manage a patient in immediate post op after Hysteroscopic myomectomy
hysteroscopic myomectomy postoperative management complications
| Fluid Deficit | Action |
|---|---|
| 750 mL | Warning sign - anaesthetist alerted |
| 1,000-1,500 mL (hypotonic media: glycine, sorbitol) | Terminate procedure; check electrolytes |
| 2,500 mL (isotonic/saline with bipolar) | Terminate; cardiac overload risk |
| Serum Na+ | Clinical State | Treatment |
|---|---|---|
| >120 mEq/L, mild symptoms | Fluid restriction + IV furosemide (loop diuretic) | Watch and reassess |
| <120 mEq/L, severe symptoms | IV hypertonic saline (3% NaCl) carefully | ICU-level monitoring; avoid rapid correction (central pontine myelinolysis risk) |
| Cardiovascular collapse | Supportive: O2, vasopressors, ventilation as needed | Critical care |
| Priority | Action |
|---|---|
| 1 | Document intra-op fluid deficit at handover |
| 2 | Monitor vitals and O2 saturation closely x1 hour |
| 3 | Check electrolytes if deficit >1,000 mL |
| 4 | Manage pain with NSAIDs + paracetamol |
| 5 | Watch for signs of perforation, bleeding, or fluid absorption |
| 6 | Early mobilisation; VTE prophylaxis |
| 7 | Discharge only when stable, eating, voiding |
Create a post-op observation checklist template for hysteroscopic procedures
ls /home/daytona/workspace/ && ls /home/daytona/skills/docx/scripts/office/ 2>/d…
mkdir -p /home/daytona/workspace/hysteroscopy-checklist && ls /home/daytona/work…
~/hysteroscopy-checklist/generate.js
const {
Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell,
AlignmentType, HeadingLevel, BorderStyle, WidthType, ShadingType,
VerticalAlign, PageOrientation, PageNumber, Footer, Header,
UnderlineType
} = require('docx');
const fs = require('fs');
// ── Colour palette ──────────────────────────────────────────────────────────
const DARK_BLUE = "1F3864";
const MID_BLUE = "2E5FAC";
const LIGHT_BLUE = "D6E4F0";
const LIGHT_GREY = "F2F2F2";
const MEDIUM_GREY = "D9D9D9";
const WHITE = "FFFFFF";
const RED_ALERT = "C00000";
// ── Helpers ─────────────────────────────────────────────────────────────────
function noBorder() {
return { style: BorderStyle.NONE, size: 0, color: "FFFFFF" };
}
function thinBorder() {
return { style: BorderStyle.SINGLE, size: 4, color: "CCCCCC" };
}
function thickTopBorder() {
return { style: BorderStyle.SINGLE, size: 12, color: MID_BLUE };
}
function shadedCell(text, shade, textColor = "000000", bold = false, colSpan = 1, width = null) {
const cellOpts = {
shading: { fill: shade, type: ShadingType.CLEAR, color: shade },
borders: { top: thinBorder(), bottom: thinBorder(), left: thinBorder(), right: thinBorder() },
verticalAlign: VerticalAlign.CENTER,
margins: { top: 80, bottom: 80, left: 120, right: 120 },
};
if (colSpan > 1) cellOpts.columnSpan = colSpan;
if (width) cellOpts.width = { size: width, type: WidthType.DXA };
return new TableCell({
...cellOpts,
children: [new Paragraph({
alignment: AlignmentType.LEFT,
children: [new TextRun({ text, bold, color: textColor, size: 20, font: "Calibri" })]
})]
});
}
function headerCell(text, shade = MID_BLUE, colSpan = 1, width = null) {
return shadedCell(text, shade, WHITE, true, colSpan, width);
}
function dataCell(text, shade = WHITE, bold = false, colSpan = 1, width = null) {
return shadedCell(text, shade, "000000", bold, colSpan, width);
}
function checkCell(shade = WHITE, width = 600) {
return new TableCell({
shading: { fill: shade, type: ShadingType.CLEAR, color: shade },
borders: { top: thinBorder(), bottom: thinBorder(), left: thinBorder(), right: thinBorder() },
verticalAlign: VerticalAlign.CENTER,
margins: { top: 80, bottom: 80, left: 120, right: 120 },
width: { size: width, type: WidthType.DXA },
children: [new Paragraph({
alignment: AlignmentType.CENTER,
children: [new TextRun({ text: "☐", size: 22, font: "Calibri" })]
})]
});
}
function spacerRow(cols, shade = WHITE) {
return new TableRow({
children: Array(cols).fill(0).map(() => new TableCell({
shading: { fill: shade, type: ShadingType.CLEAR, color: shade },
borders: { top: noBorder(), bottom: noBorder(), left: noBorder(), right: noBorder() },
margins: { top: 40, bottom: 40, left: 80, right: 80 },
children: [new Paragraph({ children: [new TextRun({ text: "" })] })]
}))
});
}
function sectionHeaderRow(text, cols, shade = DARK_BLUE) {
return new TableRow({
children: [new TableCell({
columnSpan: cols,
shading: { fill: shade, type: ShadingType.CLEAR, color: shade },
borders: { top: thinBorder(), bottom: thinBorder(), left: thinBorder(), right: thinBorder() },
margins: { top: 100, bottom: 100, left: 160, right: 160 },
children: [new Paragraph({
alignment: AlignmentType.LEFT,
children: [new TextRun({ text: text.toUpperCase(), bold: true, color: WHITE, size: 22, font: "Calibri" })]
})]
})]
});
}
function itemRow(label, shade = WHITE, colWidths = [3800, 600, 600, 600, 600, 3000]) {
// label | 15min | 30min | 45min | 60min | notes
return new TableRow({
children: [
dataCell(label, shade, false, 1, colWidths[0]),
checkCell(shade, colWidths[1]),
checkCell(shade, colWidths[2]),
checkCell(shade, colWidths[3]),
checkCell(shade, colWidths[4]),
dataCell("", shade, false, 1, colWidths[5]),
]
});
}
function physItemRow(label, shade = WHITE, colWidths = [4400, 600, 4200]) {
// label | checkbox | notes
return new TableRow({
children: [
dataCell(label, shade, false, 1, colWidths[0]),
checkCell(shade, colWidths[1]),
dataCell("", shade, false, 1, colWidths[2]),
]
});
}
function alertRow(text, cols, shade = "FFF2CC") {
return new TableRow({
children: [new TableCell({
columnSpan: cols,
shading: { fill: shade, type: ShadingType.CLEAR, color: shade },
borders: { top: thinBorder(), bottom: thinBorder(), left: thinBorder(), right: thinBorder() },
margins: { top: 80, bottom: 80, left: 160, right: 160 },
children: [new Paragraph({
alignment: AlignmentType.LEFT,
children: [
new TextRun({ text: "⚠ ACTION THRESHOLD: ", bold: true, color: RED_ALERT, size: 19, font: "Calibri" }),
new TextRun({ text, bold: false, color: "000000", size: 19, font: "Calibri" })
]
})]
})]
});
}
// ── Document ────────────────────────────────────────────────────────────────
const doc = new Document({
creator: "Orris Clinical Tools",
title: "Post-Op Observation Checklist – Hysteroscopic Procedures",
description: "Nursing + Physician combined post-operative checklist for hysteroscopic procedures",
sections: [{
properties: {
page: {
margin: { top: 720, bottom: 720, left: 900, right: 900 },
}
},
headers: {
default: new Header({
children: [
new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
borders: { top: noBorder(), bottom: { style: BorderStyle.SINGLE, size: 8, color: MID_BLUE }, left: noBorder(), right: noBorder(), insideH: noBorder(), insideV: noBorder() },
rows: [new TableRow({
children: [
new TableCell({
borders: { top: noBorder(), bottom: noBorder(), left: noBorder(), right: noBorder() },
children: [new Paragraph({
children: [new TextRun({ text: "POST-OPERATIVE OBSERVATION CHECKLIST — HYSTEROSCOPIC PROCEDURES", bold: true, color: DARK_BLUE, size: 20, font: "Calibri" })]
})]
}),
new TableCell({
borders: { top: noBorder(), bottom: noBorder(), left: noBorder(), right: noBorder() },
children: [new Paragraph({
alignment: AlignmentType.RIGHT,
children: [new TextRun({ text: "Page ", size: 18, font: "Calibri", color: "666666" }), new PageNumber()]
})]
}),
]
})]
})
]
})
},
footers: {
default: new Footer({
children: [new Paragraph({
alignment: AlignmentType.CENTER,
children: [new TextRun({ text: "CONFIDENTIAL — FOR CLINICAL USE ONLY | Review annually or per institutional policy | Version 1.0 — May 2026", size: 16, color: "888888", font: "Calibri" })]
})]
})
},
children: [
// ══ TITLE BLOCK ══════════════════════════════════════════════════════
new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
rows: [
new TableRow({
children: [new TableCell({
shading: { fill: DARK_BLUE, type: ShadingType.CLEAR, color: DARK_BLUE },
borders: { top: noBorder(), bottom: noBorder(), left: noBorder(), right: noBorder() },
margins: { top: 200, bottom: 140, left: 240, right: 240 },
children: [
new Paragraph({
alignment: AlignmentType.CENTER,
children: [new TextRun({ text: "POST-OPERATIVE OBSERVATION CHECKLIST", bold: true, color: WHITE, size: 32, font: "Calibri" })]
}),
new Paragraph({
alignment: AlignmentType.CENTER,
children: [new TextRun({ text: "Hysteroscopic Procedures", bold: false, color: "BDD7EE", size: 24, font: "Calibri" })]
}),
]
})]
})
]
}),
new Paragraph({ children: [new TextRun({ text: "" })], spacing: { after: 120 } }),
// ══ PATIENT DETAILS ══════════════════════════════════════════════════
new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
rows: [
new TableRow({
children: [
headerCell("PATIENT DETAILS", MID_BLUE, 4),
]
}),
new TableRow({
children: [
dataCell("Patient Name:", LIGHT_GREY, true, 1, 1800),
dataCell("", WHITE, false, 1, 2400),
dataCell("DOB:", LIGHT_GREY, true, 1, 900),
dataCell("", WHITE, false, 1, 1400),
]
}),
new TableRow({
children: [
dataCell("MRN / Hospital No.:", LIGHT_GREY, true, 1, 1800),
dataCell("", WHITE, false, 1, 2400),
dataCell("Ward / Bay:", LIGHT_GREY, true, 1, 900),
dataCell("", WHITE, false, 1, 1400),
]
}),
new TableRow({
children: [
dataCell("Procedure Performed:", LIGHT_GREY, true, 1, 1800),
dataCell("", WHITE, false, 1, 2400),
dataCell("Date of Procedure:", LIGHT_GREY, true, 1, 900),
dataCell("", WHITE, false, 1, 1400),
]
}),
new TableRow({
children: [
dataCell("Surgeon:", LIGHT_GREY, true, 1, 1800),
dataCell("", WHITE, false, 1, 2400),
dataCell("Anaesthesia Type:", LIGHT_GREY, true, 1, 900),
dataCell("", WHITE, false, 1, 1400),
]
}),
]
}),
new Paragraph({ children: [new TextRun({ text: "" })], spacing: { after: 120 } }),
// ══ INTRA-OP HANDOVER ════════════════════════════════════════════════
new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
rows: [
new TableRow({ children: [headerCell("INTRA-OPERATIVE HANDOVER DATA (to be completed by scrub/circulating nurse)", MID_BLUE, 4)] }),
new TableRow({
children: [
dataCell("Distension Medium Used:", LIGHT_GREY, true, 1, 2200),
dataCell("☐ Normal Saline (bipolar) ☐ Glycine 1.5% ☐ Sorbitol 3% ☐ Sorbitol-Mannitol ☐ Other: ________", WHITE, false, 3, 6300),
]
}),
new TableRow({
children: [
dataCell("Total Fluid In (mL):", LIGHT_GREY, true, 1, 2200),
dataCell("", WHITE, false, 1, 1800),
dataCell("Total Fluid Out (mL):", LIGHT_GREY, true, 1, 2200),
dataCell("", WHITE, false, 1, 2300),
]
}),
new TableRow({
children: [
dataCell("Fluid Deficit (mL):", LIGHT_GREY, true, 1, 2200),
dataCell("", WHITE, false, 1, 1800),
dataCell("Operative Duration (min):", LIGHT_GREY, true, 1, 2200),
dataCell("", WHITE, false, 1, 2300),
]
}),
new TableRow({
children: [
dataCell("Intra-op Complications:", LIGHT_GREY, true, 1, 2200),
dataCell("☐ None ☐ Perforation (no electrode) ☐ Perforation (electrode active) ☐ Heavy bleeding ☐ Other: ________", WHITE, false, 3, 6300),
]
}),
new TableRow({
children: [
dataCell("Specimen Sent:", LIGHT_GREY, true, 1, 2200),
dataCell("☐ Yes — Histology ☐ Yes — MC&S ☐ No", WHITE, false, 3, 6300),
]
}),
new TableRow({
children: [
dataCell("Pre-op Antibiotics Given:", LIGHT_GREY, true, 1, 2200),
dataCell("☐ Yes (Agent: ________________) ☐ No ☐ Deferred", WHITE, false, 3, 6300),
]
}),
alertRow("Fluid deficit ≥750 mL = warning; ≥1000 mL (hypotonic media) or ≥1500 mL (saline) = check electrolytes NOW; ≥2500 mL (saline) = cardiac overload risk.", 4),
]
}),
new Paragraph({ children: [new TextRun({ text: "" })], spacing: { after: 120 } }),
// ══ SECTION A — NURSING OBSERVATIONS ════════════════════════════════
new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
rows: [
// Column header
new TableRow({
children: [
headerCell("SECTION A — NURSING TIME-BASED OBSERVATIONS", DARK_BLUE, 1, 3800),
headerCell("15 min", MID_BLUE, 1, 600),
headerCell("30 min", MID_BLUE, 1, 600),
headerCell("45 min", MID_BLUE, 1, 600),
headerCell("60 min", MID_BLUE, 1, 600),
headerCell("Notes / Values", MID_BLUE, 1, 3000),
]
}),
sectionHeaderRow("A1. Vital Signs", 6, "2E5FAC"),
itemRow("Blood Pressure (mmHg) — record value in Notes", LIGHT_GREY),
itemRow("Heart Rate (bpm) — record value in Notes", WHITE),
itemRow("SpO₂ (%) — record value in Notes", LIGHT_GREY),
itemRow("Respiratory Rate (breaths/min)", WHITE),
itemRow("Temperature (°C)", LIGHT_GREY),
itemRow("Pain Score (NRS 0–10)", WHITE),
itemRow("Level of Consciousness (AVPU / GCS)", LIGHT_GREY),
alertRow("BP <90/60 or >160/100; HR <50 or >110; SpO₂ <94%; RR <10 or >20; Pain ≥7 — escalate immediately.", 6),
sectionHeaderRow("A2. Fluid Balance", 6, "2E5FAC"),
itemRow("IV Fluid infusing — type and rate documented", LIGHT_GREY),
itemRow("Urinary catheter in situ / voiding confirmed (tick when done)", WHITE),
itemRow("Urine output measured (mL/hr) — record in Notes", LIGHT_GREY),
itemRow("Nausea / vomiting present (Y/N)", WHITE),
itemRow("Oral intake tolerated (sips → fluids → light diet)", LIGHT_GREY),
alertRow("Urine output <0.5 mL/kg/hr for 2 consecutive hours — notify physician.", 6),
sectionHeaderRow("A3. Vaginal Bleeding Assessment", 6, "2E5FAC"),
itemRow("Pad check performed — document saturation level", LIGHT_GREY),
itemRow("Colour of loss: Pink / Red / Dark — document in Notes", WHITE),
itemRow("Clots noted (Y/N; describe size if Yes)", LIGHT_GREY),
alertRow("Soaking >1 pad per 30 min, or clots larger than 50p coin — notify surgeon.", 6),
sectionHeaderRow("A4. Neurological & Fluid Toxicity Screen", 6, "2E5FAC"),
itemRow("Patient alert and oriented (Y/N)", LIGHT_GREY),
itemRow("Headache reported (Y/N)", WHITE),
itemRow("Nausea / vomiting (Y/N)", LIGHT_GREY),
itemRow("Visual disturbance / blurring (Y/N)", WHITE),
itemRow("Agitation / confusion (Y/N)", LIGHT_GREY),
itemRow("Periorbital or peripheral oedema noted (Y/N)", WHITE),
itemRow("Respiratory distress / crepitations (Y/N)", LIGHT_GREY),
alertRow("Any neurological symptom (confusion, headache, visual change) PLUS fluid deficit ≥750 mL = suspect hypo-osmolar absorption syndrome. Check serum Na⁺ urgently.", 6),
sectionHeaderRow("A5. Wound & Perineum", 6, "2E5FAC"),
itemRow("Cervical / vaginal trauma noted on speculum (Y/N)", LIGHT_GREY),
itemRow("Suprapubic or lower abdominal distension (Y/N)", WHITE),
itemRow("Peritonism signs: guarding / rigidity (Y/N)", LIGHT_GREY),
alertRow("Disproportionate abdominal pain + peritonism = suspect uterine perforation with visceral injury. Urgent surgical review.", 6),
sectionHeaderRow("A6. Medications Administered in Recovery", 6, "2E5FAC"),
itemRow("Analgesia given — agent, dose, time (record in Notes)", LIGHT_GREY),
itemRow("Antiemetic given — agent, dose, time (record in Notes)", WHITE),
itemRow("IV Fluids administered — type and volume (record in Notes)", LIGHT_GREY),
itemRow("Diuretic given (furosemide) — Y/N, dose (record in Notes)", WHITE),
sectionHeaderRow("A7. Nursing Discharge Readiness (tick all before discharge)", 6, "2E5FAC"),
itemRow("Vitals stable ×2 consecutive readings", LIGHT_GREY),
itemRow("Pain controlled on oral analgesia", WHITE),
itemRow("Tolerating oral fluids", LIGHT_GREY),
itemRow("Voiding spontaneously / catheter plan documented", WHITE),
itemRow("Bleeding within acceptable limits (light spotting)", LIGHT_GREY),
itemRow("Responsible adult escort confirmed", WHITE),
itemRow("Written discharge instructions given to patient", LIGHT_GREY),
itemRow("Patient verbally understands return-to-ED criteria", WHITE),
]
}),
new Paragraph({ children: [new TextRun({ text: "" })], spacing: { after: 160 } }),
// ══ SECTION B — PHYSICIAN ASSESSMENT ════════════════════════════════
new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
rows: [
new TableRow({
children: [
headerCell("SECTION B — PHYSICIAN POST-OPERATIVE ASSESSMENT", DARK_BLUE, 1, 4400),
headerCell("Done", MID_BLUE, 1, 600),
headerCell("Findings / Actions", MID_BLUE, 1, 4200),
]
}),
sectionHeaderRow("B1. Fluid & Electrolyte Review", 3, "2E5FAC"),
physItemRow("Review intra-op fluid deficit from handover", LIGHT_GREY),
physItemRow("Order serum electrolytes (Na⁺, K⁺, Cl⁻) if deficit ≥1000 mL", WHITE),
physItemRow("Order FBC if significant intra-op bleeding or haemodynamic instability", LIGHT_GREY),
physItemRow("Order serum glucose and arterial blood gas if CNS symptoms present", WHITE),
physItemRow("Order 12-lead ECG if hyponatraemia or arrhythmia suspected", LIGHT_GREY),
physItemRow("Document electrolyte results and plan", WHITE),
alertRow("Na⁺ >120 mEq/L (mild): fluid restrict + IV furosemide. Na⁺ <120 mEq/L (severe): IV 3% NaCl with caution — risk of central pontine myelinolysis if corrected too rapidly.", 3),
sectionHeaderRow("B2. Haemorrhage Assessment", 3, "2E5FAC"),
physItemRow("Review estimated blood loss from operative record", LIGHT_GREY),
physItemRow("Review post-op Hb / haematocrit if clinically indicated", WHITE),
physItemRow("IV access patent and adequate (minimum 18G)", LIGHT_GREY),
physItemRow("Group & Save / cross-match ordered if heavy bleeding", WHITE),
alertRow("Haemodynamic instability + heavy bleeding: activate haemorrhage protocol; consider IV oxytocin, balloon tamponade, or return to theatre.", 3),
sectionHeaderRow("B3. Perforation / Visceral Injury Assessment", 3, "2E5FAC"),
physItemRow("Confirm whether perforation was noted intra-operatively", LIGHT_GREY),
physItemRow("If perforation (no electrode): patient observed, discharge if stable", WHITE),
physItemRow("If electrode active at time of perforation: arrange laparoscopy to inspect bowel/bladder", LIGHT_GREY),
physItemRow("Abdominal examination: soft / tender / peritonism documented", WHITE),
physItemRow("Surgical review requested if peritonism or haemodynamic compromise", LIGHT_GREY),
sectionHeaderRow("B4. Pain & Analgesia Review", 3, "2E5FAC"),
physItemRow("Pain score documented and acceptable (NRS ≤3 at rest)", LIGHT_GREY),
physItemRow("NSAIDs prescribed (e.g. ibuprofen 400 mg TDS) unless contraindicated", WHITE),
physItemRow("Paracetamol 1 g QDS prescribed as adjunct", LIGHT_GREY),
physItemRow("Opioid prescribed PRN if NSAIDs insufficient (with monitoring plan)", WHITE),
physItemRow("Severe colicky pain post-op: consider haematometra — USS abdomen/pelvis", LIGHT_GREY),
sectionHeaderRow("B5. VTE Prophylaxis", 3, "2E5FAC"),
physItemRow("VTE risk assessed (low / moderate / high)", LIGHT_GREY),
physItemRow("TED compression stockings applied", WHITE),
physItemRow("Early ambulation ordered (within 2–4 hours of recovery)", LIGHT_GREY),
physItemRow("LMWH prescribed if moderate/high risk (e.g. enoxaparin 40 mg SC daily)", WHITE),
sectionHeaderRow("B6. Infection / Antimicrobial Review", 3, "2E5FAC"),
physItemRow("Prophylactic antibiotic given pre-op (confirmed in notes)", LIGHT_GREY),
physItemRow("Post-op antibiotics NOT routinely required — documented", WHITE),
physItemRow("Fever >38°C in first 24 h — assess for non-infectious causes first (atelectasis, haematoma)", LIGHT_GREY),
physItemRow("If fever ≥day 3–5: MSU for MC&S; consider UTI", WHITE),
sectionHeaderRow("B7. Follow-Up Plan", 3, "2E5FAC"),
physItemRow("Follow-up appointment arranged (4–6 weeks, or earlier for G2 fibroids)", LIGHT_GREY),
physItemRow("Histology result chase plan documented", WHITE),
physItemRow("Repeat hysteroscopy planned if incomplete G2 resection", LIGHT_GREY),
physItemRow("Intrauterine adhesion prevention discussed (if applicable)", WHITE),
physItemRow("Contraception / fertility plan discussed with patient", LIGHT_GREY),
sectionHeaderRow("B8. Physician Discharge Authorisation", 3, "2E5FAC"),
physItemRow("All nursing discharge readiness criteria met (Section A7)", LIGHT_GREY),
physItemRow("Electrolytes reviewed and within acceptable limits", WHITE),
physItemRow("No ongoing haemorrhage, perforation concern, or fluid toxicity signs", LIGHT_GREY),
physItemRow("Discharge summary / TTOs completed", WHITE),
physItemRow("GP letter dictated / sent", LIGHT_GREY),
]
}),
new Paragraph({ children: [new TextRun({ text: "" })], spacing: { after: 120 } }),
// ══ SECTION C — RETURN TO ED CRITERIA ═══════════════════════════════
new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
rows: [
new TableRow({ children: [headerCell("SECTION C — PATIENT DISCHARGE INSTRUCTIONS: RETURN TO HOSPITAL IF...", RED_ALERT, 2)] }),
new TableRow({
children: [
dataCell("• Vaginal bleeding soaking >1 pad per hour\n• Large clots passed (golf-ball size or larger)\n• Severe or worsening abdominal pain\n• Fever ≥38°C (100.4°F)", "FFF2CC", false, 1, 4500),
dataCell("• Dizziness, fainting, or collapse\n• Persistent nausea/vomiting\n• Inability to pass urine\n• Any symptoms of concern not listed above", "FFF2CC", false, 1, 4000),
]
}),
]
}),
new Paragraph({ children: [new TextRun({ text: "" })], spacing: { after: 120 } }),
// ══ SIGNATURES ═══════════════════════════════════════════════════════
new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
rows: [
new TableRow({ children: [headerCell("SIGNATURES", MID_BLUE, 4)] }),
new TableRow({
children: [
dataCell("Nurse Name:", LIGHT_GREY, true, 1, 1400),
dataCell("", WHITE, false, 1, 2200),
dataCell("Signature:", LIGHT_GREY, true, 1, 1000),
dataCell("", WHITE, false, 1, 3900),
]
}),
new TableRow({
children: [
dataCell("Physician Name:", LIGHT_GREY, true, 1, 1400),
dataCell("", WHITE, false, 1, 2200),
dataCell("Signature:", LIGHT_GREY, true, 1, 1000),
dataCell("", WHITE, false, 1, 3900),
]
}),
new TableRow({
children: [
dataCell("Date / Time of Discharge:", LIGHT_GREY, true, 1, 1400),
dataCell("", WHITE, false, 3, 7100),
]
}),
]
}),
new Paragraph({ children: [new TextRun({ text: "" })], spacing: { after: 200 } }),
// ══ REFERENCE NOTE ═══════════════════════════════════════════════════
new Paragraph({
alignment: AlignmentType.LEFT,
children: [
new TextRun({ text: "Clinical References: ", bold: true, size: 16, color: "555555", font: "Calibri" }),
new TextRun({ text: "Berek & Novak's Gynecology (pp. 532–533); Schwartz's Principles of Surgery 11e (p. 1824); Miller's Anesthesia 10e (pp. 8477–8478); Tintinalli's Emergency Medicine.", size: 16, color: "555555", font: "Calibri" }),
],
spacing: { before: 80, after: 80 }
}),
]
}]
});
Packer.toBuffer(doc).then(buffer => {
fs.writeFileSync("/home/daytona/workspace/hysteroscopy-checklist/PostOp_Hysteroscopy_Checklist.docx", buffer);
console.log("SUCCESS: File written.");
}).catch(err => {
console.error("ERROR:", err);
process.exit(1);
});