auto-save 2026-05-14 01:17 (+6, ~3)

This commit is contained in:
2026-05-14 01:17:35 +08:00
parent 4610ef89f9
commit 31308f25c1
9 changed files with 1535 additions and 37 deletions

View File

@@ -2738,6 +2738,19 @@
"message": "auto-save 2026-05-14 01:05 (+4, ~3)",
"hash": "3684917",
"files_changed": 7
},
{
"ts": "2026-05-14T01:11:53+08:00",
"type": "commit",
"message": "auto-save 2026-05-14 01:11 (+4, ~4)",
"hash": "4610ef8",
"files_changed": 8
},
{
"ts": "2026-05-13T17:13:10Z",
"type": "session-heartbeat",
"message": "Claude 会话活跃 · 最近命令claude · 2 项未提交变更 · 最近提交auto-save 2026-05-14 01:11 (+4, ~4)",
"files_changed": 2
}
]
}

View File

@@ -0,0 +1,36 @@
- generic [active] [ref=e1]:
- button "Open Next.js Dev Tools" [ref=e7] [cursor=pointer]:
- img [ref=e8]
- main [ref=e14]:
- button "自动排版 · 保留每个节点的尺寸,重新排好间距和列布局" [ref=e16]:
- img [ref=e17]
- application [ref=e24]:
- group [ref=e27]:
- generic [ref=e29]:
- generic [ref=e30]:
- img [ref=e32]
- generic [ref=e35]: 输入 · Input
- button "钉住 · 锁定位置与尺寸" [ref=e38]:
- img [ref=e39]
- generic [ref=e42]:
- generic [ref=e43]: STEP 1 · 待运行
- textbox "粘贴 TikTok 链接" [ref=e44]
- generic [ref=e45]:
- button "提交链接" [disabled] [ref=e46]
- button "上传" [ref=e47]:
- img [ref=e48]
- text: 上传
- generic "拖动调整宽度" [ref=e52]
- generic "拖动调整大小(宽 × 高)" [ref=e53]
- img
- generic "Control Panel" [ref=e54]:
- button "Zoom In" [ref=e55] [cursor=pointer]:
- img [ref=e56]
- button "Zoom Out" [ref=e58] [cursor=pointer]:
- img [ref=e59]
- button "Fit View" [ref=e61] [cursor=pointer]:
- img [ref=e62]
- button "Toggle Interactivity" [ref=e64] [cursor=pointer]:
- img [ref=e65]
- img "Mini Map" [ref=e68]
- region "Notifications alt+T"

View File

