Can i have a powerpoint presentation on epistaxis

Asking for Preferences
Reading File
Reading File
Reading File
Finding Sources
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Running Command

mkdir -p /home/daytona/workspace/epistaxis-pptx && ls /home/daytona/workspace/ep…

Writing File

~/epistaxis-pptx/build.js

const pptxgen = require("pptxgenjs");

const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Epistaxis: Clinical Management";
pres.author = "Clinical Education";

// ─── COLOUR PALETTE ───────────────────────────────────────────────
const C = {
  navy:    "0A2342",   // dominant dark
  teal:    "1B7A8C",   // supporting mid
  tealLt:  "2EAFC0",   // accent / highlight bar
  cream:   "F5F0E8",   // content bg
  white:   "FFFFFF",
  red:     "C0392B",   // danger/warning accent
  amber:   "D4860A",   // caution accent
  slate:   "4A5568",   // body text
  lightBg: "EBF4F7",   // alternating row
};

// ─── HELPERS ──────────────────────────────────────────────────────
function titleSlide(slide, title, subtitle) {
  // full dark background
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: "100%", h: "100%", fill: { color: C.navy } });
  // accent bar
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 3.8, w: "100%", h: 0.08, fill: { color: C.tealLt } });
  // title
  slide.addText(title, {
    x: 0.7, y: 1.3, w: 8.6, h: 1.5,
    fontSize: 42, bold: true, color: C.white,
    fontFace: "Calibri", align: "left", valign: "middle",
  });
  // subtitle
  if (subtitle) {
    slide.addText(subtitle, {
      x: 0.7, y: 3.1, w: 8.6, h: 0.6,
      fontSize: 18, color: C.tealLt, fontFace: "Calibri", align: "left",
    });
  }
  // decorative circle
  slide.addShape(pres.ShapeType.ellipse, {
    x: 8.4, y: 0.2, w: 1.8, h: 1.8,
    fill: { color: C.teal }, line: { color: C.teal },
  });
  slide.addText("ENT", {
    x: 8.4, y: 0.2, w: 1.8, h: 1.8,
    fontSize: 22, bold: true, color: C.white, align: "center", valign: "middle",
  });
  // bottom bar
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 5.2, w: "100%", h: 0.43, fill: { color: C.teal } });
  slide.addText("For Clinicians & Residents  |  2026", {
    x: 0.3, y: 5.23, w: 9.4, h: 0.38,
    fontSize: 11, color: C.white, fontFace: "Calibri", align: "left",
  });
}

function sectionHeader(slide, label, icon) {
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: "100%", h: "100%", fill: { color: C.teal } });
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 4.9, w: "100%", h: 0.73, fill: { color: C.navy } });
  slide.addShape(pres.ShapeType.rect, { x: 0.7, y: 1.6, w: 0.12, h: 2.0, fill: { color: C.white } });
  slide.addText(label, {
    x: 1.05, y: 1.4, w: 8, h: 2.4,
    fontSize: 36, bold: true, color: C.white, fontFace: "Calibri", align: "left", valign: "middle",
  });
  if (icon) {
    slide.addText(icon, {
      x: 7.5, y: 1.5, w: 2, h: 2,
      fontSize: 80, align: "center", valign: "middle",
    });
  }
}

function contentSlide(slide, title, bullets, opts = {}) {
  // header bar
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: "100%", h: 1.0, fill: { color: C.navy } });
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 1.0, w: "100%", h: 0.07, fill: { color: C.tealLt } });
  slide.addText(title, {
    x: 0.3, y: 0, w: 9.4, h: 1.0,
    fontSize: 24, bold: true, color: C.white, fontFace: "Calibri", align: "left", valign: "middle",
    margin: [0, 0, 0, 12],
  });

  // content background
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 1.07, w: "100%", h: 4.55, fill: { color: C.cream } });

  // bullets
  const items = bullets.map((b, i) => ({
    text: b,
    options: {
      bullet: { type: "bullet", characterCode: "25B8" },
      color: C.slate,
      fontSize: opts.fontSize || 17,
      fontFace: "Calibri",
      breakLine: i < bullets.length - 1,
      paraSpaceAfter: 6,
    },
  }));
  slide.addText(items, {
    x: 0.45, y: 1.3, w: 9.1, h: 4.1,
    valign: "top",
  });
}

