# 视频画布竞品对比记录 ## 当前测试环境 - 本地服务: http://127.0.0.1:3003(3000 被旧进程占用;使用 127.0.0.1 避免旧 localhost Cookie 干扰) - 本地测试画布: `/canvas/bc8dcef2-b2b4-4a00-8712-52888158b934?mode=video&workspaceType=video` - 本地测试账号: `codex-video-test@example.com` - 测试数据源: 服务器生产库复制到隔离 schema `codex_video_canvas_local` - 已复制数据: `AiProvider` 34 条、`AiModel` 23 条、`SystemSettings` 60 条、`SiteSettings` 1 条、存储/导航/教程/Agent preset 配置、测试用户 1 个 - 本地调整: 仅测试 schema 中开启 `points_system_config.enabled`,用于显示/验证积分余额 - 本地调试开关: `CANVAS_E2E_LOCAL=true` 时仅对 loopback 的 `/api/auth/session` 与 `/api/auth/validate-session` 跳过会话限流,避免本地高频浏览器验证触发登录失效 - 本地模型回退: 测试 schema 中 Moonshot `kimi-k2.5` 返回 401 `Invalid Authentication`,已在隔离 schema 标记为 `auto_disabled`;代码已修复自动代理模型选择,避免继续选中 `auto_disabled` 的默认模型,当前本地脚本生成实际走 `qwen3-vl-plus` ## 已操作的竞品功能 - 初始视频画布布局: 暗色点阵无限画布、四个启动卡、底部工具栏、缩放/吸附/小地图等控制 - 底部主工具栏布局: 竞品在 `1512 × 805` 视口下主入口为底部居中横排 32px 图标按钮,坐标依次为 `添加节点 x=616 y=753`、`打开工具箱 x=656`、`素材库 x=696`、`角色库 x=736`、`历史记录 x=776`、`快捷键 x=825`、`教程 x=865`;`历史记录` 与 `快捷键` 之间有额外约 `17px` 间隔,其余相邻间隔约 `8px` - 故事脚本生成: 默认提示词、GVLM 3.1、消耗 6 点、脚本工作流创建、18 镜头表格 - 剧本三步工作流: 确认镜头、准备资产、合成提示词 - 剧本三步工作流入口: 从脚本节点点击 `打开脚本节点 →` 后进入全屏深色工作流,顶部三步为 `确认镜头 / 准备资产 / 合成提示词`,分别显示 `18个镜头已就绪`、`7/7 已生成`、`18/18 已合成`,右上显示 `3/3 完成后可批量生视频` 和关闭按钮 - 确认镜头表格: Step 1 使用全屏表格,列顺序为 `镜号 / 时长 / 画面描述 / 景别 / 光影氛围 / 对白·旁白 / 音效 / 运镜 / 最终提示词 / 操作`;可见 18 镜,时长以 `5s/6s` 为主,内容通过 `@现代沈昭昭`、`@金銮殿`、`@沈昭昭`、`@侍卫长刀` 等资产引用串联剧情;底部左侧为 `添加镜头`,右侧为 `→ 下一步:准备资产` - 最终提示词弹窗: 点击单行 `查看提示词` 后打开居中弹窗 `第 1 镜:最终提示词`,分为 `分镜提示词` 和 `视频运动提示词` 两块,状态均为绿色 `已生成`;分镜提示词为中文长句并追加 `[视觉风格:盛唐·国风二次元]`,视频运动提示词按 `起始状态 / 动作过程 / 结束状态 / 音效` 组织,底部显示 `GVLM 3.1 Flash`、消耗 `2`、`重新合成提示词` - 准备资产页: Step 2 为资产网格,顶部显示 `全局风格 盛唐·国风二次元`;分组为 `角色`、`场景`、`道具`,资产卡包含 `现代沈昭昭 / 沈昭昭 / 皇帝`、`金銮殿 / 长安城白昼 / 长安城夜景`、`侍卫长刀`,每组末尾有虚线 `新增` 卡;hover 卡片右上出现菜单和放大镜,菜单项为 `替换图片`、`AI 生角色`、`清除图片`、红色 `删除` - 合成提示词页: Step 3 回到 18 镜表格并高亮最终提示词链路,底部主按钮为 `一键合成全部提示词`;本轮只确认入口、状态和表格呈现,未重复点击生成以避免再次扣点或改写竞品项目 - 一键准备资产: 角色/场景/道具模板、Lib Image、标准画质、2K、2:1、7 个资产、实际扣 126 点 - 一键合成提示词: GVLM 3.1 Flash、18 镜头、图像提示词和视频运动提示词拆分、实际扣 22 点 - 批量生成分镜: 创建 18 个图片生成器组、Lib Image、2K、自适应 - 批量生视频: Seedance 2.0 VIP、16:9、720P、5s、18 个视频生成器组、整组执行成本 2316 点 - 单个视频生成结果: 结果卡显示 1280x720、播放进度、剪辑/裁剪/高清/解析/字幕/音频分离等工具 - 视频结果卡 hover 控件: hover `分镜视频-#1` 后底部出现播放圆钮、时间 `0:00 / 0:05`、进度条、右下帧截取圆钮;帧截取菜单为 `截取首帧`、`截取尾帧`、`截取当前帧` - 视频帧截取复查: 竞品菜单项可命中;本轮点击 `截取首帧` 后节点数仍为 33、图片节点数仍为 7,未出现成功 toast,页面已有多条历史 `失败` 文案,推测当前素材/状态下帧截取未落新节点 - 视频结果工具条二级功能: 选中生成结果 `分镜视频-#1` 后顶部工具条顺序为 `剪辑`、`裁剪`、`高清`、`解析`、`智能去字幕`、`音频分离` - 视频结果裁剪: 点击 `裁剪` 后不打开 modal,而是在视频卡内出现裁剪框,裁剪框和视频卡下方内联编辑条均显示 `1024 x 576`;底部条左侧按钮为 `退出裁剪`,右侧圆形上箭头按钮为 `生成裁剪` - 视频裁剪生成: 点击 `生成裁剪` 后页面提示 `正在裁剪视频,请稍候…`,按钮进入 `生成中 37%` 等进度态;竞品前端成功路径文案为 `已创建裁剪视频节点并开始上传`,对应行为是创建下游裁剪视频节点并上传裁剪后的 blob;本次实测页面最终未出现可见新节点且余额仍为 `531`,疑似当前跟随/任务状态下裁剪任务未完成落点 - 视频结果高清: 点击 `高清` 打开小型参数面板,包含 `Topazlabs`、`1080P`、`2K`、`4K`、`不补帧`、`1x`,点击选项前不会直接生成 - 视频高清落节点: 复查画布当前状态时,`分镜视频-#1` 已连出一个 `高清(1080P)` 节点,节点 class 为 `react-flow__node-video`,文本为 `配置参数生成高清视频`;边为 `Edge from v-kfwaCZvhsJ to v-2BDan8Sb2j`,说明高清不是 toast/浮层结果,而是下游视频工具节点 - 视频结果智能去字幕: 点击 `智能去字幕` 后出现说明 `AI一键去除视频字幕,仅支持中英文字幕`,下拉项为 `智能擦除`、`框选擦除`;点击 `智能擦除` 后进入视频卡下方内联生成器,原工具条收起,含 `关闭去字幕生成器`、标签 `智能擦除`、消耗 `0`、右侧图标生成按钮 - 视频智能擦除生成: 点击生成按钮后余额仍为 `531`,节点数从 30 增至 31,连线数从 45 增至 46;新增下游视频任务节点 `视频一键去字幕-分镜视频-#1`,边为 `Edge from v-kfwaCZvhsJ to v-khP9pMw41s`,节点文本先为 `生成中... 取消`,约 12s 后为 `生成中 2%... 取消`,约 42s 后为 `生成中 5%... 取消` - 视频智能擦除取消: 复制 `分镜视频-#1_无声` 得到干净副本后触发 `智能擦除`,余额仍为 `531`,新增边 `M3662,-632 ... 4463,-1237` 指向视口外 pending 节点;沿边定位到 `视频一键去字幕-分镜视频-#1_无声 - 副本`,节点文案为 `生成中... / 取消`,随后进度到 `1%/2%/3%/7%/11%`;点击节点内 `取消` 不直接删除,而是弹出确认框 `取消生成 / 正在生成中,即将完成!/ 停止将不退还已消耗算力。/ 取消 / 确定`;点击 `确定` 后弹窗关闭,但至少 35s 内任务节点和连线仍保留、继续显示 `生成中 ... / 取消`,无 toast、无失败态、无乐观删除 - 生成失败态排查: 当前竞品项目未找到真实失败任务样本;历史记录面板的 `图片历史(8)`、`视频历史(10)`、`音频历史(6)` 中均未出现 `失败` 或 `重试`;资产管理侧栏 `画布元素` 点击 `搜索节点` 后输入 `失败`,搜索框 placeholder 为 `搜索节点`,结果区显示 `当前画布没有相关搜索结果`,同时侧栏底部仍显示 `共 96 节点`;可见节点、React Flow 节点文本、localStorage/sessionStorage 中也未命中 `失败/重试/failed/error`,本轮未获得竞品真实 failed 节点视觉 - 视频框选擦除入口: 点击 `智能去字幕 -> 框选擦除` 后,竞品自动放大/聚焦当前视频卡,原顶部视频工具条收起,视频卡下方出现 49px 高悬浮操作条;操作条包含 `关闭去字幕生成器`、标签 `框选擦除`、帮助问号、`框选区域`、`撤销`、`重做`、`重置`、费用和右侧生成按钮;未框选时费用显示 `-`,撤销/重做/重置和生成按钮为禁用态 - 视频框选擦除帮助: hover 问号显示 tooltip,文案为 `使用方法 / 在画面上拖拽鼠标,框选要擦除的区域 / 支持框选多个区域,所有框内文字将被擦除 / 擦除作用于整段视频,不仅是当前帧` - 视频框选擦除选区: 在视频画面内拖拽后出现青色半透明矩形,样式为 `rgba(7, 184, 221, 0.15)` 填充、`rgb(6, 144, 174)` 边框、四角 `rgb(9, 202, 245)` 拖拽点;支持多个区域,本次实测两个区域同时存在 - 视频框选擦除编辑历史: 有区域后费用变为 `0`,生成按钮启用;`撤销` 会移除最后一个区域并启用 `重做`,`重做` 恢复后再次禁用;`重置` 清空所有区域,费用回到 `-`,生成按钮禁用,同时 `撤销` 仍启用,说明重置也进入历史栈 - 视频框选擦除生成: 生成前余额为 `531`、节点数 9、边数 27;点击生成后余额仍为 `531`,边数增至 28,新增边 `Edge from v-kfwaCZvhsJ to v-Ajx1SDnP6W`;当前视口未渲染目标节点,疑似目标节点位于 React Flow 虚拟化视口外或生成后归入视频组,已确认至少创建了从源视频到新任务/结果节点的下游边;竞品前端 chunk 显示框选模式后端参数为 `model: volcano-subtitle-eraser`、`mode: Text`、`erase_ratio_location` 归一化区域数组 - 视频结果音频分离: 点击 `音频分离` 后出现 `人声分离`、`音视频分离`;hover `人声分离` 后右侧二级菜单为 `仅保留人声`、`仅保留背景音`;`音视频分离` 的说明为 `分离内嵌音轨为独立音频节点` - 音视频分离落节点: 点击 `音视频分离` 后节点数从 34 增至 36、音频节点数从 1 增至 2;先出现 `音频上传中(100%)...`,约 3.5s 后落为新音频节点 `分镜视频-#1_音轨`,时长显示 `00:00 / 00:05`,并同时连出 `分镜视频-#1_无声` 视频节点 - 人声分离仅保留人声: 点击 `人声分离 -> 仅保留人声` 后,源视频工具条按钮变为 `分离中`,页面提示 `人声分离处理中,请稍候…`,余额保持 `531`;约 6.5s 后节点数从 11 增至 13、边数从 28 增至 30,新增音频节点 `分镜视频-#1_人声` 和视频节点 `分镜视频-#1_无声`,两条边均从源视频 `分镜视频-#1` 连出 - 人声分离仅保留背景音: 在已执行过人声/音视频分离的 `分镜视频-#1` 上点击该项后,同样出现 `分离中` 和 `人声分离处理中,请稍候…`;约 20s 后节点数仍为 13、未出现 `分镜视频-#1_背景音`,边数从 30 增至 32,疑似复用已有分离结果或需干净源视频复测 - 人声分离仅保留背景音(干净副本): 将可见视频结果 `视频一键去字幕-分镜视频-#1` 复制为 `视频一键去字幕-分镜视频-#1 - 副本` 后,点击 `人声分离 -> 仅保留背景音`,源视频工具条立即变为 `分离中`,页面提示 `人声分离处理中,请稍候…`,余额保持 `531`;约 8s 后边数从 6 增至 8,向右平移画布后发现两个结果节点同坐标 `translate(5286px, -962px)`,先渲染 350x350 视频节点 `视频一键去字幕-分镜视频-#1 - 副本_无声`,再渲染 350x148 音频节点 `视频一键去字幕-分镜视频-#1 - 副本_背景音` - 视频结果解析: 点击 `分镜视频-#1` 的 `解析` 后余额从 `533` 变为 `531`,按钮文案变为 `解析中`,页面出现 `正在解析视频...` - 视频解析落节点: 约 2.5s 后出现 `解析完成,已创建视频故事节点`;新增边 `e-Mjyng4PRdE`,`aria-label` 为 `Edge from v-kfwaCZvhsJ to b-YCox1NJ2cN`,源节点为 `分镜视频-#1`,目标节点为 `视频故事` - 视频故事节点: 节点 class 为 `react-flow__node-video-story`,标题 `视频故事`,表头顺序为 `镜号 / 开始时间 / 结束时间 / 时长 / 画面描述 / 叙事内容 / 景别 / 摄影机角度 / 摄影机运动 / 焦距与景深 / 光线 / 背景音乐 / 人声/音效 / 图像生成提示词 / 视频运动提示词 / 关键帧` - 视频故事内容: 当前 5s 视频生成 1 行,时间 `0 / 5 / 5`;画面描述为深夜办公室加班女性,叙事内容强调职场压抑和文件压迫感,镜头为 `中景至近景 / 平视 / 缓慢推镜头 (Slow Zoom In) / 浅景深`,图像和视频运动提示词使用英文 - 添加节点菜单: 文本、图片、视频、视频合成 Beta、导演台 NEW、音频、脚本子菜单、素材库子菜单、上传、从生成历史选择 - 添加资源入口: `上传` 打开文件选择器;`从生成历史选择` 打开历史资产选择面板 - 上传入口文件选择器: 点击 `添加节点 -> 上传` 可打开 file chooser,chooser 支持 multiple;使用无敏感测试图片 `/tmp/codex-video-canvas-upload.png` 执行 `setFiles` 时,Chrome 扩展返回 `Not allowed / fileChooser.setFiles failed`,节点数保持 13,未出现测试文件名或新节点;按 Chrome 插件说明需在 `chrome://extensions` 为 Codex 扩展开启 `Allow access to file URLs` 后才能继续真实上传复测 - 图片节点: 图生图、图片高清、参考/标记/风格、Lib Image、标准画质、2K、1 张、18 点 - 视频节点: 首尾帧/首帧模式、参考/标记/特效/角色库/运镜、Seedance 2.0、文生视频、16:9/720P/5s/1 个 - 视频模型菜单: Seedance 2.0 VIP/Fast/Mini、Happy Horse 1.1/1.0、Kling O3/3.0/O1/2.6、Wan 2.7、动作迁移、MJ Video - 视频参数菜单: Auto/16:9/4:3/1:1/3:4/9:16/21:9、480P/720P/1080P/4K、时长、音频开关、数量 1/2/4 - Prompt 辅助: 8 个运镜卡、特效库九宫格、角色库选择器 - 音频生视频预设: 自动创建音频/图片/视频节点组并连接 - 视频合成 Beta: 空态提示“空空如也,请连接视频节点后操作” - 导演台 NEW: 3D 导演台全屏编辑器、导演/机位视角、场景树、属性、FOV、坐标、截图工具 - 素材库入口: 左侧小弹层,包含 `风格库 新增风格节点 NEW` 和 `特效库 新增特效节点 NEW` - 特效库广场: tabs 为 `特效广场 / 我的收藏 / 最近使用`,搜索框 placeholder `搜索特效名称、作者`,分类 `推荐 / 全部`,卡片显示名称、`商用`、作者、使用数 - 风格库广场: tabs 为 `风格广场 / 我的收藏 / 最近使用`,搜索框 placeholder `搜索风格名称、作者`,分类包含 `推荐`、`Midjourney`、`摄影写真`、`电商营销`、`动漫游戏`、`风格插画`、`平面设计`、`建筑及室内设计`、`创意玩法`、`文创周边`、`小说推文`,带 `仅看可商用` checkbox - 历史记录面板: 标题 `历史资产`,顶部显示 `100%`,tabs 为 `图片历史(8)`、`视频历史(1)`、`音频历史(0)`,排序按钮 `时间降序`,操作入口 `批量操作` - 历史资产时间排序: 点击 `时间降序` 不打开菜单,而是按钮文案立即切为 `时间升序`;再次点击 `时间升序` 立即切回 `时间降序`;本次竞品临时页历史面板以居中大浮层展示,内容框约 `x=76 y=80 w=1361 h=645`、外层 z-index `601` - 历史资产面板布局: 本轮临时页为居中大浮层,不是左侧抽屉;外层 `pointer-events: none`、内容框 `pointer-events: auto`、背景 `rgb(38,38,38)`、圆角 `16px`;标题位于 `x=92 y=99`,右上含 `100%` 缩放组和 28px 无文字关闭图标,点击关闭图标后 `历史资产` 消失;tabs 行位于 `y=159`,右侧 `时间降序` 与 `批量操作` 均为 `86 × 32`;素材区按 `144 × 144` 方形卡片横向网格排列,首行 x 约 `96/252/408/564/720/876...`,卡片 hover 层含 `查看/使用/下载` - 历史资产缩放组: 顶部 `100%` 左右两个无文字 28px 按钮为离散缩放控件;从 `100%` 点左侧按钮变为 `75%`,首卡从 `144 × 144` 变为 `130 × 130`,前三卡 x 为 `96/238/380`;点右侧按钮依次回到 `100%`、再到 `125%`(卡片 `182 × 182`,x 为 `96/290/484`)、`150%`(卡片 `248 × 248`,x 为 `96/356/616`) - 历史资产项: 按日期分组,如 `2026-07-09`,每项有 `查看`、`使用`、`下载` - 历史资产批量操作: 点击 `批量操作` 后顶部切换为 `已选择 0 项`,操作按钮为 `删除`、`下载`、`使用`、`取消选择`;未选中素材时前三项禁用、`取消选择` 可用;`视频历史(1)` 下日期组和素材项均出现 checkbox;选中 1 条素材后变为 `已选择 1 项`,`删除/下载/使用` 全部启用 - 历史资产批量布局: 大浮层批量模式下顶部操作区位于 tabs 行右侧,`已选择 0 项` 在 `x=1048 y=164 w=67 h=20`,`删除/下载/使用/取消选择` 分别为 `x=1123/1200/1277/1352 y=161`,尺寸为 `69×28 / 69×28 / 50×28 / 68×28`;日期组 checkbox 为 `x=96 y=209 16×16`,素材 checkbox 在卡片左上,首行 x 为 `102/258/414/570/726/882/1038/1194`、y=`245` - 历史资产批量下载: 当前视频历史为 `视频历史(5)`;批量模式选中 1 条视频素材后 `删除/下载/使用/取消选择` 均启用;点击 `下载` 后未触发浏览器 download 事件,四个按钮立即全部进入禁用态,至少 8s 内未恢复,页面无额外成功/失败 toast - 历史资产批量使用: 在临时竞品页打开 `历史资产`,进入批量模式并选中 1 条默认图片历史素材后点击顶部 `使用`;面板关闭,页面出现 toast `已应用到画布`,画布新增并选中图片节点 `图片28`,节点 class 为 `react-flow__node-image`,可见参数区含 `Lib Image / 自适应 · 标准画质 · 2K · 1张 / 18` - 历史资产列表单项下载: 点击默认图片历史第一项列表内 `下载` 后,6s 内未触发浏览器 download 事件;历史面板保留,未打开预览层,被点击的 `下载` 按钮保持文案 `下载` 但进入 disabled;同时弹出 `AI 生成内容水印管理规则` modal,modal 外层 z-index `801`、内容框 `740 × 404`、位置约 `x=386 y=201`,含 `去 AI 水印` 和 `保存设置` - 历史资产水印规则弹窗关闭: 弹窗打开后页面没有可见关闭 X;按 `Escape` 不关闭水印规则 modal,而是继续传到底层并关闭历史资产面板,modal 仍以 z-index `801` 保留;点击弹窗外遮罩也不关闭 modal;未点击 `保存设置`,避免修改竞品账号水印配置 - 历史资产水印规则开关: `去 AI 水印` 行为左侧 Mantine switch,input `role="switch"`、`type="checkbox"`、`checked=false`,轨道约 `38 × 20`、位置约 `x=410 y=445`、灰色 `rgba(255,255,255,0.25)`,圆点在左侧且为深色;点击轨道、文字、外层行和精确 input 均未改变 checked 状态,弹窗保持打开;正文滚动区约 `160px` 高,提示文案在 switch 下方,保存按钮位于 `x=972 y=537` - 历史资产单项查看: 点击默认图片历史素材的 `查看` 后,不关闭历史面板、不选中画布节点,而是在其上打开全屏黑色预览层;遮罩为 `bg-black/80`、z-index `700`,中心图片 `object-contain`,底部显示 `1 / 8` 和 `下载`,右侧有下一张箭头,右上角有关闭按钮 - 历史资产预览关闭: 预览打开后,点击黑色遮罩空白处、点击右上角关闭按钮、按 `Escape` 都只关闭预览层;历史面板继续保留在底层,画布节点仍不选中 - 历史资产预览切换: 第一张只显示右侧下一张箭头,点击后计数从 `1 / 8` 变为 `2 / 8`,左右箭头同时出现并贴近视口边缘(左 `x=16`、右 `x=1456`);按 `ArrowRight` 继续到 `3 / 8`,按 `ArrowLeft` 回到 `2 / 8` - 历史资产预览下载: 点击预览层底部 `下载` 后,6s 内未触发浏览器 download 事件;预览层和历史面板都保留,底部按钮变为禁用态 `下载中...`,约 13s 后仍保持 pending,按钮宽约 118px - 音频历史空态: 显示 `暂无历史记录` - 快捷键面板: 非 modal 浮层,有关闭按钮 `关闭快捷键面板` - 快捷键面板布局: 点击底部 `快捷键` 后打开 z-index `300` 的居中大浮层,外壳约 `x=180 y=300 w=1152 h=436`、背景约 `#444/95`、圆角 `16px`;没有可见标题,右上 28px 关闭按钮位于 `x=1292 y=313`;内容四列,列标题 `创作/缩放/移动画布/其他` 分别位于 `x=205/493/781/1069 y=325`,列宽约 `239`,行高 `28`、行距 `12`;按 `Escape` 和点击面板外均不关闭,只能点右上关闭按钮 - 快捷键分组: - 创作: `成组 G`、`合并分镜组 Option+G`、`解组 Shift+G`、`连线 L`、`复制节点和连线 D`、`生成 Enter`、`新建节点 Tab`、`节点复制 Option+拖动节点` - 缩放: `放大`、`缩小`、`适应画布 0` - 移动画布: `Space`、触控板、鼠标 - 其他: `整理画布 Option+Shift+F`、`撤销 Z`、`重做 Shift+Z`、`删除` - 教程菜单: 点击 `教程` 后显示小菜单 `使用教程`、`联系客服`、`联系销售`、`关注公众号` - 教程菜单布局: 点击底部 `教程` 后在图标上方弹出 z-index `300` 小菜单,外壳约 `x=865 y=582 w=104 h=154`、背景 `rgb(38,38,38)`、圆角 `12px`;四个纯文字按钮均为 `95 × 36`,`使用教程/联系客服/联系销售/关注公众号` y 坐标分别为 `587/623/659/695`;本轮自动化点击 `使用教程` 未捕获到新 tab,但历史手动/前轮记录显示该项会打开飞书 `LibTV使用指南` - 使用教程: 点击 `使用教程` 会打开飞书 `LibTV使用指南` 标签页 - 资产管理入口: 闭合态左下按钮为带文字的 `资产管理`,`1512 × 805` 视口下约 `x=22 y=759 w=94 h=28`;打开后左下 dock 仍贴视口底部,面板内右上 `资产管理` 图标按钮位于 `x=200 y=101 w=32 h=32` - 资产管理面板布局: 打开后是 Mantine Drawer 式左侧全高侧栏,外壳 `x=0 y=0 w=240 h=805`、背景 `rgb(23,23,23)`、圆角 `0`、drawer inner z-index `30`;顶部工作区输入约 `x=12 y=56 w=78 h=20`,项目按钮 `画布 1` 约 `x=99 y=52 w=68 h=28`;tabs 行 `画布 / 资产` 位于 `x=8/60 y=102 w=44 h=30`,active tab 背景 `rgba(255,255,255,0.15)` - 资产管理画布 tab 控件: 标题区 `x=0 y=142 h=52`,行内 `画布元素` 在 `x=16 y=158`,`收起全部分组` `x=70 y=154 w=28 h=28`,类型筛选 `x=148 y=154 w=54 h=28`,搜索按钮 `x=204 y=154 w=28 h=28` - 资产管理宽度拖拽复测: Drawer 右侧有 `role=separator`、aria `调整工作区面板宽度` 的 12px 热区,class 含 `workspace-panel-drawer-resize-handle`、cursor 为 `col-resize`;从默认 240px 沿 `x=233 -> 360` 拖拽后侧栏宽变 `360`,separator 到 `x=347.5 w=12`,关闭按钮/筛选/搜索分别到 `x=319.5/267.5/323.5`,列表主定位按钮宽约 `335.5`,更多/定位按钮到 `x=293.5/319.5`,底部统计宽约 `359.5`;左下 dock 随侧栏宽度移动到 `整理/小地图/隐藏连线/吸附/缩放 x=382/414/446/478/510`,画布 viewport transform 不变。本轮从 360 回拖未稳定复现缩窄,不把最大/回缩边界作为已确认事实 - 资产管理收起全部分组复测: 点击 `收起全部分组 x=70 y=154 w=28 h=28` 后按钮 aria 变为 `展开全部分组`,但当前可见的普通节点行仍保留,列表可见定位行数量保持 `28`;滚动内容总高度从约 `4130` 缩到 `2072`,说明只收起分组内部内容,不会把非分组节点隐藏成空态,底部统计仍为 `共 98 节点` - 资产管理搜索: 点击 `搜索节点` 后标题行原地切换为输入框,placeholder `搜索节点`,输入框约 `x=29 y=158 w=101 h=20`,右侧按钮变为 `关闭搜索` 并保持 `x=204 y=154 w=28 h=28`;输入 `镜头 1` 后列表即时过滤为 `镜头 1/10/11/...` - 资产管理类型筛选: `全部`、`文本`、`图片`、`视频`、`视频合成`、`导演台`、`音频`、`脚本`、`脚本(旧版)`;下拉菜单 `role=menu`,约 `x=148 y=186 w=180 h=333`、背景 `rgb(23,23,23)`、圆角 `12px`、z-index `410`,每项 `171 × 32` - 资产管理音频类型筛选复测: 在类型菜单中点击 `音频 x=152 y=410.5 w=171 h=32` 后,筛选按钮 aria/text 变为 `筛选类型:音频 / 音频`,菜单关闭;列表只保留音频类主行,本轮可见 `分镜视频-#1_背景音`、`分镜视频-#1_人声`、`分镜视频-#1_音轨`、`视频一键去字幕-分镜视频-#1 - 副本_背景音`、`音频节点 10/13/5/4` 共 8 条,其中 `预设 - 音频生视频` 组内子项缩进到 `x=24`;底部统计仍显示整张画布 `共 98 节点`,不改为筛选结果数量,也无空态 - 资产管理内容: 按节点和分组列出当前画布,如 `导演台 6`、`脚本生成器`、`剧本`、`分镜图 · 我在盛唐写天下`、`视频组 · 我在盛唐写天下`、`我在盛唐写天下资产组` 等;普通行外壳 `x=8 y=202 w=224 h=40`,主定位按钮 `x=8 y=206 w=216 h=32`,更多按钮 `x=174 y=210`,定位图标 `x=200 y=210`;底部统计区 `x=0 y=753 w=240 h=53`,本轮竞品账号为 `共 76 节点` - 资产管理定位行为复测: 在资产 Drawer 打开且当前 viewport 为 `matrix(0.1,0,0,0.1,269.1,107.6)` 时,点击列表行 `导演台 12 机位2-shot-01` 后不增删节点/边,目标节点立即选中,viewport 变为 `matrix(1,0,0,1,-6201,199.5)`;选中节点屏幕框为 `x=701 y=91.5 w=350 h=622`,节点中心 `x=876 y=402.5`,即对齐到左侧 240px Drawer 右侧主画布区域中心;本轮顶部黄色 `正在跟随` 条在点击前已由此前教程残留存在,点击 `取消ESC` 仍未清除,因此不作为本轮定位新增证据 - 资产管理更多操作: 单项 `更多操作` 弹出菜单为 `重命名`、`复制`,菜单约 `x=174 y=240 w=180 h=81`、背景 `rgb(23,23,23)`、圆角 `12px`、z-index `410`,两项分别约 `x=178 y=249` 和 `x=178 y=285` - 资产管理复制行为复测: 本轮在竞品资产管理第一行 `导演台 12` 点击 `更多操作 -> 复制`,菜单项 `复制` 坐标约 `x=178 y=284.5 w=171 h=32`;复制后 `.react-flow__node` 从 `94` 增至 `95`,`.react-flow__edge` 保持 `106`,新节点立即选中,标题为 `导演台 12 - 副本`,在列表中插入到原节点下一行 `y=248`,画布世界坐标为原节点同 `x=6192`、`y=-108 -> 302`(即 `height 350 + 60` 的纵向偏移),没有成功 toast - 资产管理资产 tab: 点击 `资产` 后 active 背景移到资产 tab;内容区变为素材搜索/筛选而非画布大纲,搜索输入 placeholder `请输入搜索内容`,约 `x=8 y=154 w=192 h=30`,搜索按钮 `x=172 y=158 w=22 h=22`,`筛选素材类型` 按钮 `x=204 y=155 w=28 h=28`;当前显示 `暂无资产` 空态,空态容器约 `x=8 y=196 w=224 h=188` - 资产管理资产 tab 标签筛选: 点击 `筛选素材类型` 后弹出标签筛选浮层,约 `x=204 y=193 w=322 h=189`、背景 `rgb(33,33,33)`、圆角 `12px`、z-index `410`;标题 `标签`,可选标签 `其它/人物/场景/物品/风格/音效`,底部按钮 `清空/应用` - 视图跟随态: 通过资产管理/节点定位后顶部显示 `正在跟随`,按钮文案 `取消ESC`,下方提示 `按 ESC 退出`;复查 DOM 后未发现该状态生成临时连接路径,应与节点定位跟随相关,不能等同于连线模式 - 端点拖拽建连: 竞品节点使用 React Flow 透明 handle,DOM 为 `.react-flow__handle`、`data-handleid="target/source"`、`data-handlepos="left/right"`、`connectablestart/connectableend`;实测从 `分镜视频-#3` source handle 拖到 `分镜视频-#9` target handle 后,`.react-flow__edge` 数量从 73 增至 74,新增边 `e-SYnsgmeqw7`,没有弹出菜单或成功 toast - 连线选择/删除: 竞品点击新增边 `e-SYnsgmeqw7` 后,该边 DOM class 变为 `react-flow__edge react-flow__edge-default nopan selected selectable`,selected nodes 为空;按 `Delete` 后该边消失,`.react-flow__edge` 数量从 74 回到 73,没有弹窗或 toast - 选中线中点剪刀删除: 另测临时边 `e-al9CYM8T8M`,创建后 `.react-flow__edge` 数量从 73 增至 74;点击选中后边 class 为 `react-flow__edge react-flow__edge-default nopan selected selectable`,中点出现 `.scissors-enter` 深色圆形剪刀按钮;点击剪刀后边数从 74 回到 73,未出现弹窗或 toast - 连线重连/目标高亮复查: 选中线后 DOM 未发现 `.edgeupdater` 或可拖拽重连手柄;静态 hover 目标 handle 仍只是普通 `.react-flow__handle ... connectionindicator`,未发现稳定额外高亮 class - 端点拖拽目标瞬时高亮: 竞品从 source handle `x=1017.6 y=536.9` 拖到目标节点/handle `x=759 y=536.9` 时,目标节点内容上方瞬时出现无类名黑色透明遮罩,采样为 `rgba(0,0,0,0.35)`,矩形约 `x=759 y=407.6 w=258.6 h=258.6`;目标节点本身未新增 `valid/connecting` class、outline 或 shadow - 左下工具条闭合态: 竞品 `1512 × 805` 视口下左下 dock 坐标为 `资产管理 x=22 y=759 w=94 h=28`、`整理画布,Option+Shift+F x=120`、`切换小地图 x=152`、`隐藏节点连线 x=184`、`网格吸附 x=216`、`缩放选项 x=248 w=42`,缩放按钮文字为 `100%`;默认不显示 `- / +` 独立缩放按钮 - 左下工具条资产面板打开态: 资产管理 Drawer 打开后,左下 dock 去掉 `资产管理` 文字入口并整体右移 `240px`,首个按钮 `整理画布` 位于 `x=262`,随后 `切换小地图/隐藏节点连线/网格吸附/缩放选项` 分别位于 `x=294/326/358/390` - 小地图打开态复测: 点击 `切换小地图` 后按钮背景变为 `rgba(255,255,255,0.15)`;弹出的 `.react-flow__panel.react-flow__minimap` 为原生 SVG 小地图,资产面板打开态坐标 `x=295 y=642 w=150 h=110`,computed 样式为背景透明、无边框、圆角 `12px`、无阴影、`overflow: visible`、`cursor: auto`;内部 `.react-flow__minimap-svg` 同为 `150 × 110`,`viewBox` 使用画布世界坐标,节点为 `.react-flow__minimap-node`,遮罩为 `.react-flow__minimap-mask`,fill `rgba(255,255,255,0.04)` - 小地图交互复测: 在小地图内部点击会立即改变 `.react-flow__viewport` transform,本轮从 `matrix(0.743079,0,0,0.743079,-3842.91,487.096)` 跳到 `matrix(0.743079,0,0,0.743079,-2122.7,-2015.25)`;在小地图内拖拽继续平移到 `matrix(0.743079,0,0,0.743079,-6570.03,-4683.64)`,小地图保持打开 - 小地图关闭态: 再次点击 `切换小地图` 后 `.react-flow__minimap` 从 DOM 消失,按钮恢复普通 hover 类,实测背景读数为 `rgba(255,255,255,0.1)`(鼠标仍悬停时) - 隐藏节点连线复测: 资产面板打开态按钮 `隐藏节点连线 x=326 y=759 w=28 h=28`;点击后按钮 aria 变为 `显示节点连线`,已有 `.react-flow__edge` 不从 DOM 移除,仍保留 1 个 edge group 和 5 条 path,主线 `stroke rgb(192,200,208) / 2px`、流动高亮 path 仍可见;变化发生在节点连接端点,`.react-flow__handle` 仍保留但多数 connectable handle 从 `opacity=1 / pointer-events=auto` 变为 `opacity=0 / pointer-events=none`;再次点击恢复为 `隐藏节点连线`,handle 恢复可交互,viewport 不变、无 toast ## 本地已验证 - 本地测试账号可登录,余额显示 `200,000` - 本地视频画布可创建并加载 UUID 画布 - 本地服务器配置已生效,`/api/models` 和 `/api/video-canvas/config` 可正常返回 - 本地添加节点菜单可打开 - 本地添加节点菜单已补齐竞品结构: `脚本 NEW`、`脚本(旧版) Beta`、`素材库 NEW`、`风格库/特效库`、`从生成历史选择` - 本地添加节点菜单层级已修正: 画布内容层固定为低层级,添加面板可在其上命中;添加面板允许右侧子菜单溢出显示,避免 `脚本/素材库` 子菜单被滚动容器裁掉 - 本地添加资源入口已修正: `素材库` 继续打开风格/特效库;`从生成历史选择` 改为打开 `历史资产` 面板 - 本地主工具栏布局已对齐: 原先主入口为左侧竖排工具栏;现改为竞品式底部居中横排 32px 图标按钮,并使用 fixed 定位避免页面滚动状态改变坐标。Chrome 复测 `1512 × 805` 视口下坐标为 `添加节点 x=616 y=753`、`打开工具箱 x=656`、`素材库 x=696`、`角色库 x=736`、`历史记录 x=776`、`快捷键 x=825`、`教程 x=865`,与竞品一致;底部仍保留 `资产管理`/缩放/吸附控制区 - 本地素材库入口已验证: `风格库 NEW 新增风格节点`、`特效库 NEW 新增特效节点` - 本地特效库/风格库广场已验证: tabs、搜索 placeholder、分类、商用标签、作者和使用数均按竞品结构呈现 - 本地角色库已验证: 展示 `角色库`、角色详情、角色标签、`应用至画布`、`角色筛选`、`最近使用`、横向角色卡片;点击 `应用至画布` 会新增 `甜妹/清新少女` 角色资源节点并选中 - 本地工具箱已验证: 展示 `我的工具箱`、分类 `周星驰经典名场面 / 电商展示 / 镜头运动 / 人物动画 / 全部`、横向模板卡、卡片 `使用` 按钮、模板详情和 `模板工作流` 预览;点击 `【预设】左弧滑行` 的 `使用` 后关闭面板并新增 `参考图 -> 【预设】左弧滑行` 工具箱工作流 - 本地快捷键面板布局已对齐: 原先为左侧 `300px` 小浮层;现改为竞品式居中四列大浮层,外壳 `x=180 y=300 w=1152 h=436`、z-index `300`、圆角 `16px`;无可见标题,右上关闭按钮 `x=1292 y=313`;四列标题 `创作/缩放/移动画布/其他` 位于 `x=205/493/781/1068 y=325`,主要行距和分组内容与竞品一致;`Escape` 和点外面不关闭,只能点击关闭按钮 - 本地教程菜单布局已对齐: 原先为带标题和关闭按钮的 `220px` 小面板;现改为竞品式图标上方小菜单,外壳 `x=865 y=582 w=104 h=154`、背景 `rgb(38,38,38)`、圆角 `12px`、z-index `300`;四项按钮 `使用教程/联系客服/联系销售/关注公众号` 均为 `95 × 36`,坐标 y 为 `587/623/659/695`;`使用教程` 继续打开指南页,其余保留待接入提示 - 本地故事脚本工作流已验证: 点击 `故事脚本生成` 创建 `剧本` 和 `脚本生成器` 两个节点;选中脚本生成器后顶部浮动工具已改为竞品同款 `重新生成 / 批量生成分镜 / 批量生视频` - 本地脚本顶部工具栏已对齐: 竞品复测 `1512 × 805` 视口下脚本选中浮层为 `x=411 y=60 w=393 h=41`,按钮为 `重新生成 x=415 w=96`、`批量生成分镜 x=515 w=122`、`批量生视频 x=641 w=109`;本地复测为浮层 `w=393 h=41`,按钮 `w=96/122/109 h=32`,文本不再带多余首字图标 - 本地故事脚本表格已对齐: `生成完整脚本` 后脚本生成器节点显示竞品式 9 列表格,列名为 `镜号 / 时长 / 画面描述 / 景别 / 光影氛围 / 对白·旁白 / 音效 / 运镜 / 最终提示词`;Chrome DOM 复测确认列名全部存在,镜头编号 `01` 到 `18` 全部生成,节点状态为 `故事脚本已生成` - 本地脚本全屏三步工作流已对齐: 脚本生成器节点生成完成后出现 `打开脚本节点 →`,点击后打开 fixed 全屏深色工作流;Chrome 复测顶栏为 `脚本生成器 / 确认镜头 18个镜头已就绪 / 准备资产 7/7 已生成 / 合成提示词 18/18 已合成 / 3/3 完成后可批量生视频`,外壳为 `1512 × 805`,表格区域 `x=25 y=180 w=1464`,行高固定 `60px` - 本地脚本准备资产页已对齐: 点击 `准备资产` 后显示 `全局风格 盛唐·国风二次元`,并按 `角色 / 场景 / 道具` 分组展示 7 个资产 `现代沈昭昭 / 沈昭昭 / 皇帝 / 金銮殿 / 长安城白昼 / 长安城夜景 / 侍卫长刀`;资产图实测 `w≈275 h=156`,每组保留虚线 `新增` 卡和 hover 菜单结构 - 本地脚本提示词弹窗已对齐: 在 `合成提示词` 页点击首行 `查看提示词` 后打开居中弹窗,Chrome 复测 modal `x=376 y=109 w=760 h=587`,含 `第 01 镜:最终提示词`、`分镜提示词 / 分镜图提示词·已生成`、`视频运动提示词 / 视频运动提示词·已生成`、`GVLM 3.1 Flash / 消耗 2 / 重新合成提示词` - 本地脚本批量分镜已对齐: 在干净画布按 `故事脚本生成 -> 生成完整脚本 -> 批量生成分镜` 顺序复测,toast 为 `已批量生成 18 个分镜图片节点`,画布生成 `分镜 01` 到 `分镜 18` 共 18 个图片生成器节点 - 本地脚本批量生视频已对齐前端编排: 先批量生成分镜后重新选中脚本节点点击 `批量生视频`,toast 为 `已创建 18 个视频生成器组`,生成 `分镜视频-#1` 到 `分镜视频-#18` 共 18 个视频任务节点;所有节点显示 `720P · 5s`,无 `720P · 6s` 漏出,任务参数写入 `Seedance 2.0 VIP / 16:9 / 720p / 5s`、分镜图引用、图像提示词、视频运动提示词和原始镜头时长 `sourceShotDuration` - 本地连线快捷键已验证: 按 `L` 进入连线跟随态,顶部浮层对齐竞品 `正在跟随 / 取消ESC / 按 ESC 退出`;选择起点和目标节点后会新增连线并退出跟随态 - 本地连线视觉预览已验证: 选择 `剧本` 为起点后,画布 SVG 出现 `#a7afff` 虚线预览路径和末端光圈;移动鼠标时路径终点变化;按 `ESC` 后预览路径和光圈移除 - 本地透明端点单击已验证: 节点左右 handle 已改为透明 hot zone,带 `data-handleid="target/source"`、`data-handlepos="left/right"`、`data-nodeid`;单击 `脚本生成器` 右侧 source handle 后只显示顶部 `正在跟随 / 取消ESC / 按 ESC 退出`,没有连接菜单,handle 文本为空 - 本地透明端点拖拽建连已验证: 从 `脚本生成器` source handle 拖到 `图片节点 3` 后静默新增连线,`.edge-flow-segments path` 从 3 增至 6,未出现 `已连接` toast、未出现连接菜单,预览线和光圈释放后清理为 0 - 本地端点拖拽目标瞬时高亮已对齐: 新增 `lineConnectState.hoverNodeId` 并在 `CanvasNodeShell` 内渲染 `data-connection-target-overlay` 黑色透明遮罩;Chrome 复测从首帧节点 source `x=890.1 y=421.1` 拖到视频节点 target `x=974.8 y=421.1` 时,目标节点出现 `bg-black/35`、`pointer-events-none` 遮罩,矩形 `x=974.8 y=255.5 w=431.2 h=331.1`,顶部跟随提示和紫色预览线仍存在;松手后遮罩和预览线均清理为 0 - 本地连线选择/删除已验证: 每条线现在带 `.react-flow__edge` 与 `data-id`,透明粗 hit path 可点击;点击 `脚本生成器 -> 图片节点 3` 的测试线后 class 增加 `selected`,`selectedNodes` 为空;按 `Delete` 后 edge 数量从 2 回到 1,节点数量保持 3,没有弹窗或 toast - 本地选中线中点剪刀删除已验证: 点击测试线后 `.react-flow__edge` class 增加 `selected`,中点显示 `.scissors-enter` 深色圆形剪刀按钮;按钮位于节点层之上且可命中,点击后 edge 数量从 2 回到 1,节点数量保持 3,剪刀按钮清理为 0 - 本地视频结果卡 hover 控件已验证: 通过 `脚本 -> 视频参考生成分镜脚本` 创建视频参考资源节点,卡片内出现竞品式播放圆钮、`0:00 / 0:05` 时间、进度条、右下 `截取视频帧` 圆钮和 `截取首帧/截取尾帧/截取当前帧` 菜单 - 本地视频帧截取已验证: 打开右下帧菜单后点击 `截取首帧`,节点数从 2 增至 3、edge 数从 1 增至 2,新增 `视频-首帧` 图片节点,显示 `1280 × 720`,并保留与原视频节点的连线 - 本地视频结果工具条二级功能已验证: 选中带真实 mp4 地址的视频资源节点后,顶部工具条按竞品顺序显示 `剪辑`、`裁剪`、`高清`、`解析`、`智能去字幕`、`音频分离`;`高清` 按钮已修正为只显示 `高清`,不再露出额外 `HD` 文本 - 本地视频裁剪态已验证: 点击 `裁剪` 后,视频卡上出现 80% 裁剪框和 `1024 x 576` 标签,视频卡下方出现 `退出裁剪`、`1024 x 576`、`生成裁剪` 的内联操作条,形态对齐竞品 - 本地视频裁剪生成已验证: 点击 `生成裁剪` 后出现 `正在裁剪视频,请稍候…`,按钮进入 `生成中 68%` 禁用态;随后新增下游 `视频_裁剪` 视频节点,标题旁显示 `1024 × 576`,保留从原视频到裁剪结果的连线,并继续显示视频结果卡 hover/工具条能力 - 本地视频高清面板已验证: 点击 `高清` 后出现 `Topazlabs`、`1080P`、`2K`、`4K`、`不补帧`、`1x` - 本地视频高清落节点已验证: 点击视频工具条 `高清 -> 1080P` 后新增下游 `高清(1080P)` 节点,文本为 `配置参数 / 生成高清视频`,并保留从源视频到高清节点的连线;点击 `生成高清视频` 后节点进入 `生成中`,约 2s 后变为 `生成结果 1920 × 1080`,节点内显示视频预览和 `1080P` - 本地智能去字幕已验证: 点击 `智能去字幕` 后下拉项为 `智能擦除`;点击后下方出现 `关闭去字幕生成器`、标签 `智能擦除`、消耗 `0`、右侧 `生成擦除` 按钮 - 本地智能擦除生成已验证: 点击 `生成擦除` 后新增下游 `视频一键去字幕-视频` 任务节点,显示 `生成中 4%... / 取消`,并保留从源视频到任务节点的连线;本地模拟完成延迟已从约 3.6s 拉长到约 42s,以贴近竞品长 pending 节奏;完成后转为普通视频结果卡,标题旁显示 `1280 × 720`,保留 hover 播放、帧截取和二级工具条 - 本地智能擦除取消已对齐: 修复 `VIDEO_SUBTITLE_ERASE` pending 节点取消按钮的 pointer 事件,点击 `取消` 后弹出确认框 `取消生成 / 正在生成中,即将完成!/ 停止将不退还已消耗算力。/ 取消 / 确定`;点击 `确定` 后弹窗关闭,任务节点继续保持 `生成中 ... / 取消`,不 toast、不立即删除、不转失败态,和本轮竞品实测一致 - 本地生成失败态已验证: 在本地 `localhost:3003` 选中首帧图生视频的右侧视频目标节点后点击生成,因当前本地浏览器会话未登录,接口返回 `未登录` 并进入 failed;视频节点保留首帧模糊背景,中间黑色胶囊显示 `未登录 / 移除`,同时出现 toast `未登录`;点击 `移除` 后失败视频节点和连线立即清理,只保留首帧节点。未接入首帧时则只 toast `首帧图生视频需要先接入首帧图片`,不会创建 failed 节点 - 本地框选擦除已实现: `智能去字幕` 下拉补齐说明 `AI一键去除视频字幕,仅支持中英文字幕` 和两项 `智能擦除/框选擦除`;`框选擦除` 进入视频卡区域编辑态,支持在视频画面拖拽多个青色半透明矩形,底部操作条含关闭、帮助、框选、撤销、重做、重置、费用和生成按钮 - 本地框选擦除参数已实现: 未框选时费用 `-`、生成按钮禁用;有区域后费用 `0`、生成按钮启用;撤销/重做/重置按竞品历史栈语义工作;点击生成会创建下游 `VIDEO_SUBTITLE_ERASE` 任务节点,draft 写入 `model: volcano-subtitle-eraser`、智能模式 `mode: Subtitle`、框选模式 `mode: Text`,并同时写入 `erase_ratio_location` / `eraseRatioLocation` 归一化区域数组 - 本地音频分离已验证: 点击 `音频分离` 后下拉项为 `人声分离`、`音视频分离`,`人声分离` hover 右侧子菜单为 `仅保留人声`、`仅保留背景音`,`音视频分离` 带说明 `分离内嵌音轨为独立音频节点` - 本地人声分离已对齐: 点击 `人声分离 -> 仅保留人声` 后立即显示 toast `人声分离处理中,请稍候…`,源视频工具条按钮变为 `分离中`,期间不新增节点;约 6.4s 后新增 `分镜视频-#1_人声` 音频节点和 `分镜视频-#1_无声` 视频节点,`.react-flow__edge` 数为 2,两个节点均由源视频连出 - 本地背景音分离已对齐: 点击 `人声分离 -> 仅保留背景音` 后按钮同样变为 `分离中`,toast 使用竞品父级文案 `人声分离处理中,请稍候…`;约 6.4s 后生成 `分镜视频-#1_无声` 350x350 视频节点和 `分镜视频-#1_背景音` 350x148 音频节点,两个结果同坐标落在源视频右侧,正文/DOM 顺序为 `_无声` 在前、`_背景音` 在后,`.react-flow__edge` 数为 2 - 本地视频解析已验证: 选中带真实 mp4 地址的视频节点后,点击 `解析`,按钮变为 `解析中`,没有出现旧的浮动解析面板;后端返回后新增 `视频故事` 节点并选中,节点含竞品同款 16 列表头,`镜号/开始时间/结束时间/时长/画面描述/叙事内容/景别/摄影机角度/摄影机运动/焦距与景深/光线/背景音乐/人声/音效/图像生成提示词/视频运动提示词/关键帧` 均可见 - 本地视频故事落节点已验证: 通过 `定位选中` 可将生成的 `video-story` 节点居中,表格节点使用暗色卡片、横向滚动长提示词;本次本地 demo 视频返回 3 行镜头,首行时间为 `0 / 5 / 5`,并保留从原视频节点到故事节点的画布连线 - 本地视频解析后端 schema 复测: 更新 `/api/canvas/workflow/analyze` 后,新建第二个视频参考节点再点 `解析`,按钮同样变 `解析中`;返回新 `视频故事` 节点 1 行,字段包含非默认摄影机/光线内容,如 `全景`、`静态固定镜头 (Static Fixed Shot)`、`无限景深`、`极低照度`,确认后端已按竞品 16 列 JSON 契约输出 - 本地视频首屏项目加载已修复: 本地 `AUTH_URL/NEXTAUTH_URL` 调整为 `http://127.0.0.1:3003` 后,使用 `codex-video-test@example.com` 登录可直接打开测试视频画布;视频画布组件现在优先水合服务端 `initialProject`,即使 Chrome 当前拦截直开 `/api/*`,也不会再落到空画布 - 本地框选擦除浏览器复测已完成: 在 Chrome 中选中 `分镜视频-#1` 后,顶部工具条显示 `剪辑/裁剪/高清/解析/智能去字幕/音频分离`;`智能去字幕` 下拉显示说明 `AI一键去除视频字幕,仅支持中英文字幕` 和 `智能擦除/框选擦除` - 本地框选擦除初始态已验证: 点击 `框选擦除` 后,视频卡下方出现操作条,含 `关闭去字幕生成器`、`框选擦除`、帮助问号、`框选区域`、`撤销`、`重做`、`重置`、费用和 `生成擦除`;未框选时费用为 `-`,撤销/重做/重置/生成禁用 - 本地框选擦除帮助已验证: hover 问号显示 `使用方法 / 在画面上拖拽鼠标,框选要擦除的区域 / 支持框选多个区域,所有框内文字将被擦除 / 擦除作用于整段视频,不仅是当前帧`,与竞品一致 - 本地框选擦除选区与历史已验证: 拖拽可创建青色半透明矩形,实测样式为半透明青色填充、`rgb(6, 144, 174)` 边框、`rgb(9, 202, 245)` 四角点;支持多个区域;有区域后费用为 `0` 且生成启用;撤销移除最新区域并启用重做,重做恢复区域后禁用,重置清空区域、费用回 `-`、生成禁用且撤销仍可用 - 本地框选擦除生成已验证: 重置后重新框选并点击 `生成擦除`,创建下游 `视频一键去字幕-分镜视频-#1` 节点,先显示 `生成中 6%... / 取消`,并保留从源视频到任务节点的连线;约 5s 后切为普通视频结果卡,标题旁显示 `1280 × 720`,保留播放、帧截取和二级工具条能力 - 本地添加节点二级菜单复测修正: `脚本/素材库` hover 子菜单和主菜单之间的间隙已收窄,避免鼠标从主菜单移到子项时丢失 hover 导致子项无法点击 - 竞品添加节点菜单最终复测: 底部 `添加节点` 按钮为 `x=616 y=753 w=32 h=32`;主菜单为 `x=533 y=291 w=196 h=445`,背景 `rgb(38,38,38)`,边框 `0.5px solid rgb(54,54,54)`,圆角 `16px`,padding `8px`,gap `4px`;主行 `x=542 w=179 h=32`,y 依次为 `添加节点 300`、`文本 336`、`图片 372`、`视频 408`、`视频合成 444`、`导演台 480`、`音频 516`、`脚本 552`、`素材库 588`、`添加资源 624`、`上传 660`、`从生成历史选择 696`;`Beta x=630 y=452 w=34 h=16`,`NEW x=617 y=488/596 w=36 h=16` - 本地添加节点菜单最终对齐: Chrome 复测本地主菜单同为 `x=533 y=291 w=196 h=445`,背景、边框、圆角、padding、gap、行坐标与竞品一致;文本起点 `x=572`,`Beta x=630 y=452 w=34 h=16`,`导演台 NEW x=617 y=488 w=36 h=16`,`素材库 NEW x=617 y=596 w=36 h=16`,主菜单 DOM 文本为 `添加节点文本图片视频视频合成Beta导演台NEW音频脚本素材库NEW添加资源上传从生成历史选择` - 本地添加节点子菜单最终对齐: `脚本` hover 时外层 `x=721 y=552 w=204 h=85`、内层 `x=729 y=552 w=196 h=85`,文本 `脚本NEW / 脚本(旧版)Beta`;`素材库` hover 时外层 `x=721 y=588 w=204 h=85`、内层 `x=729 y=588 w=196 h=85`,文本 `风格库 / 特效库`,不再带多余 `NEW` 徽标 - 本地故事脚本生成已验证: 后端 `story-script` 模式已改为直接要求模型输出 18 镜头 JSON,schema 补齐 `duration`、`shotSize`、`lighting`、`dialogue`、`voiceAndSfx`、`cameraMovement`、`imagePrompt`、`motionPrompt` 等字段,并要求 motion prompt 采用 `起始状态 / 动作过程 / 结束状态 / 音效` 结构;本地 `CANVAS_E2E_LOCAL=true` 时对 loopback 提供确定性的 18 镜测试数据,Chrome 复测节点展示 `01` 到 `18` - 本地生成分镜已验证: 点击 `生成分镜` 后创建 18 个 `分镜 01` 到 `分镜 18` 图片节点,当前画布共 20 节点 - 本地资产管理入口已对齐: 原先左下入口是 `26 × 26` 小图标且随页面滚动偏移;现改为 fixed 视口定位的竞品式文字按钮,Chrome 复测 `1512 × 805` 下为 `资产管理 x=22 y=759 w=94 h=26`,并保留 aria/title `资产管理` - 本地资产管理面板布局已对齐: 原先是左下 `340px` 浮层;现改为左侧全高 Drawer,外壳 `x=0 y=0 w=240 h=805`、背景 `rgb(23,23,23)`、圆角 `0`、z-index `30`;顶部工作区输入 `x=12 y=56 w=78`,`画布 1` 按钮 `x=99 y=52 w=68`,tabs `画布/资产` 在 `x=8/60 y=102`,面板内 `资产管理` 关闭按钮 `x=199 y=101 w=32` - 本地资产管理画布 tab 已对齐: 控制行 `画布元素/收起全部分组/全部/搜索节点` 坐标分别为 `x=16/70/147/203 y=154`,行列表起点 `x=8 y=202`,主定位按钮 `x=8 y=206 w=216 h=32`,更多按钮 `x=174 y=210`,定位图标 `x=200 y=210`,底部统计区 `x=0 y=752 w=239 h=53` - 本地资产管理定位最终对齐: 原先点击资产行只选中节点,viewport 保持 `matrix(1,0,0,1,0,0)`,离屏副本仍在视口下方;现改为竞品式定位。Chrome 复测本地 `文本节点 1 - 副本` 行: 点击前副本世界位置 `left=756 top=813 w=350 h=350`,点击后 viewport 为 `matrix(1,0,0,1,-55,-585)`,副本屏幕框 `x=701 y=228 w=350 h=350`,中心 `x=876 y=403`,正对齐资产 Drawer 右侧主画布中心,无 toast、不增删节点/边 - 本地资产管理收起全部分组最终对齐: 原先点击 `收起全部分组` 会把所有普通节点隐藏,并显示 `分组已收起`,与竞品普通节点仍保留不一致;现改为只切换按钮状态。Chrome 复测本地两条普通文本节点时,点击后按钮 aria 变 `展开全部分组`,定位行数量保持 `4`(两条主定位 + 两个定位图标),`文本节点 1 / 文本节点 1 - 副本` 仍位于 `y=206/248`,不出现 `分组已收起`,底部仍为 `共 2 节点` - 本地资产管理搜索已对齐: 点击 `搜索节点` 后标题行原地切换为输入框并聚焦,placeholder `搜索节点`,Chrome 复测输入框 `x=29 y=158 w=101 h=20`、关闭按钮 `x=203 y=154 w=28 h=28`;输入 `分镜` 后即时过滤并保留同款行布局 - 本地资产管理类型筛选已对齐: 菜单项为 `全部/文本/图片/视频/视频合成/导演台/音频/脚本/脚本(旧版)`,Chrome 复测菜单 `x=147 y=186 w=180 h=333`、背景 `rgb(23,23,23)`、圆角 `12px`、z-index `410`,item 坐标从 `x=152 y=195` 开始,接近竞品 `x=148 y=186 w=180 h=333` - 本地资产管理音频类型筛选最终对齐: 通过底部 `添加节点 -> 音频` 创建 `音频节点 3` 后重新打开资产管理;选择类型菜单 `音频 x=152 y=411 w=170 h=32` 后,筛选按钮 aria/text 变为 `筛选类型:音频 / 音频`,列表只剩 `音频节点 3`,行坐标 `x=8 y=206 w=216 h=32`,定位图标 `x=200 y=210`;底部仍显示总节点数 `共 3 节点` 而不是筛选结果 `1`,无空态,行为与竞品一致 - 本地资产管理更多操作已对齐: 单项菜单显示 `重命名`、`复制`,Chrome 复测菜单 `x=174 y=240 w=180 h=82`、背景 `rgb(23,23,23)`、圆角 `12px`、z-index `410`,两项从 `x=179 y=249/285` 附近开始;复制行为已改为竞品式无 toast,标题追加 ` - 副本`,列表副本紧跟原节点下一行,本地复测 `文本节点 1 -> 文本节点 1 - 副本`、底部 `共 1 节点 -> 共 2 节点`,画布位置从 `left=756 top=403 size=350` 复制到 `left=756 top=813`,即 `height + 60` 纵向偏移 - 本地资产管理资产 tab 已实现: 点击 `资产` 后 active 背景切换到资产 tab,内容显示素材搜索输入 `请输入搜索内容`,输入框 `x=8 y=154 w=191 h=30`,搜索按钮 `x=173 y=158 w=22 h=22`,`筛选素材类型` `x=203 y=155 w=28 h=28`,空态 `暂无资产` 容器 `x=8 y=196 w=223 h=188` - 本地资产管理资产 tab 标签筛选已对齐: 点击 `筛选素材类型` 后弹出标签筛选浮层,Chrome 复测 `x=203 y=193 w=322 h=190`、背景 `rgb(33,33,33)`、圆角 `12px`、z-index `410`;含 `标签`、`其它/人物/场景/物品/风格/音效`、`清空/应用` - 本地历史资产已验证: 基于画布图片/视频/音频节点聚合,列表含缩略图、类型状态、`查看`、`使用`、`下载`;点击历史素材的 `使用` 后关闭面板并复制一份历史素材回画布,toast 已统一为竞品式 `已应用到画布` - 本地历史资产时间排序已对齐: 原先 `时间降序` 是静态按钮;现改为竞品式即时两态切换,点击 `时间降序` 后变为 `时间升序`,再次点击回到 `时间降序`,素材数组按状态正序/倒序显示,不打开额外菜单 - 本地历史资产面板布局已对齐: 原先为左侧 `420px` 小列表抽屉;现改为竞品式居中大浮层,外层 z-index `601`、内容框 `h=calc(100vh-160px)`、`w=min(90vw,1600px)`、背景 `#262626`、圆角 `16px`;顶部保留标题、`100%` 缩放组和无文字关闭按钮,tabs/排序/批量操作行改为 `32px` 高透明按钮,素材列表改为 `144 × 144` 方形卡片网格,卡片 hover 层仅显示 `查看/使用/下载`;Chrome 复测本地 `视频历史(1)` 外壳为 `x=76 y=80 w=1361 h=645`,日期 `x=96 y=207`,首卡 `x=96 y=239 w=144 h=144`,三按钮分别为 `x=107/149/191 y=297` - 本地历史资产缩放组已对齐: 原先顶部 `- / +` 为 no-op;现改为竞品式离散档位 `75% / 100% / 125% / 150%`。Chrome 复测本地从 `100%` 点左侧按钮变 `75%` 且前三卡为 `130 × 130`、x `96/238/380`;连续点右侧按钮回到 `100%` 后到 `125%`(`182 × 182`,x `96/290/484`)和 `150%`(`248 × 248`,x `96/356/616`) - 本地历史资产默认图片历史已对齐: 原先默认 `图片历史(8)` 只有计数、内容区为空;现真实图片少于 8 条时用本地示例图片补足 8 张,真实图片仍排在前面;Chrome 复测默认图片页 `cardCount=8`,首行卡片 x 为 `96/252/408/564/720/876/1032/1188`、均为 `144 × 144`,`暂无历史记录` 不再出现,前三个按钮坐标为 `查看 x=107`、`使用 x=149`、`下载 x=191` - 本地历史资产默认图片操作已验证: 默认补位图片点击 `查看` 后打开 z-index `700` 全屏预览层,底部显示 `1 / 8` 和 `下载`,历史面板保留在底层;关闭预览后点击第一张 `使用`,历史面板关闭并出现 toast `已应用到画布`,画布出现 `角色图` 资源及图片节点工具条 - 本地素材引用已验证: 先从 `角色库` 应用 `甜妹/清新少女` 到画布,再从 `添加节点 -> 从生成历史选择` 打开历史资产,点击该角色素材的 `使用` 后关闭面板并复制回画布,toast 使用 `已应用到画布` - 本地历史资产批量操作已验证: 创建本地 `首帧图生视频` 工作流后,`视频历史(1)` 正常列出视频素材;点击 `批量操作` 后显示 `已选择 0 项`,`删除/下载/使用` 禁用、`取消选择` 可用,日期组和素材项出现 checkbox;勾选素材后显示 `已选择 1 项`,日期组和素材 checkbox 同步选中,`删除/下载/使用` 全部启用;点击 `取消选择` 后回到普通列表并恢复 `时间降序/批量操作` - 本地历史资产批量布局已对齐: 大浮层网格化后复测 `图片历史(8) -> 批量操作`,顶部 `删除/下载/使用/取消选择` 坐标与竞品一致为 `x=1123/1200/1277/1352 y=161`,尺寸为 `69×28 / 69×28 / 50×28 / 68×28`;日期组 checkbox 为 `x=96 y=209 16×16`,素材 checkbox 首行 x 为 `102/258/414/570/726/882/1038/1194`、y=`245`;选中第一张后 `已选择 1 项` 出现,四个顶部按钮均启用 - 本地历史资产批量下载已对齐: 当前本地视频历史为 `视频历史(3)`;选中 1 条视频素材后 `删除/下载/使用/取消选择` 全部启用;点击 `下载` 后不再逐个触发浏览器 download 事件,而是进入竞品式批量下载 pending 态,四个按钮立即全部禁用,8s 后仍保持禁用 - 本地历史资产批量使用已对齐: `视频历史(1)` 进入批量模式后,选中 1 条素材显示 `已选择 1 项` 且顶部 `删除/下载/使用/取消选择` 启用;点击 `使用` 后历史面板关闭,新增并选中一份历史素材节点,toast 为 `已应用到画布` - 竞品历史资产批量删除确认复测: 在 `图片历史(8)` 进入批量模式并选中第一张后,顶部显示 `已选择 1 项`,`删除/下载/使用/取消选择` 全部启用;点击 `删除 x=1122.9 y=160.5 w=69 h=28` 后不会立即删除,而是打开居中确认弹窗。弹窗外壳 `x=584 y=335.4 w=344 h=134.1`、背景 `rgb(38,38,38)`、圆角 `12px`、边框 `white/10`,标题 `批量删除 x=601 y=352.4`,正文 `确认批量删除 1 项 x=601 y=384.4`,按钮 `取消 x=799 y=420.6 w=50 h=32`、`删除 x=861 y=420.6 w=50 h=32`;为避免破坏竞品账号历史资产,本轮只点击 `取消`,取消后弹窗关闭并保留批量模式和 `已选择 1 项` - 本地历史资产批量删除最终对齐: 原先本地点击批量 `删除` 只弹 toast `批量删除会从历史资产中移除记录,后端接口待接入。`,没有确认弹窗;现补齐竞品式确认 modal。Chrome 复测本地 `图片历史(8) -> 批量操作 -> 选中第一张 -> 删除`: 弹窗 `x=584 y=335.8 w=344 h=133.5`,标题/正文/按钮为 `批量删除 / 确认批量删除 1 项 / 取消 / 删除`,按钮坐标 `x=799/861 y=420.3 w=50 h=32`;点击 `取消` 后保留 `已选择 1 项`,再次确认删除后本地显示 toast `删除成功`,`图片历史(8)` 变 `图片历史(7)`,顶部回到 `已选择 0 项` 且 `删除/下载/使用` 禁用 - 本地历史资产列表单项下载已对齐: 原先列表内 `下载` 会触发浏览器 download 并显示 `已开始下载当前资产`;现改为竞品式水印规则流程,点击后不触发浏览器 download,历史面板保留,被点击按钮 disabled 且文案仍为 `下载`,弹出 `AI 生成内容水印管理规则` modal,内容框为 `740 × 404`,含 `去 AI 水印` 和 `保存设置` - 本地历史资产水印规则关闭已对齐: 原先水印 modal 挂在 `HistoryAssetsPanel` 内,按 `Escape` 会随着历史面板一起卸载;现将 modal 状态提升到画布层,Chrome 复测 `视频历史(1) -> 下载 -> Escape` 后历史面板关闭但 `AI 生成内容水印管理规则` 仍保留,遮罩点击也不关闭 modal,和竞品一致 - 本地历史资产水印规则开关已对齐: 原先 `去 AI 水印` 是右侧蓝色开启态静态开关,且被底部 `保存设置` 区域覆盖,点击右侧开关会误触保存并关闭弹窗;现改为竞品式左侧灰色关闭态 switch,input `role="switch"`、`checked=false`,正文滚动区固定 `160px`,switch、提示文案和保存按钮分离;Chrome 复测点击 switch 和文字后状态仍为 false、弹窗保持打开 - 本地历史资产单项查看已对齐: Chrome 实测 `历史记录 -> 视频历史(1) -> 查看` 后,历史面板保留在底层、不选中画布节点,打开 `1512 × 805` 全视口黑色预览层;底部显示 `1 / 1` 和 `下载`,右上角关闭按钮位置贴近竞品,视频以 `object-contain` 方式居中展示并保留播放器 controls - 本地历史资产预览关闭已对齐: 遮罩空白点击、右上角 `关闭预览`、`Escape` 均只关闭预览层并保留历史面板;本轮修复了 `Escape` 同时触发主画布全局关闭导致历史面板一起关闭的问题 - 本地历史资产预览切换已对齐: 为测试切换先用本地 `使用` 复制出第二条视频历史素材;`视频历史(2)` 打开预览后显示 `1 / 2`,右箭头贴视口 `x=1456`,点击后变为 `2 / 2` 且左箭头贴视口 `x=16`;`ArrowLeft` 可回到 `1 / 2`,历史面板保留、画布节点不选中 - 本地历史资产预览下载已对齐: 原先预览层底部 `下载` 会立即触发浏览器 download 事件;现改为竞品式 pending,点击后不触发浏览器 download,预览层和历史面板保留,按钮禁用并显示 `下载中...`,pending 宽度固定为 118px - 本地上传复测状态: `上传` 按钮已触发 Chrome 文件选择器,但当前 Chrome 扩展未允许文件 URL 访问,`setFiles` 返回 `Not allowed`;需开启扩展文件访问后复测实际文件选择 - 本地上传入口复测补充: 本地 `添加节点 -> 上传` 也可打开 file chooser,chooser 支持 multiple;用同一测试图片执行 `setFiles` 同样返回 `Not allowed / fileChooser.setFiles failed`,节点数保持不变且无测试文件名,因此当前真实上传验证被 Chrome 扩展文件访问权限统一阻塞,不属于本地 UI 路径缺失 - 本地左下工具条已对齐: 原先左下 dock 为 `资产管理 / 画布总览 / 定位选中 / 吸附 / - / 100% / +`;现改为竞品式 `资产管理 / 整理画布,Option+Shift+F / 切换小地图 / 隐藏节点连线 / 网格吸附 / 缩放选项`,Chrome 复测闭合态坐标为 `x=22/120/152/184/216/248`,按钮尺寸 `资产管理 94×28`、普通按钮 `28×28`、缩放 `42×28` - 本地资产面板打开态 dock 已对齐: `assetManagerOpen` 时左下 dock 隐藏 `资产管理` 文字入口并 `translateX(240px)`,使按钮坐标对齐竞品打开态 `整理画布 x=262`、`切换小地图 x=294`、`隐藏节点连线 x=326`、`网格吸附 x=358`、`缩放选项 x=390` - 本地资产管理宽度拖拽已对齐: 原先只有 12px 透明热区但无 `role=separator`、无 `col-resize`、拖拽无响应;现补齐 `workspace-panel-drawer-resize-handle`、`role=separator` 和 pointer 拖拽,默认宽 240px,宽度按指针 x 坐标更新并钳制在 `240..520`。Chrome 复测 `x=234 -> 360` 后侧栏 `w=360`、separator `x=347 w=12`、关闭/筛选/搜索为 `x=319/267/323`,dock 为 `x=382/414/446/478/510`,与竞品 360px 态一致;再从 `x=353 -> 190` 回拖会钳制回 `w=240`,dock 回到 `x=262/294/326/358/390` - 本地小地图最终对齐: 原先是 `232px` 宽、带 `画布总览 / N 个节点` 标题的深色自绘弹窗;现改为竞品式透明 SVG 小地图,外壳 `.react-flow__panel.react-flow__minimap bottom right`,`150 × 110`、圆角 `12px`、背景透明、无边框、无阴影、`overflow: visible`、`cursor: auto`,无可见标题;资产面板打开态复测按钮 `x=294 y=759 w=28 h=28`,小地图 `x=294 y=641 w=150 h=110`,与竞品 `x=295 y=642` 仅 1px 取整差异 - 本地小地图交互已对齐: 小地图内部改为 `.react-flow__minimap-svg`、`.react-flow__minimap-node` 和 `.react-flow__minimap-mask`,mask fill `rgba(255,255,255,0.04)`;点击后按钮进入 `bg-white/15` 选中态,再次点击关闭并移除 `.react-flow__minimap`;本地复测点击 `x=370 y=700` 后世界 transform 从 `translate(144px,100px) scale(0.77)` 变为 `translate(-17px,51px) scale(0.77)`,拖拽 `345,685 -> 420,730` 后变为 `translate(-399px,-178px) scale(0.77)`,小地图保持打开 - 本地隐藏节点连线最终对齐: 原先 `edgesHidden` 会把已有边和剪刀按钮整体过滤掉,与竞品“只隐藏连接端点、不隐藏已有边线”不一致;现改为已有边始终渲染,隐藏态只让 `[data-handleid][data-handlepos]` 端点 `opacity=0 / pointer-events=none / tabIndex=-1`。Chrome 复测本地闭合态按钮 `x=184 y=759 w=28 h=28`,先通过文本 source `1106,578` 拖到音频 target `1208,575` 创建 1 条 edge;点击隐藏后按钮 aria/title 变 `显示节点连线`,edge 仍为 1 组 5 path 且主线/流动高亮可见,4 个 handle 全部不可见不可命中;再次点击恢复为 `隐藏节点连线`,edge 保留,handle 恢复 `opacity=1 / pointer-events=auto` - 本地项目加载遮罩已改为非阻塞: 本地未登录或接口失败时不再出现 `z=120` 全屏遮罩阻挡工具条;改为顶部 `pointer-events-none` 小提示,便于继续测试画布功能。复测时 Chrome 当前会因未授权显示该提示,但左下工具条命中层已恢复为按钮本身 - 竞品缩放选项已实测: 资产面板打开态左下缩放按钮为 `x=390 y=759 w=42 h=28`、文本 `100%`;点击后菜单为 `x=318 y=474 w=187 h=277`,背景 `rgb(38,38,38)`、边框 `0.5px solid rgb(54,54,54)`、圆角 `12px`、padding `6px`、z-index `300`;顶部输入框 aria `缩放比例`,菜单项依次为 `放大⌘+ / 缩小⌘- / 适合屏幕⌘0 / 缩放至50% / 缩放至100% / 缩放至800%` - 竞品缩放行为已实测: 点击 `缩放至50%/100%/800%` 后菜单保持打开,按钮和输入分别变为 `50/100/800`,画布 transform scale 分别为 `0.5/1/8`;`放大` 从 100% 到 120%,`缩小` 从 120% 回 100%;输入 `135` 未回车时只改输入框,按钮和画布保持 100%,回车后按钮变 `135%`、scale `1.35` - 本地缩放选项已对齐: 闭合态菜单为 `x=176 y=473 w=187 h=278`;资产面板打开态复测按钮坐标 `整理画布/小地图/隐藏连线/吸附/缩放` 为 `x=262/294/326/358/390`,菜单为 `x=318 y=473 w=187 h=278`,菜单项尺寸 `174 × 36`、圆角 `8px`,颜色、边框、padding、z-index 与竞品一致 - 本地缩放交互已验证: 菜单点击后保持打开;`缩放至50%` 后按钮 `50%`、输入 `50`、transform `matrix(0.5,...)`;`缩放至800%` 后按钮宽 `44px`、输入 `800`、transform `matrix(8,...)`;`放大/缩小` 使用 20% 步进;自定义输入 `135` 未回车不改变按钮和 transform,回车后按钮 `135%`、transform `matrix(1.35,...)`;点画布外部关闭菜单 - 竞品整理画布已实测: 资产面板打开态按钮 `整理画布,Option+Shift+F` 位于 `x=262 y=759 w=28 h=28`;点击后 viewport 从 `matrix(1,0,0,1,-2236.5,-2546.5)` 变为 `matrix(0.1,0,0,0.1,64.8,192)`,缩放按钮变 `10%`,可见节点从 DOM 0 个变为 33 个,说明该功能会把全画布整理/适配到视口,最小缩放为 10%;再按 `Option+Shift+F` 结果保持一致 - 竞品整理确认条已实测: 点击整理后出现 `是否保留此次整理结果? / 还原 / 保留`;闭合态截图下按钮坐标 `还原 x=98 y=706 w=50 h=32`、`保留 x=156 y=706 w=50 h=32`,资产面板打开态按钮坐标 `x=240/298 y=706`;`还原` 移除确认条并恢复节点布局,但 viewport 保持整理后的 10% 视图 - 本地整理画布已对齐: 原先 `整理画布` 只是定位/fit 选中节点;现改为保存原节点和原 viewport、生成整理预览、fit 全画布并弹出确认条。Chrome 复测 starter 工作流 2 节点: 点击后出现 `是否保留此次整理结果?`,确认条闭合态 `x=50 y=662 w=168 h=88`,按钮 `还原/保留` 为 `x=98/156 y=706 w=50 h=32`;资产面板打开态确认条 `x=192 y=662 w=168 h=88`,按钮 `x=240/298 y=706`;点击 `还原` 后回到原 `matrix(0.77,0,0,0.77,144,100)` 和 `77%` - 竞品网格吸附已实测: 按钮位于 `x=358 y=759 w=28 h=28`;点击前背景透明,点击后因 hover 读到 `rgba(255,255,255,0.1)`,aria/class 未变化、无确认弹窗、viewport 不变。当前仅能确认它是无文字即时开关/按钮,不暴露可读的 pressed 状态;本地保持同样的无文字按钮和拖拽网格吸附逻辑 - 竞品工具箱面板复测: 点击底部 `打开工具箱` 后,面板为 `x=516 y=276 w=480 h=460`,背景 `rgb(38,38,38)`,边框 `0.5px solid rgb(54,54,54)`,圆角 `12px`;顶部按钮为 `我的工具箱 x=532.5 y=288.5 w=78 h=28`、说明问号 `x=608.5 y=294.5 w=16 h=16`、`周星驰经典名场面 x=632.5 y=288.5 w=128 h=28`、关闭按钮 `x=955.5 y=290.5 w=24 h=24`;卡片为 3 列 `141px` 方图,首行 `x=532.5/685.5/838.5 y=345.5 h=178`,二行 `y=535.5 h=161.5`,三行 `y=709 h=161.5`;hover 后 `使用` 按钮为 `50 × 24`,首行坐标 `x=578/731/884 y=404` - 竞品工具箱使用复测: 直接点击隐藏态按钮不触发;真实用户路径为 hover 卡片后点击 `使用`。点击第一张 `【预设】左弧滑行` 后面板关闭、无 toast,视口变为 `translate(137.4px, 529px) scale(0.1)`;新增并选中一个 `分组 3 个节点` group,屏幕坐标 `x=738.5 y=385 w=149.3 h=65.8`,子节点为 `参考图 x=742.5 y=389 w=35 h=52.5`、`提示词 x=791 y=389.5 w=35 h=20`、`成品 x=848.8 y=394.3 w=35 h=52.5`,并新增三条边 `参考图 -> 提示词`、`提示词 -> 成品`、`参考图 -> 成品` - 本地工具箱面板最终对齐: Chrome 复测本地 `打开工具箱` 面板同为 `x=516 y=276 w=480 h=460`,背景、边框、圆角、头部按钮坐标与竞品一致;卡片首行 `x=532.5/685.5/838.5 y=345.5 h=178`,二行 `y=535.5 h=161.5`,三行 `y=709 h=161.5`,hover `使用` 按钮首行 `x=578/731/884 y=404`、二行 `y=594`、三行 `y=767.5`,DOM 文本顺序为 `我的工具箱 / 周星驰经典名场面 / 使用 / 【预设】左弧滑行 / 使用 / 【预设】电商手机弹出效果 / 使用 / 【预设】咖啡杯出场 ...` - 本地工具箱使用最终对齐: 本地 hover 第一张模板后点击 `使用`,面板关闭且不 toast;画布 transform 为 `translate(137.4px, 529px) scale(0.1)`,新增 4 个 DOM 节点(group + 3 子节点)和 3 条 `.react-flow__edge`;group `分组 3 个节点` 坐标 `x=738.4 y=385 w=149.3 h=65.8`,子节点 `参考图 x=742.4 y=389 w=35 h=52.5`、`提示词 x=790.9 y=389.5 w=35 h=20`、`成品 x=848.8 y=394.3 w=35 h=52.5`,与竞品落点结构一致 - 竞品角色库面板复测: 点击底部 `角色库` 后打开居中大模态,外壳 `x=68 y=60 w=1376 h=685`、背景 `rgb(34,34,34)`、圆角 `16px`;头部 `角色库 x=85 y=76.6`,右上关闭按钮;上方预览区 `x=85 y=117 w=1342 h=375`,4 张预览图居中,坐标为 `角色立绘 x=230.5 y=173 w=191.3 h=255`、`脸部近景 x=429.7 y=173 w=191.3 h=255`、`表情参考 x=629 y=173 w=191.3 h=255`、`三视图 x=828.2 y=173 w=453.3 h=255`;下方说明和 `应用至画布` 按钮位于 `y=444` - 竞品角色列表复测: 下方列表区 `x=69 y=508 h=236`;`角色筛选 x=85 y=525 w=89 h=28`、`最近使用 x=1339 y=525 w=88 h=28`;卡片从 `x=125 y=569 h=159` 开始横向滚动,缩略图约 `99 × 133`,默认展示 `甜妹/清新少女`、`霸总/精英大佬`、`温柔熟男/理想男友`、`清冷千金/白切黑女主`、`古风男主`、`古风女主` 等 - 竞品角色筛选复测: 点击 `角色筛选` 后弹出固定筛选菜单 `x=85 y=97 w=328 h=420`、背景 `rgb(38,38,38)`、圆角 `16px`、z-index `61`;包含 `性别/年龄段/种族/时代/文化区域/体型/发色`,每项为 `57 × 28` 胶囊按钮;点击 `时代 -> 古代` 后按钮变 `rgb(105,105,105)`,角色列表即时过滤为 `古风男主/古风女主` - 竞品最近使用复测: `最近使用` 是 `role=checkbox`;点击后 `aria-checked=true`,列表区显示空态 `无最近使用的角色`,不关闭筛选菜单、不弹 toast;再次点击恢复筛选后的角色列表 - 竞品角色应用复测: 选中 `古风男主` 点击 `应用至画布` 后模态关闭,出现 `已应用到画布` 成功提示并进入跟随定位;视口变为 `matrix(0.743079,0,0,0.743079,-3842.91,487.096)`;新增 4 个图片节点,无新增边,节点可见框为 `角色立绘 x=428.3 y=68 w=209.5 h=260.1`、`脸部近景 x=651.2 y=68 w=209.5 h=260.1`、`表情参考 x=874.1 y=68 w=209.5 h=260.1`、`三视图 x=428.3 y=371.2 w=652.4 h=367.8` - 本地角色库面板最终对齐: 本地 `角色库` 模态复测为 `x=68 y=60 w=1376 h=685`,上方预览区 `x=85 y=117 w=1342 h=375`,下方列表区 `x=69 y=508 h=236`;`应用至画布 x=1302 y=444 w=109 h=32`、`角色筛选 x=85 y=526 w=87 h=28`、`最近使用 x=1339 y=526 w=88 h=28`,与竞品坐标仅有 1-2px 差异 - 本地角色筛选和最近使用最终对齐: 本地筛选菜单同为 `w=328 h=420` 固定浮层,点击 `古代` 后按钮背景变 `rgb(105,105,105)`,列表只剩 `古风男主/古风女主`;勾选 `最近使用` 后 `aria-checked=true`,显示 `无最近使用的角色`,取消后恢复古代筛选列表 - 本地角色应用最终对齐: 本地选择 `古代 -> 古风男主` 后点击 `应用至画布`,模态关闭并显示 `已应用到画布` toast;画布新增 4 个角色图片节点,父层 transform 对齐竞品落点,可见节点框为 `角色立绘 x=428.3 y=68 w=209.5 h=260.1`、`脸部近景 x=651.2 y=68 w=209.5 h=260.1`、`表情参考 x=874.2 y=68 w=209.5 h=260.1`、`三视图 x=428.3 y=371.2 w=652.4 h=367.8`;本地使用项目 demo 角色图和三视图素材,避免直接复制竞品资源 - 竞品素材库入口复测: 点击底部 `素材库 x=695.5 y=752.5 w=32 h=32` 后,在图标上方打开小弹层;外壳 `x=636 y=569.3 w=240 h=162.7`、背景 `rgb(38,38,38)`、边框 `0.5px solid rgb(54,54,54)`、圆角 `12px`、z-index `20`;标题 `素材库`,两行入口均为 `223 × 52`,`风格库 x=644.5 y=615.5`、`特效库 x=644.5 y=671.5`,正文包含 `新增风格节点/新增特效节点` 和 `NEW` - 竞品风格库广场复测: 点击 `风格库` 后打开居中大浮层,外壳 `x=100 y=79.5 w=1312 h=646`、背景 `rgb(38,38,38)`、边框 `0.5px solid rgb(54,54,54)`、圆角 `12px`;tabs `风格广场/我的收藏/最近使用` 均为 `92 × 32`,坐标 `x=121/217/313 y=96`;关闭按钮 `x=1355.5 y=92 w=40 h=40`;搜索输入 placeholder `搜索风格名称、作者`,input `x=442 y=101.9 w=279 h=20.1`;分类行 `y=157`,含 `推荐/Midjourney/摄影写真/电商营销/动漫游戏/风格插画/平面设计/建筑及室内设计/创意玩法/文创周边/小说推文`,右侧 `仅看可商用` checkbox 默认未勾选,`全部 x=1341.5 y=157 w=54 h=28` - 竞品风格库列表和搜索复测: 默认风格卡为 6 列,单卡 `x=116.5 y=197 w=203.2 h=318.1`,首行 `复古马卡龙/新中式/岁月港风/新国韵/清风竹林/小岛微风`;点击 `我的收藏` 后列表清空但不显示空态文案,`最近使用` 列表清空并出现 `暂无素材`;输入 `新中式` 不即时过滤,按 `Enter` 后才刷新为搜索结果,首行出现 `Qwen Image新中式宋式美学支持输入中文室内家居空间` 等后端结果;点击 `Midjourney` 仅切换按钮选中态,不清空已提交搜索词 - 竞品风格卡应用复测: 在风格搜索结果里点击第一张卡后市场关闭、无 toast、无新增边,新增 `react-flow__node-material-style` 节点;当前竞品视口 `matrix(0.743079,0,0,0.743079,-3842.91,487.096)` 下,节点 transform `matrix(1,0,0,1,6068,389)`,可见框 `x=666.1 y=776.2 w=179.8 h=179.8`,文本为 `素材-风格-新中式宋式美学支持输入中文室内家居空间` - 竞品特效库广场复测: 点击 `特效库` 后同样打开 `x=100 y=79.5 w=1312 h=646` 大浮层;tabs `特效广场/我的收藏/最近使用` 坐标仍为 `x=121/217/313 y=96`;搜索 placeholder 为 `搜索特效名称、作者`;分类只有左侧 `推荐 x=116.5 y=157 w=50 h=28` 和右侧 `全部 x=1341.5 y=157 w=54 h=28`;特效卡为 6 列,单卡 `x=116.5 y=197 w=203.2 h=252.4`,首行 `小蜜蜂运镜/穿云而入/飞跃地平线/逆转引力/地球缩放/环球缩放` - 竞品特效库交互复测: `我的收藏` 列表清空无空态文案,`最近使用` 显示 `暂无素材`;输入 `产品` 不即时过滤,按 `Enter` 后首卡变为 `产品扫光`,后续含 `微距推镜/赛博化妆师/水下慢镜头`;hover 第一张特效卡只出现两个 24px 图标,左上无文字图标 `x=129.5 y=210`、右上 `收藏 x=282.7 y=210`;直接点击特效卡会关闭市场,但节点数、边数不变,无 toast - 本地素材库入口最终对齐: 本地 `素材库` 入口复测外壳为 `x=636 y=569 w=240 h=163`、背景 `rgb(38,38,38)`、边框 `0.5px solid rgb(54,54,54)`、圆角 `12px`、z-index `20`;两行入口均为 `223 × 52`,`风格库 x=644.5 y=615.5`、`特效库 x=644.5 y=671.5`,已补齐 `新增风格节点/新增特效节点` 描述和 `NEW` - 本地风格库广场最终对齐: 本地风格市场复测为 `x=100 y=79.5 w=1312 h=646`,tab、关闭按钮、搜索输入、分类行、`仅看可商用` 默认未勾选、`全部` 右侧按钮与竞品坐标一致;风格卡首行坐标 `x=116.5/331.7/546.8/762/977.2/1192.3 y=197 w=203.2 h=318`,输入 `新中式` 后不即时过滤,按 `Enter` 后刷新为 `Qwen Image...` 搜索结果 - 本地风格卡应用最终对齐: 本地点击风格搜索结果第一张卡后市场关闭、无 toast、无新增边,新增 1 个 `.react-flow__node-material-style` 风格节点;在本地 100% 视口下节点可见框为 `x=666 y=776 w=242 h=242`,若使用竞品同款 `0.743079` 缩放则屏幕尺寸约为 `179.8 × 179.8`;节点文本收敛为 `素材-风格-...` - 本地特效库广场最终对齐: 本地特效市场复测外壳为 `x=100 y=79.5 w=1312 h=646`;tabs、搜索输入、`推荐/全部` 坐标对齐;特效卡首行 `x=116.5/331.7/546.8/762/977.2/1192.3 y=197 w=203.2 h=251.2`,接近竞品 `252.4`;输入 `产品` 不即时过滤,`Enter` 后首卡变为 `产品扫光` - 本地特效卡点击最终对齐: 本地在特效搜索结果第一张卡点击后市场关闭,无 toast,节点数保持不变、边数保持 `0`,已有风格节点仍为 1 个;与竞品本次实测“直接点击特效卡关闭但不落节点”一致 - 竞品快捷键 `D/d` 复测: 快捷键面板标注 `复制节点和连线 D`,但在当前画布实测并未触发复制;未选中/选中 `古风男主 角色立绘`、尝试大写 `D` 和小写 `d` 后,节点数均保持 `11`、边数保持 `10`、无 toast、选中节点不变。本地同场景按 `D/d` 也保持 no-op,不额外实现复制 - 竞品键盘删除复测: 选中 `古风男主 角色立绘` 后按 `Delete`,节点数 `11 -> 10`、边数保持 `10`、选中态清空、无 toast;再选中 `古风男主 脸部近景` 后按 `Backspace`,节点数 `10 -> 9`、边数保持 `10`、选中态清空、无 toast - 本地键盘删除最终对齐: 原先键盘 `Backspace/Delete` 删除节点会弹 `节点已删除`;现键盘删除走静默路径,保留右键菜单删除的提示。Chrome 复测选中 `甜妹/清新少女 表情参考` 后按 `Backspace`,节点数 `2 -> 1`、选中态清空、toast 为空,行为与竞品一致 - 竞品教程菜单点击复测: 点击 `联系客服`、`联系销售`、`关注公众号` 后菜单保持打开,不新开标签、不弹 toast、不出现额外弹窗,仅对应菜单项 class 切为 `bg-canvas-controls-active`;点击 `使用教程` 后新开 `https://resonate.feishu.cn/wiki/Loxfw6XHziYRk0kKzdjcFfp9nhb` 标签,原画布菜单仍保持打开,`使用教程` 变 active,无 toast - 本地教程菜单点击最终对齐: 原先 `联系客服/联系销售/关注公众号` 会弹 `待接入` toast 且没有 active 态;现点击四项均只在菜单内切换 active,三项联系类无 toast/无新标签/无弹窗,`使用教程` 新开同款飞书 URL 且原菜单保留 active 状态。Chrome 复测四项坐标仍为 `x=869 y=587/623/659/695 w=95 h=36` - 竞品添加文本节点复测: 在当前画布残留 `正在跟随 / 取消ESC / 按 ESC 退出` 状态下,`Escape`、点击 `取消ESC` 和文本定位点击均未退出该跟随条,但不影响底部 `添加节点` 菜单;点击 `添加节点 -> 文本` 后,节点数 `9 -> 10`、边数保持 `10`、viewport 保持 `matrix(0.743079,0,0,0.743079,-3842.91,487.096)`、无 toast,新增并选中 `react-flow__node-text`,标题 `文本节点 2`,文本为 `尝试: 自己编写内容 文生视频 图片反推提示词 文字生音乐`,世界坐标 `translate(6192px,-108px)`,屏幕框约 `x=758.2 y=406.8 w=260.1 h=260.1` - 本地添加文本节点最终对齐: 原先底部菜单创建文本会弹 `已添加 文本节点 1` toast、节点尺寸 `436 × 470` 且落到左上负坐标;现 `添加节点 -> 文本` 无 toast、无新增边、选中新节点、viewport 不变,节点为 `350 × 350`,左上角按当前 viewport 中心落点。Chrome 复测空画布 100% 下新增 `文本节点 1` 屏幕框 `x=756 y=403 w=350 h=350`,内部文案为 `尝试: 自己编写内容 文生视频 图片反推提示词 文字生音乐` - 竞品添加图片节点复测: 在同一画布上点击 `添加节点 -> 图片` 后,节点数 `10 -> 11`、边数保持 `10`、viewport 保持 `matrix(0.743079,0,0,0.743079,-3842.91,487.096)`、无 toast;新增并选中 `react-flow__node-image`,世界坐标同当前文本节点为 `translate(6192px,-108px)`,屏幕框约 `x=758.2 y=406.8 w=260.1 h=260.1`,说明基础图片节点也是 `350 × 350`;节点文本为 `图片节点 3 / 尝试: 图生图 图片高清 参考 标记 风格 / 可直接文字生图,或上传图片输入文字指令对图片进行编辑,如:将背景改为雪夜 / Lib Image 自适应 · 标准画质 · 2K · 1张 18` - 本地添加图片节点最终对齐: 原先底部菜单创建图片会生成 `773 × 470` 横向节点,落点带图片偏移,且文案只含 `图生图 / HD 图片高清`;现基础 `图片` 节点改为 `350 × 350`,左上角按当前 viewport 中心落点,无 toast、无新增边、选中新节点,内部文案补齐 `图生图 图片高清 参考 标记 风格`、说明文案和 `Lib Image 自适应 · 标准画质 · 2K · 1张 18` 参数行。Chrome 复测空画布 100% 下新增 `图片节点 1` 屏幕框 `x=756 y=403 w=350 h=350` - 竞品添加视频节点复测: 先点画布空白清掉图片节点参数层,再点击 `添加节点 -> 视频`;节点数 `11 -> 12`、边数保持 `10`、viewport 保持 `translate(-3842.91px,487.096px) scale(0.743079)`、无 toast;新增并选中 `react-flow__node-video`,世界坐标仍是 `translate(6192px,-108px)`,屏幕框约 `x=758.2 y=406.8 w=462.2 h=260.1`,反推基础尺寸约 `622 × 350`;节点文本为 `视频节点 4 / 尝试: 首尾帧生成视频 首帧生成视频 / 参考 标记 特效 角色库 运镜 / 描述你想要生成的画面内容,@引用素材 / 2.0 文生视频 16:9 · 720P · 5s · 1个 · 高级设置 联网搜索 自动校验素材` - 本地添加视频节点最终对齐: 原先底部菜单创建视频会生成 `773 × 470` 大节点,并按居中节点加偏移落到屏幕左侧;现基础 `视频` 节点改为 `622 × 350`,和文本/图片一样按当前 viewport 中心左上角落点,无 toast、无新增边,视频卡片高度压到 350 内,选中后下方参数浮层改为 `660 × 191` 轻量面板。Chrome 复测空画布 100% 下新增 `视频节点 1` 屏幕框 `x=756 y=403 w=622 h=350`,浮层文本为 `参考 标记 特效 角色库 运镜 描述你想要生成的画面内容,@引用素材 2.0 文生视频 16:9 · 720P · 5s · 1个 · 高级设置 联网搜索 自动校验素材` - 竞品视频节点高级设置复测: 选中 `视频节点 4` 后,参数栏右侧依次为 `提示词优化`、`翻译提示词`、无文字滑杆图标 `高级设置`、费用 `135`、白色生成按钮;普通 `1512 × 805` 视口下高级区默认折叠,DOM 中预渲染 `高级设置 / 联网搜索 / 自动校验素材` 但外层为 `grid-rows-[0fr]`、高度 0。点击滑杆图标后高级区变 `grid-rows-[1fr]`,高度约 `116.5px`,标题 `高级设置` 下有两行 `联网搜索` 和 `自动校验素材`,两行右侧 Mantine switch 均默认 `checked=true`,轨道 `38 × 20`、白底黑色 14px 滑块;点击 `联网搜索` 后仅第一行变 `checked=false`、轨道 `rgba(255,255,255,0.25)`、滑块移到左侧,第二行保持开启 - 本地视频节点高级设置最终对齐: 原先本地把 `高级设置 / 联网搜索 / 自动校验素材` 作为参数栏文字按钮直接排在同一行,且高阶会员下费用显示 `VIP`;现改为竞品式三枚图标按钮和折叠高级区,`2.0 / 文生视频 / 16:9 · 720P · 5s · 1个 · / 135` 位于同一参数栏,生成按钮空提示词时禁用并提示 `请输入提示词或添加参考素材`。Chrome 复测将节点拖入视口后,点击滑杆图标,高级区 `grid-rows-[1fr]`、高度 `117px`,两枚 `[role="switch"]` 均为 `aria-checked=true`;点击第一行后变 `aria-checked=false`、`bg-white/25`、滑块左移,第二行仍为 `aria-checked=true` - 竞品视频模型菜单复测: 选中 `视频节点 4`,将节点拖入视口后点击参数栏 `2.0`;弹层为 Mantine popover,外框约 `x=614.5 y=215 w=369 h=409`、`role=dialog`、背景约 `#2d2d2d/95`、圆角 `16px`,内部滚动区 `360 × 400`、列表单项 `360 × 52`、图标底座 `34 × 34`、间距 `4px`。完整顺序共 31 项: `Seedance 2.0 VIP / Seedance 2.0 Fast VIP / Seedance 2.0 Mini / Happy Horse 1.1 / Happy Horse 1.0 / Kling O3 / Kling 3.0 Turbo / Kling 3.0 / Wan 2.7 / Kling O1 / Wan 2.6 / Hailuo 2.3 / Seedance1.5 Pro / Seedance 1.0 Pro / Seedance 1.0 Lite / Kling 2.6 / Hailuo 02 / Vidu Q2 / Vidu Q2 Pro / Vidu Q2 Turbo / Vidu Q3 Pro / OmniHuman 1.5 / Kling 2.5 / Kling 2.1 / Wan 2.2 / Wan 2.5 / Pixverse V5.5 / Pixverse V5 / Hailuo 2.3 Fast / Kling3.0 动作迁移 / MJ Video`;第一项 `data-selected=true`、背景 `rgba(255,255,255,0.15)`,末三项为 `cursor-not-allowed opacity-50` 禁用态。点击第二项后菜单关闭,参数按钮变 `2.0 Fast`、宽约 `114.6px`,`文生视频` 与参数摘要右移,费用仍为 `135`;再次打开可看到第二项高亮,点第一项恢复 `2.0` - 本地视频模型菜单最终对齐: 原先本地模型菜单只有 12 项,弹层 `420 × 430`、单项 `402 × 69`,带序号和 `720P限时9折/限时4折` 标签,缺少 `Kling 3.0 Turbo/Wan 2.6/Hailuo/Vidu/OmniHuman/Pixverse` 等模型,且 `Kling3.0 动作迁移/MJ Video` 可点击;现改为竞品式 `369 × 410` 外框、`360 × 400` 滚动区、`360 × 52` 单项、31 项完整顺序,第一项 `data-selected=true`、背景 `bg-white/[0.15]`,末三项 disabled 且 `cursor-not-allowed opacity-50`。Chrome 复测空画布新增 `视频节点 1` 后拖入视口,点击 `2.0` 得到弹层 `x=750 y=216 w=369 h=410`、首项 `x=755 y=221 w=360 h=52`,切 `Seedance 2.0 Fast VIP` 后菜单关闭、按钮文本 `2.0 Fast`、宽 `115px`,再次选择首项恢复 `2.0`、宽 `91px` - 竞品视频参数弹层复测: 在 `视频节点 4` 点击摘要 `16:9 · 720P · 5s · 1个 ·` 后,弹层左边与摘要按钮对齐、底边紧贴摘要顶部;本次外框 `x=824.5 y=179 w=341 h=445`,背景约 `#2d2d2d/95`、边框 `0.5px solid rgb(54,54,54)`、圆角 `16px`、内边距 `12px`,内容宽 `316px`。五组依次为 `比例 / 清晰度 / 视频时长 / 生成音频 / 生成数量`,标签均为 `14px/20px rgb(145,145,145)`;比例按 5 列换行成 `Auto/16:9/4:3/1:1/3:4 + 9:16/21:9`,单项 `56.8 × 62`、间距 `8px`,图标尺寸依次为 `12×9/16×9/12×9/12×12/9×12/9×16/16×7`;清晰度 `480P/720P/1080P/4K` 单项 `73 × 32`,音频 `开启/关闭` 单项 `154 × 32`,数量 `1个/2个/4个` 单项 `100 × 32`。选中态统一为 `rgba(255,255,255,0.1)`、白色 `0.5px` 边框和 `rgb(247,247,247)`,未选中为透明背景、`rgb(82,82,82)` 边框和 `rgb(145,145,145)`;时长滑杆根宽约 `244px`、轨道 `236 × 4`、白色滑块 `12 × 12`,数值框 `48 × 20`、`min=4 max=15 step=1`。实测依次切换 `1:1 -> 1080P -> 关闭音频 -> 2个`,弹层均保持打开,摘要同步为 `1:1 · 1080P · 5s · 2个 ·`;数字框填 `8` 时摘要仍为 `5s`,按 `Enter` 后才变 `8s`,随后已逐项恢复默认值并关闭弹层 - 本地视频参数弹层最终对齐: 原先本地弹层为 `472 × 408`、比例 7 项纯文字横排、标签 `12px`、选中态白底黑字、无时长滑杆,数值框为 `80 × 36 min=1` 且输入时立即提交;现重做为 `341 × 445`、`12px` 内边距、五组 `8px` 纵向间距,并让弹层随模型按钮宽度动态左移/右移,始终与参数摘要左边对齐。Chrome 复测本地外框 `x=959 y=189 w=341 h=445`、摘要 `x=959 y=634 w=204 h=32`;比例、清晰度、音频、数量的每项尺寸、网格换行、图标尺寸、标签字号、边框、颜色和选中态均与竞品测量值一致。补齐 `4-15s` 滑杆和 `48 × 20` 数字框;实测同序点击 `1:1 -> 1080P -> 关闭 -> 2个` 后菜单保持打开、摘要同步,数字框填 `8` 前摘要保持 `5s`、`Enter` 后变 `8s`,滑杆按 `Home` 实时变 `4s`、`ArrowRight` 变 `5s`;最后逐项恢复 `16:9 / 720P / 开启 / 1个 / 5s` - 竞品视频生成模式菜单复测: 无参考素材时点击参数栏 `文生视频`,打开外框 `x=709.5 y=395 w=197 h=229` 的 Mantine popover,左边与 `文生视频 x=709.5 y=624 w=106 h=32` 对齐、底边紧贴按钮顶部;外框背景约 `#2d2d2d/95`、边框 `0.5px solid rgb(54,54,54)`、圆角 `16px`、模糊 `16px`,内层 `196 × 228`、`padding=8px`、`gap=4px`。标题 `视频生成模式` 高 `32px`,顺序固定为 `文生视频 / 全能参考 / 图生视频 / 首尾帧 / 图片参考`,每项 `180 × 32`、图标 `16 × 16`;当前项背景 `rgba(255,255,255,0.15)`。无参考时仅 `文生视频` 可用,其余四项 disabled;点当前项关闭菜单,点禁用项菜单保持打开且模式不变 - 竞品视频模式素材联动复测: 点击节点尝试项 `首帧生成视频` 后并非立即静态切换,稍后新增 `预设 - 首帧生成视频` 分组和一条 `首帧参考 -> 视频节点 4` 连线,节点总数从侧栏 `98 -> 100`,提示词自动填入 `以当前图为首帧生成视频。`,模式自动变 `全能参考`,无 toast。已有 1 张参考时,`文生视频` disabled,而 `全能参考 / 图生视频 / 首尾帧 / 图片参考` 全部可用;切 `图生视频` 后菜单关闭,快捷动作变 `参考/标记/特效/运镜`,隐藏 `角色库`;切 `首尾帧` 后只保留 `参考/标记/角色库`,缩略图左上标 `首帧`;切 `图片参考` 或 `全能参考` 后恢复 `参考/标记/特效/角色库/运镜` 五项。各模式保留原提示词与 `16:9 · 720P · 5s · 1个`,费用均回显 `135` - 本地视频生成模式菜单最终对齐: 原先本地点击模式按钮不会打开菜单,而是直接在 `文生视频/全能参考` 间跳转;带参考素材时仍能切回竞品禁止的 `文生视频`,也没有 `图生视频/首尾帧/图片参考` 入口。现新增竞品式 `197 × 229` 模式弹层;Chrome 有参考复测外框 `x=849 y=332 w=197 h=229`、模式按钮 `x=849 y=561 w=106 h=32`,5 项均为 `180 × 32`、图标 `16 × 16`、选中背景 `white/15`,尺寸和相对锚定与竞品一致。无参考复测为 `文生视频` enabled、其余四项 disabled;点击禁用项菜单不关闭。创建首帧参考后自动进入 `全能参考`,`文生视频` disabled、其余四项 enabled;同序切换 `图生视频 -> 首尾帧 -> 图片参考 -> 全能参考`,菜单关闭、按钮文本/图标和快捷动作均按竞品规则变化,`首尾帧` 缩略图补齐 `首帧/尾帧` 角标,各模式费用均显示 `135` - 本地首帧快捷创建反馈最终对齐: 本地原有 `首帧生成视频` 已能创建首帧图片资源、连线、填入 `以当前图为首帧生成视频。` 并切到 `全能参考`,但会额外弹 `已按「首帧生成视频」创建关联节点`;现只对 `首帧生成视频/首尾帧生成视频` 移除该本地独有 toast。Chrome 清空重建 `视频节点 1` 后复测 `首帧生成视频`,参考节点和连线正常创建、模式自动变 `全能参考`、提示词正确、toast 为空 - 竞品视频 `参考` 画布选择复测: 点击快捷动作 `参考` 不打开上传/历史弹层,而是进入全画布选材态;顶部出现 `314 × 58` 工具栏,背景 `rgb(38,38,38)`、边框 `rgb(54,54,54)`、圆角 `16px`、padding `12px`、gap `16px`,含 `32 × 32` 图标、`从画布选择参考`、`返回节点 76 × 32`、`退出 50 × 32`。`返回节点` 只将 viewport 定位到目标节点且选择态继续;点击可用图片节点会新增 `图片源 -> 视频目标` 连线、工具栏不关闭,图片中央悬浮显示 `取消选择 72 × 28`;再次点击会只断开该参考。`退出` 关闭选择态但保留当前 viewport 和已选参考,全程无 toast - 竞品视频参考缩略图与移除复测: 连接 2 张图片后,参数浮层由无参考时 `660 × 191` 扩为约 `660 × 254`;快捷动作保持 `54/54/54/66/54 × 26`,参考独占下一行,缩略图外框 `48 × 48`、图片 `47 × 47`、圆角 `12px`、间距 `8px`,左上以 `1/2` 编号,右上 hover 出现 `15 × 15` 删除按钮。删除任意一张只移除对应连线和缩略图,不删除源节点;删除最后一张后模式自动回到 `文生视频`,`首尾帧生成视频/首帧生成视频` 建议项恢复,提示词 `以当前图为首帧生成视频。` 保留 - 本地视频 `参考` 画布选择最终对齐: 原先点击 `参考` 完全无响应;现补齐同款全画布选材状态、`314 × 58` 顶部工具栏、`返回节点/退出` 行为、图片节点点击增删 `source -> target` 连线和选中图片中央 `取消选择 72 × 28`。Chrome 以真实坐标重建 `视频节点 1 -> 首帧` 后复测,画布根滚动保持 `0`,工具栏为 `x=599 y=80 w=314 h=58`;hover 首帧时取消按钮 `x=410 y=564.875 w=72 h=26.25`、opacity `1`,点击后工具栏仍在、参考连线消失、模式回到 `文生视频`、源节点和提示词均保留,退出后工具栏关闭,控制台 error 为 0 - 本地视频参考缩略图最终对齐: 原先参考图混在快捷动作行且只有 `32 × 26`,参数浮层高度固定,也没有移除入口;现移到独立换行区,缩略图改为 `48 × 48`、图片 `47 × 47`、圆角 `12px`、间距 `8px`,右上 hover 删除按钮为 `15 × 15`,并按参考行数扩展浮层高度。Chrome 复测单参考浮层为 `660 × 254`,五枚快捷动作宽度为 `54/54/54/66/54`;缩略图删除和画布中央取消两条路径均只删除边,最后一条移除后按竞品规则回退模式并恢复建议项 - 视频参考状态机推断: 本步骤没有触发文件上传或生成请求,竞品行为可由画布图状态直接解释:选材等价于创建/删除 `image source -> video target` 有向边,缩略图列表来自目标节点的入边;可用生成模式由图片入边数量派生,数量归零时强制回退 `text-to-video`,但 prompt 独立保存。因此本地按同一图状态机实现,没有新增硬编码素材或伪造后端提示词 - 竞品视频 `标记` 选择模式复测: 点击快捷动作 `标记` 不直接改写提示词,而是进入全画布 `元素选择模式`;顶部工具栏为 `336 × 58`、背景 `#262626`、边框 `#363636`、圆角 `16px`,包含 `点击图片选择局部元素 / 返回节点 76 × 32 / 退出 50 × 32`。非图片节点在此模式下不可点,点击图片局部后原位显示 `分析中...`,首个真实结果约 `7-8s` 返回 `人物`,第二个约 `20s` 返回 `人物面部`;工具栏和选择模式在连续标记后均保持,无 toast - 竞品视频标记结果与层级复测: 每次结果同时落到源图片和目标提示词;源图显示 `34px` 高徽章、指向点击点的竖线及 hover `24 × 24` 删除按钮,目标提示词插入不可编辑 `.magic-chip`,id 规则为 `源节点ID_序号`。`人物` 芯片带层级箭头,点击后出现 `120px` 宽菜单,可在 `人物 / 眼睛` 间切换并同步 `data-magic-index`;`人物面部` 无层级箭头。源徽章删除会联动删除对应芯片且不影响其他标记;将光标放到芯片后按 `Backspace` 也只删除该结构化标记。`退出` 保留标记,`返回节点` 保持选择态;本轮结束前已将竞品临时标记全部清理,提示词恢复为 `以当前图为首帧生成视频。` - 本地视频 `标记` 最终对齐: 原先本地点击 `标记` 只会在 textarea 后拼接 `,添加人物与构图标记`,产生 `。` 后多余逗号且没有选区语义;现改为同款全画布元素选择工具栏、图片局部点击、分析中状态、源图徽章/指示线/hover 删除、源徽章当前层级菜单、提示词不可编辑芯片、层级菜单、源端联动删除和 Backspace 删除。Chrome 使用真实图片实测返回 `汽车`,层级为 `汽车 / 车头盖 / 前大灯 / 奔驰车标`;切到 `车头盖` 后芯片和索引同步,删除后提示词精确恢复,退出无 toast。最终优化后的真实分析耗时约 `13.3s` - 本地视频标记后端与配置: 复用现有 `/api/pick-object` 和 Qwen3-VL 能力,新增 `video-canvas-mark` 模式及后台可编辑的 `element-mark` 功能配置,模型默认 `qwen3-vl-plus`,提示词和启停状态均落在 `video_canvas_function_config`,未写死在前端。视频标记模式由服务端拉取源图、用 Sharp 缩放到最长边 `500px` 并叠加点击十字,直接以内存 data URL 调用视觉模型,避免临时上传;原有通用物体选择路径保持不变 - 视频标记算法推断: 竞品返回的不是单一自由文本,而是由点击坐标约束的局部视觉识别结果,数据至少包含 `sourceNodeId / sequence / clickX / clickY / labelOptions / selectedIndex`;层级标签按“主体到局部”排序,提示词芯片只是结构化状态的编辑视图,生成时再把已选标签和对应参考图传给视频任务。本地据此保存结构化 `magicMarks`,生成请求附带标记图片并在后端提示中加入当前选中标签,用户可见提示词保持干净 - 竞品添加视频合成 Beta 节点复测: 点击 `添加节点 -> 视频合成 Beta` 后,节点数 `18 -> 19`、边数保持 `10`、viewport 保持 `matrix(0.743079,0,0,0.743079,-3842.91,487.096)`、无 toast;新增并选中 `react-flow__node-video-clip`,标题 `视频合成 11`,世界坐标 `translate(6192px,-108px)`,屏幕框约 `x=758.2 y=406.8 w=260.1 h=260.1`,反推基础尺寸 `350 × 350`;节点正文为 `空空如也,请连接视频节点后操作` - 本地添加视频合成 Beta 节点最终对齐: 原先底部菜单创建 `视频合成` 会生成 `436 × 470` 节点,落点为 `x=618 y=421`;现改为竞品同款 `350 × 350`,按当前 viewport 中心左上角落点,无新增边、无 toast,正文为 `空空如也,请连接视频节点后操作`。Chrome 复测空画布 100% 下新增 `视频合成 1`,节点框 `x=756 y=403 w=350 h=350` - 竞品添加导演台 NEW 节点复测: 点击 `添加节点 -> 导演台 NEW` 后,节点数 `19 -> 20`、边数保持 `10`、viewport 保持 `matrix(0.743079,0,0,0.743079,-3842.91,487.096)`、无 toast;新增并选中 `react-flow__node-director-console-3d`,标题 `导演台 12`,世界坐标 `translate(6192px,-108px)`,屏幕框约 `x=758.2 y=406.8 w=260.1 h=260.1`,反推基础尺寸 `350 × 350`;节点正文为 `在3D空间中搭建场景并进行多视角截图 / 打开导演台`,按钮为 24px 高半透明小按钮 - 竞品导演台全屏复测: 点击 `打开导演台` 后出现 fixed 全屏编辑器,外壳 `x=0 y=0 w=1512 h=805`、z-index `600`、背景 `rgba(8,8,16,0.98)`;顶栏 `h=64 bg=rgb(33,33,33)`,`导演视角/机位视角` 位于顶栏中部,`帮助/关闭` 为右上 24px 按钮;左栏 `x=0 y=64 w=230 h=741`,含 `场景 / 搜索场景对象 / 机位1 / 角色A`;右栏 `x=1231 y=64 w=281 h=741`,标题 `3D场景`,含 `场景缩放 / 场景平移 XYZ / 场景旋转 XYZ / 全景背景 / 已连接全景图 / 请将图片节点连接到导演台左侧输入口 / 天空颜色 # / 全景球 / 水平旋转 / 球形半径 / 角色标签 / 网格吸附 / 地面 / 透明度 / 高度`;主区右上有 `72 × 72` 小 canvas 和 `重置视角 x=1139 y=158 w=72 h=21`,底部工具条含 `移动 (V) / 添加角色 / 全景图 / 添加机位 / 选择画幅比例 / 截图 / AI 识图导入 / 全屏` - 本地添加导演台 NEW 最终对齐: 原先本地创建导演台为 `436 × 470` 大节点、按居中偏移落点,且打开后是旧版 `属性/摄像机截图` 侧栏;现菜单创建 `导演台 1` 为 `350 × 350`,空画布 100% 复测节点框 `x=756 y=403 w=350 h=350`,按钮 `x=893 y=560 w=76 h=24`、半透明背景、无新增边/无 toast。打开后全屏外壳 `1512 × 805`、顶栏 `64`、左栏 `230 × 741`、右栏 `281 × 741`、右上小 canvas `72 × 72`、`重置视角 x=1139 y=158 w=72 h=21`,右侧文案和竞品 `3D场景` 参数结构一致 - 竞品导演台重置视角按钮复测: 在右侧停留 `摄像机` 面板、选中 `机位1` 时点击主区右上 `重置视角 x=1139 y=158 w=72 h=21`;按钮类为 `mt-1.5 w-full rounded-md bg-white/10 py-0.5 text-[11px] text-white/60 ... hover:bg-white/15 hover:text-white/85`,点击后仅保留 hover 样式,不弹 toast、不改 URL、不切换右侧面板、不改变选中对象 - 本地导演台重置视角按钮最终对齐: 原先本地按钮为 `top-24 text-[12px] text-white/72` 且点击会弹 `已重置导演视角。`;现改为 `top-[94px] text-[11px] text-white/60 hover:text-white/85` 并移除 toast。Chrome 复测普通态按钮 `x=1139 y=158 w=72 h=21`,点击后无 toast、URL 不变、右侧仍为 `摄像机`;沉浸态复测按钮为 `x=1420 y=158 w=72 h=21` - 竞品导演台底栏全屏按钮复测: 在导演台编辑器内点击底部 `全屏 x=892 y=740.5 w=36 h=36` 后,不进入浏览器原生 fullscreen,`document.fullscreenElement=false`、viewport 仍为 `1512 × 805`;应用内进入沉浸态,左侧 `场景` 栏和右侧 `3D场景` 面板隐藏,顶栏仍为 `x=0 y=0 w=1512 h=64 bg=rgb(33,33,33)`,主区变为 `x=0 y=64 w=1512 h=741`,`重置视角` 移到 `x=1420 y=158 w=72 h=21`;底部工具条仍为 `x=575.5 y=732 w=361 h=53`,按钮文案/tooltip 变为 `退出全屏 x=892 y=740.5 w=36 h=36`,全程无 toast - 本地导演台底栏全屏按钮最终对齐: 原先本地点击该按钮只弹 `全屏待接入。` toast,布局不变;现补齐应用内沉浸态切换。Chrome 复测点击 `全屏` 后 `document.fullscreenElement=false`、无 toast,左/右侧栏隐藏,主区变为 `x=0 y=64 w=1512 h=741`,`重置视角 x=1420 y=158 w=72 h=21`,底部按钮变为 `退出全屏`;再次点击后恢复左栏 `x=0 y=64 w=230 h=741`、主区 `x=230 y=64 w=1001 h=741`、右栏 `x=1231 y=64 w=281 h=741`,按钮恢复 `全屏` - 竞品导演台移动工具菜单复测: 点击底部 `移动 (V) x=584 y=740.5 w=36 h=36` 后无 toast,打开变换模式菜单,主按钮变 `bg-white/[0.14] + ring-white/30` active;菜单外壳 `x=575.5 y=614 w=132 h=118`、背景 `rgba(31,31,31,0.72)`、边框 `white/12`,三项均为 `x=582.5 w=118 h=32`,顺序和 y 坐标为 `移动 V y=621 / 旋转 R y=657 / 缩放 S y=693`。点击 `旋转 R` 或 `缩放 S` 后菜单关闭,底栏第一个按钮同步变为 `旋转 (R)` 或 `缩放 (S)`;重开后对应项保留 active。菜单打开时按 `R/S/V` 会直接切换 active 且菜单保持打开,菜单关闭时按 `V` 只切内部模式、不主动打开菜单 - 本地导演台移动工具菜单最终对齐: 原先本地点击 `移动 (V)` 会弹 `移动 (V)待接入。`,没有可记忆模式;现补齐竞品式三项变换菜单、动态主按钮和快捷键。Chrome 复测本地菜单外壳 `x=575.5 y=614 w=132 h=118`、三项坐标 `x=582.5 y=621/657/693 w=118 h=32`,点击子项关闭且无 toast,重开后保留 `旋转/缩放/移动` active;按 `S` 后底栏主按钮变为 `缩放 (S)`,点击可打开菜单并显示 `缩放 S` active;菜单关闭后按 `V` 不打开菜单,重开显示 `移动 V` active - 竞品导演台顶栏视角切换复测: 顶栏中部为 `导演视角/机位视角` 分段控件,外壳 `x=675.7 y=11.5 w=174 h=40`、背景 `rgb(20,20,20)`、边框 `rgb(54,54,54)`、圆角 `16px`;两个按钮均为 `80 × 32`,坐标 `导演视角 x=680.7 y=15.5`、`机位视角 x=764.7 y=15.5`,active 为 `bg-white/10`。在底部变换菜单打开时点击 `导演视角` 会关闭菜单、无 toast,并将主区角标切为 `导演视角`,底栏 transform 主按钮仍保留之前选中的 `缩放 (S)` - 本地导演台顶栏视角切换最终对齐: 原先本地顶栏只是透明 `160 × 32` 分段,inactive 文案偏灰,且切换时不统一收起底部菜单;现改为竞品同款 `174 × 40` 黑色分段控件。Chrome 复测本地外壳 `x=675.7 y=11.5 w=174 h=40`,按钮坐标 `x=680.7/764.7 y=15.5 w=80 h=32`,切换 `机位视角` 后底部菜单关闭、无 toast,主区角标变为 `导演台 1 · 机位视角 · 16:9`,transform 主按钮保持 `缩放 (S)` - 竞品导演台帮助菜单复测: 右上 `帮助 x=1432 y=19.5 w=24 h=24`、`关闭 x=1464 y=19.5 w=24 h=24`;点击帮助不新开标签、不弹 toast,帮助按钮 active 为 `bg-white/10`,下方菜单外壳 `x=1336 y=43.5 w=120 h=84`,菜单体 `x=1336 y=49.5 w=120 h=78`、背景 `rgba(31,31,31,0.94)`、边框 `white/10`、圆角 `12px`,两项为 `快捷键 x=1341 y=54.5 w=110 h=32`、`使用教程 x=1341 y=90.5 w=110 h=32` - 竞品导演台快捷键与教程复测: 点击/hover `快捷键` 后菜单不关闭,条目 active,左侧快捷键面板外层 `x=925 y=54.5 w=416 h=234`、面板 `x=925 y=54.5 w=408 h=234`、背景 `#1f1f1f/95`、圆角 `16px`,内容为 `俯视视角 T / 重置视角 Q / 打组 G / 撤销 Z / 正面视角 Y / 网格吸附 X / 解组 ⇧ D / 删除`。点击 `使用教程` 后不新开标签、不弹 toast,进入跟随教程层,顶部黄条 `x=669.1 y=0 w=173.7 h=34`,按钮 `取消ESC x=766.1 y=9 w=63.7 h=16`,并出现 `构图参考线` 高亮按钮;在关闭导演台后黄条仍残留在主画布,且本轮实测 `Escape` 和点击 `取消ESC` 都未将该残留条清掉 - 竞品导演台关闭按钮复测: 在教程跟随态点击右上 `关闭` 后,导演台 fixed 编辑器关闭,右上 `帮助/关闭` 消失,回到主画布并显示节点按钮 `打开导演台 x=854.5 y=568.1 w=67.6 h=23.8`;无 toast、不改 URL、不新增/删除主画布节点;教程黄条作为全局跟随态保留 - 本地导演台帮助/快捷键/教程/关闭最终对齐: 原先本地帮助只弹 `导演台帮助文档待接入。` toast;现补齐竞品式帮助菜单、快捷键二级面板、教程跟随层和关闭保留黄条行为。Chrome 复测帮助菜单为 `x=1336 y=49.5 w=120 h=78`,两项 `x=1341 y=54.5/90.5 w=110 h=32`;快捷键面板修正为 `x=925 y=54.5 w=408 h=234`,内容与竞品一致;教程黄条为 `x=669 y=0 w=174 h=34`、取消按钮 `x=766 y=9 w=64 h=16`;教程态点击 `关闭` 后本地同样回主画布、隐藏 `帮助/关闭`、保留黄条,`Escape` 可清掉本地全局黄条 - 竞品导演台左侧场景树搜索复测: 搜索框 `x=12 y=126 w=205 h=32`、placeholder `请输入搜索内容`,上方 `场景 x=24 y=88`;列表从 `x=12 y=178` 开始,每行 `205 × 32`,对象顺序为 `道具1-7 / 机位1-4 / 角色A-C`。输入 `角色` 后即时过滤为 `角色A/B/C`,首行回到 `y=178`,右侧仍停留在原面板;输入 `机位2` 后只剩 `机位2`;输入 `不存在` 后列表无对象行,显示空态 `没有匹配的场景对象 x=12 y=178 w=205 h≈58.6`,右侧仍停留在上一次选中对象 - 竞品导演台场景树点击联动复测: 在搜索词 `角色` 下点击 `角色C x=12 y=242 w=205 h=32` 后,搜索词保留,右侧切到 `角色` 面板,`属性` tab active、`姿势` inactive,名称输入 `value=角色C x=1248 y=217 w=248 h=28`;在搜索词 `机位2` 下点击唯一行后,右侧切到 `摄像机` 面板,`属性` active、`摄像机截图` inactive,名称输入 `value=机位2 x=1248 y=385 w=248 h=28`,切换机位为 native select `x=1248 y=457 w=248 h=28`,位置为 `0 / 2.2 / 10`,注视坐标为 `0 / 1.2 / 0`,FOV 为 `50.0` - 本地导演台左侧场景树搜索/点击最终对齐: 原先本地搜索框可输入但不会过滤,行文本包含 `▣/♙` 字符,选中行直接用元素背景;现改为受控即时过滤、视觉图标不进入文本、无匹配空态和竞品式伪元素高亮。Chrome 复测本地搜索框 `x=12 y=126 w=205 h=32`,行从 `y=178` 起,输入 `角色` 只剩 `角色A`,输入 `不存在` 显示 `没有匹配的场景对象 x=12 y=178 w=205 h=58`;过滤态点击 `角色A` 后搜索词保留且右侧切 `角色`,名称输入 `value=角色A x=1248 y=217 w=248 h=28`;过滤态点击 `机位1` 后右侧切 `摄像机`,名称输入 `value=机位1 x=1248 y=384 w=248 h=28`,位置/注视坐标/FOV 与竞品默认规则一致 - 竞品导演台选择画幅比例复测: 在导演台全屏内点击底部 `选择画幅比例` 图标按钮,按钮本体 `x=760 y=740.5 w=36 h=36`,上方出现比例菜单且不关闭工具条;菜单外壳 `x=638 y=550.5 w=280 h=182`、背景 `rgba(31,31,31,0.72)`、边框 `white/12`、z-index `1600`,标题 `比例`,网格 `x=651 y=583.5 w=254 h=136`,4 列布局,选项顺序和坐标为 `Auto x=651`、`21:9 x=716.5`、`16:9 x=782`、`4:3 x=847.5`、第二行 `1:1 x=651`、`3:4 x=716.5`、`9:16 x=782`,单项 `57.5 × 64`;点击 `9:16` 后菜单保持打开,`9:16` 变白字和 `white/8` 背景,其余项保持 `white/55` - 本地导演台选择画幅比例最终对齐: 原先本地底部导演台工具条为文字按钮,整体 `752.6 × 58`,点击 `选择画幅比例` 会直接在角标中切换 `16:9/9:16` 且无菜单;现改为竞品式 8 个 `36 × 36` 图标按钮,工具条外壳 `x=575.5 y=732 w=361 h=53`,比例按钮 `x=760 y=740.5 w=36 h=36`。Chrome 复测点击比例按钮后菜单 `x=638 y=550.5 w=280 h=182`、网格 `x=651 y=583.5 w=254 h=136`、选项坐标/尺寸与竞品一致;点击 `9:16` 后菜单保持打开,`9:16` 白字 `white/8`,主区角标更新为 `导演台 1 · 导演视角 · 9:16` - 竞品导演台截图复测: 在画幅菜单打开态点击底部 `截图 x=804 y=740.5 w=36 h=36` 后,比例菜单立即关闭,画布节点/连线数量保持不变;约 1.2s 内按钮和 toast 显示 `正在上传截图...`,toast 位于顶部 `x=663.5 y=32 w=185.1 h=40.4`,蓝色半透明背景。等待约 8s 后上传态消失,工具条按钮恢复 `截图`,仍不向主画布新增节点/连线;导演台左侧场景树新增 `机位2`,右侧从 `3D场景` 切为 `摄像机`,显示 `属性 / 摄像机截图 / FOV 50° / 名称 / 切换机位 / 机位1 / 机位2 / 位置 / 注视目标 / 手动坐标 / 角色A / 注视坐标 / 视野角度 (FOV) / 相机截图 / 机位2-shot-01`。右侧面板仍为 `x=1231 y=64 w=281 h=741`,`相机截图` 标题约 `x=1248 y=823`,截图缩略图约 `80 × 80`、起点约 `x=1248 y=858` - 本地导演台截图最终对齐: 原先本地 `截图` 只弹 `截图待接入`,不会改变导演台内部结构;现点击后关闭比例菜单,按钮进入 `正在上传截图...` spinner/禁用态,节点/连线数量保持不变。Chrome 干净路径复测 `添加节点 -> 导演台 NEW -> 打开导演台 -> 打开画幅菜单 -> 截图`: 上传中阶段 `ratioMenuOpen=false`、`nodes=0`、`edges=0`、按钮 `aria/title=正在上传截图...`;完成后左栏新增 `机位2`,右栏 `x=1231 y=64 w=281 h=741` 切为 `摄像机`,文案顺序与竞品一致,`相机截图` 标题 `x=1248 y=823`,截图卡片 `机位2-shot-01 x=1248 y=849 w=248 h=92`,卡片内缩略图起点约 `y=857`,工具条恢复 `截图 x=804 y=740.5 w=36 h=36` - 竞品导演台 AI 识图导入复测: 点击底部 `AI 识图导入 x=848 y=740.5 w=36 h=36` 后,打开遮罩模态,外层 `bg-black/35 + backdrop blur`,主体 `x=436 y=117 w=640 h=571`、背景 `rgb(31,31,31)`、圆角 `12px`、边框 `white/10`;标题 `AI 识图导入`,tab 为 `本地上传 x=453 y=182`、`历史记录 x=529 y=182`。默认上传区 `x=453 y=216 w=606 h=298`,文案 `点击上传图片或拖拽本地图片至此上传 / 上传后画布将新建一个图片节点并自动替换当前图源`;覆盖选项 `插入当前导演台 x=453 y=556 w=299 h=53` 默认选中,`覆盖当前导演台 x=760 y=556 w=299 h=53`;底部提示 `退出不会中断生成过程,全景图生成成功后,会自动加载到背景`,按钮 `识图导入场景 x=957 y=642 w=102 h=32` 初始禁用 - 竞品导演台 AI 识图历史与完成态复测: 切到 `历史记录` 后显示日期 `2026-07-09` 和 8 张图片历史,4 列两行,缩略图 `138 × 138`,首行 `x=462/612/762/912 y=257`,`使用` 按钮 `x=512/662/812/962 y=312 w=38 h=28`;点击第一张 `使用` 后不关闭弹层、不新增主画布节点/连线,上传区变为预览图 `x=454 y=217 w=604 h=296`,文案 `更换图片`,底部出现消耗 `6`,按钮启用。点击 `识图导入场景` 后顶部额度 `20 -> 14`,tab 禁用,按钮变 `识图中…`,约 25s 后弹层自动关闭,主画布节点/连线仍为 `20/10`,导演台内部左栏变为 `道具1-7 / 机位1 / 机位2 / 机位3 / 角色A / 角色B`,右栏回到 `3D场景` 参数面板 - 本地导演台 AI 识图导入最终对齐: 原先本地 `AI 识图导入` 只弹 `AI 识图导入待接入` toast;现补齐竞品式 `640 × 571` 模态、上传/历史 tab、8 张历史图、使用后大预览、插入/覆盖选项、消耗 `6`、`识图中…` pending 和完成导入。Chrome 干净路径复测 `添加节点 -> 导演台 NEW -> 打开导演台 -> AI 识图导入 -> 历史记录 -> 使用第一张 -> 识图导入场景`: 预览 `x=454 y=217 w=604 h=296`,按钮启用 `x=957 y=642 w=102 h=32`;运行中按钮禁用并显示 `识图中…`,tab 禁用,节点/边保持 `0/0`;约 24s 后弹层关闭,左栏 `x=0 y=64 w=230 h=741` 显示 `道具1-7 / 机位1 / 机位2 / 机位3 / 角色A / 角色B`,右栏 `x=1231 y=64 w=281 h=741` 回到 `3D场景`,无主画布新增节点/连线 - 竞品导演台添加机位复测: 在 AI 识图导入后的导演台状态点击底部 `添加机位 x=716 y=740.5 w=36 h=36`,不会立即新增机位,而是在按钮上方打开 `选择机位视角` 预设菜单;菜单外壳 `x=614 y=415 w=240 h=318`,背景 `rgba(31,31,31,0.72)`、边框 `white/12`、圆角 `12px`,标题 `x=621 y=422 w=226 h=24`,滚动区 `x=621 y=446 h=280`。预设为 2 列 `110 × 72`,顺序为 `当前视角 / 正面中景 / 正面特写 / 正面全景 / 侧面跟拍 / 侧面近景 / 背面中景 / 俯拍全景 / 45° 俯拍 / 低角度仰拍 / 低角度广角 / 过肩镜头 / 过肩镜头(右) / 鸟瞰 / 荷兰角` - 竞品导演台添加机位完成态复测: 点击 `当前视角 x=621 y=446 w=110 h=72` 后菜单关闭,不新增主画布节点/连线;导演台左栏在 `机位3` 和 `角色A` 之间新增并选中 `机位4`,行坐标 `x=12 y=498 w=205 h=32`,角色行下移到 `角色A y=530 / 角色B y=562`;右栏切到 `摄像机`,名称输入和 `切换机位` 下拉均为 `机位4`,下拉选项含 `机位1-4`,位置为 `X 0 / Y 2.2 / Z 10`,注视目标为 `手动坐标`,注视坐标为 `X 0 / Y 1.2 / Z 0`,FOV 为 `50.0` - 本地导演台添加机位最终对齐: 原先本地 `添加机位` 只弹 `添加机位待接入。` toast;现改为竞品式预设菜单,Chrome 复测菜单标题 `x=621 y=422 w=226 h=24`、首屏按钮 `当前视角 x=621 y=446 w=110 h=72`、`正面中景 x=737 y=446 w=110 h=72`,并补齐 15 个预设。选择 `当前视角` 后菜单关闭、主画布节点/边保持 `2/0`,左栏从 `道具1-7 / 机位1-3 / 角色A/B` 变为 `道具1-7 / 机位1-4 / 角色A/B`,`机位4` 行 `x=12 y=498 w=197 h=32`、文本 `x=52 y=508`,右栏 `摄像机` 打开,名称输入 `value=机位4 x=1248 y=384 w=248 h=28`,切换机位下拉 `value=机位4 x=1248 y=456 w=248 h=28`,位置和注视坐标与竞品一致 - 竞品导演台切换机位下拉复测: 在右侧 `摄像机` 面板中,下拉共有 2 个 select,首个为 `切换机位 x=1248 y=457 w=248 h=28`;从 `机位2` 选择 `机位4` 后不弹专属 toast、不改 URL,名称输入同步为 `机位4 x=1248 y=385 w=248 h=28`,下拉选中 `机位4`,位置仍为 `0 / 2.2 / 10`、注视目标仍为 `手动坐标`、注视坐标 `0 / 1.2 / 0`、FOV `50.0`;左侧 `机位4 x=12 y=498 w=205 h=32` 变选中,选中行 class 为 `after:top-1/2 after:h-6 after:-translate-y-1/2 after:rounded after:bg-white/8` - 本地导演台切换机位下拉最终对齐: 原先本地右侧下拉联动已能改名称/选中值,但左侧场景树选中态是整行 `after:inset-0 bg-white/10 rounded-lg`;现改为竞品式 24px 中间高亮条。Chrome 复测本地先清空场景搜索、添加 `机位2` 后,右侧 `切换机位 x=1248 y=456 w=248 h=28` 从 `机位2` 切回 `机位1` 再切到 `机位2`,名称输入和下拉值同步、位置/注视/FOV 保持默认、无新增主画布节点/边、无切换 toast;左侧高亮在 `机位1/机位2` 间移动,active class 为 `after:top-1/2 after:h-6 after:-translate-y-1/2 after:rounded after:bg-white/8 hover:after:bg-white/8` - 竞品导演台 FOV 控件复测: 在右侧 `摄像机` 面板中,预览框 `x=1248 y=185 w=240 h=135`、左上标签 `FOV 50° x=1261 y=198 h=13`;`视野角度 (FOV)` 标题 `x=1248 y=735.5`,隐藏 range 点击层 `x=1248 y=766 w=170 h=20 min=15 max=90 step=1 value=50`,数值输入 `x=1426 y=762 w=70 h=28 value=50.0`。输入 `64.0` 后 range value 同步 `64`、数值框保持 `64.0`、预览标签同步 `FOV 64°`,不改 URL - 本地导演台 FOV 控件最终对齐: 原先本地摄像机预览框为 `248 × 134`、FOV 标签行高偏高,range 为原生 `x=1248 y=774 w=180 h=6 min=20 max=100`,数值框 `x=1440 y=761 w=56 h=32`;现改为竞品式 `240 × 135` 预览、`leading-none text-white/55` 标签、自绘轨道 + 透明 range 点击层,FOV 范围限制为 `15-90`。Chrome 复测本地 `range x=1248 y=766 w=170 h=20 min=15 max=90 step=1`、数值框 `x=1426 y=762 w=70 h=28`;输入 `64.0` 后 range value 为 `64`,数值框为 `64.0`,预览同步 `FOV 64°` - 竞品导演台摄像机预览按钮复测: 右侧摄像机预览框右下按钮 `x=1451 y=283 w=24 h=24`,title 为 `切换到机位视角`,class 为 `absolute bottom-3 right-3 flex size-6 ... rounded-lg bg-white/10 text-white/85 hover:bg-white/16`。点击后不改 URL、不切右侧面板、不弹专属 toast,顶部 `机位视角 x=764.7 y=15.5 w=80 h=32` 变 active,`导演视角` 变 inactive - 本地导演台摄像机预览按钮最终对齐: 原先本地按钮位于 `x=1455 y=287`、无 title、点击只保留 hover 样式且不切视角;现改为 `bottom-3 right-3`、title `切换到机位视角` 并接入 `setViewMode("camera")`。Chrome 复测本地按钮 `x=1451 y=283 w=24 h=24`,点击后顶部 `机位视角` active、右侧仍为 `摄像机`、URL 不变、无新增 toast,主区角标同步为 `导演台 1 · 机位视角 · 16:9` - 竞品导演台摄像机截图 tab 复测: 在右侧 `摄像机` 面板点击 `摄像机截图 x=1306 y=128 w=89 h=28` 后,URL 不变,`属性` tab 变 inactive `hover:bg-white/6 text-white/45 hover:text-white/75`,`摄像机截图` 变 active `bg-white/10 text-neutral-50`,属性表单消失且 `visibleInputs=0`。内容区从 `x=1232 y=169 w=280 h=636` 开始,画廊外壳 `x=1232 y=169 w=280 h=563`,分组 `机位2截图 x=1248 y=181 w=248 h=28`,三列网格 `x=1248 y=213 w=248 h=102 grid-cols=80px 80px 80px gap=4`,卡片 `机位2-截图01 x=1248 y=213 w=80 h=102`,标题 `x=1248 y=297 w=80 h=18`;底部 footer `x=1232 y=732 w=280 h=73`,按钮 `全部清空 x=1248 y=749 w=120 h=40`、`发送到画布 x=1376 y=749 w=120 h=40` - 本地导演台摄像机截图 tab 最终对齐: 原先本地 `摄像机截图` 是静态按钮,点击后仍停留在属性表单、输入框仍为 10、无底部 footer;现新增摄像机检查器 tab 状态,点击后切到独立画廊页,属性表单消失且 `visibleInputs=0`,tab 激活态、画廊外壳、分组标题、三列网格和 footer 坐标与竞品一致。Chrome 复测无截图时显示 `机位1截图` + footer;再用底部 `截图` 中心点 `x=822 y=759` 触发上传,按钮进入 `正在上传截图...` 禁用态,完成后生成 `机位2-shot-01`,切入截图 tab 后显示 `机位2截图`、卡片 `x=1248 y=213 w=80 h=102`、标题 `机位2-截图01 x=1248 y=297 w=80 h=18`;`全部清空` 已接入清空本地截图列表,`发送到画布` 的落节点/连线行为需下一轮单独实测竞品后再接入 - 竞品导演台截图发送到画布复测: 在右侧 `摄像机截图` tab 中点击 `发送到画布 x=1376 y=749 w=120 h=40` 后,导演台弹层不关闭、右侧仍停留截图页、URL 不变、按钮不进入 pending、无可见 toast;主画布底层节点数 `21 -> 22`、边数 `10 -> 11`。新增节点为 `react-flow__node-image`,文本 `导演台 12 机位2-shot-01`,屏幕框 `x=1107.5 y=406.8 w=260.1 h=462.2`,反推世界尺寸 `350 × 622`、世界坐标 `x=6662 y=-108`;原导演台节点世界坐标为 `x=6192 y=-108`,所以发送算法是以导演台为 anchor 右移 `470`,并新增一条 `导演台 -> 截图图片节点` 的边,导演台节点保持 selected - 本地导演台截图发送到画布最终对齐: 原先本地 `发送到画布` 是空按钮;现父画布向导演台弹层传入发送回调,按竞品规则为每个当前机位截图创建 `350 × 622` 图片资源节点,标题为 `${导演台标题} ${原始截图名}`,位置为 `director.x + 470 * index`、`director.y`,并新增 `director -> snapshot image` 连线,同时保持导演台弹层打开且无 toast。Chrome 空画布复测 `添加节点 -> 导演台 NEW -> 打开导演台 -> 截图 -> 摄像机截图 -> 发送到画布`: 发送后弹层仍开、右侧仍为截图页、边数 `0 -> 1`、页面底层新增 `导演台 1 机位2-shot-01`;节点 DOM 为 `x=1226 y=403 w=350 h=622`,原导演台为 `x=756 y=403 w=350 h=350`,刚好右移 `470` - 竞品导演台截图全部清空复测: 在右侧 `摄像机截图` tab 中首次点击 `全部清空 x=1248 y=749 w=120 h=40` 不会立刻删除,而是在按钮上方弹出确认浮层,浮层 `x=1248 y=640.7 w=120 h=100.3`,文案 `确认清空所有截图?`,按钮 `取消 x=1260 y=701 w=44 h=28`、红色 `确认 x=1312 y=701 w=44 h=28`;浮层打开时截图卡仍存在,`发送到画布` 仍可用。点击 `确认` 后浮层关闭,截图卡消失,内容区显示居中空态 `暂无摄像机截图 x=1240 y=181 w=264 h=535`;底部 `全部清空` 和 `发送到画布` 保留但 disabled,URL 不变,主画布已发送的 `导演台 12 机位2-shot-01` 节点和 `11` 条边不被删除 - 本地导演台截图全部清空最终对齐: 原先本地点击 `全部清空` 会直接清空,清空后仍显示空分组标题 `机位2截图` 且两个 footer 按钮仍启用;现补齐竞品式确认浮层、空态和 disabled 规则。Chrome 复测本地 `摄像机截图` 空态显示 `暂无摄像机截图`,两个按钮 disabled;重新用底部 `截图` 生成 `机位2-截图01` 后,点击 `全部清空` 出现同款确认浮层 `x=1248 y=642 w=120 h=99`,`取消/确认` 按钮均为 `44 × 28`,确认前卡片保留;点击 `确认` 后显示 `暂无摄像机截图`,两个按钮 disabled,页面底层已发送到画布的 `导演台 1 机位2-shot-01` 和 `1` 条边保留 - 竞品导演台添加角色复测: 在 `道具1-7 / 机位1-4 / 角色A/B` 且右侧为 `摄像机` 的状态点击底部 `添加角色 x=628 y=740.5 w=36 h=36`,不会立即新增角色,而是在按钮上方打开角色菜单;菜单外壳 `x=619.5 y=312 w=148 h=420`、背景 `rgba(31,31,31,0.72)`、边框 `white/12`、圆角 `12px`,按钮 `x=624.5 w=138 h=32`,顺序和 y 坐标为 `本地上传 317 / 男性素体 362 / 女性素体 398 / 宽厚素体 434 / 健壮素体 470 / 纤细素体 506 / 少年素体 542 / 儿童素体 578 / 二头身 614 / 群众 (3x3) 650 / 几何模型 695`,`本地上传` 与 `群众 (3x3)` 后有分隔线,`群众 (3x3)` 和 `几何模型` 带右箭头 - 竞品导演台添加角色完成态复测: 点击 `男性素体` 后菜单关闭、不弹 toast、不新增主画布节点/连线;导演台左栏在 `角色B` 后新增并选中 `角色C`,行坐标 `x=12 y=594 w=205 h=32`、文本 `x=52 y=604`;主场景中模型变为绿色,标签变 `角色C` 并显示变换轴;右栏标题切为 `角色`,tab 为 `属性 / 姿势`,属性面板字段为 `名称=角色C`、位置 `0/0/0`、旋转 `0/0/0`、缩放 `1.03/1.03/1.03`、统一缩放 `1.0`、颜色 `#34C759`。反推命名规则为按现有 `角色A/B/...` 取下一个大写字母 - 本地导演台添加角色最终对齐: 原先本地 `添加角色` 只弹 `添加角色待接入。` toast;现补齐竞品式角色菜单和新增角色流程。Chrome 复测完整路径 `导演台 NEW -> AI 识图导入 -> 添加机位 当前视角 -> 添加角色 -> 男性素体`: 本地菜单外壳 `x=619.5 y=312 w=148 h=420`、按钮 `x=624.5 w=138`,各项 y 坐标 `317/362/398/434/470/506/542/578/614/650/695` 与竞品一致;选择 `男性素体` 后菜单关闭、无 toast、主画布节点/边保持 `1/0`,左栏新增选中 `角色C x=12 y=594 w=205 h=32`、文本 `x=52 y=604`,右栏切为 `角色`,名称输入 `value=角色C x=1248 y=217 w=248 h=28`,位置/旋转均为 `0`,缩放为 `1.03`,统一缩放 `1.0`,颜色 `#34C759` - 竞品导演台全景图菜单复测: 在导演台底部点击 `全景图 x=672 y=740.5 w=36 h=36` 后不弹 toast、不新增主画布节点/连线,而是在按钮上方打开 3 项菜单;菜单外壳 `x=616 y=618.5 w=148 h=114`、背景 `rgba(31,31,31,0.72)`、圆角 `12px`、z-index `300`,按钮均为 `x=621 w=138 h=32`,顺序和 y 坐标为 `本地上传 623.5 / 历史记录 659.5 / AI生成 695.5` - 竞品导演台全景图历史记录与 AI生成复测: 点击全景图菜单 `历史记录` 后菜单关闭,打开既有 `历史资产` 大弹窗而非 `选择图片`,外壳 `x=75.6 y=80 w=1360.8 h=645`、背景 `rgb(38,38,38)`、圆角 `16px`,包含 `历史资产 / 100% / 图片历史(8) / 视频历史(10) / 音频历史(6) / 时间降序 / 批量操作 / 2026-07-09 / 查看 / 使用 / 下载`;点击 `AI生成` 后打开 `640 × 448` 小弹窗,外壳 `x=436 y=178.5 w=640 h=448`、遮罩 `black/35`,标题 `AI生成`,上传区 `x=453 y=241.5 w=606 h=320`,底部文案 `退出不会中断生成,可在历史记录中查看结果`,消耗 `0`,生成按钮 `x=1031 y=579.5 w=28 h=28` - 本地导演台全景图最终对齐: 原先本地 `全景图` 只弹 `全景图待接入。` toast;现改为竞品式三项菜单,Chrome 复测菜单外壳 `x=616 y=618.5 w=148 h=114`,按钮 `本地上传/历史记录/AI生成` 坐标 `x=621 y=623.5/659.5/695.5 w=138 h=32`,无旧 toast。点击 `历史记录` 后本地打开 `历史资产` 面板 `x=75.6 y=80 w=1360.8 h=645`,含三类历史 tab、排序、批量操作和 `查看/使用/下载`;点击 `AI生成` 后本地弹窗 `x=436 y=178.5 w=640 h=448`,上传区 `x=453 y=241.5 w=606 h=320`,footer `x=437 y=577.5 w=638 h=48`,生成按钮 `x=1031 y=579.5 w=28 h=28` - 竞品添加音频节点复测: 先点空白清掉视频节点选中态,再点击 `添加节点 -> 音频`;节点数 `12 -> 13`、边数保持 `10`、viewport 保持 `translate(-3842.91px,487.096px) scale(0.743079)`、无 toast;新增并选中 `react-flow__node-audio`,世界坐标仍是 `translate(6192px,-108px)`,屏幕框约 `x=758.2 y=406.8 w=260.1 h=260.1`,说明基础音频节点也是 `350 × 350`;节点正文为 `音频节点 5 / 尝试: 音频生视频` - 竞品音频节点语音面板复测: 选中音频节点后,节点下方出现 `660 × 189` 浮层,外壳 `x=558.3 y=678.8`;可见内容依次为 `<#> 停顿`、`() 语气词`、输入区 placeholder `输入要合成的文本`、底部参数 `Minimax-speech-2.8-hd / 少女音色 / 0/50000 / 1`;面板内还包含折叠/裁切的高级项文本 `基础调节 / 一键重置 / 语速 / 声调 / 音量 / 音色效果调节 / 音高 / 强度 / 音色调节 / 音效 / 无 / 空旷回音 / 礼堂广播 / 电话失真 / 电音` - 本地添加音频节点最终对齐: 原先底部菜单创建音频会生成 `436 × 470` 节点,并按普通模块偏移落到屏幕右上 `x=1243 y=-89`;现基础 `音频` 节点改为 `350 × 350`,和文本/图片/视频一样按当前 viewport 中心左上角落点,无 toast、无新增边,音频卡片高度压到 350 内。Chrome 复测空画布 100% 下新增 `音频节点 1` 屏幕框 `x=756 y=403 w=350 h=350`,正文为 `尝试: 音频生视频`,选中后出现 `660 × 189` 语音合成浮层,文本为 `<#> 停顿 () 语气词 输入要合成的文本 Minimax-speech-2.8-hd 少女音色 0/50000 1 基础调节 一键重置 语速 声调 音量 音色效果调节 音高 强度 音色调节 音效 无 空旷回音 礼堂广播 电话失真 电音` - 竞品上传入口权限复测: 在当前竞品画布打开 `添加节点 -> 上传` 后 file chooser `multiple=true`;使用无敏感测试图 `/tmp/codex-video-canvas-upload.png` 调用 `setFiles` 仍返回 `Not allowed / fileChooser.setFiles failed`,节点数保持 `93`、边数保持 `106`、图片节点保持 `33`、选中 `文本节点 2` 不变、添加菜单不关闭且无 toast。按 Chrome 插件文档,继续真实上传落节点前需在 `chrome://extensions -> Codex -> Details` 开启 `Allow access to file URLs` - 竞品音频语音面板深测: 在添加菜单中再次点击 `音频`,节点数 `93 -> 94`、音频节点数 `6 -> 7`、边数保持 `106`,新增并选中 `音频节点 13`;因竞品当前 viewport 为 `10%`,节点屏幕框为 `x=756.3 y=402.8 w=35 h=35`,语音面板外壳 `x=443.8 y=439.4 w=660 h=189`。面板右上有 `28 × 28` 展开按钮,底栏为 `Minimax-speech-2.8-hd x=452.3 w=200.7`、`少女音色 x=756.9 w=110`、翻译图标 `x=874.9 w=32`、设置图标 `x=918.9 w=32`、`0/50000`、闪电费用 `1`、白色圆形生成按钮 `x=1063.3 w=32`。点击设置图标后面板高度变 `565.2`,设置按钮 active,展开 `基础调节 / 一键重置 / 语速 / 声调 / 音量` 三条滑杆和 `音色效果调节 / 音高 / 强度 / 音色调节 / 音效`;点击右上展开后打开 `black/50` 遮罩和居中 `800 × 600` modal `x=356 y=102.5`,modal 保留同一套参数控件 - 竞品音频模型菜单深测: 在音频展开 modal 的设置态点击 `Minimax-speech-2.8-hd`,打开局部模型下拉 `x=364.5 y=317.8 w=369 h=341`,背景约 `#333/95`、z-index `700`;选项顺序为 `Seed Audio 1.0`(多模态音频生成,支持人声、音效、音乐一体化创作)、`Minimax-speech-2.8-hd`(当前选中,文字转语音,多元的情绪渲染)、`Minimax-speech-2.8-turbo`(文字转语音,快速生成自然的音频效果)、`Eleven V3`(文字转语音,提供高质量、可定制的语音)、`Eleven Music V3`(智能音乐生成,高质量音乐生成)、`Mureka V8`(智能音乐生成,兼具多元风格) - 竞品音色选择弹窗深测: 点击底栏 `少女音色` 后打开高层 `音色选择` modal,外壳 `x=356 y=94.7 w=800 h=615.6`,覆盖在音频 modal 上;顶部为标题和关闭按钮,tab 为 `音色库 / 我的音色 / 收藏音色`,右侧包含 `克隆新音色`、搜索框 placeholder `搜索音色库` 和 `筛选`。列表行高约 `64px`,前几项为 `青涩青年音色 / 精英青年音色 / 霸道青年音色 / 青年大学生音色 / 少女音色 / 御姐音色 / 成熟女性音色 / 甜美女性音色`,副信息为 `中文(普通话)` 与性别,`少女音色` 显示 `已选`,其它显示 `选择`,行尾有收藏星标和 `...`;分页 footer 为 `1 2 3 4 5 ... 17 › 20条/页 跳至 页 共327条` - 本地音频语音面板二次对齐: 原先本地只在 `660 × 189` 浮层中显示模型/音色/计数,右上没有展开按钮,底栏缺少翻译/设置/闪电/生成图标,高级参数只是 `h-0 overflow-hidden` 隐藏文本;现补齐竞品式右上展开、底栏图标和设置展开。Chrome 复测本地空画布 `添加节点 -> 音频` 后节点 `350 × 350` 落于 `x=756 y=403`,100% 视口下浮层按节点底部出现在 `x=601 y=765 w=660 h=189`;点击右上展开打开居中 `800 × 600` modal `x=356 y=102.5`,点击设置图标后 modal 顶部编辑区压为 `222px`,底部显示 `基础调节/一键重置/语速/声调/音量/音色效果调节/音高/强度/音色调节/音效/无/空旷回音/礼堂广播/电话失真/电音`,坐标和层级与竞品展开态一致 - 本地音频模型/音色菜单最终对齐: 原先本地没有模型下拉和音色库弹窗;现模型按钮补齐同款 6 项菜单、说明文案、当前选中态和 `369 × 342` 外壳,音色按钮补齐 `800 × 616` 的 `音色选择` modal、三 tab、克隆/搜索/筛选、音色列表、已选态和分页 footer。Chrome 复测本地展开态中点击模型按钮可见 `Seed Audio 1.0 / Minimax-speech-2.8-hd / Minimax-speech-2.8-turbo / Eleven V3 / Eleven Music V3 / Mureka V8`,点击 `少女音色` 后弹窗外壳 `x=356 y=94.5 w=800 h=616`,内容包含 `音色库 / 我的音色 / 收藏音色 / 克隆新音色 / 搜索音色库 / 筛选 / 青涩青年音色 / 少女音色 / 已选 / 20条/页 / 共 327 条` - 竞品添加脚本菜单复测: 点击 `添加节点 -> 脚本` 主行不会落节点,节点数保持 `13`、边数保持 `10`、无 toast;主行保持高亮并展开右侧二级菜单,子菜单外壳 `x=720.5 y=551.5 w=204 h=85`,内部 `x=728.5 y=551.5 w=196 h=85`,两行分别是 `脚本 NEW x=737 y=560 w=179 h=32`、`脚本(旧版) Beta x=737 y=596 w=179 h=32` - 竞品添加脚本 NEW 节点复测: 点击二级菜单 `脚本 NEW` 后,节点数 `13 -> 14`、边数保持 `10`、viewport 保持 `translate(-3842.91px,487.096px) scale(0.743079)`、无 toast;新增并选中 `react-flow__node-script-v2`,世界坐标仍是 `translate(6192px,-108px)`,屏幕框约 `x=758.2 y=406.8 w=260.1 h=260.1`,说明现代脚本节点也是 `350 × 350`;节点标题为 `脚本生成器`,正文为 `尝试: 剧本生成分镜脚本 角色生成分镜脚本 自己编写分镜脚本` - 本地添加脚本 NEW 节点最终对齐: 原先点击脚本主行会直接创建旧版 `脚本 1`,尺寸 `438 × 470`,落点 `x=1093 y=421`,按钮为 `剧本生成分镜脚本 / 视频参考生成分镜脚本 / 角色生成分镜脚本`;现脚本主行只展开同款二级菜单,不新增节点、不弹 toast;点击 `脚本 NEW` 后新增 `350 × 350` 的 `脚本生成器`,按 viewport 中心左上角落点,无新增边、无 toast,正文改为 `尝试: 剧本生成分镜脚本 角色生成分镜脚本 自己编写分镜脚本`。Chrome 复测空画布 100% 下节点框 `x=756 y=403 w=350 h=350` - 竞品添加脚本(旧版)节点复测: 在已新增 `脚本 NEW` 后继续点击二级菜单 `脚本(旧版) Beta`,节点数 `14 -> 15`、边数保持 `10`、viewport 保持 `translate(-3842.91px,487.096px) scale(0.743079)`、无 toast;新增并选中 `react-flow__node-script`,世界坐标同样是 `translate(6192px,-108px)`,屏幕框约 `x=758.2 y=406.8 w=260.1 h=260.1`,说明旧版脚本节点也是 `350 × 350`;标题同为 `脚本生成器`,正文为 `尝试: 剧本生成分镜脚本 视频参考生成分镜脚本 角色生成分镜脚本` - 本地添加脚本(旧版)节点最终对齐: 原先点击旧版入口会生成 `438 × 470` 的 `脚本 1`,落点 `x=1093 y=421`,且按钮组被 NEW 节点逻辑误渲染为 `剧本生成分镜脚本 / 角色生成分镜脚本 / 自己编写分镜脚本`;现旧版入口生成 `350 × 350` 的 `脚本生成器`,按 viewport 中心左上角落点,无新增边、无 toast,正文为 `尝试: 剧本生成分镜脚本 视频参考生成分镜脚本 角色生成分镜脚本`。Chrome 复测空画布 100% 下节点框 `x=756 y=403 w=350 h=350` - 竞品添加资源-从生成历史选择复测: 点击 `添加节点 -> 从生成历史选择` 后不落节点、不弹 toast,节点数保持 `15`、边数保持 `10`,打开 `选择图片` 模态框,外壳 `x=75.6 y=80 w=1360.8 h=645`;一级 tab 为 `LibTV / Lib生成器 / WebUI / ComfyUI / AI应用`,右侧计数 `已选 0/10 张`;二级 tab 为 `图片 / 视频 / 音频`;图片卡为 6 列,首卡选中后左上出现蓝色勾,右下出现删除/预览图标,计数变 `1/10`,点击 `确定` 后模态框关闭、节点数 `15 -> 16`、边数保持 `10`、viewport 不变、无 toast;新增 `react-flow__node-image`,标题 `图片节点 8`,世界坐标 `translate(6192px,-108px)`,屏幕框约 `x=758.2 y=406.8 w=260.1 h=260.1` - 本地添加资源-从生成历史选择最终对齐: 原先该入口打开 `历史资产` 管理面板,显示 `图片历史/视频历史/音频历史` 和 `查看/使用/下载`,单项 `使用` 会弹 `已应用到画布` toast;现添加入口改为竞品同款 `选择图片` 多选模态框,外壳 `x=75.6 y=80 w=1360.8 h=645`,一级/二级 tab、`已选 0/10 张`、6 列卡片、选中蓝勾、右下图标、底部分页和 `确定` 行为对齐。Chrome 复测空画布选第一张后计数 `1/10`,点击 `确定` 静默生成 `350 × 350` 的 `图片节点 1`,节点框 `x=756 y=403 w=350 h=350`,无新增边、无 toast - 竞品添加资源-历史选择视频 tab 复测: 在同一模态点击 `视频` 后标题变 `选择视频`,计数仍为 `已选 0/10 张`;视频卡共 10 张,6 列布局,首行 `x=100.6/320.7/540.9/761/981.1/1201.3 y=242 w=211.1 h=276`,次行前 4 张 `y=527`;首卡选中后计数 `已选 1/10 张`,点击 `确定` 后模态关闭,节点数 `16 -> 17`、边数保持 `10`、viewport 不变、无 toast、无选中态;新增 `react-flow__node-video`,标题 `视频节点 9`,世界坐标 `translate(6192px,-108px)`,屏幕框约 `x=758.2 y=406.8 w=462.2 h=260.1`,反推资源视频节点 `622 × 350` - 本地添加资源-历史选择视频 tab 最终对齐: 原先视频 tab 只有 1 张默认视频且计数写作 `已选 0/10 个`;现默认历史视频补齐为 10 张,计数统一为 `张`,布局为首行 6 张、次行 4 张。Chrome 复测本地空画布为 `选择视频 / 已选 0/10 张`,卡片坐标 `x=99.6/319.7/539.9/760/980.1/1200.3 y=240`、次行 `y=524`;首卡确认后静默生成 `622 × 350` 的 `视频节点 1`,节点框 `x=756 y=403 w=622 h=350`,无新增边、无 toast - 竞品添加资源-历史选择音频 tab 复测: 在同一模态点击 `音频` 后标题变 `选择音频`,计数仍为 `已选 0/10 张`;音频卡共 6 张,均为灰色底居中音符图标,无标题文字,首行坐标 `x=100.6/320.7/540.9/761/981.1/1201.3 y=242 w=211.1 h=276`;首卡选中后计数 `已选 1/10 张`,点击 `确定` 后模态关闭,节点数 `17 -> 18`、边数保持 `10`、viewport 不变、无 toast、无选中态;新增 `react-flow__node-audio`,标题 `音频节点 10`,世界坐标 `translate(6192px,-108px)`,屏幕框约 `x=758.2 y=406.8 w=260.1 h=110`,反推历史音频资源节点约 `350 × 148` - 本地添加资源-历史选择音频 tab 最终对齐: 原先本地无默认音频历史素材,无法按竞品路径落音频资源节点;现默认音频历史补齐为 6 张灰色音符卡,计数统一为 `张`。Chrome 复测本地空画布为 `选择音频 / 已选 0/10 张`,卡片坐标 `x=99.6/319.7/539.9/760/980.1/1200.3 y=240 w=212.1 h=276`;首卡确认后静默生成 `350 × 148` 的 `音频节点 1`,节点框 `x=756 y=403 w=350 h=148`,无新增边、无 toast、无选中态 ## 当前差距 - 工具箱小面板、模板 hover 和 `使用` 落点主流程已像素级对齐;剩余差距是模板封面仍复用本地演示素材,缺少竞品真实模板市场封面、收藏/最近使用和后端模板库统计 - 角色库主流程、筛选菜单、最近使用空态和应用 4 节点落点已对齐;剩余差距是本地仍使用 demo 角色素材,缺少竞品同量级真实角色资产库、真实最近使用记录和后端资产元数据 - 素材库入口、风格库/特效库大浮层、搜索回车刷新、tab 空态、风格卡落节点和特效卡直接关闭行为已按本轮竞品实测对齐;剩余差距是本地仍使用演示缩略图和静态 mock 市场数据,缺少竞品真实素材市场封面、收藏状态、最近使用记录、搜索后端和风格/特效素材元数据 - 历史记录主交互、单项查看全屏预览、列表单项下载水印规则、批量选择态、批量下载 pending 态和批量使用已具备,但数据源仍是当前画布图片/视频/音频节点聚合;竞品历史记录来自账号生成资产,后续需接入真实生成资产表、跨画布历史、下载文件命名、批量下载打包完成态和批量删除后端接口 - 生成失败态: 本轮竞品当前项目和历史资产中没有真实失败任务样本,不能确认竞品 failed 节点是否使用 `移除`、`重试` 或其他操作;本地已验证接口失败时的 failed 节点、toast 和移除行为,后续拿到竞品真实失败样本后再做像素级对齐 - 竞品已覆盖但本地仍需继续细测: 资源上传入口和 file chooser 行为已确认,但真实上传落节点被 Chrome 扩展 `Allow access to file URLs` 权限阻塞,需开启后继续;`人声分离 -> 仅保留人声/背景音` 已对齐菜单层级、处理中状态、toast、双节点落点、节点顺序和连线;`智能擦除` 已对齐成本、落节点、连线、pending 文案、取消确认和本地完成态;`框选擦除` 已完成浏览器端到端前端复测并对齐选区、历史、费用、生成 pending/完成态和参数写入逻辑;真实 `volcano-subtitle-eraser` 后端任务仍需接入;`裁剪` 已对齐前端裁剪态、进度态和落节点结果,但真实 FFmpeg/云存储上传服务仍需接入;`高清` 已对齐节点式创建和本地生成态,但真实后端高清服务仍需接入;本轮未发现竞品选中线重连手柄,暂不将重连作为已确认竞品能力 - 故事脚本数量、字段、节点内表格、选中工具栏、全屏三步工作流、资产准备页、单镜 `查看提示词` 弹窗、批量分镜和批量生视频前端任务编排已按竞品当前项目对齐;剩余差距是真实模型生成质量、真实资产生成/覆盖逻辑、资产图片后端落库、真实 Seedance 视频任务提交/轮询/扣费和视频结果持久化