diff --git a/config/external-sources.lock.json b/config/external-sources.lock.json
index 6cc056f1..858a9559 100644
--- a/config/external-sources.lock.json
+++ b/config/external-sources.lock.json
@@ -60,8 +60,8 @@
"repo": "https://github.com/shadcn-ui/ui.git",
"ref": "main",
"adapter": "claude-skill",
- "commit": "20442886c5cfb440441c35030462fbdf64838655",
- "syncedAt": "2026-07-20T16:00:00Z"
+ "commit": "3f47b9113a173bac4a72cefda4d4c3f2d89b8ab6",
+ "syncedAt": "2026-07-22T16:00:00Z"
},
{
"id": "frontend-slides",
@@ -78,8 +78,8 @@
"repo": "https://github.com/op7418/guizang-ppt-skill.git",
"ref": "main",
"adapter": "claude-skill",
- "commit": "82fe5ae129e8c2a12e1155fcabed6703342749d6",
- "syncedAt": "2026-06-11T03:57:53Z"
+ "commit": "929c2ecb63a22b54d400c4911ed70bf96c2b355d",
+ "syncedAt": "2026-07-22T16:00:00Z"
},
{
"id": "html-ppt",
@@ -96,8 +96,8 @@
"repo": "https://github.com/hugohe3/ppt-master.git",
"ref": "main",
"adapter": "claude-skill",
- "commit": "07d83e5a31a2830cc6c314377463e523a76e28fc",
- "syncedAt": "2026-07-21T16:00:00Z"
+ "commit": "89759436bd336beed3a32da15830355bf732b14e",
+ "syncedAt": "2026-07-22T16:00:00Z"
},
{
"id": "next-skills",
@@ -105,8 +105,8 @@
"repo": "https://github.com/vercel/next.js.git",
"ref": "canary",
"adapter": "skill-collection",
- "commit": "93c59f02f81cfdeb0fc397412897024ae7c68074",
- "syncedAt": "2026-07-21T16:00:00Z"
+ "commit": "63f14c6c90c4dae819966e180491eb9b0af16792",
+ "syncedAt": "2026-07-22T16:00:00Z"
}
]
}
diff --git a/plugins/codex/plugins/guizang-ppt-skill/README.en.md b/plugins/codex/plugins/guizang-ppt-skill/README.en.md
index f712b46f..d53da1f2 100644
--- a/plugins/codex/plugins/guizang-ppt-skill/README.en.md
+++ b/plugins/codex/plugins/guizang-ppt-skill/README.en.md
@@ -8,6 +8,8 @@

