# motiondivision/motion — codebase unpack

> Canonical page: https://codevetter.com/unpack/motion

This is a deterministic Repo Unpack scan of motiondivision/motion — a structural map, not a review, security audit, or maintainer-endorsed description.

- Scanned commit: f5838ce47b323ce2713cb2effc5afaa5b6120a44 (2026-10-02)
- Last upstream commit: v14.0.0
- Generated by codevetter 1.15.0 on 2026-10-02
- 1825 files scanned · 6.1 MB

Source inspection; upstream code and tests were not executed.

## Languages

- TypeScript: 1233 files
- HTML: 307 files
- Markdown: 170 files
- JSON: 52 files
- JavaScript: 40 files
- CSS: 6 files
- YAML: 4 files

## Repository structure

- packages/ — 900 files
- dev/ — 731 files
- plans/ — 144 files
- tests/ — 16 files
- .agents/ — 5 files
- .github/ — 4 files
- scripts/ — 3 files
- .devcontainer/ — 2 files

Probable source entrypoint: `packages/` (inferred from the tree, not upstream docs)

## Source layout — packages/

- packages/config/ — 2 files
- packages/motion/ — 30 files
- packages/motion-dom/ — 66 files
- packages/motion-utils/ — 57 files

## Package

- package.json: motion-one v0.0.0 — 55 declared dependencies

## Structural health signals

Average score 8.5/10 across 96 files; 5 hotspots. These are deterministic review leads, not proof of a bug.

## Recent history

- f5838ce47b32 (2026-10-02) v14.0.0
- 351f7d0c027f (2026-10-02) Updating changelog
- 5da7dcd8b722 (2026-10-02) Merge pull request #3889 from motiondivision/cursor/v14-remove-shims-4e79
- 089712833676 (2026-10-02) Remove 13.5.1 compatibility shims for framer-motion 13.0–13.4
- d4638ea17bcd (2026-10-02) v13.5.1

## Overview

Motion is a TypeScript animation library for JavaScript and React developers, distributed through the public motion package and implemented across framer-motion, motion-dom, and motion-utils. It combines imperative animation, React components and hooks, gestures, scroll-linked effects, layout projection, browser view transitions, and optional GPU-object adapters. Its distinctive architecture shares motion values and rendering infrastructure between declarative React usage and imperative DOM animation, choosing browser-native animation or JavaScript execution according to capabilities and options. This brief describes inspected source at commit f5838ce47b323ce2713cb2effc5afaa5b6120a44; it is a bounded investigation, not an exhaustive audit.

## System map

