This component no longer exists. It was in lucide-animated’s manifest when we first indexed it and is not there now — the registry served its inventory on 2026-08-14 and this item was not on it. The install command below will fail. It is kept here because a tutorial somewhere still tells people to run it.
angry
lucide-animated-icons/angryRemovedComponent
lucide-animated publishes no description for this item.
Install it
npx shadcn@latest add https://icons.pqoqubbw.dev/r/angry.jsonSource
1"use client";23import type { Variants } from "motion/react";4import { motion, useAnimation } from "motion/react";5import type { HTMLAttributes } from "react";6import { forwardRef, useCallback, useImperativeHandle, useRef } from "react";78import { cn } from "@/lib/utils";910export interface AngryIconHandle {11 startAnimation: () => void;12 stopAnimation: () => void;13}1415interface AngryIconProps extends HTMLAttributes<HTMLDivElement> {16 size?: number;17}1819const EYEBROW_ROTATION = 20;20const DURATION = 0.6;2122const PATH_VARIANTS_FACE: Variants = {23 normal: { scale: 1, rotate: 0 },24 animate: {25 scale: [1, 1.2, 1.2, 1.2, 1],26 rotate: [0, -3, 3, -1, 1, 0],27 transition: {28 duration: DURATION,29 times: [0, 0.2, 0.4, 0.6, 1],30 ease: "easeInOut",31 },32 },33};3435const PATH_VARIANTS_LEFT_EYEBROW: Variants = {36 normal: { rotate: 0 },37 animate: {38 rotate: [0, EYEBROW_ROTATION, 0],39 transition: {40 duration: DURATION + 0.2,41 },42 },43};4445const PATH_VARIANTS_RIGHT_EYEBROW: Variants = {46 normal: { rotate: 0 },47 animate: {48 rotate: [0, -EYEBROW_ROTATION, 0],49 transition: {50 duration: DURATION + 0.2,51 },52 },53};5455const PATH_VARIANTS_EYE: Variants = {56 normal: { scale: 1 },57 animate: {58 scale: [1, 1.2, 1],59 transition: {60 duration: DURATION,61 },62 },63};6465const PATH_VARIANTS_MOUTH: Variants = {66 normal: { translateY: 0 },67 animate: {68 translateY: [0, -0.5, 0],69 transition: {70 duration: DURATION,71 },72 },73};7475const AngryIcon = forwardRef<AngryIconHandle, AngryIconProps>(76 ({ onMouseEnter, onMouseLeave, className, size = 28, ...props }, ref) => {77 const controls = useAnimation();78 const isControlledRef = useRef(false);7980 useImperativeHandle(ref, () => {81 isControlledRef.current = true;8283 return {84 startAnimation: () => controls.start("animate"),85 stopAnimation: () => controls.start("normal"),86 };87 });8889 const handleMouseEnter = useCallback(90 (e: React.MouseEvent<HTMLDivElement>) => {91 if (isControlledRef.current) {92 onMouseEnter?.(e);93 } else {94 controls.start("animate");95 }96 },97 [controls, onMouseEnter]98 );99100 const handleMouseLeave = useCallback(101 (e: React.MouseEvent<HTMLDivElement>) => {102 if (isControlledRef.current) {103 onMouseLeave?.(e);104 } else {105 controls.start("normal");106 }107 },108 [controls, onMouseLeave]109 );110111 return (112// … truncated
What it pulls in
npm packages
