Skip to content
 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

71,241 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

EaseMotion CSS

⚡ EaseMotion CSS

A zero-dependency, animation-first CSS framework for faster, more expressive UI.

EaseMotion CSS lets you build polished interfaces with readable class names such as ease-fade-in, ease-slide-up, and ease-hover-grow. No build step, no complex setup, and no need to memorize shorthand.


npm version committers.top public badge committers.top private badge Sponsor Discord npm downloads jsDelivr CDN GitHub Stars GitHub Forks GitHub Contributors Merged PRs Closed PRs Closed Issues Open PRs Open Issues License: MIT GSSoC Maintainer


Important

📢 Maintainer Announcement & Contribution Guidelines (August 2026)

  1. 🔓 All Contributor Accounts Unbanned: All contributor soft-bans have been removed! Everyone is welcome to contribute.
  2. ⏱️ Daily Contribution Rate Limit: Maximum 100 PRs per day per contributor to maintain stability and review quality.
  3. ✨ 500 New Approved GSSoC Issues Available: 500 brand new approved issues (#59099 to #59610) are open for contribution!
  4. 📁 Submission Directory: All PRs MUST be submitted under submissions/examples/your-feature-name/ containing demo.html, style.css, and README.md.

Table of Contents 📑


🚀 Quick Setup

<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
  href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap"
  rel="stylesheet"
/>
<link
  rel="stylesheet"
  href="https://cdn.jsdelivr.net/gh/SAPTARSHI-coder/EaseMotion-css@main/easemotion.min.css"
/>

📖 Documentation · 🎮 Live Demo · 📦 npm · 🤝 Contributing

Controlling looping animations

Looping animations such as .ease-bounce, .ease-pulse, .ease-rotate, .ease-ping, and .ease-typewriter-loop use the CSS variable --ease-animation-iterations.

The default value is infinite, which keeps existing behavior unchanged. If you want a looping animation to run only a few times, set the variable once in your project:

:root {
  --ease-animation-iterations: 3;
}

This will apply the iteration count to all looping animation utilities by default.


Support the Project

If EaseMotion CSS saves you time or helps your learning journey, please consider supporting it.

Most people simply forget. This is your reminder. 😊

Action Why it matters
💖 Sponsor on GitHub Directly support the creator to keep the project active and stable
Star the repo Helps more developers discover the project
🍴 Fork and contribute Your idea could become a real framework class
🐞 Report an issue Bugs you catch make it better for everyone
💡 Suggest a feature Good ideas ship faster than you think

Stars cost nothing and mean everything to an independent open-source project. If this saved you even 10 minutes, it's worth a click.


Project Statistics

Metric Value
📦 npm Package easemotion-css
🌐 CDN cdn.jsdelivr.net/gh/...
Classes 80+ utility classes, 20+ animation classes
🎨 Components Buttons (6 variants), Cards (13 variants)
🔑 Design Tokens 60+ CSS custom properties
⚖️ Bundle Size 28.2 kB gzipped · 174.1 kB raw
📜 License MIT
🔧 Build Step ❌ None required
🏗️ Dependencies ❌ Zero

Browser Compatibility

EaseMotion CSS is built for modern evergreen browsers and relies on CSS3 custom properties, CSS animations, Flexbox, CSS Grid, transforms, transitions, and keyframe animations.

| Browser | Minimum Version | backdrop-filter | aspect-ratio | CSS variables | Animations | Notes | | ------- | --------------- | ------------------------------------------------- | -------------- | ------------- | ---------- | --------- | --- | | Chrome | 49+ | Supported | Supported | Supported | Supported | | | Firefox | 31+ | Supported | Supported | Supported | Supported | | | Safari | 9.1+ | Supported with -webkit-backdrop-filter fallback | Supported | Supported | Supported | Supported | | | Edge | 15+ | Supported | Supported | Supported | Supported | | | Opera | 36+ | Supported | Supported | Supported | Supported | |

Internet Explorer (IE 11 and earlier) is not supported.


What is EaseMotion CSS?

EaseMotion CSS is a curated, animation-first CSS framework where class names read like plain English. It is designed for developers who want expressive motion and clean HTML without a build tool or complex configuration.

<div class="ease-center ease-fade-in">
  <h1 class="ease-slide-up ease-delay-100">Build faster.</h1>
  <p class="ease-slide-up ease-delay-200">Animation-first CSS for humans.</p>
  <button
    class="ease-btn ease-btn-primary ease-btn-pill ease-hover-grow ease-delay-300"
  >
    Get Started →
  </button>
</div>

Why it is easy to use

  • Readable utility names such as ease-center and ease-hover-grow
  • Zero dependency setup with CDN or npm
  • Ready-to-use motion, layout, and component helpers
  • Easy customization through CSS variables

Why EaseMotion CSS?

Vanilla CSS Tailwind CSS EaseMotion CSS
Setup Write from scratch Build step + config Link one file
Readability ✅ High ❌ Low (px-4 flex gap-x-2) High (ease-center)
Animations ⚙️ Manual 🔸 Minimal First-class
Zero config
Quality control You You Curated by maintainer
CDN ready N/A Yes
Learning curve High Medium Near zero

Quick Start

Option 1 — CDN (fastest, zero setup, recommended)

<!DOCTYPE html>
<html>
  <head>
    <link rel="preconnect" href="https://fonts.googleapis.com" />
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
    <link
      href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap"
      rel="stylesheet"
    />
    <link
      rel="stylesheet"
      href="https://cdn.jsdelivr.net/gh/SAPTARSHI-coder/EaseMotion-css@main/easemotion.min.css"
    />
  </head>
  <body>
    <div class="ease-center ease-fade-in">
      <h1>Hello, EaseMotion!</h1>
    </div>
  </body>
</html>

Powered by jsDelivr — globally cached, always fast, no account needed. The CDN link is live the moment you paste it.

Alternative CDN Providers

EaseMotion CSS can also be loaded using alternative CDN providers.

jsDelivr (recommended)

<link
  rel="stylesheet"
  href="https://cdn.jsdelivr.net/gh/SAPTARSHI-coder/EaseMotion-css@main/easemotion.min.css"
/>

unpkg

<link
  rel="stylesheet"
  href="https://unpkg.com/easemotion-css/easemotion.min.css"
/>

GitHub Raw CDN

<link
  rel="stylesheet"
  href="https://raw.githubusercontent.com/SAPTARSHI-coder/EaseMotion-css/main/easemotion.min.css"
/>

jsDelivr is recommended for production usage because it provides global caching and better reliability.

Option 2 — npm

npm install easemotion-css

Then in your HTML:

<link rel="stylesheet" href="node_modules/easemotion-css/easemotion.min.css" />

Or in CSS / PostCSS / Sass:

@import "easemotion-css/easemotion.min.css";

Option 3 — Granular imports (pick only what you need)

<!-- Font (optional — for Inter typography) -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
  href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap"
  rel="stylesheet"
/>

<!-- Core (always required — load in this exact order) -->
<link
  rel="stylesheet"
  href="https://cdn.jsdelivr.net/npm/easemotion-css/core/variables.css"
/>
<link
  rel="stylesheet"
  href="https://cdn.jsdelivr.net/npm/easemotion-css/core/base.css"
/>
<link
  rel="stylesheet"
  href="https://cdn.jsdelivr.net/npm/easemotion-css/core/animations.css"
/>
<link
  rel="stylesheet"
  href="https://cdn.jsdelivr.net/npm/easemotion-css/core/utilities.css"
/>

<!-- Components — add only what you use -->
<link
  rel="stylesheet"
  href="https://cdn.jsdelivr.net/npm/easemotion-css/components/buttons.css"
/>
<link
  rel="stylesheet"
  href="https://cdn.jsdelivr.net/npm/easemotion-css/components/cards.css"
/>

Option 4 — Modular animation imports (load only what you need)

<link
  rel="stylesheet"
  href="https://cdn.jsdelivr.net/npm/easemotion-css/easemotion/variables.css"
/>
<link
  rel="stylesheet"
  href="https://cdn.jsdelivr.net/npm/easemotion-css/easemotion/fade.css"
/>
<link
  rel="stylesheet"
  href="https://cdn.jsdelivr.net/npm/easemotion-css/easemotion/slide.css"
/>
<!-- Add only the animation categories you need -->

Full bundle

<link
  rel="stylesheet"
  href="https://cdn.jsdelivr.net/npm/easemotion-css/easemotion/all.css"
/>

⚠️ easemotion/variables.css must always load before modular animation files. It provides the shared custom properties used by all animation categories.


Framework Integration

EaseMotion CSS is a pure CSS library — it works out of the box with every JavaScript framework by simply importing the stylesheet and applying class names to elements. Additionally, we ship a dedicated React integration layer to make animations even more declarative in JSX.


React + Vite

1. Install EaseMotion CSS

npm install easemotion-css

2. Import in your entry file

// main.jsx or App.jsx
import 'easemotion-css/easemotion.min.css';

3. Use classes directly in JSX

export default function HeroSection() {
  return (
    <div className="ease-center ease-fade-in">
      <h1 className="ease-slide-up ease-delay-100">Build faster.</h1>
      <p className="ease-slide-up ease-delay-200">Animation-first CSS for humans.</p>
      <button className="ease-btn ease-btn-primary ease-hover-grow ease-delay-300">
        Get Started →
      </button>
    </div>
  );
}

4. Use the <Animate> wrapper component (optional — in examples/react-vite/)

We ship a React wrapper component that turns animation settings into declarative props:

// Copy Animate.jsx from examples/react-vite/src/components/Animate.jsx
import Animate from './components/Animate';

export default function App() {
  return (
    <>
      {/* Fade in with a 200ms delay */}
      <Animate type="fade-in" delay={200}>
        <div className="ease-card">Hello World</div>
      </Animate>

      {/* Staggered list items */}
      {['A', 'B', 'C'].map((item, i) => (
        <Animate key={item} type="slide-up" delay={i * 100} hover="lift">
          <div className="ease-card">{item}</div>
        </Animate>
      ))}

      {/* Animate on mount (React remounts = re-animates) */}
      <Animate key={isOpen ? 'open' : 'closed'} type="zoom-in" duration={300}>
        {isOpen && <Modal />}
      </Animate>
    </>
  );
}

<Animate> Props Reference:

Prop Type Default Description
type string EaseMotion animation name (e.g. 'fade-in', 'slide-up', 'zoom-in')
duration 'fast' | 'medium' | 'slow' | number 'medium' Duration keyword or milliseconds
delay number 0 Delay in ms before animation starts
hover string Hover effect class (e.g. 'lift', 'glow', 'scale')
tag string 'div' HTML tag to render
className string '' Additional CSS classes

5. Run the showcase

The full interactive playground lives in examples/react-vite/. Clone the repo and run:

cd examples/react-vite
npm install
npm run dev

This opens a dark-mode dashboard with live animation controls, staggered demos, and a modal transition showcase.


Next.js

EaseMotion CSS is fully compatible with Next.js (App Router and Pages Router) since it is a static CSS file with no JavaScript dependencies.

App Router (Next.js 13+)

// app/layout.js — import once globally
import 'easemotion-css/easemotion.min.css';

export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>{children}</body>
    </html>
  );
}
// app/page.js — use class names in Server Components
export default function Page() {
  return (
    <main className="ease-center ease-fade-in">
      <h1 className="ease-slide-up">Welcome</h1>
    </main>
  );
}

