Export

What each dialect cannot express

What Motion, GSAP and CSS themselves can't express, however the export is written. Each row comes with the measurement behind it. Anything we could fix in our own code is a bug, so it isn't listed here.

DialectLimitWhyMeasured
CSSA spring becomes a sampled linear() curveCSS has no spring easing, so the spring's curve is sampled into a linear() easing with enough stops to stay within tolerance. It's longer to read than a spring config would be.0.30% worst case across the fixture set
CSSInterruption restarts instead of redirectingA CSS animation doesn't know its current velocity, so re-triggering one mid-flight starts again from its first keyframe. Motion carries the velocity into the new target; CSS has no way to.Structural, so no number applies
GSAPGSAP composes transforms in its own orderGSAP applies rotation before scale, and rotationY before rotationX. The engine and Motion do the opposite. For pairs that commute, like rotation with uniform scale, you can't see a difference. For scaleX, skew or 3D rotation it's a different matrix, and the order is built into GSAP's CSSPlugin, where it can't be configured.Exempt in the fixtures; the reason prints on every gate run
GSAPOur easing presets aren't GSAP's easesOur presets are the CSS bezier curves; GSAP's `powerN` eases are power curves. The two families don't line up, and the closest built-in is still four times the parity tolerance away. So every preset except `linear` is sampled into stops, which stays within tolerance and needs no plugin, at the cost of a longer export.easeOut vs power2.out: 21.6% of range; nearest built-in 2.4%
GSAPColor is tweened at 8-bit precisionGSAP's color engine rounds to whole sRGB channels: given rgb(10.4, 20.6, 30.5), it writes rgb(10, 21, 31). The engine and the other two dialects keep full precision, so a color animation with a small channel change is quantized here and nowhere else. The difference is below what a screen can show, but worth knowing if you're matching an export against a design token by eye.One step is 1/255 ≈ 0.4% of a channel
MotionRest thresholds are amplitude-dependentMotion decides a spring has finished using a threshold scaled to the initial delta, so a small movement is allowed to stop further from its target than a large one. Where that window is coarser than 1% of the travel, the export pins the engine's own thresholds instead.A 12° skew was given a 0.5° threshold, larger than its overshoot