Can you turn this solid js component into a astro component
const ProjectCard = (props: ProjectProps) => {
let divRef: HTMLDivElement;
const [isFocused, setIsFocused] = createSignal(false);
const [position, setPosition] = createSignal({ x: 0, y: 0 });
const [opacity, setOpacity] = createSignal(0);
const handleMouseMove = (e: MouseEvent) => {
if (!divRef || isFocused()) return;
const rect = divRef.getBoundingClientRect();
setPosition({ x: e.clientX - rect.left, y: e.clientY - rect.top });
};
const handleFocus = () => {
setIsFocused(true);
setOpacity(1);
};
const handleBlur = () => {
setIsFocused(false);
setOpacity(0);
};
const handleMouseEnter = () => {
setOpacity(1);
};
const handleMouseLeave = () => {
setOpacity(0);
};
createEffect(() => {
divRef.addEventListener("mousemove", handleMouseMove);
return () => {
divRef.removeEventListener("mousemove", handleMouseMove);
};
});
return (
<div
ref={(el) => (divRef = el)}
onFocus={handleFocus}
onBlur={handleBlur}
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
class="relative flex h-56 w-96 overflow-hidden rounded-xl border border-gray-800 px-8 py-10 shadow-2xl"
>
<div class="flex flex-col w-full h-full">
<div class="flex justify-between items-center">
<p class="text-xl font-medium text-gray-200 pb-2">{props.name}</p>
</div>
<p class="text-slate-300 font-light">{props.description}</p>
<div class="flex gap-2 mt-auto flex-wrap">
</div>
</div>
<div
class="pointer-events-none absolute -inset-px opacity-0 transition duration-200"
style={{
opacity: opacity(),
background: radial-gradient(600px circle at ${position().x}px ${position().y}px, rgba(55, 55, 75, .4), transparent 40%),
}}
/>
</div>
);
};
export default ProjectCard;