dynamic-ds 1.0.5 → 1.0.6

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.
@@ -0,0 +1,1053 @@
1
+ // ============================================================================
2
+ // ANIMATION SYSTEM - Dynamic Design System
3
+ // ============================================================================
4
+ // Comprehensive animation utilities for consistent motion design
5
+ // ============================================================================
6
+
7
+ // ============================================================================
8
+ // 1. TIMING FUNCTION TOKENS
9
+ // ============================================================================
10
+ $ease-linear: linear;
11
+ $ease-in: cubic-bezier(0.4, 0, 1, 1);
12
+ $ease-out: cubic-bezier(0, 0, 0.2, 1);
13
+ $ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
14
+
15
+ // Advanced easing functions
16
+ $ease-bounce-out: cubic-bezier(0.34, 1.56, 0.64, 1);
17
+ $ease-bounce-in: cubic-bezier(0.36, 0, 0.66, -0.56);
18
+ $ease-back-out: cubic-bezier(0.34, 1.56, 0.64, 1);
19
+ $ease-back-in: cubic-bezier(0.36, 0, 0.66, -0.56);
20
+ $ease-elastic: cubic-bezier(0.68, -0.55, 0.265, 1.55);
21
+ $ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
22
+
23
+ :root {
24
+ // Standard easing
25
+ --ease-linear: #{$ease-linear};
26
+ --ease-in: #{$ease-in};
27
+ --ease-out: #{$ease-out};
28
+ --ease-in-out: #{$ease-in-out};
29
+
30
+ // Advanced easing
31
+ --ease-bounce-out: #{$ease-bounce-out};
32
+ --ease-bounce-in: #{$ease-bounce-in};
33
+ --ease-back-out: #{$ease-back-out};
34
+ --ease-back-in: #{$ease-back-in};
35
+ --ease-elastic: #{$ease-elastic};
36
+ --ease-spring: #{$ease-spring};
37
+ }
38
+
39
+ // ============================================================================
40
+ // 2. DURATION TOKENS
41
+ // ============================================================================
42
+ $duration-0: 0ms;
43
+ $duration-75: 75ms;
44
+ $duration-100: 100ms;
45
+ $duration-150: 150ms;
46
+ $duration-200: 200ms;
47
+ $duration-300: 300ms;
48
+ $duration-500: 500ms;
49
+ $duration-700: 700ms;
50
+ $duration-1000: 1000ms;
51
+
52
+ // Semantic durations
53
+ $duration-instant: 0ms;
54
+ $duration-fast: 150ms;
55
+ $duration-normal: 300ms;
56
+ $duration-slow: 500ms;
57
+ $duration-slower: 700ms;
58
+
59
+ :root {
60
+ // Numeric durations
61
+ --duration-0: #{$duration-0};
62
+ --duration-75: #{$duration-75};
63
+ --duration-100: #{$duration-100};
64
+ --duration-150: #{$duration-150};
65
+ --duration-200: #{$duration-200};
66
+ --duration-300: #{$duration-300};
67
+ --duration-500: #{$duration-500};
68
+ --duration-700: #{$duration-700};
69
+ --duration-1000: #{$duration-1000};
70
+
71
+ // Semantic durations
72
+ --duration-instant: #{$duration-instant};
73
+ --duration-fast: #{$duration-fast};
74
+ --duration-normal: #{$duration-normal};
75
+ --duration-slow: #{$duration-slow};
76
+ --duration-slower: #{$duration-slower};
77
+ }
78
+
79
+ // ============================================================================
80
+ // 3. TRANSITION PRESET TOKENS
81
+ // ============================================================================
82
+ :root {
83
+ // Property-specific transitions
84
+ --transition-none: none;
85
+ --transition-all: all var(--duration-normal) var(--ease-in-out);
86
+ --transition-colors: color, background-color, border-color, text-decoration-color, fill, stroke var(--duration-normal) var(--ease-in-out);
87
+ --transition-opacity: opacity var(--duration-normal) var(--ease-in-out);
88
+ --transition-shadow: box-shadow var(--duration-normal) var(--ease-in-out);
89
+ --transition-transform: transform var(--duration-normal) var(--ease-in-out);
90
+
91
+ // Combined common transitions
92
+ --transition-default: color, background-color, border-color, box-shadow, transform, opacity var(--duration-fast) var(--ease-in-out);
93
+ }
94
+
95
+ // ============================================================================
96
+ // 4. TRANSITION PROPERTY UTILITIES
97
+ // ============================================================================
98
+ .transition-none { transition-property: none !important; }
99
+ .transition-all { transition-property: all !important; }
100
+ .transition {
101
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter !important;
102
+ transition-timing-function: var(--ease-in-out);
103
+ transition-duration: var(--duration-normal);
104
+ }
105
+ .transition-colors {
106
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke !important;
107
+ transition-timing-function: var(--ease-in-out);
108
+ transition-duration: var(--duration-normal);
109
+ }
110
+ .transition-opacity {
111
+ transition-property: opacity !important;
112
+ transition-timing-function: var(--ease-in-out);
113
+ transition-duration: var(--duration-normal);
114
+ }
115
+ .transition-shadow {
116
+ transition-property: box-shadow !important;
117
+ transition-timing-function: var(--ease-in-out);
118
+ transition-duration: var(--duration-normal);
119
+ }
120
+ .transition-transform {
121
+ transition-property: transform !important;
122
+ transition-timing-function: var(--ease-in-out);
123
+ transition-duration: var(--duration-normal);
124
+ }
125
+
126
+ // ============================================================================
127
+ // 5. TRANSITION DURATION UTILITIES
128
+ // ============================================================================
129
+ .duration-0 { transition-duration: 0ms !important; }
130
+ .duration-75 { transition-duration: 75ms !important; }
131
+ .duration-100 { transition-duration: 100ms !important; }
132
+ .duration-150 { transition-duration: 150ms !important; }
133
+ .duration-200 { transition-duration: 200ms !important; }
134
+ .duration-300 { transition-duration: 300ms !important; }
135
+ .duration-500 { transition-duration: 500ms !important; }
136
+ .duration-700 { transition-duration: 700ms !important; }
137
+ .duration-1000 { transition-duration: 1000ms !important; }
138
+
139
+ // Semantic duration classes
140
+ .duration-instant { transition-duration: var(--duration-instant) !important; }
141
+ .duration-fast { transition-duration: var(--duration-fast) !important; }
142
+ .duration-normal { transition-duration: var(--duration-normal) !important; }
143
+ .duration-slow { transition-duration: var(--duration-slow) !important; }
144
+ .duration-slower { transition-duration: var(--duration-slower) !important; }
145
+
146
+ // ============================================================================
147
+ // 6. TRANSITION TIMING FUNCTION UTILITIES
148
+ // ============================================================================
149
+ .ease-linear { transition-timing-function: linear !important; }
150
+ .ease-in { transition-timing-function: var(--ease-in) !important; }
151
+ .ease-out { transition-timing-function: var(--ease-out) !important; }
152
+ .ease-in-out { transition-timing-function: var(--ease-in-out) !important; }
153
+ .ease-bounce-out { transition-timing-function: var(--ease-bounce-out) !important; }
154
+ .ease-bounce-in { transition-timing-function: var(--ease-bounce-in) !important; }
155
+ .ease-back-out { transition-timing-function: var(--ease-back-out) !important; }
156
+ .ease-back-in { transition-timing-function: var(--ease-back-in) !important; }
157
+ .ease-elastic { transition-timing-function: var(--ease-elastic) !important; }
158
+ .ease-spring { transition-timing-function: var(--ease-spring) !important; }
159
+
160
+ // ============================================================================
161
+ // 7. TRANSITION DELAY UTILITIES
162
+ // ============================================================================
163
+ .delay-0 { transition-delay: 0ms !important; }
164
+ .delay-75 { transition-delay: 75ms !important; }
165
+ .delay-100 { transition-delay: 100ms !important; }
166
+ .delay-150 { transition-delay: 150ms !important; }
167
+ .delay-200 { transition-delay: 200ms !important; }
168
+ .delay-300 { transition-delay: 300ms !important; }
169
+ .delay-500 { transition-delay: 500ms !important; }
170
+ .delay-700 { transition-delay: 700ms !important; }
171
+ .delay-1000 { transition-delay: 1000ms !important; }
172
+
173
+ // ============================================================================
174
+ // 8. KEYFRAME ANIMATIONS
175
+ // ============================================================================
176
+
177
+ // --- Fade Animations ---
178
+ @keyframes fadeIn {
179
+ from { opacity: 0; }
180
+ to { opacity: 1; }
181
+ }
182
+
183
+ @keyframes fadeOut {
184
+ from { opacity: 1; }
185
+ to { opacity: 0; }
186
+ }
187
+
188
+ @keyframes fadeInUp {
189
+ from {
190
+ opacity: 0;
191
+ transform: translateY(10px);
192
+ }
193
+ to {
194
+ opacity: 1;
195
+ transform: translateY(0);
196
+ }
197
+ }
198
+
199
+ @keyframes fadeInDown {
200
+ from {
201
+ opacity: 0;
202
+ transform: translateY(-10px);
203
+ }
204
+ to {
205
+ opacity: 1;
206
+ transform: translateY(0);
207
+ }
208
+ }
209
+
210
+ @keyframes fadeInLeft {
211
+ from {
212
+ opacity: 0;
213
+ transform: translateX(-10px);
214
+ }
215
+ to {
216
+ opacity: 1;
217
+ transform: translateX(0);
218
+ }
219
+ }
220
+
221
+ @keyframes fadeInRight {
222
+ from {
223
+ opacity: 0;
224
+ transform: translateX(10px);
225
+ }
226
+ to {
227
+ opacity: 1;
228
+ transform: translateX(0);
229
+ }
230
+ }
231
+
232
+ // --- Slide Animations ---
233
+ @keyframes slideInUp {
234
+ from { transform: translateY(100%); }
235
+ to { transform: translateY(0); }
236
+ }
237
+
238
+ @keyframes slideInDown {
239
+ from { transform: translateY(-100%); }
240
+ to { transform: translateY(0); }
241
+ }
242
+
243
+ @keyframes slideInLeft {
244
+ from { transform: translateX(-100%); }
245
+ to { transform: translateX(0); }
246
+ }
247
+
248
+ @keyframes slideInRight {
249
+ from { transform: translateX(100%); }
250
+ to { transform: translateX(0); }
251
+ }
252
+
253
+ @keyframes slideOutUp {
254
+ from { transform: translateY(0); }
255
+ to { transform: translateY(-100%); }
256
+ }
257
+
258
+ @keyframes slideOutDown {
259
+ from { transform: translateY(0); }
260
+ to { transform: translateY(100%); }
261
+ }
262
+
263
+ @keyframes slideOutLeft {
264
+ from { transform: translateX(0); }
265
+ to { transform: translateX(-100%); }
266
+ }
267
+
268
+ @keyframes slideOutRight {
269
+ from { transform: translateX(0); }
270
+ to { transform: translateX(100%); }
271
+ }
272
+
273
+ // --- Scale Animations ---
274
+ @keyframes scaleIn {
275
+ from {
276
+ opacity: 0;
277
+ transform: scale(0.95);
278
+ }
279
+ to {
280
+ opacity: 1;
281
+ transform: scale(1);
282
+ }
283
+ }
284
+
285
+ @keyframes scaleOut {
286
+ from {
287
+ opacity: 1;
288
+ transform: scale(1);
289
+ }
290
+ to {
291
+ opacity: 0;
292
+ transform: scale(0.95);
293
+ }
294
+ }
295
+
296
+ @keyframes zoomIn {
297
+ from {
298
+ opacity: 0;
299
+ transform: scale(0.5);
300
+ }
301
+ to {
302
+ opacity: 1;
303
+ transform: scale(1);
304
+ }
305
+ }
306
+
307
+ @keyframes zoomOut {
308
+ from {
309
+ opacity: 1;
310
+ transform: scale(1);
311
+ }
312
+ to {
313
+ opacity: 0;
314
+ transform: scale(0.5);
315
+ }
316
+ }
317
+
318
+ @keyframes popIn {
319
+ 0% {
320
+ opacity: 0;
321
+ transform: scale(0.8);
322
+ }
323
+ 70% {
324
+ transform: scale(1.05);
325
+ }
326
+ 100% {
327
+ opacity: 1;
328
+ transform: scale(1);
329
+ }
330
+ }
331
+
332
+ // --- Rotate Animations ---
333
+ @keyframes spin {
334
+ from { transform: rotate(0deg); }
335
+ to { transform: rotate(360deg); }
336
+ }
337
+
338
+ @keyframes spinReverse {
339
+ from { transform: rotate(360deg); }
340
+ to { transform: rotate(0deg); }
341
+ }
342
+
343
+ @keyframes rotateIn {
344
+ from {
345
+ opacity: 0;
346
+ transform: rotate(-200deg);
347
+ }
348
+ to {
349
+ opacity: 1;
350
+ transform: rotate(0);
351
+ }
352
+ }
353
+
354
+ // --- Bounce & Pulse Animations ---
355
+ @keyframes bounce {
356
+ 0%, 100% {
357
+ transform: translateY(-25%);
358
+ animation-timing-function: cubic-bezier(0.8, 0, 1, 1);
359
+ }
360
+ 50% {
361
+ transform: translateY(0);
362
+ animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
363
+ }
364
+ }
365
+
366
+ @keyframes bounceIn {
367
+ 0% {
368
+ opacity: 0;
369
+ transform: scale(0.3);
370
+ }
371
+ 50% {
372
+ opacity: 1;
373
+ transform: scale(1.05);
374
+ }
375
+ 70% {
376
+ transform: scale(0.9);
377
+ }
378
+ 100% {
379
+ transform: scale(1);
380
+ }
381
+ }
382
+
383
+ @keyframes pulse {
384
+ 0%, 100% {
385
+ opacity: 1;
386
+ }
387
+ 50% {
388
+ opacity: 0.5;
389
+ }
390
+ }
391
+
392
+ @keyframes ping {
393
+ 75%, 100% {
394
+ transform: scale(2);
395
+ opacity: 0;
396
+ }
397
+ }
398
+
399
+ @keyframes heartbeat {
400
+ 0% { transform: scale(1); }
401
+ 14% { transform: scale(1.3); }
402
+ 28% { transform: scale(1); }
403
+ 42% { transform: scale(1.3); }
404
+ 70% { transform: scale(1); }
405
+ }
406
+
407
+ // --- Shake & Wobble Animations ---
408
+ @keyframes shake {
409
+ 0%, 100% { transform: translateX(0); }
410
+ 10%, 30%, 50%, 70%, 90% { transform: translateX(-4px); }
411
+ 20%, 40%, 60%, 80% { transform: translateX(4px); }
412
+ }
413
+
414
+ @keyframes shakeX {
415
+ 0%, 100% { transform: translateX(0); }
416
+ 10%, 30%, 50%, 70%, 90% { transform: translateX(-10px); }
417
+ 20%, 40%, 60%, 80% { transform: translateX(10px); }
418
+ }
419
+
420
+ @keyframes shakeY {
421
+ 0%, 100% { transform: translateY(0); }
422
+ 10%, 30%, 50%, 70%, 90% { transform: translateY(-10px); }
423
+ 20%, 40%, 60%, 80% { transform: translateY(10px); }
424
+ }
425
+
426
+ @keyframes wobble {
427
+ 0% { transform: translateX(0); }
428
+ 15% { transform: translateX(-25%) rotate(-5deg); }
429
+ 30% { transform: translateX(20%) rotate(3deg); }
430
+ 45% { transform: translateX(-15%) rotate(-3deg); }
431
+ 60% { transform: translateX(10%) rotate(2deg); }
432
+ 75% { transform: translateX(-5%) rotate(-1deg); }
433
+ 100% { transform: translateX(0); }
434
+ }
435
+
436
+ @keyframes jello {
437
+ 0%, 11.1%, 100% { transform: none; }
438
+ 22.2% { transform: skewX(-12.5deg) skewY(-12.5deg); }
439
+ 33.3% { transform: skewX(6.25deg) skewY(6.25deg); }
440
+ 44.4% { transform: skewX(-3.125deg) skewY(-3.125deg); }
441
+ 55.5% { transform: skewX(1.5625deg) skewY(1.5625deg); }
442
+ 66.6% { transform: skewX(-0.78125deg) skewY(-0.78125deg); }
443
+ 77.7% { transform: skewX(0.390625deg) skewY(0.390625deg); }
444
+ 88.8% { transform: skewX(-0.1953125deg) skewY(-0.1953125deg); }
445
+ }
446
+
447
+ // --- Attention Seekers ---
448
+ @keyframes flash {
449
+ 0%, 50%, 100% { opacity: 1; }
450
+ 25%, 75% { opacity: 0; }
451
+ }
452
+
453
+ @keyframes tada {
454
+ 0% { transform: scale(1); }
455
+ 10%, 20% { transform: scale(0.9) rotate(-3deg); }
456
+ 30%, 50%, 70%, 90% { transform: scale(1.1) rotate(3deg); }
457
+ 40%, 60%, 80% { transform: scale(1.1) rotate(-3deg); }
458
+ 100% { transform: scale(1) rotate(0); }
459
+ }
460
+
461
+ @keyframes rubberBand {
462
+ 0% { transform: scale(1); }
463
+ 30% { transform: scaleX(1.25) scaleY(0.75); }
464
+ 40% { transform: scaleX(0.75) scaleY(1.25); }
465
+ 50% { transform: scaleX(1.15) scaleY(0.85); }
466
+ 65% { transform: scaleX(0.95) scaleY(1.05); }
467
+ 75% { transform: scaleX(1.05) scaleY(0.95); }
468
+ 100% { transform: scale(1); }
469
+ }
470
+
471
+ @keyframes swing {
472
+ 20% { transform: rotate(15deg); }
473
+ 40% { transform: rotate(-10deg); }
474
+ 60% { transform: rotate(5deg); }
475
+ 80% { transform: rotate(-5deg); }
476
+ 100% { transform: rotate(0deg); }
477
+ }
478
+
479
+ // --- Loading Animations ---
480
+ @keyframes shimmer {
481
+ 0% {
482
+ background-position: -200% 0;
483
+ }
484
+ 100% {
485
+ background-position: 200% 0;
486
+ }
487
+ }
488
+
489
+ @keyframes skeleton {
490
+ 0% {
491
+ background-position: -200px 0;
492
+ }
493
+ 100% {
494
+ background-position: calc(200px + 100%) 0;
495
+ }
496
+ }
497
+
498
+ @keyframes progress {
499
+ 0% {
500
+ background-position: 100% 50%;
501
+ }
502
+ 100% {
503
+ background-position: 0% 50%;
504
+ }
505
+ }
506
+
507
+ @keyframes dotPulse {
508
+ 0%, 80%, 100% {
509
+ transform: scale(0);
510
+ opacity: 0.5;
511
+ }
512
+ 40% {
513
+ transform: scale(1);
514
+ opacity: 1;
515
+ }
516
+ }
517
+
518
+ // --- Float Animation ---
519
+ @keyframes float {
520
+ 0%, 100% {
521
+ transform: translateY(0);
522
+ }
523
+ 50% {
524
+ transform: translateY(-10px);
525
+ }
526
+ }
527
+
528
+ // ============================================================================
529
+ // 9. ANIMATION UTILITY CLASSES
530
+ // ============================================================================
531
+
532
+ // --- Fade Classes ---
533
+ .animate-fade-in {
534
+ animation: fadeIn var(--duration-normal) var(--ease-out) forwards;
535
+ }
536
+ .animate-fade-out {
537
+ animation: fadeOut var(--duration-normal) var(--ease-in) forwards;
538
+ }
539
+ .animate-fade-in-up {
540
+ animation: fadeInUp var(--duration-normal) var(--ease-out) forwards;
541
+ }
542
+ .animate-fade-in-down {
543
+ animation: fadeInDown var(--duration-normal) var(--ease-out) forwards;
544
+ }
545
+ .animate-fade-in-left {
546
+ animation: fadeInLeft var(--duration-normal) var(--ease-out) forwards;
547
+ }
548
+ .animate-fade-in-right {
549
+ animation: fadeInRight var(--duration-normal) var(--ease-out) forwards;
550
+ }
551
+
552
+ // --- Slide Classes ---
553
+ .animate-slide-in-up {
554
+ animation: slideInUp var(--duration-normal) var(--ease-out) forwards;
555
+ }
556
+ .animate-slide-in-down {
557
+ animation: slideInDown var(--duration-normal) var(--ease-out) forwards;
558
+ }
559
+ .animate-slide-in-left {
560
+ animation: slideInLeft var(--duration-normal) var(--ease-out) forwards;
561
+ }
562
+ .animate-slide-in-right {
563
+ animation: slideInRight var(--duration-normal) var(--ease-out) forwards;
564
+ }
565
+ .animate-slide-out-up {
566
+ animation: slideOutUp var(--duration-normal) var(--ease-in) forwards;
567
+ }
568
+ .animate-slide-out-down {
569
+ animation: slideOutDown var(--duration-normal) var(--ease-in) forwards;
570
+ }
571
+ .animate-slide-out-left {
572
+ animation: slideOutLeft var(--duration-normal) var(--ease-in) forwards;
573
+ }
574
+ .animate-slide-out-right {
575
+ animation: slideOutRight var(--duration-normal) var(--ease-in) forwards;
576
+ }
577
+
578
+ // --- Scale Classes ---
579
+ .animate-scale-in {
580
+ animation: scaleIn var(--duration-normal) var(--ease-out) forwards;
581
+ }
582
+ .animate-scale-out {
583
+ animation: scaleOut var(--duration-normal) var(--ease-in) forwards;
584
+ }
585
+ .animate-zoom-in {
586
+ animation: zoomIn var(--duration-normal) var(--ease-out) forwards;
587
+ }
588
+ .animate-zoom-out {
589
+ animation: zoomOut var(--duration-normal) var(--ease-in) forwards;
590
+ }
591
+ .animate-pop-in {
592
+ animation: popIn var(--duration-normal) var(--ease-spring) forwards;
593
+ }
594
+
595
+ // --- Continuous Animations ---
596
+ .animate-spin {
597
+ animation: spin 1s linear infinite;
598
+ }
599
+ .animate-spin-slow {
600
+ animation: spin 3s linear infinite;
601
+ }
602
+ .animate-spin-reverse {
603
+ animation: spinReverse 1s linear infinite;
604
+ }
605
+ .animate-ping {
606
+ animation: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;
607
+ }
608
+ .animate-pulse {
609
+ animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
610
+ }
611
+ .animate-bounce {
612
+ animation: bounce 1s infinite;
613
+ }
614
+ .animate-float {
615
+ animation: float 3s ease-in-out infinite;
616
+ }
617
+
618
+ // --- Attention Seeking Classes ---
619
+ .animate-shake {
620
+ animation: shake 0.5s var(--ease-in-out);
621
+ }
622
+ .animate-shake-x {
623
+ animation: shakeX 0.8s var(--ease-in-out);
624
+ }
625
+ .animate-shake-y {
626
+ animation: shakeY 0.8s var(--ease-in-out);
627
+ }
628
+ .animate-wobble {
629
+ animation: wobble 1s var(--ease-in-out);
630
+ }
631
+ .animate-jello {
632
+ animation: jello 1s var(--ease-in-out);
633
+ }
634
+ .animate-flash {
635
+ animation: flash 1s var(--ease-in-out);
636
+ }
637
+ .animate-tada {
638
+ animation: tada 1s var(--ease-in-out);
639
+ }
640
+ .animate-rubber-band {
641
+ animation: rubberBand 1s var(--ease-in-out);
642
+ }
643
+ .animate-swing {
644
+ animation: swing 1s var(--ease-in-out);
645
+ transform-origin: top center;
646
+ }
647
+ .animate-heartbeat {
648
+ animation: heartbeat 1.5s var(--ease-in-out) infinite;
649
+ }
650
+ .animate-bounce-in {
651
+ animation: bounceIn 0.75s var(--ease-out);
652
+ }
653
+ .animate-rotate-in {
654
+ animation: rotateIn 0.6s var(--ease-out);
655
+ }
656
+
657
+ // ============================================================================
658
+ // 10. LOADING STATE CLASSES
659
+ // ============================================================================
660
+ .animate-shimmer {
661
+ background: linear-gradient(
662
+ 90deg,
663
+ var(--neutral-color-100) 25%,
664
+ var(--neutral-color-50) 50%,
665
+ var(--neutral-color-100) 75%
666
+ );
667
+ background-size: 200% 100%;
668
+ animation: shimmer 1.5s infinite;
669
+ }
670
+
671
+ .skeleton {
672
+ background: linear-gradient(
673
+ 90deg,
674
+ var(--neutral-color-100) 0px,
675
+ var(--neutral-color-50) 40px,
676
+ var(--neutral-color-100) 80px
677
+ );
678
+ background-size: 600px 100%;
679
+ animation: skeleton 1.2s ease-in-out infinite;
680
+ }
681
+
682
+ .skeleton-text {
683
+ @extend .skeleton;
684
+ height: 1em;
685
+ border-radius: 0.25em;
686
+ }
687
+
688
+ .skeleton-circle {
689
+ @extend .skeleton;
690
+ border-radius: 50%;
691
+ }
692
+
693
+ .skeleton-rect {
694
+ @extend .skeleton;
695
+ border-radius: var(--radius-md, 8px);
696
+ }
697
+
698
+ // Loading dots
699
+ .loading-dots {
700
+ display: inline-flex;
701
+ gap: 4px;
702
+
703
+ span {
704
+ width: 8px;
705
+ height: 8px;
706
+ border-radius: 50%;
707
+ background-color: currentColor;
708
+ animation: dotPulse 1.4s ease-in-out infinite;
709
+
710
+ &:nth-child(1) { animation-delay: 0s; }
711
+ &:nth-child(2) { animation-delay: 0.2s; }
712
+ &:nth-child(3) { animation-delay: 0.4s; }
713
+ }
714
+ }
715
+
716
+ // Spinner
717
+ .spinner {
718
+ display: inline-block;
719
+ width: 1.5em;
720
+ height: 1.5em;
721
+ border: 2px solid currentColor;
722
+ border-radius: 50%;
723
+ border-top-color: transparent;
724
+ animation: spin 0.75s linear infinite;
725
+ }
726
+
727
+ .spinner-sm {
728
+ @extend .spinner;
729
+ width: 1em;
730
+ height: 1em;
731
+ border-width: 1.5px;
732
+ }
733
+
734
+ .spinner-lg {
735
+ @extend .spinner;
736
+ width: 2em;
737
+ height: 2em;
738
+ border-width: 3px;
739
+ }
740
+
741
+ // ============================================================================
742
+ // 11. ANIMATION CONTROL UTILITIES
743
+ // ============================================================================
744
+
745
+ // Animation iteration count
746
+ .animate-once { animation-iteration-count: 1 !important; }
747
+ .animate-twice { animation-iteration-count: 2 !important; }
748
+ .animate-infinite { animation-iteration-count: infinite !important; }
749
+
750
+ // Animation direction
751
+ .animate-normal { animation-direction: normal !important; }
752
+ .animate-reverse { animation-direction: reverse !important; }
753
+ .animate-alternate { animation-direction: alternate !important; }
754
+ .animate-alternate-reverse { animation-direction: alternate-reverse !important; }
755
+
756
+ // Animation fill mode
757
+ .animate-fill-none { animation-fill-mode: none !important; }
758
+ .animate-fill-forwards { animation-fill-mode: forwards !important; }
759
+ .animate-fill-backwards { animation-fill-mode: backwards !important; }
760
+ .animate-fill-both { animation-fill-mode: both !important; }
761
+
762
+ // Animation play state
763
+ .animate-running { animation-play-state: running !important; }
764
+ .animate-paused { animation-play-state: paused !important; }
765
+
766
+ // Animation delay utilities
767
+ .animate-delay-0 { animation-delay: 0ms !important; }
768
+ .animate-delay-75 { animation-delay: 75ms !important; }
769
+ .animate-delay-100 { animation-delay: 100ms !important; }
770
+ .animate-delay-150 { animation-delay: 150ms !important; }
771
+ .animate-delay-200 { animation-delay: 200ms !important; }
772
+ .animate-delay-300 { animation-delay: 300ms !important; }
773
+ .animate-delay-500 { animation-delay: 500ms !important; }
774
+ .animate-delay-700 { animation-delay: 700ms !important; }
775
+ .animate-delay-1000 { animation-delay: 1000ms !important; }
776
+
777
+ // Animation duration utilities (for animations)
778
+ .animate-duration-75 { animation-duration: 75ms !important; }
779
+ .animate-duration-100 { animation-duration: 100ms !important; }
780
+ .animate-duration-150 { animation-duration: 150ms !important; }
781
+ .animate-duration-200 { animation-duration: 200ms !important; }
782
+ .animate-duration-300 { animation-duration: 300ms !important; }
783
+ .animate-duration-500 { animation-duration: 500ms !important; }
784
+ .animate-duration-700 { animation-duration: 700ms !important; }
785
+ .animate-duration-1000 { animation-duration: 1000ms !important; }
786
+
787
+ // No animation
788
+ .animate-none { animation: none !important; }
789
+
790
+ // ============================================================================
791
+ // 12. TRANSFORM UTILITIES
792
+ // ============================================================================
793
+ // Base transform class
794
+ .transform {
795
+ --ds-translate-x: 0;
796
+ --ds-translate-y: 0;
797
+ --ds-rotate: 0;
798
+ --ds-skew-x: 0;
799
+ --ds-skew-y: 0;
800
+ --ds-scale-x: 1;
801
+ --ds-scale-y: 1;
802
+ transform: translateX(var(--ds-translate-x)) translateY(var(--ds-translate-y)) rotate(var(--ds-rotate)) skewX(var(--ds-skew-x)) skewY(var(--ds-skew-y)) scaleX(var(--ds-scale-x)) scaleY(var(--ds-scale-y));
803
+ }
804
+
805
+ .transform-gpu {
806
+ transform: translate3d(var(--ds-translate-x, 0), var(--ds-translate-y, 0), 0) rotate(var(--ds-rotate, 0)) skewX(var(--ds-skew-x, 0)) skewY(var(--ds-skew-y, 0)) scaleX(var(--ds-scale-x, 1)) scaleY(var(--ds-scale-y, 1));
807
+ }
808
+
809
+ .transform-none { transform: none !important; }
810
+
811
+ // Scale
812
+ .scale-0 { --ds-scale-x: 0; --ds-scale-y: 0; transform: scale(0); }
813
+ .scale-50 { --ds-scale-x: 0.5; --ds-scale-y: 0.5; transform: scale(0.5); }
814
+ .scale-75 { --ds-scale-x: 0.75; --ds-scale-y: 0.75; transform: scale(0.75); }
815
+ .scale-90 { --ds-scale-x: 0.9; --ds-scale-y: 0.9; transform: scale(0.9); }
816
+ .scale-95 { --ds-scale-x: 0.95; --ds-scale-y: 0.95; transform: scale(0.95); }
817
+ .scale-100 { --ds-scale-x: 1; --ds-scale-y: 1; transform: scale(1); }
818
+ .scale-105 { --ds-scale-x: 1.05; --ds-scale-y: 1.05; transform: scale(1.05); }
819
+ .scale-110 { --ds-scale-x: 1.1; --ds-scale-y: 1.1; transform: scale(1.1); }
820
+ .scale-125 { --ds-scale-x: 1.25; --ds-scale-y: 1.25; transform: scale(1.25); }
821
+ .scale-150 { --ds-scale-x: 1.5; --ds-scale-y: 1.5; transform: scale(1.5); }
822
+
823
+ .scale-x-0 { --ds-scale-x: 0; transform: scaleX(0); }
824
+ .scale-x-50 { --ds-scale-x: 0.5; transform: scaleX(0.5); }
825
+ .scale-x-75 { --ds-scale-x: 0.75; transform: scaleX(0.75); }
826
+ .scale-x-90 { --ds-scale-x: 0.9; transform: scaleX(0.9); }
827
+ .scale-x-95 { --ds-scale-x: 0.95; transform: scaleX(0.95); }
828
+ .scale-x-100 { --ds-scale-x: 1; transform: scaleX(1); }
829
+ .scale-x-105 { --ds-scale-x: 1.05; transform: scaleX(1.05); }
830
+ .scale-x-110 { --ds-scale-x: 1.1; transform: scaleX(1.1); }
831
+ .scale-x-125 { --ds-scale-x: 1.25; transform: scaleX(1.25); }
832
+ .scale-x-150 { --ds-scale-x: 1.5; transform: scaleX(1.5); }
833
+
834
+ .scale-y-0 { --ds-scale-y: 0; transform: scaleY(0); }
835
+ .scale-y-50 { --ds-scale-y: 0.5; transform: scaleY(0.5); }
836
+ .scale-y-75 { --ds-scale-y: 0.75; transform: scaleY(0.75); }
837
+ .scale-y-90 { --ds-scale-y: 0.9; transform: scaleY(0.9); }
838
+ .scale-y-95 { --ds-scale-y: 0.95; transform: scaleY(0.95); }
839
+ .scale-y-100 { --ds-scale-y: 1; transform: scaleY(1); }
840
+ .scale-y-105 { --ds-scale-y: 1.05; transform: scaleY(1.05); }
841
+ .scale-y-110 { --ds-scale-y: 1.1; transform: scaleY(1.1); }
842
+ .scale-y-125 { --ds-scale-y: 1.25; transform: scaleY(1.25); }
843
+ .scale-y-150 { --ds-scale-y: 1.5; transform: scaleY(1.5); }
844
+
845
+ // Rotate
846
+ .rotate-0 { --ds-rotate: 0deg; transform: rotate(0deg); }
847
+ .rotate-1 { --ds-rotate: 1deg; transform: rotate(1deg); }
848
+ .rotate-2 { --ds-rotate: 2deg; transform: rotate(2deg); }
849
+ .rotate-3 { --ds-rotate: 3deg; transform: rotate(3deg); }
850
+ .rotate-6 { --ds-rotate: 6deg; transform: rotate(6deg); }
851
+ .rotate-12 { --ds-rotate: 12deg; transform: rotate(12deg); }
852
+ .rotate-45 { --ds-rotate: 45deg; transform: rotate(45deg); }
853
+ .rotate-90 { --ds-rotate: 90deg; transform: rotate(90deg); }
854
+ .rotate-180 { --ds-rotate: 180deg; transform: rotate(180deg); }
855
+ .-rotate-1 { --ds-rotate: -1deg; transform: rotate(-1deg); }
856
+ .-rotate-2 { --ds-rotate: -2deg; transform: rotate(-2deg); }
857
+ .-rotate-3 { --ds-rotate: -3deg; transform: rotate(-3deg); }
858
+ .-rotate-6 { --ds-rotate: -6deg; transform: rotate(-6deg); }
859
+ .-rotate-12 { --ds-rotate: -12deg; transform: rotate(-12deg); }
860
+ .-rotate-45 { --ds-rotate: -45deg; transform: rotate(-45deg); }
861
+ .-rotate-90 { --ds-rotate: -90deg; transform: rotate(-90deg); }
862
+ .-rotate-180 { --ds-rotate: -180deg; transform: rotate(-180deg); }
863
+
864
+ // Translate
865
+ .translate-x-0 { --ds-translate-x: 0; transform: translateX(0); }
866
+ .translate-x-1 { --ds-translate-x: 4px; transform: translateX(4px); }
867
+ .translate-x-2 { --ds-translate-x: 8px; transform: translateX(8px); }
868
+ .translate-x-3 { --ds-translate-x: 12px; transform: translateX(12px); }
869
+ .translate-x-4 { --ds-translate-x: 16px; transform: translateX(16px); }
870
+ .translate-x-5 { --ds-translate-x: 20px; transform: translateX(20px); }
871
+ .translate-x-6 { --ds-translate-x: 24px; transform: translateX(24px); }
872
+ .translate-x-8 { --ds-translate-x: 32px; transform: translateX(32px); }
873
+ .translate-x-10 { --ds-translate-x: 40px; transform: translateX(40px); }
874
+ .translate-x-12 { --ds-translate-x: 48px; transform: translateX(48px); }
875
+ .translate-x-full { --ds-translate-x: 100%; transform: translateX(100%); }
876
+ .translate-x-1\\/2 { --ds-translate-x: 50%; transform: translateX(50%); }
877
+ .-translate-x-1 { --ds-translate-x: -4px; transform: translateX(-4px); }
878
+ .-translate-x-2 { --ds-translate-x: -8px; transform: translateX(-8px); }
879
+ .-translate-x-3 { --ds-translate-x: -12px; transform: translateX(-12px); }
880
+ .-translate-x-4 { --ds-translate-x: -16px; transform: translateX(-16px); }
881
+ .-translate-x-full { --ds-translate-x: -100%; transform: translateX(-100%); }
882
+ .-translate-x-1\\/2 { --ds-translate-x: -50%; transform: translateX(-50%); }
883
+
884
+ .translate-y-0 { --ds-translate-y: 0; transform: translateY(0); }
885
+ .translate-y-1 { --ds-translate-y: 4px; transform: translateY(4px); }
886
+ .translate-y-2 { --ds-translate-y: 8px; transform: translateY(8px); }
887
+ .translate-y-3 { --ds-translate-y: 12px; transform: translateY(12px); }
888
+ .translate-y-4 { --ds-translate-y: 16px; transform: translateY(16px); }
889
+ .translate-y-5 { --ds-translate-y: 20px; transform: translateY(20px); }
890
+ .translate-y-6 { --ds-translate-y: 24px; transform: translateY(24px); }
891
+ .translate-y-8 { --ds-translate-y: 32px; transform: translateY(32px); }
892
+ .translate-y-10 { --ds-translate-y: 40px; transform: translateY(40px); }
893
+ .translate-y-12 { --ds-translate-y: 48px; transform: translateY(48px); }
894
+ .translate-y-full { --ds-translate-y: 100%; transform: translateY(100%); }
895
+ .translate-y-1\\/2 { --ds-translate-y: 50%; transform: translateY(50%); }
896
+ .-translate-y-1 { --ds-translate-y: -4px; transform: translateY(-4px); }
897
+ .-translate-y-2 { --ds-translate-y: -8px; transform: translateY(-8px); }
898
+ .-translate-y-3 { --ds-translate-y: -12px; transform: translateY(-12px); }
899
+ .-translate-y-4 { --ds-translate-y: -16px; transform: translateY(-16px); }
900
+ .-translate-y-full { --ds-translate-y: -100%; transform: translateY(-100%); }
901
+ .-translate-y-1\\/2 { --ds-translate-y: -50%; transform: translateY(-50%); }
902
+
903
+ // Skew
904
+ .skew-x-0 { --ds-skew-x: 0deg; transform: skewX(0deg); }
905
+ .skew-x-1 { --ds-skew-x: 1deg; transform: skewX(1deg); }
906
+ .skew-x-2 { --ds-skew-x: 2deg; transform: skewX(2deg); }
907
+ .skew-x-3 { --ds-skew-x: 3deg; transform: skewX(3deg); }
908
+ .skew-x-6 { --ds-skew-x: 6deg; transform: skewX(6deg); }
909
+ .skew-x-12 { --ds-skew-x: 12deg; transform: skewX(12deg); }
910
+ .-skew-x-1 { --ds-skew-x: -1deg; transform: skewX(-1deg); }
911
+ .-skew-x-2 { --ds-skew-x: -2deg; transform: skewX(-2deg); }
912
+ .-skew-x-3 { --ds-skew-x: -3deg; transform: skewX(-3deg); }
913
+ .-skew-x-6 { --ds-skew-x: -6deg; transform: skewX(-6deg); }
914
+ .-skew-x-12 { --ds-skew-x: -12deg; transform: skewX(-12deg); }
915
+
916
+ .skew-y-0 { --ds-skew-y: 0deg; transform: skewY(0deg); }
917
+ .skew-y-1 { --ds-skew-y: 1deg; transform: skewY(1deg); }
918
+ .skew-y-2 { --ds-skew-y: 2deg; transform: skewY(2deg); }
919
+ .skew-y-3 { --ds-skew-y: 3deg; transform: skewY(3deg); }
920
+ .skew-y-6 { --ds-skew-y: 6deg; transform: skewY(6deg); }
921
+ .skew-y-12 { --ds-skew-y: 12deg; transform: skewY(12deg); }
922
+ .-skew-y-1 { --ds-skew-y: -1deg; transform: skewY(-1deg); }
923
+ .-skew-y-2 { --ds-skew-y: -2deg; transform: skewY(-2deg); }
924
+ .-skew-y-3 { --ds-skew-y: -3deg; transform: skewY(-3deg); }
925
+ .-skew-y-6 { --ds-skew-y: -6deg; transform: skewY(-6deg); }
926
+ .-skew-y-12 { --ds-skew-y: -12deg; transform: skewY(-12deg); }
927
+
928
+ // Transform Origin
929
+ .origin-center { transform-origin: center !important; }
930
+ .origin-top { transform-origin: top !important; }
931
+ .origin-top-right { transform-origin: top right !important; }
932
+ .origin-right { transform-origin: right !important; }
933
+ .origin-bottom-right { transform-origin: bottom right !important; }
934
+ .origin-bottom { transform-origin: bottom !important; }
935
+ .origin-bottom-left { transform-origin: bottom left !important; }
936
+ .origin-left { transform-origin: left !important; }
937
+ .origin-top-left { transform-origin: top left !important; }
938
+
939
+ // ============================================================================
940
+ // 13. HOVER & FOCUS TRANSITION HELPERS
941
+ // ============================================================================
942
+ // These apply common hover effects with transitions built-in
943
+
944
+ .hover-lift {
945
+ transition: transform var(--duration-fast) var(--ease-out), box-shadow var(--duration-fast) var(--ease-out);
946
+
947
+ &:hover {
948
+ transform: translateY(-2px);
949
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
950
+ }
951
+ }
952
+
953
+ .hover-grow {
954
+ transition: transform var(--duration-fast) var(--ease-out);
955
+
956
+ &:hover {
957
+ transform: scale(1.05);
958
+ }
959
+ }
960
+
961
+ .hover-shrink {
962
+ transition: transform var(--duration-fast) var(--ease-out);
963
+
964
+ &:hover {
965
+ transform: scale(0.95);
966
+ }
967
+ }
968
+
969
+ .hover-brightness {
970
+ transition: filter var(--duration-fast) var(--ease-in-out);
971
+
972
+ &:hover {
973
+ filter: brightness(1.1);
974
+ }
975
+ }
976
+
977
+ .hover-dim {
978
+ transition: opacity var(--duration-fast) var(--ease-in-out);
979
+
980
+ &:hover {
981
+ opacity: 0.75;
982
+ }
983
+ }
984
+
985
+ .hover-glow {
986
+ transition: box-shadow var(--duration-fast) var(--ease-out);
987
+
988
+ &:hover {
989
+ box-shadow: 0 0 20px rgba(var(--primary-color-rgb, 0, 107, 223), 0.4);
990
+ }
991
+ }
992
+
993
+ // Active state helper
994
+ .active-press {
995
+ transition: transform var(--duration-75) var(--ease-out);
996
+
997
+ &:active {
998
+ transform: scale(0.97);
999
+ }
1000
+ }
1001
+
1002
+ // ============================================================================
1003
+ // 14. MOTION PREFERENCE UTILITIES
1004
+ // ============================================================================
1005
+ // Respects user's reduced motion preference
1006
+
1007
+ @media (prefers-reduced-motion: reduce) {
1008
+ .motion-reduce {
1009
+ animation: none !important;
1010
+ transition: none !important;
1011
+ }
1012
+
1013
+ *,
1014
+ *::before,
1015
+ *::after {
1016
+ animation-duration: 0.01ms !important;
1017
+ animation-iteration-count: 1 !important;
1018
+ transition-duration: 0.01ms !important;
1019
+ scroll-behavior: auto !important;
1020
+ }
1021
+ }
1022
+
1023
+ .motion-safe {
1024
+ @media (prefers-reduced-motion: no-preference) {
1025
+ // Animations only apply when user has no motion preference
1026
+ }
1027
+ }
1028
+
1029
+ // Force animations regardless of preference (use sparingly)
1030
+ .motion-force {
1031
+ animation-duration: inherit !important;
1032
+ animation-iteration-count: inherit !important;
1033
+ transition-duration: inherit !important;
1034
+ }
1035
+
1036
+ // ============================================================================
1037
+ // 15. OPACITY UTILITIES (commonly used with animations)
1038
+ // ============================================================================
1039
+ .opacity-0 { opacity: 0 !important; }
1040
+ .opacity-5 { opacity: 0.05 !important; }
1041
+ .opacity-10 { opacity: 0.1 !important; }
1042
+ .opacity-20 { opacity: 0.2 !important; }
1043
+ .opacity-25 { opacity: 0.25 !important; }
1044
+ .opacity-30 { opacity: 0.3 !important; }
1045
+ .opacity-40 { opacity: 0.4 !important; }
1046
+ .opacity-50 { opacity: 0.5 !important; }
1047
+ .opacity-60 { opacity: 0.6 !important; }
1048
+ .opacity-70 { opacity: 0.7 !important; }
1049
+ .opacity-75 { opacity: 0.75 !important; }
1050
+ .opacity-80 { opacity: 0.8 !important; }
1051
+ .opacity-90 { opacity: 0.9 !important; }
1052
+ .opacity-95 { opacity: 0.95 !important; }
1053
+ .opacity-100 { opacity: 1 !important; }