卡片 JSON 编辑器
直接在下方编辑和预览卡片。模板、节点树、属性、上下文、文案和 CSS 均在浏览器内处理,不调用 AI / 语音 API,不修改游戏内数据。编辑区较窄时可全屏或独立打开。
在线版与系统文档使用 ApricityUI t08-arwes 不透明主题。预览中的物品、玩家和 FTB 图标是占位展示,实际布局与原生 tooltip 仍以游戏内 AUI 为准。有效草稿保存在当前浏览器;建议导出工作文件,以免清理站点数据后丢失。
本地源码版本
仓库内的 html/card-editor 使用 Vite 运行。下列命令仅用于在本地维护源码,使用上方在线版不需要安装 Node.js。
需要 Node.js 20.19+(20 系列)或 22.12+,推荐当前 LTS。在仓库根目录运行:
cd html/card-editor
npm ci
npm run dev
浏览器打开 http://127.0.0.1:5173。模板 JSON、脚本和样式修改由 Vite 更新。端口固定且占用时直接报错,避免自动换端口后看不到原站点的草稿。首次安装需要网络;编辑器运行时只访问本地 Vite 服务。
npm run build
npm run preview
构建输出为 dist/;预览地址为 http://127.0.0.1:4173,也可以把 dist/ 部署到静态 HTTP 服务。开发与构建预览端口不同,浏览器草稿各自独立;需要转移时导出工作文件。不要直接双击 HTML。依赖、构建输出和 Vite 缓存由 html/.gitignore 排除,package-lock.json 保留用于复现依赖。
编辑流程
- 从下拉框载入内置模板,或使用“打开 JSON”/拖入文件读取
assets/<namespace>/cards/*.json。 - 左侧节点树支持添加、复制、删除、上移和下移。中间“属性”页编辑已知字段,“完整对象 JSON”保留子节点和自定义字段;也可以直接修改原始 JSON。
- 在“上下文”填写示例参数,在“文案”提供翻译覆盖。右侧切换完整、简约、通知模式及语言,查看布局、分组、折叠和本地分页。按住 Alt 点击预览中的节点可定位到属性页。
- “导出卡片”下载可用于资源包的 JSON;放回原资源路径后,在游戏内重载资源。浏览器无法直接覆盖原文件。
编辑器按当前 CardTemplate 和 18 种内置 CardNode 提供字段编辑与基础类型检查。未知节点会显示占位提示,未知字段在编辑、复制与导出时保留;自定义节点的字段可在完整对象或原始 JSON 中修改。语法或结构错误时保留上一份有效预览,并暂停树操作与导出,修复 JSON 后恢复。它没有运行 Minecraft 的 Codec,最终解析结果以游戏为准。
快捷键:Ctrl / ⌘ + S 导出卡片,Ctrl / ⌘ + Shift + F 格式化。顶部撤销/重做回退有效的卡片版本;文本框内使用浏览器原生撤销。上下文、翻译和 CSS 不参与卡片版本的撤销。
示例上下文
上下文共用一份平铺参数表,点号是键名的一部分,不能改成嵌套对象。parameters 模拟 CardContext.parameters;states 模拟数值状态及循环数量。没有显式状态时,编辑器按 CardContext.Builder.put 的规则推导:布尔为 0/1、数值保持原值、非空文字为 1、数组为长度。
{
"parameters": {
"summary": "叮!今日资源已就绪。",
"host": "Dev",
"entries": 2,
"entries.0.name": "木材",
"entries.1.name": "铁锭",
"result_items": [
{ "item": { "id": "minecraft:iron_ingot" }, "amount": "16" }
]
},
"states": {
"show_card_title": 0,
"show_extra": 1
},
"callbacks": ["example"]
}
支持 {{id}}、{{tr:key}}、{{field:id}}、{{bool:id}}、{{state:id}},以及 when、unless、repeat 和循环索引 *。full、simple、notification、text_items 由当前预览模式设置;前三者仅当前模式为 1,浏览器布局预览的 text_items 始终为 0。
例如加入下面的节点,可显示两个条目:
{
"type": "system:flex",
"direction": "column",
"repeat": "entries",
"children": [
{ "type": "system:text", "text": "{{entries.*.name}}" }
]
}
callbacks 模拟本地可信回调,button 使用 click/value 声明行为;link / return-val / local 都只记录操作。result_actions 可提供模拟按钮列表。点击按钮只在预览下方记录动作,不发包、不打开链接、不领奖或购买。通知底部按钮是模拟控件,仍由游戏代码定义,不能通过卡片 JSON 修改。
工作文件与草稿
“导出工作文件”生成带 format: "system-card-editor" 的 .card-project.json,保存卡片、示例上下文、翻译覆盖及自定义预览 CSS。重新打开该文件可恢复编辑环境;它不能直接作为游戏卡片资源,需再导出卡片。
有效编辑会尽力写入当前站点的浏览器本地草稿,并在下次打开同一地址时恢复。协议、主机或端口改变后,草稿不会自动迁移;旧单文件页面的草稿可以先导出工作文件,再在新编辑器中打开。需要长期保留时导出工作文件。清除草稿不会清空当前工作区,继续编辑会重新保存。
预览范围与内置快照
src/resources/ 保存当前 28 份卡片模板、中英文语言表及共享 assistant.css 的快照。模板位于 templates/*.json,可以单独修改或新增;Vite 通过 import.meta.glob 收集,不需要维护 HTML 内嵌列表。快照不会自动读取游戏资源的后续修改;完整字段和游戏侧布局规则见 客户端 JSON 卡片。
浏览器预览用于检查结构与参数替换,和 AUI 的布局实现有差异:物品、FTB 图标、玩家模型用占位块和普通 tooltip 展示;Saturn 玩家信息使用示例参数;Markdown 仅近似支持标题、列表、引用、代码、强调及链接。资源包纹理、原生 tooltip、主题细节、按钮权限与业务行为需在游戏内确认。预览对循环和节点绘制设有上限,导出的 JSON 保持完整。
源码结构与资源同步
html/
├── .gitignore
└── card-editor/
├── index.html 页面和控件
├── package.json / package-lock.json
├── vite.config.js
├── scripts/sync-resources.mjs 从游戏资源更新快照
└── src/
├── main.js 入口和页面 CSS
├── editor.js 树、属性、JSON 编辑、导入导出和草稿
├── schema.js 节点目录、字段描述和结构检查
├── preview.js iframe 内的浏览器投影与本地交互
├── sample-context.js 平铺示例参数
├── resources.js Vite 资源收集
├── utils.js 共用 JSON / 路径工具
├── styles/
│ ├── editor.css 编辑器页面样式
│ └── preview.css 浏览器预览适配样式
└── resources/
├── templates/*.json 每份模板独立维护
├── lang/*.json 中英文语言快照
├── assistant.css 游戏共享样式快照
└── snapshot.json 最近同步日期
新增游戏节点时,更新 schema.js 的字段目录和 preview.js 的浏览器投影。预览保持在禁止脚本的 sandbox iframe 中,导入内容按文本和节点绘制,不直接执行 HTML 或卡片按钮业务。
在编辑器目录执行以下命令,从仓库刷新资源快照:
npm run sync:resources
命令读取 src/main/resources/assets/system/cards/*.json、assets/system/lang/{zh_cn,en_us}.json 和 assets/apricityui/apricity/system/assistant.css;先解析输入,再覆盖编辑器对应文件、删除游戏资源中已不存在的模板快照,并更新日期。该命令会覆盖对快照文件的手工修改,请先将要保留的布局保存到游戏资源或导出文件中。平时启动或构建不会自动覆盖快照;只想临时查看最新卡片时仍可使用“打开 JSON”。