@@ -0,0 +1,454 @@
- generic [active] [ref=e1]:
- generic [ref=e6] [cursor=pointer]:
- button "Open Next.js Dev Tools" [ref=e7]:
- img [ref=e8]
- generic [ref=e71]:
- button "Open issues overlay" [ref=e72]:
- generic [ref=e73]:
- generic [ref=e74]: "0"
- generic [ref=e75]: "1"
- generic [ref=e76]: Issue
- button "Collapse issues badge" [ref=e77]:
- img [ref=e78]
- main [ref=e14]:
- button "自动排版 · 保留每个节点的尺寸,重新排好间距和列布局" [ref=e16]:
- img [ref=e17]
- button "切到明亮主题" [ref=e81]:
- img [ref=e82]
- generic [ref=e22]:
- generic [ref=e90]:
- generic [ref=e91]:
- img [ref=e92]
- generic [ref=e97]: 分镜头编排
- generic [ref=e98]: 0 分镜 · 0 元素
- generic [ref=e99]: · 组织分镜画面 → 为生成视频做准备
- button "展开编排" [disabled] [ref=e101]:
- img [ref=e102]
- text: 展开编排
- application [ref=e24]:
- generic [ref=e26]:
- generic:
- generic:
- img:
- group "Edge from input to keyframe" [ref=e104] [cursor=pointer]
- img:
- group "Edge from input to asr" [ref=e107] [cursor=pointer]
- img:
- group "Edge from asr to translate" [ref=e110] [cursor=pointer]
- img:
- group "Edge from translate to rewrite" [ref=e113] [cursor=pointer]
- img:
- group "Edge from keyframe to storyboard" [ref=e116] [cursor=pointer]
- img:
- group "Edge from rewrite to storyboard" [ref=e119] [cursor=pointer]
- img:
- group "Edge from storyboard to videogen" [ref=e122] [cursor=pointer]
- img:
- group "Edge from videogen to compose" [ref=e125] [cursor=pointer]
- img:
- group "Edge from rewrite to compose" [ref=e128] [cursor=pointer]
- generic:
- group [ref=e27]:
- generic [ref=e28]:
- generic [ref=e131]:
- button "再上传一个视频" [ref=e132]:
- img [ref=e133]
- generic [ref=e134]:
- button "64.5s" [ref=e135]:
- generic [ref=e137]: 64.5s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 64.5s
- generic [ref=e138]:
- button "72.4s" [ref=e139]:
- generic [ref=e141]: 72.4s
- generic:
- generic:
- generic:
- generic: 576×1024
- generic: 72.4s
- generic [ref=e142]:
- button "64.5s" [ref=e143]:
- generic [ref=e145]: 64.5s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 64.5s
- generic [ref=e146]:
- button "71.4s" [ref=e147]:
- generic [ref=e149]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e150]:
- button "72.4s" [ref=e151]:
- generic [ref=e153]: 72.4s
- generic:
- generic:
- generic:
- generic: 576×1024
- generic: 72.4s
- generic [ref=e154]:
- button "71.4s" [ref=e155]:
- generic [ref=e157]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e158]:
- button "71.4s" [ref=e159]:
- generic [ref=e161]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e162]:
- button "71.4s" [ref=e163]:
- generic [ref=e165]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e166]:
- button "71.4s" [ref=e167]:
- generic [ref=e169]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e170]:
- button "71.4s" [ref=e171]:
- generic [ref=e173]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e174]:
- button "8.0s" [ref=e175]:
- generic [ref=e177]: 8.0s
- generic:
- generic:
- generic:
- generic: 640×360
- generic: 8.0s
- generic [ref=e178]:
- button "8.0s" [ref=e179]:
- generic [ref=e181]: 8.0s
- generic:
- generic:
- generic:
- generic: 640×360
- generic: 8.0s
- generic [ref=e182]:
- button "8.0s" [ref=e183]:
- generic [ref=e185]: 8.0s
- generic:
- generic:
- generic:
- generic: 640×360
- generic: 8.0s
- generic [ref=e186]:
- button "8.0s" [ref=e187]:
- generic [ref=e189]: 8.0s
- generic:
- generic:
- generic:
- generic: 640×360
- generic: 8.0s
- button "…" [ref=e191]:
- img [ref=e193]
- generic [ref=e195]:
- button "…" [ref=e197]:
- img [ref=e199]
- generic [ref=e201]:
- button "…" [ref=e203]:
- img [ref=e205]
- generic [ref=e207]:
- generic [ref=e29]:
- generic [ref=e30]:
- img [ref=e32]
- generic [ref=e35]: 输入 · Input
- generic [ref=e36]:
- img [ref=e208]
- button "钉住 · 锁定位置与尺寸" [ref=e38]:
- img [ref=e39]
- generic [ref=e42]:
- generic [ref=e43]: STEP 1 · 视频就绪 · 完成
- textbox "再加一个 TK 链接" [ref=e211]
- generic [ref=e45]:
- button "+ 加链接" [disabled] [ref=e212]
- button "再传一个" [ref=e213]:
- img [ref=e48]
- text: 再传一个
- generic [ref=e214]:
- generic [ref=e215]: 1080×1920 · 64.5s
- generic [ref=e216]: 🔗 链接
- button "重新解析" [ref=e217]
- generic "拖动调整宽度" [ref=e52]
- generic "拖动调整大小(宽 × 高)" [ref=e53]
- group [ref=e218]:
- generic [ref=e219]:
- generic [ref=e220]:
- generic [ref=e221]:
- button "frame 9 1.7s" [ref=e222]:
- img "frame 9" [ref=e223]
- generic [ref=e224]: 1.7s
- button "📋" [ref=e225]
- button "删除该关键帧" [ref=e226]:
- img [ref=e227]
- generic:
- generic:
- generic:
- generic: 分镜 10
- generic: 1.66s
- generic [ref=e230]:
- button "frame 0 ✨ 24.7s" [ref=e231]:
- img "frame 0" [ref=e232]
- generic "已清洗" [ref=e234]: ✨
- generic [ref=e235]: 24.7s
- button "📋" [ref=e236]
- button "删除该关键帧" [ref=e237]:
- img [ref=e238]
- generic:
- generic:
- generic:
- generic: 分镜 1
- generic: 24.73s
- generic [ref=e241]:
- button "frame 1 33.6s" [ref=e242]:
- img "frame 1" [ref=e243]
- generic [ref=e244]: 33.6s
- button "📋" [ref=e245]
- button "删除该关键帧" [ref=e246]:
- img [ref=e247]
- generic:
- generic:
- generic:
- generic: 分镜 2
- generic: 33.61s
- generic [ref=e250]:
- button "frame 2 37.7s" [ref=e251]:
- img "frame 2" [ref=e252]
- generic [ref=e253]: 37.7s
- button "📋" [ref=e254]
- button "删除该关键帧" [ref=e255]:
- img [ref=e256]
- generic:
- generic:
- generic:
- generic: 分镜 3
- generic: 37.70s
- generic [ref=e259]:
- button "frame 3 39.4s" [ref=e260]:
- img "frame 3" [ref=e261]
- generic [ref=e262]: 39.4s
- button "📋" [ref=e263]
- button "删除该关键帧" [ref=e264]:
- img [ref=e265]
- generic:
- generic:
- generic:
- generic: 分镜 4
- generic: 39.42s
- generic [ref=e268]:
- button "frame 4 1 43.1s" [ref=e269]:
- img "frame 4" [ref=e270]
- generic "1 个元素已抠图" [ref=e272]: "1"
- generic [ref=e273]: 43.1s
- button "📋" [ref=e274]
- button "删除该关键帧" [ref=e275]:
- img [ref=e276]
- generic:
- generic:
- generic:
- generic: 分镜 5
- generic: 43.13s
- generic [ref=e279]:
- button "frame 5 45.0s" [ref=e280]:
- img "frame 5" [ref=e281]
- generic [ref=e282]: 45.0s
- button "📋" [ref=e283]
- button "删除该关键帧" [ref=e284]:
- img [ref=e285]
- generic:
- generic:
- generic:
- generic: 分镜 6
- generic: 45.05s
- generic [ref=e288]:
- button "frame 6 53.6s" [ref=e289]:
- img "frame 6" [ref=e290]
- generic [ref=e291]: 53.6s
- button "📋" [ref=e292]
- button "删除该关键帧" [ref=e293]:
- img [ref=e294]
- generic:
- generic:
- generic:
- generic: 分镜 7
- generic: 53.60s
- generic [ref=e297]:
- button "frame 7 56.0s" [ref=e298]:
- img "frame 7" [ref=e299]
- generic [ref=e300]: 56.0s
- button "📋" [ref=e301]
- button "删除该关键帧" [ref=e302]:
- img [ref=e303]
- generic:
- generic:
- generic:
- generic: 分镜 8
- generic: 55.96s
- generic [ref=e306]:
- button "frame 8 58.4s" [ref=e307]:
- img "frame 8" [ref=e308]
- generic [ref=e309]: 58.4s
- button "📋" [ref=e310]
- button "删除该关键帧" [ref=e311]:
- img [ref=e312]
- generic:
- generic:
- generic:
- generic: 分镜 9
- generic: 58.39s
- generic [ref=e315]:
- generic [ref=e317]:
- img [ref=e319]
- generic [ref=e323]: 镜头拆解 · 元素提取
- generic [ref=e324]:
- img [ref=e325]
- button "钉住 · 锁定位置与尺寸" [ref=e329]:
- img [ref=e330]
- generic [ref=e333]:
- generic [ref=e334]: STEP 2 · 0/10 入编排 · 完成
- generic [ref=e335]:
- text: 自动 10 张 ·
- generic [ref=e336]: 1 已清洗
- text: ·
- generic [ref=e337]: 1/2 已抠图
- text: 点缩略图 → 清洗水印 / 提取可借鉴元素 → 改造成 SKG 画面素材
- generic "拖动调整宽度" [ref=e339]
- generic "拖动调整大小(宽 × 高)" [ref=e340]
- group [ref=e341]:
- generic [ref=e342]:
- generic [ref=e344]:
- img [ref=e346]
- generic [ref=e349]: 声音文案 · ASR
- button "钉住 · 锁定位置与尺寸" [ref=e352]:
- img [ref=e353]
- generic [ref=e356]:
- generic [ref=e357]: STEP 3 · 可选文案轨 · 待运行
- generic [ref=e358]: Gemini 2.5 · 英文带时间戳分段
- generic "拖动调整宽度" [ref=e360]
- generic "拖动调整大小(宽 × 高)" [ref=e361]
- group [ref=e362]:
- generic [ref=e363]:
- generic [ref=e365]:
- img [ref=e367]
- generic [ref=e371]: 翻译理解 · Translate
- button "钉住 · 锁定位置与尺寸" [ref=e374]:
- img [ref=e375]
- generic [ref=e378]:
- generic [ref=e379]: STEP 4 · EN → ZH · 待运行
- generic [ref=e380]: 中文翻译 · 段落级 · 实时输出
- generic "拖动调整宽度" [ref=e382]
- generic "拖动调整大小(宽 × 高)" [ref=e383]
- group [ref=e384]:
- generic [ref=e385]:
- generic [ref=e387]:
- button "透明骷髅" [ref=e388]:
- img "透明骷髅" [ref=e389]
- button "📋" [ref=e390]
- generic:
- generic:
- generic:
- generic: 分镜 5
- generic: 43.13s
- generic [ref=e391]:
- generic [ref=e393]:
- img [ref=e395]
- generic [ref=e400]: 元素改造 · Storyboard
- generic [ref=e401]:
- img [ref=e402]
- button "钉住 · 锁定位置与尺寸" [ref=e406]:
- img [ref=e407]
- generic [ref=e410]:
- generic [ref=e411]: STEP 6 · 参考元素 → SKG 画面 · 完成
- generic [ref=e412]:
- text: 不是复刻原视频:先把参考图里的主体 / 场景 / 动作 / 道具拆出来,再替换成 SKG 产品画面。
- generic [ref=e413]: 已有 1 个提取元素 · 0 个分镜进入编排
- button "进入分镜编排" [disabled] [ref=e414]
- generic "拖动调整宽度" [ref=e416]
- generic "拖动调整大小(宽 × 高)" [ref=e417]
- group [ref=e418]:
- generic [ref=e419]:
- generic [ref=e421]:
- img [ref=e423]
- generic [ref=e427]: 产品文案 · Rewrite
- button "钉住 · 锁定位置与尺寸" [ref=e430]:
- img [ref=e431]
- generic [ref=e434]:
- generic [ref=e435]: STEP 5 · 接 SKG 卖点 · 待运行
- textbox "粘贴 SKG 产品信息 / 关键卖点(可作为视频脚本和镜头动作参考)" [disabled] [ref=e436]
- generic [ref=e437]: 下一冲刺接入
- generic "拖动调整宽度" [ref=e439]
- generic "拖动调整大小(宽 × 高)" [ref=e440]
- group [ref=e441]:
- generic [ref=e443]:
- generic [ref=e445]:
- img [ref=e447]
- generic [ref=e449]: 生成视频 · Video Gen
- button "钉住 · 锁定位置与尺寸" [ref=e452]:
- img [ref=e453]
- generic [ref=e456]:
- generic [ref=e457]: STEP 7 · 首帧 + 动作 prompt · 待运行
- generic [ref=e458]:
- generic [ref=e459]: Seedance
- generic [ref=e460]: Kling
- generic [ref=e461]: Veo 3
- generic "拖动调整宽度" [ref=e463]
- generic "拖动调整大小(宽 × 高)" [ref=e464]
- group [ref=e465]:
- generic [ref=e466]:
- generic [ref=e468]:
- img [ref=e470]
- generic [ref=e474]: 合成成品 · Compose
- button "钉住 · 锁定位置与尺寸" [ref=e477]:
- img [ref=e478]
- generic [ref=e481]:
- generic [ref=e482]: STEP 8 · ffmpeg + 字幕 · 待运行
- generic [ref=e483]:
- text: 视频片段 + 字幕 / TTS
- text: → 最终 mp4 输出
- generic "拖动调整宽度" [ref=e484]
- generic "拖动调整大小(宽 × 高)" [ref=e485]
- img
- generic "Control Panel" [ref=e54]:
- button "Zoom In" [ref=e55] [cursor=pointer]:
- img [ref=e56]
- button "Zoom Out" [ref=e58] [cursor=pointer]:
- img [ref=e59]
- button "Fit View" [ref=e61] [cursor=pointer]:
- img [ref=e62]
- button "Toggle Interactivity" [ref=e64] [cursor=pointer]:
- img [ref=e65]
- img "Mini Map" [ref=e68]
- region "Notifications alt+T":
- list:
- listitem [ref=e493]:
- img [ref=e495]
- generic [ref=e498]: 已自动排版 · 保留每个节点的尺寸
- listitem [ref=e499]:
- img [ref=e501]
- generic [ref=e504]: 📥 视频已就绪 — 请点 Input 节点里的「点这里开始解析」按钮
- alert [ref=e505]