The repository ships animation packages rather than a hosted application backend. Public entrypoints delegate to implementations spread across React orchestration, a shared DOM engine, and foundational utilities. Development applications provide browser fixtures for HTML, React, React 19, and Next.js. Runtime state is held in motion values, effect caches, component refs, and projection trees; release tooling separately writes artifacts and contacts external systems.
- The dependency chain is motion → framer-motion → motion-dom → motion-utils, with exact internal version 14.0.0 in the inspected manifests. — [packages/motion/package.json#L97-L99](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/package.json#L97-L99) [packages/framer-motion/package.json#L96-L99](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/package.json#L96-L99) [packages/motion-dom/package.json#L19-L20](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/package.json#L19-L20) [packages/motion-utils/package.json#L1-L3](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-utils/package.json#L1-L3)
- The default motion entrypoint re-exports framer-motion/dom; motion/react exposes explicit motion and m bindings alongside the React package's wildcard exports. — [packages/motion/src/index.ts#L1-L1](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/src/index.ts#L1-L1) [packages/motion/src/react.ts#L11-L16](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/src/react.ts#L11-L16) [packages/framer-motion/src/dom.ts#L1-L8](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/dom.ts#L1-L8)
- The public package exports JavaScript, mini, debug, three, vgpu, React, React-client, React-m, React-mini, and React-view-transition subpaths with declaration, CommonJS, and ESM targets. — [packages/motion/package.json#L7-L37](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/package.json#L7-L37) [packages/motion/package.json#L38-L68](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/package.json#L38-L68)
- AsyncMotionValueAnimation selects NativeAnimationExtended only for animatable, non-handoff, browser-supported options; native construction exceptions fall back to JSAnimation. — [packages/motion-dom/src/animation/AsyncMotionValueAnimation.ts#L163-L189](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/animation/AsyncMotionValueAnimation.ts#L163-L189) [packages/motion-dom/src/animation/waapi/supports/waapi.ts#L68-L86](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/animation/waapi/supports/waapi.ts#L68-L86)
- Development boundaries are Vite React on TEST_PORT or 9990, Vite React 19 on TEST_PORT or 9991, HTML Vite on 8000, and a private Next.js 15.5.24 fixture application. — [dev/react/vite.config.ts#L5-L10](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/dev/react/vite.config.ts#L5-L10) [dev/react-19/vite.config.ts#L6-L17](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/dev/react-19/vite.config.ts#L6-L17) [dev/html/vite.config.js#L4-L8](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/dev/html/vite.config.js#L4-L8) [dev/next/package.json#L6-L17](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/dev/next/package.json#L6-L17)
- Yarn 3.6.4 workspaces are orchestrated by Turbo; build dependencies run upstream first, and packages compile TypeScript before Rollup emits distributable bundles. — [package.json#L7-L18](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/package.json#L7-L18) [package.json#L96-L96](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/package.json#L96-L96) [turbo.json#L4-L6](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/turbo.json#L4-L6) [packages/framer-motion/package.json#L81-L94](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/package.json#L81-L94)
- Inspected animation state is process-local: createEffect uses a WeakMap per subject, MotionValueState owns keyed bindings, and React VisualElements live in refs rather than a persistent storage service. — [packages/motion-dom/src/effects/utils/create-effect.ts#L89-L103](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/effects/utils/create-effect.ts#L89-L103) [packages/motion-dom/src/effects/MotionValueState.ts#L11-L20](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/effects/MotionValueState.ts#L11-L20) [packages/framer-motion/src/motion/utils/use-visual-element.ts#L47-L76](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/motion/utils/use-visual-element.ts#L47-L76)
- Distribution and integration tooling includes Lerna publication, postpublish tag pushing, changelog copying into another checkout, and a bearer-authenticated Slack-update API call. — [package.json#L24-L29](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/package.json#L24-L29) [packages/motion/package.json#L89-L95](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/package.json#L89-L95) [scripts/push-to-site.js#L23-L43](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/scripts/push-to-site.js#L23-L43) [scripts/notify-slack.js#L80-L115](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/scripts/notify-slack.js#L80-L115)

## Feature catalog

The user-facing surface is primarily importable APIs consumed by application developers. React offers animated HTML and SVG components, interaction props, lazy feature loading, and motion-value hooks. Imperative APIs target values, selectors, objects, sequences, layout changes, and browser view-transition layers. Optional adapters extend the same animation machinery to Three.js and vgpu subjects.
- motion components support HTML or SVG rendering and activate animation, exit, drag, focus, hover, tap, pan, viewport, and layout features according to their props. — [packages/framer-motion/src/motion/index.tsx#L75-L88](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/motion/index.tsx#L75-L88) [packages/framer-motion/src/motion/features/definitions.ts#L5-L24](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/motion/features/definitions.ts#L5-L24) [packages/framer-motion/src/motion/features/definitions.ts#L37-L44](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/motion/features/definitions.ts#L37-L44)
- animate accepts scalar values, MotionValues, elements/selectors, objects, and sequences; animateMini exposes a scoped element-animation API returning grouped playback controls. — [packages/framer-motion/src/animation/animate/index.ts#L40-L83](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/animation/animate/index.ts#L40-L83) [packages/framer-motion/src/animation/animate/index.ts#L119-L144](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/animation/animate/index.ts#L119-L144) [packages/framer-motion/src/animation/animators/waapi/animate-style.ts#L11-L30](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/animation/animators/waapi/animate-style.ts#L11-L30)
- Sequence animation supports callback segments by replacing callbacks with subscribed MotionValues, compiling sequence definitions, and animating each resulting subject. — [packages/framer-motion/src/animation/animate/sequence.ts#L18-L47](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/animation/animate/sequence.ts#L18-L47)
- The React API exports useMotionValue, useMotionTemplate, useScroll, useFollowValue, useSpring, useTransform, useVelocity, and useAnimate; MotionConfig exposes default transitions, reducedMotion, skipAnimations, nonce, and prop validation. — [packages/framer-motion/src/index.ts#L46-L58](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/index.ts#L46-L58) [packages/framer-motion/src/index.ts#L65-L78](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/index.ts#L65-L78) [packages/framer-motion/src/context/MotionConfigContext.tsx#L25-L63](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/context/MotionConfigContext.tsx#L25-L63)
- scroll can deliver progress callbacks or attach playback controls to scroll progress, with axis, source/container, target, and offset-dependent behavior; inView is also exported from the DOM entrypoint. — [packages/framer-motion/src/render/dom/scroll/index.ts#L7-L29](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/render/dom/scroll/index.ts#L7-L29) [packages/framer-motion/src/render/dom/scroll/attach-animation.ts#L12-L24](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/render/dom/scroll/attach-animation.ts#L12-L24) [packages/framer-motion/src/dom.ts#L6-L8](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/dom.ts#L6-L8)
- AnimatePresence retains removed keyed children until exit completion and supports sync or wait sequencing; LazyMotion enables synchronous or asynchronous feature bundles for lightweight m components. — [packages/framer-motion/src/components/AnimatePresence/index.tsx#L13-L42](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/components/AnimatePresence/index.tsx#L13-L42) [packages/framer-motion/src/components/AnimatePresence/index.tsx#L149-L165](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/components/AnimatePresence/index.tsx#L149-L165) [packages/framer-motion/src/components/LazyMotion/index.tsx#L45-L74](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/components/LazyMotion/index.tsx#L45-L74)
- Layout APIs use layout/layoutId props or data-layout/data-layout-id attributes; view-transition builders support paired subjects, crop overrides, and nested-layer grouping, while unsupported startViewTransition still executes the DOM update. — [packages/framer-motion/src/motion/features/definitions.ts#L23-L23](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/motion/features/definitions.ts#L23-L23) [packages/motion-dom/src/layout/LayoutAnimationBuilder.ts#L105-L116](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/layout/LayoutAnimationBuilder.ts#L105-L116) [packages/motion-dom/src/view/index.ts#L89-L140](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/view/index.ts#L89-L140) [packages/motion-dom/src/view/start.ts#L78-L84](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/view/start.ts#L78-L84)
- threeEffect binds transforms, materials, and uniforms using preRender writes; vgpuEffect supports scene and shader-related subjects and batches changed values into one set operation per subject per frame. — [packages/motion/src/three.ts#L21-L47](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/src/three.ts#L21-L47) [packages/motion/src/three.ts#L172-L202](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/src/three.ts#L172-L202) [packages/motion/src/vgpu.ts#L55-L81](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/src/vgpu.ts#L55-L81)

## Data flow

Inputs enter through component props, imperative subjects and keyframes, selectors, or browser events. Subject resolution and option normalization feed motion values, keyframe resolvers, and animation playback objects. Rendering is scheduled through ordered frame phases or delegated to browser animation APIs. Completion and cleanup update group controls, effect bindings, and retained React children; the separately inspected release path writes changelog artifacts.
- Selector input is resolved against scope.current when scoped, otherwise document; null subjects resolve empty, NodeLists become arrays, and arrays discard null members before dispatch. — [packages/framer-motion/src/animation/animate/resolve-subjects.ts#L24-L35](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/animation/animate/resolve-subjects.ts#L24-L35) [packages/motion-dom/src/utils/resolve-elements.ts#L27-L48](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/utils/resolve-elements.ts#L27-L48)
- animateSubject clones transitions per subject, evaluates functional delay with index and total, routes DOM elements through animateElement, and routes other objects through a matching registered effect or propEffect. — [packages/framer-motion/src/animation/animate/subject.ts#L129-L170](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/animation/animate/subject.ts#L129-L170)
- animateElement shares an existing VisualElement's values when supplied; otherwise it selects HTML-style or SVG effects and provides an EffectSubject adapter for DOM reads, rendering, and measurement. — [packages/motion-dom/src/animation/animate/element.ts#L21-L50](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/animation/animate/element.ts#L21-L50) [packages/motion-dom/src/animation/animate/element.ts#L68-L91](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/animation/animate/element.ts#L68-L91)
- animateEffectSubject reuses bound values or creates MotionValues; non-DOM origins come from an explicit first keyframe or effect.read(), and unreadable origins trigger an invariant. — [packages/motion-dom/src/animation/animate/effects.ts#L143-L180](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/animation/animate/effects.ts#L143-L180)
- animateMotionValue combines value-specific options with velocity and callbacks, translates public seconds to milliseconds, and applies skip-animation conditions before choosing synchronous JS or asynchronous resolution. — [packages/motion-dom/src/animation/interfaces/motion-value.ts#L29-L78](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/animation/interfaces/motion-value.ts#L29-L78) [packages/motion-dom/src/animation/interfaces/motion-value.ts#L89-L140](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/animation/interfaces/motion-value.ts#L89-L140)
- DOMKeyframesResolver samples CSS variables and detects positional unit changes; queued resolvers batch origin/end measurement and temporary transform removal before reporting resolved keyframes. — [packages/motion-dom/src/animation/keyframes/DOMKeyframesResolver.ts#L39-L103](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/animation/keyframes/DOMKeyframesResolver.ts#L39-L103) [packages/motion-dom/src/animation/keyframes/KeyframesResolver.ts#L23-L92](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/animation/keyframes/KeyframesResolver.ts#L23-L92) [packages/motion-dom/src/animation/keyframes/KeyframesResolver.ts#L182-L195](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/animation/keyframes/KeyframesResolver.ts#L182-L195)
- MotionValue updates notify change subscribers and dependents; MotionValueState deduplicates scheduled writes, and style effects emit transforms, transform origins, CSS custom properties, or typed style values. — [packages/motion-dom/src/value/index.ts#L390-L415](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/value/index.ts#L390-L415) [packages/motion-dom/src/effects/MotionValueState.ts#L111-L142](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/effects/MotionValueState.ts#L111-L142) [packages/motion-dom/src/effects/style/index.ts#L61-L91](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/effects/style/index.ts#L61-L91)
- The changelog data path reads CHANGELOG.md, serializes escaped version/date/content/type/slug CSV rows into changelog.csv, then optionally copies that file to motion-api's site content as motion.csv. — [scripts/generate-changelog.js#L64-L70](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/scripts/generate-changelog.js#L64-L70) [scripts/generate-changelog.js#L129-L146](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/scripts/generate-changelog.js#L129-L146) [scripts/push-to-site.js#L16-L43](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/scripts/push-to-site.js#L16-L43)

## Behavior traces

Three principal flows were followed across concrete source files: playground startup, imperative DOM animation, and scroll-driven playback. Additional traces cover React component mounting, scoped cleanup, exit completion, and browser view transitions. These traces describe execution order and material branches observed in source. They do not report runtime verification.
- Playground startup: main.tsx calls createRoot(...).render(<StrictMode><App/></StrictMode>); App eagerly imports fixture App exports, reads example/test query parameters, prioritizes example, and renders the selected module or ExampleList. — [dev/react/src/main.tsx#L1-L10](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/dev/react/src/main.tsx#L1-L10) [dev/react/src/App.tsx#L3-L28](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/dev/react/src/App.tsx#L3-L28) [dev/react/src/App.tsx#L40-L50](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/dev/react/src/App.tsx#L40-L50)
- Primary animation entry: motion → framer-motion/dom → createScopedAnimate's scopedAnimate → animateSubject → resolveSubjects; sequence-shaped input instead enters animateSequence before subject dispatch. — [packages/motion/src/index.ts#L1-L1](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/src/index.ts#L1-L1) [packages/framer-motion/src/dom.ts#L4-L4](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/dom.ts#L4-L4) [packages/framer-motion/src/animation/animate/index.ts#L119-L141](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/animation/animate/index.ts#L119-L141) [packages/framer-motion/src/animation/animate/subject.ts#L99-L119](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/animation/animate/subject.ts#L99-L119)
- DOM animation continuation: animateSubject → animateElement → animateValues or animateEffectSubject → value.start(animateMotionValue(...)) → AsyncMotionValueAnimation → keyframe resolution → native animation or JSAnimation; NativeAnimation construction failures take the JS branch. — [packages/framer-motion/src/animation/animate/subject.ts#L143-L157](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/animation/animate/subject.ts#L143-L157) [packages/motion-dom/src/animation/animate/element.ts#L74-L91](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/animation/animate/element.ts#L74-L91) [packages/motion-dom/src/animation/animate/effects.ts#L98-L113](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/animation/animate/effects.ts#L98-L113) [packages/motion-dom/src/animation/AsyncMotionValueAnimation.ts#L171-L189](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/animation/AsyncMotionValueAnimation.ts#L171-L189)
- Scroll playback: scroll defaults axis/container and calls attachToAnimation; compatible native ranges attach a cached ScrollTimeline/ViewTimeline, while fallback observe pauses controls and sets time to iterationDuration × measured axis progress. — [packages/framer-motion/src/render/dom/scroll/index.ts#L7-L29](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/render/dom/scroll/index.ts#L7-L29) [packages/framer-motion/src/render/dom/scroll/attach-animation.ts#L22-L24](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/render/dom/scroll/attach-animation.ts#L22-L24) [packages/framer-motion/src/render/dom/scroll/attach-animation.ts#L52-L85](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/render/dom/scroll/attach-animation.ts#L52-L85) [packages/framer-motion/src/render/dom/scroll/utils/get-timeline.ts#L30-L50](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/render/dom/scroll/utils/get-timeline.ts#L30-L50)
- Scroll measurement and disposal: scrollInfo creates handlers and one listener per container; scroll events schedule measureAll in frame.read, then notifyAll in preUpdate; final subscriber removal releases scroll/resize listeners and content-size polling. — [packages/framer-motion/src/render/dom/scroll/track.ts#L27-L85](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/render/dom/scroll/track.ts#L27-L85) [packages/framer-motion/src/render/dom/scroll/track.ts#L120-L156](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/render/dom/scroll/track.ts#L120-L156)
- React mount: motion proxy property access creates/caches a component; createMotionComponent initializes visual state and browser-only VisualElements; layout effects update features and schedule rendering, and animateChanges normally runs in a passive effect but runs earlier for optimized-appear handoff. — [packages/framer-motion/src/render/components/create-proxy.ts#L67-L85](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/render/components/create-proxy.ts#L67-L85) [packages/framer-motion/src/motion/index.tsx#L100-L131](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/motion/index.tsx#L100-L131) [packages/framer-motion/src/motion/utils/use-visual-element.ts#L148-L183](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/motion/utils/use-visual-element.ts#L148-L183)
- Scoped and presence completion: useAnimate registers groups in scope.animations and stops remaining groups on unmount; AnimatePresence marks individual exits complete, waits for all tracked exits, re-diffs children, and invokes safeToRemove/onExitComplete. — [packages/framer-motion/src/animation/animate/index.ts#L144-L154](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/animation/animate/index.ts#L144-L154) [packages/framer-motion/src/animation/hooks/use-animate.ts#L25-L30](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/animation/hooks/use-animate.ts#L25-L30) [packages/framer-motion/src/components/AnimatePresence/index.tsx#L202-L231](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/components/AnimatePresence/index.tsx#L202-L231)
- View transition: startViewAnimation names/measures old layers and commits CSS, calls document.startViewTransition(callback), awaits update(), resolves/measures new layers and crop rules, wraps generated animations, and removes names/CSS on completion; unsupported browsers execute update without animation. — [packages/motion-dom/src/view/start.ts#L78-L84](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/view/start.ts#L78-L84) [packages/motion-dom/src/view/start.ts#L441-L488](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/view/start.ts#L441-L488) [packages/motion-dom/src/view/start.ts#L827-L829](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/view/start.ts#L827-L829) [packages/motion-dom/src/view/start.ts#L875-L889](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/view/start.ts#L875-L889)

## Testing signals

Tests and CI were inspected, not executed; no passing result, coverage percentage, or runtime performance result is asserted. The repository combines co-located Jest tests, React browser tests in Cypress, and Playwright browser suites. Inspected tests exercise registry precedence, presence initialization, playback controls, scroll parity, and React view transitions. Inspection was bounded, and browser support checks, project selection, and CI wiring limit what test existence establishes.
- Jest uses ts-jest and co-located __tests__ patterns; framer-motion separates JSDOM client tests from Node SSR tests, with JUnit output configured for both. — [packages/framer-motion/jest.config.json#L2-L13](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/jest.config.json#L2-L13) [packages/framer-motion/jest.config.json#L18-L25](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/jest.config.json#L18-L25) [packages/framer-motion/jest.config.ssr.json#L2-L12](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/jest.config.ssr.json#L2-L12) [packages/framer-motion/jest.config.ssr.json#L17-L23](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/jest.config.ssr.json#L17-L23)
- Effect-registry unit tests assert registration lookup, newest-effect precedence, removal, deduplication, and animation from a readable initial value. — [packages/motion-dom/src/animation/animate/__tests__/effects.test.ts#L43-L103](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/animation/animate/__tests__/effects.test.ts#L43-L103)
- AnimatePresence tests use React rendering helpers and frame callbacks to check default initial animation, initial={false} suppression, and ordinary rerenders. — [packages/framer-motion/src/components/AnimatePresence/__tests__/AnimatePresence.test.tsx#L17-L85](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/components/AnimatePresence/__tests__/AnimatePresence.test.tsx#L17-L85)
- Cypress has separate React 18/19 base URLs and JUnit files; the inspected scroll-accelerate spec checks direct acceleration propagation, non-compositor propagation, and exclusion of chained useTransform. — [packages/framer-motion/cypress.json#L1-L10](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/cypress.json#L1-L10) [packages/framer-motion/cypress.react-19.json#L1-L10](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/cypress.react-19.json#L1-L10) [packages/framer-motion/cypress/integration/scroll-accelerate.ts#L1-L37](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/cypress/integration/scroll-accelerate.ts#L1-L37)
- Playwright defines Chromium and WebKit HTML projects plus a Chromium React 19 project; CI forbids focused tests, retries twice, uses one worker, and captures traces on first retry. This configuration contains no Firefox project. — [playwright.config.ts#L14-L32](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/playwright.config.ts#L14-L32) [playwright.config.ts#L36-L60](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/playwright.config.ts#L36-L60)
- Inspected Playwright tests cover playback/repeat/interruption, compare native and JS scroll progress within 0.01 across positions and resizes, and inspect React view-transition pseudo-animation timing; the latter skips when startViewTransition is unsupported. — [tests/animate/animate.spec.ts#L24-L62](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/tests/animate/animate.spec.ts#L24-L62) [tests/scroll/view-timeline-parity.spec.ts#L28-L62](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/tests/scroll/view-timeline-parity.spec.ts#L28-L62) [tests/scroll/view-timeline-parity.spec.ts#L88-L108](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/tests/scroll/view-timeline-parity.spec.ts#L88-L108) [tests/react/animate-view.spec.ts#L16-L23](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/tests/react/animate-view.spec.ts#L16-L23)
- CircleCI builds after an immutable install, then runs Jest, size budgets, React 18, React 19, HTML, and Next.js jobs; its inspected workflow does not schedule the Makefile's test-e2e target that additionally runs Playwright. — [.circleci/config.yml#L20-L38](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/.circleci/config.yml#L20-L38) [.circleci/config.yml#L65-L71](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/.circleci/config.yml#L65-L71) [.circleci/config.yml#L126-L136](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/.circleci/config.yml#L126-L136) [Makefile#L94-L95](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/Makefile#L94-L95)
- Validation limits are explicit: documentation warns JSDOM lacks WAAPI and real layout, browser tests can skip unsupported APIs, and the inspected CI job list establishes configured execution paths rather than actual run outcomes. — [CLAUDE.md#L80-L90](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/CLAUDE.md#L80-L90) [tests/react/animate-view.spec.ts#L19-L23](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/tests/react/animate-view.spec.ts#L19-L23) [.circleci/config.yml#L141-L159](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/.circleci/config.yml#L141-L159)

## Risk map

The observations below identify sensitive boundaries and change hotspots, not confirmed vulnerabilities. Release scripts have filesystem and network effects outside the animation runtime. Animation correctness depends on browser capability detection, shared rendering ownership, lifecycle ordering, and bundle/context identity. Two retention and CSP concerns are explicitly labeled hypotheses requiring targeted verification.
- Release commands have substantial side effects: new invokes Lerna publication and site mirroring, postpublish pushes tags, and Makefile clean removes node_modules and invokes git clean -fdX. — [package.json#L24-L27](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/package.json#L24-L27) [packages/motion/package.json#L89-L95](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/package.json#L89-L95) [Makefile#L20-L24](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/Makefile#L20-L24)
- pushToSite copies a file outside this checkout into an environment-selected MOTION_API_PATH or ~/Sites/motion-api; it checks destination existence but the source does not constrain the destination to this repository. — [scripts/push-to-site.js#L23-L43](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/scripts/push-to-site.js#L23-L43)
- notifySlack loads dotenv, accepts an overridable SLACK_UPDATE_API_URL, and sends UPDATE_SECRET_TOKEN as a bearer header; production requires a token, while development permits a test token and local HTTP. — [scripts/notify-slack.js#L3-L4](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/scripts/notify-slack.js#L3-L4) [scripts/notify-slack.js#L80-L92](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/scripts/notify-slack.js#L80-L92) [scripts/notify-slack.js#L109-L115](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/scripts/notify-slack.js#L109-L115)
- The Claude workflow executes on @claude-bearing issue/comment/review content, requests id-token write permission, and delegates to a version-tagged third-party action using an OAuth-secret reference; authorization beyond the visible condition is outside this source inspection. — [.github/workflows/claude.yml#L15-L26](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/.github/workflows/claude.yml#L15-L26) [.github/workflows/claude.yml#L28-L41](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/.github/workflows/claude.yml#L28-L41)
- Hypothesis: the module-level timelineCache can retain detached containers and targets because it uses nested Maps with no eviction in get-timeline.ts; listener cleanup in attachToAnimation does not remove those cache entries. (inferred) — [packages/framer-motion/src/render/dom/scroll/utils/get-timeline.ts#L20-L50](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/render/dom/scroll/utils/get-timeline.ts#L20-L50) [packages/framer-motion/src/render/dom/scroll/attach-animation.ts#L112-L115](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/render/dom/scroll/attach-animation.ts#L112-L115)
- Hypothesis: strict CSP may block view-transition CSS because css.commit creates and appends a style element without assigning a nonce, despite MotionConfig exposing a nonce option. Browser verification is needed to establish impact. (inferred) — [packages/motion-dom/src/view/utils/css.ts#L10-L28](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/view/utils/css.ts#L10-L28) [packages/framer-motion/src/context/MotionConfigContext.tsx#L40-L47](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/context/MotionConfigContext.tsx#L40-L47)
- Bundling and public export shape are compatibility hotspots: shared CommonJS contexts are required for LazyMotion/m communication, and motion/react deliberately avoids a duplicate-source re-export pattern documented as causing Turbopack OOM. — [packages/framer-motion/rollup.config.mjs#L115-L134](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/rollup.config.mjs#L115-L134) [packages/motion/src/react.ts#L3-L16](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/src/react.ts#L3-L16)
- Projection and keyframe measurement change live DOM state: projection cancels optimized transforms before snapshots, resets transforms before measuring nodes, and keyframe resolution temporarily renders styles and restores scroll position. Frame-order changes therefore cross multiple rendering responsibilities. — [packages/motion-dom/src/projection/node/create-projection-node.ts#L672-L689](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/projection/node/create-projection-node.ts#L672-L689) [packages/motion-dom/src/projection/node/create-projection-node.ts#L776-L792](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/projection/node/create-projection-node.ts#L776-L792) [packages/motion-dom/src/animation/keyframes/KeyframesResolver.ts#L45-L85](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/animation/keyframes/KeyframesResolver.ts#L45-L85)

## Extension points

Extension mechanisms exist at subject dispatch, renderer construction, feature loading, and animation scheduling boundaries. The effect API is the clearest public adapter mechanism and already supports GPU integrations. React features are enabled through a shared definition table and supplied as bundles. Development fixture discovery and package export maps provide separate extension surfaces for tests and distribution.
- animate.addEffect/removeEffect expose a subject registry; registration requires test() and read(), removes duplicate registration, and puts the newest effect first in dispatch order. — [packages/framer-motion/src/animation/animate/index.ts#L163-L172](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/animation/animate/index.ts#L163-L172) [packages/motion-dom/src/animation/animate/effects.ts#L18-L36](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/animation/animate/effects.ts#L18-L36)
- createEffect accepts an addValue callback plus optional test/read/step options and returns a callable binding API with get(), flush(), state(), and per-call cleanup. — [packages/motion-dom/src/effects/utils/create-effect.ts#L30-L59](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/effects/utils/create-effect.ts#L30-L59) [packages/motion-dom/src/effects/utils/create-effect.ts#L71-L121](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/effects/utils/create-effect.ts#L71-L121)
- threeEffect and vgpuEffect demonstrate adapters that claim subjects, read initial values, and schedule writes in frame.preRender; their implementations are exposed through dedicated motion subpaths. — [packages/motion/src/three.ts#L36-L47](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/src/three.ts#L36-L47) [packages/motion/src/vgpu.ts#L55-L85](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/src/vgpu.ts#L55-L85) [packages/motion/package.json#L26-L36](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/package.json#L26-L36)
- React feature extension uses featureProps to derive isEnabled checks; loadFeatures merges supplied feature packages into the existing shared table and writes it back through setFeatureDefinitions. — [packages/framer-motion/src/motion/features/definitions.ts#L5-L24](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/motion/features/definitions.ts#L5-L24) [packages/framer-motion/src/motion/features/definitions.ts#L32-L49](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/motion/features/definitions.ts#L32-L49) [packages/framer-motion/src/motion/features/load-features.ts#L5-L15](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/motion/features/load-features.ts#L5-L15)
- createMotionComponent accepts preloaded features, a CreateVisualElement factory, forwardMotionProps, and explicit HTML/SVG type; createDomVisualElement selects HTMLVisualElement or SVGVisualElement. — [packages/framer-motion/src/motion/index.tsx#L50-L59](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/motion/index.tsx#L50-L59) [packages/framer-motion/src/motion/index.tsx#L71-L88](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/motion/index.tsx#L71-L88) [packages/framer-motion/src/render/dom/create-visual-element.ts#L6-L19](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/render/dom/create-visual-element.ts#L6-L19)
- LazyMotion supports a direct feature bundle or a promise-returning loader, separates renderer from loaded features, and publishes the renderer and strict flag through LazyContext. — [packages/framer-motion/src/components/LazyMotion/index.tsx#L45-L80](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/components/LazyMotion/index.tsx#L45-L80)
- createProjectionNode injects resize-listener, parent, scroll-measurement, scroll-root, and transform-reset behavior; AsyncMotionValueAnimation separately accepts an element-specific KeyframeResolver. — [packages/motion-dom/src/projection/node/create-projection-node.ts#L150-L157](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/projection/node/create-projection-node.ts#L150-L157) [packages/motion-dom/src/animation/AsyncMotionValueAnimation.ts#L73-L93](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/animation/AsyncMotionValueAnimation.ts#L73-L93)
- New React fixtures plug into eager import.meta.glob discovery by exporting App; React 19 reuses React fixture files, while new public package APIs also require the appropriate export-map targets. — [dev/react/src/App.tsx#L3-L7](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/dev/react/src/App.tsx#L3-L7) [dev/react-19/src/App.tsx#L3-L10](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/dev/react-19/src/App.tsx#L3-L10) [packages/motion/package.json#L7-L25](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/package.json#L7-L25) [packages/motion/package.json#L38-L68](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/package.json#L38-L68)

## Contributor handoff

Begin with the actual public entrypoint and follow ownership into the implementation package before editing. The inspected tests and CI were not executed, and the inventory is bounded rather than exhaustive coverage. Preserve package compatibility, shared state ownership, frame timing, and browser fallback branches. Future execution should use repository-defined checks only when authorized, with release and external-write commands treated separately.
- Read AGENTS.md, the affected manifests, and actual re-export files first: the short architecture description calls motion a re-export package, but its default entrypoint specifically targets framer-motion/dom. — [AGENTS.md#L1-L10](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/AGENTS.md#L1-L10) [packages/motion/src/index.ts#L1-L1](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/src/index.ts#L1-L1) [packages/motion/src/react.ts#L11-L16](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/src/react.ts#L11-L16) [packages/framer-motion/src/dom.ts#L1-L8](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/dom.ts#L1-L8)
- Preserve exact internal package versions and Yarn 3.6.4; internal-dependencies.test.ts checks every workspace dependency category against public package versions and verifies Lerna's exact-version setting. — [package.json#L96-L96](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/package.json#L96-L96) [packages/motion/src/__tests__/internal-dependencies.test.ts#L15-L50](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/src/__tests__/internal-dependencies.test.ts#L15-L50)
- Follow library conventions: interface type definitions, named exports, const/let, and strict equality are ESLint rules; shared TypeScript settings enable strict null checks, noImplicitAny, and unused-symbol checks. — [.eslintrc#L20-L42](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/.eslintrc#L20-L42) [packages/config/tsconfig.json#L17-L22](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/config/tsconfig.json#L17-L22)
- Use time.now() for frame-synchronized timestamps; its cached value comes from frameData during frame processing or manual timing and is cleared by a microtask. — [CLAUDE.md#L189-L191](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/CLAUDE.md#L189-L191) [packages/motion-dom/src/frameloop/sync-time.ts#L18-L33](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/frameloop/sync-time.ts#L18-L33)
- For animation changes, inspect subject dispatch, animateElement, and effect-state handoff together; existing VisualElement ownership and handOffElementState prevent independent renderers from driving the same values. — [packages/framer-motion/src/animation/animate/subject.ts#L143-L156](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/src/animation/animate/subject.ts#L143-L156) [packages/motion-dom/src/animation/animate/element.ts#L68-L90](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/animation/animate/element.ts#L68-L90) [packages/motion-dom/src/animation/animate/element.ts#L94-L118](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion-dom/src/animation/animate/element.ts#L94-L118)
- When execution is authorized, choose package Jest client/server tests for logic and SSR, Cypress for React/browser behavior, and yarn test-playwright for browser suites; tests and CI were inspected here, not executed, so these commands are candidate checks rather than passing evidence. — [packages/framer-motion/package.json#L87-L89](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/package.json#L87-L89) [Makefile#L81-L95](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/Makefile#L81-L95) [package.json#L17-L18](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/package.json#L17-L18) [.circleci/config.yml#L141-L159](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/.circleci/config.yml#L141-L159)
- Keep React 18/19 fixture compatibility and browser-specific checks explicit: React 19 shares fixture sources but deduplicates/aliases React locally, and JSDOM cannot establish WAAPI or real-layout correctness. — [dev/react-19/src/App.tsx#L3-L10](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/dev/react-19/src/App.tsx#L3-L10) [dev/react-19/vite.config.ts#L12-L21](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/dev/react-19/vite.config.ts#L12-L21) [CLAUDE.md#L80-L90](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/CLAUDE.md#L80-L90) [packages/framer-motion/cypress.react-19.json#L1-L10](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/cypress.react-19.json#L1-L10)
- Before public-API or bundling changes, inspect Rollup context sharing and bundle budgets; before any operational command, inspect scripts because publication, tag pushes, changelog mirroring, and notifications carry external effects. — [packages/framer-motion/rollup.config.mjs#L115-L134](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/rollup.config.mjs#L115-L134) [packages/framer-motion/package.json#L119-L147](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/framer-motion/package.json#L119-L147) [package.json#L24-L29](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/package.json#L24-L29) [packages/motion/package.json#L94-L95](https://github.com/motiondivision/motion/blob/f5838ce47b323ce2713cb2effc5afaa5b6120a44/packages/motion/package.json#L94-L95)

Source repository: https://github.com/motiondivision/motion
Full evidence corpus: https://github.com/Codevetter/codevetter/tree/main/benchmarks/repo-unpacks/motion.json

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
