625 lines
26 KiB
JavaScript
625 lines
26 KiB
JavaScript
"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); });
|