Create presentation for present simple tense , present continuous tense with affirmative, negative and questions sentence formulas , sentence structure/format and examples in a colourful way

Reading File
Reading File
Running Command

ls -la /home/daytona/workspace/

Running Command

mkdir -p /home/daytona/workspace/english-tenses-ppt

Writing File

~/english-tenses-ppt/create_ppt.js

const pptxgen = require("pptxgenjs");

const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Present Simple & Present Continuous Tenses";

// ─────────────────────────────────────────────
// COLOR PALETTE
// ─────────────────────────────────────────────
const C = {
  // Present Simple palette (deep indigo + amber accent)
  ps_bg:       "1A1A40",   // deep navy
  ps_header:   "F5A623",   // amber
  ps_accent1:  "7B5EA7",   // purple
  ps_aff:      "27AE60",   // green   (affirmative)
  ps_neg:      "E74C3C",   // red     (negative)
  ps_q:        "2980B9",   // blue    (question)
  // Present Continuous palette (teal + coral accent)
  pc_bg:       "0D3349",   // deep teal-navy
  pc_header:   "FF6B6B",   // coral
  pc_accent1:  "1ABC9C",   // teal
  pc_aff:      "27AE60",
  pc_neg:      "E74C3C",
  pc_q:        "2980B9",
  // Shared
  white:       "FFFFFF",
  lightGray:   "F0F4FF",
  darkText:    "1C1C2E",
  yellow:      "FFD700",
  orange:      "FF8C00",
  softBlue:    "D6EAF8",
  softGreen:   "D5F5E3",
  softRed:     "FADBD8",
  softPurple:  "E8DAEF",
};

// ─────────────────────────────────────────────
// HELPER: full-slide background rect
// ─────────────────────────────────────────────
function bg(slide, color) {
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color } });
}

// ─────────────────────────────────────────────
// HELPER: decorative top banner strip
// ─────────────────────────────────────────────
function banner(slide, color, h = 0.08) {
  slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h, fill: { color }, line: { color, width: 0 } });
}

// ─────────────────────────────────────────────
// HELPER: pill / label badge
// ─────────────────────────────────────────────
function pill(slide, text, x, y, w, h, fillColor, textColor = "FFFFFF", fontSize = 11) {
  slide.addShape(pres.ShapeType.roundRect, {
    x, y, w, h,
    fill: { color: fillColor },
    line: { color: fillColor },
    rectRadius: 0.15,
  });
  slide.addText(text, {
    x, y, w, h,
    fontSize,
    bold: true,
    color: textColor,
    align: "center",
    valign: "middle",
    margin: 0,
  });
}

// ─────────────────────────────────────────────
// HELPER: formula box (rounded rect + text)
// ─────────────────────────────────────────────
function formulaBox(slide, text, x, y, w, h, bgColor, textColor = C.white, fontSize = 13) {
  slide.addShape(pres.ShapeType.roundRect, {
    x, y, w, h,
    fill: { color: bgColor },
    line: { color: bgColor },
    rectRadius: 0.2,
    shadow: { type: "outer", blur: 8, offset: 3, angle: 45, color: "000000", opacity: 0.3 },
  });
  slide.addText(text, {
    x, y, w, h,
    fontSize,
    bold: true,
    color: textColor,
    align: "center",
    valign: "middle",
    margin: 6,
    fontFace: "Courier New",
  });
}

// ─────────────────────────────────────────────
// HELPER: example row
// ─────────────────────────────────────────────
function exRow(slide, sentence, x, y, w, h, bgColor, textColor = C.darkText) {
  slide.addShape(pres.ShapeType.roundRect, {
    x, y, w, h,
    fill: { color: bgColor },
    line: { color: bgColor },
    rectRadius: 0.12,
  });
  slide.addText(sentence, {
    x: x + 0.15, y, w: w - 0.3, h,
    fontSize: 11.5,
    color: textColor,
    align: "left",
    valign: "middle",
    italic: true,
    margin: 0,
  });
}

