nimazasinich
Data provider stability and ui (#112)
a24b1f8
/* Enhanced Animations and Transitions - FLICKERING FIXED */
/* Page Enter/Exit Animations */
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes fadeInDown {
from {
opacity: 0;
transform: translateY(-30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes fadeInLeft {
from {
opacity: 0;
transform: translateX(-30px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
@keyframes fadeInRight {
from {
opacity: 0;
transform: translateX(30px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
@keyframes scaleIn {
from {
opacity: 0;
transform: scale(0.9);
}
to {
opacity: 1;
transform: scale(1);
}
}
@keyframes slideInFromBottom {
from {
opacity: 0;
transform: translateY(100px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* Shimmer Effect for Loading States */
@keyframes shimmer {
0% {
background-position: -1000px 0;
}
100% {
background-position: 1000px 0;
}
}
/* Rotate Animation */
@keyframes rotate {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
/* Shake Animation for Errors */
@keyframes shake {
0%, 100% {
transform: translateX(0);
}
10%, 30%, 50%, 70%, 90% {
transform: translateX(-5px);
}
20%, 40%, 60%, 80% {
transform: translateX(5px);
}
}
/* Progress Bar Animation */
@keyframes progress {
0% {
width: 0%;
}
100% {
width: 100%;
}
}
/* Apply Animations to Elements */
.tab-content.active {
animation: fadeInUp 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}
.stat-card {
animation: scaleIn 0.5s cubic-bezier(0.4, 0, 0.2, 1);
}
.stat-card:nth-child(1) {
animation-delay: 0.1s;
}
.stat-card:nth-child(2) {
animation-delay: 0.2s;
}
.stat-card:nth-child(3) {
animation-delay: 0.3s;
}
.stat-card:nth-child(4) {
animation-delay: 0.4s;
}
.card {
animation: fadeInUp 0.5s cubic-bezier(0.4, 0, 0.2, 1);
transform: translateZ(0); /* GPU acceleration */
will-change: auto; /* Prevent constant GPU layer */
}
/* FIXED: Removed bounce animation on hover - caused flickering */
/* .card:hover .card-icon { animation: bounce 0.5s ease; } */
/* Button Hover Effects - Optimized */
.btn-primary,
.btn-refresh {
position: relative;
overflow: hidden;
transform: translateZ(0);
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.btn-primary:hover,
.btn-refresh:hover {
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(102, 126, 234, 0.4);
}
.btn-primary:active,
.btn-refresh:active {
transform: translateY(0);
}
/* Loading Shimmer Effect */
.skeleton-loading {
background: linear-gradient(
90deg,
rgba(255, 255, 255, 0.05) 25%,
rgba(255, 255, 255, 0.15) 50%,
rgba(255, 255, 255, 0.05) 75%
);
background-size: 1000px 100%;
animation: shimmer 2s infinite linear;
}
/* Hover Lift Effect - Optimized */
.hover-lift {
transition: transform 0.2s ease, box-shadow 0.2s ease;
transform: translateZ(0);
}
.hover-lift:hover {
transform: translateY(-3px) translateZ(0);
box-shadow: 0 12px 48px rgba(0, 0, 0, 0.3);
}
/* Ripple Effect */
.ripple {
position: relative;
overflow: hidden;
}
.ripple::after {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 0;
height: 0;
border-radius: 50%;
background: rgba(255, 255, 255, 0.3);
transform: translate(-50%, -50%);
transition: width 0.6s, height 0.6s;
}
.ripple:active::after {
width: 300px;
height: 300px;
}
/* Tab Button Transitions */
.tab-btn {
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
}
.tab-btn::before {
content: '';
position: absolute;
bottom: 0;
left: 50%;
width: 0;
height: 3px;
background: var(--gradient-purple);
transform: translateX(-50%);
transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.tab-btn.active::before,
.tab-btn:hover::before {
width: 80%;
}
/* FIXED: Removed infinite glow-pulse animation on input focus */
.form-group input:focus,
.form-group textarea:focus,
.form-group select:focus {
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.3);
transition: box-shadow 0.15s ease;
}
/* FIXED: Status Badge - removed infinite pulse */
.status-badge {
animation: fadeInDown 0.5s cubic-bezier(0.4, 0, 0.2, 1);
}
/* FIXED: Status dot - removed infinite pulse animation */
.status-dot {
/* Use static indicator - no animation */
}
/* Alert Slide In */
.alert {
animation: slideInFromBottom 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}
.alert.alert-error {
animation: slideInFromBottom 0.4s cubic-bezier(0.4, 0, 0.2, 1), shake 0.5s 0.4s;
}
/* Chart Container Animation */
canvas {
animation: fadeInUp 0.6s cubic-bezier(0.4, 0, 0.2, 1);
}
/* Smooth Scrolling */
html {
scroll-behavior: smooth;
}
/* Logo Icon Animation - Limited */
.logo-icon {
animation: float 3s ease-in-out infinite;
}
@keyframes float {
0%, 100% {
transform: translateY(0px);
}
50% {
transform: translateY(-8px);
}
}
/* FIXED: Mini Stat - removed scale, only lift */
.mini-stat {
transition: transform 0.2s ease;
transform: translateZ(0);
}
.mini-stat:hover {
transform: translateY(-2px) translateZ(0);
}
/* FIXED: Table Row - removed transform shift */
table tr {
transition: background-color 0.15s ease;
}
table tr:hover {
background: rgba(102, 126, 234, 0.08);
}
/* Theme Toggle Animation */
.theme-toggle {
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.theme-toggle:hover {
transform: rotate(180deg);
}
/* FIXED: Sentiment Badge - removed scale on hover */
.sentiment-badge {
animation: fadeInLeft 0.3s cubic-bezier(0.4, 0, 0.2, 1);
transition: opacity 0.2s ease;
}
.sentiment-badge:hover {
opacity: 0.9;
}
/* AI Result Card Animation */
.ai-result-card {
animation: scaleIn 0.5s cubic-bezier(0.4, 0, 0.2, 1);
}
/* Model Status Indicator */
.model-status {
animation: fadeInRight 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
/* Progress Indicator */
.progress-bar {
width: 100%;
height: 4px;
background: rgba(255, 255, 255, 0.1);
border-radius: 2px;
overflow: hidden;
position: fixed;
top: 0;
left: 0;
z-index: 9999;
}
.progress-bar-fill {
height: 100%;
background: var(--gradient-purple);
animation: progress 2s ease-in-out;
}
/* Stagger Animation for Lists */
.stagger-item {
animation: fadeInUp 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}
.stagger-item:nth-child(1) { animation-delay: 0.1s; }
.stagger-item:nth-child(2) { animation-delay: 0.2s; }
.stagger-item:nth-child(3) { animation-delay: 0.3s; }
.stagger-item:nth-child(4) { animation-delay: 0.4s; }
.stagger-item:nth-child(5) { animation-delay: 0.5s; }
.stagger-item:nth-child(6) { animation-delay: 0.6s; }
.stagger-item:nth-child(7) { animation-delay: 0.7s; }
.stagger-item:nth-child(8) { animation-delay: 0.8s; }
.stagger-item:nth-child(9) { animation-delay: 0.9s; }
.stagger-item:nth-child(10) { animation-delay: 1s; }
/* Reduce Motion for Accessibility */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}