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 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: MIT](https://img.shields.io/badge/License-MIT-6c63ff.svg)](./LICENSE)
10
+ [![npm version](https://img.shields.io/npm/v/easemotion-css.svg?color=6c63ff)](https://www.npmjs.com/package/easemotion-css)
11
+ [![jsDelivr hits](https://data.jsdelivr.com/v1/package/npm/easemotion-css/badge)](https://www.jsdelivr.com/package/npm/easemotion-css)
12
+ [![Contributions Welcome](https://img.shields.io/badge/Contributions-Welcome-22c55e.svg)](./CONTRIBUTING.md)
13
+ [![GitHub Stars](https://img.shields.io/github/stars/SAPTARSHI-coder/easemotion-css?style=flat&color=6c63ff)](https://github.com/SAPTARSHI-coder/easemotion-css/stargazers)
14
+ [![Maintainer](https://img.shields.io/badge/Maintainer-Saptarshi%20Sadhu-a78bfa.svg)](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 &nbsp;·&nbsp; Zero dependencies &nbsp;·&nbsp; 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
+ }