From 976e8de4c789d6d07e2e9c1693439dc2a16dc057 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 2 Feb 2026 12:36:12 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E9=A2=84=E8=A7=88=E5=BC=B9=E7=AA=97=E4=BD=8D=E7=BD=AE=EF=BC=8C?= =?UTF-8?q?=E5=9B=BA=E5=AE=9A=E6=98=BE=E7=A4=BA=E5=9C=A8=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E4=B8=8A=E6=96=B9=E5=B9=B6=E9=98=B2=E6=AD=A2=E8=B6=85=E5=87=BA?= =?UTF-8?q?=E8=BE=B9=E7=95=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/canvas/CanvasChatPanel.tsx | 183 ++++++++++++++------------ 1 file changed, 96 insertions(+), 87 deletions(-) diff --git a/components/canvas/CanvasChatPanel.tsx b/components/canvas/CanvasChatPanel.tsx index cdf511a..c9518fe 100644 --- a/components/canvas/CanvasChatPanel.tsx +++ b/components/canvas/CanvasChatPanel.tsx @@ -1425,98 +1425,107 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF - {/* 🆕 标签悬停预览弹窗 */} - {tagPreview && ( -
{ - // 鼠标进入预览弹窗,取消隐藏 - if (previewTimeoutRef.current) { - clearTimeout(previewTimeoutRef.current); - previewTimeoutRef.current = null; - } - }} - onMouseLeave={() => { - // 鼠标离开预览弹窗,隐藏 - setTagPreview(null); - }} - > - {/* 图片全貌 */} -
- {tagPreview.name} - {/* 如果是物品标签,显示标注位置 */} - {tagPreview.pickedObject && ( - <> - {/* 标注点 */} -
- {/* 序号标记 */} -
- {/* 脉冲动画背景 */} -
- {/* 主标记点 */} -
- - - + {/* 🆕 标签悬停预览弹窗 - 固定显示在标签上方 */} + {tagPreview && (() => { + // 计算弹窗位置,确保不超出视口 + const previewWidth = 240; + const previewHeight = 280; // 预估高度 + const padding = 16; + + // 水平位置:居中对齐标签,但确保不超出左右边界 + let left = tagPreview.x - previewWidth / 2; + if (left < padding) left = padding; + if (left + previewWidth > window.innerWidth - padding) { + left = window.innerWidth - previewWidth - padding; + } + + // 垂直位置:显示在标签上方 + let top = tagPreview.y - previewHeight - 12; + if (top < padding) { + // 如果上方空间不够,显示在标签下方 + top = tagPreview.y + 30; + } + + return ( +
{ + // 鼠标进入预览弹窗,取消隐藏 + if (previewTimeoutRef.current) { + clearTimeout(previewTimeoutRef.current); + previewTimeoutRef.current = null; + } + }} + onMouseLeave={() => { + // 鼠标离开预览弹窗,隐藏 + setTagPreview(null); + }} + > + {/* 图片全貌 */} +
+ {tagPreview.name} + {/* 如果是物品标签,显示标注位置 */} + {tagPreview.pickedObject && ( + <> + {/* 标注点 */} +
+ {/* 序号标记 */} +
+ {/* 脉冲动画背景 */} +
+ {/* 主标记点 */} +
+ + + +
-
- {/* 物品名称标签 */} -
- {tagPreview.pickedObject.objectName} -
- - )} -
- {/* 底部信息 */} -
-
- {tagPreview.pickedObject ? tagPreview.pickedObject.objectName : tagPreview.name} + {/* 物品名称标签 */} +
+ {tagPreview.pickedObject.objectName} +
+ + )}
- {tagPreview.pickedObject && ( -
- {tagPreview.pickedObject.objectPosition} + {/* 底部信息 */} +
+
+ {tagPreview.pickedObject ? tagPreview.pickedObject.objectName : tagPreview.name}
- )} + {tagPreview.pickedObject && ( +
+ {tagPreview.pickedObject.objectPosition} +
+ )} +
- {/* 小三角箭头 */} -
-
- )} + ); + })()}
); }