What u can and cannot do
Create a ppt on gfr
mkdir -p /home/daytona/workspace/gfr-ppt && ls /home/daytona/workspace/gfr-ppt
~/gfr-ppt/gfr.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Glomerular Filtration Rate (GFR)";
pres.author = "Orris Medical Education";
// ── COLOR PALETTE ──────────────────────────────────────────────────────────
const C = {
navy: "0A1628", // dominant dark bg
teal: "0D7A8A", // accent / header bar
tealLt: "12A0B4", // lighter teal
gold: "E8B84B", // highlight accent
white: "FFFFFF",
offWhite:"F0F4F8",
gray: "A8B8C8",
darkCard:"112240", // card background
red: "E05252",
green: "3DAA6B",
};
// ── HELPERS ────────────────────────────────────────────────────────────────
function addHeader(slide, title, sub) {
// top navy bar
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.72, fill: { color: C.navy } });
// teal left accent strip
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.08, h: 5.625, fill: { color: C.teal } });
// title
slide.addText(title, {
x: 0.22, y: 0.08, w: 9.6, h: 0.56,
fontSize: 20, bold: true, color: C.white, fontFace: "Calibri", margin: 0,
});
if (sub) {
slide.addText(sub, {
x: 0.22, y: 0.62, w: 9.5, h: 0.32,
fontSize: 11, color: C.tealLt, fontFace: "Calibri", italic: true, margin: 0,
});
}
}
function addFooter(slide, num, total) {
slide.addShape(pres.ShapeType.rect, { x: 0, y: 5.4, w: 10, h: 0.225, fill: { color: C.navy } });
slide.addText(`Brenner & Rector's The Kidney | Comprehensive Clinical Nephrology 7e | NKF Primer on Kidney Diseases 8e`, {
x: 0.2, y: 5.41, w: 8.5, h: 0.18, fontSize: 6.5, color: C.gray, fontFace: "Calibri", margin: 0,
});
slide.addText(`${num} / ${total}`, {
x: 8.8, y: 5.41, w: 1.0, h: 0.18, fontSize: 7, color: C.gray, align: "right", fontFace: "Calibri", margin: 0,
});
}
function card(slide, x, y, w, h, color) {
slide.addShape(pres.ShapeType.roundRect, {
x, y, w, h,
fill: { color: color || C.darkCard },
line: { color: C.teal, width: 0.8 },
rectRadius: 0.08,
});
}
const TOTAL = 13;
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 1 – TITLE
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
// full dark bg
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.navy } });
// decorative teal diagonal band
s.addShape(pres.ShapeType.rect, { x: 0, y: 3.9, w: 10, h: 0.08, fill: { color: C.teal } });
s.addShape(pres.ShapeType.rect, { x: 0, y: 3.98, w: 10, h: 1.645, fill: { color: C.darkCard } });
// left accent bar
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.18, h: 5.625, fill: { color: C.teal } });
// gold accent line
s.addShape(pres.ShapeType.rect, { x: 0.18, y: 0, w: 0.06, h: 5.625, fill: { color: C.gold } });
s.addText("GLOMERULAR FILTRATION RATE", {
x: 0.5, y: 0.9, w: 9.2, h: 1.1,
fontSize: 38, bold: true, color: C.white, fontFace: "Calibri",
charSpacing: 2, align: "left",
});
s.addText("GFR", {
x: 0.5, y: 1.95, w: 9.2, h: 0.65,
fontSize: 52, bold: true, color: C.gold, fontFace: "Calibri", align: "left",
});
s.addText("Physiology | Measurement | Estimation | Clinical Staging | Regulation", {
x: 0.5, y: 2.8, w: 9.2, h: 0.45,
fontSize: 14, color: C.tealLt, fontFace: "Calibri", italic: true, align: "left",
});
s.addText("Advanced Clinical Review · Medical Students", {
x: 0.5, y: 4.05, w: 6, h: 0.32,
fontSize: 11, color: C.gray, fontFace: "Calibri", align: "left",
});
s.addText("Sources: Comprehensive Clinical Nephrology 7e | Brenner & Rector's The Kidney | NKF Primer 8e | Tietz Lab Medicine 7e", {
x: 0.5, y: 4.45, w: 9.2, h: 0.32,
fontSize: 8.5, color: C.gray, fontFace: "Calibri", italic: true, align: "left",
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 2 – WHAT IS GFR?
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.offWhite } });
addHeader(s, "What is GFR?", "The gold-standard index of kidney function");
addFooter(s, 2, TOTAL);
// Definition card
card(s, 0.22, 0.88, 9.56, 1.0, C.darkCard);
s.addText("Definition", {
x: 0.38, y: 0.9, w: 3, h: 0.28, fontSize: 10, bold: true, color: C.gold, fontFace: "Calibri", margin: 0,
});
s.addText(
"GFR is the product of the average filtration rate of each single nephron multiplied by the total number of nephrons in both kidneys. " +
"It is the most reliable measure of overall renal functional capacity and is considered the best index of the number of functioning nephrons.",
{ x: 0.38, y: 1.18, w: 9.2, h: 0.6, fontSize: 11, color: C.white, fontFace: "Calibri", margin: 0 }
);
// Key stats row
const stats = [
{ label: "Normal (Male)", val: "~130 mL/min/1.73m²" },
{ label: "Normal (Female)", val: "~120 mL/min/1.73m²" },
{ label: "Daily filtrate", val: "~180 L/day" },
{ label: "Indexed to BSA", val: "1.73 m²" },
];
stats.forEach((st, i) => {
const x = 0.22 + i * 2.39;
card(s, x, 2.02, 2.28, 1.05, C.teal);
s.addText(st.val, {
x: x + 0.08, y: 2.08, w: 2.12, h: 0.55,
fontSize: 15, bold: true, color: C.white, fontFace: "Calibri", align: "center", margin: 0,
});
s.addText(st.label, {
x: x + 0.08, y: 2.63, w: 2.12, h: 0.3,
fontSize: 9.5, color: C.offWhite, fontFace: "Calibri", align: "center", margin: 0,
});
});
// Bottom bullets
s.addText([
{ text: "GFR cannot be measured directly in humans — it is assessed via clearance techniques (mGFR) or estimating equations (eGFR).", options: { bullet: { type: "bullet" }, breakLine: true, color: C.navy } },
{ text: "Normal GFR varies significantly with age, sex, body size, diet, physical activity, and physiological states such as pregnancy.", options: { bullet: { type: "bullet" }, breakLine: true, color: C.navy } },
{ text: "GFR is indexed for body surface area to correct for differences in kidney size (kidney size is proportional to body size).", options: { bullet: { type: "bullet" }, color: C.navy } },
], { x: 0.28, y: 3.22, w: 9.4, h: 1.1, fontSize: 11, fontFace: "Calibri", lineSpacingMultiple: 1.25 });
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 3 – STARLING FORCES & SNGFR
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.offWhite } });
addHeader(s, "Determinants of Glomerular Filtration", "Starling forces driving ultrafiltration");
addFooter(s, 3, TOTAL);
// Formula card
card(s, 0.22, 0.88, 9.56, 1.25, C.darkCard);
s.addText("SNGFR = Kf × [(Pgc − Pbs) − (πgc − πbs)]", {
x: 0.5, y: 0.96, w: 9.0, h: 0.5,
fontSize: 17, bold: true, color: C.gold, fontFace: "Calibri", align: "center",
});
s.addText("Single-Nephron GFR = Ultrafiltration Coefficient × Net Ultrafiltration Pressure", {
x: 0.5, y: 1.46, w: 9.0, h: 0.28,
fontSize: 10, color: C.gray, fontFace: "Calibri", align: "center", italic: true,
});
// Variables table
const vars = [
{ sym: "Kf", desc: "Ultrafiltration coefficient (hydraulic conductivity × filtration surface area)", val: "High — orders of magnitude above systemic capillaries" },
{ sym: "Pgc", desc: "Glomerular capillary hydrostatic pressure", val: "~45 mm Hg" },
{ sym: "Pbs", desc: "Bowman space hydrostatic pressure", val: "~10 mm Hg" },
{ sym: "πgc", desc: "Glomerular capillary oncotic pressure", val: "~25 mm Hg (rises along capillary)" },
{ sym: "πbs", desc: "Bowman space oncotic pressure", val: "≈ 0 mm Hg (protein-free filtrate)" },
];
const ry = 2.26;
s.addShape(pres.ShapeType.rect, { x: 0.22, y: ry, w: 9.56, h: 0.3, fill: { color: C.teal } });
["Symbol", "Description", "Normal Value"].forEach((h, i) => {
s.addText(h, {
x: 0.22 + [0, 1.1, 6.6][i], y: ry + 0.02, w: [1.05, 5.45, 2.9][i], h: 0.26,
fontSize: 9.5, bold: true, color: C.white, fontFace: "Calibri", margin: 2,
});
});
vars.forEach((v, i) => {
const by = ry + 0.3 + i * 0.42;
const bg = i % 2 === 0 ? "E4ECF4" : C.white;
s.addShape(pres.ShapeType.rect, { x: 0.22, y: by, w: 9.56, h: 0.41, fill: { color: bg } });
s.addText(v.sym, { x: 0.26, y: by + 0.04, w: 1.0, h: 0.33, fontSize: 11, bold: true, color: C.teal, fontFace: "Calibri", margin: 1 });
s.addText(v.desc, { x: 1.32, y: by + 0.04, w: 5.22, h: 0.33, fontSize: 9.5, color: C.navy, fontFace: "Calibri", margin: 1 });
s.addText(v.val, { x: 6.6, y: by + 0.04, w: 3.1, h: 0.33, fontSize: 9.5, color: C.navy, fontFace: "Calibri", margin: 1 });
});
s.addText("Net ultrafiltration pressure ≈ 10 mm Hg at afferent end. Filtration equilibrium is NOT achieved in healthy glomeruli due to efferent arteriole resistance and progressive reduction in capillary endothelium permeability.", {
x: 0.28, y: 5.18, w: 9.4, h: 0.28, fontSize: 9, color: C.navy, italic: true, fontFace: "Calibri",
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 4 – SIZE & CHARGE BARRIER
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.offWhite } });
addHeader(s, "Glomerular Filtration Barrier", "Size and charge selectivity");
addFooter(s, 4, TOTAL);
// Left: layers
card(s, 0.22, 0.88, 4.6, 4.28, C.darkCard);
s.addText("Three-Layer Barrier", {
x: 0.38, y: 0.95, w: 4.2, h: 0.32, fontSize: 12, bold: true, color: C.gold, fontFace: "Calibri", margin: 0,
});
const layers = [
{ name: "1. Fenestrated Endothelium", detail: "Pores 70–100 nm. Prevents passage of blood cells. Negatively charged glycocalyx." },
{ name: "2. Glomerular Basement Membrane (GBM)", detail: "Type IV collagen + laminin + heparan sulfate. Main structural and charge barrier. Thickness: 320–340 nm." },
{ name: "3. Podocytes (Visceral Epithelial Cells)", detail: "Foot processes with filtration slits (25–65 nm). Nephrin forms slit diaphragm. Critical size and charge selectivity." },
];
layers.forEach((l, i) => {
const ly = 1.36 + i * 1.18;
s.addShape(pres.ShapeType.rect, { x: 0.3, y: ly, w: 0.06, h: 0.9, fill: { color: C.teal } });
s.addText(l.name, {
x: 0.48, y: ly, w: 4.2, h: 0.32, fontSize: 10, bold: true, color: C.tealLt, fontFace: "Calibri", margin: 0,
});
s.addText(l.detail, {
x: 0.48, y: ly + 0.3, w: 4.2, h: 0.6, fontSize: 9.5, color: C.white, fontFace: "Calibri", margin: 0,
});
});
// Right: selectivity table
card(s, 5.1, 0.88, 4.68, 2.4, "FFFFFF");
s.addText("Filtration Selectivity by Molecular Size", {
x: 5.2, y: 0.95, w: 4.4, h: 0.28, fontSize: 10.5, bold: true, color: C.navy, fontFace: "Calibri", margin: 0,
});
const selData = [
["Substance", "Mol. Radius", "Filterability"],
["Water / Ions", "< 1 nm", "Freely filtered"],
["Inulin", "1.5 nm", "Freely filtered"],
["Myoglobin", "1.9 nm", "Partially filtered"],
["Albumin", "3.6 nm", "< 1% (charge repelled)"],
["IgG", "5.5 nm", "Essentially none"],
];
selData.forEach((row, ri) => {
const ry2 = 1.26 + ri * 0.32;
const bg = ri === 0 ? C.teal : ri % 2 === 0 ? "E4ECF4" : C.white;
s.addShape(pres.ShapeType.rect, { x: 5.1, y: ry2, w: 4.68, h: 0.31, fill: { color: bg } });
row.forEach((cell, ci) => {
s.addText(cell, {
x: 5.1 + [0, 1.6, 3.1][ci], y: ry2 + 0.02, w: [1.55, 1.45, 1.55][ci], h: 0.27,
fontSize: ri === 0 ? 9 : 9.5, bold: ri === 0, color: ri === 0 ? C.white : C.navy,
fontFace: "Calibri", margin: 2,
});
});
});
// Bottom note
card(s, 5.1, 3.45, 4.68, 1.26, C.darkCard);
s.addText("Charge Barrier", {
x: 5.2, y: 3.5, w: 4.4, h: 0.28, fontSize: 10, bold: true, color: C.gold, fontFace: "Calibri", margin: 0,
});
s.addText(
"The GBM and podocyte surface carry a strong negative charge (heparan sulfate proteoglycans). " +
"This electrostatically repels albumin (also negatively charged), dramatically reducing its filtration even at its molecular size.",
{ x: 5.2, y: 3.82, w: 4.4, h: 0.8, fontSize: 9.5, color: C.white, fontFace: "Calibri", margin: 0 }
);
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 5 – MEASUREMENT OF GFR (mGFR)
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.offWhite } });
addHeader(s, "Measured GFR (mGFR)", "Clearance-based methods");
addFooter(s, 5, TOTAL);
s.addText("GFR = (Uy × V) / Py", {
x: 2.5, y: 0.88, w: 5, h: 0.46,
fontSize: 16, bold: true, color: C.teal, fontFace: "Calibri", align: "center",
});
s.addText("Uy = urine concentration | V = urine flow rate | Py = plasma concentration", {
x: 1, y: 1.32, w: 8, h: 0.25, fontSize: 9.5, italic: true, color: C.navy, fontFace: "Calibri", align: "center",
});
// Ideal marker criteria
card(s, 0.22, 1.68, 3.1, 3.0, C.darkCard);
s.addText("Ideal Filtration Marker", {
x: 0.35, y: 1.76, w: 2.8, h: 0.28, fontSize: 10, bold: true, color: C.gold, fontFace: "Calibri", margin: 0,
});
const criteria = [
"Freely filtered at glomerulus",
"Not secreted by tubules",
"Not reabsorbed by tubules",
"Not metabolized by kidney",
"Not protein-bound",
"Constant plasma level",
];
s.addText(criteria.map(c => ({ text: c, options: { bullet: true, breakLine: true, color: C.white } })), {
x: 0.35, y: 2.08, w: 2.8, h: 2.45, fontSize: 10, fontFace: "Calibri", lineSpacingMultiple: 1.3,
});
// Marker table
card(s, 3.5, 1.68, 6.28, 3.0, "FFFFFF");
s.addText("Exogenous & Endogenous Filtration Markers", {
x: 3.62, y: 1.74, w: 6.0, h: 0.28, fontSize: 10, bold: true, color: C.navy, fontFace: "Calibri", margin: 0,
});
const markers = [
["Marker", "Type", "Gold Standard?", "Limitation"],
["Inulin", "Exogenous", "YES", "IV infusion required; cumbersome"],
["Iothalamate", "Exogenous", "Accepted", "Requires radiolabeling"],
["Iohexol", "Exogenous", "Accepted", "Plasma clearance used"],
["51Cr-EDTA / 99mTc-DTPA", "Exogenous", "Accepted", "Radioactive; specialist only"],
["Creatinine (24h Cl)", "Endogenous", "No", "Tubular secretion → overestimates GFR"],
["Cystatin C", "Endogenous", "Better than Cr", "Non-GFR determinants exist"],
];
markers.forEach((row, ri) => {
const ry2 = 2.06 + ri * 0.36;
const bg = ri === 0 ? C.teal : ri % 2 === 0 ? "E4ECF4" : C.white;
s.addShape(pres.ShapeType.rect, { x: 3.5, y: ry2, w: 6.28, h: 0.35, fill: { color: bg } });
row.forEach((cell, ci) => {
s.addText(cell, {
x: 3.5 + [0, 1.55, 3.1, 4.3][ci], y: ry2 + 0.02, w: [1.5, 1.5, 1.15, 2][ci], h: 0.31,
fontSize: ri === 0 ? 8.5 : 9, bold: ri === 0,
color: ri === 0 ? C.white : (ci === 2 && row[ci] === "YES" ? C.green : C.navy),
fontFace: "Calibri", margin: 2,
});
});
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 6 – ESTIMATION OF GFR (eGFR)
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.offWhite } });
addHeader(s, "Estimated GFR (eGFR)", "Equations & endogenous markers");
addFooter(s, 6, TOTAL);
// Creatinine info
card(s, 0.22, 0.88, 4.6, 2.02, C.darkCard);
s.addText("Serum Creatinine", {
x: 0.38, y: 0.94, w: 4.2, h: 0.28, fontSize: 11, bold: true, color: C.gold, fontFace: "Calibri", margin: 0,
});
s.addText([
{ text: "Produced from muscle creatine metabolism at a constant rate", options: { bullet: true, breakLine: true, color: C.white } },
{ text: "Freely filtered + ~15% tubularly secreted → overestimates GFR", options: { bullet: true, breakLine: true, color: C.white } },
{ text: "Influenced by: muscle mass, age, sex, race, diet (meat intake)", options: { bullet: true, breakLine: true, color: C.white } },
{ text: "GFR can fall ~50% before serum Cr significantly rises ('creatinine blind spot')", options: { bullet: true, color: C.white } },
], { x: 0.38, y: 1.26, w: 4.3, h: 1.5, fontSize: 9.5, fontFace: "Calibri", lineSpacingMultiple: 1.2 });
// Cystatin C info
card(s, 5.18, 0.88, 4.6, 2.02, C.darkCard);
s.addText("Cystatin C", {
x: 5.34, y: 0.94, w: 4.2, h: 0.28, fontSize: 11, bold: true, color: C.gold, fontFace: "Calibri", margin: 0,
});
s.addText([
{ text: "Cysteine protease inhibitor produced by all nucleated cells", options: { bullet: true, breakLine: true, color: C.white } },
{ text: "Freely filtered, completely reabsorbed + catabolized by tubules", options: { bullet: true, breakLine: true, color: C.white } },
{ text: "Less influenced by muscle mass → better in extremes of age/body composition", options: { bullet: true, breakLine: true, color: C.white } },
{ text: "Affected by: thyroid status, steroids, smoking, adiposity", options: { bullet: true, color: C.white } },
], { x: 5.34, y: 1.26, w: 4.3, h: 1.5, fontSize: 9.5, fontFace: "Calibri", lineSpacingMultiple: 1.2 });
// Equations
const eqs = [
{ name: "Cockcroft-Gault (1976)", formula: "(140 − age) × weight / (Cr × 72) [× 0.85 if female]", note: "Original; estimates creatinine clearance, not true GFR. Overestimates due to tubular secretion.", color: C.navy },
{ name: "MDRD (1999)", formula: "175 × SCr⁻¹·¹⁵⁴ × age⁻⁰·²⁰³ × 0.742 (F) × 1.212 (Black)", note: "Less accurate at GFR > 60. No longer recommended as first-line.", color: C.navy },
{ name: "CKD-EPI Creatinine (2009)", formula: "141 × min(Scr/κ,1)ᵅ × max(Scr/κ,1)⁻¹·²⁰⁹ × 0.993ᵃᵍᵉ", note: "Current clinical standard. More accurate across full GFR range.", color: C.green },
{ name: "CKD-EPI Cystatin C / Combined (2012)", formula: "Uses ScysC alone or combined Cr + CysC for added precision", note: "Recommended when confirmatory testing needed, esp. in unusual body composition.", color: C.teal },
];
eqs.forEach((eq, i) => {
const ey = 3.08 + i * 0.55;
s.addShape(pres.ShapeType.rect, { x: 0.22, y: ey, w: 9.56, h: 0.52, fill: { color: i % 2 === 0 ? "E4ECF4" : C.white } });
s.addShape(pres.ShapeType.rect, { x: 0.22, y: ey, w: 0.06, h: 0.52, fill: { color: eq.color } });
s.addText(eq.name, { x: 0.38, y: ey + 0.02, w: 2.6, h: 0.24, fontSize: 9, bold: true, color: C.navy, fontFace: "Calibri", margin: 0 });
s.addText(eq.formula, { x: 0.38, y: ey + 0.26, w: 4.2, h: 0.22, fontSize: 8.5, color: C.teal, fontFace: "Calibri", margin: 0, italic: true });
s.addText(eq.note, { x: 4.78, y: ey + 0.04, w: 5.0, h: 0.44, fontSize: 8.5, color: C.navy, fontFace: "Calibri", margin: 0 });
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 7 – CKD STAGING (KDIGO)
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.offWhite } });
addHeader(s, "CKD Staging by GFR – KDIGO Classification", "GFR G-categories (KDIGO 2012 / 2024 update)");
addFooter(s, 7, TOTAL);
const stages = [
{ g: "G1", gfr: "≥ 90", label: "Normal or high", color: "2E8B57", note: "Normal GFR with other markers of kidney damage required for CKD diagnosis" },
{ g: "G2", gfr: "60–89", label: "Mildly decreased", color: "66BB6A", note: "Often asymptomatic; mild decrease may be normal in elderly" },
{ g: "G3a", gfr: "45–59", label: "Mildly to moderately decreased", color: "FFD54F", note: "Moderate CKD; monitor BP, anaemia, PTH, phosphate" },
{ g: "G3b", gfr: "30–44", label: "Moderately to severely decreased", color: "FFA726", note: "High risk of CKD progression and cardiovascular complications" },
{ g: "G4", gfr: "15–29", label: "Severely decreased", color: "EF5350", note: "Prepare for renal replacement therapy; manage uraemic complications" },
{ g: "G5", gfr: "< 15", label: "Kidney failure", color: "B71C1C", note: "Dialysis or transplant required; end-stage renal disease (ESRD)" },
];
// Header row
s.addShape(pres.ShapeType.rect, { x: 0.22, y: 0.88, w: 9.56, h: 0.32, fill: { color: C.teal } });
["G-Category", "GFR (mL/min/1.73m²)", "Description", "Clinical Action"].forEach((h, i) => {
s.addText(h, {
x: 0.22 + [0, 1.1, 2.8, 5.9][i], y: 0.9, w: [1.05, 1.65, 3.05, 3.85][i], h: 0.28,
fontSize: 9.5, bold: true, color: C.white, fontFace: "Calibri", margin: 2,
});
});
stages.forEach((st, i) => {
const ry = 1.22 + i * 0.66;
s.addShape(pres.ShapeType.rect, { x: 0.22, y: ry, w: 9.56, h: 0.62, fill: { color: i % 2 === 0 ? "EAF0F8" : C.white } });
// color swatch
s.addShape(pres.ShapeType.rect, { x: 0.22, y: ry, w: 1.05, h: 0.62, fill: { color: st.color } });
s.addText(st.g, { x: 0.22, y: ry + 0.14, w: 1.05, h: 0.34, fontSize: 14, bold: true, color: C.white, fontFace: "Calibri", align: "center", margin: 0 });
s.addText(st.gfr, { x: 1.3, y: ry + 0.1, w: 1.45, h: 0.42, fontSize: 14, bold: true, color: C.navy, fontFace: "Calibri", align: "center", margin: 0 });
s.addText(st.label, { x: 2.82, y: ry + 0.08, w: 3.0, h: 0.46, fontSize: 10, color: C.navy, fontFace: "Calibri", margin: 2 });
s.addText(st.note, { x: 5.92, y: ry + 0.04, w: 3.8, h: 0.54, fontSize: 9, color: C.navy, fontFace: "Calibri", margin: 2 });
});
s.addText("KDIGO 2012 also adds Albuminuria A-categories (A1 < 30, A2 30–300, A3 > 300 mg/g) for combined risk stratification.", {
x: 0.28, y: 5.2, w: 9.4, h: 0.22, fontSize: 8.5, color: C.navy, italic: true, fontFace: "Calibri",
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 8 – REGULATION OF GFR
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.offWhite } });
addHeader(s, "Regulation of GFR", "Autoregulation and neurohumoral control");
addFooter(s, 8, TOTAL);
const mechanisms = [
{
title: "Myogenic Autoregulation",
icon: "⚙",
body: "Stretch of afferent arteriole smooth muscle (due to ↑ perfusion pressure) → vasoconstriction → maintains constant GFR.\nOperates over MAP 80–180 mmHg.",
},
{
title: "Tubuloglomerular Feedback (TGF)",
icon: "🔄",
body: "↑ NaCl at macula densa → ATP/adenosine → afferent arteriole constriction → ↓ GFR.\nLimits excessive filtration when tubular reabsorption is overwhelmed.",
},
{
title: "Renin-Angiotensin System (RAAS)",
icon: "⬆",
body: "Ang II → efferent arteriole constriction → ↑ Pgc → maintains GFR in low-flow states.\nACEi/ARBs → ↓ efferent resistance → ↓ GFR (but reduce hyperfiltration injury).",
},
{
title: "Sympathetic Nervous System",
icon: "⚡",
body: "High sympathetic tone (haemorrhage, shock) → afferent arteriole constriction → ↓ RBF and ↓ GFR.\nMediated by α1-adrenoceptors.",
},
{
title: "Prostaglandins",
icon: "🔵",
body: "PGE2 / PGI2 → vasodilate afferent arteriole → maintain GFR when RAAS is activated.\nNSAIDs block this → acute GFR decline in at-risk patients.",
},
{
title: "Atrial Natriuretic Peptide (ANP)",
icon: "💧",
body: "Released by atria in response to volume expansion.\nDilates afferent + constricts efferent → ↑ GFR + ↑ Na⁺ excretion.",
},
];
const cols = 3, rows = 2;
mechanisms.forEach((m, i) => {
const col = i % cols;
const row = Math.floor(i / cols);
const cx = 0.22 + col * 3.22;
const cy = 0.9 + row * 2.14;
card(s, cx, cy, 3.1, 2.0, C.darkCard);
s.addText(m.title, {
x: cx + 0.12, y: cy + 0.08, w: 2.85, h: 0.35,
fontSize: 9.5, bold: true, color: C.gold, fontFace: "Calibri", margin: 0,
});
s.addText(m.body, {
x: cx + 0.12, y: cy + 0.45, w: 2.85, h: 1.45,
fontSize: 9, color: C.white, fontFace: "Calibri", margin: 0, lineSpacingMultiple: 1.25,
});
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 9 – GFR AND AGE / SPECIAL POPULATIONS
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.offWhite } });
addHeader(s, "GFR Across the Lifespan & Special Populations", "Physiological and pathological variation");
addFooter(s, 9, TOTAL);
// Age trajectory
card(s, 0.22, 0.9, 5.7, 2.02, C.darkCard);
s.addText("GFR & Aging", {
x: 0.38, y: 0.96, w: 5.3, h: 0.28, fontSize: 11, bold: true, color: C.gold, fontFace: "Calibri", margin: 0,
});
s.addText([
{ text: "Neonates: GFR is low (~20 mL/min/1.73m²) due to incomplete glomerulogenesis at birth", options: { bullet: true, breakLine: true, color: C.white } },
{ text: "Peaks ~130/120 mL/min/1.73m² (male/female) in early adulthood", options: { bullet: true, breakLine: true, color: C.white } },
{ text: "Declines at ~1 mL/min/1.73m² per year after age 30–40", options: { bullet: true, breakLine: true, color: C.white } },
{ text: "Low birth weight: GFR lower by ~2.25 mL/min/1.73m² per 1 kg decrease in birth weight (tracks into adulthood)", options: { bullet: true, color: C.white } },
], { x: 0.38, y: 1.28, w: 5.3, h: 1.5, fontSize: 9.5, fontFace: "Calibri", lineSpacingMultiple: 1.2 });
// Pregnancy
card(s, 6.1, 0.9, 3.68, 2.02, C.darkCard);
s.addText("Pregnancy", {
x: 6.26, y: 0.96, w: 3.3, h: 0.28, fontSize: 11, bold: true, color: C.gold, fontFace: "Calibri", margin: 0,
});
s.addText(
"GFR increases 40–65% by 2nd trimester due to ↑ cardiac output and ↓ renal vascular resistance.\n\n" +
"Serum creatinine falls (normal < 0.8 mg/dL in pregnancy). Standard eGFR equations OVERESTIMATE GFR in pregnancy — use with caution.",
{ x: 6.26, y: 1.28, w: 3.3, h: 1.5, fontSize: 9.5, color: C.white, fontFace: "Calibri", margin: 0 }
);
// Conditions affecting GFR
const conditions = [
{ title: "↑ GFR (Hyperfiltration)", items: ["Pregnancy (1st/2nd trimester)", "High protein diet", "Early diabetic nephropathy", "Volume expansion (IV fluids)"], color: C.green },
{ title: "↓ GFR", items: ["CKD (any cause)", "Acute kidney injury", "Dehydration / hypovolaemia", "NSAIDs, ACEi/ARBs, contrast", "Heart failure, liver cirrhosis"], color: C.red },
{ title: "Factitious changes in eGFR", items: ["High meat diet ↑ creatinine → ↓ eGFR", "Creatine supplements ↑ Cr → ↓ eGFR", "Hypothyroidism ↑ CysC → ↓ eCysC-GFR", "Muscle wasting ↓ Cr → overestimates eGFR"], color: C.gold },
];
conditions.forEach((c, i) => {
const cx = 0.22 + i * 3.26;
card(s, cx, 3.06, 3.1, 2.24, C.white);
s.addShape(pres.ShapeType.rect, { x: cx, y: 3.06, w: 3.1, h: 0.34, fill: { color: c.color } });
s.addText(c.title, {
x: cx + 0.08, y: 3.08, w: 2.94, h: 0.3, fontSize: 9.5, bold: true, color: C.white, fontFace: "Calibri", align: "center", margin: 0,
});
s.addText(c.items.map(it => ({ text: it, options: { bullet: true, breakLine: true, color: C.navy } })), {
x: cx + 0.1, y: 3.44, w: 2.85, h: 1.75, fontSize: 9, fontFace: "Calibri", lineSpacingMultiple: 1.2,
});
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 10 – CLINICAL IMPLICATIONS OF GFR
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.offWhite } });
addHeader(s, "Clinical Implications of GFR", "Drug dosing, diagnostics and complications");
addFooter(s, 10, TOTAL);
const topics = [
{
title: "Drug Dosing Adjustments",
body: "Most renally-cleared drugs require dose reduction when GFR < 60 mL/min/1.73m².\n• Metformin: stop if eGFR < 30 (lactic acidosis risk)\n• Digoxin, aminoglycosides, vancomycin: accumulate and are nephrotoxic\n• Direct oral anticoagulants (DOACs): variable thresholds per agent\n• Contrast agents: risk of contrast-induced AKI ↑ when GFR < 45",
color: C.teal,
},
{
title: "Diagnosis of CKD",
body: "CKD is defined as abnormalities of kidney structure or function for > 3 months.\nGFR < 60 mL/min/1.73m² or markers of kidney damage (albuminuria, haematuria, structural abnormality) for > 3 months = CKD.\nSingle eGFR reading is insufficient — must be confirmed.",
color: C.gold,
},
{
title: "Complications Threshold",
body: "GFR < 60: ↑ risk of cardiovascular events, anaemia of CKD\nGFR < 45: Activate RRT planning; monitor PTH & bone metabolism\nGFR < 30: Erythropoiesis-stimulating agents (ESA) often needed\nGFR < 15: Initiate dialysis/transplant planning (Stage G5)",
color: C.red,
},
{
title: "AKI vs CKD",
body: "Single low eGFR may represent AKI (rapid reversible decline) or CKD (sustained ≥ 3 months).\nTrend matters: serial creatinine values, prior eGFR records, and imaging (kidney size, echogenicity) help distinguish them.",
color: C.navy,
},
];
topics.forEach((t, i) => {
const row = Math.floor(i / 2);
const col = i % 2;
const cx = 0.22 + col * 4.9;
const cy = 0.9 + row * 2.2;
card(s, cx, cy, 4.68, 2.06, C.darkCard);
s.addShape(pres.ShapeType.rect, { x: cx, y: cy, w: 4.68, h: 0.04, fill: { color: t.color } });
s.addText(t.title, {
x: cx + 0.12, y: cy + 0.1, w: 4.4, h: 0.32, fontSize: 11, bold: true, color: t.color, fontFace: "Calibri", margin: 0,
});
s.addText(t.body, {
x: cx + 0.12, y: cy + 0.46, w: 4.4, h: 1.52, fontSize: 9.5, color: C.white, fontFace: "Calibri", margin: 0, lineSpacingMultiple: 1.2,
});
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 11 – GFR & CARDIOVASCULAR RISK
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.offWhite } });
addHeader(s, "GFR, Albuminuria & Cardiovascular Risk", "The KDIGO heat map");
addFooter(s, 11, TOTAL);
// Intro
s.addText(
"Both reduced GFR and elevated albuminuria are independent risk factors for CKD progression AND cardiovascular mortality. " +
"KDIGO 2012 introduced a combined GFR + albuminuria risk grid ('heat map') to stratify prognosis.",
{ x: 0.22, y: 0.9, w: 9.56, h: 0.6, fontSize: 11, color: C.navy, fontFace: "Calibri" }
);
// Heat map grid
const gCats = ["G1 ≥90", "G2 60–89", "G3a 45–59", "G3b 30–44", "G4 15–29", "G5 <15"];
const aCats = ["A1 <30\n(Normal)", "A2 30–300\n(Moderate)", "A3 >300\n(Severe)"];
// risk grid [G1-G5][A1-A3]
const riskColors = [
["93C47D", "FFE599", "EA9999"],
["93C47D", "FFE599", "E06666"],
["FFE599", "E06666", "CC0000"],
["FFE599", "CC0000", "CC0000"],
["E06666", "CC0000", "CC0000"],
["CC0000", "CC0000", "CC0000"],
];
const riskLabels = [
["Low", "Moderate", "High"],
["Low", "Moderate", "V.High"],
["Moderate", "High", "V.High"],
["High", "V.High", "V.High"],
["V.High", "V.High", "V.High"],
["V.High", "V.High", "V.High"],
];
const gx0 = 2.4, gy0 = 1.65, cw = 2.3, ch = 0.52;
// Header A-cats
aCats.forEach((a, ai) => {
s.addShape(pres.ShapeType.rect, { x: gx0 + ai * cw, y: gy0 - 0.56, w: cw - 0.04, h: 0.52, fill: { color: C.teal } });
s.addText(a, { x: gx0 + ai * cw, y: gy0 - 0.56, w: cw - 0.04, h: 0.52, fontSize: 8.5, bold: true, color: C.white, align: "center", fontFace: "Calibri" });
});
// Header G-cats
gCats.forEach((g, gi) => {
s.addShape(pres.ShapeType.rect, { x: 0.22, y: gy0 + gi * ch, w: 2.1, h: ch - 0.04, fill: { color: C.navy } });
s.addText(g, { x: 0.22, y: gy0 + gi * ch, w: 2.1, h: ch - 0.04, fontSize: 8.5, bold: true, color: C.white, align: "center", fontFace: "Calibri", valign: "middle" });
});
// Grid
gCats.forEach((_, gi) => {
aCats.forEach((_, ai) => {
s.addShape(pres.ShapeType.rect, { x: gx0 + ai * cw, y: gy0 + gi * ch, w: cw - 0.04, h: ch - 0.04, fill: { color: riskColors[gi][ai] } });
s.addText(riskLabels[gi][ai], { x: gx0 + ai * cw, y: gy0 + gi * ch, w: cw - 0.04, h: ch - 0.04, fontSize: 9.5, bold: true, color: C.white, align: "center", fontFace: "Calibri", valign: "middle" });
});
});
s.addText("Albuminuria Category (ACR mg/g Cr)", {
x: gx0, y: gy0 - 0.78, w: 6.9, h: 0.24, fontSize: 8.5, bold: true, color: C.navy, fontFace: "Calibri", align: "center",
});
s.addText("GFR Category", {
x: 0.22, y: gy0, w: 2.0, h: 3.1, fontSize: 8.5, bold: true, color: C.navy, fontFace: "Calibri", align: "center", valign: "middle", rotate: 270,
});
s.addText("Green = Low risk | Yellow = Moderate risk | Orange/Red = High to Very High risk for CKD progression & CV events", {
x: 0.22, y: 5.18, w: 9.56, h: 0.2, fontSize: 8, italic: true, color: C.navy, fontFace: "Calibri", align: "center",
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 12 – KEY FORMULAS SUMMARY
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.navy } });
addHeader(s, "Key Formulas & Quick Reference", "High-yield summary for exams");
addFooter(s, 12, TOTAL);
const formulas = [
{ label: "SNGFR", eq: "Kf × [(Pgc − Pbs) − (πgc − πbs)]", note: "Net ultrafiltration pressure ≈ 10 mmHg" },
{ label: "Clearance", eq: "C = (U × V) / P", note: "Gold standard: inulin clearance = true GFR" },
{ label: "Cockcroft-Gault", eq: "(140 − age) × Wt / (Cr × 72) × 0.85 if F", note: "Estimates CrCl; widely used for drug dosing" },
{ label: "MDRD", eq: "175 × SCr⁻¹·¹⁵⁴ × age⁻⁰·²⁰³ × 0.742(F) × 1.212(B)", note: "Inaccurate when GFR > 60; replaced by CKD-EPI" },
{ label: "CKD-EPI Cr 2009", eq: "141 × min(Scr/κ,1)ᵅ × max(Scr/κ,1)⁻¹·²⁰⁹ × 0.993ᵃᵍᵉ", note: "Current standard; κ = 0.7 (F), 0.9 (M); α = −0.329 (F), −0.411 (M)" },
];
formulas.forEach((f, i) => {
const fy = 0.92 + i * 0.85;
card(s, 0.22, fy, 9.56, 0.8, C.darkCard);
s.addShape(pres.ShapeType.rect, { x: 0.22, y: fy, w: 1.6, h: 0.8, fill: { color: C.teal } });
s.addText(f.label, { x: 0.22, y: fy, w: 1.6, h: 0.8, fontSize: 10, bold: true, color: C.white, align: "center", valign: "middle", fontFace: "Calibri" });
s.addText(f.eq, { x: 1.9, y: fy + 0.04, w: 5.1, h: 0.42, fontSize: 10.5, bold: true, color: C.gold, fontFace: "Calibri", margin: 0 });
s.addText(f.note, { x: 1.9, y: fy + 0.46, w: 7.8, h: 0.28, fontSize: 9, color: C.gray, fontFace: "Calibri", italic: true, margin: 0 });
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 13 – SUMMARY & TAKE-HOME MESSAGES
// ═══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.navy } });
// bottom teal band
s.addShape(pres.ShapeType.rect, { x: 0, y: 4.8, w: 10, h: 0.825, fill: { color: C.teal } });
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.18, h: 5.625, fill: { color: C.gold } });
s.addText("Take-Home Messages", {
x: 0.35, y: 0.18, w: 9.3, h: 0.55, fontSize: 22, bold: true, color: C.gold, fontFace: "Calibri", charSpacing: 1,
});
const msgs = [
{ n: "01", msg: "GFR is the most reliable index of renal function — it reflects the total filtration capacity of all functioning nephrons." },
{ n: "02", msg: "SNGFR is driven by the net ultrafiltration pressure (Kf × ΔP − Δπ). Filtration equilibrium is NOT reached in healthy glomeruli." },
{ n: "03", msg: "True GFR cannot be measured directly in humans. Inulin clearance is the gold standard; eGFR equations (CKD-EPI) are used clinically." },
{ n: "04", msg: "CKD-EPI creatinine (2009) is the current first-line eGFR equation. Add cystatin C for confirmatory or high-stakes decisions." },
{ n: "05", msg: "KDIGO classifies CKD into G1–G5 by GFR and A1–A3 by albuminuria. Both independently predict progression and cardiovascular mortality." },
{ n: "06", msg: "GFR < 60 mL/min/1.73m² triggers drug dose adjustment reviews. NSAIDs, contrast, and aminoglycosides are high-risk in CKD." },
{ n: "07", msg: "GFR rises ~50% in pregnancy — normal serum Cr falls; standard eGFR equations are unreliable during pregnancy." },
];
msgs.forEach((m, i) => {
const col = i < 4 ? 0 : 1;
const row = col === 0 ? i : i - 4;
const cx = 0.28 + col * 5.0;
const cy = 0.88 + row * 0.84;
s.addShape(pres.ShapeType.rect, { x: cx, y: cy, w: 0.44, h: 0.7, fill: { color: C.teal } });
s.addText(m.n, { x: cx, y: cy, w: 0.44, h: 0.7, fontSize: 11, bold: true, color: C.white, align: "center", valign: "middle", fontFace: "Calibri" });
s.addText(m.msg, { x: cx + 0.5, y: cy + 0.04, w: 4.3, h: 0.62, fontSize: 9.5, color: C.white, fontFace: "Calibri", margin: 0, lineSpacingMultiple: 1.15 });
});
s.addText("Sources: Comprehensive Clinical Nephrology 7e | Brenner & Rector's The Kidney | NKF Primer on Kidney Diseases 8e | Tietz Lab Medicine 7e", {
x: 0.2, y: 4.84, w: 9.5, h: 0.3, fontSize: 8.5, color: C.white, fontFace: "Calibri", align: "center",
});
}
// ── WRITE FILE ─────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/gfr-ppt/GFR_Presentation.pptx" })
.then(() => console.log("Done: GFR_Presentation.pptx"))
.catch(e => { console.error(e); process.exit(1); });
cd /home/daytona/workspace/gfr-ppt && node gfr.js 2>&1
ls -lh /home/daytona/workspace/gfr-ppt/GFR_Presentation.pptx
GFR Presentation
Presentation · PPTX
| # | Slide |
|---|---|
| 1 | Title slide |
| 2 | What is GFR? — definition, normal values, key facts |
| 3 | Starling Forces & SNGFR — Kf formula with all variables |
| 4 | Glomerular Filtration Barrier — 3-layer barrier + size/charge selectivity table |
| 5 | Measured GFR (mGFR) — ideal marker criteria + exogenous/endogenous marker comparison |
| 6 | Estimated GFR (eGFR) — creatinine vs cystatin C + all equations (CG, MDRD, CKD-EPI) |
| 7 | CKD Staging — full KDIGO G1–G5 color-coded table with clinical actions |
| 8 | Regulation of GFR — 6 mechanisms (myogenic, TGF, RAAS, SNS, prostaglandins, ANP) |
| 9 | GFR across the lifespan — aging, pregnancy, low birth weight, hyperfiltration states |
| 10 | Clinical Implications — drug dosing, CKD diagnosis, complication thresholds |
| 11 | GFR + Albuminuria Risk Heat Map — KDIGO combined prognosis grid |
| 12 | Key Formulas Quick Reference — exam-ready cheat sheet |
| 13 | Take-Home Messages — 7 high-yield bullets |