HyperFrames Registry 的 demo.html 约定:在 OpenMontage 中为组件编写可渲染演示与目录预览
2026/9/10 10:27:14 网站建设 项目流程

HyperFrames Registry 的 demo.html 约定:在 OpenMontage 中为组件编写可渲染演示与目录预览

【免费下载链接】OpenMontageWorld's first open-source, agentic video production system. 12 production pipelines, 100+ tools, 700+ agent skill and production-knowledge files. Turn your AI coding assistant into a full video production studio.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMontage

导读

本文围绕 OpenMontage 所收录的 demo.html 规范文档,系统讲解 HyperFrames Registry 中"组件必须随附 demo.html"这一约定的设计动机、文件骨架、关键属性和作者工作流。读者将掌握:为什么只有 component 需要 demo 包装而 block 不需要、demo 如何同时充当"CI 预览夹具"与"用法示例"、demo 为何永远不会被hyperframes add安装进用户工程,以及如何把仓库中现成的组件模板改造成一段符合 lint / validate / render 要求的标准 demo。全篇以规范文档为骨架,结合仓库内 registry 技能、CLI 文档与真实示例源码补充底层依据。

背景:Registry 里有两类可复用资产,只有一类需要 demo.html

在深入 demo.html 之前,必须先厘清 HyperFrames Registry 的两种条目类型。根据 registry SKILL.md 与 contributing.md 的定义:

  • Blocks(块)——独立的子合成(sub-composition),拥有自己的画布尺寸、时长与时间线。注册于registry/blocks/{name}/,类型为hyperframes:block。典型形态包括字幕样式(caption styles)、VFX 效果、标题卡、lower-third 等,通过data-composition-src嵌入宿主合成。
  • Components(组件)——可复用的效果片段(effect snippet),没有固定尺寸与时长,能自适应任意合成尺寸。注册于registry/components/{name}/,类型为hyperframes:component。典型形态包括 CSS 效果、文字处理、叠加层(overlay),直接以 HTML/CSS/JS 形式粘贴进宿主合成。

demo.html只随component一起出现。理解这一点,也就理解了整个约定的出发点:component 是"没有自己的时间与画布的片段",需要一个"临时宿主"才能被预览——这个临时宿主就是 demo.html。

注:该 Registry 目录规范文档位于 OpenMontage 仓库的.agents/skills/hyperframes-registry/references/下,属于 HyperFrames 技能体系(Layer 3)的一部分。在 OpenMontage 内部,当编排流水线的render_runtime被选为hyperframes时,这些 registry 块/组件即可通过 skills/core/hyperframes.md 描述的桥接关系进入实际成片,Registry 块也因此成为"为什么选 HyperFrames 而不是 Remotion"的关键理由之一。

为什么组件要随附 demo.html:双重职责

规范文档开门见山地指出:registry 中每个 component 在 snippet 旁边都会携带一个 companion 的demo.html文件。它服务于两个截然不同、又同等重要的目的:

1. Preview fixture(预览夹具)CI 预览流水线会真实渲染这份 demo,为目录(catalog)文档页生成缩略图(thumbnail images)和预览视频(preview videos)。也就是说,demo.html 不是给人看的摆设,而是被自动化管线当作"取景样本"来喂给渲染器——目录里每一个组件卡片背后的视觉素材,都源自这个文件。

这与 contributing.md 中描述的 catalog 流程互相印证:catalog 卡片使用docs/images/catalog/{kind}/{name}.png的 PNG 快照,作者需要用hyperframes snapshot --at "1.0,3.0,5.0,7.0"等命令从 demo/合成中抽取帧来生成该图。也就是说,demo 是"预览素材的源头",而 snapshot/render 是"从源头产出素材的工具"。

2. Usage example(用法示例)demo 把组件效果应用到有代表性的内容上,向读者(以及后续会hyperframes add该组件的 Agent 或人类开发者)展示"这个组件装进真实合成后应该长什么样、该配什么内容"。相比 dry 的 snippet,demo 提供了一个可直接打开的、能说明最终效果的工作参考。

事实边界说明:以上两条目的直接引自规范文档原文;而"目录页图片由 snapshot 生成、外部贡献者在 PR 中附上预览 MP4"等细节,来自同目录的 contributing.md,属于可交叉验证的文档事实。

demo.html 的标准结构:一个完整的独立 HTML 合成

规范给出了 demo 的最小骨架。它必须是一份**完整、独立(standalone)**的 HTML 合成:

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=1920, height=1080" /> <title>Component Name — Demo</title> <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script> <style> /* reset + canvas size */ </style> </head> <body> <div>window.__timelines = window.__timelines || {}; const tl = gsap.timeline({ paused: true }); window.__timelines["main"] = tl;