// ═══════════════════════════════════════════════
// SLIDE 1 — TITLE
// ═══════════════════════════════════════════════
{
  const s = pres.addSlide();
  // gradient-like bg with two rects
  s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: "0D1B40" } });
  s.addShape(pres.ShapeType.rect, { x: 0, y: 3.8, w: 10, h: 1.825, fill: { color: "101535" } });

  // decorative circles
  s.addShape(pres.ShapeType.ellipse, { x: -0.6, y: -0.4, w: 2.2, h: 2.2, fill: { color: "F5A623", transparency: 70 }, line: { color: "F5A623", transparency: 70 } });
  s.addShape(pres.ShapeType.ellipse, { x: 8.8, y: 3.8, w: 2, h: 2, fill: { color: "FF6B6B", transparency: 65 }, line: { color: "FF6B6B", transparency: 65 } });
  s.addShape(pres.ShapeType.ellipse, { x: 7.5, y: -0.3, w: 1.4, h: 1.4, fill: { color: "7B5EA7", transparency: 60 }, line: { color: "7B5EA7", transparency: 60 } });
  s.addShape(pres.ShapeType.ellipse, { x: 0.5, y: 4.0, w: 1.1, h: 1.1, fill: { color: "1ABC9C", transparency: 60 }, line: { color: "1ABC9C", transparency: 60 } });

  // Two tense labels as pills at top
  pill(s, "PRESENT SIMPLE", 1.8, 0.6, 2.8, 0.42, "F5A623", "1A1A40", 12);
  pill(s, "PRESENT CONTINUOUS", 5.4, 0.6, 2.9, 0.42, "FF6B6B", C.white, 12);

  // Main title
  s.addText("English Tenses", {
    x: 0.5, y: 1.2, w: 9, h: 1.05,
    fontSize: 46, bold: true, color: C.white,
    align: "center", fontFace: "Arial",
    glow: { size: 18, color: "7B5EA7", opacity: 0.55 },
  });
  s.addText("A Complete Visual Guide", {
    x: 0.5, y: 2.25, w: 9, h: 0.55,
    fontSize: 20, color: "C9D6FF", align: "center", italic: true,
  });

  // subtitle line
  s.addShape(pres.ShapeType.rect, { x: 3.5, y: 2.9, w: 3, h: 0.05, fill: { color: "F5A623" } });

  // Bottom info pills
  pill(s, "✔  Affirmative", 1.2, 3.45, 1.9, 0.38, "27AE60", C.white, 10.5);
  pill(s, "✖  Negative",    3.5, 3.45, 1.8, 0.38, "E74C3C", C.white, 10.5);
  pill(s, "?  Questions",   5.6, 3.45, 1.9, 0.38, "2980B9", C.white, 10.5);
  pill(s, "📝  Examples",   7.8, 3.45, 1.6, 0.38, "7B5EA7", C.white, 10.5);

  s.addText("Formulas  •  Sentence Structure  •  Examples", {
    x: 0.5, y: 4.9, w: 9, h: 0.4,
    fontSize: 11, color: "8899CC", align: "center",
  });
}

// ═══════════════════════════════════════════════
// SLIDE 2 — PRESENT SIMPLE OVERVIEW
// ═══════════════════════════════════════════════
{
  const s = pres.addSlide();
  bg(s, "1A1A40");
  banner(s, "F5A623", 0.1);

  // Title bar
  s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 0.18, w: 5.5, h: 0.7, fill: { color: "F5A623" }, line: { color: "F5A623" }, rectRadius: 0.15 });
  s.addText("PRESENT SIMPLE TENSE", { x: 0.3, y: 0.18, w: 5.5, h: 0.7, fontSize: 18, bold: true, color: "1A1A40", align: "center", valign: "middle", margin: 0 });

  // What is it?
  s.addText("What is it?", { x: 0.4, y: 1.05, w: 4, h: 0.38, fontSize: 14, bold: true, color: "F5A623" });
  s.addText([
    { text: "Used for ", options: { color: "C9D6FF" } },
    { text: "habits, routines, facts, schedules", options: { bold: true, color: C.yellow } },
    { text: " and general truths.", options: { color: "C9D6FF" } },
  ], { x: 0.4, y: 1.42, w: 9, h: 0.5, fontSize: 13 });

  // Signal words box
  s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 2.0, w: 9.4, h: 1.1, fill: { color: "252560" }, line: { color: "7B5EA7", width: 1.5 }, rectRadius: 0.18 });
  s.addText("⏱  Signal Words", { x: 0.5, y: 2.05, w: 3, h: 0.38, fontSize: 12, bold: true, color: "F5A623" });

  const signals = ["always", "usually", "often", "sometimes", "rarely", "never", "every day", "every week", "on Mondays", "in the morning"];
  signals.forEach((w, i) => {
    const col = i % 5;
    const row = Math.floor(i / 5);
    pill(s, w, 0.45 + col * 1.82, 2.48 + row * 0, 1.65, 0.35, i % 2 === 0 ? "7B5EA7" : "3D3D8F", C.white, 10);
  });

  // Key rule
  s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 3.25, w: 9.4, h: 1.05, fill: { color: "1E1E50" }, line: { color: "F5A623", width: 1.5 }, rectRadius: 0.18 });
  s.addText("📌  Key Rule for He / She / It:", { x: 0.5, y: 3.3, w: 5, h: 0.38, fontSize: 12, bold: true, color: "F5A623" });
  s.addText([
    { text: "Add  ", options: { color: "C9D6FF" } },
    { text: "-s  or  -es", options: { bold: true, color: "FFD700", fontSize: 15 } },
    { text: "  to the base verb  →  ", options: { color: "C9D6FF" } },
    { text: 'work', options: { bold: true, color: "1ABC9C", italic: true } },
    { text: " → ", options: { color: "C9D6FF" } },
    { text: "works", options: { bold: true, color: "FF6B6B", italic: true } },
    { text: "   |   ", options: { color: "C9D6FF" } },
    { text: "go", options: { bold: true, color: "1ABC9C", italic: true } },
    { text: " → ", options: { color: "C9D6FF" } },
    { text: "goes", options: { bold: true, color: "FF6B6B", italic: true } },
  ], { x: 0.5, y: 3.65, w: 9, h: 0.45, fontSize: 12.5 });

  s.addText("slide 2 / 10", { x: 8.5, y: 5.3, w: 1.3, h: 0.25, fontSize: 8, color: "555580", align: "right" });
}

