From 12671a1e365a3adb1c09e3640cc1d52436e2b5d0 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 8 May 2026 22:16:33 +0800 Subject: [PATCH] fix: refine angle panel and agent workspace scroll --- .../agents/AgentGenerationWorkspaceDarkV2.tsx | 35 ++++- components/canvas/nodes/ImageNode.tsx | 148 ++++++++++-------- 2 files changed, 120 insertions(+), 63 deletions(-) diff --git a/components/agents/AgentGenerationWorkspaceDarkV2.tsx b/components/agents/AgentGenerationWorkspaceDarkV2.tsx index c4d94252d..0c0d3af96 100644 --- a/components/agents/AgentGenerationWorkspaceDarkV2.tsx +++ b/components/agents/AgentGenerationWorkspaceDarkV2.tsx @@ -5335,8 +5335,39 @@ export function AgentGenerationWorkspaceDarkV2({ currentPsdWorkflowContext?.fifthCategory || "" ).trim(); + useEffect(() => { + if (typeof document === "undefined") { + return; + } + + const html = document.documentElement; + const body = document.body; + const previousHtmlOverflow = html.style.overflow; + const previousBodyOverflow = body.style.overflow; + const previousHtmlOverscrollBehavior = html.style.overscrollBehavior; + const previousBodyOverscrollBehavior = body.style.overscrollBehavior; + const previousHtmlBackgroundColor = html.style.backgroundColor; + const previousBodyBackgroundColor = body.style.backgroundColor; + + html.style.overflow = "hidden"; + body.style.overflow = "hidden"; + html.style.overscrollBehavior = "none"; + body.style.overscrollBehavior = "none"; + html.style.backgroundColor = "#050607"; + body.style.backgroundColor = "#050607"; + + return () => { + html.style.overflow = previousHtmlOverflow; + body.style.overflow = previousBodyOverflow; + html.style.overscrollBehavior = previousHtmlOverscrollBehavior; + body.style.overscrollBehavior = previousBodyOverscrollBehavior; + html.style.backgroundColor = previousHtmlBackgroundColor; + body.style.backgroundColor = previousBodyBackgroundColor; + }; + }, []); + return ( -
+
{/* Main Content */} -
+
{showcaseConfig ? ( " @@ -1642,6 +1645,7 @@ export function ImageNode({ const [angleZoom, setAngleZoom] = useState(50); const [isApplyingAngleEdit, setIsApplyingAngleEdit] = useState(false); const [isAnglePreviewDragging, setIsAnglePreviewDragging] = useState(false); + const [anglePanelOpening, setAnglePanelOpening] = useState(false); const [sceneFusionDialogOpen, setSceneFusionDialogOpen] = useState(false); const [resizeAnnotatorOpen, setResizeAnnotatorOpen] = useState(false); const [promptDialogOpen, setPromptDialogOpen] = useState(false); @@ -1796,6 +1800,19 @@ export function ImageNode({ setAngleZoom(clampNumber(savedSettings.zoom, 0, 100)); } }, [anglePanelOpen, data.metadata]); + useEffect(() => { + if (!anglePanelOpen || typeof window === "undefined") { + setAnglePanelOpening(false); + return; + } + + setAnglePanelOpening(true); + const timer = window.setTimeout(() => { + setAnglePanelOpening(false); + }, 560); + + return () => window.clearTimeout(timer); + }, [anglePanelOpen]); useEffect(() => { const nextDefaultTripoModelId = getDefaultThreeDModelAliasId(publicModelAliasConfig.tripoModels) || @@ -2140,13 +2157,18 @@ export function ImageNode({ }, [angleCameraOrbitPosition]); const angleOrbitWireframeStyle = useMemo( () => ({ - transform: `rotateX(${-angleVerticalAngle * 0.22}deg) rotateY(${angleHorizontalAngle * 0.28}deg) rotateZ(${angleHorizontalAngle * 0.04}deg)`, + transform: `rotateX(${(-angleVerticalAngle * 0.24) + (anglePanelOpening ? 14 : 0)}deg) rotateY(${(angleHorizontalAngle * 0.34) + (anglePanelOpening ? -34 : 0)}deg) rotateZ(${(angleHorizontalAngle * 0.05) + (anglePanelOpening ? 7 : 0)}deg)`, transformStyle: "preserve-3d", transition: isAnglePreviewDragging ? "none" - : "transform 180ms cubic-bezier(0.22, 1, 0.36, 1)", + : `transform ${anglePanelOpening ? 560 : 180}ms cubic-bezier(0.22, 1, 0.36, 1)`, }), - [angleHorizontalAngle, angleVerticalAngle, isAnglePreviewDragging] + [ + angleHorizontalAngle, + anglePanelOpening, + angleVerticalAngle, + isAnglePreviewDragging, + ] ); const angleCameraSceneScale = useMemo( () => Number((0.94 + (angleZoom / 100) * 0.22).toFixed(3)), @@ -3607,8 +3629,8 @@ export function ImageNode({ } const rect = containerRef.current.getBoundingClientRect(); - const panelWidth = ANGLE_PANEL_SOURCE_WIDTH * IMAGE_EDIT_PANEL_SCALE; - const panelHeight = ANGLE_PANEL_SOURCE_HEIGHT * IMAGE_EDIT_PANEL_SCALE; + const panelWidth = ANGLE_PANEL_SOURCE_WIDTH * ANGLE_PANEL_SCALE; + const panelHeight = ANGLE_PANEL_SOURCE_HEIGHT * ANGLE_PANEL_SCALE; const spacing = 16; const maxTop = Math.max(12, window.innerHeight - panelHeight); @@ -4678,6 +4700,7 @@ export function ImageNode({ setTextEditPanelOpen(false); setNotePanelOpen(false); resetBoxCutoutState(); + setAnglePanelOpening(true); setAnglePanelOpen(true); return; } @@ -8219,7 +8242,7 @@ export function ImageNode({ style={{ top: anglePanelPosition.top, left: anglePanelPosition.left, - transform: `scale(${IMAGE_EDIT_PANEL_SCALE})`, + transform: `scale(${ANGLE_PANEL_SCALE})`, transformOrigin: "top left", }} > @@ -8287,61 +8310,64 @@ export function ImageNode({ className="pointer-events-none absolute inset-0 flex items-center justify-center" style={angleOrbitWireframeStyle} > - - {ANGLE_PREVIEW_ORBIT_ROTATIONS.map((rotation, index) => ( - + + {ANGLE_PREVIEW_VERTICAL_RING_ROTATIONS.map((rotation, index) => ( +
))} - {ANGLE_PREVIEW_LATITUDE_RATIOS.map((ratio, index) => ( - ( +
))} - {ANGLE_PREVIEW_MERIDIAN_RATIOS.map((ratio, index) => ( - + + {ANGLE_PREVIEW_DIAGONAL_RING_ROTATIONS.map((rotation, index) => ( + +
+
+ ))} - +