{"id":"82366966-f225-428e-9b6f-0bc861b7c3f1","entityType":"agent","slug":"clawhub-fusuvae-art-yilian-ppt-generator","name":"Pptx Generator","canonicalUrl":"https://www.xpersona.co/agent/clawhub-fusuvae-art-yilian-ppt-generator","canonicalPath":"/agent/clawhub-fusuvae-art-yilian-ppt-generator","generatedAt":"2026-10-11T14:17:08.110Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T11:17:39.427Z","emptyReason":null},"description":"Generate, edit, and read PowerPoint presentations. Create from scratch with PptxGenJS (cover, TOC, content, section divider, summary slides), edit existing P... Skill: Pptx Generator Owner: fusuvae-art Summary: Generate, edit, and read PowerPoint presentations. Create from scratch with PptxGenJS (cover, TOC, content, section divider, summary slides), edit existing P... Tags: latest:1.0.0 Version history: v1.0.0 | 2026-04-16T02:33:57.763Z | auto - Initial release of the pptx-generator skill. - Supports generating, editing, and reading PowerPoint presentations. - Create presen","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s177p4nftvzk3q6s7n3rygf6ad83p9cr:yilian-ppt-generator","sourceUrl":"https://clawhub.ai/fusuvae-art/yilian-ppt-generator","homepage":"https://clawhub.ai/fusuvae-art/skills/yilian-ppt-generator","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/fusuvae-art/yilian-ppt-generator","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/fusuvae-art/skills/yilian-ppt-generator","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Generate, edit, and read PowerPoint presentations. Create from scratch with PptxGenJS (cover, TOC, content, section divider, summary slides), edit existing P..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:17:39.427Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:17:39.427Z","emptyReason":null},"stars":null,"forks":null,"downloads":1079,"packageName":null,"latestVersion":"1.0.0","tractionLabel":"1.1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:17:39.341Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T11:17:39.427Z","lastCrawledAt":"2026-10-11T11:17:39.341Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T11:17:39.341Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.0","createdAt":"2026-04-16T02:33:57.763Z","changelog":"- Initial release of the pptx-generator skill. - Supports generating, editing, and reading PowerPoint presentations. - Create presentations from scratch using PptxGenJS, or edit existing PPTX files via XML workflows. - Includes a complete design system with color palettes, font references, and style recipes. - Provides triggers and workflows for text extraction, template-based editing, and creating new presentations. - Detailed documentation and guidance included for slide types, design standards, and quality assurance.","fileCount":8,"zipByteSize":26512}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s177p4nftvzk3q6s7n3rygf6ad83p9cr:yilian-ppt-generator","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fusuvae-art-yilian-ppt-generator/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fusuvae-art-yilian-ppt-generator/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fusuvae-art-yilian-ppt-generator/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-fusuvae-art-yilian-ppt-generator/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-fusuvae-art-yilian-ppt-generator/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-fusuvae-art-yilian-ppt-generator/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T14:17:08.108Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fusuvae-art-yilian-ppt-generator/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fusuvae-art-yilian-ppt-generator/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fusuvae-art-yilian-ppt-generator/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fusuvae-art-yilian-ppt-generator/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T11:17:39.427Z","emptyReason":null},"readme":"Skill: Pptx Generator\n\nOwner: fusuvae-art\n\nSummary: Generate, edit, and read PowerPoint presentations. Create from scratch with PptxGenJS (cover, TOC, content, section divider, summary slides), edit existing P...\n\nTags: latest:1.0.0\n\nVersion history:\n\nv1.0.0 | 2026-04-16T02:33:57.763Z | auto\n\n- Initial release of the pptx-generator skill.\n- Supports generating, editing, and reading PowerPoint presentations.\n- Create presentations from scratch using PptxGenJS, or edit existing PPTX files via XML workflows.\n- Includes a complete design system with color palettes, font references, and style recipes.\n- Provides triggers and workflows for text extraction, template-based editing, and creating new presentations.\n- Detailed documentation and guidance included for slide types, design standards, and quality assurance.\n\nArchive index:\n\nArchive v1.0.0: 8 files, 26512 bytes\n\nFiles: _meta.json (139b), references/design-system.md (16160b), references/editing.md (6557b), references/pitfalls.md (3849b), references/pptxgenjs.md (12752b), references/slide-types.md (15790b), skill-card.md (2641b), SKILL.md (7932b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: pptx-generator\ndescription: \"Generate, edit, and read PowerPoint presentations. Create from scratch with PptxGenJS (cover, TOC, content, section divider, summary slides), edit existing PPTX via XML workflows, or extract text with markitdown. Triggers: PPT, PPTX, PowerPoint, presentation, slide, deck, slides.\"\nlicense: MIT\nmetadata:\n  version: \"1.0.0\"\n  category: productivity\n  sources:\n    - https://gitbrent.github.io/PptxGenJS/\n    - https://github.com/microsoft/markitdown\n---\n\n# PPTX Generator & Editor\n\n## Overview\n\nThis skill handles all PowerPoint tasks: reading/analyzing existing presentations, editing template-based decks via XML manipulation, and creating presentations from scratch using PptxGenJS. It includes a complete design system (color palettes, fonts, style recipes) and detailed guidance for every slide type.\n\n## Quick Reference\n\n| Task | Approach |\n|------|----------|\n| Read/analyze content | `python -m markitdown presentation.pptx` |\n| Edit or create from template | See [Editing Presentations](references/editing.md) |\n| Create from scratch | See [Creating from Scratch](#creating-from-scratch-workflow) below |\n\n| Item | Value |\n|------|-------|\n| **Dimensions** | 10\" x 5.625\" (LAYOUT_16x9) |\n| **Colors** | 6-char hex without # (e.g., `\"FF0000\"`) |\n| **English font** | Arial (default), or approved alternatives |\n| **Chinese font** | Microsoft YaHei |\n| **Page badge position** | x: 9.3\", y: 5.1\" |\n| **Theme keys** | `primary`, `secondary`, `accent`, `light`, `bg` |\n| **Shapes** | RECTANGLE, OVAL, LINE, ROUNDED_RECTANGLE |\n| **Charts** | BAR, LINE, PIE, DOUGHNUT, SCATTER, BUBBLE, RADAR |\n\n## Reference Files\n\n| File | Contents |\n|------|----------|\n| [slide-types.md](references/slide-types.md) | 5 slide page types (Cover, TOC, Section Divider, Content, Summary) + additional layout patterns |\n| [design-system.md](references/design-system.md) | Color palettes, font reference, style recipes (Sharp/Soft/Rounded/Pill), typography & spacing |\n| [editing.md](references/editing.md) | Template-based editing workflow, XML manipulation, formatting rules, common pitfalls |\n| [pitfalls.md](references/pitfalls.md) | QA process, common mistakes, critical PptxGenJS pitfalls |\n| [pptxgenjs.md](references/pptxgenjs.md) | Complete PptxGenJS API reference |\n\n---\n\n## Reading Content\n\n```bash\n# Text extraction\npython -m markitdown presentation.pptx\n```\n\n---\n\n## Creating from Scratch — Workflow\n\n**Use when no template or reference presentation is available.**\n\n### Step 1: Research & Requirements\n\nSearch to understand user requirements — topic, audience, purpose, tone, content depth.\n\n### Step 2: Select Color Palette & Fonts\n\nUse the [Color Palette Reference](references/design-system.md#color-palette-reference) to select a palette matching the topic and audience. Use the [Font Reference](references/design-system.md#font-reference) to choose a font pairing.\n\n### Step 3: Select Design Style\n\nUse the [Style Recipes](references/design-system.md#style-recipes) to choose a visual style (Sharp, Soft, Rounded, or Pill) matching the presentation tone.\n\n### Step 4: Plan Slide Outline\n\nClassify **every slide** as exactly one of the [5 page types](references/slide-types.md). Plan the content and layout for each slide. Ensure visual variety — do NOT repeat the same layout across slides.\n\n### Step 5: Generate Slide JS Files\n\nCreate one JS file per slide in `slides/` directory. Each file must export a synchronous `createSlide(pres, theme)` function. Follow the [Slide Output Format](#slide-output-format) and the type-specific guidance in [slide-types.md](references/slide-types.md). Generate up to 5 slides concurrently using subagents if available.\n\n**Tell each subagent:**\n1. File naming: `slides/slide-01.js`, `slides/slide-02.js`, etc.\n2. Images go in: `slides/imgs/`\n3. Final PPTX goes in: `slides/output/`\n4. Dimensions: 10\" x 5.625\" (LAYOUT_16x9)\n5. Fonts: Chinese = Microsoft YaHei, English = Arial (or approved alternative)\n6. Colors: 6-char hex without # (e.g. `\"FF0000\"`)\n7. Must use the theme object contract (see [Theme Object Contract](#theme-object-contract))\n8. Must follow the [PptxGenJS API reference](references/pptxgenjs.md)\n\n### Step 6: Compile into Final PPTX\n\nCreate `slides/compile.js` to combine all slide modules:\n\n```javascript\n// slides/compile.js\nconst pptxgen = require('pptxgenjs');\nconst pres = new pptxgen();\npres.layout = 'LAYOUT_16x9';\n\nconst theme = {\n  primary: \"22223b\",    // dark color for backgrounds/text\n  secondary: \"4a4e69\",  // secondary accent\n  accent: \"9a8c98\",     // highlight color\n  light: \"c9ada7\",      // light accent\n  bg: \"f2e9e4\"          // background color\n};\n\nfor (let i = 1; i <= 12; i++) {  // adjust count as needed\n  const num = String(i).padStart(2, '0');\n  const slideModule = require(`./slide-${num}.js`);\n  slideModule.createSlide(pres, theme);\n}\n\npres.writeFile({ fileName: './output/presentation.pptx' });\n```\n\nRun with: `cd slides && node compile.js`\n\n### Step 7: QA (Required)\n\nSee [QA Process](references/pitfalls.md#qa-process).\n\n### Output Structure\n\n```\nslides/\n├── slide-01.js          # Slide modules\n├── slide-02.js\n├── ...\n├── imgs/                # Images used in slides\n└── output/              # Final artifacts\n    └── presentation.pptx\n```\n\n---\n\n## Slide Output Format\n\nEach slide is a **complete, runnable JS file**:\n\n```javascript\n// slide-01.js\nconst pptxgen = require(\"pptxgenjs\");\n\nconst slideConfig = {\n  type: 'cover',\n  index: 1,\n  title: 'Presentation Title'\n};\n\n// MUST be synchronous (not async)\nfunction createSlide(pres, theme) {\n  const slide = pres.addSlide();\n  slide.background = { color: theme.bg };\n\n  slide.addText(slideConfig.title, {\n    x: 0.5, y: 2, w: 9, h: 1.2,\n    fontSize: 48, fontFace: \"Arial\",\n    color: theme.primary, bold: true, align: \"center\"\n  });\n\n  return slide;\n}\n\n// Standalone preview - use slide-specific filename\nif (require.main === module) {\n  const pres = new pptxgen();\n  pres.layout = 'LAYOUT_16x9';\n  const theme = {\n    primary: \"22223b\",\n    secondary: \"4a4e69\",\n    accent: \"9a8c98\",\n    light: \"c9ada7\",\n    bg: \"f2e9e4\"\n  };\n  createSlide(pres, theme);\n  pres.writeFile({ fileName: \"slide-01-preview.pptx\" });\n}\n\nmodule.exports = { createSlide, slideConfig };\n```\n\n---\n\n## Theme Object Contract (MANDATORY)\n\nThe compile script passes a theme object with these **exact keys**:\n\n| Key | Purpose | Example |\n|-----|---------|---------|\n| `theme.primary` | Darkest color, titles | `\"22223b\"` |\n| `theme.secondary` | Dark accent, body text | `\"4a4e69\"` |\n| `theme.accent` | Mid-tone accent | `\"9a8c98\"` |\n| `theme.light` | Light accent | `\"c9ada7\"` |\n| `theme.bg` | Background color | `\"f2e9e4\"` |\n\n**NEVER use other key names** like `background`, `text`, `muted`, `darkest`, `lightest`.\n\n---\n\n## Page Number Badge (REQUIRED)\n\nAll slides **except Cover Page** MUST include a page number badge in the bottom-right corner.\n\n- **Position**: x: 9.3\", y: 5.1\"\n- Show current number only (e.g. `3` or `03`), NOT \"3/12\"\n- Use palette colors, keep subtle\n\n### Circle Badge (Default)\n\n```javascript\nslide.addShape(pres.shapes.OVAL, {\n  x: 9.3, y: 5.1, w: 0.4, h: 0.4,\n  fill: { color: theme.accent }\n});\nslide.addText(\"3\", {\n  x: 9.3, y: 5.1, w: 0.4, h: 0.4,\n  fontSize: 12, fontFace: \"Arial\",\n  color: \"FFFFFF\", bold: true,\n  align: \"center\", valign: \"middle\"\n});\n```\n\n### Pill Badge\n\n```javascript\nslide.addShape(pres.shapes.ROUNDED_RECTANGLE, {\n  x: 9.1, y: 5.15, w: 0.6, h: 0.35,\n  fill: { color: theme.accent },\n  rectRadius: 0.15\n});\nslide.addText(\"03\", {\n  x: 9.1, y: 5.15, w: 0.6, h: 0.35,\n  fontSize: 11, fontFace: \"Arial\",\n  color: \"FFFFFF\", bold: true,\n  align: \"center\", valign: \"middle\"\n});\n```\n\n---\n\n## Dependencies\n\n- `pip install \"markitdown[pptx]\"` — text extraction\n- `npm install -g pptxgenjs` — creating from scratch\n- `npm install -g react-icons react react-dom sharp` — icons (optional)\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7fk6twcw733nbszvhn1enayh83qrvw\",\n  \"slug\": \"yilian-ppt-generator\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1776306837763\n}\n\nFile v1.0.0:references/design-system.md\n\n# Design System\n\n## Color Palette Reference\n\n| # | Name | Colors | Style | Use Cases | Tips |\n|---|------|--------|-------|-----------|------|\n| 1 | Modern & Wellness | `#006d77` `#83c5be` `#edf6f9` `#ffddd2` `#e29578` | Fresh, soothing | Healthcare, counseling, skincare, yoga/spa | Deep teal for titles, light pink for background |\n| 2 | Business & Authority | `#2b2d42` `#8d99ae` `#edf2f4` `#ef233c` `#d90429` | Formal, classic | Annual reports, financial analysis, corporate intro, government | Deep blue for professionalism, bright red to highlight data |\n| 3 | Nature & Outdoors | `#606c38` `#283618` `#fefae0` `#dda15e` `#bc6c25` | Grounded, earthy | Outdoor gear, environmental, agriculture, historical culture | Dark green base, cream text |\n| 4 | Vintage & Academic | `#780000` `#c1121f` `#fdf0d5` `#003049` `#669bbc` | Classic, scholarly | Academic lectures, history reviews, museums, heritage brands | Strong contrast between deep red and deep blue |\n| 5 | Soft & Creative | `#cdb4db` `#ffc8dd` `#ffafcc` `#bde0fe` `#a2d2ff` | Dreamy, candy-toned | Mother & baby, desserts, women's fashion, kindergarten | Use dark gray or black for text |\n| 6 | Bohemian | `#ccd5ae` `#e9edc9` `#fefae0` `#faedcd` `#d4a373` | Gentle, muted | Wedding planning, home decor, organic food, slow living | Cream background, green-brown accents |\n| 7 | Vibrant & Tech | `#8ecae6` `#219ebc` `#023047` `#ffb703` `#fb8500` | High energy, sporty | Sports events, gyms, startup pitches, youth education | Deep blue for stability, orange as focal accent |\n| 8 | Craft & Artisan | `#7f5539` `#a68a64` `#ede0d4` `#656d4a` `#414833` | Rustic, coffee-toned | Coffee shops, handicrafts, traditional culture, bakery | Suited for paper/leather textures |\n| 9 | Tech & Night | `#000814` `#001d3d` `#003566` `#ffc300` `#ffd60a` | Deep, luminous | Tech launches, astronomy, night economy, luxury automobiles | Must use dark mode |\n| 10 | Education & Charts | `#264653` `#2a9d8f` `#e9c46a` `#f4a261` `#e76f51` | Clear, logical | Statistical reports, education, market analysis, general business | Perfect chart color scheme |\n| 11 | Forest & Eco | `#dad7cd` `#a3b18a` `#588157` `#3a5a40` `#344e41` | Monochrome gradient, forest | Landscape design, ESG reports, environmental causes, botanical | Monochrome palette is safe and cohesive |\n| 12 | Elegant & Fashion | `#edafb8` `#f7e1d7` `#dedbd2` `#b0c4b1` `#4a5759` | Muted, Morandi tones | Haute couture, art galleries, beauty brands, magazine style | Negative space is key |\n| 13 | Art & Food | `#335c67` `#fff3b0` `#e09f3e` `#9e2a2b` `#540b0e` | Rich, vintage-poster | Food documentaries, art exhibitions, ethnic themes, vintage restaurants | Works well with large color blocks |\n| 14 | Luxury & Mysterious | `#22223b` `#4a4e69` `#9a8c98` `#c9ada7` `#f2e9e4` | Cool, purple-toned | Jewelry showcases, hotel management, high-end consulting, psychology | Purple evokes premium atmosphere |\n| 15 | Pure Tech Blue | `#03045e` `#0077b6` `#00b4d8` `#90e0ef` `#caf0f8` | Futuristic, clean | Cloud/AI, water/ocean, hospitals, clean energy | Deep ocean to sky gradient |\n| 16 | Coastal Coral | `#0081a7` `#00afb9` `#fdfcdc` `#fed9b7` `#f07167` | Refreshing, summery | Travel, summer events, beverage brands, ocean themes | Teal and coral as complementary focal colors |\n| 17 | Vibrant Orange Mint | `#ff9f1c` `#ffbf69` `#ffffff` `#cbf3f0` `#2ec4b6` | Bright, cheerful | Children's events, promotional posters, FMCG, social media | Orange grabs attention, mint feels fresh |\n| 18 | Platinum White Gold | `#0a0a0a` `#0070F3` `#D4AF37` `#f5f5f5` `#ffffff` | Premium, professional | Agent products, corporate websites, fintech, luxury brands | White-gold base, blue for action, gold for emphasis |\n\n---\n\n### Agency Design System — Full Color Scale\n\nBased on the Platinum White-Gold Theme design tokens. Provides complete color scales for fine-grained design work.\n\n#### White Scale (Backgrounds & Light Surfaces)\n\n| Token | Value | Usage |\n|-------|-------|-------|\n| white-0 | `#ffffff` | Primary background |\n| white-50 | `#fefefe` | Slightly warm white |\n| white-75 | `#fcfcfc` | Near-white |\n| white-100 | `#fafafa` | Secondary background |\n| white-200 | `#f7f7f7` | Card background |\n| white-300 | `#f5f5f5` | Tertiary background |\n| white-400 | `#f0f0f0` | Separator zones |\n| white-500 | `#ebebeb` | Light border |\n| white-600 | `#e5e5e5` | Disabled background |\n| white-700 | `#e0e0e0` | Deep white-gray |\n| white-800 | `#d9d9d9` | Placeholder |\n| white-900 | `#d4d4d4` | Divider lines |\n| white-1000 | `#cccccc` | Deepest white |\n\n#### Gold Scale (Platinum Business Accent)\n\n| Token | Value | Usage |\n|-------|-------|-------|\n| gold-25 | `#FFFDF5` | Extremely light gold background |\n| gold-50 | `#FEF9E7` | Light gold background |\n| gold-75 | `#FCF3D0` | Pale gold highlight |\n| gold-100 | `#FAECB8` | Gold hover state |\n| gold-200 | `#F5DC8A` | Bright gold accent |\n| gold-300 | `#E8C860` | Gold hover |\n| gold-400 | `#D4AF37` | **Primary gold (core)** |\n| gold-500 | `#B8972E` | Gold text |\n| gold-600 | `#9A7E26` | Deep gold accent |\n| gold-700 | `#7C651E` | Dark gold border |\n| gold-800 | `#5E4C16` | Deep gold background |\n| gold-900 | `#40330F` | Very deep gold |\n| gold-1000 | `#221A08` | Black gold |\n\n#### Blue Scale (Primary Action Color)\n\n| Token | Value | Usage |\n|-------|-------|-------|\n| blue-25 | `#F0F7FF` | Extremely light blue background |\n| blue-50 | `#E0EFFF` | Info alert background |\n| blue-75 | `#C2DFFF` | Light blue highlight |\n| blue-100 | `#A3CFFF` | Disabled blue |\n| blue-200 | `#66AFFF` | Bright blue |\n| blue-300 | `#338FFF` | Blue hover |\n| blue-400 | `#0070F3` | **Primary blue (core)** |\n| blue-500 | `#005FCC` | Blue text |\n| blue-600 | `#004FA6` | Deep blue accent |\n| blue-700 | `#003F80` | Dark blue border |\n| blue-800 | `#002F5A` | Deep blue background |\n| blue-900 | `#001F3D` | Very deep blue |\n| blue-1000 | `#001026` | Black blue |\n\n#### Gray Scale (Text & Neutral Colors)\n\n| Token | Value | Usage |\n|-------|-------|-------|\n| gray-0 | `#ffffff` | White |\n| gray-50 | `#fafafa` | Extremely light gray |\n| gray-75 | `#f5f5f5` | Light gray background |\n| gray-100 | `#ededed` | Light divider |\n| gray-200 | `#d4d4d4` | Light border |\n| gray-300 | `#a3a3a3` | Quaternary text |\n| gray-400 | `#737373` | Tertiary text |\n| gray-500 | `#525252` | Secondary text |\n| gray-600 | `#404040` | Dark gray |\n| gray-700 | `#2e2e2e` | Dark background |\n| gray-800 | `#1f1f1f` | Deep background |\n| gray-900 | `#141414` | Very deep background |\n| gray-1000 | `#0a0a0a` | **Primary text (core)** |\n\n#### Opacity Values\n\n##### Opacity Black\n\n| Opacity | Value | Usage |\n|---------|-------|-------|\n| 0% | `#0a0a0a00` | Fully transparent |\n| 2% | `#0a0a0a05` | Subtle overlay |\n| 4% | `#0a0a0a0a` | Secondary interactive background |\n| 8% | `#0a0a0a14` | Border / divider |\n| 15% | `#0a0a0a26` | Pressed state |\n| 20% | `#0a0a0a33` | Light overlay |\n| 25% | `#0a0a0a40` | Medium overlay |\n| 50% | `#0a0a0a80` | Semi-transparent |\n| 70% | `#0a0a0ab2` | Deep overlay |\n| 80% | `#0a0a0acc` | Hover state |\n| 90% | `#0a0a0ae5` | Tooltip |\n| 95% | `#0a0a0af2` | Modal |\n\n##### Opacity White\n\n| Opacity | Value | Usage |\n|---------|-------|-------|\n| 0% | `#ffffff00` | Fully transparent |\n| 2% | `#ffffff05` | Subtle overlay |\n| 4% | `#ffffff0a` | Secondary interactive background |\n| 8% | `#ffffff12` | Border / divider |\n| 15% | `#ffffff26` | Pressed state |\n| 20% | `#ffffff33` | Light overlay |\n| 25% | `#ffffff40` | Medium overlay |\n| 50% | `#ffffff80` | Semi-transparent |\n| 70% | `#ffffffb2` | Deep overlay |\n| 80% | `#ffffffcc` | Hover state |\n| 90% | `#ffffffe5` | Tooltip |\n| 95% | `#fffffff2` | Modal |\n\n---\n\n## Color Palette Rules (MANDATORY)\n\n### Strict Palette Adherence\n\n**Use ONLY the provided color palette. Do NOT create or modify colors.**\n\n- All colors must come from the user-provided palette\n- Do NOT use colors outside the palette\n- Do NOT modify palette colors (brightness, saturation, mixing)\n- **Only exception**: Add transparency using the `transparency` property (0-100)\n\n```javascript\n// Correct: Using palette colors\nslide.addShape(pres.shapes.RECTANGLE, { fill: { color: theme.primary } });\nslide.addText(\"Title\", { color: theme.accent });\n\n// Wrong: Colors outside palette\nslide.addShape(pres.shapes.RECTANGLE, { fill: { color: \"1a1a2e\" } });\n```\n\n### No Gradients\n\n**Gradients are prohibited. Use solid colors only.**\n\n### No Animations\n\n**Animations and transitions are prohibited.** All slides must be static.\n\n---\n\n## Font Reference\n\n### Recommended Fonts\n\n| Language | Default Font | Alternatives |\n|----------|-------------|--------------|\n| **Chinese** | Microsoft YaHei | — |\n| **English** | Arial | Georgia, Calibri, Cambria, Trebuchet MS |\n\n- For mixed Chinese-English content: use Microsoft YaHei for Chinese, the chosen font for English\n- Prefer system fonts for cross-platform compatibility\n- Titles and body text can use different font pairings (e.g. Georgia + Calibri)\n\n### Recommended Font Pairings\n\n| Header Font | Body Font |\n|-------------|-----------|\n| Georgia | Calibri |\n| Arial Black | Arial |\n| Calibri | Calibri Light |\n| Cambria | Calibri |\n| Trebuchet MS | Calibri |\n| Impact | Arial |\n| Palatino | Garamond |\n| Consolas | Calibri |\n\n**Choose an interesting font pairing** — don't default to Arial for everything. Pick a header font with personality and pair it with a clean body font.\n\n### No Bold for Body Text\n\n**Plain body text and caption/legend text must NOT use bold.**\n\n- Body paragraphs, descriptions → normal weight\n- Captions, legends, footnotes → normal weight\n- Reserve bold for titles and headings only\n\n```javascript\n// Correct\nslide.addText(\"Main Title\", { bold: true, fontSize: 36, fontFace: \"Arial\" });\nslide.addText(\"Body text here.\", { bold: false, fontSize: 14, fontFace: \"Arial\" });\n\n// Wrong\nslide.addText(\"Body text here.\", { bold: true, fontSize: 14 });\n```\n\n---\n\n## Style Recipes\n\nThe same design can be rendered in 4 distinct visual styles by adjusting corner radius (`rectRadius`) and spacing. Choose the style recipe that fits the presentation tone.\n\n> **Unit note**: PptxGenJS uses inches. Slide dimensions are 10\" x 5.625\" (LAYOUT_16x9).\n\n### Style Overview\n\n| Style | Corner Radius | Spacing | Best For |\n|-------|--------------|---------|----------|\n| **Sharp & Compact** | 0 ~ 0.05\" | Tight | Data-dense, tables, professional reports |\n| **Soft & Balanced** | 0.08\" ~ 0.12\" | Moderate | Corporate, business presentations, general use |\n| **Rounded & Spacious** | 0.15\" ~ 0.25\" | Relaxed | Product intros, marketing, creative showcases |\n| **Pill & Airy** | 0.3\" ~ 0.5\" | Open | Brand showcases, launch events, premium presentations |\n\n### Sharp & Compact\n\n**Visual character**: Geometric, high information density, formal and serious.\n\n| Category | Value (inches) | Notes |\n|----------|---------------|-------|\n| Corner radius — small | 0\" | Full right angle |\n| Corner radius — medium | 0.03\" | Micro-rounded |\n| Corner radius — large | 0.05\" | Slight rounding |\n| Element padding | 0.1\" ~ 0.15\" | Compact |\n| Element gap | 0.1\" ~ 0.2\" | Compact |\n| Page margin | 0.3\" | Narrow |\n| Block gap | 0.25\" ~ 0.35\" | Compact |\n\n### Soft & Balanced\n\n**Visual character**: Moderate rounding, comfortable whitespace, professional yet approachable.\n\n| Category | Value (inches) | Notes |\n|----------|---------------|-------|\n| Corner radius — small | 0.05\" | Slight rounding |\n| Corner radius — medium | 0.08\" | Medium rounding |\n| Corner radius — large | 0.12\" | Larger rounding |\n| Element padding | 0.15\" ~ 0.2\" | Moderate |\n| Element gap | 0.15\" ~ 0.25\" | Moderate |\n| Page margin | 0.4\" | Standard |\n| Block gap | 0.35\" ~ 0.5\" | Moderate |\n\n### Rounded & Spacious\n\n**Visual character**: Large corners, generous whitespace, friendly and modern.\n\n| Category | Value (inches) | Notes |\n|----------|---------------|-------|\n| Corner radius — small | 0.1\" | Medium rounding |\n| Corner radius — medium | 0.15\" | Large rounding |\n| Corner radius — large | 0.25\" | Very large rounding |\n| Element padding | 0.2\" ~ 0.3\" | Relaxed |\n| Element gap | 0.25\" ~ 0.4\" | Relaxed |\n| Page margin | 0.5\" | Wide |\n| Block gap | 0.5\" ~ 0.7\" | Relaxed |\n\n### Pill & Airy\n\n**Visual character**: Full pill-shaped corners, abundant whitespace, light and open feel, strong brand presence.\n\n| Category | Value (inches) | Notes |\n|----------|---------------|-------|\n| Corner radius — small | 0.2\" | Large rounding |\n| Corner radius — medium | 0.3\" | Pill shape |\n| Corner radius — large | 0.5\" | Full pill |\n| Element padding | 0.25\" ~ 0.4\" | Open |\n| Element gap | 0.3\" ~ 0.5\" | Open |\n| Page margin | 0.6\" | Wide |\n| Block gap | 0.6\" ~ 0.9\" | Open |\n\n### Component Style Mapping\n\n| Component | Sharp | Soft | Rounded | Pill |\n|-----------|-------|------|---------|------|\n| **Button / Tag** | rectRadius: 0 | rectRadius: 0.05 | rectRadius: 0.1 | rectRadius: 0.2 |\n| **Card / Container** | rectRadius: 0.03 | rectRadius: 0.1 | rectRadius: 0.2 | rectRadius: 0.3 |\n| **Image Container** | rectRadius: 0 | rectRadius: 0.08 | rectRadius: 0.15 | rectRadius: 0.25 |\n| **Input Field** | rectRadius: 0 | rectRadius: 0.05 | rectRadius: 0.1 | rectRadius: 0.2 |\n| **Badge** | rectRadius: 0.02 | rectRadius: 0.05 | rectRadius: 0.08 | rectRadius: 0.15 |\n| **Avatar Frame** | rectRadius: 0 | rectRadius: 0.1 | rectRadius: 0.2 | rectRadius: 0.5 (circle) |\n\n#### PptxGenJS Corner Radius Examples\n\n```javascript\n// Sharp style card\nslide.addShape(\"rect\", {\n  x: 0.5, y: 1, w: 4, h: 2.5,\n  fill: { color: \"F5F5F5\" },\n  rectRadius: 0.03\n});\n\n// Rounded style card\nslide.addShape(\"rect\", {\n  x: 0.5, y: 1, w: 4, h: 2.5,\n  fill: { color: \"F5F5F5\" },\n  rectRadius: 0.2\n});\n\n// Pill style button (height 0.4\", rectRadius 0.2\" = perfect pill)\nslide.addShape(\"rect\", {\n  x: 3, y: 4, w: 2, h: 0.4,\n  fill: { color: \"4A90D9\" },\n  rectRadius: 0.2\n});\n```\n\n### Mixing Rules\n\n#### 1. Outer container corner >= inner element corner\n\n```javascript\n// Correct: outer > inner\ncard:   rectRadius: 0.2\nbutton: rectRadius: 0.1\n\n// Wrong: inner > outer → visual overflow effect\ncard:   rectRadius: 0.1\nbutton: rectRadius: 0.2\n```\n\n#### 2. Information density drives spacing\n\n| Zone Type | Recommended Style |\n|-----------|------------------|\n| Data display zone | Sharp / Soft (compact spacing) |\n| Content browsing zone | Rounded / Pill (relaxed spacing) |\n| Title zone | Soft / Rounded (moderate spacing) |\n\n#### 3. Corner radius vs element height\n\n| Element Height | Sharp | Soft | Rounded | Pill |\n|---------------|-------|------|---------|------|\n| Small (< 0.3\") | 0\" | 0.03\" | 0.08\" | height/2 |\n| Medium (0.3\" ~ 0.6\") | 0.02\" | 0.05\" | 0.12\" | height/2 |\n| Large (0.6\" ~ 1.2\") | 0.03\" | 0.08\" | 0.2\" | 0.3\" |\n| Extra large (> 1.2\") | 0.05\" | 0.12\" | 0.25\" | 0.4\" |\n\n> **Pill tip**: For a perfect pill shape, set `rectRadius = element height / 2`\n\n### Typography Scale (PPT)\n\n| Usage | Size (pt) | Notes |\n|-------|-----------|-------|\n| Annotations / Sources | 10 ~ 12 | Minimum readable size |\n| Body / Description | 14 ~ 16 | Standard body |\n| Subtitle | 18 ~ 22 | Secondary heading |\n| Title | 28 ~ 36 | Page title |\n| Large Title | 44 ~ 60 | Cover / section title |\n| Data Callout | 60 ~ 96 | Key number display |\n\n### Spacing Scale (PPT)\n\nBased on 10\" x 5.625\" slide dimensions:\n\n| Usage | Recommended (inches) |\n|-------|---------------------|\n| Icon-to-text gap | 0.08\" ~ 0.15\" |\n| List item spacing | 0.15\" ~ 0.25\" |\n| Card inner padding | 0.2\" ~ 0.4\" |\n| Element group gap | 0.3\" ~ 0.5\" |\n| Page safe margin | 0.4\" ~ 0.6\" |\n| Major block gap | 0.5\" ~ 0.8\" |\n\n### Quick Selection Guide\n\n| Presentation Type | Recommended Style | Reason |\n|------------------|------------------|--------|\n| Finance / Data reports | Sharp & Compact | High density, serious and precise |\n| Corporate / Business | Soft & Balanced | Balances professionalism and approachability |\n| Product intro / Marketing | Rounded & Spacious | Modern feel, friendly |\n| Launch events / Brand | Pill & Airy | Premium feel, visual impact |\n| Training / Education | Soft / Rounded | Clear, readable, friendly |\n| Tech sharing | Sharp / Soft | Professional, information-dense |\n\nFile v1.0.0:references/editing.md\n\n# Editing Existing Presentations\n\n## Template-Based Workflow\n\nWhen using an existing presentation as a template:\n\n1. **Copy and analyze**:\n   ```bash\n   cp /path/to/user-provided.pptx template.pptx\n   python -m markitdown template.pptx > template.md\n   ```\n   Review `template.md` to see placeholder text and slide structure.\n\n2. **Plan slide mapping**: For each content section, choose a template slide.\n\n   **USE VARIED LAYOUTS** — monotonous presentations are a common failure mode. Don't default to basic title + bullet slides. Actively seek out:\n   - Multi-column layouts (2-column, 3-column)\n   - Image + text combinations\n   - Full-bleed images with text overlay\n   - Quote or callout slides\n   - Section dividers\n   - Stat/number callouts\n   - Icon grids or icon + text rows\n\n   **Avoid:** Repeating the same text-heavy layout for every slide.\n\n   Match content type to layout style (e.g., key points -> bullet slide, team info -> multi-column, testimonials -> quote slide).\n\n3. **Unpack**: Extract the PPTX into an editable XML tree using Python's `zipfile` module. Pretty-print the XML for readability.\n\n4. **Build presentation** (do this yourself, not with subagents):\n   - Delete unwanted slides (remove from `<p:sldIdLst>`)\n   - Duplicate slides you want to reuse (copy slide XML, relationships, and update `Content_Types.xml` and `presentation.xml`)\n   - Reorder slides in `<p:sldIdLst>`\n   - **Complete all structural changes before step 5**\n\n5. **Edit content**: Update text in each `slide{N}.xml`.\n   **Use subagents here if available** — slides are separate XML files, so subagents can edit in parallel.\n\n6. **Clean**: Remove orphaned files — slides not in `<p:sldIdLst>`, unreferenced media, orphaned rels.\n\n7. **Pack**: Repack the XML tree into a PPTX file. Validate, repair, condense XML, re-encode smart quotes.\n\n   Always write to `/tmp/` first, then copy to the final path. Python's `zipfile` module uses `seek` internally, which fails on some volume mounts (e.g. Docker bind mounts). Writing to a local temp path avoids this.\n\n## Output Structure\n\nCopy the user-provided file to `template.pptx` in cwd. This preserves the original and gives a predictable name for all downstream operations.\n\n```bash\ncp /path/to/user-provided.pptx template.pptx\n```\n\n```text\n./\n├── template.pptx               # Copy of user-provided file (never modified)\n├── template.md                 # markitdown extraction\n├── unpacked/                   # Editable XML tree\n└── edited.pptx                 # Final repacked deck\n```\n\nMinimum expected deliverable: `edited.pptx`.\n\n## Slide Operations\n\nSlide order is in `ppt/presentation.xml` -> `<p:sldIdLst>`.\n\n**Reorder**: Rearrange `<p:sldId>` elements.\n\n**Delete**: Remove `<p:sldId>`, then clean orphaned files.\n\n**Add**: Copy the source slide's XML file, its `.rels` file, and update `Content_Types.xml` and `presentation.xml`. Never manually copy slide files without updating all references — this causes broken notes references and missing relationship IDs.\n\n## Editing Content\n\n**Subagents:** If available, use them here (after completing step 4). Each slide is a separate XML file, so subagents can edit in parallel. In your prompt to subagents, include:\n- The slide file path(s) to edit\n- **\"Use the Edit tool for all changes\"**\n- The formatting rules and common pitfalls below\n\nFor each slide:\n1. Read the slide's XML\n2. Identify ALL placeholder content — text, images, charts, icons, captions\n3. Replace each placeholder with final content\n\n**Use the Edit tool, not sed or Python scripts.** The Edit tool forces specificity about what to replace and where, yielding better reliability.\n\n## Formatting Rules\n\n- **Bold all headers, subheadings, and inline labels**: Use `b=\"1\"` on `<a:rPr>`. This includes:\n  - Slide titles\n  - Section headers within a slide\n  - Inline labels like (e.g.: \"Status:\", \"Description:\") at the start of a line\n- **Never use unicode bullets**: Use proper list formatting with `<a:buChar>` or `<a:buAutoNum>`\n- **Bullet consistency**: Let bullets inherit from the layout. Only specify `<a:buChar>` or `<a:buNone>`.\n\n## Common Pitfalls — Template Editing\n\n### Template Adaptation\n\nWhen source content has fewer items than the template:\n- **Remove excess elements entirely** (images, shapes, text boxes), don't just clear text\n- Check for orphaned visuals after clearing text content\n- Run content QA with `markitdown` to catch mismatched counts\n\nWhen replacing text with different length content:\n- **Shorter replacements**: Usually safe\n- **Longer replacements**: May overflow or wrap unexpectedly\n- Verify with `markitdown` after text changes\n- Consider truncating or splitting content to fit the template's design constraints\n\n**Template slots != Source items**: If template has 4 team members but source has 3 users, delete the 4th member's entire group (image + text boxes), not just the text.\n\n### Multi-Item Content\n\nIf source has multiple items (numbered lists, multiple sections), create separate `<a:p>` elements for each — **never concatenate into one string**.\n\n**WRONG** — all items in one paragraph:\n```xml\n<a:p>\n  <a:r><a:rPr .../><a:t>Step 1: Do the first thing. Step 2: Do the second thing.</a:t></a:r>\n</a:p>\n```\n\n**CORRECT** — separate paragraphs with bold headers:\n```xml\n<a:p>\n  <a:pPr algn=\"l\"><a:lnSpc><a:spcPts val=\"3919\"/></a:lnSpc></a:pPr>\n  <a:r><a:rPr lang=\"en-US\" sz=\"2799\" b=\"1\" .../><a:t>Step 1</a:t></a:r>\n</a:p>\n<a:p>\n  <a:pPr algn=\"l\"><a:lnSpc><a:spcPts val=\"3919\"/></a:lnSpc></a:pPr>\n  <a:r><a:rPr lang=\"en-US\" sz=\"2799\" .../><a:t>Do the first thing.</a:t></a:r>\n</a:p>\n<a:p>\n  <a:pPr algn=\"l\"><a:lnSpc><a:spcPts val=\"3919\"/></a:lnSpc></a:pPr>\n  <a:r><a:rPr lang=\"en-US\" sz=\"2799\" b=\"1\" .../><a:t>Step 2</a:t></a:r>\n</a:p>\n<!-- continue pattern -->\n```\n\nCopy `<a:pPr>` from the original paragraph to preserve line spacing. Use `b=\"1\"` on headers.\n\n### Smart Quotes\n\nThe Edit tool converts smart quotes to ASCII. **When adding new text with quotes, use XML entities:**\n\n```xml\n<a:t>the &#x201C;Agreement&#x201D;</a:t>\n```\n\n| Character | Name | Unicode | XML Entity |\n|-----------|------|---------|------------|\n| \" | Left double quote | U+201C | `&#x201C;` |\n| \" | Right double quote | U+201D | `&#x201D;` |\n| ' | Left single quote | U+2018 | `&#x2018;` |\n| ' | Right single quote | U+2019 | `&#x2019;` |\n\n### Other\n\n- **Whitespace**: Use `xml:space=\"preserve\"` on `<a:t>` with leading/trailing spaces\n- **XML parsing**: Use `defusedxml.minidom`, not `xml.etree.ElementTree` (corrupts namespaces)\n\nFile v1.0.0:references/pitfalls.md\n\n# QA Process & Common Pitfalls\n\n## QA Process\n\n**Assume there are problems. Your job is to find them.**\n\nYour first render is almost never correct. Approach QA as a bug hunt, not a confirmation step. If you found zero issues on first inspection, you weren't looking hard enough.\n\n### Content QA\n\n```bash\npython -m markitdown output.pptx\n```\n\nCheck for missing content, typos, wrong order.\n\n**Check for leftover placeholder text:**\n\n```bash\npython -m markitdown output.pptx | grep -iE \"xxxx|lorem|ipsum|placeholder|this.*(page|slide).*layout\"\n```\n\nIf grep returns results, fix them before declaring success.\n\n### Verification Loop\n\n1. Generate slides -> Extract text with `python -m markitdown output.pptx` -> Review content\n2. **List issues found** (if none found, look again more critically)\n3. Fix issues\n4. **Re-verify affected slides** — one fix often creates another problem\n5. Repeat until a full pass reveals no new issues\n\n**Do not declare success until you've completed at least one fix-and-verify cycle.**\n\n### Per-Slide QA (for from-scratch creation)\n\n```bash\npython -m markitdown slide-XX-preview.pptx\n```\n\nCheck for missing content, placeholder text, missing page number badge.\n\n---\n\n## Common Mistakes to Avoid\n\n- **Don't repeat the same layout** — vary columns, cards, and callouts across slides\n- **Don't center body text** — left-align paragraphs and lists; center only titles\n- **Don't skimp on size contrast** — titles need 36pt+ to stand out from 14-16pt body\n- **Don't default to blue** — pick colors that reflect the specific topic\n- **Don't mix spacing randomly** — choose 0.3\" or 0.5\" gaps and use consistently\n- **Don't style one slide and leave the rest plain** — commit fully or keep it simple throughout\n- **Don't create text-only slides** — add images, icons, charts, or visual elements; avoid plain title + bullets\n- **Don't forget text box padding** — when aligning lines or shapes with text edges, set `margin: 0` on the text box or offset the shape to account for padding\n- **Don't use low-contrast elements** — icons AND text need strong contrast against the background\n- **NEVER use accent lines under titles** — these are a hallmark of AI-generated slides; use whitespace or background color instead\n- **NEVER use \"#\" with hex colors** — causes file corruption in PptxGenJS\n- **NEVER encode opacity in hex strings** — use the `opacity` property instead\n- **NEVER use async/await in createSlide()** — compile.js won't await\n- **NEVER reuse option objects across PptxGenJS calls** — PptxGenJS mutates objects in-place\n\n---\n\n## Critical Pitfalls — PptxGenJS\n\n### NEVER use async/await in createSlide()\n\n```javascript\n// WRONG - compile.js won't await\nasync function createSlide(pres, theme) { ... }\n\n// CORRECT\nfunction createSlide(pres, theme) { ... }\n```\n\n### NEVER use \"#\" with hex colors\n\n```javascript\ncolor: \"FF0000\"      // CORRECT\ncolor: \"#FF0000\"     // CORRUPTS FILE\n```\n\n### NEVER encode opacity in hex strings\n\n```javascript\nshadow: { color: \"00000020\" }              // CORRUPTS FILE\nshadow: { color: \"000000\", opacity: 0.12 } // CORRECT\n```\n\n### Prevent text wrapping in titles\n\n```javascript\n// Use fit:'shrink' for long titles\nslide.addText(\"Long Title Here\", {\n  x: 0.5, y: 2, w: 9, h: 1,\n  fontSize: 48, fit: \"shrink\"\n});\n```\n\n### NEVER reuse option objects across calls\n\n```javascript\n// WRONG\nconst shadow = { type: \"outer\", blur: 6, offset: 2, color: \"000000\", opacity: 0.15 };\nslide.addShape(pres.shapes.RECTANGLE, { shadow, ... });\nslide.addShape(pres.shapes.RECTANGLE, { shadow, ... });\n\n// CORRECT - factory function\nconst makeShadow = () => ({ type: \"outer\", blur: 6, offset: 2, color: \"000000\", opacity: 0.15 });\nslide.addShape(pres.shapes.RECTANGLE, { shadow: makeShadow(), ... });\nslide.addShape(pres.shapes.RECTANGLE, { shadow: makeShadow(), ... });\n```\n\nFile v1.0.0:references/pptxgenjs.md\n\n# PptxGenJS Tutorial\n\n## Setup & Basic Structure\n\n```javascript\nconst pptxgen = require(\"pptxgenjs\");\n\nlet pres = new pptxgen();\npres.layout = 'LAYOUT_16x9';  // or 'LAYOUT_16x10', 'LAYOUT_4x3', 'LAYOUT_WIDE'\npres.author = 'Your Name';\npres.title = 'Presentation Title';\n\nlet slide = pres.addSlide();\nslide.addText(\"Hello World!\", { x: 0.5, y: 0.5, fontSize: 36, color: \"363636\" });\n\npres.writeFile({ fileName: \"Presentation.pptx\" });\n```\n\n## Layout Dimensions\n\nSlide dimensions (coordinates in inches):\n- `LAYOUT_16x9`: 10\" x 5.625\" (default)\n- `LAYOUT_16x10`: 10\" x 6.25\"\n- `LAYOUT_4x3`: 10\" x 7.5\"\n- `LAYOUT_WIDE`: 13.3\" x 7.5\"\n\n---\n\n## Text & Formatting\n\n```javascript\n// Basic text\nslide.addText(\"Simple Text\", {\n  x: 1, y: 1, w: 8, h: 2, fontSize: 24, fontFace: \"Arial\",\n  color: \"363636\", bold: true, align: \"center\", valign: \"middle\"\n});\n\n// Character spacing (use charSpacing, not letterSpacing which is silently ignored)\nslide.addText(\"SPACED TEXT\", { x: 1, y: 1, w: 8, h: 1, charSpacing: 6 });\n\n// Rich text arrays\nslide.addText([\n  { text: \"Bold \", options: { bold: true } },\n  { text: \"Italic \", options: { italic: true } }\n], { x: 1, y: 3, w: 8, h: 1 });\n\n// Multi-line text (requires breakLine: true)\nslide.addText([\n  { text: \"Line 1\", options: { breakLine: true } },\n  { text: \"Line 2\", options: { breakLine: true } },\n  { text: \"Line 3\" }  // Last item doesn't need breakLine\n], { x: 0.5, y: 0.5, w: 8, h: 2 });\n\n// Text box margin (internal padding)\nslide.addText(\"Title\", {\n  x: 0.5, y: 0.3, w: 9, h: 0.6,\n  margin: 0  // Use 0 when aligning text with other elements like shapes or icons\n});\n```\n\n**Tip:** Text boxes have internal margin by default. Set `margin: 0` when you need text to align precisely with shapes, lines, or icons at the same x-position.\n\n---\n\n## Lists & Bullets\n\n```javascript\n// CORRECT: Multiple bullets\nslide.addText([\n  { text: \"First item\", options: { bullet: true, breakLine: true } },\n  { text: \"Second item\", options: { bullet: true, breakLine: true } },\n  { text: \"Third item\", options: { bullet: true } }\n], { x: 0.5, y: 0.5, w: 8, h: 3 });\n\n// WRONG: Never use unicode bullets\nslide.addText(\"* First item\", { ... });  // Creates double bullets\n\n// Sub-items and numbered lists\n{ text: \"Sub-item\", options: { bullet: true, indentLevel: 1 } }\n{ text: \"First\", options: { bullet: { type: \"number\" }, breakLine: true } }\n```\n\n---\n\n## Shapes\n\n```javascript\nslide.addShape(pres.shapes.RECTANGLE, {\n  x: 0.5, y: 0.8, w: 1.5, h: 3.0,\n  fill: { color: \"FF0000\" }, line: { color: \"000000\", width: 2 }\n});\n\nslide.addShape(pres.shapes.OVAL, { x: 4, y: 1, w: 2, h: 2, fill: { color: \"0000FF\" } });\n\nslide.addShape(pres.shapes.LINE, {\n  x: 1, y: 3, w: 5, h: 0, line: { color: \"FF0000\", width: 3, dashType: \"dash\" }\n});\n\n// With transparency\nslide.addShape(pres.shapes.RECTANGLE, {\n  x: 1, y: 1, w: 3, h: 2,\n  fill: { color: \"0088CC\", transparency: 50 }\n});\n\n// Rounded rectangle (rectRadius only works with ROUNDED_RECTANGLE, not RECTANGLE)\n// Don't pair with rectangular accent overlays -- they won't cover rounded corners. Use RECTANGLE instead.\nslide.addShape(pres.shapes.ROUNDED_RECTANGLE, {\n  x: 1, y: 1, w: 3, h: 2,\n  fill: { color: \"FFFFFF\" }, rectRadius: 0.1\n});\n\n// With shadow\nslide.addShape(pres.shapes.RECTANGLE, {\n  x: 1, y: 1, w: 3, h: 2,\n  fill: { color: \"FFFFFF\" },\n  shadow: { type: \"outer\", color: \"000000\", blur: 6, offset: 2, angle: 135, opacity: 0.15 }\n});\n```\n\nShadow options:\n\n| Property | Type | Range | Notes |\n|----------|------|-------|-------|\n| `type` | string | `\"outer\"`, `\"inner\"` | |\n| `color` | string | 6-char hex (e.g. `\"000000\"`) | No `#` prefix, no 8-char hex -- see Common Pitfalls |\n| `blur` | number | 0-100 pt | |\n| `offset` | number | 0-200 pt | **Must be non-negative** -- negative values corrupt the file |\n| `angle` | number | 0-359 degrees | Direction the shadow falls (135 = bottom-right, 270 = upward) |\n| `opacity` | number | 0.0-1.0 | Use this for transparency, never encode in color string |\n\nTo cast a shadow upward (e.g. on a footer bar), use `angle: 270` with a positive offset -- do **not** use a negative offset.\n\n**Note**: Gradient fills are not natively supported. Use a gradient image as a background instead.\n\n---\n\n## Images\n\n### Image Sources\n\n```javascript\n// From file path\nslide.addImage({ path: \"images/chart.png\", x: 1, y: 1, w: 5, h: 3 });\n\n// From URL\nslide.addImage({ path: \"https://example.com/image.jpg\", x: 1, y: 1, w: 5, h: 3 });\n\n// From base64 (faster, no file I/O)\nslide.addImage({ data: \"image/png;base64,iVBORw0KGgo...\", x: 1, y: 1, w: 5, h: 3 });\n```\n\n### Image Options\n\n```javascript\nslide.addImage({\n  path: \"image.png\",\n  x: 1, y: 1, w: 5, h: 3,\n  rotate: 45,              // 0-359 degrees\n  rounding: true,          // Circular crop\n  transparency: 50,        // 0-100\n  flipH: true,             // Horizontal flip\n  flipV: false,            // Vertical flip\n  altText: \"Description\",  // Accessibility\n  hyperlink: { url: \"https://example.com\" }\n});\n```\n\n### Image Sizing Modes\n\n```javascript\n// Contain - fit inside, preserve ratio\n{ sizing: { type: 'contain', w: 4, h: 3 } }\n\n// Cover - fill area, preserve ratio (may crop)\n{ sizing: { type: 'cover', w: 4, h: 3 } }\n\n// Crop - cut specific portion\n{ sizing: { type: 'crop', x: 0.5, y: 0.5, w: 2, h: 2 } }\n```\n\n### Calculate Dimensions (preserve aspect ratio)\n\n```javascript\nconst origWidth = 1978, origHeight = 923, maxHeight = 3.0;\nconst calcWidth = maxHeight * (origWidth / origHeight);\nconst centerX = (10 - calcWidth) / 2;\n\nslide.addImage({ path: \"image.png\", x: centerX, y: 1.2, w: calcWidth, h: maxHeight });\n```\n\n### Supported Formats\n\n- **Standard**: PNG, JPG, GIF (animated GIFs work in Microsoft 365)\n- **SVG**: Works in modern PowerPoint/Microsoft 365\n\n---\n\n## Icons\n\nUse react-icons to generate SVG icons, then rasterize to PNG for universal compatibility.\n\n### Setup\n\n```javascript\nconst React = require(\"react\");\nconst ReactDOMServer = require(\"react-dom/server\");\nconst sharp = require(\"sharp\");\nconst { FaCheckCircle, FaChartLine } = require(\"react-icons/fa\");\n\nfunction renderIconSvg(IconComponent, color = \"#000000\", size = 256) {\n  return ReactDOMServer.renderToStaticMarkup(\n    React.createElement(IconComponent, { color, size: String(size) })\n  );\n}\n\nasync function iconToBase64Png(IconComponent, color, size = 256) {\n  const svg = renderIconSvg(IconComponent, color, size);\n  const pngBuffer = await sharp(Buffer.from(svg)).png().toBuffer();\n  return \"image/png;base64,\" + pngBuffer.toString(\"base64\");\n}\n```\n\n### Add Icon to Slide\n\n```javascript\nconst iconData = await iconToBase64Png(FaCheckCircle, \"#4472C4\", 256);\n\nslide.addImage({\n  data: iconData,\n  x: 1, y: 1, w: 0.5, h: 0.5  // Size in inches\n});\n```\n\n**Note**: Use size 256 or higher for crisp icons. The size parameter controls the rasterization resolution, not the display size on the slide (which is set by `w` and `h` in inches).\n\n### Icon Libraries\n\nInstall: `npm install -g react-icons react react-dom sharp`\n\nPopular icon sets in react-icons:\n- `react-icons/fa` - Font Awesome\n- `react-icons/md` - Material Design\n- `react-icons/hi` - Heroicons\n- `react-icons/bi` - Bootstrap Icons\n\n---\n\n## Slide Backgrounds\n\n```javascript\n// Solid color\nslide.background = { color: \"F1F1F1\" };\n\n// Color with transparency\nslide.background = { color: \"FF3399\", transparency: 50 };\n\n// Image from URL\nslide.background = { path: \"https://example.com/bg.jpg\" };\n\n// Image from base64\nslide.background = { data: \"image/png;base64,iVBORw0KGgo...\" };\n```\n\n---\n\n## Tables\n\n```javascript\nslide.addTable([\n  [\"Header 1\", \"Header 2\"],\n  [\"Cell 1\", \"Cell 2\"]\n], {\n  x: 1, y: 1, w: 8, h: 2,\n  border: { pt: 1, color: \"999999\" }, fill: { color: \"F1F1F1\" }\n});\n\n// Advanced with merged cells\nlet tableData = [\n  [{ text: \"Header\", options: { fill: { color: \"6699CC\" }, color: \"FFFFFF\", bold: true } }, \"Cell\"],\n  [{ text: \"Merged\", options: { colspan: 2 } }]\n];\nslide.addTable(tableData, { x: 1, y: 3.5, w: 8, colW: [4, 4] });\n```\n\n---\n\n## Charts\n\n```javascript\n// Bar chart\nslide.addChart(pres.charts.BAR, [{\n  name: \"Sales\", labels: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"], values: [4500, 5500, 6200, 7100]\n}], {\n  x: 0.5, y: 0.6, w: 6, h: 3, barDir: 'col',\n  showTitle: true, title: 'Quarterly Sales'\n});\n\n// Line chart\nslide.addChart(pres.charts.LINE, [{\n  name: \"Temp\", labels: [\"Jan\", \"Feb\", \"Mar\"], values: [32, 35, 42]\n}], { x: 0.5, y: 4, w: 6, h: 3, lineSize: 3, lineSmooth: true });\n\n// Pie chart\nslide.addChart(pres.charts.PIE, [{\n  name: \"Share\", labels: [\"A\", \"B\", \"Other\"], values: [35, 45, 20]\n}], { x: 7, y: 1, w: 5, h: 4, showPercent: true });\n```\n\n### Better-Looking Charts\n\nDefault charts look dated. Apply these options for a modern, clean appearance:\n\n```javascript\nslide.addChart(pres.charts.BAR, chartData, {\n  x: 0.5, y: 1, w: 9, h: 4, barDir: \"col\",\n\n  // Custom colors (match your presentation palette)\n  chartColors: [\"0D9488\", \"14B8A6\", \"5EEAD4\"],\n\n  // Clean background\n  chartArea: { fill: { color: \"FFFFFF\" }, roundedCorners: true },\n\n  // Muted axis labels\n  catAxisLabelColor: \"64748B\",\n  valAxisLabelColor: \"64748B\",\n\n  // Subtle grid (value axis only)\n  valGridLine: { color: \"E2E8F0\", size: 0.5 },\n  catGridLine: { style: \"none\" },\n\n  // Data labels on bars\n  showValue: true,\n  dataLabelPosition: \"outEnd\",\n  dataLabelColor: \"1E293B\",\n\n  // Hide legend for single series\n  showLegend: false,\n});\n```\n\n**Key styling options:**\n- `chartColors: [...]` - hex colors for series/segments\n- `chartArea: { fill, border, roundedCorners }` - chart background\n- `catGridLine/valGridLine: { color, style, size }` - grid lines (`style: \"none\"` to hide)\n- `lineSmooth: true` - curved lines (line charts)\n- `legendPos: \"r\"` - legend position: \"b\", \"t\", \"l\", \"r\", \"tr\"\n\n---\n\n## Slide Masters\n\n```javascript\npres.defineSlideMaster({\n  title: 'TITLE_SLIDE', background: { color: '283A5E' },\n  objects: [{\n    placeholder: { options: { name: 'title', type: 'title', x: 1, y: 2, w: 8, h: 2 } }\n  }]\n});\n\nlet titleSlide = pres.addSlide({ masterName: \"TITLE_SLIDE\" });\ntitleSlide.addText(\"My Title\", { placeholder: \"title\" });\n```\n\n---\n\n## Common Pitfalls\n\nThese issues cause file corruption, visual bugs, or broken output. Avoid them.\n\n1. **NEVER use \"#\" with hex colors** - causes file corruption\n   ```javascript\n   color: \"FF0000\"      // CORRECT\n   color: \"#FF0000\"     // WRONG\n   ```\n\n2. **NEVER encode opacity in hex color strings** - 8-char colors (e.g., `\"00000020\"`) corrupt the file. Use the `opacity` property instead.\n   ```javascript\n   shadow: { type: \"outer\", blur: 6, offset: 2, color: \"00000020\" }          // CORRUPTS FILE\n   shadow: { type: \"outer\", blur: 6, offset: 2, color: \"000000\", opacity: 0.12 }  // CORRECT\n   ```\n\n3. **Use `bullet: true`** - NEVER unicode symbols like \"o\" (creates double bullets)\n\n4. **Use `breakLine: true`** between array items or text runs together\n\n5. **Avoid `lineSpacing` with bullets** - causes excessive gaps; use `paraSpaceAfter` instead\n\n6. **Each presentation needs fresh instance** - don't reuse `pptxgen()` objects\n\n7. **NEVER reuse option objects across calls** - PptxGenJS mutates objects in-place (e.g. converting shadow values to EMU). Sharing one object between multiple calls corrupts the second shape.\n   ```javascript\n   const shadow = { type: \"outer\", blur: 6, offset: 2, color: \"000000\", opacity: 0.15 };\n   slide.addShape(pres.shapes.RECTANGLE, { shadow, ... });  // second call gets already-converted values\n   slide.addShape(pres.shapes.RECTANGLE, { shadow, ... });\n\n   const makeShadow = () => ({ type: \"outer\", blur: 6, offset: 2, color: \"000000\", opacity: 0.15 });\n   slide.addShape(pres.shapes.RECTANGLE, { shadow: makeShadow(), ... });  // fresh object each time\n   slide.addShape(pres.shapes.RECTANGLE, { shadow: makeShadow(), ... });\n   ```\n\n8. **Don't use `ROUNDED_RECTANGLE` with accent borders** - rectangular overlay bars won't cover rounded corners. Use `RECTANGLE` instead.\n   ```javascript\n   // WRONG: Accent bar doesn't cover rounded corners\n   slide.addShape(pres.shapes.ROUNDED_RECTANGLE, { x: 1, y: 1, w: 3, h: 1.5, fill: { color: \"FFFFFF\" } });\n   slide.addShape(pres.shapes.RECTANGLE, { x: 1, y: 1, w: 0.08, h: 1.5, fill: { color: \"0891B2\" } });\n\n   // CORRECT: Use RECTANGLE for clean alignment\n   slide.addShape(pres.shapes.RECTANGLE, { x: 1, y: 1, w: 3, h: 1.5, fill: { color: \"FFFFFF\" } });\n   slide.addShape(pres.shapes.RECTANGLE, { x: 1, y: 1, w: 0.08, h: 1.5, fill: { color: \"0891B2\" } });\n   ```\n\n---\n\n## Quick Reference\n\n- **Shapes**: RECTANGLE, OVAL, LINE, ROUNDED_RECTANGLE\n- **Charts**: BAR, LINE, PIE, DOUGHNUT, SCATTER, BUBBLE, RADAR\n- **Layouts**: LAYOUT_16x9 (10\"x5.625\"), LAYOUT_16x10, LAYOUT_4x3, LAYOUT_WIDE\n- **Alignment**: \"left\", \"center\", \"right\"\n- **Chart data labels**: \"outEnd\", \"inEnd\", \"center\"\n\nFile v1.0.0:references/slide-types.md\n\n# Slide Page Types\n\nClassify **every slide** as **exactly one** of these 5 types:\n\n## 1. Cover Page\n\n- **Use for**: Opening + tone setting\n- **Content**: Big title, subtitle/presenter, date/occasion, strong background/motif\n\n### Layout Options\n\n**Asymmetric Left-Right Layout**\n- Text concentrated on one side, image on the opposite\n- Best for: Corporate presentations, product launches, professional reports\n```\n|  Title & Subtitle  |    Visual/Image    |\n|  Description       |                    |\n```\n\n**Center-Aligned Layout**\n- Content centered with background image\n- Best for: Inspirational talks, event presentations, creative pitches\n```\n|                                        |\n|           [Background Image]           |\n|              MAIN TITLE                |\n|              Subtitle                  |\n|                                        |\n```\n\n### Font Size Hierarchy\n\n| Element | Recommended Size | Ratio to Base |\n|---------|-----------------|---------------|\n| Main Title | 72-120px | 3x-5x |\n| Subtitle | 28-40px | 1.5x-2x |\n| Supporting Text | 18-24px | 1x (base) |\n| Meta Info (date, name) | 14-18px | 0.7x-1x |\n\n**Key Principles:**\n1. **Dramatic Contrast**: Main title should be at least 2-3x larger than subtitle\n2. **Visual Anchor**: The largest text becomes the focal point\n3. **Readable Hierarchy**: Viewers should instantly understand what's most important\n4. **Avoid Similarity**: Never let adjacent text elements be within 20% of each other's size\n\n### Content Elements\n\n1. **Main Title** — Always required, largest font\n2. **Subtitle** — When additional context is needed (clearly smaller than title)\n3. **Icons** — When they reinforce the theme\n4. **Date/Event Info** — When relevant (smallest text)\n5. **Company/Brand Logo** — When representing an organization\n6. **Presenter Name** — For keynotes (small, subtle)\n\n### Design Decisions\n\nConsider: Purpose (corporate/educational/creative), Audience, Tone, Content Volume, Visual Assets needed.\n\n### Workflow\n\n1. **Analyze**: Understand topic, audience, purpose\n2. **Choose Layout**: Select based on content\n3. **Write Slide**: Use PptxGenJS. Use shapes and SVG elements for visual interest.\n4. **Verify**: Generate preview as `slide-XX-preview.pptx`. Extract text with `python -m markitdown slide-XX-preview.pptx`, verify all content present and no placeholder text remains.\n\n---\n\n## 2. Table of Contents\n\n- **Use for**: Navigation + expectation setting (3-5 sections)\n- **Content**: Section list (optional icons / page numbers)\n\n### Layout Options\n\n**Numbered Vertical List** — Best for 3-5 sections, straightforward presentations\n```\n|  TABLE OF CONTENTS            |\n|                                |\n|  01  Section Title One         |\n|  02  Section Title Two         |\n|  03  Section Title Three       |\n```\n\n**Two-Column Grid** — Best for 4-6 sections, content-rich presentations\n```\n|  TABLE OF CONTENTS              |\n|                                  |\n|  01  Section One   02  Section Two  |\n|      Description       Description  |\n|  03  Section Three 04  Section Four |\n```\n\n**Sidebar Navigation** — Best for 3-5 sections, modern/corporate\n```\n| ▌01 |  Section Title One           |\n| ▌02 |  Section Title Two           |\n| ▌03 |  Section Title Three         |\n```\n\n**Card-Based** — Best for 3-4 sections, creative/modern\n```\n|  TABLE OF CONTENTS                    |\n|  ┌─────┐  ┌─────┐  ┌─────┐  ┌─────┐  |\n|  │ 01  │  │ 02  │  │ 03  │  │ 04  │  |\n|  │Title│  │Title│  │Title│  │Title│  |\n|  └─────┘  └─────┘  └─────┘  └─────┘  |\n```\n\n### Font Size Hierarchy\n\n| Element | Recommended Size | Ratio to Base |\n|---------|-----------------|---------------|\n| Page Title (\"Table of Contents\" / \"Agenda\") | 36-44px | 2.5x-3x |\n| Section Number | 28-36px | 2x-2.5x |\n| Section Title | 20-28px | 1.5x-2x |\n| Section Description | 14-16px | 1x (base) |\n\n**Key Principles:**\n1. **Clear Numbering**: Section numbers should be visually prominent — bold, accent color, or larger size\n2. **Scannable Structure**: Viewer should scan all sections in 2-3 seconds\n3. **Consistent Spacing**: Equal vertical spacing between sections\n4. **Visual Markers**: Colored dots, lines, numbers, or icons to anchor each section\n5. **Avoid Clutter**: Descriptions one line max or omit entirely\n\n### Content Elements\n\n1. **Page Title** — Always required (\"Table of Contents\", \"Agenda\", \"Overview\")\n2. **Section Numbers** — Consistent format (01, 02... or I, II...)\n3. **Section Titles** — Clear and concise\n4. **Section Descriptions** — Optional one-line summaries\n5. **Visual Separators** — SVG dividers or spacing\n6. **Decorative Elements** — Subtle accent shapes\n7. **Page Number Badge** — **MANDATORY**\n\n### Design Decisions\n\n1. **Section Count**: 3 → vertical list; 4-6 → grid or compact; 7+ → multi-column\n2. **Description Length**: Long → vertical list; None → compact grid/cards\n3. **Tone**: Corporate → numbered list; Creative → card-based; Academic → Roman numerals\n4. **Consistency**: Match visual style of cover page\n\n### Workflow\n\n1. **Analyze**: Section list, count, presentation context\n2. **Choose Layout**: Based on section count and content\n3. **Plan Visual Hierarchy**: Numbering style, font sizes, spacing\n4. **Write Slide**: Use PptxGenJS. Use shapes for decorative elements. **MUST include page number badge.**\n5. **Verify**: Generate preview, extract text with markitdown, verify content and badge.\n\n---\n\n## 3. Section Divider\n\n- **Use for**: Clear transitions between major parts\n- **Content**: Section number + title (+ optional 1-2 line intro)\n\n### Layout Options\n\n**Bold Center** — Best for minimal, modern presentations\n```\n|                  02                    |\n|           SECTION TITLE               |\n|         Optional intro line           |\n```\n\n**Left-Aligned with Accent Block** — Best for corporate, structured presentations\n```\n| ████ |  02                            |\n| ████ |  SECTION TITLE                 |\n| ████ |  Optional intro line           |\n```\n\n**Split Background** — Best for high-contrast, dramatic transitions\n```\n| ██████████ |     SECTION TITLE        |\n| ██  02  ██ |     Optional intro       |\n| ██████████ |                          |\n```\n\n**Full-Bleed Background with Overlay** — Best for creative, bold presentations\n```\n| ████████████████████████████████████  |\n| ████       large 02        █████████ |\n| ████    SECTION TITLE      █████████ |\n| ████████████████████████████████████  |\n```\n\n### Font Size Hierarchy\n\n| Element | Recommended Size | Notes |\n|---------|-----------------|-------|\n| Section Number | 72-120px | Bold, accent color or semi-transparent |\n| Section Title | 36-48px | Bold, clear, primary text color |\n| Intro Text | 16-20px | Light weight, muted color, optional |\n\n**Key Principles:**\n1. **Dramatic Number**: Section number = most prominent visual element\n2. **Strong Title**: Large but clearly secondary to the number\n3. **Minimal Content**: Just number + title + optional one-liner\n4. **Breathing Room**: Leave generous whitespace — dividers are pause moments\n\n### Content Elements\n\n1. **Section Number** — Always required. Format: `01`, `02`... or `I`, `II`... Match TOC style.\n2. **Section Title** — Always required. Clear, concise.\n3. **Intro Text** — Optional 1-2 line description.\n4. **Decorative Elements** — SVG accent shapes (bars, lines, geometric blocks).\n5. **Page Number Badge** — **MANDATORY**.\n\n### Design Decisions\n\n1. **Tone**: Corporate → accent block; Creative → full-bleed; Minimal → bold center\n2. **Color**: Strong palette color for background/accent; high-contrast text\n3. **Consistency**: Same divider style across all dividers in one presentation\n4. **Contrast with content slides**: Visually distinct (different background color, more whitespace)\n\n### Workflow\n\n1. **Analyze**: Section number, title, optional intro\n2. **Choose Layout**: Based on content and tone\n3. **Write Slide**: Use PptxGenJS. Use shapes for decorative elements. **MUST include page number badge.**\n4. **Verify**: Generate preview, extract text, verify content and badge.\n\n---\n\n## 4. Content Page\n\nPick a subtype based on the content. Each content slide belongs to exactly ONE subtype:\n\n### Subtypes\n\n**Text** — Bullets, quotes, or short paragraphs\n- Must still include icons or SVG shapes — never plain text only\n```\n|  SLIDE TITLE                          |\n|  * Bullet point one                   |\n|  * Bullet point two                   |\n|  * Bullet point three                 |\n```\n\n**Mixed Media** — Two-column or half-bleed image + text\n```\n|  SLIDE TITLE                          |\n|  Text content     |  [Image/Visual]   |\n|  and bullets      |                   |\n```\n\n**Data Visualization** — Chart (SVG bar/progress/ring) + takeaways\n- Must include data source\n```\n|  SLIDE TITLE                          |\n|  [SVG Chart]      |  Key Takeaway 1   |\n|                   |  Key Takeaway 2   |\n|                   Source: xxx          |\n```\n\n**Comparison** — Side-by-side columns or cards (A vs B, pros/cons)\n```\n|  SLIDE TITLE                          |\n|  ┌─ Option A ─┐  ┌─ Option B ─┐      |\n|  │  Detail 1  │  │  Detail 1  │      |\n|  └────────────┘  └────────────┘      |\n```\n\n**Timeline / Process** — Steps with arrows, journey, phases\n```\n|  SLIDE TITLE                          |\n|  [1] ──→ [2] ──→ [3] ──→ [4]         |\n|  Step    Step    Step    Step          |\n```\n\n**Image Showcase** — Hero image, gallery, visual-first layout\n```\n|  SLIDE TITLE                          |\n|  ┌────────────────────────────────┐   |\n|  │         [Hero Image]           │   |\n|  └────────────────────────────────┘   |\n|  Caption or supporting text           |\n```\n\n### Font Size Hierarchy\n\n| Element | Recommended Size | Notes |\n|---------|-----------------|-------|\n| Slide Title | 36-44px | Bold, top of slide |\n| Section Header | 20-24px | Bold, for sub-sections within slide |\n| Body Text | 14-16px | Regular weight, left-aligned |\n| Captions / Source | 10-12px | Muted color, smallest text |\n| Stat Callout | 60-72px | Large bold numbers for key statistics |\n\n**Key Principles:**\n1. **Left-align body text** — never center paragraphs or bullet lists\n2. **Size contrast** — title must be 36pt+ to stand out from 14-16pt body\n3. **Visual elements required** — every content slide must have at least one non-text element\n4. **Breathing room** — 0.5\" minimum margins, 0.3-0.5\" between content blocks\n\n### Content Elements\n\n1. **Slide Title** — Always required, top of slide\n2. **Body Content** — Text, bullets, data, or comparisons based on subtype\n3. **Visual Element** — Image, chart, icon, or SVG shape — always required\n4. **Source / Caption** — When showing data or external content\n5. **Page Number Badge** — **MANDATORY**\n\n### Design Decisions\n\n1. **Subtype**: Determine first — drives the entire layout\n2. **Content Volume**: Dense → multi-column or smaller font; Light → larger elements with more whitespace\n3. **Data vs Narrative**: Data-heavy → charts + stat callouts; Story-driven → images + quotes\n4. **Variety**: Each content slide should use a different layout from the previous one\n5. **Consistency**: Typography, colors, and spacing must match the rest of the presentation\n\n### Workflow\n\n1. **Analyze**: Content, determine subtype, plan layout\n2. **Choose Layout**: Best fit for subtype and content volume\n3. **Write Slide**: Use PptxGenJS. Use shapes for charts, decorative elements, icons. **MUST include page number badge.**\n4. **Verify**: Generate preview as `slide-XX-preview.pptx`. Extract text with markitdown, verify all content present, no placeholder text, badge included.\n\n---\n\n## 5. Summary / Closing Page\n\n- **Use for**: Wrap-up + action\n- **Content**: Key takeaways, CTA/next steps, contact/QR, thank-you\n\n### Layout Options\n\n**Key Takeaways** — Best for educational, corporate, data-driven presentations\n```\n|  KEY TAKEAWAYS                        |\n|  ✓  Takeaway one                      |\n|  ✓  Takeaway two                      |\n|  ✓  Takeaway three                    |\n```\n\n**CTA / Next Steps** — Best for sales pitches, proposals, project kick-offs\n```\n|  NEXT STEPS                           |\n|  [1] Action item one                  |\n|  [2] Action item two                  |\n|  Contact: email@example.com           |\n```\n\n**Thank You / Contact** — Best for conference talks, keynotes\n```\n|            THANK YOU                   |\n|         name@company.com              |\n|         @handle | website.com         |\n```\n\n**Split Recap** — Best for presentations needing both recap and action\n```\n|  SUMMARY            |  NEXT STEPS      |\n|  * Point one        |  Contact us at   |\n|  * Point two        |  email@co.com    |\n|  * Point three      |  [QR Code]       |\n```\n\n### Font Size Hierarchy\n\n| Element | Recommended Size | Notes |\n|---------|-----------------|-------|\n| Closing Title (\"Thank You\" / \"Summary\") | 48-72px | Bold, commanding |\n| Takeaway / Action Item | 18-24px | Clear, scannable |\n| Supporting Text | 14-16px | Regular weight |\n| Contact Info | 14-16px | Muted color |\n\n**Key Principles:**\n1. **Strong closing statement**: Main message should be largest, most prominent\n2. **Scannable items**: Takeaways/action items concise (one line each)\n3. **Contact clarity**: Legible but not dominant\n4. **Memorable finish**: Confident, polished ending\n\n### Content Elements\n\n1. **Closing Title** — Always required\n2. **Takeaway Points** — 3-5 concise summary points (if applicable)\n3. **Call to Action** — Clear next steps (if applicable)\n4. **Contact Info** — Email, website, social handles (if provided)\n5. **Decorative Elements** — SVG accents for visual consistency\n6. **Page Number Badge** — **MANDATORY**\n\n### Design Decisions\n\n1. **Closing Type**: Recap, CTA, thank-you, or combination\n2. **Content Volume**: Many takeaways → list; Simple closing → centered thank-you\n3. **Audience Action**: Audience needs to do something → CTA; Informational → takeaways\n4. **Tone Consistency**: Match energy of cover page\n5. **Visual Distinction**: Special but not disconnected from the rest\n\n### Workflow\n\n1. **Analyze**: Closing content — takeaways, CTA, contact, thank-you\n2. **Choose Layout**: Based on content type\n3. **Write Slide**: Use PptxGenJS. Use shapes for decorative elements. **MUST include page number badge.**\n4. **Verify**: Generate preview, extract text, verify content and badge.\n\n---\n\n## Additional Layout Patterns\n\nUse these across content slides for visual variety:\n\n- **Two-column** (text left, illustration right)\n- **Icon + text rows** (icon in colored circle, bold header, description below)\n- **2x2 or 2x3 grid** (image on one side, grid of content blocks on other)\n- **Half-bleed image** (full left or right side) with content overlay\n- **Large stat callouts** (big numbers 60-72pt with small labels below)\n- **Comparison columns** (before/after, pros/cons)\n- **Timeline or process flow** (numbered steps, arrows)\n- **Icons in small colored circles** next to section headers\n- **Italic accent text** for key stats or taglines\n\nFile v1.0.0:skill-card.md\n\n## Description:\n\nGenerates, edits, and reads PowerPoint presentations using PptxGenJS for new decks, XML workflows for existing PPTX templates, and MarkItDown for text extraction.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[fusuvae-art](https://clawhub.ai/user/fusuvae-art)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and knowledge workers use this skill to create polished PPTX decks, adapt existing PowerPoint templates, or extract presentation text for analysis.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Unpinned global dependency installation can affect the host environment more broadly than the skill requires.\n\nMitigation: Install the skill in an isolated or disposable project and prefer local, pinned dependencies for PptxGenJS, MarkItDown, and optional icon tooling.\n\nRisk: Presentation generation and template editing can overwrite existing slide modules, unpacked XML, images, or PPTX outputs when paths are reused.\n\nMitigation: Review output paths before generation or template edits, preserve original templates, and stage repacked PPTX files in /tmp before copying final outputs.\n\nRisk: Generated presentations can contain placeholder text, missing content, or corrupted PPTX formatting if PptxGenJS and XML constraints are missed.\n\nMitigation: Run the documented MarkItDown extraction checks, placeholder scans, and preview or final deck verification before using the generated presentation.\n\n## Reference(s):\n\n- [PptxGenJS Documentation](https://gitbrent.github.io/PptxGenJS/)\n- [MarkItDown](https://github.com/microsoft/markitdown)\n- [Slide Page Types](references/slide-types.md)\n- [Design System](references/design-system.md)\n- [Editing Existing Presentations](references/editing.md)\n- [QA Process and Common Pitfalls](references/pitfalls.md)\n- [PptxGenJS Tutorial](references/pptxgenjs.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, files, guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands, JavaScript slide modules, extracted text, and PPTX files]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May generate slide source files, image assets, unpacked PPTX XML trees, and final or preview PowerPoint decks.]\n\n## Skill Version(s):\n\n1.0.0 (source: server evidence, artifact metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.","readmeExcerpt":"Skill: Pptx Generator Owner: fusuvae-art Summary: Generate, edit, and read PowerPoint presentations. Create from scratch with PptxGenJS (cover, TOC, content, section divider, summary slides), edit existing P... Tags: latest:1.0.0 Version history: v1.0.0 | 2026-04-16T02:33:57.763Z | auto - Initial release of the pptx-generator skill. - Supports generating, editing, and reading PowerPoint presentations. - Create presen","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"# Text extraction\npython -m markitdown presentation.pptx"},{"language":"javascript","snippet":"// slides/compile.js\nconst pptxgen = require('pptxgenjs');\nconst pres = new pptxgen();\npres.layout = 'LAYOUT_16x9';\n\nconst theme = {\n  primary: \"22223b\",    // dark color for backgrounds/text\n  secondary: \"4a4e69\",  // secondary accent\n  accent: \"9a8c98\",     // highlight color\n  light: \"c9ada7\",      // light accent\n  bg: \"f2e9e4\"          // background color\n};\n\nfor (let i = 1; i <= 12; i++) {  // adjust count as needed\n  const num = String(i).padStart(2, '0');\n  const slideModule = require(`./slide-${num}.js`);\n  slideModule.createSlide(pres, theme);\n}\n\npres.writeFile({ fileName: './output/presentation.pptx' });"},{"language":"text","snippet":"slides/\n├── slide-01.js          # Slide modules\n├── slide-02.js\n├── ...\n├── imgs/                # Images used in slides\n└── output/              # Final artifacts\n    └── presentation.pptx"},{"language":"javascript","snippet":"// slide-01.js\nconst pptxgen = require(\"pptxgenjs\");\n\nconst slideConfig = {\n  type: 'cover',\n  index: 1,\n  title: 'Presentation Title'\n};\n\n// MUST be synchronous (not async)\nfunction createSlide(pres, theme) {\n  const slide = pres.addSlide();\n  slide.background = { color: theme.bg };\n\n  slide.addText(slideConfig.title, {\n    x: 0.5, y: 2, w: 9, h: 1.2,\n    fontSize: 48, fontFace: \"Arial\",\n    color: theme.primary, bold: true, align: \"center\"\n  });\n\n  return slide;\n}\n\n// Standalone preview - use slide-specific filename\nif (require.main === module) {\n  const pres = new pptxgen();\n  pres.layout = 'LAYOUT_16x9';\n  const theme = {\n    primary: \"22223b\",\n    secondary: \"4a4e69\",\n    accent: \"9a8c98\",\n    light: \"c9ada7\",\n    bg: \"f2e9e4\"\n  };\n  createSlide(pres, theme);\n  pres.writeFile({ fileName: \"slide-01-preview.pptx\" });\n}\n\nmodule.exports = { createSlide, slideConfig };"},{"language":"javascript","snippet":"slide.addShape(pres.shapes.OVAL, {\n  x: 9.3, y: 5.1, w: 0.4, h: 0.4,\n  fill: { color: theme.accent }\n});\nslide.addText(\"3\", {\n  x: 9.3, y: 5.1, w: 0.4, h: 0.4,\n  fontSize: 12, fontFace: \"Arial\",\n  color: \"FFFFFF\", bold: true,\n  align: \"center\", valign: \"middle\"\n});"},{"language":"javascript","snippet":"slide.addShape(pres.shapes.ROUNDED_RECTANGLE, {\n  x: 9.1, y: 5.15, w: 0.6, h: 0.35,\n  fill: { color: theme.accent },\n  rectRadius: 0.15\n});\nslide.addText(\"03\", {\n  x: 9.1, y: 5.15, w: 0.6, h: 0.35,\n  fontSize: 11, fontFace: \"Arial\",\n  color: \"FFFFFF\", bold: true,\n  align: \"center\", valign: \"middle\"\n});"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: pptx-generator\ndescription: \"Generate, edit, and read PowerPoint presentations. Create from scratch with PptxGenJS (cover, TOC, content, section divider, summary slides), edit existing PPTX via XML workflows, or extract text with markitdown. Triggers: PPT, PPTX, PowerPoint, presentation, slide, deck, slides.\"\nlicense: MIT\nmetadata:\n  version: \"1.0.0\"\n  category: productivity\n  sources:\n    - https://gitbrent.github.io/PptxGenJS/\n    - https://github.com/microsoft/markitdown\n---\n\n# PPTX Generator & Editor\n\n## Overview\n\nThis skill handles all PowerPoint tasks: reading/analyzing existing presentations, editing template-based decks via XML manipulation, and creating presentations from scratch using PptxGenJS. It includes a complete design system (color palettes, fonts, style recipes) and detailed guidance for every slide type.\n\n## Quick Reference\n\n| Task | Approach |\n|------|----------|\n| Read/analyze content | `python -m markitdown presentation.pptx` |\n| Edit or create from template | See [Editing Presentations](references/editing.md) |\n| Create from scratch | See [Creating from Scratch](#creating-from-scratch-workflow) below |\n\n| Item | Value |\n|------|-------|\n| **Dimensions** | 10\" x 5.625\" (LAYOUT_16x9) |\n| **Colors** | 6-char hex without # (e.g., `\"FF0000\"`) |\n| **English font** | Arial (default), or approved alternatives |\n| **Chinese font** | Microsoft YaHei |\n| **Page badge position** | x: 9.3\", y: 5.1\" |\n| **Theme keys** | `primary`, `secondary`, `accent`, `light`, `bg` |\n| **Shapes** | RECTANGLE, OVAL, LINE, ROUNDED_RECTANGLE |\n| **Charts** | BAR, LINE, PIE, DOUGHNUT, SCATTER, BUBBLE, RADAR |\n\n## Reference Files\n\n| File | Contents |\n|------|----------|\n| [slide-types.md](references/slide-types.md) | 5 slide page types (Cover, TOC, Section Divider, Content, Summary) + additional layout patterns |\n| [design-system.md](references/design-system.md) | Color palettes, font reference, style recipes (Sharp/Soft/Rounded/Pill), typography & spacing |\n| [editing.md](references/editing.md) | Template-based editing workflow, XML manipulation, formatting rules, common pitfalls |\n| [pitfalls.md](references/pitfalls.md) | QA process, common mistakes, critical PptxGenJS pitfalls |\n| [pptxgenjs.md](references/pptxgenjs.md) | Complete PptxGenJS API reference |\n\n---\n\n## Reading Content\n\n```bash\n# Text extraction\npython -m markitdown presentation.pptx\n```\n\n---\n\n## Creating from Scratch — Workflow\n\n**Use when no template or reference presentation is available.**\n\n### Step 1: Research & Requirements\n\nSearch to understand user requirements — topic, audience, purpose, tone, content depth.\n\n### Step 2: Select Color Palette & Fonts\n\nUse the [Color Palette Reference](references/design-system.md#color-palette-reference) to select a palette matching the topic and audience. Use the [Font Reference](references/design-system.md#font-reference) to choose a font pairing.\n\n### Step 3: Select Design Style\n\nUse the [Style Recipes](references/design-system.md#style-re"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7fk6twcw733nbszvhn1enayh83qrvw\",\n  \"slug\": \"yilian-ppt-generator\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1776306837763\n}"},{"path":"references/design-system.md","content":"# Design System\n\n## Color Palette Reference\n\n| # | Name | Colors | Style | Use Cases | Tips |\n|---|------|--------|-------|-----------|------|\n| 1 | Modern & Wellness | `#006d77` `#83c5be` `#edf6f9` `#ffddd2` `#e29578` | Fresh, soothing | Healthcare, counseling, skincare, yoga/spa | Deep teal for titles, light pink for background |\n| 2 | Business & Authority | `#2b2d42` `#8d99ae` `#edf2f4` `#ef233c` `#d90429` | Formal, classic | Annual reports, financial analysis, corporate intro, government | Deep blue for professionalism, bright red to highlight data |\n| 3 | Nature & Outdoors | `#606c38` `#283618` `#fefae0` `#dda15e` `#bc6c25` | Grounded, earthy | Outdoor gear, environmental, agriculture, historical culture | Dark green base, cream text |\n| 4 | Vintage & Academic | `#780000` `#c1121f` `#fdf0d5` `#003049` `#669bbc` | Classic, scholarly | Academic lectures, history reviews, museums, heritage brands | Strong contrast between deep red and deep blue |\n| 5 | Soft & Creative | `#cdb4db` `#ffc8dd` `#ffafcc` `#bde0fe` `#a2d2ff` | Dreamy, candy-toned | Mother & baby, desserts, women's fashion, kindergarten | Use dark gray or black for text |\n| 6 | Bohemian | `#ccd5ae` `#e9edc9` `#fefae0` `#faedcd` `#d4a373` | Gentle, muted | Wedding planning, home decor, organic food, slow living | Cream background, green-brown accents |\n| 7 | Vibrant & Tech | `#8ecae6` `#219ebc` `#023047` `#ffb703` `#fb8500` | High energy, sporty | Sports events, gyms, startup pitches, youth education | Deep blue for stability, orange as focal accent |\n| 8 | Craft & Artisan | `#7f5539` `#a68a64` `#ede0d4` `#656d4a` `#414833` | Rustic, coffee-toned | Coffee shops, handicrafts, traditional culture, bakery | Suited for paper/leather textures |\n| 9 | Tech & Night | `#000814` `#001d3d` `#003566` `#ffc300` `#ffd60a` | Deep, luminous | Tech launches, astronomy, night economy, luxury automobiles | Must use dark mode |\n| 10 | Education & Charts | `#264653` `#2a9d8f` `#e9c46a` `#f4a261` `#e76f51` | Clear, logical | Statistical reports, education, market analysis, general business | Perfect chart color scheme |\n| 11 | Forest & Eco | `#dad7cd` `#a3b18a` `#588157` `#3a5a40` `#344e41` | Monochrome gradient, forest | Landscape design, ESG reports, environmental causes, botanical | Monochrome palette is safe and cohesive |\n| 12 | Elegant & Fashion | `#edafb8` `#f7e1d7` `#dedbd2` `#b0c4b1` `#4a5759` | Muted, Morandi tones | Haute couture, art galleries, beauty brands, magazine style | Negative space is key |\n| 13 | Art & Food | `#335c67` `#fff3b0` `#e09f3e` `#9e2a2b` `#540b0e` | Rich, vintage-poster | Food documentaries, art exhibitions, ethnic themes, vintage restaurants | Works well with large color blocks |\n| 14 | Luxury & Mysterious | `#22223b` `#4a4e69` `#9a8c98` `#c9ada7` `#f2e9e4` | Cool, purple-toned | Jewelry showcases, hotel management, high-end consulting, psychology | Purple evokes premium atmosphere |\n| 15 | Pure Tech Blue | `#03045e` `#0077b6` `#00b4d8` `#90e0ef` `#caf0f8` | Futuristic, cl"},{"path":"references/editing.md","content":"# Editing Existing Presentations\n\n## Template-Based Workflow\n\nWhen using an existing presentation as a template:\n\n1. **Copy and analyze**:\n   ```bash\n   cp /path/to/user-provided.pptx template.pptx\n   python -m markitdown template.pptx > template.md\n   ```\n   Review `template.md` to see placeholder text and slide structure.\n\n2. **Plan slide mapping**: For each content section, choose a template slide.\n\n   **USE VARIED LAYOUTS** — monotonous presentations are a common failure mode. Don't default to basic title + bullet slides. Actively seek out:\n   - Multi-column layouts (2-column, 3-column)\n   - Image + text combinations\n   - Full-bleed images with text overlay\n   - Quote or callout slides\n   - Section dividers\n   - Stat/number callouts\n   - Icon grids or icon + text rows\n\n   **Avoid:** Repeating the same text-heavy layout for every slide.\n\n   Match content type to layout style (e.g., key points -> bullet slide, team info -> multi-column, testimonials -> quote slide).\n\n3. **Unpack**: Extract the PPTX into an editable XML tree using Python's `zipfile` module. Pretty-print the XML for readability.\n\n4. **Build presentation** (do this yourself, not with subagents):\n   - Delete unwanted slides (remove from `<p:sldIdLst>`)\n   - Duplicate slides you want to reuse (copy slide XML, relationships, and update `Content_Types.xml` and `presentation.xml`)\n   - Reorder slides in `<p:sldIdLst>`\n   - **Complete all structural changes before step 5**\n\n5. **Edit content**: Update text in each `slide{N}.xml`.\n   **Use subagents here if available** — slides are separate XML files, so subagents can edit in parallel.\n\n6. **Clean**: Remove orphaned files — slides not in `<p:sldIdLst>`, unreferenced media, orphaned rels.\n\n7. **Pack**: Repack the XML tree into a PPTX file. Validate, repair, condense XML, re-encode smart quotes.\n\n   Always write to `/tmp/` first, then copy to the final path. Python's `zipfile` module uses `seek` internally, which fails on some volume mounts (e.g. Docker bind mounts). Writing to a local temp path avoids this.\n\n## Output Structure\n\nCopy the user-provided file to `template.pptx` in cwd. This preserves the original and gives a predictable name for all downstream operations.\n\n```bash\ncp /path/to/user-provided.pptx template.pptx\n```\n\n```text\n./\n├── template.pptx               # Copy of user-provided file (never modified)\n├── template.md                 # markitdown extraction\n├── unpacked/                   # Editable XML tree\n└── edited.pptx                 # Final repacked deck\n```\n\nMinimum expected deliverable: `edited.pptx`.\n\n## Slide Operations\n\nSlide order is in `ppt/presentation.xml` -> `<p:sldIdLst>`.\n\n**Reorder**: Rearrange `<p:sldId>` elements.\n\n**Delete**: Remove `<p:sldId>`, then clean orphaned files.\n\n**Add**: Copy the source slide's XML file, its `.rels` file, and update `Content_Types.xml` and `presentation.xml`. Never manually copy slide files without updating all references — this causes broken notes references and missing relat"},{"path":"references/pitfalls.md","content":"# QA Process & Common Pitfalls\n\n## QA Process\n\n**Assume there are problems. Your job is to find them.**\n\nYour first render is almost never correct. Approach QA as a bug hunt, not a confirmation step. If you found zero issues on first inspection, you weren't looking hard enough.\n\n### Content QA\n\n```bash\npython -m markitdown output.pptx\n```\n\nCheck for missing content, typos, wrong order.\n\n**Check for leftover placeholder text:**\n\n```bash\npython -m markitdown output.pptx | grep -iE \"xxxx|lorem|ipsum|placeholder|this.*(page|slide).*layout\"\n```\n\nIf grep returns results, fix them before declaring success.\n\n### Verification Loop\n\n1. Generate slides -> Extract text with `python -m markitdown output.pptx` -> Review content\n2. **List issues found** (if none found, look again more critically)\n3. Fix issues\n4. **Re-verify affected slides** — one fix often creates another problem\n5. Repeat until a full pass reveals no new issues\n\n**Do not declare success until you've completed at least one fix-and-verify cycle.**\n\n### Per-Slide QA (for from-scratch creation)\n\n```bash\npython -m markitdown slide-XX-preview.pptx\n```\n\nCheck for missing content, placeholder text, missing page number badge.\n\n---\n\n## Common Mistakes to Avoid\n\n- **Don't repeat the same layout** — vary columns, cards, and callouts across slides\n- **Don't center body text** — left-align paragraphs and lists; center only titles\n- **Don't skimp on size contrast** — titles need 36pt+ to stand out from 14-16pt body\n- **Don't default to blue** — pick colors that reflect the specific topic\n- **Don't mix spacing randomly** — choose 0.3\" or 0.5\" gaps and use consistently\n- **Don't style one slide and leave the rest plain** — commit fully or keep it simple throughout\n- **Don't create text-only slides** — add images, icons, charts, or visual elements; avoid plain title + bullets\n- **Don't forget text box padding** — when aligning lines or shapes with text edges, set `margin: 0` on the text box or offset the shape to account for padding\n- **Don't use low-contrast elements** — icons AND text need strong contrast against the background\n- **NEVER use accent lines under titles** — these are a hallmark of AI-generated slides; use whitespace or background color instead\n- **NEVER use \"#\" with hex colors** — causes file corruption in PptxGenJS\n- **NEVER encode opacity in hex strings** — use the `opacity` property instead\n- **NEVER use async/await in createSlide()** — compile.js won't await\n- **NEVER reuse option objects across PptxGenJS calls** — PptxGenJS mutates objects in-place\n\n---\n\n## Critical Pitfalls — PptxGenJS\n\n### NEVER use async/await in createSlide()\n\n```javascript\n// WRONG - compile.js won't await\nasync function createSlide(pres, theme) { ... }\n\n// CORRECT\nfunction createSlide(pres, theme) { ... }\n```\n\n### NEVER use \"#\" with hex colors\n\n```javascript\ncolor: \"FF0000\"      // CORRECT\ncolor: \"#FF0000\"     // CORRUPTS FILE\n```\n\n### NEVER encode opacity in hex strings\n\n```javascript\nshadow: { color: \"00000020\" } "}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Generate, edit, and read PowerPoint presentations. Create from scratch with PptxGenJS (cover, TOC, content, section divider, summary slides), edit existing P... Skill: Pptx Generator Owner: fusuvae-art Summary: Generate, edit, and read PowerPoint presentations. Create from scratch with PptxGenJS (cover, TOC, content, section divider, summary slides), edit existing P... Tags: latest:1.0.0 Version history: v1.0.0 | 2026-04-16T02:33:57.763Z | auto - Initial release of the pptx-generator skill. - Supports generating, editing, and reading PowerPoint presentations. - Create presen","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1394,"uniquenessScore":52,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T11:17:39.427Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T11:17:39.427Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T14:17:08.110Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}