animate-ease-entrance Kinesis - Motion tokens designed around how interfaces feel.
Stop guessing how math feels. Kinesis turns cubic-beziers and CSS linear() physics into a functional design strategy for modern UI animation, from Tailwind CSS transitions to spatial depth, haptic micro-interactions, and fluid scrollytelling. Every easing token is documented with its exact behavioral intent and prescriptive use case.
Semantic Intent Tokens
animate-ease-exit animate-ease-emphasis animate-ease-hover animate-ease-state-change animate-ease-expand animate-ease-collapse UI Component Defaults
animate-ease-ui-drawer animate-ease-ui-sheet animate-ease-ui-modal animate-ease-ui-overlay animate-ease-ui-toast animate-ease-ui-popover Haptic & Tactile
animate-ease-haptic-click animate-ease-haptic-snap animate-ease-haptic-confirm animate-ease-haptic-reject animate-ease-haptic-error animate-ease-haptic-anticipation animate-ease-haptic-slingshot animate-ease-haptic-long-press animate-ease-haptic-swipe Physical Dynamics
animate-ease-spring-gentle animate-ease-spring-bouncy animate-ease-spring-stiff animate-ease-rubber-band animate-ease-elastic-out animate-ease-elastic-in animate-ease-elastic-in-out animate-ease-bounce-out animate-ease-bounce-in animate-ease-bounce-in-out animate-ease-pendulum Platform Signatures
animate-ease-apple-fluid animate-ease-ios-spring animate-ease-m3-emphasized animate-ease-m3-standard animate-ease-fluent-expressive animate-ease-vercel-spark animate-ease-linear-app animate-ease-framer-pop animate-ease-stripe-gloss Organic & Ambient
animate-ease-breath animate-ease-pulse animate-ease-flutter animate-ease-wave animate-ease-tide animate-ease-shimmer animate-ease-viscous animate-ease-surface-tension Cinematic & Editorial
animate-ease-sigmoid animate-ease-soft-land animate-ease-hyper-decel animate-ease-time-jump animate-ease-slow-burn animate-ease-dramatic-reveal animate-ease-jitter animate-ease-glitch animate-ease-depth Mechanical & Industrial
animate-ease-hydraulic animate-ease-piston animate-ease-ratchet animate-ease-gear-lock animate-ease-impact animate-ease-whiplash animate-ease-magnetic-snap Spatial Computing & Z-Axis
animate-ease-z-pull animate-ease-z-push animate-ease-z-float animate-ease-z-sink animate-ease-parallax Scroll-Driven Dynamics
animate-ease-scrub-smooth animate-ease-scrub-sticky animate-ease-scroll-snap Foundational Curves
animate-ease-sine-in animate-ease-sine-out animate-ease-sine-in-out animate-ease-quad-in animate-ease-quad-out animate-ease-quad-in-out animate-ease-cubic-in animate-ease-cubic-out animate-ease-cubic-in-out animate-ease-quart-in animate-ease-quart-out animate-ease-quart-in-out animate-ease-quint-in animate-ease-quint-out animate-ease-quint-in-out animate-ease-expo-in animate-ease-expo-out animate-ease-expo-in-out animate-ease-circ-in animate-ease-circ-out animate-ease-circ-in-out animate-ease-back-in animate-ease-back-out animate-ease-back-in-out Accessibility
animate-ease-safe-entrance animate-ease-safe-exit Steps & Discrete
animate-ease-steps-2 animate-ease-steps-4 animate-ease-steps-8 animate-ease-steps-12 Retro
animate-ease-mario-jump animate-ease-pac-man animate-ease-sonic-dash animate-ease-pinball animate-ease-moonwalk animate-ease-vhs animate-ease-dialup animate-ease-leeroy animate-ease-rickroll animate-ease-harlem-shake animate-ease-turn-down Installation
Install
bun add @timwickstrom/kinesisbun add @timwickstrom/kinesis tailwind-animationsnpm install @timwickstrom/kinesisnpm install @timwickstrom/kinesis tailwind-animationspnpm add @timwickstrom/kinesispnpm add @timwickstrom/kinesis tailwind-animationsyarn add @timwickstrom/kinesisyarn add @timwickstrom/kinesis tailwind-animationsImport
@import "tailwindcss";
@import "@timwickstrom/kinesis/tailwind";@import "tailwindcss";
@import "@timwickstrom/kinesis/tailwind";
@import "tailwind-animations";Utility classes wire up automatically — ease-*, animate-ease-*
@import "@timwickstrom/kinesis";Exposes 115 easing tokens as CSS custom properties on :root
import { easings } from "@timwickstrom/kinesis/js";Full TypeScript + JSDoc. Works with React, NextJS, Vue, Framer Motion, WAAPI, and more.
Pairing tip (optional)
Pair with tailwind-animations
Kinesis handles the easing. tailwind-animations adds the keyframes. Together they're unstoppable.
How to use
<!-- Spring entrance animation -->
<div class="animate-fade-in-up ease-spring-gentle duration-500">
Hello world
</div>
<!-- Haptic press feedback -->
<button class="transition ease-haptic-click active:scale-95 duration-150">
Tap
</button>
<!-- Physics-aware slide-in -->
<nav class="animate-slide-in-right animate-ease-spring-bouncy animate-duration-700">
...
</nav>Use Tailwind utility classes directly in your markup. Combine any animate-* keyframe with an animate-ease-* token.
import { easings } from "@timwickstrom/kinesis/js";
import { useRef, useEffect } from "react";
export function AnimatedCard() {
const ref = useRef<HTMLDivElement>(null);
useEffect(() => {
ref.current?.animate(
[
{ opacity: 0, transform: "translateY(8px)" },
{ opacity: 1, transform: "translateY(0)" },
],
{ duration: 500, easing: easings.springGentle, fill: "forwards" }
);
}, []);
return (
<div ref={ref}>
{/* Tailwind classes work too */}
<button className="transition ease-haptic-click active:scale-95 duration-150">
Tap
</button>
</div>
);
}Use className with Tailwind classes for declarative transitions, or the JS export for programmatic WAAPI animations.
"use client";
import { motion } from "motion/react";
import { easings } from "@timwickstrom/kinesis/js";
export function Hero() {
return (
<motion.section
initial={{ opacity: 0, y: 10 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, ease: easings.entrance }}
>
Hello world
</motion.section>
);
}Add "use client" for motion components. Tailwind ease-* classes work in Server Components without any client boundary.
<script setup lang="ts">
import { ref } from "vue";
import { easings } from "@timwickstrom/kinesis/js";
const show = ref(true);
</script>
<template>
<Transition
enter-active-class="transition-all duration-300"
:style="{ transitionTimingFunction: easings.entrance }"
>
<div v-if="show">Hello world</div>
</Transition>
</template>Use the JS export to pass easing values directly to Vue transitions, or use ease-* Tailwind classes on any element.
import { motion } from "framer-motion"; // or "motion/react"
import { easings } from "@timwickstrom/kinesis/js";
export function Component() {
return (
<motion.div
initial={{ opacity: 0, y: 10 }}
animate={{ opacity: 1, y: 0 }}
transition={{
duration: 0.5,
ease: easings.springBouncy,
}}
>
Hello world
</motion.div>
);
}Pass any easing value directly to Framer Motion's ease property. Full TypeScript completion included.
import { easings } from "@timwickstrom/kinesis/js";
// Type-safe easing via the JS export
element.animate(
[
{ opacity: 0, transform: "translateY(8px)" },
{ opacity: 1, transform: "translateY(0)" },
],
{
duration: 500,
easing: easings.springGentle,
fill: "forwards",
}
);
// Or reference CSS variables directly
element.animate(
[{ transform: "scale(1)" }, { transform: "scale(1.05)" }],
{ duration: 200, easing: "var(--ease-haptic-click)" }
);Use the JS export for type-safe easing values with full JSDoc, or reference CSS variables directly via var(--ease-*).
Examples
Border Trace
A gradient border that draws itself around a card on hover using conic-gradient and @property.
Loading...Hover me
Watch the border trace