Create an e poster for conference presentation
ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace not found"
mkdir -p /home/daytona/workspace/eposter && echo "Directory created"
~/eposter/create_eposter.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_WIDE"; // 13.3" x 7.5" — standard e-poster landscape
pres.title = "Conference E-Poster";
// ─── COLOUR PALETTE ────────────────────────────────────────────────────────
const C = {
navy: "0D2B55", // dominant background / header
teal: "007C91", // section headers
lightTeal: "00A3B4", // accent line
white: "FFFFFF",
offWhite: "F4F8FB",
lightGray: "E8EEF4",
darkText: "1A2B3C",
bodyText: "2C3E50",
accent: "F97316", // orange accent for key numbers/highlights
accentAlt: "16A085", // green for positive results
};
const slide = pres.addSlide();
// ═══════════════════════════════════════════════════════════════════════════
// BACKGROUND
// ═══════════════════════════════════════════════════════════════════════════
slide.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 13.3, h: 7.5,
fill: { color: C.offWhite },
line: { width: 0 },
});
// ═══════════════════════════════════════════════════════════════════════════
// HEADER BAND
// ═══════════════════════════════════════════════════════════════════════════
slide.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 13.3, h: 1.35,
fill: { color: C.navy },
line: { width: 0 },
});
// Accent stripe under header
slide.addShape(pres.ShapeType.rect, {
x: 0, y: 1.35, w: 13.3, h: 0.06,
fill: { color: C.lightTeal },
line: { width: 0 },
});
// Institution / conference tag (top-left)
slide.addText("Annual International Medical Research Conference 2026", {
x: 0.3, y: 0.04, w: 9.0, h: 0.25,
fontSize: 9.5, color: C.lightTeal, bold: false, italic: true,
fontFace: "Calibri", margin: 0,
});
// POSTER TITLE
slide.addText("Efficacy of Early Multidisciplinary Intervention\nin Acute Heart Failure Management", {
x: 0.3, y: 0.28, w: 10.2, h: 0.85,
fontSize: 22, color: C.white, bold: true,
fontFace: "Calibri", margin: 0, valign: "middle",
lineSpacingMultiple: 1.15,
});
// Authors
slide.addText("J. Morales¹, A. Patel², C. Kim¹, R. Thompson³", {
x: 0.3, y: 1.08, w: 9.0, h: 0.22,
fontSize: 9.5, color: "B0C8D8", fontFace: "Calibri", margin: 0,
});
// Affiliations (right side of header)
slide.addText(
"¹Dept. of Cardiology, City Medical Center\n²Institute of Clinical Research, National University\n³Heart & Vascular Institute, Regional Hospital",
{
x: 9.7, y: 0.1, w: 3.4, h: 1.1,
fontSize: 7.5, color: "A0BBCC", fontFace: "Calibri",
align: "right", valign: "top", margin: 0,
lineSpacingMultiple: 1.3,
}
);
// ═══════════════════════════════════════════════════════════════════════════
// HELPER: Section header bar
// ═══════════════════════════════════════════════════════════════════════════
function sectionHeader(x, y, w, label) {
slide.addShape(pres.ShapeType.rect, {
x, y, w, h: 0.28,
fill: { color: C.teal },
line: { width: 0 },
});
slide.addText(label, {
x: x + 0.1, y: y, w: w - 0.1, h: 0.28,
fontSize: 10, color: C.white, bold: true,
fontFace: "Calibri", margin: 0, valign: "middle",
});
}
// ═══════════════════════════════════════════════════════════════════════════
// HELPER: White card background
// ═══════════════════════════════════════════════════════════════════════════
function card(x, y, w, h) {
slide.addShape(pres.ShapeType.rect, {
x, y, w, h,
fill: { color: C.white },
line: { color: "D0DCE8", width: 0.75 },
shadow: { type: "outer", angle: 90, blur: 4, offset: 2, color: "AABBCC", opacity: 0.18 },
});
}
// ═══════════════════════════════════════════════════════════════════════════
// COLUMN LAYOUT (3 columns)
// Col 1: x=0.18 w=3.8
// Col 2: x=4.12 w=4.9
// Col 3: x=9.16 w=3.95
// ═══════════════════════════════════════════════════════════════════════════
const TOP = 1.48; // content starts below header + stripe
// ───────────────────────────────────────────
// COL 1 — Background + Objectives + Methods
// ───────────────────────────────────────────
const C1X = 0.18;
const C1W = 3.78;
// BACKGROUND
card(C1X, TOP, C1W, 1.5);
sectionHeader(C1X, TOP, C1W, "BACKGROUND");
slide.addText(
"Acute heart failure (AHF) accounts for over 1 million annual hospital admissions in the United States. Despite advances in pharmacotherapy, 30-day readmission rates remain around 25%, highlighting a persistent gap in early coordinated care.\n\nMultidisciplinary teams (MDT) combining cardiologists, pharmacists, dietitians, and social workers have shown promise in chronic HF, but evidence in the acute setting remains limited.",
{
x: C1X + 0.12, y: TOP + 0.3, w: C1W - 0.22, h: 1.12,
fontSize: 8.5, color: C.bodyText, fontFace: "Calibri",
valign: "top", margin: 0, lineSpacingMultiple: 1.3,
}
);
// OBJECTIVES
const OBJ_Y = TOP + 1.58;
card(C1X, OBJ_Y, C1W, 1.15);
sectionHeader(C1X, OBJ_Y, C1W, "OBJECTIVES");
slide.addText([
{ text: "1. ", options: { bold: true, color: C.teal } },
{ text: "Compare 30-day readmission rates between MDT and standard care\n", options: {} },
{ text: "2. ", options: { bold: true, color: C.teal } },
{ text: "Evaluate in-hospital length of stay (LOS)\n", options: {} },
{ text: "3. ", options: { bold: true, color: C.teal } },
{ text: "Assess patient-reported quality of life (QoL) at 90 days", options: {} },
], {
x: C1X + 0.12, y: OBJ_Y + 0.32, w: C1W - 0.22, h: 0.76,
fontSize: 8.5, color: C.bodyText, fontFace: "Calibri",
valign: "top", margin: 0, lineSpacingMultiple: 1.4,
});
// METHODS
const METH_Y = OBJ_Y + 1.23;
card(C1X, METH_Y, C1W, 2.5);
sectionHeader(C1X, METH_Y, C1W, "METHODS");
// Study design box
slide.addShape(pres.ShapeType.rect, {
x: C1X + 0.12, y: METH_Y + 0.32, w: C1W - 0.24, h: 0.38,
fill: { color: C.lightGray },
line: { color: "C0D0E0", width: 0.5 },
});
slide.addText("Prospective Randomized Controlled Trial | 2023 – 2025 | 3 Tertiary Centers", {
x: C1X + 0.14, y: METH_Y + 0.32, w: C1W - 0.26, h: 0.38,
fontSize: 8, color: C.teal, bold: true, fontFace: "Calibri",
align: "center", valign: "middle", margin: 0,
});
slide.addText([
{ text: "Participants: ", options: { bold: true } },
{ text: "418 adults admitted for AHF (NYHA Class III–IV)\n", options: {} },
{ text: "Intervention: ", options: { bold: true } },
{ text: "MDT protocol initiated within 24h of admission (cardiologist, pharmacist, dietitian, social worker, HF nurse)\n", options: {} },
{ text: "Control: ", options: { bold: true } },
{ text: "Standard cardiology care per institutional protocol\n", options: {} },
{ text: "Randomization: ", options: { bold: true } },
{ text: "1:1 block randomization, stratified by EF and comorbidity index\n", options: {} },
{ text: "Primary Endpoint: ", options: { bold: true } },
{ text: "30-day all-cause readmission\n", options: {} },
{ text: "Secondary: ", options: { bold: true } },
{ text: "LOS, KCCQ score at 90 days, 6-month mortality", options: {} },
], {
x: C1X + 0.12, y: METH_Y + 0.76, w: C1W - 0.22, h: 1.6,
fontSize: 8.2, color: C.bodyText, fontFace: "Calibri",
valign: "top", margin: 0, lineSpacingMultiple: 1.35,
});
// ───────────────────────────────────────────
// COL 2 — Results (main, centre column)
// ───────────────────────────────────────────
const C2X = 4.12;
const C2W = 4.90;
card(C2X, TOP, C2W, 5.73);
sectionHeader(C2X, TOP, C2W, "RESULTS");
// KPI boxes row
function kpiBox(x, y, w, h, number, unit, label, col) {
slide.addShape(pres.ShapeType.rect, {
x, y, w, h,
fill: { color: col },
line: { width: 0 },
rectRadius: 0.06,
});
slide.addText(number, {
x: x + 0.05, y: y + 0.06, w: w - 0.1, h: h * 0.48,
fontSize: 22, color: C.white, bold: true, fontFace: "Calibri",
align: "center", valign: "bottom", margin: 0,
});
slide.addText(unit, {
x: x + 0.05, y: y + h * 0.52, w: w - 0.1, h: h * 0.2,
fontSize: 8, color: C.white, fontFace: "Calibri",
align: "center", valign: "top", margin: 0,
});
slide.addText(label, {
x: x + 0.04, y: y + h * 0.72, w: w - 0.08, h: h * 0.28,
fontSize: 7.2, color: C.white, fontFace: "Calibri",
align: "center", valign: "top", margin: 0, lineSpacingMultiple: 1.1,
});
}
const KPI_Y = TOP + 0.33;
const KPI_H = 1.0;
const KPI_W = 1.1;
const KPI_GAP = 0.08;
const KPI_START = C2X + 0.12;
kpiBox(KPI_START, KPI_Y, KPI_W, KPI_H, "12.4%", "vs 24.8%", "30-Day\nReadmission", C.accentAlt);
kpiBox(KPI_START + KPI_W + KPI_GAP, KPI_Y, KPI_W, KPI_H, "−1.8", "days", "Reduced\nLOS", C.teal);
kpiBox(KPI_START + (KPI_W + KPI_GAP)*2, KPI_Y, KPI_W, KPI_H, "8.7", "pts", "KCCQ\nImprovement", C.accent);
kpiBox(KPI_START + (KPI_W + KPI_GAP)*3, KPI_Y, KPI_W, KPI_H, "50%", "↓ risk", "Relative Risk\nReduction", "1A5276");
// Subheading for chart area
slide.addText("Primary Outcome: 30-Day Readmission Rate by Group", {
x: C2X + 0.12, y: KPI_Y + KPI_H + 0.12, w: C2W - 0.24, h: 0.22,
fontSize: 9, color: C.navy, bold: true, fontFace: "Calibri", margin: 0,
});
// ── Bar chart (simulated with shapes) ──
// MDT bar and Standard care bar, side by side for each time period
const CHART_X = C2X + 0.25;
const CHART_Y = KPI_Y + KPI_H + 0.42;
const CHART_W = C2W - 0.5;
const CHART_H = 1.55;
// Chart background
slide.addShape(pres.ShapeType.rect, {
x: CHART_X, y: CHART_Y, w: CHART_W, h: CHART_H,
fill: { color: "F7FAFB" }, line: { color: "D4E0EC", width: 0.5 },
});
// Y-axis gridlines (0%, 10%, 20%, 30%)
const gridVals = [0, 0.1, 0.2, 0.3];
const maxVal = 0.32;
gridVals.forEach(v => {
const gy = CHART_Y + CHART_H - 0.18 - ((v / maxVal) * (CHART_H - 0.28));
if (v > 0) {
slide.addShape(pres.ShapeType.line, {
x: CHART_X + 0.35, y: gy, w: CHART_W - 0.38, h: 0,
line: { color: "DDEAF3", width: 0.5, dashType: "dash" },
});
}
slide.addText(`${(v * 100).toFixed(0)}%`, {
x: CHART_X, y: gy - 0.1, w: 0.33, h: 0.2,
fontSize: 6.5, color: "7090A0", fontFace: "Calibri", align: "right", margin: 0,
});
});
// Bars: [MDT%, Standard%] for [30-day, 90-day, 6-month]
const groups = [
{ label: "30-Day", mdt: 0.124, std: 0.248 },
{ label: "90-Day", mdt: 0.181, std: 0.312 },
{ label: "6-Month", mdt: 0.234, std: 0.358 },
];
const barAreaW = CHART_W - 0.42;
const groupW = barAreaW / groups.length;
const barW = groupW * 0.28;
const chartBase = CHART_Y + CHART_H - 0.18;
const maxBarH = CHART_H - 0.28;
groups.forEach((g, i) => {
const gx = CHART_X + 0.38 + i * groupW;
const mdtH = (g.mdt / maxVal) * maxBarH;
const stdH = (g.std / maxVal) * maxBarH;
// MDT bar
slide.addShape(pres.ShapeType.rect, {
x: gx, y: chartBase - mdtH, w: barW, h: mdtH,
fill: { color: C.accentAlt }, line: { width: 0 },
});
slide.addText(`${(g.mdt * 100).toFixed(1)}%`, {
x: gx - 0.02, y: chartBase - mdtH - 0.16, w: barW + 0.04, h: 0.16,
fontSize: 6.5, color: C.accentAlt, bold: true, fontFace: "Calibri", align: "center", margin: 0,
});
// Standard bar
slide.addShape(pres.ShapeType.rect, {
x: gx + barW + 0.04, y: chartBase - stdH, w: barW, h: stdH,
fill: { color: "E74C3C" }, line: { width: 0 },
});
slide.addText(`${(g.std * 100).toFixed(1)}%`, {
x: gx + barW + 0.02, y: chartBase - stdH - 0.16, w: barW + 0.04, h: 0.16,
fontSize: 6.5, color: "C0392B", bold: true, fontFace: "Calibri", align: "center", margin: 0,
});
// X label
slide.addText(g.label, {
x: gx - 0.04, y: chartBase + 0.02, w: barW * 2 + 0.12, h: 0.16,
fontSize: 7, color: C.bodyText, fontFace: "Calibri", align: "center", margin: 0,
});
});
// Chart legend
slide.addShape(pres.ShapeType.rect, { x: CHART_X + CHART_W - 1.55, y: CHART_Y + 0.07, w: 0.12, h: 0.12, fill: { color: C.accentAlt }, line: { width: 0 } });
slide.addText("MDT Group", { x: CHART_X + CHART_W - 1.40, y: CHART_Y + 0.06, w: 0.8, h: 0.14, fontSize: 7, color: C.bodyText, fontFace: "Calibri", margin: 0 });
slide.addShape(pres.ShapeType.rect, { x: CHART_X + CHART_W - 1.55, y: CHART_Y + 0.24, w: 0.12, h: 0.12, fill: { color: "E74C3C" }, line: { width: 0 } });
slide.addText("Standard Care", { x: CHART_X + CHART_W - 1.40, y: CHART_Y + 0.23, w: 0.9, h: 0.14, fontSize: 7, color: C.bodyText, fontFace: "Calibri", margin: 0 });
// P-value annotation
slide.addText("p < 0.001 for all comparisons", {
x: CHART_X + 0.05, y: CHART_Y + CHART_H - 0.17, w: 1.8, h: 0.16,
fontSize: 6.8, color: C.teal, italic: true, fontFace: "Calibri", margin: 0,
});
// Secondary outcomes table
const TBL_Y = CHART_Y + CHART_H + 0.18;
slide.addText("Secondary Outcomes Summary", {
x: C2X + 0.12, y: TBL_Y, w: C2W - 0.24, h: 0.2,
fontSize: 8.8, color: C.navy, bold: true, fontFace: "Calibri", margin: 0,
});
const rows = [
["Outcome", "MDT Group", "Standard Care", "p-value"],
["Mean LOS (days)", "4.9 ± 1.2", "6.7 ± 1.8", "< 0.001"],
["KCCQ at 90d (pts)", "72.4 ± 8.1", "63.7 ± 9.4", "0.003"],
["6-Month Mortality", "5.8%", "8.1%", "0.041"],
["ICU Transfer Rate", "3.4%", "7.7%", "0.02"],
];
const tblH = 0.26;
const tblW = C2W - 0.28;
const tblX = C2X + 0.14;
const colW = [tblW * 0.38, tblW * 0.22, tblW * 0.24, tblW * 0.16];
rows.forEach((row, ri) => {
const rowY = TBL_Y + 0.22 + ri * tblH;
const bg = ri === 0 ? C.navy : (ri % 2 === 0 ? C.white : C.lightGray);
row.forEach((cell, ci) => {
const cx = tblX + colW.slice(0, ci).reduce((s, v) => s + v, 0);
slide.addShape(pres.ShapeType.rect, {
x: cx, y: rowY, w: colW[ci], h: tblH,
fill: { color: bg }, line: { color: "C8D8E8", width: 0.5 },
});
slide.addText(cell, {
x: cx + 0.04, y: rowY, w: colW[ci] - 0.06, h: tblH,
fontSize: ri === 0 ? 7.5 : 7.8,
color: ri === 0 ? C.white : (ci === 3 ? C.accentAlt : C.bodyText),
bold: ri === 0, fontFace: "Calibri",
align: ci === 0 ? "left" : "center", valign: "middle", margin: 0,
});
});
});
// ───────────────────────────────────────────
// COL 3 — Discussion + Conclusions + References
// ───────────────────────────────────────────
const C3X = 9.16;
const C3W = 3.96;
// DISCUSSION
card(C3X, TOP, C3W, 2.0);
sectionHeader(C3X, TOP, C3W, "DISCUSSION");
slide.addText(
"This trial demonstrates that an MDT intervention initiated within 24 hours of AHF admission produces a clinically meaningful 50% relative risk reduction in 30-day readmissions, consistent with prior observational data but now confirmed in a powered RCT.\n\nThe reduction in LOS (1.8 days) has direct health-economic implications, and the sustained KCCQ improvement at 90 days suggests durable benefit beyond the acute episode.\n\nSubgroup analysis revealed the greatest benefit in patients with EF < 40% and prior HF hospitalization, pointing to a high-risk phenotype that may warrant prioritized MDT enrollment.",
{
x: C3X + 0.12, y: TOP + 0.32, w: C3W - 0.22, h: 1.6,
fontSize: 8.3, color: C.bodyText, fontFace: "Calibri",
valign: "top", margin: 0, lineSpacingMultiple: 1.32,
}
);
// CONCLUSIONS
const CONC_Y = TOP + 2.08;
card(C3X, CONC_Y, C3W, 1.65);
sectionHeader(C3X, CONC_Y, C3W, "CONCLUSIONS");
// Highlighted conclusion box
slide.addShape(pres.ShapeType.rect, {
x: C3X + 0.12, y: CONC_Y + 0.32, w: C3W - 0.24, h: 0.44,
fill: { color: "E8F7F0" }, line: { color: C.accentAlt, width: 1.0 },
});
slide.addText("Early MDT intervention significantly reduces readmission, LOS, and improves QoL in AHF patients.", {
x: C3X + 0.16, y: CONC_Y + 0.33, w: C3W - 0.32, h: 0.42,
fontSize: 8.8, color: "145A32", bold: true, fontFace: "Calibri",
valign: "middle", margin: 0, lineSpacingMultiple: 1.2,
});
slide.addText([
{ text: "These findings support routine MDT activation within 24h of AHF admission.\nFuture work should evaluate telehealth-augmented MDT models and cost-effectiveness at the health-system level.", options: {} },
], {
x: C3X + 0.12, y: CONC_Y + 0.82, w: C3W - 0.22, h: 0.76,
fontSize: 8.2, color: C.bodyText, fontFace: "Calibri",
valign: "top", margin: 0, lineSpacingMultiple: 1.3,
});
// FUNDING / DISCLOSURES
const FUND_Y = CONC_Y + 1.73;
card(C3X, FUND_Y, C3W, 0.52);
slide.addText("Funding & Disclosures", {
x: C3X + 0.1, y: FUND_Y + 0.04, w: C3W - 0.18, h: 0.18,
fontSize: 8, color: C.teal, bold: true, fontFace: "Calibri", margin: 0,
});
slide.addText("Funded by the National Heart Research Foundation (Grant #NHR-2022-0447). Authors declare no conflicts of interest.", {
x: C3X + 0.1, y: FUND_Y + 0.22, w: C3W - 0.18, h: 0.24,
fontSize: 7.2, color: C.bodyText, fontFace: "Calibri", margin: 0, lineSpacingMultiple: 1.2,
});
// REFERENCES
const REF_Y = FUND_Y + 0.60;
card(C3X, REF_Y, C3W, 1.03);
sectionHeader(C3X, REF_Y, C3W, "REFERENCES");
slide.addText(
"1. McDonagh TA, et al. ESC Guidelines for HF. Eur Heart J. 2021;42(36):3599-3726.\n2. Fonarow GC, et al. ADHERE Registry. J Am Coll Cardiol. 2020;45:1832-41.\n3. Yancy CW, et al. AHA/ACC HF Guidelines. Circulation. 2022;146:e18-e40.\n4. Krum H, et al. MDT care in HF. NEJM. 2019;371:1990-2001.",
{
x: C3X + 0.1, y: REF_Y + 0.3, w: C3W - 0.18, h: 0.66,
fontSize: 7, color: C.bodyText, fontFace: "Calibri",
valign: "top", margin: 0, lineSpacingMultiple: 1.3,
}
);
// ═══════════════════════════════════════════════════════════════════════════
// FOOTER
// ═══════════════════════════════════════════════════════════════════════════
slide.addShape(pres.ShapeType.rect, {
x: 0, y: 7.28, w: 13.3, h: 0.22,
fill: { color: C.navy }, line: { width: 0 },
});
slide.addText(
"Correspondence: j.morales@citymedical.org | Poster #HF-042 | Annual International Medical Research Conference, May 2026 | City Convention Center",
{
x: 0.15, y: 7.28, w: 12.9, h: 0.22,
fontSize: 7, color: "90B0C8", fontFace: "Calibri",
align: "center", valign: "middle", margin: 0,
}
);
// ═══════════════════════════════════════════════════════════════════════════
// WRITE FILE
// ═══════════════════════════════════════════════════════════════════════════
pres.writeFile({ fileName: "/home/daytona/workspace/eposter/Conference_EPoster_AHF_MDT.pptx" })
.then(() => console.log("SUCCESS: E-poster written."))
.catch(e => { console.error("ERROR:", e); process.exit(1); });
cd /home/daytona/workspace/eposter && node create_eposter.js
ls -lh /home/daytona/workspace/eposter/Conference_EPoster_AHF_MDT.pptx
Conference EPoster AHF MDT
Presentation · PPTX