View File

@@ -0,0 +1,19 @@
- generic [active] [ref=e1]:
- main [ref=e3]:
- button "自动排版 · 保留每个节点的尺寸,重新排好间距和列布局" [ref=e5]:
- img [ref=e6]
- application [ref=e13]:
- img
- generic "Control Panel" [ref=e16]:
- button "Zoom In" [ref=e17] [cursor=pointer]:
- img [ref=e18]
- button "Zoom Out" [ref=e20] [cursor=pointer]:
- img [ref=e21]
- button "Fit View" [ref=e23] [cursor=pointer]:
- img [ref=e24]
- button "Toggle Interactivity" [ref=e26] [cursor=pointer]:
- img [ref=e27]
- img "Mini Map" [ref=e30]
- region "Notifications alt+T"
- button "Open Next.js Dev Tools" [ref=e37] [cursor=pointer]:
- img [ref=e38]

View File

@@ -0,0 +1,454 @@
- generic [active] [ref=e1]:
- generic [ref=e36] [cursor=pointer]:
- button "Open Next.js Dev Tools" [ref=e37]:
- img [ref=e38]
- generic [ref=e43]:
- button "Open issues overlay" [ref=e44]:
- generic [ref=e45]:
- generic [ref=e46]: "0"
- generic [ref=e47]: "1"
- generic [ref=e48]: Issue
- button "Collapse issues badge" [ref=e49]:
- img [ref=e50]
- main [ref=e53]:
- button "自动排版 · 保留每个节点的尺寸,重新排好间距和列布局" [ref=e55]:
- img [ref=e56]
- button "切到明亮主题" [ref=e62]:
- img [ref=e63]
- generic [ref=e69]:
- generic [ref=e72]:
- generic [ref=e73]:
- img [ref=e74]
- generic [ref=e79]: 分镜头编排
- generic [ref=e80]: 0 分镜 · 0 元素
- generic [ref=e81]: · 组织分镜画面 → 为生成视频做准备
- button "展开编排" [disabled] [ref=e83]:
- img [ref=e84]
- text: 展开编排
- application [ref=e87]:
- generic [ref=e89]:
- generic:
- generic:
- img:
- group "Edge from input to keyframe" [ref=e90] [cursor=pointer]
- img:
- group "Edge from input to asr" [ref=e93] [cursor=pointer]
- img:
- group "Edge from asr to translate" [ref=e96] [cursor=pointer]
- img:
- group "Edge from translate to rewrite" [ref=e99] [cursor=pointer]
- img:
- group "Edge from keyframe to storyboard" [ref=e102] [cursor=pointer]
- img:
- group "Edge from rewrite to storyboard" [ref=e105] [cursor=pointer]
- img:
- group "Edge from storyboard to videogen" [ref=e108] [cursor=pointer]
- img:
- group "Edge from videogen to compose" [ref=e111] [cursor=pointer]
- img:
- group "Edge from rewrite to compose" [ref=e114] [cursor=pointer]
- generic:
- group [ref=e117]:
- generic [ref=e118]:
- generic [ref=e119]:
- button "再上传一个视频" [ref=e120]:
- img [ref=e121]
- generic [ref=e122]:
- button "64.5s" [ref=e123]:
- generic [ref=e125]: 64.5s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 64.5s
- generic [ref=e126]:
- button "72.4s" [ref=e127]:
- generic [ref=e129]: 72.4s
- generic:
- generic:
- generic:
- generic: 576×1024
- generic: 72.4s
- generic [ref=e130]:
- button "64.5s" [ref=e131]:
- generic [ref=e133]: 64.5s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 64.5s
- generic [ref=e134]:
- button "71.4s" [ref=e135]:
- generic [ref=e137]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e138]:
- button "72.4s" [ref=e139]:
- generic [ref=e141]: 72.4s
- generic:
- generic:
- generic:
- generic: 576×1024
- generic: 72.4s
- generic [ref=e142]:
- button "71.4s" [ref=e143]:
- generic [ref=e145]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e146]:
- button "71.4s" [ref=e147]:
- generic [ref=e149]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e150]:
- button "71.4s" [ref=e151]:
- generic [ref=e153]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e154]:
- button "71.4s" [ref=e155]:
- generic [ref=e157]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e158]:
- button "71.4s" [ref=e159]:
- generic [ref=e161]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e162]:
- button "8.0s" [ref=e163]:
- generic [ref=e165]: 8.0s
- generic:
- generic:
- generic:
- generic: 640×360
- generic: 8.0s
- generic [ref=e166]:
- button "8.0s" [ref=e167]:
- generic [ref=e169]: 8.0s
- generic:
- generic:
- generic:
- generic: 640×360
- generic: 8.0s
- generic [ref=e170]:
- button "8.0s" [ref=e171]:
- generic [ref=e173]: 8.0s
- generic:
- generic:
- generic:
- generic: 640×360
- generic: 8.0s
- generic [ref=e174]:
- button "8.0s" [ref=e175]:
- generic [ref=e177]: 8.0s
- generic:
- generic:
- generic:
- generic: 640×360
- generic: 8.0s
- button "…" [ref=e179]:
- img [ref=e181]
- generic [ref=e183]:
- button "…" [ref=e185]:
- img [ref=e187]
- generic [ref=e189]:
- button "…" [ref=e191]:
- img [ref=e193]
- generic [ref=e195]:
- generic [ref=e196]:
- generic [ref=e197]:
- img [ref=e199]
- generic [ref=e202]: 输入 · Input
- generic [ref=e203]:
- img [ref=e204]
- button "钉住 · 锁定位置与尺寸" [ref=e208]:
- img [ref=e209]
- generic [ref=e212]:
- generic [ref=e213]: STEP 1 · 视频就绪 · 完成
- textbox "再加一个 TK 链接" [ref=e214]
- generic [ref=e215]:
- button "+ 加链接" [disabled] [ref=e216]
- button "再传一个" [ref=e217]:
- img [ref=e218]
- text: 再传一个
- generic [ref=e221]:
- generic [ref=e222]: 1080×1920 · 64.5s
- generic [ref=e223]: 🔗 链接
- button "重新解析" [ref=e224]
- generic "拖动调整宽度" [ref=e226]
- generic "拖动调整大小(宽 × 高)" [ref=e227]
- group [ref=e228]:
- generic [ref=e229]:
- generic [ref=e230]:
- generic [ref=e231]:
- button "frame 9 1.7s" [ref=e232]:
- img "frame 9" [ref=e233]
- generic [ref=e234]: 1.7s
- button "📋" [ref=e235]
- button "删除该关键帧" [ref=e236]:
- img [ref=e237]
- generic:
- generic:
- generic:
- generic: 分镜 10
- generic: 1.66s
- generic [ref=e240]:
- button "frame 0 ✨ 24.7s" [ref=e241]:
- img "frame 0" [ref=e242]
- generic "已清洗" [ref=e244]: ✨
- generic [ref=e245]: 24.7s
- button "📋" [ref=e246]
- button "删除该关键帧" [ref=e247]:
- img [ref=e248]
- generic:
- generic:
- generic:
- generic: 分镜 1
- generic: 24.73s
- generic [ref=e251]:
- button "frame 1 33.6s" [ref=e252]:
- img "frame 1" [ref=e253]
- generic [ref=e254]: 33.6s
- button "📋" [ref=e255]
- button "删除该关键帧" [ref=e256]:
- img [ref=e257]
- generic:
- generic:
- generic:
- generic: 分镜 2
- generic: 33.61s
- generic [ref=e260]:
- button "frame 2 37.7s" [ref=e261]:
- img "frame 2" [ref=e262]
- generic [ref=e263]: 37.7s
- button "📋" [ref=e264]
- button "删除该关键帧" [ref=e265]:
- img [ref=e266]
- generic:
- generic:
- generic:
- generic: 分镜 3
- generic: 37.70s
- generic [ref=e269]:
- button "frame 3 39.4s" [ref=e270]:
- img "frame 3" [ref=e271]
- generic [ref=e272]: 39.4s
- button "📋" [ref=e273]
- button "删除该关键帧" [ref=e274]:
- img [ref=e275]
- generic:
- generic:
- generic:
- generic: 分镜 4
- generic: 39.42s
- generic [ref=e278]:
- button "frame 4 1 43.1s" [ref=e279]:
- img "frame 4" [ref=e280]
- generic "1 个元素已抠图" [ref=e282]: "1"
- generic [ref=e283]: 43.1s
- button "📋" [ref=e284]
- button "删除该关键帧" [ref=e285]:
- img [ref=e286]
- generic:
- generic:
- generic:
- generic: 分镜 5
- generic: 43.13s
- generic [ref=e289]:
- button "frame 5 45.0s" [ref=e290]:
- img "frame 5" [ref=e291]
- generic [ref=e292]: 45.0s
- button "📋" [ref=e293]
- button "删除该关键帧" [ref=e294]:
- img [ref=e295]
- generic:
- generic:
- generic:
- generic: 分镜 6
- generic: 45.05s
- generic [ref=e298]:
- button "frame 6 53.6s" [ref=e299]:
- img "frame 6" [ref=e300]
- generic [ref=e301]: 53.6s
- button "📋" [ref=e302]
- button "删除该关键帧" [ref=e303]:
- img [ref=e304]
- generic:
- generic:
- generic:
- generic: 分镜 7
- generic: 53.60s
- generic [ref=e307]:
- button "frame 7 56.0s" [ref=e308]:
- img "frame 7" [ref=e309]
- generic [ref=e310]: 56.0s
- button "📋" [ref=e311]
- button "删除该关键帧" [ref=e312]:
- img [ref=e313]
- generic:
- generic:
- generic:
- generic: 分镜 8
- generic: 55.96s
- generic [ref=e316]:
- button "frame 8 58.4s" [ref=e317]:
- img "frame 8" [ref=e318]
- generic [ref=e319]: 58.4s
- button "📋" [ref=e320]
- button "删除该关键帧" [ref=e321]:
- img [ref=e322]
- generic:
- generic:
- generic:
- generic: 分镜 9
- generic: 58.39s
- generic [ref=e325]:
- generic [ref=e327]:
- img [ref=e329]
- generic [ref=e333]: 镜头拆解 · 元素提取
- generic [ref=e334]:
- img [ref=e335]
- button "钉住 · 锁定位置与尺寸" [ref=e339]:
- img [ref=e340]
- generic [ref=e343]:
- generic [ref=e344]: STEP 2 · 0/10 入编排 · 完成
- generic [ref=e345]:
- text: 自动 10 张 ·
- generic [ref=e346]: 1 已清洗
- text: ·
- generic [ref=e347]: 1/2 已抠图
- text: 点缩略图 → 清洗水印 / 提取可借鉴元素 → 改造成 SKG 画面素材
- generic "拖动调整宽度" [ref=e349]
- generic "拖动调整大小(宽 × 高)" [ref=e350]
- group [ref=e351]:
- generic [ref=e352]:
- generic [ref=e354]:
- img [ref=e356]
- generic [ref=e359]: 声音文案 · ASR
- button "钉住 · 锁定位置与尺寸" [ref=e362]:
- img [ref=e363]
- generic [ref=e366]:
- generic [ref=e367]: STEP 3 · 可选文案轨 · 待运行
- generic [ref=e368]: Gemini 2.5 · 英文带时间戳分段
- generic "拖动调整宽度" [ref=e370]
- generic "拖动调整大小(宽 × 高)" [ref=e371]
- group [ref=e372]:
- generic [ref=e373]:
- generic [ref=e375]:
- img [ref=e377]
- generic [ref=e381]: 翻译理解 · Translate
- button "钉住 · 锁定位置与尺寸" [ref=e384]:
- img [ref=e385]
- generic [ref=e388]:
- generic [ref=e389]: STEP 4 · EN → ZH · 待运行
- generic [ref=e390]: 中文翻译 · 段落级 · 实时输出
- generic "拖动调整宽度" [ref=e392]
- generic "拖动调整大小(宽 × 高)" [ref=e393]
- group [ref=e394]:
- generic [ref=e395]:
- generic [ref=e397]:
- button "透明骷髅" [ref=e398]:
- img "透明骷髅" [ref=e399]
- button "📋" [ref=e400]
- generic:
- generic:
- generic:
- generic: 分镜 5
- generic: 43.13s
- generic [ref=e401]:
- generic [ref=e403]:
- img [ref=e405]
- generic [ref=e410]: 元素改造 · Storyboard
- generic [ref=e411]:
- img [ref=e412]
- button "钉住 · 锁定位置与尺寸" [ref=e416]:
- img [ref=e417]
- generic [ref=e420]:
- generic [ref=e421]: STEP 6 · 参考元素 → SKG 画面 · 完成
- generic [ref=e422]:
- text: 不是复刻原视频:先把参考图里的主体 / 场景 / 动作 / 道具拆出来,再替换成 SKG 产品画面。
- generic [ref=e423]: 已有 1 个提取元素 · 0 个分镜进入编排
- button "进入分镜编排" [disabled] [ref=e424]
- generic "拖动调整宽度" [ref=e426]
- generic "拖动调整大小(宽 × 高)" [ref=e427]
- group [ref=e428]:
- generic [ref=e429]:
- generic [ref=e431]:
- img [ref=e433]
- generic [ref=e437]: 产品文案 · Rewrite
- button "钉住 · 锁定位置与尺寸" [ref=e440]:
- img [ref=e441]
- generic [ref=e444]:
- generic [ref=e445]: STEP 5 · 接 SKG 卖点 · 待运行
- textbox "粘贴 SKG 产品信息 / 关键卖点(可作为视频脚本和镜头动作参考)" [disabled] [ref=e446]
- generic [ref=e447]: 下一冲刺接入
- generic "拖动调整宽度" [ref=e449]
- generic "拖动调整大小(宽 × 高)" [ref=e450]
- group [ref=e451]:
- generic [ref=e453]:
- generic [ref=e455]:
- img [ref=e457]
- generic [ref=e459]: 生成视频 · Video Gen
- button "钉住 · 锁定位置与尺寸" [ref=e462]:
- img [ref=e463]
- generic [ref=e466]:
- generic [ref=e467]: STEP 7 · 首帧 + 动作 prompt · 待运行
- generic [ref=e468]:
- generic [ref=e469]: Seedance
- generic [ref=e470]: Kling
- generic [ref=e471]: Veo 3
- generic "拖动调整宽度" [ref=e473]
- generic "拖动调整大小(宽 × 高)" [ref=e474]
- group [ref=e475]:
- generic [ref=e476]:
- generic [ref=e478]:
- img [ref=e480]
- generic [ref=e484]: 合成成品 · Compose
- button "钉住 · 锁定位置与尺寸" [ref=e487]:
- img [ref=e488]
- generic [ref=e491]:
- generic [ref=e492]: STEP 8 · ffmpeg + 字幕 · 待运行
- generic [ref=e493]:
- text: 视频片段 + 字幕 / TTS
- text: → 最终 mp4 输出
- generic "拖动调整宽度" [ref=e494]
- generic "拖动调整大小(宽 × 高)" [ref=e495]
- img
- generic "Control Panel" [ref=e496]:
- button "Zoom In" [ref=e497] [cursor=pointer]:
- img [ref=e498]
- button "Zoom Out" [ref=e500] [cursor=pointer]:
- img [ref=e501]
- button "Fit View" [ref=e503] [cursor=pointer]:
- img [ref=e504]
- button "Toggle Interactivity" [ref=e506] [cursor=pointer]:
- img [ref=e507]
- img "Mini Map" [ref=e510]
- region "Notifications alt+T":
- list:
- listitem [ref=e520]:
- img [ref=e522]
- generic [ref=e525]: 已自动排版 · 保留每个节点的尺寸
- listitem [ref=e526]:
- img [ref=e528]
- generic [ref=e531]: 📥 视频已就绪 — 请点 Input 节点里的「点这里开始解析」按钮
- alert [ref=e532]