function twoColSlide(slide, title, leftTitle, leftBullets, rightTitle, rightBullets) {
  // header
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: "100%", h: 1.0, fill: { color: C.navy } });
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 1.0, w: "100%", h: 0.07, fill: { color: C.tealLt } });
  slide.addText(title, {
    x: 0.3, y: 0, w: 9.4, h: 1.0,
    fontSize: 24, bold: true, color: C.white, fontFace: "Calibri", align: "left", valign: "middle",
    margin: [0, 0, 0, 12],
  });

  // left col
  slide.addShape(pres.ShapeType.rect, { x: 0.25, y: 1.15, w: 4.45, h: 4.3, fill: { color: C.lightBg }, line: { color: C.teal, width: 1.5 } });
  slide.addShape(pres.ShapeType.rect, { x: 0.25, y: 1.15, w: 4.45, h: 0.45, fill: { color: C.teal } });
  slide.addText(leftTitle, { x: 0.25, y: 1.15, w: 4.45, h: 0.45, fontSize: 14, bold: true, color: C.white, align: "center", valign: "middle" });
  const leftItems = leftBullets.map((b, i) => ({
    text: b,
    options: { bullet: { type: "bullet", characterCode: "25B8" }, color: C.slate, fontSize: 15, fontFace: "Calibri", breakLine: i < leftBullets.length - 1, paraSpaceAfter: 5 },
  }));
  slide.addText(leftItems, { x: 0.4, y: 1.7, w: 4.1, h: 3.7, valign: "top" });

  // right col
  slide.addShape(pres.ShapeType.rect, { x: 5.3, y: 1.15, w: 4.45, h: 4.3, fill: { color: C.lightBg }, line: { color: C.red, width: 1.5 } });
  slide.addShape(pres.ShapeType.rect, { x: 5.3, y: 1.15, w: 4.45, h: 0.45, fill: { color: C.red } });
  slide.addText(rightTitle, { x: 5.3, y: 1.15, w: 4.45, h: 0.45, fontSize: 14, bold: true, color: C.white, align: "center", valign: "middle" });
  const rightItems = rightBullets.map((b, i) => ({
    text: b,
    options: { bullet: { type: "bullet", characterCode: "25B8" }, color: C.slate, fontSize: 15, fontFace: "Calibri", breakLine: i < rightBullets.length - 1, paraSpaceAfter: 5 },
  }));
  slide.addText(rightItems, { x: 5.45, y: 1.7, w: 4.1, h: 3.7, valign: "top" });
}

function tableSlide(slide, title, headers, rows) {
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: "100%", h: 1.0, fill: { color: C.navy } });
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 1.0, w: "100%", h: 0.07, fill: { color: C.tealLt } });
  slide.addText(title, {
    x: 0.3, y: 0, w: 9.4, h: 1.0,
    fontSize: 24, bold: true, color: C.white, fontFace: "Calibri", align: "left", valign: "middle",
    margin: [0, 0, 0, 12],
  });

  const tableData = [
    headers.map(h => ({ text: h, options: { bold: true, color: C.white, fill: C.teal, align: "center", fontSize: 13 } })),
    ...rows.map((row, ri) =>
      row.map(cell => ({ text: cell, options: { color: C.slate, fill: ri % 2 === 0 ? C.cream : C.lightBg, fontSize: 13, align: "left" } }))
    ),
  ];
  slide.addTable(tableData, {
    x: 0.3, y: 1.2, w: 9.4,
    border: { type: "solid", color: C.teal, pt: 0.5 },
    fontFace: "Calibri",
    rowH: 0.42,
  });
}

