From 193b03d6776aaef8f98e273d41929027258e2af7 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 19 Apr 2026 09:04:55 +0800 Subject: [PATCH] Fix text module composer replica --- .../canvas/LiblibVideoCanvasReplica.tsx | 123 ++++++++++++++++-- 1 file changed, 109 insertions(+), 14 deletions(-) diff --git a/components/canvas/LiblibVideoCanvasReplica.tsx b/components/canvas/LiblibVideoCanvasReplica.tsx index cbc26ef6f..2b9d57288 100644 --- a/components/canvas/LiblibVideoCanvasReplica.tsx +++ b/components/canvas/LiblibVideoCanvasReplica.tsx @@ -387,6 +387,8 @@ const OFFICIAL_ZOOM_DOCK_SCALE = 0.5; const PROMPT_COMPOSER_BASE_WIDTH = 895; const PROMPT_COMPOSER_BASE_HEIGHT = 286; const PRESET_COMPOSER_BASE_HEIGHT = 238; +const TEXT_MODULE_COMPOSER_WIDTH = 1274; +const TEXT_MODULE_COMPOSER_HEIGHT = 270; const MULTI_VIEW_NINE_GRID_PROMPT = "以选中图片为角色/主体参考,生成多视角 3x3 九宫格分镜图。保持主体一致,九个镜头包含远景、全身、侧身、背面、半身、近景、局部细节等视角,使用清晰黑色分割线分隔每一格,白色或干净背景。"; const NINE_GRID_CELL_VISUALS: GridCellVisual[] = [ @@ -2080,23 +2082,15 @@ export function LiblibVideoCanvasReplica({ canvasId, isLoading = false }: Liblib switch (actionLabel) { case "自己编写内容": { - anchorUpdates = { - kind: "script", - title: "文本", - subtitle: "文本资源", - inputType: "text", - width: OFFICIAL_TEXT_RESOURCE_WIDTH, - height: OFFICIAL_TEXT_RESOURCE_HEIGHT, - }; draftUpdates = { - action: "TEXT_RESOURCE", - content: [], + action: "TEXT_GENERATE", + content: Array.isArray(anchor.draftValues?.content) ? anchor.draftValues?.content : [], manualEditing: true, + manualTextComposer: true, nodeType: "text", - scriptRole: "resource", - viewMode: undefined, }; - toast.success("已切换为文本编写节点"); + selectedId = anchor.id; + toast.success("已打开文本编写对话框"); break; } case "文生视频": { @@ -3321,6 +3315,8 @@ export function LiblibVideoCanvasReplica({ canvasId, isLoading = false }: Liblib const selectedPresetControlNode = isOfficialImageControlNode(selectedNode) ? selectedNode : null; const selectedPresetMode = getPresetMode(selectedPresetControlNode); const selectedTargetModuleKind = selectedNode ? getTargetModuleKind(selectedNode) : null; + const selectedTextResourceNode = + selectedNode && getDraftString(selectedNode, "action") === "TEXT_RESOURCE" ? selectedNode : null; const selectedPresetAnchor = useMemo(() => { if (!selectedPresetControlNode) return null; return { @@ -3330,6 +3326,15 @@ export function LiblibVideoCanvasReplica({ canvasId, isLoading = false }: Liblib zoom: viewport.zoom, }; }, [selectedPresetControlNode, viewport.x, viewport.y, viewport.zoom]); + const selectedTargetAnchor = useMemo(() => { + if (!selectedNode || !selectedTargetModuleKind) return null; + return { + bottomY: Math.round(viewport.y + (selectedNode.y + selectedNode.height) * viewport.zoom), + centerX: Math.round(viewport.x + (selectedNode.x + selectedNode.width / 2) * viewport.zoom), + topY: Math.round(viewport.y + selectedNode.y * viewport.zoom), + zoom: viewport.zoom, + }; + }, [selectedNode, selectedTargetModuleKind, viewport.x, viewport.y, viewport.zoom]); return (
) : null} + {selectedNode && selectedTargetModuleKind === "text" && selectedTargetAnchor ? ( + { + setNodes((current) => + current.map((node) => + node.id === selectedNode.id + ? { + ...node, + draftValues: { + ...(node.draftValues || {}), + content: prompt ? [prompt] : [], + manualEditing: true, + manualTextComposer: true, + params: { + ...((node.draftValues?.params as Record | undefined) || {}), + prompt, + }, + }, + } + : node + ) + ); + toast.success("文本内容已写入当前模块"); + }} + /> + ) : null} + ) : null} - {selectedNode && !selectedPresetControlNode && !selectedTargetModuleKind ? ( + {selectedNode && !selectedPresetControlNode && !selectedTargetModuleKind && !selectedTextResourceNode ? ( void; +}) { + const contentValues = node.draftValues?.content; + const initialPrompt = + Array.isArray(contentValues) && typeof contentValues[0] === "string" ? contentValues[0] : ""; + const [prompt, setPrompt] = useState(initialPrompt); + + useEffect(() => { + setPrompt(initialPrompt); + }, [initialPrompt, node.id]); + + return ( +
+
+