Skill: mr-q526/ppt-maker-skill (version 1.0.0)

--- name: ppt-maker description: 根据一句话主题、Markdown 或已有文稿生成结构化 PPT，并支持自然语言修改页面与组件后导出为可编辑 PPT。适用于需要生成大纲、创建逐页布局、维护 deck.json、渲染 HTML 预览和导出 .pptx 的场景。 metadata: { "openclaw": { "emoji": "📊", "requires": { "bins": ["node"] }, "platforms": ["macos", "linux", "windows"], "install": [ { "id": "node-brew", "kind": "brew", "formula": "node", "bins": ["node"], "label": "Install Node.js (brew)", }, ], }, } --- # PPT Maker 本技能用于构建和编辑结构化 PPT，而不是将任意 HTML 强行转换成 PowerPoint。 核心工作流是： `用户输入 -> 创建项目文件夹 -> AI 生成 deck.json -> 预览渲染 -> 自然语言编辑 -> 导出 .pptx` ## ClawHub 版本说明 - 发布包默认不包含 `node_modules`、历史 `projects/`、示例导出文件、用户素材和本地虚拟环境。 - 首次使用先进入 `{baseDir}` 安装依赖；参考素材请放进 `{baseDir}/materials/`。 ```bash cd {baseDir} npm install ``` 当前系统新增了三层组织能力： - `template`：控制整体视觉风格和推荐版式 - `archetype`：控制某类 PPT 的默认结构和起稿页序 - `subskills/`：为个人介绍、项目介绍等具体方向提供更窄的 workflow ## 何时使用 当用户提出以下需求时使用本技能： - 根据一句话主题生成 PPT 大纲与页面 - 根据一段原文或 Markdown 生成演示文稿 - 修改某一页的标题、正文、配图、布局、主题或组件位置 - 为页面或组件增加分步出现动画，并预览动画节奏 - 预览 PPT 页面效果 - 用 skill 自带 viewer 预览指定项目，并查看页内区块信息 - 导出可编辑的 `.pptx` ## 核心原则 - **子技能优先（Subskill First）**：在开始创建任何 PPT 前，必须先查看 `subskills/` 目录下（或通过 `scripts/list_catalog.js`）是否已有为该场景定制的专属子技能。如果存在对应的子技能（如 `english-lesson`、`personal-intro`），**必须优先阅读并严格遵循该子技能 `SKILL.md` 中的专属规范与工作流**，绝不能用当前的通用兜底流程硬做。 - 不要让 AI 直接输出任意 HTML 页面作为最终真相来源 - 所有页面内容都必须落到 `deck.json` 的结构化组件模型里 - 预览与导出必须读取同一份 `deck.json` - 默认优先保证可编辑性，复杂页面再考虑保真兜底 - 动画优先用结构化 `animation` 字段描述；HTML 预览真实播放，PPT 导出默认用 build slides 模拟 ## 目录导航 - `references/slide-schema.md` 定义 `deck.json` 的结构与当前支持的组件。 - `references/layout-rules.md` 定义版式、字号、间距和溢出控制规则。 - `references/template-catalog.md` 定义当前模板、archetype 和版式变体目录。 - `references/prompt-patterns.md` 定义大纲生成、页面生成、编辑指令改写的提示词模式。 - `scripts/list_catalog.js` 列出模板、archetype、版式变体和已存在的子 skill。 - `scripts/create_ppt_skill.js` 根据新场景脚手架出新的 PPT 子 skill 和 archetype。**注：AI 执行此操作时，须遵循 `.agents/workflows/create-subskill.md` 中定义的交互访谈流程。** - `scripts/validate_deck.js` 校验 deck 数据是否合法。 - `scripts/init_project.js` 为每个新 PPT 创建独立项目文件夹，并支持选择 template 和 archetype。 - `scripts/build_project.js` 在项目目录里一键校验和预览。加 `--export` 导出 `.pptx`。 - `scripts/open_project_preview.js` 为指定项目生成并打开 viewer 风格的 `preview.html`。加 `--export` 同时导出。 - `scripts/render_preview.js` 生成简洁的 viewer 预览页面，左侧为页列表，右侧为自动缩放的 slide 展示。 - `scripts/export_ppt.js` 单独导出 `.pptx`，文件名与项目目录名一致（如 `lesson-23-24.pptx`）。 - `scripts/list_materials.js` 列出 `materials/` 目录下的参考素材文件。 - `scripts/apply_edit.js` 根据结构化编辑指令更新 deck。 - `scripts/plan_edit.js` 将自然语言修改命令翻译为结构化 operations。 - `scripts/edit_with_command.js` 一步完成“自然语言指令 -> deck 修改”。 - `subskills/personal-intro` 面向个人介绍类 PPT 的子 skill。 - `subskills/project-intro` 面向项目介绍类 PPT 的子 skill。 - `subskills/english-lesson` 面向英语课堂教学 PPT 的子 skill（10 分钟课堂结构）。 - `materials/` 存放用户上传的参考素材（教材 PDF、文稿、图片等），AI 从中提取内容生成 PPT。 ## 推荐工作流 1. **预检（关键！）**：如果用户要求做特定场景的 PPT，在创建之前，**必须先阅读 `subskills/` 目录或执行 `node {baseDir}/scripts/list_catalog.js` 检查是否有现成的专属子技能**（例如用户要做英语备课，务必走 `english-lesson` 子技能的流程）。若存在，必须切换并遵守该子技能的 `SKILL.md` 或规范进行交付；若不存在，才适用当前的兜底通用流程。 2. 先创建独立项目目录，路径位于 `{baseDir}/projects/<slug>/`，并选择合适的 template / archetype。 3. 阅读 `references/slide-schema.md`，确认当前支持哪些页面和组件。 4. 如有参考素材，放入 `{baseDir}/materials/` 目录。可用 `node {baseDir}/scripts/list_materials.js` 查看。 5. 根据用户输入在该项目目录里生成 `deck.json`。 6. 运行 `node {baseDir}/scripts/build_project.js {baseDir}/projects/<slug>` 校验和预览。 7. 需要查看页面时，使用 `node {baseDir}/scripts/open_project_preview.js {baseDir}/projects/<slug>` 打开项目 viewer。 8. 根据用户反馈继续修改该项目目录里的 `deck.json`。 9. 用户确认后，加 `--export` 导出 `.pptx`（文件名与项目名一致）。 10. 后续所有预览、编辑和导出都在同一项目文件夹内完成。 ## 命令示例 在本技能目录下运行： ```bash cd {baseDir} npm install npm run project:new npm run validate npm run preview npm run export npm run catalog node scripts/list_materials.js node scripts/build_project.js projects/lesson-23-24 node scripts/build_project.js projects/lesson-23-24 --export node scripts/open_project_preview.js projects/lesson-23-24 node scripts/init_project.js openclaw-intro "OpenClaw 介绍" node scripts/init_project.js founder-profile "创始人介绍" --template profile-editorial --archetype personal-intro node scripts/create_ppt_skill.js customer-story "客户案例介绍" "适合客户案例复盘、售前演示和项目展示" ``` ## deck 生成要求 - 每个 slide 必须有稳定的 `id` - 每个 component 必须有稳定的 `id` - deck 建议同时带上 `meta.template` 和 `meta.archetype` - 所有组件必须显式给出 `x`, `y`, `w`, `h` - 坐标单位统一使用英寸，对齐 PowerPoint 宽屏页面 - 文本内容要控制长度，避免超出布局预算 - 如需动画，优先给组件增加 `animation.effect` 和 `animation.build` ## 自然语言编辑要求 当用户说“改第三页标题”或“把右上角图片放大一点”时： - 先定位 slide - 再定位 component - 然后修改 `deck.json` - 不要直接只改预览 HTML 对于常见的命令式编辑，优先走： 1. `scripts/plan_edit.js` 生成 operations 2. `scripts/apply_edit.js` 或 `scripts/edit_with_command.js` 应用修改 复杂页面如需保真导出，可以在后续扩展中增加整页位图模式，但默认先保持可编辑对象导出。 ## Viewer 约定 - 左侧固定展示 slide 列表与缩略页 - 右侧顶部精简工具栏：页码芯片 + 页面名称 + 导航按钮 - slide 画布自动缩放适配窗口大小（scale-to-fit） - 悬停组件时显示 tooltip（名称 + 类型） - 点击组件后自动复制识别信息，方便告诉 AI 修改。 ## 模板与子 skill 约定 - `template` 负责视觉风格和推荐页型变体，不直接替代 theme - `archetype` 负责某类 PPT 的默认起稿结构 - `subskills/` 里的子 skill 应该只保留对应场景的简洁 workflow，不复制主技能的大量通用说明 - 新建场景优先用 `scripts/create_ppt_skill.js`，同时生成一个新的 archetype 脚手架 ## 动画说明 - 预览层支持 `fade-in`、`slide-up`、`zoom-in` - 导出层默认不依赖 PowerPoint 原生对象动画 - 如组件设置了 `animation.build`，导出时会按 build 顺序展开成多张连续幻灯片