function keyPointsSlide(slide, title, points) {
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: "100%", h: 1.0, fill: { color: C.navy } });
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 1.0, w: "100%", h: 0.07, fill: { color: C.tealLt } });
  slide.addText(title, {
    x: 0.3, y: 0, w: 9.4, h: 1.0,
    fontSize: 24, bold: true, color: C.white, fontFace: "Calibri", align: "left", valign: "middle",
    margin: [0, 0, 0, 12],
  });
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 1.07, w: "100%", h: 4.55, fill: { color: C.cream } });

  const colW = 4.5;
  const colH = 1.7;
  const margin = 0.28;
  const startX = 0.3;
  const startY = 1.25;
  const colors = [C.teal, C.red, C.teal, C.red];

  points.forEach((pt, i) => {
    const col = i % 2;
    const row = Math.floor(i / 2);
    const x = startX + col * (colW + margin);
    const y = startY + row * (colH + 0.1);
    slide.addShape(pres.ShapeType.rect, { x, y, w: colW, h: colH, fill: { color: colors[i] }, line: { color: colors[i] } });
    slide.addText([{ text: pt.label + "\n", options: { bold: true, breakLine: true, fontSize: 14, color: C.white } }, { text: pt.body, options: { fontSize: 12, color: C.white } }], {
      x: x + 0.15, y: y + 0.12, w: colW - 0.3, h: colH - 0.25,
      valign: "top", fontFace: "Calibri",
    });
  });
}

function closingSlide(slide) {
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: "100%", h: "100%", fill: { color: C.navy } });
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 2.5, w: "100%", h: 0.08, fill: { color: C.tealLt } });
  slide.addText("Key Takeaways", {
    x: 0.7, y: 0.4, w: 8.6, h: 0.8,
    fontSize: 30, bold: true, color: C.tealLt, fontFace: "Calibri",
  });
  const msgs = [
    "90% of nosebleeds are anterior (Kiesselbach's plexus) — manageable in the ED",
    "Identify the bleeding site early; chemical cautery is first-line if accessible",
    "Topical tranexamic acid is an evidence-based adjunct that reduces re-bleeding",
    "Posterior epistaxis demands specialized packing + inpatient monitoring",
    "Refractory cases: sphenopalatine artery ligation or endovascular embolisation",
    "Always rule out coagulopathy, anticoagulants & HHT in recurrent/severe cases",
  ];
  const items = msgs.map((m, i) => ({
    text: m,
    options: { bullet: { type: "bullet", characterCode: "2714" }, color: C.white, fontSize: 15, fontFace: "Calibri", breakLine: i < msgs.length - 1, paraSpaceAfter: 7 },
  }));
  slide.addText(items, { x: 0.7, y: 1.3, w: 8.6, h: 1.1, valign: "top" });
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 4.9, w: "100%", h: 0.73, fill: { color: C.teal } });
  slide.addText("Sources: Rosen's Emergency Medicine 10e • Bailey & Love's Surgery 28e • Cummings Otolaryngology", {
    x: 0.3, y: 4.95, w: 9.4, h: 0.6,
    fontSize: 10, color: C.white, fontFace: "Calibri", align: "center",
  });
}

// ══════════════════════════════════════════════════════════════════
// SLIDE 1 — Title
// ══════════════════════════════════════════════════════════════════
let s1 = pres.addSlide();
titleSlide(s1, "EPISTAXIS", "Clinical Management for Clinicians & Residents");

// ══════════════════════════════════════════════════════════════════
// SLIDE 2 — Section: Overview
// ══════════════════════════════════════════════════════════════════
let s2 = pres.addSlide();
sectionHeader(s2, "Overview & Epidemiology", "🩺");

