:root { --bg-primary: #0a0e17; --bg-secondary: #111928; --bg-card: rgba(18, 26, 43, 0.75); --bg-glass: rgba(25, 35, 58, 0.45); --border-glow: rgba(0, 242, 254, 0.25); --border-subtle: rgba(255, 255, 255, 0.08); --accent-cyan: #00f2fe; --accent-blue: #4facfe; --accent-purple: #9d4edd; --accent-pink: #f72585; --accent-green: #10b981; --accent-yellow: #f59e0b; --accent-red: #ef4444; --text-main: #f8fafc; --text-muted: #94a3b8; --text-dim: #64748b; --font-sans: 'Outfit', 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; --font-mono: 'JetBrains Mono', 'Fira Code', monospace; --radius-sm: 8px; --radius-md: 14px; --radius-lg: 20px; --radius-full: 9999px; --shadow-sm: 0 4px 12px rgba(0, 0, 0, 0.25); --shadow-glow: 0 0 25px rgba(0, 242, 254, 0.2); --shadow-glow-purple: 0 0 25px rgba(157, 78, 221, 0.25); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: var(--font-sans); background-color: var(--bg-primary); color: var(--text-main); min-height: 100vh; overflow-x: hidden; line-height: 1.5; background-image: radial-gradient(circle at 15% 15%, rgba(79, 172, 254, 0.08) 0%, transparent 40%), radial-gradient(circle at 85% 85%, rgba(157, 78, 221, 0.08) 0%, transparent 40%), radial-gradient(circle at 50% 50%, rgba(0, 242, 254, 0.03) 0%, transparent 60%); } /* Custom Scrollbar */ ::-webkit-scrollbar { width: 6px; height: 6px; } ::-webkit-scrollbar-track { background: var(--bg-primary); } ::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.15); border-radius: var(--radius-full); } ::-webkit-scrollbar-thumb:hover { background: var(--accent-cyan); } /* Header */ .app-header { height: 68px; padding: 0 2rem; display: flex; align-items: center; justify-content: space-between; background: rgba(10, 14, 23, 0.85); backdrop-filter: blur(16px); border-bottom: 1px solid var(--border-subtle); position: sticky; top: 0; z-index: 100; } .logo-group { display: flex; align-items: center; gap: 12px; } .logo-badge { width: 38px; height: 38px; border-radius: 10px; background: linear-gradient(135deg, var(--accent-cyan), var(--accent-purple)); display: flex; align-items: center; justify-content: center; box-shadow: var(--shadow-glow); } .logo-badge svg { width: 22px; height: 22px; color: #fff; } .brand-title { font-size: 1.25rem; font-weight: 700; letter-spacing: -0.5px; background: linear-gradient(90deg, #fff, var(--accent-cyan)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; } .env-tag { font-family: var(--font-mono); font-size: 0.75rem; padding: 3px 8px; background: rgba(0, 242, 254, 0.12); color: var(--accent-cyan); border: 1px solid rgba(0, 242, 254, 0.3); border-radius: var(--radius-sm); margin-left: 8px; } .header-actions { display: flex; align-items: center; gap: 12px; } /* Buttons */ .btn { display: inline-flex; align-items: center; gap: 8px; padding: 8px 16px; border-radius: var(--radius-sm); font-family: var(--font-sans); font-size: 0.875rem; font-weight: 600; cursor: pointer; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); border: none; text-decoration: none; } .btn-primary { background: linear-gradient(135deg, var(--accent-blue), var(--accent-purple)); color: white; box-shadow: var(--shadow-glow-purple); } .btn-primary:hover { transform: translateY(-1px); box-shadow: 0 0 30px rgba(157, 78, 221, 0.45); } .btn-cyan { background: linear-gradient(135deg, #00f2fe, #4facfe); color: #051329; font-weight: 700; box-shadow: var(--shadow-glow); } .btn-cyan:hover { transform: translateY(-1px); filter: brightness(1.1); } .btn-outline { background: rgba(255, 255, 255, 0.05); border: 1px solid var(--border-subtle); color: var(--text-main); } .btn-outline:hover { background: rgba(255, 255, 255, 0.1); border-color: rgba(255, 255, 255, 0.2); } .btn-outline.active { background: rgba(0, 242, 254, 0.15); border-color: var(--accent-cyan); color: var(--accent-cyan); } /* Main Layout Grid */ .main-container { max-width: 1720px; margin: 0 auto; padding: 1.5rem; display: grid; grid-template-columns: 1.25fr 0.75fr; gap: 1.5rem; } @media (max-width: 1200px) { .main-container { grid-template-columns: 1fr; } } /* Glass Card */ .glass-card { background: var(--bg-card); backdrop-filter: blur(20px); border: 1px solid var(--border-subtle); border-radius: var(--radius-lg); padding: 1.25rem; box-shadow: var(--shadow-sm); position: relative; overflow: hidden; } .glass-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 1px; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.15), transparent); } .card-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-subtle); } .card-title { font-size: 1.05rem; font-weight: 700; display: flex; align-items: center; gap: 8px; } .card-title svg { color: var(--accent-cyan); } /* Simulation Section */ .sim-viewport-wrapper { position: relative; width: 100%; height: 520px; border-radius: var(--radius-md); overflow: hidden; background: #050811; border: 1px solid rgba(0, 242, 254, 0.15); } #sim-canvas { width: 100%; height: 100%; display: block; } .sim-hud-overlay { position: absolute; top: 14px; left: 14px; display: flex; flex-direction: column; gap: 8px; pointer-events: none; } .hud-badge { background: rgba(10, 14, 23, 0.85); backdrop-filter: blur(10px); padding: 6px 12px; border-radius: var(--radius-sm); border: 1px solid rgba(255, 255, 255, 0.1); font-family: var(--font-mono); font-size: 0.8rem; color: var(--text-main); display: flex; align-items: center; gap: 8px; } .status-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--accent-green); box-shadow: 0 0 8px var(--accent-green); } .status-dot.learning { background: var(--accent-yellow); box-shadow: 0 0 8px var(--accent-yellow); animation: pulse 1.5s infinite; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } } .sim-controls-floating { position: absolute; bottom: 14px; left: 50%; transform: translateX(-50%); display: flex; align-items: center; gap: 8px; background: rgba(15, 23, 42, 0.85); backdrop-filter: blur(12px); padding: 6px 10px; border-radius: var(--radius-full); border: 1px solid rgba(255, 255, 255, 0.15); } .camera-presets { position: absolute; top: 14px; right: 14px; display: flex; gap: 6px; } .btn-icon { width: 34px; height: 34px; padding: 0; border-radius: var(--radius-sm); display: flex; align-items: center; justify-content: center; background: rgba(15, 23, 42, 0.8); border: 1px solid rgba(255, 255, 255, 0.1); color: var(--text-muted); cursor: pointer; transition: all 0.2s; } .btn-icon:hover, .btn-icon.active { color: var(--accent-cyan); border-color: var(--accent-cyan); background: rgba(0, 242, 254, 0.1); } /* Checkpoint Timeline Bar */ .checkpoint-nav { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-top: 1rem; } .checkpoint-btn { background: rgba(255, 255, 255, 0.03); border: 1px solid var(--border-subtle); border-radius: var(--radius-md); padding: 10px; text-align: left; cursor: pointer; transition: all 0.2s ease; position: relative; overflow: hidden; } .checkpoint-btn:hover { background: rgba(255, 255, 255, 0.06); border-color: rgba(255, 255, 255, 0.2); } .checkpoint-btn.active { background: rgba(0, 242, 254, 0.08); border-color: var(--accent-cyan); box-shadow: 0 0 20px rgba(0, 242, 254, 0.15); } .checkpoint-btn.active::after { content: ''; position: absolute; top: 0; left: 0; bottom: 0; width: 4px; background: var(--accent-cyan); } .cp-step { font-family: var(--font-mono); font-size: 0.75rem; color: var(--accent-cyan); font-weight: 600; text-transform: uppercase; } .cp-label { font-size: 0.95rem; font-weight: 700; margin: 2px 0; color: var(--text-main); } .cp-desc { font-size: 0.75rem; color: var(--text-muted); } /* Right Column: Analytics & Control Tabs */ .right-column { display: flex; flex-direction: column; gap: 1.5rem; } .tab-nav { display: flex; gap: 8px; border-bottom: 1px solid var(--border-subtle); padding-bottom: 8px; margin-bottom: 12px; } .tab-btn { padding: 6px 14px; border-radius: var(--radius-sm); background: transparent; border: none; color: var(--text-muted); font-weight: 600; font-size: 0.85rem; cursor: pointer; transition: all 0.2s; } .tab-btn.active { background: rgba(255, 255, 255, 0.1); color: var(--text-main); } .tab-btn:hover:not(.active) { color: var(--text-main); } /* Metric Cards */ .metrics-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-bottom: 1rem; } .metric-box { background: rgba(255, 255, 255, 0.03); border: 1px solid var(--border-subtle); border-radius: var(--radius-md); padding: 10px 12px; } .metric-title { font-size: 0.75rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.5px; } .metric-value { font-family: var(--font-mono); font-size: 1.25rem; font-weight: 700; color: var(--accent-cyan); margin-top: 4px; } .metric-delta { font-size: 0.75rem; color: var(--accent-green); display: flex; align-items: center; gap: 2px; } /* Charts */ .chart-container { position: relative; height: 220px; width: 100%; } /* Hyperparameters Control */ .control-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; } .control-item { display: flex; flex-direction: column; gap: 6px; } .control-label { font-size: 0.8rem; font-weight: 600; color: var(--text-muted); display: flex; justify-content: space-between; } .control-label span.val { font-family: var(--font-mono); color: var(--accent-cyan); } input[type="range"] { width: 100%; accent-color: var(--accent-cyan); background: rgba(255, 255, 255, 0.1); height: 5px; border-radius: 5px; outline: none; cursor: pointer; } /* Comparison Grid Modal / View */ .comparison-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; } .compare-card { background: rgba(10, 14, 23, 0.6); border: 1px solid var(--border-subtle); border-radius: var(--radius-md); padding: 10px; } .compare-canvas-box { height: 140px; width: 100%; background: #02050c; border-radius: var(--radius-sm); position: relative; overflow: hidden; } /* Modal */ .modal-backdrop { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.75); backdrop-filter: blur(10px); display: none; align-items: center; justify-content: center; z-index: 999; } .modal-backdrop.open { display: flex; } .modal-content { background: var(--bg-secondary); border: 1px solid var(--border-glow); border-radius: var(--radius-lg); width: 90%; max-width: 900px; padding: 1.5rem; box-shadow: 0 0 50px rgba(0, 242, 254, 0.2); } .code-block { font-family: var(--font-mono); background: #060911; padding: 1rem; border-radius: var(--radius-sm); border: 1px solid var(--border-subtle); font-size: 0.85rem; color: #a5b4fc; max-height: 380px; overflow-y: auto; white-space: pre; } /* Toast Notifications */ .toast-container { position: fixed; bottom: 24px; right: 24px; display: flex; flex-direction: column; gap: 10px; z-index: 1000; } .toast { background: rgba(17, 25, 40, 0.95); border: 1px solid var(--accent-cyan); box-shadow: var(--shadow-glow); color: #fff; padding: 12px 18px; border-radius: var(--radius-md); font-size: 0.875rem; display: flex; align-items: center; gap: 10px; animation: slideIn 0.3s cubic-bezier(0.16, 1, 0.3, 1); } @keyframes slideIn { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } }