Communitygithub.com

AntlersSam/saas-launch-video-kit

HyperFrames 组合合约 — 构建一个可渲染项目。用于组合结构、`data-*` 时间属性、`class="clip"`、轨道、子组合、变量、框架拥有的媒体播放、确定性渲染规则和验证。在编写组合 HTML 之前阅读。

saas-launch-video-kit 是什么?

该技能定义了 HyperFrames 组合合约,它是构建一个可用 HTML 驱动的视频渲染项目的技术规范。它详细说明了如何通过 `data-*` 属性在 DOM 中声明时间、注册可寻址的 GSAP 时间线,以及如何确保框架拥有媒体播放控制。该技能支持独立的顶层组合以及通过 `<template>` 包装的模块化子组合,并在 `standalone` 和 `template` 两种根形式之间划清了界限。它列举了关键的开发者陷阱(如在 `clip` 节点上同时使用 CSS `transform` 和 GSAP tween 会触发 `gsap_css_transform_conflict` 错误)、首次运行 lint 规则(如避免在 `data-start` 视频上嵌套时间元素)、以及导致静默错误的不可协商规则(如禁止运行时时钟、`Math.random` 和 `repeat: -1`)。该技能在 HyperFrames CLI、动画、创意、媒体和注册表等配套技能中引用详细的参考文档,为确定性渲染、可变性和媒体属性、子组合集成以及预渲染验证提供全面指导。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/AntlersSam/saas-launch-video-kit/tree/HEAD/skills/hyperframes-core

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

插件安装: 在执行设置或新鲜度命令之前,请遵循 插件执行规则(当此技能位于 HyperFrames 插件内时)。独立安装请保留下面的更新说明。

HyperFrames 核心

Agent 陷阱(请先阅读):

  • 使用 flex/inset 居中,不要使用 CSS transform: translate(-50%,-50%) 然后对该节点进行 GSAP x/y 操作。Lint 检查:gsap_css_transform_conflict。使用 fromTo 或 xPercent/yPercent。
  • 不要添加场景退出 tl.set(..., {visibility:"hidden"})。运行时已经隐藏了定时剪辑。内部节点上的不透明度淡出(或 .clip 上的 opacity)就足够了。字幕硬关闭是另一条规则。
  • window.__timelines["id"] 必须与根 data-composition-id 匹配。
  • 渲染后,读取摘要的第二行:beginframe vs screenshot、GPU 模式、阶段时间。screenshot + Linux 上的 software gpu 是慢速路径。

HyperFrames 从 HTML 渲染视频。组合是一个 HTML 文件,其 DOM 使用 data-* 属性声明时间,其动画运行时是可寻址的,并且其媒体播放由框架拥有。

此技能是技术合约——如何构建一个 hyperframes 项目。下文是构建指南;按主题的详细信息位于 references/(下一步索引),按需阅读。流程文档(简要、故事板、审查、制作、分派、帧工作器)位于 /hyperframes → references/。其他关注点位于同级领域技能中——hyperframes-animation、hyperframes-creative、media-use、hyperframes-cli、hyperframes-registry。/hyperframes 中的能力地图说明了每个技能涵盖的内容。

参考

文件阅读目的……
references/minimal-composition.md从最小的可渲染组合骨架开始
references/composition-patterns.md选择整体式还是模块化;构建模块化 index.html;选择子组合原型
references/data-attributes.md查找任何 data-*(根/剪辑/子组合宿主/遗留别名);使用 class="clip"
references/tracks-and-clips.md理解 data-track-index 控制什么(以及不控制什么)、z-index、相对于另一个剪辑的时间;使用 npx hyperframes timeline 列出每个轨道和剪辑
references/creator-editing-recipes.md复制真实的剪切/修剪/重新排序/重新计时/冻结/相机/遮罩/交叉淡入淡出/音频编辑配方及其限制
references/sub-compositions.md连接子组合(宿主属性、<template>、每个实例的变量)并在其内部制作动画
references/variables-and-media.md声明变量;放置 <video>/<audio>、设置音量、修剪
references/determinism-rules.md构建可寻址时间线;确定性禁止;布局/文本适配
references/full-screen-motion.md使用共享背景创作全帧运动
references/tailwind.md在 Tailwind v4 项目中工作(init --tailwind;运行时合约不同于 Studio 的 v3)

关于动画运行时的具体信息(GSAP API、Lottie、Three.js 等),请前往 hyperframes-animation → adapters/<runtime>.md。

构建组合

两种根形式(不可互换)

  • 独立(顶层 index.html):根 <div data-composition-id="…"> 直接位于 <body> 中,没有 <template> 包装器。包装独立根会隐藏所有内容,并且 lint 会拒绝(standalone_composition_wrapped_in_template,错误)。
  • 子组合(通过 data-composition-src 加载):将根包装在 <template> 中。这是要编写的形状:加载器也接受普通的完整文档并回退到其 <body>,但模板化形式是示例和工具所假设的。

