claude-team-dashboard 1.2.2

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.

Potentially problematic release.


This version of claude-team-dashboard might be problematic. Click here for more details.

Files changed (49) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/LICENSE +21 -0
  3. package/README.md +722 -0
  4. package/cleanup.js +73 -0
  5. package/config.js +50 -0
  6. package/dist/assets/icons-Ijf8rQIc.js +1 -0
  7. package/dist/assets/index-Cqc1m1x_.css +1 -0
  8. package/dist/assets/index-jGy3ms0W.js +9 -0
  9. package/dist/assets/react-vendor-DbmSkCAF.js +1 -0
  10. package/dist/index.html +16 -0
  11. package/index.html +13 -0
  12. package/package.json +93 -0
  13. package/server.js +953 -0
  14. package/src/App.jsx +372 -0
  15. package/src/animations-enhanced.css +929 -0
  16. package/src/animations.css +783 -0
  17. package/src/components/ActivityFeed.jsx +289 -0
  18. package/src/components/AgentActivity.jsx +104 -0
  19. package/src/components/AgentCard.jsx +163 -0
  20. package/src/components/AgentOutputViewer.jsx +334 -0
  21. package/src/components/ArchiveViewer.jsx +283 -0
  22. package/src/components/ConnectionStatus.jsx +124 -0
  23. package/src/components/DetailedTaskProgress.jsx +126 -0
  24. package/src/components/ErrorBoundary.jsx +132 -0
  25. package/src/components/Header.jsx +154 -0
  26. package/src/components/LiveAgentStream.jsx +176 -0
  27. package/src/components/LiveCommunication.jsx +326 -0
  28. package/src/components/LiveMetrics.jsx +100 -0
  29. package/src/components/RealTimeMessages.jsx +298 -0
  30. package/src/components/SkeletonLoader.jsx +384 -0
  31. package/src/components/StatsOverview.jsx +209 -0
  32. package/src/components/SystemStatus.jsx +57 -0
  33. package/src/components/TaskList.jsx +306 -0
  34. package/src/components/TeamCard.jsx +126 -0
  35. package/src/components/TeamHistory.jsx +204 -0
  36. package/src/components/__tests__/ConnectionStatus.test.jsx +54 -0
  37. package/src/components/__tests__/StatsOverview.test.jsx +66 -0
  38. package/src/config/constants.js +59 -0
  39. package/src/hooks/useCounterAnimation.js +219 -0
  40. package/src/hooks/useWebSocket.js +76 -0
  41. package/src/index.css +1818 -0
  42. package/src/main.jsx +17 -0
  43. package/src/polish-enhancements.css +303 -0
  44. package/src/premium-visual-polish.css +830 -0
  45. package/src/responsive-enhancements.css +666 -0
  46. package/src/styles/theme.css +395 -0
  47. package/src/test/setup.js +19 -0
  48. package/start.js +36 -0
  49. package/vite.config.js +37 -0