// ═══════════════════════════════════════════════
// SLIDE 3 — PRESENT SIMPLE AFFIRMATIVE
// ═══════════════════════════════════════════════
{
  const s = pres.addSlide();
  bg(s, "0F2D1A");
  banner(s, "27AE60", 0.1);

  // Section badge
  s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 0.18, w: 2.0, h: 0.62, fill: { color: "27AE60" }, line: { color: "27AE60" }, rectRadius: 0.15 });
  s.addText("✔  AFFIRMATIVE", { x: 0.3, y: 0.18, w: 2.0, h: 0.62, fontSize: 11, bold: true, color: C.white, align: "center", valign: "middle", margin: 0 });
  s.addText("PRESENT SIMPLE", { x: 2.5, y: 0.25, w: 5, h: 0.5, fontSize: 16, bold: true, color: "27AE60" });

  // Formula boxes
  s.addText("📐  Sentence Formula", { x: 0.3, y: 0.98, w: 5, h: 0.38, fontSize: 13, bold: true, color: "A9DFBF" });

  formulaBox(s, "I / You / We / They  +  Base Verb", 0.3, 1.38, 5.5, 0.6, "1A5C30", "A9DFBF", 12);
  formulaBox(s, "He / She / It  +  Verb + s / es", 0.3, 2.05, 5.5, 0.6, "1A5C30", "FFD700", 12);

  // Structure breakdown
  s.addText("🔧  Structure Breakdown", { x: 6.1, y: 0.98, w: 3.7, h: 0.38, fontSize: 13, bold: true, color: "A9DFBF" });
  const structRows = [
    ["Subject", "The person/thing acting", "2980B9"],
    ["Base Verb", "Action (no change for I/you/we/they)", "F5A623"],
    ["Verb +s/es", "Action changed for he/she/it", "FF6B6B"],
  ];
  structRows.forEach(([label, desc, color], i) => {
    s.addShape(pres.ShapeType.roundRect, { x: 6.1, y: 1.42 + i * 0.55, w: 3.7, h: 0.48, fill: { color: "1A3D20" }, line: { color, width: 1.2 }, rectRadius: 0.1 });
    s.addText(label, { x: 6.15, y: 1.42 + i * 0.55, w: 1.1, h: 0.48, fontSize: 10, bold: true, color, valign: "middle", align: "left", margin: 4 });
    s.addText(desc, { x: 7.3, y: 1.42 + i * 0.55, w: 2.4, h: 0.48, fontSize: 9.5, color: "C9DCCC", valign: "middle", align: "left", margin: 4 });
  });

  // Examples
  s.addText("📝  Examples", { x: 0.3, y: 2.85, w: 9, h: 0.38, fontSize: 13, bold: true, color: "A9DFBF" });

  const affExamples = [
    ["I / You / We / They", "I  work  every day.", "2C7A4B"],
    ["I / You / We / They", "They  play  football on Sundays.", "2C7A4B"],
    ["He / She / It",       "She  works  at a hospital.", "1A5C30"],
    ["He / She / It",       "He  goes  to school by bus.", "1A5C30"],
    ["He / She / It",       "The sun  rises  in the east. (fact)", "0F3D20"],
  ];
  affExamples.forEach(([label, sentence, bg2], i) => {
    const row = Math.floor(i / 2);
    const col = i % 2;
    const x = col === 0 ? 0.3 : 5.1;
    const y = 3.28 + row * 0.52;
    if (i === 4) {
      s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 3.28 + 2 * 0.52, w: 9.4, h: 0.45, fill: { color: bg2 }, line: { color: "27AE60", width: 0.8 }, rectRadius: 0.1 });
      s.addText([
        { text: "  " + label + "  →  ", options: { fontSize: 9.5, bold: true, color: "A9DFBF" } },
        { text: sentence, options: { fontSize: 11, italic: true, color: C.white } },
      ], { x: 0.3, y: 3.28 + 2 * 0.52, w: 9.4, h: 0.45, valign: "middle", margin: 0 });
    } else {
      s.addShape(pres.ShapeType.roundRect, { x, y, w: 4.65, h: 0.45, fill: { color: bg2 }, line: { color: "27AE60", width: 0.8 }, rectRadius: 0.1 });
      s.addText([
        { text: "  " + label + "  →  ", options: { fontSize: 9.5, bold: true, color: "A9DFBF" } },
        { text: sentence, options: { fontSize: 11, italic: true, color: C.white } },
      ], { x, y, w: 4.65, h: 0.45, valign: "middle", margin: 0 });
    }
  });
  s.addText("slide 3 / 10", { x: 8.5, y: 5.3, w: 1.3, h: 0.25, fontSize: 8, color: "335533", align: "right" });
}