Pages Router (Next.js 12 or earlier)

// pages/_app.js
import 'easemotion-css/easemotion.min.css';

export default function App({ Component, pageProps }) {
  return <Component {...pageProps} />;
}

Tip: EaseMotion CSS works in Server Components ('use server') without any hydration issues since it adds no runtime JavaScript.


Vue / Svelte / Astro

Install via npm and import globally:

npm install easemotion-css

Vue 3

// main.js
import 'easemotion-css/easemotion.min.css';
<!-- MyComponent.vue -->
<template>
  <div class="ease-fade-in ease-card">
    <h2 class="ease-slide-up ease-delay-100">Hello Vue!</h2>
  </div>
</template>

Svelte / SvelteKit

// src/app.js or +layout.svelte <script>
import 'easemotion-css/easemotion.min.css';
<div class="ease-fade-in ease-card">
  <h2 class="ease-slide-up ease-delay-100">Hello Svelte!</h2>
</div>

Astro

// src/layouts/Layout.astro
import 'easemotion-css/easemotion.min.css';

Or via a <link> tag in the Astro layout:

<link rel="stylesheet" href="/node_modules/easemotion-css/easemotion.min.css" />

SCSS Integration

EaseMotion CSS ships a SCSS layer under scss/ that exposes animation tokens as SCSS variables and provides reusable mixins. This allows you to apply EaseMotion animations in your own SCSS stylesheets without adding extra classes to your HTML.

