reactbits-mcp-server
Version:
MCP Server for React Bits - Access 99+ React components with animations, backgrounds, and UI elements
93 lines (83 loc) • 2.39 kB
JSX
import { useRef } from "react";
const GlareHover = ({
width = "500px",
height = "500px",
background = "#000",
borderRadius = "10px",
borderColor = "#333",
children,
glareColor = "#ffffff",
glareOpacity = 0.5,
glareAngle = -45,
glareSize = 250,
transitionDuration = 650,
playOnce = false,
className = "",
style = {},
}) => {
const hex = glareColor.replace("#", "");
let rgba = glareColor;
if (/^[\dA-Fa-f]{6}$/.test(hex)) {
const r = parseInt(hex.slice(0, 2), 16);
const g = parseInt(hex.slice(2, 4), 16);
const b = parseInt(hex.slice(4, 6), 16);
rgba = `rgba(${r}, ${g}, ${b}, ${glareOpacity})`;
} else if (/^[\dA-Fa-f]{3}$/.test(hex)) {
const r = parseInt(hex[0] + hex[0], 16);
const g = parseInt(hex[1] + hex[1], 16);
const b = parseInt(hex[2] + hex[2], 16);
rgba = `rgba(${r}, ${g}, ${b}, ${glareOpacity})`;
}
const overlayRef = useRef(null);
const animateIn = () => {
const el = overlayRef.current;
if (!el) return;
el.style.transition = "none";
el.style.backgroundPosition = "-100% -100%, 0 0";
el.offsetHeight;
el.style.transition = `${transitionDuration}ms ease`;
el.style.backgroundPosition = "100% 100%, 0 0";
};
const animateOut = () => {
const el = overlayRef.current;
if (!el) return;
if (playOnce) {
el.style.transition = "none";
el.style.backgroundPosition = "-100% -100%, 0 0";
} else {
el.style.transition = `${transitionDuration}ms ease`;
el.style.backgroundPosition = "-100% -100%, 0 0";
}
};
const overlayStyle = {
position: "absolute",
inset: 0,
background: `linear-gradient(${glareAngle}deg,
hsla(0,0%,0%,0) 60%,
${rgba} 70%,
hsla(0,0%,0%,0) 100%)`,
backgroundSize: `${glareSize}% ${glareSize}%, 100% 100%`,
backgroundRepeat: "no-repeat",
backgroundPosition: "-100% -100%, 0 0",
pointerEvents: "none",
};
return (
<div
className={`relative grid place-items-center overflow-hidden border cursor-pointer ${className}`}
style={{
width,
height,
background,
borderRadius,
borderColor,
...style,
}}
onMouseEnter={animateIn}
onMouseLeave={animateOut}
>
<div ref={overlayRef} style={overlayStyle} />
{children}
</div>
);
};
export default GlareHover;