"use client" import { X } from "lucide-react" /** * 视觉类节点统一大预览: * - **在 ReactFlow 节点 DOM 内**作为 absolute 元素,底边贴当前缩略图上方边缘 * - 跟随 ReactFlow 画布 pan/zoom 一起变化(属于"无限画布"的一部分) * - 媒体按"自然像素分辨率"渲染,不做 max 尺寸限制 * - 不 pinned 时:pointer-events-none,依赖调用方传入 visible * - pinned=true:强制 visible,pointer-events 开启,可点 × 关闭 * - 用法:渲染在节点根层,不要放进 overflow-x-auto 缩略图滚动条里 */ interface Props { imgSrc?: string videoSrc?: string poster?: string aspect?: string label?: string caption?: string borderClass?: string visible?: boolean anchorX?: number anchorY?: number pinned?: boolean onClose?: () => void } export function HoverPreview({ imgSrc, videoSrc, poster, aspect, label, caption, borderClass = "border-violet-300/55", visible = false, anchorX, anchorY, pinned = false, onClose, }: Props) { const shown = pinned || visible const visibilityCls = shown ? pinned ? "opacity-100 pointer-events-auto" : "opacity-100 pointer-events-none" : "pointer-events-none opacity-0" return (
{videoSrc ? (
) }