// ═══════════════════════════════════════════════
// SLIDE 4 — PRESENT SIMPLE NEGATIVE
// ═══════════════════════════════════════════════
{
  const s = pres.addSlide();
  bg(s, "2D0A0A");
  banner(s, "E74C3C", 0.1);

  s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 0.18, w: 2.0, h: 0.62, fill: { color: "E74C3C" }, line: { color: "E74C3C" }, rectRadius: 0.15 });
  s.addText("✖  NEGATIVE", { x: 0.3, y: 0.18, w: 2.0, h: 0.62, fontSize: 11, bold: true, color: C.white, align: "center", valign: "middle", margin: 0 });
  s.addText("PRESENT SIMPLE", { x: 2.5, y: 0.25, w: 5, h: 0.5, fontSize: 16, bold: true, color: "E74C3C" });

  // Formulas
  s.addText("📐  Sentence Formula", { x: 0.3, y: 0.98, w: 9, h: 0.38, fontSize: 13, bold: true, color: "F1948A" });
  formulaBox(s, "I / You / We / They  +  do not (don't)  +  Base Verb", 0.3, 1.38, 9.4, 0.6, "5C1A1A", "F9EBEA", 12.5);
  formulaBox(s, "He / She / It  +  does not (doesn't)  +  Base Verb", 0.3, 2.06, 9.4, 0.6, "5C1A1A", "FFD700", 12.5);

  // Key note
  s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 2.78, w: 9.4, h: 0.55, fill: { color: "3D1010" }, line: { color: "E74C3C", width: 1.2 }, rectRadius: 0.12 });
  s.addText([
    { text: "💡  Remember: ", options: { bold: true, color: "F5A623" } },
    { text: "When using ", options: { color: "F1948A" } },
    { text: "doesn't", options: { bold: true, color: "FF6B6B", italic: true } },
    { text: ", the main verb goes back to its ", options: { color: "F1948A" } },
    { text: "base form", options: { bold: true, color: "FFD700" } },
    { text: "  (no -s/-es).", options: { color: "F1948A" } },
  ], { x: 0.3, y: 2.78, w: 9.4, h: 0.55, valign: "middle", margin: 8, fontSize: 12 });

  // Examples
  s.addText("📝  Examples", { x: 0.3, y: 3.42, w: 9, h: 0.38, fontSize: 13, bold: true, color: "F1948A" });
  const negEx = [
    ["I / You / We / They", "I  don't  like coffee."],
    ["I / You / We / They", "They  don't  play tennis."],
    ["He / She / It",       "She  doesn't  eat meat."],
    ["He / She / It",       "He  doesn't  drive to work."],
  ];
  negEx.forEach(([label, sentence], i) => {
    const col = i % 2;
    const row = Math.floor(i / 2);
    const x = col === 0 ? 0.3 : 5.1;
    const y = 3.85 + row * 0.5;
    const bgC = label.includes("He") ? "4A1010" : "3A0D0D";
    s.addShape(pres.ShapeType.roundRect, { x, y, w: 4.65, h: 0.42, fill: { color: bgC }, line: { color: "E74C3C", width: 0.8 }, rectRadius: 0.1 });
    s.addText([
      { text: "  " + label + "  →  ", options: { fontSize: 9.5, bold: true, color: "F1948A" } },
      { text: sentence, options: { fontSize: 11, italic: true, color: C.white } },
    ], { x, y, w: 4.65, h: 0.42, valign: "middle", margin: 0 });
  });
  s.addText("slide 4 / 10", { x: 8.5, y: 5.3, w: 1.3, h: 0.25, fontSize: 8, color: "553333", align: "right" });
}

// ═══════════════════════════════════════════════
// SLIDE 5 — PRESENT SIMPLE QUESTIONS
// ═══════════════════════════════════════════════
{
  const s = pres.addSlide();
  bg(s, "071828");
  banner(s, "2980B9", 0.1);

  s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 0.18, w: 2.0, h: 0.62, fill: { color: "2980B9" }, line: { color: "2980B9" }, rectRadius: 0.15 });
  s.addText("?  QUESTIONS", { x: 0.3, y: 0.18, w: 2.0, h: 0.62, fontSize: 11, bold: true, color: C.white, align: "center", valign: "middle", margin: 0 });
  s.addText("PRESENT SIMPLE", { x: 2.5, y: 0.25, w: 5, h: 0.5, fontSize: 16, bold: true, color: "5DADE2" });

  // Yes/No question formula
  s.addText("Yes / No Questions", { x: 0.3, y: 0.97, w: 5, h: 0.38, fontSize: 13, bold: true, color: "AED6F1" });
  formulaBox(s, "Do  +  I / You / We / They  +  Base Verb  + ?", 0.3, 1.37, 9.4, 0.58, "0D3349", "AED6F1", 12.5);
  formulaBox(s, "Does  +  He / She / It  +  Base Verb  + ?", 0.3, 2.02, 9.4, 0.58, "0D3349", "FFD700", 12.5);

  // WH question formula
  s.addText("WH- Questions", { x: 0.3, y: 2.72, w: 9, h: 0.38, fontSize: 13, bold: true, color: "AED6F1" });
  formulaBox(s, "WH-word  +  do / does  +  Subject  +  Base Verb  + ?", 0.3, 3.12, 9.4, 0.58, "062040", "FF6B6B", 12.5);

  // Examples
  s.addText("📝  Examples", { x: 0.3, y: 3.82, w: 9, h: 0.35, fontSize: 12, bold: true, color: "AED6F1" });
  const qEx = [
    ["Yes/No", "Do you like pizza?",           "0D3349"],
    ["Yes/No", "Does he work here?",           "0D3349"],
    ["WH",     "Where do they live?",           "062040"],
    ["WH",     "What does she do on weekends?", "062040"],
  ];
  qEx.forEach(([type, q], i) => {
    const col = i % 2;
    const row = Math.floor(i / 2);
    const x = col === 0 ? 0.3 : 5.1;
    const y = 4.22 + row * 0.49;
    const bc = type === "WH" ? "1A5276" : "154360";
    s.addShape(pres.ShapeType.roundRect, { x, y, w: 4.65, h: 0.42, fill: { color: bc }, line: { color: "2980B9", width: 0.8 }, rectRadius: 0.1 });
    s.addText([
      { text: "  [" + type + "]  ", options: { fontSize: 9, bold: true, color: "5DADE2" } },
      { text: q, options: { fontSize: 11, italic: true, color: C.white } },
    ], { x, y, w: 4.65, h: 0.42, valign: "middle", margin: 0 });
  });
  s.addText("slide 5 / 10", { x: 8.5, y: 5.3, w: 1.3, h: 0.25, fontSize: 8, color: "335566", align: "right" });
}

