Create an e poster for conference presentation

Asking for Preferences
Reading File
Reading File
Running Command

ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace not found"

Running Command

mkdir -p /home/daytona/workspace/eposter && echo "Directory created"

Writing File

~/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); });
Running Command

cd /home/daytona/workspace/eposter && node create_eposter.js

Running Command

ls -lh /home/daytona/workspace/eposter/Conference_EPoster_AHF_MDT.pptx

Your e-poster is ready! Download it here:

Conference EPoster AHF MDT

Presentation · PPTX


Here's what's included in the poster:
Layout: Single wide slide (13.3" x 7.5") in standard landscape e-poster format, organized in 3 columns.
Design:
  • Navy blue header with poster title, authors, and affiliations
  • Teal section header bars throughout
  • White content cards with subtle shadows
  • Color-coded KPI metric boxes (green, teal, orange, dark blue)
  • Simulated bar chart comparing MDT vs. Standard Care readmission rates across 3 time points
  • Striped data table for secondary outcomes
  • Navy footer with contact/conference info
Content (sample medical research - easily replaceable):
  • Background, Objectives, Methods
  • 4 KPI highlight boxes (12.4% readmission, -1.8 days LOS, +8.7 KCCQ points, 50% risk reduction)
  • Bar chart (30-day, 90-day, 6-month readmissions)
  • Secondary outcomes table (LOS, KCCQ, mortality, ICU transfer)
  • Discussion, Conclusions, Funding, References
To customize: Just open the .pptx in PowerPoint and replace the title, authors, institution, and all content text with your own data. If you share your actual research content with me, I can rebuild it with your specific information.
This is a shared conversation. Sign in to Orris to start your own chat.