From 5b7d6a6e89a7386a382608c70f8cf0d8d8629852 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 24 Apr 2026 16:36:06 +0800 Subject: [PATCH] feat: add home theme selector and canvas polish --- components/canvas/CanvasChatPanel.tsx | 20 ++-- components/canvas/nodes/World3DNode.tsx | 55 +++++++++- components/canvas/world3d/World3DViewer.tsx | 33 ++++++ components/home/lovart-home.tsx | 112 +++++++++++++++++++- 4 files changed, 205 insertions(+), 15 deletions(-) diff --git a/components/canvas/CanvasChatPanel.tsx b/components/canvas/CanvasChatPanel.tsx index 61a3d601f..9b097e441 100644 --- a/components/canvas/CanvasChatPanel.tsx +++ b/components/canvas/CanvasChatPanel.tsx @@ -9627,10 +9627,10 @@ export function CanvasChatPanel({ {message.role === 'user' ? (
@@ -9653,7 +9653,7 @@ export function CanvasChatPanel({ "inline-flex items-center gap-1 rounded-xl px-2 py-1 text-xs", isVideoWorkspace ? "border border-border/60 bg-background" - : "bg-white/90" + : "border border-black/5 bg-white/90 text-[#334155] dark:border-white/10 dark:bg-white/10 dark:text-zinc-100" )} > - {part.name || 'Image'} + {part.name || 'Image'} ); return; @@ -9680,7 +9680,7 @@ export function CanvasChatPanel({ .trim(); if (!text) return; renderedUserParts.push( - {text} + {text} ); } }); @@ -9694,7 +9694,7 @@ export function CanvasChatPanel({ renderedUserParts.push( - {att.name || 'Image'} + {att.name || 'Image'} ); }); @@ -9719,7 +9719,7 @@ export function CanvasChatPanel({ extractUserTextPrompt(message as any) || (isVideoModel ? "已发送视频生成请求" : "已发送请求"); renderedUserParts.push( - + {fallbackText} ); @@ -9733,7 +9733,7 @@ export function CanvasChatPanel({ <>
getNodeContentScale(node.size, { width: 420, height: 320 }, 0.76), [node.size.height, node.size.width] ); + const overlayChromeScale = useMemo( + () => clampNumber(getNodeContentScale(node.size, { width: 420, height: 320 }, 0.48), 0.48, 1), + [node.size.height, node.size.width] + ); const placeholderViewportScale = useMemo( () => clampNumber( @@ -223,6 +227,37 @@ export function World3DNode({ }), [placeholderViewportScale] ); + const topLeftControlsStyle = useMemo( + () => ({ + transform: `scale(${overlayChromeScale})`, + transformOrigin: "top left", + }), + [overlayChromeScale] + ); + const topRightControlsStyle = useMemo( + () => ({ + transform: `scale(${overlayChromeScale})`, + transformOrigin: "top right", + }), + [overlayChromeScale] + ); + const bottomOverlayStyle = useMemo( + () => ({ + paddingLeft: `${12 * overlayChromeScale}px`, + paddingRight: `${12 * overlayChromeScale}px`, + paddingBottom: `${12 * overlayChromeScale}px`, + paddingTop: `${48 * overlayChromeScale}px`, + }), + [overlayChromeScale] + ); + const bottomOverlayContentStyle = useMemo( + () => ({ + transform: `scale(${overlayChromeScale})`, + transformOrigin: "bottom left", + width: `${100 / overlayChromeScale}%`, + }), + [overlayChromeScale] + ); const captureEnabled = data.status === "completed" && (activeView === "splat" || activeView === "mesh"); const handleSetView = (view: World3DViewMode) => { @@ -457,8 +492,14 @@ export function World3DNode({ />
-
-
+
+

{data.prompt || "3D 世界"} @@ -485,7 +526,10 @@ export function World3DNode({ )} -

+
{VIEW_META.filter((view) => availableViews.includes(view.id)).map((view) => ( (() => { @@ -569,7 +613,10 @@ export function World3DNode({
{isHovered && data.status === "completed" && ( -
+