1实现原理 · 为什么它能做到
全文执行主轴是「渐进式揭示」:一次只推进一个信息节拍,揭示顺序固定为 nodes → edges → labels,并配「聚焦 + 上下文」(活动元素满不透明、其余压到 ~0.35)避免观众迷失。
Never show everything at once. Reveal in this order: **nodes → edges → labels**.
画线类动效统一走 stroke-dashoffset 机制,并用 pathLength="1" 把几何长度归一化成 0→1 的进度值,因此同一套 dash 参数可驱动任意长度的边。
`pathLength="1"` lets one dash value drive any edge length.
图表动效给三件最小可运行实现:柱体自基线 scaleY 生长、折线 getTotalLength + transition 绘入、数字用 rAF + easeOutCubic 插值累加并配 Intl.NumberFormat 千分位。
| Count-up | interpolate value with eased `t` | `easeOutCubic` |
交付按层级分轨:自包含图表 = 单文件 HTML(内联 SVG + CDN 库 + 一个内联 script 主时间轴),且页面必须支持 ?t=N 冻结,使无头截图落在确定性画面上。
if (t !== null) { tl.pause(); tl.seek(parseFloat(t)); }
验证回路 = 在 start / mid / end 三个时刻无头截图,人眼核两件事:保真度(揭示顺序、连线落点、count-up 是否落在精确值)与工件(截断标签、离屏节点、字体 FOUC、接缝卡顿)。
count-ups land on the EXACT values
reduced-motion 给的是终态分支而非降级动画:循环类动效直接 animation:none,展示已合成的最终图。
`prefers-reduced-motion` path shows the final composed diagram without looping motion.
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| cli | npx / Playwright(无头截图) |
| cli | ffmpeg(contact-sheet.sh 拼图) |
| cli | npx -y playwright(仓库根 seek-shot.sh 内部) |
| network | jsDelivr CDN:gsap ESM(交付物在浏览器端加载) |
| package | 第三方动画/图表库:GSAP、Framer Motion、D3、anime、Remotion(自 CDN 或 npm 引入) |
4风险提醒 风险提醒:橙色 · 评估后使用
- 复核回路引入远程包与浏览器二进制 — 跑一次验证即从 npm 拉 playwright 并下载 Chromium;离线/内网或代理受限环境会失败,且属供应链接触面。可改用本地已装的 Playwright/浏览器或人工截图完成同一回路。
- 产物期 CDN 依赖(jsDelivr) — 交付 HTML 引远端 ESM 且未锁版本;CDN 变动或被投毒会直接影响成品的浏览器端行为。建议固定版本或把库内联进单文件。
- 跨 pack / 跨目录引用悬空 — `scripts/` 在仓库根、`remotion-video` 属另一 pack;只安装 skills/diagram-animation 时这些引用无法兑现。
- 「数字落到精确值」靠人工核对 — 契约要求 count-up 落在数据源的真实值并列为验收项,但没有自动断言/快照比对;批量高频使用时应自行加数值断言。
- 教学型默认参数易被照抄 — 0.5–1.5s hold、stagger 0.06s、dim opacity .35 等是通用起点而非针对具体画面的结论;脱离信息密度照搬会让节奏失真。
5第二遍独立确认
- [ok] 外部依赖调用点复核(npx playwright / ffmpeg / CDN) — SKILL.md Verify loop 内确有 `npx playwright screenshot --wait-for-timeout=500 "file://$PWD/diagram.html?t=1.2" frame-mid.png`;仓库根 scripts/seek-shot.sh 同为 npx playwright 截图、scripts/contact-sheet.sh 为 ffmpeg hstack;SKILL.md 顶部代码块确有 cdn.jsdelivr.net 的 gsap ESM import。三条均落地,非推测。
- [ok] 无凭证 / 无 env / 无业务 API 反查 — skill 两个文档与三个仓库脚本中无 API_KEY/token/secret/.env 读取、无 curl/wget、无 fetch 到业务端点;唯一远程动作是包管理器与 CDN 静态资源。判 orange 的依据只是「远程包/镜像」,不含凭据读取。
- [ok] 目录资产面清点 — skills/diagram-animation/ 下仅 SKILL.md(163 行)、references/ 一份 218 行 cookbook、0 字节 README.md;无 scripts/、无模板、无数据文件——「纯指令 + 内联代码片段」结论成立。
- [discrepancy] 跨引用可解析性 — SKILL.md 有两处引用落在本 skill 目录外:`scripts/seek-shot.sh`/`scripts/contact-sheet.sh` 位于仓库根(单装本 skill 目录会悬空,需装整个 repo);`see remotion-video` 指向的 remotion-video 不在本 repo 的 5 个 skill 中(属同作者 motion-design-skills pack),同样悬空。同 repo 内的 whiteboard → explainer-video 引用可解析。
- [ok] 功能声明 vs 实际能力 — frontmatter 宣称覆盖 SVG / Framer Motion / D3 / Remotion 四栈,正文 Build-tool choice 逐栈给出适用判据,reference 给出对应可运行实现(Framer Motion pathLength、D3 数据绑定、Remotion spring/interpolate);无夸大,也未声称能自动出图或代跑渲染。
- [ok] 「确定性」主张的成立条件 — 成立范围有明确边界:GSAP/JS 主时间轴的 ?t 冻结与 Remotion 帧驱动路径可逐帧确定;而 CSS keyframes/transition 分支本身不可 seek,SKILL.md 明确要求「drive reveal order with `animationDelay`; freeze by pausing/seeking the equivalent JS timeline」并给出 prefers-reduced-motion 终态——主张非无条件承诺。
6结论
e196243bfb566372…3e2d411b72