"use client"; import React, { useRef, useState } from "react"; import { cn } from "@/lib/utils"; export interface SpotlightCardProps extends React.HTMLAttributes { spotlightColor?: string; } export const SpotlightCard = React.forwardRef< HTMLDivElement, SpotlightCardProps >( ( { className, children, spotlightColor = "rgba(59, 130, 246, 0.15)", ...props }, ref, ) => { const divRef = useRef(null); const [position, setPosition] = useState<{ x: number; y: number }>({ x: 0, y: 0, }); const [opacity, setOpacity] = useState(0); const handleMouseMove = (e: React.MouseEvent) => { const card = divRef.current; if (!card) return; const rect = card.getBoundingClientRect(); setPosition({ x: rect.width > 0 ? (e.clientX - rect.left) * card.offsetWidth / rect.width : 0, y: rect.height > 0 ? (e.clientY - rect.top) * card.offsetHeight / rect.height : 0, }); }; const handleMouseEnter = () => { setOpacity(1); }; const handleMouseLeave = () => { setOpacity(0); }; return (
{ divRef.current = node; if (typeof ref === "function") { ref(node); } else if (ref) { ref.current = node; } }} onMouseMove={handleMouseMove} onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave} className={cn( "relative overflow-hidden rounded-xl border border-zinc-200 bg-white/80 p-6 backdrop-blur-md transition-colors duration-200 hover:border-zinc-300 dark:border-zinc-800 dark:bg-zinc-950/60 dark:hover:border-zinc-700", className, )} {...props} >
{children}
); }, ); SpotlightCard.displayName = "SpotlightCard";