File size: 1,059 Bytes
f56a29b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
import { motion } from 'motion/react';
import type { ReactNode } from 'react';
import type { PercentageGeometry } from '@/lib/types/action';
interface ZoomWrapperProps {
children: ReactNode;
zoomTarget: { elementId: string; scale: number } | null;
geometry: PercentageGeometry | null;
}
/**
* 缩放包装器组件
*
* 功能:
* - 包裹整个画布,根据 zoomTarget 进行缩放
* - 以元素中心为缩放原点
* - 使用百分比坐标系统
*/
export function ZoomWrapper({ children, zoomTarget, geometry }: ZoomWrapperProps) {
if (!zoomTarget || !geometry) {
return <>{children}</>;
}
const { scale } = zoomTarget;
const { centerX, centerY } = geometry;
return (
<motion.div
className="w-full h-full"
initial={{ scale: 1 }}
animate={{ scale }}
exit={{ scale: 1 }}
transition={{
type: 'spring',
stiffness: 200,
damping: 25,
}}
style={{
transformOrigin: `${centerX}% ${centerY}%`,
}}
>
{children}
</motion.div>
);
}
|