// ═══════════════════════════════════════════════
// SLIDE 6 — PRESENT SIMPLE SUMMARY TABLE
// ═══════════════════════════════════════════════
{
  const s = pres.addSlide();
  bg(s, "12103A");
  banner(s, "F5A623", 0.1);

  s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 0.18, w: 9.4, h: 0.7, fill: { color: "F5A623" }, line: { color: "F5A623" }, rectRadius: 0.15 });
  s.addText("PRESENT SIMPLE  —  QUICK REFERENCE SUMMARY", { x: 0.3, y: 0.18, w: 9.4, h: 0.7, fontSize: 17, bold: true, color: "12103A", align: "center", valign: "middle", margin: 0 });

  const headers = ["TYPE", "SUBJECT", "FORMULA", "EXAMPLE"];
  const colWidths = [1.3, 2.1, 3.5, 2.5];
  const colX = [0.3, 1.6, 3.7, 7.2];

  // Header row
  headers.forEach((h, i) => {
    s.addShape(pres.ShapeType.rect, { x: colX[i], y: 1.08, w: colWidths[i], h: 0.45, fill: { color: "2C2870" }, line: { color: "F5A623", width: 0.8 } });
    s.addText(h, { x: colX[i], y: 1.08, w: colWidths[i], h: 0.45, fontSize: 11, bold: true, color: "F5A623", align: "center", valign: "middle", margin: 0 });
  });

  const rows = [
    ["✔  AFF", "I/You/We/They", "Subject + Verb",          "I work every day."],
    ["✔  AFF", "He/She/It",     "Subject + Verb+s/es",      "She works at school."],
    ["✖  NEG", "I/You/We/They", "Subject + don't + Verb",   "They don't like tea."],
    ["✖  NEG", "He/She/It",     "Subject + doesn't + Verb", "He doesn't drive."],
    ["?  Q",   "I/You/We/They", "Do + Subject + Verb + ?",  "Do you play chess?"],
    ["?  Q",   "He/She/It",     "Does + Subject + Verb + ?","Does she sing well?"],
  ];
  const rowColors = ["163B2E", "1A3D20", "3D0F0F", "4A1010", "0D2A40", "0A1E30"];
  const typeColors = ["27AE60", "27AE60", "E74C3C", "E74C3C", "2980B9", "2980B9"];

  rows.forEach((row, ri) => {
    const y = 1.53 + ri * 0.48;
    row.forEach((cell, ci) => {
      s.addShape(pres.ShapeType.rect, { x: colX[ci], y, w: colWidths[ci], h: 0.45, fill: { color: rowColors[ri] }, line: { color: "2C2870", width: 0.6 } });
      s.addText(cell, {
        x: colX[ci], y, w: colWidths[ci], h: 0.45,
        fontSize: ci === 0 ? 10 : (ci === 2 ? 10 : 10.5),
        bold: ci === 0,
        italic: ci === 3,
        color: ci === 0 ? typeColors[ri] : (ci === 2 ? "C9D6FF" : C.white),
        align: ci === 0 ? "center" : "left",
        valign: "middle",
        margin: ci === 0 ? 0 : 5,
      });
    });
  });
  s.addText("slide 6 / 10", { x: 8.5, y: 5.3, w: 1.3, h: 0.25, fontSize: 8, color: "445588", align: "right" });
}

