feat(canvas): improve canvas navigation and prompt panel behavior for better user experience

This commit is contained in:
HouYunFei
2026-08-06 15:57:56 +08:00
parent f8f1b160b0
commit 6ce6b6406c
4 changed files with 18 additions and 15 deletions
+1
View File
@@ -4,6 +4,7 @@
+ [新增] 画布节点提示词输入支持弹窗放大编辑,长提示词和多行内容可在更大空间内修改。 + [新增] 画布节点提示词输入支持弹窗放大编辑,长提示词和多行内容可在更大空间内修改。
+ [修复] 已有图片或文本节点的编辑提示词在关闭输入面板后继续保留,不再因点击画布空白处丢失。 + [修复] 已有图片或文本节点的编辑提示词在关闭输入面板后继续保留,不再因点击画布空白处丢失。
+ [修复] 选择模式下点击画布空白处会同步收起节点顶部工具条和下方输入面板。
+ [新增] 配置页新增本地存储面板,可查看 Infinite Canvas 的 IndexedDB、站点配额和各对象仓库占用情况。 + [新增] 配置页新增本地存储面板,可查看 Infinite Canvas 的 IndexedDB、站点配额和各对象仓库占用情况。
+ [修复] 本地图片清理时保留生图与视频工作台历史引用的文件,避免生成记录仍在但图片丢失。 + [修复] 本地图片清理时保留生图与视频工作台历史引用的文件,避免生成记录仍在但图片丢失。
+ [修复] 画布将空格键专用于临时切换工具,避免按钮保留焦点后按空格被再次触发。 + [修复] 画布将空格键专用于临时切换工具,避免按钮保留焦点后按空格被再次触发。
+1 -1
View File
@@ -7,7 +7,7 @@ description: Implemented changes that still need manual verification
The current release needs manual verification in these areas: The current release needs manual verification in these areas:
- Canvas navigation: the bottom toolbar should switch between Select and Move modes and reflect the active mode with its icon; Select should draw a clearly spaced dashed range whose dash length, gap, and stroke width remain visually constant at every zoom level, while Move should pan from either the background or a node. Holding Control or Space should temporarily invert the active tool without changing the toolbar mode: Select becomes Move, and Move becomes range selection. After clicking any canvas-page button, pressing Space should only invert the tool and must not trigger that button again. Middle-button panning and additive node selection with Shift/Cmd should continue to work, while Space remains available inside text inputs and editable content. - Canvas navigation: the bottom toolbar should switch between Select and Move modes and reflect the active mode with its icon; Select should draw a clearly spaced dashed range whose dash length, gap, and stroke width remain visually constant at every zoom level, while Move should pan from either the background or a node. Clicking blank canvas space in either mode should deselect the current node and close its top toolbar and lower prompt panel. Holding Control or Space should temporarily invert the active tool without changing the toolbar mode: Select becomes Move, and Move becomes range selection. After clicking any canvas-page button, pressing Space should only invert the tool and must not trigger that button again. Middle-button panning and additive node selection with Shift/Cmd should continue to work, while Space remains available inside text inputs and editable content.
- English and Simplified Chinese switching across navigation, settings, titles, descriptions, Ant Design components, and persisted preferences. - English and Simplified Chinese switching across navigation, settings, titles, descriptions, Ant Design components, and persisted preferences.
- Global Dropdown, Menu, Select, Cascader, and TreeSelect popup backgrounds, hover states, and selected states in both light and dark themes. - Global Dropdown, Menu, Select, Cascader, and TreeSelect popup backgrounds, hover states, and selected states in both light and dark themes.
- Canvas node resize stability, prompt scrolling, generated-prompt restoration, edit-prompt persistence after closing an existing image or text node panel, expanded prompt editing with save/cancel behavior and `@` references, image editing, drag-and-drop references, and generation configuration. - Canvas node resize stability, prompt scrolling, generated-prompt restoration, edit-prompt persistence after closing an existing image or text node panel, expanded prompt editing with save/cancel behavior and `@` references, image editing, drag-and-drop references, and generation configuration.
@@ -81,23 +81,21 @@ export function CanvasNodePromptPanel({ node, isRunning, onPromptChange, onConfi
onPointerDown={(event) => event.stopPropagation()} onPointerDown={(event) => event.stopPropagation()}
onWheel={(event) => event.stopPropagation()} onWheel={(event) => event.stopPropagation()}
> >
<div className="relative"> <CanvasPromptChipInput
<CanvasPromptChipInput value={prompt}
value={prompt} references={mentionReferences}
references={mentionReferences} onChange={updatePrompt}
onChange={updatePrompt} onSubmit={submit}
onSubmit={submit} className="thin-scrollbar h-40 w-full cursor-text resize-none rounded-xl px-3 py-2 text-sm leading-5 outline-none"
className="thin-scrollbar h-40 w-full cursor-text resize-none rounded-xl px-3 py-2 pr-10 text-sm leading-5 outline-none" style={{ background: "transparent", color: theme.node.text }}
style={{ background: "transparent", color: theme.node.text }} placeholder={t(`canvas.promptPanel.${mode === "image" && hasImageContent ? "editImage" : mode === "text" && hasTextContent ? "editText" : mode}`)}
placeholder={t(`canvas.promptPanel.${mode === "image" && hasImageContent ? "editImage" : mode === "text" && hasTextContent ? "editText" : mode}`)} />
/>
<Tooltip title={t("canvas.promptPanel.expandEditor")}>
<Button type="text" className="absolute right-1 top-1 !h-8 !w-8 !min-w-8 !rounded-full !bg-transparent !p-0" style={{ color: theme.node.text }} icon={<Maximize2 className="size-3.5" />} onClick={openExpandedEditor} aria-label={t("canvas.promptPanel.expandEditor")} />
</Tooltip>
</div>
<div className="mt-2 flex min-w-0 items-center justify-between gap-2"> <div className="mt-2 flex min-w-0 items-center justify-between gap-2">
<div className="flex min-w-0 items-center gap-2"> <div className="flex min-w-0 items-center gap-2">
<Tooltip title={t("canvas.promptPanel.expandEditor")}>
<Button type="text" className="!h-8 !w-8 !min-w-8 shrink-0 !rounded-full !bg-transparent !p-0" style={{ color: theme.node.text }} icon={<Maximize2 className="size-3.5" />} onClick={openExpandedEditor} aria-label={t("canvas.promptPanel.expandEditor")} />
</Tooltip>
<CanvasPromptLibrary onSelect={updatePrompt} /> <CanvasPromptLibrary onSelect={updatePrompt} />
{mode === "image" ? ( {mode === "image" ? (
<> <>
+4
View File
@@ -975,6 +975,10 @@ function InfiniteCanvasPage() {
setContextMenu(null); setContextMenu(null);
setNodeCreatePosition(null); setNodeCreatePosition(null);
setExpandedImageNodeId(null); setExpandedImageNodeId(null);
setHoveredNodeId(null);
setToolbarNodeId(null);
setDialogNodeId(null);
setEditingNodeId(null);
if (pendingConnectionCreateRef.current) cancelPendingConnectionCreate(); if (pendingConnectionCreateRef.current) cancelPendingConnectionCreate();
if (event.button !== 0) return; if (event.button !== 0) return;