// ══════════════════════════════════════════════════════════════════
// SLIDE 3 — Definition & Epidemiology
// ══════════════════════════════════════════════════════════════════
let s3 = pres.addSlide();
contentSlide(s3, "Definition & Epidemiology", [
  "Epistaxis = bleeding from the nasal cavity; one of the most common ENT emergencies",
  "Bimodal age distribution: peaks in children (<10 yrs) and adults (>50 yrs)",
  "Higher incidence in winter months — dry air desiccates nasal mucosa and impairs coagulation",
  "~60% of people experience at least one episode in their lifetime; <10% seek medical care",
  "Death from epistaxis is exceedingly rare; most episodes are self-limiting",
  "Anterior epistaxis: ~90% of cases — usually benign, manageable in the ED",
  "Posterior epistaxis: ~10% of cases — more severe, older patients, higher comorbidity burden",
], { fontSize: 16 });

// ══════════════════════════════════════════════════════════════════
// SLIDE 4 — Nasal Blood Supply
// ══════════════════════════════════════════════════════════════════
let s4 = pres.addSlide();
contentSlide(s4, "Relevant Nasal Blood Supply", [
  "SPHENOPALATINE ARTERY (branch of internal maxillary a.) — supplies turbinates, lateral wall, posterior/inferior septum; implicated in most posterior bleeds",
  "ANTERIOR ETHMOIDAL ARTERY (from ophthalmic a. / internal carotid) — supplies superior nasal mucosa",
  "POSTERIOR ETHMOIDAL ARTERY — also from ophthalmic artery; supplies superior-posterior septum",
  "SUPERIOR LABIAL ARTERY (branch of facial a.) — supplies anterior septal mucosa and anterior lateral wall",
  "KIESSELBACH'S PLEXUS (Little's area) — anastomotic convergence of all 4 vessels on anteroinferior septum; most common bleeding site",
  "Posterior bleeds: predominantly from sphenopalatine artery branches — more difficult to access and control",
], { fontSize: 16 });

// ══════════════════════════════════════════════════════════════════
// SLIDE 5 — Aetiology (two-col)
// ══════════════════════════════════════════════════════════════════
let s5 = pres.addSlide();
twoColSlide(
  s5,
  "Aetiology of Epistaxis",
  "Local Causes",
  [
    "Nose picking (digital trauma) — commonest in children",
    "Nasal trauma / facial fractures",
    "Upper respiratory tract infections",
    "Allergic / vasomotor rhinitis",
    "Nasal foreign bodies",
    "Nasal polyps",
    "Neoplasms (juvenile angiofibroma, SCC)",
    "Granulomatous disease (GPA, sarcoidosis)",
    "Environmental irritants / low humidity",
    "Cocaine use (septal perforation)",
    "Post-operative bleeding",
    "Barotrauma",
  ],
  "Systemic Causes",
  [
    "Hypertension (associated with persistent bleeding)",
    "Anticoagulants: warfarin, rivaroxaban, apixaban",
    "Antiplatelet therapy: aspirin, clopidogrel",
    "Hereditary haemorrhagic telangiectasia (Osler-Weber-Rendu)",
    "Haemophilia A & B",
    "von Willebrand's disease",
    "Thrombocytopenia (leukaemia, ITP, chemotherapy)",
    "Liver disease / vitamin K deficiency",
    "Folic acid deficiency",
    "Alcoholism",
    "Chronic intranasal vasoconstrictor use",
  ]
);

// ══════════════════════════════════════════════════════════════════
// SLIDE 6 — Section: Assessment
// ══════════════════════════════════════════════════════════════════
let s6 = pres.addSlide();
sectionHeader(s6, "Assessment & Diagnosis", "🔍");

