Really-amin's picture
Upload 317 files
eebf5c4 verified
/**
* ═══════════════════════════════════════════════════════════════════
* COMPONENTS CSS β€” ULTRA ENTERPRISE EDITION
* Crypto Monitor HF β€” Glass + Neon Component Library
* ═══════════════════════════════════════════════════════════════════
*
* All components use design-system.css tokens
* Glass morphism + Neon glows + Smooth animations
*/
/* ═══════════════════════════════════════════════════════════════════
πŸ”˜ BUTTONS
═══════════════════════════════════════════════════════════════════ */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--space-2);
padding: var(--space-3) var(--space-6);
font-family: var(--font-main);
font-size: var(--fs-sm);
font-weight: var(--fw-semibold);
line-height: var(--lh-tight);
border: none;
border-radius: var(--radius-md);
cursor: pointer;
transition: all var(--transition-fast);
white-space: nowrap;
user-select: none;
min-height: 44px; /* Touch target WCAG AA */
}
.btn:disabled {
opacity: 0.5;
cursor: not-allowed;
pointer-events: none;
}
.btn:focus-visible {
outline: 2px solid var(--brand-cyan);
outline-offset: 2px;
}
/* Primary Button β€” Gradient + Glow */
.btn-primary {
background: var(--gradient-primary);
color: var(--text-strong);
box-shadow: var(--shadow-sm), var(--glow-blue);
}
.btn-primary:hover {
box-shadow: var(--shadow-md), var(--glow-blue-strong);
transform: translateY(-2px);
}
.btn-primary:active {
transform: translateY(0);
box-shadow: var(--shadow-xs), var(--glow-blue);
}
/* Secondary Button β€” Glass Outline */
.btn-secondary {
background: var(--surface-glass);
color: var(--text-normal);
border: 1px solid var(--border-light);
backdrop-filter: var(--blur-md);
}
.btn-secondary:hover {
background: var(--surface-glass-strong);
border-color: var(--border-medium);
transform: translateY(-1px);
}
/* Success Button */
.btn-success {
background: var(--gradient-success);
color: var(--text-strong);
box-shadow: var(--shadow-sm), var(--glow-green);
}
.btn-success:hover {
box-shadow: var(--shadow-md), var(--glow-green-strong);
transform: translateY(-2px);
}
/* Danger Button */
.btn-danger {
background: var(--gradient-danger);
color: var(--text-strong);
box-shadow: var(--shadow-sm);
}
.btn-danger:hover {
box-shadow: var(--shadow-md);
transform: translateY(-2px);
}
/* Ghost Button */
.btn-ghost {
background: transparent;
color: var(--text-soft);
border: none;
}
.btn-ghost:hover {
background: var(--surface-glass);
color: var(--text-normal);
}
/* Button Sizes */
.btn-sm {
padding: var(--space-2) var(--space-4);
font-size: var(--fs-xs);
min-height: 36px;
}
.btn-lg {
padding: var(--space-4) var(--space-8);
font-size: var(--fs-base);
min-height: 52px;
}
/* Icon-only button */
.btn-icon {
padding: var(--space-3);
min-width: 44px;
min-height: 44px;
}
/* ═══════════════════════════════════════════════════════════════════
πŸƒ CARDS
═══════════════════════════════════════════════════════════════════ */
.card {
background: var(--surface-glass);
border: 1px solid var(--border-light);
border-radius: var(--radius-lg);
padding: var(--space-6);
box-shadow: var(--shadow-md);
backdrop-filter: var(--blur-lg);
transition: all var(--transition-normal);
}
.card:hover {
background: var(--surface-glass-strong);
box-shadow: var(--shadow-lg);
transform: translateY(-2px);
}
.card-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: var(--space-4);
padding-bottom: var(--space-4);
border-bottom: 1px solid var(--border-subtle);
}
.card-title {
font-size: var(--fs-lg);
font-weight: var(--fw-bold);
color: var(--text-strong);
margin: 0;
display: flex;
align-items: center;
gap: var(--space-2);
}
.card-body {
color: var(--text-soft);
line-height: var(--lh-relaxed);
}
.card-footer {
margin-top: var(--space-6);
padding-top: var(--space-4);
border-top: 1px solid var(--border-subtle);
display: flex;
align-items: center;
justify-content: space-between;
}
/* Card variants */
.card-elevated {
background: var(--surface-glass-strong);
box-shadow: var(--shadow-lg);
}
.card-neon {
border-color: var(--brand-cyan);
box-shadow: var(--shadow-md), var(--glow-cyan);
}
/* ═══════════════════════════════════════════════════════════════════
πŸ“Š STAT CARDS
═══════════════════════════════════════════════════════════════════ */
.stat-card {
background: var(--surface-glass);
border: 1px solid var(--border-light);
border-radius: var(--radius-md);
padding: var(--space-5);
backdrop-filter: var(--blur-lg);
transition: all var(--transition-normal);
}
.stat-card:hover {
transform: translateY(-4px);
box-shadow: var(--shadow-lg), var(--glow-cyan);
border-color: var(--brand-cyan);
}
.stat-icon {
width: 48px;
height: 48px;
border-radius: var(--radius-md);
display: flex;
align-items: center;
justify-content: center;
background: var(--gradient-primary);
box-shadow: var(--glow-blue);
margin-bottom: var(--space-3);
}
.stat-value {
font-size: var(--fs-3xl);
font-weight: var(--fw-extrabold);
color: var(--text-strong);
margin-bottom: var(--space-1);
line-height: var(--lh-tight);
}
.stat-label {
font-size: var(--fs-sm);
color: var(--text-muted);
font-weight: var(--fw-medium);
text-transform: uppercase;
letter-spacing: var(--tracking-wide);
}
.stat-change {
display: inline-flex;
align-items: center;
gap: var(--space-1);
margin-top: var(--space-2);
font-size: var(--fs-xs);
font-weight: var(--fw-semibold);
padding: var(--space-1) var(--space-2);
border-radius: var(--radius-xs);
}
.stat-change.positive {
color: var(--success);
background: rgba(34, 197, 94, 0.15);
}
.stat-change.negative {
color: var(--danger);
background: rgba(239, 68, 68, 0.15);
}
/* ═══════════════════════════════════════════════════════════════════
🏷️ BADGES
═══════════════════════════════════════════════════════════════════ */
.badge {
display: inline-flex;
align-items: center;
gap: var(--space-1);
padding: var(--space-1) var(--space-3);
font-size: var(--fs-xs);
font-weight: var(--fw-semibold);
border-radius: var(--radius-full);
white-space: nowrap;
line-height: var(--lh-tight);
}
.badge-primary {
background: rgba(59, 130, 246, 0.20);
color: var(--brand-blue-light);
border: 1px solid rgba(59, 130, 246, 0.40);
}
.badge-success {
background: rgba(34, 197, 94, 0.20);
color: var(--success-light);
border: 1px solid rgba(34, 197, 94, 0.40);
}
.badge-warning {
background: rgba(245, 158, 11, 0.20);
color: var(--warning-light);
border: 1px solid rgba(245, 158, 11, 0.40);
}
.badge-danger {
background: rgba(239, 68, 68, 0.20);
color: var(--danger-light);
border: 1px solid rgba(239, 68, 68, 0.40);
}
.badge-purple {
background: rgba(139, 92, 246, 0.20);
color: var(--brand-purple-light);
border: 1px solid rgba(139, 92, 246, 0.40);
}
.badge-cyan {
background: rgba(6, 182, 212, 0.20);
color: var(--brand-cyan-light);
border: 1px solid rgba(6, 182, 212, 0.40);
}
/* ═══════════════════════════════════════════════════════════════════
⚠️ ALERTS
═══════════════════════════════════════════════════════════════════ */
.alert {
padding: var(--space-4) var(--space-5);
border-radius: var(--radius-md);
border-left: 4px solid;
backdrop-filter: var(--blur-md);
display: flex;
align-items: start;
gap: var(--space-3);
margin-bottom: var(--space-4);
}
.alert-info {
background: rgba(14, 165, 233, 0.15);
border-left-color: var(--info);
color: var(--info-light);
}
.alert-success {
background: rgba(34, 197, 94, 0.15);
border-left-color: var(--success);
color: var(--success-light);
}
.alert-warning {
background: rgba(245, 158, 11, 0.15);
border-left-color: var(--warning);
color: var(--warning-light);
}
.alert-error {
background: rgba(239, 68, 68, 0.15);
border-left-color: var(--danger);
color: var(--danger-light);
}
.alert-icon {
flex-shrink: 0;
width: 20px;
height: 20px;
}
.alert-content {
flex: 1;
}
.alert-title {
font-weight: var(--fw-semibold);
margin-bottom: var(--space-1);
}
.alert-description {
font-size: var(--fs-sm);
opacity: 0.9;
}
/* ═══════════════════════════════════════════════════════════════════
πŸ“‹ TABLES
═══════════════════════════════════════════════════════════════════ */
.table-container {
overflow-x: auto;
border-radius: var(--radius-lg);
background: var(--surface-glass);
border: 1px solid var(--border-light);
backdrop-filter: var(--blur-lg);
}
.table {
width: 100%;
border-collapse: collapse;
}
.table thead {
background: rgba(255, 255, 255, 0.14);
position: sticky;
top: 0;
z-index: var(--z-sticky);
}
.table th {
padding: var(--space-4) var(--space-5);
text-align: left;
font-size: var(--fs-xs);
font-weight: var(--fw-bold);
color: var(--text-soft);
text-transform: uppercase;
letter-spacing: var(--tracking-wider);
border-bottom: 2px solid var(--border-medium);
}
.table td {
padding: var(--space-4) var(--space-5);
border-bottom: 1px solid var(--border-subtle);
color: var(--text-normal);
}
.table tbody tr {
transition: all var(--transition-fast);
}
.table tbody tr:hover {
background: rgba(255, 255, 255, 0.10);
box-shadow: inset 0 0 0 1px var(--brand-cyan), inset 0 0 12px rgba(6, 182, 212, 0.25);
}
.table tbody tr:last-child td {
border-bottom: none;
}
/* ═══════════════════════════════════════════════════════════════════
πŸ”΄ STATUS DOTS
═══════════════════════════════════════════════════════════════════ */
.status-dot {
display: inline-block;
width: 10px;
height: 10px;
border-radius: 50%;
margin-right: var(--space-2);
}
.status-online {
background: var(--success);
box-shadow: 0 0 12px var(--success), 0 0 24px rgba(34, 197, 94, 0.40);
animation: pulse-green 2s infinite;
}
.status-offline {
background: var(--danger);
box-shadow: 0 0 12px var(--danger);
}
.status-degraded {
background: var(--warning);
box-shadow: 0 0 12px var(--warning);
animation: pulse-yellow 2s infinite;
}
@keyframes pulse-green {
0%, 100% {
box-shadow: 0 0 12px var(--success), 0 0 24px rgba(34, 197, 94, 0.40);
}
50% {
box-shadow: 0 0 16px var(--success), 0 0 32px rgba(34, 197, 94, 0.60);
}
}
@keyframes pulse-yellow {
0%, 100% {
box-shadow: 0 0 12px var(--warning), 0 0 24px rgba(245, 158, 11, 0.40);
}
50% {
box-shadow: 0 0 16px var(--warning), 0 0 32px rgba(245, 158, 11, 0.60);
}
}
/* ═══════════════════════════════════════════════════════════════════
⏳ LOADING STATES
═══════════════════════════════════════════════════════════════════ */
.loading {
display: flex;
align-items: center;
justify-content: center;
padding: var(--space-12);
}
.spinner {
width: 40px;
height: 40px;
border: 3px solid var(--border-light);
border-top-color: var(--brand-cyan);
border-radius: 50%;
animation: spin 0.8s linear infinite;
box-shadow: var(--glow-cyan);
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
.skeleton {
background: linear-gradient(
90deg,
rgba(255, 255, 255, 0.08) 0%,
rgba(255, 255, 255, 0.14) 50%,
rgba(255, 255, 255, 0.08) 100%
);
background-size: 200% 100%;
animation: skeleton-loading 1.5s ease-in-out infinite;
border-radius: var(--radius-md);
}
@keyframes skeleton-loading {
0% {
background-position: 200% 0;
}
100% {
background-position: -200% 0;
}
}
/* ═══════════════════════════════════════════════════════════════════
πŸ“ FORMS & INPUTS
═══════════════════════════════════════════════════════════════════ */
.form-group {
margin-bottom: var(--space-5);
}
.form-label {
display: block;
font-size: var(--fs-sm);
font-weight: var(--fw-semibold);
margin-bottom: var(--space-2);
color: var(--text-normal);
}
.form-input,
.form-select,
.form-textarea {
width: 100%;
padding: var(--space-3) var(--space-4);
font-family: var(--font-main);
font-size: var(--fs-base);
color: var(--text-strong);
background: var(--input-bg);
border: 1px solid var(--border-light);
border-radius: var(--radius-sm);
backdrop-filter: var(--blur-md);
transition: all var(--transition-fast);
}
.form-input:focus,
.form-select:focus,
.form-textarea:focus {
outline: none;
border-color: var(--brand-cyan);
box-shadow: 0 0 0 3px rgba(6, 182, 212, 0.30), var(--glow-cyan);
background: rgba(15, 23, 42, 0.80);
}
.form-input::placeholder {
color: var(--text-faint);
}
.form-input:disabled,
.form-select:disabled,
.form-textarea:disabled {
background: var(--surface-glass);
cursor: not-allowed;
opacity: 0.6;
}
.form-error {
color: var(--danger);
font-size: var(--fs-xs);
margin-top: var(--space-1);
display: flex;
align-items: center;
gap: var(--space-1);
}
.form-help {
color: var(--text-muted);
font-size: var(--fs-xs);
margin-top: var(--space-1);
}
/* ═══════════════════════════════════════════════════════════════════
πŸ”˜ TOGGLE SWITCH
═══════════════════════════════════════════════════════════════════ */
.toggle-switch {
position: relative;
display: inline-block;
width: 52px;
height: 28px;
}
.toggle-switch input {
opacity: 0;
width: 0;
height: 0;
}
.toggle-slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--surface-glass);
border: 1px solid var(--border-light);
transition: var(--transition-normal);
border-radius: var(--radius-full);
}
.toggle-slider:before {
position: absolute;
content: "";
height: 20px;
width: 20px;
left: 4px;
bottom: 3px;
background: var(--text-strong);
transition: var(--transition-normal);
border-radius: 50%;
box-shadow: var(--shadow-sm);
}
.toggle-switch input:checked + .toggle-slider {
background: var(--gradient-primary);
box-shadow: var(--glow-blue);
border-color: transparent;
}
.toggle-switch input:checked + .toggle-slider:before {
transform: translateX(24px);
}
.toggle-switch input:focus-visible + .toggle-slider {
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.30);
}
/* ═══════════════════════════════════════════════════════════════════
πŸ”³ MODAL
═══════════════════════════════════════════════════════════════════ */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--modal-backdrop);
backdrop-filter: var(--blur-xl);
display: flex;
align-items: center;
justify-content: center;
z-index: var(--z-modal);
padding: var(--space-6);
animation: modal-fade-in 0.2s ease-out;
}
@keyframes modal-fade-in {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.modal {
background: var(--surface-glass-stronger);
border: 1px solid var(--border-medium);
border-radius: var(--radius-xl);
box-shadow: var(--shadow-2xl);
backdrop-filter: var(--blur-lg);
max-width: 600px;
width: 100%;
max-height: 90vh;
overflow-y: auto;
animation: modal-scale-in 0.25s var(--ease-spring);
}
@keyframes modal-scale-in {
from {
transform: scale(0.95);
opacity: 0;
}
to {
transform: scale(1);
opacity: 1;
}
}
.modal-header {
padding: var(--space-6) var(--space-7);
border-bottom: 1px solid var(--border-subtle);
display: flex;
align-items: center;
justify-content: space-between;
}
.modal-title {
font-size: var(--fs-xl);
font-weight: var(--fw-bold);
color: var(--text-strong);
margin: 0;
}
.modal-close {
width: 36px;
height: 36px;
border-radius: var(--radius-sm);
display: flex;
align-items: center;
justify-content: center;
color: var(--text-soft);
background: transparent;
border: none;
cursor: pointer;
transition: var(--transition-fast);
}
.modal-close:hover {
background: var(--surface-glass);
color: var(--text-strong);
}
.modal-body {
padding: var(--space-7);
color: var(--text-normal);
}
.modal-footer {
padding: var(--space-6) var(--space-7);
border-top: 1px solid var(--border-subtle);
display: flex;
align-items: center;
justify-content: flex-end;
gap: var(--space-3);
}
/* ═══════════════════════════════════════════════════════════════════
πŸ“ˆ CHARTS & VISUALIZATION
═══════════════════════════════════════════════════════════════════ */
.chart-container {
position: relative;
width: 100%;
max-width: 100%;
padding: var(--space-4);
background: var(--surface-glass);
border: 1px solid var(--border-light);
border-radius: var(--radius-md);
backdrop-filter: var(--blur-md);
}
.chart-container canvas {
width: 100% !important;
height: auto !important;
max-height: 400px;
}
/* ═══════════════════════════════════════════════════════════════════
πŸ“ GRID LAYOUTS
═══════════════════════════════════════════════════════════════════ */
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: var(--space-5);
margin-bottom: var(--space-8);
}
.cards-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
gap: var(--space-6);
}
/* ═══════════════════════════════════════════════════════════════════
🎯 EMPTY STATE
═══════════════════════════════════════════════════════════════════ */
.empty-state {
text-align: center;
padding: var(--space-12);
color: var(--text-muted);
}
.empty-state-icon {
font-size: 64px;
margin-bottom: var(--space-4);
opacity: 0.4;
}
.empty-state-title {
font-size: var(--fs-lg);
font-weight: var(--fw-semibold);
margin-bottom: var(--space-2);
color: var(--text-normal);
}
.empty-state-description {
font-size: var(--fs-sm);
margin-bottom: var(--space-6);
max-width: 400px;
margin-left: auto;
margin-right: auto;
}
/* ═══════════════════════════════════════════════════════════════════
πŸ—οΈ END OF COMPONENTS
═══════════════════════════════════════════════════════════════════ */