View File

@@ -0,0 +1,36 @@
- generic [active] [ref=e1]:
- button "Open Next.js Dev Tools" [ref=e7] [cursor=pointer]:
- img [ref=e8]
- main [ref=e14]:
- button "自动排版 · 保留每个节点的尺寸,重新排好间距和列布局" [ref=e16]:
- img [ref=e17]
- application [ref=e24]:
- group [ref=e27]:
- generic [ref=e29]:
- generic [ref=e30]:
- img [ref=e32]
- generic [ref=e35]: 输入 · Input
- button "钉住 · 锁定位置与尺寸" [ref=e38]:
- img [ref=e39]
- generic [ref=e42]:
- generic [ref=e43]: STEP 1 · 待运行
- textbox "粘贴 TikTok 链接" [ref=e44]
- generic [ref=e45]:
- button "提交链接" [disabled] [ref=e46]
- button "上传" [ref=e47]:
- img [ref=e48]
- text: 上传
- generic "拖动调整宽度" [ref=e52]
- generic "拖动调整大小(宽 × 高)" [ref=e53]
- img
- generic "Control Panel" [ref=e54]:
- button "Zoom In" [ref=e55] [cursor=pointer]:
- img [ref=e56]
- button "Zoom Out" [ref=e58] [cursor=pointer]:
- img [ref=e59]
- button "Fit View" [ref=e61] [cursor=pointer]:
- img [ref=e62]
- button "Toggle Interactivity" [ref=e64] [cursor=pointer]:
- img [ref=e65]
- img "Mini Map" [ref=e68]
- region "Notifications alt+T"

