|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@keyframes drawTrendLine {
|
|
|
from {
|
|
|
stroke-dashoffset: 1000;
|
|
|
opacity: 0;
|
|
|
}
|
|
|
to {
|
|
|
stroke-dashoffset: 0;
|
|
|
opacity: 1;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@keyframes fadeInScale {
|
|
|
from {
|
|
|
opacity: 0;
|
|
|
transform: scale(0.8);
|
|
|
}
|
|
|
to {
|
|
|
opacity: 1;
|
|
|
transform: scale(1);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@keyframes slideInUp {
|
|
|
from {
|
|
|
opacity: 0;
|
|
|
transform: translateY(30px);
|
|
|
}
|
|
|
to {
|
|
|
opacity: 1;
|
|
|
transform: translateY(0);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@keyframes slideInRight {
|
|
|
from {
|
|
|
opacity: 0;
|
|
|
transform: translateX(-30px);
|
|
|
}
|
|
|
to {
|
|
|
opacity: 1;
|
|
|
transform: translateX(0);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@keyframes pulse {
|
|
|
0%, 100% {
|
|
|
opacity: 1;
|
|
|
transform: scale(1);
|
|
|
}
|
|
|
50% {
|
|
|
opacity: 0.8;
|
|
|
transform: scale(1.05);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@keyframes shimmer {
|
|
|
0% {
|
|
|
background-position: -1000px 0;
|
|
|
}
|
|
|
100% {
|
|
|
background-position: 1000px 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@keyframes gradientShift {
|
|
|
0%, 100% {
|
|
|
background-position: 0% 50%;
|
|
|
}
|
|
|
50% {
|
|
|
background-position: 100% 50%;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@keyframes rotate {
|
|
|
from {
|
|
|
transform: rotate(0deg);
|
|
|
}
|
|
|
to {
|
|
|
transform: rotate(360deg);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.chart-wrapper {
|
|
|
position: relative;
|
|
|
overflow: hidden;
|
|
|
}
|
|
|
|
|
|
.chart-wrapper::before {
|
|
|
content: '';
|
|
|
position: absolute;
|
|
|
top: 0;
|
|
|
left: -100%;
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
background: linear-gradient(
|
|
|
90deg,
|
|
|
transparent,
|
|
|
rgba(45, 212, 191, 0.1),
|
|
|
transparent
|
|
|
);
|
|
|
animation: shimmer 3s infinite;
|
|
|
pointer-events: none;
|
|
|
z-index: 10;
|
|
|
}
|
|
|
|
|
|
.trend-line {
|
|
|
stroke-dasharray: 1000;
|
|
|
stroke-dashoffset: 1000;
|
|
|
animation: drawTrendLine 2s ease-out forwards;
|
|
|
transition: stroke-width 0.3s ease;
|
|
|
}
|
|
|
|
|
|
.trend-line:hover {
|
|
|
stroke-width: 3px;
|
|
|
}
|
|
|
|
|
|
.support-line,
|
|
|
.resistance-line {
|
|
|
stroke-dasharray: 5, 5;
|
|
|
animation: drawTrendLine 1.5s ease-out forwards;
|
|
|
opacity: 0;
|
|
|
}
|
|
|
|
|
|
.support-line {
|
|
|
stroke: #ef4444;
|
|
|
}
|
|
|
|
|
|
.resistance-line {
|
|
|
stroke: #22c55e;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.panel-section,
|
|
|
.analysis-section,
|
|
|
.mode-panel {
|
|
|
animation: fadeInScale 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
|
|
|
opacity: 0;
|
|
|
}
|
|
|
|
|
|
.panel-section:nth-child(1) { animation-delay: 0.1s; }
|
|
|
.panel-section:nth-child(2) { animation-delay: 0.2s; }
|
|
|
.panel-section:nth-child(3) { animation-delay: 0.3s; }
|
|
|
.panel-section:nth-child(4) { animation-delay: 0.4s; }
|
|
|
.panel-section:nth-child(5) { animation-delay: 0.5s; }
|
|
|
|
|
|
.level-item,
|
|
|
.signal-item,
|
|
|
.pattern-item {
|
|
|
animation: slideInRight 0.5s ease-out forwards;
|
|
|
opacity: 0;
|
|
|
}
|
|
|
|
|
|
.level-item:nth-child(1) { animation-delay: 0.1s; }
|
|
|
.level-item:nth-child(2) { animation-delay: 0.2s; }
|
|
|
.level-item:nth-child(3) { animation-delay: 0.3s; }
|
|
|
.level-item:nth-child(4) { animation-delay: 0.4s; }
|
|
|
.level-item:nth-child(5) { animation-delay: 0.5s; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.btn,
|
|
|
.btn-primary,
|
|
|
.btn-icon {
|
|
|
position: relative;
|
|
|
overflow: hidden;
|
|
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
}
|
|
|
|
|
|
.btn::before,
|
|
|
.btn-primary::before {
|
|
|
content: '';
|
|
|
position: absolute;
|
|
|
top: 50%;
|
|
|
left: 50%;
|
|
|
width: 0;
|
|
|
height: 0;
|
|
|
border-radius: 50%;
|
|
|
background: rgba(255, 255, 255, 0.2);
|
|
|
transform: translate(-50%, -50%);
|
|
|
transition: width 0.6s, height 0.6s;
|
|
|
}
|
|
|
|
|
|
.btn:hover::before,
|
|
|
.btn-primary:hover::before {
|
|
|
width: 300px;
|
|
|
height: 300px;
|
|
|
}
|
|
|
|
|
|
.btn:active {
|
|
|
transform: scale(0.95);
|
|
|
}
|
|
|
|
|
|
.btn-icon {
|
|
|
transition: all 0.2s ease;
|
|
|
}
|
|
|
|
|
|
.btn-icon:hover {
|
|
|
transform: scale(1.1) rotate(5deg);
|
|
|
}
|
|
|
|
|
|
.btn-icon:active {
|
|
|
transform: scale(0.9);
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.indicator-bar,
|
|
|
.meter-bar {
|
|
|
position: relative;
|
|
|
overflow: hidden;
|
|
|
}
|
|
|
|
|
|
.indicator-fill,
|
|
|
.meter-fill {
|
|
|
position: relative;
|
|
|
transition: width 1s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
animation: pulse 2s infinite;
|
|
|
}
|
|
|
|
|
|
.indicator-fill::after,
|
|
|
.meter-fill::after {
|
|
|
content: '';
|
|
|
position: absolute;
|
|
|
top: 0;
|
|
|
left: 0;
|
|
|
right: 0;
|
|
|
bottom: 0;
|
|
|
background: linear-gradient(
|
|
|
90deg,
|
|
|
transparent,
|
|
|
rgba(255, 255, 255, 0.3),
|
|
|
transparent
|
|
|
);
|
|
|
animation: shimmer 2s infinite;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.mode-tab {
|
|
|
position: relative;
|
|
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
}
|
|
|
|
|
|
.mode-tab::before {
|
|
|
content: '';
|
|
|
position: absolute;
|
|
|
bottom: 0;
|
|
|
left: 50%;
|
|
|
width: 0;
|
|
|
height: 3px;
|
|
|
background: linear-gradient(90deg, #2dd4bf, #3b82f6);
|
|
|
transform: translateX(-50%);
|
|
|
transition: width 0.3s ease;
|
|
|
border-radius: 2px 2px 0 0;
|
|
|
}
|
|
|
|
|
|
.mode-tab:hover::before {
|
|
|
width: 80%;
|
|
|
}
|
|
|
|
|
|
.mode-tab.active::before {
|
|
|
width: 100%;
|
|
|
}
|
|
|
|
|
|
.mode-tab.active {
|
|
|
animation: pulse 2s infinite;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.loading-spinner {
|
|
|
width: 40px;
|
|
|
height: 40px;
|
|
|
border: 4px solid rgba(255, 255, 255, 0.1);
|
|
|
border-top-color: #2dd4bf;
|
|
|
border-radius: 50%;
|
|
|
animation: rotate 1s linear infinite;
|
|
|
}
|
|
|
|
|
|
.loading-skeleton {
|
|
|
background: linear-gradient(
|
|
|
90deg,
|
|
|
rgba(255, 255, 255, 0.05) 0%,
|
|
|
rgba(255, 255, 255, 0.1) 50%,
|
|
|
rgba(255, 255, 255, 0.05) 100%
|
|
|
);
|
|
|
background-size: 200% 100%;
|
|
|
animation: shimmer 1.5s infinite;
|
|
|
border-radius: var(--radius-md);
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.chart-data-point {
|
|
|
animation: fadeInScale 0.5s ease-out forwards;
|
|
|
opacity: 0;
|
|
|
transition: all 0.3s ease;
|
|
|
}
|
|
|
|
|
|
.chart-data-point:hover {
|
|
|
transform: scale(1.2);
|
|
|
filter: brightness(1.2);
|
|
|
}
|
|
|
|
|
|
.chart-data-point:nth-child(1) { animation-delay: 0.05s; }
|
|
|
.chart-data-point:nth-child(2) { animation-delay: 0.1s; }
|
|
|
.chart-data-point:nth-child(3) { animation-delay: 0.15s; }
|
|
|
.chart-data-point:nth-child(4) { animation-delay: 0.2s; }
|
|
|
.chart-data-point:nth-child(5) { animation-delay: 0.25s; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.notification {
|
|
|
animation: slideInRight 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
|
|
|
opacity: 0;
|
|
|
}
|
|
|
|
|
|
.notification.success {
|
|
|
border-left: 4px solid #22c55e;
|
|
|
}
|
|
|
|
|
|
.notification.error {
|
|
|
border-left: 4px solid #ef4444;
|
|
|
}
|
|
|
|
|
|
.notification.warning {
|
|
|
border-left: 4px solid #eab308;
|
|
|
}
|
|
|
|
|
|
.notification.info {
|
|
|
border-left: 4px solid #3b82f6;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.animated-gradient {
|
|
|
background: linear-gradient(
|
|
|
-45deg,
|
|
|
rgba(45, 212, 191, 0.1),
|
|
|
rgba(59, 130, 246, 0.1),
|
|
|
rgba(139, 92, 246, 0.1),
|
|
|
rgba(45, 212, 191, 0.1)
|
|
|
);
|
|
|
background-size: 400% 400%;
|
|
|
animation: gradientShift 8s ease infinite;
|
|
|
}
|
|
|
|
|
|
.glow-effect {
|
|
|
position: relative;
|
|
|
}
|
|
|
|
|
|
.glow-effect::after {
|
|
|
content: '';
|
|
|
position: absolute;
|
|
|
inset: -2px;
|
|
|
border-radius: inherit;
|
|
|
padding: 2px;
|
|
|
background: linear-gradient(
|
|
|
45deg,
|
|
|
#2dd4bf,
|
|
|
#3b82f6,
|
|
|
#8b5cf6,
|
|
|
#2dd4bf
|
|
|
);
|
|
|
background-size: 400% 400%;
|
|
|
-webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
|
|
|
-webkit-mask-composite: xor;
|
|
|
mask-composite: exclude;
|
|
|
animation: gradientShift 3s ease infinite;
|
|
|
opacity: 0.5;
|
|
|
pointer-events: none;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* {
|
|
|
transition-property: background-color, border-color, color, fill, stroke,
|
|
|
opacity, box-shadow, transform, filter;
|
|
|
transition-duration: 0.2s;
|
|
|
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
}
|
|
|
|
|
|
.panel-section,
|
|
|
.analysis-section,
|
|
|
.level-item,
|
|
|
.signal-item,
|
|
|
.pattern-item,
|
|
|
.metric-card,
|
|
|
.indicator-card {
|
|
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
}
|
|
|
|
|
|
.panel-section:hover,
|
|
|
.analysis-section:hover {
|
|
|
transform: translateY(-2px);
|
|
|
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
|
|
|
}
|
|
|
|
|
|
.level-item:hover,
|
|
|
.signal-item:hover,
|
|
|
.pattern-item:hover {
|
|
|
transform: translateX(4px);
|
|
|
background: rgba(255, 255, 255, 0.08);
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@media (prefers-reduced-motion: reduce) {
|
|
|
*,
|
|
|
*::before,
|
|
|
*::after {
|
|
|
animation-duration: 0.01ms !important;
|
|
|
animation-iteration-count: 1 !important;
|
|
|
transition-duration: 0.01ms !important;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.will-change-transform {
|
|
|
will-change: transform;
|
|
|
}
|
|
|
|
|
|
.will-change-opacity {
|
|
|
will-change: opacity;
|
|
|
}
|
|
|
|
|
|
.gpu-accelerated {
|
|
|
transform: translateZ(0);
|
|
|
backface-visibility: hidden;
|
|
|
perspective: 1000px;
|
|
|
}
|
|
|
|
|
|
|