⚠ 传输规则:对于模板化子组合,组装器会丢弃文件自身的 <head> <style>/<script>(packages/core/src/compiler/compositionAssembly.ts,hasTemplate 门),因此将 <style>/<script> 放入模板中。<link> 在任何情况下都会被提升。 ⚠ 宿主 ID 约定:给宿主插槽、内部模板和 window.__timelines["<id>"] 键相同的 id。支持不同的本地 ID(组装器回退到文件中的第一个根),但不匹配是静默的,因此请匹配它们,除非你有理由不这样做。

文件形状、宿主连接和预渲染检查表 → references/sub-compositions.md。

根必须具有尺寸(静默布局错误)

独立根使用 width/height: 100%。画布大小是 data-width/data-height。运行时将这些像素戳印到组合根上。不要硬编码 #root 上的 1920px/1080px。骨架 → references/minimal-composition.md。

一个暂停的时间线

每个组合在 window.__timelines["<id>"](键 = 根 data-composition-id)处注册恰好一个 gsap.timeline({ paused: true })。在异步回调(document.fonts.ready)内构建它是支持的;重要的是你仅在构建完成后注册。渲染长度是根的 data-duration,而不是时间线的长度:超出它的时间线会被截断,而提前结束的时间线会保持其最后一帧。省略根 data-duration 则长度被推断(时间线、媒体窗口或适配器)。你不需要 window.__timelines = window.__timelines || {}:运行时在你的内联脚本运行之前创建注册表,并且 lint 不再要求它。不要手动将子时间线嵌套到宿主中;运行时会自动嵌套注册的子时间线。完整合约(包括非 GSAP 运行时)→ references/determinism-rules.md + hyperframes-animation/adapters/。

首次运行 lint 陷阱(保证第一次构建失败)

lint 确实会捕获的规则,但仅在事后。第一次就正确编写:

  • 永远不要将 CSS 初始 transform 与同一属性上的 GSAP tween 配对——CSS 值和 tween 的开始会冲突,并且 lint 会以 gsap_css_transform_conflict 拒绝。使用 gsap.fromTo(el, { x: -40 }, { x: 0 }) 在 tween 内部设置初始状态,而不是使用 CSS transform: translateX(-40px)。
  • 永远不要在 <video>/<audio> 上放置 crossorigin。lint 会无条件地以 media_crossorigin_breaks_preview(错误)拒绝,包括画布/WebGL/WebAudio 回读。没有抑制选项。
  • 永远不要给 <video data-start> 一个也带有 data-start 的祖先元素。lint 会以 video_nested_in_timed_element(错误)拒绝。给包装器或视频计时,而不是两者。
  • 每个 <audio> 都需要一个 id。lint 会以 media_missing_id 拒绝,并且没有 id 的 <audio> 永远不会被混合器拾取,因此渲染是静默的。
  • 永远不要用 autoAlpha 或 visibility 补间 .clip——lint 会以 gsap_animates_clip_element 拒绝。补间子元素。
  • 命名的 CSS font-family 需要在文件中有一个 @font-face 指向提供的本地文件,否则 lint 会触发 font_family_without_font_face。
  • 子组合 #root 使用 width/height: 100%(或 inset: 0),而不是硬编码的 1920px/1080px。画布大小是 data-width/data-height。

lint 错误也会关闭布局和对比度审计:check 然后报告 0 sample(s) 和 0/0 text checks,这看起来像一个干净的文件,但实际上什么也没运行。在信任这些数字之前,请清除 lint 错误。

不可协商的规则(自动化门可能遗漏的静默错误)