View File

@@ -0,0 +1,456 @@
- generic [active] [ref=e1]:
- generic [ref=e6] [cursor=pointer]:
- button "Open Next.js Dev Tools" [ref=e7]:
- img [ref=e8]
- generic [ref=e71]:
- button "Open issues overlay" [ref=e72]:
- generic [ref=e73]:
- generic [ref=e74]: "0"
- generic [ref=e75]: "1"
- generic [ref=e76]: Issue
- button "Collapse issues badge" [ref=e77]:
- img [ref=e78]
- main [ref=e14]:
- button "自动排版 · 保留每个节点的尺寸,重新排好间距和列布局" [ref=e16]:
- img [ref=e17]
- button "切到明亮主题" [ref=e81]:
- img [ref=e82]
- generic [ref=e22]:
- generic [ref=e90]:
- generic [ref=e91]:
- img [ref=e92]
- generic [ref=e97]: 分镜头编排
- generic [ref=e98]: 0 分镜 · 0 元素
- generic [ref=e99]: · 组织分镜画面 → 为生成视频做准备
- button "展开编排" [disabled] [ref=e101]:
- img [ref=e102]
- text: 展开编排
- application [ref=e24]:
- generic [ref=e26]:
- generic:
- generic:
- img:
- group "Edge from input to keyframe" [ref=e104] [cursor=pointer]
- img:
- group "Edge from input to asr" [ref=e107] [cursor=pointer]
- img:
- group "Edge from asr to translate" [ref=e110] [cursor=pointer]
- img:
- group "Edge from translate to rewrite" [ref=e113] [cursor=pointer]
- img:
- group "Edge from keyframe to storyboard" [ref=e116] [cursor=pointer]
- img:
- group "Edge from rewrite to storyboard" [ref=e119] [cursor=pointer]
- img:
- group "Edge from storyboard to videogen" [ref=e122] [cursor=pointer]
- img:
- group "Edge from videogen to compose" [ref=e125] [cursor=pointer]
- img:
- group "Edge from rewrite to compose" [ref=e128] [cursor=pointer]
- generic:
- group [ref=e27]:
- generic [ref=e28]:
- generic [ref=e131]:
- button "再上传一个视频" [ref=e132]:
- img [ref=e133]
- generic [ref=e134]:
- button "64.5s" [ref=e135]:
- generic [ref=e137]: 64.5s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 64.5s
- generic [ref=e138]:
- button "72.4s" [ref=e139]:
- generic [ref=e141]: 72.4s
- generic:
- generic:
- generic:
- generic: 576×1024
- generic: 72.4s
- generic [ref=e142]:
- button "64.5s" [ref=e143]:
- generic [ref=e145]: 64.5s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 64.5s
- generic [ref=e146]:
- button "71.4s" [ref=e147]:
- generic [ref=e149]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e150]:
- button "72.4s" [ref=e151]:
- generic [ref=e153]: 72.4s
- generic:
- generic:
- generic:
- generic: 576×1024
- generic: 72.4s
- generic [ref=e154]:
- button "71.4s" [ref=e155]:
- generic [ref=e157]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e158]:
- button "71.4s" [ref=e159]:
- generic [ref=e161]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e162]:
- button "71.4s" [ref=e163]:
- generic [ref=e165]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e166]:
- button "71.4s" [ref=e167]:
- generic [ref=e169]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e170]:
- button "71.4s" [ref=e171]:
- generic [ref=e173]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e174]:
- button "8.0s" [ref=e175]:
- generic [ref=e177]: 8.0s
- generic:
- generic:
- generic:
- generic: 640×360
- generic: 8.0s
- generic [ref=e178]:
- button "8.0s" [ref=e179]:
- generic [ref=e181]: 8.0s
- generic:
- generic:
- generic:
- generic: 640×360
- generic: 8.0s
- generic [ref=e182]:
- button "8.0s" [ref=e183]:
- generic [ref=e185]: 8.0s
- generic:
- generic:
- generic:
- generic: 640×360
- generic: 8.0s
- generic [ref=e186]:
- button "8.0s" [ref=e187]:
- generic [ref=e189]: 8.0s
- generic:
- generic:
- generic:
- generic: 640×360
- generic: 8.0s
- button "…" [ref=e191]:
- img [ref=e193]
- generic [ref=e195]:
- button "…" [ref=e197]:
- img [ref=e199]
- generic [ref=e201]:
- button "…" [ref=e203]:
- img [ref=e205]
- generic [ref=e207]:
- generic [ref=e29]:
- generic [ref=e30]:
- img [ref=e32]
- generic [ref=e35]: 输入 · Input
- generic [ref=e36]:
- img [ref=e208]
- button "钉住 · 锁定位置与尺寸" [ref=e38]:
- img [ref=e39]
- generic [ref=e42]:
- generic [ref=e43]: STEP 1 · 视频就绪 · 完成
- textbox "再加一个 TK 链接" [ref=e211]
- generic [ref=e45]:
- button "+ 加链接" [disabled] [ref=e212]
- button "再传一个" [ref=e213]:
- img [ref=e48]
- text: 再传一个
- generic [ref=e214]:
- generic [ref=e215]: 1080×1920 · 64.5s
- generic [ref=e216]: 🔗 链接
- button "重新解析" [ref=e217]
- generic "拖动调整宽度" [ref=e52]
- generic "拖动调整大小(宽 × 高)" [ref=e53]
- group [ref=e218]:
- generic [ref=e219]:
- generic [ref=e220]:
- generic [ref=e221]:
- button "frame 9 1.7s" [ref=e222]:
- img "frame 9" [ref=e223]
- generic [ref=e224]: 1.7s
- button "📋" [ref=e225]
- button "删除该关键帧" [ref=e226]:
- img [ref=e227]
- generic:
- generic:
- generic:
- generic: 分镜 10
- generic: 1.66s
- generic [ref=e230]:
- button "frame 0 ✨ 24.7s" [ref=e231]:
- img "frame 0" [ref=e232]
- generic "已清洗" [ref=e234]: ✨
- generic [ref=e235]: 24.7s
- button "📋" [ref=e236]
- button "删除该关键帧" [ref=e237]:
- img [ref=e238]
- generic:
- generic:
- generic:
- generic: 分镜 1
- generic: 24.73s
- generic [ref=e241]:
- button "frame 1 33.6s" [ref=e242]:
- img "frame 1" [ref=e243]
- generic [ref=e244]: 33.6s
- button "📋" [ref=e245]
- button "删除该关键帧" [ref=e246]:
- img [ref=e247]
- generic:
- generic:
- generic:
- generic: 分镜 2
- generic: 33.61s
- generic [ref=e250]:
- button "frame 2 37.7s" [ref=e251]:
- img "frame 2" [ref=e252]
- generic [ref=e253]: 37.7s
- button "📋" [ref=e254]
- button "删除该关键帧" [ref=e255]:
- img [ref=e256]
- generic:
- generic:
- generic:
- generic: 分镜 3
- generic: 37.70s
- generic [ref=e259]:
- button "frame 3 39.4s" [ref=e260]:
- img "frame 3" [ref=e261]
- generic [ref=e262]: 39.4s
- button "📋" [ref=e263]
- button "删除该关键帧" [ref=e264]:
- img [ref=e265]
- generic:
- generic:
- generic:
- generic: 分镜 4
- generic: 39.42s
- generic [ref=e268]:
- button "frame 4 1 43.1s" [ref=e269]:
- img "frame 4" [ref=e270]
- generic "1 个元素已抠图" [ref=e272]: "1"
- generic [ref=e273]: 43.1s
- button "📋" [ref=e274]
- button "删除该关键帧" [ref=e275]:
- img [ref=e276]
- generic:
- generic:
- generic:
- generic: 分镜 5
- generic: 43.13s
- generic [ref=e279]:
- button "frame 5 45.0s" [ref=e280]:
- img "frame 5" [ref=e281]
- generic [ref=e282]: 45.0s
- button "📋" [ref=e283]
- button "删除该关键帧" [ref=e284]:
- img [ref=e285]
- generic:
- generic:
- generic:
- generic: 分镜 6
- generic: 45.05s
- generic [ref=e288]:
- button "frame 6 53.6s" [ref=e289]:
- img "frame 6" [ref=e290]
- generic [ref=e291]: 53.6s
- button "📋" [ref=e292]
- button "删除该关键帧" [ref=e293]:
- img [ref=e294]
- generic:
- generic:
- generic:
- generic: 分镜 7
- generic: 53.60s
- generic [ref=e297]:
- button "frame 7 56.0s" [ref=e298]:
- img "frame 7" [ref=e299]
- generic [ref=e300]: 56.0s
- button "📋" [ref=e301]
- button "删除该关键帧" [ref=e302]:
- img [ref=e303]
- generic:
- generic:
- generic:
- generic: 分镜 8
- generic: 55.96s
- generic [ref=e306]:
- button "frame 8 58.4s" [ref=e307]:
- img "frame 8" [ref=e308]
- generic [ref=e309]: 58.4s
- button "📋" [ref=e310]
- button "删除该关键帧" [ref=e311]:
- img [ref=e312]
- generic:
- generic:
- generic:
- generic: 分镜 9
- generic: 58.39s
- generic [ref=e315]:
- generic [ref=e317]:
- img [ref=e319]
- generic [ref=e323]: 镜头拆解 · 元素提取
- generic [ref=e324]:
- img [ref=e325]
- button "钉住 · 锁定位置与尺寸" [ref=e329]:
- img [ref=e330]
- generic [ref=e333]:
- generic [ref=e334]: STEP 2 · 0/10 入编排 · 完成
- generic [ref=e335]:
- text: 自动 10 张 ·
- generic [ref=e336]: 1 已清洗
- text: ·
- generic [ref=e337]: 1/2 已抠图
- text: 点缩略图 → 清洗水印 / 提取可借鉴元素 → 改造成 SKG 画面素材
- generic "拖动调整宽度" [ref=e339]
- generic "拖动调整大小(宽 × 高)" [ref=e340]
- group [ref=e341]:
- generic [ref=e342]:
- generic [ref=e344]:
- img [ref=e346]
- generic [ref=e349]: 声音文案 · ASR
- button "钉住 · 锁定位置与尺寸" [ref=e352]:
- img [ref=e353]
- generic [ref=e356]:
- generic [ref=e357]: STEP 3 · 可选文案轨 · 待运行
- generic [ref=e358]: Gemini 2.5 · 英文带时间戳分段
- generic "拖动调整宽度" [ref=e360]
- generic "拖动调整大小(宽 × 高)" [ref=e361]
- group [ref=e362]:
- generic [ref=e363]:
- generic [ref=e365]:
- img [ref=e367]
- generic [ref=e371]: 翻译理解 · Translate
- button "钉住 · 锁定位置与尺寸" [ref=e374]:
- img [ref=e375]
- generic [ref=e378]:
- generic [ref=e379]: STEP 4 · EN → ZH · 待运行
- generic [ref=e380]: 中文翻译 · 段落级 · 实时输出
- generic "拖动调整宽度" [ref=e382]
- generic "拖动调整大小(宽 × 高)" [ref=e383]
- group [ref=e384]:
- generic [ref=e385]:
- generic [ref=e387]:
- button "透明骷髅" [ref=e388]:
- img "透明骷髅" [ref=e389]
- button "📋" [ref=e390]
- button "删除该提取图" [ref=e391]:
- img [ref=e392]
- generic:
- generic:
- generic:
- generic: 分镜 5 · 透明骷髅
- generic: 43.13s
- generic [ref=e395]:
- generic [ref=e397]:
- img [ref=e399]
- generic [ref=e404]: 元素改造 · Storyboard
- generic [ref=e405]:
- img [ref=e406]
- button "钉住 · 锁定位置与尺寸" [ref=e410]:
- img [ref=e411]
- generic [ref=e414]:
- generic [ref=e415]: STEP 6 · 参考元素 → SKG 画面 · 完成
- generic [ref=e416]:
- text: 不是复刻原视频:先把参考图里的主体 / 场景 / 动作 / 道具拆出来,再替换成 SKG 产品画面。
- generic [ref=e417]: 已有 1 个提取元素 · 0 个分镜进入编排
- button "进入分镜编排" [disabled] [ref=e418]
- generic "拖动调整宽度" [ref=e420]
- generic "拖动调整大小(宽 × 高)" [ref=e421]
- group [ref=e422]:
- generic [ref=e423]:
- generic [ref=e425]:
- img [ref=e427]
- generic [ref=e431]: 产品文案 · Rewrite
- button "钉住 · 锁定位置与尺寸" [ref=e434]:
- img [ref=e435]
- generic [ref=e438]:
- generic [ref=e439]: STEP 5 · 接 SKG 卖点 · 待运行
- textbox "粘贴 SKG 产品信息 / 关键卖点(可作为视频脚本和镜头动作参考)" [disabled] [ref=e440]
- generic [ref=e441]: 下一冲刺接入
- generic "拖动调整宽度" [ref=e443]
- generic "拖动调整大小(宽 × 高)" [ref=e444]
- group [ref=e445]:
- generic [ref=e447]:
- generic [ref=e449]:
- img [ref=e451]
- generic [ref=e453]: 生成视频 · Video Gen
- button "钉住 · 锁定位置与尺寸" [ref=e456]:
- img [ref=e457]
- generic [ref=e460]:
- generic [ref=e461]: STEP 7 · 首帧 + 动作 prompt · 待运行
- generic [ref=e462]:
- generic [ref=e463]: Seedance
- generic [ref=e464]: Kling
- generic [ref=e465]: Veo 3
- generic "拖动调整宽度" [ref=e467]
- generic "拖动调整大小(宽 × 高)" [ref=e468]
- group [ref=e469]:
- generic [ref=e470]:
- generic [ref=e472]:
- img [ref=e474]
- generic [ref=e478]: 合成成品 · Compose
- button "钉住 · 锁定位置与尺寸" [ref=e481]:
- img [ref=e482]
- generic [ref=e485]:
- generic [ref=e486]: STEP 8 · ffmpeg + 字幕 · 待运行
- generic [ref=e487]:
- text: 视频片段 + 字幕 / TTS
- text: → 最终 mp4 输出
- generic "拖动调整宽度" [ref=e488]
- generic "拖动调整大小(宽 × 高)" [ref=e489]
- img
- generic "Control Panel" [ref=e54]:
- button "Zoom In" [ref=e55] [cursor=pointer]:
- img [ref=e56]
- button "Zoom Out" [ref=e58] [cursor=pointer]:
- img [ref=e59]
- button "Fit View" [ref=e61] [cursor=pointer]:
- img [ref=e62]
- button "Toggle Interactivity" [ref=e64] [cursor=pointer]:
- img [ref=e65]
- img "Mini Map" [ref=e68]
- region "Notifications alt+T":
- list:
- listitem [ref=e497]:
- img [ref=e499]
- generic [ref=e502]: 已自动排版 · 保留每个节点的尺寸
- listitem [ref=e503]:
- img [ref=e505]
- generic [ref=e508]: 📥 视频已就绪 — 请点 Input 节点里的「点这里开始解析」按钮
- alert [ref=e509]