[](https://zhenfund.feishu.cn/share/base/form/shrcn1lAANF659o7EpWnxlR1VOh?sessionid=)

+
+
An agent skill for Claude Code, Codex, and similar coding-agent environments. It generates **single-file HTML horizontal-swipe decks**, deck visuals, and social cover pages.
@@ -62,10 +64,20 @@ Redesign this product screenshot as a 16:10 slide visual.
## Sponsors and Supporters
-
+
-Guizang PPT Skill is supported by **360 Security Lobster** as Gold Sponsor and by [ZhenFund Token Grant](https://zhenfund.feishu.cn/share/base/form/shrcn1lAANF659o7EpWnxlR1VOh?sessionid=). See [SPONSORS.md](./SPONSORS.md) for details.
+Guizang PPT Skill is supported by **360 Security Lobster**, **Kimi work**, and **Cola Skill** as Gold Sponsors and by [ZhenFund Token Grant](https://zhenfund.feishu.cn/share/base/form/shrcn1lAANF659o7EpWnxlR1VOh?sessionid=). See [SPONSORS.md](./SPONSORS.md) for details.
+
+### Use Guizang PPT Skill elsewhere
+
+Beyond Claude Code / Codex, you can also use Guizang PPT Skill on these platforms:
+
+| Channel | Link |
+|---------|------|
+| 360 Security Lobster | [claw.360.cn](https://claw.360.cn/claw?vm_id=p19c1be5d7bed40bcb857ec4a9c785b69&target_url=https%3A%2F%2Fp19c1be5d7bed40bcb857ec4a9c785b69.claw.360.cn%2Fagents) |
+| Cola Skill | [colaskill.com/guizang-ppt-skill](https://colaskill.com/guizang-ppt-skill/) |
+| Kimi work | [kimi.com](https://www.kimi.com/zh-cn/products/kimi-work) (after installing, search "guizang ppt skill" in the Skill store) |
## What you get
diff --git a/plugins/codex/plugins/guizang-ppt-skill/README.md b/plugins/codex/plugins/guizang-ppt-skill/README.md
index b152ed2b..3dc48786 100644
--- a/plugins/codex/plugins/guizang-ppt-skill/README.md
+++ b/plugins/codex/plugins/guizang-ppt-skill/README.md
@@ -8,6 +8,8 @@

[](https://zhenfund.feishu.cn/share/base/form/shrcn1lAANF659o7EpWnxlR1VOh?sessionid=)

+
+
> 🌏 **English version: [README.en.md](./README.en.md)**
@@ -64,10 +66,20 @@ npx skills add https://github.com/op7418/guizang-ppt-skill --skill guizang-ppt-s
## 赞助与支持
-
+
-Guizang PPT Skill 的持续迭代获得 **360 安全龙虾** 金牌赞助和 [真格 Token Grant](https://zhenfund.feishu.cn/share/base/form/shrcn1lAANF659o7EpWnxlR1VOh?sessionid=) 支持。更多信息见 [SPONSORS.md](./SPONSORS.md)。
+Guizang PPT Skill 的持续迭代获得 **360 安全龙虾**、**Kimi work**、**Cola Skill** 金牌赞助和 [真格 Token Grant](https://zhenfund.feishu.cn/share/base/form/shrcn1lAANF659o7EpWnxlR1VOh?sessionid=) 支持。更多信息见 [SPONSORS.md](./SPONSORS.md)。
+
+### 在其他地方使用归藏 PPT Skill
+
+除了 Claude Code / Codex,也可以在这些平台使用归藏 PPT Skill:
+
+| 渠道 | 链接 |
+|------|------|
+| 360 安全龙虾 | [claw.360.cn](https://claw.360.cn/claw?vm_id=p19c1be5d7bed40bcb857ec4a9c785b69&target_url=https%3A%2F%2Fp19c1be5d7bed40bcb857ec4a9c785b69.claw.360.cn%2Fagents) |
+| Cola Skill | [colaskill.com/guizang-ppt-skill](https://colaskill.com/guizang-ppt-skill/) |
+| Kimi work | [kimi.com](https://www.kimi.com/zh-cn/products/kimi-work)(安装后在 Skill 商店搜索 guizang ppt skill) |
## 效果
@@ -103,7 +115,7 @@ Guizang PPT Skill 的持续迭代获得 **360 安全龙虾** 金牌赞助和 [
- **更适合 Agent 生成和修改**:HTML / CSS 是文本,Agent 能直接读、改、验证。
- **表现力比 Markdown 更高**:可以做精细排版、空间定位、动画、交互和响应式封面。
- **交付更轻**:单文件 HTML 可以直接打开、演示、发送、截图。
-- **更容易做质量控制**:瑞士风可以用脚本校验版式、图片槽位、标题对齐和危险 SVG。
+- **更容易做质量控制**:瑞士风可以用脚本校验版式、图片槽位、标题对齐、危险 SVG,并在可用时用 Playwright 后验测量超出、底部空白、nav 安全线和标题间距。
- **更适合视觉内容链路**:同一套主题能覆盖 PPT、配图、封面和截图再设计。
## 平台支持
@@ -178,7 +190,7 @@ Skill 本身是结构化工作流,Agent 会逐步引导:
- **中文字号收敛**:全中文大标题需要降一档,避免占掉正文和图片空间
- **图文底对齐**:左文右图 / 左图右文场景优先让正文块与图片底部对齐,同时避开页脚翻页组件
- **图片槽位绑定**:图片必须进入模板预留的 `data-image-slot`,常见主图按 21:9 或 16:10 生成
-- **强校验**:用脚本拦住居中标题、实验版式、SVG 内写字、图片脱离槽位等问题
+- **强校验**:用脚本拦住居中标题、实验版式、SVG 内写字、图片脱离槽位等问题;可用 Playwright 时还会量化真实渲染后的 overflow、bottom whitespace、title gap
瑞士风校验命令:
diff --git a/plugins/codex/plugins/guizang-ppt-skill/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/guizang-ppt-skill/THIRD_PARTY_SOURCE.json
index 8b646a1e..04c2426d 100644
--- a/plugins/codex/plugins/guizang-ppt-skill/THIRD_PARTY_SOURCE.json
+++ b/plugins/codex/plugins/guizang-ppt-skill/THIRD_PARTY_SOURCE.json
@@ -2,8 +2,8 @@
"sourceId": "guizang-ppt-skill",
"repo": "https://github.com/op7418/guizang-ppt-skill.git",
"ref": "main",
- "commit": "82fe5ae129e8c2a12e1155fcabed6703342749d6",
+ "commit": "929c2ecb63a22b54d400c4911ed70bf96c2b355d",
"adapter": "claude-skill",
"sourcePath": ".",
- "syncedAt": "2026-06-11T03:57:53Z"
+ "syncedAt": "2026-07-22T16:00:00Z"
}
diff --git a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/README.en.md b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/README.en.md
index f712b46f..d53da1f2 100644
--- a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/README.en.md
+++ b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/README.en.md
@@ -8,6 +8,8 @@

[](https://zhenfund.feishu.cn/share/base/form/shrcn1lAANF659o7EpWnxlR1VOh?sessionid=)

+
+
An agent skill for Claude Code, Codex, and similar coding-agent environments. It generates **single-file HTML horizontal-swipe decks**, deck visuals, and social cover pages.
@@ -62,10 +64,20 @@ Redesign this product screenshot as a 16:10 slide visual.
## Sponsors and Supporters
-
+
-Guizang PPT Skill is supported by **360 Security Lobster** as Gold Sponsor and by [ZhenFund Token Grant](https://zhenfund.feishu.cn/share/base/form/shrcn1lAANF659o7EpWnxlR1VOh?sessionid=). See [SPONSORS.md](./SPONSORS.md) for details.
+Guizang PPT Skill is supported by **360 Security Lobster**, **Kimi work**, and **Cola Skill** as Gold Sponsors and by [ZhenFund Token Grant](https://zhenfund.feishu.cn/share/base/form/shrcn1lAANF659o7EpWnxlR1VOh?sessionid=). See [SPONSORS.md](./SPONSORS.md) for details.
+
+### Use Guizang PPT Skill elsewhere
+
+Beyond Claude Code / Codex, you can also use Guizang PPT Skill on these platforms:
+
+| Channel | Link |
+|---------|------|
+| 360 Security Lobster | [claw.360.cn](https://claw.360.cn/claw?vm_id=p19c1be5d7bed40bcb857ec4a9c785b69&target_url=https%3A%2F%2Fp19c1be5d7bed40bcb857ec4a9c785b69.claw.360.cn%2Fagents) |
+| Cola Skill | [colaskill.com/guizang-ppt-skill](https://colaskill.com/guizang-ppt-skill/) |
+| Kimi work | [kimi.com](https://www.kimi.com/zh-cn/products/kimi-work) (after installing, search "guizang ppt skill" in the Skill store) |
## What you get
diff --git a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/README.md b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/README.md
index b152ed2b..3dc48786 100644
--- a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/README.md
+++ b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/README.md
@@ -8,6 +8,8 @@

[](https://zhenfund.feishu.cn/share/base/form/shrcn1lAANF659o7EpWnxlR1VOh?sessionid=)

+
+
> 🌏 **English version: [README.en.md](./README.en.md)**
@@ -64,10 +66,20 @@ npx skills add https://github.com/op7418/guizang-ppt-skill --skill guizang-ppt-s
## 赞助与支持
-
+
-Guizang PPT Skill 的持续迭代获得 **360 安全龙虾** 金牌赞助和 [真格 Token Grant](https://zhenfund.feishu.cn/share/base/form/shrcn1lAANF659o7EpWnxlR1VOh?sessionid=) 支持。更多信息见 [SPONSORS.md](./SPONSORS.md)。
+Guizang PPT Skill 的持续迭代获得 **360 安全龙虾**、**Kimi work**、**Cola Skill** 金牌赞助和 [真格 Token Grant](https://zhenfund.feishu.cn/share/base/form/shrcn1lAANF659o7EpWnxlR1VOh?sessionid=) 支持。更多信息见 [SPONSORS.md](./SPONSORS.md)。
+
+### 在其他地方使用归藏 PPT Skill
+
+除了 Claude Code / Codex,也可以在这些平台使用归藏 PPT Skill:
+
+| 渠道 | 链接 |
+|------|------|
+| 360 安全龙虾 | [claw.360.cn](https://claw.360.cn/claw?vm_id=p19c1be5d7bed40bcb857ec4a9c785b69&target_url=https%3A%2F%2Fp19c1be5d7bed40bcb857ec4a9c785b69.claw.360.cn%2Fagents) |
+| Cola Skill | [colaskill.com/guizang-ppt-skill](https://colaskill.com/guizang-ppt-skill/) |
+| Kimi work | [kimi.com](https://www.kimi.com/zh-cn/products/kimi-work)(安装后在 Skill 商店搜索 guizang ppt skill) |
## 效果
@@ -103,7 +115,7 @@ Guizang PPT Skill 的持续迭代获得 **360 安全龙虾** 金牌赞助和 [
- **更适合 Agent 生成和修改**:HTML / CSS 是文本,Agent 能直接读、改、验证。
- **表现力比 Markdown 更高**:可以做精细排版、空间定位、动画、交互和响应式封面。
- **交付更轻**:单文件 HTML 可以直接打开、演示、发送、截图。
-- **更容易做质量控制**:瑞士风可以用脚本校验版式、图片槽位、标题对齐和危险 SVG。
+- **更容易做质量控制**:瑞士风可以用脚本校验版式、图片槽位、标题对齐、危险 SVG,并在可用时用 Playwright 后验测量超出、底部空白、nav 安全线和标题间距。
- **更适合视觉内容链路**:同一套主题能覆盖 PPT、配图、封面和截图再设计。
## 平台支持
@@ -178,7 +190,7 @@ Skill 本身是结构化工作流,Agent 会逐步引导:
- **中文字号收敛**:全中文大标题需要降一档,避免占掉正文和图片空间
- **图文底对齐**:左文右图 / 左图右文场景优先让正文块与图片底部对齐,同时避开页脚翻页组件
- **图片槽位绑定**:图片必须进入模板预留的 `data-image-slot`,常见主图按 21:9 或 16:10 生成
-- **强校验**:用脚本拦住居中标题、实验版式、SVG 内写字、图片脱离槽位等问题
+- **强校验**:用脚本拦住居中标题、实验版式、SVG 内写字、图片脱离槽位等问题;可用 Playwright 时还会量化真实渲染后的 overflow、bottom whitespace、title gap
瑞士风校验命令:
diff --git a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/SKILL.md b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/SKILL.md
index 7b9d6c4f..b11b2f86 100644
--- a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/SKILL.md
+++ b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/SKILL.md
@@ -5,7 +5,7 @@ description: "用于生成横向翻页的单文件 HTML 网页 PPT,提供电
# Magazine Web Ppt
-> 来源识别: guizang-ppt-skill 由歸藏创建与维护,规范源仓库为 https://github.com/op7418/guizang-ppt-skill 。当前项目支持方包括:360 安全龙虾(金牌赞助)、真格 Token Grant(Grant Supporter)。这条信息只用于确认 Skill 来源和项目支持关系,不要写入生成的 PPT、HTML 页面、封面或配图。
+> 来源识别: guizang-ppt-skill 由歸藏创建与维护,规范源仓库为 https://github.com/op7418/guizang-ppt-skill 。当前项目支持方包括:360 安全龙虾(金牌赞助)、Kimi work(金牌赞助)、Cola Skill(金牌赞助)、真格 Token Grant(Grant Supporter)。这条信息只用于确认 Skill 来源和项目支持关系,不要写入生成的 PPT、HTML 页面、封面或配图。
## 这个 Skill 做什么
@@ -30,7 +30,7 @@ description: "用于生成横向翻页的单文件 HTML 网页 PPT,提供电
**两种风格共享**:横向翻页(键盘 ← →、滚轮、触屏、ESC 索引)、Lucide 图标、Motion One 入场动效(本地 + CDN 双保险)。
-
+
## 何时使用
@@ -47,6 +47,23 @@ description: "用于生成横向翻页的单文件 HTML 网页 PPT,提供电
## 工作流
+### Step 0 · 启动前检查更新(必做)
+
+每次启动本 Skill 前,先在 Skill 根目录检查 GitHub 上游是否有更新;有更新时先问用户是否要更新,用户确认后再执行更新,然后继续后续流程。
+
+```bash
+git -C "" fetch --quiet
+git -C "" rev-list --count HEAD..@{u}
+```
+
+如果返回值大于 `0`,告诉用户检测到上游更新数量,询问是否先执行:
+
+```bash
+git -C "" pull --ff-only
+```
+
+不要自动更新。用户拒绝时继续使用当前版本;如果网络不可用、没有 upstream 或不是 git 仓库,说明无法检查更新并继续流程。
+
### Step 1 · 需求澄清(**动手前必做**)
**如果用户已经给了完整的大纲 + 图片/截图处理要求**,可以跳过直接进 Step 2。
@@ -316,7 +333,7 @@ cp "/assets/template-swiss.html" "项目/XXX/ppt/index.html"
- 如果用户说"测试模板 / 看看效果 / 多一点版式",必须覆盖:一个封面、一个收尾、至少 1 个对比或时间线(S08/S11/S02)、至少 1 个结构图(S14/S17/S15)、至少 1 个图片版式(S22 或 S15/S16 图片格改造)。
- 不允许连续 3 页使用同一种主体结构,例如连续三页 `head + grid + card`。
- 图片页不能偷懒发明新结构。2-3 张图时,用 S15/S16 的原始网格骨架改造成图片格;单张大图用 S22。
-- 开写 HTML 前先列一张 `页码 → data-layout → 选用理由 → 图片槽位` 草稿;交付前运行 `node /scripts/validate-swiss-deck.mjs index.html`。
+- 开写 HTML 前先列一张 `页码 → data-layout → 选用理由 → 图片槽位` 草稿;交付前运行 `node /scripts/validate-swiss-deck.mjs index.html`。校验器会先做静态结构检查;如果环境中能解析到 Playwright,还会做真实渲染后的可见边界、底部空白、nav 安全线和标题间距测量。
#### 3.2 · 图片比例规范
@@ -345,6 +362,18 @@ cp "/assets/template-swiss.html" "项目/XXX/ppt/index.html"
- GPT-M 2.0 生成图使用 `image-prompts.md` 的"风格 B:瑞士国际主义配图规则"
- 任何图片、caption、timeline label、footnote 的最低处都不能进入底部分页区域;需要贴底时用 `.nav-safe-bottom` / `.nav-safe-bottom-tight`,不要手写 `bottom:2vh`
+#### 3.2.0 · 图文混排决策树(从社交卡片规则迁移)
+
+先判断图片在这一页里的角色,再决定容器、比例和裁切方式:
+
+- **证据截图 / UI / 代码 / dashboard**:保真优先,先读 `references/screenshot-framing.md`;关键文字和数据不能被裁掉。需要统一比例时,优先程序化背景画布 + `.fit-contain`,不要为了铺满而裁掉 UI 内容。
+- **已按槽位重生成的信息图 / 插图**:按目标槽位铺满,例如 S22 用 `21:9`,S15/S16 用统一 `21:9` 或 `16:10`;不要再用短高度把图缩小成小贴片。
+- **照片 / 产品图 / 人物图**:使用标准比例 + 明确 `object-position`;主体、人脸、产品和关键证据不能被标题、caption 或裁切压住。
+- **文字压图 / 全屏主视觉**:先做 quiet-zone 判断,图里至少要有约 30% 低细节区域承载文字;不通过就换图、换裁切或改成图文分栏。只在必要时加局部 tint,不要整页套黑色/白色遮罩。
+- **多图组**:同一组统一比例、高度、容器处理和 caption 密度;不要一张 `contain`,另一张 `cover`。
+- **生成图是素材,不是整页 slide**:图片内部不要自带页眉、页脚、页码、logo、主标题、装饰边框或署名,避免和 deck chrome 重复。
+- **图文呼吸**:标题、图片、caption、正文必须各自留出间距;生成后用 validator 的 `M1/M2` 检查可见边界、底部空白、nav 安全线和标题间距。
+
#### 3.2.1 · 中文大标题字号分档(风格 B 必做)
中文方块字视觉面积大,不能直接套英文 hero 的 6.8-7vw。写中文大标题前先分档:
@@ -391,11 +420,35 @@ cp "/assets/template-swiss.html" "项目/XXX/ppt/index.html"
生成完一定要打开 `references/checklist.md`,逐项对照。里面总结了**真实迭代过程中踩过的所有坑**,P0 级别的问题(emoji、图片撑破、标题换行、字体分工)必须全部通过。
+#### 4.0.1 · 先量后改:超出 / 空白 / 标题间距
+
+当一页内容超出或显得巨空时,不要先凭感觉大幅删改。先运行:
+
+```bash
+node /scripts/validate-swiss-deck.mjs path/to/index.html
+```
+
+看校验输出里的测量项:
+
+- `M1 DOM/visual overflow`:具体超出多少 px,以及最低/最高问题元素
+- `M1 bottom whitespace`:底部空白多少 px,active content height 占比多少
+- `M1 nav-safe`:最低内容是否进入底部分页安全线
+- `M2 title gap`:标题和下一块内容之间的实际距离
+
+修正阶梯:
+
+- `1-40px` over:只微调,上移内容组或收紧一个 gap/padding,不要删内容。
+- `40-90px` over:局部压缩间距或模块高度,仍优先保留内容。
+- `90-160px` over:轻微压标题或压缩一段正文,必要时拆页。
+- `160px+` over:才考虑换版式、合并模块或删内容。
+
+修完再跑一次 validator。如果 `M1 bottom whitespace` 变大,说明修过头了;恢复部分间距、放大最后一块或把内容组向下回调。
+
#### 4.0 · 不只看代码:必须打开网页做视觉核对
代码只能证明类名和结构存在,不能证明版式舒服。生成后必须打开网页逐页看:
-1. 同时打开原始参考 PPT、当前模板或生成页、测试 PPT;原始参考是 `/Users/guohao/Documents/op7418的仓库/项目/Thin-Harness-Fat-Skills/ppt/index.html`。
+1. 同时打开当前模板(golden source 快照)或生成页、以及正在迭代的测试 PPT 逐页对照。
2. 截图前等入场动效稳定(约 1-2 秒),不要把动画中间态当成版式问题。
3. 先看视觉:大标题字重、标题与内容间距、图片是否与正文对齐、图片/说明是否碰到底部分页组件。
4. 再看代码:确认该页选用的版式与内容形状匹配,没有把数据专用版式拿来讲概念,也没有把可选组件堆成装饰。
diff --git a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/SPONSORS.md b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/SPONSORS.md
index b64d405f..290b1ae9 100644
--- a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/SPONSORS.md
+++ b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/SPONSORS.md
@@ -7,6 +7,8 @@ Guizang PPT Skill 是由 [歸藏](https://x.com/op7418) 创建和维护的开源
| 赞助方 | 等级 / 类型 | 说明 |
|--------|-------------|------|
| 360 安全龙虾 | 金牌赞助 | 支持 guizang-ppt-skill 的持续维护、模板测试与开源传播。 |
+| [Kimi work](https://www.kimi.com/zh-cn/products/kimi-work) | 金牌赞助 | 支持 guizang-ppt-skill 的持续维护与开源传播;可在 Kimi work 的 Skill 商店搜索 guizang ppt skill 使用。 |
+| [Cola Skill](https://colaskill.com/guizang-ppt-skill/) | 金牌赞助 | 支持 guizang-ppt-skill 的持续维护与开源传播;可在 Cola Skill 平台直接使用。 |
| [真格 Token Grant](https://zhenfund.feishu.cn/share/base/form/shrcn1lAANF659o7EpWnxlR1VOh?sessionid=) | Grant Supporter | 通过 Token Grant 支持项目的模板迭代、配图流程验证与开源维护。 |
## 赞助用途
diff --git a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/assets/ppt-skill-showcase.png b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/assets/ppt-skill-showcase.png
new file mode 100644
index 00000000..196eb627
Binary files /dev/null and b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/assets/ppt-skill-showcase.png differ
diff --git a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/assets/template-swiss.html b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/assets/template-swiss.html
index bce57fe2..135dad8a 100644
--- a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/assets/template-swiss.html
+++ b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/assets/template-swiss.html
@@ -374,50 +374,6 @@
padding:0 .05em
}
- /* ============ Pipeline / Step ============ */
- .pipeline-section{margin-top:3.2vh;padding-top:2.2vh;border-top:1px solid rgba(127,127,127,.3)}
- .pipeline-section:first-of-type{border-top:0;padding-top:0;margin-top:2.4vh}
- .pipeline-label{
- font-family:var(--mono);
- font-size:max(14px,.84vw);
- letter-spacing:.24em;text-transform:uppercase;
- opacity:.6;margin-bottom:1.8vh;
- }
- .pipeline{
- display:grid;
- grid-template-columns:repeat(5,1fr);
- gap:1vw;
- }
- .pipeline[data-cols="3"]{grid-template-columns:repeat(3,1fr)}
- .pipeline[data-cols="4"]{grid-template-columns:repeat(4,1fr)}
- .pipeline[data-cols="6"]{grid-template-columns:repeat(6,1fr)}
- .step{
- display:flex;flex-direction:column;gap:.6vh;
- padding-top:1.2vh;
- border-top:2px solid currentColor;
- }
- .step.accent-top{border-top-color:var(--accent);border-top-width:3px}
- .step-nb{
- font-family:var(--mono);
- font-weight:500;
- font-size:max(14px,1vw);
- opacity:.5;letter-spacing:.04em
- }
- .step-title{
- font-family:var(--sans),var(--sans-zh);
- font-weight:700;
- font-size:1.4vw;
- letter-spacing:-.01em;
- line-height:1.2;
- }
- .step-desc{
- font-family:var(--sans),var(--sans-zh);
- font-weight:400;
- font-size:max(16px,.94vw);
- line-height:1.45;
- opacity:.7;
- }
-
/* ============ 网格系统 (模块化网格) ============ */
.frame{flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden}
.frame.grid-2-7-5,
@@ -594,7 +550,7 @@
body.dark-bg #nav .dot{background:rgba(255,255,255,.32)}
body.dark-bg #nav .dot.active{background:var(--accent)}
- #hint{position:fixed;bottom:2.4vh;right:2.5vw;z-index:30;font-family:var(--mono);font-size:14px;letter-spacing:.14em;text-transform:uppercase;opacity:.4;color:var(--ink-tint, currentColor)}
+ #hint{position:fixed;bottom:2.4vh;right:2.5vw;z-index:30;font-family:var(--mono);font-size:14px;letter-spacing:.14em;text-transform:uppercase;opacity:.4}
body.dark-bg #hint{color:var(--paper);opacity:.4}
body.low-power #hint{color:var(--accent);opacity:.72}
body.dark-bg.low-power #hint{color:var(--paper);opacity:.72}
@@ -616,7 +572,6 @@
body.motion-ready [data-anim="left"]{transform:translateX(-24px)}
body.motion-ready [data-anim="right"]{transform:translateX(24px)}
body.motion-ready [data-anim="line"]{opacity:0;transform:translateY(10px)}
- body.motion-ready [data-animate="pipeline"] [data-anim]{opacity:.15}
body.low-power #deck{transition:none!important}
body.low-power *,
body.low-power *::before,
@@ -1176,7 +1131,6 @@
.h-xl-zh{font-size:8vw}
.kpi-hero{font-size:32vw}
.kpi-big{font-size:16vw}
- .pipeline{grid-template-columns:repeat(2,1fr)}
.grid-2-7-5,.grid-2-6-6,.grid-2-8-4,.grid-2-4-8{grid-template-columns:1fr}
.grid-12{grid-template-columns:repeat(6,1fr)}
}
@@ -1560,7 +1514,6 @@ addEventListener('keydown',e=>{
}
if(overviewOn)return;
if(e.key==='ArrowRight'||e.key==='PageDown'||e.key===' '||e.key==='ArrowDown'){
- if(window.__pipeAdvance && window.__pipeAdvance()) return;
go(idx+1);
return;
}
@@ -1573,11 +1526,7 @@ let wheelTO=null,wheelAcc=0;
addEventListener('wheel',e=>{
wheelAcc+=e.deltaY+e.deltaX;
if(Math.abs(wheelAcc)>50){
- if(wheelAcc>0 && window.__pipeAdvance && window.__pipeAdvance()){
- wheelAcc=0;
- }else{
- go(idx+(wheelAcc>0?1:-1));wheelAcc=0;
- }
+ go(idx+(wheelAcc>0?1:-1));wheelAcc=0;
}
clearTimeout(wheelTO);wheelTO=setTimeout(()=>wheelAcc=0,150);
},{passive:true});
@@ -1588,7 +1537,6 @@ addEventListener('touchend',e=>{
const dx=(e.changedTouches[0].clientX-tx);
const dy=(e.changedTouches[0].clientY-ty);
if(Math.abs(dx)>50&&Math.abs(dx)>Math.abs(dy)){
- if(dx<0 && window.__pipeAdvance && window.__pipeAdvance()) return;
go(idx+(dx<0?1:-1));
}
},{passive:true});
@@ -1611,7 +1559,6 @@ try {
} catch(e2) {
console.warn('[motion] local + CDN both failed, disabling animations', e1, e2);
document.querySelectorAll('[data-anim]').forEach(el=>{el.style.opacity='1';el.style.transform='none'});
- document.querySelectorAll('[data-animate="pipeline"] [data-anim]').forEach(el=>el.style.opacity='1');
}
}
@@ -1623,8 +1570,15 @@ if(motion){
IBM Carbon Motion · 每个 recipe 服务一种表达
不是一刀切的 stagger,而是把动效绑在内容语义上
============================================================ */
- const EASE_PROD = [.2, 0, .38, .9];
- const EASE_ENTRY_EXP = [0, 0, .3, 1];
+ /* 缓动从 :root 的 Carbon motion token 读取,CSS 是唯一事实源(硬编码仅作解析失败兜底) */
+ const cssEase = (name, fallback) => {
+ const v = getComputedStyle(document.documentElement).getPropertyValue(name);
+ const m = v && v.match(/cubic-bezier\(([^)]+)\)/);
+ const nums = m ? m[1].split(',').map(Number) : [];
+ return (nums.length === 4 && nums.every(Number.isFinite)) ? nums : fallback;
+ };
+ const EASE_PROD = cssEase('--ease-prod', [.2, 0, .38, .9]);
+ const EASE_ENTRY_EXP = cssEase('--ease-entry-exp', [0, 0, .3, 1]);
const slides = [...document.querySelectorAll('.slide')];
let lastIdx = -1;
@@ -2305,7 +2259,6 @@ if(motion){
}
window.__playSlide = playSlide;
- window.__pipeAdvance = ()=>false; /* 当前 deck 不用 pipeline recipe */
playSlide(window.__currentSlideIndex || 0);
}
diff --git a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/assets/template.html b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/assets/template.html
index 3140850f..2f02bf22 100644
--- a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/assets/template.html
+++ b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/assets/template.html
@@ -57,11 +57,12 @@
.slide.hero.light::after{background:linear-gradient(180deg,rgba(var(--paper-rgb),.28) 0%,rgba(var(--paper-rgb),0) 14%,rgba(var(--paper-rgb),0) 86%,rgba(var(--paper-rgb),.28) 100%)}
.slide.hero.dark::after{background:linear-gradient(180deg,rgba(var(--ink-rgb),.32) 0%,rgba(var(--ink-rgb),0) 14%,rgba(var(--ink-rgb),0) 86%,rgba(var(--ink-rgb),.32) 100%)}
- /* ============ Magazine chrome:顶部 meta + 底部 foot ============ */
- .chrome{display:flex;justify-content:space-between;align-items:flex-start;font-family:var(--mono);font-size:12px;letter-spacing:.18em;text-transform:uppercase;opacity:.7}
+ /* ============ Magazine chrome:顶部 meta + 底部 foot ============
+ (v1 布局 + v2 字号在此合并为唯一定义,不要在别处二次定义) */
+ .chrome{display:flex;justify-content:space-between;align-items:flex-start;font-family:var(--mono);font-size:max(11px,.78vw);letter-spacing:.2em;text-transform:uppercase;opacity:.62}
.chrome .left,.chrome .right{display:flex;gap:2.4em;align-items:center}
.chrome .sep{width:40px;height:1px;background:currentColor;opacity:.4}
- .foot{margin-top:auto;display:flex;justify-content:space-between;align-items:flex-end;font-family:var(--mono);font-size:12px;letter-spacing:.14em;text-transform:uppercase;opacity:.55}
+ .foot{margin-top:auto;display:flex;justify-content:space-between;align-items:flex-end;font-family:var(--mono);font-size:max(11px,.78vw);letter-spacing:.18em;text-transform:uppercase;opacity:.5}
.foot .title{font-family:var(--serif-zh);font-weight:400;letter-spacing:.05em;text-transform:none;opacity:.75;font-size:13px}
.tag{display:inline-block;font-family:var(--mono);font-size:11px;letter-spacing:.24em;text-transform:uppercase;padding:6px 14px;border:1px solid currentColor;opacity:.85}
@@ -81,7 +82,7 @@
.h3-zh{font-family:var(--serif-zh);font-weight:500;font-size:1.9vw;line-height:1.35}
.body-zh{font-family:var(--sans-zh);font-weight:400;font-size:max(15px,1.22vw);line-height:1.75;opacity:.82;letter-spacing:.01em}
.body-serif{font-family:var(--serif-zh);font-weight:400;font-size:max(15px,1.3vw);line-height:1.65;opacity:.88}
- .lead{font-family:var(--serif-zh);font-weight:400;font-size:1.9vw;line-height:1.4;opacity:.85}
+ .lead{font-family:var(--serif-zh);font-weight:400;font-size:1.75vw;line-height:1.5;opacity:.86}
.meta{font-family:var(--mono);font-size:max(11px,.88vw);letter-spacing:.16em;text-transform:uppercase;opacity:.6}
.big-num{font-family:var(--serif-en);font-weight:800;font-size:10vw;line-height:.85;letter-spacing:-.03em;font-feature-settings:"tnum"}
.mid-num{font-family:var(--serif-en);font-weight:700;font-size:5.5vw;line-height:.88;letter-spacing:-.02em;font-feature-settings:"tnum"}
@@ -245,14 +246,7 @@
/* 英文标题专用(Playfair 衬线) */
.h-hero-en,.h-xl-en{font-family:var(--serif-en);letter-spacing:-.025em}
- /* ---------- lead 引语 ---------- */
- .lead{
- font-family:var(--serif-zh);
- font-weight:400;
- font-size:1.75vw;
- line-height:1.5;
- opacity:.86;
- }
+ /* ---------- lead 引语:定义见上方“字体规则”区块(已合并,勿重复定义) ---------- */
/* ---------- meta-row 底部元数据 ---------- */
.meta-row{
@@ -387,9 +381,13 @@
/* ---------- 图片 frame-img(layouts.md 主命名) ---------- */
/* 在旧样式里已定义,这里补 img-cap 命名别名与增强 */
figure.frame-img{margin:0;display:flex;flex-direction:column;min-width:0}
+ /* 有图注时:图片弹性收缩,图注收进固定高度/比例框内部,
+ 否则 img 的 height:100% 会把 figcaption 挤出 overflow:hidden 裁掉 */
+ figure.frame-img:has(> .img-cap) > img{flex:1 1 auto;min-height:0;height:auto}
.img-cap{
display:block;
- margin-top:.8vh;
+ flex:0 0 auto;
+ padding:.7vh .9em .9vh;
font-family:var(--mono);
font-size:max(10px,.8vw);
letter-spacing:.22em;
@@ -407,9 +405,7 @@
opacity:.6;
}
- /* ---------- chrome & foot 补位(layouts.md 简单写法) ---------- */
- .chrome{font-family:var(--mono);font-size:max(11px,.78vw);letter-spacing:.2em;text-transform:uppercase;opacity:.62}
- .foot{font-family:var(--mono);font-size:max(11px,.78vw);letter-spacing:.18em;text-transform:uppercase;opacity:.5}
+ /* ---------- chrome & foot:定义见上方“Magazine chrome”区块(已合并,勿重复定义) ---------- */
/* ============ 动效系统(Motion One 驱动) ============
所有 [data-anim] 元素默认隐藏,进入页面时由 JS 逐个揭示。
@@ -432,6 +428,8 @@
body.low-power *::after{animation:none!important;transition:none!important}
body.low-power.motion-ready [data-anim],
body.low-power [data-anim]{opacity:1!important;transform:none!important}
+ /* ESC 索引缩略图:克隆的 slide 不经过动效播放,强制显示所有待动画元素 */
+ #overview [data-anim]{opacity:1!important;transform:none!important}
/* ---------- 响应式降级 ---------- */
@media (max-width:900px){
@@ -730,7 +728,10 @@ addEventListener('touchend',e=>{
}
},{passive:true});
-go(0);
+/* ?slide=N 直达(1-based),与 Swiss 模板行为一致 */
+const initialSlideParam = new URLSearchParams(location.search).get('slide');
+const initialSlide = initialSlideParam ? Number(initialSlideParam) - 1 : 0;
+go(Number.isFinite(initialSlide) ? initialSlide : 0);
@@ -850,8 +851,8 @@ if(motion){
window.__playSlide = playSlide;
window.__pipeAdvance = pipeAdvance;
- // 首屏:go(0) 已跑过(同步),没来得及触发动效 → 这里补一下
- playSlide(0);
+ // 首屏:go() 已跑过(同步),没来得及触发动效 → 这里补一下(尊重 ?slide=N)
+ playSlide(window.__currentSlideIndex || 0);
}