Bundle Estimator

Know your
footprint
before you ship.

Select your stack. See exact bundle size, dependency tree, and compatibility score — live.

Estimated Bundle
82KB
gzip ~26KB2 modules selected
Motion
28KB
Scroll
12KB
React base
42KB
Dependency Tree
@framermotionframer-motiopopmotionscrollscroll-utilsintersection
Compatibility Score
97/100
stable release
useAnimation()scroll.onScroll()navigate.to()cms.getItems()useGesture()layout.animate()useMotionValue()framer.addPlugin()page.transitions()useTransform()motion.divuseScroll()useVariants()cms.useCollection()framer.override()useAnimation()scroll.onScroll()navigate.to()cms.getItems()useGesture()layout.animate()useMotionValue()framer.addPlugin()page.transitions()useTransform()motion.divuseScroll()useVariants()cms.useCollection()framer.override()
Versus Breakdown

Every task. Side-by-side.
No marketing. Just lines of code.

Pick the task. Toggle between GSAP, framer-motion, and vanilla CSS. Watch the line count collapse.

ScrollScroll-triggered entrance animation
Framer API wins by64% fewer lines
Framer APIBuilt-in IntersectionObserver binding
4L
import { scroll } from "@framer";


scroll.onEnter(el, {
  opacity: [0, 1],
  y: [20, 0]
})
Requires ScrollTrigger plugin registration
11L
import gsap from "gsap";

import ScrollTrigger from "gsap/ScrollTrigger";


gsap.registerPlugin(ScrollTrigger)
gsap.from(el, {
  opacity: 0, y: 20,
  scrollTrigger: {
    trigger: el,
    start: "top 80%"
  }
})
NavigationPage transition with shared layout
Framer API wins by83% fewer lines
Framer APIZero configuration shared element matching
3L
import { navigate } from "@framer";


navigate.to("/next", {
  transition: "shared-layout"
})
FLIP plugin + manual enter/leave handling
18L
// Manually track leaving/entering elements
// Flip plugin for layout animation
import Flip from "gsap/Flip";


const state = Flip.getState(el)
// ... DOM change ...
Flip.from(state, {
  duration: 0.6,
  ease: "power2.inOut",
  absolute: true,
  onEnter: els => gsap.from(els,
    { opacity: 0, scale: 0.8 }),
  onLeave: els => gsap.to(els,
    { opacity: 0, scale: 0.8 })
})
CMSBind CMS collection to animated list
Framer API wins by75% fewer lines
Framer APICMS + layout animation in one import
6L
import { cms, motion } from "@framer";


const items = cms.useCollection("blog")

<motion.ul layout>
  {items.map(i =>
    <motion.li layout key={i.id}>
      {i.title}
    </motion.li>
  )}
</motion.ul>
No native CMS binding — full manual wiring
24L
// Fetch CMS data manually
// Set up GSAP stagger
// Handle add/remove diffs
// ~24 lines of glue code
GesturesGesture-driven drag with snap points
Framer API wins by75% fewer lines
Framer APINative snap engine, no math required
5L
import { gesture } from "@framer";


gesture.draggable(el, {
  snapPoints: [0, 200, 400],
  direction: "x",
  onSnap: (pt) => console.log(pt)
})
Draggable plugin + manual snap logic
20L
import Draggable from "gsap/Draggable";


Draggable.create(el, {
  type: "x",
  snap: {
    x: [0, 200, 400]
  },
  onDragEnd: function() {
    const closest = [0,200,400]
      .reduce((a, b) =>
        Math.abs(b-this.x) <
        Math.abs(a-this.x) ? b : a
      )
    gsap.to(this.target,
      { x: closest, duration: 0.3 })
  }
})
0
API Endpoints
0
Hooks Documented
0
Utility Functions
0.0%
Uptime (90d)
0h
Avg. Update Lag
Only in Framer API

Under 10 lines.
Nothing else comes close.

These are the capabilities that make the Framer API irreplaceable. Not available in GSAP, framer-motion, or vanilla CSS.

example.tsx
8 lines
import { cms, motion } from "@framer/api";


// Optimistic update — UI moves before server confirms
const [items, update] = cms.useOptimistic("products")

<motion.ul layout layoutRoot>
  {items.map(item => (
    <motion.li layout key={item.id}
      initial={{ opacity: 0, scale: 0.9 }}
      animate={{ opacity: 1, scale: 1 }}
      exit={{ opacity: 0, scale: 0.9 }}
    >
      {item.name}
    </motion.li>
  ))}
</motion.ul>
Explore the Full ReferenceNo email gate. Drop straight into searchable docs.
FRAMER API • REFERENCE • LOOKUP •

Stop reverse-engineering changelogs
at 2 a.m.

Every endpoint. Every hook. Every utility. Razor-sharp index, updated within 3 hours of every Framer release. The O'Reilly manual that already knows tomorrow's release notes.

Updated within 3h of releases
🔍247 endpoints indexed
🚫No email gate
🟢99.8% uptime