From 72f57ec3d80b1ad69b20eebc343a1ffe2c84bde6 Mon Sep 17 00:00:00 2001 From: schererleander Date: Fri, 6 Jun 2025 11:34:42 +0200 Subject: add spotlight hover effect --- src/components/CardLink.tsx | 74 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 62 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/components/CardLink.tsx b/src/components/CardLink.tsx index 3492038..01d277b 100644 --- a/src/components/CardLink.tsx +++ b/src/components/CardLink.tsx @@ -1,3 +1,4 @@ +import { useRef, useState } from "react"; import ExternalLinkIcon from "./ExternalLink"; interface Props { @@ -8,22 +9,71 @@ interface Props { } export default function CardLink({ title, body, href, imgSrc }: Props) { - const Wrapper = href ? 'a' : 'div'; + const divRef = useRef(null); + const [position, setPosition] = useState({ x: 0, y: 0 }); + const [opacity, setOpacity] = useState(0); + + const handleMouseMove: React.MouseEventHandler = (e) => { + if (!divRef.current) return; + const rect = divRef.current.getBoundingClientRect(); + setPosition({ x: e.clientX - rect.left, y: e.clientY - rect.top }); + }; + + const handleMouseEnter = () => setOpacity(0.6); + const handleMouseLeave = () => setOpacity(0); + return ( - window.open(href, "_blank", "noopener,noreferrer"), + role: "link", + tabIndex: 0, })} - className="group flex items-center gap-4 py-2 px-2 rounded-lg" > - -
+ {/* Spotlight overlay - light */} +
+ + {/* Spotlight overlay - dark mode */} +
+ + {/* Content */} + {imgSrc && ( + {title} + )} +

{title}

-

{body}

+

{body}

- {href && } - + {href &&
} +
); -} \ No newline at end of file +} -- cgit v1.3.1