// ══════════════════════════════════════════════════════════════════
// SLIDE 7 — Initial Assessment
// ══════════════════════════════════════════════════════════════════
let s7 = pres.addSlide();
contentSlide(s7, "Initial Assessment", [
  "PRIORITISE: Assess airway patency, haemodynamics (HR, BP), and tissue perfusion first",
  "HISTORY: Duration, frequency, severity of bleeding; laterality; prior episodes",
  "MEDICATIONS: Full anticoagulant/antiplatelet list; NSAIDs, herbal supplements",
  "COMORBIDITIES: Hypertension, liver disease, renal failure, haematological conditions",
  "FAMILY HISTORY: Hereditary haemorrhagic telangiectasia (HHT) — telangiectasias on lips/tongue",
  "EXAMINATION: Compress cartilaginous nose (bilateral) for 10–15 min + 0.05% oxymetazoline spray, then inspect",
  "Tilt head FORWARD (not back) to prevent blood entering airway/GI tract",
  "Use nasal speculum opened VERTICALLY to avoid obscuring the septum",
], { fontSize: 16 });

// ══════════════════════════════════════════════════════════════════
// SLIDE 8 — Investigations
// ══════════════════════════════════════════════════════════════════
let s8 = pres.addSlide();
tableSlide(
  s8,
  "Investigations",
  ["Investigation", "Indication", "Notes"],
  [
    ["FBC / CBC", "Severe / recurrent bleeding; haematological disorders suspected", "Rule out thrombocytopenia, leukaemia"],
    ["Coagulation screen (PT, APTT)", "Anticoagulant use; severe haemorrhage; liver disease", "Guide reversal therapy"],
    ["Group & Cross-match", "Massive haemorrhage / haemodynamic instability", "Prepare for transfusion"],
    ["Renal function / LFTs", "Suspected liver disease or renal failure", "Platelet dysfunction in uraemia"],
    ["CT / MRI face/sinuses", "Suspected tumour, juvenile angiofibroma, HHT", "Contrast CT for angiofibroma — biopsy contraindicated"],
    ["Rigid nasendoscopy", "Identify posterior bleeding site in ED / clinic", "Confirms source; guides cautery"],
    ["Angiography", "Pre-embolisation for refractory posterior bleed", "Bilateral carotid angiography required"],
  ]
);

// ══════════════════════════════════════════════════════════════════
// SLIDE 9 — Anterior vs Posterior (two-col)
// ══════════════════════════════════════════════════════════════════
let s9 = pres.addSlide();
twoColSlide(
  s9,
  "Anterior vs Posterior Epistaxis",
  "Anterior (90%)",
  [
    "Site: Kiesselbach's plexus (Little's area)",
    "Usually unilateral, visible on direct inspection",
    "Common in children and young adults",
    "Triggers: nose picking, URTI, dry air",
    "Usually self-limiting",
    "Manageable in the ED with pressure, cautery, or packing",
    "Good response to silver nitrate cautery",
  ],
  "Posterior (10%)",
  [
    "Site: sphenopalatine artery branches",
    "Older patients with multiple comorbidities (HTN, anticoagulants)",
    "Heavier bleeding — may be bilateral or pharyngeal",
    "Not visible on anterior rhinoscopy",
    "Suggested if anterior packing fails to control bleeding",
    "Requires posterior nasal packing + hospital admission",
    "May need embolisation or surgical ligation",
  ]
);

// ══════════════════════════════════════════════════════════════════
// SLIDE 10 — Section: Management
// ══════════════════════════════════════════════════════════════════
let s10 = pres.addSlide();
sectionHeader(s10, "Management", "💉");

// ══════════════════════════════════════════════════════════════════
// SLIDE 11 — Step-wise Management Algorithm
// ══════════════════════════════════════════════════════════════════
let s11 = pres.addSlide();
slide11Management(s11);

