From 8a3f0bea15b0fd96b22c687ecae9a8fea47306b0 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 19 Apr 2026 09:50:49 +0800 Subject: [PATCH] Add pure text resource nodes --- .../canvas/LiblibVideoCanvasReplica.tsx | 92 ++++++++++++++++--- 1 file changed, 78 insertions(+), 14 deletions(-) diff --git a/components/canvas/LiblibVideoCanvasReplica.tsx b/components/canvas/LiblibVideoCanvasReplica.tsx index 065b677d9..1550e66c9 100644 --- a/components/canvas/LiblibVideoCanvasReplica.tsx +++ b/components/canvas/LiblibVideoCanvasReplica.tsx @@ -379,8 +379,8 @@ const PRESET_VIEWPORT = { x: 144, y: 100, zoom: 0.77 }; const PRESET_WORKFLOW_CENTER = { x: 1024, y: 512 }; const CANVAS_EXTENT = 20000; const OFFICIAL_NODE_GAP = 100; -const OFFICIAL_TEXT_RESOURCE_HEIGHT = 232; -const OFFICIAL_TEXT_RESOURCE_WIDTH = 350; +const OFFICIAL_TEXT_RESOURCE_HEIGHT = 330; +const OFFICIAL_TEXT_RESOURCE_WIDTH = 560; const OFFICIAL_IMAGE_TOOLBAR_SCALE = 0.7; const OFFICIAL_COMPOSER_SCALE = 0.546; const OFFICIAL_ZOOM_DOCK_SCALE = 0.65; @@ -1420,13 +1420,16 @@ function inferLegacyTargetModuleKind(node: CloneNode): AddModuleKind | null { return null; } -function normalizeTextResourceNode(node: CloneNode): CloneNode { +function normalizeTextResourceNode(node: CloneNode, fallbackIndex: number): CloneNode { const shouldUseOfficialSize = Boolean(node.draftValues?.manualEditing) || /^(文本|文本生成|文本节点)/.test(String(node.title || "")); + const title = node.title && !/^(文本|文本生成|文本节点)(\s*\d+)?$/.test(node.title) + ? node.title + : `文本节点 ${extractTrailingNumber(node.title) || fallbackIndex}`; return { ...node, kind: "script", - title: node.title && !/文本生成|文本节点/.test(node.title) ? node.title : "文本", + title, subtitle: "文本资源", inputType: "text", width: shouldUseOfficialSize ? OFFICIAL_TEXT_RESOURCE_WIDTH : node.width > 260 ? node.width : OFFICIAL_TEXT_RESOURCE_WIDTH, @@ -1488,7 +1491,7 @@ function normalizeTargetModuleNode(node: CloneNode, kind: AddModuleKind, fallbac function normalizeRestoredNode(node: CloneNode, fallbackIndex: number): CloneNode { const action = getDraftString(node, "action"); if (action === "TEXT_RESOURCE" && !getPresetMode(node)) { - return normalizeTextResourceNode(node); + return normalizeTextResourceNode(node, fallbackIndex); } const kind = getTargetModuleKind(node) || inferLegacyTargetModuleKind(node); @@ -2080,15 +2083,14 @@ export function LiblibVideoCanvasReplica({ canvasId, isLoading = false }: Liblib switch (actionLabel) { case "自己编写内容": { - draftUpdates = { - action: "TEXT_GENERATE", - content: Array.isArray(anchor.draftValues?.content) ? anchor.draftValues?.content : [], - manualEditing: true, - manualTextComposer: true, - nodeType: "text", - }; - selectedId = anchor.id; - toast.success("已打开文本编写对话框"); + const textNode = createTextResourceNode({ + content: "", + title: `文本节点 ${nodes.length + nextNodes.length + 1}`, + x: rightX, + y: centerY(OFFICIAL_TEXT_RESOURCE_HEIGHT), + }); + connectFromAnchor(textNode); + toast.success("已创建纯文本节点"); break; } case "文生视频": { @@ -6362,6 +6364,14 @@ function CloneCanvasNode({ ); } + if (getDraftString(node, "action") === "TEXT_RESOURCE") { + return ( + + + + ); + } + if (node.kind === "media") { return ( @@ -6924,6 +6934,60 @@ function PresetMediaCanvasNode({ node, selected }: { node: CloneNode; selected: ); } +function PureTextResourceCanvasNode({ + node, + onTextResourceChange, + selected, +}: { + node: CloneNode; + onTextResourceChange: (content: string) => void; + selected: boolean; +}) { + const contentValues = node.draftValues?.content; + const textContent = + Array.isArray(contentValues) && typeof contentValues[0] === "string" + ? contentValues[0] + : ""; + + return ( +
+
+ + {node.title} +
+
+