// adiuvAI — Presentazione generica dell'applicazione // Stile: Light canvas (app light mode) const pptxgen = require("pptxgenjs"); const path = require("path"); const ASSETS = "C:/_temp/_adiuvai_workspace/adiuvAI/assets"; const LOGO_ICON = `${ASSETS}/logo/logo-icon.png`; const SHOT_HOME = `${ASSETS}/screenshot/home.png`; const SHOT_PROJECTS = `${ASSETS}/screenshot/projects.png`; const SHOT_TASK = `${ASSETS}/screenshot/task.png`; const SHOT_CHAT = `${ASSETS}/screenshot/home_chat.png`; // Palette light mode (app) const C = { bg: "F4EDF3", // pinkish-white canvas surface: "FFFFFF", // cards surface2: "EDE5EC", // subtle header row gold: "FBC881", // primary accent goldDark: "C79A5B", // darker gold for contrast on light bg ink: "0C0C0C", // near-black ink2: "323232", // body text dark muted: "8A8EA9", // slate blue-gray border: "C8C3CD", // dusty lavender border borderSoft: "E5DFE4", }; const FONT_H = "Calibri"; const FONT_B = "Calibri"; const pres = new pptxgen(); pres.layout = "LAYOUT_WIDE"; // 13.333 x 7.5 pres.author = "adiuvAI"; pres.title = "adiuvAI"; const SW = 13.333; const SH = 7.5; const DARK = { bg: "0C0C0C", surface: "181818", surface2: "222222", text: "FBFBFB", muted: "8A8EA9", border: "2A2A2A" }; function bgLight(slide) { slide.background = { color: C.bg }; } function bgDark(slide) { slide.background = { color: DARK.bg }; } function footer(slide, pageNum, total, dark) { slide.addImage({ path: LOGO_ICON, x: 0.5, y: 0.35, w: 0.35, h: 0.35 }); slide.addText( [ { text: "adiuv", options: { color: dark ? DARK.text : C.ink, fontFace: FONT_H, fontSize: 11 } }, { text: "AI", options: { color: dark ? C.gold : C.goldDark, fontFace: FONT_H, fontSize: 11, bold: true } }, ], { x: 0.9, y: 0.33, w: 2.5, h: 0.4, margin: 0, valign: "middle" } ); slide.addText(`${pageNum} / ${total}`, { x: SW - 1.5, y: 0.33, w: 1.0, h: 0.4, color: dark ? DARK.muted : C.muted, fontFace: FONT_B, fontSize: 10, align: "right", valign: "middle", margin: 0, }); } function slideTitle(slide, eyebrow, title, dark) { if (eyebrow) { slide.addText(eyebrow.toUpperCase(), { x: 0.8, y: 1.05, w: 10, h: 0.35, color: dark ? C.gold : C.goldDark, fontFace: FONT_H, fontSize: 11, bold: true, charSpacing: 6, margin: 0, }); } slide.addText(title, { x: 0.8, y: 1.4, w: 11.5, h: 1.0, color: dark ? DARK.text : C.ink, fontFace: FONT_H, fontSize: 36, bold: true, margin: 0, }); } function goldDot(slide, x, y) { slide.addShape(pres.shapes.OVAL, { x, y, w: 0.12, h: 0.12, fill: { color: C.gold }, line: { color: C.gold }, }); } const TOTAL = 9; let page = 0; // ============================================================ // 1 — COVER // ============================================================ { page++; const s = pres.addSlide(); bgLight(s); s.addImage({ path: LOGO_ICON, x: 1.1, y: 2.4, w: 2.6, h: 2.6 }); s.addText( [ { text: "adiuv", options: { color: C.ink, fontFace: FONT_H, fontSize: 72 } }, { text: "AI", options: { color: C.goldDark, fontFace: FONT_H, fontSize: 72, bold: true } }, ], { x: 4.0, y: 2.7, w: 7.5, h: 1.3, margin: 0, valign: "middle" } ); s.addShape(pres.shapes.RECTANGLE, { x: 4.1, y: 4.05, w: 0.6, h: 0.04, fill: { color: C.gold }, line: { color: C.gold }, }); s.addText("Meet your new chief of staff.", { x: 4.0, y: 4.15, w: 8.5, h: 0.6, color: C.ink, fontFace: FONT_H, fontSize: 24, italic: true, margin: 0, }); s.addText("Una segretaria AI che legge la tua posta, organizza il tuo lavoro, e ogni mattina ti dice cosa conta — tutto sul tuo computer.", { x: 4.0, y: 4.85, w: 8.5, h: 1.4, color: C.ink2, fontFace: FONT_B, fontSize: 16, margin: 0, }); } // ============================================================ // 2 — L'IDEA: UNA SEGRETARIA // ============================================================ { page++; const s = pres.addSlide(); bgLight(s); footer(s, page, TOTAL); slideTitle(s, "L'idea", "Non un altro tool. Una segretaria."); s.addText( [ { text: "Gli strumenti di produttività si aspettano che tu li usi.\n", options: { color: C.muted, fontSize: 18 } }, { text: "adiuvAI lavora per te.", options: { color: C.ink, fontSize: 26, bold: true } }, ], { x: 0.8, y: 2.8, w: 11.8, h: 1.5, fontFace: FONT_H, margin: 0 } ); // Metafora: cosa fa una segretaria reale const duties = [ { t: "Legge la tua posta", d: "Filtra, prioritizza, segnala solo ciò che richiede la tua attenzione." }, { t: "Tiene in ordine l'agenda", d: "Scadenze, impegni, follow-up — tutto tracciato senza chiederti nulla." }, { t: "Prepara il briefing", d: "Ogni mattina arriva con un piano chiaro: ecco cosa conta oggi." }, { t: "Ti aiuta a eseguire", d: "Prepara bozze, organizza documenti, ti accompagna mentre lavori." }, ]; const cardW = 5.85, gap = 0.2; duties.forEach((d, i) => { const col = i % 2, row = Math.floor(i / 2); const x = 0.8 + col * (cardW + gap); const y = 4.45 + row * 1.35; s.addShape(pres.shapes.RECTANGLE, { x, y, w: cardW, h: 1.2, fill: { color: C.surface }, line: { color: C.borderSoft, width: 0.75 }, }); s.addShape(pres.shapes.RECTANGLE, { x, y, w: 0.08, h: 1.2, fill: { color: C.gold }, line: { color: C.gold }, }); s.addText(d.t, { x: x + 0.3, y: y + 0.15, w: cardW - 0.4, h: 0.4, color: C.ink, fontFace: FONT_H, fontSize: 16, bold: true, margin: 0, }); s.addText(d.d, { x: x + 0.3, y: y + 0.55, w: cardW - 0.4, h: 0.65, color: C.ink2, fontFace: FONT_B, fontSize: 12, margin: 0, }); }); } // ============================================================ // 3 — DAILY BRIEF + CAROUSEL (hero feature) // ============================================================ { page++; const s = pres.addSlide(); bgDark(s); footer(s, page, TOTAL, true); slideTitle(s, "Il cuore dell'esperienza", "Il briefing del mattino, poi ti prende per mano.", true); // Left: screenshot home (mostra il daily brief) s.addImage({ path: SHOT_HOME, x: 0.8, y: 2.8, w: 6.4, h: 3.6 }); s.addShape(pres.shapes.RECTANGLE, { x: 0.8, y: 2.8, w: 6.4, h: 3.6, fill: { type: "solid", color: DARK.bg, transparency: 100 }, line: { color: DARK.border, width: 1 }, }); s.addText("Daily Brief", { x: 0.8, y: 6.5, w: 6.4, h: 0.35, color: DARK.muted, fontFace: FONT_H, fontSize: 11, bold: true, align: "center", charSpacing: 4, margin: 0, }); // Right: caption + carousel feature s.addText("Ogni mattina, un briefing personalizzato ti racconta cosa è cambiato, cosa scade e cosa conta di più.", { x: 7.5, y: 2.75, w: 5.2, h: 1.4, color: DARK.text, fontFace: FONT_H, fontSize: 16, margin: 0, }); // Carousel card (feature) s.addShape(pres.shapes.RECTANGLE, { x: 7.5, y: 4.25, w: 5.2, h: 2.6, fill: { color: DARK.surface }, line: { color: DARK.border, width: 0.75 }, }); s.addShape(pres.shapes.RECTANGLE, { x: 7.5, y: 4.25, w: 0.08, h: 2.6, fill: { color: C.gold }, line: { color: C.gold }, }); s.addText("CAROSELLO DELLE ATTIVITÀ", { x: 7.75, y: 4.4, w: 5, h: 0.4, color: C.gold, fontFace: FONT_H, fontSize: 10, bold: true, charSpacing: 4, margin: 0, }); s.addText( [ { text: "Dalla home, avvii il carosello: ", options: { color: DARK.text, bold: true, breakLine: true } }, { text: "ogni scheda è un'attività che l'AI ritiene prioritaria per la giornata. Ti guida passo passo con le indicazioni per completarla, e puoi chattare con lei mentre lavori — come se avessi la tua segretaria al fianco.", options: { color: DARK.muted } }, ], { x: 7.75, y: 4.8, w: 5, h: 1.95, fontFace: FONT_B, fontSize: 13, margin: 0 } ); } // ============================================================ // 4 — CHAT CONTESTUALE // ============================================================ { page++; const s = pres.addSlide(); bgDark(s); footer(s, page, TOTAL, true); slideTitle(s, "Chat", "Parla con la tua segretaria. In italiano, in linguaggio naturale.", true); // left: examples const examples = [ "« Qual è la prossima attività su cui concentrarmi? »", "« Riassumi le email arrivate stamattina. »", "« Crea un'attività: richiamare Luca giovedì. »", "« Cosa è cambiato sul progetto Patient Portal? »", ]; examples.forEach((e, i) => { const y = 2.8 + i * 0.65; s.addShape(pres.shapes.RECTANGLE, { x: 0.8, y, w: 5.6, h: 0.55, fill: { color: DARK.surface }, line: { color: DARK.border, width: 0.75 }, }); s.addShape(pres.shapes.RECTANGLE, { x: 0.8, y, w: 0.06, h: 0.55, fill: { color: C.gold }, line: { color: C.gold }, }); s.addText(e, { x: 1.0, y, w: 5.3, h: 0.55, color: DARK.text, fontFace: FONT_B, fontSize: 12, italic: true, valign: "middle", margin: 0, }); }); s.addText("Niente prompt engineering. Niente modelli da scegliere. L'AI giusta lavora in background e ti risponde con il contesto del tuo workspace.", { x: 0.8, y: 5.65, w: 5.6, h: 1.0, color: DARK.muted, fontFace: FONT_B, fontSize: 13, margin: 0, }); // right: screenshot s.addImage({ path: SHOT_CHAT, x: 6.8, y: 2.6, w: 6.0, h: 3.375 }); s.addShape(pres.shapes.RECTANGLE, { x: 6.8, y: 2.6, w: 6.0, h: 3.375, fill: { type: "solid", color: DARK.bg, transparency: 100 }, line: { color: DARK.border, width: 1 }, }); s.addText("Chat contestuale sul workspace", { x: 6.8, y: 6.05, w: 6.0, h: 0.35, color: DARK.muted, fontFace: FONT_H, fontSize: 11, bold: true, align: "center", charSpacing: 4, margin: 0, }); } // ============================================================ // 5 — FUNZIONALITÀ (compattate) // ============================================================ { page++; const s = pres.addSlide(); bgLight(s); footer(s, page, TOTAL); slideTitle(s, "Cosa fa", "Tutto il lavoro quotidiano, in un unico posto."); const items = [ { t: "Email → Attività", d: "Legge Gmail, Outlook, cartelle locali ed estrae automaticamente task, promemoria e note." }, { t: "Progetti e clienti", d: "Timeline, milestone, riepiloghi AI per ogni progetto. Tutto collegato." }, { t: "Note con ricerca semantica", d: "Editor markdown e ricerca vettoriale su tutto ciò che scrivi." }, { t: "Timeline e milestone", d: "Panoramica visiva delle scadenze e degli stati di avanzamento." }, { t: "Agenti locali", d: "Sorveglianza file, monitor cartelle, integrazione Telegram." }, { t: "Voce in riunione", d: "Prende note durante le call, estrae action item.", soon: true }, ]; const cardW = 3.95, gap = 0.2; const cols = 3; items.forEach((it, i) => { const col = i % cols, row = Math.floor(i / cols); const x = 0.8 + col * (cardW + gap); const y = 2.8 + row * 1.9; s.addShape(pres.shapes.RECTANGLE, { x, y, w: cardW, h: 1.7, fill: { color: C.surface }, line: { color: C.borderSoft, width: 0.75 }, }); if (it.soon) { s.addShape(pres.shapes.RECTANGLE, { x: x + cardW - 1.1, y: y + 0.18, w: 0.95, h: 0.3, fill: { color: C.bg }, line: { color: C.gold, width: 0.75 }, }); s.addText("COMING SOON", { x: x + cardW - 1.1, y: y + 0.18, w: 0.95, h: 0.3, color: C.goldDark, fontFace: FONT_H, fontSize: 8, bold: true, align: "center", valign: "middle", charSpacing: 2, margin: 0, }); } goldDot(s, x + 0.25, y + 0.3); s.addText(it.t, { x: x + 0.5, y: y + 0.2, w: cardW - 1.5, h: 0.4, color: C.ink, fontFace: FONT_H, fontSize: 15, bold: true, margin: 0, }); s.addText(it.d, { x: x + 0.25, y: y + 0.7, w: cardW - 0.5, h: 0.95, color: C.ink2, fontFace: FONT_B, fontSize: 11.5, margin: 0, }); }); } // ============================================================ // 5 — RISERVATEZZA // ============================================================ { page++; const s = pres.addSlide(); bgLight(s); footer(s, page, TOTAL); slideTitle(s, "Riservatezza", "I tuoi dati non lasciano il tuo computer."); s.addText("Local-first.", { x: 0.8, y: 2.8, w: 6, h: 0.9, color: C.goldDark, fontFace: FONT_H, fontSize: 48, bold: true, margin: 0, }); s.addText("Tutto gira in locale. Il database è sul tuo disco, cifrato. Nessun server adiuvAI vede i contenuti di email, file o documenti.", { x: 0.8, y: 3.9, w: 6, h: 2.0, color: C.ink2, fontFace: FONT_B, fontSize: 15, margin: 0, }); const comp = [ { t: "GDPR", d: "I dati non vengono mai trasferiti a terzi. Conformità per architettura." }, { t: "EU AI Act", d: "Progettato dall'inizio per il nuovo quadro normativo europeo." }, { t: "Cifratura end-to-end", d: "Backup e sincronizzazione opzionali con cifratura client-side." }, { t: "No training", d: "I tuoi dati non vengono mai usati per addestrare modelli AI." }, ]; comp.forEach((c, i) => { const col = i % 2, row = Math.floor(i / 2); const x = 7.2 + col * 2.95; const y = 2.8 + row * 1.85; s.addShape(pres.shapes.RECTANGLE, { x, y, w: 2.85, h: 1.65, fill: { color: C.surface }, line: { color: C.borderSoft, width: 0.75 }, }); s.addShape(pres.shapes.RECTANGLE, { x, y, w: 2.85, h: 0.05, fill: { color: C.gold }, line: { color: C.gold }, }); s.addText(c.t, { x: x + 0.2, y: y + 0.15, w: 2.6, h: 0.4, color: C.goldDark, fontFace: FONT_H, fontSize: 15, bold: true, margin: 0, }); s.addText(c.d, { x: x + 0.2, y: y + 0.6, w: 2.6, h: 1.0, color: C.ink2, fontFace: FONT_B, fontSize: 11, margin: 0, }); }); } // ============================================================ // 6 — POSIZIONAMENTO // ============================================================ { page++; const s = pres.addSlide(); bgLight(s); footer(s, page, TOTAL); slideTitle(s, "Posizionamento", "Perché non Motion, Notion AI o Microsoft Copilot?"); const rows = [ ["", "adiuvAI", "Motion", "Notion AI", "Copilot"], ["Locale, dati sul tuo PC", "Sì", "No", "No", "No"], ["Conforme EU AI Act", "Sì", "n/d", "n/d", "Parziale"], ["Legge email + file + chat", "Sì", "Parziale", "No", "Sì"], ["Daily Brief proattivo", "Sì", "No", "No", "No"], ["AI invisibile (zero prompt)", "Sì", "No", "No", "No"], ]; const tableData = rows.map((r, ri) => r.map((cell, ci) => { if (ri === 0) { return { text: cell, options: { bold: true, color: ci === 1 ? C.goldDark : C.ink, fill: { color: C.surface2 }, align: "center", fontFace: FONT_H, fontSize: 13, valign: "middle", }, }; } if (ci === 0) { return { text: cell, options: { fontFace: FONT_B, fontSize: 12, color: C.ink, bold: true, fill: { color: C.surface }, valign: "middle", }, }; } const isYes = cell === "Sì"; return { text: cell, options: { fontFace: FONT_B, fontSize: 12, align: "center", valign: "middle", color: ci === 1 ? (isYes ? C.goldDark : C.muted) : (isYes ? C.ink : C.muted), bold: ci === 1, fill: { color: ci === 1 ? C.surface2 : C.surface }, }, }; }) ); s.addTable(tableData, { x: 0.8, y: 2.8, w: 11.7, colW: [4.5, 1.8, 1.8, 1.8, 1.8], rowH: 0.55, border: { pt: 1, color: C.borderSoft }, fontFace: FONT_B, }); s.addText("Gli altri sono cloud-first generalisti. adiuvAI è locale, proattivo, pensato per chi lavora con dati propri.", { x: 0.8, y: 6.55, w: 12.0, h: 0.5, color: C.goldDark, fontFace: FONT_B, fontSize: 13, italic: true, margin: 0, }); } // ============================================================ // 7 — ROADMAP // ============================================================ { page++; const s = pres.addSlide(); bgLight(s); footer(s, page, TOTAL); slideTitle(s, "Roadmap", "Dove siamo, dove stiamo andando."); const tlY = 4.2; s.addShape(pres.shapes.RECTANGLE, { x: 1.2, y: tlY, w: 11.0, h: 0.04, fill: { color: C.border }, line: { color: C.border }, }); const milestones = [ { x: 1.6, label: "Oggi — Beta privata", items: ["Daily Brief", "Carosello attività", "Email → Task", "Progetti & Note"] }, { x: 5.6, label: "Giugno 2026 — Beta pubblica", items: ["Telegram bot", "Outlook / Teams", "App mobile companion"] }, { x: 9.6, label: "Oltre", items: ["Assistente vocale in riunione", "Workspace di team", "SSO e ruoli"] }, ]; milestones.forEach((m) => { s.addShape(pres.shapes.OVAL, { x: m.x - 0.12, y: tlY - 0.1, w: 0.25, h: 0.25, fill: { color: C.gold }, line: { color: C.goldDark, width: 1 }, }); s.addText(m.label, { x: m.x - 0.2, y: tlY - 0.9, w: 4.2, h: 0.5, color: C.goldDark, fontFace: FONT_H, fontSize: 13, bold: true, margin: 0, }); s.addText( m.items.map((it, idx) => ({ text: it, options: { bullet: { code: "25A0" }, color: C.ink2, breakLine: idx < m.items.length - 1, paraSpaceAfter: 4 }, })), { x: m.x - 0.2, y: tlY + 0.3, w: 4.0, h: 2.5, fontFace: FONT_B, fontSize: 12, margin: 0 } ); }); } // ============================================================ // 8 — CLOSING // ============================================================ { page++; const s = pres.addSlide(); bgLight(s); s.addImage({ path: LOGO_ICON, x: (SW - 1.5) / 2, y: 1.5, w: 1.5, h: 1.5 }); s.addText("Meet your new chief of staff.", { x: 1.0, y: 3.3, w: SW - 2, h: 0.9, color: C.ink, fontFace: FONT_H, fontSize: 32, bold: true, italic: true, align: "center", margin: 0, }); s.addShape(pres.shapes.RECTANGLE, { x: (SW - 0.6) / 2, y: 4.25, w: 0.6, h: 0.04, fill: { color: C.gold }, line: { color: C.gold }, }); s.addText("Beta in arrivo a Giugno 2026. Gli early adopter otterranno accesso prioritario e potranno guidare il roadmap.", { x: 1.5, y: 4.45, w: SW - 3, h: 1.4, color: C.ink2, fontFace: FONT_B, fontSize: 16, align: "center", margin: 0, }); s.addShape(pres.shapes.RECTANGLE, { x: (SW - 7) / 2, y: 6.0, w: 7, h: 1.1, fill: { color: C.surface }, line: { color: C.gold, width: 1.5 }, }); s.addText( [ { text: "Iscriviti alla waitlist · ", options: { color: C.ink, bold: true } }, { text: "adiuvai.com", options: { color: C.goldDark, bold: true } }, ], { x: (SW - 7) / 2, y: 6.0, w: 7, h: 1.1, fontFace: FONT_H, fontSize: 20, align: "center", valign: "middle", margin: 0 } ); } // ============================================================ const OUT = path.resolve("C:/_temp/_adiuvai_workspace/docs/adiuvAI.pptx"); pres.writeFile({ fileName: OUT }).then((f) => console.log("WROTE:", f));