注意示例中的paused: true:时间线必须被暂停,渲染器才拥有绝对的控制权。注册的写法规范中也给出推荐形式window.__timelines = window.__timelines || {};,即"惰性初始化",确保即使页面中先注册了别的合成,也不会互相覆盖(templates.md 中三份模板的开头都保留了这一行)。示例中 "TIMELINE — built synchronously so HyperFrames can seek it" 的注释进一步说明了同步构建的原因:时间线必须在一帧之内完整搭好,后续任何时刻的 seek 才有效。

约定四:时长要足够展示效果,通常 5–8 秒

data-duration="N"是 demo 根节点的属性之一。规范建议 N 取 5–8 秒:太短不足以让入场、主体动画、收尾三个阶段都完整走完;太长则让目录预览视频变得拖沓。这与 blocks 的推荐时长经验一致——discovery.md 在描述 code animation 块时提到 "each is a self-contained 1920×1080 block (~5–8s)",说明 5–8 秒是这个生态里"一条演示刚好能看明白"的通用经验区间。

把组件模板改成 demo:一份可操作的作者路线

理解"demo 是给组件造的临时宿主"之后,改写的路径就非常清晰了。仓库里的 component 模板(Component Template)本身就是最好的起点——它的关键特征是:

<body> <div class="COMPNAME-wrap"> <!-- Your reusable effect/overlay here --> </div> <script> (function () { // Component snippet — no><div class="shimmer-sweep-target" style="--shimmer-color: rgba(255, 255, 255, 0.5)"> <h1 class="title">AI-Powered Video</h1> </div>
  1. 写一条驱动演示的时间线,注册到__timelines。仍以 shimmer-sweep 为例,它演示的 sweep 动作本身由组件对外暴露的时间线调用完成:
tl.fromTo( ".shimmer-sweep-target", { "--shimmer-pos": "-20%" }, { "--shimmer-pos": "120%", duration: 1.2, ease: "power2.inOut", stagger: 0.15, }, 1.5, );

把 demo 撑到 5–8 秒后,若组件本身耗时很短,可以让时间线包含入场与收尾多个段落;总之演示必须以 "把组件效果完整展示一遍" 为唯一目标。

  1. 验证并出预览:对 demo(以及 blocks)执行注册表质量的验证命令(命令来自 contributing.md 与 registry SKILL.md):
hyperframes lint # 0 errors required hyperframes validate --no-contrast # 0 console errors required hyperframes render -o preview.mp4 # 渲染目录预览视频 hyperframes snapshot --at "1.0,3.0,5.0,7.0" # 抽取视觉 QA 快照

提醒:上述 demo 包装的最终产物是存放在 registry 内、随 snippet 一起上送 PR的参考文件,不是用户工程里的文件。判断一份 HTML 是否符合 demo 身份,就看它是否满足:根节点存在<name>-demodata-composition-id、全部样式与脚本内联、时间线已注册到window.__timelines、时长落在 5–8 秒区间。

为什么 Blocks 不需要 demo.html

规范用一句话解释了边界:"Blocks are already standalone compositions that can be rendered directly. Only components need the demo wrapper."

  • block 本身就是"独立合成"——它自带data-composition-iddata-width/data-heightdata-duration,体内就有完整的时间线注册。templates.md 的 Caption Template 与 VFX Template 都验证了这一点:它们的根节点从一开始就写着data-composition-id="BLOCKNAME"data-width="1920">只有 component 需要 demo.html;block 本体即合成,直接渲染,无需包装
  • 文件为完整独立的 HTML:<!doctype html>、viewport 声明 1920×1080、明确<title>
  • 根节点存在且data-composition-id="<component-name>-demo"(带-demo后缀,防冲突)
  • 根节点声明data-width="1920">snippet 中的 CSS 与 JS 已全部内联,demo 不依赖 registry 其他文件
  • GSAP 时间线paused: true,并以window.__timelines = window.__timelines || {}后赋值window.__timelines["<name>-demo"]的方式注册
  • demo 内元素 ID 遵循 registry 前缀规范,不与任何合成冲突
  • 明确 demo.html 仅存于 registry:它用于 CI 预览与阅读参考,绝不会被hyperframes add安装进用户工程

关联阅读

  • Registry 总览与hyperframes add快速参考
  • Registry 条目类型与创作工作流(Clarify→Ship)
  • Caption / VFX / Component / registry-item.json 四份可直接复制的模板
  • 组件接线演练:shimmer-sweep 从安装到定制
  • 注册表条目字段定义与目录清单
  • 组件 wiring 细节(HTML/CSS/JS 合并进宿主合成)
  • 块 wiring 细节(data-composition-src+ track 编排)
  • 安装位置与hyperframes.json路径配置
  • 仓库内的真实全尺寸合成示例(展示__timelines注册与确定性 seek 模式)
  • OpenMontage 中 HyperFrames 的运行时选型桥接说明

【免费下载链接】OpenMontageWorld's first open-source, agentic video production system. 12 production pipelines, 100+ tools, 700+ agent skill and production-knowledge files. Turn your AI coding assistant into a full video production studio.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMontage

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询