diff --git a/src/components/auto-image/single-image.tsx b/src/components/auto-image/single-image.tsx index 0e322de5..3a1a0e3b 100644 --- a/src/components/auto-image/single-image.tsx +++ b/src/components/auto-image/single-image.tsx @@ -115,9 +115,7 @@ const SingleImage: React.FC = (props) => { )} <> @@ -158,10 +156,11 @@ const SingleImage: React.FC = (props) => { }} > diff --git a/src/components/markdown-viewer/index.less b/src/components/markdown-viewer/index.less index 15f17278..fe31ca98 100644 --- a/src/components/markdown-viewer/index.less +++ b/src/components/markdown-viewer/index.less @@ -1,5 +1,6 @@ .markdown-viewer { font-family: var(--font-family) !important; + word-wrap: break-word; .hr { border: none; diff --git a/src/pages/llmodels/components/instance-item.tsx b/src/pages/llmodels/components/instance-item.tsx index d5636c06..838e9cfa 100644 --- a/src/pages/llmodels/components/instance-item.tsx +++ b/src/pages/llmodels/components/instance-item.tsx @@ -311,7 +311,7 @@ const InstanceItem: React.FC = ({ ); const renderDistributionInfo = useCallback( - (severList: any[], label: string) => { + (severList: any[]) => { if (!severList.length) { return null; } @@ -340,7 +340,7 @@ const InstanceItem: React.FC = ({ > {intl.formatMessage({ - id: label + id: 'models.table.acrossworker' })} @@ -468,12 +468,10 @@ const InstanceItem: React.FC = ({ > {renderOffloadInfo} {renderDistributionInfo( - instanceData.distributed_servers?.rpc_servers || [], - 'models.table.llamaAcrossworker' + instanceData.distributed_servers?.rpc_servers || [] )} {renderDistributionInfo( - instanceData.distributed_servers?.ray_actors || [], - 'models.table.vllmAcrossworker' + instanceData.distributed_servers?.ray_actors || [] )} diff --git a/src/pages/playground/components/canvas-zoom.tsx b/src/pages/playground/components/canvas-zoom.tsx new file mode 100644 index 00000000..b64dd2b7 --- /dev/null +++ b/src/pages/playground/components/canvas-zoom.tsx @@ -0,0 +1,74 @@ +import { useEffect, useRef, useState } from 'react'; + +const ImageCanvas = ({ imageUrl }) => { + const canvasRef = useRef(null); + const [scale, setScale] = useState(1); + const [offset, setOffset] = useState({ x: 0, y: 0 }); + const [image, setImage] = useState(null); + const requestRef = useRef(); + + // 加载图片 + useEffect(() => { + const img = new Image(); + img.src = imageUrl; + img.onload = () => { + setImage(img); + }; + }, [imageUrl]); + + // 绘制图片 + const drawImage = () => { + const canvas = canvasRef.current; + const ctx = canvas.getContext('2d'); + ctx.clearRect(0, 0, canvas.width, canvas.height); + + if (image) { + ctx.save(); + ctx.translate(offset.x, offset.y); + ctx.scale(scale, scale); + ctx.drawImage(image, 0, 0); + ctx.restore(); + } + + // 请求下一帧绘制 + requestRef.current = requestAnimationFrame(drawImage); + }; + + // 启动动画循环 + useEffect(() => { + requestRef.current = requestAnimationFrame(drawImage); + return () => cancelAnimationFrame(requestRef.current); + }, [image, scale, offset]); + + // 处理滚轮事件 + const handleWheel = (event) => { + event.preventDefault(); + const { deltaY, clientX, clientY } = event; + const canvas = canvasRef.current; + const rect = canvas.getBoundingClientRect(); + const mouseX = clientX - rect.left; + const mouseY = clientY - rect.top; + + const zoomFactor = deltaY > 0 ? 0.9 : 1.1; // 缩小或放大 + const newScale = scale * zoomFactor; + + // 计算新的偏移量,确保以鼠标位置为中心缩放 + const newOffsetX = mouseX - (mouseX - offset.x) * zoomFactor; + const newOffsetY = mouseY - (mouseY - offset.y) * zoomFactor; + + setScale(newScale); + setOffset({ x: newOffsetX, y: newOffsetY }); + }; + + return ( + + ); +}; + +export default ImageCanvas;