ai-chatbot/docs/video-canvas-competitor-audit.md

365 lines
142 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 视频画布竞品对比记录
## 当前测试环境
- 本地服务: 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 视频任务提交/轮询/扣费和视频结果持久化