Foundations

Motion

Scaffolded

Motion tokens describe how things move across every TpGroup surface. Durations and easing are defined once, exported to every platform, and honoured whether the consumer is React Native Reanimated, CSS transitions, iOS UIView animation, Android MotionLayout, or a Lottie file in After Effects.

Duration scale

TokenValueUse
motion.duration.instant0msSkip animation — used when reduce-motion is active
motion.duration.fast150msMicro-interactions — ripples, toggles, pressed states
motion.duration.base250msDefault UI transitions — hover, focus, simple reveals
motion.duration.slow400msSurface moves — modals, sheets, route transitions
motion.duration.slower600msChoreographed sequences — onboarding, brand moments

Easing

TokenCurveUse
motion.easing.standardcubic-bezier(0.2, 0, 0, 1)In-place moves — color, opacity, simple transforms
motion.easing.deceleratecubic-bezier(0, 0, 0, 1)Enter — element arrives on screen
motion.easing.acceleratecubic-bezier(0.3, 0, 1, 1)Exit — element leaves the screen

Live demo

Applied CSS: transition: left 250ms var(--motion-easing-standard)

Reduce motion

Every TpGroup product must respect the operating-system reduce-motion preference. When active, durations collapse to motion.duration.instant and non-essential animations are suppressed entirely. Essential feedback (focus rings, toggle state changes) remains visible but without animation.

Your OS has reduce-motion disabled — this showcase animates at full speed.

This demo reads the live prefers-reduced-motion media query — no user toggle needed.

Per-platform mapping

TokenWeb (CSS)iOS (UIView / SwiftUI)Android (MotionLayout / Compose)Windows (XAML Storyboard)Lottie / After Effects
motion.duration.basetransition-duration: 250msUIView.animate(withDuration: 0.25) / .animation(.easeInOut(duration: 0.25))motionDurationMedium1 (250ms) / tween(durationMillis = 250)Duration="0:0:0.25"15 frames @ 60fps (250ms)
motion.easing.standardcubic-bezier(0.2, 0, 0, 1)UIView.AnimationOptions.curveEaseInOut / timingCurveFastOutSlowInEasing / CubicBezierEasing(0.2f, 0f, 0f, 1f)KeySpline="0.2,0 0,1"Easing expression (0.2, 0, 0, 1)
motion.easing.deceleratecubic-bezier(0, 0, 0, 1).animation(.easeOut)LinearOutSlowInEasingKeySpline="0,0 0,1"Ease Out curve