diff --git a/package.json b/package.json index 3098ee2..3f53111 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "brand:export": "pnpm --filter @era/web brand:export" }, "devDependencies": { + "pptxgenjs": "^4.0.1", "turbo": "^2.5.8", "typescript": "^5.9.2" } diff --git a/pitch/README.md b/pitch/README.md new file mode 100644 index 0000000..53896e1 --- /dev/null +++ b/pitch/README.md @@ -0,0 +1,32 @@ +# pitch + +Honest English pitch deck for the BNB Chain Smart Money Era submission. + +## Files + +| File | Purpose | +|------|---------| +| [`pulse-pitch.pptx`](./pulse-pitch.pptx) | 8-slide deck aligned to what `main` ships today | +| [`build-deck.mjs`](./build-deck.mjs) | Regenerates the `.pptx` | + +## Claims this deck makes + +- Public demo + catalog API URLs +- Four equal categories with real seed agent names +- ERC-8004 registrations / Worker endpoints for the four seed agents +- Hire **UI** on BSC testnet (chain 97) via ERC-8183 +- Venus health-factor reader with fixture fallback +- Explicitly **does not** claim a public Funded hire receipt (blocked on `$U` faucet at submit time) + +## Regenerate + +From the repo root (Node 22+, `pptxgenjs` is a root devDependency): + +```bash +pnpm install +node pitch/build-deck.mjs +``` + +## Brand + +Dark field `#0B0E11`, accent `#F0B90B`, paper `#FFFFFF`. Wording: “Building on BNB Chain” — never Official / Partnering. diff --git a/pitch/build-deck.mjs b/pitch/build-deck.mjs new file mode 100644 index 0000000..ab53f56 --- /dev/null +++ b/pitch/build-deck.mjs @@ -0,0 +1,325 @@ +/** + * Generate the honest Day-D pitch deck from facts on main. + * Run: node pitch/build-deck.mjs + */ +import pptxgen from "pptxgenjs"; +import { mkdirSync } from "node:fs"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const outFile = join(__dirname, "pulse-pitch.pptx"); + +const INK = "0B0E11"; +const INK2 = "141820"; +const LINE = "2A2F36"; +const PAPER = "FFFFFF"; +const MUTED = "A7ADB5"; +const ACCENT = "F0B90B"; + +const pres = new pptxgen(); +pres.layout = "LAYOUT_16x9"; +pres.author = "Zer0-Knowledge-Hack"; +pres.title = "pulse — Smart Money Era pitch"; +pres.subject = "Honest marketplace pitch aligned to main"; + +function bg(slide) { + slide.addShape(pres.shapes.RECTANGLE, { + x: 0, y: 0, w: 10, h: 5.625, + fill: { color: INK }, line: { color: INK }, + }); +} + +function footer(slide, page, total = 8) { + slide.addText("Building on BNB Chain", { + x: 0.5, y: 5.25, w: 5, h: 0.25, + fontSize: 10, fontFace: "Arial", color: MUTED, margin: 0, + }); + slide.addText(`${page} / ${total}`, { + x: 8.5, y: 5.25, w: 1, h: 0.25, + fontSize: 10, fontFace: "Arial", color: MUTED, align: "right", margin: 0, + }); +} + +function accentBar(slide) { + slide.addShape(pres.shapes.RECTANGLE, { + x: 0, y: 0, w: 0.12, h: 5.625, + fill: { color: ACCENT }, line: { color: ACCENT }, + }); +} + +// 1 — Title +{ + const s = pres.addSlide(); + bg(s); + accentBar(s); + s.addText("pulse", { + x: 0.6, y: 1.5, w: 8.5, h: 0.9, + fontSize: 54, fontFace: "Arial", bold: true, color: ACCENT, margin: 0, + }); + s.addText("The marketplace where DeFi agents get hired.", { + x: 0.6, y: 2.45, w: 8.5, h: 0.45, + fontSize: 22, fontFace: "Arial", color: PAPER, margin: 0, + }); + s.addText("Discover → Compare → Hire", { + x: 0.6, y: 3.1, w: 8.5, h: 0.35, + fontSize: 16, fontFace: "Arial", color: MUTED, margin: 0, + }); + s.addText("Building on BNB Chain · Smart Money Era", { + x: 0.6, y: 4.5, w: 8.5, h: 0.3, + fontSize: 12, fontFace: "Arial", color: MUTED, margin: 0, + }); + footer(s, 1); +} + +// 2 — Problem +{ + const s = pres.addSlide(); + bg(s); + accentBar(s); + s.addText("Agents exist. Conversion doesn’t.", { + x: 0.6, y: 0.4, w: 8.8, h: 0.55, + fontSize: 28, fontFace: "Arial", bold: true, color: PAPER, margin: 0, + }); + s.addText("Registries show identity. A marketplace must help you choose and activate.", { + x: 0.6, y: 1.05, w: 8.8, h: 0.4, + fontSize: 14, fontFace: "Arial", color: MUTED, margin: 0, + }); + + const left = [ + { t: "ERC-8004 registries", d: "Owner, metadata, endpoints, capability claims" }, + { t: "What they don’t do", d: "Compare jobs, show live signals, or fund work" }, + ]; + const right = [ + { t: "pulse", d: "Find by DeFi job → compare numbers → hire on-chain" }, + { t: "Not an explorer", d: "Featured agents carry the demo; no 200k-agent dump" }, + ]; + left.forEach((item, i) => { + const y = 1.7 + i * 1.35; + s.addShape(pres.shapes.ROUNDED_RECTANGLE, { + x: 0.6, y, w: 4.2, h: 1.15, + fill: { color: INK2 }, line: { color: LINE }, rectRadius: 0.08, + }); + s.addText(item.t, { x: 0.8, y: y + 0.2, w: 3.8, h: 0.35, fontSize: 16, bold: true, color: ACCENT, margin: 0 }); + s.addText(item.d, { x: 0.8, y: y + 0.55, w: 3.8, h: 0.4, fontSize: 13, color: PAPER, margin: 0 }); + }); + right.forEach((item, i) => { + const y = 1.7 + i * 1.35; + s.addShape(pres.shapes.ROUNDED_RECTANGLE, { + x: 5.1, y, w: 4.3, h: 1.15, + fill: { color: INK2 }, line: { color: LINE }, rectRadius: 0.08, + }); + s.addText(item.t, { x: 5.3, y: y + 0.2, w: 3.9, h: 0.35, fontSize: 16, bold: true, color: ACCENT, margin: 0 }); + s.addText(item.d, { x: 5.3, y: y + 0.55, w: 3.9, h: 0.4, fontSize: 13, color: PAPER, margin: 0 }); + }); + footer(s, 2); +} + +// 3 — What ships on main +{ + const s = pres.addSlide(); + bg(s); + accentBar(s); + s.addText("What is live on main today", { + x: 0.6, y: 0.4, w: 8.8, h: 0.5, + fontSize: 28, fontFace: "Arial", bold: true, color: PAPER, margin: 0, + }); + s.addText("Public demo of the conversion loop — no invented TVL, no fake hire receipts.", { + x: 0.6, y: 0.95, w: 8.8, h: 0.35, + fontSize: 13, fontFace: "Arial", color: MUTED, margin: 0, + }); + + const items = [ + ["Web", "Vite + React marketplace at pulse-94i.pages.dev"], + ["Catalog", "Four categories × two featured agents; seed agents use real ERC-8004 ids"], + ["Signals", "Health-factor reader on Venus BSC testnet (fixture fallback if RPC fails)"], + ["Hire UI", "RainbowKit + ERC-8183 path on BSC testnet (chain 97), budget capped at 0.001 $U"], + ["Agents", "hfwatch / rangekeeper / yieldrouter / gridrunner on Workers + registered on chain 97"], + ["API", "Hono catalog Worker: pulse-api…workers.dev"], + ]; + items.forEach((row, i) => { + const y = 1.45 + i * 0.52; + s.addText(row[0], { x: 0.6, y, w: 1.5, h: 0.4, fontSize: 13, bold: true, color: ACCENT, margin: 0 }); + s.addText(row[1], { x: 2.2, y, w: 7.2, h: 0.4, fontSize: 13, color: PAPER, margin: 0 }); + }); + footer(s, 3); +} + +// 4 — Four categories +{ + const s = pres.addSlide(); + bg(s); + accentBar(s); + s.addText("Four categories. Equal depth.", { + x: 0.6, y: 0.35, w: 8.8, h: 0.45, + fontSize: 26, fontFace: "Arial", bold: true, color: PAPER, margin: 0, + }); + const cats = [ + { n: "01", t: "Health factor", a: "HF Watch", m: "Health factor · Liq. price · Venus" }, + { n: "02", t: "Rebalancing", a: "Range Keeper", m: "In-range % · Fees · IL" }, + { n: "03", t: "Yield", a: "Yield Router", m: "Net APR · Venue · Allocation" }, + { n: "04", t: "Grid trading", a: "Grid Runner", m: "Fill rate · Realized PnL · Window" }, + ]; + cats.forEach((c, i) => { + const x = 0.5 + (i % 2) * 4.7; + const y = 1.05 + Math.floor(i / 2) * 1.9; + s.addShape(pres.shapes.ROUNDED_RECTANGLE, { + x, y, w: 4.4, h: 1.7, + fill: { color: INK2 }, line: { color: LINE }, rectRadius: 0.08, + }); + s.addText(c.n, { x: x + 0.25, y: y + 0.2, w: 1, h: 0.3, fontSize: 12, color: ACCENT, margin: 0 }); + s.addText(c.t, { x: x + 0.25, y: y + 0.5, w: 3.9, h: 0.35, fontSize: 18, bold: true, color: PAPER, margin: 0 }); + s.addText(c.a, { x: x + 0.25, y: y + 0.9, w: 3.9, h: 0.28, fontSize: 13, color: ACCENT, margin: 0 }); + s.addText(c.m, { x: x + 0.25, y: y + 1.2, w: 3.9, h: 0.28, fontSize: 12, color: MUTED, margin: 0 }); + }); + footer(s, 4); +} + +// 5 — Signals honesty +{ + const s = pres.addSlide(); + bg(s); + accentBar(s); + s.addText("Compare on signals — with provenance.", { + x: 0.6, y: 0.4, w: 8.8, h: 0.5, + fontSize: 26, fontFace: "Arial", bold: true, color: PAPER, margin: 0, + }); + s.addText("Cards and detail pages render category metrics. Labels stay honest.", { + x: 0.6, y: 0.95, w: 8.8, h: 0.35, + fontSize: 13, fontFace: "Arial", color: MUTED, margin: 0, + }); + + const tags = [ + { k: "LIVE", d: "On-chain read (Venus HF for hf-watch when RPC succeeds)" }, + { k: "FIXTURE", d: "Catalog numbers for non-HF metrics / fallback path" }, + { k: "TESTNET", d: "BSC testnet (chain 97) for agents, hire UI, and demo position" }, + ]; + tags.forEach((tag, i) => { + const y = 1.5 + i * 0.95; + s.addShape(pres.shapes.ROUNDED_RECTANGLE, { + x: 0.6, y, w: 8.8, h: 0.8, + fill: { color: INK2 }, line: { color: LINE }, rectRadius: 0.08, + }); + s.addShape(pres.shapes.ROUNDED_RECTANGLE, { + x: 0.85, y: y + 0.2, w: 1.5, h: 0.4, + fill: { color: ACCENT }, line: { color: ACCENT }, rectRadius: 0.06, + }); + s.addText(tag.k, { + x: 0.85, y: y + 0.2, w: 1.5, h: 0.4, + fontSize: 12, bold: true, color: INK, align: "center", valign: "middle", margin: 0, + }); + s.addText(tag.d, { + x: 2.6, y: y + 0.22, w: 6.5, h: 0.4, + fontSize: 14, color: PAPER, valign: "middle", margin: 0, + }); + }); + footer(s, 5); +} + +// 6 — Hire path (honest) +{ + const s = pres.addSlide(); + bg(s); + accentBar(s); + s.addText("Hire through ERC-8183", { + x: 0.6, y: 0.35, w: 8.8, h: 0.45, + fontSize: 26, fontFace: "Arial", bold: true, color: PAPER, margin: 0, + }); + s.addText("Buyer wallet funds escrow in $U. Marketplace never takes custody.", { + x: 0.6, y: 0.85, w: 8.8, h: 0.3, + fontSize: 13, fontFace: "Arial", color: MUTED, margin: 0, + }); + + const steps = ["Connect", "Create job", "Budget", "Approve $U", "Fund", "Funded"]; + steps.forEach((step, i) => { + const x = 0.5 + i * 1.55; + s.addShape(pres.shapes.ROUNDED_RECTANGLE, { + x, y: 1.4, w: 1.4, h: 0.7, + fill: { color: INK2 }, line: { color: i === 0 || i === 1 ? ACCENT : LINE }, rectRadius: 0.06, + }); + s.addText(step, { + x, y: 1.4, w: 1.4, h: 0.7, + fontSize: 11, bold: true, color: PAPER, align: "center", valign: "middle", margin: 0, + }); + }); + + s.addShape(pres.shapes.ROUNDED_RECTANGLE, { + x: 0.6, y: 2.4, w: 8.8, h: 2.3, + fill: { color: INK2 }, line: { color: LINE }, rectRadius: 0.08, + }); + s.addText("Shipped on main", { + x: 0.85, y: 2.6, w: 8.3, h: 0.3, + fontSize: 14, bold: true, color: ACCENT, margin: 0, + }); + s.addText([ + { text: "Hire panel on BSC Testnet (chain 97) against canonical AgenticCommerce", options: { bullet: true, breakLine: true } }, + { text: "Real provider wallets for seed agents (e.g. HF Watch 0x6d07…fCad)", options: { bullet: true, breakLine: true } }, + { text: "Local mock hire still available when VITE_CHAIN=local", options: { bullet: true, breakLine: true } }, + { text: "Public Funded receipt: pending $U faucet / teammate transfer (not claimed as done)", options: { bullet: true } }, + ], { + x: 0.85, y: 3.0, w: 8.3, h: 1.5, + fontSize: 13, fontFace: "Arial", color: PAPER, margin: 0, + }); + footer(s, 6); +} + +// 7 — Stack +{ + const s = pres.addSlide(); + bg(s); + accentBar(s); + s.addText("Built for real execution", { + x: 0.6, y: 0.4, w: 8.8, h: 0.45, + fontSize: 26, fontFace: "Arial", bold: true, color: PAPER, margin: 0, + }); + const cols = [ + { t: "Web", d: "Vite · React · TanStack Router · wagmi / RainbowKit" }, + { t: "API", d: "Hono on Cloudflare Workers · fixture catalog" }, + { t: "Commerce", d: "ERC-8183 · $U · create → fund path" }, + { t: "Agents", d: "BNB Agent Studio · ERC-8004 · A2A / MCP Workers" }, + { t: "Signals", d: "Venus testnet HF reader · provenance labels" }, + { t: "Evidence", d: "Submission package · TermiX outline (task 1 DIY)" }, + ]; + cols.forEach((c, i) => { + const x = 0.5 + (i % 3) * 3.1; + const y = 1.15 + Math.floor(i / 3) * 1.7; + s.addShape(pres.shapes.ROUNDED_RECTANGLE, { + x, y, w: 2.95, h: 1.45, + fill: { color: INK2 }, line: { color: LINE }, rectRadius: 0.08, + }); + s.addText(c.t, { x: x + 0.2, y: y + 0.25, w: 2.55, h: 0.35, fontSize: 16, bold: true, color: ACCENT, margin: 0 }); + s.addText(c.d, { x: x + 0.2, y: y + 0.7, w: 2.55, h: 0.55, fontSize: 12, color: PAPER, margin: 0 }); + }); + footer(s, 7); +} + +// 8 — Close +{ + const s = pres.addSlide(); + bg(s); + accentBar(s); + s.addText("pulse", { + x: 0.6, y: 1.2, w: 8.8, h: 0.7, + fontSize: 42, fontFace: "Arial", bold: true, color: ACCENT, margin: 0, + }); + s.addText("Agents already exist.\nNow they have somewhere to get hired.", { + x: 0.6, y: 2.0, w: 8.8, h: 0.9, + fontSize: 22, fontFace: "Arial", color: PAPER, margin: 0, + }); + s.addText([ + { text: "Demo ", options: { bold: true, color: ACCENT } }, + { text: "https://pulse-94i.pages.dev/", options: { breakLine: true, color: PAPER } }, + { text: "API ", options: { bold: true, color: ACCENT } }, + { text: "https://pulse-api.juliocesarsevericheorellana.workers.dev/", options: { breakLine: true, color: PAPER } }, + { text: "Repo ", options: { bold: true, color: ACCENT } }, + { text: "https://github.com/Zer0-Knowledge-Hack/pulse", options: { color: PAPER } }, + ], { + x: 0.6, y: 3.2, w: 8.8, h: 1.3, + fontSize: 13, fontFace: "Arial", margin: 0, + }); + footer(s, 8); +} + +mkdirSync(__dirname, { recursive: true }); +await pres.writeFile({ fileName: outFile }); +console.log(`Wrote ${outFile}`); diff --git a/pitch/pulse-pitch.pptx b/pitch/pulse-pitch.pptx new file mode 100644 index 0000000..721ecb2 Binary files /dev/null and b/pitch/pulse-pitch.pptx differ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4386abf..82ea7ae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: devDependencies: + pptxgenjs: + specifier: ^4.0.1 + version: 4.0.1 turbo: specifier: ^2.5.8 version: 2.10.12 @@ -2991,6 +2994,9 @@ packages: html-entities@2.6.0: resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + https@1.0.0: + resolution: {integrity: sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -3010,6 +3016,14 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + image-size@1.2.1: + resolution: {integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==} + engines: {node: '>=16.x'} + hasBin: true + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -3134,6 +3148,9 @@ packages: engines: {node: '>=6'} hasBin: true + jszip@3.10.2: + resolution: {integrity: sha512-3l+rb15IOWtUhU0H5MFqES/T6Kh7abYwjosBey/vD6hDt8zoEffkSC5Ws5SGtgVw3gBx2NEbhTeSW1+kWkpyTQ==} + keccak@3.0.4: resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} engines: {node: '>=10.0.0'} @@ -3153,6 +3170,9 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -3451,6 +3471,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -3594,6 +3617,9 @@ packages: resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} engines: {node: ^10 || ^12 || >=14} + pptxgenjs@4.0.1: + resolution: {integrity: sha512-TeJISr8wouAuXw4C1F/mC33xbZs/FuEG6nH9FG1Zj+nuPcGMP5YRHl6X+j3HSUnS1f3at6k75ZZXPMZlA5Lj9A==} + preact@10.24.2: resolution: {integrity: sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==} @@ -3643,6 +3669,9 @@ packages: resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} engines: {node: '>=6'} + queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} @@ -3789,6 +3818,9 @@ packages: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + sha.js@2.4.12: resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} engines: {node: '>= 0.10'} @@ -8159,6 +8191,8 @@ snapshots: html-entities@2.6.0: {} + https@1.0.0: {} + human-signals@2.1.0: {} icss-utils@5.1.0(postcss@8.5.28): @@ -8171,6 +8205,12 @@ snapshots: ieee754@1.2.1: {} + image-size@1.2.1: + dependencies: + queue: 6.0.2 + + immediate@3.0.6: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -8271,6 +8311,13 @@ snapshots: json5@2.2.3: {} + jszip@3.10.2: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + keccak@3.0.4: dependencies: node-addon-api: 2.0.2 @@ -8285,6 +8332,10 @@ snapshots: kleur@4.1.5: {} + lie@3.3.0: + dependencies: + immediate: 3.0.6 + lightningcss-android-arm64@1.32.0: optional: true @@ -8606,6 +8657,8 @@ snapshots: p-try@2.2.0: {} + pako@1.0.11: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -8726,6 +8779,13 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + pptxgenjs@4.0.1: + dependencies: + '@types/node': 22.20.1 + https: 1.0.0 + image-size: 1.2.1 + jszip: 3.10.2 + preact@10.24.2: {} preact@10.29.8: {} @@ -8766,6 +8826,10 @@ snapshots: split-on-first: 1.1.0 strict-uri-encode: 2.0.0 + queue@6.0.2: + dependencies: + inherits: 2.0.4 + quick-format-unescaped@4.0.4: {} radix3@1.1.2: {} @@ -8925,6 +8989,8 @@ snapshots: gopd: 1.2.0 has-property-descriptors: 1.0.2 + setimmediate@1.0.5: {} + sha.js@2.4.12: dependencies: inherits: 2.0.4