{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "icon-party-popper",
  "title": "Party Popper",
  "description": "Animated Lucide party-popper icon — the cone draws on, then confetti bursts outward as the cone recoils for launch, milestone, or celebration finales.",
  "dependencies": ["remotion"],
  "registryDependencies": ["@remocn/icons-core"],
  "files": [
    {
      "path": "registry/remocn-icons/icon-party-popper/index.tsx",
      "content": "\"use client\";\n\nimport { Easing, interpolate, spring, useVideoConfig } from \"remotion\";\nimport {\n  drawnPathProps,\n  type IconAnimationProps,\n  useIconAnimation,\n} from \"@/lib/remocn-icons\";\n\nconst CONE_MAIN = \"M5.8 11.3 2 22l10.7-3.79\";\nconst CONE_CURL =\n  \"M11 13c1.93 1.93 2.83 4.17 2 5-.83.83-3.07-.07-5-2-1.93-1.93-2.83-4.17-2-5 .83-.83 3.07.07 5 2Z\";\n\nconst CONFETTI = [\n  {\n    d: \"M11 2 .33.82c.34.86-.2 1.82-1.11 1.98C9.52 4.9 9 5.52 9 6.23V7\",\n    cx: 10,\n    cy: 4.5,\n    dx: 0.22,\n    dy: -0.98,\n  },\n  { d: \"M4 3h.01\", cx: 4, cy: 3, dx: -0.64, dy: -0.77 },\n  { d: \"M15 2h.01\", cx: 15, cy: 2, dx: 0.65, dy: -0.76 },\n  {\n    d: \"m22 2-2.24.75a2.9 2.9 0 0 0-1.96 3.12c.1.86-.57 1.63-1.45 1.63h-.38c-.86 0-1.6.6-1.76 1.44L14 10\",\n    cx: 18,\n    cy: 6,\n    dx: 0.95,\n    dy: -0.32,\n  },\n  {\n    d: \"m22 13-.82-.33c-.86-.34-1.82.2-1.98 1.11c-.11.7-.72 1.22-1.43 1.22H17\",\n    cx: 19,\n    cy: 14,\n    dx: 0.89,\n    dy: 0.45,\n  },\n  { d: \"M22 8h.01\", cx: 22, cy: 8, dx: 1, dy: -0.08 },\n  { d: \"M22 20h.01\", cx: 22, cy: 20, dx: 0.76, dy: 0.65 },\n] as const;\n\nconst TIMINGS = {\n  drawDurationInFrames: 12,\n  actionDelayInFrames: 2,\n  actionDurationInFrames: 26,\n  loop: false,\n} as const;\n\nexport function PartyPopperIcon({\n  animation = \"both\",\n  loop,\n  speed,\n  size = 48,\n  color = \"currentColor\",\n  strokeWidth = 2,\n  className,\n}: IconAnimationProps) {\n  const { drawProgress, scaleIn, actionFrame, actionProgress } =\n    useIconAnimation({ animation, loop, speed }, TIMINGS);\n  const { fps } = useVideoConfig();\n\n  const linearDraw = 1 - (1 - drawProgress) ** (1 / 3);\n\n  const mainProgress = interpolate(linearDraw, [0, 0.6], [0, 1], {\n    extrapolateLeft: \"clamp\",\n    extrapolateRight: \"clamp\",\n    easing: Easing.out(Easing.quad),\n  });\n  const curlProgress = interpolate(linearDraw, [0.4, 1], [0, 1], {\n    extrapolateLeft: \"clamp\",\n    extrapolateRight: \"clamp\",\n    easing: Easing.inOut(Easing.quad),\n  });\n\n  const main = drawnPathProps(CONE_MAIN, mainProgress);\n  const curl = drawnPathProps(CONE_CURL, curlProgress);\n\n  const recoil = interpolate(actionProgress, [0, 0.35, 1], [0, -6, 0], {\n    extrapolateLeft: \"clamp\",\n    extrapolateRight: \"clamp\",\n    easing: Easing.inOut(Easing.quad),\n  });\n  const scale = 0.85 + 0.15 * scaleIn;\n\n  return (\n    <svg\n      className={className}\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      stroke={color}\n      strokeWidth={strokeWidth}\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n      style={{\n        overflow: \"visible\",\n        transformOrigin: \"center\",\n        transform: `scale(${scale})`,\n      }}\n    >\n      <g transform={`rotate(${recoil} 2 22)`}>\n        <path\n          d={CONE_MAIN}\n          strokeDasharray={main.strokeDasharray}\n          strokeDashoffset={main.strokeDashoffset}\n        />\n        <path\n          d={CONE_CURL}\n          strokeDasharray={curl.strokeDasharray}\n          strokeDashoffset={curl.strokeDashoffset}\n        />\n      </g>\n      {CONFETTI.map((piece, index) => {\n        const pieceFrame = actionFrame - index * 2;\n        const burst =\n          pieceFrame <= 0\n            ? 0\n            : spring({\n                frame: pieceFrame,\n                fps,\n                config: { damping: 12, stiffness: 170, mass: 0.7 },\n                durationInFrames: 20,\n              });\n        const dist = 3 * burst;\n        const opacity = interpolate(burst, [0, 0.15], [0, 1], {\n          extrapolateLeft: \"clamp\",\n          extrapolateRight: \"clamp\",\n        });\n        return (\n          <path\n            key={index}\n            d={piece.d}\n            opacity={opacity}\n            transform={`translate(${piece.dx * dist} ${piece.dy * dist}) translate(${piece.cx} ${piece.cy}) scale(${burst}) translate(${-piece.cx} ${-piece.cy})`}\n          />\n        );\n      })}\n    </svg>\n  );\n}\n\nexport function PartyPopperIconStatic({\n  size = 48,\n  color = \"currentColor\",\n  strokeWidth = 2,\n  className,\n}: {\n  size?: number;\n  color?: string;\n  strokeWidth?: number;\n  className?: string;\n}) {\n  return (\n    <svg\n      className={className}\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      stroke={color}\n      strokeWidth={strokeWidth}\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n    >\n      <path d={CONE_MAIN} />\n      <path d={CONE_CURL} />\n      {CONFETTI.map((piece, index) => (\n        <path key={index} d={piece.d} />\n      ))}\n    </svg>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/remocn/icon-party-popper.tsx"
    }
  ],
  "type": "registry:component"
}