// ═══════════════════════════════════════════════
// SLIDE 7 — PRESENT CONTINUOUS OVERVIEW
// ═══════════════════════════════════════════════
{
  const s = pres.addSlide();
  bg(s, "061820");
  banner(s, "FF6B6B", 0.1);

  s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 0.18, w: 6.2, h: 0.7, fill: { color: "FF6B6B" }, line: { color: "FF6B6B" }, rectRadius: 0.15 });
  s.addText("PRESENT CONTINUOUS TENSE", { x: 0.3, y: 0.18, w: 6.2, h: 0.7, fontSize: 18, bold: true, color: C.white, align: "center", valign: "middle", margin: 0 });

  // What is it?
  s.addText("What is it?", { x: 0.4, y: 1.05, w: 4, h: 0.38, fontSize: 14, bold: true, color: "FF6B6B" });
  s.addText([
    { text: "Used for actions ", options: { color: "C9E8E5" } },
    { text: "happening RIGHT NOW", options: { bold: true, color: "FFD700" } },
    { text: " or ", options: { color: "C9E8E5" } },
    { text: "temporary situations", options: { bold: true, color: "1ABC9C" } },
    { text: " around the present time.", options: { color: "C9E8E5" } },
  ], { x: 0.4, y: 1.42, w: 9, h: 0.48, fontSize: 13 });

  // Signal words
  s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 2.0, w: 9.4, h: 1.1, fill: { color: "0A2530" }, line: { color: "1ABC9C", width: 1.5 }, rectRadius: 0.18 });
  s.addText("⏱  Signal Words", { x: 0.5, y: 2.05, w: 3.5, h: 0.38, fontSize: 12, bold: true, color: "FF6B6B" });
  const signals2 = ["now", "right now", "at the moment", "currently", "today", "this week", "still", "look!", "listen!", "at present"];
  signals2.forEach((w, i) => {
    const col = i % 5;
    pill(s, w, 0.45 + col * 1.82, 2.48, 1.65, 0.35, i % 2 === 0 ? "1ABC9C" : "148F77", C.white, 10);
  });

  // Key rule: -ing
  s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 3.25, w: 9.4, h: 1.05, fill: { color: "081D28" }, line: { color: "FF6B6B", width: 1.5 }, rectRadius: 0.18 });
  s.addText("📌  Adding -ing  (Spelling Rules):", { x: 0.5, y: 3.3, w: 5, h: 0.38, fontSize: 12, bold: true, color: "FF6B6B" });
  s.addText([
    { text: "work", options: { bold: true, color: "1ABC9C", italic: true } },
    { text: " → working   |   ", options: { color: "C9E8E5" } },
    { text: "run", options: { bold: true, color: "1ABC9C", italic: true } },
    { text: " → running (double consonant)   |   ", options: { color: "C9E8E5" } },
    { text: "make", options: { bold: true, color: "1ABC9C", italic: true } },
    { text: " → making (drop -e)", options: { color: "C9E8E5" } },
  ], { x: 0.5, y: 3.65, w: 9, h: 0.45, fontSize: 12.5 });

  s.addText("slide 7 / 10", { x: 8.5, y: 5.3, w: 1.3, h: 0.25, fontSize: 8, color: "335544", align: "right" });
}

// ═══════════════════════════════════════════════
// SLIDE 8 — PRESENT CONTINUOUS AFFIRMATIVE
// ═══════════════════════════════════════════════
{
  const s = pres.addSlide();
  bg(s, "0F2D1A");
  banner(s, "1ABC9C", 0.1);

  s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 0.18, w: 2.1, h: 0.62, fill: { color: "1ABC9C" }, line: { color: "1ABC9C" }, rectRadius: 0.15 });
  s.addText("✔  AFFIRMATIVE", { x: 0.3, y: 0.18, w: 2.1, h: 0.62, fontSize: 11, bold: true, color: "0D2B1A", align: "center", valign: "middle", margin: 0 });
  s.addText("PRESENT CONTINUOUS", { x: 2.6, y: 0.25, w: 6, h: 0.5, fontSize: 16, bold: true, color: "1ABC9C" });

  s.addText("📐  Sentence Formula", { x: 0.3, y: 0.98, w: 9, h: 0.38, fontSize: 13, bold: true, color: "A9DFBF" });
  formulaBox(s, "Subject  +  am / is / are  +  Verb-ing", 0.3, 1.38, 9.4, 0.6, "0D3320", "A9DFBF", 13);

  // be verb breakdown
  const beRows = [
    ["I", "am", "I am eating lunch."],
    ["He / She / It", "is", "She is reading a book."],
    ["You / We / They", "are", "They are playing football."],
  ];
  s.addText("🔧  'Be' Verb Reference", { x: 0.3, y: 2.1, w: 9, h: 0.38, fontSize: 12.5, bold: true, color: "A9DFBF" });
  beRows.forEach(([subj, be, ex], i) => {
    const y = 2.52 + i * 0.58;
    // subject pill
    pill(s, subj, 0.3, y, 2.1, 0.45, "148F77", C.white, 11);
    // be pill
    pill(s, "+" + be, 2.6, y, 1.0, 0.45, "1ABC9C", "0D2B1A", 13);
    // example
    s.addShape(pres.ShapeType.roundRect, { x: 3.8, y, w: 5.9, h: 0.45, fill: { color: "0D3320" }, line: { color: "1ABC9C", width: 0.8 }, rectRadius: 0.1 });
    s.addText(ex, { x: 3.95, y, w: 5.7, h: 0.45, fontSize: 11.5, italic: true, color: C.white, valign: "middle" });
  });

  // Contraction note
  s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 4.33, w: 9.4, h: 0.52, fill: { color: "082015" }, line: { color: "1ABC9C", width: 1 }, rectRadius: 0.12 });
  s.addText([
    { text: "💡  Contractions: ", options: { bold: true, color: "1ABC9C" } },
    { text: "I'm working  |  He's working  |  They're working  |  She's not = She isn't", options: { italic: true, color: "C9E8E5" } },
  ], { x: 0.3, y: 4.33, w: 9.4, h: 0.52, valign: "middle", margin: 8, fontSize: 12 });

  s.addText("slide 8 / 10", { x: 8.5, y: 5.3, w: 1.3, h: 0.25, fontSize: 8, color: "335544", align: "right" });
}

