import { Box, BoxProps } from '@chakra-ui/react' import * as React from 'react' import { keyframes } from '@chakra-ui/system' interface ICardBorderClipMeProps extends BoxProps { children: React.ReactNode } const shadowWaveAnimation = keyframes` 0% { border: 2px solid #22D2A0; box-shadow: -10px -10px 0 -2px #040C2D, -10px -10px rgb(122, 235, 228), -20px -20px 0 -2px #040C2D, -20px -20px rgb(215, 255, 103), -30px -30px 0 -2px #040C2D, -30px -30px rgb(237, 137, 54), -40px -40px 0 -2px #040C2D, -40px -40px rgb(245, 101, 101); } 20% { border: 2px solid rgb(245, 101, 101); box-shadow: -10px -10px 0 -2px #040C2D, -10px -10px #22D2A0, -20px -20px 0 -2px #040C2D, -20px -20px rgb(122, 235, 228), -30px -30px 0 -2px #040C2D, -30px -30px rgb(215, 255, 103), -40px -40px 0 -2px #040C2D, -40px -40px rgb(237, 137, 54); } 40% { border: 2px solid rgb(237, 137, 54); box-shadow: -10px -10px 0 -2px #040C2D, -10px -10px rgb(245, 101, 101), -20px -20px 0 -2px #040C2D, -20px -20px #22D2A0, -30px -30px 0 -2px #040C2D, -30px -30px rgb(122, 235, 228), -40px -40px 0 -2px #040C2D, -40px -40px rgb(215, 255, 103); } 60% { border: 2px solid rgb(215, 255, 103); box-shadow: -10px -10px 0 -2px #040C2D, -10px -10px rgb(237, 137, 54), -20px -20px 0 -2px #040C2D, -20px -20px rgb(245, 101, 101), -30px -30px 0 -2px #040C2D, -30px -30px #22D2A0, -40px -40px 0 -2px #040C2D, -40px -40px rgb(122, 235, 228); } 80% { border: 2px solid rgb(122, 235, 228); box-shadow: -10px -10px 0 -2px #040C2D, -10px -10px rgb(215, 255, 103), -20px -20px 0 -2px #040C2D, -20px -20px rgb(237, 137, 54), -30px -30px 0 -2px #040C2D, -30px -30px rgb(245, 101, 101), -40px -40px 0 -2px #040C2D, -40px -40px #22D2A0; } 100% { border: 2px solid #22D2A0; box-shadow: -10px -10px 0 -2px #040C2D, -10px -10px rgb(122, 235, 228), -20px -20px 0 -2px #040C2D, -20px -20px rgb(215, 255, 103), -30px -30px 0 -2px #040C2D, -30px -30px rgb(237, 137, 54), -40px -40px 0 -2px #040C2D, -40px -40px rgb(245, 101, 101); } ` const CardBorderClipMe: React.FunctionComponent = (props) => { const { children, ...styles } = props const cardRef = React.useRef(null) const [clipMeAnimation, setClipMeAnimation] = React.useState(null) const animeTime = 8 React.useEffect(() => { const boxHeight = cardRef?.current?.offsetHeight const boxWidth = cardRef?.current?.offsetWidth const clipDistance = 0.05 const clipHeight = Math.round(boxHeight * (1 + clipDistance * 2)) const clipWidth = Math.round(boxWidth * (1 + clipDistance * 2)) const pathWidth = 2 const clipMe = keyframes` 0%, 100% {clip: rect(0px, ${clipWidth}px, ${pathWidth}px, 0px); } 25% {clip: rect(0px, ${pathWidth}px, ${clipHeight}px, 0px); } 50% {clip: rect(${clipHeight - pathWidth}px, ${clipWidth}px, ${clipHeight}px, 0px); } 75% {clip: rect(0px, ${clipHeight}px, ${clipHeight}px, ${clipWidth - pathWidth}px); } ` setClipMeAnimation(clipMe) }, []) return ( // // {children} // {children} ) } export default CardBorderClipMe