path: package-lock.json
content: {
  "name": "ppt-maker",
  "version": "0.1.0",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {
    "": {
      "name": "ppt-maker",
      "version": "0.1.0",
      "dependencies": {
        "ajv": "^8.17.1",
        "pptxgenjs": "^4.0.1"
      }
    },
    "node_modules/@types/node": {
      "version": "22.19.15",
      "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.19.15.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "undici-types": "~6.21.0"
      }
    },
    "node_modules/ajv": {
      "version": "8.18.0",
      "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.18.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "fast-deep-equal": "^3.1.3",
        "fast-uri": "^3.0.1",
        "json-schema-traverse": "^1.0.0",
        "require-from-string": "^2.0.2"
      },
      "funding": {
        "type": "github",
        "url": "https://github.com/sponsors/epoberezkin"
      }
    },
    "node_modules/core-util-is": {
      "version": "1.0.3",
      "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/fast-deep-equal": {
      "version": "3.1.3",
      "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/fast-uri": {
      "version": "3.1.0",
      "resolved": "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "funding": [
        {
          "type": "github",
          "url": "https://github.com/sponsors/fastify"
        },
        {
          "type": "opencollective",
          "url": "https://opencollective.com/fastify"
        }
      ],
      "license": "BSD-3-Clause"
    },
    "node_modules/https": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/https/-/https-1.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "ISC"
    },
    "node_modules/image-size": {
      "version": "1.2.1",
      "resolved": "https://registry.npmmirror.com/image-size/-/image-size-1.2.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "queue": "6.0.2"
      },
      "bin": {
        "image-size": "bin/image-size.js"
      },
      "engines": {
        "node": ">=16.x"
      }
    },
    "node_modules/immediate": {
      "version": "3.0.6",
      "resolved": "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/inherits": {
      "version": "2.0.4",
      "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "ISC"
    },
    "node_modules/isarray": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/json-schema-traverse": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/jszip": {
      "version": "3.10.1",
      "resolved": "https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "(MIT OR GPL-3.0-or-later)",
      "dependencies": {
        "lie": "~3.3.0",
        "pako": "~1.0.2",
        "readable-stream": "~2.3.6",
        "setimmediate": "^1.0.5"
      }
    },
    "node_modules/lie": {
      "version": "3.3.0",
      "resolved": "https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "immediate": "~3.0.5"
      }
    },
    "node_modules/pako": {
      "version": "1.0.11",
      "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "(MIT AND Zlib)"
    },
    "node_modules/pptxgenjs": {
      "version": "4.0.1",
      "resolved": "https://registry.npmmirror.com/pptxgenjs/-/pptxgenjs-4.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "@types/node": "^22.8.1",
        "https": "^1.0.0",
        "image-size": "^1.2.1",
        "jszip": "^3.10.1"
      }
    },
    "node_modules/process-nextick-args": {
      "version": "2.0.1",
      "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/queue": {
      "version": "6.0.2",
      "resolved": "https://registry.npmmirror.com/queue/-/queue-6.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "inherits": "~2.0.3"
      }
    },
    "node_modules/readable-stream": {
      "version": "2.3.8",
      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "core-util-is": "~1.0.0",
        "inherits": "~2.0.3",
        "isarray": "~1.0.0",
        "process-nextick-args": "~2.0.0",
        "safe-buffer": "~5.1.1",
        "string_decoder": "~1.1.1",
        "util-deprecate": "~1.0.1"
      }
    },
    "node_modules/require-from-string": {
      "version": "2.0.2",
      "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/safe-buffer": {
      "version": "5.1.2",
      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/setimmediate": {
      "version": "1.0.5",
      "resolved": "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/string_decoder": {
      "version": "1.1.1",
      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "safe-buffer": "~5.1.0"
      }
    },
    "node_modules/undici-types": {
      "version": "6.21.0",
      "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/util-deprecate": {
      "version": "1.0.2",
      "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    }
  }
}


path: package.json
content: {
  "name": "ppt-maker",
  "version": "0.1.0",
  "private": true,
  "description": "Local toolchain for deck.json to preview HTML and PPTX export.",
  "type": "commonjs",
  "scripts": {
    "validate": "node scripts/validate_deck.js samples/example-deck.json",
    "preview": "node scripts/render_preview.js samples/example-deck.json outputs/example-preview.html",
    "export": "node scripts/export_ppt.js samples/example-deck.json outputs/example-output.pptx",
    "edit": "node scripts/apply_edit.js samples/example-deck.json samples/example-edits.json outputs/example-edited-deck.json",
    "plan:command": "node scripts/plan_edit.js samples/example-deck.json \"把第二页右侧正文左移一点\" outputs/example-command-plan.json",
    "command": "node scripts/edit_with_command.js samples/example-deck.json \"把第二页右侧正文左移一点\" outputs/example-command-deck.json outputs/example-command-plan.json",
    "project:new": "node scripts/init_project.js demo-project \"Demo Project\"",
    "project:build": "node scripts/build_project.js projects/demo-project",
    "project:open": "node scripts/open_project_preview.js projects/demo-project",
    "catalog": "node scripts/list_catalog.js",
    "skill:new": "node scripts/create_ppt_skill.js demo-scene \"Demo Scene\""
  },
  "dependencies": {
    "ajv": "^8.17.1",
    "pptxgenjs": "^4.0.1"
  }
}


path: assets/themes/executive-dark.json
content: name: executive-dark
fontFamilySans: Aptos
fontFamilyDisplay: Aptos Display
backgroundColor: #0F172A
surfaceColor: #111827
textColor: #F8FAFC
mutedTextColor: #CBD5E1
accentColor: #60A5FA
dividerColor: #334155

path: assets/themes/business-clean.json
content: name: business-clean
fontFamilySans: Aptos
fontFamilyDisplay: Aptos Display
backgroundColor: #F8FAFC
surfaceColor: #FFFFFF
textColor: #0F172A
mutedTextColor: #475569
accentColor: #1D4ED8
dividerColor: #CBD5E1

path: assets/themes/editorial-warm.json
content: name: editorial-warm
fontFamilySans: Georgia
fontFamilyDisplay: Georgia
backgroundColor: #FCF7F0
surfaceColor: #FFFDF9
textColor: #2B2118
mutedTextColor: #6B5C4F
accentColor: #B45309
dividerColor: #E7D8C5

path: assets/themes/openclaw-signal.json
content: name: openclaw-signal
fontFamilySans: Aptos
fontFamilyDisplay: Aptos Display
backgroundColor: #07111F
surfaceColor: #0B172A
textColor: #E6F0FF
mutedTextColor: #9BB4D1
accentColor: #39C6FF
dividerColor: #18314C

path: assets/preview/placeholder-graphic.svg
content: <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 600" fill="none">
  <rect width="800" height="600" rx="36" fill="#DBEAFE"/>
  <rect x="64" y="72" width="672" height="456" rx="28" fill="#EFF6FF"/>
  <circle cx="200" cy="192" r="68" fill="#93C5FD"/>
  <rect x="320" y="138" width="280" height="40" rx="20" fill="#2563EB"/>
  <rect x="320" y="204" width="192" height="24" rx="12" fill="#60A5FA"/>
  <rect x="120" y="328" width="560" height="28" rx="14" fill="#BFDBFE"/>
  <rect x="120" y="380" width="500" height="28" rx="14" fill="#BFDBFE"/>
  <rect x="120" y="432" width="430" height="28" rx="14" fill="#BFDBFE"/>
</svg>



path: assets/preview/base.css
content: * {
  box-sizing: border-box;
}

html,
body {
  min-height: 100%;
}

body {
  margin: 0;
  color: var(--color-text);
  font-family: var(--font-family-sans), sans-serif;
  background:
    radial-gradient(circle at top left, rgba(56, 189, 248, 0.16), transparent 28%),
    radial-gradient(circle at top right, rgba(96, 165, 250, 0.12), transparent 30%),
    #0f172a;
}

button,
input,
textarea,
select {
  font: inherit;
}

.viewer-app {
  min-height: 100vh;
  display: grid;
  grid-template-columns: 320px minmax(0, 1fr);
}

.viewer-sidebar {
  position: sticky;
  top: 0;
  height: 100vh;
  padding: 24px 18px 18px;
  display: flex;
  flex-direction: column;
  gap: 18px;
  color: #dbe7f4;
  background: rgba(15, 23, 42, 0.92);
  border-right: 1px solid rgba(148, 163, 184, 0.18);
  backdrop-filter: blur(18px);
}

.viewer-brand h1 {
  margin: 8px 0 0;
  font-family: var(--font-family-display), sans-serif;
  font-size: 28px;
  line-height: 1.05;
}

.viewer-kicker {
  margin: 0;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: #7dd3fc;
}

.viewer-subtitle {
  margin: 10px 0 0;
  color: #94a3b8;
  line-height: 1.5;
}

.viewer-project-note {
  margin: 10px 0 0;
  color: #cbd5e1;
  line-height: 1.6;
}

.viewer-sidebar-cards {
  display: grid;
  gap: 12px;
}

.sidebar-card {
  display: grid;
  gap: 6px;
  padding: 14px 16px;
  border-radius: 18px;
  background: rgba(30, 41, 59, 0.82);
  border: 1px solid rgba(148, 163, 184, 0.14);
}

.sidebar-card strong {
  color: #f8fafc;
}

.sidebar-card span {
  color: #cbd5e1;
}

.sidebar-card-label {
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: #7dd3fc;
}

.slide-nav {
  min-height: 0;
  overflow: auto;
  display: grid;
  gap: 14px;
  padding-right: 6px;
}

.slide-nav-item {
  width: 100%;
  border: 1px solid rgba(148, 163, 184, 0.16);
  border-radius: 20px;
  background: rgba(30, 41, 59, 0.7);
  color: inherit;
  padding: 14px;
  display: grid;
  gap: 12px;
  text-align: left;
  cursor: pointer;
  transition: transform 180ms ease, border-color 180ms ease, background 180ms ease;
}

.slide-nav-item:hover {
  transform: translateY(-2px);
  border-color: rgba(56, 189, 248, 0.4);
  background: rgba(30, 41, 59, 0.92);
}

.slide-nav-item.is-active {
  border-color: rgba(56, 189, 248, 0.72);
  background: rgba(15, 118, 110, 0.16);
  box-shadow: 0 18px 30px rgba(15, 23, 42, 0.24);
}

.slide-nav-meta {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: 10px 12px;
  align-items: start;
}

.slide-nav-number {
  width: 34px;
  height: 34px;
  display: grid;
  place-items: center;
  border-radius: 12px;
  font-weight: 700;
  color: #f8fafc;
  background: rgba(14, 116, 144, 0.4);
}

.slide-nav-copy {
  min-width: 0;
  display: grid;
  gap: 3px;
}

.slide-nav-copy strong {
  color: #f8fafc;
}

.slide-nav-copy span {
  color: #94a3b8;
  font-size: 13px;
}

.slide-nav-counts {
  grid-column: 1 / -1;
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.slide-nav-counts span {
  padding: 5px 8px;
  border-radius: 999px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: #cbd5e1;
  background: rgba(15, 23, 42, 0.5);
}

.slide-nav-thumb {
  border-radius: 16px;
  overflow: hidden;
  border: 1px solid rgba(148, 163, 184, 0.18);
  background: rgba(15, 23, 42, 0.92);
}

.slide-nav-thumb-scale {
  width: calc(var(--deck-width) * var(--thumb-scale));
  height: calc(var(--deck-height) * var(--thumb-scale));
  overflow: hidden;
}

.slide--thumbnail {
  transform: scale(var(--thumb-scale));
  transform-origin: top left;
  box-shadow: none;
  border-radius: 0;
}

.slide--thumbnail .component {
  pointer-events: none !important;
}

.viewer-main {
  min-width: 0;
  padding: 24px;
  display: flex;
  flex-direction: column;
  gap: 18px;
}

.viewer-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 10px 16px;
  border-radius: 16px;
  background: rgba(255, 255, 255, 0.88);
  border: 1px solid rgba(148, 163, 184, 0.22);
  box-shadow: 0 8px 24px rgba(15, 23, 42, 0.1);
  backdrop-filter: blur(16px);
  flex-shrink: 0;
}

.viewer-toolbar-left {
  display: flex;
  align-items: center;
  gap: 12px;
  min-width: 0;
}

.viewer-slide-name {
  font-size: 15px;
  font-weight: 600;
  color: #0f172a;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.viewer-page-chip {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 5px 10px;
  border-radius: 999px;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.04em;
  background: #082f49;
  color: #f0f9ff;
}


.viewer-toolbar-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}