// ═══════════════════════════════════════════════
// SLIDE 9 — PRESENT CONTINUOUS NEGATIVE & QUESTIONS
// ═══════════════════════════════════════════════
{
  const s = pres.addSlide();
  bg(s, "0D0D2B");

  // Split panel decorators
  s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 4.8, h: 5.625, fill: { color: "1A0808" } });
  s.addShape(pres.ShapeType.rect, { x: 4.8, y: 0, w: 5.2, h: 5.625, fill: { color: "060D20" } });
  banner(s, "E74C3C", 0.1);

  // NEG panel (left)
  s.addShape(pres.ShapeType.roundRect, { x: 0.2, y: 0.18, w: 1.9, h: 0.62, fill: { color: "E74C3C" }, line: { color: "E74C3C" }, rectRadius: 0.15 });
  s.addText("✖  NEGATIVE", { x: 0.2, y: 0.18, w: 1.9, h: 0.62, fontSize: 10.5, bold: true, color: C.white, align: "center", valign: "middle", margin: 0 });
  s.addText("Present Continuous", { x: 2.3, y: 0.28, w: 2.2, h: 0.42, fontSize: 11, bold: true, color: "E74C3C" });

  formulaBox(s, "Subject + am/is/are + not + Verb-ing", 0.2, 1.0, 4.4, 0.58, "3D0D0D", "F1948A", 10.5);

  const negCEx = [
    ["I", "am not", "I am not sleeping."],
    ["He/She/It", "is not", "He isn't working now."],
    ["You/We/They", "are not", "They aren't watching TV."],
  ];
  negCEx.forEach(([subj, neg, ex], i) => {
    const y = 1.68 + i * 0.62;
    s.addShape(pres.ShapeType.roundRect, { x: 0.2, y, w: 4.4, h: 0.52, fill: { color: "2A0808" }, line: { color: "E74C3C", width: 0.8 }, rectRadius: 0.1 });
    s.addText([
      { text: "  " + subj + " + " + neg + "  →  ", options: { fontSize: 9, bold: true, color: "F1948A" } },
      { text: ex, options: { fontSize: 10.5, italic: true, color: C.white } },
    ], { x: 0.2, y, w: 4.4, h: 0.52, valign: "middle", margin: 0 });
  });

  // Divider line
  s.addShape(pres.ShapeType.rect, { x: 4.78, y: 0.1, w: 0.04, h: 5.4, fill: { color: "444466" } });

  // Q panel (right)
  s.addShape(pres.ShapeType.roundRect, { x: 4.95, y: 0.18, w: 1.9, h: 0.62, fill: { color: "2980B9" }, line: { color: "2980B9" }, rectRadius: 0.15 });
  s.addText("?  QUESTIONS", { x: 4.95, y: 0.18, w: 1.9, h: 0.62, fontSize: 10.5, bold: true, color: C.white, align: "center", valign: "middle", margin: 0 });
  s.addText("Present Continuous", { x: 7.05, y: 0.28, w: 2.7, h: 0.42, fontSize: 11, bold: true, color: "5DADE2" });

  formulaBox(s, "Am/Is/Are + Subject + Verb-ing + ?", 4.95, 1.0, 4.8, 0.58, "0A1E35", "AED6F1", 10.5);
  formulaBox(s, "WH-word + am/is/are + Subject + Verb-ing + ?", 4.95, 1.65, 4.8, 0.58, "062040", "FF6B6B", 10);

  const qCEx = [
    ["Y/N", "Are you listening?"],
    ["Y/N", "Is she cooking dinner?"],
    ["WH",  "What are they doing?"],
    ["WH",  "Where is he going?"],
  ];
  s.addText("Examples", { x: 4.95, y: 2.35, w: 4.8, h: 0.33, fontSize: 11, bold: true, color: "AED6F1" });
  qCEx.forEach(([type, q], i) => {
    const y = 2.72 + i * 0.52;
    const bc = type === "WH" ? "0D2840" : "0A1E35";
    s.addShape(pres.ShapeType.roundRect, { x: 4.95, y, w: 4.8, h: 0.44, fill: { color: bc }, line: { color: "2980B9", width: 0.8 }, rectRadius: 0.1 });
    s.addText([
      { text: "  [" + type + "]  ", options: { fontSize: 9, bold: true, color: "5DADE2" } },
      { text: q, options: { fontSize: 11, italic: true, color: C.white } },
    ], { x: 4.95, y, w: 4.8, h: 0.44, valign: "middle", margin: 0 });
  });

  s.addText("slide 9 / 10", { x: 8.5, y: 5.3, w: 1.3, h: 0.25, fontSize: 8, color: "445566", align: "right" });
}

