tw-animations 2.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/README.md ADDED
@@ -0,0 +1,50 @@
1
+ # tw-animations
2
+
3
+ Extended animation utilities for **Tailwind CSS v4**.
4
+
5
+ > **Note:** This package is for Tailwind CSS v4. If you're using Tailwind CSS v3, use [`tw-animations-plugin`](../tailwindcss-animate-plugin) instead.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install tw-animations
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ Add the import to your CSS file:
16
+
17
+ ```css
18
+ @import "tailwindcss";
19
+ @import "tw-animations";
20
+ ```
21
+
22
+ Start using animations:
23
+
24
+ ```html
25
+ <div class="animate-fade-in">Hello World!</div>
26
+
27
+ <button class="animate-bounce animate-infinite">Click me</button>
28
+ ```
29
+
30
+ ## Features
31
+
32
+ - 85+ animation utilities
33
+ - Scroll animations and view timelines
34
+ - Animation control utilities (duration, delay, timing, etc.)
35
+ - Arbitrary value support
36
+ - CSS Custom Properties for theming
37
+
38
+ ## Documentation
39
+
40
+ For full documentation, visit [tailwindcss-animate.vercel.app](https://tailwindcss-animate.vercel.app)
41
+
42
+ ## New in v2.0
43
+
44
+ - **Scroll Animations** - View timelines and animation ranges
45
+ - **12 New Animations** - blurred-fade-in, rotate-360, expand-horizontally, and more
46
+ - **Enhanced Controls** - Better support for arbitrary values
47
+
48
+ ## License
49
+
50
+ MIT
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "tw-animations",
3
+ "version": "2.0.0",
4
+ "description": "Extended animation utilities for Tailwind CSS v4",
5
+ "main": "src/index.css",
6
+ "style": "src/index.css",
7
+ "exports": {
8
+ ".": "./src/index.css",
9
+ "./package.json": "./package.json"
10
+ },
11
+ "scripts": {
12
+ "test": "jest --passWithNoTests"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/alckordev/tw-animations.git",
17
+ "directory": "packages/tailwindcss-animate"
18
+ },
19
+ "keywords": [
20
+ "tailwindcss",
21
+ "tailwindcss-v4",
22
+ "css-animations",
23
+ "keyframes",
24
+ "animate",
25
+ "transitions",
26
+ "utilities",
27
+ "scroll-animations",
28
+ "view-timeline"
29
+ ],
30
+ "files": [
31
+ "/src",
32
+ "/README.md",
33
+ "/LICENSE.md"
34
+ ],
35
+ "author": "Francisco Luis Rios Vega <alckordev@gmail.com>",
36
+ "license": "MIT",
37
+ "bugs": {
38
+ "url": "https://github.com/alckordev/tw-animations/issues"
39
+ },
40
+ "homepage": "https://tailwindcss-animate.vercel.app",
41
+ "peerDependencies": {
42
+ "tailwindcss": ">=4.0.0"
43
+ }
44
+ }
@@ -0,0 +1,496 @@
1
+ @theme default {
2
+ --animate-flash: flash var(--default-animation-duration, 1s)
3
+ var(--default-animation-timing-function, ease)
4
+ var(--default-animation-delay, 0s) both;
5
+
6
+ --animate-head-shake: head-shake var(--default-animation-duration, 1s)
7
+ var(--default-animation-timing-function, ease-in-out)
8
+ var(--default-animation-delay, 0s) both;
9
+
10
+ --animate-heartbeat: heartbeat var(--default-animation-duration, 0.6s)
11
+ var(--default-animation-timing-function, ease-out)
12
+ var(--default-animation-delay, 0s) both;
13
+
14
+ --animate-jelly: jelly var(--default-animation-duration, 1s)
15
+ var(--default-animation-timing-function, ease)
16
+ var(--default-animation-delay, 0s) both;
17
+
18
+ --animate-rubber-band: rubber-band var(--default-animation-duration, 1s)
19
+ var(--default-animation-timing-function, ease)
20
+ var(--default-animation-delay, 0s) both;
21
+
22
+ --animate-shake-x: shake-x var(--default-animation-duration, 1s)
23
+ var(--default-animation-timing-function, ease)
24
+ var(--default-animation-delay, 0s) both;
25
+
26
+ --animate-shake-y: shake-y var(--default-animation-duration, 1s)
27
+ var(--default-animation-timing-function, ease)
28
+ var(--default-animation-delay, 0s) both;
29
+
30
+ --animate-swing: swing var(--default-animation-duration, 1s)
31
+ var(--default-animation-timing-function, ease)
32
+ var(--default-animation-delay, 0s) both;
33
+
34
+ --animate-tada: tada var(--default-animation-duration, 1s)
35
+ var(--default-animation-timing-function, ease)
36
+ var(--default-animation-delay, 0s) both;
37
+
38
+ --animate-wiggle: wiggle var(--default-animation-duration, 1s)
39
+ var(--default-animation-timing-function, ease)
40
+ var(--default-animation-delay, 0s) both;
41
+
42
+ --animate-wobble: wobble var(--default-animation-duration, 1s)
43
+ var(--default-animation-timing-function, ease)
44
+ var(--default-animation-delay, 0s) both;
45
+
46
+ --animate-float: float var(--default-animation-duration, 3s)
47
+ var(--default-animation-timing-function, ease-in-out)
48
+ var(--default-animation-delay, 0s) infinite;
49
+
50
+ @keyframes flash {
51
+ from,
52
+ 50%,
53
+ to {
54
+ opacity: 1;
55
+ }
56
+ 25%,
57
+ 75% {
58
+ opacity: 0;
59
+ }
60
+ }
61
+
62
+ @keyframes head-shake {
63
+ 0% {
64
+ transform: translateX(0);
65
+ }
66
+ 6.5% {
67
+ transform: translateX(-6px) rotateY(-9deg);
68
+ }
69
+ 18.5% {
70
+ transform: translateX(5px) rotateY(7deg);
71
+ }
72
+ 31.5% {
73
+ transform: translateX(-3px) rotateY(-5deg);
74
+ }
75
+ 43.5% {
76
+ transform: translateX(2px) rotateY(3deg);
77
+ }
78
+ 50% {
79
+ transform: translateX(0);
80
+ }
81
+ }
82
+
83
+ @keyframes heartbeat {
84
+ 0% {
85
+ transform: scale(1);
86
+ }
87
+ 25% {
88
+ transform: scale(1.1);
89
+ }
90
+ 50% {
91
+ transform: scale(1);
92
+ }
93
+ 75% {
94
+ transform: scale(0.9);
95
+ }
96
+ 100% {
97
+ transform: scale(1);
98
+ }
99
+ }
100
+
101
+ @keyframes jelly {
102
+ from,
103
+ 11.1%,
104
+ to {
105
+ transform: translate3d(0, 0, 0);
106
+ }
107
+ 22.2% {
108
+ transform: skewX(-12.5deg) skewY(-12.5deg);
109
+ }
110
+ 33.3% {
111
+ transform: skewX(6.25deg) skewY(6.25deg);
112
+ }
113
+ 44.4% {
114
+ transform: skewX(-3.125deg) skewY(-3.125deg);
115
+ }
116
+ 55.5% {
117
+ transform: skewX(1.5625deg) skewY(1.5625deg);
118
+ }
119
+ 66.6% {
120
+ transform: skewX(-0.78125deg) skewY(-0.78125deg);
121
+ }
122
+ 77.7% {
123
+ transform: skewX(0.390625deg) skewY(0.390625deg);
124
+ }
125
+ 88.8% {
126
+ transform: skewX(-0.1953125deg) skewY(-0.1953125deg);
127
+ }
128
+ }
129
+
130
+ @keyframes rubber-band {
131
+ from {
132
+ transform: scale3d(1, 1, 1);
133
+ }
134
+ 30% {
135
+ transform: scale3d(1.25, 0.75, 1);
136
+ }
137
+ 40% {
138
+ transform: scale3d(0.75, 1.25, 1);
139
+ }
140
+ 50% {
141
+ transform: scale3d(1.15, 0.85, 1);
142
+ }
143
+ 65% {
144
+ transform: scale3d(0.95, 1.05, 1);
145
+ }
146
+ 75% {
147
+ transform: scale3d(1.05, 0.95, 1);
148
+ }
149
+ to {
150
+ transform: scale3d(1, 1, 1);
151
+ }
152
+ }
153
+
154
+ @keyframes shake-x {
155
+ from,
156
+ to {
157
+ transform: translate3d(0, 0, 0);
158
+ }
159
+ 10%,
160
+ 30%,
161
+ 50%,
162
+ 70%,
163
+ 90% {
164
+ transform: translate3d(-10px, 0, 0);
165
+ }
166
+ 20%,
167
+ 40%,
168
+ 60%,
169
+ 80% {
170
+ transform: translate3d(10px, 0, 0);
171
+ }
172
+ }
173
+
174
+ @keyframes shake-y {
175
+ from,
176
+ to {
177
+ transform: translate3d(0, 0, 0);
178
+ }
179
+ 10%,
180
+ 30%,
181
+ 50%,
182
+ 70%,
183
+ 90% {
184
+ transform: translate3d(0, -10px, 0);
185
+ }
186
+ 20%,
187
+ 40%,
188
+ 60%,
189
+ 80% {
190
+ transform: translate3d(0, 10px, 0);
191
+ }
192
+ }
193
+
194
+ @keyframes swing {
195
+ 20% {
196
+ transform: rotate3d(0, 0, 1, 15deg);
197
+ }
198
+ 40% {
199
+ transform: rotate3d(0, 0, 1, -10deg);
200
+ }
201
+ 60% {
202
+ transform: rotate3d(0, 0, 1, 5deg);
203
+ }
204
+ 80% {
205
+ transform: rotate3d(0, 0, 1, -5deg);
206
+ }
207
+ to {
208
+ transform: rotate3d(0, 0, 1, 0deg);
209
+ }
210
+ }
211
+
212
+ @keyframes tada {
213
+ from {
214
+ transform: scale3d(1, 1, 1);
215
+ }
216
+ 10%,
217
+ 20% {
218
+ transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);
219
+ }
220
+ 30%,
221
+ 50%,
222
+ 70%,
223
+ 90% {
224
+ transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
225
+ }
226
+ 40%,
227
+ 60%,
228
+ 80% {
229
+ transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
230
+ }
231
+ to {
232
+ transform: scale3d(1, 1, 1);
233
+ }
234
+ }
235
+
236
+ @keyframes wiggle {
237
+ 0%,
238
+ 100% {
239
+ transform: rotate(-3deg);
240
+ }
241
+ 50% {
242
+ transform: rotate(3deg);
243
+ }
244
+ }
245
+
246
+ @keyframes wobble {
247
+ from {
248
+ transform: translate3d(0, 0, 0);
249
+ }
250
+ 15% {
251
+ transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
252
+ }
253
+ 30% {
254
+ transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
255
+ }
256
+ 45% {
257
+ transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
258
+ }
259
+ 60% {
260
+ transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
261
+ }
262
+ 75% {
263
+ transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
264
+ }
265
+ to {
266
+ transform: translate3d(0, 0, 0);
267
+ }
268
+ }
269
+
270
+ @keyframes float {
271
+ 0%,
272
+ 100% {
273
+ transform: translateY(0px);
274
+ }
275
+ 50% {
276
+ transform: translateY(-20px);
277
+ }
278
+ }
279
+
280
+ /* NEW ANIMATIONS - v2.0 */
281
+ --animate-blurred-fade-in: blurred-fade-in
282
+ var(--default-animation-duration, 0.9s)
283
+ var(--default-animation-timing-function, ease-in-out)
284
+ var(--default-animation-delay, 0s) both;
285
+
286
+ @keyframes blurred-fade-in {
287
+ from {
288
+ opacity: 0;
289
+ filter: blur(5px);
290
+ }
291
+ to {
292
+ opacity: 1;
293
+ filter: blur(0);
294
+ }
295
+ }
296
+
297
+ --animate-blink: blink var(--default-animation-duration, 1s)
298
+ var(--default-animation-timing-function, step-end)
299
+ var(--default-animation-delay, 0s) both;
300
+
301
+ @keyframes blink {
302
+ 0%,
303
+ 50% {
304
+ opacity: 1;
305
+ }
306
+ 50.01%,
307
+ 100% {
308
+ opacity: 0;
309
+ }
310
+ }
311
+
312
+ --animate-dancing: dancing var(--default-animation-duration, 1s)
313
+ var(--default-animation-timing-function, ease-in-out)
314
+ var(--default-animation-delay, 0s) both;
315
+
316
+ @keyframes dancing {
317
+ 0% {
318
+ transform: skew(0deg);
319
+ }
320
+ 25% {
321
+ transform: skew(-40deg);
322
+ }
323
+ 50% {
324
+ transform: skew(40deg);
325
+ }
326
+ 75% {
327
+ transform: skew(-40deg);
328
+ }
329
+ 100% {
330
+ transform: skew(0deg);
331
+ }
332
+ }
333
+
334
+ --animate-impulse-rotation-left: impulse-rotation-left
335
+ var(--default-animation-duration, 1s)
336
+ var(--default-animation-timing-function, ease-in-out)
337
+ var(--default-animation-delay, 0s) both;
338
+
339
+ @keyframes impulse-rotation-left {
340
+ 0% {
341
+ transform: rotate(0deg);
342
+ }
343
+ 50% {
344
+ transform: rotate(40deg);
345
+ }
346
+ 100% {
347
+ transform: rotate(-360deg);
348
+ }
349
+ }
350
+
351
+ --animate-impulse-rotation-right: impulse-rotation-right
352
+ var(--default-animation-duration, 1s)
353
+ var(--default-animation-timing-function, ease-in-out)
354
+ var(--default-animation-delay, 0s) both;
355
+
356
+ @keyframes impulse-rotation-right {
357
+ 0% {
358
+ transform: rotate(0deg);
359
+ }
360
+ 50% {
361
+ transform: rotate(-40deg);
362
+ }
363
+ 100% {
364
+ transform: rotate(360deg);
365
+ }
366
+ }
367
+
368
+ --animate-jiggle: jiggle var(--default-animation-duration, 0.6s)
369
+ var(--default-animation-timing-function, ease)
370
+ var(--default-animation-delay, 0s) both;
371
+
372
+ @keyframes jiggle {
373
+ 0%,
374
+ 100% {
375
+ transform: rotate(0deg);
376
+ }
377
+ 25% {
378
+ transform: rotate(-2deg);
379
+ }
380
+ 75% {
381
+ transform: rotate(2deg);
382
+ }
383
+ }
384
+
385
+ --animate-pop: pop var(--default-animation-duration, 0.5s)
386
+ var(
387
+ --default-animation-timing-function,
388
+ cubic-bezier(0.68, -0.55, 0.265, 1.55)
389
+ )
390
+ var(--default-animation-delay, 0s) both;
391
+
392
+ @keyframes pop {
393
+ 0% {
394
+ transform: scale(0);
395
+ opacity: 0;
396
+ }
397
+ 50% {
398
+ transform: scale(1.1);
399
+ }
400
+ 100% {
401
+ transform: scale(1);
402
+ opacity: 1;
403
+ }
404
+ }
405
+
406
+ --animate-rotate-360: rotate-360 var(--default-animation-duration, 1s)
407
+ var(--default-animation-timing-function, ease)
408
+ var(--default-animation-delay, 0s) both;
409
+
410
+ @keyframes rotate-360 {
411
+ from {
412
+ transform: rotate(0deg);
413
+ }
414
+ to {
415
+ transform: rotate(360deg);
416
+ }
417
+ }
418
+
419
+ --animate-rotate-180: rotate-180 var(--default-animation-duration, 0.5s)
420
+ var(--default-animation-timing-function, ease)
421
+ var(--default-animation-delay, 0s) both;
422
+
423
+ @keyframes rotate-180 {
424
+ from {
425
+ transform: rotate(0deg);
426
+ }
427
+ to {
428
+ transform: rotate(180deg);
429
+ }
430
+ }
431
+
432
+ --animate-rotate-90: rotate-90 var(--default-animation-duration, 0.3s)
433
+ var(--default-animation-timing-function, ease)
434
+ var(--default-animation-delay, 0s) both;
435
+
436
+ @keyframes rotate-90 {
437
+ from {
438
+ transform: rotate(0deg);
439
+ }
440
+ to {
441
+ transform: rotate(90deg);
442
+ }
443
+ }
444
+ }
445
+
446
+ @utility animate-jelly {
447
+ transform-origin: center;
448
+ }
449
+
450
+ @utility animate-swing {
451
+ transform-origin: top center;
452
+ }
453
+
454
+ @utility animate-heartbeat {
455
+ animation: var(--animate-heartbeat);
456
+ }
457
+
458
+ @utility animate-blurred-fade-in {
459
+ animation: var(--animate-blurred-fade-in);
460
+ }
461
+
462
+ @utility animate-blink {
463
+ animation: var(--animate-blink);
464
+ }
465
+
466
+ @utility animate-dancing {
467
+ animation: var(--animate-dancing);
468
+ }
469
+
470
+ @utility animate-impulse-rotation-left {
471
+ animation: var(--animate-impulse-rotation-left);
472
+ }
473
+
474
+ @utility animate-impulse-rotation-right {
475
+ animation: var(--animate-impulse-rotation-right);
476
+ }
477
+
478
+ @utility animate-jiggle {
479
+ animation: var(--animate-jiggle);
480
+ }
481
+
482
+ @utility animate-pop {
483
+ animation: var(--animate-pop);
484
+ }
485
+
486
+ @utility animate-rotate-360 {
487
+ animation: var(--animate-rotate-360);
488
+ }
489
+
490
+ @utility animate-rotate-180 {
491
+ animation: var(--animate-rotate-180);
492
+ }
493
+
494
+ @utility animate-rotate-90 {
495
+ animation: var(--animate-rotate-90);
496
+ }
@@ -0,0 +1,77 @@
1
+ @theme default {
2
+ --animate-back-in-down: back-in-down var(--default-animation-duration, 1s)
3
+ var(--default-animation-timing-function, ease-in)
4
+ var(--default-animation-delay, 0s) both;
5
+
6
+ --animate-back-in-start: back-in-start var(--default-animation-duration, 1s)
7
+ var(--default-animation-timing-function, ease-in)
8
+ var(--default-animation-delay, 0s) both;
9
+
10
+ --animate-back-in-end: back-in-end var(--default-animation-duration, 1s)
11
+ var(--default-animation-timing-function, ease-in)
12
+ var(--default-animation-delay, 0s) both;
13
+
14
+ --animate-back-in-up: back-in-up var(--default-animation-duration, 1s)
15
+ var(--default-animation-timing-function, ease-in)
16
+ var(--default-animation-delay, 0s) both;
17
+
18
+ @keyframes back-in-down {
19
+ 0% {
20
+ transform: translateY(-1200px) scale(0.7);
21
+ opacity: 0.7;
22
+ }
23
+ 80% {
24
+ transform: translateY(0px) scale(0.7);
25
+ opacity: 0.7;
26
+ }
27
+ 100% {
28
+ transform: scale(1);
29
+ opacity: 1;
30
+ }
31
+ }
32
+
33
+ @keyframes back-in-start {
34
+ 0% {
35
+ transform: translateX(-2000px) scale(0.7);
36
+ opacity: 0.7;
37
+ }
38
+ 80% {
39
+ transform: translateX(0px) scale(0.7);
40
+ opacity: 0.7;
41
+ }
42
+ 100% {
43
+ transform: scale(1);
44
+ opacity: 1;
45
+ }
46
+ }
47
+
48
+ @keyframes back-in-end {
49
+ 0% {
50
+ transform: translateX(2000px) scale(0.7);
51
+ opacity: 0.7;
52
+ }
53
+ 80% {
54
+ transform: translateX(0px) scale(0.7);
55
+ opacity: 0.7;
56
+ }
57
+ 100% {
58
+ transform: scale(1);
59
+ opacity: 1;
60
+ }
61
+ }
62
+
63
+ @keyframes back-in-up {
64
+ 0% {
65
+ transform: translateY(1200px) scale(0.7);
66
+ opacity: 0.7;
67
+ }
68
+ 80% {
69
+ transform: translateY(0px) scale(0.7);
70
+ opacity: 0.7;
71
+ }
72
+ 100% {
73
+ transform: scale(1);
74
+ opacity: 1;
75
+ }
76
+ }
77
+ }