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
ls -la /home/daytona/workspace/
mkdir -p /home/daytona/workspace/english-tenses-ppt
~/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); });
cd /home/daytona/workspace/english-tenses-ppt && node create_ppt.js
ls -lh /home/daytona/workspace/english-tenses-ppt/
English Tenses Presentation
Presentation · PPTX
| Slide | Content |
|---|---|
| 1 | Title slide - bold dark navy with gold & coral pill badges, decorative circles |
| 2 | Present Simple Overview - what it's used for, signal words, the -s/-es rule |
| 3 | Present Simple - Affirmative - formulas, structure breakdown, 5 examples |
| 4 | Present Simple - Negative - don't/doesn't formulas, key reminder about base verb, 4 examples |
| 5 | Present Simple - Questions - Yes/No & WH-question formulas, 4 examples |
| 6 | Present Simple Summary Table - all 6 patterns in one reference grid |
| 7 | Present Continuous Overview - use cases, signal words, -ing spelling rules |
| 8 | Present Continuous - Affirmative - am/is/are reference, 3 examples, contractions note |
| 9 | Present Continuous - Negative & Questions - split-panel layout with both formula types |
| 10 | Comparison Table - Present Simple vs Continuous side-by-side across 6 features |