Fetching documentation…
Status: future · Priority: medium · Depends on: Forge Renderer (damage-aware animation), Performance (compositor interpolation)
Note: This is a future plan, not a commitment. The syntax and API shown here are proposals — they can be completely different when actually implemented.
Making rectangles feel feelings. The runtime already animates correctly on the main thread (CSS @keyframes, easing, HoverTransition, vsync interpolation of compositor-safe properties) — what it lacks is the choreography layer: entering/leaving, shared-element continuity across navigation, and physics that feels alive instead of computed.
z
navigate() reads as a glitch in 2026; users expect the old page to yield to the new one// 1. Enter/exit as declarations — no imperative animation code
<div transition={{ enter: "slide-up", exit: "fade", duration: 200 }}>
{isOpen && <Panel />}
</div>
// 2. Springs for anything draggable or interruptible
import { spring } from 'morph/animate'
const [x, setX] = spring(0, { stiffness: 170, damping: 26 })
// 3. Shared element across navigate() — thumbnail becomes hero
<img sharedId="cover-42" src={cover} />
{/* detail route: <img sharedId="cover-42" .../> — runtime morphs one into the other */}morph check nudge when you animate width and mean transformmorph check as choreographer — animating a non-compositor property warns with the cheaper alternative; shared IDs duplicated on one screen error at build timemorph-animate graduates here — the package idea from Tooling lands as this design's imperative escape hatch (animate(el, {...}), timelines) for the 5% declarations can't express| Piece | State |
|---|---|
CSS @keyframes + animation-*, easing, property interpolation |
✅ Shipped |
HoverTransition interpolation |
✅ Shipped |
| Compositor vsync interpolation (X/Y, opacity, colors, radius) | ✅ Shipped (fixed set) |
| Enter/exit transitions | ❌ Not built |
| Spring physics + interruptible retarget | ❌ Not built |
Shared-element across navigate() |
❌ Not built |
| Page-transition orchestration | ❌ Not built |
sharedId (deep link straight in): fade fallback or snap?prefers-reduced-motion equivalent as a first-class media query from day one, not a patch later?--freeze-animations) for deterministic snapshots?morph/animate) with velocity-preserving retargetmorph check animation lints (non-compositor property nudge, duplicate sharedId)navigate()