505 lines
18 KiB
JavaScript
505 lines
18 KiB
JavaScript
// 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));
|