"use strict"; const pptxgen = require("pptxgenjs"); // ── Paths ────────────────────────────────────────────────────────────────── const LOGO = "C:/Users/PC-Roby/Documents/_adiuvai_workspace/adiuvAI/assets/logo/logo-icon.png"; const SCR_H = "C:/Users/PC-Roby/Documents/_adiuvai_workspace/adiuvAI/assets/screenshot/home.png"; const SCR_HC = "C:/Users/PC-Roby/Documents/_adiuvai_workspace/adiuvAI/assets/screenshot/home_chat.png"; const OUTPUT = "C:/Users/PC-Roby/Documents/_adiuvai_workspace/docs/adiuvAI-pitch-geopop.pptx"; // ── Color tokens (NO # prefix) ───────────────────────────────────────────── const C = { canvas: "f4edf3", // light bg ink: "040404", // primary text golden: "fbc881", // accent slate: "8a8ea9", // secondary text lavender: "c8c3cd", // borders void: "0c0c0c", // dark bg paper: "fbfbfb", // text-on-dark / card fill graphite: "323232", // dark card green: "2e7d32", red: "c62828", }; // ── Shadow factory (NEVER reuse same object) ──────────────────────────────── const mkShadow = () => ({ type: "outer", blur: 8, offset: 2, angle: 135, color: "000000", opacity: 0.08 }); // ── Helpers ──────────────────────────────────────────────────────────────── function eyebrow(sl, text, x, y, w, align = "left") { sl.addText(text, { x, y, w, h: 0.28, fontFace: "Calibri", fontSize: 9, bold: true, color: C.golden, charSpacing: 2, align, margin: 0, }); } // ═══════════════════════════════════════════════════════════════════════════ const pres = new pptxgen(); pres.layout = "LAYOUT_16x9"; // 10" × 5.625" pres.title = "adiuvAI — Pitch Deck"; pres.author = "Roberto Musso"; // ══════════════════════════════════════════════════════════════════ // SLIDE 1 — COVER (dark) // ══════════════════════════════════════════════════════════════════ { const sl = pres.addSlide(); sl.background = { color: C.void }; // Logo top-left sl.addImage({ path: LOGO, x: 0.4, y: 0.28, w: 0.75, h: 0.75 }); // Eyebrow top-right eyebrow(sl, "BETA · GIUGNO 2026", 1.5, 0.35, 8, "right"); // Main headline sl.addText([ { text: "Incontra la tua nuova", options: { color: C.paper, breakLine: true } }, { text: "segretaria.", options: { color: C.golden } }, ], { x: 0.5, y: 1.3, w: 9, h: 2.0, fontFace: "Calibri", fontSize: 54, bold: true, align: "center", }); // Subtitle sl.addText( "Una AI che legge la tua posta, organizza il tuo lavoro,\ne ogni mattina ti dice cosa conta davvero. Tutto sul tuo computer.", { x: 1, y: 3.4, w: 8, h: 1.15, fontFace: "Calibri", fontSize: 18, color: C.slate, align: "center", } ); // Footer sl.addText("adiuvai.com", { x: 0, y: 5.28, w: 10, h: 0.28, fontFace: "Calibri", fontSize: 11, color: C.slate, align: "center", margin: 0, }); } // ══════════════════════════════════════════════════════════════════ // SLIDE 2 — CHI PARLA (light) // ══════════════════════════════════════════════════════════════════ { const sl = pres.addSlide(); sl.background = { color: C.canvas }; // Left golden accent bar sl.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 0.45, w: 0.06, h: 4.7, fill: { color: C.golden }, line: { color: C.golden }, }); eyebrow(sl, "IL FONDATORE", 0.62, 0.5, 5); sl.addText("Roberto Musso", { x: 0.62, y: 0.82, w: 9, h: 0.9, fontFace: "Calibri", fontSize: 40, bold: true, color: C.ink, margin: 0, }); sl.addText("AI Senior Architect @ Hewlett Packard Enterprise", { x: 0.62, y: 1.72, w: 9, h: 0.45, fontFace: "Calibri", fontSize: 18, color: C.slate, margin: 0, }); // Separator sl.addShape(pres.shapes.LINE, { x: 0.62, y: 2.3, w: 8.7, h: 0, line: { color: C.lavender, width: 0.75 }, }); // Bullets sl.addText([ { text: "In Hewlett Packard Enterprise dal 2018", options: { bullet: true, breakLine: true } }, { text: "AI Delivery Team Lead — guido un team di 6 persone", options: { bullet: true, breakLine: true } }, { text: "Progetto e consegno soluzioni AI enterprise", options: { bullet: true } }, ], { x: 0.62, y: 2.48, w: 8.8, h: 1.55, fontFace: "Calibri", fontSize: 17, color: C.ink, }); // Closing line sl.addText( "adiuvAI nasce da quello che faccio ogni giorno: trasformare l\u2019AI in qualcosa che funziona davvero.", { x: 0.62, y: 4.25, w: 8.8, h: 0.85, fontFace: "Calibri", fontSize: 16, italic: true, color: C.slate, margin: 0, } ); } // ══════════════════════════════════════════════════════════════════ // SLIDE 3 — HOOK (dark) // ══════════════════════════════════════════════════════════════════ { const sl = pres.addSlide(); sl.background = { color: C.void }; sl.addText("Quante app hai aperto adesso?", { x: 0.4, y: 0.5, w: 9.2, h: 1.5, fontFace: "Calibri", fontSize: 52, bold: true, color: C.paper, align: "center", }); sl.addText("Ottimista: sei.", { x: 0.4, y: 1.95, w: 9.2, h: 0.65, fontFace: "Calibri", fontSize: 26, color: C.slate, align: "center", }); // App pills — 8 × (1.0" wide + 0.1" gap) = 8.8" total; start at 0.6 const apps = ["Gmail", "Outlook", "Teams", "Slack", "Notion", "Trello", "OneDrive", "WhatsApp"]; const pW = 1.0, pH = 0.38, pGap = 0.115, pY = 2.82, pX0 = 0.58; apps.forEach((app, i) => { const px = pX0 + i * (pW + pGap); sl.addShape(pres.shapes.RECTANGLE, { x: px, y: pY, w: pW, h: pH, fill: { color: "1c1c1c" }, line: { color: C.golden, width: 1 }, }); sl.addText(app, { x: px, y: pY, w: pW, h: pH, fontFace: "Calibri", fontSize: 12, bold: true, color: C.golden, align: "center", valign: "middle", margin: 0, }); }); // Punchline sl.addText( "Otto posti dove si nasconde il tuo lavoro importante.\nE tu salti da uno all\u2019altro. Tutto. Il. Giorno.", { x: 0.5, y: 3.45, w: 9, h: 1.85, fontFace: "Calibri", fontSize: 22, bold: true, color: C.golden, align: "center", } ); } // ══════════════════════════════════════════════════════════════════ // SLIDE 4 — PAIN POINTS (light) // ══════════════════════════════════════════════════════════════════ { const sl = pres.addSlide(); sl.background = { color: C.canvas }; eyebrow(sl, "COSA SUCCEDE DAVVERO", 0.4, 0.25, 6); sl.addText("Il tuo lavoro importante ti sta scappando.", { x: 0.4, y: 0.55, w: 9.2, h: 0.75, fontFace: "Calibri", fontSize: 30, bold: true, color: C.ink, margin: 0, }); const cards = [ { icon: "\u2709\uFE0F", title: "Email importanti", body: "Si nascondono tra le newsletter.\nLe leggi tardi o non le leggi affatto." }, { icon: "\u2705", title: "I tuoi task", body: "Vivono in tre app diverse.\nNe perderai sempre uno." }, { icon: "\uD83D\uDCDD", title: "Note riunione", body: "Stanno in un doc che non riaprirai mai.\nLe azioni restano senza seguito." }, ]; const cW = 2.93, cH = 2.75, cY = 1.5, cGap = 0.2, cX0 = 0.41; cards.forEach((card, i) => { const cx = cX0 + i * (cW + cGap); sl.addShape(pres.shapes.RECTANGLE, { x: cx, y: cY, w: cW, h: cH, fill: { color: C.paper }, line: { color: C.lavender, width: 1.5 }, shadow: mkShadow(), }); // Golden top bar sl.addShape(pres.shapes.RECTANGLE, { x: cx, y: cY, w: cW, h: 0.05, fill: { color: C.golden }, line: { color: C.golden }, }); sl.addText(card.icon, { x: cx + 0.18, y: cY + 0.18, w: 0.7, h: 0.7, fontFace: "Segoe UI Emoji", fontSize: 28, margin: 0, }); sl.addText(card.title, { x: cx + 0.18, y: cY + 0.98, w: cW - 0.3, h: 0.45, fontFace: "Calibri", fontSize: 16, bold: true, color: C.ink, margin: 0, }); sl.addText(card.body, { x: cx + 0.18, y: cY + 1.48, w: cW - 0.3, h: 1.1, fontFace: "Calibri", fontSize: 14, color: C.slate, margin: 0, }); }); // Punchline sl.addText("Spoiler: il problema non sei tu. Sono gli strumenti.", { x: 0.4, y: 4.52, w: 9.2, h: 0.72, fontFace: "Calibri", fontSize: 19, bold: true, color: C.golden, align: "center", margin: 0, }); } // ══════════════════════════════════════════════════════════════════ // SLIDE 5 — TWIST (dark, minimal) // ══════════════════════════════════════════════════════════════════ { const sl = pres.addSlide(); sl.background = { color: C.void }; sl.addText("Non ti serve un altro tool.", { x: 0.5, y: 0.95, w: 9, h: 1.3, fontFace: "Calibri", fontSize: 50, bold: false, color: C.paper, align: "center", }); sl.addText("Ti serve una segretaria.", { x: 0.5, y: 2.35, w: 9, h: 1.6, fontFace: "Calibri", fontSize: 64, bold: true, color: C.golden, align: "center", }); sl.addText("Una che legge tutto al posto tuo. E ti dice dove guardare.", { x: 1, y: 4.25, w: 8, h: 0.65, fontFace: "Calibri", fontSize: 18, color: C.slate, align: "center", }); } // ══════════════════════════════════════════════════════════════════ // SLIDE 6 — SOLUZIONE (light) // ══════════════════════════════════════════════════════════════════ { const sl = pres.addSlide(); sl.background = { color: C.canvas }; eyebrow(sl, "LA SOLUZIONE", 0.4, 0.22, 5); sl.addText("adiuvAI \u2014 la tua segretaria AI.", { x: 0.4, y: 0.52, w: 9.2, h: 0.85, fontFace: "Calibri", fontSize: 36, bold: true, color: C.ink, margin: 0, }); sl.addText("Gli altri tool aspettano che tu li usi. adiuvAI lavora per te.", { x: 0.4, y: 1.38, w: 9.2, h: 0.48, fontFace: "Calibri", fontSize: 17, italic: true, color: C.slate, margin: 0, }); const cols = [ { icon: "\uD83D\uDCE7", title: "Legge la tua posta", body: "Filtra, prioritizza, segnala solo ci\u00F2 che richiede la tua attenzione." }, { icon: "\uD83D\uDCC5", title: "Tiene in ordine l\u2019agenda", body: "Scadenze, impegni, follow-up \u2014 tutto tracciato senza chiederti nulla." }, { icon: "\uD83D\uDCCB", title: "Prepara il briefing", body: "Ogni mattina un piano chiaro: ecco cosa conta oggi." }, { icon: "\uD83D\uDE80", title: "Ti aiuta a eseguire", body: "Prepara bozze, organizza documenti, ti accompagna mentre lavori." }, ]; const coW = 2.2, coH = 3.05, coY = 2.0, coGap = 0.17, coX0 = 0.41; cols.forEach((col, i) => { const cx = coX0 + i * (coW + coGap); sl.addShape(pres.shapes.RECTANGLE, { x: cx, y: coY, w: coW, h: coH, fill: { color: C.paper }, line: { color: C.lavender, width: 1 }, }); // Left golden accent bar sl.addShape(pres.shapes.RECTANGLE, { x: cx, y: coY, w: 0.05, h: coH, fill: { color: C.golden }, line: { color: C.golden }, }); sl.addText(col.icon, { x: cx + 0.15, y: coY + 0.18, w: 0.55, h: 0.6, fontFace: "Segoe UI Emoji", fontSize: 26, margin: 0, }); sl.addText(col.title, { x: cx + 0.1, y: coY + 0.88, w: coW - 0.18, h: 0.7, fontFace: "Calibri", fontSize: 14, bold: true, color: C.ink, margin: 0, }); sl.addText(col.body, { x: cx + 0.1, y: coY + 1.65, w: coW - 0.18, h: 1.22, fontFace: "Calibri", fontSize: 13, color: C.slate, margin: 0, }); }); } // ══════════════════════════════════════════════════════════════════ // SLIDE 7 — DAILY BRIEF + CAROSELLO (light + screenshot) // ══════════════════════════════════════════════════════════════════ { const sl = pres.addSlide(); sl.background = { color: C.canvas }; eyebrow(sl, "LA MATTINA, DIVERSA", 0.35, 0.2, 4.3); sl.addText("Il briefing del mattino.\nPoi ti prende per mano.", { x: 0.35, y: 0.5, w: 4.4, h: 1.25, fontFace: "Calibri", fontSize: 26, bold: true, color: C.ink, margin: 0, }); sl.addText( "Ogni mattina, un briefing personalizzato: cosa \u00E8 cambiato, cosa scade, cosa conta oggi.", { x: 0.35, y: 1.85, w: 4.4, h: 0.75, fontFace: "Calibri", fontSize: 14, color: C.ink, margin: 0, } ); sl.addText([ { text: "Il carosello attivit\u00E0 ti guida scheda per scheda, passo passo.", options: { bullet: true, breakLine: true } }, { text: "Chatti con lei mentre lavori. Come se ti fosse al fianco.", options: { bullet: true } }, ], { x: 0.35, y: 2.7, w: 4.4, h: 0.85, fontFace: "Calibri", fontSize: 14, color: C.ink, }); // Quote box sl.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 3.68, w: 4.4, h: 1.5, fill: { color: C.paper }, line: { color: C.golden, width: 2 }, shadow: mkShadow(), }); sl.addText( "\u00ABCliente X di solito paga in ritardo.\nLa tua fattura \u00E8 ancora aperta.\u00BB", { x: 0.55, y: 3.8, w: 4.0, h: 0.78, fontFace: "Calibri", fontSize: 14, italic: true, color: C.ink, margin: 0, } ); sl.addText("\u2014 il Daily Brief, con memoria relazionale", { x: 0.55, y: 4.65, w: 4.0, h: 0.38, fontFace: "Calibri", fontSize: 11, color: C.slate, margin: 0, }); // Screenshot right half sl.addImage({ path: SCR_H, x: 4.95, y: 0.18, w: 4.75, h: 5.25, sizing: { type: "contain", w: 4.75, h: 5.25 }, }); } // ══════════════════════════════════════════════════════════════════ // SLIDE 8 — CHAT (light + screenshot) // ══════════════════════════════════════════════════════════════════ { const sl = pres.addSlide(); sl.background = { color: C.canvas }; sl.addText("Parla con lei.\nIn italiano. In linguaggio naturale.", { x: 0.35, y: 0.28, w: 4.4, h: 1.2, fontFace: "Calibri", fontSize: 24, bold: true, color: C.ink, margin: 0, }); const bubbles = [ "\u00ABQual \u00E8 la prossima attivit\u00E0 su cui concentrarmi?\u00BB", "\u00ABRiassumi le email arrivate stamattina.\u00BB", "\u00ABCrea un\u2019attivit\u00E0: richiamare Luca gioved\u00EC.\u00BB", "\u00ABCosa \u00E8 cambiato sul progetto Patient Portal?\u00BB", ]; bubbles.forEach((bub, i) => { const by = 1.62 + i * 0.77; sl.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: by, w: 4.4, h: 0.6, fill: { color: C.paper }, line: { color: C.golden, width: 1.5 }, }); sl.addText(bub, { x: 0.5, y: by, w: 4.1, h: 0.6, fontFace: "Calibri", fontSize: 13, italic: true, color: C.ink, valign: "middle", margin: 0, }); }); sl.addText( "Niente prompt engineering. Niente modelli da scegliere.\nL\u2019AI giusta lavora in background.", { x: 0.35, y: 4.82, w: 4.4, h: 0.65, fontFace: "Calibri", fontSize: 12, italic: true, color: C.slate, margin: 0, } ); // Screenshot right sl.addImage({ path: SCR_HC, x: 4.95, y: 0.18, w: 4.75, h: 5.25, sizing: { type: "contain", w: 4.75, h: 5.25 }, }); } // ══════════════════════════════════════════════════════════════════ // SLIDE 9 — 11 AGENTI (dark) // ══════════════════════════════════════════════════════════════════ { const sl = pres.addSlide(); sl.background = { color: C.void }; eyebrow(sl, "NON \u00C8 UN WRAPPER DI CHATGPT", 0.5, 0.2, 9, "center"); sl.addText("Sono 11 agenti AI specializzati che lavorano insieme.", { x: 0.4, y: 0.5, w: 9.2, h: 0.85, fontFace: "Calibri", fontSize: 32, bold: true, color: C.paper, align: "center", margin: 0, }); const agents = [ "Intent Classifier", "Home Agent", "Floating Agent", "Unified Processor", "Cloud Processor", "Brief Agent", "Setup Agent", "Memory Extractor", "Memory Miner", "Memory Auditor", "Embeddings", ]; // Layout: row1=[0..3], row2=[4..7], row3=[8..10] centered const bW = 2.12, bH = 0.48, bGX = 0.17, bGY = 0.18; const rowDefs = [ { items: [0,1,2,3], y: 1.58 }, { items: [4,5,6,7], y: 1.58 + bH + bGY }, { items: [8,9,10], y: 1.58 + 2 * (bH + bGY) }, ]; rowDefs.forEach(({ items, y }) => { const rowW = items.length * bW + (items.length - 1) * bGX; const x0 = (10 - rowW) / 2; items.forEach((idx, ci) => { const bx = x0 + ci * (bW + bGX); sl.addShape(pres.shapes.RECTANGLE, { x: bx, y, w: bW, h: bH, fill: { color: C.graphite }, line: { color: C.golden, width: 1 }, }); sl.addText(agents[idx], { x: bx, y, w: bW, h: bH, fontFace: "Calibri", fontSize: 13, bold: true, color: C.paper, align: "center", valign: "middle", margin: 0, }); }); }); sl.addText("Una tua richiesta \u2192 cinque agenti al lavoro.", { x: 0.5, y: 3.88, w: 9, h: 1.38, fontFace: "Calibri", fontSize: 28, bold: true, color: C.golden, align: "center", }); } // ══════════════════════════════════════════════════════════════════ // SLIDE 10 — PRIVACY + COMPLIANCE (dark) // ══════════════════════════════════════════════════════════════════ { const sl = pres.addSlide(); sl.background = { color: C.void }; sl.addText("I tuoi dati non lasciano il tuo computer.", { x: 0.4, y: 0.28, w: 9.2, h: 1.2, fontFace: "Calibri", fontSize: 42, bold: true, color: C.paper, align: "center", margin: 0, }); sl.addText("Local-first. Non un claim di marketing, un\u2019architettura.", { x: 0.4, y: 1.52, w: 9.2, h: 0.5, fontFace: "Calibri", fontSize: 18, color: C.golden, align: "center", margin: 0, }); const pcCards = [ { icon: "\uD83D\uDD12", title: "Local-first", body: "DB cifrato sul tuo disco.\nNessun server adiuvAI vede i tuoi contenuti." }, { icon: "\uD83C\uDDEA\uD83C\uDDFA", title: "EU AI Act", body: "Conforme by design,\nnon adattato a posteriori." }, { icon: "\uD83D\uDEE1\uFE0F", title: "GDPR", body: "Zero trasferimenti a terzi.\nDPA art. 28 con ogni provider LLM." }, { icon: "\uD83D\uDEAB", title: "No Training", body: "I tuoi dati non addestrano modelli AI.\nZero Data Retention contrattuale." }, ]; const pCW = 4.35, pCH = 1.55, pCGX = 0.25, pCGY = 0.18; const pCPositions = [ { x: 0.4, y: 2.18 }, { x: 0.4 + pCW + pCGX, y: 2.18 }, { x: 0.4, y: 2.18 + pCH + pCGY }, { x: 0.4 + pCW + pCGX, y: 2.18 + pCH + pCGY }, ]; pcCards.forEach((card, i) => { const { x, y } = pCPositions[i]; sl.addShape(pres.shapes.RECTANGLE, { x, y, w: pCW, h: pCH, fill: { color: C.graphite }, line: { color: C.golden, width: 1 }, }); sl.addText(card.icon + " " + card.title, { x: x + 0.18, y: y + 0.12, w: pCW - 0.3, h: 0.45, fontFace: "Calibri", fontSize: 16, bold: true, color: C.golden, margin: 0, }); sl.addText(card.body, { x: x + 0.18, y: y + 0.62, w: pCW - 0.3, h: 0.82, fontFace: "Calibri", fontSize: 13, color: C.paper, margin: 0, }); }); // Footer note sl.addText("Private by design, not by promise.", { x: 0, y: 5.27, w: 10, h: 0.28, fontFace: "Calibri", fontSize: 12, italic: true, color: C.slate, align: "center", margin: 0, }); } // ══════════════════════════════════════════════════════════════════ // SLIDE 11 — POSIZIONAMENTO vs COMPETITOR (light) // ══════════════════════════════════════════════════════════════════ { const sl = pres.addSlide(); sl.background = { color: C.canvas }; eyebrow(sl, "PERCH\u00C9 NON GLI ALTRI", 0.4, 0.2, 6); sl.addText("Motion, Notion AI, Copilot: tutti cloud-first, tutti generalisti.", { x: 0.4, y: 0.5, w: 9.2, h: 0.72, fontFace: "Calibri", fontSize: 26, bold: true, color: C.ink, margin: 0, }); // Build table rows — fresh cell objects per row (no shared references) const hdrOpts = (txt, al = "center") => ({ text: txt, options: { bold: true, fontSize: 13, color: C.void, fill: { color: C.golden }, align: al } }); const dataOpts = (txt, clr = C.ink, al = "left") => ({ text: txt, options: { fontSize: 13, color: clr, fill: { color: C.paper }, align: al } }); const emoOpts = (txt) => ({ text: txt, options: { fontSize: 15, fill: { color: C.paper }, align: "center" } }); const tableData = [ [ hdrOpts("Funzionalit\u00E0", "left"), hdrOpts("adiuvAI"), hdrOpts("Motion"), hdrOpts("Notion AI"), hdrOpts("Copilot") ], [ dataOpts("Locale, dati sul tuo PC"), emoOpts("\u2705"), emoOpts("\u274C"), emoOpts("\u274C"), emoOpts("\u274C") ], [ dataOpts("EU AI Act compliant"), emoOpts("\u2705"), dataOpts("\u2014", C.slate, "center"), dataOpts("\u2014", C.slate, "center"), emoOpts("\u26A0\uFE0F") ], [ dataOpts("Legge email + file + chat"), emoOpts("\u2705"), emoOpts("\u26A0\uFE0F"), emoOpts("\u274C"), emoOpts("\u2705") ], [ dataOpts("Daily Brief proattivo"), emoOpts("\u2705"), emoOpts("\u274C"), emoOpts("\u274C"), emoOpts("\u274C") ], [ dataOpts("AI invisibile (zero prompt)"), emoOpts("\u2705"), emoOpts("\u274C"), emoOpts("\u274C"), emoOpts("\u274C") ], ]; sl.addTable(tableData, { x: 0.4, y: 1.38, w: 9.2, h: 3.45, colW: [3.4, 1.45, 1.45, 1.45, 1.45], border: { pt: 1, color: C.lavender }, fontFace: "Calibri", }); sl.addText("adiuvAI \u00E8 locale, proattiva, pensata per chi lavora con dati propri.", { x: 0.4, y: 5.08, w: 9.2, h: 0.4, fontFace: "Calibri", fontSize: 16, bold: true, color: C.golden, align: "center", margin: 0, }); } // ══════════════════════════════════════════════════════════════════ // SLIDE 12 — CTA / CLOSING (dark) // ══════════════════════════════════════════════════════════════════ { const sl = pres.addSlide(); sl.background = { color: C.void }; eyebrow(sl, "BETA \u00B7 GIUGNO 2026", 0.5, 0.28, 9, "center"); sl.addText("Gli early adopter\nguidano il roadmap.", { x: 0.4, y: 0.65, w: 9.2, h: 2.0, fontFace: "Calibri", fontSize: 46, bold: true, color: C.paper, align: "center", margin: 0, }); sl.addText( "Accesso prioritario, canale diretto con il team,\nvoce in capitolo sulle prossime feature.", { x: 1, y: 2.75, w: 8, h: 0.9, fontFace: "Calibri", fontSize: 17, color: C.slate, align: "center", } ); // CTA button sl.addShape(pres.shapes.RECTANGLE, { x: 3.2, y: 3.78, w: 3.6, h: 0.7, fill: { color: C.golden }, line: { color: C.golden }, }); sl.addText("Iscriviti alla waitlist \u2192", { x: 3.2, y: 3.78, w: 3.6, h: 0.7, fontFace: "Calibri", fontSize: 18, bold: true, color: C.ink, align: "center", valign: "middle", margin: 0, }); sl.addText("adiuvai.com", { x: 0.5, y: 4.62, w: 9, h: 0.55, fontFace: "Calibri", fontSize: 28, bold: true, color: C.paper, align: "center", }); // Logo small bottom-left watermark sl.addImage({ path: LOGO, x: 0.4, y: 4.95, w: 0.55, h: 0.55 }); sl.addText("Roberto Musso \u00B7 roby9115@gmail.com", { x: 1.1, y: 5.12, w: 8.5, h: 0.28, fontFace: "Calibri", fontSize: 11, color: C.slate, align: "left", margin: 0, }); } // ── Write output ──────────────────────────────────────────────────────────── pres.writeFile({ fileName: OUTPUT }) .then(() => console.log("OK deck generated:", OUTPUT)) .catch(err => { console.error("ERROR:", err); process.exit(1); });