{
  "name": "blur-in",
  "type": "registry:ui",
  "description": "Resolve out of a defocus — blur clears before the move lands",
  "dependencies": [
    "remotion"
  ],
  "registryDependencies": [
    "motion-primitive",
    "motion-wrapper"
  ],
  "files": [
    {
      "path": "registry/bases/default/primitives/blur-in.tsx",
      "type": "registry:ui",
      "content": "import { interpolate } from \"remotion\";\nimport {\n  useEnterExit,\n  type MotionPrimitiveProps,\n} from \"@/remotion/lib/motion-primitive\";\nimport { MotionWrapper } from \"@/remotion/lib/motion-wrapper\";\n\nexport type BlurInProps = MotionPrimitiveProps & {\n  /** Blur radius in pixels at the start. */\n  maxBlur?: number;\n  /** Scale at the start — the push that sells the pull into focus. */\n  scaleFrom?: number;\n};\n\n/** Blur is gone by this point of the travel, so the element settles sharp. */\nconst FOCUS_AT = 0.2;\n\n/**\n * Resolves out of a defocus, like a lens finding its subject.\n *\n * The blur clears before the move does — holding it to the last frame makes\n * the whole entrance feel soft, and the eye reads the sharpening, not the\n * arrival.\n */\nexport const BlurIn: React.FC<BlurInProps> = ({\n  children,\n  maxBlur = 10,\n  scaleFrom = 0.98,\n  block,\n  style,\n  className,\n  ...motionProps\n}) => {\n  const { motion, displace, opacity, exiting, exitProgress } =\n    useEnterExit(motionProps);\n\n  const scale = interpolate(motion, [0, 1], [scaleFrom, 1]);\n  const defocus = exiting\n    ? exitProgress\n    : interpolate(displace, [FOCUS_AT, 1], [0, 1], {\n        extrapolateLeft: \"clamp\",\n        extrapolateRight: \"clamp\",\n      });\n\n  return (\n    <MotionWrapper\n      block={block}\n      className={className}\n      style={{\n        ...style,\n        opacity,\n        scale,\n        filter: `blur(${(defocus * maxBlur).toFixed(2)}px)`,\n        willChange: \"filter\",\n      }}\n    >\n      {children}\n    </MotionWrapper>\n  );\n};\n"
    }
  ],
  "atlas": {
    "lane": "atoms",
    "drive": "time",
    "tier": "core",
    "tags": [
      "enter"
    ]
  }
}