chamaac
componentalert-circle-iconsource: ok · refreshed
Alert Icon
An animated alert icon.
npx shadcn add "https://chamaac.com/r/alert-circle-icon.json"free
No selection tags yet — empty means no evidence, not lack of support.
Dependencies
Bundle weight · mediumanimationmotion
Files1 · source cached 10/8/2026, 8:50:10 AM
registry/chamaac/animated-icons/alert-circle-icon.tsx
"use client";
import { useState } from "react";
import {
m,
LazyMotion,
domAnimation,
SVGMotionProps,
Easing,
} from "motion/react";
interface IconProps extends SVGMotionProps<SVGSVGElement> {
size?: number;
duration?: number;
strokeWidth?: number;
isHovered?: boolean;
repeatDelay?: number;
ease?: Easing;
}
const AlertCircleIcon = (props: IconProps) => {
const {
size = 28,
duration = 1.5,
strokeWidth = 2,
isHovered = false,
repeatDelay = 1,
ease = "easeInOut",
className,
...restProps
} = props;
const [isHoveredInternal, setIsHoveredInternal] = useState(false);
const shouldAnimate = isHovered ? isHoveredInternal : true;
const transition = {
duration: duration,
ease: ease,
repeat: isHovered ? 0 : Infinity,
repeatDelay: repeatDelay,
};
return (
<LazyMotion features={domAnimation}>
<m.svg
{...restProps}
xmlns="http://www.w3.org/2000/svg"
width={size}
height={size}
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth={strokeWidth}
strokeLinecap="round"
strokeLinejoin="round"
className={className}
onMouseEnter={() => isHovered && setIsHoveredInternal(true)}
onMouseLeave={() => isHovered && setIsHoveredInternal(false)}
>
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<circle cx="12" cy="12" r="9" />
<m.g
animate={
shouldAnimate ? { rotate: [0, -10, 10, -10, 10, 0] } : { rotate: 0 }
}
transition={transition}
style={{ originX: "50%", originY: "50%" }}
>
<line x1="12" y1="8" x2="12" y2="12" />
<line x1="12" y1="16" x2="12.01" y2="16" />
</m.g>
</m.svg>
</LazyMotion>
);
};
export default AlertCircleIcon;