File size: 1,023 Bytes
cd6f98e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import clsx from "clsx";
import { motion, useMotionTemplate } from "framer-motion";
import React from "react";

import { useMouseMovement } from "../hooks/useMouseMovement";

const colors = {
  blue: "bg-gradient-to-r from-sky-500/30 to-sky-500/20",
  purple: "bg-gradient-to-r from-purple-500/30 to-purple-500/20",
} as const;

interface Props {
  color: keyof typeof colors;
}

const Highlight = (props: Props) => {
  const { mouseX, mouseY, onMouseMove } = useMouseMovement();

  const maskImage = useMotionTemplate`radial-gradient(200px at ${mouseX}px ${mouseY}px, white, transparent)`;
  const style = { maskImage, WebkitMaskImage: maskImage };

  return (
    <div className="absolute inset-0 z-10 h-full w-full" onMouseMove={onMouseMove}>
      <motion.div
        className={clsx(
          "pointer-events-none h-full w-full rounded-xl opacity-0 transition duration-300 group-hover:opacity-100",
          colors[props.color]
        )}
        style={style}
      />
    </div>
  );
};

export default Highlight;