--- name: animated-sketch-diagram description: 生成"黑墨手绘涂鸦"风格的动画架构图/流程图:米色纸面、针管笔墨线、极淡水洗色块、简笔涂鸦图标、序号章、连线上的流动圆点动画、图标微动效。产出单文件自包含动画 HTML(SVG+CSS),可一键导出无缝循环 GIF。当用户想画架构图、流程图、信息图、技术示意图、对比图、pipeline/workflow 可视化,或提到"手绘风""涂鸦风""动图""animated diagram""GIF 架构图"时使用;即使用户没明说要动画,做技术概念科普配图时也应优先考虑本 skill。 metadata: { "homepage": "https://github.com/OLDyade/animated-sketch-diagram", "openclaw": "{\"emoji\": \"✏️\", \"dimensions\": [\"手绘动画架构图\", \"图表可视化\"], \"user_instructions\": [\"帮我画一张架构图动图\", \"画一张手绘风流程图\", \"把这个概念画成动画示意图\"], \"requires\": {\"bins\": [\"node\", \"ffmpeg\"]}}" } --- # Animated Sketch Diagram(手绘涂鸦风动画信息图) 产出一张像资深工程师在牛皮笔记本上手绘的系统图:米色纸面、黑墨抖动描边、 极淡水洗色块、简笔涂鸦图标(小人/文档/纸箱/月亮)、序号章、✦ 点缀, 连线上有小圆点沿路径流动、图标带微动效,整体 3s 无缝循环。 **产物**:一个自包含 HTML 文件(内联 SVG + CSS 动画 + base64 字体,双击即可播放); 需要 GIF 时用 `scripts/render-gif.mjs` 逐帧录制。 ## 工作流 ### 1. 先规划内容,再动笔 **版式跟着内容的天然形状走,不要反过来。** 先判断主题本身长什么样,再选版式原型: | 内容的天然形状 | 版式原型 | |---|---| | N 个并列的类别/方案/阶段,各自内部有流程 | 横向色带 band(左侧标签栏 + 右侧流程画布) | | 自上而下的分层架构(前端→服务→存储) | 纵向层叠:全宽色层堆叠,跨层竖直连线 | | 一个核心与多个卫星(hub-and-spoke) | 径向:中心 mascot 大圆 + 环绕节点 + 放射连线 | | 两三个东西逐维度对比 | 并排色柱/矩阵,同一行是同一维度 | | 单一主流程 | 不用色带,一条蛇形/折线主轴铺满画布 | | 时间演进 | 横向时间轴 + 上下交错的事件卡 | 原型可以混搭(如 band 内部径向)。所有原型共用同一套元件: - **区块(region)**:一级分区的圆角水洗色块,左上序号章 + 顶部居中标题;相邻区块换色。 - **内卡(node)**:纸白小卡片 = 简笔涂鸦图标 + 手写标签,一个区块内 3~6 个为宜; "文档/列表"用折角纸 + 三两行短横线速记,"一叠"用偏移副本。 - **连线(edge)**:微弯曲线箭头,线上可挂小字标签。**拓扑跟内容走**:分支、汇聚、 往返、回环、跨区块长弧、环形轨道都是一等公民,不要把图默认摆成单向流水线—— 内容里有循环/转向,图上就要画出来并让圆点沿它转。实线/虚线只表达"确定/弱、 数据面/控制面"这类强弱语义,不是"主流程/回环"的分工。 - **点缀件**:虚线引用框(放命令/示例)、简笔小人、✦ 火花、中央手写口号。 **规划的最后一步是编排流动**:动画不是装饰,是把主题里"什么在流动"讲出来。 先用一句话回答——这张图里流动的是什么(数据?请求?记忆?任务?), 它从哪来、经过谁、在哪分叉、在哪转圈、最后到哪去——再把这条"流动脚本" 落成路径:该分支就分支、该汇聚就汇聚、该循环就让圆点沿弧转回去。 主题本身是环(飞轮、迭代、生命周期)→ 图的动线就该是环; 主题是发散/收敛(一发多、多合一)→ 动线就该扇形展开/合拢。 看成品时"流动的形状"应该能复述出主题的结构,全图只有一排同向箭头 通常说明流动没规划,不是主题真的这么直。 内容永远来自用户的主题。不要照搬任何示例里的文字、节点名或结构; 示例里的"三条横带"只是原型之一,不是本 skill 的固定输出形状。 ### 2. 反问图标来源(交互场景必做) 动笔前用 AskUserQuestion 问一次图标怎么来(用户此前已表态或本次已指定的不重复问): 1. **生图模型生成**(质感最像真手绘)——选这个就先做工具发现:当前环境有生图 skill/MCP/工具就直接用;没有就请用户提供生图 API。生成时统一约束提示词: 黑墨简笔涂鸦、单一线宽、纸色/透明底、无阴影;产物转 data URI 用 `` 内嵌, 尺寸对齐 token,不引外部 URL。 2. **自己设计 SVG 简笔图标**(默认推荐,零依赖)——按 recipes §4 的涂鸦配方就地画。 3. **网上搜现成素材**——找 CC0/开源手绘图标(如 tabler、handdrawn 系列), 下载 SVG 后统一改成 ink 色和 2px 线宽再内嵌,风格必须归一。 无头/非交互/子代理场景不要卡在提问上:直接用方案 2。 ### 3. 读风格系统 读 `references/style-guide.md` —— 调色板、字体、描边、圆角、间距、动画节奏的全部 token。 风格的辨识度来自 token 的组合,务必按 token 来,不要自由发挥配色。 ### 4. 读代码配方,组装 HTML 读 `references/svg-recipes.md` —— 面板、节点、箭头、流动圆点、图标微动效、标题高亮 的可复制 SVG/CSS 模式。按配方组装出**一个** HTML 文件。 关键约束(导出 GIF 依赖这些): - 只用 **CSS 动画**(`@keyframes` + `offset-path`),不用 SMIL ``, 不用 JS 驱动动画 —— 录制脚本靠 `document.getAnimations()` 逐帧定格。 - 所有 `animation-duration` 必须能整除全局循环时长 `--loop`(默认 3000ms), 且 `infinite` 循环,这样 GIF 首尾无缝。 - 字体用 base64 内联(命令见 recipes),保证文件自包含、离线可开。 ### 5. 导出 GIF **GIF 是主要交付物**(HTML 只是源),写完 HTML 就导: ```bash cd ~/.claude/skills/animated-sketch-diagram/scripts npm install # 仅第一次 node render-gif.mjs /path/to/diagram.html /path/to/diagram.gif ``` 脚本自动找本机 Chrome/Chromium,逐帧截图后 ffmpeg 合成(需要 ffmpeg)。 参数:`--fps 25 --loop 3000 --scale 2`——**scale 保持 2**,1x 的 GIF 文字发糊。 ### 6. 自检-修正循环(必做,产完不算完) 审查对象是**导出的 GIF**,不是 HTML:从 GIF 里抽 2~3 个间隔帧 (`ffmpeg -i x.gif -vf "select='not(mod(n,25))'" -vsync 0 f%d.png`), 用 Read 看图,逐项过: - **清晰度**:文字边缘干净可读,没有糊化/噪点(糊 = scale 忘了 2 或被后期缩放) - **排版**:内容撑满区块(两侧无大白边)、区块高度贴内容、眯眼看墨色分布均匀无"成片空白" - **动画**:对比两帧,圆点位移明显(速度感)、微动效在动;播放确认循环无接缝、 流动"一眼可见"而不是要凑近找 - **流动编排**:流动的形状能复述主题结构(有分叉/汇聚/回环的主题,动线也有), 不是一排同向平行线 - **风格**:手绘抖动生效、箭头贴节点边缘、文字无溢出、中文字体正确 - **内容**:节点/连线/标签与规划一一对应,无错别字 **发现任何一项不合格:改 → 重渲 → 重看,直到全过。** 至少完整跑一轮这个循环才能交付; 交付时把 GIF 和 HTML 一起给出,并注明尺寸/帧数/文件大小。 ## 质量红线 - 构图要"密":区块尺寸贴内容,每个区块必须有一叠纸/小人/回环/标注框等非线性元素, 连线挂标签——细则见 style-guide.md 的"构图密度"。一排等宽盒子加箭头 = 不合格。 - 区块之间 24px+,节点间 36px+;密不等于挤。 - 全图基本单色墨:彩色只出现在水洗底色和流动圆点上,文字图标一律 ink。 - 一个区块一种水洗色;相邻区块换色。 - 手写体只用于图内文字;代码/命令片段用等宽字体放引用框里。 - 动画是点缀不是主角,但必须"一眼可见":圆点小(r≈4.5)而速度要跟上 (80~150px/s,见 style-guide 动画节奏),微动效幅度小。