{
  "name": "scale-in",
  "type": "registry:ui",
  "description": "Grow into place from just under full size, with an optional spring and exit",
  "dependencies": [
    "remotion"
  ],
  "registryDependencies": [
    "motion-primitive",
    "motion-wrapper"
  ],
  "files": [
    {
      "path": "registry/bases/default/primitives/scale-in.tsx",
      "type": "registry:ui",
      "content": "import { interpolate } from \"remotion\";\nimport {\n  resolveOrigin,\n  useEnterExit,\n  type MotionPrimitiveProps,\n  type TransformOrigin,\n} from \"@/remotion/lib/motion-primitive\";\nimport { MotionWrapper } from \"@/remotion/lib/motion-wrapper\";\n\nexport type ScaleInProps = MotionPrimitiveProps & {\n  /** Scale at the start of the entrance. */\n  from?: number;\n  /** Corner or edge the scale grows out of. */\n  origin?: TransformOrigin;\n};\n\n/**\n * Grows into place from just under full size.\n *\n * `from` stays close to 1 on purpose: a card scaling up from 0.5 reads as a\n * zoom, which is a camera move, not an arrival. Anything below ~0.85 wants a\n * spring behind it — pass `spring` to get one.\n */\nexport const ScaleIn: React.FC<ScaleInProps> = ({\n  children,\n  from = 0.92,\n  origin = \"center\",\n  block,\n  style,\n  className,\n  ...motionProps\n}) => {\n  const { motion, opacity } = useEnterExit(motionProps);\n  const scale = interpolate(motion, [0, 1], [from, 1]);\n\n  return (\n    <MotionWrapper\n      block={block}\n      className={className}\n      style={{\n        ...style,\n        opacity,\n        scale,\n        transformOrigin: resolveOrigin(origin),\n      }}\n    >\n      {children}\n    </MotionWrapper>\n  );\n};\n"
    }
  ],
  "atlas": {
    "lane": "atoms",
    "drive": "time",
    "tier": "core",
    "tags": [
      "enter"
    ]
  }
}