View File

@@ -18,7 +18,7 @@ import { StoryboardBar } from "@/components/storyboard-bar"
import { StoryboardWorkbench } from "@/components/storyboard-workbench"
import {
addManualFrame, analyzeJob, createJob, getJob, listJobs, uploadJob, deleteFrame, deleteGeneratedImage,
deleteGeneratedVideo, generateStoryboardVideo,
deleteGeneratedVideo, deleteCutout, generateStoryboardVideo,
type Job, type ImageRef, type StoryboardScene,
} from "@/lib/api"
import { VideoLightbox } from "@/components/video-lightbox"
@@ -248,6 +248,17 @@ export default function Home() {
}
}, [activeJobId, setJob])
const handleDeleteCutout = useCallback(async (frameIdx: number, elementId: string, cutoutId: string) => {
if (!activeJobId) return
try {
const updated = await deleteCutout(activeJobId, frameIdx, elementId, cutoutId)
setJob(updated)
toast.success("元素提取图已删除")
} catch (e) {
toast.error("删除失败:" + (e instanceof Error ? e.message : String(e)))
}
}, [activeJobId, setJob])
const handleCopyImage = useCallback((ref: ImageRef) => {
setClipboard(ref)
toast.success(`已复制:${ref.label || (ref.kind === "keyframe" ? "关键帧" : "元素")} · 到分镜头编排工作台粘贴`)
@@ -461,6 +472,7 @@ export default function Home() {
onDeleteFrame: handleDeleteFrame,
onDeleteGenerated: handleDeleteGenerated,
onDeleteVideo: handleDeleteVideo,
onDeleteCutout: handleDeleteCutout,
onOpenStoryboard: (idx: number) => setStoryboardFrame(idx),
onOpenWorkbench: (idx?: number) => {
if (typeof idx === "number") setStoryboardFrame(idx)
@@ -469,7 +481,7 @@ export default function Home() {
onCopyImage: handleCopyImage,
pinnedNodes,
onToggleNodePin: handleToggleNodePin,
}), [job, jobs, activeJobId, submitting, analyzing, selectedFrames, expandedFrame, framePanelScale, framePanelPinned, handleSubmit, handleUpload, handleAnalyze, handleToggleFrame, handleOpenFramePanel, handleFramePanelScaleChange, handleAddManualFrame, handleSwitchJob, setJob, handleDeleteFrame, handleDeleteGenerated, handleDeleteVideo, handleCopyImage, pinnedNodes, handleToggleNodePin])
}), [job, jobs, activeJobId, submitting, analyzing, selectedFrames, expandedFrame, framePanelScale, framePanelPinned, handleSubmit, handleUpload, handleAnalyze, handleToggleFrame, handleOpenFramePanel, handleFramePanelScaleChange, handleAddManualFrame, handleSwitchJob, setJob, handleDeleteFrame, handleDeleteGenerated, handleDeleteVideo, handleDeleteCutout, handleCopyImage, pinnedNodes, handleToggleNodePin])
// 用 useNodesState 让 ReactFlow 自己管位置(避免轮询时重置 drag
const savedSizes = useMemo(() => loadNodeSizes(), [])

