深入解读 Claude Design 动画视频 Skill:基于 animations-v3 连续合成引擎的时间轴动态设计
【免费下载链接】system_prompts_leaksExtracted system prompts from Anthropic - Claude Fable 5.1, Opus 5, Claude Design, Claude Code. OpenAI - ChatGPT GPT-6-Astra, Codex. Google - Gemini 3.8 Flash, 3.1 Pro, Antigravity. xAI - Grok, Grok Bot, Cursor, Kimi and more! Updated regularly.项目地址: https://gitcode.com/GitHub_Trending/sy/system_prompts_leaks
导读
本篇文章以仓库中 Claude Design 的animated-videoSkill 为核心(原始指令见 Anthropic/claude-design/skills/animated-video/SKILL.md),完整剖析其“用 HTML 页面制作可导出动画视频”的工程方法论。你将掌握:为什么一切动画必须构建在animations_v3.jsx连续合成引擎之上、如何用OM_SCENES/OM_PLAYBACK文字量构建可被宿主时间轴编辑器回写的场景表、Cue-First编排纪律与时间拉伸模型、<Shot>/<Captions>/ 缓动库的用法,以及视频导出的data-om-exportable-video契约与质量自查流程。文中还结合引擎源码 Anthropic/claude-design/starter-components/animations-v3.jsx 与 Anthropic/claude-design/starter-components/tweaks-panel.jsx 做原理级佐证,可直接用于在 Claude Design 中制作产品走查、动态信息图、可导出的 16:9 / 9:16 短视频。
一、Skill 定位与适用场景
animated-video是 Claude Design(Claude Design 的完整系统提示与工具清单见 Anthropic/claude-design/claude-design.md)内置的 19 个“用户可调用(user-invocable)”技能之一,其 frontmatter 表明定位为 “Timeline-based motion design”(时间轴驱动的动态设计),在 2026 年 8 月 19 日的技能对齐中被重写为适配animations_v3.jsx连续合成引擎(见 Anthropic/claude-design/skills/README.md)。
适用对象是“可导出为视频”的动画作品,交付物是一个 HTML 页面:
- 时间轴驱动的动画 / 动态设计,具备平滑转场;
- 逐帧设计的序列,带播放控制(play / pause、scrubber 拖拽条);
- 强调视觉叙事,贴合 Anthropic 品牌调色板;
- 以固定宽高比(16:9 或 9:16)导出成片;
- 需要获知某元素坐标(如让光标在元素之间移动)时,用 HTML ref 抓取位置。
二、一切动画都必须构建在 animations_v3 引擎上
Skill 开篇给出了一个强制要求:任何动画作品——哪怕它托管在某个 design-components 页面上——都必须用animations_v3.jsxstarter 搭建。所谓“头盔脚本 + x-import 结构”本身就是 starter 的标准使用场景,而不是豁免理由。
理由很实在:跳过 starter 等于悄悄移除用户的时间轴编辑器——场景裁剪(trim)、速度调整(speed change)与视频导出这些能力只存在于基于引擎的页面上。许可的例外只有两类:① 在某个更大的非动画设计里放一个次要的动态点缀;② 用户明确要求不使用 starter。
同时要遵守几条硬约束:
- 不要再把
animations.jsx或animations-v2.jsx与它同时加载——各版引擎共享 window 全局变量,后加载者覆盖先加载者(“last wins”); - 已使用旧版 starter 的既有项目保持原状,不要迁移已有动画。
开始动作:copy_starter_component
动画项目的第一步是调用copy_starter_component,参数为kind: "animations_v3.jsx"。该引擎在claude-design.md中被描述为“continuous-composition engine”(连续合成引擎),复制完成后应立即通读文件(文件头部有完整的 USAGE 注释块)。
引擎的核心理念:连续合成
从源码看,动画的“整体是一棵元素树、由一个作者时间时钟渲染”这一模型贯穿始终(见 animations-v3.jsx):
The animation is ONE element tree rendered as a pure function of one authored-time axis. Nothing mounts or unmounts at section boundaries, so any element can move, morph, or persist across them by ordinary interpolation.
也就是说,场景边界处不会发生挂载/卸载——任何元素都可以通过普通的插值跨越边界移动、形变或驻留。整段动画在时间上是连续的,这正是它读起来像“一部连续视频”而非“一组幻灯片”的原因。
引擎对外暴露的核心 API(均挂载为 window 全局):
| API | 作用 |
|---|---|
<CompositionStage width height scenes playback bg> | 舞台根组件,内部包住唯一的整片组件<Piece/> |
useComposition() | 返回{T, CUES, time, duration, authoredTotal, playing} |
<Shot from to> | 在两个作者时间之间显示子元素(作者侧硬切,一行搞定) |
<Captions items> | 字幕/说明条,同一时刻至多一条可见,按键 T 驱动 |
Easing | 缓动库:linear、Quad/Cubic/Quart/Expo/Sine/Back、easeOutElastic等 |
interpolate(input, output, ease) | 多关键帧插值(Popmotion 风格) |
animate({from, to, start, end, ease}) | 单段 tween,返回fn(T) |
clamp(v, min, max) | 数值钳制 |
其中useComposition()是编排的“数据源”:
T:作者时间秒(会随用户的裁剪/变速按节拉伸)——所有 choreography 都以T为键,绝不要用你自己的时钟或墙钟时间;CUES:由OM_SCENES推导出的{章节名: 作者起始秒}表。
CUES 的容错语义(源码级细节)
CUES在引擎中不是一个普通对象,而是通过ccCueProxy包裹的 Proxy(animations-v3.jsx):编排代码引用了不存在的章节名时,不会抛错而是返回NaN,同时记录到unknownRef;随后CompositionStage会在预览区舞台下方(SVG 导出区之外)显示一个徽章choreography references unknown section(s): …(animations-v3.jsx)。徽章只会出现在预览与截图里,永远不会进入导出视频。另外重复的章节名绑定到首次出现的那个位置,ccDerive中通过hasOwnProperty去重(animations-v3.jsx)。
三、作者契约(THE AUTHORING CONTRACT)
这是 Skill 中“必须精确照做”的部分,它决定了宿主时间轴的裁剪与变速手势能否回写到你的源文件:
- 场景表声明为 JSON 字符串字面量,放在主文档的一个普通内联
<script>中(type="text/babel"不行,兄弟.jsx文件也不行——只有普通的内联脚本字面量可供编辑器回写定位):<script>window.OM_SCENES = '[{"name":"Opening","dur":3},{"name":"Build","dur":5}]';</script>注意格式:必须是精确的
JSON.stringify输出,没有多余空格。源码示例进一步展示了每个条目可带"desc"字段(一句大白话描述该节发生什么,用户会在时间轴的 section 弹层里读到,见 animations-v3.jsx)。 window.OM_PLAYBACK同样声明并原样传入(取值'{"mode":"loop"}'或'{"mode":"times","count":N}';省略时保持循环行为,但宿主 “Repeat” 控件对本文档会变为只读,见 animations-v3.jsx)。- 把两者原样透传给唯一包裹整片动画的组件:
<CompositionStage scenes={window.OM_SCENES} playback={window.OM_PLAYBACK}> <Piece /> </CompositionStage>
场景表就是用户控制视图(名称、顺序、播放时长),引擎从中推导 cue 表——因此字面量是结构的唯一来源(single source of structure),结构永远不可能漂移。
用户编辑如何回写与生效(双向通道)
引擎内部通过SceneSync/PlaybackSync两个隐藏组件实现“写回”闭环(animations-v3.jsx):
- 组件把原始字符串逐字烙在导出根元素上:
data-om-timeline-scenes/data-om-timeline-playback——宿主回写就以这个精确值为锚点; - 同时监听宿主派发的
data-om-timeline-scenes-update/data-om-timeline-playback-update事件,用ssParse/ppParse做严格校验后才更新本地状态;不合法的更新会被忽略,“坏更新绝不能拆掉一个正在工作的合成”。
引擎侧的场景表校验规则(ssParse,与宿主shared/timeline.ts解析器保持一致,见 animations-v3.jsx):
- 原始文本必须是字符串、非空、且 ≤ 16KB(16 * 1024 字节);
- JSON.parse 后必须是数组,条目数 1 ~ 50;
- 每条必须含字符串
name与数字dur,且dur有限、落在(0, 300]秒区间。
播放设置校验(ppParse,animations-v3.jsx):要么{"mode":"loop"}(唯一键),要么{"mode":"times","count":N},其中count为 1 ~ 99 的整数,二者严格“全有或全无”,否则视为空、回退到循环默认值。
播放回写(PlaybackSync)细节
引擎会额外把播放字面量逐字烙为根元素的data-om-timeline-playback属性,并监听宿主在写回后派发的data-om-timeline-playback-update事件;只有通过ppParse的新值才会触发onUpdate。这段逻辑保证“宿主时间轴的 Repeat 控件与作者声明的播放模式永远一致”。
可选字段nat(引擎的作者时长锚点)
条目上的可选nat字段是引擎的作者时长锚点:宿主时间轴在第一次重计时时把它烙到该节上,作者不要手工去设置它(animations-v3.jsx)。ccDerive计算authStart(累积作者时长)时优先用nat,否则退回用dur(animations-v3.jsx)。
四、Cue-First 编排纪律:让片子读起来像一部连续视频
Skill 强调,一个作品之所以“像一部连续视频”,靠的是严格的Cue-First Discipline:
- 先写
OM_SCENES字面量——它就是全片的提纲。然后从useComposition()取{T, CUES},把所有 choreography 全部键到T与CUES.SectionName(作者秒)上,绝不键到自己的时钟或墙钟时间。 - 每个章节一个辅助组件以求可读,但这些组件始终全部渲染在那一棵树里、以 cue 为键——绝不做按章节的条件挂载。一个横跨边界的共享元素,就是“起止点跨在一个 cue 两边的普通运动”:
animate({from: 0, to: 1, start: CUES.Build - 0.4, end: CUES.Build + 0.6})(T)这种跨边界滑动会穿过 cue 平滑过渡,用户放慢任意一边都只会放慢这段滑动,而不会打断它。
- 一开始就定义恰好三个运动辅助函数(如
MOTION = {enter, draw, pop}包装 Easing 曲线),除此之外不再使用任何缓动或 transform;只有一个字幕元素、同一时刻只有一条可见(<Captions>内置了此行为)。
硬切现在是内容而非结构
当某节被用户裁剪或加速时,引擎会把该节同一段作者切片重放到新的播放长度上——键到T上的 choreography 会整体重计时,绝不会被截断(这就是 time-stretch / 时间拉伸模型)。作者侧的硬切因此要表达成“内容”:把某镜头的元素包进<Shot from={CUES.X} to={CUES.Y}>,可见性在两个 cue 处翻转,子元素保持挂载,图片与视频因此能维持就绪状态(不因切走而重新加载)。
源码中Shot的实现证实了这一点(animations-v3.jsx):它用visibility: visible/hidden控制显隐而非display/ 条件渲染,且to缺省为Infinity(有头无尾的镜头直达片尾)。
循环片段的接缝
循环播放的片子,其最后一个作者帧会紧接着第一个帧出现——所以首尾必须一致(收尾让编排落在authoredTotal上,开场从 0 开始)。Loop seams are the one surviving boundary rule(循环接缝是唯一存活的边界规则,animations-v3.jsx)。
五、时间模型与“只从 T 渲染”原则
理解引擎,关键是理解它的两层时间轴:
- 播放时间轴(host 驱动):
time/duration,由用户裁剪与变速后的总播放时长决定; - 作者时间轴(你编排所用):
T/authoredTotal,由各节的原始作者时长累积而成。
引擎把播放时刻映射回作者时刻靠的是ccWarp(时间弯曲,animations-v3.jsx):先定位当前播放秒落在哪一节,再取该节内的局部进度,按nat / dur比例映射回作者时间。这正对应“引擎重放该节同一段作者切片到新播放长度”的语义。
另一个不可违背的实现原则是RENDER FROM T ONLY(animations-v3.jsx):导出器逐帧 seek 并同步提交,可能在 seek 事件一返回的瞬间就序列化舞台——任何由useEffect或自己的requestAnimationFrame绘制的画面都会滞后于那次提交、导出成陈旧内容。因此一切可见内容都必须从T纯函数式地渲染,seek 到的帧即是该时刻的确定性渲染。
Seek 事件与宿主播放栏
引擎的播放时间推进有三种来源且遵守“任一时刻只有一只时钟在驱动”的原则(animations-v3.jsx):
- 引擎自己的 rAF 时钟(autoplay / 空格键 / 播放栏);
- 宿主/导出传输派发的
data-om-seek-to-time-frame事件(detail: {time, playing?, sync?}); - 宿主播放栏的连续 seek 泵(其 seek 带
playing: true标记,靠SS_EXT_PLAY_MS = 400ms看门狗在流中断时自动衰减外部播放锁存,见 animations-v3.jsx)。
凡带sync: true的 seek 会走ReactDOM.flushSync同步提交,使“dispatchEvent 返回的瞬间舞台 DOM 就已呈现该帧”(这是视频导出器依赖的快路径);运行时无flushSync时则自动降级为异步路径(animations-v3.jsx)。
字体内联
useInlineFontsInto会把页面里所有@font-face规则复制进 SVG foreignObject 内的<style>,并把字体 URL 重写为data:URL,完成后给 svg 打上data-om-fonts-inlined标记(animations-v3.jsx)。这让 svg自描述——单独序列化它(视频导出快路径)依然能带上正确字体渲染。跨域样式表(如 fonts.googleapis.com)会回退为直接 fetch CSS 文本再正则抽取字体块。
六、给每个动效项目配一个 Motion editor 开关
每一个动效项目都要配一个 Tweaks 面板(starterkind: "tweaks_panel.jsx"),其TWEAK_DEFAULTS中必须包含:
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "motionEditor": true, /* 其它你的可调参数 */ }/*EDITMODE-END*/;并用一个<TweakToggle label="Motion editor">绑定该键。motionEditor键是宿主时间轴编辑器的可见性闸门:用户在 Tweaks 面板翻转它即可显示或隐藏编辑器条,而动画本体、时间数据和导出能力无论开关与否都不受影响。
为让翻转状态能持久化,TWEAK_DEFAULTS字面量必须声明在主文档的普通内联<script>中——对应源码里/*EDITMODE-BEGIN*/…/*EDITMODE-END*/注释块的约定(见 tweaks-panel.jsx)。
从 tweaks-panel.jsx 的实现可以补全细节:
- 面板是右下角浮动的可拖拽外壳,通过
useTweaks(defaults)统一管理状态; - 任何一次
setTweak都会向宿主postMessage({type:'__edit_mode_set_keys', edits}),宿主据此把EDITMODE块中的改动回写到磁盘上的源文件(tweaks-panel.jsx#L171-L188); - 面板监听
__activate_edit_mode/__deactivate_edit_mode消息开关自身,同时广播__edit_mode_available告知宿主工具可用(tweaks-panel.jsx#L229-L238); - 除
TweakToggle外,面板还内置了TweakSlider、TweakRadio、TweakSelect、TweakText、TweakNumber、TweakColor、TweakButton等一整套控件,供把颜色、字号、间距等参数暴露给用户;作者可以在面板内构建自定义控件(“Tweak* 控件是下限不是上限”,tweaks-panel.jsx#L55-L56)。
截图黑屏是捕获伪影
舞台渲染在<svg><foreignObject>内部;如果对它的截图返回全黑,那属于捕获伪影(capture artifact)——应相信实时预览,而不是据此认定页面坏了。这一点在 Skill 中单独点名提醒,是因为导出与截图走的是 DOM 序列化/合成两条不同路径。
七、验收流程:做成前先“看”一遍
“动画是复杂的代码!”——每个视觉元素、每个章节都要做成可复用的 JSX 组件,并投入迭代调时间轴。Skill 要求的收尾检查是:在宣布完成前必须观看成片。
只凭精心挑选时间戳的静态截图,恰好会掩盖让片子显得割裂的边界 bug(跳动、时间错位的运动)。正确的姿势是:
- 用一次
multi_screenshot调用生成一组连续剧照(filmstrip)——每次multi_screenshot至多 12 步,长片请把步数花在边界上; - 每一步的 JS 中先 seek,再截图。seek 方式:向导出根元素派发自定义事件:
document.querySelector('[data-om-exportable-video-with-duration-secs]') .dispatchEvent(new CustomEvent('data-om-seek-to-time-frame', { detail: { time: T, sync: true } }));其中
T取覆盖每一个场景边界两侧的值(boundary ± 0.15s;边界即OM_SCENES各dur的运行求和),外加一两个场景中间锚点; - 相邻两帧画面若无法视觉匹配,就是需要修复的间断点。
关于工具约束:claude-design.md明确multi_screenshot每次调用最多 12 步、优于多次单步截图调用(每步可先跑 JS 再捕获),偏好“一步一状态、一次调用看多状态”(见 Anthropic/claude-design/claude-design.md)。
可评论性辅助:data-screen-label
为了便于按时间点评论,动画根的data-screen-label属性应每秒更新为当前时间戳——这样你评论“3.2 秒处……”时,读取评论的另一端能拿到精确的绝对时间,而不是相对描述。
八、动画叙事与视觉节奏要点
Skill 附带的动画创作建议同样是实战要点:
- 叙事优先:动手做任何东西前,先确定故事弧、关键张力、角色等,与你想要传达的信息对齐,并拿给用户确认;
- 遵循经典动画原理:anticipation(预备)、easing(缓动)、follow-through(跟随)、exaggeration(夸张)等迪士尼动画师原则;
- 场景构成:建立镜头(establishing shot)先交代环境(必要时用标题或字幕,但尽量 show-don't-tell),随后对动作主体做重的推近;可用硬切、Ken Burns 式缩放或鼠标跟随。大多数场景要存在于“写实语境”里:有背景,或存在于电脑/手机的 UI 中,元素通常不应悬浮在虚空中;
- 短片中的“场景”多为单一镜头、或同一设定下的镜头序列;场景也可以是“滑片”(slide)——屏幕上的文本或图形被生动地强调/高亮以吸引注意力。决定镜头:可以是从远景慢慢推近到焦点区域,可以是两人或两组图形张力下的快速来回切换,也可以是跟随某物(光标、曲线)游走;
- 除非刻意留白(held beat),画面里始终要有东西在动——镜头、元素或转场在缓慢摇移、缩放、漂移或构建。完全静止的一帧会被当成 bug;图片尤其要常做缓慢推拉/平移,要有“动作”,要有文字或图形浮现/构建,或快速连续剪切;
- 展示文字或图片后要留出阅读停顿——秒级时长,之后才能展示下一个东西;
- 若表现光标/指针运动(如产品走查或原型),应对它推近并用阻尼视口动画跟随(类似 Screen Studio 的效果),且必须用 HTML ref 定位屏幕元素,保证光标指着正确的东西。
九、导出为视频:宿主编辑器下的默认路径与手写契约
要让内容可被导出为视频(流程为Share → Export → Video),分两种情况:
情形 A:基于 animations starter(默认情况)
若构建在animations_v3.jsx(旧项目中的animations_v2.jsx)之上,舞台组件已经完整履行导出契约:它自己拥有可导出属性、seek 监听器、<svg><foreignObject>包装与字体内联(animations_v2另提供<VideoSprite>辅助组件来循环播放<video>片段)。因此:
绝不要自己往任何元素上添加
data-om-exportable-video-with-duration-secs。把它加在舞台上层的某个包装元素上,会产生两个嵌套的可导出根,导出器与时间轴传输会绑定到错误的外层根——播放控制与导出会静默失效。
情形 B:未用 starter 的页面自行实现契约
只有在完全没有 starter 的页面里才需要手动实现,且必须严格遵守四点:
- 把
data-om-exportable-video-with-duration-secs="<N>"放在唯一想导出的根元素上(N ≤ 300,更长会被钳制;整个文档只能有一个元素携带此属性,禁止嵌套)。 - 该元素必须监听自定义事件
data-om-seek-to-time-frame(detail: {time, frame}):收到后暂停播放并同步渲染到该精确时间戳,使每个可见子元素都落在那个时刻。 - 想要贡献音轨的嵌套
<video>元素必须携带data-om-exportable-video-play-start、data-om-exportable-video-play-end(源片内的秒数),可选data-om-exportable-video-play-speed;它们会在[start,end]区间按该速度循环,其音频混入导出。视频的画面帧需要你自己与时间轴同步(在 seek 事件/你的时钟里设置video.currentTime)。 - 最佳实践:让根元素是一个
<svg><foreignObject>包装,并把@font-face规则一次性内联进去——导出器随后逐帧直接序列化 svg(快速、像素级精确)。普通 div 也可以,但更慢(每帧都要做整页快照)。
带此契约的页面在预览下方还会获得一条实时时间轴——宿主通过派发同一条 seek 事件来拖拽与播放,因此每个 seek 都要当作“暂停并保持”:在 seek 停止到达之前,不要恢复你自己的时钟。
引擎源码如何履行契约
Stage组件的实现(animations-v3.jsx)展示了契约的内建形态:<svg>上直接烙着data-om-exportable-video-with-duration-secs={duration},内部是foreignObject > div > TimelineContext.Provider;同时Stage以fps=60、默认 1280×720、背景#f6f4ef、支持playback(来自OM_PLAYBACK的解析值)覆盖 legacy loop 语义。导出的播放时长就是引擎推导出的duration = derived.total(各场景dur的运行总和)。换句话说,源码即契约的参考实现。
十、把它们组合起来:一个最小工作流
综合上文,在 Claude Design 里做一个可导出的动画短片,端到端的最小流程是:
- 调用
copy_starter_component,kind: "animations_v3.jsx";随后通读复制下来的引擎文件。 - 先在主文档内联
<script>里写window.OM_SCENES场景表字面量(每条含name/dur,建议desc),这是全片提纲;同步声明window.OM_PLAYBACK。 - 搭
<CompositionStage>包住唯一<Piece/>,把 scenes / playback 原样透传。 - 用
useComposition()取{T, CUES},按 Cue-First 纪律写章节组件:全部常驻渲染、键到 cues;开场定义三个缓动辅助;单<Captions>。 - 硬切用
<Shot from={CUES.X} to={CUES.Y}>;跨边界运动用起止跨 cue 的animate(...);循环片首尾帧对齐。 - 加 tweaks 面板,
TWEAK_DEFAULTS里含"motionEditor": true与对应TweakToggle,让用户能开关宿主时间轴编辑器。 - 需要跟随光标/角色时,用 ref 抓取目标元素位置再驱动阻尼视口。
- 收尾用一次
multi_screenshot(seek 到边界 ±0.15s 与场景中间帧)做胶片自查,相邻帧对不上就修;再把data-screen-label每秒刷到当前时间戳便于按点评论。 - 让用户通过Share → Export → Video导出;默认(基于 starter)路径下,不要再手工添加任何
data-om-exportable-video-with-duration-secs属性。
参考资料与源码入口
- Skill 原始指令:Anthropic/claude-design/skills/animated-video/SKILL.md
- 引擎实现与 API 索引、作者契约说明:Anthropic/claude-design/starter-components/animations-v3.jsx
- Tweaks 面板与
motionEditor持久化机制:Anthropic/claude-design/starter-components/tweaks-panel.jsx - Claude Design 整体系统提示与
copy_starter_component/multi_screenshot工具定义:Anthropic/claude-design/claude-design.md - 全部 19 个用户可调用 Skill 清单与版本变更记录:Anthropic/claude-design/skills/README.md
【免费下载链接】system_prompts_leaksExtracted system prompts from Anthropic - Claude Fable 5.1, Opus 5, Claude Design, Claude Code. OpenAI - ChatGPT GPT-6-Astra, Codex. Google - Gemini 3.8 Flash, 3.1 Pro, Antigravity. xAI - Grok, Grok Bot, Cursor, Kimi and more! Updated regularly.项目地址: https://gitcode.com/GitHub_Trending/sy/system_prompts_leaks
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考