|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.toast-stack { |
|
|
position: fixed; |
|
|
top: 24px; |
|
|
right: 24px; |
|
|
display: flex; |
|
|
flex-direction: column; |
|
|
gap: 12px; |
|
|
z-index: 2000; |
|
|
} |
|
|
|
|
|
.toast { |
|
|
min-width: 260px; |
|
|
background: #ffffff; |
|
|
border-radius: 12px; |
|
|
border: 1px solid var(--ui-border); |
|
|
padding: 14px 18px; |
|
|
box-shadow: var(--ui-shadow); |
|
|
display: flex; |
|
|
gap: 12px; |
|
|
align-items: center; |
|
|
animation: toast-in 220ms ease; |
|
|
} |
|
|
|
|
|
.toast.success { border-color: rgba(22, 163, 74, 0.4); } |
|
|
.toast.error { border-color: rgba(220, 38, 38, 0.4); } |
|
|
.toast.info { border-color: rgba(37, 99, 235, 0.4); } |
|
|
|
|
|
.toast strong { |
|
|
font-size: 0.95rem; |
|
|
color: var(--ui-text); |
|
|
} |
|
|
|
|
|
.toast small { |
|
|
color: var(--ui-text-muted); |
|
|
display: block; |
|
|
} |
|
|
|
|
|
@keyframes toast-in { |
|
|
from { opacity: 0; transform: translateY(-10px); } |
|
|
to { opacity: 1; transform: translateY(0); } |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.loading-indicator { |
|
|
display: inline-flex; |
|
|
align-items: center; |
|
|
gap: 10px; |
|
|
color: var(--ui-text-muted); |
|
|
font-size: 0.9rem; |
|
|
} |
|
|
|
|
|
.loading-indicator::before { |
|
|
content: ""; |
|
|
width: 14px; |
|
|
height: 14px; |
|
|
border: 2px solid var(--ui-border); |
|
|
border-top-color: var(--ui-primary); |
|
|
border-radius: 50%; |
|
|
animation: spin 0.8s linear infinite; |
|
|
} |
|
|
|
|
|
@keyframes spin { |
|
|
to { transform: rotate(360deg); } |
|
|
} |
|
|
|
|
|
.fade-in { |
|
|
animation: fade 250ms ease; |
|
|
} |
|
|
|
|
|
@keyframes fade { |
|
|
from { opacity: 0; } |
|
|
to { opacity: 1; } |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.badge { |
|
|
display: inline-flex; |
|
|
align-items: center; |
|
|
gap: 6px; |
|
|
padding: 4px 12px; |
|
|
border-radius: 999px; |
|
|
font-size: 0.8rem; |
|
|
letter-spacing: 0.06em; |
|
|
text-transform: uppercase; |
|
|
border: 1px solid transparent; |
|
|
} |
|
|
|
|
|
.badge.info { |
|
|
color: var(--ui-primary); |
|
|
border-color: var(--ui-primary); |
|
|
background: rgba(37, 99, 235, 0.08); |
|
|
} |
|
|
|
|
|
.badge.success { |
|
|
color: var(--ui-success); |
|
|
border-color: rgba(22, 163, 74, 0.3); |
|
|
background: rgba(22, 163, 74, 0.08); |
|
|
} |
|
|
|
|
|
.badge.warning { |
|
|
color: var(--ui-warning); |
|
|
border-color: rgba(217, 119, 6, 0.3); |
|
|
background: rgba(217, 119, 6, 0.08); |
|
|
} |
|
|
|
|
|
.badge.danger { |
|
|
color: var(--ui-danger); |
|
|
border-color: rgba(220, 38, 38, 0.3); |
|
|
background: rgba(220, 38, 38, 0.08); |
|
|
} |
|
|
|
|
|
.badge.source-fallback { |
|
|
border-color: rgba(220, 38, 38, 0.3); |
|
|
color: var(--ui-danger); |
|
|
background: rgba(220, 38, 38, 0.06); |
|
|
} |
|
|
|
|
|
.badge.source-live { |
|
|
border-color: rgba(22, 163, 74, 0.3); |
|
|
color: var(--ui-success); |
|
|
background: rgba(22, 163, 74, 0.08); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.empty-state { |
|
|
padding: 20px; |
|
|
border-radius: 12px; |
|
|
text-align: center; |
|
|
border: 1px dashed var(--ui-border); |
|
|
color: var(--ui-text-muted); |
|
|
background: #fff; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.ws-stream { |
|
|
display: flex; |
|
|
flex-direction: column; |
|
|
gap: 12px; |
|
|
max-height: 300px; |
|
|
overflow-y: auto; |
|
|
} |
|
|
|
|
|
.stream-item { |
|
|
border: 1px solid var(--ui-border); |
|
|
border-radius: 12px; |
|
|
padding: 12px 14px; |
|
|
background: var(--ui-panel-muted); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.alert { |
|
|
border-radius: 12px; |
|
|
padding: 12px 16px; |
|
|
display: flex; |
|
|
justify-content: space-between; |
|
|
align-items: center; |
|
|
} |
|
|
|
|
|
.alert.info { |
|
|
background: rgba(37, 99, 235, 0.08); |
|
|
color: var(--ui-primary); |
|
|
border: 1px solid rgba(37, 99, 235, 0.2); |
|
|
} |
|
|
|
|
|
.alert.success { |
|
|
background: rgba(22, 163, 74, 0.08); |
|
|
color: var(--ui-success); |
|
|
border: 1px solid rgba(22, 163, 74, 0.2); |
|
|
} |
|
|
|
|
|
.alert.warning { |
|
|
background: rgba(217, 119, 6, 0.08); |
|
|
color: var(--ui-warning); |
|
|
border: 1px solid rgba(217, 119, 6, 0.2); |
|
|
} |
|
|
|
|
|
.alert.danger, |
|
|
.alert.error { |
|
|
background: rgba(220, 38, 38, 0.08); |
|
|
color: var(--ui-danger); |
|
|
border: 1px solid rgba(220, 38, 38, 0.2); |
|
|
} |
|
|
|