View File

@@ -43,6 +43,7 @@ export interface NodeData {
onDeleteFrame?: (idx: number) => void // 删整张关键帧
onDeleteGenerated?: (frameIdx: number, genId: string) => void // 删单张生成图
onDeleteVideo?: (videoId: string) => void // 删 Video Gen 任务
onDeleteCutout?: (frameIdx: number, elementId: string, cutoutId: string) => void // 删元素提取图
onOpenStoryboard?: (frameIdx: number) => void // 打开分镜头编排专属面板
onOpenWorkbench?: (frameIdx?: number) => void // 展开顶部分镜编排内嵌面板
onCopyImage?: (ref: ImageRef) => void // 复制图片到全局剪贴板(粘贴到分镜头编排插槽)
@@ -98,7 +99,7 @@ export function InputNode({ data, selected }: NodeProps<{ data: NodeData }> | an
const videoRef = useRef<HTMLVideoElement>(null)
const job = d.job
// 点击 input 节点外的任何位置 → 取消 pin
// 点击 input 节点外的任何位置 → 取消 pincapture 阶段,避免 ReactFlow pane 拦截)
useEffect(() => {
if (pinnedPreviewJob === null) return
const handler = (e: MouseEvent) => {
@@ -106,8 +107,8 @@ export function InputNode({ data, selected }: NodeProps<{ data: NodeData }> | an
if (t.closest('.react-flow__node[data-id="input"]')) return
setPinnedPreviewJob(null)
}
document.addEventListener("mousedown", handler)
return () => document.removeEventListener("mousedown", handler)
document.addEventListener("mousedown", handler, true)
return () => document.removeEventListener("mousedown", handler, true)
}, [pinnedPreviewJob])
// 是否已下载 → 显示视频 + 解析按钮
@@ -400,7 +401,7 @@ export function KeyframeNode({ data, selected }: any) {
const aspectStr = d.job && d.job.height > 0 ? `${d.job.width}/${d.job.height}` : "9/16"
const [pinnedPreviewFrame, setPinnedPreviewFrame] = useState<number | null>(null)
// 点击 keyframe 节点外的任何位置 → 取消 pin
// 点击 keyframe 节点外的任何位置 → 取消 pincapture 阶段,避免 ReactFlow pane 拦截)
useEffect(() => {
if (pinnedPreviewFrame === null) return
const handler = (e: MouseEvent) => {
@@ -408,8 +409,8 @@ export function KeyframeNode({ data, selected }: any) {
if (t.closest('.react-flow__node[data-id="keyframe"]')) return
setPinnedPreviewFrame(null)
}
document.addEventListener("mousedown", handler)
return () => document.removeEventListener("mousedown", handler)
document.addEventListener("mousedown", handler, true)
return () => document.removeEventListener("mousedown", handler, true)
}, [pinnedPreviewFrame])
return (
@@ -849,6 +850,19 @@ const IMAGEGEN_WIDTH = 360
export function StoryboardNode({ data, selected }: any) {
const d: NodeData = data
const job = d?.job
const [pinnedPreviewCutout, setPinnedPreviewCutout] = useState<string | null>(null)
// 点击 storyboard 节点外 → 取消 pin
useEffect(() => {
if (pinnedPreviewCutout === null) return
const handler = (e: MouseEvent) => {
const t = e.target as HTMLElement
if (t.closest('.react-flow__node[data-id="storyboard"]')) return
setPinnedPreviewCutout(null)
}
document.addEventListener("mousedown", handler, true)
return () => document.removeEventListener("mousedown", handler, true)
}, [pinnedPreviewCutout])
// 上方浮条 = 所有 frame 的 elements 已提取图("分镜头编排"的输入素材)
type ElPreview = { frameIdx: number; elementId: string; name: string; src: string; cid: string; frameSrc: string; timestamp: number }
@@ -882,30 +896,30 @@ export function StoryboardNode({ data, selected }: any) {
return (
<div className="relative" style={{ width: "100%", height: "100%" }}>
{/* 节点上方:所有元素 crop 图(编排输入素材)· 跟 keyframe 节点样式一致 */}
{/* 节点上方:所有元素 crop 图(编排输入素材)— 视觉类节点统一样板:单行横滚 + 左上复制 + 右上删除 + hover/click pin 大预览 */}
{elementCrops.length > 0 && job && (
<div
className="absolute left-0 right-0 grid grid-cols-5 gap-1.5"
className="absolute left-0 right-0 flex items-end gap-1.5 overflow-x-auto pb-1.5"
style={{ bottom: "calc(100% + 12px)" }}
>
{elementCrops.map((p) => {
const key = `${p.frameIdx}_${p.elementId}`
const isPinned = pinnedPreviewCutout === key
return (
<div
key={key}
className="group relative rounded-md border border-violet-300/50 transition shadow-lg hover:-translate-y-0.5 bg-white"
style={{ aspectRatio: aspect }}
className="group relative shrink-0 rounded-md border border-violet-300/50 overflow-visible transition shadow-lg hover:-translate-y-0.5 bg-white"
style={{ height: 80, aspectRatio: aspect }}
>
<button
onClick={(e) => {
e.stopPropagation()
if (!d.selectedFrames.has(p.frameIdx)) {
d.onToggleFrame(p.frameIdx)
}
setPinnedPreviewCutout((prev) => (prev === key ? null : key))
if (!d.selectedFrames.has(p.frameIdx)) d.onToggleFrame(p.frameIdx)
d.onOpenStoryboard?.(p.frameIdx)
d.onOpenWorkbench?.(p.frameIdx)
}}
title={`${p.name} · 来自分镜 ${p.frameIdx + 1} · 点击进入分镜编排`}
title={`${p.name} · 来自分镜 ${p.frameIdx + 1} · 单击钉住大预览 / 进入分镜编排`}
className="absolute inset-0 w-full h-full overflow-hidden rounded-md bg-white"
>
<img
@@ -914,7 +928,7 @@ export function StoryboardNode({ data, selected }: any) {
className="absolute inset-0 w-full h-full object-contain"
/>
</button>
{/* 复制按钮:常驻可见 — 复制元素提取图到剪贴板 */}
{/* 左上:复制 */}
{d.onCopyImage && (
<button
onClick={(e) => {
@@ -933,26 +947,30 @@ export function StoryboardNode({ data, selected }: any) {
📋
</button>
)}
{/* hover 预览 — 和关键帧节点保持一致:只看来源原帧,不额外展示元素面板 */}
<div
className="pointer-events-none absolute opacity-0 group-hover:opacity-100 scale-95 group-hover:scale-100 transition-all duration-150 z-[60]"
style={{
bottom: "calc(100% + 10px)",
left: "50%",
transform: "translateX(-50%)",
transformOrigin: "bottom center",
{/* 右上删除hover 浮出) */}
{d.onDeleteCutout && (
<button
onClick={(e) => {
e.stopPropagation()
if (confirm(`删除元素提取图「${p.name}」?该 cutout 文件会被移除。`)) {
d.onDeleteCutout?.(p.frameIdx, p.elementId, p.cid)
}
}}
title="删除该提取图"
className="absolute top-1 right-1 h-5 w-5 rounded-full bg-black/70 backdrop-blur text-white/85 hover:bg-rose-500 hover:text-white inline-flex items-center justify-center opacity-0 group-hover:opacity-100 transition z-[70]"
>
<div className="rounded-lg overflow-hidden border-2 border-violet-300/60 bg-black shadow-2xl" style={{ width: 280 }}>
<div style={{ aspectRatio: aspect }}>
<img src={p.frameSrc} alt="" className="w-full h-full object-cover" />
</div>
<div className="px-2 py-1 bg-black/80 text-white text-[10.5px] flex items-center justify-between">
<span> {p.frameIdx + 1}</span>
<span className="shrink-0 font-mono text-white/55">{p.timestamp.toFixed(2)}s</span>
</div>
</div>
</div>
<X className="h-3 w-3" />
</button>
)}
<HoverPreview
imgSrc={p.frameSrc}
aspect={aspect}
label={`分镜 ${p.frameIdx + 1} · ${p.name}`}
caption={`${p.timestamp.toFixed(2)}s`}
borderClass="border-violet-300/60"
pinned={isPinned}
onClose={() => setPinnedPreviewCutout(null)}
/>
</div>
)
})}