diff --git a/src/features/canvas/CanvasMarkingPopover.tsx b/src/features/canvas/CanvasMarkingPopover.tsx
new file mode 100644
index 0000000..2c482af
--- /dev/null
+++ b/src/features/canvas/CanvasMarkingPopover.tsx
@@ -0,0 +1,40 @@
+interface CanvasMarkingPopoverProps {
+ value?: string;
+ placeholder: string;
+ onChange: (value: string) => void;
+ onClear: () => void;
+ onDone: () => void;
+}
+
+export function CanvasMarkingPopover({
+ value,
+ placeholder,
+ onChange,
+ onClear,
+ onDone,
+}: CanvasMarkingPopoverProps) {
+ return (
+
event.stopPropagation()}
+ onClick={(event) => event.stopPropagation()}
+ >
+
+ );
+}
diff --git a/src/features/canvas/CanvasPage.tsx b/src/features/canvas/CanvasPage.tsx
index c651b21..afb0b55 100644
--- a/src/features/canvas/CanvasPage.tsx
+++ b/src/features/canvas/CanvasPage.tsx
@@ -186,6 +186,7 @@ import {
} from "./canvasWorkflowDeserialize";
import { CanvasNodeToolbar, CanvasNodeVideoPlayer, CanvasSelectChip } from "./canvasComponents";
import type { CanvasNodeToolbarAction } from "./canvasComponents";
+import { CanvasMarkingPopover } from "./CanvasMarkingPopover";
import { CanvasPromptMentionTextarea, CanvasTextPromptComposer } from "./CanvasTextPromptComposer";
import { CanvasMultiGridPanel, CanvasUpscalePanel, CanvasInpaintPanel } from "./canvasToolPanels";
import { CanvasSmoothedProgressRing } from "./CanvasSmoothedProgressRing";
@@ -4472,47 +4473,23 @@ function CanvasPage({
>
标记
- {markingPopoverNodeId === imageNode.id && (
- e.stopPropagation()}
- onClick={(e) => e.stopPropagation()}
- >
-
- )}
+ {markingPopoverNodeId === imageNode.id ? (
+ {
+ setImageNodes((nodes) =>
+ nodes.map((node) => (node.id === imageNode.id ? { ...node, marking: value } : node)),
+ );
+ }}
+ onClear={() => {
+ setImageNodes((nodes) =>
+ nodes.map((node) => (node.id === imageNode.id ? { ...node, marking: "" } : node)),
+ );
+ }}
+ onDone={() => setMarkingPopoverNodeId(null)}
+ />
+ ) : null}
- {markingPopoverNodeId === videoNode.id && (
- e.stopPropagation()}
- onClick={(e) => e.stopPropagation()}
- >
-
- )}
+ {markingPopoverNodeId === videoNode.id ? (
+ {
+ setVideoNodes((nodes) =>
+ nodes.map((node) => (node.id === videoNode.id ? { ...node, marking: value } : node)),
+ );
+ }}
+ onClear={() => {
+ setVideoNodes((nodes) =>
+ nodes.map((node) => (node.id === videoNode.id ? { ...node, marking: "" } : node)),
+ );
+ }}
+ onDone={() => setMarkingPopoverNodeId(null)}
+ />
+ ) : null}
{cameraMotionDropdownNodeId === videoNode.id && (