/* ═══════════════════════════════════════════════════════════════ NERV UI v2.1 — Dense Operations Console Every pixel conveys information. No decorative waste. ═══════════════════════════════════════════════════════════════ */ :root { --void: #000000; --void-warm: #080807; --void-panel: #0C0C0A; --void-raised: #111110; --nerv-orange: #FF9830; --nerv-orange-dim: #C87020; --nerv-orange-hot: #FFCC50; --nerv-orange-fill: rgba(255, 152, 48, 0.08); --data-green: #50FF50; --data-green-dim: #30BB30; --data-green-faint: rgba(80, 255, 80, 0.06); --data-green-fill: rgba(80, 255, 80, 0.1); --wire-cyan: #20F0FF; --wire-cyan-dim: #10A0B0; --wire-cyan-glow: rgba(32, 240, 255, 0.12); --alert-red: #FF3030; --alert-red-dim: #CC2020; --alert-red-hot: #FF5050; --alert-red-fill: rgba(255, 48, 48, 0.15); --thermal-yellow: #FFE820; --thermal-magenta: #F030C0; --thermal-blue: #3060F0; --steel: #D8D8D0; --steel-dim: #888880; --steel-faint: rgba(200, 200, 192, 0.06); --steel-line: rgba(200, 200, 192, 0.12); --font-mincho: 'Shippori Mincho B1', 'YuMincho', 'Hiragino Mincho ProN', serif; --font-title: 'Noto Serif Display', 'Times New Roman', serif; --font-sys: 'JetBrains Mono', 'Cascadia Mono', 'Consolas', monospace; --font-stamp: 'Saira Extra Condensed', 'Impact', sans-serif; --scan-opacity: 0.04; } *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { background: var(--void); color: var(--data-green); } body { font-family: var(--font-sys); font-size: 12px; line-height: 1.4; background: var(--void); overflow-x: hidden; -webkit-font-smoothing: antialiased; } /* ── CRT EFFECTS ───────────────────────────────────────────── */ body::after { content: ''; position: fixed; inset: 0; background: repeating-linear-gradient(0deg, transparent, transparent 2px, rgba(0,0,0,var(--scan-opacity)) 2px, rgba(0,0,0,var(--scan-opacity)) 4px); pointer-events: none; z-index: 10000; } body::before { content: ''; position: fixed; inset: 0; background: radial-gradient(ellipse 70% 70% at center, transparent 50%, rgba(0,0,0,0.4) 100%); pointer-events: none; z-index: 9999; } @keyframes phosphor-flicker { 0%, 100% { opacity: 1; } 92% { opacity: 1; } 93% { opacity: 0.96; } 94% { opacity: 1; } } body { animation: phosphor-flicker 4s ease-in-out infinite; } .scan-line-overlay { position: fixed; top: 0; left: 0; right: 0; height: 2px; background: linear-gradient(90deg, transparent 0%, rgba(80,255,80,0.15) 20%, rgba(80,255,80,0.3) 50%, rgba(80,255,80,0.15) 80%, transparent 100%); pointer-events: none; z-index: 9997; animation: scan-line 4s linear infinite; opacity: 0.5; } @keyframes scan-line { 0% { transform: translateY(-100%); } 100% { transform: translateY(100vh); } } [data-mode="emergency"] .scan-line-overlay { background: linear-gradient(90deg, transparent 0%, rgba(255,48,48,0.2) 20%, rgba(255,48,48,0.5) 50%, rgba(255,48,48,0.2) 80%, transparent 100%); animation-duration: 2s; opacity: 0.8; } /* ── GLOW EFFECTS ──────────────────────────────────────────── */ .glow-green { text-shadow: 0 0 8px rgba(80,255,80,0.5), 0 0 16px rgba(80,255,80,0.2); } .glow-orange { text-shadow: 0 0 8px rgba(255,152,48,0.5), 0 0 16px rgba(255,152,48,0.2); } .glow-cyan { text-shadow: 0 0 8px rgba(32,240,255,0.5), 0 0 16px rgba(32,240,255,0.2); } .glow-red { text-shadow: 0 0 8px rgba(255,48,48,0.5), 0 0 16px rgba(255,48,48,0.3); } /* ── GLITCH/EMERGENCY ──────────────────────────────────────── */ @keyframes glitch-jitter { 0%, 100% { transform: translate(0,0); } 10% { transform: translate(-1px,0); } 30% { transform: translate(0,1px); } 50% { transform: translate(-1px,1px); } 70% { transform: translate(0,-1px); } 90% { transform: translate(1px,1px); } } [data-mode="emergency"] .glitch-target { animation: glitch-jitter 0.3s steps(10) infinite; } @media (prefers-reduced-motion: reduce) { body, [data-mode="emergency"] * { animation: none !important; } } /* ── NAVIGATION ────────────────────────────────────────────── */ .nerv-nav { display: flex; align-items: center; padding: 10px 16px; background: var(--void); border-bottom: 1px solid var(--nerv-orange-dim); gap: 20px; z-index: 100; } .nerv-nav .org-mark { font-family: var(--font-title); font-size: 24px; font-weight: 900; letter-spacing: 0.25em; color: var(--nerv-orange); text-transform: uppercase; transform: scaleX(0.82); transform-origin: left center; line-height: 1.15; } .nerv-nav .org-mark .sub { font-family: var(--font-sys); font-size: 9px; letter-spacing: 0.12em; color: var(--steel-dim); display: block; transform: scaleX(1.22); font-weight: 400; } .nerv-nav .jp-sub { font-family: var(--font-mincho); font-size: 15px; font-weight: 800; color: var(--nerv-orange-dim); transform: scaleX(0.8); transform-origin: left; } .nerv-nav .nav-links { display: flex; gap: 14px; margin-left: auto; } .nerv-nav a, .nerv-nav button { font-family: var(--font-sys); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--steel-dim); text-decoration: none; background: none; border: none; cursor: pointer; padding: 4px 8px; transition: color 0.15s; } .nerv-nav a:hover, .nerv-nav a.active, .nerv-nav button:hover { color: var(--nerv-orange); } .emergency-toggle { position: relative; } .emergency-toggle::before { content: '⚠'; margin-right: 4px; } [data-mode="emergency"] .emergency-toggle { background: var(--alert-red) !important; color: var(--void) !important; border-color: var(--alert-red) !important; } /* ── TICKER ────────────────────────────────────────────────── */ .ticker { overflow: hidden; white-space: nowrap; background: var(--void); border-bottom: 1px solid var(--steel-faint); padding: 2px 0; font-family: var(--font-sys); font-size: 9px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--nerv-orange); } .ticker .scroll { display: inline-block; animation: ticker-scroll 60s linear infinite; padding-left: 100%; } @keyframes ticker-scroll { from { transform: translateX(0); } to { transform: translateX(-100%); } } [data-mode="emergency"] .ticker { background: var(--alert-red); color: var(--void); border-color: var(--alert-red); } /* ── PANEL (base component) ────────────────────────────────── */ .panel { background: var(--void-warm); border: 1px solid var(--steel-faint); position: relative; overflow: hidden; display: flex; flex-direction: column; } .panel-header { font-family: var(--font-sys); font-size: 8px; font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; color: var(--nerv-orange); padding: 6px 10px 5px; border-bottom: 1px solid var(--nerv-orange-dim); display: flex; justify-content: space-between; align-items: center; flex-shrink: 0; } .panel-header .tag { font-size: 7px; color: var(--steel-dim); letter-spacing: 0.08em; } .panel-body { padding: 8px 10px; flex: 1; min-height: 0; } /* ── DASHBOARD LAYOUT ──────────────────────────────────────── */ .console-wrapper { display: flex; flex-direction: column; height: 100vh; } .dashboard { display: flex; gap: 2px; flex: 1; padding: 2px; min-height: 0; overflow: hidden; } .dash-left { flex: 1; display: flex; flex-direction: column; gap: 2px; min-width: 0; overflow-y: auto; } .dash-right { width: 370px; min-width: 370px; display: flex; flex-direction: column; } .dash-row { display: grid; gap: 2px; flex-shrink: 0; } .dash-row.r1 { grid-template-columns: 1.2fr 1fr; min-height: 380px; } .dash-row.r2 { grid-template-columns: 1fr 1fr; } .dash-row.r3 { grid-template-columns: 1.5fr 1fr; min-height: 180px; } .dash-row.r4 { grid-template-columns: 1fr; } @media (max-width: 1100px) { .dashboard { flex-direction: column; } .dash-right { width: 100%; min-width: 0; max-height: 300px; } .dash-row.r1, .dash-row.r2, .dash-row.r3 { grid-template-columns: 1fr; } } /* ── METRICS GRID ──────────────────────────────────────────── */ .metrics-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1px; background: var(--steel-faint); flex: 1; } .metric-cell { background: var(--void-warm); padding: 8px 10px; display: flex; flex-direction: column; justify-content: center; } .metric-cell .m-label { font-size: 7px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--nerv-orange); margin-bottom: 2px; } .metric-cell .m-value { font-size: 18px; font-weight: 700; color: var(--data-green); font-variant-numeric: tabular-nums; text-shadow: 0 0 6px rgba(80,255,80,0.4), 0 0 12px rgba(80,255,80,0.15); line-height: 1.1; } .metric-cell .m-sub { font-size: 7px; color: var(--steel-dim); margin-top: 2px; letter-spacing: 0.06em; } .metric-cell.highlight .m-value { color: var(--nerv-orange); text-shadow: 0 0 6px rgba(255,152,48,0.4), 0 0 12px rgba(255,152,48,0.15); font-size: 22px; } .metric-cell.zero .m-value { font-family: var(--font-title); font-weight: 900; font-size: 28px; letter-spacing: 0.05em; transform: scaleX(0.85); transform-origin: left; } /* ── VAULT CARD ────────────────────────────────────────────── */ .vault-card { padding: 8px 10px; flex: 1; } .vault-card .vc-id { font-family: var(--font-title); font-size: 12px; font-weight: 800; letter-spacing: 0.18em; text-transform: uppercase; color: var(--wire-cyan); transform: scaleX(0.82); transform-origin: left; } .vault-card .vc-name { font-family: var(--font-mincho); font-size: 13px; font-weight: 800; color: var(--steel); transform: scaleX(0.78); transform-origin: left; margin: 2px 0 6px; } .vault-card .vc-row { display: flex; justify-content: space-between; font-size: 9px; padding: 2px 0; border-bottom: 1px solid var(--steel-faint); } .vault-card .vc-row:last-child { border-bottom: none; } .vault-card .vc-row .lbl { color: var(--nerv-orange-dim); text-transform: uppercase; letter-spacing: 0.06em; font-size: 8px; } .vault-card .vc-row .val { color: var(--data-green); font-weight: 500; font-variant-numeric: tabular-nums; } .vault-card .vc-status { margin-top: 4px; font-family: var(--font-stamp); font-size: 12px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--data-green); } .led { display: inline-block; width: 5px; height: 5px; border-radius: 50%; margin-right: 4px; vertical-align: middle; } .led.green { background: var(--data-green); box-shadow: 0 0 4px var(--data-green), 0 0 8px rgba(80,255,80,0.3); } .led.red { background: var(--alert-red); box-shadow: 0 0 4px var(--alert-red); } .led.orange { background: var(--nerv-orange); box-shadow: 0 0 4px var(--nerv-orange); } .led.cyan { background: var(--wire-cyan); box-shadow: 0 0 4px var(--wire-cyan); } @keyframes led-blink { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } } .led.blink { animation: led-blink 1s ease-in-out infinite; } /* ── DATA TABLE ────────────────────────────────────────────── */ .nerv-table { width: 100%; border-collapse: collapse; font-family: var(--font-sys); font-size: 10px; } .nerv-table th { font-size: 7px; font-weight: 500; letter-spacing: 0.12em; text-transform: uppercase; text-align: left; padding: 4px 8px; color: var(--nerv-orange); border-bottom: 1px solid var(--nerv-orange-dim); } .nerv-table td { padding: 3px 8px; color: var(--data-green); border-bottom: 1px solid var(--steel-faint); font-variant-numeric: tabular-nums; font-weight: 500; } .nerv-table td.lbl { color: var(--nerv-orange-dim); text-transform: uppercase; letter-spacing: 0.06em; font-size: 8px; font-weight: 400; } .nerv-table tr:hover td { background: var(--data-green-faint); } /* ── THREE.JS VIEWPORT ────────────────────────────────────── */ .three-viewport { position: relative; background: var(--void); flex: 1; min-height: 0; overflow: hidden; } .three-viewport canvas { width: 100% !important; height: 100% !important; display: block; } .three-viewport .vp-label { position: absolute; bottom: 4px; left: 8px; font-family: var(--font-sys); font-size: 7px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--nerv-orange-dim); z-index: 2; background: rgba(0,0,0,0.65); padding: 2px 6px; } .three-viewport .vp-data { position: absolute; top: 6px; left: 8px; font-family: var(--font-sys); font-size: 9px; color: var(--wire-cyan); z-index: 2; line-height: 1.5; background: rgba(0,0,0,0.65); padding: 4px 8px; border-left: 1px solid var(--nerv-orange-dim); } .measurement-grid { position: absolute; inset: 0; background-image: linear-gradient(var(--steel-line) 1px, transparent 1px), linear-gradient(90deg, var(--steel-line) 1px, transparent 1px); background-size: 60px 60px; pointer-events: none; z-index: 1; opacity: 0.3; } /* ── WAVEFORM DISPLAY ──────────────────────────────────────── */ .waveform-wrap { position: relative; flex: 1; min-height: 0; background: var(--void); } .waveform-wrap canvas { width: 100%; height: 100%; display: block; } .waveform-wrap .readout { position: absolute; top: 6px; right: 8px; font-size: 20px; font-weight: 700; color: var(--data-green); text-shadow: 0 0 6px rgba(80,255,80,0.8), 0 0 12px rgba(80,255,80,0.5), 0 0 24px rgba(80,255,80,0.3); z-index: 2; } .waveform-wrap .readout-label { position: absolute; top: 6px; left: 8px; font-size: 7px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--nerv-orange); z-index: 2; } .waveform-wrap .timecode { position: absolute; bottom: 4px; right: 8px; font-size: 7px; color: var(--nerv-orange-dim); letter-spacing: 0.08em; z-index: 2; } .waveform-wrap .legend { position: absolute; bottom: 4px; left: 8px; font-size: 7px; color: var(--steel-dim); z-index: 2; display: flex; gap: 12px; } .waveform-wrap .legend span::before { content: '●'; margin-right: 3px; } .waveform-wrap .legend .l-green::before { color: var(--data-green); } .waveform-wrap .legend .l-cyan::before { color: var(--wire-cyan); } .waveform-wrap .legend .l-orange::before { color: var(--nerv-orange); } /* ── MAGI ORACLE ───────────────────────────────────────────── */ .magi-oracle { display: flex; flex-direction: column; gap: 6px; } .magi-source { padding: 6px 8px; border: 1px solid var(--wire-cyan-dim); background: var(--void); display: flex; align-items: center; gap: 8px; } .magi-source .ms-name { font-family: var(--font-title); font-size: 11px; font-weight: 800; letter-spacing: 0.15em; text-transform: uppercase; color: var(--wire-cyan); transform: scaleX(0.85); transform-origin: left; min-width: 90px; } .magi-source .ms-price { font-size: 11px; font-weight: 700; color: var(--data-green); font-variant-numeric: tabular-nums; } .magi-source .ms-meta { font-size: 7px; color: var(--steel-dim); margin-left: auto; text-align: right; line-height: 1.4; } .magi-source .ms-status { font-family: var(--font-stamp); font-size: 11px; font-weight: 700; letter-spacing: 0.06em; } .magi-source .ms-status.agree { color: var(--data-green); } .magi-source .ms-status.stale { color: var(--nerv-orange); } .magi-source .ms-status.reject { color: var(--alert-red); } .magi-consensus { font-size: 8px; text-align: center; padding: 4px; color: var(--steel-dim); letter-spacing: 0.1em; text-transform: uppercase; border-top: 1px solid var(--wire-cyan-dim); } .magi-consensus span { font-weight: 700; } /* ── EVENT LOG ─────────────────────────────────────────────── */ .event-log { background: var(--void-warm); border: 1px solid var(--steel-faint); display: flex; flex-direction: column; flex: 1; min-height: 0; } .event-log .el-header { font-family: var(--font-sys); font-size: 8px; font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; color: var(--nerv-orange); padding: 6px 10px 5px; border-bottom: 1px solid var(--nerv-orange-dim); display: flex; justify-content: space-between; align-items: center; flex-shrink: 0; } .event-log .el-header .el-count { font-size: 7px; color: var(--data-green); font-weight: 500; } .event-log .el-body { flex: 1; overflow-y: auto; overflow-x: hidden; font-family: var(--font-sys); font-size: 9px; line-height: 1.5; padding: 2px 0; min-height: 0; } .event-log .el-body::-webkit-scrollbar { width: 3px; } .event-log .el-body::-webkit-scrollbar-track { background: var(--void); } .event-log .el-body::-webkit-scrollbar-thumb { background: var(--steel-faint); border-radius: 2px; } .ev { padding: 1px 10px; display: flex; gap: 6px; font-variant-numeric: tabular-nums; white-space: nowrap; border-left: 2px solid transparent; } .ev:hover { background: var(--data-green-faint); } .ev .ev-time { color: var(--steel-dim); min-width: 52px; flex-shrink: 0; } .ev .ev-type { min-width: 62px; font-weight: 700; letter-spacing: 0.04em; flex-shrink: 0; } .ev .ev-detail { color: var(--steel); flex: 1; overflow: hidden; text-overflow: ellipsis; } .ev .ev-amount { color: var(--data-green); min-width: 85px; text-align: right; flex-shrink: 0; } .ev .ev-block { color: var(--steel-dim); font-size: 8px; min-width: 65px; text-align: right; flex-shrink: 0; } .ev-type.deposit { color: var(--data-green); } .ev-type.borrow { color: var(--wire-cyan); } .ev-type.harvest { color: var(--nerv-orange); } .ev-type.repay { color: var(--data-green-dim); } .ev-type.redeem { color: var(--thermal-yellow); } .ev-type.transmute{ color: var(--wire-cyan-dim); } .ev-type.mint { color: var(--thermal-magenta); } .ev.new-entry { border-left-color: var(--data-green); } .ev.new-entry { animation: ev-flash 0.6s ease-out; } @keyframes ev-flash { 0% { background: var(--data-green-fill); } 100% { background: transparent; } } /* ── ALERT BANNER / EMERGENCY ──────────────────────────────── */ .alert-banner { background: var(--alert-red); color: var(--void); padding: 6px 20px; font-family: var(--font-stamp); font-size: clamp(18px, 3vw, 28px); font-weight: 800; letter-spacing: 0.2em; text-transform: uppercase; text-align: center; line-height: 1; } @keyframes alert-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.6; } } .alert-banner.pulse { animation: alert-pulse 0.8s ease-in-out infinite; } .hazard-stripe { background: repeating-linear-gradient(-45deg, var(--alert-red) 0px, var(--alert-red) 16px, var(--void) 16px, var(--void) 32px); padding: 4px 0; } .emergency-hex-banner { display: none; } [data-mode="emergency"] .emergency-hex-banner { display: block; } .emergency-overlay { display: none; position: fixed; inset: 0; z-index: 9990; pointer-events: none; } [data-mode="emergency"] .emergency-overlay { display: block; } [data-mode="emergency"] .emergency-overlay::before { content: ''; position: absolute; inset: 0; background: rgba(255,0,0,0.03); animation: emergency-pulse 0.5s ease-in-out infinite alternate; } @keyframes emergency-pulse { from { background: rgba(255,0,0,0.02); } to { background: rgba(255,0,0,0.08); } } [data-mode="emergency"] { --data-green: #FF3030; --data-green-dim: #CC2020; --data-green-faint: rgba(255,48,48,0.06); --data-green-fill: rgba(255,48,48,0.1); --wire-cyan: #FF5050; --wire-cyan-dim: #AA3030; --scan-opacity: 0.08; } [data-mode="emergency"] .panel { border-color: rgba(255,48,48,0.2); } [data-mode="emergency"] .panel-header { border-bottom-color: var(--alert-red-dim); } [data-mode="emergency"] .nerv-nav { border-bottom-color: var(--alert-red); background: rgba(255,0,0,0.04); } /* ── STRATEGY TABLE ────────────────────────────────────────── */ .strat-table td.strat-name { color: var(--wire-cyan); font-weight: 500; letter-spacing: 0.04em; } .strat-table td.alloc { color: var(--nerv-orange); } .strat-table td.apy { font-weight: 700; } .nerv-progress { height: 3px; background: var(--void-panel); border: 1px solid var(--steel-faint); overflow: hidden; min-width: 60px; } .nerv-progress .fill { height: 100%; background: var(--data-green); box-shadow: 0 0 4px rgba(80,255,80,0.3); } /* ── BOTTOM BAR ────────────────────────────────────────────── */ .status-bar { display: flex; justify-content: space-between; align-items: center; padding: 3px 12px; font-size: 7px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--steel-dim); border-top: 1px solid var(--steel-faint); flex-shrink: 0; }