"use client" import { X } from "lucide-react" /** * 视觉类节点统一大预览: * - **在 ReactFlow 节点 DOM 内**作为 absolute 元素,贴 thumb 上方边缘(bottom: calc(100% + 10px) + 居中) * - 跟随 ReactFlow 画布 pan/zoom 一起变化(属于"无限画布"的一部分) * - 媒体按"自然像素分辨率"渲染 + max-w/max-h 限制,避免占满整个画布 * - 不 pinned 时:pointer-events-none,依赖 group-hover 显示/隐藏 * - pinned=true:强制 visible,pointer-events 开启,可点 × 关闭 * - 用法:父级容器要带 `group` class,HoverPreview 直接作为子元素 */ interface Props { imgSrc?: string videoSrc?: string poster?: string aspect: string label?: string caption?: string borderClass?: string pinned?: boolean onClose?: () => void } export function HoverPreview({ imgSrc, videoSrc, poster, aspect, label, caption, borderClass = "border-violet-300/55", pinned = false, onClose, }: Props) { const visibilityCls = pinned ? "opacity-100 scale-100 pointer-events-auto" : "pointer-events-none opacity-0 group-hover:opacity-100 scale-95 group-hover:scale-100" return (