Files
workspace/docs/build-deck-geopop.js
2026-04-19 14:49:36 +02:00

625 lines
26 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"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); });