diff --git a/components/canvas/nodes/ImageNode.tsx b/components/canvas/nodes/ImageNode.tsx index c21b3f742..88477d4a8 100644 --- a/components/canvas/nodes/ImageNode.tsx +++ b/components/canvas/nodes/ImageNode.tsx @@ -1,7 +1,6 @@ "use client"; import { - AlertCircle, Blend, Box, Camera, @@ -51,6 +50,17 @@ import { AgentExecutionSnapshotDialog } from "@/components/agents/AgentExecution import { DetailSurfaceOverlayRenderer } from "@/components/canvas/DetailSurfaceOverlayRenderer"; import { DetailUiDomRenderer } from "@/components/canvas/DetailUiDomRenderer"; import { CanvasToolbarIcon } from "@/components/canvas/CanvasToolbarIcon"; +import { ImageNodeAdjustOverlays } from "@/components/canvas/nodes/image-node/image-node-adjust-overlays"; +import { + ImageNodeDeferredLoadState, + ImageNodeEmptyState, + ImageNodeProcessingOverlay, +} from "@/components/canvas/nodes/image-node/image-node-empty-state"; +import { + PromptRegenerateDialog, + ThreeDGenerationDialog, +} from "@/components/canvas/nodes/image-node/image-node-dialogs"; +import { ImageNodeSelectedTitle } from "@/components/canvas/nodes/image-node/image-node-title"; import { ImageAnnotator } from "@/components/image-annotator"; import { SceneFusionDialog } from "@/components/scene-fusion-dialog"; import { Button } from "@/components/ui/button"; @@ -70,13 +80,6 @@ import { } from "@/components/ui/dropdown-menu"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@/components/ui/select"; import { Slider } from "@/components/ui/slider"; import { Textarea } from "@/components/ui/textarea"; import { @@ -327,9 +330,6 @@ const ANGLE_PREVIEW_HORIZONTAL_RING_ROTATIONS = [ ]; const ANGLE_PREVIEW_DIAGONAL_RING_ROTATIONS = [-62, -40, -18, 8, 34, 58]; const DEFAULT_CROP_PRESET_ID = "1:1"; -const IMAGE_ADJUST_NOISE_DATA_URI = `data:image/svg+xml;utf8,${encodeURIComponent( - "" -)}`; const DEFAULT_IMAGE_ADJUSTMENTS: ImageAdjustmentState = { light: 0, exposure: 0, @@ -1772,12 +1772,11 @@ export function ImageNode({ ); const selectedTitleStyle = useMemo( () => ({ - top: `${-28 * nodeContentScale}px`, - transform: `scale(${nodeContentScale})`, - transformOrigin: "bottom left", - width: `${100 / nodeContentScale}%`, + fontSize: 12, + lineHeight: "16px", + top: -28, }), - [nodeContentScale] + [] ); const detailProgressLabel = typeof data.metadata?.detailProgressLabel === "string" @@ -7582,107 +7581,12 @@ export function ImageNode({ }, [boxCutoutMetrics]); const renderImageAdjustmentOverlays = useCallback(() => { - if (!hasActiveImageAdjustments) return null; - - const temperatureOpacity = Math.min( - 0.38, - Math.abs(activeImageAdjustments.temperature) / 260 - ); - const tintOpacity = Math.min( - 0.28, - Math.abs(activeImageAdjustments.tint) / 300 - ); - const grainOpacity = Math.min(0.28, activeImageAdjustments.grain / 340); - const vignetteOpacity = Math.min( - 0.42, - activeImageAdjustments.vignette / 180 - ); - const softLightOpacity = Math.min( - 0.24, - activeImageAdjustments.softLight / 320 - ); - const glowOpacity = Math.min(0.22, activeImageAdjustments.glow / 280); - return ( - <> - {temperatureOpacity > 0 ? ( -
= 0 - ? "linear-gradient(135deg, rgba(255,188,109,0.9), rgba(255,232,194,0.42))" - : "linear-gradient(135deg, rgba(109,180,255,0.86), rgba(219,240,255,0.36))", - mixBlendMode: "soft-light", - opacity: temperatureOpacity, - }} - /> - ) : null} - {tintOpacity > 0 ? ( -
= 0 - ? "linear-gradient(135deg, rgba(244,105,214,0.78), rgba(255,203,236,0.28))" - : "linear-gradient(135deg, rgba(76,214,141,0.76), rgba(194,255,221,0.28))", - mixBlendMode: "overlay", - opacity: tintOpacity, - }} - /> - ) : null} - {softLightOpacity > 0 ? ( -
- ) : null} - {glowOpacity > 0 ? ( -
- ) : null} - {vignetteOpacity > 0 ? ( -
- ) : null} - {grainOpacity > 0 ? ( -
- ) : null} - + ); }, [ activeImageAdjustments, @@ -7776,54 +7680,17 @@ export function ImageNode({ <> {/* 选中时在图片上方显示标题 */} {isSelected && !isMultiSelected && data.src && !sceneFusionDialogOpen && ( -
setIsEditingTitle(false)} + onDraftTitleChange={setDraftTitle} + onSaveTitle={handleSaveTitle} + onStartEditing={() => setIsEditingTitle(true)} + resolutionLabel={resolutionLabel} style={selectedTitleStyle} - > -
- - {isEditingTitle ? ( - setDraftTitle(e.target.value)} - onClick={(e) => e.stopPropagation()} - onKeyDown={(e) => { - if (e.key === "Enter") { - e.preventDefault(); - handleSaveTitle(); - } else if (e.key === "Escape") { - e.preventDefault(); - setDraftTitle(displayTitle); - setIsEditingTitle(false); - } - }} - onMouseDown={(e) => e.stopPropagation()} - onPointerDown={(e) => e.stopPropagation()} - value={draftTitle} - /> - ) : ( - { - e.stopPropagation(); - setDraftTitle(displayTitle); - setIsEditingTitle(true); - }} - title="双击重命名" - > - {displayTitle} - - )} -
- {resolutionLabel ? ( - - {resolutionLabel} - - ) : null} -
+ /> )}
{!shouldRequestDisplayImage ? ( -
-
- - 图片即将进入视口时加载 -
-
+ ) : isCompareMode && hasCompareSource ? (
)}
- ) : data.status === "generating" ? ( -
- - - - - {detailProgressLabel || "生成中..."} - - 图片处理中 -
- ) : data.status === "failed" ? ( -
- - - - - 生成失败 - - 请重新上传或再试一次 -
) : ( -
- - - - - 上传图片 - - - 添加参考图、角色图或关键帧素材 - - {/* 隐藏的文件输入 */} - - {/* 选择文件按钮 */} - -
+ )} {/* 处理中遮罩 */} {isProcessing && ( -
-
- - - - 处理中... -
-
+ )} {/* 工具栏使用 Portal 渲染到 body,避免被裁剪 */} @@ -8924,159 +8739,30 @@ export function ImageNode({ ) : null} {/* 提示词重绘对话框 */} - - - - - - 提示词重绘 - - -
-

- 在保留当前图片主体的基础上,用新提示词生成一张新图。原图不会被覆盖。 -

-
- -