{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "gift-icon",
  "title": "Gift Icon",
  "description": "An animated gift icon.",
  "dependencies": [
    "motion"
  ],
  "files": [
    {
      "path": "registry/chamaac/animated-icons/gift-icon.tsx",
      "content": "\"use client\";\n\nimport { useState } from \"react\";\nimport {\n  m,\n  LazyMotion,\n  domAnimation,\n  SVGMotionProps,\n  Easing,\n} from \"motion/react\";\n\ninterface GiftIconProps\n  extends Omit<SVGMotionProps<SVGSVGElement>, \"strokeWidth\"> {\n  size?: number;\n  duration?: number;\n  strokeWidth?: number;\n  isHovered?: boolean;\n  repeatDelay?: number;\n  ease?: Easing;\n}\n\nconst GiftIcon = (props: GiftIconProps) => {\n  const {\n    size = 28, // Icon size in pixels\n    duration = 0.8, // Animation duration in seconds\n    strokeWidth = 2, // SVG stroke width\n    isHovered = false, // When true, animate only on hover\n    repeatDelay = 1.5, // Delay between animation loops (seconds)\n    ease = \"easeInOut\", // Animation easing function\n    className,\n    ...restProps\n  } = props;\n\n  const [isHoveredInternal, setIsHoveredInternal] = useState(false);\n\n  const shouldAnimate = isHovered ? isHoveredInternal : true;\n\n  const shakeProps = {\n    animate: shouldAnimate\n      ? {\n          rotate: [0, -8, 8, -6, 6, -3, 3, 0],\n          y: [0, -2, 0, -1, 0],\n        }\n      : { rotate: 0, y: 0 },\n    transition: {\n      duration: duration,\n      ease: ease,\n      repeat: isHovered ? 0 : Infinity,\n      repeatDelay: repeatDelay,\n    },\n  };\n\n  return (\n    <LazyMotion features={domAnimation}>\n      <m.svg\n        {...restProps}\n        xmlns=\"http://www.w3.org/2000/svg\"\n        width={size}\n        height={size}\n        viewBox=\"0 0 24 24\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        strokeWidth={strokeWidth}\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n        className={className}\n        overflow=\"visible\"\n        style={{ transformOrigin: \"center bottom\" }}\n        onMouseEnter={() => isHovered && setIsHoveredInternal(true)}\n        onMouseLeave={() => isHovered && setIsHoveredInternal(false)}\n        {...shakeProps}\n      >\n        <m.g>\n          <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n          <path d=\"M3 9a1 1 0 0 1 1 -1h16a1 1 0 0 1 1 1v2a1 1 0 0 1 -1 1h-16a1 1 0 0 1 -1 -1l0 -2\" />\n          <path d=\"M12 8l0 13\" />\n          <path d=\"M7.5 8a2.5 2.5 0 0 1 0 -5a4.8 8 0 0 1 4.5 5a4.8 8 0 0 1 4.5 -5a2.5 2.5 0 0 1 0 5\" />\n        </m.g>\n        <path d=\"M19 12v7a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-7\" />\n      </m.svg>\n    </LazyMotion>\n  );\n};\n\nexport default GiftIcon;\n",
      "type": "registry:component"
    }
  ],
  "type": "registry:component"
}