Setup

Make sure you have Sass installed:

npm install --save-dev sass

Then import the SCSS package in your stylesheet:

// In your SCSS entry file
@use 'easemotion-css/scss' as ease;

Or import individual partials:

@use 'easemotion-css/scss/variables' as *;
@use 'easemotion-css/scss/mixins' as ease;

Using the animate() mixin

.my-card {
  // Apply fade-in with a 400ms duration and 200ms delay
  @include ease.animate(ease-kf-fade-in, 400ms, $ease-in-out-cubic, 200ms);
}

.hero-title {
  // Use shorthand named mixins
  @include ease.slide-up($duration: 600ms, $delay: 100ms);
}

.cta-button {
  @include ease.zoom-in($duration: $speed-fast);
}

Using the transition() mixin

.nav-item {
  @include ease.transition(color, $duration: $speed-fast, $easing: $ease-out-cubic);

  &:hover {
    color: var(--ease-color-primary);
  }
}

Available SCSS Tokens

Duration Tokens (mapped to CSS custom properties):

SCSS Variable CSS Variable Value
$speed-fast --ease-speed-fast CSS var
$speed-medium --ease-speed-medium CSS var
$speed-slow --ease-speed-slow CSS var

Easing Tokens:

SCSS Variable Value
$ease-ease cubic-bezier(0.4, 0, 0.2, 1)
$ease-bounce cubic-bezier(0.34, 1.56, 0.64, 1)
$ease-in-out cubic-bezier(0, 0, 0.2, 1)
$ease-elastic Same as $ease-bounce

Available SCSS Mixins

Mixin Description
animate($name, $duration, $easing, $delay, $fill, $iteration) Base animation mixin
transition($property, $duration, $easing, $delay) CSS transition helper
fade-in(...) Applies ease-kf-fade-in animation
fade-out(...) Applies ease-kf-fade-out animation
slide-up(...) Applies ease-kf-slide-up animation
slide-down(...) Applies ease-kf-slide-down animation
zoom-in(...) Applies ease-kf-zoom-in animation
zoom-out(...) Applies ease-kf-zoom-out animation

Build your SCSS

# Compile to CSS
npx sass scss/_index.scss dist/easemotion.scss.css

# Or use the npm script in the EaseMotion project
npm run build:scss

Contributing SCSS issues: We have 100+ open GSSoC-26 issues for expanding the SCSS layer — from new mixins to modular per-animation partials. Browse label:scss to find one.


