Can i have a powerpoint presentation on epistaxis
mkdir -p /home/daytona/workspace/epistaxis-pptx && ls /home/daytona/workspace/ep…
~/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); });
cd /home/daytona/workspace/epistaxis-pptx && node build.js 2>&1
ls -lh /home/daytona/workspace/epistaxis-pptx/
Epistaxis Clinical Management
Presentation · PPTX
| # | Slide |
|---|---|
| 1 | Title slide |
| 2 | Section divider: Overview & Epidemiology |
| 3 | Definition & Epidemiology (bimodal distribution, incidence, seasonal pattern) |
| 4 | Nasal Blood Supply (Kiesselbach's plexus, sphenopalatine, ethmoidal, facial arteries) |
| 5 | Aetiology - two-column layout (Local vs Systemic causes) |
| 6 | Section divider: Assessment & Diagnosis |
| 7 | Initial Assessment (airway, haemodynamics, history, examination technique) |
| 8 | Investigations table (FBC, coagulation, imaging, nasendoscopy, angiography) |
| 9 | Anterior vs Posterior Epistaxis comparison (two-column) |
| 10 | Section divider: Management |
| 11 | Step-wise Management Algorithm (7 steps, colour-coded by escalation) |
| 12 | Anterior Nasal Packing - practical points (Merocel, Rapid Rhino, antibiotic guidance) |
| 13 | Tranexamic Acid - mechanism, dose, evidence, superiority in antiplatelet patients |
| 14 | Surgical & Interventional Options table (ESPAL, embolisation, dermoplasty) |
| 15 | Section divider: Special Situations |
| 16 | Epistaxis in Anticoagulated Patients (DOAC reversal, INR, TXA preference) |
| 17 | Hereditary Haemorrhagic Telangiectasia (Curaçao criteria, AVMs, long-term management) |
| 18 | Key Takeaways / Closing slide |