Really-amin's picture
Upload 325 files
b66240d verified
/* ============================================
Components CSS - Reusable UI Components
============================================
This file contains all reusable component styles:
- Toast notifications
- Loading spinners
- Status badges (info, success, warning, danger)
- Empty states
- Stream items
- Alerts
============================================ */
/* === Toast Notification Styles === */
.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 Spinner Styles === */
.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 Styles === */
.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 Styles === */
.empty-state {
padding: 20px;
border-radius: 12px;
text-align: center;
border: 1px dashed var(--ui-border);
color: var(--ui-text-muted);
background: #fff;
}
/* === Stream Item Styles === */
.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 Styles === */
.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);
}