function slide11Management(slide) {
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: "100%", h: 1.0, fill: { color: C.navy } });
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 1.0, w: "100%", h: 0.07, fill: { color: C.tealLt } });
  slide.addText("Step-wise Management Algorithm", {
    x: 0.3, y: 0, w: 9.4, h: 1.0,
    fontSize: 24, bold: true, color: C.white, fontFace: "Calibri", align: "left", valign: "middle",
    margin: [0, 0, 0, 12],
  });
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 1.07, w: "100%", h: 4.55, fill: { color: C.cream } });

  const steps = [
    { n: "1", label: "First Aid", body: "Lean forward, pinch cartilaginous nose 10–15 min + oxymetazoline 0.05% spray", col: C.teal },
    { n: "2", label: "Identify site", body: "Blow nose to clear clot, then visualise with speculum under good illumination", col: C.tealLt },
    { n: "3", label: "Chemical cautery", body: "Silver nitrate to periphery → centre if bleeding site visible; avoid bilateral septum", col: C.amber },
    { n: "4", label: "Topical haemostats", body: "Gelfoam / Surgicel; topical tranexamic acid 500 mg (adjunct — reduces re-bleeding)", col: C.teal },
    { n: "5", label: "Anterior packing", body: "Merocel tampon or Rapid Rhino balloon along floor of nose if above fail", col: C.tealLt },
    { n: "6", label: "Posterior packing", body: "Double-balloon catheter (or Foley 5–7 mL) if anterior packing fails; admit", col: C.amber },
    { n: "7", label: "Surgical / Interventional", body: "Endoscopic sphenopalatine artery ligation or endovascular embolisation (91–97% success)", col: C.red },
  ];

  const boxW = 4.55;
  const boxH = 0.58;
  const gap = 0.07;
  const startY = 1.18;

  steps.forEach((st, i) => {
    const col = i % 2;
    const row = Math.floor(i / 2);
    const x = col === 0 ? 0.25 : 5.2;
    const y = startY + row * (boxH + gap);
    if (i === 6) { // last item centred
      slide.addShape(pres.ShapeType.rect, { x: 2.73, y, w: 4.55, h: boxH, fill: { color: st.col }, line: { color: st.col } });
      slide.addText([
        { text: `${st.n}. ${st.label}: `, options: { bold: true, color: C.white, fontSize: 13, fontFace: "Calibri" } },
        { text: st.body, options: { color: C.white, fontSize: 12, fontFace: "Calibri" } },
      ], { x: 2.88, y: y + 0.04, w: 4.25, h: boxH - 0.08, valign: "middle" });
    } else {
      slide.addShape(pres.ShapeType.rect, { x, y, w: boxW, h: boxH, fill: { color: st.col }, line: { color: st.col } });
      slide.addText([
        { text: `${st.n}. ${st.label}: `, options: { bold: true, color: C.white, fontSize: 13, fontFace: "Calibri" } },
        { text: st.body, options: { color: C.white, fontSize: 12, fontFace: "Calibri" } },
      ], { x: x + 0.15, y: y + 0.04, w: boxW - 0.3, h: boxH - 0.08, valign: "middle" });
    }
  });
}

// ══════════════════════════════════════════════════════════════════
// SLIDE 12 — Anterior Packing Details
// ══════════════════════════════════════════════════════════════════
let s12 = pres.addSlide();
contentSlide(s12, "Anterior Nasal Packing — Practical Points", [
  "DEVICES: Merocel polyvinyl acetal tampon OR Rapid Rhino inflatable balloon (procoagulant-coated hydrofibre)",
  "INSERTION: Insert along the floor of the nose parallel to the hard palate; inflate with AIR (not saline) for Rapid Rhino",
  "If bleeding persists despite ipsilateral packing → insert second tampon in the contralateral naris",
  "DURATION: Leave in situ 24–48 h; remove under direct vision",
  "ANTIBIOTICS: Routine prophylactic antibiotics NOT recommended — insufficient evidence of benefit",
  "Vaseline-impregnated ribbon gauze is an acceptable low-cost alternative if commercial devices unavailable",
  "Bilateral simultaneous packing may cause significant discomfort and should be reserved for failure of unilateral",
  "MONITOR for complications: pressure necrosis, septal perforation, sinusitis, toxic shock syndrome",
], { fontSize: 15 });

