easemotion-css 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +99 -0
- package/LICENSE +21 -0
- package/README.md +350 -0
- package/components/buttons.css +226 -0
- package/components/cards.css +210 -0
- package/core/animations.css +336 -0
- package/core/base.css +137 -0
- package/core/utilities.css +277 -0
- package/core/variables.css +106 -0
- package/easemotion.css +23 -0
- package/package.json +40 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to EaseMotion CSS are documented here.
|
|
4
|
+
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## [v1.0.0] — 2026-03-29
|
|
9
|
+
|
|
10
|
+
### 🎉 Initial Public Release
|
|
11
|
+
|
|
12
|
+
EaseMotion CSS v1.0.0 is the first public release of the framework. This version establishes the core architecture, animation system, component library, and contribution pipeline.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
#### Core System
|
|
19
|
+
|
|
20
|
+
- `core/variables.css` — Complete design token system
|
|
21
|
+
- Transition speeds: `--ease-speed-fast`, `--ease-speed-medium`, `--ease-speed-slow`
|
|
22
|
+
- Easing curves: `--ease-ease`, `--ease-ease-out`, `--ease-ease-bounce`
|
|
23
|
+
- Color palette: primary, success, danger, warning, neutrals (50–900 scale)
|
|
24
|
+
- Glow tokens: `--ease-glow-primary`, `--ease-glow-success`, `--ease-glow-danger`
|
|
25
|
+
- Spacing scale: `--ease-space-1` through `--ease-space-16`
|
|
26
|
+
- Border radius scale, shadow system, typography tokens, z-index scale
|
|
27
|
+
|
|
28
|
+
- `core/base.css` — Reset and typographic foundation
|
|
29
|
+
- Box-model reset, smooth scroll, font smoothing
|
|
30
|
+
- Inter (Google Fonts) as default sans-serif
|
|
31
|
+
- Semantic element defaults: headings, paragraphs, links, lists, code, pre
|
|
32
|
+
- Accessible focus ring, custom selection color
|
|
33
|
+
|
|
34
|
+
- `core/animations.css` — Animation library (12 keyframes, 20+ classes)
|
|
35
|
+
- Entrance: `ease-fade-in`, `ease-fade-out`, `ease-slide-up`, `ease-slide-down`, `ease-slide-in-left`, `ease-slide-in-right`, `ease-zoom-in`, `ease-flip`
|
|
36
|
+
- Looping: `ease-bounce`, `ease-rotate`, `ease-pulse`, `ease-ping`, `ease-shake`
|
|
37
|
+
- Hover: `ease-hover-grow`, `ease-hover-shrink`, `ease-hover-glow`, `ease-hover-lift`, `ease-hover-underline`
|
|
38
|
+
- Stagger delays: `ease-delay-75`, `ease-delay-100`, `ease-delay-150`, `ease-delay-200`, `ease-delay-300`, `ease-delay-500`, `ease-delay-700`
|
|
39
|
+
- Duration overrides: `ease-duration-fast/medium/slow`
|
|
40
|
+
- `prefers-reduced-motion` support
|
|
41
|
+
|
|
42
|
+
- `core/utilities.css` — 80+ layout and styling utilities
|
|
43
|
+
- Display: `ease-block`, `ease-flex`, `ease-grid`, `ease-hidden`
|
|
44
|
+
- Flexbox: `ease-center`, `ease-flex-col`, `ease-items-*`, `ease-justify-*`
|
|
45
|
+
- Grid: `ease-grid-cols-1/2/3/4`, `ease-grid-auto`
|
|
46
|
+
- Gap, padding, margin scales
|
|
47
|
+
- Width/height, container, positioning, overflow
|
|
48
|
+
- Typography: size, alignment, weight, transform
|
|
49
|
+
- Color: text and background variants
|
|
50
|
+
- Border, radius, shadow, opacity, cursor
|
|
51
|
+
- Responsive helpers (`ease-sm-*`)
|
|
52
|
+
|
|
53
|
+
#### Components
|
|
54
|
+
|
|
55
|
+
- `components/buttons.css` — Full button system
|
|
56
|
+
- Variants: primary, success, danger, outline, ghost, link
|
|
57
|
+
- Sizes: sm, base, lg, xl
|
|
58
|
+
- Modifiers: pill, block, icon, loading spinner
|
|
59
|
+
- States: disabled, active
|
|
60
|
+
- `ease-btn-hover` — composable lift+glow hover animation
|
|
61
|
+
- Button group layout
|
|
62
|
+
|
|
63
|
+
- `components/cards.css` — 12 card variants
|
|
64
|
+
- Base card with header/body/footer sections
|
|
65
|
+
- Modifiers: shadow, hover, glow, flat, outlined, glass, accent, image, compact, horizontal
|
|
66
|
+
- Alert colors: info, success, danger
|
|
67
|
+
- Stat card with value + label layout
|
|
68
|
+
|
|
69
|
+
#### Integrations (from community submissions)
|
|
70
|
+
|
|
71
|
+
- `ease-hover-grow` — [INTEGRATED] from `submissions/examples/hover-grow/`
|
|
72
|
+
- `ease-hover-shimmer` — [INTEGRATED] from `submissions/examples/hover-shimmer/`
|
|
73
|
+
- `ease-card-lift` — [INTEGRATED] from `submissions/examples/card-lift/`
|
|
74
|
+
|
|
75
|
+
#### Infrastructure
|
|
76
|
+
|
|
77
|
+
- `easemotion.css` — Single-import entry point
|
|
78
|
+
- `examples/demo.html` — Interactive showcase with dark theme, click-to-replay animations
|
|
79
|
+
- `docs/index.html` — Full sidebar documentation site
|
|
80
|
+
- `submissions/` — Curated contribution pipeline
|
|
81
|
+
- `submissions/README.md` — Full workflow guide
|
|
82
|
+
- `submissions/examples/hover-grow/` — Reference submission (integrated)
|
|
83
|
+
- `submissions/examples/hover-shimmer/` — Reference submission (integrated)
|
|
84
|
+
- `submissions/examples/card-lift/` — Reference submission (integrated)
|
|
85
|
+
- `submissions/examples/button-glow/` — Pending review
|
|
86
|
+
- `.github/CODEOWNERS` — Maintainer enforced on all critical paths
|
|
87
|
+
- `.github/ISSUE_TEMPLATE/feature_request.md` — Structured feature request template
|
|
88
|
+
- `.github/PULL_REQUEST_TEMPLATE.md` — Strict PR checklist
|
|
89
|
+
- `.gitignore`
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Roadmap
|
|
94
|
+
|
|
95
|
+
See [VISION.md](./VISION.md) for the long-term direction.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
*Maintained by [Saptarshi Sadhu](https://github.com/SAPTARSHI-coder)*
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Saptarshi Sadhu
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# ⚡ EaseMotion CSS
|
|
4
|
+
|
|
5
|
+
**Human-readable. Animation-first. Zero dependencies.**
|
|
6
|
+
|
|
7
|
+
Designed and curated by **Saptarshi Sadhu**
|
|
8
|
+
|
|
9
|
+
[](./LICENSE)
|
|
10
|
+
[](https://www.npmjs.com/package/easemotion-css)
|
|
11
|
+
[](https://www.jsdelivr.com/package/npm/easemotion-css)
|
|
12
|
+
[](./CONTRIBUTING.md)
|
|
13
|
+
[](https://github.com/SAPTARSHI-coder/easemotion-css/stargazers)
|
|
14
|
+
[](https://github.com/SAPTARSHI-coder)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
### **🚀 One line. That's all you need.**
|
|
19
|
+
|
|
20
|
+
**`https://cdn.jsdelivr.net/npm/easemotion-css/easemotion.css`**
|
|
21
|
+
|
|
22
|
+
```html
|
|
23
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/easemotion-css/easemotion.css" />
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
> Copy it. Paste it. Ship it. No npm. No build step. No config.
|
|
27
|
+
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
EaseMotion CSS is a curated, animation-first CSS framework where class names read like plain English. No memorizing shorthand. No build steps. Just write HTML and it works.
|
|
33
|
+
|
|
34
|
+
```html
|
|
35
|
+
<div class="ease-center ease-fade-in">
|
|
36
|
+
<button class="ease-btn ease-btn-primary ease-hover-grow">Get Started</button>
|
|
37
|
+
</div>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
⚡ Build beautiful animated interfaces using readable CSS classes.
|
|
42
|
+
|
|
43
|
+
No build step. No configuration.
|
|
44
|
+
Just link a file and start building.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
## 👤 Maintainer
|
|
48
|
+
|
|
49
|
+
EaseMotion CSS is designed, curated, and actively maintained by:
|
|
50
|
+
|
|
51
|
+
**Saptarshi Sadhu** · [@SAPTARSHI-coder](https://github.com/SAPTARSHI-coder)
|
|
52
|
+
|
|
53
|
+
This is a controlled framework — all contributions are reviewed and standardized before integration. The framework does not accept unreviewed direct edits. See [Contribution Policy](#️-contribution-policy) and [CONTRIBUTING.md](./CONTRIBUTING.md) for details.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 🚀 Quick Start
|
|
58
|
+
|
|
59
|
+
**Option 1 — CDN (fastest, zero setup)**
|
|
60
|
+
|
|
61
|
+
```html
|
|
62
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/easemotion-css/easemotion.css" />
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
That's it. Works anywhere, zero installation.
|
|
66
|
+
|
|
67
|
+
**Option 2 — npm**
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
npm install easemotion-css
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
```html
|
|
74
|
+
<link rel="stylesheet" href="node_modules/easemotion-css/easemotion.css" />
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Option 3 — Import only what you need**
|
|
78
|
+
|
|
79
|
+
```html
|
|
80
|
+
<!-- Core: always required, load in this order -->
|
|
81
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/easemotion-css/core/variables.css" />
|
|
82
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/easemotion-css/core/base.css" />
|
|
83
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/easemotion-css/core/animations.css" />
|
|
84
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/easemotion-css/core/utilities.css" />
|
|
85
|
+
|
|
86
|
+
<!-- Components: add only what you use -->
|
|
87
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/easemotion-css/components/buttons.css" />
|
|
88
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/easemotion-css/components/cards.css" />
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
> ⚠️ **`variables.css` must always load first.** Every other file depends on the CSS custom properties it defines.
|
|
92
|
+
|
|
93
|
+
No build step. No Node. No configuration. Open your HTML file and it works.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 🧠 Philosophy
|
|
98
|
+
|
|
99
|
+
EaseMotion CSS is not just a CSS library — it is a design language.
|
|
100
|
+
|
|
101
|
+
Most frameworks force a trade-off between readability and speed. EaseMotion CSS argues you should not have to choose.
|
|
102
|
+
|
|
103
|
+
| | Vanilla CSS | Tailwind | **EaseMotion CSS** |
|
|
104
|
+
|---|---|---|---|
|
|
105
|
+
| Setup | Write from scratch | Build step + config | **Link one file** |
|
|
106
|
+
| Readability | High | Low (`px-4 flex gap-x-2`) | **High** (`ease-center`) |
|
|
107
|
+
| Animations | Manual | Minimal | **First-class** |
|
|
108
|
+
| Quality control | You | You | **Curated by maintainer** |
|
|
109
|
+
|
|
110
|
+
**Write UI like you describe it in English:**
|
|
111
|
+
|
|
112
|
+
```html
|
|
113
|
+
<!-- Center this -->
|
|
114
|
+
<div class="ease-center">
|
|
115
|
+
|
|
116
|
+
<!-- Fade this in -->
|
|
117
|
+
<h1 class="ease-fade-in">
|
|
118
|
+
|
|
119
|
+
<!-- Make it grow on hover -->
|
|
120
|
+
<button class="ease-hover-grow">
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
No documentation lookup required. The class name **is** the documentation.
|
|
124
|
+
|
|
125
|
+
**Four principles that never get broken:**
|
|
126
|
+
|
|
127
|
+
| Principle | What it means |
|
|
128
|
+
|-----------|--------------|
|
|
129
|
+
| **Human-readable** | Class names describe behavior in plain English |
|
|
130
|
+
| **Animation-first** | Motion is a first-class feature, not an add-on |
|
|
131
|
+
| **Composable** | Stack classes freely with no specificity wars |
|
|
132
|
+
| **Curated** | Every class is maintainer-reviewed before release |
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## ⚙️ How EaseMotion CSS Works
|
|
137
|
+
|
|
138
|
+
EaseMotion CSS uses a structured pipeline from raw idea to released class:
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
1. Contributors submit raw HTML + CSS
|
|
142
|
+
↓
|
|
143
|
+
2. Maintainer reviews and evaluates fit
|
|
144
|
+
↓
|
|
145
|
+
3. Code is converted into EaseMotion CSS format
|
|
146
|
+
(ease-* naming, CSS variables, comments)
|
|
147
|
+
↓
|
|
148
|
+
4. Integrated into core/ or components/
|
|
149
|
+
↓
|
|
150
|
+
5. Released and documented
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Every class in the framework has passed through this process. The curation is what makes EaseMotion CSS consistent.
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 📦 Usage Examples
|
|
158
|
+
|
|
159
|
+
### Layout
|
|
160
|
+
|
|
161
|
+
```html
|
|
162
|
+
<!-- Center — the most-used utility -->
|
|
163
|
+
<div class="ease-center">Centered</div>
|
|
164
|
+
|
|
165
|
+
<!-- Responsive auto-fit grid -->
|
|
166
|
+
<div class="ease-grid ease-grid-auto ease-gap-6">
|
|
167
|
+
<div>Card 1</div><div>Card 2</div><div>Card 3</div>
|
|
168
|
+
</div>
|
|
169
|
+
|
|
170
|
+
<!-- Flex row: space between -->
|
|
171
|
+
<div class="ease-flex ease-justify-between ease-items-center ease-padding-4">
|
|
172
|
+
<span>Left</span><span>Right</span>
|
|
173
|
+
</div>
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Animations
|
|
177
|
+
|
|
178
|
+
```html
|
|
179
|
+
<!-- Entrance (fires on load) -->
|
|
180
|
+
<h1 class="ease-fade-in">Hello</h1>
|
|
181
|
+
<p class="ease-slide-up ease-delay-200">Subtitle</p>
|
|
182
|
+
|
|
183
|
+
<!-- Staggered sequence -->
|
|
184
|
+
<div class="ease-slide-up ease-delay-100">First</div>
|
|
185
|
+
<div class="ease-slide-up ease-delay-200">Second</div>
|
|
186
|
+
<div class="ease-slide-up ease-delay-300">Third</div>
|
|
187
|
+
|
|
188
|
+
<!-- Hover effects -->
|
|
189
|
+
<button class="ease-hover-grow">Grows on hover</button>
|
|
190
|
+
<div class="ease-hover-glow">Glows on hover</div>
|
|
191
|
+
<div class="ease-hover-shimmer">Shimmer sweep</div>
|
|
192
|
+
<div class="ease-card-lift">Lifts on hover</div>
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Buttons
|
|
196
|
+
|
|
197
|
+
```html
|
|
198
|
+
<button class="ease-btn ease-btn-primary">Primary</button>
|
|
199
|
+
<button class="ease-btn ease-btn-success">Success</button>
|
|
200
|
+
<button class="ease-btn ease-btn-danger">Danger</button>
|
|
201
|
+
<button class="ease-btn ease-btn-outline">Outline</button>
|
|
202
|
+
|
|
203
|
+
<!-- With hover animation -->
|
|
204
|
+
<button class="ease-btn ease-btn-primary ease-btn-hover">Animated</button>
|
|
205
|
+
|
|
206
|
+
<!-- Sizes + pill -->
|
|
207
|
+
<button class="ease-btn ease-btn-primary ease-btn-sm">Small</button>
|
|
208
|
+
<button class="ease-btn ease-btn-primary ease-btn-lg ease-btn-pill">Large Pill</button>
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Cards
|
|
212
|
+
|
|
213
|
+
```html
|
|
214
|
+
<div class="ease-card ease-card-shadow ease-card-hover">
|
|
215
|
+
<div class="ease-card-header">
|
|
216
|
+
<h3 class="ease-card-title">Title</h3>
|
|
217
|
+
</div>
|
|
218
|
+
<div class="ease-card-body"><p>Content</p></div>
|
|
219
|
+
<div class="ease-card-footer">
|
|
220
|
+
<button class="ease-btn ease-btn-primary ease-btn-sm">Action</button>
|
|
221
|
+
</div>
|
|
222
|
+
</div>
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## ⚙️ Customization
|
|
228
|
+
|
|
229
|
+
Override any CSS variable to theme the entire framework in one block:
|
|
230
|
+
|
|
231
|
+
```css
|
|
232
|
+
:root {
|
|
233
|
+
--ease-color-primary: #f97316; /* orange */
|
|
234
|
+
--ease-speed-medium: 500ms; /* slower */
|
|
235
|
+
--ease-radius-md: 1rem; /* rounder */
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## 📂 File Structure
|
|
242
|
+
|
|
243
|
+
```
|
|
244
|
+
easemotion-css/
|
|
245
|
+
├── easemotion.css ← SINGLE IMPORT ENTRY POINT
|
|
246
|
+
│
|
|
247
|
+
├── core/ ← MAINTAINER-ONLY
|
|
248
|
+
│ ├── variables.css ← design tokens
|
|
249
|
+
│ ├── base.css ← reset + typography
|
|
250
|
+
│ ├── animations.css ← animation library
|
|
251
|
+
│ └── utilities.css ← layout utilities
|
|
252
|
+
│
|
|
253
|
+
├── components/ ← MAINTAINER-ONLY
|
|
254
|
+
│ ├── buttons.css
|
|
255
|
+
│ └── cards.css
|
|
256
|
+
│
|
|
257
|
+
├── submissions/ ← CONTRIBUTOR AREA
|
|
258
|
+
│ ├── README.md ← submission workflow
|
|
259
|
+
│ └── examples/
|
|
260
|
+
│ ├── hover-grow/ ← [INTEGRATED] → ease-hover-grow
|
|
261
|
+
│ ├── hover-shimmer/ ← [INTEGRATED] → ease-hover-shimmer
|
|
262
|
+
│ ├── card-lift/ ← [INTEGRATED] → ease-card-lift
|
|
263
|
+
│ └── button-glow/ ← pending review
|
|
264
|
+
│
|
|
265
|
+
├── examples/demo.html ← live showcase
|
|
266
|
+
├── docs/index.html ← documentation site
|
|
267
|
+
│
|
|
268
|
+
├── .github/
|
|
269
|
+
│ ├── CODEOWNERS
|
|
270
|
+
│ ├── ISSUE_TEMPLATE/feature_request.md
|
|
271
|
+
│ └── PULL_REQUEST_TEMPLATE.md
|
|
272
|
+
│
|
|
273
|
+
├── VISION.md ← project direction
|
|
274
|
+
├── CHANGELOG.md ← release history
|
|
275
|
+
├── CONTRIBUTING.md
|
|
276
|
+
├── LICENSE ← MIT © 2026 Saptarshi Sadhu
|
|
277
|
+
└── README.md
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## 🏷️ Issue Labels
|
|
283
|
+
|
|
284
|
+
| Label | Used for |
|
|
285
|
+
|-------|----------|
|
|
286
|
+
| `good first issue` | Easy submissions, ideal for first contributions |
|
|
287
|
+
| `animation` | Hover effects, entrance animations, keyframe ideas |
|
|
288
|
+
| `component` | New UI components (tooltips, modals, badges, etc.) |
|
|
289
|
+
| `enhancement` | Improvements to existing classes |
|
|
290
|
+
| `documentation` | README, docs site, submission guide updates |
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## ⚠️ Contribution Policy
|
|
295
|
+
|
|
296
|
+
EaseMotion CSS is a **curated, maintainer-reviewed framework**. It is not an open-edit project.
|
|
297
|
+
|
|
298
|
+
### What contributors do
|
|
299
|
+
|
|
300
|
+
```
|
|
301
|
+
✅ Add a folder to submissions/examples/your-feature/
|
|
302
|
+
✅ Include: demo.html, style.css, README.md
|
|
303
|
+
✅ Use any class naming — no ease- prefix required
|
|
304
|
+
✅ One feature per PR
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### What contributors do NOT do
|
|
308
|
+
|
|
309
|
+
```
|
|
310
|
+
❌ Edit core/ → PR closed without review
|
|
311
|
+
❌ Edit components/ → PR closed without review
|
|
312
|
+
❌ Merge their own PRs → Maintainer-only
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### How submissions become framework classes
|
|
316
|
+
|
|
317
|
+
```
|
|
318
|
+
Your raw CSS → Maintainer standardizes → ease-* class ships
|
|
319
|
+
.hover-grow ease-hover-grow core/animations.css
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### 🌟 Why contribute?
|
|
323
|
+
|
|
324
|
+
- **Beginner-friendly** — write raw CSS, no conventions to memorize
|
|
325
|
+
- **Learn real system design** — see how raw ideas become a coherent API
|
|
326
|
+
- **Your idea ships** — accepted submissions become real framework classes, credited in the changelog
|
|
327
|
+
- **Build in public** — your submission folder stays in the repo permanently as a contribution record
|
|
328
|
+
|
|
329
|
+
See [submissions/README.md](./submissions/README.md) for the full workflow.
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
## 🌐 Official Maintainer
|
|
334
|
+
|
|
335
|
+
**Saptarshi Sadhu**
|
|
336
|
+
GitHub: [@SAPTARSHI-coder](https://github.com/SAPTARSHI-coder)
|
|
337
|
+
|
|
338
|
+
> Only the maintainer merges pull requests. This is enforced via [CODEOWNERS](./.github/CODEOWNERS).
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
## License
|
|
343
|
+
|
|
344
|
+
MIT © 2026 Saptarshi Sadhu — see [LICENSE](./LICENSE).
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
<div align="center">
|
|
349
|
+
Built with care · Zero dependencies · Animation-first
|
|
350
|
+
</div>
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/* ============================================================
|
|
2
|
+
EaseMotion CSS — buttons.css
|
|
3
|
+
Composable, accessible button components
|
|
4
|
+
============================================================ */
|
|
5
|
+
|
|
6
|
+
/* ── Base Button ───────────────────────────────────────────── */
|
|
7
|
+
|
|
8
|
+
.ease-btn {
|
|
9
|
+
display: inline-flex;
|
|
10
|
+
align-items: center;
|
|
11
|
+
justify-content: center;
|
|
12
|
+
gap: var(--ease-space-2);
|
|
13
|
+
|
|
14
|
+
padding: var(--ease-space-3) var(--ease-space-6);
|
|
15
|
+
font-family: var(--ease-font-sans);
|
|
16
|
+
font-size: var(--ease-text-sm);
|
|
17
|
+
font-weight: 600;
|
|
18
|
+
letter-spacing: 0.02em;
|
|
19
|
+
line-height: 1;
|
|
20
|
+
white-space: nowrap;
|
|
21
|
+
|
|
22
|
+
border: 2px solid transparent;
|
|
23
|
+
border-radius: var(--ease-radius-md);
|
|
24
|
+
cursor: pointer;
|
|
25
|
+
user-select: none;
|
|
26
|
+
text-decoration: none;
|
|
27
|
+
|
|
28
|
+
transition:
|
|
29
|
+
background-color var(--ease-speed-fast) var(--ease-ease),
|
|
30
|
+
color var(--ease-speed-fast) var(--ease-ease),
|
|
31
|
+
border-color var(--ease-speed-fast) var(--ease-ease),
|
|
32
|
+
box-shadow var(--ease-speed-medium) var(--ease-ease),
|
|
33
|
+
transform var(--ease-speed-fast) var(--ease-ease-bounce);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.ease-btn:active {
|
|
37
|
+
transform: scale(0.97);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.ease-btn:focus-visible {
|
|
41
|
+
outline: 2px solid var(--ease-color-primary);
|
|
42
|
+
outline-offset: 3px;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* ── Variants ──────────────────────────────────────────────── */
|
|
46
|
+
|
|
47
|
+
/* Primary */
|
|
48
|
+
.ease-btn-primary {
|
|
49
|
+
background-color: var(--ease-color-primary);
|
|
50
|
+
color: #ffffff;
|
|
51
|
+
border-color: var(--ease-color-primary);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.ease-btn-primary:hover {
|
|
55
|
+
background-color: var(--ease-color-primary-dark);
|
|
56
|
+
border-color: var(--ease-color-primary-dark);
|
|
57
|
+
box-shadow: var(--ease-glow-primary);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* Success */
|
|
61
|
+
.ease-btn-success {
|
|
62
|
+
background-color: var(--ease-color-success);
|
|
63
|
+
color: #ffffff;
|
|
64
|
+
border-color: var(--ease-color-success);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.ease-btn-success:hover {
|
|
68
|
+
background-color: var(--ease-color-success-dark);
|
|
69
|
+
border-color: var(--ease-color-success-dark);
|
|
70
|
+
box-shadow: var(--ease-glow-success);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* Danger */
|
|
74
|
+
.ease-btn-danger {
|
|
75
|
+
background-color: var(--ease-color-danger);
|
|
76
|
+
color: #ffffff;
|
|
77
|
+
border-color: var(--ease-color-danger);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.ease-btn-danger:hover {
|
|
81
|
+
background-color: var(--ease-color-danger-dark);
|
|
82
|
+
border-color: var(--ease-color-danger-dark);
|
|
83
|
+
box-shadow: var(--ease-glow-danger);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* Outline (Primary) */
|
|
87
|
+
.ease-btn-outline {
|
|
88
|
+
background-color: transparent;
|
|
89
|
+
color: var(--ease-color-primary);
|
|
90
|
+
border-color: var(--ease-color-primary);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.ease-btn-outline:hover {
|
|
94
|
+
background-color: var(--ease-color-primary);
|
|
95
|
+
color: #ffffff;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/* Ghost */
|
|
99
|
+
.ease-btn-ghost {
|
|
100
|
+
background-color: transparent;
|
|
101
|
+
color: var(--ease-color-neutral-700);
|
|
102
|
+
border-color: transparent;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.ease-btn-ghost:hover {
|
|
106
|
+
background-color: var(--ease-color-neutral-100);
|
|
107
|
+
color: var(--ease-color-neutral-900);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/* Link style */
|
|
111
|
+
.ease-btn-link {
|
|
112
|
+
background: none;
|
|
113
|
+
border: none;
|
|
114
|
+
color: var(--ease-color-primary);
|
|
115
|
+
padding-left: 0;
|
|
116
|
+
padding-right: 0;
|
|
117
|
+
text-decoration: underline;
|
|
118
|
+
text-underline-offset: 3px;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.ease-btn-link:hover {
|
|
122
|
+
color: var(--ease-color-primary-dark);
|
|
123
|
+
text-decoration: none;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/* ── Sizes ─────────────────────────────────────────────────── */
|
|
127
|
+
|
|
128
|
+
.ease-btn-sm {
|
|
129
|
+
padding: var(--ease-space-2) var(--ease-space-4);
|
|
130
|
+
font-size: var(--ease-text-xs);
|
|
131
|
+
border-radius: var(--ease-radius-sm);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.ease-btn-lg {
|
|
135
|
+
padding: var(--ease-space-4) var(--ease-space-8);
|
|
136
|
+
font-size: var(--ease-text-base);
|
|
137
|
+
border-radius: var(--ease-radius-lg);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.ease-btn-xl {
|
|
141
|
+
padding: var(--ease-space-5) var(--ease-space-10);
|
|
142
|
+
font-size: var(--ease-text-lg);
|
|
143
|
+
border-radius: var(--ease-radius-lg);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/* Full width */
|
|
147
|
+
.ease-btn-block {
|
|
148
|
+
width: 100%;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/* Pill shape */
|
|
152
|
+
.ease-btn-pill {
|
|
153
|
+
border-radius: var(--ease-radius-full);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/* Icon only */
|
|
157
|
+
.ease-btn-icon {
|
|
158
|
+
padding: var(--ease-space-3);
|
|
159
|
+
border-radius: var(--ease-radius-md);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/* ── States ────────────────────────────────────────────────── */
|
|
163
|
+
|
|
164
|
+
.ease-btn:disabled,
|
|
165
|
+
.ease-btn[disabled],
|
|
166
|
+
.ease-btn-disabled {
|
|
167
|
+
opacity: 0.5;
|
|
168
|
+
cursor: not-allowed;
|
|
169
|
+
pointer-events: none;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/* Loading spinner inside button */
|
|
173
|
+
.ease-btn-loading {
|
|
174
|
+
pointer-events: none;
|
|
175
|
+
position: relative;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.ease-btn-loading::after {
|
|
179
|
+
content: '';
|
|
180
|
+
display: inline-block;
|
|
181
|
+
width: 0.85em;
|
|
182
|
+
height: 0.85em;
|
|
183
|
+
border: 2px solid currentColor;
|
|
184
|
+
border-top-color: transparent;
|
|
185
|
+
border-radius: 50%;
|
|
186
|
+
animation: ease-kf-rotate 0.7s linear infinite;
|
|
187
|
+
margin-left: var(--ease-space-2);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/* ── Hover Class (composable) ──────────────────────────────── */
|
|
191
|
+
/* Apply ease-btn-hover to any btn to add a lift+glow effect */
|
|
192
|
+
|
|
193
|
+
.ease-btn-hover {
|
|
194
|
+
transition:
|
|
195
|
+
transform var(--ease-speed-medium) var(--ease-ease-bounce),
|
|
196
|
+
box-shadow var(--ease-speed-medium) var(--ease-ease),
|
|
197
|
+
background-color var(--ease-speed-fast) var(--ease-ease),
|
|
198
|
+
border-color var(--ease-speed-fast) var(--ease-ease);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.ease-btn-hover:hover {
|
|
202
|
+
transform: translateY(-3px);
|
|
203
|
+
box-shadow: var(--ease-shadow-lg), var(--ease-glow-primary);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/* ── Button Group ──────────────────────────────────────────── */
|
|
207
|
+
|
|
208
|
+
.ease-btn-group {
|
|
209
|
+
display: inline-flex;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
.ease-btn-group .ease-btn {
|
|
213
|
+
border-radius: 0;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.ease-btn-group .ease-btn:first-child {
|
|
217
|
+
border-radius: var(--ease-radius-md) 0 0 var(--ease-radius-md);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.ease-btn-group .ease-btn:last-child {
|
|
221
|
+
border-radius: 0 var(--ease-radius-md) var(--ease-radius-md) 0;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.ease-btn-group .ease-btn:not(:last-child) {
|
|
225
|
+
border-right-width: 1px;
|
|
226
|
+
}
|