Make PowerPoint presentation on epistaxis
ls /home/daytona/workspace/ 2>/dev/null || echo "workspace not found"
mkdir -p /home/daytona/workspace/epistaxis-pptx && ls /home/daytona/workspace/
~/epistaxis-pptx/create_pptx.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.author = "Medical Education";
pres.title = "Epistaxis - Nosebleed";
// ─── COLOR PALETTE ───────────────────────────────────────────────
const C = {
darkNavy: "0D1B2A", // dominant background
midBlue: "1B4F72", // section headers
accent: "E74C3C", // red – thematically blood/alert
accentSoft: "C0392B", // darker red
gold: "F39C12", // warm highlight
lightBg: "EAF2F8", // content slide background
white: "FFFFFF",
lightGray: "D5D8DC",
textDark: "1A1A2E",
textMid: "2C3E50",
};
// ─── HELPER: slide accent bar ────────────────────────────────────
function addAccentBar(slide, color = C.accent) {
slide.addShape(pres.ShapeType.rect, {
x: 0, y: 5.25, w: 10, h: 0.375,
fill: { color },
line: { color, width: 0 }
});
}
function addTopBar(slide, color = C.midBlue) {
slide.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 0.06,
fill: { color },
line: { color, width: 0 }
});
}
function sectionTitle(slide, text) {
slide.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 1.1,
fill: { color: C.midBlue },
line: { color: C.midBlue, width: 0 }
});
slide.addText(text, {
x: 0.45, y: 0.15, w: 9.1, h: 0.8,
fontSize: 26, bold: true, color: C.white,
fontFace: "Calibri", align: "left", valign: "middle", margin: 0
});
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 1 — TITLE
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
// Full dark background
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 5.625,
fill: { color: C.darkNavy },
line: { color: C.darkNavy, width: 0 }
});
// Red diagonal accent block
s.addShape(pres.ShapeType.rect, {
x: 6.5, y: 0, w: 3.5, h: 5.625,
fill: { color: C.accent },
line: { color: C.accent, width: 0 }
});
// Overlap divider
s.addShape(pres.ShapeType.rect, {
x: 6.2, y: 0, w: 0.5, h: 5.625,
fill: { color: C.accentSoft },
line: { color: C.accentSoft, width: 0 }
});
// Main title
s.addText("EPISTAXIS", {
x: 0.6, y: 1.2, w: 5.8, h: 1.4,
fontSize: 56, bold: true, color: C.white,
fontFace: "Calibri", align: "left", valign: "middle", charSpacing: 4, margin: 0
});
// Subtitle
s.addText("Nosebleed — Diagnosis & Management", {
x: 0.6, y: 2.75, w: 5.5, h: 0.65,
fontSize: 20, color: C.gold,
fontFace: "Calibri", align: "left", margin: 0
});
// Horizontal rule
s.addShape(pres.ShapeType.rect, {
x: 0.6, y: 2.6, w: 4.5, h: 0.05,
fill: { color: C.gold },
line: { color: C.gold, width: 0 }
});
// Source tag
s.addText("Sources: Bailey & Love | Rosen's Emergency Medicine | Cummings Otolaryngology", {
x: 0.6, y: 4.9, w: 5.5, h: 0.45,
fontSize: 9, color: C.lightGray,
fontFace: "Calibri", align: "left", margin: 0
});
// Right-panel text
s.addText("ENT / Emergency\nMedicine", {
x: 6.6, y: 2.2, w: 3.1, h: 1.2,
fontSize: 22, bold: true, color: C.white,
fontFace: "Calibri", align: "center", valign: "middle"
});
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 2 — OVERVIEW / CONTENTS
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 5.625,
fill: { color: C.lightBg },
line: { color: C.lightBg, width: 0 }
});
addTopBar(s, C.accent);
sectionTitle(s, "Overview & Contents");
const items = [
["01", "Definition & Epidemiology"],
["02", "Anatomy – Blood Supply"],
["03", "Classification: Anterior vs Posterior"],
["04", "Aetiology & Risk Factors"],
["05", "Clinical Assessment"],
["06", "Management Algorithm"],
["07", "Surgical & Interventional Options"],
["08", "Special Situations"],
["09", "Key Takeaways"],
];
const cols = [
items.slice(0, 5),
items.slice(5),
];
cols.forEach((col, ci) => {
col.forEach((item, i) => {
const x = 0.5 + ci * 4.8;
const y = 1.35 + i * 0.76;
// Number badge
s.addShape(pres.ShapeType.ellipse, {
x, y: y + 0.05, w: 0.42, h: 0.42,
fill: { color: ci === 0 ? C.accent : C.midBlue },
line: { color: ci === 0 ? C.accent : C.midBlue, width: 0 }
});
s.addText(item[0], {
x, y: y + 0.05, w: 0.42, h: 0.42,
fontSize: 11, bold: true, color: C.white,
fontFace: "Calibri", align: "center", valign: "middle", margin: 0
});
s.addText(item[1], {
x: x + 0.5, y, w: 4.0, h: 0.55,
fontSize: 15, color: C.textDark,
fontFace: "Calibri", align: "left", valign: "middle"
});
});
});
addAccentBar(s, C.midBlue);
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 3 — DEFINITION & EPIDEMIOLOGY
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 5.625,
fill: { color: C.lightBg },
line: { color: C.lightBg, width: 0 }
});
addTopBar(s, C.accent);
sectionTitle(s, "Definition & Epidemiology");
// Two stat boxes
const stats = [
{ val: "90%", label: "of cases are anterior epistaxis" },
{ val: "~60%", label: "lifetime prevalence in general population" },
];
stats.forEach((st, i) => {
const x = 0.4 + i * 4.5;
s.addShape(pres.ShapeType.rect, {
x, y: 1.25, w: 4.0, h: 1.35,
fill: { color: i === 0 ? C.accent : C.midBlue },
line: { color: i === 0 ? C.accent : C.midBlue, width: 0 }
});
s.addText(st.val, {
x, y: 1.25, w: 4.0, h: 0.75,
fontSize: 36, bold: true, color: C.white,
fontFace: "Calibri", align: "center", valign: "bottom", margin: 0
});
s.addText(st.label, {
x, y: 2.0, w: 4.0, h: 0.55,
fontSize: 13, color: C.white,
fontFace: "Calibri", align: "center", valign: "top"
});
});
// Definition bullets
const bullets = [
"Epistaxis = bleeding from the nasal cavity; derived from Greek epistazein (to bleed from the nose)",
"Bimodal age distribution: peak in children (< 10 yrs) and in the elderly (> 60 yrs)",
"Incidence is higher in winter and in cold, dry climates due to mucosal desiccation",
"Only a minority of patients require emergency care; death from epistaxis is exceedingly rare",
"Anterior epistaxis: 90% — usually self-limiting | Posterior epistaxis: 10% — more severe, elderly",
];
s.addText(bullets.map((b, i) => [
{ text: "• ", options: { color: C.accent, bold: true } },
{ text: b, options: { color: C.textDark } },
...(i < bullets.length - 1 ? [{ text: "\n", options: {} }] : [])
]).flat(), {
x: 0.4, y: 2.75, w: 9.2, h: 2.5,
fontSize: 13.5, fontFace: "Calibri", valign: "top"
});
addAccentBar(s);
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 4 — ANATOMY
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 5.625,
fill: { color: C.darkNavy },
line: { color: C.darkNavy, width: 0 }
});
addTopBar(s, C.accent);
// Header bar
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 1.1,
fill: { color: C.accentSoft },
line: { color: C.accentSoft, width: 0 }
});
s.addText("Anatomy – Nasal Blood Supply", {
x: 0.45, y: 0.15, w: 9.1, h: 0.8,
fontSize: 26, bold: true, color: C.white,
fontFace: "Calibri", align: "left", valign: "middle", margin: 0
});
// Left: artery cards
const arteries = [
{ name: "Sphenopalatine Artery", origin: "External carotid → maxillary", area: "Turbinates, posterior septum; identified in most severe posterior epistaxis" },
{ name: "Anterior & Posterior Ethmoidal Arteries", origin: "Internal carotid → ophthalmic", area: "Superior mucosa medially and laterally" },
{ name: "Superior Labial Artery", origin: "External carotid → facial", area: "Anterior mucosal septum and anterior lateral mucosa" },
{ name: "Kiesselbach's Plexus (Little's Area)", origin: "Anastomosis of all three", area: "Anteroinferior nasal septum — most common bleeding site (90%)" },
];
arteries.forEach((a, i) => {
const y = 1.25 + i * 1.05;
s.addShape(pres.ShapeType.rect, {
x: 0.35, y, w: 5.7, h: 0.9,
fill: { color: i === 3 ? C.accentSoft : "16213E" },
line: { color: i === 3 ? C.accent : C.midBlue, width: i === 3 ? 2 : 1 }
});
s.addText(a.name, {
x: 0.5, y: y + 0.02, w: 5.4, h: 0.35,
fontSize: 13, bold: true, color: i === 3 ? C.gold : C.white,
fontFace: "Calibri", align: "left", valign: "middle", margin: 0
});
s.addText(`Origin: ${a.origin}`, {
x: 0.5, y: y + 0.36, w: 5.4, h: 0.22,
fontSize: 10, color: C.lightGray,
fontFace: "Calibri", align: "left", margin: 0
});
s.addText(a.area, {
x: 0.5, y: y + 0.56, w: 5.4, h: 0.28,
fontSize: 10.5, color: C.white,
fontFace: "Calibri", align: "left", margin: 0
});
});
// Right: nasal supply diagram labels
s.addShape(pres.ShapeType.rect, {
x: 6.3, y: 1.25, w: 3.4, h: 4.1,
fill: { color: "0A1628" },
line: { color: C.midBlue, width: 1 }
});
s.addText("Key Anatomical Points", {
x: 6.4, y: 1.32, w: 3.2, h: 0.4,
fontSize: 13, bold: true, color: C.gold,
fontFace: "Calibri", align: "center"
});
const notes = [
"Little's area = anterior nasal septum",
"Kiesselbach's plexus: anastomosis of 4 arteries",
"90% of nosebleeds originate here",
"Posterior epistaxis: sphenopalatine artery — older patients with comorbidities",
"Internal carotid (ethmoidal) + external carotid (maxillary, facial) both supply the nose",
"Dual supply complicates surgical ligation",
];
s.addText(notes.map((n, i) => [
{ text: (i + 1) + ". ", options: { bold: true, color: C.gold } },
{ text: n, options: { color: C.white } },
...(i < notes.length - 1 ? [{ text: "\n", options: {} }] : [])
]).flat(), {
x: 6.4, y: 1.75, w: 3.2, h: 3.5,
fontSize: 11.5, fontFace: "Calibri", valign: "top"
});
addAccentBar(s, C.accentSoft);
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 5 — ANTERIOR vs POSTERIOR
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 5.625,
fill: { color: C.lightBg },
line: { color: C.lightBg, width: 0 }
});
addTopBar(s, C.accent);
sectionTitle(s, "Classification: Anterior vs Posterior Epistaxis");
const headers = ["Feature", "Anterior (90%)", "Posterior (10%)"];
const rows = [
["Site", "Kiesselbach's plexus, anteroinferior septum", "Sphenopalatine / posterior nasal cavity"],
["Age", "Children & young adults", "Elderly, atherosclerotic patients"],
["Severity", "Usually mild, self-limiting", "More severe, harder to control"],
["Visibility", "Easily visualised", "Difficult to visualise"],
["Management", "Direct pressure, cautery, anterior pack", "Posterior pack, balloon, surgery/embolisation"],
["Risk factors", "Nose picking, URI, dry air, allergy", "Hypertension, anticoagulants, atherosclerosis"],
["Admission", "Usually not required", "Inpatient monitoring required"],
];
const colWidths = [2.2, 3.6, 3.6];
const startX = 0.3;
const startY = 1.2;
const rowH = 0.52;
// Header row
headers.forEach((h, ci) => {
let x = startX + colWidths.slice(0, ci).reduce((a, b) => a + b, 0);
s.addShape(pres.ShapeType.rect, {
x, y: startY, w: colWidths[ci], h: 0.52,
fill: { color: ci === 0 ? C.textDark : ci === 1 ? C.midBlue : C.accentSoft },
line: { color: C.white, width: 0.5 }
});
s.addText(h, {
x, y: startY, w: colWidths[ci], h: 0.52,
fontSize: 14, bold: true, color: C.white,
fontFace: "Calibri", align: "center", valign: "middle"
});
});
rows.forEach((row, ri) => {
row.forEach((cell, ci) => {
let x = startX + colWidths.slice(0, ci).reduce((a, b) => a + b, 0);
const y = startY + 0.52 + ri * rowH;
const bg = ri % 2 === 0 ? "FDFEFE" : "EAF2F8";
s.addShape(pres.ShapeType.rect, {
x, y, w: colWidths[ci], h: rowH,
fill: { color: ci === 0 ? "D6EAF8" : bg },
line: { color: C.lightGray, width: 0.5 }
});
s.addText(cell, {
x: x + 0.08, y, w: colWidths[ci] - 0.16, h: rowH,
fontSize: ci === 0 ? 12.5 : 11.5,
bold: ci === 0,
color: C.textDark,
fontFace: "Calibri", align: ci === 0 ? "center" : "left", valign: "middle"
});
});
});
addAccentBar(s);
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 6 — AETIOLOGY
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 5.625,
fill: { color: C.lightBg },
line: { color: C.lightBg, width: 0 }
});
addTopBar(s, C.accent);
sectionTitle(s, "Aetiology & Risk Factors");
const cols = [
{
title: "Local Causes",
color: C.midBlue,
items: [
"Nose picking (most common in children)",
"Nasal trauma / foreign bodies",
"Upper respiratory tract infections",
"Allergic rhinitis",
"Low home humidity / dry air",
"Nasal polyps & neoplasms",
"Granulomatous disorders (GPA, sarcoid)",
"Juvenile angiofibroma (adolescent males)",
"Hereditary Haemorrhagic Telangiectasia (HHT / Osler-Weber-Rendu)",
"Post-operative / iatrogenic",
"Cocaine / nasal vasoconstrictor abuse",
"Barotrauma",
]
},
{
title: "Systemic Causes",
color: C.accentSoft,
items: [
"Hypertension (associated with persistent bleeding)",
"Anticoagulants: Warfarin, Rivaroxaban, Apixaban",
"Antiplatelet agents: Aspirin, Clopidogrel",
"Haemophilia A and B",
"von Willebrand's disease",
"Leukaemia / thrombocytopenia",
"Hepatic disease / cirrhosis",
"Vitamin K deficiency",
"Folic acid deficiency",
"Chemotherapy",
"Alcoholism",
"Ehlers-Danlos / connective tissue disorders",
]
}
];
cols.forEach((col, ci) => {
const x = 0.3 + ci * 4.85;
// Column header
s.addShape(pres.ShapeType.rect, {
x, y: 1.18, w: 4.6, h: 0.48,
fill: { color: col.color },
line: { color: col.color, width: 0 }
});
s.addText(col.title, {
x, y: 1.18, w: 4.6, h: 0.48,
fontSize: 15, bold: true, color: C.white,
fontFace: "Calibri", align: "center", valign: "middle"
});
// Items
s.addText(col.items.map((item, i) => [
{ text: "▸ ", options: { color: col.color, bold: true } },
{ text: item, options: { color: C.textDark } },
...(i < col.items.length - 1 ? [{ text: "\n", options: {} }] : [])
]).flat(), {
x: x + 0.1, y: 1.72, w: 4.45, h: 3.7,
fontSize: 12, fontFace: "Calibri", valign: "top", paraSpaceAfter: 1
});
});
addAccentBar(s);
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 7 — CLINICAL ASSESSMENT
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 5.625,
fill: { color: C.lightBg },
line: { color: C.lightBg, width: 0 }
});
addTopBar(s, C.accent);
sectionTitle(s, "Clinical Assessment");
const sections = [
{
title: "Initial Priorities (ABC)",
color: C.accentSoft,
x: 0.3, y: 1.25, w: 4.55, h: 1.55,
items: [
"Assess airway patency",
"Tissue perfusion & haemodynamics",
"Vital signs — BP, HR, SpO₂",
"Control active bleeding with pressure first"
]
},
{
title: "Targeted History",
color: C.midBlue,
x: 5.15, y: 1.25, w: 4.55, h: 1.55,
items: [
"Timing, frequency, severity, duration",
"Unilateral vs bilateral",
"Prior epistaxis or nasal surgery",
"Medications: anticoagulants, antiplatelets",
"Comorbidities: hypertension, liver disease, haematological conditions",
"Family history of bleeding disorders"
]
},
{
title: "Physical Examination",
color: C.accent,
x: 0.3, y: 2.95, w: 4.55, h: 2.3,
items: [
"Patient: lean forward slightly (not hyperextend)",
"Nasal speculum: open vertically, not laterally",
"Suction blood clots before examination",
"Apply oxymetazoline 0.05% spray before inspection",
"Compress cartilaginous nose 10–15 min + nose clip",
"Identify bleeding point (anterior vs posterior)",
"Rigid nasendoscopy if needed"
]
},
{
title: "Investigations",
color: C.textDark,
x: 5.15, y: 2.95, w: 4.55, h: 2.3,
items: [
"Usually clinical diagnosis — investigations not routinely needed",
"FBC: prolonged/severe bleeding, malignancy suspected",
"PT / INR / PTT: anticoagulated patients",
"Platelet count: bleeding disorders",
"LFTs: liver disease",
"CT with contrast: suspected neoplasm or juvenile angiofibroma",
"Angiography: severe posterior / refractory epistaxis"
]
}
];
sections.forEach(sec => {
s.addShape(pres.ShapeType.rect, {
x: sec.x, y: sec.y, w: sec.w, h: 0.42,
fill: { color: sec.color },
line: { color: sec.color, width: 0 }
});
s.addText(sec.title, {
x: sec.x, y: sec.y, w: sec.w, h: 0.42,
fontSize: 13, bold: true, color: C.white,
fontFace: "Calibri", align: "center", valign: "middle"
});
s.addShape(pres.ShapeType.rect, {
x: sec.x, y: sec.y + 0.42, w: sec.w, h: sec.h - 0.42,
fill: { color: "FAFBFC" },
line: { color: C.lightGray, width: 0.5 }
});
s.addText(sec.items.map((item, i) => [
{ text: "• ", options: { bold: true, color: sec.color } },
{ text: item, options: { color: C.textDark } },
...(i < sec.items.length - 1 ? [{ text: "\n", options: {} }] : [])
]).flat(), {
x: sec.x + 0.1, y: sec.y + 0.48, w: sec.w - 0.2, h: sec.h - 0.55,
fontSize: 11, fontFace: "Calibri", valign: "top", paraSpaceAfter: 1
});
});
addAccentBar(s);
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 8 — MANAGEMENT ALGORITHM (FLOWCHART STYLE)
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 5.625,
fill: { color: C.darkNavy },
line: { color: C.darkNavy, width: 0 }
});
addTopBar(s, C.accent);
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 1.1,
fill: { color: C.accentSoft },
line: { color: C.accentSoft, width: 0 }
});
s.addText("Management Algorithm", {
x: 0.45, y: 0.15, w: 9.1, h: 0.8,
fontSize: 26, bold: true, color: C.white,
fontFace: "Calibri", align: "left", valign: "middle", margin: 0
});
// Flowchart boxes
const box = (x, y, w, h, text, bg, textColor = C.white, fs = 12) => {
s.addShape(pres.ShapeType.rect, {
x, y, w, h,
fill: { color: bg },
line: { color: C.lightGray, width: 1 }
});
s.addText(text, {
x, y, w, h,
fontSize: fs, bold: false, color: textColor,
fontFace: "Calibri", align: "center", valign: "middle"
});
};
const arrow = (x, y1, y2) => {
s.addShape(pres.ShapeType.rect, {
x: x - 0.01, y: y1, w: 0.04, h: y2 - y1,
fill: { color: C.gold },
line: { color: C.gold, width: 0 }
});
};
// Left column: anterior
box(0.3, 1.2, 4.2, 0.5, "EPISTAXIS PRESENTATION", C.accentSoft, C.white, 14);
box(0.3, 1.85, 4.2, 0.52, "Step 1 — Immediate: Apply direct pressure\n+ oxymetazoline spray + lean forward", "16213E", C.white, 11);
arrow(2.4, 2.37, 2.55);
box(0.3, 2.55, 4.2, 0.52, "Step 2 — Identify bleeding site\n(anterior vs posterior)", "1A2940", C.white, 11);
arrow(2.4, 3.07, 3.22);
box(0.3, 3.22, 4.2, 0.52, "Step 3 — Anterior: Silver nitrate cautery\n(periphery → centre, < 15 sec, unilateral only)", "1A3B5C", C.white, 10.5);
arrow(2.4, 3.74, 3.9);
box(0.3, 3.9, 4.2, 0.52, "Still bleeding? → Topical tranexamic acid\nor Gelfoam / Surgicel", "1A3B5C", C.white, 11);
arrow(2.4, 4.42, 4.58);
box(0.3, 4.58, 4.2, 0.6, "Anterior nasal pack: Merocel tampon\nor Rapid Rhino balloon", C.midBlue, C.white, 11);
// Right column: posterior
box(5.5, 1.85, 4.2, 0.52, "If anterior pack fails / posterior epistaxis suspected:", "2C3E50", C.gold, 11);
arrow(7.6, 2.37, 2.55);
box(5.5, 2.55, 4.2, 0.52, "Step 4 — Posterior pack:\nDouble balloon catheter (or Foley catheter)", "1A2940", C.white, 11);
arrow(7.6, 3.07, 3.22);
box(5.5, 3.22, 4.2, 0.52, "ADMIT for monitoring\n(pulse oximetry — risk of hypoxia)", "1A3B5C", C.white, 11);
arrow(7.6, 3.74, 3.9);
box(5.5, 3.9, 4.2, 0.52, "Refractory? → ENT referral\nEndovascular embolisation", "1A3B5C", C.white, 11);
arrow(7.6, 4.42, 4.58);
box(5.5, 4.58, 4.2, 0.6, "Surgical: Sphenopalatine artery ligation\n(endoscopic) or arterial ligation", C.accentSoft, C.white, 11);
// Connecting horizontal arrow
s.addShape(pres.ShapeType.rect, {
x: 4.5, y: 1.45, w: 1.0, h: 0.04,
fill: { color: C.gold },
line: { color: C.gold, width: 0 }
});
addAccentBar(s, C.accentSoft);
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 9 — NASAL PACKING DETAILS
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 5.625,
fill: { color: C.lightBg },
line: { color: C.lightBg, width: 0 }
});
addTopBar(s, C.accent);
sectionTitle(s, "Nasal Packing — Techniques & Agents");
const cards = [
{
title: "Anterior Packing Options",
color: C.midBlue,
x: 0.3, y: 1.2,
items: [
"Merocel (polyvinyl acetal) nasal tampon — insert dry, expands on contact with blood",
"Rapid Rhino balloon catheter — coated with procoagulant hydrocolloid, inflate with air",
"Vaseline-impregnated ribbon gauze — traditional method",
"Absorbable agents: Gelfoam (gelatin sponge), Surgicel (oxidised cellulose)",
"Bilateral second anterior pack if unilateral fails",
"Remove after 48–72 hrs; prophylactic antibiotics NOT routinely recommended"
]
},
{
title: "Posterior Packing Options",
color: C.accentSoft,
x: 5.1, y: 1.2,
items: [
"Double balloon catheter (e.g. Epistat): inflate posterior balloon first, then anterior",
"Foley catheter (30 mL balloon): alternative if commercial device unavailable",
"Insert along nasal floor after topical anaesthesia",
"Posterior balloon inflated in nasopharynx, then pulled anteriorly",
"Anterior balloon inflated until patient-tolerable",
"Caution: pressure necrosis — avoid over-inflation",
"Patient must be admitted for monitoring (hypoxia, cardiac effects)"
]
}
];
cards.forEach((card, ci) => {
s.addShape(pres.ShapeType.rect, {
x: card.x, y: card.y, w: 4.55, h: 0.45,
fill: { color: card.color },
line: { color: card.color, width: 0 }
});
s.addText(card.title, {
x: card.x, y: card.y, w: 4.55, h: 0.45,
fontSize: 13.5, bold: true, color: C.white,
fontFace: "Calibri", align: "center", valign: "middle"
});
s.addShape(pres.ShapeType.rect, {
x: card.x, y: card.y + 0.45, w: 4.55, h: 3.75,
fill: { color: "FAFBFC" },
line: { color: C.lightGray, width: 0.5 }
});
s.addText(card.items.map((item, i) => [
{ text: "▸ ", options: { bold: true, color: card.color } },
{ text: item, options: { color: C.textDark } },
...(i < card.items.length - 1 ? [{ text: "\n", options: {} }] : [])
]).flat(), {
x: card.x + 0.1, y: card.y + 0.52, w: 4.35, h: 3.62,
fontSize: 11.5, fontFace: "Calibri", valign: "top", paraSpaceAfter: 2
});
});
addAccentBar(s);
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 10 — PHARMACOLOGICAL AGENTS
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 5.625,
fill: { color: C.lightBg },
line: { color: C.lightBg, width: 0 }
});
addTopBar(s, C.accent);
sectionTitle(s, "Pharmacological Agents in Epistaxis");
const drugs = [
{ drug: "Oxymetazoline 0.05%", class: "Topical Vasoconstrictor", use: "Two sprays into affected naris before examination and pressure; facilitates haemostasis and inspection", note: "Alpha-1 agonist; onset <2 min; limits to 3 days to avoid rebound" },
{ drug: "Silver Nitrate (75%)", class: "Chemical Cauterant", use: "Chemical cautery of identified bleeding point in anterior epistaxis; apply from periphery to centre", note: "< 15 sec contact; unilateral only; ineffective during active bleeding" },
{ drug: "Lidocaine 2% (topical)", class: "Local Anaesthetic", use: "Mucosal atomisation or soaked gauze before intervention; reduces discomfort and gag reflex", note: "Combined with vasoconstrictor for optimal effect" },
{ drug: "Tranexamic Acid", class: "Antifibrinolytic", use: "Topical (500 mg IV solution on pledget) or IV; reduces 10-min bleeding and 7–10 day rebleed rates", note: "Meta-analysis supports moderate-quality evidence; superior to packing in antiplatelet patients" },
{ drug: "Gelfoam / Surgicel", class: "Topical Haemostat", use: "Placed directly on bleeding site; promotes clot formation even in anticoagulated patients", note: "Absorbable; useful when cautery fails" },
{ drug: "Thrombin Compounds", class: "Topical Haemostat", use: "Applied to nasal cavity; effective even in fully anticoagulated patients", note: "Can be combined with nasal tampon for refractory anticoagulant-related epistaxis" },
];
const colW = [2.2, 1.7, 3.3, 2.3];
const headers = ["Drug / Agent", "Class", "Clinical Use", "Key Notes"];
const startX = 0.3;
const startY = 1.25;
const headerH = 0.45;
const rowH = 0.6;
headers.forEach((h, ci) => {
const x = startX + colW.slice(0, ci).reduce((a, b) => a + b, 0);
s.addShape(pres.ShapeType.rect, {
x, y: startY, w: colW[ci], h: headerH,
fill: { color: C.midBlue },
line: { color: C.white, width: 0.5 }
});
s.addText(h, {
x, y: startY, w: colW[ci], h: headerH,
fontSize: 12.5, bold: true, color: C.white,
fontFace: "Calibri", align: "center", valign: "middle"
});
});
drugs.forEach((row, ri) => {
const cells = [row.drug, row.class, row.use, row.note];
cells.forEach((cell, ci) => {
const x = startX + colW.slice(0, ci).reduce((a, b) => a + b, 0);
const y = startY + headerH + ri * rowH;
const bg = ri % 2 === 0 ? "FDFEFE" : "EBF5FB";
s.addShape(pres.ShapeType.rect, {
x, y, w: colW[ci], h: rowH,
fill: { color: ci === 0 ? "D6EAF8" : bg },
line: { color: C.lightGray, width: 0.5 }
});
s.addText(cell, {
x: x + 0.06, y, w: colW[ci] - 0.12, h: rowH,
fontSize: ci === 0 ? 11.5 : 10,
bold: ci === 0,
color: C.textDark,
fontFace: "Calibri", align: "left", valign: "middle"
});
});
});
addAccentBar(s);
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 11 — SURGICAL & INTERVENTIONAL
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 5.625,
fill: { color: C.darkNavy },
line: { color: C.darkNavy, width: 0 }
});
addTopBar(s, C.accent);
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 1.1,
fill: { color: C.midBlue },
line: { color: C.midBlue, width: 0 }
});
s.addText("Surgical & Interventional Options", {
x: 0.45, y: 0.15, w: 9.1, h: 0.8,
fontSize: 26, bold: true, color: C.white,
fontFace: "Calibri", align: "left", valign: "middle", margin: 0
});
const options = [
{
num: "01",
title: "Endoscopic Sphenopalatine Artery Ligation (ESPAL)",
detail: "First-line surgical option for refractory posterior epistaxis. Performed endoscopically under GA. Identifies and clips/cauterises the SPA at the sphenopalatine foramen. Low morbidity; high success rates.",
color: C.midBlue
},
{
num: "02",
title: "Anterior & Posterior Ethmoidal Artery Ligation",
detail: "Approached through a medial canthal Lynch incision. Used when SPA ligation fails or for high posterior / superior bleeding (ethmoidal artery territory).",
color: C.midBlue
},
{
num: "03",
title: "Endovascular Embolisation",
detail: "Selective angiography of bilateral internal and external carotid systems. Superselective catheterisation of internal maxillary, facial and ascending pharyngeal arteries. Success rates 91–97%, complication rates 0–3%. Distal occlusion preferred over proximal (reduces collateral rebleed). Useful when surgery is high-risk (elderly, coagulopathic).",
color: C.accentSoft
},
{
num: "04",
title: "Internal Maxillary Artery Ligation (historical)",
detail: "Trans-antral approach (Caldwell-Luc). Largely superseded by endoscopic SPA ligation but occasionally still used. Higher morbidity; requires general anaesthesia and antral access.",
color: C.textDark
},
];
options.forEach((opt, i) => {
const y = 1.2 + i * 1.08;
s.addShape(pres.ShapeType.rect, {
x: 0.3, y, w: 0.62, h: 0.85,
fill: { color: opt.color },
line: { color: opt.color, width: 0 }
});
s.addText(opt.num, {
x: 0.3, y, w: 0.62, h: 0.85,
fontSize: 16, bold: true, color: C.white,
fontFace: "Calibri", align: "center", valign: "middle"
});
s.addShape(pres.ShapeType.rect, {
x: 0.95, y, w: 8.75, h: 0.85,
fill: { color: "0A1628" },
line: { color: opt.color, width: 0.75 }
});
s.addText(opt.title, {
x: 1.05, y: y + 0.02, w: 8.55, h: 0.32,
fontSize: 13, bold: true, color: C.gold,
fontFace: "Calibri", align: "left", valign: "middle", margin: 0
});
s.addText(opt.detail, {
x: 1.05, y: y + 0.33, w: 8.55, h: 0.5,
fontSize: 10.5, color: C.white,
fontFace: "Calibri", align: "left", valign: "top"
});
});
addAccentBar(s, C.midBlue);
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 12 — SPECIAL SITUATIONS
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 5.625,
fill: { color: C.lightBg },
line: { color: C.lightBg, width: 0 }
});
addTopBar(s, C.accent);
sectionTitle(s, "Special Situations");
const situations = [
{
title: "Anticoagulated Patient",
color: C.accentSoft,
x: 0.3, y: 1.25, w: 4.55,
items: [
"Check PT/INR/PTT, platelet count, relevant drug levels",
"Anticoagulant reversal rarely necessary unless markedly abnormal or life-threatening",
"Cellulose, gelatin and thrombin compounds effective even when fully anticoagulated",
"Topical tranexamic acid superior to packing in antiplatelet patients",
"Case reports: topical TXA effective in rivaroxaban-related epistaxis",
"Specific factor replacement needed in haemophilia with severe bleeding"
]
},
{
title: "HHT (Osler-Weber-Rendu Disease)",
color: C.midBlue,
x: 5.15, y: 1.25, w: 4.55,
items: [
"Autosomal dominant vascular disorder",
"Recurrent multifocal bleeding from thin-walled telangiectatic vessels",
"Vessels lack normal muscle and elastic tissue",
"Standard packing and cautery often temporarily effective but bleeding recurs",
"Laser photocoagulation and septal dermoplasty (Young's procedure) used",
"Systemic options: systemic antifibrinolytics, bevacizumab (anti-VEGF)",
"Screen for AVM in lung, liver, brain"
]
},
{
title: "Juvenile Angiofibroma",
color: C.gold,
x: 0.3, y: 3.3, w: 4.55,
items: [
"Exclusively in adolescent males; highly vascular benign tumour",
"Can cause massive, life-threatening epistaxis",
"DO NOT biopsy — risk of uncontrollable haemorrhage",
"Diagnosis: CT (Holman–Miller / antral sign on CT) or MRI with contrast",
"Treatment: endoscopic excision by experienced surgeon (image guidance)",
"Preoperative embolisation reduces intra-operative blood loss"
]
},
{
title: "Children (< 2 years)",
color: C.textDark,
x: 5.15, y: 3.3, w: 4.55,
items: [
"Epistaxis in children < 2 yrs is rare",
"Consider non-accidental trauma (NAI / child abuse)",
"Screen for underlying bleeding disorders",
"Most paediatric epistaxis: anterior, Kiesselbach's plexus, nose picking",
"Conservative: direct pressure, humidification, saline spray",
"Refer to haematology if coagulopathy suspected"
]
}
];
situations.forEach((sit, i) => {
const y = i < 2 ? 1.25 : 3.3;
const x = i % 2 === 0 ? 0.3 : 5.15;
s.addShape(pres.ShapeType.rect, {
x, y, w: 4.55, h: 0.42,
fill: { color: sit.color },
line: { color: sit.color, width: 0 }
});
s.addText(sit.title, {
x, y, w: 4.55, h: 0.42,
fontSize: 12.5, bold: true, color: sit.color === C.gold ? C.textDark : C.white,
fontFace: "Calibri", align: "center", valign: "middle"
});
s.addShape(pres.ShapeType.rect, {
x, y: y + 0.42, w: 4.55, h: 1.82,
fill: { color: "FAFBFC" },
line: { color: C.lightGray, width: 0.5 }
});
s.addText(sit.items.map((item, ii) => [
{ text: "• ", options: { bold: true, color: sit.color } },
{ text: item, options: { color: C.textDark } },
...(ii < sit.items.length - 1 ? [{ text: "\n", options: {} }] : [])
]).flat(), {
x: x + 0.1, y: y + 0.48, w: 4.35, h: 1.7,
fontSize: 10.5, fontFace: "Calibri", valign: "top", paraSpaceAfter: 1
});
});
addAccentBar(s);
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 13 — KEY TAKEAWAYS
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 5.625,
fill: { color: C.darkNavy },
line: { color: C.darkNavy, width: 0 }
});
addTopBar(s, C.accent);
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 1.1,
fill: { color: C.accent },
line: { color: C.accent, width: 0 }
});
s.addText("Key Takeaways", {
x: 0.45, y: 0.15, w: 9.1, h: 0.8,
fontSize: 26, bold: true, color: C.white,
fontFace: "Calibri", align: "left", valign: "middle", margin: 0
});
const takeaways = [
{ icon: "01", text: "90% of epistaxis is anterior (Kiesselbach's plexus) — self-limiting in most cases; posterior epistaxis is more severe and predominantly affects elderly patients." },
{ icon: "02", text: "Initial management: direct pressure on cartilaginous nose for 10–15 minutes + oxymetazoline spray. A nose clip is superior to manual pressure alone." },
{ icon: "03", text: "Identify the bleeding point — cauterise with silver nitrate if anterior and visible. Apply from periphery to centre; unilateral only; < 15 seconds contact." },
{ icon: "04", text: "Tranexamic acid (topical 500 mg): effective adjunct — reduces 10-min bleeding and 7–10 day rebleed. Superior to packing in antiplatelet patients." },
{ icon: "05", text: "Posterior epistaxis requires posterior balloon packing, inpatient admission, and pulse oximetry. Prophylactic antibiotics with packing are NOT routinely recommended." },
{ icon: "06", text: "Refractory cases: ENT referral → endoscopic sphenopalatine artery ligation (ESPAL) or endovascular embolisation (91–97% success)." },
{ icon: "07", text: "Hypertension is associated with persistent bleeding but a direct causal link has not been proven. Address elevated BP as part of overall management." },
{ icon: "08", text: "Juvenile angiofibroma: never biopsy. Diagnose with contrast CT/MRI. Preoperative embolisation + endoscopic excision by experienced surgeon." },
];
takeaways.forEach((t, i) => {
const col = i < 4 ? 0 : 1;
const row = i % 4;
const x = 0.35 + col * 4.8;
const y = 1.25 + row * 1.05;
s.addShape(pres.ShapeType.rect, {
x, y: y + 0.08, w: 0.45, h: 0.45,
fill: { color: i < 4 ? C.accent : C.midBlue },
line: { color: i < 4 ? C.accent : C.midBlue, width: 0 }
});
s.addText(t.icon, {
x, y: y + 0.08, w: 0.45, h: 0.45,
fontSize: 12, bold: true, color: C.white,
fontFace: "Calibri", align: "center", valign: "middle", margin: 0
});
s.addShape(pres.ShapeType.rect, {
x: x + 0.48, y, w: 4.15, h: 0.88,
fill: { color: "0A1628" },
line: { color: i < 4 ? C.accent : C.midBlue, width: 0.5 }
});
s.addText(t.text, {
x: x + 0.56, y: y + 0.04, w: 4.0, h: 0.8,
fontSize: 11, color: C.white,
fontFace: "Calibri", align: "left", valign: "middle"
});
});
addAccentBar(s, C.accent);
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 14 — REFERENCES
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 5.625,
fill: { color: C.darkNavy },
line: { color: C.darkNavy, width: 0 }
});
addTopBar(s, C.gold);
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 1.1,
fill: { color: "0A1628" },
line: { color: "0A1628", width: 0 }
});
s.addText("References & Sources", {
x: 0.45, y: 0.15, w: 9.1, h: 0.8,
fontSize: 26, bold: true, color: C.gold,
fontFace: "Calibri", align: "left", valign: "middle", margin: 0
});
const refs = [
"Bailey & Love's Short Practice of Surgery, 28th Edition. Chapters 51 (Nose & Paranasal Sinuses). CRC Press / Taylor & Francis, 2023.",
"Rosen's Emergency Medicine: Concepts and Clinical Practice. Chapter 58 (ENT Emergencies). Elsevier, 2023.",
"Roberts and Hedges' Clinical Procedures in Emergency Medicine, 7th Edition. Chapter 15. Elsevier, 2019.",
"Cummings Otolaryngology: Head and Neck Surgery, 7th Edition. Chapter on Epistaxis. Elsevier, 2021.",
"Grainger & Allison's Diagnostic Radiology, 6th Edition. Chapter 136 (Interventional Radiology for Epistaxis). Elsevier.",
"Goldman-Cecil Medicine, International Edition. Chapter on Epistaxis. Elsevier, 2024.",
"Textbook of Family Medicine, 9th Edition. Chapter 5. Elsevier, 2016.",
"Gottlieb M et al. Topical Tranexamic Acid for Epistaxis: A Systematic Review and Meta-Analysis. Ann Emerg Med, 2020.",
];
s.addText(refs.map((r, i) => [
{ text: `${i + 1}. `, options: { bold: true, color: C.gold } },
{ text: r, options: { color: C.lightGray } },
...(i < refs.length - 1 ? [{ text: "\n", options: {} }] : [])
]).flat(), {
x: 0.5, y: 1.25, w: 9.0, h: 4.1,
fontSize: 11.5, fontFace: "Calibri", valign: "top", paraSpaceAfter: 4
});
addAccentBar(s, C.gold);
}
// ─── WRITE FILE ──────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/epistaxis-pptx/Epistaxis_Presentation.pptx" })
.then(() => console.log("SUCCESS: Epistaxis_Presentation.pptx created"))
.catch(err => { console.error("ERROR:", err); process.exit(1); });
cd /home/daytona/workspace/epistaxis-pptx && node create_pptx.js 2>&1
ls -lh /home/daytona/workspace/epistaxis-pptx/
Epistaxis Presentation
Presentation · PPTX
| # | Slide | Content |
|---|---|---|
| 1 | Title | Bold "EPISTAXIS" cover with red diagonal block |
| 2 | Contents | 9-item numbered overview |
| 3 | Definition & Epidemiology | Stats boxes (90% anterior, ~60% lifetime prevalence), bimodal distribution, seasonal patterns |
| 4 | Anatomy – Blood Supply | Kiesselbach's plexus, sphenopalatine, ethmoidal, superior labial arteries; dual ICA/ECA supply |
| 5 | Anterior vs Posterior | Side-by-side comparison table (site, age, severity, management, admission) |
| 6 | Aetiology & Risk Factors | Local causes (nose picking, HHT, juvenile angiofibroma) vs systemic causes (anticoagulants, haematological, hepatic) |
| 7 | Clinical Assessment | ABC priorities, history-taking, physical exam technique, investigations grid |
| 8 | Management Algorithm | Flowchart: direct pressure → cautery → topical TXA → anterior pack → posterior pack → embolisation/surgery |
| 9 | Nasal Packing | Merocel, Rapid Rhino, Foley catheter; anterior vs posterior techniques |
| 10 | Pharmacological Agents | Drug table: oxymetazoline, silver nitrate, lidocaine, tranexamic acid, Gelfoam, thrombin |
| 11 | Surgical & Interventional | ESPAL, ethmoidal artery ligation, endovascular embolisation (91–97% success), trans-antral ligation |
| 12 | Special Situations | Anticoagulated patient, HHT, juvenile angiofibroma (never biopsy!), children < 2 yrs |
| 13 | Key Takeaways | 8 high-yield clinical pearls |
| 14 | References | 8 textbook and literature sources |
Can you make it point based presentation with pictures
epistaxis nosebleed anatomy diagram nasal blood supply Kiesselbach medical illustration
epistaxis management algorithm nasal packing anterior posterior treatment flowchart medical
silver nitrate cautery epistaxis nasal packing merocel rapid rhino clinical photo
hereditary hemorrhagic telangiectasia HHT nasal telangiectasia juvenile angiofibroma clinical image ENT
~/epistaxis-pptx/create_pptx_v2.js
const pptxgen = require("pptxgenjs");
const { execSync } = require("child_process");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.author = "Medical Education";
pres.title = "Epistaxis – A Clinical Overview";
// ─── PALETTE ────────────────────────────────────────────────────
const C = {
darkNavy: "0D1B2A",
midBlue: "1A4872",
accent: "C0392B",
accentDark: "922B21",
gold: "E67E22",
lightBg: "F0F4F8",
panelBg: "EBF5FB",
white: "FFFFFF",
lightGray: "CCD6DD",
textDark: "1A252F",
teal: "117A65",
};
// ─── IMAGE URLS ──────────────────────────────────────────────────
const IMG = {
anatomy: "https://www.researchgate.net/publication/381603640/figure/fig4/AS:11431281254271587@1719139211640/Epistaxis-and-the-Kiesselbach-plexus-triangle-or-area-supplying-blood-to-the.png",
anatomy2: "https://i0.wp.com/www.aliem.com/wp-content/uploads/2017/02/Epistaxis-nose-anatomy-1.png?fit=477%2C419&ssl=1",
bloodSupply: "https://i0.wp.com/combatmedicine101.com/wp-content/uploads/2019/02/nose-vessels.jpg?resize=589%2C380&ssl=1",
merocel: "https://www.rcemlearning.co.uk/wp-content/uploads/Merocel-pack.png",
rapidrhino:"https://rapidrhino.com/wp-content/uploads/2016/07/step2.jpg",
algorithm: "https://www.researchgate.net/publication/281635457/figure/fig3/AS:1086783894884407@1636120880445/Algorithm-for-the-management-of-epistaxis.jpg",
hht: "https://assets.clevelandclinic.org/transform/7c6b0bdf-e6c0-4102-aaf4-3a3a6862c6b1/23-HNI-3732983-ContemporaryManagement-HHT-CQD_650x450_jpg",
extCarotid:"https://cdn.orris.care/cdss_images/a1d5c9007d6330ad6f6bdc90ceea7dda13010483912c77d2fdc57b837729be8b.png",
flowchart: "https://cdn.orris.care/cdss_images/2bc08e8ee0bd7f39fca97d9524b6fa78bd15ec67354f8cbf05e1abf8db42a153.png",
jucm: "https://www.jucm.com/wp-content/uploads/clinical1008-3.jpg",
};
// Fetch all images as base64
console.log("Fetching images...");
let imgData = {};
const urlList = Object.entries(IMG);
try {
const results = JSON.parse(
execSync(
`node /home/daytona/skills/shared/scripts/fetch_images.js ${urlList.map(([,u]) => `"${u}"`).join(" ")}`,
{ maxBuffer: 50 * 1024 * 1024 }
).toString()
);
urlList.forEach(([key], i) => {
if (results[i] && !results[i].error) {
imgData[key] = results[i].base64;
} else {
console.log(`WARN: failed to fetch ${key}`);
}
});
} catch(e) {
console.log("Image fetch error:", e.message);
}
console.log("Images fetched:", Object.keys(imgData).join(", "));
// ─── HELPERS ────────────────────────────────────────────────────
function bg(slide, color) {
slide.addShape(pres.ShapeType.rect, {
x:0,y:0,w:10,h:5.625,
fill:{color}, line:{color,width:0}
});
}
function headerBar(slide, title, bgColor = C.midBlue) {
slide.addShape(pres.ShapeType.rect, {
x:0,y:0,w:10,h:1.0,
fill:{color:bgColor}, line:{color:bgColor,width:0}
});
// Top accent strip
slide.addShape(pres.ShapeType.rect, {
x:0,y:0,w:10,h:0.055,
fill:{color:C.accent}, line:{color:C.accent,width:0}
});
slide.addText(title, {
x:0.45, y:0.07, w:9.1, h:0.88,
fontSize:26, bold:true, color:C.white,
fontFace:"Calibri", align:"left", valign:"middle", margin:0
});
}
function bottomBar(slide, color = C.accent) {
slide.addShape(pres.ShapeType.rect, {
x:0, y:5.35, w:10, h:0.28,
fill:{color}, line:{color,width:0}
});
}
function bulletBox(slide, opts) {
// opts: {x,y,w,h,title,titleColor,bullets,fontSize}
const { x,y,w,h,title,titleColor=C.midBlue,bullets,fontSize=12.5 } = opts;
slide.addShape(pres.ShapeType.rect, {
x,y,w,h, fill:{color:C.panelBg}, line:{color:C.lightGray,width:0.75}
});
slide.addShape(pres.ShapeType.rect, {
x,y,w,h:0.38, fill:{color:titleColor}, line:{color:titleColor,width:0}
});
slide.addText(title, {
x,y,w,h:0.38,
fontSize:13, bold:true, color:C.white,
fontFace:"Calibri", align:"center", valign:"middle"
});
const textItems = bullets.map((b,i) => [
{text:"▸ ", options:{color:titleColor, bold:true}},
{text:b, options:{color:C.textDark}},
...(i<bullets.length-1?[{text:"\n",options:{}}]:[])
]).flat();
slide.addText(textItems, {
x:x+0.1, y:y+0.42, w:w-0.2, h:h-0.48,
fontSize, fontFace:"Calibri", valign:"top", paraSpaceAfter:2
});
}
function addImg(slide, key, x, y, w, h) {
if (imgData[key]) {
slide.addImage({data:imgData[key], x, y, w, h});
}
}
// ═══════════════════════════════════════════════════════════════
// SLIDE 1 — TITLE
// ═══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.darkNavy);
// Red right panel
s.addShape(pres.ShapeType.rect, {
x:6.4,y:0,w:3.6,h:5.625,
fill:{color:C.accent}, line:{color:C.accent,width:0}
});
s.addShape(pres.ShapeType.rect, {
x:6.15,y:0,w:0.4,h:5.625,
fill:{color:C.accentDark}, line:{color:C.accentDark,width:0}
});
// Anatomy image in right panel
addImg(s, "anatomy2", 6.5, 0.5, 3.3, 3.2);
// Title text
s.addText("EPISTAXIS", {
x:0.6,y:0.9,w:5.5,h:1.5,
fontSize:58, bold:true, color:C.white,
fontFace:"Calibri", charSpacing:3, align:"left", margin:0
});
s.addShape(pres.ShapeType.rect, {
x:0.6,y:2.5,w:4.5,h:0.055,
fill:{color:C.gold}, line:{color:C.gold,width:0}
});
s.addText("Nosebleed — Diagnosis & Management", {
x:0.6,y:2.6,w:5.3,h:0.6,
fontSize:19, color:C.gold,
fontFace:"Calibri", align:"left", margin:0
});
// Bullet highlights on left
const pts = [
"Bimodal age distribution",
"90% anterior • 10% posterior",
"Kiesselbach's plexus — most common site",
"Cautery, packing, embolisation, surgery",
];
s.addText(pts.map((p,i)=>[
{text:"• ", options:{color:C.gold,bold:true}},
{text:p, options:{color:C.lightGray}},
...(i<pts.length-1?[{text:"\n",options:{}}]:[])
]).flat(), {
x:0.6, y:3.35, w:5.3, h:1.55,
fontSize:13.5, fontFace:"Calibri"
});
s.addText("Sources: Bailey & Love | Rosen's | Cummings | Scott-Brown's Otolaryngology", {
x:0.6,y:5.25,w:5.5,h:0.32,
fontSize:9, color:C.lightGray, fontFace:"Calibri", align:"left", margin:0
});
}
// ═══════════════════════════════════════════════════════════════
// SLIDE 2 — DEFINITION & EPIDEMIOLOGY
// ═══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.lightBg);
headerBar(s, "Definition & Epidemiology");
// Image left side
addImg(s, "jucm", 0.3, 1.1, 4.2, 3.0);
s.addText("Epistaxis presenting in the ED", {
x:0.3,y:4.1,w:4.2,h:0.3,
fontSize:9, italic:true, color:"555555",
fontFace:"Calibri", align:"center"
});
// Stat boxes
const stats = [
{val:"~60%", label:"Lifetime prevalence", color:C.midBlue},
{val:"90%", label:"Anterior epistaxis", color:C.accent},
{val:"10%", label:"Posterior — severe", color:C.teal},
];
stats.forEach((st,i)=>{
const x = 4.8 + i*1.72;
s.addShape(pres.ShapeType.rect, {
x,y:1.12,w:1.55,h:1.0,
fill:{color:st.color}, line:{color:st.color,width:0}
});
s.addText(st.val,{x,y:1.12,w:1.55,h:0.6,fontSize:26,bold:true,color:C.white,fontFace:"Calibri",align:"center",valign:"bottom"});
s.addText(st.label,{x,y:1.72,w:1.55,h:0.38,fontSize:10,color:C.white,fontFace:"Calibri",align:"center",valign:"top"});
});
bulletBox(s, {
x:4.8, y:2.22, w:5.0, h:3.15,
title:"Key Epidemiological Points",
titleColor: C.midBlue,
fontSize:12.5,
bullets:[
"Derived from Greek: epistazein — to bleed from the nose",
"Bimodal distribution: peaks in children (< 10 yrs) & elderly (> 60 yrs)",
"Higher incidence in winter / cold, dry climates",
"70–80% of cases are primary (idiopathic) epistaxis",
"Only a minority require emergency care; death is exceedingly rare",
"Severity inversely proportional to frequency (recurrent = minor; acute severe = single episode)",
"Approximately 6% of people with epistaxis seek medical care",
]
});
bottomBar(s);
}
// ═══════════════════════════════════════════════════════════════
// SLIDE 3 — NASAL ANATOMY & BLOOD SUPPLY
// ═══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.darkNavy);
headerBar(s, "Nasal Anatomy & Blood Supply", C.accentDark);
// Large anatomy image center-left
addImg(s, "bloodSupply", 0.3, 1.1, 5.5, 3.6);
s.addText("Vascular supply of the nasal cavity", {
x:0.3,y:4.7,w:5.5,h:0.3,
fontSize:9,italic:true,color:C.lightGray,fontFace:"Calibri",align:"center"
});
// Right panel: artery cards
const arteries = [
{name:"Sphenopalatine Artery", src:"External carotid → maxillary artery", note:"Posterior/inferior septum + turbinates; identified in most severe posterior epistaxis"},
{name:"Ant. & Post. Ethmoidal Arteries", src:"Internal carotid → ophthalmic artery", note:"Superior septum and lateral mucosa"},
{name:"Superior Labial Artery", src:"External carotid → facial artery", note:"Anterior mucosal septum"},
{name:"Kiesselbach's Plexus (Little's Area)", src:"Anastomosis of all 3 above", note:"⭐ Site of 90% of all nosebleeds — anteroinferior septum"},
];
arteries.forEach((a,i)=>{
const y = 1.1 + i*1.12;
const isStar = i===3;
s.addShape(pres.ShapeType.rect,{
x:6.0,y,w:3.7,h:0.98,
fill:{color:isStar?"3B0A0A":"0A1628"},
line:{color:isStar?C.accent:C.midBlue, width:isStar?2:1}
});
s.addText(a.name,{
x:6.1,y:y+0.03,w:3.5,h:0.35,
fontSize:12.5,bold:true,color:isStar?C.gold:C.white,
fontFace:"Calibri",align:"left",margin:0
});
s.addText(`Source: ${a.src}`,{
x:6.1,y:y+0.37,w:3.5,h:0.22,
fontSize:9.5,color:C.lightGray,fontFace:"Calibri",align:"left",margin:0
});
s.addText(a.note,{
x:6.1,y:y+0.58,w:3.5,h:0.35,
fontSize:10,color:isStar?"#F9EBEA":C.white,fontFace:"Calibri",align:"left",margin:0
});
});
bottomBar(s, C.accentDark);
}
// ═══════════════════════════════════════════════════════════════
// SLIDE 4 — KIESSELBACH'S PLEXUS (dedicated anatomy slide)
// ═══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.lightBg);
headerBar(s, "Kiesselbach's Plexus — Little's Area");
addImg(s, "anatomy", 0.3, 1.1, 5.4, 3.8);
s.addText("Kiesselbach's plexus — site of 90% of epistaxis", {
x:0.3,y:4.88,w:5.4,h:0.3,
fontSize:9,italic:true,color:"555555",fontFace:"Calibri",align:"center"
});
bulletBox(s, {
x:5.9, y:1.1, w:3.9, h:4.2,
title:"Key Points",
titleColor:C.accent,
fontSize:12.5,
bullets:[
"Located at anteroinferior nasal septum, just superior to the vestibule",
"Formed by anastomosis of 4–5 arteries (sphenopalatine, anterior ethmoidal, posterior ethmoidal, superior labial, greater palatine)",
"Highly vascular — supplies large surface area for air warming",
"Superficially placed → vulnerable to trauma, dryness, picking",
"Site of 90% of all epistaxis (anterior bleeds)",
"Usually self-limiting in children and young adults",
"Can be visualised easily with anterior rhinoscopy",
"Silver nitrate cautery is first-line for accessible bleeding here",
]
});
bottomBar(s);
}
// ═══════════════════════════════════════════════════════════════
// SLIDE 5 — AETIOLOGY
// ═══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.lightBg);
headerBar(s, "Aetiology & Risk Factors");
// Two columns
bulletBox(s, {
x:0.3, y:1.08, w:4.6, h:4.3,
title:"Local Causes",
titleColor:C.midBlue,
fontSize:12,
bullets:[
"Nose picking (commonest in children)",
"Nasal trauma / foreign bodies",
"Upper respiratory tract infections",
"Allergic rhinitis",
"Low humidity / dry indoor air",
"Nasal polyps",
"Granulomatous disease (GPA, sarcoid, TB)",
"Neoplasms (benign & malignant)",
"Juvenile angiofibroma (adolescent males)",
"HHT / Osler-Weber-Rendu disease",
"Post-operative / iatrogenic",
"Cocaine abuse / nasal vasoconstrictor overuse",
"Barotrauma",
]
});
bulletBox(s, {
x:5.1, y:1.08, w:4.6, h:4.3,
title:"Systemic Causes",
titleColor:C.accent,
fontSize:12,
bullets:[
"Hypertension (associated with persistence, not proven causative)",
"Anticoagulants: Warfarin, Rivaroxaban, Apixaban",
"Antiplatelet agents: Aspirin, Clopidogrel",
"Haemophilia A & B",
"Von Willebrand's disease",
"Thrombocytopenia / Leukaemia",
"Hepatic disease / cirrhosis",
"Vitamin K deficiency",
"Folic acid deficiency",
"Chemotherapy",
"Alcoholism",
"Ehlers-Danlos / connective tissue disorders",
"Uraemia",
]
});
// Bottom note
s.addText("⚠ 70–80% of epistaxis is PRIMARY (idiopathic) — no proven causal factor identified", {
x:0.3,y:5.28,w:9.4,h:0.3,
fontSize:10.5, bold:true, color:C.white,
fontFace:"Calibri", align:"center",
// shape behind
});
s.addShape(pres.ShapeType.rect,{
x:0,y:5.22,w:10,h:0.4,
fill:{color:C.gold}, line:{color:C.gold,width:0}
});
s.addText("⚠ 70–80% of epistaxis is PRIMARY (idiopathic) — no proven causal factor identified", {
x:0.3,y:5.22,w:9.4,h:0.4,
fontSize:11, bold:true, color:C.white,
fontFace:"Calibri", align:"center", valign:"middle"
});
}
// ═══════════════════════════════════════════════════════════════
// SLIDE 6 — ANTERIOR vs POSTERIOR TABLE
// ═══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.lightBg);
headerBar(s, "Classification: Anterior vs Posterior Epistaxis");
const headers = ["Feature", "Anterior (90%)", "Posterior (10%)"];
const rows = [
["Site", "Kiesselbach's plexus (anteroinferior septum)", "Sphenopalatine artery / posterior nasal cavity"],
["Age group", "Children & young adults", "Elderly, atherosclerotic patients"],
["Severity", "Usually mild — self-limiting", "More severe, harder to control"],
["Visibility", "Easily visualised — anterior rhinoscopy", "Requires endoscopy / nasendoscopy"],
["Bleeding", "Unilateral; drips from one nostril", "Often bilateral; seen in posterior pharynx"],
["1st-line Rx", "Pressure → cautery → anterior pack", "Posterior packing / double balloon catheter"],
["Admission", "Usually managed outpatient", "Inpatient — pulse oximetry monitoring required"],
["Risk factors", "Nose picking, URI, dry air, allergies", "HTN, anticoagulants, arteriosclerosis"],
];
const cw = [2.2, 3.65, 3.65];
const sx = 0.25; const sy = 1.1; const headerH = 0.46; const rh = 0.52;
headers.forEach((h,ci)=>{
const x = sx + cw.slice(0,ci).reduce((a,b)=>a+b,0);
s.addShape(pres.ShapeType.rect,{
x,y:sy,w:cw[ci],h:headerH,
fill:{color:ci===0?C.textDark:ci===1?C.midBlue:C.accentDark},
line:{color:C.white,width:0.5}
});
s.addText(h,{x,y:sy,w:cw[ci],h:headerH,fontSize:14,bold:true,color:C.white,fontFace:"Calibri",align:"center",valign:"middle"});
});
rows.forEach((row,ri)=>{
row.forEach((cell,ci)=>{
const x = sx + cw.slice(0,ci).reduce((a,b)=>a+b,0);
const y = sy + headerH + ri*rh;
const even = ri%2===0;
const cellBg = ci===0?"D6EAF8":even?"FDFEFE":"EBF5FB";
s.addShape(pres.ShapeType.rect,{
x,y,w:cw[ci],h:rh,
fill:{color:cellBg}, line:{color:C.lightGray,width:0.5}
});
s.addText(cell,{
x:x+0.07,y,w:cw[ci]-0.14,h:rh,
fontSize:ci===0?12:11, bold:ci===0,
color:C.textDark, fontFace:"Calibri",
align:ci===0?"center":"left", valign:"middle"
});
});
});
bottomBar(s);
}
// ═══════════════════════════════════════════════════════════════
// SLIDE 7 — CLINICAL ASSESSMENT
// ═══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.lightBg);
headerBar(s, "Clinical Assessment");
const panels = [
{x:0.3,y:1.1,w:3.0,h:2.35, title:"ABC Priorities", color:C.accent, bullets:[
"Assess airway patency",
"Tissue perfusion & haemodynamics",
"Vital signs: BP, HR, SpO₂",
"Position: lean forward to avoid aspiration",
"Apply bilateral pressure immediately",
]},
{x:3.5,y:1.1,w:3.0,h:2.35, title:"Targeted History", color:C.midBlue, bullets:[
"Timing, frequency, duration, severity",
"Unilateral vs bilateral",
"Medications: anticoagulants, antiplatelets",
"Comorbidities: HTN, liver, haematology",
"Family history of bleeding disorders",
"Prior nasal surgery or trauma",
]},
{x:6.7,y:1.1,w:3.0,h:2.35, title:"Investigations", color:C.teal, bullets:[
"Usually clinical diagnosis",
"FBC: prolonged/severe bleeding",
"PT/INR/PTT: anticoagulated patients",
"Platelet count: suspected coagulopathy",
"LFTs: liver disease",
"CT contrast: suspected neoplasm",
]},
{x:0.3,y:3.6,w:9.4,h:2.0, title:"Physical Examination Technique", color:C.gold, bullets:[
"Patient leans forward slightly (not hyperextended) — prevents swallowing blood",
"Compress CARTILAGINOUS part of nose (not nasal bones) firmly for 10–15 minutes — a nose clip is superior to manual pressure alone",
"Apply oxymetazoline 0.05% (2 sprays) before inspection — vasoconstriction aids visualisation",
"Open nasal speculum VERTICALLY (not side-to-side) to avoid obscuring the septum",
"Suction clots before attempting to identify bleeding point — examine floor of nose parallel to room floor",
"Rigid nasendoscopy if anterior examination fails to identify source",
]},
];
panels.forEach(p=>{
bulletBox(s, {x:p.x,y:p.y,w:p.w,h:p.h,title:p.title,titleColor:p.color,bullets:p.bullets,fontSize:11});
});
bottomBar(s);
}
// ═══════════════════════════════════════════════════════════════
// SLIDE 8 — MANAGEMENT: STEP-BY-STEP (with image)
// ═══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.darkNavy);
headerBar(s, "Management — Step-by-Step", C.midBlue);
// Flowchart image right side
addImg(s, "flowchart", 5.85, 1.1, 3.9, 4.3);
s.addText("Management algorithm (Scott-Brown's Otolaryngology)", {
x:5.85,y:5.3,w:3.9,h:0.3,
fontSize:8.5,italic:true,color:C.lightGray,fontFace:"Calibri",align:"center"
});
const steps = [
{step:"STEP 1", title:"Immediate Haemostasis", color:C.accent, items:[
"Lean patient forward, mouth open",
"Compress cartilaginous nose firmly × 10–15 min",
"2 sprays oxymetazoline 0.05% into affected naris",
"Nose clip superior to finger pressure",
]},
{step:"STEP 2", title:"Identify Bleeding Source", color:C.gold, items:[
"Patient blows nose to clear clots",
"Anterior rhinoscopy / nasal speculum",
"Lidocaine 2% mucosal atomisation for comfort",
"Identify: anterior (Kiesselbach's) vs posterior",
]},
{step:"STEP 3", title:"Cautery — If Source Visible", color:C.teal, items:[
"Silver nitrate stick: periphery → centre",
"Unilateral only (bilateral → septal necrosis risk)",
"Contact < 15 seconds per application",
"Ineffective during active bleeding — achieve haemostasis first",
]},
{step:"STEP 4", title:"Topical Agents / Packing", color:C.midBlue, items:[
"Tranexamic acid 500 mg on pledget OR atomised",
"Gelfoam / Surgicel if cautery fails",
"Anterior pack: Merocel or Rapid Rhino balloon",
"Posterior: double balloon catheter / Foley",
]},
];
steps.forEach((st,i)=>{
const y = 1.1 + i*1.08;
s.addShape(pres.ShapeType.rect,{x:0.3,y,w:0.9,h:0.88,fill:{color:st.color},line:{color:st.color,width:0}});
s.addText(st.step,{x:0.3,y,w:0.9,h:0.88,fontSize:10,bold:true,color:C.white,fontFace:"Calibri",align:"center",valign:"middle"});
s.addShape(pres.ShapeType.rect,{x:1.22,y,w:4.45,h:0.88,fill:{color:"0A1628"},line:{color:st.color,width:0.75}});
s.addText(st.title,{x:1.32,y:y+0.03,w:4.25,h:0.3,fontSize:12.5,bold:true,color:st.color,fontFace:"Calibri",align:"left",margin:0});
s.addText(st.items.map((it,ii)=>[
{text:"• ",options:{bold:true,color:st.color}},
{text:it,options:{color:C.white}},
...(ii<st.items.length-1?[{text:"\n",options:{}}]:[])
]).flat(),{x:1.32,y:y+0.33,w:4.25,h:0.52,fontSize:10,fontFace:"Calibri",valign:"top"});
});
bottomBar(s, C.midBlue);
}
// ═══════════════════════════════════════════════════════════════
// SLIDE 9 — NASAL PACKING (with images)
// ═══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.lightBg);
headerBar(s, "Nasal Packing — Devices & Techniques");
// Device images row
addImg(s, "merocel", 0.3, 1.1, 2.7, 2.0);
s.addText("Merocel nasal tampon", {
x:0.3,y:3.1,w:2.7,h:0.25, fontSize:9,italic:true,color:"555555",fontFace:"Calibri",align:"center"
});
addImg(s, "rapidrhino", 3.2, 1.1, 2.7, 2.0);
s.addText("Rapid Rhino balloon device", {
x:3.2,y:3.1,w:2.7,h:0.25, fontSize:9,italic:true,color:"555555",fontFace:"Calibri",align:"center"
});
bulletBox(s,{
x:6.1, y:1.1, w:3.6, h:4.25,
title:"Posterior Packing",
titleColor:C.accent,
fontSize:11.5,
bullets:[
"Use when anterior pack fails or posterior epistaxis suspected",
"Double balloon catheter (e.g. Epistat device)",
"Insert along nasal floor after topical anaesthesia",
"Inflate POSTERIOR balloon first in nasopharynx",
"Pull anteriorly to seat it, then inflate ANTERIOR balloon",
"Foley catheter 5–7 mL as alternative if no device available",
"Caution: pressure necrosis if over-inflated",
"ADMIT: pulse oximetry — risk of hypoxia & cardiac events",
"Prophylactic antibiotics NOT routinely recommended",
]
});
bulletBox(s,{
x:0.3, y:3.45, w:5.65, h:1.9,
title:"Anterior Packing — Key Points",
titleColor:C.midBlue,
fontSize:11.5,
bullets:[
"Merocel: polyvinyl acetal — insert dry, expands on contact with blood/saline",
"Rapid Rhino: procoagulant-coated hydrocolloid balloon — inflate with AIR (not water)",
"Vaseline ribbon gauze: traditional option — layer from floor upwards",
"Remove after 48–72 hours; insert second pack opposite side if first fails",
]
});
bottomBar(s);
}
// ═══════════════════════════════════════════════════════════════
// SLIDE 10 — PHARMACOLOGICAL AGENTS
// ═══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.lightBg);
headerBar(s, "Pharmacological Agents");
const drugs = [
{drug:"Oxymetazoline 0.05%", class:"Vasoconstrictor", use:"2 sprays into affected naris → facilitates haemostasis & exam", note:"Alpha-1 agonist; onset <2 min; limit to 3 days (rebound risk)", color:C.midBlue},
{drug:"Silver Nitrate 75%", class:"Chemical Cauterant", use:"Cauterise identified bleeding point; periphery → centre, <15 sec", note:"Unilateral only; ineffective during active bleeding; apply dry stick", color:C.accent},
{drug:"Lidocaine 2% (topical)", class:"Local Anaesthetic", use:"Mucosal atomisation before procedures; reduces pain & gag", note:"Combine with vasoconstrictor for optimal effect", color:C.teal},
{drug:"Tranexamic Acid", class:"Antifibrinolytic", use:"500 mg IV solution on pledget OR atomised; OR IV infusion", note:"Reduces 10-min bleeding & 7–10-day rebleed; superior to packing in antiplatelet patients (meta-analysis)", color:C.gold},
{drug:"Gelfoam / Surgicel", class:"Absorbable Haemostat", use:"Place on bleeding site; promotes clotting even in anticoagulated", note:"Absorbable — does not need removal; useful when cautery fails", color:"7D6608"},
{drug:"Thrombin Compounds", class:"Topical Haemostat", use:"Applied to nasal cavity; effective even when fully anticoagulated", note:"Can soak nasal tampon; case reports: effective in rivaroxaban epistaxis", color:"784212"},
];
const cw = [2.15, 1.55, 3.2, 2.6];
const hdr = ["Drug / Agent","Class","Clinical Use","Key Notes"];
const sx=0.25; const sy=1.08; const hH=0.44; const rh=0.6;
hdr.forEach((h,ci)=>{
const x=sx+cw.slice(0,ci).reduce((a,b)=>a+b,0);
s.addShape(pres.ShapeType.rect,{x,y:sy,w:cw[ci],h:hH,fill:{color:C.midBlue},line:{color:C.white,width:0.5}});
s.addText(h,{x,y:sy,w:cw[ci],h:hH,fontSize:13,bold:true,color:C.white,fontFace:"Calibri",align:"center",valign:"middle"});
});
drugs.forEach((row,ri)=>{
const cells=[row.drug,row.class,row.use,row.note];
cells.forEach((cell,ci)=>{
const x=sx+cw.slice(0,ci).reduce((a,b)=>a+b,0);
const y=sy+hH+ri*rh;
const even=ri%2===0;
s.addShape(pres.ShapeType.rect,{
x,y,w:cw[ci],h:rh,
fill:{color:ci===0?"D6EAF8":even?"FDFEFE":"EBF5FB"},
line:{color:C.lightGray,width:0.5}
});
s.addText(cell,{
x:x+0.06,y,w:cw[ci]-0.12,h:rh,
fontSize:ci===0?11.5:10, bold:ci===0,
color:ci===0?row.color:C.textDark,
fontFace:"Calibri",align:"left",valign:"middle"
});
});
});
bottomBar(s);
}
// ═══════════════════════════════════════════════════════════════
// SLIDE 11 — SURGICAL & INTERVENTIONAL
// ═══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.darkNavy);
headerBar(s, "Surgical & Interventional Options", C.midBlue);
// External carotid schematic textbook image
addImg(s, "extCarotid", 0.3, 1.12, 2.5, 2.3);
s.addText("Nasal blood supply schematic\n(Scott-Brown's Otolaryngology)", {
x:0.3,y:3.42,w:2.5,h:0.4,
fontSize:8.5,italic:true,color:C.lightGray,fontFace:"Calibri",align:"center"
});
const options = [
{num:"01",title:"Endoscopic Sphenopalatine Artery Ligation (ESPAL)",
detail:"First-line surgical option for refractory posterior epistaxis. Clip/cauterise SPA at sphenopalatine foramen under endoscope. Low morbidity; high success.",
color:C.midBlue},
{num:"02",title:"Anterior & Posterior Ethmoidal Artery Ligation",
detail:"Medial canthal (Lynch) incision approach. Used when ESPAL fails or for superior/high posterior bleeding (ethmoidal territory).",
color:C.teal},
{num:"03",title:"Endovascular Embolisation",
detail:"Bilateral selective carotid angiography → superselective catheterisation → particle embolisation (150–400 µm). Success 91–97%, complications 0–3%. Preferred in high-surgical-risk patients.",
color:C.accent},
{num:"04",title:"Internal Maxillary Artery Ligation (Trans-antral)",
detail:"Caldwell-Luc approach. Largely superseded by ESPAL. Higher morbidity; still occasionally used where endoscopic approach is unavailable.",
color:C.gold},
];
options.forEach((opt,i)=>{
const y = 1.12 + i*1.12;
s.addShape(pres.ShapeType.rect,{x:3.0,y,w:0.7,h:0.95,fill:{color:opt.color},line:{color:opt.color,width:0}});
s.addText(opt.num,{x:3.0,y,w:0.7,h:0.95,fontSize:16,bold:true,color:C.white,fontFace:"Calibri",align:"center",valign:"middle"});
s.addShape(pres.ShapeType.rect,{x:3.72,y,w:5.98,h:0.95,fill:{color:"0A1628"},line:{color:opt.color,width:0.75}});
s.addText(opt.title,{x:3.82,y:y+0.03,w:5.78,h:0.33,fontSize:12.5,bold:true,color:opt.color,fontFace:"Calibri",align:"left",margin:0});
s.addText(opt.detail,{x:3.82,y:y+0.35,w:5.78,h:0.55,fontSize:10.5,color:C.white,fontFace:"Calibri",align:"left",valign:"top"});
});
bottomBar(s, C.midBlue);
}
// ═══════════════════════════════════════════════════════════════
// SLIDE 12 — HHT & JUVENILE ANGIOFIBROMA (Special Cases with image)
// ═══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.lightBg);
headerBar(s, "Special Situations — HHT & Juvenile Angiofibroma");
// HHT image
addImg(s, "hht", 0.3, 1.1, 3.5, 2.5);
s.addText("HHT — Osler-Weber-Rendu disease\n(Cleveland Clinic)", {
x:0.3,y:3.6,w:3.5,h:0.35,
fontSize:8.5,italic:true,color:"555555",fontFace:"Calibri",align:"center"
});
bulletBox(s,{
x:4.0,y:1.1,w:5.7,h:2.55,
title:"Hereditary Haemorrhagic Telangiectasia (HHT / Osler-Weber-Rendu)",
titleColor:C.midBlue,
fontSize:11.5,
bullets:[
"Autosomal dominant — mutations in ENG, ACVRL1 genes (TGF-β pathway)",
"Recurrent multifocal epistaxis from thin-walled telangiectatic vessels (lack muscle & elastic tissue)",
"Standard packing & cautery are temporarily effective but bleeding recurs",
"Treatments: laser photocoagulation, septal dermoplasty (Young's procedure), anti-VEGF (bevacizumab)",
"Screen for AVMs: lung, liver, brain — referral to HHT centre",
]
});
bulletBox(s,{
x:0.3,y:3.95,w:9.4,h:1.6,
title:"Juvenile Angiofibroma — ⚠ Never Biopsy",
titleColor:C.accent,
fontSize:11.5,
bullets:[
"Exclusively in ADOLESCENT MALES — benign but highly vascular tumour of the nasopharynx",
"Can cause MASSIVE, life-threatening epistaxis — DO NOT biopsy (risk of uncontrollable haemorrhage)",
"Diagnosis: CT with contrast (Holman–Miller / antral sign) or MRI — shows bowing of posterior antral wall",
"Treatment: preoperative embolisation of feeding vessels → endoscopic excision under image guidance by experienced surgeon",
]
});
bottomBar(s);
}
// ═══════════════════════════════════════════════════════════════
// SLIDE 13 — ANTICOAGULATED PATIENT & CHILDREN
// ═══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.lightBg);
headerBar(s, "Special Situations — Anticoagulation & Children");
bulletBox(s,{
x:0.3,y:1.1,w:9.4,h:2.4,
title:"Anticoagulated Patient with Epistaxis",
titleColor:C.accentDark,
fontSize:12,
bullets:[
"Order: PT/INR/PTT, platelet count, DOAC-specific assays (anti-Xa for rivaroxaban/apixaban)",
"CBC: prolonged or severe bleeding → assess for thrombocytopenia or anaemia",
"Anticoagulant REVERSAL rarely necessary — only if markedly abnormal levels OR life-threatening bleed",
"Topical haemostats (cellulose, gelatin, thrombin) effective even when FULLY anticoagulated",
"Topical tranexamic acid: superior to anterior packing in antiplatelet patients (RCT evidence)",
"Specific factor replacement needed in haemophilia with severe bleeding (factor VIII for HA, factor IX for HB)",
"Topical TXA case reports: effective in rivaroxaban-associated epistaxis after pack failure",
]
});
bulletBox(s,{
x:0.3,y:3.65,w:4.6,h:2.0,
title:"Children (< 2 years) — Red Flags",
titleColor:C.accent,
fontSize:12,
bullets:[
"Epistaxis in children < 2 yrs is RARE → consider NAI (non-accidental injury / child abuse)",
"Screen for underlying coagulopathy (haemophilia, vWD)",
"Most paediatric epistaxis: anterior, nose-picking, Kiesselbach's plexus",
"Conservative: direct pressure + humidification + saline spray",
"Refer to haematology if coagulopathy suspected",
]
});
bulletBox(s,{
x:5.1,y:3.65,w:4.6,h:2.0,
title:"Discharge Advice to Patients",
titleColor:C.teal,
fontSize:12,
bullets:[
"Avoid nose picking — keep nails short",
"Saline nasal spray + petroleum jelly to moisturise mucosa",
"Humidify home environment in winter",
"If bleeding recurs: lean forward, pinch nose 10–15 min",
"Return if bleeding > 20 min, bilateral, or syncope occurs",
"Review anticoagulant dosing with physician",
]
});
bottomBar(s);
}
// ═══════════════════════════════════════════════════════════════
// SLIDE 14 — KEY TAKEAWAYS
// ═══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.darkNavy);
s.addShape(pres.ShapeType.rect,{
x:0,y:0,w:10,h:1.05,
fill:{color:C.accent},line:{color:C.accent,width:0}
});
s.addShape(pres.ShapeType.rect,{
x:0,y:0,w:10,h:0.055,
fill:{color:C.gold},line:{color:C.gold,width:0}
});
s.addText("Key Takeaways",{
x:0.45,y:0.07,w:9.1,h:0.88,
fontSize:26,bold:true,color:C.white,
fontFace:"Calibri",align:"left",valign:"middle",margin:0
});
const kps = [
{n:"01",c:C.accent, t:"90% of epistaxis is anterior (Kiesselbach's plexus) — self-limiting. Posterior epistaxis is 10%, more severe, mainly in elderly."},
{n:"02",c:C.midBlue, t:"First step: compress cartilaginous nose firmly for 10–15 min + oxymetazoline spray. A nose clip is superior to finger pressure."},
{n:"03",c:C.teal, t:"Identify the bleeding point before treating. Silver nitrate cautery: periphery → centre, unilateral only, < 15 seconds contact."},
{n:"04",c:C.gold, t:"Tranexamic acid (topical 500 mg): reduces 10-min bleeding and 7–10-day rebleed. Superior to packing in antiplatelet patients."},
{n:"05",c:C.accent, t:"Posterior epistaxis needs posterior balloon packing, inpatient admission, and pulse oximetry. Prophylactic antibiotics are NOT recommended."},
{n:"06",c:C.midBlue, t:"Refractory cases: ENT referral → endoscopic sphenopalatine artery ligation (ESPAL) or endovascular embolisation (91–97% success)."},
{n:"07",c:C.teal, t:"Hypertension is associated with persistent bleeding but a direct causal link is NOT proven. Treat elevated BP as part of overall care."},
{n:"08",c:C.gold, t:"Juvenile angiofibroma: NEVER biopsy. 70–80% of all epistaxis is primary (idiopathic). HHT requires long-term specialist management."},
];
kps.forEach((k,i)=>{
const col = i<4?0:1;
const row = i%4;
const x = 0.3 + col*4.85;
const y = 1.12 + row*1.1;
s.addShape(pres.ShapeType.rect,{x,y:y+0.1,w:0.48,h:0.48,fill:{color:k.c},line:{color:k.c,width:0}});
s.addText(k.n,{x,y:y+0.1,w:0.48,h:0.48,fontSize:12,bold:true,color:C.white,fontFace:"Calibri",align:"center",valign:"middle",margin:0});
s.addShape(pres.ShapeType.rect,{x:x+0.52,y,w:4.15,h:0.92,fill:{color:"0A1628"},line:{color:k.c,width:0.75}});
s.addText(k.t,{x:x+0.6,y:y+0.03,w:4.0,h:0.86,fontSize:11,color:C.white,fontFace:"Calibri",align:"left",valign:"middle"});
});
bottomBar(s, C.accent);
}
// ═══════════════════════════════════════════════════════════════
// SLIDE 15 — REFERENCES
// ═══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
bg(s, C.darkNavy);
s.addShape(pres.ShapeType.rect,{x:0,y:0,w:10,h:0.055,fill:{color:C.gold},line:{color:C.gold,width:0}});
s.addShape(pres.ShapeType.rect,{x:0,y:0,w:10,h:1.0,fill:{color:"0A1628"},line:{color:"0A1628",width:0}});
s.addText("References & Sources",{x:0.45,y:0.07,w:9.1,h:0.85,fontSize:26,bold:true,color:C.gold,fontFace:"Calibri",align:"left",valign:"middle",margin:0});
const refs = [
"Bailey & Love's Short Practice of Surgery, 28th Edition. Chapters 51 (Nose & Paranasal Sinuses). CRC Press / Taylor & Francis, 2023.",
"Rosen's Emergency Medicine: Concepts and Clinical Practice, 10th Edition. Chapter 58. Elsevier, 2023.",
"Roberts and Hedges' Clinical Procedures in Emergency Medicine, 7th Edition. Chapter 15. Elsevier, 2019.",
"Cummings Otolaryngology: Head and Neck Surgery, 7th Edition. Elsevier, 2021.",
"Scott-Brown's Otorhinolaryngology Head & Neck Surgery, 8th Edition. Chapters 106 (Epistaxis). CRC Press, 2018.",
"Grainger & Allison's Diagnostic Radiology, 6th Edition. Chapter 136 (Interventional Radiology). Elsevier.",
"Goldman-Cecil Medicine, International Edition. Elsevier, 2024.",
"Gottlieb M et al. Topical Tranexamic Acid for Epistaxis: A Systematic Review and Meta-Analysis. Ann Emerg Med. 2020.",
"American Academy of Otolaryngology–HNS: Clinical Practice Guideline — Nosebleed (Epistaxis). Otolaryngology–HNS, 2020.",
];
s.addText(refs.map((r,i)=>[
{text:`${i+1}. `,options:{bold:true,color:C.gold}},
{text:r,options:{color:C.lightGray}},
...(i<refs.length-1?[{text:"\n",options:{}}]:[])
]).flat(),{
x:0.5,y:1.12,w:9.0,h:4.2,
fontSize:11,fontFace:"Calibri",valign:"top",paraSpaceAfter:4
});
bottomBar(s, C.gold);
}
// ─── WRITE ───────────────────────────────────────────────────────
pres.writeFile({fileName:"/home/daytona/workspace/epistaxis-pptx/Epistaxis_v2.pptx"})
.then(()=>console.log("SUCCESS: Epistaxis_v2.pptx created"))
.catch(e=>{console.error("ERROR:",e); process.exit(1);});
cd /home/daytona/workspace/epistaxis-pptx && node create_pptx_v2.js 2>&1
~/epistaxis-pptx/create_pptx_v2.js
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/epistaxis-pptx/create_pptx_v2.js'
~/epistaxis-pptx/create_pptx_v2.js
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/epistaxis-pptx/create_pptx_v2.js'
"addImg(s," in ~/epistaxis-pptx/create_pptx_v2.js
cd /home/daytona/workspace/epistaxis-pptx && timeout 90 node create_pptx_v2.js 2…
ls -lh /home/daytona/workspace/epistaxis-pptx/Epistaxis_v2.pptx
cd /home/daytona/workspace/epistaxis-pptx && node -e " const {execSync} = requir…
Epistaxis v2
Presentation · PPTX
| # | Slide | Image / Visual |
|---|---|---|
| 1 | Title | Nasal anatomy diagram embedded in right panel |
| 2 | Definition & Epidemiology | Stat boxes (60%, 90%, 10%) + bullet points |
| 3 | Nasal Anatomy & Blood Supply | ✅ Textbook schematic of nasal blood supply (Scott-Brown's) |
| 4 | Kiesselbach's Plexus | Dedicated anatomy diagram + 8 bullet points |
| 5 | Aetiology & Risk Factors | Two columns — Local vs Systemic causes (13 each) |
| 6 | Anterior vs Posterior Table | 8-row comparison table |
| 7 | Clinical Assessment | 4 panels: ABC, History, Exam technique, Investigations |
| 8 | Management Step-by-Step | ✅ Textbook management flowchart (Scott-Brown's) + 4 step cards |
| 9 | Nasal Packing | Device images (Merocel, Rapid Rhino) + anterior/posterior bullet panels |
| 10 | Pharmacological Agents | 6-drug table with class, use, and key notes |
| 11 | Surgical & Interventional | 4 numbered option cards (ESPAL, ethmoidal, embolisation, trans-antral) |
| 12 | HHT & Juvenile Angiofibroma | HHT image + detailed bullet points for both conditions |
| 13 | Anticoagulation & Children | 3 panels: anticoagulated patient, children, discharge advice |
| 14 | Key Takeaways | 8 numbered clinical pearls |
| 15 | References | 9 textbook and literature sources |