// ══════════════════════════════════════════════════════════════════
// SLIDE 13 — Tranexamic Acid
// ══════════════════════════════════════════════════════════════════
let s13 = pres.addSlide();
contentSlide(s13, "Tranexamic Acid in Epistaxis", [
  "MECHANISM: Inhibits fibrinolysis by blocking lysine binding sites on plasminogen — stabilises clot",
  "ROUTE: Topical (applied to pledget or atomised) — avoids systemic side-effects",
  "DOSE: 500 mg of IV tranexamic acid solution applied topically (most trial protocols)",
  "EFFICACY: Moderate-quality evidence — reduces immediate bleeding at 10 min and re-bleeding at 7–10 days",
  "Superior to anterior nasal packing specifically in patients on ANTIPLATELET therapy (aspirin, clopidogrel)",
  "No significant increase in adverse events in published trials",
  "Can be used as adjunct to standard care OR in place of nasal packing in selected patients",
  "Systemic IV tranexamic acid may be considered for severe or recurrent bleeding uncontrolled by local measures",
], { fontSize: 15 });

// ══════════════════════════════════════════════════════════════════
// SLIDE 14 — Surgical & Interventional
// ══════════════════════════════════════════════════════════════════
let s14 = pres.addSlide();
tableSlide(
  s14,
  "Surgical & Interventional Options",
  ["Procedure", "Indication", "Key Points"],
  [
    ["Endoscopic cautery", "Posterior bleeding site identified on nasendoscopy", "Topical vasoconstrictor + electrocautery under direct vision; first-line when site visible"],
    ["Endoscopic sphenopalatine artery ligation (ESPAL)", "Refractory posterior epistaxis; failed packing", "High success rate; performed under GA; ENT referral required"],
    ["Anterior ethmoidal artery ligation", "Bleeding from superior septum / anterior ethmoidal territory", "External or endoscopic; used when ESPAL insufficient"],
    ["Endovascular embolisation", "Posterior epistaxis refractory to packing; surgical risk too high", "Bilateral carotid angiography → selective embolisation of sphenopalatine/facial arteries; 91–97% success; 0–3% complication rate"],
    ["Septal dermoplasty (for HHT)", "Hereditary haemorrhagic telangiectasia — recurrent mucosal bleeds", "Replaces telangiectatic mucosa with skin graft; reduces re-bleeding frequency"],
    ["Preop embolisation (angiofibroma)", "Juvenile angiofibroma — reduces intraoperative haemorrhage", "Performed 24–72 h before surgical excision"],
  ]
);

// ══════════════════════════════════════════════════════════════════
// SLIDE 15 — Section: Special Situations
// ══════════════════════════════════════════════════════════════════
let s15 = pres.addSlide();
sectionHeader(s15, "Special Situations", "⚠️");

// ══════════════════════════════════════════════════════════════════
// SLIDE 16 — Anticoagulated Patients
// ══════════════════════════════════════════════════════════════════
let s16 = pres.addSlide();
contentSlide(s16, "Epistaxis in Anticoagulated Patients", [
  "Anticoagulants (warfarin, DOACs) and antiplatelets are associated with RECURRENT and more severe epistaxis",
  "Check INR in warfarin patients — supratherapeutic INR needs correction before definitive treatment",
  "DOAC reversal agents: Idarucizumab (dabigatran) | Andexanet alfa (apixaban, rivaroxaban) — use in life-threatening bleed",
  "Antiplatelet drugs (aspirin, clopidogrel) — not reversible; platelet transfusion rarely indicated unless thrombocytopenic",
  "TOPICAL TRANEXAMIC ACID is SUPERIOR to nasal packing in patients on antiplatelet therapy — prefer as first-line adjunct",
  "Weigh bleeding risk vs. thrombotic risk BEFORE interrupting anticoagulation — consult haematology/cardiology",
  "Recurrence rate higher in anticoagulated patients — consider ENT outpatient follow-up after ED discharge",
  "Document INR / DOAC medication, reversal given, and anticoagulation plan at discharge",
], { fontSize: 15 });

