ograf.json 规范
面向 ograf.app 与 OGRAF Creator Skill 的 HTML 动画包规范。说明上传文件、可编辑参数、播放通信与下载清单;其他 OGRAF 宿主的要求应以其实现为准。
返回开发教程文件结构
建议将 project.json 和 index.html 直接放在 ZIP 根目录,资源使用相对路径。上传接口也兼容单一顶层目录。Skill 打包通常使用 .ograf 扩展名,网站下载使用 .og.zip;两者都是 ZIP 压缩包。仅有 .ograf.json 不能替代网站上传所需的两个入口文件。
title.ograf / title-a1b2c3d4.og.zip
├── project.json
├── index.html
├── title-a1b2c3d4.ograf.json (export)
└── assets/ (optional)project.json 字段
| format / formatVersion | Skill 基础格式:"ograf" / 1。 |
| name / description / version | 动画名称、用途描述与作品版本,例如 1.0.0。name 是 Skill 基础必填字段。 |
| resolution / fps / duration | 设计分辨率(1920x1080)、每秒帧数与总时长(秒);填写正数并与实际动画一致。 |
| supportsLandscape / supportsPortrait | 明确声明支持的横屏、竖屏方向;画面与参数应在声明的方向下正常显示。 |
| data | 参数当前值对象,是 Skill 基础必填字段;键名应与 schema.properties 一致。 |
| schema | 根类型为 object 的 JSON Schema,是 Skill 基础必填字段;properties 描述可编辑参数。 |
| renderRequirements | 建议声明设计宽高、帧率及 accessToPublicInternet: false;网站资源必须自包含。 |
这是 Skill 推荐的可移植基线。网站上传接口目前检查 project.json 为合法 JSON 对象,并执行包与文件扫描;上传通过不代表字段、播放行为与视觉效果全部正确。
标题动画的 project.json 示例
{
"format": "ograf",
"formatVersion": 1,
"name": "标题淡入",
"description": "透明背景的标题淡入动画",
"version": "1.0.0",
"resolution": "1920x1080",
"fps": 30,
"duration": 3,
"supportsLandscape": true,
"supportsPortrait": false,
"data": {
"title": "你好,OGRAF",
"color": "#ffffff",
"fontSize": 96
},
"schema": {
"type": "object",
"properties": {
"title": {
"type": "string",
"title": "标题",
"default": "你好,OGRAF"
},
"color": {
"type": "string",
"title": "颜色",
"format": "color",
"default": "#ffffff"
},
"fontSize": {
"type": "number",
"title": "字号",
"minimum": 24,
"maximum": 200,
"default": 96
}
}
},
"renderRequirements": {
"resolution": {
"width": 1920,
"height": 1080
},
"frameRate": 30,
"accessToPublicInternet": false
}
}可编辑参数 schema
每个参数使用 type、title、description 和 default;数值可增加 minimum / maximum,选项可使用 enum。data 中的值应与字段类型一致,首次创建时与 default 保持一致。
| string | 单行文本 |
| string + format: color | 颜色输入 |
| string + gddType: multi-line | 多行文本 |
| enum | 下拉选项 |
| number / integer | 数值输入,可设置范围 |
| boolean | 开关 |
| array / object | JSON 输入(Skill 调试器);不同宿主需确认支持情况 |
.ograf.json 下载清单
网站下载 HTML 包时,保留原始 project.json、index.html 和资源,并保存当前参数。生成或更新一个 .ograf.json 清单:schema.properties 描述参数,schema.default 保存本次下载的配置,字段 default 同步更新。文件名带随机 8 位十六进制 ID,例如 title-a1b2c3d4.ograf.json,以减少达芬奇复用旧缓存的问题。
{
"name": "标题淡入",
"schema": {
"type": "object",
"properties": {
"title": {
"type": "string",
"title": "标题",
"default": "你好,OGRAF"
},
"color": {
"type": "string",
"title": "颜色",
"format": "color",
"default": "#ffffff"
},
"fontSize": {
"type": "number",
"title": "字号",
"minimum": 24,
"maximum": 200,
"default": 96
}
},
"default": {
"title": "你好,OGRAF",
"color": "#ffffff",
"fontSize": 96
}
}
}下例是网站 HTML 包的配置清单,不是所有桌面 OGRAF 宿主的完整入口规范。已有桌面包可能还需要 main 等字段,导出时应保留原有宿主入口。
HTML 播放协议
达芬奇组件由 main.js 导出 HTMLElement 子类,.ograf.json 的 main 指向该入口。可见动画舞台必须直接挂到 document.body;load({renderCharacteristics}) 提供的 resolution.width/height 是画布尺寸,优先于宿主盒子或浏览器视口。横屏宿主仍为 1920×1080 时,传入的 1080×1920 竖屏画布不能被缩进旧横屏盒子。只有宿主与画布比例一致时才等比缩放预览。卸载时清理舞台、监听器和动画任务。网站 index.html 使用同一实现,在 sandbox="allow-scripts" 的 iframe 中通过 window.postMessage 通信;不依赖 allow-same-origin 或 parent.document。
| 宿主 → 动画 | ograf:update | data 为参数对象;更新画面,不重载页面或自动重播。 |
| 宿主 → 动画 | ograf:start | 从确定的初始帧开始;再次启动应能重播。 |
| 宿主 → 动画 | ograf:stop | 取消计时器与动画,回到一致的停止状态。 |
| 动画 → 宿主 | ograf:ready | DOM、资源和消息监听器准备完成后通知宿主。 |
| 动画 → 宿主 | ograf:ended | 非循环动画到达最终帧时通知宿主。 |
| 动画 → 宿主 | ograf:error | error 字段提供可读的错误说明。 |
// Host → graphic
{ type: 'ograf:update', data: { title: 'Hello, OGRAF' } }
{ type: 'ograf:start' }
{ type: 'ograf:stop' }
// Graphic → host
parent.postMessage({ type: 'ograf:ready' }, '*');
parent.postMessage({ type: 'ograf:ended' }, '*');
parent.postMessage({ type: 'ograf:error', error: 'Playback failed' }, '*');向宿主发送 parent.postMessage(message, "*"),以支持不透明源 iframe。动画接收时校验 event.source === parent;宿主校验消息来自目标 iframe.contentWindow。重复更新应得到同一画面,停止或重播时清除旧任务。用户文本用 textContent 写入。
资源与上传限制
| ZIP 压缩包 | ≤ 500 KiB |
| JS / MJS 单文件 | ≤ 500 KiB;HTML 内脚本也受扫描限制 |
| 图片单文件 | ≤ 1 MiB |
| 文件数 | ≤ 200 |
| 解压总量 | ≤ 2 MiB |
| 视频 | 禁止上传,包括伪装为其他扩展名的视频 |
允许 HTML、JS/MJS、CSS、JSON、PNG/JPEG/GIF/WebP/SVG/AVIF、WOFF/WOFF2/TTF/OTF、TXT/MD。脚本、样式、字体和图片均使用包内相对路径;不允许外链、网络请求、动态执行代码或访问 Cookie、存储等敏感 API。不允许路径穿越、绝对路径、重复条目、符号链接与损坏的 ZIP。服务端按实际解压内容扫描,静态扫描不等于完整安全保证。1 KiB = 1024 字节。
发布前检查
- 本地校验通过,包内入口文件与相对资源路径完整。
- 实际预览检查标题、颜色、字号及参数即时更新。
- 播放、停止、连续重播和结束通知正常,无残留动画任务。
- 透明背景、设计分辨率和声明的横竖屏效果正确。
- 通过 Skill 上传草稿并完成社区发布,再核对公开预览和下载包。