| @import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&display=swap'); |
|
|
| :root { |
| --bg-gradient: radial-gradient(circle at top, #172032, #05060a 60%); |
| --glass-bg: rgba(17, 25, 40, 0.65); |
| --glass-border: rgba(255, 255, 255, 0.08); |
| --glass-highlight: rgba(255, 255, 255, 0.15); |
| --primary: #8f88ff; |
| --primary-strong: #6c63ff; |
| --secondary: #16d9fa; |
| --accent: #f472b6; |
| --success: #22c55e; |
| --warning: #facc15; |
| --danger: #ef4444; |
| --info: #38bdf8; |
| --text-primary: #f8fafc; |
| --text-muted: rgba(248, 250, 252, 0.7); |
| --shadow-strong: 0 25px 60px rgba(0, 0, 0, 0.45); |
| --shadow-soft: 0 15px 40px rgba(0, 0, 0, 0.35); |
| --sidebar-width: 260px; |
| } |
|
|
| * { |
| box-sizing: border-box; |
| } |
|
|
| html, body { |
| margin: 0; |
| padding: 0; |
| min-height: 100vh; |
| font-family: 'Space Grotesk', 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; |
| background: var(--bg-gradient); |
| color: var(--text-primary); |
| } |
|
|
| body[data-theme='light'] { |
| --bg-gradient: radial-gradient(circle at top, #f3f6ff, #dfe5ff); |
| --glass-bg: rgba(255, 255, 255, 0.75); |
| --glass-border: rgba(15, 23, 42, 0.1); |
| --glass-highlight: rgba(15, 23, 42, 0.05); |
| --text-primary: #0f172a; |
| --text-muted: rgba(15, 23, 42, 0.6); |
| } |
|
|
| .app-shell { |
| display: flex; |
| min-height: 100vh; |
| } |
|
|
| .sidebar { |
| width: var(--sidebar-width); |
| padding: 32px 24px; |
| background: linear-gradient(180deg, rgba(9, 9, 13, 0.8), rgba(9, 9, 13, 0.4)); |
| backdrop-filter: blur(30px); |
| border-right: 1px solid var(--glass-border); |
| display: flex; |
| flex-direction: column; |
| gap: 24px; |
| position: sticky; |
| top: 0; |
| height: 100vh; |
| } |
|
|
| .brand { |
| display: flex; |
| flex-direction: column; |
| gap: 6px; |
| } |
|
|
| .brand strong { |
| font-size: 1.3rem; |
| letter-spacing: 0.1em; |
| } |
|
|
| .env-pill { |
| display: inline-flex; |
| align-items: center; |
| gap: 6px; |
| background: rgba(255, 255, 255, 0.08); |
| padding: 4px 10px; |
| border-radius: 999px; |
| font-size: 0.75rem; |
| text-transform: uppercase; |
| letter-spacing: 0.05em; |
| } |
|
|
| .nav { |
| display: flex; |
| flex-direction: column; |
| gap: 10px; |
| } |
|
|
| .nav-button { |
| border: none; |
| border-radius: 14px; |
| padding: 12px 16px; |
| display: flex; |
| align-items: center; |
| gap: 12px; |
| background: transparent; |
| color: inherit; |
| font-weight: 500; |
| cursor: pointer; |
| transition: transform 0.3s ease, background 0.3s ease; |
| } |
|
|
| .nav-button svg { |
| width: 22px; |
| height: 22px; |
| fill: currentColor; |
| } |
|
|
| .nav-button.active, |
| .nav-button:hover { |
| background: rgba(255, 255, 255, 0.08); |
| transform: translateX(6px); |
| } |
|
|
| .sidebar-footer { |
| margin-top: auto; |
| font-size: 0.85rem; |
| color: var(--text-muted); |
| } |
|
|
| .main-area { |
| flex: 1; |
| padding: 32px; |
| display: flex; |
| flex-direction: column; |
| gap: 24px; |
| } |
|
|
| .topbar { |
| display: flex; |
| justify-content: space-between; |
| align-items: center; |
| padding: 18px 24px; |
| border-radius: 24px; |
| background: var(--glass-bg); |
| border: 1px solid var(--glass-border); |
| box-shadow: var(--shadow-soft); |
| backdrop-filter: blur(20px); |
| flex-wrap: wrap; |
| gap: 16px; |
| } |
|
|
| .topbar h1 { |
| margin: 0; |
| font-size: 1.8rem; |
| } |
|
|
| .status-group { |
| display: flex; |
| gap: 12px; |
| flex-wrap: wrap; |
| } |
|
|
| .status-pill { |
| display: flex; |
| align-items: center; |
| gap: 8px; |
| padding: 8px 14px; |
| border-radius: 999px; |
| background: rgba(255, 255, 255, 0.05); |
| border: 1px solid var(--glass-border); |
| font-size: 0.85rem; |
| text-transform: uppercase; |
| letter-spacing: 0.05em; |
| } |
|
|
| .status-dot { |
| width: 10px; |
| height: 10px; |
| border-radius: 50%; |
| background: var(--warning); |
| } |
|
|
| .status-pill[data-state='ok'] .status-dot { |
| background: var(--success); |
| } |
|
|
| .status-pill[data-state='warn'] .status-dot { |
| background: var(--warning); |
| } |
|
|
| .status-pill[data-state='error'] .status-dot { |
| background: var(--danger); |
| } |
|
|
| .page-container { |
| flex: 1; |
| } |
|
|
| .page { |
| display: none; |
| animation: fadeIn 0.6s ease; |
| } |
|
|
| .page.active { |
| display: block; |
| } |
|
|
| .section-header { |
| display: flex; |
| justify-content: space-between; |
| align-items: center; |
| margin-bottom: 16px; |
| } |
|
|
| .section-title { |
| font-size: 1.3rem; |
| letter-spacing: 0.05em; |
| } |
|
|
| .glass-card { |
| background: var(--glass-bg); |
| border: 1px solid var(--glass-border); |
| border-radius: 24px; |
| padding: 20px; |
| box-shadow: var(--shadow-strong); |
| position: relative; |
| overflow: hidden; |
| } |
|
|
| .glass-card::before { |
| content: ''; |
| position: absolute; |
| inset: 0; |
| background: linear-gradient(120deg, transparent, var(--glass-highlight), transparent); |
| opacity: 0; |
| transition: opacity 0.4s ease; |
| } |
|
|
| .glass-card:hover::before { |
| opacity: 1; |
| } |
|
|
| .stats-grid { |
| display: grid; |
| grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); |
| gap: 18px; |
| margin-bottom: 24px; |
| } |
|
|
| .stat-card h3 { |
| font-size: 0.9rem; |
| text-transform: uppercase; |
| letter-spacing: 0.08em; |
| color: var(--text-muted); |
| } |
|
|
| .stat-value { |
| font-size: 1.9rem; |
| font-weight: 600; |
| margin: 12px 0 6px; |
| } |
|
|
| .stat-trend { |
| display: flex; |
| align-items: center; |
| gap: 6px; |
| font-size: 0.85rem; |
| } |
|
|
| .grid-two { |
| display: grid; |
| grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); |
| gap: 20px; |
| } |
|
|
| .table-wrapper { |
| overflow: auto; |
| } |
|
|
| table { |
| width: 100%; |
| border-collapse: collapse; |
| } |
|
|
| th, td { |
| text-align: left; |
| padding: 12px 10px; |
| font-size: 0.92rem; |
| } |
|
|
| th { |
| font-size: 0.8rem; |
| letter-spacing: 0.05em; |
| color: var(--text-muted); |
| text-transform: uppercase; |
| } |
|
|
| tr { |
| transition: background 0.3s ease, transform 0.3s ease; |
| } |
|
|
| tbody tr:hover { |
| background: rgba(255, 255, 255, 0.04); |
| transform: translateY(-1px); |
| } |
|
|
| .badge { |
| padding: 4px 10px; |
| border-radius: 999px; |
| font-size: 0.75rem; |
| letter-spacing: 0.05em; |
| text-transform: uppercase; |
| } |
|
|
| .badge-success { background: rgba(34, 197, 94, 0.15); color: var(--success); } |
| .badge-danger { background: rgba(239, 68, 68, 0.15); color: var(--danger); } |
| .badge-neutral { background: rgba(148, 163, 184, 0.15); color: var(--text-muted); } |
| .text-muted { color: var(--text-muted); } |
| .text-success { color: var(--success); } |
| .text-danger { color: var(--danger); } |
|
|
| .ai-result { |
| margin-top: 20px; |
| padding: 20px; |
| border-radius: 20px; |
| border: 1px solid var(--glass-border); |
| background: rgba(0, 0, 0, 0.2); |
| } |
|
|
| .action-badge { |
| display: inline-flex; |
| padding: 6px 14px; |
| border-radius: 999px; |
| letter-spacing: 0.08em; |
| font-weight: 600; |
| margin-bottom: 10px; |
| } |
|
|
| .action-buy { background: rgba(34, 197, 94, 0.18); color: var(--success); } |
| .action-sell { background: rgba(239, 68, 68, 0.18); color: var(--danger); } |
| .action-hold { background: rgba(56, 189, 248, 0.18); color: var(--info); } |
|
|
| .ai-insights ul { |
| padding-left: 20px; |
| } |
|
|
| .chip-row { |
| display: flex; |
| gap: 8px; |
| flex-wrap: wrap; |
| margin: 12px 0; |
| } |
|
|
| .news-item { |
| padding: 12px 0; |
| border-bottom: 1px solid var(--glass-border); |
| } |
|
|
| .ai-block { |
| padding: 14px; |
| border-radius: 12px; |
| border: 1px dashed var(--glass-border); |
| margin-top: 12px; |
| } |
|
|
| .controls-bar { |
| display: flex; |
| flex-wrap: wrap; |
| gap: 12px; |
| margin-bottom: 16px; |
| } |
|
|
| .input-chip { |
| border: 1px solid var(--glass-border); |
| background: rgba(255, 255, 255, 0.03); |
| border-radius: 999px; |
| padding: 8px 14px; |
| color: var(--text-muted); |
| display: inline-flex; |
| align-items: center; |
| gap: 10px; |
| } |
|
|
| input[type='text'], select, textarea { |
| width: 100%; |
| background: rgba(255, 255, 255, 0.02); |
| border: 1px solid var(--glass-border); |
| border-radius: 14px; |
| padding: 12px 14px; |
| color: var(--text-primary); |
| font-family: inherit; |
| } |
|
|
| textarea { |
| min-height: 100px; |
| } |
|
|
| button.primary { |
| background: linear-gradient(120deg, var(--primary), var(--secondary)); |
| border: none; |
| border-radius: 999px; |
| color: #fff; |
| padding: 12px 24px; |
| font-weight: 600; |
| cursor: pointer; |
| transition: transform 0.3s ease; |
| } |
|
|
| button.primary:hover { |
| transform: translateY(-2px) scale(1.01); |
| } |
|
|
| button.ghost { |
| background: transparent; |
| border: 1px solid var(--glass-border); |
| border-radius: 999px; |
| padding: 10px 20px; |
| color: inherit; |
| cursor: pointer; |
| } |
|
|
| .skeleton { |
| position: relative; |
| overflow: hidden; |
| background: rgba(255, 255, 255, 0.05); |
| border-radius: 12px; |
| } |
|
|
| .skeleton-block { |
| display: inline-block; |
| width: 100%; |
| height: 12px; |
| border-radius: 999px; |
| background: rgba(255, 255, 255, 0.08); |
| } |
|
|
| .skeleton::after { |
| content: ''; |
| position: absolute; |
| inset: 0; |
| transform: translateX(-100%); |
| background: linear-gradient(120deg, transparent, rgba(255, 255, 255, 0.25), transparent); |
| animation: shimmer 1.5s infinite; |
| } |
|
|
| .drawer { |
| position: fixed; |
| top: 0; |
| right: 0; |
| height: 100vh; |
| width: min(420px, 90vw); |
| background: rgba(5, 7, 12, 0.92); |
| border-left: 1px solid var(--glass-border); |
| transform: translateX(100%); |
| transition: transform 0.4s ease; |
| padding: 32px; |
| overflow-y: auto; |
| z-index: 40; |
| } |
|
|
| .drawer.active { |
| transform: translateX(0); |
| } |
|
|
| .modal-backdrop { |
| position: fixed; |
| inset: 0; |
| background: rgba(2, 6, 23, 0.7); |
| display: none; |
| align-items: center; |
| justify-content: center; |
| z-index: 50; |
| } |
|
|
| .modal-backdrop.active { |
| display: flex; |
| } |
|
|
| .modal { |
| width: min(640px, 90vw); |
| background: var(--glass-bg); |
| border-radius: 28px; |
| padding: 28px; |
| border: 1px solid var(--glass-border); |
| backdrop-filter: blur(20px); |
| } |
|
|
| .inline-message { |
| border-radius: 16px; |
| padding: 16px 18px; |
| border: 1px solid var(--glass-border); |
| } |
|
|
| .inline-error { border-color: rgba(239, 68, 68, 0.4); background: rgba(239, 68, 68, 0.08); } |
| .inline-warn { border-color: rgba(250, 204, 21, 0.4); background: rgba(250, 204, 21, 0.1); } |
| .inline-info { border-color: rgba(56, 189, 248, 0.4); background: rgba(56, 189, 248, 0.1); } |
|
|
| .log-table { |
| font-family: 'JetBrains Mono', 'Space Grotesk', monospace; |
| font-size: 0.8rem; |
| } |
|
|
| .chip { |
| padding: 4px 12px; |
| border-radius: 999px; |
| background: rgba(255, 255, 255, 0.08); |
| font-size: 0.75rem; |
| } |
|
|
| .toggle { |
| position: relative; |
| width: 44px; |
| height: 24px; |
| border-radius: 999px; |
| background: rgba(255, 255, 255, 0.2); |
| cursor: pointer; |
| } |
|
|
| .toggle input { |
| position: absolute; |
| opacity: 0; |
| } |
|
|
| .toggle span { |
| position: absolute; |
| top: 3px; |
| left: 4px; |
| width: 18px; |
| height: 18px; |
| border-radius: 50%; |
| background: #fff; |
| transition: transform 0.3s ease; |
| } |
|
|
| .toggle input:checked + span { |
| transform: translateX(18px); |
| background: var(--secondary); |
| } |
|
|
| .flash { |
| animation: flash 0.6s ease; |
| } |
|
|
| @keyframes flash { |
| 0% { background: rgba(34, 197, 94, 0.2); } |
| 100% { background: transparent; } |
| } |
|
|
| @keyframes fadeIn { |
| from { opacity: 0; transform: translateY(8px); } |
| to { opacity: 1; transform: translateY(0); } |
| } |
|
|
| @keyframes shimmer { |
| 100% { transform: translateX(100%); } |
| } |
|
|
| @media (max-width: 1024px) { |
| .app-shell { |
| flex-direction: column; |
| } |
|
|
| .sidebar { |
| width: 100%; |
| position: relative; |
| height: auto; |
| flex-direction: row; |
| flex-wrap: wrap; |
| } |
|
|
| .nav { |
| flex-direction: row; |
| flex-wrap: wrap; |
| } |
| } |
|
|
| body[data-layout='compact'] .glass-card { |
| padding: 14px; |
| } |
|
|
| body[data-layout='compact'] th, |
| body[data-layout='compact'] td { |
| padding: 8px; |
| } |
|
|