// ══════════════════════════════════════════════════════════════════
// SLIDE 17 — HHT
// ══════════════════════════════════════════════════════════════════
let s17 = pres.addSlide();
contentSlide(s17, "Hereditary Haemorrhagic Telangiectasia (HHT)", [
  "Autosomal dominant vascular disorder (Osler-Weber-Rendu disease) — deficient TGF-β signalling (ENG, ACVRL1 mutations)",
  "Thin-walled vessels lacking muscle and elastic tissue — multiple telangiectasias on nasal mucosa, lips, tongue, fingers",
  "Recurrent multifocal bilateral nosebleeds, often severe — major cause of iron-deficiency anaemia",
  "DIAGNOSIS (Curaçao criteria): epistaxis, telangiectasias, visceral AVMs, positive family history (3/4 = definite HHT)",
  "Screen for pulmonary, hepatic, and cerebral AVMs — echocardiography with bubble contrast and CT thorax",
  "ACUTE: standard epistaxis management; humidification, saline rinses to maintain mucosal moisture",
  "LONG-TERM: Laser coagulation, septodermoplasty, bevacizumab (anti-VEGF) nasal spray or IV",
  "Refer to specialist HHT clinic — multidisciplinary management required",
], { fontSize: 15 });

// ══════════════════════════════════════════════════════════════════
// SLIDE 18 — Key Points / Summary
// ══════════════════════════════════════════════════════════════════
let s18 = pres.addSlide();
closingSlide(s18);

// ══════════════════════════════════════════════════════════════════
// WRITE FILE
// ══════════════════════════════════════════════════════════════════
pres.writeFile({ fileName: "/home/daytona/workspace/epistaxis-pptx/Epistaxis_Clinical_Management.pptx" })
  .then(() => console.log("✅  Presentation saved."))
  .catch(err => { console.error("ERROR:", err); process.exit(1); });
Running Command

cd /home/daytona/workspace/epistaxis-pptx && node build.js 2>&1

Running Command

ls -lh /home/daytona/workspace/epistaxis-pptx/

Your presentation is ready! Download it here:

Epistaxis Clinical Management

Presentation · PPTX


The deck has 18 slides with a navy/teal clinical colour scheme, structured as follows:
#Slide
1Title slide
2Section divider: Overview & Epidemiology
3Definition & Epidemiology (bimodal distribution, incidence, seasonal pattern)
4Nasal Blood Supply (Kiesselbach's plexus, sphenopalatine, ethmoidal, facial arteries)
5Aetiology - two-column layout (Local vs Systemic causes)
6Section divider: Assessment & Diagnosis
7Initial Assessment (airway, haemodynamics, history, examination technique)
8Investigations table (FBC, coagulation, imaging, nasendoscopy, angiography)
9Anterior vs Posterior Epistaxis comparison (two-column)
10Section divider: Management
11Step-wise Management Algorithm (7 steps, colour-coded by escalation)
12Anterior Nasal Packing - practical points (Merocel, Rapid Rhino, antibiotic guidance)
13Tranexamic Acid - mechanism, dose, evidence, superiority in antiplatelet patients
14Surgical & Interventional Options table (ESPAL, embolisation, dermoplasty)
15Section divider: Special Situations
16Epistaxis in Anticoagulated Patients (DOAC reversal, INR, TXA preference)
17Hereditary Haemorrhagic Telangiectasia (Curaçao criteria, AVMs, long-term management)
18Key Takeaways / Closing slide
Content sourced from Rosen's Emergency Medicine 10e, Bailey & Love's Surgery 28e, and Cummings Otolaryngology.
This is a shared conversation. Sign in to Orris to start your own chat.