|
|
|
|
|
|
|
|
|
|
|
@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);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
@keyframes pulse-glow {
|
|
|
0%, 100% {
|
|
|
box-shadow: 0 0 0 0 rgba(102, 126, 234, 0.7);
|
|
|
}
|
|
|
50% {
|
|
|
box-shadow: 0 0 0 10px rgba(102, 126, 234, 0);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
@keyframes shimmer {
|
|
|
0% {
|
|
|
background-position: -1000px 0;
|
|
|
}
|
|
|
100% {
|
|
|
background-position: 1000px 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
@keyframes bounce {
|
|
|
0%, 100% {
|
|
|
transform: translateY(0);
|
|
|
}
|
|
|
50% {
|
|
|
transform: translateY(-10px);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
@keyframes rotate {
|
|
|
from {
|
|
|
transform: rotate(0deg);
|
|
|
}
|
|
|
to {
|
|
|
transform: rotate(360deg);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
@keyframes shake {
|
|
|
0%, 100% {
|
|
|
transform: translateX(0);
|
|
|
}
|
|
|
10%, 30%, 50%, 70%, 90% {
|
|
|
transform: translateX(-5px);
|
|
|
}
|
|
|
20%, 40%, 60%, 80% {
|
|
|
transform: translateX(5px);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
@keyframes glow-pulse {
|
|
|
0%, 100% {
|
|
|
box-shadow: 0 0 20px rgba(102, 126, 234, 0.4);
|
|
|
}
|
|
|
50% {
|
|
|
box-shadow: 0 0 40px rgba(102, 126, 234, 0.8);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
@keyframes progress {
|
|
|
0% {
|
|
|
width: 0%;
|
|
|
}
|
|
|
100% {
|
|
|
width: 100%;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
.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);
|
|
|
}
|
|
|
|
|
|
.card:hover .card-icon {
|
|
|
animation: bounce 0.5s ease;
|
|
|
}
|
|
|
|
|
|
|
|
|
.btn-primary,
|
|
|
.btn-refresh {
|
|
|
position: relative;
|
|
|
overflow: hidden;
|
|
|
transform: translateZ(0);
|
|
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
}
|
|
|
|
|
|
.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);
|
|
|
}
|
|
|
|
|
|
|
|
|
.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 {
|
|
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
}
|
|
|
|
|
|
.hover-lift:hover {
|
|
|
transform: translateY(-4px);
|
|
|
box-shadow: 0 12px 48px rgba(0, 0, 0, 0.3);
|
|
|
}
|
|
|
|
|
|
|
|
|
.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-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%;
|
|
|
}
|
|
|
|
|
|
|
|
|
.form-group input:focus,
|
|
|
.form-group textarea:focus,
|
|
|
.form-group select:focus {
|
|
|
animation: glow-pulse 2s infinite;
|
|
|
}
|
|
|
|
|
|
|
|
|
.status-badge {
|
|
|
animation: fadeInDown 0.5s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
}
|
|
|
|
|
|
.status-dot {
|
|
|
animation: pulse 2s infinite;
|
|
|
}
|
|
|
|
|
|
|
|
|
.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;
|
|
|
}
|
|
|
|
|
|
|
|
|
canvas {
|
|
|
animation: fadeInUp 0.6s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
}
|
|
|
|
|
|
|
|
|
html {
|
|
|
scroll-behavior: smooth;
|
|
|
}
|
|
|
|
|
|
|
|
|
.logo-icon {
|
|
|
animation: float 3s ease-in-out infinite;
|
|
|
}
|
|
|
|
|
|
@keyframes float {
|
|
|
0%, 100% {
|
|
|
transform: translateY(0px);
|
|
|
}
|
|
|
50% {
|
|
|
transform: translateY(-8px);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
.mini-stat {
|
|
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
}
|
|
|
|
|
|
.mini-stat:hover {
|
|
|
transform: translateY(-3px) scale(1.05);
|
|
|
}
|
|
|
|
|
|
|
|
|
table tr {
|
|
|
transition: background-color 0.2s ease, transform 0.2s ease;
|
|
|
}
|
|
|
|
|
|
table tr:hover {
|
|
|
background: rgba(102, 126, 234, 0.08);
|
|
|
transform: translateX(4px);
|
|
|
}
|
|
|
|
|
|
|
|
|
.theme-toggle {
|
|
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
}
|
|
|
|
|
|
.theme-toggle:hover {
|
|
|
transform: rotate(180deg);
|
|
|
}
|
|
|
|
|
|
|
|
|
.sentiment-badge {
|
|
|
animation: fadeInLeft 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
}
|
|
|
|
|
|
.sentiment-badge:hover {
|
|
|
transform: scale(1.05);
|
|
|
}
|
|
|
|
|
|
|
|
|
.ai-result-card {
|
|
|
animation: scaleIn 0.5s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
}
|
|
|
|
|
|
|
|
|
.model-status {
|
|
|
animation: fadeInRight 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
}
|
|
|
|
|
|
|
|
|
.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-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; }
|
|
|
|
|
|
|
|
|
@media (prefers-reduced-motion: reduce) {
|
|
|
*,
|
|
|
*::before,
|
|
|
*::after {
|
|
|
animation-duration: 0.01ms !important;
|
|
|
animation-iteration-count: 1 !important;
|
|
|
transition-duration: 0.01ms !important;
|
|
|
}
|
|
|
}
|
|
|
|