在此处提出;完整原理在链接的参考中。不要违反:

  • 没有渲染时时钟/未播种的 Math.random/网络/输入状态;没有 repeat: -1(使用有限计数)。→ determinism-rules.md
  • 永远不要在 .clip 元素上补间 display、visibility 或 autoAlpha。框架拥有剪辑可见性,并且 lint 会拒绝(gsap_animates_clip_element)。补间子元素。→ determinism-rules.md
  • 正文中没有 <br>;转换后的元素必须是块级 + 有尺寸;脉动的绝对装饰元素需要留出峰值间隙。→ determinism-rules.md
  • <video>/<audio> 通过扁平文档查询找到,因此框架在任何嵌套深度(包括在子组合 <template> 或包装器内部)查找和定位它们。一个硬限制:如果 <video data-start> 位于另一个也带有 data-start 的普通元素内部,lint 会报错,并且失败是真实的(错误的源帧,然后剪辑在中间槽消失),因此将计时放在包装器或视频上,永远不要两者都放。子组合宿主是例外的:子组合内部的媒体可以正确渲染。另一个警告是关于时间线,而不是放置:子组合时间线不能动画宿主根元素。→ variables-and-media.md
  • 确保每个 id 在组装后的页面中唯一(为子组合 ID 添加前缀,如 #<id>-hero),以便你自己的 #id CSS 和 getElementById 调用能正确解析。帧注入不再依赖于此:编译器会在每个 video[src]/audio[src]/img[src] 上打上文档唯一的 data-hf-render-id。使用 <source> 子元素而不是 src 属性的媒体不会被打上标签,因此唯一的 ID 在那里仍然很重要。→ composition-patterns.md
  • 在根组合上的全屏填充在正常渲染时是没问题的。它仅在分层合成路径(HDR 内容,或使用着色器过渡的组合)上被丢弃,其中引擎强制每个组合根透明,以便下方的层能显示。如果你的组合使用着色器过渡或 HDR 媒体,请将填充放在一个全屏子元素上(position:absolute; inset:0)。→ composition-patterns.md

编辑现有组合

  • 首先阅读文件。保留无关的计时、轨道、ID、变量、媒体路径。
  • 要了解项目时间线上的内容(轨道、剪辑、开始、结束、播放的内容),请运行 npx hyperframes timeline [--json],而不是阅读 index.html 和每个子组合文件。
  • 匹配现有的组合 ID 和时间线键。
  • 添加剪辑:根据其周围的剪辑有意图地设置其 data-start/data-duration。data-track-index 是一个 Studio 显示通道,不是时间约束,因此它不需要是空闲的。
  • 在根 data-duration 之后结束的剪辑会被截断:在同一编辑中将根 data-duration 扩展到剪辑的结束(lint 警告 clip_ends_past_root_duration)。
  • 任何组合元素上的 data-hidden 在预览和渲染中都会隐藏它,覆盖其时间窗口;它是非破坏性/可逆的,并由 Studio 的时间线眼睛图标切换。
  • 添加子组合:在连接宿主之前验证其内部的 data-composition-id。

验证

使用 hyperframes-cli 获取命令详情

  • npx hyperframes check 通过(在 lint、运行时、布局、运动和对比度方面发现 0 个问题)
  • 包含子组合的项目:npx hyperframes snapshot --at <midpoints> 并目视检查每一帧
  • npx hyperframes preview --background 用于审查(用户可以在 Studio 的时间线中编辑任何内容,并且服务器会在调用命令后保持运行)
  • 仅在用户批准后运行 npx hyperframes render

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

AntlersSam/saas-launch-video-kit

Author or edit a custom HyperFrames composition when no specialized workflow fits, or when BRIEF.md sets flow: companion. Use for longer or multi-scene pieces, brand and sizzle reels, montages, static loops, static title cards, footage remixes, and freeform builds. Use motion-graphics instead for a short unnarrated motion-first unit, including an animated title. Route fresh creation through hyperframes before using this skill.

AntlersSam/saas-launch-video-kit

All animation knowledge for HyperFrames — atomic motion rules, multi-phase scene blueprints, scene transitions, broader motion-design techniques, AND the seven runtime adapters (GSAP default, plus Lottie, Three.js, Anime.js, CSS keyframes, Web Animations API, TypeGPU). Use for any motion or animation task: pick 2-4 rules and compose, or load a blueprint, or look up runtime-specific API (e.g. GSAP eases / Lottie player / Three.js mixer). Also covers auditing an existing composition's choreography (animation map) and 24 named text-animation effects. HyperFrames-native: single paused timeline, seek-safe, deterministic.

AntlersSam/saas-launch-video-kit

Use when audio already placed in a HyperFrames composition needs to be mixed: fade-in/fade-out, crossfade, track gain or volume, volume automation, ducking, a music bed that fights a voiceover (voiceover carve), effects on a track (EQ, compressor, limiter, gate, saturation, delay, reverb, chorus, phaser, bitcrush), automation envelopes drawn on a track's volume or any effect parameter, or one submix bus carrying a chain, a fader and an automation clock for several tracks at once (`<hf-audio-group>`). Don't use for sourcing or generating audio — finding BGM, SFX, or making a voiceover is `/media-use`. Don't use for clip timing or track layout, which is `/hyperframes-core`.

AntlersSam/saas-launch-video-kit

Use the HyperFrames CLI development loop: init, add, catalog, capture, lint, check, snapshot, compare, grade-compare, preview, play, present, beats, keyframes, single or batch render, publish, cloud, cloudrun, feedback, lambda, doctor, browser, info, upgrade, skills, compositions, timeline, history, clean, docs, benchmark, telemetry, transcribe, auth, tts, and remove-background. Also use when diagnosing build or render failures. validate, inspect, and layout are deprecated aliases; use check. Covers local, HeyGen-hosted cloud, AWS Lambda, and Google Cloud Run rendering.

相关技能