xlibs-components
Version:
Modern React component library with Aceternity, MagicUI, and ShadCN components for building beautiful web applications
32 lines (31 loc) • 1.91 kB
JavaScript
"use client";
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { useMotionValue, motion, useMotionTemplate } from "framer-motion";
import { useState } from "react";
import { CanvasRevealEffect } from '../../components/ui/canvas-reveal-effect.js';
import { cn } from '../../lib/utils.js';
export const CardSpotlight = ({ children, radius = 350, color = "#262626", className, ...props }) => {
const mouseX = useMotionValue(0);
const mouseY = useMotionValue(0);
function handleMouseMove({ currentTarget, clientX, clientY, }) {
let { left, top } = currentTarget.getBoundingClientRect();
mouseX.set(clientX - left);
mouseY.set(clientY - top);
}
const [isHovering, setIsHovering] = useState(false);
const handleMouseEnter = () => setIsHovering(true);
const handleMouseLeave = () => setIsHovering(false);
return (_jsxs("div", { className: cn("group/spotlight p-10 rounded-md relative border border-neutral-800 bg-black dark:border-neutral-800", className), onMouseMove: handleMouseMove, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, ...props, children: [_jsx(motion.div, { className: "pointer-events-none absolute z-0 -inset-px rounded-md opacity-0 transition duration-300 group-hover/spotlight:opacity-100", style: {
backgroundColor: color,
maskImage: useMotionTemplate `
radial-gradient(
${radius}px circle at ${mouseX}px ${mouseY}px,
white,
transparent 80%
)
`,
}, children: isHovering && (_jsx(CanvasRevealEffect, { animationSpeed: 0.4, containerClassName: "bg-transparent absolute inset-0 pointer-events-none", colors: [
[59, 130, 246],
[139, 92, 246],
], dotSize: 3, showGradient: false })) }), children] }));
};