.viewer-action {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 1px solid rgba(15, 23, 42, 0.12);
  border-radius: 999px;
  background: #ffffff;
  color: #0f172a;
  padding: 10px 16px;
  font-weight: 700;
  cursor: pointer;
  text-decoration: none;
}

.viewer-action:disabled {
  opacity: 0.45;
  cursor: not-allowed;
}

.viewer-action--primary {
  background: #0f172a;
  color: #f8fafc;
}

.viewer-stage-wrap {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
}

.viewer-stage-frame {
  flex: 1;
  min-height: 0;
  overflow: hidden;
  display: flex;
  justify-content: center;
  align-items: flex-start;
  padding: 22px;
  border-radius: 28px;
  background: rgba(248, 250, 252, 0.54);
  border: 1px solid rgba(148, 163, 184, 0.18);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.55);
}

.stage-slide {
  display: none;
}

.stage-slide.is-active {
  display: flex;
  justify-content: center;
  align-items: flex-start;
}


.slide {
  width: var(--deck-width);
  height: var(--deck-height);
  margin: 0;
  background: var(--color-background);
  border-radius: 20px;
  box-shadow: 0 24px 48px rgba(15, 23, 42, 0.16);
  overflow: hidden;
}

.slide-canvas {
  position: relative;
  width: 100%;
  height: 100%;
  background: var(--color-background);
}

.component {
  position: absolute;
}

.component.is-inspectable {
  cursor: crosshair;
}

.component.is-hovered,
.component.is-selected {
  outline: 3px solid rgba(56, 189, 248, 0.96);
  outline-offset: 3px;
}

.component.is-selected {
  outline-color: rgba(34, 197, 94, 0.98);
}

.component.is-passive[data-noninteractive="true"] {
  pointer-events: none;
}

.component.is-build-hidden {
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
}

.js-ready .slide[data-has-animation="true"] .component.has-animation {
  opacity: 0;
}

.js-ready .slide.is-replaying .component.has-animation {
  animation-duration: var(--anim-duration, 640ms);
  animation-delay: var(--anim-delay, 0ms);
  animation-fill-mode: both;
  animation-timing-function: var(--anim-easing, cubic-bezier(0.2, 0.8, 0.2, 1));
}

.js-ready .slide.is-replaying .component.has-animation[data-anim-effect="fade-in"] {
  animation-name: preview-fade-in;
}

.js-ready .slide.is-replaying .component.has-animation[data-anim-effect="slide-up"] {
  animation-name: preview-slide-up;
}

.js-ready .slide.is-replaying .component.has-animation[data-anim-effect="zoom-in"] {
  animation-name: preview-zoom-in;
}

.title {
  font-family: var(--font-family-display), sans-serif;
  font-size: 30px;
  font-weight: 700;
  white-space: pre-wrap;
}

.subtitle {
  color: var(--color-muted);
  font-size: 18px;
  white-space: pre-wrap;
}

.text {
  font-size: 18px;
  line-height: 1.5;
  white-space: pre-wrap;
}

.bullet-list ul {
  margin: 0;
  padding-left: 24px;
}

.bullet-list li {
  margin: 0 0 10px;
}

.divider {
  background: var(--color-divider);
}

.image {
  object-fit: cover;
  object-position: center center;
  border-radius: 20px;
  background: rgba(15, 23, 42, 0.08);
}

.quote-block {
  margin: 0;
  padding: 18px 22px;
  background: rgba(255, 255, 255, 0.72);
  border-left: 4px solid var(--color-accent);
  border-radius: 16px;
  font-size: 20px;
  line-height: 1.5;
}

.shape {
  background: var(--color-surface);
}

.table table {
  width: 100%;
  height: 100%;
  border-collapse: collapse;
  background: rgba(255, 255, 255, 0.86);
  overflow: hidden;
  border-radius: 16px;
}

.table th,
.table td {
  border: 1px solid var(--color-divider);
  padding: 10px 12px;
  text-align: left;
}

.table th {
  background: rgba(29, 78, 216, 0.08);
}

.chart {
  display: flex;
  flex-direction: column;
  gap: 16px;
  padding: 16px 18px;
  border-radius: 18px;
  background: rgba(255, 255, 255, 0.86);
}

.chart-title {
  font-size: 18px;
  font-weight: 700;
}

.chart-bars {
  flex: 1;
  display: flex;
  align-items: end;
  gap: 14px;
}

.chart-bar-group {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
  height: 100%;
}

.chart-bar {
  width: 100%;
  min-height: 12px;
  border-radius: 10px 10px 0 0;
}

.chart-label {
  font-size: 12px;
  color: var(--color-muted);
}

.unsupported {
  display: grid;
  place-items: center;
  color: #b91c1c;
  border: 1px dashed #fecaca;
  background: #fff1f2;
}

.component-tooltip {
  position: fixed;
  z-index: 80;
  display: grid;
  gap: 4px;
  max-width: 320px;
  padding: 10px 12px;
  border-radius: 14px;
  background: rgba(15, 23, 42, 0.94);
  color: #f8fafc;
  box-shadow: 0 18px 40px rgba(15, 23, 42, 0.28);
  pointer-events: none;
}

.component-tooltip strong {
  font-size: 13px;
}

.component-tooltip span {
  color: #cbd5e1;
  font-size: 12px;
}

.copy-toast {
  position: fixed;
  right: 26px;
  bottom: 26px;
  z-index: 90;
  padding: 12px 16px;
  border-radius: 14px;
  background: rgba(15, 23, 42, 0.94);
  color: #f8fafc;
  box-shadow: 0 18px 40px rgba(15, 23, 42, 0.28);
}

.copy-toast.is-visible {
  opacity: 1;
}

@keyframes preview-fade-in {
  from {
    opacity: 0;
  }

  to {
    opacity: 1;
  }
}