@@ -0,0 +1,783 @@
1
+ /* ========================================
2
+ ANIMATION & MICRO-INTERACTIONS
3
+ Following 12 Principles of Animation
4
+ Premium Dashboard Animations
5
+ ======================================== */
6
+
7
+ /* ==========================================
8
+ KEYFRAME ANIMATIONS
9
+ ========================================== */
10
+
11
+ /* 1. Fade In Scale - Entrance with Squash & Stretch Principle */
12
+ @keyframes fadeInScale {
13
+ 0% {
14
+ opacity: 0;
15
+ transform: scale(0.92);
16
+ }
17
+ 60% {
18
+ opacity: 1;
19
+ transform: scale(1.02);
20
+ }
21
+ 100% {
22
+ transform: scale(1);
23
+ }
24
+ }
25
+
26
+ /* 2. Slide In Right - Activity Feed Items with Anticipation */
27
+ @keyframes slideInRight {
28
+ from {
29
+ opacity: 0;
30
+ transform: translateX(30px);
31
+ }
32
+ to {
33
+ opacity: 1;
34
+ transform: translateX(0);
35
+ }
36
+ }
37
+
38
+ /* 3. Slide In Left - Alternative entrance */
39
+ @keyframes slideInLeft {
40
+ from {
41
+ opacity: 0;
42
+ transform: translateX(-30px);
43
+ }
44
+ to {
45
+ opacity: 1;
46
+ transform: translateX(0);
47
+ }
48
+ }
49
+
50
+ /* 4. Bounce In - Attention-Grabbing Animation */
51
+ @keyframes bounceIn {
52
+ 0% {
53
+ opacity: 0;
54
+ transform: scale(0.3);
55
+ }
56
+ 50% {
57
+ opacity: 1;
58
+ transform: scale(1.08);
59
+ }
60
+ 70% {
61
+ transform: scale(0.96);
62
+ }
63
+ 100% {
64
+ transform: scale(1);
65
+ }
66
+ }
67
+
68
+ /* 5. Shimmer - Loading State with Motion */
69
+ @keyframes shimmer {
70
+ 0% {
71
+ background-position: -1000px 0;
72
+ }
73
+ 100% {
74
+ background-position: 1000px 0;
75
+ }
76
+ }
77
+
78
+ /* 6. Spin - Smooth Rotation for Loaders */
79
+ @keyframes spin {
80
+ from {
81
+ transform: rotate(0deg);
82
+ }
83
+ to {
84
+ transform: rotate(360deg);
85
+ }
86
+ }
87
+
88
+ /* 7. Glow Pulse - Live Connection Indicators */
89
+ @keyframes glowPulse {
90
+ 0%, 100% {
91
+ box-shadow: 0 0 8px rgba(34, 197, 94, 0.4),
92
+ 0 0 16px rgba(34, 197, 94, 0.2);
93
+ }
94
+ 50% {
95
+ box-shadow: 0 0 16px rgba(34, 197, 94, 0.6),
96
+ 0 0 32px rgba(34, 197, 94, 0.3),
97
+ 0 0 48px rgba(34, 197, 94, 0.1);
98
+ }
99
+ }
100
+
101
+ /* 8. Orange Glow - For Claude Orange Elements */
102
+ @keyframes orangeGlow {
103
+ 0%, 100% {
104
+ box-shadow: 0 0 10px rgba(249, 115, 22, 0.3),
105
+ 0 0 20px rgba(249, 115, 22, 0.2);
106
+ }
107
+ 50% {
108
+ box-shadow: 0 0 20px rgba(249, 115, 22, 0.5),
109
+ 0 0 40px rgba(249, 115, 22, 0.3),
110
+ 0 0 60px rgba(249, 115, 22, 0.1);
111
+ }
112
+ }
113
+
114
+ /* 9. Shake - Error State Feedback */
115
+ @keyframes shake {
116
+ 0%, 100% {
117
+ transform: translateX(0);
118
+ }
119
+ 10%, 30%, 50%, 70%, 90% {
120
+ transform: translateX(-4px);
121
+ }
122
+ 20%, 40%, 60%, 80% {
123
+ transform: translateX(4px);
124
+ }
125
+ }
126
+
127
+ /* 10. Float - Subtle Hovering Animation */
128
+ @keyframes float {
129
+ 0%, 100% {
130
+ transform: translateY(0);
131
+ }
132
+ 50% {
133
+ transform: translateY(-6px);
134
+ }
135
+ }
136
+
137
+ /* 11. Ripple - Expanding Circle Effect */
138
+ @keyframes ripple {
139
+ 0% {
140
+ transform: scale(1);
141
+ opacity: 1;
142
+ }
143
+ 100% {
144
+ transform: scale(1.6);
145
+ opacity: 0;
146
+ }
147
+ }
148
+
149
+ /* 12. Badge Pop - New Badge Appearance */
150
+ @keyframes badgePop {
151
+ 0% {
152
+ opacity: 0;
153
+ transform: scale(0.5);
154
+ }
155
+ 60% {
156
+ opacity: 1;
157
+ transform: scale(1.1);
158
+ }
159
+ 100% {
160
+ transform: scale(1);
161
+ }
162
+ }
163
+
164
+ /* 13. Progress Fill - Bar Growth Animation */
165
+ @keyframes progressFill {
166
+ from {
167
+ transform: scaleX(0);
168
+ transform-origin: left;
169
+ }
170
+ to {
171
+ transform: scaleX(1);
172
+ transform-origin: left;
173
+ }
174
+ }
175
+
176
+ /* 14. Fade In Up - Standard Entrance */
177
+ @keyframes fadeInUp {
178
+ from {
179
+ opacity: 0;
180
+ transform: translateY(20px);
181
+ }
182
+ to {
183
+ opacity: 1;
184
+ transform: translateY(0);
185
+ }
186
+ }
187
+
188
+ /* 15. Fade In Down - Top Entrance */
189
+ @keyframes fadeInDown {
190
+ from {
191
+ opacity: 0;
192
+ transform: translateY(-20px);
193
+ }
194
+ to {
195
+ opacity: 1;
196
+ transform: translateY(0);
197
+ }
198
+ }
199
+
200
+ /* 16. Zoom In - Scale Entrance */
201
+ @keyframes zoomIn {
202
+ from {
203
+ opacity: 0;
204
+ transform: scale(0.8);
205
+ }
206
+ to {
207
+ opacity: 1;
208
+ transform: scale(1);
209
+ }
210
+ }
211
+
212
+ /* 17. Slide Down - Dropdown Animation */
213
+ @keyframes slideDown {
214
+ from {
215
+ opacity: 0;
216
+ transform: translateY(-10px);
217
+ }
218
+ to {
219
+ opacity: 1;
220
+ transform: translateY(0);
221
+ }
222
+ }
223
+
224
+ /* 18. Heartbeat - Pulsing Scale Animation */
225
+ @keyframes heartbeat {
226
+ 0%, 100% {
227
+ transform: scale(1);
228
+ }
229
+ 10%, 30% {
230
+ transform: scale(0.95);
231
+ }
232
+ 20%, 40% {
233
+ transform: scale(1.1);
234
+ }
235
+ }
236
+
237
+ /* ==========================================
238
+ ANIMATION UTILITY CLASSES
239
+ ========================================== */
240
+
241
+ .animate-fade-in-scale {
242
+ animation: fadeInScale 0.4s cubic-bezier(0.4, 0.0, 0.2, 1);
243
+ }
244
+
245
+ .animate-slide-in-right {
246
+ animation: slideInRight 0.4s cubic-bezier(0.4, 0.0, 0.2, 1);
247
+ }
248
+
249
+ .animate-slide-in-left {
250
+ animation: slideInLeft 0.4s cubic-bezier(0.4, 0.0, 0.2, 1);
251
+ }
252
+
253
+ .animate-bounce-in {
254
+ animation: bounceIn 0.6s cubic-bezier(0.68, -0.55, 0.265, 1.55);
255
+ }
256
+
257
+ .animate-spin {
258
+ animation: spin 1s linear infinite;
259
+ }
260
+
261
+ .animate-glow-pulse {
262
+ animation: glowPulse 2s ease-in-out infinite;
263
+ }
264
+
265
+ .animate-orange-glow {
266
+ animation: orangeGlow 2s ease-in-out infinite;
267
+ }
268
+
269
+ .animate-shake {
270
+ animation: shake 0.5s ease-in-out;
271
+ }
272
+
273
+ .animate-float {
274
+ animation: float 3s ease-in-out infinite;
275
+ }
276
+
277
+ .animate-fade-in-up {
278
+ animation: fadeInUp 0.5s ease-out;
279
+ }
280
+
281
+ .animate-fade-in-down {
282
+ animation: fadeInDown 0.5s ease-out;
283
+ }
284
+
285
+ .animate-zoom-in {
286
+ animation: zoomIn 0.3s ease-out;
287
+ }
288
+
289
+ .animate-heartbeat {
290
+ animation: heartbeat 1.5s ease-in-out infinite;
291
+ }
292
+
293
+ /* ==========================================
294
+ CARD ANIMATIONS WITH STAGGER
295
+ ========================================== */
296
+
297
+ .card-animated {
298
+ animation: fadeInScale 0.4s cubic-bezier(0.4, 0.0, 0.2, 1);
299
+ animation-fill-mode: both;
300
+ }
301
+
302
+ .card-animated:nth-child(1) { animation-delay: 0ms; }
303
+ .card-animated:nth-child(2) { animation-delay: 50ms; }
304
+ .card-animated:nth-child(3) { animation-delay: 100ms; }
305
+ .card-animated:nth-child(4) { animation-delay: 150ms; }
306
+ .card-animated:nth-child(5) { animation-delay: 200ms; }
307
+ .card-animated:nth-child(6) { animation-delay: 250ms; }
308
+ .card-animated:nth-child(7) { animation-delay: 300ms; }
309
+ .card-animated:nth-child(8) { animation-delay: 350ms; }
310
+
311
+ /* ==========================================
312
+ STAT CARD ANIMATIONS
313
+ ========================================== */
314
+
315
+ .stat-card-animated {
316
+ animation: fadeInScale 0.5s cubic-bezier(0.4, 0.0, 0.2, 1);
317
+ animation-fill-mode: both;
318
+ transition: all 0.3s cubic-bezier(0.4, 0.0, 0.2, 1);
319
+ }
320
+
321
+ .stat-card-animated:hover {
322
+ transform: translateY(-4px) scale(1.02);
323
+ }
324
+
325
+ /* Stagger delays for stat cards */
326
+ .stat-card-animated:nth-child(1) { animation-delay: 0s; }
327
+ .stat-card-animated:nth-child(2) { animation-delay: 0.05s; }
328
+ .stat-card-animated:nth-child(3) { animation-delay: 0.1s; }
329
+ .stat-card-animated:nth-child(4) { animation-delay: 0.15s; }
330
+ .stat-card-animated:nth-child(5) { animation-delay: 0.2s; }
331
+ .stat-card-animated:nth-child(6) { animation-delay: 0.25s; }
332
+
333
+ /* ==========================================
334
+ BUTTON & INTERACTIVE ELEMENTS
335
+ ========================================== */
336
+
337
+ .button-animated {
338
+ position: relative;
339
+ transition: all 0.25s cubic-bezier(0.4, 0.0, 0.2, 1);
340
+ }
341
+
342
+ .button-animated:hover {
343
+ transform: translateY(-2px);
344
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3);
345
+ }
346
+
347
+ .button-animated:active {
348
+ transform: translateY(0) scale(0.98);
349
+ transition: all 0.1s ease-in;
350
+ }
351
+
352
+ /* Button with ripple effect */
353
+ .button-ripple {
354
+ position: relative;
355
+ overflow: hidden;
356
+ }
357
+
358
+ .button-ripple::after {
359
+ content: '';
360
+ position: absolute;
361
+ top: 50%;
362
+ left: 50%;
363
+ width: 0;
364
+ height: 0;
365
+ border-radius: 50%;
366
+ background: rgba(255, 255, 255, 0.3);
367
+ transform: translate(-50%, -50%);
368
+ transition: width 0.6s, height 0.6s;
369
+ }
370
+
371
+ .button-ripple:active::after {
372
+ width: 300px;
373
+ height: 300px;
374
+ }
375
+
376
+ /* ==========================================
377
+ BADGE ANIMATIONS
378
+ ========================================== */
379
+
380
+ .badge-animated {
381
+ animation: badgePop 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55);
382
+ transition: all 0.25s cubic-bezier(0.4, 0.0, 0.2, 1);
383
+ }
384
+
385
+ .badge-animated:hover {
386
+ transform: scale(1.08);
387
+ }
388
+
389
+ /* Shimmer effect for in-progress badges */
390
+ .badge-shimmer {
391
+ position: relative;
392
+ overflow: hidden;
393
+ }
394
+
395
+ .badge-shimmer::after {
396
+ content: '';
397
+ position: absolute;
398
+ top: 0;
399
+ left: -100%;
400
+ width: 100%;
401
+ height: 100%;
402
+ background: linear-gradient(
403
+ 90deg,
404
+ transparent,
405
+ rgba(255, 255, 255, 0.15),
406
+ transparent
407
+ );
408
+ animation: shimmer 2.5s infinite;
409
+ }
410
+
411
+ /* ==========================================
412
+ LIVE INDICATOR ANIMATIONS
413
+ ========================================== */
414
+
415
+ .live-indicator {
416
+ position: relative;
417
+ display: inline-block;
418
+ width: 10px;
419
+ height: 10px;
420
+ background-color: #4ade80;
421
+ border-radius: 50%;
422
+ animation: glowPulse 2s ease-in-out infinite;
423
+ }
424
+
425
+ .live-indicator::before {
426
+ content: '';
427
+ position: absolute;
428
+ top: 50%;
429
+ left: 50%;
430
+ transform: translate(-50%, -50%);
431
+ width: 100%;
432
+ height: 100%;
433
+ background-color: inherit;
434
+ border-radius: 50%;
435
+ animation: ripple 2s ease-out infinite;
436
+ }
437
+
438
+ /* Small live indicator (6px) */
439
+ .live-indicator-sm {
440
+ width: 6px;
441
+ height: 6px;
442
+ }
443
+
444
+ /* Large live indicator (14px) */
445
+ .live-indicator-lg {
446
+ width: 14px;
447
+ height: 14px;
448
+ }
449
+
450
+ /* ==========================================
451
+ ICON ANIMATIONS
452
+ ========================================== */
453
+
454
+ .icon-hover {
455
+ transition: transform 0.3s cubic-bezier(0.4, 0.0, 0.2, 1);
456
+ }
457
+
458
+ .icon-hover:hover {
459
+ transform: scale(1.15) rotate(5deg);
460
+ }
461
+
462
+ .icon-spin-hover:hover {
463
+ animation: spin 0.6s ease-in-out;
464
+ }
465
+
466
+ .icon-bounce-hover:hover {
467
+ animation: heartbeat 0.6s ease-in-out;
468
+ }
469
+
470
+ /* ==========================================
471
+ ACTIVITY FEED ANIMATIONS
472
+ ========================================== */
473
+
474
+ .activity-item-animated {
475
+ animation: slideInRight 0.4s cubic-bezier(0.4, 0.0, 0.2, 1);
476
+ animation-fill-mode: both;
477
+ transition: all 0.3s cubic-bezier(0.4, 0.0, 0.2, 1);
478
+ }
479
+
480
+ .activity-item-animated:hover {
481
+ transform: translateX(-4px);
482
+ background-color: rgba(55, 65, 81, 0.5);
483
+ }
484
+
485
+ /* Stagger animation for activity items */
486
+ .activity-item-animated:nth-child(1) { animation-delay: 0ms; }
487
+ .activity-item-animated:nth-child(2) { animation-delay: 60ms; }
488
+ .activity-item-animated:nth-child(3) { animation-delay: 120ms; }
489
+ .activity-item-animated:nth-child(4) { animation-delay: 180ms; }
490
+ .activity-item-animated:nth-child(5) { animation-delay: 240ms; }
491
+ .activity-item-animated:nth-child(6) { animation-delay: 300ms; }
492
+ .activity-item-animated:nth-child(7) { animation-delay: 360ms; }
493
+
494
+ /* ==========================================
495
+ TASK LIST ANIMATIONS
496
+ ========================================== */
497
+
498
+ .task-item-animated {
499
+ transition: all 0.3s cubic-bezier(0.4, 0.0, 0.2, 1);
500
+ animation: fadeInUp 0.35s ease-out;
501
+ animation-fill-mode: both;
502
+ }
503
+
504
+ .task-item-animated:hover {
505
+ transform: translateX(6px);
506
+ background-color: rgba(55, 65, 81, 0.6);
507
+ }
508
+
509
+ /* Task status indicators */
510
+ .task-status-pending {
511
+ animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
512
+ }
513
+
514
+ .task-status-in-progress {
515
+ animation: glowPulse 2s ease-in-out infinite;
516
+ }
517
+
518
+ .task-status-completed {
519
+ animation: bounceIn 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);
520
+ }
521
+
522
+ /* ==========================================
523
+ LOADING STATES
524
+ ========================================== */
525
+
526
+ .skeleton-animated {
527
+ background: linear-gradient(
528
+ 90deg,
529
+ rgba(55, 65, 81, 0.3) 0%,
530
+ rgba(75, 85, 99, 0.5) 50%,
531
+ rgba(55, 65, 81, 0.3) 100%
532
+ );
533
+ background-size: 200% 100%;
534
+ animation: shimmer 1.5s ease-in-out infinite;
535
+ border-radius: 6px;
536
+ }
537
+
538
+ .loading-dots {
539
+ display: inline-flex;
540
+ gap: 4px;
541
+ }
542
+
543
+ .loading-dots span {
544
+ display: inline-block;
545
+ width: 6px;
546
+ height: 6px;
547
+ background-color: currentColor;
548
+ border-radius: 50%;
549
+ animation: pulse 1.4s ease-in-out infinite;
550
+ }
551
+
552
+ .loading-dots span:nth-child(1) { animation-delay: 0s; }
553
+ .loading-dots span:nth-child(2) { animation-delay: 0.2s; }
554
+ .loading-dots span:nth-child(3) { animation-delay: 0.4s; }
555
+
556
+ .loading-spinner {
557
+ animation: spin 1s linear infinite;
558
+ }
559
+
560
+ /* ==========================================
561
+ PROGRESS BAR ANIMATIONS
562
+ ========================================== */
563
+
564
+ .progress-bar-animated {
565
+ position: relative;
566
+ overflow: hidden;
567
+ background: rgba(55, 65, 81, 0.5);
568
+ border-radius: 9999px;
569
+ height: 8px;
570
+ }
571
+
572
+ .progress-fill-animated {
573
+ height: 100%;
574
+ background: linear-gradient(90deg, #f97316, #fb923c);
575
+ border-radius: inherit;
576
+ transition: width 0.5s cubic-bezier(0.4, 0.0, 0.2, 1);
577
+ animation: progressFill 1s ease-out;
578
+ }
579
+
580
+ /* Indeterminate progress bar */
581
+ @keyframes indeterminateProgress {
582
+ 0% {
583
+ transform: translateX(-100%);
584
+ }
585
+ 100% {
586
+ transform: translateX(400%);
587
+ }
588
+ }
589
+
590
+ .progress-indeterminate {
591
+ position: relative;
592
+ overflow: hidden;
593
+ }
594
+
595
+ .progress-indeterminate::after {
596
+ content: '';
597
+ position: absolute;
598
+ top: 0;
599
+ left: 0;
600
+ width: 25%;
601
+ height: 100%;
602
+ background: linear-gradient(90deg, transparent, rgba(249, 115, 22, 0.6), transparent);
603
+ animation: indeterminateProgress 1.5s ease-in-out infinite;
604
+ }
605
+
606
+ /* ==========================================
607
+ NUMBER COUNTER ANIMATIONS
608
+ ========================================== */
609
+
610
+ .counter-animated {
611
+ display: inline-block;
612
+ transition: all 0.3s cubic-bezier(0.4, 0.0, 0.2, 1);
613
+ }
614
+
615
+ .counter-animated.updated {
616
+ animation: bounceIn 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);
617
+ }
618
+
619
+ /* ==========================================
620
+ TOAST NOTIFICATIONS
621
+ ========================================== */
622
+
623
+ .toast-enter {
624
+ animation: slideInRight 0.3s ease-out;
625
+ }
626
+
627
+ .toast-exit {
628
+ animation: slideInRight 0.3s ease-in reverse;
629
+ }
630
+
631
+ /* ==========================================
632
+ MODAL & OVERLAY ANIMATIONS
633
+ ========================================== */
634
+
635
+ .modal-backdrop-enter {
636
+ opacity: 0;
637
+ }
638
+
639
+ .modal-backdrop-enter-active {
640
+ opacity: 1;
641
+ transition: opacity 0.3s ease-out;
642
+ }
643
+
644
+ .modal-backdrop-exit {
645
+ opacity: 1;
646
+ }
647
+
648
+ .modal-backdrop-exit-active {
649
+ opacity: 0;
650
+ transition: opacity 0.3s ease-in;
651
+ }
652
+
653
+ .modal-content-enter {
654
+ opacity: 0;
655
+ transform: scale(0.95) translateY(-20px);
656
+ }
657
+
658
+ .modal-content-enter-active {
659
+ opacity: 1;
660
+ transform: scale(1) translateY(0);
661
+ transition: all 0.3s cubic-bezier(0.4, 0.0, 0.2, 1);
662
+ }
663
+
664
+ .modal-content-exit {
665
+ opacity: 1;
666
+ transform: scale(1) translateY(0);
667
+ }
668
+
669
+ .modal-content-exit-active {
670
+ opacity: 0;
671
+ transform: scale(0.95) translateY(-20px);
672
+ transition: all 0.3s cubic-bezier(0.4, 0.0, 0.2, 1);
673
+ }
674
+
675
+ /* ==========================================
676
+ TEAM & AGENT CARD ANIMATIONS
677
+ ========================================== */
678
+
679
+ .team-card-animated {
680
+ transition: all 0.3s cubic-bezier(0.4, 0.0, 0.2, 1);
681
+ }
682
+
683
+ .team-card-animated:hover {
684
+ transform: translateY(-3px);
685
+ }
686
+
687
+ .agent-card-animated {
688
+ transition: all 0.25s cubic-bezier(0.4, 0.0, 0.2, 1);
689
+ }
690
+
691
+ .agent-card-animated:hover {
692
+ transform: scale(1.02);
693
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.25);
694
+ }
695
+
696
+ /* ==========================================
697
+ CONNECTION STATUS ANIMATIONS
698
+ ========================================== */
699
+
700
+ .connection-connected {
701
+ animation: bounceIn 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);
702
+ }
703
+
704
+ .connection-connecting {
705
+ animation: pulse 1.5s ease-in-out infinite;
706
+ }
707
+
708
+ .connection-error {
709
+ animation: shake 0.5s ease-in-out;
710
+ }
711
+
712
+ /* ==========================================
713
+ HOVER EFFECTS
714
+ ========================================== */
715
+
716
+ .hover-lift {
717
+ transition: all 0.3s cubic-bezier(0.4, 0.0, 0.2, 1);
718
+ }
719
+
720
+ .hover-lift:hover {
721
+ transform: translateY(-4px);
722
+ box-shadow: 0 12px 24px rgba(0, 0, 0, 0.3);
723
+ }
724
+
725
+ .hover-scale {
726
+ transition: transform 0.3s cubic-bezier(0.4, 0.0, 0.2, 1);
727
+ }
728
+
729
+ .hover-scale:hover {
730
+ transform: scale(1.05);
731
+ }
732
+
733
+ .hover-glow-orange {
734
+ position: relative;
735
+ transition: all 0.3s cubic-bezier(0.4, 0.0, 0.2, 1);
736
+ }
737
+
738
+ .hover-glow-orange:hover {
739
+ box-shadow: 0 0 24px rgba(249, 115, 22, 0.6),
740
+ 0 0 48px rgba(249, 115, 22, 0.3);
741
+ }
742
+
743
+ /* ==========================================
744
+ ACCESSIBILITY - REDUCED MOTION
745
+ ========================================== */
746
+
747
+ @media (prefers-reduced-motion: reduce) {
748
+ *,
749
+ *::before,
750
+ *::after {
751
+ animation-duration: 0.01ms !important;
752
+ animation-iteration-count: 1 !important;
753
+ transition-duration: 0.01ms !important;
754
+ scroll-behavior: auto !important;
755
+ }
756
+
757
+ /* Disable infinite animations */
758
+ .animate-pulse,
759
+ .animate-spin,
760
+ .animate-glow-pulse,
761
+ .animate-orange-glow,
762
+ .animate-float,
763
+ .animate-heartbeat,
764
+ .live-indicator,
765
+ .badge-shimmer::after,
766
+ .task-status-pending,
767
+ .task-status-in-progress,
768
+ .connection-connecting,
769
+ .loading-spinner,
770
+ .progress-indeterminate::after {
771
+ animation: none !important;
772
+ }
773
+
774
+ /* Keep functional transitions but instant */
775
+ .button-animated:hover,
776
+ .card-animated:hover,
777
+ .stat-card-animated:hover,
778
+ .hover-lift:hover,
779
+ .hover-scale:hover {
780
+ transition-duration: 0ms !important;
781
+ animation: none !important;
782
+ }
783
+ }