// ═══════════════════════════════════════════════
// SLIDE 10 — COMPARISON & CLOSING
// ═══════════════════════════════════════════════
{
  const s = pres.addSlide();
  bg(s, "0A0A25");

  // Decorative arcs at corners
  s.addShape(pres.ShapeType.ellipse, { x: -1.0, y: -1.0, w: 3, h: 3, fill: { color: "F5A623", transparency: 80 }, line: { color: "F5A623", transparency: 80 } });
  s.addShape(pres.ShapeType.ellipse, { x: 8.5, y: 3.5, w: 3, h: 3, fill: { color: "FF6B6B", transparency: 80 }, line: { color: "FF6B6B", transparency: 80 } });

  banner(s, "7B5EA7", 0.1);
  s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 0.18, w: 9.4, h: 0.7, fill: { color: "7B5EA7" }, line: { color: "7B5EA7" }, rectRadius: 0.15 });
  s.addText("PRESENT SIMPLE  vs  PRESENT CONTINUOUS  —  Comparison", { x: 0.3, y: 0.18, w: 9.4, h: 0.7, fontSize: 14.5, bold: true, color: C.white, align: "center", valign: "middle", margin: 0 });

  const compHeaders = ["FEATURE", "PRESENT SIMPLE", "PRESENT CONTINUOUS"];
  const compCW = [2.0, 3.65, 3.65];
  const compCX = [0.3, 2.35, 6.05];
  compHeaders.forEach((h, i) => {
    s.addShape(pres.ShapeType.rect, { x: compCX[i], y: 1.04, w: compCW[i], h: 0.42, fill: { color: i === 1 ? "1A4A2E" : i === 2 ? "0D2A40" : "2A1A40" }, line: { color: "7B5EA7", width: 0.8 } });
    s.addText(h, { x: compCX[i], y: 1.04, w: compCW[i], h: 0.42, fontSize: 10.5, bold: true, color: i === 1 ? "27AE60" : i === 2 ? "2980B9" : "C9AFF7", align: "center", valign: "middle", margin: 0 });
  });

  const compRows = [
    ["Use",         "Habits & routines",     "Actions happening now"],
    ["Verb form",   "Base verb / +s/-es",    "am/is/are + verb-ing"],
    ["Time words",  "always, every day, never","now, at the moment, still"],
    ["Affirmative", "She works here.",        "She is working now."],
    ["Negative",    "She doesn't work here.", "She isn't working now."],
    ["Question",    "Does she work here?",   "Is she working now?"],
  ];
  const rowBg = ["15122A", "0F1A30", "17122A", "0F1A30", "17122A", "0F1A30"];
  compRows.forEach((row, ri) => {
    const y = 1.46 + ri * 0.44;
    row.forEach((cell, ci) => {
      s.addShape(pres.ShapeType.rect, { x: compCX[ci], y, w: compCW[ci], h: 0.41, fill: { color: rowBg[ri] }, line: { color: "2A1A40", width: 0.5 } });
      s.addText(cell, {
        x: compCX[ci], y, w: compCW[ci], h: 0.41,
        fontSize: 10.5,
        bold: ci === 0,
        italic: ci > 0 && ri >= 3,
        color: ci === 0 ? "C9AFF7" : ci === 1 ? "A9DFBF" : "AED6F1",
        align: ci === 0 ? "center" : "left",
        valign: "middle",
        margin: ci === 0 ? 0 : 5,
      });
    });
  });

  // Final motivational footer
  s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 5.08, w: 9.4, h: 0.4, fill: { color: "1A1250" }, line: { color: "7B5EA7", width: 1 }, rectRadius: 0.1 });
  s.addText("🎓  Practice makes perfect! Use these formulas every day and English grammar becomes natural.", {
    x: 0.3, y: 5.08, w: 9.4, h: 0.4, fontSize: 11, italic: true, color: "C9AFF7", align: "center", valign: "middle", margin: 0,
  });
  s.addText("slide 10 / 10", { x: 8.5, y: 5.34, w: 1.3, h: 0.22, fontSize: 7.5, color: "445566", align: "right" });
}

// ─────────────────────────────────────────────
// WRITE FILE
// ─────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/english-tenses-ppt/English_Tenses_Presentation.pptx" })
  .then(() => console.log("✅  Presentation saved!"))
  .catch(e => { console.error("❌  Error:", e); process.exit(1); });
Running Command

cd /home/daytona/workspace/english-tenses-ppt && node create_ppt.js

Running Command

ls -lh /home/daytona/workspace/english-tenses-ppt/

Your presentation is ready! Here's your download link:

English Tenses Presentation

Presentation · PPTX


Here's what's inside the 10-slide colorful presentation:
SlideContent
1Title slide - bold dark navy with gold & coral pill badges, decorative circles
2Present Simple Overview - what it's used for, signal words, the -s/-es rule
3Present Simple - Affirmative - formulas, structure breakdown, 5 examples
4Present Simple - Negative - don't/doesn't formulas, key reminder about base verb, 4 examples
5Present Simple - Questions - Yes/No & WH-question formulas, 4 examples
6Present Simple Summary Table - all 6 patterns in one reference grid
7Present Continuous Overview - use cases, signal words, -ing spelling rules
8Present Continuous - Affirmative - am/is/are reference, 3 examples, contractions note
9Present Continuous - Negative & Questions - split-panel layout with both formula types
10Comparison Table - Present Simple vs Continuous side-by-side across 6 features
Design highlights:
  • Deep navy/teal dark backgrounds with amber, coral, green, red, and blue accents
  • Color-coded system: green = affirmative, red = negative, blue = questions
  • Formula boxes in monospace font, example rows with subtle borders, pill badges for labels
  • Decorative shapes (circles, strips) for visual depth on every slide
This is a shared conversation. Sign in to Orris to start your own chat.