Philosophy

EaseMotion CSS is not just a CSS library — it is a design language.

"If you can say it in English, you should be able to write it as a class."

<!-- Center this -->
<div class="ease-center">
  <!-- Fade this in -->
  <h1 class="ease-fade-in">
    <!-- Make it grow on hover --><button class="ease-hover-grow">
      <!-- Slide up with delay -->
      <p class="ease-slide-up ease-delay-200"></p>
    </button>
  </h1>
</div>

No documentation lookup required. The class name is the documentation.

Four principles that never get broken

Principle What it means
Human-readable Class names describe behavior in plain English
Animation-first Motion is a first-class citizen, not an afterthought
Composable Stack any classes freely — no specificity wars, ever
Curated Every single class is maintainer-reviewed before release

How the curation pipeline works

1. Contributors submit raw HTML + CSS
         ↓
2. Maintainer reviews and evaluates fit
         ↓
3. Code is converted into EaseMotion CSS format
   (ease-* naming · CSS variables · accessibility)
         ↓
4. Integrated into core/ or components/
         ↓
5. Released, documented, and credited

Every class in the framework has passed through this process. The curation is what makes EaseMotion CSS consistent.


Usage and Examples

Development

Use the non-minified version for debugging and development:

<link rel="stylesheet" href="easemotion.css" />

### Animations

