Spaces:
Running
Running
import { motion } from "framer-motion"; | |
import { forwardRef } from "react"; | |
export const Square = forwardRef((props: any, ref) => { | |
const { shape } = props; | |
const GradientType = | |
shape?.gradient?.type === "radialGradient" | |
? "radialGradient" | |
: "linearGradient"; | |
return ( | |
<svg | |
ref={ref as any} | |
width={props?.width ?? 303} | |
height={props?.height ?? 303} | |
viewBox="0 0 255 255" | |
fill="none" | |
id={props?.id ?? undefined} | |
xmlns="http://www.w3.org/2000/svg" | |
> | |
<defs> | |
{shape?.image?.enabled && shape?.image?.urls?.length > 0 && ( | |
<pattern | |
id={`shape-gradient-${shape?.component ?? "null"}`} | |
x="0" | |
y="0" | |
patternUnits="userSpaceOnUse" | |
width={303} | |
height={303} | |
> | |
<image | |
href={shape?.image?.urls[0]} | |
width="100%" | |
height="100%" | |
preserveAspectRatio="xMidYMid slice" | |
/> | |
</pattern> | |
)} | |
<GradientType | |
id={`shape-gradient-${shape?.component ?? "null"}`} | |
gradientTransform={`rotate(${shape?.gradient?.angle ?? "90"})`} | |
> | |
{shape?.gradient?.enabled ? ( | |
<> | |
{shape?.gradient?.colours?.map((color: any, c: number) => ( | |
<stop | |
key={c} | |
offset={`${color.left}%`} | |
stopColor={color.value} | |
/> | |
))} | |
</> | |
) : ( | |
<stop offset="0%" stopColor={shape?.colour ?? "#fff"} /> | |
)} | |
</GradientType> | |
</defs> | |
<defs> | |
<mask id={`mask-${shape?.component ?? "null"}`} fill="black"> | |
<rect width="100%" height="100%" fill="white" /> | |
<g | |
style={{ | |
transformOrigin: "center", | |
}} | |
opacity={100} | |
> | |
{shape?.transparency && props?.children && props.children} | |
</g> | |
</mask> | |
</defs> | |
<g fill={`url(#${`shape-gradient-${shape?.component ?? "null"}`})`}> | |
<g mask={`url(#${`mask-${shape?.component ?? "null"}`})`}> | |
<motion.rect | |
animate={{ | |
scaleX: | |
shape?.border?.width > 0 ? 1 - shape?.border?.width / 350 : 1, | |
scaleY: | |
shape?.border?.width > 0 ? 1 - shape?.border?.width / 350 : 1, | |
rotate: shape?.position?.angle ?? 0, | |
}} | |
x="0.5" | |
y="0.5" | |
width="254" | |
height="254" | |
rx={shape?.radius ?? 40} | |
stroke={shape?.border?.colour} | |
strokeLinejoin="round" | |
strokeWidth={shape?.border?.width} | |
onClick={props?.onClick ? props.onClick : () => {}} | |
/> | |
</g> | |
</g> | |
{!shape?.transparency && props?.children && props.children} | |
</svg> | |
); | |
}); | |