@keyframes preview-slide-up {
  from {
    opacity: 0;
    transform: translate3d(0, 26px, 0);
  }

  to {
    opacity: 1;
    transform: translate3d(0, 0, 0);
  }
}

@keyframes preview-zoom-in {
  from {
    opacity: 0;
    transform: scale(0.94);
  }

  to {
    opacity: 1;
    transform: scale(1);
  }
}

@media (max-width: 1480px) {
  .viewer-app {
    grid-template-columns: 260px minmax(0, 1fr);
  }
}

@media (max-width: 1200px) {
  .viewer-app {
    grid-template-columns: 1fr;
  }

  .viewer-sidebar {
    position: static;
    height: auto;
    border-right: 0;
    border-bottom: 1px solid rgba(148, 163, 184, 0.18);
  }

  .slide-nav {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (max-width: 820px) {
  .viewer-main {
    padding: 16px;
  }

  .slide-nav {
    grid-template-columns: 1fr;
  }

  .viewer-toolbar {
    flex-direction: column;
  }

  .viewer-stage-frame {
    padding: 12px;
  }
}


path: assets/templates/business-briefing.json
content: {
  "id": "business-briefing",
  "label": "商务汇报",
  "description": "适合项目介绍、方案汇报、管理层沟通和经营汇总。",
  "theme": "business-clean",
  "layoutVariants": {
    "cover": "hero-left",
    "agenda": "agenda-columns",
    "section": "contrast-band",
    "title-bullets": "evidence-split",
    "two-column": "narrative-split",
    "image-text": "media-right-focus",
    "comparison": "card-contrast",
    "timeline": "milestone-ribbon",
    "table": "executive-grid",
    "chart": "headline-data",
    "quote": "pull-quote"
  }
}


path: assets/templates/profile-editorial.json
content: {
  "id": "profile-editorial",
  "label": "人物杂志风",
  "description": "适合个人介绍、嘉宾简介、作品集和创作者档案。",
  "theme": "editorial-warm",
  "layoutVariants": {
    "cover": "editorial-cover",
    "agenda": "story-map",
    "section": "chapter-break",
    "title-bullets": "portrait-notes",
    "two-column": "profile-split",
    "image-text": "caption-photo",
    "comparison": "before-after-cards",
    "timeline": "career-strip",
    "table": "folio-grid",
    "chart": "narrative-chart",
    "quote": "signature-quote"
  }
}


path: assets/templates/launch-stage.json
content: {
  "id": "launch-stage",
  "label": "发布会风",
  "description": "适合产品发布、功能亮点展示、品牌叙事和产品介绍。",
  "theme": "openclaw-signal",
  "layoutVariants": {
    "cover": "hero-right",
    "agenda": "agenda-cards",
    "section": "statement-break",
    "title-bullets": "headline-plus-visual",
    "two-column": "spotlight-split",
    "image-text": "immersive-figure",
    "comparison": "statement-versus",
    "timeline": "step-cards",
    "table": "minimal-grid",
    "chart": "spotlight-chart",
    "quote": "manifesto-quote"
  }
}


path: assets/layouts/library.json
content: {
  "slideTypes": {
    "cover": [
      {
        "id": "hero-left",
        "label": "左文右图",
        "description": "标题和副标题在左，右侧放主视觉或产品图。"
      },
      {
        "id": "hero-right",
        "label": "右文左图",
        "description": "更适合产品发布或截图展示。"
      },
      {
        "id": "editorial-cover",
        "label": "杂志封面",
        "description": "大标题压图，适合个人介绍或品牌故事。"
      }
    ],
    "agenda": [
      {
        "id": "agenda-columns",
        "label": "双列目录",
        "description": "适合标准汇报结构。"
      },
      {
        "id": "agenda-cards",
        "label": "卡片目录",
        "description": "更偏发布会或产品展示。"
      },
      {
        "id": "story-map",
        "label": "叙事地图",
        "description": "用阶段或主题组织内容。"
      }
    ],
    "section": [
      {
        "id": "contrast-band",
        "label": "对比章节页",
        "description": "强调章节转场和主题切换。"
      },
      {
        "id": "statement-break",
        "label": "观点章节页",
        "description": "适合用一句强结论承接后文。"
      },
      {
        "id": "chapter-break",
        "label": "章节扉页",
        "description": "适合人物/故事型文稿。"
      }
    ],
    "title-bullets": [
      {
        "id": "evidence-split",
        "label": "标题证据分栏",
        "description": "上方标题，下方左侧观点右侧证据。"
      },
      {
        "id": "headline-plus-visual",
        "label": "标题加主视觉",
        "description": "减少文字，放大视觉表达。"
      },
      {
        "id": "portrait-notes",
        "label": "人物注释页",
        "description": "更适合个人介绍和优势总结。"
      }
    ],
    "two-column": [
      {
        "id": "narrative-split",
        "label": "叙事双栏",
        "description": "左文字右图片或图表。"
      },
      {
        "id": "spotlight-split",
        "label": "聚焦双栏",
        "description": "更适合产品截图和功能亮点。"
      },
      {
        "id": "profile-split",
        "label": "人物双栏",
        "description": "左人物信息右案例或头像。"
      }
    ],
    "image-text": [
      {
        "id": "media-right-focus",
        "label": "右图说明",
        "description": "常规说明图文结构。"
      },
      {
        "id": "immersive-figure",
        "label": "沉浸式图文",
        "description": "大图优先，文字做注释。"
      },
      {
        "id": "caption-photo",
        "label": "图片说明页",
        "description": "适合作品集和人物介绍。"
      }
    ],
    "comparison": [
      {
        "id": "card-contrast",
        "label": "卡片对比",
        "description": "适合优势、方案、前后差异对比。"
      },
      {
        "id": "statement-versus",
        "label": "观点对照",
        "description": "适合发布会风的强对比表达。"
      },
      {
        "id": "before-after-cards",
        "label": "前后对照卡",
        "description": "适合人物成长、项目复盘。"
      }
    ],
    "timeline": [
      {
        "id": "milestone-ribbon",
        "label": "里程碑轴",
        "description": "适合项目节点、路线图。"
      },
      {
        "id": "step-cards",
        "label": "步骤卡片",
        "description": "适合产品流程、落地步骤。"
      },
      {
        "id": "career-strip",
        "label": "经历时间线",
        "description": "适合个人履历。"
      }
    ],
    "table": [
      {
        "id": "executive-grid",
        "label": "管理层表格",
        "description": "强调清晰和可读性。"
      },
      {
        "id": "minimal-grid",
        "label": "极简表格",
        "description": "减少边框感，适合发布会风。"
      },
      {
        "id": "folio-grid",
        "label": "作品集表格",
        "description": "更柔和，适合人物/项目档案。"
      }
    ],
    "chart": [
      {
        "id": "headline-data",
        "label": "大结论图表",
        "description": "标题先给结论，图表做支撑。"
      },
      {
        "id": "spotlight-chart",
        "label": "舞台图表",
        "description": "更适合产品演讲风格。"
      },
      {
        "id": "narrative-chart",
        "label": "叙事图表",
        "description": "适合讲述成长和变化。"
      }
    ],
    "quote": [
      {
        "id": "pull-quote",
        "label": "金句页",
        "description": "适合总结观点或客户引言。"
      },
      {
        "id": "manifesto-quote",
        "label": "宣言页",
        "description": "适合发布会和品牌故事。"
      },
      {
        "id": "signature-quote",
        "label": "人物签名页",
        "description": "适合作为个人介绍结尾。"
      }
    ]
  }
}


path: assets/archetypes/customer-story.json
content: {
  "id": "customer-story",
  "label": "客户案例介绍",
  "description": "适合售前证明、客户案例和项目成效展示，强调客户场景、问题、方案、结果和客户评价。",
  "briefSections": [
    "客户行业与业务场景",
    "原始问题或业务痛点",
    "我们提供的方案与落地方式",
    "结果数据与收益",
    "客户评价或后续合作"
  ],
  "starterDeck": {
    "meta": {
      "mode": "editable"
    },
    "slides": [
      {
        "id": "slide-01",
        "label": "封面",
        "type": "cover",
        "layoutVariant": "hero-left",
        "components": [
          {
            "id": "s01-title",
            "label": "案例标题",
            "type": "title",
            "text": "{{title}}",
            "x": 0.9,
            "y": 0.95,
            "w": 6.4,
            "h": 0.8,
            "style": {
              "fontSize": 30,
              "bold": true
            }
          },
          {
            "id": "s01-subtitle",
            "label": "案例结论",
            "type": "subtitle",
            "text": "用一句话讲清这个客户案例最重要的结果或价值。",
            "x": 0.95,
            "y": 1.85,
            "w": 6.1,
            "h": 0.5,
            "style": {
              "fontSize": 17,
              "color": "#475569"
            }
          },
          {
            "id": "s01-image",
            "label": "客户场景图",
            "type": "image",
            "src": "../../assets/preview/placeholder-graphic.svg",
            "fit": "cover",
            "x": 7.7,
            "y": 1.0,
            "w": 4.35,
            "h": 4.15
          }
        ]
      },
      {
        "id": "slide-02",
        "label": "客户与挑战",
        "type": "title-bullets",
        "layoutVariant": "evidence-split",
        "components": [
          {
            "id": "s02-title",
            "label": "挑战标题",
            "type": "title",
            "text": "客户是谁，原来卡在哪里",
            "x": 0.9,
            "y": 0.75,
            "w": 6.4,
            "h": 0.7,
            "style": {
              "fontSize": 26,
              "bold": true
            }
          },
          {
            "id": "s02-bullets",
            "label": "客户挑战",
            "type": "bullet-list",
            "items": [
              "客户背景：行业、规模、核心业务场景",
              "原始痛点：效率、成本、增长或流程问题",
              "这次项目想达成的目标"
            ],
            "x": 0.95,
            "y": 1.85,
            "w": 5.3,
            "h": 3.2,
            "style": {
              "fontSize": 18
            }
          },
          {
            "id": "s02-text",
            "label": "补充背景",
            "type": "text",
            "text": "这里可以补一句客户原始状态，例如“人工流程多、响应慢、跨部门协同困难”。",
            "x": 6.95,
            "y": 1.9,
            "w": 4.2,
            "h": 1.55,
            "style": {
              "fontSize": 18,
              "color": "#334155"
            }
          }
        ]
      },
      {
        "id": "slide-03",
        "label": "方案落地",
        "type": "image-text",
        "layoutVariant": "media-right-focus",
        "components": [
          {
            "id": "s03-title",
            "label": "方案标题",
            "type": "title",
            "text": "我们如何把方案真正落到客户现场",
            "x": 0.9,
            "y": 0.75,
            "w": 7.2,
            "h": 0.7,
            "style": {
              "fontSize": 26,
              "bold": true
            }
          },
          {
            "id": "s03-bullets",
            "label": "方案要点",
            "type": "bullet-list",
            "items": [
              "方案结构：做了哪些关键动作",
              "落地路径：试点、部署、培训或集成",
              "客户侧配合：哪些环节一起完成"
            ],
            "x": 0.95,
            "y": 1.85,
            "w": 5.15,
            "h": 3.3,
            "style": {
              "fontSize": 18
            }
          },
          {
            "id": "s03-image",
            "label": "方案截图",
            "type": "image",
            "src": "../../assets/preview/placeholder-graphic.svg",
            "fit": "contain",
            "x": 7.05,
            "y": 1.55,
            "w": 4.2,
            "h": 3.8
          }
        ]
      },
      {
        "id": "slide-04",
        "label": "结果数据",
        "type": "chart",
        "layoutVariant": "headline-data",
        "components": [
          {
            "id": "s04-title",
            "label": "结果标题",
            "type": "title",
            "text": "结果不是“更好”，而是“看得见地变好”",
            "x": 0.9,
            "y": 0.75,
            "w": 8.0,
            "h": 0.7,
            "style": {
              "fontSize": 26,
              "bold": true
            }
          },
          {
            "id": "s04-chart",
            "label": "结果图表",
            "type": "chart",
            "kind": "bar",
            "text": "示例结果图，请替换为真实业务指标",
            "categories": [
              "上线前",
              "试点期",
              "稳定期"
            ],
            "series": [
              {
                "name": "核心指标",
                "values": [
                  10,
                  28,
                  46
                ]
              }
            ],
            "x": 0.95,
            "y": 1.55,
            "w": 6.3,
            "h": 4.0
          },
          {
            "id": "s04-text",
            "label": "结果说明",
            "type": "text",
            "text": "在这里补 2 到 3 条业务变化：效率提升、响应缩短、转化提高或满意度变化。",
            "x": 7.7,
            "y": 1.9,
            "w": 3.7,
            "h": 2.2,
            "style": {
              "fontSize": 17,
              "color": "#334155"
            }
          }
        ]
      },
      {
        "id": "slide-05",
        "label": "客户评价",
        "type": "quote",
        "layoutVariant": "pull-quote",
        "components": [
          {
            "id": "s05-title",
            "label": "客户评价标题",
            "type": "title",
            "text": "客户怎么评价这次合作",
            "x": 0.9,
            "y": 0.85,
            "w": 6.2,
            "h": 0.7,
            "style": {
              "fontSize": 26,
              "bold": true
            }
          },
          {
            "id": "s05-quote",
            "label": "客户原话",
            "type": "quote-block",
            "text": "这里放客户原话、关键背书或一句总结性评价。",
            "x": 1.0,
            "y": 2.05,
            "w": 10.1,
            "h": 1.6,
            "style": {
              "fontSize": 24
            }
          },
          {
            "id": "s05-text",
            "label": "复用价值",
            "type": "text",
            "text": "最后补一句这类方案对其他客户的可复制价值或下一步合作机会。",
            "x": 1.05,
            "y": 4.2,
            "w": 9.4,
            "h": 0.9,
            "style": {
              "fontSize": 18,
              "color": "#475569"
            }
          }
        ]
      }
    ]
  }
}


path: assets/archetypes/general-briefing.json
content: {
  "id": "general-briefing",
  "label": "通用汇报",
  "description": "一句话主题到完整 deck 的默认脚手架。",
  "briefSections": ["目标", "受众", "关键信息", "需要强调的数据", "希望保留的风格"],
  "starterDeck": {
    "meta": {
      "mode": "editable"
    },
    "slides": [
      {
        "id": "slide-01",
        "label": "封面",
        "type": "cover",
        "components": [
          {
            "id": "s01-title",
            "label": "封面标题",
            "role": "title-primary",
            "type": "title",
            "text": "{{title}}",
            "x": 0.9,
            "y": 0.9,
            "w": 6.2,
            "h": 0.8,
            "style": {
              "fontSize": 30,
              "bold": true,
              "color": "#0F172A"
            }
          },
          {
            "id": "s01-subtitle",
            "label": "封面副标题",
            "role": "title-secondary",
            "type": "subtitle",
            "text": "用结构化 deck 快速完成 {{archetypeLabel}}。",
            "x": 0.9,
            "y": 1.8,
            "w": 6.4,
            "h": 0.45,
            "style": {
              "fontSize": 16,
              "color": "#475569"
            }
          },
          {
            "id": "s01-visual",
            "label": "封面主视觉",
            "role": "hero-image",
            "type": "image",
            "src": "../../assets/preview/placeholder-graphic.svg",
            "fit": "contain",
            "x": 8.0,
            "y": 1.1,
            "w": 4.2,
            "h": 3.8
          }
        ]
      },
      {
        "id": "slide-02",
        "label": "目录",
        "type": "agenda",
        "components": [
          {
            "id": "s02-title",
            "label": "目录标题",
            "type": "title",
            "text": "内容结构",
            "x": 0.9,
            "y": 0.72,
            "w": 4.2,
            "h": 0.6,
            "style": {
              "fontSize": 26,
              "bold": true
            }
          },
          {
            "id": "s02-agenda",
            "label": "目录列表",
            "type": "bullet-list",
            "items": ["背景与目标", "核心内容", "数据或证据", "结论与下一步"],
            "x": 0.95,
            "y": 1.75,
            "w": 5.0,
            "h": 3.4,
            "style": {
              "fontSize": 18,
              "color": "#111827"
            }
          }
        ]
      },
      {
        "id": "slide-03",
        "label": "核心信息",
        "type": "title-bullets",
        "components": [
          {
            "id": "s03-title",
            "label": "核心信息标题",
            "type": "title",
            "text": "核心信息",
            "x": 0.9,
            "y": 0.72,
            "w": 5.6,
            "h": 0.6,
            "style": {
              "fontSize": 24,
              "bold": true
            }
          },
          {
            "id": "s03-bullets",
            "label": "核心信息列表",
            "type": "bullet-list",
            "items": ["要点 1", "要点 2", "要点 3"],
            "x": 0.95,
            "y": 1.8,
            "w": 5.3,
            "h": 3.2,
            "style": {
              "fontSize": 18
            }
          },
          {
            "id": "s03-note",
            "label": "解释说明",
            "type": "text",
            "text": "这里可以补一句总结或补充说明。",
            "x": 6.95,
            "y": 1.85,
            "w": 4.4,
            "h": 1.4,
            "style": {
              "fontSize": 18,
              "color": "#334155"
            }
          }
        ]
      },
      {
        "id": "slide-04",
        "label": "图文说明",
        "type": "image-text",
        "components": [
          {
            "id": "s04-title",
            "label": "图文页标题",
            "type": "title",
            "text": "图文说明",
            "x": 0.9,
            "y": 0.72,
            "w": 6.0,
            "h": 0.6,
            "style": {
              "fontSize": 24,
              "bold": true
            }
          },
          {
            "id": "s04-text",
            "label": "图文页正文",
            "type": "text",
            "text": "在这里补充故事线、案例或方案描述。",
            "x": 0.95,
            "y": 1.85,
            "w": 5.0,
            "h": 2.2,
            "style": {
              "fontSize": 18,
              "color": "#334155"
            }
          },
          {
            "id": "s04-image",
            "label": "图文页图片",
            "type": "image",
            "src": "../../assets/preview/placeholder-graphic.svg",
            "fit": "contain",
            "x": 7.05,
            "y": 1.55,
            "w": 4.3,
            "h": 3.6
          }
        ]
      },
      {
        "id": "slide-05",
        "label": "结论与下一步",
        "type": "quote",
        "components": [
          {
            "id": "s05-title",
            "label": "结论标题",
            "type": "title",
            "text": "结论与下一步",
            "x": 0.9,
            "y": 0.72,
            "w": 5.8,
            "h": 0.6,
            "style": {
              "fontSize": 24,
              "bold": true
            }
          },
          {
            "id": "s05-quote",
            "label": "总结金句",
            "type": "quote-block",
            "text": "一句话总结这份 PPT 想让听众记住的核心观点。",
            "x": 1.0,
            "y": 2.0,
            "w": 10.5,
            "h": 1.6,
            "style": {
              "fontSize": 24,
              "color": "#0F172A"
            }
          }
        ]
      }
    ]
  }
}


path: assets/archetypes/english-lesson.json
content: {
  "id": "english-lesson",
  "label": "英语课堂讲解",
  "description": "适合英语课堂课件制作，覆盖导入、课文学习、词汇、句型、练习和总结。",
  "briefSections": [
    "年级、教材版本、Lesson 编号",
    "本节课教学目标",
    "课文、词汇和句型内容",
    "课堂练习或互动题",
    "作业或课后延伸"
  ],
  "starterDeck": {
    "meta": {
      "mode": "editable"
    },
    "slides": [
      {
        "id": "slide-01",
        "label": "封面",
        "type": "cover",
        "layoutVariant": "hero-left",
        "components": [
          {
            "id": "s01-title",
            "label": "课题标题",
            "type": "title",
            "text": "{{title}}",
            "x": 0.9,
            "y": 0.95,
            "w": 6.2,
            "h": 0.8,
            "style": {
              "fontSize": 30,
              "bold": true
            }
          },
          {
            "id": "s01-subtitle",
            "label": "课时信息",
            "type": "subtitle",
            "text": "Grade / Lesson / Class Time",
            "x": 0.95,
            "y": 1.85,
            "w": 5.8,
            "h": 0.45,
            "style": {
              "fontSize": 16,
              "color": "#475569"
            }
          },
          {
            "id": "s01-image",
            "label": "封面装饰图",
            "type": "image",
            "src": "../../assets/preview/placeholder-graphic.svg",
            "fit": "contain",
            "x": 7.75,
            "y": 1.05,
            "w": 4.2,
            "h": 4.0
          }
        ]
      },
      {
        "id": "slide-02",
        "label": "Warm-up",
        "type": "image-text",
        "layoutVariant": "caption-photo",
        "components": [
          {
            "id": "s02-title",
            "label": "暖场标题",
            "type": "title",
            "text": "Warm-up",
            "x": 0.9,
            "y": 0.75,
            "w": 4.5,
            "h": 0.6,
            "style": {
              "fontSize": 26,
              "bold": true
            }
          },
          {
            "id": "s02-text",
            "label": "暖场问题",
            "type": "bullet-list",
            "items": [
              "Ask a simple question related to today's topic.",
              "Use one picture or one situation to get attention.",
              "Keep this page short and easy to answer."
            ],
            "x": 0.95,
            "y": 1.85,
            "w": 5.1,
            "h": 3.1,
            "style": {
              "fontSize": 18
            }
          },
          {
            "id": "s02-image",
            "label": "暖场图片",
            "type": "image",
            "src": "../../assets/preview/placeholder-graphic.svg",
            "fit": "cover",
            "x": 7.0,
            "y": 1.55,
            "w": 4.25,
            "h": 3.8
          }
        ]
      },
      {
        "id": "slide-03",
        "label": "Text Learning",
        "type": "two-column",
        "layoutVariant": "narrative-split",
        "components": [
          {
            "id": "s03-title",
            "label": "课文标题",
            "type": "title",
            "text": "Text Learning",
            "x": 0.9,
            "y": 0.75,
            "w": 5.4,
            "h": 0.6,
            "style": {
              "fontSize": 26,
              "bold": true
            }
          },
          {
            "id": "s03-left",
            "label": "课文内容",
            "type": "text",
            "text": "Put the key dialogue or text here. Highlight the sentence students must read aloud.",
            "x": 0.95,
            "y": 1.85,
            "w": 5.2,
            "h": 3.1,
            "style": {
              "fontSize": 20,
              "color": "#111827"
            }
          },
          {
            "id": "s03-right",
            "label": "中文辅助",
            "type": "text",
            "text": "这里补中文提示、重点解释或阅读任务，不要写成长篇讲义。",
            "x": 6.95,
            "y": 1.85,
            "w": 4.2,
            "h": 2.2,
            "style": {
              "fontSize": 16,
              "color": "#475569"
            }
          }
        ]
      },
      {
        "id": "slide-04",
        "label": "Key Vocabulary",
        "type": "table",
        "layoutVariant": "executive-grid",
        "components": [
          {
            "id": "s04-title",
            "label": "词汇标题",
            "type": "title",
            "text": "Key Vocabulary",
            "x": 0.9,
            "y": 0.75,
            "w": 5.4,
            "h": 0.6,
            "style": {
              "fontSize": 26,
              "bold": true
            }
          },
          {
            "id": "s04-table",
            "label": "词汇表格",
            "type": "table",
            "rows": [
              [
                "Word",
                "Meaning",
                "Example"
              ],
              [
                "holiday",
                "节日",
                "We love holidays."
              ],
              [
                "month",
                "月份",
                "There are twelve months."
              ],
              [
                "festival",
                "节庆",
                "Spring Festival is in winter."
              ]
            ],
            "x": 0.95,
            "y": 1.6,
            "w": 10.6,
            "h": 3.8,
            "style": {
              "fontSize": 16
            }
          }
        ]
      },
      {
        "id": "slide-05",
        "label": "Key Sentences",
        "type": "quote",
        "layoutVariant": "pull-quote",
        "components": [
          {
            "id": "s05-title",
            "label": "句型标题",
            "type": "title",
            "text": "Key Sentences",
            "x": 0.9,
            "y": 0.8,
            "w": 5.4,
            "h": 0.6,
            "style": {
              "fontSize": 26,
              "bold": true
            }
          },
          {
            "id": "s05-quote",
            "label": "核心句型",
            "type": "quote-block",
            "text": "What month is your birthday in?",
            "x": 1.0,
            "y": 1.9,
            "w": 10.0,
            "h": 1.4,
            "style": {
              "fontSize": 28
            }
          },
          {
            "id": "s05-text",
            "label": "句型练习说明",
            "type": "text",
            "text": "在这里补替换词、例句或学生两人一组操练方式。",
            "x": 1.05,
            "y": 4.0,
            "w": 9.4,
            "h": 0.9,
            "style": {
              "fontSize": 18,
              "color": "#475569"
            }
          }
        ]
      },
      {
        "id": "slide-06",
        "label": "Practice",
        "type": "comparison",
        "layoutVariant": "card-contrast",
        "components": [
          {
            "id": "s06-title",
            "label": "练习标题",
            "type": "title",
            "text": "Practice",
            "x": 0.9,
            "y": 0.75,
            "w": 4.5,
            "h": 0.6,
            "style": {
              "fontSize": 26,
              "bold": true
            }
          },
          {
            "id": "s06-left",
            "label": "学生任务",
            "type": "bullet-list",
            "items": [
              "Task 1: Ask and answer in pairs.",
              "Task 2: Fill in the blanks.",
              "Task 3: Say one complete sentence aloud."
            ],
            "x": 0.95,
            "y": 1.85,
            "w": 5.0,
            "h": 3.0,
            "style": {
              "fontSize": 18
            }
          },
          {
            "id": "s06-right",
            "label": "教师提示",
            "type": "bullet-list",
            "items": [
              "Give one example first.",
              "Invite 2 to 3 students to answer.",
              "纠错时只抓本课重点句型。"
            ],
            "x": 6.9,
            "y": 1.85,
            "w": 4.2,
            "h": 3.0,
            "style": {
              "fontSize": 17
            }
          }
        ]
      },
      {
        "id": "slide-07",
        "label": "Summary",
        "type": "quote",
        "layoutVariant": "signature-quote",
        "components": [
          {
            "id": "s07-title",
            "label": "总结标题",
            "type": "title",
            "text": "Summary & Homework",
            "x": 0.9,
            "y": 0.85,
            "w": 6.0,
            "h": 0.6,
            "style": {
              "fontSize": 26,
              "bold": true
            }
          },
          {
            "id": "s07-quote",
            "label": "总结句",
            "type": "quote-block",
            "text": "Today we learned new words, one key sentence, and how to use them in class.",
            "x": 1.0,
            "y": 2.0,
            "w": 10.1,
            "h": 1.5,
            "style": {
              "fontSize": 24
            }
          },
          {
            "id": "s07-text",
            "label": "作业",
            "type": "text",
            "text": "这里补课后作业或一句延伸任务。",
            "x": 1.05,
            "y": 4.2,
            "w": 8.5,
            "h": 0.8,
            "style": {
              "fontSize": 18,
              "color": "#475569"
            }
          }
        ]
      }
    ]
  }
}


path: assets/archetypes/club-recruiting.json
content: {
  "id": "club-recruiting",
  "label": "社团招新 / 活动策划路演",
  "description": "适合社团招新、活动宣讲和校园拉新，强调口号、活动高光、加入收益和行动号召。",
  "briefSections": [
    "社团名称与一句口号",
    "最有代表性的活动或荣誉",
    "加入后能得到的三类收益",
    "新学期重点活动安排",
    "二维码、群号和报名方式"
  ],
  "starterDeck": {
    "meta": {
      "mode": "editable"
    },
    "slides": [
      {
        "id": "slide-01",
        "label": "开场",
        "type": "cover",
        "layoutVariant": "hero-right",
        "components": [
          {
            "id": "s01-title",
            "label": "主口号",
            "type": "title",
            "text": "加入我们，大学别过得太普通。",
            "x": 0.9,
            "y": 1.15,
            "w": 6.2,
            "h": 1.1,
            "style": {
              "fontSize": 34,
              "bold": true
            }
          },
          {
            "id": "s01-subtitle",
            "label": "社团名称",
            "type": "subtitle",
            "text": "{{title}} · 秋季纳新",
            "x": 0.95,
            "y": 2.45,
            "w": 5.8,
            "h": 0.5,
            "style": {
              "fontSize": 18,
              "color": "#94A3B8"
            }
          },
          {
            "id": "s01-text",
            "label": "氛围标签",
            "type": "text",
            "text": "热爱、行动力、舞台感。这里放 3 个最想让新生记住的关键词。",
            "x": 0.95,
            "y": 3.2,
            "w": 5.5,
            "h": 1.3,
            "style": {
              "fontSize": 18,
              "color": "#E2E8F0"
            }
          },
          {
            "id": "s01-image",
            "label": "封面活动图",
            "type": "image",
            "src": "../../assets/preview/placeholder-graphic.svg",
            "fit": "cover",
            "x": 7.6,
            "y": 1.0,
            "w": 4.6,
            "h": 4.4
          }
        ]
      },
      {
        "id": "slide-02",
        "label": "高光活动",
        "type": "image-text",
        "layoutVariant": "immersive-figure",
        "components": [
          {
            "id": "s02-title",
            "label": "高光标题",
            "type": "title",
            "text": "去年最炸的一次活动",
            "x": 0.9,
            "y": 0.75,
            "w": 6.5,
            "h": 0.7,
            "style": {
              "fontSize": 28,
              "bold": true
            }
          },
          {
            "id": "s02-text",
            "label": "高光说明",
            "type": "bullet-list",
            "items": [
              "活动亮点：发生了什么，为什么大家记住了它",
              "影响力数字：参与人数、奖项、合作资源",
              "一句总结：为什么只有你们社团能做成这件事"
            ],
            "x": 0.95,
            "y": 1.85,
            "w": 5.2,
            "h": 3.4,
            "style": {
              "fontSize": 18
            }
          },
          {
            "id": "s02-image",
            "label": "高光活动图片",
            "type": "image",
            "src": "../../assets/preview/placeholder-graphic.svg",
            "fit": "cover",
            "x": 7.0,
            "y": 1.55,
            "w": 4.35,
            "h": 3.75
          }
        ]
      },
      {
        "id": "slide-03",
        "label": "加入收益",
        "type": "title-bullets",
        "layoutVariant": "headline-plus-visual",
        "components": [
          {
            "id": "s03-title",
            "label": "收益标题",
            "type": "title",
            "text": "加入之后，你能得到什么？",
            "x": 0.9,
            "y": 0.75,
            "w": 7.0,
            "h": 0.75,
            "style": {
              "fontSize": 28,
              "bold": true
            }
          },
          {
            "id": "s03-bullets",
            "label": "收益列表",
            "type": "bullet-list",
            "items": [
              "硬技能：能学会的具体能力",
              "人脉圈：能认识什么样的人",
              "舞台感：你会拥有什么样的经历和回忆"
            ],
            "x": 0.95,
            "y": 1.9,
            "w": 6.4,
            "h": 3.2,
            "style": {
              "fontSize": 20
            }
          }
        ]
      },
      {
        "id": "slide-04",
        "label": "活动计划",
        "type": "timeline",
        "layoutVariant": "step-cards",
        "components": [
          {
            "id": "s04-title",
            "label": "计划标题",
            "type": "title",
            "text": "新学期，我们准备这样炸场",
            "x": 0.9,
            "y": 0.75,
            "w": 7.2,
            "h": 0.7,
            "style": {
              "fontSize": 28,
              "bold": true
            }
          },
          {
            "id": "s04-timeline",
            "label": "活动时间线",
            "type": "bullet-list",
            "items": [
              "9 月：迎新活动与内部破冰",
              "10 月：主力项目启动",
              "11 月：大型校级活动或赛事",
              "12 月：成果展示与年度收尾"
            ],
            "x": 1.0,
            "y": 1.8,
            "w": 10.2,
            "h": 3.5,
            "style": {
              "fontSize": 18
            }
          }
        ]
      },
      {
        "id": "slide-05",
        "label": "行动号召",
        "type": "image-text",
        "layoutVariant": "media-right-focus",
        "components": [
          {
            "id": "s05-title",
            "label": "行动标题",
            "type": "title",
            "text": "现在扫码，下一次高光现场就有你",
            "x": 0.9,
            "y": 0.9,
            "w": 6.4,
            "h": 0.9,
            "style": {
              "fontSize": 30,
              "bold": true
            }
          },
          {
            "id": "s05-text",
            "label": "行动说明",
            "type": "text",
            "text": "这里放群号、截止时间、报名方式和一句最强行动号召。",
            "x": 0.95,
            "y": 2.2,
            "w": 5.3,
            "h": 1.6,
            "style": {
              "fontSize": 18,
              "color": "#E2E8F0"
            }
          },
          {
            "id": "s05-image",
            "label": "二维码",
            "type": "image",
            "src": "../../assets/preview/placeholder-graphic.svg",
            "fit": "contain",
            "x": 7.35,
            "y": 1.55,
            "w": 3.8,
            "h": 3.8
          }
        ]
      }
    ]
  }
}


path: assets/archetypes/course-presentation.json
content: {
  "id": "course-presentation",
  "label": "小组作业 / 期末 Pre",
  "description": "适合课程展示、案例分析和读书报告，强调破冰、理论背景、案例剖析、团队观点和课堂讨论。",
  "briefSections": [
    "课程名称与汇报主题",
    "必须讲清的理论或背景",
    "核心案例或阅读材料",
    "小组自己的观点或洞察",
    "讨论问题与互动设计"
  ],
  "starterDeck": {
    "meta": {
      "mode": "editable"
    },
    "slides": [
      {
        "id": "slide-01",
        "label": "破冰封面",
        "type": "cover",
        "layoutVariant": "hero-right",
        "components": [
          {
            "id": "s01-title",
            "label": "主标题",
            "type": "title",
            "text": "为什么这个问题值得我们花 10 分钟讲清楚？",
            "x": 0.9,
            "y": 1.0,
            "w": 6.2,
            "h": 1.0,
            "style": {
              "fontSize": 30,
              "bold": true
            }
          },
          {
            "id": "s01-subtitle",
            "label": "成员与课程信息",
            "type": "subtitle",
            "text": "{{title}} · 小组成员 / 课程名称 / 日期",
            "x": 0.95,
            "y": 2.35,
            "w": 5.8,
            "h": 0.45,
            "style": {
              "fontSize": 16,
              "color": "#475569"
            }
          },
          {
            "id": "s01-image",
            "label": "封面图片",
            "type": "image",
            "src": "../../assets/preview/placeholder-graphic.svg",
            "fit": "cover",
            "x": 7.55,
            "y": 1.0,
            "w": 4.5,
            "h": 4.4
          }
        ]
      },
      {
        "id": "slide-02",
        "label": "背景与理论",
        "type": "title-bullets",
        "layoutVariant": "evidence-split",
        "components": [
          {
            "id": "s02-title",
            "label": "背景标题",
            "type": "title",
            "text": "问题背景：我们为什么选这个题",
            "x": 0.9,
            "y": 0.75,
            "w": 6.8,
            "h": 0.7,
            "style": {
              "fontSize": 26,
              "bold": true
            }
          },
          {
            "id": "s02-bullets",
            "label": "背景要点",
            "type": "bullet-list",
            "items": [
              "现象或问题：现实里发生了什么",
              "前置概念：听众需要知道什么",
              "理论抓手：一句话解释这次分析的视角"
            ],
            "x": 0.95,
            "y": 1.85,
            "w": 5.4,
            "h": 3.2,
            "style": {
              "fontSize": 18
            }
          },
          {
            "id": "s02-text",
            "label": "背景补充",
            "type": "text",
            "text": "这里可以补一个数据、新闻片段或读书背景，帮助同学快速进入主题。",
            "x": 6.95,
            "y": 1.9,
            "w": 4.2,
            "h": 1.6,
            "style": {
              "fontSize": 18,
              "color": "#334155"
            }
          }
        ]
      },
      {
        "id": "slide-03",
        "label": "核心案例",
        "type": "image-text",
        "layoutVariant": "media-right-focus",
        "components": [
          {
            "id": "s03-title",
            "label": "案例标题",
            "type": "title",
            "text": "核心案例：发生了什么，为什么重要",
            "x": 0.9,
            "y": 0.75,
            "w": 7.0,
            "h": 0.7,
            "style": {
              "fontSize": 26,
              "bold": true
            }
          },
          {
            "id": "s03-text",
            "label": "案例说明",
            "type": "bullet-list",
            "items": [
              "案例简介：对象、背景、情境",
              "关键冲突：最值得分析的转折点",
              "关键材料：书中观点、影片情节或案例决策"
            ],
            "x": 0.95,
            "y": 1.85,
            "w": 5.2,
            "h": 3.3,
            "style": {
              "fontSize": 18
            }
          },
          {
            "id": "s03-image",
            "label": "案例图片",
            "type": "image",
            "src": "../../assets/preview/placeholder-graphic.svg",
            "fit": "cover",
            "x": 7.0,
            "y": 1.55,
            "w": 4.35,
            "h": 3.85
          }
        ]
      },
      {
        "id": "slide-04",
        "label": "小组观点",
        "type": "comparison",
        "layoutVariant": "card-contrast",
        "components": [
          {
            "id": "s04-title",
            "label": "观点标题",
            "type": "title",
            "text": "我们的观点：材料之外，真正值得带走的是什么",
            "x": 0.9,
            "y": 0.75,
            "w": 8.2,
            "h": 0.7,
            "style": {
              "fontSize": 26,
              "bold": true
            }
          },
          {
            "id": "s04-left",
            "label": "正面观点",
            "type": "bullet-list",
            "items": [
              "观点 1：我们的核心 insight",
              "观点 2：对现实或行业的启发"
            ],
            "x": 0.95,
            "y": 1.9,
            "w": 5.0,
            "h": 3.0,
            "style": {
              "fontSize": 18
            }
          },
          {
            "id": "s04-right",
            "label": "争议与反思",
            "type": "bullet-list",
            "items": [
              "争议点：哪些地方还有不同理解",
              "反思点：如果重做一次会怎样分析"
            ],
            "x": 6.85,
            "y": 1.9,
            "w": 4.35,
            "h": 3.0,
            "style": {
              "fontSize": 18
            }
          }
        ]
      },
      {
        "id": "slide-05",
        "label": "讨论与Q&A",
        "type": "quote",
        "layoutVariant": "pull-quote",
        "components": [
          {
            "id": "s05-title",
            "label": "讨论标题",
            "type": "title",
            "text": "留给课堂的最后一个问题",
            "x": 0.9,
            "y": 0.85,
            "w": 6.6,
            "h": 0.7,
            "style": {
              "fontSize": 26,
              "bold": true
            }
          },
          {
            "id": "s05-quote",
            "label": "讨论问题",
            "type": "quote-block",
            "text": "如果你站在案例中的关键角色位置，你会做出同样的选择吗？",
            "x": 1.0,
            "y": 2.0,
            "w": 10.3,
            "h": 1.7,
            "style": {
              "fontSize": 24
            }
          },
          {
            "id": "s05-text",
            "label": "结束说明",
            "type": "text",
            "text": "这里可以补一句通俗总结，或留给老师和同学的开放性问题。",
            "x": 1.05,
            "y": 4.15,
            "w": 9.6,
            "h": 0.9,
            "style": {
              "fontSize": 18,
              "color": "#475569"
            }
          }
        ]
      }
    ]
  }
}


path: assets/archetypes/project-intro.json
content: {
  "id": "project-intro",
  "label": "项目介绍",
  "description": "适合项目背景、价值、方案、进度和下一步规划。",
  "briefSections": ["项目一句话定义", "背景与痛点", "目标用户", "核心方案", "关键里程碑", "需要展示的素材"],
  "starterDeck": {
    "meta": {
      "mode": "editable"
    },
    "slides": [
      {
        "id": "slide-01",
        "label": "封面",
        "type": "cover",
        "components": [
          {
            "id": "s01-title",
            "label": "项目标题",
            "type": "title",
            "text": "{{title}}",
            "x": 0.9,
            "y": 0.85,
            "w": 6.2,
            "h": 0.8,
            "style": {
              "fontSize": 30,
              "bold": true
            }
          },
          {
            "id": "s01-subtitle",
            "label": "项目定位",
            "type": "subtitle",
            "text": "一页讲清项目定位、价值和当前进展。",
            "x": 0.95,
            "y": 1.75,
            "w": 6.4,
            "h": 0.45,
            "style": {
              "fontSize": 16,
              "color": "#475569"
            }
          },
          {
            "id": "s01-visual",
            "label": "项目封面图",
            "type": "image",
            "src": "../../assets/preview/placeholder-graphic.svg",
            "fit": "contain",
            "x": 7.9,
            "y": 1.05,
            "w": 4.15,
            "h": 3.75
          }
        ]
      },
      {
        "id": "slide-02",
        "label": "项目背景",
        "type": "title-bullets",
        "components": [
          {
            "id": "s02-title",
            "label": "背景标题",
            "type": "title",
            "text": "项目背景与目标",
            "x": 0.9,
            "y": 0.72,
            "w": 5.7,
            "h": 0.6,
            "style": {
              "fontSize": 25,
              "bold": true
            }
          },
          {
            "id": "s02-bullets",
            "label": "背景要点",
            "type": "bullet-list",
            "items": ["背景是什么", "为什么现在要做", "这次希望解决什么问题"],
            "x": 0.95,
            "y": 1.8,
            "w": 5.3,
            "h": 3.2,
            "style": {
              "fontSize": 18
            }
          },
          {
            "id": "s02-note",
            "label": "背景补充",
            "type": "text",
            "text": "可以在这里补充用户规模、行业变化或业务挑战。",
            "x": 6.95,
            "y": 1.85,
            "w": 4.45,
            "h": 1.4,
            "style": {
              "fontSize": 18,
              "color": "#334155"
            }
          }
        ]
      },
      {
        "id": "slide-03",
        "label": "方案结构",
        "type": "two-column",
        "components": [
          {
            "id": "s03-title",
            "label": "方案标题",
            "type": "title",
            "text": "解决方案与结构",
            "x": 0.9,
            "y": 0.72,
            "w": 6.0,
            "h": 0.6,
            "style": {
              "fontSize": 25,
              "bold": true
            }
          },
          {
            "id": "s03-left",
            "label": "方案说明",
            "type": "bullet-list",
            "items": ["模块 A", "模块 B", "模块 C"],
            "x": 0.95,
            "y": 1.9,
            "w": 5.25,
            "h": 3.4,
            "style": {
              "fontSize": 18
            }
          },
          {
            "id": "s03-right",
            "label": "方案示意图",
            "type": "image",
            "src": "../../assets/preview/placeholder-graphic.svg",
            "fit": "contain",
            "x": 7.0,
            "y": 1.72,
            "w": 4.3,
            "h": 3.55
          }
        ]
      },
      {
        "id": "slide-04",
        "label": "里程碑",
        "type": "timeline",
        "components": [
          {
            "id": "s04-title",
            "label": "里程碑标题",
            "type": "title",
            "text": "关键里程碑",
            "x": 0.9,
            "y": 0.72,
            "w": 4.8,
            "h": 0.6,
            "style": {
              "fontSize": 25,
              "bold": true
            }
          },
          {
            "id": "s04-timeline",
            "label": "里程碑列表",
            "type": "bullet-list",
            "items": ["阶段 1：立项", "阶段 2：试点", "阶段 3：推广", "阶段 4：规模化"],
            "x": 1.1,
            "y": 1.85,
            "w": 10.2,
            "h": 3.6,
            "style": {
              "fontSize": 18
            }
          }
        ]
      },
      {
        "id": "slide-05",
        "label": "下一步",
        "type": "quote",
        "components": [
          {
            "id": "s05-title",
            "label": "下一步标题",
            "type": "title",
            "text": "下一步与协作需求",
            "x": 0.9,
            "y": 0.72,
            "w": 6.2,
            "h": 0.6,
            "style": {
              "fontSize": 25,
              "bold": true
            }
          },
          {
            "id": "s05-quote",
            "label": "下一步说明",
            "type": "quote-block",
            "text": "下一阶段要做什么，需要谁支持，成功标准是什么。",
            "x": 1.0,
            "y": 2.05,
            "w": 10.2,
            "h": 1.4,
            "style": {
              "fontSize": 24
            }
          }
        ]
      }
    ]
  }
}


path: subskills/customer-story/agents/openai.yaml
content: interface:
  display_name: "客户案例介绍"
  short_description: "面向客户案例和售前证明的商业案例 PPT 子 skill。"
  brand_color: "#0F766E"
  default_prompt: "Use $ppt-customer-story to create a 5-6 page customer case deck with challenge, solution, results, and testimonial."

policy:
  allow_implicit_invocation: true


path: subskills/customer-story/references/outline.md
content: # 客户案例介绍默认结构

1. 封面
   - 案例名、客户场景、一句话结论

2. 客户与挑战
   - 客户是谁、原始问题是什么

3. 方案与落地
   - 我们做了什么、怎么推进

4. 结果与收益
   - 量化指标、效率提升、业务变化

5. 客户评价与下一步
   - 客户原话、复用价值、后续机会


Security scan verdicts — ClawScan: clean | static analysis: suspicious | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)