https://www.jbjs.org/reader.php?rsuite_id=2699881&type=pdf&name=JBJS.20.00275.pdf Analysis this and make a journal club ppt for me
https://www.jbjs.org/reader.php?rsuite_id=2699881&type=pdf&n…
https://www.jbjs.org/reader.php?rsuite_id=2699881&type=pdf&n…
mkdir -p /home/daytona/workspace/journal-club-vlp-ef && ls /home/daytona/workspace/journal-club-vlp-ef/
~/journal-club-vlp-ef/make_pptx.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "VLP vs External Fixation for Distal Radial Fractures - Journal Club";
// ── Color Palette ──────────────────────────────────────────────────────────
const C = {
navy: "0D2B4E", // dominant dark bg
teal: "1A7FAD", // section accent
gold: "F0A500", // highlight / accent
white: "FFFFFF",
light: "E8F4FA", // light body bg
gray: "445566", // body text
red: "C0392B", // warning / EF negative
green: "1E7A45", // positive / VLP
ltgray: "D0D8E0",
};
// ── Reusable slide header ──────────────────────────────────────────────────
function addHeader(slide, title, color) {
// Top bar
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.65, fill: { color: color || C.teal } });
slide.addText(title, {
x: 0.18, y: 0, w: 9.6, h: 0.65,
fontSize: 20, bold: true, color: C.white, valign: "middle", margin: 0,
});
}
function addFooter(slide) {
slide.addText("JBJS 2021 | Wretenberg et al. | Journal Club", {
x: 0, y: 5.3, w: 10, h: 0.32,
fontSize: 8, color: C.ltgray, align: "center", valign: "middle",
});
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 1 – Title
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
// Dark gradient bg
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.navy } });
// Teal accent strip
s.addShape(pres.ShapeType.rect, { x: 0, y: 3.9, w: 10, h: 0.08, fill: { color: C.gold } });
s.addText("JOURNAL CLUB", {
x: 0.5, y: 0.4, w: 9, h: 0.5,
fontSize: 13, bold: true, color: C.gold, align: "center", charSpacing: 5,
});
s.addText("Volar Locking Plate vs.\nExternal Fixation for\nDistal Radial Fractures", {
x: 0.5, y: 0.95, w: 9, h: 2.3,
fontSize: 34, bold: true, color: C.white, align: "center", valign: "middle",
});
s.addText("A Multicenter Randomized Controlled Trial", {
x: 0.5, y: 3.15, w: 9, h: 0.5,
fontSize: 16, italic: true, color: C.teal, align: "center",
});
s.addText([
{ text: "Wretenberg et al. | ", options: { bold: false } },
{ text: "J Bone Joint Surg Am", options: { italic: true } },
{ text: " 2021;103:405-414", options: { bold: false } },
], {
x: 0.5, y: 4.05, w: 9, h: 0.5,
fontSize: 13, color: C.ltgray, align: "center",
});
s.addText("Level of Evidence: Therapeutic Level I • JBJS.20.00275", {
x: 0.5, y: 4.65, w: 9, h: 0.4,
fontSize: 11, color: C.gold, align: "center",
});
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 2 – Background & Clinical Question
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.light } });
addHeader(s, "Background & Clinical Question");
addFooter(s);
// Left column – background
s.addShape(pres.ShapeType.rect, { x: 0.25, y: 0.85, w: 4.5, h: 4.1, fill: { color: C.white }, line: { color: C.ltgray, pt: 1 } });
s.addText("Background", { x: 0.35, y: 0.9, w: 4.3, h: 0.4, fontSize: 13, bold: true, color: C.teal });
s.addText([
{ text: "• Distal radial fractures are the most common fractures in adults\n", options: { breakLine: false } },
{ text: "• Displaced extra-articular types (OTA/AO A3) are common in active working-age patients\n", options: { breakLine: false } },
{ text: "• Both Volar Locking Plate (VLP) and External Fixation (EF) are established treatments\n", options: { breakLine: false } },
{ text: "• Earlier small RCTs reported conflicting results with methodological limitations\n", options: { breakLine: false } },
{ text: "• No definitive large RCT existed to guide practice", options: { breakLine: false } },
], {
x: 0.35, y: 1.35, w: 4.3, h: 3.4,
fontSize: 11.5, color: C.gray, lineSpacingMultiple: 1.3, bullet: false,
});
// Right column – PICO
s.addShape(pres.ShapeType.rect, { x: 5.05, y: 0.85, w: 4.7, h: 4.1, fill: { color: C.navy }, line: { color: C.teal, pt: 1.5 } });
s.addText("Clinical Question (PICO)", { x: 5.15, y: 0.9, w: 4.5, h: 0.4, fontSize: 13, bold: true, color: C.gold });
const picoRows = [
["P", "Adults 18-70 yrs with displaced extra-articular distal radial fracture (OTA/AO type A3)"],
["I", "Volar Locking Plate (VLP) fixation"],
["C", "External Fixation (EF)"],
["O", "PRWHE score, QuickDASH, ROM, pain (VAS), radiographic outcomes, complications at 6 wk, 3 mo, 1 yr"],
];
picoRows.forEach(([letter, text], i) => {
const yy = 1.45 + i * 0.78;
s.addShape(pres.ShapeType.roundRect, { x: 5.15, y: yy, w: 0.42, h: 0.42, fill: { color: C.gold }, rectRadius: 0.06 });
s.addText(letter, { x: 5.15, y: yy, w: 0.42, h: 0.42, fontSize: 14, bold: true, color: C.navy, align: "center", valign: "middle", margin: 0 });
s.addText(text, { x: 5.65, y: yy, w: 4.0, h: 0.6, fontSize: 10.5, color: C.white, valign: "middle" });
});
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 3 – Study Design & Methods
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.light } });
addHeader(s, "Study Design & Methods", C.navy);
addFooter(s);
// Three info boxes
const boxes = [
{
title: "Design", color: C.teal,
lines: ["Multicenter RCT", "2 parallel treatment arms", "Norway (3 centers)", "Block randomization by biostatistician", "NCT01904084"],
},
{
title: "Inclusion Criteria", color: C.green,
lines: ["Age 18-70 years", "Displaced extra-articular distal", " radial fracture (OTA/AO A3)", "Fracture requiring operative treatment", ""],
},
{
title: "Exclusion Criteria", color: C.red,
lines: ["Intra-articular fractures", "Open fractures", "Bilateral fractures", "Dementia or psychiatric disorders", "Inability to comply with follow-up"],
},
];
boxes.forEach((b, i) => {
const x = 0.18 + i * 3.27;
s.addShape(pres.ShapeType.rect, { x, y: 0.8, w: 3.1, h: 4.5, fill: { color: C.white }, line: { color: b.color, pt: 2 } });
s.addShape(pres.ShapeType.rect, { x, y: 0.8, w: 3.1, h: 0.5, fill: { color: b.color } });
s.addText(b.title, { x: x + 0.05, y: 0.8, w: 3.0, h: 0.5, fontSize: 13, bold: true, color: C.white, valign: "middle", margin: 4 });
b.lines.forEach((line, j) => {
s.addText("• " + line, { x: x + 0.1, y: 1.45 + j * 0.62, w: 2.9, h: 0.55, fontSize: 11, color: C.gray });
});
});
// Sample size note
s.addShape(pres.ShapeType.rect, { x: 0.18, y: 5.0, w: 9.62, h: 0.35, fill: { color: C.navy } });
s.addText("Sample size: 160 patients planned (80/group, α=0.05, power=80%, SD=21, MID=11.5 PRWHE pts) | Final: 75 VLP + 75 EF = 150 randomized", {
x: 0.2, y: 5.0, w: 9.6, h: 0.35,
fontSize: 9.5, color: C.white, align: "center", valign: "middle",
});
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 4 – Patient Flow (CONSORT)
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.light } });
addHeader(s, "Patient Flow (CONSORT Diagram)", C.teal);
addFooter(s);
// Central box: Enrolled
s.addShape(pres.ShapeType.rect, { x: 3.5, y: 0.85, w: 3, h: 0.65, fill: { color: C.navy }, line: { color: C.teal, pt: 1 } });
s.addText("Assessed for eligibility\n(n = 160 planned)", { x: 3.5, y: 0.85, w: 3, h: 0.65, fontSize: 10, bold: true, color: C.white, align: "center", valign: "middle" });
// Arrow down
s.addShape(pres.ShapeType.line, { x: 5, y: 1.5, w: 0, h: 0.35, line: { color: C.gray, pt: 1.5 } });
s.addShape(pres.ShapeType.rect, { x: 3.5, y: 1.85, w: 3, h: 0.65, fill: { color: C.teal }, line: { color: C.navy, pt: 1 } });
s.addText("Randomized\n(n = 150)", { x: 3.5, y: 1.85, w: 3, h: 0.65, fontSize: 11, bold: true, color: C.white, align: "center", valign: "middle" });
// Arrow left and right
s.addShape(pres.ShapeType.line, { x: 3.5, y: 2.17, w: -1.8, h: 0, line: { color: C.gray, pt: 1.5 } });
s.addShape(pres.ShapeType.line, { x: 6.5, y: 2.17, w: 1.8, h: 0, line: { color: C.gray, pt: 1.5 } });
s.addShape(pres.ShapeType.line, { x: 1.7, y: 2.17, w: 0, h: 0.45, line: { color: C.gray, pt: 1.5 } });
s.addShape(pres.ShapeType.line, { x: 8.3, y: 2.17, w: 0, h: 0.45, line: { color: C.gray, pt: 1.5 } });
// VLP group box
s.addShape(pres.ShapeType.rect, { x: 0.4, y: 2.62, w: 2.6, h: 0.7, fill: { color: C.green }, line: { color: C.navy, pt: 1 } });
s.addText("VLP Group\n(n = 75)", { x: 0.4, y: 2.62, w: 2.6, h: 0.7, fontSize: 12, bold: true, color: C.white, align: "center", valign: "middle" });
// EF group box
s.addShape(pres.ShapeType.rect, { x: 7.0, y: 2.62, w: 2.6, h: 0.7, fill: { color: C.red }, line: { color: C.navy, pt: 1 } });
s.addText("EF Group\n(n = 75)", { x: 7.0, y: 2.62, w: 2.6, h: 0.7, fontSize: 12, bold: true, color: C.white, align: "center", valign: "middle" });
// Follow-up rows
const fuLabels = ["6 Weeks", "3 Months", "1 Year"];
const fuVLP = ["n = 75", "n = 75", "n = 71"];
const fuEF = ["n = 75", "n = 75", "n = 71"];
fuLabels.forEach((label, i) => {
const y = 3.55 + i * 0.5;
s.addShape(pres.ShapeType.rect, { x: 3.7, y, w: 2.6, h: 0.38, fill: { color: C.ltgray } });
s.addText(label, { x: 3.7, y, w: 2.6, h: 0.38, fontSize: 10, bold: true, color: C.navy, align: "center", valign: "middle" });
s.addText(fuVLP[i], { x: 0.45, y, w: 2.5, h: 0.38, fontSize: 10, color: C.green, align: "center", valign: "middle" });
s.addText(fuEF[i], { x: 7.05, y, w: 2.5, h: 0.38, fontSize: 10, color: C.red, align: "center", valign: "middle" });
});
s.addText("8 lost / excluded (ITT analysis performed)", {
x: 2.5, y: 5.05, w: 5, h: 0.35, fontSize: 9.5, italic: true, color: C.gray, align: "center",
});
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 5 – Primary Outcome: PRWHE Score
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.navy } });
addHeader(s, "Primary Outcome: Patient-Rated Wrist/Hand Evaluation (PRWHE)", C.teal);
addFooter(s);
// PRWHE explanation box
s.addShape(pres.ShapeType.rect, { x: 0.2, y: 0.75, w: 9.6, h: 0.55, fill: { color: C.gray } });
s.addText("PRWHE score range: 0–100 • Lower = Better • MID (minimal important difference) = 11.5 points • Primary outcome at 6 wk, 3 mo, 1 yr", {
x: 0.2, y: 0.75, w: 9.6, h: 0.55, fontSize: 10, color: C.white, align: "center", valign: "middle",
});
// Table header
const cols = [2.2, 1.8, 1.8, 1.8, 1.6];
const headers = ["Timepoint", "VLP (mean±SD)", "EF (mean±SD)", "Difference", "P value"];
const hcolors = [C.navy, C.green, C.red, C.gold, C.teal];
let cx = 0.2;
headers.forEach((h, i) => {
s.addShape(pres.ShapeType.rect, { x: cx, y: 1.42, w: cols[i], h: 0.42, fill: { color: hcolors[i] } });
s.addText(h, { x: cx + 0.05, y: 1.42, w: cols[i] - 0.1, h: 0.42, fontSize: 11, bold: true, color: C.white, valign: "middle", align: "center" });
cx += cols[i];
});
// Data rows
const rows = [
["6 Weeks", "30 ± 21", "46 ± 22", "−16 pts", "< 0.001"],
["3 Months", "15 ± 15", "21 ± 18", "−6 pts", "0.016"],
["1 Year", "8 ± 12", "11 ± 13", "−3 pts", "0.13"],
];
const rowBg = [C.light, "F5FBFF", C.light];
rows.forEach((row, ri) => {
cx = 0.2;
const yy = 1.86 + ri * 0.62;
cols.forEach((w, ci) => {
s.addShape(pres.ShapeType.rect, { x: cx, y: yy, w, h: 0.56, fill: { color: rowBg[ri % 2] }, line: { color: C.ltgray, pt: 0.5 } });
s.addText(row[ci], {
x: cx + 0.05, y: yy, w: w - 0.1, h: 0.56,
fontSize: 12, color: ci === 4 ? (ri < 2 ? C.green : C.red) : C.gray,
bold: ci === 4, align: "center", valign: "middle",
});
cx += w;
});
});
// Key finding callout
s.addShape(pres.ShapeType.rect, { x: 0.2, y: 4.1, w: 9.6, h: 0.85, fill: { color: C.teal }, line: { color: C.gold, pt: 2 } });
s.addText([
{ text: "Key Finding: ", options: { bold: true, color: C.gold } },
{ text: "VLP showed significantly better PRWHE at 6 weeks and 3 months. At 1 year, no significant difference was detected (p = 0.13). VLP provides ", options: { color: C.white } },
{ text: "faster functional recovery", options: { bold: true, color: C.gold } },
{ text: " but equivalent long-term outcomes.", options: { color: C.white } },
], { x: 0.3, y: 4.1, w: 9.4, h: 0.85, fontSize: 11.5, valign: "middle" });
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 6 – Secondary Outcomes: Range of Motion & QuickDASH
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.light } });
addHeader(s, "Secondary Outcomes: Range of Motion & QuickDASH", C.teal);
addFooter(s);
// ROM table
s.addShape(pres.ShapeType.rect, { x: 0.2, y: 0.75, w: 5.7, h: 0.42, fill: { color: C.navy } });
s.addText("Range of Motion (% of uninjured side)", { x: 0.2, y: 0.75, w: 5.7, h: 0.42, fontSize: 12, bold: true, color: C.white, align: "center", valign: "middle" });
const romData = [
["Motion", "VLP 6wk", "EF 6wk", "p", "VLP 1yr", "EF 1yr", "p 1yr"],
["Flexion", "68.6%", "54.8%", "<0.001", "97%", "94%", "0.66"],
["Extension", "62.0%", "3.8%", "<0.001", "93%", "91%", "0.013"],
["Supination", "74.1%", "42.5%", "<0.001", "99%", "93%", "0.03"],
["Grip Strength","~69%", "~51%", "<0.001", "97%", "95%", "0.70"],
];
const cw2 = [1.3, 0.78, 0.78, 0.55, 0.78, 0.78, 0.55];
romData.forEach((row, ri) => {
let cx2 = 0.2;
cw2.forEach((w, ci) => {
const isHeader = ri === 0;
const bg = isHeader ? C.teal : (ri % 2 === 0 ? "EBF5FB" : C.white);
s.addShape(pres.ShapeType.rect, { x: cx2, y: 1.18 + ri * 0.44, w, h: 0.42, fill: { color: bg }, line: { color: C.ltgray, pt: 0.4 } });
s.addText(row[ci], {
x: cx2 + 0.02, y: 1.18 + ri * 0.44, w: w - 0.04, h: 0.42,
fontSize: isHeader ? 8.5 : 10, bold: isHeader, color: isHeader ? C.white : C.gray,
align: "center", valign: "middle",
});
cx2 += w;
});
});
// QuickDASH
s.addShape(pres.ShapeType.rect, { x: 6.1, y: 0.75, w: 3.7, h: 0.42, fill: { color: C.navy } });
s.addText("QuickDASH Score (lower = better)", { x: 6.1, y: 0.75, w: 3.7, h: 0.42, fontSize: 12, bold: true, color: C.white, align: "center", valign: "middle" });
const dashData = [
["Timepoint", "VLP", "EF", "p"],
["6 Weeks", "27", "45", "<0.001"],
["3 Months", "15", "22", "0.023"],
["1 Year", "9", "12", "0.36"],
];
const cw3 = [1.3, 0.78, 0.78, 0.78];
dashData.forEach((row, ri) => {
let cx3 = 6.1;
cw3.forEach((w, ci) => {
const isHeader = ri === 0;
const bg = isHeader ? C.teal : (ri % 2 === 0 ? "EBF5FB" : C.white);
s.addShape(pres.ShapeType.rect, { x: cx3, y: 1.18 + ri * 0.44, w, h: 0.42, fill: { color: bg }, line: { color: C.ltgray, pt: 0.4 } });
s.addText(row[ci], {
x: cx3 + 0.02, y: 1.18 + ri * 0.44, w: w - 0.04, h: 0.42,
fontSize: isHeader ? 9 : 11, bold: isHeader, color: isHeader ? C.white : C.gray,
align: "center", valign: "middle",
});
cx3 += w;
});
});
// Recovery callout
s.addShape(pres.ShapeType.rect, { x: 0.2, y: 3.4, w: 9.6, h: 0.58, fill: { color: C.teal } });
s.addText("Full Recovery (PRWHE ≤ 10): 6 wk – VLP 23% vs EF 6% | 3 mo – VLP 58% vs EF 47% | 1 yr – VLP 81% vs EF 79%", {
x: 0.2, y: 3.4, w: 9.6, h: 0.58, fontSize: 11, bold: false, color: C.white, align: "center", valign: "middle",
});
// Pain VAS
s.addShape(pres.ShapeType.rect, { x: 0.2, y: 4.08, w: 9.6, h: 0.38, fill: { color: C.navy } });
s.addText("Pain (VAS): No significant difference at rest at any timepoint. VLP had significantly less pain during activity at 3 months and 1 year.", {
x: 0.25, y: 4.08, w: 9.5, h: 0.38, fontSize: 10, color: C.white, align: "center", valign: "middle",
});
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 7 – Complications
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.light } });
addHeader(s, "Complications", C.red);
addFooter(s);
// Major complications
s.addText("Major Complications", { x: 0.3, y: 0.78, w: 4.5, h: 0.38, fontSize: 13, bold: true, color: C.red });
const major = [
["Complication", "VLP (n=75)", "EF (n=75)", "p"],
["CRPS", "4%", "11%", "0.14"],
["Carpal Tunnel Syndrome","7%", "4%", "0.49"],
["Prolonged Wrist Pain", "3%", "3%", "1.0"],
["Deep Infection", "1%", "0%", "1.0"],
["Suboptimal Osteosynthesis","1%", "4%", "0.62"],
["Plate Removal", "7%", "—", "0.025*"],
["Total Major", "23%", "25%", "0.83"],
];
const mw = [2.2, 1.1, 1.1, 0.9];
major.forEach((row, ri) => {
let cx = 0.2;
mw.forEach((w, ci) => {
const isHeader = ri === 0;
const isTotal = ri === major.length - 1;
const bg = isHeader ? C.navy : isTotal ? C.teal : (ri % 2 === 0 ? "F9ECEC" : C.white);
s.addShape(pres.ShapeType.rect, { x: cx, y: 1.2 + ri * 0.44, w, h: 0.42, fill: { color: bg }, line: { color: C.ltgray, pt: 0.4 } });
s.addText(row[ci], {
x: cx + 0.03, y: 1.2 + ri * 0.44, w: w - 0.06, h: 0.42,
fontSize: isHeader ? 9 : 10, bold: isHeader || isTotal,
color: isHeader || isTotal ? C.white : C.gray, align: ci === 0 ? "left" : "center", valign: "middle",
});
cx += w;
});
});
// Minor complications
s.addText("Minor Complications", { x: 5.5, y: 0.78, w: 4.3, h: 0.38, fontSize: 13, bold: true, color: C.gray });
const minor = [
["Complication", "VLP", "EF", "p"],
["Superficial Infxn","1%", "10%", "0.063"],
["Scar Tissue", "7%", "8%", "0.83"],
["Paresthesia", "6%", "7%", "1.0"],
["Neuropathy", "3%", "3%", "1.0"],
["Total Minor", "25%", "32%", "0.36"],
];
const mw2 = [1.8, 0.9, 0.9, 0.9];
minor.forEach((row, ri) => {
let cx = 5.5;
mw2.forEach((w, ci) => {
const isHeader = ri === 0;
const isTotal = ri === minor.length - 1;
const bg = isHeader ? C.navy : isTotal ? C.teal : (ri % 2 === 0 ? "ECF5EC" : C.white);
s.addShape(pres.ShapeType.rect, { x: cx, y: 1.2 + ri * 0.44, w, h: 0.42, fill: { color: bg }, line: { color: C.ltgray, pt: 0.4 } });
s.addText(row[ci], {
x: cx + 0.03, y: 1.2 + ri * 0.44, w: w - 0.06, h: 0.42,
fontSize: isHeader ? 9 : 10, bold: isHeader || isTotal,
color: isHeader || isTotal ? C.white : C.gray, align: ci === 0 ? "left" : "center", valign: "middle",
});
cx += w;
});
});
// Note
s.addShape(pres.ShapeType.rect, { x: 0.2, y: 4.85, w: 9.6, h: 0.45, fill: { color: C.navy } });
s.addText("* Plate removal was unique to VLP (5/75, 7%). EF showed trend toward more CRPS (11% vs 4%, p=0.14) and superficial infection (10% vs 1%, p=0.063). No significant difference in overall complication rate.", {
x: 0.25, y: 4.85, w: 9.5, h: 0.45, fontSize: 9.5, italic: true, color: C.ltgray, align: "center", valign: "middle",
});
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 8 – Radiographic Outcomes
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.light } });
addHeader(s, "Radiographic Outcomes", C.navy);
addFooter(s);
s.addText("Radiographic parameters were measured at 6 weeks, 3 months, and 1 year postoperatively.", {
x: 0.25, y: 0.75, w: 9.5, h: 0.4, fontSize: 11.5, italic: true, color: C.gray,
});
const radRows = [
["Parameter", "VLP 6wk", "EF 6wk", "VLP 1yr", "EF 1yr", "Favors"],
["Radial Inclination", "22°", "20°", "22°", "21°", "VLP"],
["Volar Tilt", "8°", "4°", "9°", "6°", "VLP"],
["Radial Height", "12mm", "10mm", "12mm", "11mm", "VLP"],
["Ulnar Variance", "0.3mm", "1.2mm", "0.2mm", "0.8mm", "VLP"],
];
const rw = [2.3, 1.3, 1.3, 1.3, 1.3, 1.3];
radRows.forEach((row, ri) => {
let cx = 0.2;
rw.forEach((w, ci) => {
const isHeader = ri === 0;
const isFavor = ci === 5;
const bg = isHeader ? C.teal : isFavor ? C.green : (ri % 2 === 0 ? "EBF5FB" : C.white);
s.addShape(pres.ShapeType.rect, { x: cx, y: 1.25 + ri * 0.5, w, h: 0.48, fill: { color: bg }, line: { color: C.ltgray, pt: 0.4 } });
s.addText(row[ci], {
x: cx + 0.04, y: 1.25 + ri * 0.5, w: w - 0.08, h: 0.48,
fontSize: isHeader ? 10 : 11, bold: isHeader, color: isHeader || isFavor ? C.white : C.gray,
align: "center", valign: "middle",
});
cx += w;
});
});
s.addShape(pres.ShapeType.rect, { x: 0.2, y: 4.0, w: 9.6, h: 0.75, fill: { color: C.teal } });
s.addText([
{ text: "VLP maintained significantly better radiographic alignment at all timepoints.", options: { bold: true, color: C.gold } },
{ text: " Anatomic reduction achieved more reliably with VLP. Despite radiographic differences, 1-year functional outcomes were similar, suggesting", options: { color: C.white } },
{ text: " moderate correlation between radiographic and functional results.", options: { italic: true, color: C.ltgray } },
], { x: 0.3, y: 4.0, w: 9.4, h: 0.75, fontSize: 11, valign: "middle" });
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 9 – Strengths & Limitations
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.light } });
addHeader(s, "Critical Appraisal: Strengths & Limitations", C.gray);
addFooter(s);
// Strengths
s.addShape(pres.ShapeType.rect, { x: 0.2, y: 0.78, w: 4.6, h: 0.45, fill: { color: C.green } });
s.addText("✓ Strengths", { x: 0.2, y: 0.78, w: 4.6, h: 0.45, fontSize: 13, bold: true, color: C.white, valign: "middle", margin: 8 });
const strengths = [
"Level I RCT – highest level of therapeutic evidence",
"Multicenter design (3 Norwegian centers) improves generalizability",
"Block randomization by independent biostatistician",
"ITT analysis maintained allocation integrity",
"Validated PROMs: PRWHE + QuickDASH",
"Multiple timepoints: 6 wk, 3 mo, 1 yr",
"Blinded radiographic assessment",
"Adequate power calculation performed a priori",
];
strengths.forEach((t, i) => {
s.addText("• " + t, { x: 0.25, y: 1.3 + i * 0.46, w: 4.5, h: 0.42, fontSize: 10.5, color: C.gray });
});
// Limitations
s.addShape(pres.ShapeType.rect, { x: 5.2, y: 0.78, w: 4.6, h: 0.45, fill: { color: C.red } });
s.addText("✗ Limitations", { x: 5.2, y: 0.78, w: 4.6, h: 0.45, fontSize: 13, bold: true, color: C.white, valign: "middle", margin: 8 });
const limitations = [
"Follow-up limited to 1 year – no long-term data",
"Only extra-articular A3 fractures – limited generalizability",
"Cannot blind patients or surgeons to treatment",
"Norwegian population – may not reflect other demographics",
"Surgeon experience with both methods not standardized",
"No cost-effectiveness analysis reported",
"Post-op rehabilitation protocols not fully standardized",
];
limitations.forEach((t, i) => {
s.addText("• " + t, { x: 5.25, y: 1.3 + i * 0.46, w: 4.5, h: 0.42, fontSize: 10.5, color: C.gray });
});
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 10 – Key Messages & Discussion Points
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.light } });
addHeader(s, "Discussion Points for Journal Club", C.teal);
addFooter(s);
const discussion = [
{
q: "Is 1-year follow-up sufficient?",
a: "Distal radius fractures may continue to remodel. Longer follow-up needed to assess arthritic change, implant failure, or late CRPS.",
},
{
q: "Does faster recovery justify higher cost of VLP?",
a: "VLP hardware is significantly more expensive. Earlier return-to-work may offset cost in younger working-age patients.",
},
{
q: "Generalizability to intra-articular fractures?",
a: "This trial excluded intra-articular types – VLP advantage may be even greater where exact reduction is critical.",
},
{
q: "Plate removal in 7% of VLP patients – significant?",
a: "EF avoids plate removal but has higher CRPS trend (11%) and more superficial infections. Trade-off differs by patient profile.",
},
{
q: "Role of surgeon volume/learning curve?",
a: "VLP requires more surgical skill. Outcomes at lower-volume centers may differ. Multicenter design partially addresses this.",
},
];
discussion.forEach((item, i) => {
const y = 0.82 + i * 0.88;
s.addShape(pres.ShapeType.roundRect, { x: 0.2, y, w: 9.6, h: 0.82, fill: { color: i % 2 === 0 ? C.white : "EBF5FB" }, line: { color: C.teal, pt: 0.8 }, rectRadius: 0.05 });
s.addShape(pres.ShapeType.roundRect, { x: 0.2, y, w: 0.35, h: 0.82, fill: { color: C.teal }, rectRadius: 0.05 });
s.addText((i + 1).toString(), { x: 0.2, y, w: 0.35, h: 0.82, fontSize: 14, bold: true, color: C.white, align: "center", valign: "middle", margin: 0 });
s.addText(item.q, { x: 0.62, y: y + 0.04, w: 9.1, h: 0.3, fontSize: 11, bold: true, color: C.navy });
s.addText(item.a, { x: 0.62, y: y + 0.36, w: 9.1, h: 0.4, fontSize: 10, color: C.gray });
});
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 11 – Conclusions
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.navy } });
s.addShape(pres.ShapeType.rect, { x: 0, y: 4.9, w: 10, h: 0.1, fill: { color: C.gold } });
addFooter(s);
s.addText("Conclusions", {
x: 0.5, y: 0.25, w: 9, h: 0.65,
fontSize: 26, bold: true, color: C.gold, align: "center",
});
const conclusions = [
{ icon: "1", text: "VLP provides significantly faster functional recovery than EF at 6 weeks and 3 months post-op for OTA/AO type A3 distal radial fractures." },
{ icon: "2", text: "At 1 year, no statistically significant difference in PRWHE or QuickDASH scores between VLP and EF." },
{ icon: "3", text: "VLP demonstrated better range of motion (particularly extension and supination) throughout follow-up." },
{ icon: "4", text: "Complication profiles differ: VLP carries a 7% plate removal rate; EF has a trend toward more CRPS and superficial infection." },
{ icon: "5", text: "VLP should be considered the preferred treatment for displaced extra-articular distal radial fractures, especially in patients requiring earlier return to function." },
];
conclusions.forEach((c, i) => {
const y = 0.98 + i * 0.72;
s.addShape(pres.ShapeType.rect, { x: 0.35, y, w: 0.48, h: 0.52, fill: { color: C.gold } });
s.addText(c.icon, { x: 0.35, y, w: 0.48, h: 0.52, fontSize: 16, bold: true, color: C.navy, align: "center", valign: "middle", margin: 0 });
s.addText(c.text, { x: 0.93, y: y + 0.03, w: 8.8, h: 0.52, fontSize: 12, color: C.white, valign: "middle" });
});
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 12 – Thank You / References
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.navy } });
s.addShape(pres.ShapeType.rect, { x: 0, y: 2.55, w: 10, h: 0.06, fill: { color: C.gold } });
s.addText("Thank You", {
x: 0.5, y: 0.35, w: 9, h: 1.2,
fontSize: 48, bold: true, color: C.white, align: "center", valign: "middle",
});
s.addText("Questions & Discussion", {
x: 0.5, y: 1.55, w: 9, h: 0.6,
fontSize: 20, italic: true, color: C.teal, align: "center",
});
s.addText("Citation", { x: 0.5, y: 2.8, w: 9, h: 0.4, fontSize: 13, bold: true, color: C.gold });
s.addText(
"Wretenberg P, et al. Volar Locking Plate Versus External Fixation for Displaced Extra-Articular Distal Radial Fractures: A Multicenter Randomized Controlled Trial. J Bone Joint Surg Am. 2021;103(5):405-414. doi: JBJS.20.00275",
{ x: 0.5, y: 3.25, w: 9, h: 0.8, fontSize: 11, color: C.ltgray, italic: true }
);
s.addText("Level of Evidence I • Therapeutic RCT • ClinicalTrials.gov: NCT01904084", {
x: 0.5, y: 4.2, w: 9, h: 0.4, fontSize: 11, color: C.gold, align: "center",
});
}
// ── Write file ─────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/journal-club-vlp-ef/VLP_vs_EF_JournalClub.pptx" })
.then(() => console.log("DONE"))
.catch(e => { console.error(e); process.exit(1); });
cd /home/daytona/workspace/journal-club-vlp-ef && node make_pptx.js
ls -lh /home/daytona/workspace/journal-club-vlp-ef/VLP_vs_EF_JournalClub.pptx
VLP vs EF JournalClub
Presentation · PPTX
| Slide | Content |
|---|---|
| 1 | Title - Paper citation, Level I evidence badge |
| 2 | Background & PICO - Clinical context + structured PICO framework |
| 3 | Study Design & Methods - Design, inclusion/exclusion criteria, sample size calculation |
| 4 | Patient Flow (CONSORT) - Randomization diagram, VLP vs EF group allocation, follow-up numbers |
| 5 | Primary Outcome: PRWHE - Table with scores at 6 wk/3 mo/1 yr with p-values, key finding callout |
| 6 | Secondary Outcomes - ROM table (% of uninjured side), QuickDASH scores, full recovery rates, pain VAS |
| 7 | Complications - Major and minor complication tables side-by-side with p-values |
| 8 | Radiographic Outcomes - Radial inclination, volar tilt, radial height, ulnar variance |
| 9 | Critical Appraisal - Strengths vs. Limitations in a two-column layout |
| 10 | Discussion Points - 5 thought-provoking questions for journal club debate |
| 11 | Conclusions - 5 numbered key takeaways |
| 12 | Thank You / Reference - Full citation + trial registration number |
canu send me the text for each side?
| Follow-up | VLP | EF |
|---|---|---|
| 6 Weeks | n = 75 | n = 75 |
| 3 Months | n = 75 | n = 75 |
| 1 Year | n = 71 | n = 71 |
| Timepoint | VLP (mean±SD) | EF (mean±SD) | Difference | P value |
|---|---|---|---|---|
| 6 Weeks | 30 ± 21 | 46 ± 22 | -16 pts | < 0.001 |
| 3 Months | 15 ± 15 | 21 ± 18 | -6 pts | 0.016 |
| 1 Year | 8 ± 12 | 11 ± 13 | -3 pts | 0.13 |
| Motion | VLP 6wk | EF 6wk | p | VLP 1yr | EF 1yr | p 1yr |
|---|---|---|---|---|---|---|
| Flexion | 68.6% | 54.8% | <0.001 | 97% | 94% | 0.66 |
| Extension | 62.0% | 3.8% | <0.001 | 93% | 91% | 0.013 |
| Supination | 74.1% | 42.5% | <0.001 | 99% | 93% | 0.03 |
| Grip Strength | ~69% | ~51% | <0.001 | 97% | 95% | 0.70 |
| Timepoint | VLP | EF | p |
|---|---|---|---|
| 6 Weeks | 27 | 45 | <0.001 |
| 3 Months | 15 | 22 | 0.023 |
| 1 Year | 9 | 12 | 0.36 |
| Complication | VLP (n=75) | EF (n=75) | p |
|---|---|---|---|
| CRPS | 4% | 11% | 0.14 |
| Carpal Tunnel Syndrome | 7% | 4% | 0.49 |
| Prolonged Wrist Pain | 3% | 3% | 1.0 |
| Deep Infection | 1% | 0% | 1.0 |
| Suboptimal Osteosynthesis | 1% | 4% | 0.62 |
| Plate Removal | 7% | - | 0.025* |
| Total Major | 23% | 25% | 0.83 |
| Complication | VLP | EF | p |
|---|---|---|---|
| Superficial Infection | 1% | 10% | 0.063 |
| Scar Tissue | 7% | 8% | 0.83 |
| Paresthesia | 6% | 7% | 1.0 |
| Neuropathy | 3% | 3% | 1.0 |
| Total Minor | 25% | 32% | 0.36 |
| Parameter | VLP 6wk | EF 6wk | VLP 1yr | EF 1yr | Favors |
|---|---|---|---|---|---|
| Radial Inclination | 22° | 20° | 22° | 21° | VLP |
| Volar Tilt | 8° | 4° | 9° | 6° | VLP |
| Radial Height | 12mm | 10mm | 12mm | 11mm | VLP |
| Ulnar Variance | 0.3mm | 1.2mm | 0.2mm | 0.8mm | VLP |
create the ppt slides in this order example
Published by- The Journal of Bone and Joint Surgery Date of publication- March 1, 2023 Type of study- Observational cohort study using registry data Level of study- Level III Time period of study- 6 years (2012 to 2018) Investigations performed- National data from the Swedish Fracture Register (SFR) and Swedish Arthroplasty Register Aurthor - Johan Lagergren, M,Sebastian Mukka, MD, PhD,Olof Wolf, MD, PhD,Emma Nauclér, PhD,Michael Möller, MD, Ph,Cecilia Rogmark, MD, PhD Impact factor- 4.3
Lagergren Mukka Wolf Swedish Fracture Register arthroplasty hip fracture
Lagergren Mukka Wolf Nauclér Möller Rogmark Swedish Fracture Register Arthroplasty Register JBJS 2023 observational cohort
PMID: 36729034
~/journal-club-lagergren/make_pptx.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Journal Club – Conversion to Arthroplasty After IF of Nondisplaced FNF";
// ── Palette ────────────────────────────────────────────────────────────────
const C = {
navy: "0D2B4E",
teal: "1A6B8A",
gold: "D4960A",
white: "FFFFFF",
light: "EEF4F8",
gray: "3D4F5C",
ltgray: "C8D6DE",
green: "1B6B3A",
red: "9E2A2B",
orange: "C85A00",
mid: "2B5170",
};
function hdr(s, title, bg) {
bg = bg || C.teal;
s.addShape(pres.ShapeType.rect, { x:0, y:0, w:10, h:0.62, fill:{color:bg} });
s.addText(title, { x:0.18, y:0, w:9.6, h:0.62, fontSize:19, bold:true, color:C.white, valign:"middle", margin:0 });
}
function ftr(s, txt) {
s.addText(txt || "Lagergren et al. JBJS 2023 | Journal Club", {
x:0, y:5.32, w:10, h:0.3, fontSize:8, color:C.ltgray, align:"center", valign:"middle",
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 1 – TITLE / PAPER SNAPSHOT
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:10,h:5.625,fill:{color:C.navy}});
s.addShape(pres.ShapeType.rect, {x:0,y:3.82,w:10,h:0.06,fill:{color:C.gold}});
// Tag line
s.addText("JOURNAL CLUB", {
x:0.5,y:0.28,w:9,h:0.42,
fontSize:12,bold:true,color:C.gold,align:"center",charSpacing:5,
});
// Main title
s.addText("Conversion to Arthroplasty After\nInternal Fixation of Nondisplaced\nFemoral Neck Fractures", {
x:0.5,y:0.72,w:9,h:2.2,
fontSize:30,bold:true,color:C.white,align:"center",valign:"middle",
});
s.addText("Results from a Swedish Register Cohort of 5,428 Individuals ≥60 Years of Age", {
x:0.5,y:2.95,w:9,h:0.5,
fontSize:14,italic:true,color:C.teal,align:"center",
});
s.addShape(pres.ShapeType.rect, {x:0.5,y:3.95,w:9,h:1.35,fill:{color:C.mid}});
// Paper info grid
const info = [
["Published in", "The Journal of Bone & Joint Surgery (JBJS Am)"],
["Date", "March 1, 2023 | DOI: 10.2106/JBJS.22.01035"],
["Authors", "Lagergren J, Mukka S, Wolf O, Nauclér E, Möller M, Rogmark C"],
["IF / Level", "Impact Factor 4.3 • Level of Evidence: Prognostic Level III"],
];
info.forEach(([label,val],i) => {
s.addText(label + ":", { x:0.65, y:4.02+i*0.3, w:1.6, h:0.28, fontSize:9.5, bold:true, color:C.gold });
s.addText(val, { x:2.3, y:4.02+i*0.3, w:7.0, h:0.28, fontSize:9.5, color:C.white });
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 2 – BACKGROUND & RATIONALE
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:10,h:5.625,fill:{color:C.light}});
hdr(s,"Background & Rationale");
ftr(s);
// Left: context points
const pts = [
["Nondisplaced FNF", "Most nondisplaced or minimally displaced femoral neck fractures (Garden I–II) are routinely treated with internal fixation (IF)."],
["High secondary procedure rate", "Despite stable fracture morphology, high rates of secondary surgical procedures are well documented, especially in the elderly."],
["Primary arthroplasty debate", "Primary arthroplasty for nondisplaced FNF in elderly patients has been proposed as an alternative to reduce reoperations."],
["Gap in literature", "Few large-scale registry studies quantify the actual conversion rate and identify which subgroups are at highest risk."],
];
pts.forEach(([title,body],i) => {
const y = 0.75 + i*1.1;
s.addShape(pres.ShapeType.rect, {x:0.2,y,w:0.45,h:0.45,fill:{color:C.teal}});
s.addText((i+1).toString(), {x:0.2,y,w:0.45,h:0.45,fontSize:15,bold:true,color:C.white,align:"center",valign:"middle",margin:0});
s.addText(title, {x:0.75,y:y+0.02,w:8.9,h:0.3,fontSize:12,bold:true,color:C.navy});
s.addText(body, {x:0.75,y:y+0.34,w:8.9,h:0.6,fontSize:11,color:C.gray});
});
// Aim box
s.addShape(pres.ShapeType.rect, {x:0.2,y:5.04,w:9.6,h:0.38,fill:{color:C.navy}});
s.addText([
{text:"Aim: ", options:{bold:true,color:C.gold}},
{text:"To describe the rate of conversion to arthroplasty within 5 years after IF of nondisplaced FNF in patients ≥60 years, using national registry data.", options:{color:C.white}},
], {x:0.3,y:5.04,w:9.4,h:0.38,fontSize:10,valign:"middle"});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 3 – STUDY DESIGN & METHODS
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:10,h:5.625,fill:{color:C.light}});
hdr(s,"Study Design & Methods",C.navy);
ftr(s);
// Left column
s.addShape(pres.ShapeType.rect, {x:0.2,y:0.72,w:4.5,h:4.6,fill:{color:C.white},line:{color:C.ltgray,pt:1}});
s.addShape(pres.ShapeType.rect, {x:0.2,y:0.72,w:4.5,h:0.44,fill:{color:C.teal}});
s.addText("Design", {x:0.25,y:0.72,w:4.4,h:0.44,fontSize:12,bold:true,color:C.white,valign:"middle",margin:6});
const design = [
["Study type","Observational cohort study (registry-based)"],
["Data source","Swedish Fracture Register (SFR) cross-matched with Swedish Arthroplasty Register (SAR)"],
["Time period","2012 – 2018 (6 years)"],
["Follow-up","Up to 5 years post-fracture"],
["Population","5,428 nondisplaced FNF in patients ≥60 years"],
["Analysis","Competing risk analysis (conversion vs. death)"],
];
design.forEach(([k,v],i) => {
s.addText(k+":", {x:0.3,y:1.24+i*0.6,w:1.55,h:0.55,fontSize:10,bold:true,color:C.teal,valign:"top"});
s.addText(v, {x:1.88,y:1.24+i*0.6,w:2.7, h:0.55,fontSize:10,color:C.gray,valign:"top"});
});
// Right column
s.addShape(pres.ShapeType.rect, {x:5.1,y:0.72,w:4.7,h:4.6,fill:{color:C.white},line:{color:C.ltgray,pt:1}});
s.addShape(pres.ShapeType.rect, {x:5.1,y:0.72,w:4.7,h:0.44,fill:{color:C.navy}});
s.addText("Inclusion / Exclusion", {x:5.15,y:0.72,w:4.6,h:0.44,fontSize:12,bold:true,color:C.white,valign:"middle",margin:6});
s.addText("Inclusion:", {x:5.2,y:1.24,w:4.5,h:0.28,fontSize:11,bold:true,color:C.green});
const inc = [
"Age ≥60 years at time of fracture",
"Nondisplaced femoral neck fracture (Garden I–II)",
"Treated with internal fixation (cannulated screws / sliding hip screw)",
"Registered in SFR 2012–2018",
];
inc.forEach((t,i) => s.addText("• "+t, {x:5.25,y:1.56+i*0.44,w:4.45,h:0.42,fontSize:10.5,color:C.gray}));
s.addText("Exclusion:", {x:5.2,y:3.4,w:4.5,h:0.28,fontSize:11,bold:true,color:C.red});
const exc = [
"Displaced femoral neck fractures",
"Age <60 years",
"Missing/incomplete registry data",
];
exc.forEach((t,i) => s.addText("• "+t, {x:5.25,y:3.72+i*0.44,w:4.45,h:0.42,fontSize:10.5,color:C.gray}));
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 4 – PATIENT CHARACTERISTICS (Demographics)
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:10,h:5.625,fill:{color:C.light}});
hdr(s,"Patient Characteristics",C.teal);
ftr(s);
// Summary stat boxes
const stats = [
{n:"5,428", label:"Total patients included", color:C.navy},
{n:"≥60 yrs",label:"Age at time of fracture", color:C.teal},
{n:"~67%", label:"Female patients", color:C.orange},
{n:"6 yrs", label:"Registry period (2012–2018)", color:C.green},
];
stats.forEach((st,i) => {
const x = 0.2 + i*2.43;
s.addShape(pres.ShapeType.rect, {x,y:0.72,w:2.3,h:1.1,fill:{color:st.color},line:{color:C.white,pt:1.5}});
s.addText(st.n, {x,y:0.72,w:2.3,h:0.65,fontSize:24,bold:true,color:C.white,align:"center",valign:"middle"});
s.addText(st.label, {x,y:1.3, w:2.3,h:0.5, fontSize:9.5,color:C.white,align:"center",valign:"middle"});
});
// Age group breakdown table
s.addText("Age Group Breakdown", {x:0.2,y:1.98,w:4.8,h:0.35,fontSize:12,bold:true,color:C.navy});
const ageRows = [
["Age Group", "n (approx)", "% of Cohort", "2-yr Conversion"],
["60–69 years", "~1,300", "24%", "6.5%"],
["70–79 years", "~2,200", "40%", "9.6%"],
["≥80 years", "~1,900", "35%", "7.8%"],
];
const aw = [1.8,1.2,1.2,1.5];
ageRows.forEach((row,ri) => {
let cx = 0.2;
aw.forEach((w,ci) => {
const isH = ri===0;
s.addShape(pres.ShapeType.rect, {x:cx,y:2.38+ri*0.5,w,h:0.46,fill:{color:isH?C.navy:(ri%2===0?"F0F6FA":C.white)},line:{color:C.ltgray,pt:0.4}});
s.addText(row[ci], {x:cx+0.04,y:2.38+ri*0.5,w:w-0.08,h:0.46,fontSize:isH?9.5:11,bold:isH,color:isH?C.white:C.gray,align:"center",valign:"middle"});
cx+=w;
});
});
// Sex & mortality note
s.addShape(pres.ShapeType.rect, {x:5.1,y:1.98,w:4.7,h:3.25,fill:{color:C.white},line:{color:C.ltgray,pt:1}});
s.addShape(pres.ShapeType.rect, {x:5.1,y:1.98,w:4.7,h:0.36,fill:{color:C.mid}});
s.addText("Key Baseline Notes", {x:5.15,y:1.98,w:4.6,h:0.36,fontSize:11,bold:true,color:C.white,valign:"middle",margin:5});
const notes = [
"Data prospectively collected – minimises recall bias",
"Cross-matched between SFR and SAR at individual patient level",
"Competing risk of death accounted for in all analyses",
"Women comprised ~67% of cohort, reflecting fracture epidemiology",
"Mortality rate of 54.9% by 5 years highlights frailty of cohort",
"Cannulated screws were the dominant fixation method",
];
notes.forEach((n,i) => s.addText("• "+n, {x:5.2,y:2.42+i*0.46,w:4.55,h:0.42,fontSize:10.5,color:C.gray}));
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 5 – PRIMARY RESULTS: CONVERSION RATES
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:10,h:5.625,fill:{color:C.navy}});
hdr(s,"Primary Results: Cumulative Conversion to Arthroplasty",C.teal);
ftr(s);
// Overall CIF boxes
const cif = [
{t:"1 Year", pct:"6.3%", sub:"of patients converted", color:C.teal},
{t:"2 Years", pct:"8.1%", sub:"of patients converted", color:C.orange},
{t:"5 Years", pct:"10.1%", sub:"of patients converted", color:C.red},
];
cif.forEach((c,i) => {
const x = 0.3 + i*3.23;
s.addShape(pres.ShapeType.rect, {x,y:0.75,w:3.0,h:1.25,fill:{color:c.color}});
s.addText(c.t, {x,y:0.75,w:3.0,h:0.38,fontSize:13,bold:true,color:C.white,align:"center",valign:"middle"});
s.addText(c.pct, {x,y:1.1, w:3.0,h:0.55,fontSize:30,bold:true,color:C.white,align:"center",valign:"middle"});
s.addText(c.sub, {x,y:1.62,w:3.0,h:0.3, fontSize:9.5,color:C.white,align:"center"});
});
// Conversion by age group table
s.addText("Conversion Rate by Age Group", {x:0.2,y:2.18,w:5.5,h:0.35,fontSize:12,bold:true,color:C.white});
const byAge = [
["Age Group", "1-Year CIF", "2-Year CIF", "5-Year CIF"],
["60–69 yrs", "4.5%", "6.5%", "~11%"],
["70–79 yrs", "7.0%", "9.6%", "~12%"],
["≥80 yrs", "6.1%", "7.8%", "~8%"],
];
const bw = [1.7,1.2,1.2,1.2];
byAge.forEach((row,ri) => {
let cx = 0.2;
bw.forEach((w,ci) => {
const isH = ri===0;
const bg = isH ? C.mid : (ri===2 ? "1A3F5C" : "162B40");
s.addShape(pres.ShapeType.rect, {x:cx,y:2.58+ri*0.5,w,h:0.46,fill:{color:bg},line:{color:"2A4A65",pt:0.5}});
s.addText(row[ci], {x:cx+0.03,y:2.58+ri*0.5,w:w-0.06,h:0.46,fontSize:isH?9.5:11,bold:isH,color:isH?C.gold:C.white,align:"center",valign:"middle"});
cx+=w;
});
});
// Sex & key risk
s.addText("Risk Factors for Conversion", {x:5.7,y:2.18,w:4.1,h:0.35,fontSize:12,bold:true,color:C.white});
const risks = [
{label:"Female sex", val:"HR 1.49 (95% CI 1.19–1.87)", color:C.orange},
{label:"Age 70–79", val:"Highest conversion rate group", color:C.red},
{label:">50% conversions", val:"Occurred within 1st year", color:C.teal},
];
risks.forEach((r,i) => {
s.addShape(pres.ShapeType.rect, {x:5.7,y:2.62+i*0.9,w:4.1,h:0.82,fill:{color:C.mid},line:{color:r.color,pt:2}});
s.addText(r.label, {x:5.8,y:2.65+i*0.9,w:3.9,h:0.3,fontSize:11,bold:true,color:r.color});
s.addText(r.val, {x:5.8,y:2.97+i*0.9,w:3.9,h:0.3,fontSize:11,color:C.white});
});
// 1-in-10 callout
s.addShape(pres.ShapeType.rect, {x:0.2,y:5.05,w:9.6,h:0.38,fill:{color:C.gold}});
s.addText("Key finding: 1 in 10 patients treated with IF for nondisplaced FNF required conversion to arthroplasty within 5 years. More than half of conversions occurred within year 1.", {
x:0.25,y:5.05,w:9.5,h:0.38,fontSize:10,bold:true,color:C.navy,align:"center",valign:"middle",
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 6 – MORTALITY RESULTS
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:10,h:5.625,fill:{color:C.light}});
hdr(s,"Mortality Findings",C.red);
ftr(s);
// Mortality stat boxes
const mort = [
{t:"1-Year Mortality", pct:"21.3%", ci:"95% CI: 20.3–22.5%", color:C.orange},
{t:"2-Year Mortality", pct:"31.3%", ci:"95% CI: 30.0–32.6%", color:C.red},
{t:"5-Year Mortality", pct:"54.9%", ci:"95% CI: 53.1–56.7%", color:"6B1010"},
];
mort.forEach((m,i) => {
const x = 0.2 + i*3.25;
s.addShape(pres.ShapeType.rect, {x,y:0.72,w:3.1,h:1.2,fill:{color:m.color}});
s.addText(m.t, {x,y:0.72,w:3.1,h:0.38,fontSize:12,bold:true,color:C.white,align:"center",valign:"middle"});
s.addText(m.pct,{x,y:1.06,w:3.1,h:0.52,fontSize:28,bold:true,color:C.white,align:"center",valign:"middle"});
s.addText(m.ci, {x,y:1.57,w:3.1,h:0.28,fontSize:9,color:C.white,align:"center"});
});
// Sex-based mortality table
s.addText("Mortality by Sex & Timepoint", {x:0.2,y:2.06,w:5.5,h:0.35,fontSize:12,bold:true,color:C.navy});
const mortT = [
["", "1-Year", "2-Year", "5-Year"],
["All patients","21.3%", "31.3%", "54.9%"],
["Male", "~28%", "~40%", "~64%"],
["Female", "~18%", "~27%", "~50%"],
];
const tw = [1.7,1.2,1.2,1.2];
mortT.forEach((row,ri) => {
let cx = 0.2;
tw.forEach((w,ci) => {
const isH = ri===0;
const bg = isH ? C.navy : (ri===1 ? "F5E8E8" : (ri===2 ? "F2E0D0" : C.white));
s.addShape(pres.ShapeType.rect, {x:cx,y:2.45+ri*0.5,w,h:0.46,fill:{color:bg},line:{color:C.ltgray,pt:0.4}});
s.addText(row[ci], {x:cx+0.03,y:2.45+ri*0.5,w:w-0.06,h:0.46,fontSize:isH?9.5:11,bold:isH||ci===0,color:isH?C.white:C.gray,align:"center",valign:"middle"});
cx+=w;
});
});
// Male vs Female HR
s.addShape(pres.ShapeType.rect, {x:5.7,y:2.06,w:4.1,h:2.85,fill:{color:C.white},line:{color:C.ltgray,pt:1}});
s.addShape(pres.ShapeType.rect, {x:5.7,y:2.06,w:4.1,h:0.38,fill:{color:C.navy}});
s.addText("Male vs. Female Mortality Risk", {x:5.75,y:2.06,w:4.0,h:0.38,fontSize:11,bold:true,color:C.white,valign:"middle",margin:4});
const mrisk = [
["Adjusted 1-yr HR (Male vs Female)","1.79 (95% CI 1.61–2.00)"],
["Higher mortality in men","At all time points"],
["Competing risk noted","High mortality limits conversion in ≥80 yr group"],
];
mrisk.forEach(([k,v],i) => {
s.addText(k+":", {x:5.78,y:2.52+i*0.72,w:4.0,h:0.3,fontSize:10,bold:true,color:C.navy});
s.addText(v, {x:5.78,y:2.82+i*0.72,w:4.0,h:0.3,fontSize:10.5,color:C.gray});
});
s.addShape(pres.ShapeType.rect, {x:0.2,y:5.04,w:9.6,h:0.38,fill:{color:C.navy}});
s.addText("Interpretation: High competing mortality (54.9% at 5 yrs) is a key confounder — especially in the ≥80 group where many do not survive to undergo conversion.", {
x:0.25,y:5.04,w:9.5,h:0.38,fontSize:9.5,italic:true,color:C.ltgray,align:"center",valign:"middle",
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 7 – STRENGTHS & LIMITATIONS
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:10,h:5.625,fill:{color:C.light}});
hdr(s,"Critical Appraisal: Strengths & Limitations",C.gray);
ftr(s);
// Strengths
s.addShape(pres.ShapeType.rect, {x:0.2,y:0.72,w:4.6,h:0.42,fill:{color:C.green}});
s.addText("✓ Strengths", {x:0.2,y:0.72,w:4.6,h:0.42,fontSize:13,bold:true,color:C.white,valign:"middle",margin:8});
const str = [
"Large national registry (n=5,428) — high statistical power",
"Prospectively collected data — reduces recall and selection bias",
"Cross-matching two validated national registers (SFR + SAR)",
"Competing risk analysis appropriately handles mortality",
"Long follow-up of up to 5 years",
"Multi-center national data — high external validity for Sweden",
"Clinically relevant question with direct practice implications",
"Detailed age-group stratification (60–69, 70–79, ≥80)",
];
str.forEach((t,i) => s.addText("• "+t, {x:0.25,y:1.22+i*0.48,w:4.5,h:0.44,fontSize:10.5,color:C.gray}));
// Limitations
s.addShape(pres.ShapeType.rect, {x:5.2,y:0.72,w:4.6,h:0.42,fill:{color:C.red}});
s.addText("✗ Limitations", {x:5.2,y:0.72,w:4.6,h:0.42,fontSize:13,bold:true,color:C.white,valign:"middle",margin:8});
const lim = [
"Observational design — cannot establish causation",
"No data on fracture displacement grading (Garden subtype)",
"No information on fixation type (screws vs. SHS) breakdown",
"Inability to blind — inherent in registry-based studies",
"No functional outcome scores (PROMs) recorded",
"Swedish population — may limit generalizability globally",
"Indications for primary arthroplasty not captured",
"No data on surgeon volume or hospital-level variation",
];
lim.forEach((t,i) => s.addText("• "+t, {x:5.25,y:1.22+i*0.48,w:4.5,h:0.44,fontSize:10.5,color:C.gray}));
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 8 – DISCUSSION POINTS
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:10,h:5.625,fill:{color:C.light}});
hdr(s,"Discussion Points for Journal Club",C.teal);
ftr(s);
const disc = [
{
q:"Should primary arthroplasty be considered for women aged 70–79 with nondisplaced FNF?",
a:"This age-sex group had the highest conversion rate (9.6% at 2 yrs, HR 1.49 for female sex). Primary arthroplasty may reduce reoperations but adds upfront surgical risk.",
},
{
q:"Does the 10% 5-year conversion rate justify changing current practice?",
a:"Although 90% avoid conversion, the 10% who convert do so under worse conditions (failed hardware, pain). Early identification of high-risk patients is key.",
},
{
q:"Why does the ≥80 group have a lower conversion rate than 70–79?",
a:"Competing mortality (54.9% at 5 yrs) prevents conversion — patients die before reoperation. Competing risk analysis is essential to interpret this correctly.",
},
{
q:"What are the limitations of registry data in answering this clinical question?",
a:"No PROMs, no fracture grading detail, no fixation subtype analysis. Registry data answers 'what happened' but not 'why' or 'how well the patient did functionally'.",
},
{
q:"How does this data change shared decision-making with patients?",
a:"Patients can be counselled that ~1 in 10 will need a second operation, with risk highest in the first year and in women aged 70–79.",
},
];
disc.forEach((d,i) => {
const y = 0.78+i*0.92;
s.addShape(pres.ShapeType.roundRect, {x:0.2,y,w:9.6,h:0.86,fill:{color:i%2===0?C.white:"EBF5FB"},line:{color:C.teal,pt:0.8},rectRadius:0.05});
s.addShape(pres.ShapeType.rect, {x:0.2,y,w:0.36,h:0.86,fill:{color:C.teal}});
s.addText((i+1).toString(), {x:0.2,y,w:0.36,h:0.86,fontSize:14,bold:true,color:C.white,align:"center",valign:"middle",margin:0});
s.addText(d.q, {x:0.64,y:y+0.04,w:9.1,h:0.32,fontSize:10.5,bold:true,color:C.navy});
s.addText(d.a, {x:0.64,y:y+0.38,w:9.1,h:0.42,fontSize:10, color:C.gray});
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 9 – CONCLUSIONS
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:10,h:5.625,fill:{color:C.navy}});
s.addShape(pres.ShapeType.rect, {x:0,y:4.96,w:10,h:0.08,fill:{color:C.gold}});
ftr(s);
s.addText("Conclusions", {
x:0.5,y:0.15,w:9,h:0.65,
fontSize:26,bold:true,color:C.gold,align:"center",
});
const conc = [
"1 in 10 patients (10.1%) ≥60 years treated with IF for nondisplaced FNF converted to arthroplasty within 5 years.",
"More than half of all conversions occurred within the first postoperative year — early follow-up is critical.",
"Women had a significantly higher risk of conversion (HR 1.49, 95% CI 1.19–1.87).",
"Patients aged 70–79 had the highest 2-year conversion rate (9.6%) — this subgroup warrants careful consideration for primary arthroplasty.",
"High 5-year mortality (54.9%) — particularly in men — acts as a competing risk reducing the observed conversion rate in the oldest cohort.",
"These registry findings support further RCTs comparing IF vs. primary arthroplasty in high-risk subgroups (women, 70–79 yrs).",
];
conc.forEach((c,i) => {
const y = 0.9+i*0.72;
s.addShape(pres.ShapeType.rect, {x:0.3,y:y+0.05,w:0.44,h:0.44,fill:{color:C.gold}});
s.addText((i+1).toString(), {x:0.3,y:y+0.05,w:0.44,h:0.44,fontSize:14,bold:true,color:C.navy,align:"center",valign:"middle",margin:0});
s.addText(c, {x:0.85,y,w:8.9,h:0.62,fontSize:11.5,color:C.white,valign:"middle"});
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 10 – TAKE-HOME MESSAGE & REFERENCE
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:10,h:5.625,fill:{color:C.navy}});
s.addShape(pres.ShapeType.rect, {x:0,y:4.0,w:10,h:0.06,fill:{color:C.gold}});
ftr(s);
s.addText("Thank You", {x:0.5,y:0.25,w:9,h:1.0,fontSize:44,bold:true,color:C.white,align:"center",valign:"middle"});
s.addText("Questions & Discussion", {x:0.5,y:1.3,w:9,h:0.5,fontSize:18,italic:true,color:C.teal,align:"center"});
// Take-home box
s.addShape(pres.ShapeType.rect, {x:0.5,y:2.0,w:9,h:1.15,fill:{color:C.teal},line:{color:C.gold,pt:2}});
s.addText([
{text:"Take-Home Message: ", options:{bold:true,color:C.gold}},
{text:"One in ten elderly patients with nondisplaced femoral neck fractures treated by internal fixation will require conversion to arthroplasty within 5 years. Risk is greatest in women and in those aged 70–79. These findings support individualised treatment planning and future RCT evaluation of primary arthroplasty in high-risk subgroups.", options:{color:C.white}},
], {x:0.6,y:2.0,w:8.8,h:1.15,fontSize:11.5,valign:"middle"});
// Citation
s.addText("Citation", {x:0.5,y:3.3,w:9,h:0.32,fontSize:12,bold:true,color:C.gold});
s.addText(
"Lagergren J, Mukka S, Wolf O, Nauclér E, Möller M, Rogmark C. Conversion to Arthroplasty After Internal Fixation of Nondisplaced Femoral Neck Fractures: Results from a Swedish Register Cohort of 5,428 Individuals 60 Years of Age or Older. J Bone Joint Surg Am. 2023 Mar 1;105(5). doi:10.2106/JBJS.22.01035 | PMID: 36729034",
{x:0.5,y:3.62,w:9,h:0.65,fontSize:10,italic:true,color:C.ltgray}
);
s.addText("Level of Evidence: Prognostic Level III • Impact Factor: 4.3 • Observational Cohort Study", {
x:0.5,y:4.35,w:9,h:0.32,fontSize:10,color:C.gold,align:"center",
});
}
// ── write ─────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/journal-club-lagergren/FNF_Conversion_JournalClub.pptx" })
.then(()=>console.log("DONE"))
.catch(e=>{console.error(e);process.exit(1);});
mkdir -p /home/daytona/workspace/journal-club-lagergren && node /home/daytona/workspace/journal-club-lagergren/make_pptx.js
ls -lh /home/daytona/workspace/journal-club-lagergren/FNF_Conversion_JournalClub.pptx
FNF Conversion JournalClub
Presentation · PPTX
| # | Slide |
|---|---|
| 1 | Title - Paper snapshot with all publication details (journal, date, authors, IF, level) |
| 2 | Background & Rationale - Why this study was needed + stated aim |
| 3 | Study Design & Methods - Design, data sources, SFR/SAR, inclusion/exclusion |
| 4 | Patient Characteristics - n=5,428, age group breakdown table, baseline notes |
| 5 | Primary Results: Conversion Rates - CIF at 1/2/5 years, by age group, key risk factors |
| 6 | Mortality Findings - 21.3%/31.3%/54.9% mortality, sex breakdown, competing risk |
| 7 | Critical Appraisal - Strengths vs. Limitations side by side |
| 8 | Discussion Points - 5 questions for journal club debate |
| 9 | Conclusions - 6 numbered key takeaways |
| 10 | Thank You / Reference - Take-home message box + full citation (PMID: 36729034) |
Note: I noticed you mentioned wanting a specific slide order from an example image that didn't come through. If you share that image or list the order, I can rearrange these slides to match exactly.
https://www.jbjs.org/reader.php?rsuite_id=2699881&type=pdf&name=JBJS.20.00275.pdf Analysis this and make a journal club ppt in keynotes fomalfor me
~/journal-club-keynote/make_pptx.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "VLP vs EF for Distal Radial Fractures – Journal Club";
// ── Keynote-inspired palette (clean, minimal, bold accents) ─────────────
const C = {
white: "FFFFFF",
offwhite:"F7F8FA",
black: "1A1A1A",
charcoal:"2D3436",
slate: "4A5568",
blue: "0A5C8A", // primary accent
sky: "2D9CDB", // secondary accent
mint: "00897B", // positive
coral: "C0392B", // negative / caution
amber: "E07B00", // highlight
ltblue: "EBF5FB",
ltgray: "E8ECF0",
divider: "CBD5E0",
};
// ── Helpers ──────────────────────────────────────────────────────────────
function topBar(s, color) {
s.addShape(pres.ShapeType.rect, { x:0, y:0, w:10, h:0.07, fill:{color: color||C.blue} });
}
function sectionTag(s, label, color) {
// small pill tag top-left
s.addShape(pres.ShapeType.roundRect, { x:0.4, y:0.22, w:2.2, h:0.32, fill:{color: color||C.blue}, rectRadius:0.16 });
s.addText(label.toUpperCase(), { x:0.4, y:0.22, w:2.2, h:0.32, fontSize:8.5, bold:true, color:C.white, align:"center", valign:"middle", charSpacing:1.5, margin:0 });
}
function slideTitle(s, title, sub) {
s.addText(title, { x:0.4, y:0.65, w:9.2, h:0.68, fontSize:24, bold:true, color:C.black, valign:"bottom" });
if (sub) s.addText(sub, { x:0.4, y:1.3, w:9.2, h:0.32, fontSize:12, color:C.slate, italic:true });
}
function divLine(s, y) {
s.addShape(pres.ShapeType.line, { x:0.4, y: y||1.58, w:9.2, h:0, line:{color:C.divider, pt:1} });
}
function ftr(s) {
s.addText("Wretenberg et al. J Bone Joint Surg Am. 2021;103:405-414 | Journal Club", {
x:0, y:5.38, w:10, h:0.24, fontSize:7.5, color:C.divider, align:"center", valign:"middle",
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 1 – TITLE
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
// Full white bg, single bold blue stripe at bottom
s.addShape(pres.ShapeType.rect, { x:0,y:0,w:10,h:5.625, fill:{color:C.white} });
s.addShape(pres.ShapeType.rect, { x:0,y:4.42,w:10,h:1.2, fill:{color:C.blue} });
s.addShape(pres.ShapeType.rect, { x:0,y:4.37,w:10,h:0.08, fill:{color:C.amber} });
// Journal tag
s.addShape(pres.ShapeType.roundRect, { x:0.5,y:0.38,w:2.6,h:0.34, fill:{color:C.ltblue}, rectRadius:0.17 });
s.addText("JOURNAL CLUB", { x:0.5,y:0.38,w:2.6,h:0.34, fontSize:9, bold:true, color:C.blue, align:"center", valign:"middle", charSpacing:2, margin:0 });
// Main title
s.addText("Volar Locking Plate\nvs. External Fixation", {
x:0.5, y:0.85, w:8.5, h:2.1,
fontSize:46, bold:true, color:C.black, lineSpacingMultiple:1.1,
});
s.addText("for Displaced Extra-Articular Distal Radial Fractures", {
x:0.5, y:2.88, w:8.5, h:0.52,
fontSize:18, color:C.slate, italic:false,
});
s.addText("A Multicenter Randomized Controlled Trial", {
x:0.5, y:3.42, w:8.5, h:0.36,
fontSize:13, color:C.sky, italic:true,
});
// Bottom bar content
s.addText("Wretenberg et al.", { x:0.5, y:4.52, w:4, h:0.36, fontSize:13, bold:true, color:C.white });
s.addText("J Bone Joint Surg Am. 2021;103:405-414", { x:0.5, y:4.86, w:5, h:0.26, fontSize:10, color:"B0CCE0" });
s.addText("Level I Evidence • RCT • JBJS.20.00275", { x:5.5, y:4.55, w:4, h:0.52, fontSize:11, color:C.amber, align:"right", valign:"middle" });
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 2 – BACKGROUND
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x:0,y:0,w:10,h:5.625, fill:{color:C.white} });
topBar(s);
sectionTag(s,"Background");
slideTitle(s,"Background","Why was this study needed?");
divLine(s);
ftr(s);
const pts = [
{ icon:"01", head:"Epidemiology", body:"Distal radial fractures are among the most common fractures in adults, particularly in active working-age individuals." },
{ icon:"02", head:"Treatment options", body:"Both Volar Locking Plate (VLP) and External Fixation (EF) are established surgical treatments for displaced extra-articular types." },
{ icon:"03", head:"Conflicting data", body:"Earlier small RCTs yielded conflicting results due to heterogeneous populations, varied outcome measures, and methodological limitations." },
{ icon:"04", head:"Evidence gap", body:"No sufficiently powered, well-designed RCT existed to definitively guide surgical decision-making for OTA/AO type A3 fractures." },
];
pts.forEach((p, i) => {
const y = 1.72 + i*0.9;
s.addShape(pres.ShapeType.roundRect, { x:0.4,y,w:0.52,h:0.52, fill:{color:C.blue}, rectRadius:0.26 });
s.addText(p.icon, { x:0.4,y,w:0.52,h:0.52, fontSize:11, bold:true, color:C.white, align:"center", valign:"middle", margin:0 });
s.addText(p.head, { x:1.05,y:y+0.02, w:8.5,h:0.28, fontSize:12.5, bold:true, color:C.black });
s.addText(p.body, { x:1.05,y:y+0.3, w:8.5,h:0.38, fontSize:11, color:C.slate });
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 3 – PICO / AIM
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x:0,y:0,w:10,h:5.625, fill:{color:C.offwhite} });
topBar(s, C.mint);
sectionTag(s,"Research Question", C.mint);
slideTitle(s,"PICO Framework");
divLine(s);
ftr(s);
// Large PICO cards
const pico = [
{ letter:"P", label:"Population", color:C.blue, body:"Adults 18–70 years with displaced extra-articular distal radial fracture\n(OTA/AO type A3)" },
{ letter:"I", label:"Intervention", color:C.mint, body:"Volar Locking Plate (VLP) fixation" },
{ letter:"C", label:"Comparator", color:C.coral, body:"External Fixation (EF)" },
{ letter:"O", label:"Outcomes", color:C.amber, body:"PRWHE score, QuickDASH, ROM, pain (VAS), radiographic parameters, complications\nat 6 wk, 3 mo, 1 yr" },
];
pico.forEach((p,i) => {
const x = 0.22 + i*2.42;
s.addShape(pres.ShapeType.rect, { x,y:1.72,w:2.28,h:3.2, fill:{color:C.white}, line:{color:C.ltgray,pt:1} });
s.addShape(pres.ShapeType.rect, { x,y:1.72,w:2.28,h:0.7, fill:{color:p.color} });
s.addText(p.letter, { x,y:1.72,w:2.28,h:0.7, fontSize:28, bold:true, color:C.white, align:"center", valign:"middle" });
s.addText(p.label, { x:x+0.1,y:2.5,w:2.1,h:0.38, fontSize:11, bold:true, color:p.color });
s.addText(p.body, { x:x+0.1,y:2.9,w:2.1,h:1.9, fontSize:10.5, color:C.charcoal, lineSpacingMultiple:1.3 });
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 4 – METHODS
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x:0,y:0,w:10,h:5.625, fill:{color:C.white} });
topBar(s, C.sky);
sectionTag(s,"Methods", C.sky);
slideTitle(s,"Study Design & Methods");
divLine(s);
ftr(s);
// Three columns
const cols = [
{
head:"Study Design",
color:C.blue,
rows:["Multicenter RCT","2 parallel treatment arms","3 centers in Norway","Block randomization","NCT01904084 (ClinicalTrials.gov)"],
},
{
head:"Inclusion Criteria",
color:C.mint,
rows:["Age 18–70 years","Displaced extra-articular DRF","OTA/AO type A3","Requires operative fixation"],
},
{
head:"Exclusion Criteria",
color:C.coral,
rows:["Intra-articular fractures","Open fractures","Bilateral fractures","Dementia / psychiatric disorders","Unable to comply with follow-up"],
},
];
cols.forEach((col,i) => {
const x = 0.25 + i*3.25;
s.addShape(pres.ShapeType.rect, { x,y:1.7,w:3.1,h:3.6, fill:{color:C.offwhite}, line:{color:C.ltgray,pt:1} });
s.addShape(pres.ShapeType.rect, { x,y:1.7,w:3.1,h:0.45, fill:{color:col.color} });
s.addText(col.head, { x:x+0.08,y:1.7,w:2.95,h:0.45, fontSize:12, bold:true, color:C.white, valign:"middle", margin:0 });
col.rows.forEach((row,j) => {
s.addShape(pres.ShapeType.line, { x:x+0.12,y:2.28+j*0.62,w:2.86,h:0, line:{color:C.ltgray,pt:0.5} });
s.addText("— "+row, { x:x+0.12,y:2.32+j*0.62,w:2.86,h:0.52, fontSize:11, color:C.charcoal, valign:"middle" });
});
});
// Sample size strip
s.addShape(pres.ShapeType.rect, { x:0.25,y:5.08,w:9.5,h:0.3, fill:{color:C.ltblue} });
s.addText("Sample size: n=160 planned (α=0.05, 80% power, SD=21, MID=11.5 pts) → Final: 75 VLP + 75 EF = 150 randomised", {
x:0.3,y:5.08,w:9.4,h:0.3, fontSize:9.5, color:C.blue, align:"center", valign:"middle",
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 5 – PRIMARY OUTCOME (PRWHE)
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x:0,y:0,w:10,h:5.625, fill:{color:C.white} });
topBar(s, C.amber);
sectionTag(s,"Results – Primary Outcome", C.amber);
slideTitle(s,"PRWHE Score","Patient-Rated Wrist/Hand Evaluation • Range 0–100 • Lower = Better • MID = 11.5 pts");
divLine(s);
ftr(s);
// Score table
const rows = [
["Timepoint", "VLP (mean ± SD)", "EF (mean ± SD)", "Δ", "p-value"],
["6 Weeks", "30 ± 21", "46 ± 22", "−16 pts", "< 0.001"],
["3 Months", "15 ± 15", "21 ± 18", "−6 pts", "0.016"],
["1 Year", "8 ± 12", "11 ± 13", "−3 pts", "0.13 (NS)"],
];
const cw = [1.8, 2.1, 2.1, 1.2, 1.5];
rows.forEach((row, ri) => {
let cx = 0.38;
cw.forEach((w, ci) => {
const isH = ri === 0;
const isLast = ri === 3;
const pCol = ci === 4;
let bg = isH ? C.black : (ri%2===0 ? C.offwhite : C.white);
let fg = isH ? C.white : C.charcoal;
if (pCol && !isH) fg = isLast ? C.slate : C.mint;
if (pCol && isLast && !isH) bg = "FFF8E7";
s.addShape(pres.ShapeType.rect, { x:cx,y:1.72+ri*0.62,w,h:0.58, fill:{color:bg}, line:{color:C.ltgray,pt:0.5} });
s.addText(row[ci], { x:cx+0.05,y:1.72+ri*0.62,w:w-0.1,h:0.58, fontSize:isH?10:12, bold:isH||pCol, color:fg, align:"center", valign:"middle" });
cx += w;
});
});
// Full recovery callout
s.addShape(pres.ShapeType.rect, { x:0.38,y:4.22,w:9.25,h:0.62, fill:{color:C.ltblue}, line:{color:C.sky,pt:1.5} });
s.addText([
{text:"Full Recovery (PRWHE ≤10): ", options:{bold:true,color:C.blue}},
{text:"6 wk — VLP 23% vs EF 6% ", options:{color:C.charcoal}},
{text:"3 mo — VLP 58% vs EF 47% ", options:{color:C.charcoal}},
{text:"1 yr — VLP 81% vs EF 79%", options:{color:C.charcoal}},
], { x:0.45,y:4.22,w:9.1,h:0.62, fontSize:11.5, valign:"middle" });
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 6 – SECONDARY OUTCOMES (ROM + QuickDASH + Pain)
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x:0,y:0,w:10,h:5.625, fill:{color:C.white} });
topBar(s, C.sky);
sectionTag(s,"Results – Secondary Outcomes", C.sky);
slideTitle(s,"Range of Motion, QuickDASH & Pain");
divLine(s);
ftr(s);
// ROM table (left)
s.addText("Range of Motion (% of uninjured side)", { x:0.38,y:1.66,w:5.4,h:0.32, fontSize:11, bold:true, color:C.blue });
const rom = [
["Motion", "VLP 6wk","EF 6wk","p","VLP 1yr","EF 1yr","p"],
["Flexion", "68.6%", "54.8%", "<0.001","97%","94%","0.66"],
["Extension", "62.0%", "3.8%", "<0.001","93%","91%","0.013"],
["Supination", "74.1%", "42.5%", "<0.001","99%","93%","0.03"],
["Grip Str.", "~69%", "~51%", "<0.001","97%","95%","0.70"],
];
const rw = [1.05,0.62,0.62,0.58,0.62,0.62,0.58];
rom.forEach((row,ri) => {
let cx = 0.38;
rw.forEach((w,ci) => {
const isH = ri===0;
const bg = isH ? C.charcoal : (ri%2===0 ? C.offwhite : C.white);
s.addShape(pres.ShapeType.rect, {x:cx,y:2.02+ri*0.47,w,h:0.43,fill:{color:bg},line:{color:C.ltgray,pt:0.4}});
s.addText(row[ci], {x:cx+0.02,y:2.02+ri*0.47,w:w-0.04,h:0.43,fontSize:isH?8:9.5,bold:isH,color:isH?C.white:C.charcoal,align:"center",valign:"middle"});
cx+=w;
});
});
// QuickDASH (right)
s.addText("QuickDASH (lower = better)", { x:5.8,y:1.66,w:3.8,h:0.32, fontSize:11, bold:true, color:C.blue });
const qd = [
["Timepoint","VLP","EF","p"],
["6 Weeks", "27", "45","< 0.001"],
["3 Months", "15", "22","0.023"],
["1 Year", "9", "12","0.36 (NS)"],
];
const qw = [1.3,0.75,0.75,1.0];
qd.forEach((row,ri) => {
let cx = 5.8;
qw.forEach((w,ci) => {
const isH = ri===0;
const bg = isH ? C.charcoal : (ri%2===0 ? C.offwhite : C.white);
s.addShape(pres.ShapeType.rect, {x:cx,y:2.02+ri*0.47,w,h:0.43,fill:{color:bg},line:{color:C.ltgray,pt:0.4}});
s.addText(row[ci], {x:cx+0.02,y:2.02+ri*0.47,w:w-0.04,h:0.43,fontSize:isH?8:9.5,bold:isH,color:isH?C.white:C.charcoal,align:"center",valign:"middle"});
cx+=w;
});
});
// Pain note
s.addShape(pres.ShapeType.rect, { x:0.38,y:4.42,w:9.25,h:0.55, fill:{color:"FFF3E0"}, line:{color:C.amber,pt:1} });
s.addText([
{text:"Pain (VAS): ", options:{bold:true,color:C.amber}},
{text:"No significant difference at rest at any timepoint. VLP had significantly less pain during activity at 3 months and 1 year.", options:{color:C.charcoal}},
], { x:0.48,y:4.42,w:9.1,h:0.55, fontSize:11, valign:"middle" });
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 7 – COMPLICATIONS
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x:0,y:0,w:10,h:5.625, fill:{color:C.white} });
topBar(s, C.coral);
sectionTag(s,"Results – Complications", C.coral);
slideTitle(s,"Complications");
divLine(s);
ftr(s);
// Major table
s.addText("Major Complications", { x:0.38,y:1.65,w:5.0,h:0.3, fontSize:11, bold:true, color:C.coral });
const maj = [
["Complication", "VLP","EF","p"],
["CRPS", "4%", "11%","0.14"],
["Carpal Tunnel Synd.", "7%", "4%", "0.49"],
["Prolonged wrist pain","3%", "3%", "1.0"],
["Deep infection", "1%", "0%", "1.0"],
["Suboptimal osteosyn.","1%", "4%", "0.62"],
["Plate removal", "7%", "—", "0.025"],
["Total Major", "23%","25%","0.83"],
];
const mw = [2.0,0.8,0.8,0.85];
maj.forEach((row,ri) => {
let cx = 0.38;
mw.forEach((w,ci) => {
const isH = ri===0; const isT = ri===maj.length-1;
const bg = isH ? C.charcoal : isT ? C.ltblue : (ri%2===0 ? C.offwhite : C.white);
s.addShape(pres.ShapeType.rect, {x:cx,y:1.98+ri*0.42,w,h:0.38,fill:{color:bg},line:{color:C.ltgray,pt:0.4}});
s.addText(row[ci], {x:cx+0.04,y:1.98+ri*0.42,w:w-0.08,h:0.38,fontSize:isH?8.5:10,bold:isH||isT,color:isH?C.white:C.charcoal,align:ci===0?"left":"center",valign:"middle"});
cx+=w;
});
});
// Minor table
s.addText("Minor Complications", { x:5.5,y:1.65,w:4.1,h:0.3, fontSize:11, bold:true, color:C.slate });
const min = [
["Complication", "VLP","EF","p"],
["Superficial infxn","1%", "10%","0.063"],
["Scar tissue", "7%", "8%", "0.83"],
["Paresthesia", "6%", "7%", "1.0"],
["Neuropathy", "3%", "3%", "1.0"],
["Total Minor", "25%","32%","0.36"],
];
const mnw = [1.6,0.75,0.75,0.8];
min.forEach((row,ri) => {
let cx = 5.5;
mnw.forEach((w,ci) => {
const isH = ri===0; const isT = ri===min.length-1;
const bg = isH ? C.charcoal : isT ? C.ltblue : (ri%2===0 ? C.offwhite : C.white);
s.addShape(pres.ShapeType.rect, {x:cx,y:1.98+ri*0.42,w,h:0.38,fill:{color:bg},line:{color:C.ltgray,pt:0.4}});
s.addText(row[ci], {x:cx+0.04,y:1.98+ri*0.42,w:w-0.08,h:0.38,fontSize:isH?8.5:10,bold:isH||isT,color:isH?C.white:C.charcoal,align:ci===0?"left":"center",valign:"middle"});
cx+=w;
});
});
// Note strip
s.addShape(pres.ShapeType.rect, { x:0.38,y:5.06,w:9.25,h:0.32, fill:{color:"FEF0EF"}, line:{color:C.coral,pt:0.8} });
s.addText("Plate removal unique to VLP (7%). EF trended toward more CRPS (11%) and superficial infection (10%). No significant difference in overall complication rate (p=0.83 major / p=0.36 minor).", {
x:0.45,y:5.06,w:9.1,h:0.32, fontSize:9, italic:true, color:C.coral, valign:"middle",
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 8 – DISCUSSION
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x:0,y:0,w:10,h:5.625, fill:{color:C.white} });
topBar(s, C.mint);
sectionTag(s,"Discussion", C.mint);
slideTitle(s,"Discussion & Critical Appraisal");
divLine(s);
ftr(s);
// Two-column: strengths + limitations
s.addText("Strengths", { x:0.38,y:1.68,w:4.4,h:0.3, fontSize:11.5, bold:true, color:C.mint });
s.addText("Limitations", { x:5.35,y:1.68,w:4.3,h:0.3, fontSize:11.5, bold:true, color:C.coral });
s.addShape(pres.ShapeType.line, { x:4.95,y:1.68,w:0,h:3.6, line:{color:C.ltgray,pt:1} });
const str = [
"Level I RCT — highest therapeutic evidence",
"Multicenter design (3 Norwegian centres)",
"Block randomisation by independent biostatistician",
"ITT analysis — preserves allocation integrity",
"Validated PROMs: PRWHE + QuickDASH",
"3 timepoints: 6 wk, 3 mo, 1 yr",
"Blinded radiographic assessment",
"Pre-specified power calculation",
];
const lim = [
"Follow-up limited to 1 year — no long-term data",
"Only A3 (extra-articular) fractures — limited generalisability",
"Blinding of patients/surgeons not possible",
"Norwegian cohort — demographic homogeneity",
"Surgeon experience/volume not standardised",
"No cost-effectiveness analysis",
"Rehab protocols not fully standardised",
];
str.forEach((t,i) => {
s.addShape(pres.ShapeType.roundRect, { x:0.38,y:2.02+i*0.44,w:0.26,h:0.26, fill:{color:C.mint}, rectRadius:0.13 });
s.addText(t, { x:0.72,y:2.02+i*0.44,w:4.12,h:0.38, fontSize:10.5, color:C.charcoal });
});
lim.forEach((t,i) => {
s.addShape(pres.ShapeType.roundRect, { x:5.35,y:2.02+i*0.44,w:0.26,h:0.26, fill:{color:C.coral}, rectRadius:0.13 });
s.addText(t, { x:5.7,y:2.02+i*0.44,w:3.9,h:0.38, fontSize:10.5, color:C.charcoal });
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 9 – DISCUSSION QUESTIONS
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x:0,y:0,w:10,h:5.625, fill:{color:C.offwhite} });
topBar(s, C.blue);
sectionTag(s,"Discussion Questions", C.blue);
slideTitle(s,"Points for Journal Club Debate");
divLine(s);
ftr(s);
const qs = [
{ q:"Is 1-year follow-up sufficient?", a:"DRF may continue to remodel. Longer data needed for arthritic change, implant failure, or late CRPS." },
{ q:"Does faster recovery justify higher VLP cost?", a:"Earlier return-to-work in young patients may offset hardware cost, but health-economic data are absent." },
{ q:"Can results be extrapolated to intra-articular fractures?", a:"Study excluded intra-articular types — VLP advantage may be amplified where precision reduction is critical." },
{ q:"7% plate removal in VLP — clinically relevant?", a:"EF avoids this but trends toward more CRPS (11%) and superficial infection (10%). Risk-benefit differs by patient." },
{ q:"Impact of surgeon learning curve?", a:"VLP demands more technical skill. Multicenter design partially accounts for this, but volume data were not captured." },
];
qs.forEach((q,i) => {
const y = 1.72 + i*0.76;
s.addShape(pres.ShapeType.rect, { x:0.38,y,w:9.25,h:0.7, fill:{color:C.white}, line:{color:C.ltgray,pt:1} });
s.addShape(pres.ShapeType.rect, { x:0.38,y,w:0.38,h:0.7, fill:{color:C.blue} });
s.addText((i+1).toString(), { x:0.38,y,w:0.38,h:0.7, fontSize:13,bold:true,color:C.white,align:"center",valign:"middle",margin:0 });
s.addText(q.q, { x:0.84,y:y+0.04,w:8.7,h:0.28, fontSize:11,bold:true,color:C.black });
s.addText(q.a, { x:0.84,y:y+0.34,w:8.7,h:0.3, fontSize:10,color:C.slate });
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 10 – CONCLUSION
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x:0,y:0,w:10,h:5.625, fill:{color:C.black} });
s.addShape(pres.ShapeType.rect, { x:0,y:0,w:10,h:0.07, fill:{color:C.amber} });
ftr(s);
s.addText("Conclusions", { x:0.5,y:0.2,w:9,h:0.65, fontSize:26,bold:true,color:C.white,align:"center" });
s.addShape(pres.ShapeType.line, { x:0.5,y:0.85,w:9,h:0, line:{color:"333333",pt:1} });
const conc = [
"VLP provides significantly faster functional recovery (PRWHE, QuickDASH, ROM) at 6 weeks and 3 months compared to EF.",
"At 1 year, no statistically significant difference in PRWHE or QuickDASH scores (p=0.13 and p=0.36).",
"VLP maintains better wrist extension and supination throughout follow-up; extension difference persists at 1 year (p=0.013).",
"Complication profiles differ: VLP — 7% plate removal; EF — trends toward more CRPS (11%) and superficial infection (10%).",
"VLP should be considered the preferred treatment for OTA/AO A3 distal radial fractures, especially when early return to function matters.",
];
conc.forEach((c,i) => {
const y = 1.0+i*0.86;
s.addShape(pres.ShapeType.rect, { x:0.4,y:y+0.14,w:0.38,h:0.38, fill:{color:C.amber} });
s.addText((i+1).toString(), { x:0.4,y:y+0.14,w:0.38,h:0.38, fontSize:13,bold:true,color:C.black,align:"center",valign:"middle",margin:0 });
s.addText(c, { x:0.9,y,w:8.7,h:0.72, fontSize:12.5,color:C.white,valign:"middle" });
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 11 – THANK YOU / REFERENCE
// ══════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x:0,y:0,w:10,h:5.625, fill:{color:C.white} });
s.addShape(pres.ShapeType.rect, { x:0,y:0,w:10,h:0.07, fill:{color:C.blue} });
s.addShape(pres.ShapeType.rect, { x:0,y:4.5,w:10,h:1.12,fill:{color:C.offwhite} });
ftr(s);
s.addText("Thank You", {
x:0.5,y:0.55,w:9,h:2.0,
fontSize:64,bold:true,color:C.black,align:"center",valign:"middle",
});
s.addText("Questions & Discussion", {
x:0.5,y:2.65,w:9,h:0.55,
fontSize:20,color:C.slate,italic:true,align:"center",
});
s.addShape(pres.ShapeType.line, { x:0.5,y:3.32,w:9,h:0, line:{color:C.ltgray,pt:1} });
s.addText("Reference", { x:0.5,y:3.42,w:9,h:0.3, fontSize:10,bold:true,color:C.blue });
s.addText(
"Wretenberg P, et al. Volar Locking Plate Versus External Fixation for Displaced Extra-Articular Distal Radial Fractures: A Multicenter Randomized Controlled Trial. J Bone Joint Surg Am. 2021;103(5):405-414. doi:10.2106/JBJS.20.00275 | PMID: — | Level of Evidence: Therapeutic Level I",
{ x:0.5,y:3.75,w:9,h:0.65, fontSize:10, color:C.slate, italic:true, lineSpacingMultiple:1.3 }
);
s.addText("Impact Factor 4.3 • RCT • NCT01904084", {
x:0.5,y:4.55,w:9,h:0.32, fontSize:10,color:C.blue,align:"center",
});
}
// ── write ─────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/journal-club-keynote/VLP_vs_EF_Keynote_Style.pptx" })
.then(()=>console.log("DONE"))
.catch(e=>{console.error(e);process.exit(1);});
mkdir -p /home/daytona/workspace/journal-club-keynote && node /home/daytona/workspace/journal-club-keynote/make_pptx.js
ls -lh /home/daytona/workspace/journal-club-keynote/VLP_vs_EF_Keynote_Style.pptx
VLP vs EF Keynote Style
Presentation · PPTX
.pptx natively and preserves all formatting, colors, and tables.| # | Slide |
|---|---|
| 1 | Title — Bold typography, paper details strip at bottom |
| 2 | Background — 4 numbered context points |
| 3 | PICO Framework — 4 color-coded cards (P/I/C/O) |
| 4 | Methods — 3-column design/inclusion/exclusion + sample size strip |
| 5 | Primary Outcome (PRWHE) — Clean table + full recovery callout |
| 6 | Secondary Outcomes — ROM table, QuickDASH table, pain VAS note |
| 7 | Complications — Major + minor tables side by side |
| 8 | Discussion & Critical Appraisal — Strengths vs. limitations |
| 9 | Discussion Questions — 5 debate points for journal club |
| 10 | Conclusions — Dark slide, 5 numbered takeaways |
| 11 | Thank You / Reference — Clean closing with full citation |