```html
<!-- Entrance animations (run on page load) -->
<h1 class="ease-fade-in">Fade in</h1>
<h2 class="ease-slide-up">Slide up</h2>
<h3 class="ease-slide-in-left">Slide left</h3>
<h4 class="ease-slide-in-right">Slide right</h4>
<h5 class="ease-zoom-in">Zoom in</h5>
<h6 class="ease-flip">3D flip</h6>

<!-- Staggered sequence — each item starts 100ms later -->
<div class="ease-slide-up ease-delay-100">First</div>
<div class="ease-slide-up ease-delay-200">Second</div>
<div class="ease-slide-up ease-delay-300">Third</div>

Duration Helpers

<div class="ease-slide-up ease-duration-fast">Fast animation</div>
<div class="ease-slide-up ease-duration-slow">Slow animation</div>
Class Duration
ease-duration-fast 150ms
ease-duration-medium 300ms
ease-duration-slow 600ms
Bouncing
Pulsing
Rotating
Ping

You can customize the iteration count of looping animations:

:root {
  --ease-animation-iterations: 3;
}

By default, the value is infinite, preserving existing behavior.

Scroll-Triggered Animations (Ease Reveal)

To use .ease-reveal and have elements animate when scrolled into view, you must also include the reveal.js script in your HTML:

<!-- Add this before closing </body> tag -->
<script src="https://cdn.jsdelivr.net/npm/easemotion-css/core/reveal.js"></script>

Then simply add .ease-reveal along with an animation class:

<div class="ease-reveal ease-slide-up">
  This animates when scrolled into view!
</div>

Hover Effects

<button class="ease-hover-grow">Scales up on hover</button>
<div class="ease-hover-morph-card">Morph</div>
<div class="ease-hover-glow">Primary color glow</div>
<div class="ease-hover-lift">Lifts with shadow</div>
<div class="ease-hover-shimmer">Shimmer sweep effect</div>
<a class="ease-hover-underline">Animated underline</a>
<span class="ease-hover-bounce-text">Bounce!</span>

Applies a quick squish animation during hover, focus, and active interactions.

Layout Utilities

<!-- Centering (the most-used utility) -->
<div class="ease-center">Perfectly centered</div>

<!-- Flexbox -->
<div class="ease-flex ease-justify-between ease-items-center ease-gap-4">
  <span>Left</span>
  <span class="ease-self-end">Right</span>
</div>

<!-- Flex wrap utilities -->
<div class="ease-flex ease-flex-wrap ease-gap-3">Wrap</div>
<div class="ease-flex ease-flex-nowrap ease-gap-3">No wrap</div>
<div class="ease-flex ease-flex-wrap-reverse ease-gap-3">Reverse wrap</div>

<!-- Align self utilities -->
<div class="ease-flex ease-items-stretch ease-gap-3">
  <span class="ease-self-start">Start</span>
  <span class="ease-self-center">Center</span>
  <span class="ease-self-end">End</span>
  <span class="ease-self-stretch">Stretch</span>
</div>

<!-- Responsive auto-fit grid (no media queries needed) -->
<div class="ease-grid ease-grid-auto ease-gap-6">
  <div class="ease-card">Card 1</div>
  <div class="ease-card">Card 2</div>
  <div class="ease-card">Card 3</div>
</div>

<!-- Grid placement utilities -->
<div class="ease-grid ease-grid-cols-4 ease-place-center ease-gap-4">
  <div class="ease-col-span-2">Centered span 2</div>
  <div class="ease-col-span-1">Span 1</div>
  <div class="ease-col-span-1">Span 1</div>
</div>
<div class="ease-grid ease-grid-cols-3 ease-place-start ease-gap-4">Start</div>
<div class="ease-grid ease-grid-cols-3 ease-place-end ease-gap-4">End</div>

Align Self Utilities

<div class="ease-flex">
  <div class="ease-self-start">Start</div>
  <div class="ease-self-center">Center</div>
  <div class="ease-self-end">End</div>
  <div class="ease-self-stretch">Stretch</div>
</div>

Available Classes

  • .ease-self-startalign-self: flex-start
  • .ease-self-centeralign-self: center
  • .ease-self-endalign-self: flex-end
  • .ease-self-stretchalign-self: stretch

Hover Animation Examples

Common hover-triggered animation examples are available for:

  • Buttons
  • Cards
  • Images

Example showcase:

  • hover-animation-showcase
  • hover-sweep

Buttons

<!-- Variants -->
<button class="ease-btn ease-btn-primary">Primary</button>
<button class="ease-btn ease-btn-success">Success</button>
<button class="ease-btn ease-btn-danger">Danger</button>
<button class="ease-btn ease-btn-outline">Outline</button>
<button class="ease-btn ease-btn-ghost">Ghost</button>

<!-- With hover animation -->
<button class="ease-btn ease-btn-primary ease-btn-hover">Animated</button>

<!-- With squish button -->
<button class="ease-btn ease-btn-primary ease-squish-button">Squish Me</button>

<!-- Sizes + shapes -->
<button class="ease-btn ease-btn-primary ease-btn-sm">Small</button>
<button class="ease-btn ease-btn-primary ease-btn-lg ease-btn-pill">
  Large Pill
</button>

Cards

<!-- Hover card with shadow -->
<div class="ease-card ease-card-shadow ease-card-hover">
  <div class="ease-card-header">
    <h3 class="ease-card-title">Title</h3>
  </div>
  <div class="ease-card-body"><p>Content goes here.</p></div>
  <div class="ease-card-footer">
    <button class="ease-btn ease-btn-primary ease-btn-sm">Action</button>
  </div>
</div>

<!-- Glassmorphism -->
<div class="ease-card ease-card-glass">Glass card</div>

<!-- Neumorphic -->
<div class="ease-card ease-card-neumorphic">Soft UI card</div>

<!-- Accent border -->
<div class="ease-card ease-card-accent">Highlighted card</div>

Navigation

<nav class="ease-navbar-glass" aria-label="Primary navigation">
  <div class="ease-navbar-brand">EaseMotion</div>
  <div class="ease-navbar-menu">
    <a class="ease-navbar-item" href="#">Home</a>
    <a class="ease-navbar-item" href="#">Features</a>
    <a class="ease-navbar-item" href="#">Contact</a>
  </div>
</nav>
<nav
  class="ease-navbar-glass ease-navbar-glass-sticky"
  aria-label="Sticky navigation"
>
  <div class="ease-navbar-brand">Sticky Nav</div>
  <div class="ease-navbar-menu">
    <a class="ease-navbar-item" href="#">Overview</a>
    <a class="ease-navbar-item" href="#">Docs</a>
  </div>
</nav>
<nav
  class="ease-navbar-glass ease-navbar-glass-blur"
  aria-label="Blurred navbar"
>
  <div class="ease-navbar-brand">Deep Blur</div>
  <div class="ease-navbar-menu">
    <a class="ease-navbar-item" href="#">Product</a>
    <a class="ease-navbar-item" href="#">Support</a>
  </div>
</nav>

Build a Hero Section in 5 Lines

<section class="ease-center ease-padding-16">
  <h1 class="ease-fade-in">Build faster.</h1>
  <p class="ease-slide-up ease-delay-200">Animation-first CSS for humans.</p>
  <button
    class="ease-btn ease-btn-primary ease-btn-lg ease-btn-pill ease-hover-grow ease-delay-300"
  >
    Get Started →
  </button>
</section>

Customization

Override any CSS custom property to theme the entire framework — no Sass, no PostCSS, just CSS:

:root {
  /* Colors */
  --ease-color-primary: #f97316; /* swap to orange  */
  --ease-color-success: #10b981; /* teal green      */

  /* Motion */
  --ease-speed-fast: 100ms; /* snappier        */
  --ease-speed-medium: 400ms; /* slightly slower */
  --ease-ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);

  /* Shape */
  --ease-radius-md: 1rem; /* rounder corners */
  --ease-radius-full: 9999px;

  /* Shadows */
  --ease-shadow-md: 0 4px 20px rgba(0, 0, 0, 0.15);
}

Override framework styles with @layer

EaseMotion wraps all its CSS behind @layer cascade layers. Your own styles always win — even if the framework loads after your stylesheet:

/* Your custom overrides — always takes priority */
@layer easemotion.components {
  .ease-btn-primary {
    background: var(--ease-color-orange);
    border-radius: 2rem;
  }
}

No !important needed.


FAQ

How does EaseMotion CSS differ from Tailwind?

Tailwind is a utility-first framework built around short atomic class names and usually fits best in a build-driven workflow. EaseMotion CSS focuses on human-readable class names like ease-center and ease-fade-in, treats animation as a first-class feature, and is designed to work immediately by linking a stylesheet.

Can I use it with React/Vue?

Yes. EaseMotion CSS works with any framework that renders standard HTML class attributes — React, Vue, Svelte, Angular, Astro, Next.js, and more. Install from npm, import the stylesheet, and use the class names directly in your components. We also ship a dedicated React <Animate> wrapper component in examples/react-vite/ — see the Framework Integration section for details.

How do I submit a new component or utility?

Open or claim an issue first, then submit your work under the appropriate track directory in submissions/ (e.g., submissions/examples/ for HTML/CSS, submissions/react/ for React components, submissions/scss/ for SCSS mixins/tokens, or submissions/docs/ for core bug fixes & docs showcases). The maintainer reviews your submission, standardizes names/tokens, and integrates it into the core framework.

Does it work without a build step?

Yes. That is one of the core goals of EaseMotion CSS. You can use the CDN link or local CSS files directly without configuring a bundler, compiler, or build pipeline.


File Structure

easemotion-css/
├── easemotion.css              ← readable source entry point
├── easemotion.min.css          ← bundled production build
│
├── core/                       ← MAINTAINER-ONLY
│   ├── variables.css           ← 60+ design tokens
│   ├── base.css                ← reset + typography (Inter font)
│   ├── animations.css          ← 20+ animation classes
│   └── utilities.css           ← 80+ layout utilities
│
├── components/                 ← MAINTAINER-ONLY
│   ├── buttons.css             ← 6 variants, 4 sizes, pill, icon
│   └── cards.css               ← 13 card variants
│
├── scss/                       ← SCSS INTEGRATION LAYER
│   ├── _index.scss             ← entry point (@forward variables + mixins)
│   ├── _variables.scss         ← SCSS animation tokens ($speed-*, $ease-*)
│   └── _mixins.scss            ← reusable SCSS mixins (animate, hover-effect...)
│
├── examples/                   ← INTEGRATION SHOWCASES
│   ├── demo.html               ← source interactive showcase
│   ├── react-vite/             ← ⚛️ React + Vite integration showcase
│   │   ├── src/
│   │   │   ├── App.jsx         ← interactive animation playground
│   │   │   ├── App.css         ← dark-mode dashboard styles
│   │   │   └── components/
│   │   │       └── Animate.jsx ← <Animate> React wrapper component
│   │   └── package.json
│   └── ...
│
├── docs/demo.html              ← deployed live demo page
├── docs/index.html             ← full documentation site
│
├── submissions/                ← CONTRIBUTOR AREA
│   ├── README.md               ← full submission workflow
│   └── examples/
│       ├── hover-grow/         ← [INTEGRATED] → ease-hover-grow
│       ├── hover-shimmer/      ← [INTEGRATED] → ease-hover-shimmer
│       ├── card-lift/          ← [INTEGRATED] → ease-card-lift
│       └── button-glow/        ← pending review
│
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── feature_request.md
│   │   └── bug_report.md
│   └── PULL_REQUEST_TEMPLATE.md
│
├── VISION.md                   ← long-term project direction
├── CHANGELOG.md                ← full release history
├── CONTRIBUTING.md             ← contribution guide
├── LICENSE                     ← MIT © 2026 Saptarshi Sadhu
└── README.md

Roadmap

Track progress and vote on features via GitHub Issues.

Feature Status
✅ Human-readable core utilities (80+) Shipped — v1.0
✅ Animation-first motion library (20+) Shipped — v1.0
✅ Curated contribution pipeline Shipped — v1.0
✅ Component library (buttons, cards) Shipped — v1.0
✅ npm package + jsDelivr CDN Shipped — v1.0
✅ Full documentation site Shipped — v1.0
✅ React + Vite integration showcase Shipped — v1.1
✅ SCSS token layer (variables + mixins) Shipped — v1.1
🚧 React component library (hooks + wrappers) In Progress — v1.1
🚧 SCSS modular partials (per-animation modules) In Progress — v1.1
🚧 Next.js App Router template In Progress — v1.1
🔜 Form components (inputs, checkboxes, toggles) Planned — v1.2
🔜 Dark mode token layer Planned — v1.2
🔜 Modal & tooltip components Planned — v1.2
🔜 Scroll-triggered animations (IntersectionObserver) Planned — v1.2
🔜 Navigation components (navbar, sidebar) Planned — v1.3
🔜 CSS-only accordion & tabs Planned — v1.3
🔜 Badge, tag, avatar, progress bar Planned — v1.3
🔜 Theming CLI (generate custom token file) Exploring

Contributing

EaseMotion CSS is a curated, maintainer-reviewed framework. Contributors submit raw ideas — the maintainer handles standardization, naming, and integration.

✅ What contributors do

✅ Place submissions inside the correct track folder (submissions/examples/, submissions/react/, submissions/scss/, or submissions/docs/)
✅ Include all required files (e.g. JSX + README for React, SCSS + README for SCSS, or HTML + CSS + README for Standard)
✅ Follow the suffix naming rule (e.g. ease-component-yourid) to avoid name collisions
✅ Squash commits to keep the repository history clean
✅ One feature/component per PR

❌ What contributors do NOT do

❌ Edit core/           → PR closed without review
❌ Edit components/     → PR closed without review
❌ Merge their own PRs  → Maintainer-only
❌ Claim more than 2 active issues at once

The submission pipeline

Your raw CSS  →  Maintainer standardizes  →  ease-* class ships
.hover-grow       ease-hover-grow              core/animations.css

🌟 Why contribute?

  • Beginner-friendly — write raw CSS, no conventions to memorize
  • Learn real system design — see how raw ideas become a coherent API
  • Your idea ships — accepted submissions become real framework classes
  • Credited in CHANGELOG — your contribution is documented permanently
  • Your name in the README — see the contributor wall below

📖 Read the full guide → CONTRIBUTING.md

📢 Contribution Rate Limit Update

To maintain repository stability, review quality, and fair contribution distribution, EaseMotion CSS is introducing a soft contribution limit:

  • Contributors may submit up to 25 PRs per day
  • Focus on quality, originality, accessibility, and proper testing
  • Low-effort, repetitive, or mass-generated PRs may be closed without review

Why This Change?

EaseMotion CSS has grown rapidly with hundreds of contributors and thousands of merged PRs. This update helps:

  • Reduce merge conflicts
  • Improve review quality
  • Maintain framework consistency
  • Encourage meaningful contributions over quantity

🧹 Clean Commit History & Squashing

To keep the repository's git history clean and readable, contributors must follow these rules:

  • Squash your commits: Ensure all commits in your Pull Request are squashed into a single meaningful commit (or a few logical commits) before submitting for review. Do not push dozens of micro-commits (e.g., "fix", "typo", "update style.css", etc.) for a single change.
  • Keep history clean: PRs containing noisy, repetitive, or excessive commit histories (e.g., dozens of micro-commits) may be closed without review or blocked from merging.
  • Write clear commit messages: Use descriptive commit messages following the Conventional Commits format (e.g., feat: add card component or fix: resolve hover animation issue).

📢 Contribution Policy Update

All contributions are welcome and eligible for merge when submitted inside the correct track folder under the submissions/ directory following the repository guidelines.

To avoid naming conflicts and overlapping implementations, contributors must append a short unique identifier or abbreviation to their feature/component/mixin name.

Example:

  • ease-hover-sap
  • ease-tabs-ak
  • ease-card-pr

This ensures:

  • Unambiguous component naming,
  • Preservation of every contributor’s work,
  • Conflict-free merges,
  • Easier maintenance and review workflow,
  • Support for parallel implementations of similar ideas.

The project encourages creative variations and parallel implementations rather than overwriting existing contributor work.


Issue Labels 🏷️

Label Used for
good first issue Easy entry points, perfect for first-time contributors
animation Hover effects, entrance animations, keyframe ideas
component New UI components (modals, tooltips, badges, etc.)
enhancement Improvements to existing classes
documentation README, docs site, submission guide
curated Accepted into the framework
maintainer-approved Reviewed, pending integration
featured Exceptional submission — will be showcased

Issue Cooldown Rule: Maximum 2 active assigned issues per contributor. Issues with no progress for 24 hours (1 day) are unassigned and reopened.


Community

Platform Link
🐛 Bug Reports Open an issue
💡 Feature Requests Request a feature
🔀 Pull Requests Submit a contribution
📖 Documentation Full docs site
📦 npm Package easemotion-css on npm
🌐 CDN jsDelivr (GitHub CDN)
🏆 GSSoC 2026 GirlScript Summer of Code
💬 Discord Server (Optional) Join Discord (Optional)

If EaseMotion CSS saves you time, consider starring the repo. It helps more developers discover the project and motivates continued development.


Contributors

Everyone who has submitted a PR, opened an issue, or contributed an idea. This wall regenerates automatically on every push to main.

249 Contributors

SAPTARSHI-coder
SAPTARSHI-coder
29560 commits
ionfwsrijan
ionfwsrijan
2565 commits
srujana-manda
srujana-manda
937 commits
realtushartyagi
realtushartyagi
755 commits
harrshita123
harrshita123
726 commits
sahare77
sahare77
725 commits
tmdeveloper007
tmdeveloper007
710 commits
sanrishi
sanrishi
699 commits
Anexus5919
Anexus5919
674 commits
richachauhan15
richachauhan15
657 commits
KaparthyReddy
KaparthyReddy
652 commits
Aryan0819
Aryan0819
555 commits
nazneen-p1
nazneen-p1
545 commits
Avinash-sdbegin
Avinash-sdbegin
516 commits
Stewartsson
Stewartsson
456 commits
scriptedbyshivam
scriptedbyshivam
452 commits
Dharm3112
Dharm3112
451 commits
kunal-9090
kunal-9090
443 commits
22oo1cso56mansoorkhan-cell
22oo1cso56mansoorkhan-cell
441 commits
Xenon010101
Xenon010101
376 commits
thakurakanksha288
thakurakanksha288
371 commits
sonusharma6-dsa
sonusharma6-dsa
310 commits
vmdivyareddy18
vmdivyareddy18
305 commits
saidai-bhuvanesh
saidai-bhuvanesh
280 commits
ARPANPATRA111
ARPANPATRA111
279 commits
openhands-agent
openhands-agent
269 commits
Pratyush-Panda-2006
Pratyush-Panda-2006
268 commits
servis
servis
258 commits
ash1shkumar
ash1shkumar
255 commits
itssagarK
itssagarK
254 commits
hrx01-dev
hrx01-dev
245 commits
aaniya22
aaniya22
221 commits
adarsh-gautam-sys
adarsh-gautam-sys
219 commits
suman20041
suman20041
210 commits
Tomeshwari-02
Tomeshwari-02
187 commits
Anushreer22
Anushreer22
171 commits
nyxsky404
nyxsky404
162 commits
ashroxy
ashroxy
156 commits
Rashi1404
Rashi1404
134 commits
nancy-verma780
nancy-verma780
128 commits
avanibapna06
avanibapna06
124 commits
kavin553
kavin553
120 commits
jainiksha
jainiksha
118 commits
sudha09-git
sudha09-git
117 commits
Babin123456
Babin123456
109 commits
pari-dubey1
pari-dubey1
104 commits
bhaikd
bhaikd
102 commits
eranmol2007-coder
eranmol2007-coder
101 commits
iammissmiller
iammissmiller
97 commits
prerendrarahitya1708
prerendrarahitya1708
95 commits
BhakktiGautam
BhakktiGautam
95 commits
Nicks-19
Nicks-19
94 commits
desireddymohithreddy0925
desireddymohithreddy0925
93 commits
Prateek2007-cmd
Prateek2007-cmd
92 commits
karishmaram-tech
karishmaram-tech
91 commits
IshwinderKaur8
IshwinderKaur8
89 commits
panditshubham766-dotcom
panditshubham766-dotcom
88 commits
TavishaBudhiraja
TavishaBudhiraja
87 commits
ArshVermaGit
ArshVermaGit
86 commits
ishita526
ishita526
86 commits
codedbydollys10
codedbydollys10
82 commits
Hasini2706
Hasini2706
81 commits
broskell
broskell
81 commits
pari-28
pari-28
80 commits
Rajlakshmi-ai
Rajlakshmi-ai
80 commits
Abhay-1704
Abhay-1704
78 commits
KRITIKA-l
KRITIKA-l
77 commits
dreynox
dreynox
76 commits
aparna24bce11388
aparna24bce11388
74 commits
Daksh7785
Daksh7785
74 commits
dnyaneshwari44
dnyaneshwari44
73 commits
Kokila-chandrakar
Kokila-chandrakar
73 commits
WHENKEY2007
WHENKEY2007
73 commits
shresthbhargava
shresthbhargava
73 commits
silentguyracer
silentguyracer
73 commits
ZainabTravadi
ZainabTravadi
72 commits
Shreeya1207
Shreeya1207
69 commits
SathvikaSingoti
SathvikaSingoti
68 commits
Ru-2008
Ru-2008
68 commits
CoderMS07
CoderMS07
66 commits
pradeep0153
pradeep0153
66 commits
geetanunakani
geetanunakani
63 commits
pisum-sativum
pisum-sativum
62 commits
vaishnavi-212
vaishnavi-212
62 commits
Ayontikapal
Ayontikapal
59 commits
hruthika18
hruthika18
59 commits
itsdakshjain
itsdakshjain
57 commits
TanCodeX
TanCodeX
57 commits
poorvanshi10
poorvanshi10
55 commits
JAY4IGNITE
JAY4IGNITE
55 commits
chavanGaneshDatta
chavanGaneshDatta
55 commits
Aditya8369
Aditya8369
55 commits
REHAN-503
REHAN-503
54 commits
soumyasekharshee265-ops
soumyasekharshee265-ops
52 commits
Aryan-Agarwal-creator
Aryan-Agarwal-creator
51 commits
Viidhii19
Viidhii19
50 commits
ayushsri-dev
ayushsri-dev
49 commits
sricharan-213
sricharan-213
47 commits

Auto-updated daily · View all →


Maintainer

Saptarshi Sadhu

GitHub

EaseMotion CSS is designed, curated, and actively maintained by Saptarshi Sadhu. All contributions are reviewed and standardized before integration. The framework does not accept unreviewed direct edits.

Only the maintainer merges pull requests. This is enforced via CODEOWNERS.


Changelog

See CHANGELOG.md for the full release history.

Latest: v1.1.0 — New text motion & ambient utilities, v1.1 release, minified bundle optimization, 12,000+ merged PRs.


License

MIT © 2026 Saptarshi Sadhu — see LICENSE for details.

You are free to use EaseMotion CSS in personal and commercial projects. Attribution appreciated but not required.


Thank you for building EaseMotion CSS with me. 💜

Every star, every PR, every issue — it all adds up.

— Saptarshi Sadhu · @SAPTARSHI-coder


npm Stars License Sponsor

Built with care  ·  Zero dependencies  ·  Animation-first  ·  Community-driven

Accessibility

EaseMotion CSS supports the prefers-reduced-motion media query to respect users who prefer reduced motion and reduce animation-related discomfort. When enabled at the operating system level, animations and transitions are minimized to provide a more accessible experience.

About

Animation-first CSS framework with reusable UI components, modern effects, and zero dependencies. Lightweight, beginner-friendly, and open-source.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages