Please prepare a ppt with the following information mentioned above in picture and add something similar list of words and don't forget to write Russian translation next to English in brackets,,next task is to prepare 20 conversation questions using present simple and present continuous only including information from above mentioned photo, please remember that level of all information should be according to 3rd grade ESL student and easy and logical, nothing funny.Also include some Short grammar topics except tenses for 3rd grade ESL student.First show me your final ppt and later I will advise you some changes if required.
mkdir -p /home/daytona/workspace/cause-connectors-ppt && ls /home/daytona/workspace/cause-connectors-ppt/
~/cause-connectors-ppt/build.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_WIDE"; // 13.3 x 7.5 inches
// ─── COLOR PALETTE ────────────────────────────────────────────────────────────
const C = {
navy: "1A2A4A",
blue: "2D6BE4",
sky: "5BA4F5",
gold: "F5A623",
white: "FFFFFF",
light: "EFF4FF",
grey: "B0BEC5",
green: "27AE60",
red: "E74C3C",
accent: "FF6B35",
purple: "7B2D8B",
};
// ─── HELPER: slide background ─────────────────────────────────────────────────
function darkSlide(pres) {
const s = pres.addSlide();
s.background = { color: C.navy };
return s;
}
function lightSlide(pres) {
const s = pres.addSlide();
s.background = { color: C.light };
return s;
}
// ─── HELPER: banner bar at top ────────────────────────────────────────────────
function addBanner(s, text, barColor) {
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 13.3, h: 0.9, fill: { color: barColor }, line: { type: "none" } });
s.addText(text, { x: 0.3, y: 0, w: 12.7, h: 0.9, fontSize: 22, bold: true, color: C.white, valign: "middle" });
}
// ─── HELPER: connector card ───────────────────────────────────────────────────
function connCard(s, x, y, w, h, word, ru, example, highlightWord) {
// Card background
s.addShape(pres.ShapeType.roundRect, { x, y, w, h, fill: { color: C.white }, line: { color: C.sky, pt: 2 }, rectRadius: 0.15 });
// Connector word + Russian
s.addText([
{ text: word, options: { bold: true, color: C.blue, fontSize: 18 } },
{ text: " (" + ru + ")", options: { bold: false, color: C.purple, fontSize: 14, italic: true } },
], { x: x + 0.12, y: y + 0.08, w: w - 0.24, h: 0.38 });
// Example sentence — highlight the connector word
const parts = example.split(new RegExp("(" + highlightWord.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + ")", "i"));
const richText = parts.map(p =>
p.toLowerCase() === highlightWord.toLowerCase()
? { text: p, options: { bold: true, color: C.accent, fontSize: 13 } }
: { text: p, options: { bold: false, color: "333333", fontSize: 13 } }
);
s.addText(richText, { x: x + 0.12, y: y + 0.5, w: w - 0.24, h: h - 0.62, valign: "top" });
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 1 — TITLE
// ══════════════════════════════════════════════════════════════════════════════
{
const s = darkSlide(pres);
// Decorative accent strip
s.addShape(pres.ShapeType.rect, { x: 0, y: 5.9, w: 13.3, h: 1.6, fill: { color: C.blue }, line: { type: "none" } });
s.addShape(pres.ShapeType.rect, { x: 0, y: 5.6, w: 13.3, h: 0.35, fill: { color: C.gold }, line: { type: "none" } });
s.addText("🔗 Cause & Reason Connectors", {
x: 0.5, y: 1.0, w: 12.3, h: 1.4,
fontSize: 40, bold: true, color: C.white, align: "center",
});
s.addText("Союзы и предлоги причины (Soyuzy i predlogi prichiny)", {
x: 0.5, y: 2.5, w: 12.3, h: 0.7,
fontSize: 20, italic: true, color: C.sky, align: "center",
});
s.addText("ESL — Grade 3 | Present Simple & Present Continuous", {
x: 0.5, y: 3.3, w: 12.3, h: 0.5,
fontSize: 16, color: C.grey, align: "center",
});
s.addShape(pres.ShapeType.rect, { x: 4.5, y: 4.0, w: 4.3, h: 0.06, fill: { color: C.gold }, line: { type: "none" } });
s.addText("as • since • for • because • because of • due to • owing to", {
x: 0.5, y: 4.3, w: 12.3, h: 0.5,
fontSize: 14, color: C.grey, align: "center",
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 2 — OVERVIEW TABLE (all 7 connectors at a glance)
// ══════════════════════════════════════════════════════════════════════════════
{
const s = lightSlide(pres);
addBanner(s, "📋 Overview — Cause & Reason Connectors (Обзор — Союзы и предлоги причины)", C.navy);
// Table rows: [connector, Russian, follows]
const rows = [
["As (как / поскольку)", "как / поскольку", "подлежащее + сказуемое (subject + verb)"],
["Since (поскольку / так как)", "поскольку / так как", "подлежащее + сказуемое (subject + verb)"],
["For (так как / ибо)", "так как / ибо", "подлежащее + сказуемое (subject + verb)"],
["Because (потому что)", "потому что", "подлежащее + сказуемое (subject + verb)"],
["Because of (из-за)", "из-за", "существительное / герундий (noun / gerund)"],
["Due to (из-за / вследствие)", "из-за / вследствие", "существительное / герундий (noun / gerund)"],
["Owing to (благодаря / из-за)", "благодаря / из-за", "существительное / герундий (noun / gerund)"],
];
const colX = [0.2, 3.8, 7.0];
const colW = [3.5, 3.0, 6.0];
const headers = ["Connector (Союз/Предлог)", "Russian (Русский)", "Followed by (После стоит)"];
// Header row
headers.forEach((h, i) => {
s.addShape(pres.ShapeType.rect, { x: colX[i], y: 1.0, w: colW[i] - 0.05, h: 0.5, fill: { color: C.navy }, line: { type: "none" } });
s.addText(h, { x: colX[i] + 0.05, y: 1.0, w: colW[i] - 0.1, h: 0.5, fontSize: 13, bold: true, color: C.white, valign: "middle" });
});
rows.forEach((row, ri) => {
const bg = ri % 2 === 0 ? "DDEEFF" : C.white;
const yPos = 1.55 + ri * 0.7;
row.forEach((cell, ci) => {
s.addShape(pres.ShapeType.rect, { x: colX[ci], y: yPos, w: colW[ci] - 0.05, h: 0.65, fill: { color: bg }, line: { color: C.grey, pt: 1 } });
s.addText(cell, { x: colX[ci] + 0.08, y: yPos + 0.02, w: colW[ci] - 0.16, h: 0.61, fontSize: 12, color: "222222", valign: "middle" });
});
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 3 — AS & SINCE
// ══════════════════════════════════════════════════════════════════════════════
{
const s = lightSlide(pres);
addBanner(s, "📌 AS & SINCE — Connectors of Cause (Союзы причины)", C.blue);
// AS card (left)
s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 1.1, w: 6.0, h: 5.9, fill: { color: "E8F0FE" }, line: { color: C.blue, pt: 3 }, rectRadius: 0.2 });
s.addText([
{ text: "AS", options: { bold: true, fontSize: 28, color: C.blue } },
{ text: " (как / поскольку)", options: { fontSize: 16, color: C.purple, italic: true } },
], { x: 0.5, y: 1.2, w: 5.7, h: 0.55 });
s.addShape(pres.ShapeType.rect, { x: 0.5, y: 1.82, w: 5.7, h: 0.04, fill: { color: C.sky }, line: { type: "none" } });
s.addText("📝 Grammar / Грамматика:", { x: 0.5, y: 1.95, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
s.addText([
{ text: "AS", options: { bold: true, color: C.blue } },
{ text: " + subject (подлежащее) + verb (сказуемое)\n= clause (придаточное предложение)", options: { color: "333333" } },
], { x: 0.5, y: 2.35, w: 5.7, h: 0.8, fontSize: 13 });
s.addText("📖 Examples / Примеры:", { x: 0.5, y: 3.25, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
const asExamples = [
["As it is snowing,", " the children stay inside."],
["As she is tired,", " she is resting now."],
["As he likes cats,", " he has three at home."],
["As it rains every day,", " we carry umbrellas."],
];
asExamples.forEach(([a, b], i) => {
s.addText([
{ text: a, options: { bold: true, color: C.accent, fontSize: 12 } },
{ text: b, options: { color: "333333", fontSize: 12 } },
], { x: 0.5, y: 3.7 + i * 0.52, w: 5.7, h: 0.45 });
});
// SINCE card (right)
s.addShape(pres.ShapeType.roundRect, { x: 6.9, y: 1.1, w: 6.1, h: 5.9, fill: { color: "FFF3E0" }, line: { color: C.gold, pt: 3 }, rectRadius: 0.2 });
s.addText([
{ text: "SINCE", options: { bold: true, fontSize: 28, color: "B8860B" } },
{ text: " (поскольку / так как)", options: { fontSize: 16, color: C.purple, italic: true } },
], { x: 7.1, y: 1.2, w: 5.7, h: 0.55 });
s.addShape(pres.ShapeType.rect, { x: 7.1, y: 1.82, w: 5.7, h: 0.04, fill: { color: C.gold }, line: { type: "none" } });
s.addText("📝 Grammar / Грамматика:", { x: 7.1, y: 1.95, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
s.addText([
{ text: "SINCE", options: { bold: true, color: "B8860B" } },
{ text: " + subject + verb\n= clause (придаточное предложение)", options: { color: "333333" } },
], { x: 7.1, y: 2.35, w: 5.7, h: 0.8, fontSize: 13 });
s.addText("📖 Examples / Примеры:", { x: 7.1, y: 3.25, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
const sinceExamples = [
["Since he is late,", " we start without him."],
["Since it is cold,", " she is wearing a coat."],
["Since they like dogs,", " they have two pets."],
["Since the shop is closed,", " we go home."],
];
sinceExamples.forEach(([a, b], i) => {
s.addText([
{ text: a, options: { bold: true, color: "B8860B", fontSize: 12 } },
{ text: b, options: { color: "333333", fontSize: 12 } },
], { x: 7.1, y: 3.7 + i * 0.52, w: 5.7, h: 0.45 });
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 4 — FOR & BECAUSE
// ══════════════════════════════════════════════════════════════════════════════
{
const s = lightSlide(pres);
addBanner(s, "📌 FOR & BECAUSE — Connectors of Cause (Союзы причины)", C.green);
// FOR card (left)
s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 1.1, w: 6.0, h: 5.9, fill: { color: "E8F5E9" }, line: { color: C.green, pt: 3 }, rectRadius: 0.2 });
s.addText([
{ text: "FOR", options: { bold: true, fontSize: 28, color: C.green } },
{ text: " (так как / ибо)", options: { fontSize: 16, color: C.purple, italic: true } },
], { x: 0.5, y: 1.2, w: 5.7, h: 0.55 });
s.addShape(pres.ShapeType.rect, { x: 0.5, y: 1.82, w: 5.7, h: 0.04, fill: { color: C.green }, line: { type: "none" } });
s.addText("📝 Grammar / Грамматика:", { x: 0.5, y: 1.95, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
s.addText([
{ text: "FOR", options: { bold: true, color: C.green } },
{ text: " + subject + verb | Formal / книжный стиль\n⚠️ Never starts a sentence! (Не начинает предложение!)", options: { color: "333333" } },
], { x: 0.5, y: 2.35, w: 5.7, h: 0.85, fontSize: 13 });
s.addText("📖 Examples / Примеры:", { x: 0.5, y: 3.28, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
const forExamples = [
["She stays quiet,", " for she doesn't want to interrupt."],
["He reads a lot,", " for he loves stories."],
["They walk slowly,", " for the road is icy."],
["I stay home,", " for it is raining hard."],
];
forExamples.forEach(([a, b], i) => {
s.addText([
{ text: a, options: { color: "333333", fontSize: 12 } },
{ text: b, options: { bold: true, color: C.green, fontSize: 12 } },
], { x: 0.5, y: 3.73 + i * 0.52, w: 5.7, h: 0.45 });
});
// BECAUSE card (right)
s.addShape(pres.ShapeType.roundRect, { x: 6.9, y: 1.1, w: 6.1, h: 5.9, fill: { color: "FFEBEE" }, line: { color: C.red, pt: 3 }, rectRadius: 0.2 });
s.addText([
{ text: "BECAUSE", options: { bold: true, fontSize: 28, color: C.red } },
{ text: " (потому что)", options: { fontSize: 16, color: C.purple, italic: true } },
], { x: 7.1, y: 1.2, w: 5.7, h: 0.55 });
s.addShape(pres.ShapeType.rect, { x: 7.1, y: 1.82, w: 5.7, h: 0.04, fill: { color: C.red }, line: { type: "none" } });
s.addText("📝 Grammar / Грамматика:", { x: 7.1, y: 1.95, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
s.addText([
{ text: "BECAUSE", options: { bold: true, color: C.red } },
{ text: " + subject + verb\nMost common! (Самый частый!)", options: { color: "333333" } },
], { x: 7.1, y: 2.35, w: 5.7, h: 0.8, fontSize: 13 });
s.addText("📖 Examples / Примеры:", { x: 7.1, y: 3.25, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
const becauseExamples = [
["He misses the bus", " because he wakes up late."],
["She is happy", " because she gets a gift."],
["I am tired", " because I am running now."],
["They are late", " because it is snowing."],
];
becauseExamples.forEach(([a, b], i) => {
s.addText([
{ text: a, options: { color: "333333", fontSize: 12 } },
{ text: b, options: { bold: true, color: C.red, fontSize: 12 } },
], { x: 7.1, y: 3.7 + i * 0.52, w: 5.7, h: 0.45 });
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 5 — BECAUSE OF, DUE TO, OWING TO
// ══════════════════════════════════════════════════════════════════════════════
{
const s = lightSlide(pres);
addBanner(s, "📌 BECAUSE OF • DUE TO • OWING TO — Preposition Phrases (Предложные обороты)", C.purple);
const cards = [
{
phrase: "BECAUSE OF",
ru: "из-за",
color: "7B2D8B",
bg: "F3E5F5",
borderColor: "9C27B0",
note: "+ noun / gerund (существительное / герундий)",
examples: [
["The flight is delayed", " because of bad weather."],
["He is absent", " because of a cold."],
["She is winning", " because of her hard work."],
["We stay home", " because of the storm."],
],
},
{
phrase: "DUE TO",
ru: "из-за / вследствие",
color: "1565C0",
bg: "E3F2FD",
borderColor: "1976D2",
note: "+ noun / gerund | often after 'be'",
examples: [
["The match is off", " due to rain."],
["She is absent", " due to illness."],
["The road is closed", " due to repairs."],
["The delay is", " due to technical issues."],
],
},
{
phrase: "OWING TO",
ru: "благодаря / из-за",
color: "00695C",
bg: "E0F2F1",
borderColor: "00897B",
note: "+ noun / gerund | formal (книжный стиль)",
examples: [
["Owing to his effort,", " the job is done."],
["Owing to the snow,", " school is closed."],
["Owing to her skill,", " she wins the race."],
["Owing to the traffic,", " we are late."],
],
},
];
cards.forEach((c, ci) => {
const x = 0.2 + ci * 4.35;
const w = 4.2;
s.addShape(pres.ShapeType.roundRect, { x, y: 1.1, w, h: 6.0, fill: { color: c.bg }, line: { color: c.borderColor, pt: 3 }, rectRadius: 0.2 });
s.addText([
{ text: c.phrase, options: { bold: true, fontSize: 20, color: c.color } },
{ text: "\n(" + c.ru + ")", options: { fontSize: 13, color: C.purple, italic: true } },
], { x: x + 0.12, y: 1.18, w: w - 0.24, h: 0.75 });
s.addShape(pres.ShapeType.rect, { x: x + 0.12, y: 1.95, w: w - 0.24, h: 0.03, fill: { color: c.borderColor }, line: { type: "none" } });
s.addText(c.note, { x: x + 0.12, y: 2.05, w: w - 0.24, h: 0.5, fontSize: 11, italic: true, color: "555555" });
c.examples.forEach(([a, b], i) => {
s.addText([
{ text: a, options: { bold: true, color: c.color, fontSize: 11.5 } },
{ text: b, options: { color: "222222", fontSize: 11.5 } },
], { x: x + 0.12, y: 2.65 + i * 0.85, w: w - 0.24, h: 0.78 });
});
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 6 — VOCABULARY LIST (with similar words + Russian)
// ══════════════════════════════════════════════════════════════════════════════
{
const s = lightSlide(pres);
addBanner(s, "📚 Vocabulary — Cause & Reason Words (Словарь)", C.navy);
// Two columns of word cards
const words = [
// col 1
{ en: "weather", ru: "погода (pogoda)", emoji: "🌤️" },
{ en: "snow / it is snowing", ru: "снег / идёт снег", emoji: "❄️" },
{ en: "rain / it is raining", ru: "дождь / идёт дождь", emoji: "🌧️" },
{ en: "cold", ru: "холодно (kholodno)", emoji: "🥶" },
{ en: "storm", ru: "буря (burya)", emoji: "⛈️" },
{ en: "illness / sick", ru: "болезнь / больной", emoji: "🤒" },
{ en: "tired", ru: "устал(а) (ustal/a)", emoji: "😴" },
{ en: "late", ru: "поздно / опаздывает", emoji: "⏰" },
{ en: "delay", ru: "задержка (zaderzhka)", emoji: "🕐" },
{ en: "cancel / cancellation", ru: "отмена (otmena)", emoji: "❌" },
// col 2
{ en: "hard work", ru: "усердный труд", emoji: "💪" },
{ en: "effort", ru: "усилие (usiliye)", emoji: "🏋️" },
{ en: "flight", ru: "рейс / полёт (reys/polyot)", emoji: "✈️" },
{ en: "meeting", ru: "встреча (vstrecha)", emoji: "🤝" },
{ en: "interrupt", ru: "перебивать (perebivatʼ)", emoji: "🤫" },
{ en: "decide", ru: "решать (reshatʼ)", emoji: "💡" },
{ en: "complete / finish", ru: "завершить (zavershitʼ)", emoji: "✅" },
{ en: "repair", ru: "ремонт (remont)", emoji: "🔧" },
{ en: "technical", ru: "технический (tekhnicheskiy)", emoji: "⚙️" },
{ en: "silent", ru: "молчаливый / тихий", emoji: "🤐" },
];
const perCol = 10;
[0, 1].forEach(col => {
const colWords = words.slice(col * perCol, col * perCol + perCol);
const baseX = col === 0 ? 0.2 : 6.7;
colWords.forEach((w, i) => {
const bg = i % 2 === 0 ? "E3EEFF" : C.white;
const y = 1.05 + i * 0.62;
s.addShape(pres.ShapeType.roundRect, { x: baseX, y, w: 6.3, h: 0.55, fill: { color: bg }, line: { color: C.grey, pt: 1 }, rectRadius: 0.1 });
s.addText([
{ text: w.emoji + " ", options: { fontSize: 14 } },
{ text: w.en, options: { bold: true, color: C.navy, fontSize: 13 } },
{ text: " — ", options: { color: C.grey, fontSize: 12 } },
{ text: w.ru, options: { color: C.purple, fontSize: 12, italic: true } },
], { x: baseX + 0.12, y: y + 0.06, w: 6.1, h: 0.44 });
});
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 7 — 20 CONVERSATION QUESTIONS (Part 1: 1-10)
// ══════════════════════════════════════════════════════════════════════════════
{
const s = lightSlide(pres);
addBanner(s, "💬 Conversation Questions — Part 1 (Вопросы для разговора)", C.blue);
s.addText("Use PRESENT SIMPLE or PRESENT CONTINUOUS (Используй настоящее простое или настоящее длительное)", {
x: 0.3, y: 1.0, w: 12.7, h: 0.38, fontSize: 13, italic: true, color: "555555",
});
const qs = [
"Why do penguins go ice skating? (Почему пингвины идут кататься на коньках?)",
"What do you do because of bad weather? (Что ты делаешь из-за плохой погоды?)",
"Why is school sometimes closed due to snow? (Почему школа иногда закрыта из-за снега?)",
"What are you doing right now because you are bored? (Что ты сейчас делаешь, потому что тебе скучно?)",
"Why do we carry an umbrella because of rain? (Почему мы берём зонт из-за дождя?)",
"What do you eat because you are hungry? (Что ты ешь, потому что ты голоден?)",
"Why is the flight sometimes delayed because of a storm? (Почему рейс иногда задерживается из-за бури?)",
"What are you wearing today because it is cold? (Что ты сегодня носишь, потому что холодно?)",
"Why do students study hard because of exams? (Почему ученики усердно учатся из-за экзаменов?)",
"What do you drink because you are thirsty? (Что ты пьёшь, потому что хочешь пить?)",
];
qs.forEach((q, i) => {
const bg = i % 2 === 0 ? "E8F0FE" : C.white;
const y = 1.48 + i * 0.6;
s.addShape(pres.ShapeType.roundRect, { x: 0.2, y, w: 12.9, h: 0.54, fill: { color: bg }, line: { color: C.sky, pt: 1 }, rectRadius: 0.1 });
s.addText([
{ text: (i + 1) + ". ", options: { bold: true, color: C.blue, fontSize: 13 } },
{ text: q, options: { color: "222222", fontSize: 12 } },
], { x: 0.35, y: y + 0.05, w: 12.6, h: 0.44 });
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 8 — 20 CONVERSATION QUESTIONS (Part 2: 11-20)
// ══════════════════════════════════════════════════════════════════════════════
{
const s = lightSlide(pres);
addBanner(s, "💬 Conversation Questions — Part 2 (Вопросы для разговора)", C.blue);
s.addText("Use PRESENT SIMPLE or PRESENT CONTINUOUS (Используй настоящее простое или настоящее длительное)", {
x: 0.3, y: 1.0, w: 12.7, h: 0.38, fontSize: 13, italic: true, color: "555555",
});
const qs = [
"Why do people stay inside since it is raining? (Почему люди остаются дома, поскольку идёт дождь?)",
"What are you reading now because you have free time? (Что ты сейчас читаешь, потому что у тебя есть свободное время?)",
"Why do you say sorry owing to a mistake? (Почему ты говоришь «прости» из-за ошибки?)",
"What game are you playing because it is your favourite? (В какую игру ты сейчас играешь, потому что она твоя любимая?)",
"Why is the road closed due to repairs? (Почему дорога закрыта из-за ремонта?)",
"Why do students stay quiet, for the teacher is speaking? (Почему ученики молчат, ведь учитель говорит?)",
"What are you doing because your friend is waiting? (Что ты делаешь, потому что друг ждёт тебя?)",
"Why do you sleep early since you wake up early? (Почему ты рано ложишься спать, поскольку рано встаёшь?)",
"What are you drawing because you like art? (Что ты сейчас рисуешь, потому что любишь рисование?)",
"Why do you help at home owing to your family? (Почему ты помогаешь дома из-за своей семьи?)",
];
qs.forEach((q, i) => {
const bg = i % 2 === 0 ? "E8F0FE" : C.white;
const y = 1.48 + i * 0.6;
s.addShape(pres.ShapeType.roundRect, { x: 0.2, y, w: 12.9, h: 0.54, fill: { color: bg }, line: { color: C.sky, pt: 1 }, rectRadius: 0.1 });
s.addText([
{ text: (i + 11) + ". ", options: { bold: true, color: C.blue, fontSize: 13 } },
{ text: q, options: { color: "222222", fontSize: 12 } },
], { x: 0.35, y: y + 0.05, w: 12.6, h: 0.44 });
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 9 — GRAMMAR TOPIC 1: Articles (a / an / the)
// ══════════════════════════════════════════════════════════════════════════════
{
const s = darkSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 13.3, h: 1.0, fill: { color: C.gold }, line: { type: "none" } });
s.addText("📘 Grammar Topic 1 — Articles: a / an / the (Артикли)", {
x: 0.3, y: 0, w: 12.7, h: 1.0, fontSize: 22, bold: true, color: C.navy, valign: "middle",
});
const articles = [
{ art: "A", ru: "(неопределённый)", rule: "Use before a consonant sound (перед согласным звуком)", ex: "a cat 🐱 • a book 📚 • a storm ⛈️" },
{ art: "AN", ru: "(неопределённый)", rule: "Use before a vowel sound (перед гласным звуком)", ex: "an apple 🍎 • an umbrella ☂️ • an hour ⏰" },
{ art: "THE", ru: "(определённый)", rule: "Something specific / already known (конкретный / уже известный)", ex: "the sun ☀️ • the weather 🌤️ • the flight ✈️" },
];
articles.forEach((a, i) => {
const x = 0.4 + i * 4.3;
const colors = [C.blue, C.green, C.gold];
const bgs = ["1E3A5F", "1B4A2E", "4A3000"];
s.addShape(pres.ShapeType.roundRect, { x, y: 1.2, w: 4.1, h: 5.9, fill: { color: bgs[i] }, line: { color: colors[i], pt: 3 }, rectRadius: 0.2 });
s.addText(a.art, { x: x + 0.15, y: 1.3, w: 3.8, h: 0.8, fontSize: 44, bold: true, color: colors[i], align: "center" });
s.addText(a.ru, { x: x + 0.15, y: 2.1, w: 3.8, h: 0.4, fontSize: 14, italic: true, color: C.grey, align: "center" });
s.addShape(pres.ShapeType.rect, { x: x + 0.3, y: 2.55, w: 3.5, h: 0.04, fill: { color: colors[i] }, line: { type: "none" } });
s.addText(a.rule, { x: x + 0.15, y: 2.68, w: 3.8, h: 1.1, fontSize: 13, color: C.white, align: "center" });
s.addText(a.ex, { x: x + 0.15, y: 3.9, w: 3.8, h: 2.9, fontSize: 15, color: colors[i], align: "center", valign: "top" });
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 10 — GRAMMAR TOPIC 2: Prepositions of Place (in / on / at)
// ══════════════════════════════════════════════════════════════════════════════
{
const s = lightSlide(pres);
addBanner(s, "📘 Grammar Topic 2 — Prepositions of Place: in / on / at (Предлоги места)", C.red);
const preps = [
{
prep: "IN",
ru: "в / внутри (v / vnutri)",
color: C.red,
bg: "FFEBEE",
items: [
"in the box 📦 — в коробке",
"in the classroom 🏫 — в классе",
"in the city 🏙️ — в городе",
"in the water 💧 — в воде",
"in a country 🌍 — в стране",
],
},
{
prep: "ON",
ru: "на (поверхности) (na)",
color: C.green,
bg: "E8F5E9",
items: [
"on the table 🪑 — на столе",
"on the wall 🧱 — на стене",
"on the bus 🚌 — в автобусе",
"on the floor 🏠 — на полу",
"on the street 🛣️ — на улице",
],
},
{
prep: "AT",
ru: "у / при / около (u / okolo)",
color: C.blue,
bg: "E3F2FD",
items: [
"at home 🏠 — дома",
"at school 🏫 — в школе",
"at the door 🚪 — у двери",
"at the bus stop 🚏 — на остановке",
"at the airport ✈️ — в аэропорту",
],
},
];
preps.forEach((p, i) => {
const x = 0.3 + i * 4.3;
s.addShape(pres.ShapeType.roundRect, { x, y: 1.05, w: 4.1, h: 6.1, fill: { color: p.bg }, line: { color: p.color, pt: 3 }, rectRadius: 0.2 });
s.addText([
{ text: p.prep, options: { bold: true, fontSize: 32, color: p.color } },
{ text: " (" + p.ru + ")", options: { fontSize: 13, italic: true, color: C.purple } },
], { x: x + 0.15, y: 1.15, w: 3.8, h: 0.65 });
s.addShape(pres.ShapeType.rect, { x: x + 0.15, y: 1.83, w: 3.8, h: 0.04, fill: { color: p.color }, line: { type: "none" } });
p.items.forEach((item, j) => {
s.addText("• " + item, { x: x + 0.15, y: 1.97 + j * 0.78, w: 3.8, h: 0.7, fontSize: 12.5, color: "222222" });
});
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 11 — GRAMMAR TOPIC 3: Conjunctions (and / but / or / so)
// ══════════════════════════════════════════════════════════════════════════════
{
const s = darkSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 13.3, h: 1.0, fill: { color: C.accent }, line: { type: "none" } });
s.addText("📘 Grammar Topic 3 — Conjunctions: and / but / or / so (Союзы)", {
x: 0.3, y: 0, w: 12.7, h: 1.0, fontSize: 22, bold: true, color: C.white, valign: "middle",
});
const conjs = [
{ word: "AND", ru: "и (i)", color: C.sky, bg: "152A45", meaning: "adds information (добавляет)", ex1: "She is singing", ex2: "and dancing.", ex1c: C.white, ex2c: C.sky },
{ word: "BUT", ru: "но (no)", color: C.gold, bg: "3A2800", meaning: "shows contrast (противопоставляет)", ex1: "It is cold", ex2: "but sunny.", ex1c: C.white, ex2c: C.gold },
{ word: "OR", ru: "или (ili)", color: C.green, bg: "0A2A1A", meaning: "gives a choice (даёт выбор)", ex1: "Do you want tea", ex2: "or coffee?", ex1c: C.white, ex2c: C.green },
{ word: "SO", ru: "поэтому (poetomu)", color: C.accent, bg: "3A1500", meaning: "shows result (показывает результат)", ex1: "It is raining,", ex2: "so I stay home.", ex1c: C.white, ex2c: C.accent },
];
conjs.forEach((c, i) => {
const x = 0.3 + i * 3.2;
s.addShape(pres.ShapeType.roundRect, { x, y: 1.1, w: 3.0, h: 5.9, fill: { color: c.bg }, line: { color: c.color, pt: 3 }, rectRadius: 0.2 });
s.addText(c.word, { x: x + 0.1, y: 1.2, w: 2.8, h: 0.8, fontSize: 38, bold: true, color: c.color, align: "center" });
s.addText(c.ru, { x: x + 0.1, y: 2.05, w: 2.8, h: 0.4, fontSize: 15, italic: true, color: C.grey, align: "center" });
s.addShape(pres.ShapeType.rect, { x: x + 0.3, y: 2.5, w: 2.4, h: 0.04, fill: { color: c.color }, line: { type: "none" } });
s.addText(c.meaning, { x: x + 0.1, y: 2.62, w: 2.8, h: 0.7, fontSize: 12, color: C.grey, align: "center" });
s.addText([
{ text: c.ex1 + " ", options: { color: c.ex1c, fontSize: 14 } },
{ text: c.ex2, options: { bold: true, color: c.color, fontSize: 14 } },
], { x: x + 0.1, y: 3.45, w: 2.8, h: 1.5, align: "center" });
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 12 — SUMMARY & QUICK REFERENCE
// ══════════════════════════════════════════════════════════════════════════════
{
const s = darkSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 13.3, h: 1.0, fill: { color: C.gold }, line: { type: "none" } });
s.addText("⭐ Quick Reference — Cause Connectors (Быстрый справочник)", {
x: 0.3, y: 0, w: 12.7, h: 1.0, fontSize: 22, bold: true, color: C.navy, valign: "middle",
});
// Two columns summary
const left = [
{ word: "AS", ru: "поскольку", type: "conjunction", after: "subject + verb", color: C.sky },
{ word: "SINCE", ru: "так как", type: "conjunction", after: "subject + verb", color: C.sky },
{ word: "FOR", ru: "ибо / так как", type: "conjunction", after: "subject + verb", color: C.sky },
{ word: "BECAUSE", ru: "потому что", type: "conjunction", after: "subject + verb", color: C.sky },
];
const right = [
{ word: "BECAUSE OF", ru: "из-за", type: "preposition phrase", after: "noun / gerund", color: C.gold },
{ word: "DUE TO", ru: "из-за / вследствие", type: "preposition phrase", after: "noun / gerund", color: C.gold },
{ word: "OWING TO", ru: "благодаря / из-за", type: "preposition phrase", after: "noun / gerund", color: C.gold },
];
s.addText("🔵 Conjunctions (Союзы) — + subject + verb", {
x: 0.5, y: 1.1, w: 6.0, h: 0.42, fontSize: 14, bold: true, color: C.sky,
});
left.forEach((r, i) => {
s.addShape(pres.ShapeType.roundRect, { x: 0.4, y: 1.6 + i * 1.35, w: 6.0, h: 1.2, fill: { color: "152A45" }, line: { color: r.color, pt: 2 }, rectRadius: 0.15 });
s.addText([
{ text: r.word, options: { bold: true, fontSize: 20, color: r.color } },
{ text: " (" + r.ru + ")", options: { fontSize: 14, italic: true, color: C.grey } },
], { x: 0.55, y: 1.65 + i * 1.35, w: 5.8, h: 0.48 });
s.addText("After: " + r.after, { x: 0.55, y: 2.15 + i * 1.35, w: 5.8, h: 0.35, fontSize: 12, color: C.grey });
});
s.addText("🟡 Preposition Phrases (Предложные обороты) — + noun", {
x: 6.8, y: 1.1, w: 6.2, h: 0.42, fontSize: 14, bold: true, color: C.gold,
});
right.forEach((r, i) => {
s.addShape(pres.ShapeType.roundRect, { x: 6.8, y: 1.6 + i * 1.35, w: 6.1, h: 1.2, fill: { color: "2A1F00" }, line: { color: r.color, pt: 2 }, rectRadius: 0.15 });
s.addText([
{ text: r.word, options: { bold: true, fontSize: 20, color: r.color } },
{ text: " (" + r.ru + ")", options: { fontSize: 14, italic: true, color: C.grey } },
], { x: 6.95, y: 1.65 + i * 1.35, w: 5.9, h: 0.48 });
s.addText("After: " + r.after, { x: 6.95, y: 2.15 + i * 1.35, w: 5.9, h: 0.35, fontSize: 12, color: C.grey });
});
s.addText("⭐ Remember: AS / SINCE / FOR / BECAUSE + clause | BECAUSE OF / DUE TO / OWING TO + noun/gerund", {
x: 0.4, y: 6.95, w: 12.5, h: 0.45, fontSize: 13, italic: true, color: C.gold, align: "center",
});
}
// ──────────────────────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/cause-connectors-ppt/Cause_Connectors_ESL_Grade3.pptx" })
.then(() => console.log("✅ PPTX created successfully!"))
.catch(e => { console.error("ERROR:", e); process.exit(1); });
cd /home/daytona/workspace/cause-connectors-ppt && node build.js 2>&1
ls -lh /home/daytona/workspace/cause-connectors-ppt/Cause_Connectors_ESL_Grade3.pptx
Cause Connectors ESL Grade3
Presentation · PPTX
| Slide | Content |
|---|---|
| 1 | Title slide - dark navy theme, lists all 7 connectors |
| 2 | Overview table - all connectors at a glance with Russian + grammar rule |
| 3 | AS & SINCE - side-by-side cards, grammar rule, 4 examples each |
| 4 | FOR & BECAUSE - side-by-side cards, with note that FOR never starts a sentence |
| 5 | BECAUSE OF / DUE TO / OWING TO - 3 equal cards, shows they need a noun after them |
| 6 | Vocabulary list - 20 words with emoji + Russian translation in brackets |
| 7 | Conversation Questions 1-10 - Present Simple & Continuous, Russian in brackets |
| 8 | Conversation Questions 11-20 - continued |
| 9 | Grammar Topic 1: Articles - a / an / the with Russian + examples |
| 10 | Grammar Topic 2: Prepositions of Place - in / on / at with Russian + examples |
| 11 | Grammar Topic 3: Conjunctions - and / but / or / so with Russian + examples |
| 12 | Quick Reference summary - connectors grouped as conjunctions vs. preposition phrases |
I am unable to download pptx format, then please show individual photos which are inside the ppt.I am waiting.
cd /home/daytona/workspace/cause-connectors-ppt && python3 -c "import subprocess; result = subprocess.run(['libreoffice', '--version'], capture_output=True, text=True); print(result.stdout, result.stderr)"
mkdir -p /home/daytona/workspace/cause-connectors-ppt/slides && libreoffice --headless --convert-to png --outdir /home/daytona/workspace/cause-connectors-ppt/slides /home/daytona/workspace/cause-connectors-ppt/Cause_Connectors_ESL_Grade3.pptx 2>&1
libreoffice --headless --convert-to jpg --outdir /home/daytona/workspace/cause-connectors-ppt/slides /home/daytona/workspace/cause-connectors-ppt/Cause_Connectors_ESL_Grade3.pptx 2>&1
chmod 777 /home/daytona/workspace/cause-connectors-ppt/slides && ls -la /home/daytona/workspace/cause-connectors-ppt/slides/ && libreoffice --headless --convert-to png --outdir /home/daytona/workspace/cause-connectors-ppt/slides /home/daytona/workspace/cause-connectors-ppt/Cause_Connectors_ESL_Grade3.pptx 2>&1
ls -la /home/daytona/workspace/cause-connectors-ppt/ && mkdir -p /home/daytona/workspace/slides_out && chmod 777 /home/daytona/workspace/slides_out && libreoffice --headless --convert-to png --outdir /home/daytona/workspace/slides_out /home/daytona/workspace/cause-connectors-ppt/Cause_Connectors_ESL_Grade3.pptx 2>&1
ls -la /home/daytona/workspace/slides_out/ 2>&1 && libreoffice --headless --convert-to png --outdir /home/daytona/workspace/slides_out /home/daytona/workspace/cause-connectors-ppt/Cause_Connectors_ESL_Grade3.pptx 2>&1
python3 -c "import pptx; print('pptx ok')" 2>&1 && python3 -c "from PIL import Image; print('PIL ok')" 2>&1 && python3 -c "import subprocess; r=subprocess.run(['which','convert'],capture_output=True,text=True); print('convert:',r.stdout.strip())" 2>&1
python3 -c "from PIL import Image; print('PIL ok')" 2>&1; which convert 2>&1; which pdftoppm 2>&1; which inkscape 2>&1; node -e "const {execSync}=require('child_process'); console.log(execSync('node --version').toString())"
libreoffice --headless --convert-to pdf --outdir /home/daytona/workspace/slides_out /home/daytona/workspace/cause-connectors-ppt/Cause_Connectors_ESL_Grade3.pptx 2>&1
# Try writing to /tmp instead libreoffice --headless --convert-to pdf --outdir /tmp /home/daytona/workspace/cause-connectors-ppt/Cause_Connectors_ESL_Grade3.pptx 2>&1 && ls -lh /tmp/Cause*.pdf 2>&1
pdftoppm -r 150 -png /tmp/Cause_Connectors_ESL_Grade3.pdf /tmp/slide && ls -lh /tmp/slide*.png 2>&1
cp /tmp/slide-*.png /home/daytona/workspace/cause-connectors-ppt/ && ls /home/daytona/workspace/cause-connectors-ppt/slide*.png












I am unable to download what you have shown.Please show .jpg photos or pdf or ppt format.I am waiting for a long time please don't waste my time
python3 -c " from PIL import Image import os slides_dir = '/home/daytona/workspace/cause-connectors-ppt' for i in range(1, 13): src = f'/tmp/slide-{i:02d}.png' dst = f'{slides_dir}/slide-{i:02d}.jpg' img = Image.open(src).convert('RGB') img.save(dst, 'JPEG', quality=92) print(f'Saved {dst}') print('All done') "
cp /tmp/Cause_Connectors_ESL_Grade3.pdf /home/daytona/workspace/cause-connectors-ppt/Cause_Connectors_ESL_Grade3.pdf && ls -lh /home/daytona/workspace/cause-connectors-ppt/
Cause Connectors ESL Grade3
PDF Document · PDF
Cause Connectors ESL Grade3
Presentation · PPTX
slide 01
Image · JPG
slide 02
Image · JPG
slide 03
Image · JPG
slide 04
Image · JPG
slide 05
Image · JPG
slide 06
Image · JPG
slide 07
Image · JPG
slide 08
Image · JPG
slide 09
Image · JPG
slide 10
Image · JPG
slide 11
Image · JPG
slide 12
Image · JPG
Please make some changes, first of all don't use any verb from past tense ( like Ed or V2 form) , secondly please provide answers for the following questions in super easy way as 3rd grade ESL student below the questions.And headlines show be bigger with Russian translation.
~/cause-connectors-ppt/build.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_WIDE"; // 13.3 x 7.5 inches
// ─── COLOR PALETTE ────────────────────────────────────────────────────────────
const C = {
navy: "1A2A4A",
blue: "2D6BE4",
sky: "5BA4F5",
gold: "F5A623",
white: "FFFFFF",
light: "EFF4FF",
grey: "B0BEC5",
green: "27AE60",
red: "E74C3C",
accent: "FF6B35",
purple: "7B2D8B",
};
function darkSlide(pres) {
const s = pres.addSlide();
s.background = { color: C.navy };
return s;
}
function lightSlide(pres) {
const s = pres.addSlide();
s.background = { color: C.light };
return s;
}
// Big banner with English title + Russian subtitle on next line
function addBanner(s, engTitle, ruTitle, barColor) {
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 13.3, h: 1.1, fill: { color: barColor }, line: { type: "none" } });
s.addText([
{ text: engTitle + "\n", options: { bold: true, fontSize: 24, color: C.white, breakLine: true } },
{ text: ruTitle, options: { bold: false, fontSize: 15, color: "CCDDFF", italic: true } },
], { x: 0.3, y: 0.02, w: 12.7, h: 1.06, valign: "middle" });
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 1 — TITLE
// ══════════════════════════════════════════════════════════════════════════════
{
const s = darkSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 5.9, w: 13.3, h: 1.6, fill: { color: C.blue }, line: { type: "none" } });
s.addShape(pres.ShapeType.rect, { x: 0, y: 5.6, w: 13.3, h: 0.35, fill: { color: C.gold }, line: { type: "none" } });
s.addText("🔗 Cause & Reason Connectors", {
x: 0.5, y: 0.8, w: 12.3, h: 1.3,
fontSize: 44, bold: true, color: C.white, align: "center",
});
s.addText("Союзы и предлоги причины", {
x: 0.5, y: 2.2, w: 12.3, h: 0.75,
fontSize: 26, italic: true, color: C.sky, align: "center",
});
s.addText("ESL — Grade 3 | Present Simple & Present Continuous", {
x: 0.5, y: 3.1, w: 12.3, h: 0.5,
fontSize: 17, color: C.grey, align: "center",
});
s.addShape(pres.ShapeType.rect, { x: 4.5, y: 3.8, w: 4.3, h: 0.06, fill: { color: C.gold }, line: { type: "none" } });
s.addText("as • since • for • because • because of • due to • owing to", {
x: 0.5, y: 4.1, w: 12.3, h: 0.5,
fontSize: 15, color: C.grey, align: "center",
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 2 — OVERVIEW TABLE
// ══════════════════════════════════════════════════════════════════════════════
{
const s = lightSlide(pres);
addBanner(s, "📋 Overview — Cause & Reason Connectors", "Обзор — Союзы и предлоги причины", C.navy);
const rows = [
["As (как / поскольку)", "как / поскольку", "subject + verb (подлеж. + глагол)"],
["Since (поскольку / так как)", "поскольку / так как", "subject + verb (подлеж. + глагол)"],
["For (так как / ибо)", "так как / ибо", "subject + verb (подлеж. + глагол)"],
["Because (потому что)", "потому что", "subject + verb (подлеж. + глагол)"],
["Because of (из-за)", "из-за", "noun / gerund (существ. / герундий)"],
["Due to (из-за / вследствие)", "из-за / вследствие", "noun / gerund (существ. / герундий)"],
["Owing to (благодаря / из-за)", "благодаря / из-за", "noun / gerund (существ. / герундий)"],
];
const colX = [0.2, 3.8, 7.0];
const colW = [3.5, 3.0, 6.0];
const headers = ["Connector (Союз/Предлог)", "Russian (Русский)", "Followed by (После стоит)"];
headers.forEach((h, i) => {
s.addShape(pres.ShapeType.rect, { x: colX[i], y: 1.2, w: colW[i] - 0.05, h: 0.55, fill: { color: C.navy }, line: { type: "none" } });
s.addText(h, { x: colX[i] + 0.05, y: 1.2, w: colW[i] - 0.1, h: 0.55, fontSize: 14, bold: true, color: C.white, valign: "middle" });
});
rows.forEach((row, ri) => {
const bg = ri % 2 === 0 ? "DDEEFF" : C.white;
const yPos = 1.8 + ri * 0.69;
row.forEach((cell, ci) => {
s.addShape(pres.ShapeType.rect, { x: colX[ci], y: yPos, w: colW[ci] - 0.05, h: 0.64, fill: { color: bg }, line: { color: C.grey, pt: 1 } });
s.addText(cell, { x: colX[ci] + 0.08, y: yPos + 0.02, w: colW[ci] - 0.16, h: 0.60, fontSize: 12, color: "222222", valign: "middle" });
});
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 3 — AS & SINCE
// ══════════════════════════════════════════════════════════════════════════════
{
const s = lightSlide(pres);
addBanner(s, "📌 AS & SINCE — Connectors of Cause", "Союзы причины: AS (поскольку) и SINCE (так как)", C.blue);
// AS card (left)
s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 1.25, w: 6.0, h: 5.9, fill: { color: "E8F0FE" }, line: { color: C.blue, pt: 3 }, rectRadius: 0.2 });
s.addText([
{ text: "AS", options: { bold: true, fontSize: 32, color: C.blue } },
{ text: " (поскольку / как)", options: { fontSize: 17, color: C.purple, italic: true } },
], { x: 0.5, y: 1.32, w: 5.7, h: 0.6 });
s.addShape(pres.ShapeType.rect, { x: 0.5, y: 2.0, w: 5.7, h: 0.04, fill: { color: C.sky }, line: { type: "none" } });
s.addText("📝 Grammar / Грамматика:", { x: 0.5, y: 2.1, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
s.addText([
{ text: "AS", options: { bold: true, color: C.blue } },
{ text: " + subject + verb", options: { color: "333333" } },
], { x: 0.5, y: 2.5, w: 5.7, h: 0.5, fontSize: 13 });
s.addText("📖 Examples / Примеры:", { x: 0.5, y: 3.1, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
const asEx = [
["As it is snowing,", " the children stay inside."],
["As she is tired,", " she is resting now."],
["As he likes cats,", " he has three at home."],
["As it rains every day,", " we carry umbrellas."],
];
asEx.forEach(([a, b], i) => {
s.addText([
{ text: a, options: { bold: true, color: C.accent, fontSize: 12 } },
{ text: b, options: { color: "333333", fontSize: 12 } },
], { x: 0.5, y: 3.55 + i * 0.52, w: 5.7, h: 0.45 });
});
// SINCE card (right)
s.addShape(pres.ShapeType.roundRect, { x: 6.9, y: 1.25, w: 6.1, h: 5.9, fill: { color: "FFF3E0" }, line: { color: C.gold, pt: 3 }, rectRadius: 0.2 });
s.addText([
{ text: "SINCE", options: { bold: true, fontSize: 32, color: "B8860B" } },
{ text: " (поскольку / так как)", options: { fontSize: 17, color: C.purple, italic: true } },
], { x: 7.1, y: 1.32, w: 5.7, h: 0.6 });
s.addShape(pres.ShapeType.rect, { x: 7.1, y: 2.0, w: 5.7, h: 0.04, fill: { color: C.gold }, line: { type: "none" } });
s.addText("📝 Grammar / Грамматика:", { x: 7.1, y: 2.1, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
s.addText([
{ text: "SINCE", options: { bold: true, color: "B8860B" } },
{ text: " + subject + verb", options: { color: "333333" } },
], { x: 7.1, y: 2.5, w: 5.7, h: 0.5, fontSize: 13 });
s.addText("📖 Examples / Примеры:", { x: 7.1, y: 3.1, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
const sinceEx = [
["Since he is late,", " we start without him."],
["Since it is cold,", " she is wearing a coat."],
["Since they like dogs,", " they have two pets."],
["Since the shop is closed,", " we go home."],
];
sinceEx.forEach(([a, b], i) => {
s.addText([
{ text: a, options: { bold: true, color: "B8860B", fontSize: 12 } },
{ text: b, options: { color: "333333", fontSize: 12 } },
], { x: 7.1, y: 3.55 + i * 0.52, w: 5.7, h: 0.45 });
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 4 — FOR & BECAUSE
// ══════════════════════════════════════════════════════════════════════════════
{
const s = lightSlide(pres);
addBanner(s, "📌 FOR & BECAUSE — Connectors of Cause", "Союзы причины: FOR (так как) и BECAUSE (потому что)", C.green);
// FOR card (left)
s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 1.25, w: 6.0, h: 5.9, fill: { color: "E8F5E9" }, line: { color: C.green, pt: 3 }, rectRadius: 0.2 });
s.addText([
{ text: "FOR", options: { bold: true, fontSize: 32, color: C.green } },
{ text: " (так как / ибо)", options: { fontSize: 17, color: C.purple, italic: true } },
], { x: 0.5, y: 1.32, w: 5.7, h: 0.6 });
s.addShape(pres.ShapeType.rect, { x: 0.5, y: 2.0, w: 5.7, h: 0.04, fill: { color: C.green }, line: { type: "none" } });
s.addText("📝 Grammar / Грамматика:", { x: 0.5, y: 2.1, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
s.addText([
{ text: "FOR", options: { bold: true, color: C.green } },
{ text: " + subject + verb | Formal / книжный стиль\n⚠️ Does NOT start a sentence! (Не начинает предложение!)", options: { color: "333333" } },
], { x: 0.5, y: 2.52, w: 5.7, h: 0.82, fontSize: 12 });
s.addText("📖 Examples / Примеры:", { x: 0.5, y: 3.42, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
const forEx = [
["She stays quiet,", " for she does not want to interrupt."],
["He reads a lot,", " for he loves stories."],
["They walk slowly,", " for the road is icy."],
["I stay home,", " for it is raining hard."],
];
forEx.forEach(([a, b], i) => {
s.addText([
{ text: a, options: { color: "333333", fontSize: 12 } },
{ text: b, options: { bold: true, color: C.green, fontSize: 12 } },
], { x: 0.5, y: 3.88 + i * 0.52, w: 5.7, h: 0.45 });
});
// BECAUSE card (right)
s.addShape(pres.ShapeType.roundRect, { x: 6.9, y: 1.25, w: 6.1, h: 5.9, fill: { color: "FFEBEE" }, line: { color: C.red, pt: 3 }, rectRadius: 0.2 });
s.addText([
{ text: "BECAUSE", options: { bold: true, fontSize: 32, color: C.red } },
{ text: " (потому что)", options: { fontSize: 17, color: C.purple, italic: true } },
], { x: 7.1, y: 1.32, w: 5.7, h: 0.6 });
s.addShape(pres.ShapeType.rect, { x: 7.1, y: 2.0, w: 5.7, h: 0.04, fill: { color: C.red }, line: { type: "none" } });
s.addText("📝 Grammar / Грамматика:", { x: 7.1, y: 2.1, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
s.addText([
{ text: "BECAUSE", options: { bold: true, color: C.red } },
{ text: " + subject + verb\nMost common! (Самый частый!)", options: { color: "333333" } },
], { x: 7.1, y: 2.52, w: 5.7, h: 0.82, fontSize: 12 });
s.addText("📖 Examples / Примеры:", { x: 7.1, y: 3.42, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
const becauseEx = [
["He is late", " because he wakes up late every day."],
["She is happy", " because she gets a gift."],
["I am tired", " because I am running now."],
["They are late", " because it is snowing."],
];
becauseEx.forEach(([a, b], i) => {
s.addText([
{ text: a, options: { color: "333333", fontSize: 12 } },
{ text: b, options: { bold: true, color: C.red, fontSize: 12 } },
], { x: 7.1, y: 3.88 + i * 0.52, w: 5.7, h: 0.45 });
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 5 — BECAUSE OF, DUE TO, OWING TO
// ══════════════════════════════════════════════════════════════════════════════
{
const s = lightSlide(pres);
addBanner(s, "📌 BECAUSE OF • DUE TO • OWING TO", "Предложные обороты причины (из-за / вследствие / благодаря)", C.purple);
const cards = [
{
phrase: "BECAUSE OF",
ru: "из-за",
color: "7B2D8B",
bg: "F3E5F5",
borderColor: "9C27B0",
note: "+ noun / gerund (существительное / герундий)",
examples: [
["The flight is late", " because of bad weather."],
["He is not in school", " because of a cold."],
["She is winning", " because of her hard work."],
["We stay home", " because of the storm."],
],
},
{
phrase: "DUE TO",
ru: "из-за / вследствие",
color: "1565C0",
bg: "E3F2FD",
borderColor: "1976D2",
note: "+ noun / gerund | often after 'be'",
examples: [
["The match is off", " due to rain."],
["She is not here", " due to illness."],
["The road is not open", " due to repairs."],
["The delay is", " due to technical issues."],
],
},
{
phrase: "OWING TO",
ru: "благодаря / из-за",
color: "00695C",
bg: "E0F2F1",
borderColor: "00897B",
note: "+ noun / gerund | formal (книжный стиль)",
examples: [
["Owing to his effort,", " the job is now done."],
["Owing to the snow,", " school is not open."],
["Owing to her skill,", " she wins the race."],
["Owing to the traffic,", " we are late."],
],
},
];
cards.forEach((c, ci) => {
const x = 0.2 + ci * 4.35;
const w = 4.2;
s.addShape(pres.ShapeType.roundRect, { x, y: 1.25, w, h: 6.0, fill: { color: c.bg }, line: { color: c.borderColor, pt: 3 }, rectRadius: 0.2 });
s.addText([
{ text: c.phrase, options: { bold: true, fontSize: 22, color: c.color } },
{ text: "\n(" + c.ru + ")", options: { fontSize: 14, color: C.purple, italic: true } },
], { x: x + 0.12, y: 1.32, w: w - 0.24, h: 0.82 });
s.addShape(pres.ShapeType.rect, { x: x + 0.12, y: 2.18, w: w - 0.24, h: 0.03, fill: { color: c.borderColor }, line: { type: "none" } });
s.addText(c.note, { x: x + 0.12, y: 2.28, w: w - 0.24, h: 0.5, fontSize: 11, italic: true, color: "555555" });
c.examples.forEach(([a, b], i) => {
s.addText([
{ text: a, options: { bold: true, color: c.color, fontSize: 11.5 } },
{ text: b, options: { color: "222222", fontSize: 11.5 } },
], { x: x + 0.12, y: 2.88 + i * 0.85, w: w - 0.24, h: 0.78 });
});
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 6 — VOCABULARY LIST
// ══════════════════════════════════════════════════════════════════════════════
{
const s = lightSlide(pres);
addBanner(s, "📚 Vocabulary — Cause & Reason Words", "Словарь — слова причины и повода", C.navy);
const words = [
{ en: "weather", ru: "погода (pogoda)", emoji: "🌤️" },
{ en: "snow / it is snowing", ru: "снег / идёт снег", emoji: "❄️" },
{ en: "rain / it is raining", ru: "дождь / идёт дождь", emoji: "🌧️" },
{ en: "cold", ru: "холодно (kholodno)", emoji: "🥶" },
{ en: "storm", ru: "буря (burya)", emoji: "⛈️" },
{ en: "illness / sick", ru: "болезнь / больной", emoji: "🤒" },
{ en: "tired", ru: "устал(а) (ustal/a)", emoji: "😴" },
{ en: "late", ru: "поздно / опаздывает", emoji: "⏰" },
{ en: "delay", ru: "задержка (zaderzhka)", emoji: "🕐" },
{ en: "cancel / cancellation", ru: "отмена (otmena)", emoji: "❌" },
{ en: "hard work", ru: "усердный труд", emoji: "💪" },
{ en: "effort", ru: "усилие (usiliye)", emoji: "🏋️" },
{ en: "flight", ru: "рейс / полёт (reys/polyot)", emoji: "✈️" },
{ en: "meeting", ru: "встреча (vstrecha)", emoji: "🤝" },
{ en: "interrupt", ru: "перебивать (perebivatʼ)", emoji: "🤫" },
{ en: "decide", ru: "решать (reshatʼ)", emoji: "💡" },
{ en: "complete / finish", ru: "завершить (zavershitʼ)", emoji: "✅" },
{ en: "repair", ru: "ремонт (remont)", emoji: "🔧" },
{ en: "technical", ru: "технический (tekhnicheskiy)", emoji: "⚙️" },
{ en: "silent", ru: "молчаливый / тихий", emoji: "🤐" },
];
const perCol = 10;
[0, 1].forEach(col => {
const colWords = words.slice(col * perCol, col * perCol + perCol);
const baseX = col === 0 ? 0.2 : 6.7;
colWords.forEach((w, i) => {
const bg = i % 2 === 0 ? "E3EEFF" : C.white;
const y = 1.22 + i * 0.62;
s.addShape(pres.ShapeType.roundRect, { x: baseX, y, w: 6.3, h: 0.56, fill: { color: bg }, line: { color: C.grey, pt: 1 }, rectRadius: 0.1 });
s.addText([
{ text: w.emoji + " ", options: { fontSize: 14 } },
{ text: w.en, options: { bold: true, color: C.navy, fontSize: 13 } },
{ text: " — ", options: { color: C.grey, fontSize: 12 } },
{ text: w.ru, options: { color: C.purple, fontSize: 12, italic: true } },
], { x: baseX + 0.12, y: y + 0.06, w: 6.1, h: 0.44 });
});
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 7 — CONVERSATION QUESTIONS 1–10 (with answers)
// ══════════════════════════════════════════════════════════════════════════════
{
const s = lightSlide(pres);
addBanner(s, "💬 Conversation Questions — Part 1 (Questions 1–10)", "Вопросы для разговора — Часть 1 (Вопросы 1–10)", C.blue);
// Q = [question text, answer text]
const qa = [
[
"1. Why do penguins go ice skating? (Почему пингвины идут кататься на коньках?)",
"➜ Because it is snowing and they love the ice! (Потому что идёт снег и они любят лёд!)",
],
[
"2. What do you do because of bad weather? (Что ты делаешь из-за плохой погоды?)",
"➜ I stay inside because of bad weather. (Я остаюсь дома из-за плохой погоды.)",
],
[
"3. Why is school sometimes not open due to snow? (Почему школа иногда не открыта из-за снега?)",
"➜ School is not open due to heavy snow. (Школа не открыта из-за сильного снега.)",
],
[
"4. What are you doing right now because you have free time? (Что ты сейчас делаешь, потому что у тебя есть свободное время?)",
"➜ I am reading a book because I have free time. (Я читаю книгу, потому что у меня есть свободное время.)",
],
[
"5. Why do we carry an umbrella because of rain? (Почему мы берём зонт из-за дождя?)",
"➜ We carry an umbrella because of rain so we do not get wet. (Мы берём зонт из-за дождя, чтобы не намокнуть.)",
],
[
"6. What do you eat because you are hungry? (Что ты ешь, потому что ты голоден?)",
"➜ I eat a sandwich because I am hungry. (Я ем бутерброд, потому что я голоден.)",
],
[
"7. Why is a flight sometimes late because of a storm? (Почему рейс иногда задерживается из-за бури?)",
"➜ A flight is late because of a storm in the sky. (Рейс задерживается из-за бури в небе.)",
],
[
"8. What are you wearing today because it is cold? (Что ты сегодня носишь, потому что холодно?)",
"➜ I am wearing a warm coat because it is cold. (Я надеваю тёплое пальто, потому что холодно.)",
],
[
"9. Why do students study hard because of tests? (Почему ученики усердно учатся из-за тестов?)",
"➜ Students study hard because they want good marks. (Ученики усердно учатся, потому что хотят хорошие оценки.)",
],
[
"10. What do you drink because you are thirsty? (Что ты пьёшь, потому что хочешь пить?)",
"➜ I drink water because I am thirsty. (Я пью воду, потому что хочу пить.)",
],
];
qa.forEach(([q, a], i) => {
const y = 1.22 + i * 0.615;
const bg = i % 2 === 0 ? "E8F0FE" : "FFFDE7";
s.addShape(pres.ShapeType.roundRect, { x: 0.2, y, w: 12.9, h: 0.57, fill: { color: bg }, line: { color: C.sky, pt: 1 }, rectRadius: 0.1 });
s.addText([
{ text: q + " ", options: { bold: true, color: C.navy, fontSize: 10.5 } },
{ text: a, options: { color: C.green, fontSize: 10.5, italic: true } },
], { x: 0.32, y: y + 0.04, w: 12.6, h: 0.5 });
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 8 — CONVERSATION QUESTIONS 11–20 (with answers)
// ══════════════════════════════════════════════════════════════════════════════
{
const s = lightSlide(pres);
addBanner(s, "💬 Conversation Questions — Part 2 (Questions 11–20)", "Вопросы для разговора — Часть 2 (Вопросы 11–20)", C.blue);
const qa = [
[
"11. Why do people stay inside since it is raining? (Почему люди остаются дома, поскольку идёт дождь?)",
"➜ People stay inside since it is raining and the streets are wet. (Люди остаются дома, так как идёт дождь и улицы мокрые.)",
],
[
"12. What are you reading now because you have free time? (Что ты сейчас читаешь, потому что у тебя есть свободное время?)",
"➜ I am reading a comic book because I have free time. (Я читаю комикс, потому что у меня есть свободное время.)",
],
[
"13. Why do you say sorry owing to a mistake? (Почему ты говоришь «прости» из-за ошибки?)",
"➜ I say sorry owing to my mistake because it is polite. (Я говорю «прости» из-за ошибки, потому что это вежливо.)",
],
[
"14. What game are you playing because it is your favourite? (В какую игру ты сейчас играешь, потому что она твоя любимая?)",
"➜ I am playing football because it is my favourite game. (Я играю в футбол, потому что это моя любимая игра.)",
],
[
"15. Why is the road not open due to repairs? (Почему дорога не открыта из-за ремонта?)",
"➜ The road is not open due to repairs on the street. (Дорога не открыта из-за ремонтных работ на улице.)",
],
[
"16. Why do students stay quiet, for the teacher is speaking? (Почему ученики молчат, ведь учитель говорит?)",
"➜ Students stay quiet, for the teacher is speaking and they listen. (Ученики молчат, ведь учитель говорит и они слушают.)",
],
[
"17. What are you doing because your friend is waiting? (Что ты делаешь, потому что друг ждёт тебя?)",
"➜ I am getting ready because my friend is waiting for me. (Я собираюсь, потому что мой друг ждёт меня.)",
],
[
"18. Why do you sleep early since you wake up early? (Почему ты рано ложишься спать, поскольку рано встаёшь?)",
"➜ I sleep early since I wake up early every morning. (Я ложусь спать рано, поскольку рано встаю каждое утро.)",
],
[
"19. What are you drawing because you like art? (Что ты сейчас рисуешь, потому что любишь рисование?)",
"➜ I am drawing a house because I like art. (Я рисую дом, потому что люблю рисование.)",
],
[
"20. Why do you help at home owing to your family? (Почему ты помогаешь дома из-за своей семьи?)",
"➜ I help at home owing to my family because I love them. (Я помогаю дома из-за своей семьи, потому что люблю их.)",
],
];
qa.forEach(([q, a], i) => {
const y = 1.22 + i * 0.615;
const bg = i % 2 === 0 ? "E8F0FE" : "FFFDE7";
s.addShape(pres.ShapeType.roundRect, { x: 0.2, y, w: 12.9, h: 0.57, fill: { color: bg }, line: { color: C.sky, pt: 1 }, rectRadius: 0.1 });
s.addText([
{ text: q + " ", options: { bold: true, color: C.navy, fontSize: 10.5 } },
{ text: a, options: { color: C.green, fontSize: 10.5, italic: true } },
], { x: 0.32, y: y + 0.04, w: 12.6, h: 0.5 });
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 9 — GRAMMAR TOPIC 1: Articles (a / an / the)
// ══════════════════════════════════════════════════════════════════════════════
{
const s = darkSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 13.3, h: 1.1, fill: { color: C.gold }, line: { type: "none" } });
s.addText([
{ text: "📘 Grammar Topic 1 — Articles: a / an / the\n", options: { bold: true, fontSize: 26, color: C.navy, breakLine: true } },
{ text: "Артикли: a (один/какой-то) • an (гласный звук) • the (конкретный)", options: { fontSize: 14, color: "333333", italic: true } },
], { x: 0.3, y: 0.02, w: 12.7, h: 1.08, valign: "middle" });
const articles = [
{ art: "A", ru: "(неопределённый)", rule: "Before a consonant sound\n(перед согласным звуком)", ex: "a cat 🐱\na book 📚\na storm ⛈️\na dog 🐶" },
{ art: "AN", ru: "(неопределённый)", rule: "Before a vowel sound\n(перед гласным звуком)", ex: "an apple 🍎\nan umbrella ☂️\nan orange 🍊\nan egg 🥚" },
{ art: "THE", ru: "(определённый)", rule: "Something specific / known\n(конкретный / уже известный)", ex: "the sun ☀️\nthe weather 🌤️\nthe flight ✈️\nthe school 🏫" },
];
articles.forEach((a, i) => {
const x = 0.4 + i * 4.3;
const colors = [C.blue, C.green, C.gold];
const bgs = ["1E3A5F", "1B4A2E", "4A3000"];
s.addShape(pres.ShapeType.roundRect, { x, y: 1.25, w: 4.1, h: 5.9, fill: { color: bgs[i] }, line: { color: colors[i], pt: 3 }, rectRadius: 0.2 });
s.addText(a.art, { x: x + 0.15, y: 1.35, w: 3.8, h: 0.85, fontSize: 46, bold: true, color: colors[i], align: "center" });
s.addText(a.ru, { x: x + 0.15, y: 2.25, w: 3.8, h: 0.4, fontSize: 14, italic: true, color: C.grey, align: "center" });
s.addShape(pres.ShapeType.rect, { x: x + 0.3, y: 2.7, w: 3.5, h: 0.04, fill: { color: colors[i] }, line: { type: "none" } });
s.addText(a.rule, { x: x + 0.15, y: 2.82, w: 3.8, h: 1.1, fontSize: 13, color: C.white, align: "center" });
s.addText(a.ex, { x: x + 0.15, y: 4.0, w: 3.8, h: 2.9, fontSize: 16, color: colors[i], align: "center", valign: "top" });
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 10 — GRAMMAR TOPIC 2: Prepositions of Place (in / on / at)
// ══════════════════════════════════════════════════════════════════════════════
{
const s = lightSlide(pres);
addBanner(s, "📘 Grammar Topic 2 — Prepositions of Place: in / on / at", "Предлоги места: in (в/внутри) • on (на поверхности) • at (у/при)", C.red);
const preps = [
{
prep: "IN",
ru: "в / внутри (v / vnutri)",
color: C.red,
bg: "FFEBEE",
items: [
"in the box 📦 — в коробке",
"in the classroom 🏫 — в классе",
"in the city 🏙️ — в городе",
"in the water 💧 — в воде",
"in a country 🌍 — в стране",
],
},
{
prep: "ON",
ru: "на (поверхности) (na)",
color: C.green,
bg: "E8F5E9",
items: [
"on the table 🪑 — на столе",
"on the wall 🧱 — на стене",
"on the bus 🚌 — в автобусе",
"on the floor 🏠 — на полу",
"on the street 🛣️ — на улице",
],
},
{
prep: "AT",
ru: "у / около (u / okolo)",
color: C.blue,
bg: "E3F2FD",
items: [
"at home 🏠 — дома",
"at school 🏫 — в школе",
"at the door 🚪 — у двери",
"at the bus stop 🚏 — на остановке",
"at the airport ✈️ — в аэропорту",
],
},
];
preps.forEach((p, i) => {
const x = 0.3 + i * 4.3;
s.addShape(pres.ShapeType.roundRect, { x, y: 1.25, w: 4.1, h: 6.0, fill: { color: p.bg }, line: { color: p.color, pt: 3 }, rectRadius: 0.2 });
s.addText([
{ text: p.prep, options: { bold: true, fontSize: 34, color: p.color } },
{ text: " (" + p.ru + ")", options: { fontSize: 14, italic: true, color: C.purple } },
], { x: x + 0.15, y: 1.33, w: 3.8, h: 0.7 });
s.addShape(pres.ShapeType.rect, { x: x + 0.15, y: 2.08, w: 3.8, h: 0.04, fill: { color: p.color }, line: { type: "none" } });
p.items.forEach((item, j) => {
s.addText("• " + item, { x: x + 0.15, y: 2.22 + j * 0.78, w: 3.8, h: 0.72, fontSize: 12.5, color: "222222" });
});
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 11 — GRAMMAR TOPIC 3: Conjunctions (and / but / or / so)
// ══════════════════════════════════════════════════════════════════════════════
{
const s = darkSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 13.3, h: 1.1, fill: { color: C.accent }, line: { type: "none" } });
s.addText([
{ text: "📘 Grammar Topic 3 — Conjunctions: and / but / or / so\n", options: { bold: true, fontSize: 26, color: C.white, breakLine: true } },
{ text: "Союзы: and (и) • but (но) • or (или) • so (поэтому)", options: { fontSize: 14, color: C.white, italic: true } },
], { x: 0.3, y: 0.02, w: 12.7, h: 1.08, valign: "middle" });
const conjs = [
{ word: "AND", ru: "и (i)", color: C.sky, bg: "152A45", meaning: "adds information\n(добавляет информацию)", ex1: "She is singing", ex2: " and dancing." },
{ word: "BUT", ru: "но (no)", color: C.gold, bg: "3A2800", meaning: "shows contrast\n(показывает противопоставление)", ex1: "It is cold", ex2: " but sunny." },
{ word: "OR", ru: "или (ili)", color: C.green, bg: "0A2A1A", meaning: "gives a choice\n(даёт выбор)", ex1: "Tea", ex2: " or coffee?" },
{ word: "SO", ru: "поэтому (poetomu)", color: C.accent, bg: "3A1500", meaning: "shows result\n(показывает результат)", ex1: "It is raining,", ex2: " so I stay home." },
];
conjs.forEach((c, i) => {
const x = 0.3 + i * 3.2;
s.addShape(pres.ShapeType.roundRect, { x, y: 1.25, w: 3.0, h: 5.9, fill: { color: c.bg }, line: { color: c.color, pt: 3 }, rectRadius: 0.2 });
s.addText(c.word, { x: x + 0.1, y: 1.35, w: 2.8, h: 0.85, fontSize: 38, bold: true, color: c.color, align: "center" });
s.addText(c.ru, { x: x + 0.1, y: 2.25, w: 2.8, h: 0.42, fontSize: 16, italic: true, color: C.grey, align: "center" });
s.addShape(pres.ShapeType.rect, { x: x + 0.3, y: 2.72, w: 2.4, h: 0.04, fill: { color: c.color }, line: { type: "none" } });
s.addText(c.meaning, { x: x + 0.1, y: 2.84, w: 2.8, h: 0.85, fontSize: 12, color: C.grey, align: "center" });
s.addText([
{ text: c.ex1, options: { color: C.white, fontSize: 14 } },
{ text: c.ex2, options: { bold: true, color: c.color, fontSize: 14 } },
], { x: x + 0.1, y: 3.8, w: 2.8, h: 1.5, align: "center" });
});
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 12 — SUMMARY & QUICK REFERENCE
// ══════════════════════════════════════════════════════════════════════════════
{
const s = darkSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 13.3, h: 1.1, fill: { color: C.gold }, line: { type: "none" } });
s.addText([
{ text: "⭐ Quick Reference — Cause Connectors\n", options: { bold: true, fontSize: 26, color: C.navy, breakLine: true } },
{ text: "Быстрый справочник — Союзы и предлоги причины", options: { fontSize: 15, italic: true, color: "333333" } },
], { x: 0.3, y: 0.02, w: 12.7, h: 1.08, valign: "middle" });
const left = [
{ word: "AS", ru: "поскольку", after: "subject + verb", color: C.sky },
{ word: "SINCE", ru: "так как", after: "subject + verb", color: C.sky },
{ word: "FOR", ru: "ибо / так как", after: "subject + verb", color: C.sky },
{ word: "BECAUSE", ru: "потому что", after: "subject + verb", color: C.sky },
];
const right = [
{ word: "BECAUSE OF", ru: "из-за", after: "noun / gerund", color: C.gold },
{ word: "DUE TO", ru: "из-за / вследствие", after: "noun / gerund", color: C.gold },
{ word: "OWING TO", ru: "благодаря / из-за", after: "noun / gerund", color: C.gold },
];
s.addText("🔵 Conjunctions (Союзы) — + subject + verb", {
x: 0.5, y: 1.22, w: 6.0, h: 0.45, fontSize: 15, bold: true, color: C.sky,
});
left.forEach((r, i) => {
s.addShape(pres.ShapeType.roundRect, { x: 0.4, y: 1.75 + i * 1.3, w: 6.0, h: 1.18, fill: { color: "152A45" }, line: { color: r.color, pt: 2 }, rectRadius: 0.15 });
s.addText([
{ text: r.word, options: { bold: true, fontSize: 20, color: r.color } },
{ text: " (" + r.ru + ")", options: { fontSize: 14, italic: true, color: C.grey } },
], { x: 0.55, y: 1.80 + i * 1.3, w: 5.8, h: 0.5 });
s.addText("After: " + r.after, { x: 0.55, y: 2.32 + i * 1.3, w: 5.8, h: 0.35, fontSize: 12, color: C.grey });
});
s.addText("🟡 Preposition Phrases (Предлоги) — + noun", {
x: 6.8, y: 1.22, w: 6.2, h: 0.45, fontSize: 15, bold: true, color: C.gold,
});
right.forEach((r, i) => {
s.addShape(pres.ShapeType.roundRect, { x: 6.8, y: 1.75 + i * 1.3, w: 6.1, h: 1.18, fill: { color: "2A1F00" }, line: { color: r.color, pt: 2 }, rectRadius: 0.15 });
s.addText([
{ text: r.word, options: { bold: true, fontSize: 20, color: r.color } },
{ text: " (" + r.ru + ")", options: { fontSize: 14, italic: true, color: C.grey } },
], { x: 6.95, y: 1.80 + i * 1.3, w: 5.9, h: 0.5 });
s.addText("After: " + r.after, { x: 6.95, y: 2.32 + i * 1.3, w: 5.9, h: 0.35, fontSize: 12, color: C.grey });
});
s.addText("⭐ AS / SINCE / FOR / BECAUSE + clause | BECAUSE OF / DUE TO / OWING TO + noun", {
x: 0.4, y: 7.1, w: 12.5, h: 0.38, fontSize: 13, italic: true, color: C.gold, align: "center",
});
}
// ──────────────────────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/cause-connectors-ppt/Cause_Connectors_ESL_Grade3_v2.pptx" })
.then(() => console.log("✅ PPTX v2 created!"))
.catch(e => { console.error("ERROR:", e); process.exit(1); });
~/cause-connectors-ppt/build2.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_WIDE"; // 13.3 x 7.5 inches
const C = {
navy: "1A2A4A",
blue: "2D6BE4",
sky: "5BA4F5",
gold: "F5A623",
white: "FFFFFF",
light: "EFF4FF",
grey: "B0BEC5",
green: "27AE60",
red: "E74C3C",
accent: "FF6B35",
purple: "7B2D8B",
};
function darkSlide(pres) { const s = pres.addSlide(); s.background = { color: C.navy }; return s; }
function lightSlide(pres) { const s = pres.addSlide(); s.background = { color: C.light }; return s; }
function addBanner(s, engTitle, ruTitle, barColor) {
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 13.3, h: 1.15, fill: { color: barColor }, line: { type: "none" } });
s.addText([
{ text: engTitle, options: { bold: true, fontSize: 24, color: C.white, breakLine: true } },
{ text: ruTitle, options: { bold: false, fontSize: 15, color: "CCDDFF", italic: true } },
], { x: 0.3, y: 0.04, w: 12.7, h: 1.1, valign: "middle" });
}
// SLIDE 1 — TITLE
{
const s = darkSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 5.9, w: 13.3, h: 1.6, fill: { color: C.blue }, line: { type: "none" } });
s.addShape(pres.ShapeType.rect, { x: 0, y: 5.6, w: 13.3, h: 0.35, fill: { color: C.gold }, line: { type: "none" } });
s.addText("🔗 Cause & Reason Connectors", { x: 0.5, y: 0.8, w: 12.3, h: 1.3, fontSize: 44, bold: true, color: C.white, align: "center" });
s.addText("Союзы и предлоги причины", { x: 0.5, y: 2.2, w: 12.3, h: 0.75, fontSize: 28, italic: true, color: C.sky, align: "center" });
s.addText("ESL — Grade 3 | Present Simple & Present Continuous", { x: 0.5, y: 3.1, w: 12.3, h: 0.5, fontSize: 17, color: C.grey, align: "center" });
s.addShape(pres.ShapeType.rect, { x: 4.5, y: 3.8, w: 4.3, h: 0.06, fill: { color: C.gold }, line: { type: "none" } });
s.addText("as • since • for • because • because of • due to • owing to", { x: 0.5, y: 4.1, w: 12.3, h: 0.5, fontSize: 15, color: C.grey, align: "center" });
}
// SLIDE 2 — OVERVIEW TABLE
{
const s = lightSlide(pres);
addBanner(s, "📋 Overview — Cause & Reason Connectors", "Обзор — Союзы и предлоги причины", C.navy);
const rows = [
["As (как / поскольку)", "как / поскольку", "subject + verb (подлеж. + глагол)"],
["Since (поскольку / так как)", "поскольку / так как", "subject + verb (подлеж. + глагол)"],
["For (так как / ибо)", "так как / ибо", "subject + verb (подлеж. + глагол)"],
["Because (потому что)", "потому что", "subject + verb (подлеж. + глагол)"],
["Because of (из-за)", "из-за", "noun / gerund (существ. / герундий)"],
["Due to (из-за / вследствие)", "из-за / вследствие", "noun / gerund (существ. / герундий)"],
["Owing to (благодаря / из-за)", "благодаря / из-за", "noun / gerund (существ. / герундий)"],
];
const colX = [0.2, 3.8, 7.0];
const colW = [3.5, 3.0, 6.0];
const headers = ["Connector (Союз/Предлог)", "Russian (Русский)", "Followed by (После стоит)"];
headers.forEach((h, i) => {
s.addShape(pres.ShapeType.rect, { x: colX[i], y: 1.28, w: colW[i] - 0.05, h: 0.55, fill: { color: C.navy }, line: { type: "none" } });
s.addText(h, { x: colX[i] + 0.05, y: 1.28, w: colW[i] - 0.1, h: 0.55, fontSize: 14, bold: true, color: C.white, valign: "middle" });
});
rows.forEach((row, ri) => {
const bg = ri % 2 === 0 ? "DDEEFF" : C.white;
const yPos = 1.88 + ri * 0.68;
row.forEach((cell, ci) => {
s.addShape(pres.ShapeType.rect, { x: colX[ci], y: yPos, w: colW[ci] - 0.05, h: 0.63, fill: { color: bg }, line: { color: C.grey, pt: 1 } });
s.addText(cell, { x: colX[ci] + 0.08, y: yPos + 0.02, w: colW[ci] - 0.16, h: 0.59, fontSize: 12, color: "222222", valign: "middle" });
});
});
}
// SLIDE 3 — AS & SINCE
{
const s = lightSlide(pres);
addBanner(s, "📌 AS & SINCE — Connectors of Cause", "Союзы причины: AS (поскольку) и SINCE (так как)", C.blue);
s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 1.28, w: 6.0, h: 5.9, fill: { color: "E8F0FE" }, line: { color: C.blue, pt: 3 }, rectRadius: 0.2 });
s.addText([
{ text: "AS", options: { bold: true, fontSize: 32, color: C.blue } },
{ text: " (поскольку / как)", options: { fontSize: 17, color: C.purple, italic: true } },
], { x: 0.5, y: 1.36, w: 5.7, h: 0.6 });
s.addShape(pres.ShapeType.rect, { x: 0.5, y: 2.02, w: 5.7, h: 0.04, fill: { color: C.sky }, line: { type: "none" } });
s.addText("📝 Grammar / Грамматика:", { x: 0.5, y: 2.12, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
s.addText([{ text: "AS", options: { bold: true, color: C.blue } }, { text: " + subject + verb", options: { color: "333333" } }], { x: 0.5, y: 2.52, w: 5.7, h: 0.48, fontSize: 13 });
s.addText("📖 Examples / Примеры:", { x: 0.5, y: 3.08, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
[
["As it is snowing,", " the children stay inside."],
["As she is tired,", " she is resting now."],
["As he likes cats,", " he has three at home."],
["As it rains every day,", " we carry umbrellas."],
].forEach(([a, b], i) => {
s.addText([{ text: a, options: { bold: true, color: C.accent, fontSize: 12 } }, { text: b, options: { color: "333333", fontSize: 12 } }], { x: 0.5, y: 3.54 + i * 0.52, w: 5.7, h: 0.45 });
});
s.addShape(pres.ShapeType.roundRect, { x: 6.9, y: 1.28, w: 6.1, h: 5.9, fill: { color: "FFF3E0" }, line: { color: C.gold, pt: 3 }, rectRadius: 0.2 });
s.addText([
{ text: "SINCE", options: { bold: true, fontSize: 32, color: "B8860B" } },
{ text: " (поскольку / так как)", options: { fontSize: 17, color: C.purple, italic: true } },
], { x: 7.1, y: 1.36, w: 5.7, h: 0.6 });
s.addShape(pres.ShapeType.rect, { x: 7.1, y: 2.02, w: 5.7, h: 0.04, fill: { color: C.gold }, line: { type: "none" } });
s.addText("📝 Grammar / Грамматика:", { x: 7.1, y: 2.12, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
s.addText([{ text: "SINCE", options: { bold: true, color: "B8860B" } }, { text: " + subject + verb", options: { color: "333333" } }], { x: 7.1, y: 2.52, w: 5.7, h: 0.48, fontSize: 13 });
s.addText("📖 Examples / Примеры:", { x: 7.1, y: 3.08, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
[
["Since he is late,", " we start without him."],
["Since it is cold,", " she is wearing a coat."],
["Since they like dogs,", " they have two pets."],
["Since the shop is not open,", " we go home."],
].forEach(([a, b], i) => {
s.addText([{ text: a, options: { bold: true, color: "B8860B", fontSize: 12 } }, { text: b, options: { color: "333333", fontSize: 12 } }], { x: 7.1, y: 3.54 + i * 0.52, w: 5.7, h: 0.45 });
});
}
// SLIDE 4 — FOR & BECAUSE
{
const s = lightSlide(pres);
addBanner(s, "📌 FOR & BECAUSE — Connectors of Cause", "Союзы причины: FOR (так как) и BECAUSE (потому что)", C.green);
s.addShape(pres.ShapeType.roundRect, { x: 0.3, y: 1.28, w: 6.0, h: 5.9, fill: { color: "E8F5E9" }, line: { color: C.green, pt: 3 }, rectRadius: 0.2 });
s.addText([
{ text: "FOR", options: { bold: true, fontSize: 32, color: C.green } },
{ text: " (так как / ибо)", options: { fontSize: 17, color: C.purple, italic: true } },
], { x: 0.5, y: 1.36, w: 5.7, h: 0.6 });
s.addShape(pres.ShapeType.rect, { x: 0.5, y: 2.02, w: 5.7, h: 0.04, fill: { color: C.green }, line: { type: "none" } });
s.addText("📝 Grammar / Грамматика:", { x: 0.5, y: 2.12, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
s.addText([
{ text: "FOR", options: { bold: true, color: C.green } },
{ text: " + subject + verb | Formal / книжный стиль\n⚠️ Does NOT start a sentence!", options: { color: "333333" } },
], { x: 0.5, y: 2.54, w: 5.7, h: 0.78, fontSize: 12 });
s.addText("📖 Examples / Примеры:", { x: 0.5, y: 3.4, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
[
["She stays quiet,", " for she does not want to interrupt."],
["He reads a lot,", " for he loves stories."],
["They walk slowly,", " for the road is icy."],
["I stay home,", " for it is raining hard."],
].forEach(([a, b], i) => {
s.addText([{ text: a, options: { color: "333333", fontSize: 12 } }, { text: b, options: { bold: true, color: C.green, fontSize: 12 } }], { x: 0.5, y: 3.86 + i * 0.52, w: 5.7, h: 0.45 });
});
s.addShape(pres.ShapeType.roundRect, { x: 6.9, y: 1.28, w: 6.1, h: 5.9, fill: { color: "FFEBEE" }, line: { color: C.red, pt: 3 }, rectRadius: 0.2 });
s.addText([
{ text: "BECAUSE", options: { bold: true, fontSize: 32, color: C.red } },
{ text: " (потому что)", options: { fontSize: 17, color: C.purple, italic: true } },
], { x: 7.1, y: 1.36, w: 5.7, h: 0.6 });
s.addShape(pres.ShapeType.rect, { x: 7.1, y: 2.02, w: 5.7, h: 0.04, fill: { color: C.red }, line: { type: "none" } });
s.addText("📝 Grammar / Грамматика:", { x: 7.1, y: 2.12, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
s.addText([
{ text: "BECAUSE", options: { bold: true, color: C.red } },
{ text: " + subject + verb | Most common! (Самый частый!)", options: { color: "333333" } },
], { x: 7.1, y: 2.54, w: 5.7, h: 0.78, fontSize: 12 });
s.addText("📖 Examples / Примеры:", { x: 7.1, y: 3.4, w: 5.7, h: 0.38, fontSize: 13, bold: true, color: "444444" });
[
["He is late", " because he wakes up late every day."],
["She is happy", " because she gets a gift today."],
["I am tired", " because I am running now."],
["They are late", " because it is snowing."],
].forEach(([a, b], i) => {
s.addText([{ text: a, options: { color: "333333", fontSize: 12 } }, { text: b, options: { bold: true, color: C.red, fontSize: 12 } }], { x: 7.1, y: 3.86 + i * 0.52, w: 5.7, h: 0.45 });
});
}
// SLIDE 5 — BECAUSE OF / DUE TO / OWING TO
{
const s = lightSlide(pres);
addBanner(s, "📌 BECAUSE OF • DUE TO • OWING TO", "Предложные обороты: из-за / вследствие / благодаря", C.purple);
const cards = [
{
phrase: "BECAUSE OF", ru: "из-за", color: "7B2D8B", bg: "F3E5F5", borderColor: "9C27B0",
note: "+ noun / gerund (существительное / герундий)",
examples: [["The flight is late", " because of bad weather."], ["He is not in school", " because of a cold."], ["She is winning", " because of her hard work."], ["We stay home", " because of the storm."]],
},
{
phrase: "DUE TO", ru: "из-за / вследствие", color: "1565C0", bg: "E3F2FD", borderColor: "1976D2",
note: "+ noun / gerund | often after 'be'",
examples: [["The match is not on", " due to rain."], ["She is not here", " due to illness."], ["The road is not open", " due to repairs."], ["The delay is", " due to technical issues."]],
},
{
phrase: "OWING TO", ru: "благодаря / из-за", color: "00695C", bg: "E0F2F1", borderColor: "00897B",
note: "+ noun / gerund | formal (книжный стиль)",
examples: [["Owing to his effort,", " the job is now done."], ["Owing to the snow,", " school is not open."], ["Owing to her skill,", " she wins the race."], ["Owing to the traffic,", " we are late."]],
},
];
cards.forEach((c, ci) => {
const x = 0.2 + ci * 4.35; const w = 4.2;
s.addShape(pres.ShapeType.roundRect, { x, y: 1.28, w, h: 6.0, fill: { color: c.bg }, line: { color: c.borderColor, pt: 3 }, rectRadius: 0.2 });
s.addText([{ text: c.phrase, options: { bold: true, fontSize: 22, color: c.color } }, { text: "\n(" + c.ru + ")", options: { fontSize: 14, color: C.purple, italic: true } }], { x: x + 0.12, y: 1.35, w: w - 0.24, h: 0.82 });
s.addShape(pres.ShapeType.rect, { x: x + 0.12, y: 2.22, w: w - 0.24, h: 0.03, fill: { color: c.borderColor }, line: { type: "none" } });
s.addText(c.note, { x: x + 0.12, y: 2.32, w: w - 0.24, h: 0.5, fontSize: 11, italic: true, color: "555555" });
c.examples.forEach(([a, b], i) => {
s.addText([{ text: a, options: { bold: true, color: c.color, fontSize: 11.5 } }, { text: b, options: { color: "222222", fontSize: 11.5 } }], { x: x + 0.12, y: 2.9 + i * 0.84, w: w - 0.24, h: 0.78 });
});
});
}
// SLIDE 6 — VOCABULARY
{
const s = lightSlide(pres);
addBanner(s, "📚 Vocabulary — Cause & Reason Words", "Словарь — слова причины и повода", C.navy);
const words = [
{ en: "weather", ru: "погода (pogoda)", emoji: "🌤️" },
{ en: "snow / it is snowing", ru: "снег / идёт снег", emoji: "❄️" },
{ en: "rain / it is raining", ru: "дождь / идёт дождь", emoji: "🌧️" },
{ en: "cold", ru: "холодно (kholodno)", emoji: "🥶" },
{ en: "storm", ru: "буря (burya)", emoji: "⛈️" },
{ en: "illness / sick", ru: "болезнь / больной", emoji: "🤒" },
{ en: "tired", ru: "устал(а) (ustal/a)", emoji: "😴" },
{ en: "late", ru: "поздно / опаздывает", emoji: "⏰" },
{ en: "delay", ru: "задержка (zaderzhka)", emoji: "🕐" },
{ en: "cancel / cancellation", ru: "отмена (otmena)", emoji: "❌" },
{ en: "hard work", ru: "усердный труд", emoji: "💪" },
{ en: "effort", ru: "усилие (usiliye)", emoji: "🏋️" },
{ en: "flight", ru: "рейс / полёт (reys/polyot)", emoji: "✈️" },
{ en: "meeting", ru: "встреча (vstrecha)", emoji: "🤝" },
{ en: "interrupt", ru: "перебивать (perebivatʼ)", emoji: "🤫" },
{ en: "decide", ru: "решать (reshatʼ)", emoji: "💡" },
{ en: "complete / finish", ru: "завершить (zavershitʼ)", emoji: "✅" },
{ en: "repair", ru: "ремонт (remont)", emoji: "🔧" },
{ en: "technical", ru: "технический (tekhnicheskiy)", emoji: "⚙️" },
{ en: "silent", ru: "молчаливый / тихий", emoji: "🤐" },
];
[0, 1].forEach(col => {
const colWords = words.slice(col * 10, col * 10 + 10);
const baseX = col === 0 ? 0.2 : 6.7;
colWords.forEach((w, i) => {
const bg = i % 2 === 0 ? "E3EEFF" : C.white;
const y = 1.25 + i * 0.62;
s.addShape(pres.ShapeType.roundRect, { x: baseX, y, w: 6.3, h: 0.56, fill: { color: bg }, line: { color: C.grey, pt: 1 }, rectRadius: 0.1 });
s.addText([
{ text: w.emoji + " ", options: { fontSize: 14 } },
{ text: w.en, options: { bold: true, color: C.navy, fontSize: 13 } },
{ text: " — ", options: { color: C.grey, fontSize: 12 } },
{ text: w.ru, options: { color: C.purple, fontSize: 12, italic: true } },
], { x: baseX + 0.12, y: y + 0.06, w: 6.1, h: 0.44 });
});
});
}
// SLIDE 7 — QUESTIONS 1-10 with ANSWERS
{
const s = lightSlide(pres);
addBanner(s, "💬 Conversation Questions — Part 1 (Questions 1–10)", "Вопросы для разговора — Часть 1 (Вопросы 1–10)", C.blue);
const qa = [
["1. Why do penguins go ice skating? (Почему пингвины идут кататься на коньках?)",
"➜ Because it is snowing and they love the ice! (Потому что идёт снег и они любят лёд!)"],
["2. What do you do because of bad weather? (Что ты делаешь из-за плохой погоды?)",
"➜ I stay inside because of bad weather. (Я остаюсь дома из-за плохой погоды.)"],
["3. Why is school sometimes not open due to snow? (Почему школа иногда закрыта из-за снега?)",
"➜ School is not open due to heavy snow on the road. (Школа закрыта из-за сильного снега на дороге.)"],
["4. What are you doing right now because you have free time? (Что ты сейчас делаешь, потому что у тебя есть свободное время?)",
"➜ I am reading a book because I have free time. (Я читаю книгу, потому что у меня есть свободное время.)"],
["5. Why do we carry an umbrella because of rain? (Почему мы берём зонт из-за дождя?)",
"➜ We carry an umbrella because of rain so we do not get wet. (Мы берём зонт из-за дождя, чтобы не намокнуть.)"],
["6. What do you eat because you are hungry? (Что ты ешь, потому что ты голоден?)",
"➜ I eat a sandwich because I am hungry. (Я ем бутерброд, потому что я голоден.)"],
["7. Why is a flight sometimes late because of a storm? (Почему рейс иногда задерживается из-за бури?)",
"➜ A flight is late because of a big storm in the sky. (Рейс задерживается из-за большой бури в небе.)"],
["8. What are you wearing today because it is cold? (Что ты сегодня носишь, потому что холодно?)",
"➜ I am wearing a warm coat because it is cold. (Я надеваю тёплое пальто, потому что холодно.)"],
["9. Why do students study hard because of tests? (Почему ученики усердно учатся из-за тестов?)",
"➜ Students study hard because they want good marks. (Ученики усердно учатся, потому что хотят хорошие оценки.)"],
["10. What do you drink because you are thirsty? (Что ты пьёшь, потому что хочешь пить?)",
"➜ I drink water because I am thirsty. (Я пью воду, потому что хочу пить.)"],
];
qa.forEach(([q, a], i) => {
const y = 1.25 + i * 0.612;
const bg = i % 2 === 0 ? "E8F0FE" : "FFFDE7";
s.addShape(pres.ShapeType.roundRect, { x: 0.2, y, w: 12.9, h: 0.56, fill: { color: bg }, line: { color: C.sky, pt: 1 }, rectRadius: 0.1 });
s.addText([
{ text: q + " ", options: { bold: true, color: C.navy, fontSize: 10 } },
{ text: a, options: { color: "1A5E20", fontSize: 10, italic: true } },
], { x: 0.32, y: y + 0.04, w: 12.6, h: 0.49 });
});
}
// SLIDE 8 — QUESTIONS 11-20 with ANSWERS
{
const s = lightSlide(pres);
addBanner(s, "💬 Conversation Questions — Part 2 (Questions 11–20)", "Вопросы для разговора — Часть 2 (Вопросы 11–20)", C.blue);
const qa = [
["11. Why do people stay inside since it is raining? (Почему люди остаются дома, поскольку идёт дождь?)",
"➜ People stay inside since it is raining and the streets are wet. (Люди остаются дома, так как идёт дождь.)"],
["12. What are you reading now because you have free time? (Что ты сейчас читаешь, потому что есть свободное время?)",
"➜ I am reading a comic book because I have free time. (Я читаю комикс, потому что у меня есть свободное время.)"],
["13. Why do you say sorry owing to a mistake? (Почему ты говоришь «прости» из-за ошибки?)",
"➜ I say sorry owing to my mistake because it is polite. (Я говорю «прости» из-за ошибки, потому что это вежливо.)"],
["14. What game are you playing because it is your favourite? (В какую игру ты сейчас играешь, потому что она любимая?)",
"➜ I am playing football because it is my favourite game. (Я играю в футбол, потому что это моя любимая игра.)"],
["15. Why is the road not open due to repairs? (Почему дорога не открыта из-за ремонта?)",
"➜ The road is not open due to repairs on the street. (Дорога не открыта из-за ремонтных работ на улице.)"],
["16. Why do students stay quiet, for the teacher is speaking? (Почему ученики молчат, ведь учитель говорит?)",
"➜ Students stay quiet, for the teacher is speaking and they listen. (Ученики молчат, ведь учитель говорит.)"],
["17. What are you doing because your friend is waiting? (Что ты делаешь, потому что друг ждёт тебя?)",
"➜ I am getting ready because my friend is waiting for me. (Я собираюсь, потому что мой друг ждёт меня.)"],
["18. Why do you sleep early since you wake up early? (Почему ты рано ложишься спать, поскольку рано встаёшь?)",
"➜ I sleep early since I wake up early every morning. (Я ложусь рано, поскольку рано встаю каждое утро.)"],
["19. What are you drawing because you like art? (Что ты сейчас рисуешь, потому что любишь рисование?)",
"➜ I am drawing a house because I like art. (Я рисую дом, потому что люблю рисование.)"],
["20. Why do you help at home owing to your family? (Почему ты помогаешь дома из-за своей семьи?)",
"➜ I help at home owing to my family because I love them. (Я помогаю дома из-за своей семьи, потому что люблю их.)"],
];
qa.forEach(([q, a], i) => {
const y = 1.25 + i * 0.612;
const bg = i % 2 === 0 ? "E8F0FE" : "FFFDE7";
s.addShape(pres.ShapeType.roundRect, { x: 0.2, y, w: 12.9, h: 0.56, fill: { color: bg }, line: { color: C.sky, pt: 1 }, rectRadius: 0.1 });
s.addText([
{ text: q + " ", options: { bold: true, color: C.navy, fontSize: 10 } },
{ text: a, options: { color: "1A5E20", fontSize: 10, italic: true } },
], { x: 0.32, y: y + 0.04, w: 12.6, h: 0.49 });
});
}
// SLIDE 9 — GRAMMAR: Articles
{
const s = darkSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 13.3, h: 1.15, fill: { color: C.gold }, line: { type: "none" } });
s.addText([
{ text: "📘 Grammar Topic 1 — Articles: a / an / the\n", options: { bold: true, fontSize: 26, color: C.navy, breakLine: true } },
{ text: "Артикли: a (один/какой-то) • an (перед гласным) • the (конкретный)", options: { fontSize: 14, color: "333333", italic: true } },
], { x: 0.3, y: 0.04, w: 12.7, h: 1.1, valign: "middle" });
[
{ art: "A", ru: "(неопределённый)", rule: "Before a consonant sound\n(перед согласным звуком)", ex: "a cat 🐱\na book 📚\na storm ⛈️\na dog 🐶", color: C.blue, bg: "1E3A5F" },
{ art: "AN", ru: "(неопределённый)", rule: "Before a vowel sound\n(перед гласным звуком)", ex: "an apple 🍎\nan umbrella ☂️\nan orange 🍊\nan egg 🥚", color: C.green, bg: "1B4A2E" },
{ art: "THE", ru: "(определённый)", rule: "Something specific / known\n(конкретный / уже известный)", ex: "the sun ☀️\nthe weather 🌤️\nthe flight ✈️\nthe school 🏫", color: C.gold, bg: "4A3000" },
].forEach((a, i) => {
const x = 0.4 + i * 4.3;
s.addShape(pres.ShapeType.roundRect, { x, y: 1.28, w: 4.1, h: 5.9, fill: { color: a.bg }, line: { color: a.color, pt: 3 }, rectRadius: 0.2 });
s.addText(a.art, { x: x + 0.15, y: 1.38, w: 3.8, h: 0.85, fontSize: 46, bold: true, color: a.color, align: "center" });
s.addText(a.ru, { x: x + 0.15, y: 2.28, w: 3.8, h: 0.4, fontSize: 14, italic: true, color: C.grey, align: "center" });
s.addShape(pres.ShapeType.rect, { x: x + 0.3, y: 2.73, w: 3.5, h: 0.04, fill: { color: a.color }, line: { type: "none" } });
s.addText(a.rule, { x: x + 0.15, y: 2.85, w: 3.8, h: 1.1, fontSize: 13, color: C.white, align: "center" });
s.addText(a.ex, { x: x + 0.15, y: 4.05, w: 3.8, h: 2.9, fontSize: 16, color: a.color, align: "center", valign: "top" });
});
}
// SLIDE 10 — GRAMMAR: Prepositions of Place
{
const s = lightSlide(pres);
addBanner(s, "📘 Grammar Topic 2 — Prepositions of Place: in / on / at", "Предлоги места: in (в/внутри) • on (на поверхности) • at (у/около)", C.red);
[
{ prep: "IN", ru: "в / внутри (v / vnutri)", color: C.red, bg: "FFEBEE",
items: ["in the box 📦 — в коробке", "in the classroom 🏫 — в классе", "in the city 🏙️ — в городе", "in the water 💧 — в воде", "in a country 🌍 — в стране"] },
{ prep: "ON", ru: "на поверхности (na)", color: C.green, bg: "E8F5E9",
items: ["on the table 🪑 — на столе", "on the wall 🧱 — на стене", "on the bus 🚌 — в автобусе", "on the floor 🏠 — на полу", "on the street 🛣️ — на улице"] },
{ prep: "AT", ru: "у / около (u / okolo)", color: C.blue, bg: "E3F2FD",
items: ["at home 🏠 — дома", "at school 🏫 — в школе", "at the door 🚪 — у двери", "at the bus stop 🚏 — на остановке", "at the airport ✈️ — в аэропорту"] },
].forEach((p, i) => {
const x = 0.3 + i * 4.3;
s.addShape(pres.ShapeType.roundRect, { x, y: 1.28, w: 4.1, h: 6.0, fill: { color: p.bg }, line: { color: p.color, pt: 3 }, rectRadius: 0.2 });
s.addText([{ text: p.prep, options: { bold: true, fontSize: 34, color: p.color } }, { text: " (" + p.ru + ")", options: { fontSize: 13, italic: true, color: C.purple } }], { x: x + 0.15, y: 1.36, w: 3.8, h: 0.7 });
s.addShape(pres.ShapeType.rect, { x: x + 0.15, y: 2.1, w: 3.8, h: 0.04, fill: { color: p.color }, line: { type: "none" } });
p.items.forEach((item, j) => { s.addText("• " + item, { x: x + 0.15, y: 2.24 + j * 0.78, w: 3.8, h: 0.72, fontSize: 12.5, color: "222222" }); });
});
}
// SLIDE 11 — GRAMMAR: Conjunctions
{
const s = darkSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 13.3, h: 1.15, fill: { color: C.accent }, line: { type: "none" } });
s.addText([
{ text: "📘 Grammar Topic 3 — Conjunctions: and / but / or / so\n", options: { bold: true, fontSize: 26, color: C.white, breakLine: true } },
{ text: "Союзы: and (и) • but (но) • or (или) • so (поэтому)", options: { fontSize: 14, color: C.white, italic: true } },
], { x: 0.3, y: 0.04, w: 12.7, h: 1.1, valign: "middle" });
[
{ word: "AND", ru: "и (i)", color: C.sky, bg: "152A45", meaning: "adds information\n(добавляет информацию)", ex1: "She is singing", ex2: " and dancing." },
{ word: "BUT", ru: "но (no)", color: C.gold, bg: "3A2800", meaning: "shows contrast\n(противопоставляет)", ex1: "It is cold", ex2: " but sunny." },
{ word: "OR", ru: "или (ili)", color: C.green, bg: "0A2A1A", meaning: "gives a choice\n(даёт выбор)", ex1: "Tea", ex2: " or coffee?" },
{ word: "SO", ru: "поэтому (poetomu)", color: C.accent, bg: "3A1500", meaning: "shows result\n(показывает результат)", ex1: "It is raining,", ex2: " so I stay home." },
].forEach((c, i) => {
const x = 0.3 + i * 3.2;
s.addShape(pres.ShapeType.roundRect, { x, y: 1.28, w: 3.0, h: 5.9, fill: { color: c.bg }, line: { color: c.color, pt: 3 }, rectRadius: 0.2 });
s.addText(c.word, { x: x + 0.1, y: 1.38, w: 2.8, h: 0.85, fontSize: 38, bold: true, color: c.color, align: "center" });
s.addText(c.ru, { x: x + 0.1, y: 2.28, w: 2.8, h: 0.42, fontSize: 16, italic: true, color: C.grey, align: "center" });
s.addShape(pres.ShapeType.rect, { x: x + 0.3, y: 2.75, w: 2.4, h: 0.04, fill: { color: c.color }, line: { type: "none" } });
s.addText(c.meaning, { x: x + 0.1, y: 2.87, w: 2.8, h: 0.85, fontSize: 12, color: C.grey, align: "center" });
s.addText([{ text: c.ex1, options: { color: C.white, fontSize: 14 } }, { text: c.ex2, options: { bold: true, color: c.color, fontSize: 14 } }], { x: x + 0.1, y: 3.84, w: 2.8, h: 1.5, align: "center" });
});
}
// SLIDE 12 — SUMMARY
{
const s = darkSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 13.3, h: 1.15, fill: { color: C.gold }, line: { type: "none" } });
s.addText([
{ text: "⭐ Quick Reference — Cause Connectors\n", options: { bold: true, fontSize: 26, color: C.navy, breakLine: true } },
{ text: "Быстрый справочник — Союзы и предлоги причины", options: { fontSize: 15, italic: true, color: "333333" } },
], { x: 0.3, y: 0.04, w: 12.7, h: 1.1, valign: "middle" });
s.addText("🔵 Conjunctions (Союзы) — + subject + verb", { x: 0.5, y: 1.28, w: 6.0, h: 0.45, fontSize: 15, bold: true, color: C.sky });
[
{ word: "AS", ru: "поскольку", after: "subject + verb", color: C.sky },
{ word: "SINCE", ru: "так как", after: "subject + verb", color: C.sky },
{ word: "FOR", ru: "ибо / так как", after: "subject + verb", color: C.sky },
{ word: "BECAUSE", ru: "потому что", after: "subject + verb", color: C.sky },
].forEach((r, i) => {
s.addShape(pres.ShapeType.roundRect, { x: 0.4, y: 1.78 + i * 1.28, w: 6.0, h: 1.16, fill: { color: "152A45" }, line: { color: r.color, pt: 2 }, rectRadius: 0.15 });
s.addText([{ text: r.word, options: { bold: true, fontSize: 20, color: r.color } }, { text: " (" + r.ru + ")", options: { fontSize: 14, italic: true, color: C.grey } }], { x: 0.55, y: 1.83 + i * 1.28, w: 5.8, h: 0.5 });
s.addText("After: " + r.after, { x: 0.55, y: 2.35 + i * 1.28, w: 5.8, h: 0.35, fontSize: 12, color: C.grey });
});
s.addText("🟡 Preposition Phrases (Предлоги) — + noun", { x: 6.8, y: 1.28, w: 6.2, h: 0.45, fontSize: 15, bold: true, color: C.gold });
[
{ word: "BECAUSE OF", ru: "из-за", after: "noun / gerund", color: C.gold },
{ word: "DUE TO", ru: "из-за / вследствие", after: "noun / gerund", color: C.gold },
{ word: "OWING TO", ru: "благодаря / из-за", after: "noun / gerund", color: C.gold },
].forEach((r, i) => {
s.addShape(pres.ShapeType.roundRect, { x: 6.8, y: 1.78 + i * 1.28, w: 6.1, h: 1.16, fill: { color: "2A1F00" }, line: { color: r.color, pt: 2 }, rectRadius: 0.15 });
s.addText([{ text: r.word, options: { bold: true, fontSize: 20, color: r.color } }, { text: " (" + r.ru + ")", options: { fontSize: 14, italic: true, color: C.grey } }], { x: 6.95, y: 1.83 + i * 1.28, w: 5.9, h: 0.5 });
s.addText("After: " + r.after, { x: 6.95, y: 2.35 + i * 1.28, w: 5.9, h: 0.35, fontSize: 12, color: C.grey });
});
s.addText("⭐ AS / SINCE / FOR / BECAUSE + clause | BECAUSE OF / DUE TO / OWING TO + noun", {
x: 0.4, y: 7.05, w: 12.5, h: 0.4, fontSize: 13, italic: true, color: C.gold, align: "center",
});
}
pres.writeFile({ fileName: "/home/daytona/workspace/cause-connectors-ppt/Cause_Connectors_v2.pptx" })
.then(() => console.log("✅ Done!"))
.catch(e => { console.error(e); process.exit(1); });
cd /home/daytona/workspace/cause-connectors-ppt && node build2.js 2>&1
libreoffice --headless --convert-to pdf --outdir /tmp /home/daytona/workspace/cause-connectors-ppt/Cause_Connectors_v2.pptx 2>&1 && ls -lh /tmp/Cause_Connectors_v2.pdf
pdftoppm -r 150 -png /tmp/Cause_Connectors_v2.pdf /tmp/v2slide && python3 -c " from PIL import Image import os for i in range(1,13): src = f'/tmp/v2slide-{i:02d}.png' dst = f'/home/daytona/workspace/cause-connectors-ppt/v2_slide-{i:02d}.jpg' if os.path.exists(src): Image.open(src).convert('RGB').save(dst, 'JPEG', quality=93) print(f'Saved {dst}') " && cp /tmp/Cause_Connectors_v2.pdf /home/daytona/workspace/cause-connectors-ppt/Cause_Connectors_v2.pdf && echo "ALL DONE"
Cause Connectors v2
PDF Document · PDF
Cause Connectors v2
Presentation · PPTX
v2 slide 01
Image · JPG
v2 slide 02
Image · JPG
v2 slide 03
Image · JPG
v2 slide 04
Image · JPG
v2 slide 05
Image · JPG
v2 slide 06
Image · JPG
v2 slide 07
Image · JPG
v2 slide 08
Image · JPG
v2 slide 09
Image · JPG
v2 slide 10
Image · JPG
v2 slide 11
Image · JPG
v2 slide 12
Image · JPG












Please make following changes, for example remove all information about " for" and "owing to" .And also remove information about articles and prepositions.Also for remaining like As, since, because, because of,due to please write Russian translation under their English examples . Please also change heading title of our file at top according to new correction.Also only make 15 questions along with answers and logical not funny questions based on and equally distribution of questions using "As, since, because, because of, due to" . Don't use past tense.use only present simple and present continuous tense with easy vocabulary.
~/cause-connectors-ppt/build3.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_WIDE"; // 13.3 x 7.5 inches
const C = {
navy: "1A2A4A",
blue: "2D6BE4",
sky: "5BA4F5",
gold: "F5A623",
white: "FFFFFF",
light: "EFF4FF",
grey: "B0BEC5",
green: "27AE60",
red: "E74C3C",
accent: "FF6B35",
purple: "7B2D8B",
dkgreen:"1A5E20",
};
function darkSlide() { const s = pres.addSlide(); s.background = { color: C.navy }; return s; }
function lightSlide() { const s = pres.addSlide(); s.background = { color: C.light }; return s; }
// Banner: big English title + Russian subtitle line
function addBanner(s, eng, ru, color) {
s.addShape(pres.ShapeType.rect, { x:0, y:0, w:13.3, h:1.2, fill:{ color }, line:{ type:"none" } });
s.addText([
{ text: eng, options:{ bold:true, fontSize:26, color:C.white, breakLine:true } },
{ text: ru, options:{ bold:false, fontSize:15, color:"CCDDFF", italic:true } },
], { x:0.3, y:0.04, w:12.7, h:1.14, valign:"middle" });
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 1 — TITLE
// ══════════════════════════════════════════════════════════════════
{
const s = darkSlide();
s.addShape(pres.ShapeType.rect, { x:0, y:5.8, w:13.3, h:1.75, fill:{ color:C.blue }, line:{ type:"none" } });
s.addShape(pres.ShapeType.rect, { x:0, y:5.55, w:13.3, h:0.3, fill:{ color:C.gold }, line:{ type:"none" } });
s.addText("🔗 Cause & Reason Connectors", {
x:0.5, y:0.75, w:12.3, h:1.3, fontSize:44, bold:true, color:C.white, align:"center"
});
s.addText("Союзы и предлоги причины", {
x:0.5, y:2.15, w:12.3, h:0.8, fontSize:30, italic:true, color:C.sky, align:"center"
});
s.addText("ESL — Grade 3 | Present Simple & Present Continuous", {
x:0.5, y:3.1, w:12.3, h:0.5, fontSize:17, color:C.grey, align:"center"
});
s.addShape(pres.ShapeType.rect, { x:3.5, y:3.75, w:6.3, h:0.06, fill:{ color:C.gold }, line:{ type:"none" } });
s.addText("as • since • because • because of • due to", {
x:0.5, y:4.05, w:12.3, h:0.5, fontSize:18, color:C.grey, align:"center"
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 2 — OVERVIEW TABLE (5 connectors only)
// ══════════════════════════════════════════════════════════════════
{
const s = lightSlide();
addBanner(s, "📋 Overview — Cause & Reason Connectors", "Обзор — Союзы и предлоги причины", C.navy);
const rows = [
["As (поскольку / как)", "поскольку / как", "subject + verb (подлеж. + глагол)"],
["Since (так как / поскольку)", "так как / поскольку", "subject + verb (подлеж. + глагол)"],
["Because (потому что)", "потому что", "subject + verb (подлеж. + глагол)"],
["Because of (из-за)", "из-за", "noun / gerund (существ. / герундий)"],
["Due to (из-за / вследствие)", "из-за / вследствие", "noun / gerund (существ. / герундий)"],
];
const colX = [0.2, 4.1, 7.5];
const colW = [3.8, 3.3, 5.6];
const headers = ["Connector (Союз / Предлог)", "Russian (Русский)", "Followed by (После стоит)"];
headers.forEach((h, i) => {
s.addShape(pres.ShapeType.rect, { x:colX[i], y:1.32, w:colW[i]-0.06, h:0.58, fill:{ color:C.navy }, line:{ type:"none" } });
s.addText(h, { x:colX[i]+0.08, y:1.32, w:colW[i]-0.16, h:0.58, fontSize:14, bold:true, color:C.white, valign:"middle" });
});
rows.forEach((row, ri) => {
const bg = ri % 2 === 0 ? "DDEEFF" : C.white;
const yPos = 1.95 + ri * 0.95;
row.forEach((cell, ci) => {
s.addShape(pres.ShapeType.rect, { x:colX[ci], y:yPos, w:colW[ci]-0.06, h:0.88, fill:{ color:bg }, line:{ color:C.grey, pt:1 } });
s.addText(cell, { x:colX[ci]+0.1, y:yPos+0.04, w:colW[ci]-0.2, h:0.8, fontSize:13, color:"222222", valign:"middle" });
});
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 3 — AS
// ══════════════════════════════════════════════════════════════════
{
const s = lightSlide();
addBanner(s, "📌 AS — Connector of Cause", "Союз причины: AS (поскольку / так как) + подлежащее + глагол", C.blue);
// grammar box
s.addShape(pres.ShapeType.roundRect, { x:0.3, y:1.32, w:12.7, h:1.0, fill:{ color:"E8F0FE" }, line:{ color:C.sky, pt:2 }, rectRadius:0.15 });
s.addText([
{ text:"AS", options:{ bold:true, fontSize:22, color:C.blue } },
{ text:" (поскольку / как) + subject + verb → gives the REASON at the start", options:{ fontSize:15, color:"333333" } },
], { x:0.5, y:1.38, w:12.3, h:0.5 });
s.addText("⚠️ AS usually comes at the start of the sentence. (AS обычно стоит в начале предложения.)", {
x:0.5, y:1.88, w:12.3, h:0.38, fontSize:13, italic:true, color:"555555"
});
// 4 example blocks
const examples = [
{ en:"As it is snowing, the children stay inside.", ru:"Поскольку идёт снег, дети остаются дома." },
{ en:"As she is tired, she is resting now.", ru:"Так как она устала, она сейчас отдыхает." },
{ en:"As he likes cats, he has three at home.", ru:"Поскольку он любит кошек, у него дома три кошки." },
{ en:"As it rains every day, we carry umbrellas.", ru:"Так как каждый день идёт дождь, мы берём зонты." },
];
examples.forEach((ex, i) => {
const x = i < 2 ? 0.3 : 6.8;
const y = 2.38 + (i % 2) * 2.4;
const w = 6.2;
s.addShape(pres.ShapeType.roundRect, { x, y, w, h:2.2, fill:{ color:C.white }, line:{ color:C.blue, pt:2 }, rectRadius:0.15 });
// highlight AS
s.addText([
{ text:"As", options:{ bold:true, color:C.accent, fontSize:15 } },
{ text:ex.en.slice(2), options:{ color:"222222", fontSize:15 } },
], { x:x+0.15, y:y+0.15, w:w-0.3, h:0.9 });
s.addShape(pres.ShapeType.rect, { x:x+0.15, y:y+1.1, w:w-0.3, h:0.03, fill:{ color:"BBCCEE" }, line:{ type:"none" } });
s.addText(ex.ru, { x:x+0.15, y:y+1.2, w:w-0.3, h:0.85, fontSize:13, color:C.purple, italic:true });
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 4 — SINCE
// ══════════════════════════════════════════════════════════════════
{
const s = lightSlide();
addBanner(s, "📌 SINCE — Connector of Cause", "Союз причины: SINCE (так как / поскольку) + подлежащее + глагол", "B8860B");
s.addShape(pres.ShapeType.roundRect, { x:0.3, y:1.32, w:12.7, h:1.0, fill:{ color:"FFF8E1" }, line:{ color:C.gold, pt:2 }, rectRadius:0.15 });
s.addText([
{ text:"SINCE", options:{ bold:true, fontSize:22, color:"B8860B" } },
{ text:" (так как / поскольку) + subject + verb → gives the REASON", options:{ fontSize:15, color:"333333" } },
], { x:0.5, y:1.38, w:12.3, h:0.5 });
s.addText("✅ SINCE can start a sentence or come in the middle. (SINCE может стоять в начале или в середине предложения.)", {
x:0.5, y:1.88, w:12.3, h:0.38, fontSize:13, italic:true, color:"555555"
});
const examples = [
{ en:"Since he is late, we start without him.", ru:"Так как он опаздывает, мы начинаем без него." },
{ en:"Since it is cold, she is wearing a coat.", ru:"Поскольку холодно, она надевает пальто." },
{ en:"Since they like dogs, they have two pets.", ru:"Так как они любят собак, у них два питомца." },
{ en:"Since the shop is not open, we go home.", ru:"Поскольку магазин не открыт, мы идём домой." },
];
examples.forEach((ex, i) => {
const x = i < 2 ? 0.3 : 6.8;
const y = 2.38 + (i % 2) * 2.4;
const w = 6.2;
s.addShape(pres.ShapeType.roundRect, { x, y, w, h:2.2, fill:{ color:C.white }, line:{ color:"B8860B", pt:2 }, rectRadius:0.15 });
s.addText([
{ text:"Since", options:{ bold:true, color:C.accent, fontSize:15 } },
{ text:ex.en.slice(5), options:{ color:"222222", fontSize:15 } },
], { x:x+0.15, y:y+0.15, w:w-0.3, h:0.9 });
s.addShape(pres.ShapeType.rect, { x:x+0.15, y:y+1.1, w:w-0.3, h:0.03, fill:{ color:"EED" }, line:{ type:"none" } });
s.addText(ex.ru, { x:x+0.15, y:y+1.2, w:w-0.3, h:0.85, fontSize:13, color:C.purple, italic:true });
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 5 — BECAUSE
// ══════════════════════════════════════════════════════════════════
{
const s = lightSlide();
addBanner(s, "📌 BECAUSE — Connector of Cause", "Союз причины: BECAUSE (потому что) + подлежащее + глагол", C.red);
s.addShape(pres.ShapeType.roundRect, { x:0.3, y:1.32, w:12.7, h:1.0, fill:{ color:"FFEBEE" }, line:{ color:C.red, pt:2 }, rectRadius:0.15 });
s.addText([
{ text:"BECAUSE", options:{ bold:true, fontSize:22, color:C.red } },
{ text:" (потому что) + subject + verb → Most common! (Самый частый!)", options:{ fontSize:15, color:"333333" } },
], { x:0.5, y:1.38, w:12.3, h:0.5 });
s.addText("✅ BECAUSE usually comes in the middle of a sentence. (BECAUSE обычно стоит в середине предложения.)", {
x:0.5, y:1.88, w:12.3, h:0.38, fontSize:13, italic:true, color:"555555"
});
const examples = [
{ en:"He is late because he wakes up late every day.", ru:"Он опаздывает, потому что каждый день поздно встаёт." },
{ en:"She is happy because she gets a gift today.", ru:"Она счастлива, потому что сегодня получает подарок." },
{ en:"I am tired because I am running now.", ru:"Я устал, потому что сейчас бегу." },
{ en:"They are late because it is snowing.", ru:"Они опаздывают, потому что идёт снег." },
];
examples.forEach((ex, i) => {
const x = i < 2 ? 0.3 : 6.8;
const y = 2.38 + (i % 2) * 2.4;
const w = 6.2;
s.addShape(pres.ShapeType.roundRect, { x, y, w, h:2.2, fill:{ color:C.white }, line:{ color:C.red, pt:2 }, rectRadius:0.15 });
// find 'because' in string
const idx = ex.en.indexOf("because");
s.addText([
{ text:ex.en.slice(0, idx), options:{ color:"222222", fontSize:15 } },
{ text:"because", options:{ bold:true, color:C.accent, fontSize:15 } },
{ text:ex.en.slice(idx+7), options:{ color:"222222", fontSize:15 } },
], { x:x+0.15, y:y+0.15, w:w-0.3, h:0.9 });
s.addShape(pres.ShapeType.rect, { x:x+0.15, y:y+1.1, w:w-0.3, h:0.03, fill:{ color:"FFCDD2" }, line:{ type:"none" } });
s.addText(ex.ru, { x:x+0.15, y:y+1.2, w:w-0.3, h:0.85, fontSize:13, color:C.purple, italic:true });
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 6 — BECAUSE OF & DUE TO (side by side)
// ══════════════════════════════════════════════════════════════════
{
const s = lightSlide();
addBanner(s, "📌 BECAUSE OF & DUE TO — Preposition Phrases", "Предложные обороты: BECAUSE OF (из-за) и DUE TO (из-за / вследствие) + существительное", C.purple);
// ── BECAUSE OF (left) ──
const leftX = 0.3;
s.addShape(pres.ShapeType.roundRect, { x:leftX, y:1.32, w:6.2, h:5.9, fill:{ color:"F3E5F5" }, line:{ color:"9C27B0", pt:3 }, rectRadius:0.2 });
s.addText([
{ text:"BECAUSE OF", options:{ bold:true, fontSize:24, color:"7B2D8B" } },
{ text:" (из-за)", options:{ fontSize:16, color:C.purple, italic:true } },
], { x:leftX+0.15, y:1.4, w:5.9, h:0.62 });
s.addShape(pres.ShapeType.rect, { x:leftX+0.15, y:2.07, w:5.9, h:0.04, fill:{ color:"9C27B0" }, line:{ type:"none" } });
s.addText("+ noun / gerund (+ существительное / герундий)\nDoes NOT need a subject after it!", {
x:leftX+0.15, y:2.18, w:5.9, h:0.62, fontSize:12, italic:true, color:"555555"
});
const becauseOfEx = [
{ en:"The flight is late because of bad weather.", ru:"Рейс задерживается из-за плохой погоды." },
{ en:"He is not in school because of a cold.", ru:"Его нет в школе из-за простуды." },
{ en:"We stay home because of the storm.", ru:"Мы остаёмся дома из-за бури." },
{ en:"She is winning because of her hard work.", ru:"Она побеждает благодаря своему упорному труду." },
];
becauseOfEx.forEach((ex, i) => {
const y = 2.88 + i * 1.1;
const idx = ex.en.indexOf("because of");
s.addText([
{ text:ex.en.slice(0, idx), options:{ color:"222222", fontSize:12.5 } },
{ text:"because of", options:{ bold:true, color:"7B2D8B", fontSize:12.5 } },
{ text:ex.en.slice(idx+10), options:{ color:"222222", fontSize:12.5 } },
], { x:leftX+0.15, y, w:5.9, h:0.48 });
s.addText(ex.ru, { x:leftX+0.15, y:y+0.5, w:5.9, h:0.48, fontSize:12, color:C.purple, italic:true });
});
// ── DUE TO (right) ──
const rightX = 6.8;
s.addShape(pres.ShapeType.roundRect, { x:rightX, y:1.32, w:6.2, h:5.9, fill:{ color:"E3F2FD" }, line:{ color:"1976D2", pt:3 }, rectRadius:0.2 });
s.addText([
{ text:"DUE TO", options:{ bold:true, fontSize:24, color:"1565C0" } },
{ text:" (из-за / вследствие)", options:{ fontSize:16, color:C.purple, italic:true } },
], { x:rightX+0.15, y:1.4, w:5.9, h:0.62 });
s.addShape(pres.ShapeType.rect, { x:rightX+0.15, y:2.07, w:5.9, h:0.04, fill:{ color:"1976D2" }, line:{ type:"none" } });
s.addText("+ noun / gerund (+ существительное / герундий)\nOften used after the verb 'be'.", {
x:rightX+0.15, y:2.18, w:5.9, h:0.62, fontSize:12, italic:true, color:"555555"
});
const dueToEx = [
{ en:"The match is not on due to rain.", ru:"Матч не состоится из-за дождя." },
{ en:"She is not here due to illness.", ru:"Её нет здесь из-за болезни." },
{ en:"The road is not open due to repairs.", ru:"Дорога закрыта из-за ремонта." },
{ en:"The delay is due to technical issues.", ru:"Задержка вызвана техническими проблемами." },
];
dueToEx.forEach((ex, i) => {
const y = 2.88 + i * 1.1;
const idx = ex.en.indexOf("due to");
s.addText([
{ text:ex.en.slice(0, idx), options:{ color:"222222", fontSize:12.5 } },
{ text:"due to", options:{ bold:true, color:"1565C0", fontSize:12.5 } },
{ text:ex.en.slice(idx+6), options:{ color:"222222", fontSize:12.5 } },
], { x:rightX+0.15, y, w:5.9, h:0.48 });
s.addText(ex.ru, { x:rightX+0.15, y:y+0.5, w:5.9, h:0.48, fontSize:12, color:C.purple, italic:true });
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 7 — VOCABULARY LIST (20 words)
// ══════════════════════════════════════════════════════════════════
{
const s = lightSlide();
addBanner(s, "📚 Vocabulary — Cause & Reason Words", "Словарь — слова причины и повода", C.navy);
const words = [
{ en:"weather", ru:"погода (pogoda)", emoji:"🌤️" },
{ en:"snow / it is snowing", ru:"снег / идёт снег", emoji:"❄️" },
{ en:"rain / it is raining", ru:"дождь / идёт дождь", emoji:"🌧️" },
{ en:"cold", ru:"холодно (kholodno)", emoji:"🥶" },
{ en:"storm", ru:"буря (burya)", emoji:"⛈️" },
{ en:"illness / sick", ru:"болезнь / больной", emoji:"🤒" },
{ en:"tired", ru:"устал(а) (ustal/a)", emoji:"😴" },
{ en:"late", ru:"поздно / опаздывает", emoji:"⏰" },
{ en:"delay", ru:"задержка (zaderzhka)", emoji:"🕐" },
{ en:"traffic", ru:"пробки / движение (probki)", emoji:"🚗" },
{ en:"hard work", ru:"усердный труд", emoji:"💪" },
{ en:"effort", ru:"усилие (usiliye)", emoji:"🏋️" },
{ en:"flight", ru:"рейс / полёт (polyot)", emoji:"✈️" },
{ en:"meeting", ru:"встреча (vstrecha)", emoji:"🤝" },
{ en:"hungry", ru:"голодный (golodnyy)", emoji:"🍽️" },
{ en:"thirsty", ru:"хочет пить (khochet pit)", emoji:"💧" },
{ en:"repair", ru:"ремонт (remont)", emoji:"🔧" },
{ en:"technical", ru:"технический", emoji:"⚙️" },
{ en:"stay inside", ru:"оставаться дома", emoji:"🏠" },
{ en:"carry / wear", ru:"нести / носить", emoji:"🎒" },
];
[0, 1].forEach(col => {
const colWords = words.slice(col * 10, col * 10 + 10);
const baseX = col === 0 ? 0.2 : 6.7;
colWords.forEach((w, i) => {
const bg = i % 2 === 0 ? "E3EEFF" : C.white;
const y = 1.28 + i * 0.62;
s.addShape(pres.ShapeType.roundRect, { x:baseX, y, w:6.3, h:0.56, fill:{ color:bg }, line:{ color:C.grey, pt:1 }, rectRadius:0.1 });
s.addText([
{ text:w.emoji + " ", options:{ fontSize:14 } },
{ text:w.en, options:{ bold:true, color:C.navy, fontSize:13 } },
{ text:" — ", options:{ color:C.grey, fontSize:12 } },
{ text:w.ru, options:{ color:C.purple, fontSize:12, italic:true } },
], { x:baseX+0.12, y:y+0.06, w:6.1, h:0.44 });
});
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 8 — QUESTIONS 1–8 (with answers)
// Distribution: Q1-3 → AS, Q4-6 → SINCE, Q7-8 → BECAUSE (first 2)
// ══════════════════════════════════════════════════════════════════
{
const s = lightSlide();
addBanner(s, "💬 Conversation Questions — Part 1 (1–8)", "Вопросы для разговора — Часть 1 (1–8)", C.blue);
// Q = [label colour, question, answer]
const qa = [
// AS — 3 questions
[C.blue,
"1. [AS] As it is raining outside, why do children stay inside? (Поскольку на улице идёт дождь, почему дети остаются дома?)",
"➜ Children stay inside as it is raining outside because they do not want to get wet. (Дети остаются дома, так как идёт дождь и они не хотят промокнуть.)"],
[C.blue,
"2. [AS] As today is cold, what are you wearing? (Поскольку сегодня холодно, что ты надеваешь?)",
"➜ As today is cold, I am wearing a warm coat and a scarf. (Поскольку сегодня холодно, я надеваю тёплое пальто и шарф.)"],
[C.blue,
"3. [AS] As you are hungry right now, what do you eat? (Поскольку ты сейчас голоден, что ты ешь?)",
"➜ As I am hungry right now, I eat a sandwich. (Поскольку я сейчас голоден, я ем бутерброд.)"],
// SINCE — 3 questions
["B8860B",
"4. [SINCE] Since it is cold today, what do people wear? (Так как сегодня холодно, что носят люди?)",
"➜ Since it is cold today, people wear warm coats and hats. (Так как сегодня холодно, люди носят тёплые пальто и шапки.)"],
["B8860B",
"5. [SINCE] Since the shop is not open, where do you go? (Поскольку магазин не открыт, куда ты идёшь?)",
"➜ Since the shop is not open, I go home. (Поскольку магазин не открыт, я иду домой.)"],
["B8860B",
"6. [SINCE] Since he is late, what does the class do? (Так как он опаздывает, что делает класс?)",
"➜ Since he is late, the class starts without him. (Так как он опаздывает, класс начинает без него.)"],
// BECAUSE — first 2 of 3
[C.red,
"7. [BECAUSE] Why are you carrying an umbrella today? (Почему ты сегодня несёшь зонт?)",
"➜ I am carrying an umbrella today because it is raining outside. (Я несу зонт сегодня, потому что на улице идёт дождь.)"],
[C.red,
"8. [BECAUSE] Why is she drinking water right now? (Почему она сейчас пьёт воду?)",
"➜ She is drinking water right now because she is thirsty. (Она сейчас пьёт воду, потому что хочет пить.)"],
];
qa.forEach(([col, q, a], i) => {
const y = 1.3 + i * 0.77;
const bg = i % 2 === 0 ? "E8F0FE" : "FFFDE7";
s.addShape(pres.ShapeType.roundRect, { x:0.2, y, w:12.9, h:0.7, fill:{ color:bg }, line:{ color:col, pt:2 }, rectRadius:0.1 });
s.addText([
{ text:q + " ", options:{ bold:true, color:"111111", fontSize:9.8 } },
{ text:a, options:{ color:C.dkgreen, fontSize:9.8, italic:true } },
], { x:0.32, y:y+0.04, w:12.6, h:0.62 });
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 9 — QUESTIONS 9–15 (with answers)
// Q9 → BECAUSE, Q10-12 → BECAUSE OF, Q13-15 → DUE TO
// ══════════════════════════════════════════════════════════════════
{
const s = lightSlide();
addBanner(s, "💬 Conversation Questions — Part 2 (9–15)", "Вопросы для разговора — Часть 2 (9–15)", C.blue);
const qa = [
// BECAUSE — last 1 of 3
[C.red,
"9. [BECAUSE] Why are the students studying hard? (Почему ученики усердно учатся?)",
"➜ The students are studying hard because they have a test tomorrow. (Ученики усердно учатся, потому что завтра у них тест.)"],
// BECAUSE OF — 3 questions
["7B2D8B",
"10. [BECAUSE OF] Why is the flight not on time today? (Почему рейс сегодня не вовремя?)",
"➜ The flight is not on time today because of bad weather. (Рейс сегодня не вовремя из-за плохой погоды.)"],
["7B2D8B",
"11. [BECAUSE OF] Why is your friend not at school today? (Почему твой друг сегодня не в школе?)",
"➜ My friend is not at school today because of a cold. (Мой друг сегодня не в школе из-за простуды.)"],
["7B2D8B",
"12. [BECAUSE OF] Why do we stay inside because of a storm? (Почему мы остаёмся дома из-за бури?)",
"➜ We stay inside because of the storm as it is very strong. (Мы остаёмся дома из-за бури, так как она очень сильная.)"],
// DUE TO — 3 questions
["1565C0",
"13. [DUE TO] Why is the road not open today? (Почему дорога сегодня не открыта?)",
"➜ The road is not open today due to repairs on the street. (Дорога сегодня не открыта из-за ремонта на улице.)"],
["1565C0",
"14. [DUE TO] Why is your classmate not here due to illness? (Почему твой одноклассник здесь не из-за болезни?)",
"➜ My classmate is not here due to illness. He is at home resting. (Мой одноклассник отсутствует из-за болезни. Он отдыхает дома.)"],
["1565C0",
"15. [DUE TO] Why is the bus late due to traffic? (Почему автобус опаздывает из-за пробок?)",
"➜ The bus is late due to heavy traffic on the road. (Автобус опаздывает из-за большой пробки на дороге.)"],
];
qa.forEach(([col, q, a], i) => {
const y = 1.3 + i * 0.87;
const bg = i % 2 === 0 ? "E8F0FE" : "FFFDE7";
s.addShape(pres.ShapeType.roundRect, { x:0.2, y, w:12.9, h:0.8, fill:{ color:bg }, line:{ color:col, pt:2 }, rectRadius:0.1 });
s.addText([
{ text:q + " ", options:{ bold:true, color:"111111", fontSize:9.8 } },
{ text:a, options:{ color:C.dkgreen, fontSize:9.8, italic:true } },
], { x:0.32, y:y+0.04, w:12.6, h:0.72 });
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 10 — GRAMMAR: Conjunctions (and / but / or / so)
// ══════════════════════════════════════════════════════════════════
{
const s = darkSlide();
s.addShape(pres.ShapeType.rect, { x:0, y:0, w:13.3, h:1.2, fill:{ color:C.accent }, line:{ type:"none" } });
s.addText([
{ text:"📘 Grammar Topic — Conjunctions: and / but / or / so\n", options:{ bold:true, fontSize:26, color:C.white, breakLine:true } },
{ text:"Союзы: and (и) • but (но) • or (или) • so (поэтому)", options:{ fontSize:15, color:C.white, italic:true } },
], { x:0.3, y:0.04, w:12.7, h:1.14, valign:"middle" });
[
{ word:"AND", ru:"и (i)", color:C.sky, bg:"152A45",
meaning:"adds information\n(добавляет информацию)",
ex:"She is singing and dancing.\nОна поёт и танцует." },
{ word:"BUT", ru:"но (no)", color:C.gold, bg:"3A2800",
meaning:"shows contrast\n(противопоставляет)",
ex:"It is cold but sunny.\nХолодно, но солнечно." },
{ word:"OR", ru:"или (ili)", color:C.green, bg:"0A2A1A",
meaning:"gives a choice\n(даёт выбор)",
ex:"Tea or coffee?\nЧай или кофе?" },
{ word:"SO", ru:"поэтому (poetomu)", color:C.accent, bg:"3A1500",
meaning:"shows result\n(показывает результат)",
ex:"It is raining, so I stay home.\nИдёт дождь, поэтому я остаюсь дома." },
].forEach((c, i) => {
const x = 0.3 + i * 3.2;
s.addShape(pres.ShapeType.roundRect, { x, y:1.28, w:3.0, h:6.0, fill:{ color:c.bg }, line:{ color:c.color, pt:3 }, rectRadius:0.2 });
s.addText(c.word, { x:x+0.1, y:1.38, w:2.8, h:0.9, fontSize:38, bold:true, color:c.color, align:"center" });
s.addText(c.ru, { x:x+0.1, y:2.32, w:2.8, h:0.45, fontSize:16, italic:true, color:C.grey, align:"center" });
s.addShape(pres.ShapeType.rect, { x:x+0.3, y:2.82, w:2.4, h:0.04, fill:{ color:c.color }, line:{ type:"none" } });
s.addText(c.meaning, { x:x+0.1, y:2.94, w:2.8, h:0.9, fontSize:12, color:C.grey, align:"center" });
s.addText(c.ex, { x:x+0.1, y:3.94, w:2.8, h:3.0, fontSize:14, color:c.color, align:"center", valign:"top" });
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 11 — QUICK REFERENCE SUMMARY (5 connectors)
// ══════════════════════════════════════════════════════════════════
{
const s = darkSlide();
s.addShape(pres.ShapeType.rect, { x:0, y:0, w:13.3, h:1.2, fill:{ color:C.gold }, line:{ type:"none" } });
s.addText([
{ text:"⭐ Quick Reference — Cause Connectors\n", options:{ bold:true, fontSize:26, color:C.navy, breakLine:true } },
{ text:"Быстрый справочник — Союзы и предлоги причины", options:{ fontSize:15, italic:true, color:"333333" } },
], { x:0.3, y:0.04, w:12.7, h:1.14, valign:"middle" });
// Left col: conjunctions (AS, SINCE, BECAUSE)
s.addText("🔵 Conjunctions — + subject + verb (Союзы — + подлежащее + глагол)", {
x:0.4, y:1.3, w:6.2, h:0.45, fontSize:14, bold:true, color:C.sky
});
[
{ word:"AS", ru:"поскольку / как", color:C.sky },
{ word:"SINCE", ru:"так как / поскольку", color:C.sky },
{ word:"BECAUSE", ru:"потому что", color:C.sky },
].forEach((r, i) => {
s.addShape(pres.ShapeType.roundRect, { x:0.4, y:1.82 + i*1.65, w:6.1, h:1.52, fill:{ color:"152A45" }, line:{ color:r.color, pt:2 }, rectRadius:0.15 });
s.addText([
{ text:r.word, options:{ bold:true, fontSize:24, color:r.color } },
{ text:" (" + r.ru + ")", options:{ fontSize:15, italic:true, color:C.grey } },
], { x:0.55, y:1.9 + i*1.65, w:5.8, h:0.58 });
s.addText("After: subject + verb (подлеж. + глагол)", { x:0.55, y:2.52 + i*1.65, w:5.8, h:0.38, fontSize:12, color:C.grey });
});
// Right col: preposition phrases (BECAUSE OF, DUE TO)
s.addText("🟡 Preposition Phrases — + noun (Предлоги — + существительное)", {
x:7.0, y:1.3, w:6.0, h:0.45, fontSize:14, bold:true, color:C.gold
});
[
{ word:"BECAUSE OF", ru:"из-за", color:C.gold },
{ word:"DUE TO", ru:"из-за / вследствие", color:C.gold },
].forEach((r, i) => {
s.addShape(pres.ShapeType.roundRect, { x:7.0, y:1.82 + i*1.65, w:6.0, h:1.52, fill:{ color:"2A1F00" }, line:{ color:r.color, pt:2 }, rectRadius:0.15 });
s.addText([
{ text:r.word, options:{ bold:true, fontSize:24, color:r.color } },
{ text:" (" + r.ru + ")", options:{ fontSize:15, italic:true, color:C.grey } },
], { x:7.15, y:1.9 + i*1.65, w:5.8, h:0.58 });
s.addText("After: noun / gerund (существит. / герундий)", { x:7.15, y:2.52 + i*1.65, w:5.8, h:0.38, fontSize:12, color:C.grey });
});
s.addText("🔑 AS / SINCE / BECAUSE + clause | BECAUSE OF / DUE TO + noun — All express CAUSE / REASON (Все выражают ПРИЧИНУ)", {
x:0.4, y:7.05, w:12.5, h:0.42, fontSize:13, italic:true, color:C.gold, align:"center"
});
}
// ──────────────────────────────────────────────────────────────────
pres.writeFile({ fileName:"/home/daytona/workspace/cause-connectors-ppt/Cause_Connectors_v3.pptx" })
.then(() => console.log("✅ v3 Done!"))
.catch(e => { console.error(e); process.exit(1); });
Now try again
cd /home/daytona/workspace/cause-connectors-ppt && node build3.js 2>&1
libreoffice --headless --convert-to pdf --outdir /tmp /home/daytona/workspace/cause-connectors-ppt/Cause_Connectors_v3.pptx 2>&1 && ls -lh /tmp/Cause_Connectors_v3.pdf
pdftoppm -r 150 -png /tmp/Cause_Connectors_v3.pdf /tmp/v3slide && python3 -c " from PIL import Image import os, glob files = sorted(glob.glob('/tmp/v3slide-*.png')) print('Found', len(files), 'slides') for f in files: num = f.split('-')[-1].replace('.png','') dst = f'/home/daytona/workspace/cause-connectors-ppt/v3_slide-{num}.jpg' Image.open(f).convert('RGB').save(dst, 'JPEG', quality=93) print('Saved', dst) " && cp /tmp/Cause_Connectors_v3.pdf /home/daytona/workspace/cause-connectors-ppt/Cause_Connectors_v3.pdf && echo "ALL DONE"
Cause Connectors v3
PDF Document · PDF
Cause Connectors v3
Presentation · PPTX
v3 slide 01
Image · JPG
v3 slide 02
Image · JPG
v3 slide 03
Image · JPG
v3 slide 04
Image · JPG
v3 slide 05
Image · JPG
v3 slide 06
Image · JPG
v3 slide 07
Image · JPG
v3 slide 08
Image · JPG
v3 slide 09
Image · JPG
v3 slide 10
Image · JPG
v3 slide 11
Image · JPG










