:root{--bg-primary:#0f1117;--bg-secondary:#1a1d27;--bg-card:#1e2130;--bg-card-hover:#252838;--border:#2a2d3a;--text-primary:#e8eaed;--text-secondary:#9aa0a6;--text-muted:#6b7280;--accent-blue:#4a9eff;--accent-green:#34d399;--accent-yellow:#fbbf24;--accent-red:#f87171;--accent-orange:#fb923c;--accent-purple:#a78bfa;--solar-yellow:#fcd34d;--grid-import:#60a5fa;--grid-export:#34d399;--demand-red:#f87171;--shadow:0 4px 6px -1px rgba(0,0,0,.3);--radius:12px}*{margin:0;padding:0;box-sizing:border-box}body{background:var(--bg-primary);color:var(--text-primary);font-family:-apple-system,BlinkMacSystemFont,Inter,Segoe UI,sans-serif;-webkit-font-smoothing:antialiased}.app{min-height:100vh}.app-header{justify-content:space-between;padding:8px 18px;background:var(--bg-secondary);border-bottom:1px solid var(--border);position:-webkit-sticky;position:sticky;top:0;z-index:100}.app-header,.header-left{display:flex;align-items:center}.header-left{gap:10px}.logo{display:flex;align-items:center;justify-content:center;width:32px;height:32px;background:linear-gradient(135deg,var(--accent-blue),var(--accent-purple));border-radius:8px;color:#fff}.logo svg{width:20px;height:20px}.app-header h1{font-size:16px;font-weight:600;color:var(--text-primary);line-height:1.2}.subtitle{font-size:12px;color:var(--text-secondary)}.header-right{display:flex;align-items:center;gap:16px}.connection-status{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:500;padding:4px 12px;border-radius:20px}.connection-status.connected{background:rgba(52,211,153,.15);color:var(--accent-green)}.connection-status.disconnected{background:hsla(0,91%,71%,.15);color:var(--accent-red)}.status-dot{width:8px;height:8px;border-radius:50%;background:currentColor;animation:pulse 2s infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.last-update{font-size:12px;color:var(--text-muted)}.app-main{padding:14px 18px;max-width:1600px;margin:0 auto}.dashboard{display:flex;flex-direction:column;gap:12px}.metrics-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));grid-gap:10px;gap:10px}.metric-card{background:var(--bg-card);border:1px solid var(--border);border-radius:10px;padding:10px 14px;display:flex;flex-direction:column;gap:4px;transition:background .2s}.metric-card:hover{background:var(--bg-card-hover)}.metric-card .label{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text-secondary);font-weight:500}.metric-card .label svg{width:14px;height:14px}.metric-card .value{font-size:22px;font-weight:700;letter-spacing:-.5px;line-height:1.1}.metric-card .unit{font-size:12px;font-weight:400;color:var(--text-secondary);margin-left:3px}.metric-card .change{font-size:11px;font-weight:500}.metric-card .change.positive{color:var(--accent-red)}.metric-card .change.negative{color:var(--accent-green)}.chart-grid{display:grid;grid-template-columns:1fr 1fr;grid-gap:12px;gap:12px}.chart-grid.full-width{grid-template-columns:1fr}.panel{background:var(--bg-card);border:1px solid var(--border);border-radius:10px;padding:12px 14px 8px;box-shadow:var(--shadow)}.panel-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.panel-header h3{font-size:14px;font-weight:600;color:var(--text-primary)}.panel-controls{display:flex;gap:3px}.panel-controls button{padding:3px 10px;font-size:11px;border:1px solid var(--border);background:transparent;color:var(--text-secondary);border-radius:6px;cursor:pointer;transition:all .2s}.panel-controls button:hover{background:var(--bg-card-hover);color:var(--text-primary)}.panel-controls button.active{background:var(--accent-blue);color:#fff;border-color:var(--accent-blue)}.upload-section{background:var(--bg-card);border:2px dashed var(--border);border-radius:var(--radius);padding:32px;text-align:center;cursor:pointer;transition:all .2s}.upload-section:hover{border-color:var(--accent-blue);background:var(--bg-card-hover)}.upload-section.dragging{border-color:var(--accent-blue);background:rgba(74,158,255,.1)}.upload-section input[type=file]{display:none}.upload-section .upload-icon{font-size:40px;margin-bottom:12px;color:var(--text-muted)}.upload-section h3{font-size:16px;margin-bottom:4px;color:var(--text-primary)}.upload-section p{font-size:13px;color:var(--text-secondary)}.upload-result{margin-top:16px;padding:12px 16px;border-radius:8px;font-size:13px}.upload-result.success{background:rgba(52,211,153,.15);color:var(--accent-green)}.upload-result.error{background:hsla(0,91%,71%,.15);color:var(--accent-red)}.tab-nav{display:flex;gap:3px;background:var(--bg-secondary);padding:3px;border-radius:8px;margin-bottom:0}.tab-nav button{flex:1 1;padding:6px 12px;font-size:12px;font-weight:500;border:none;background:transparent;color:var(--text-secondary);border-radius:6px;cursor:pointer;transition:all .2s}.tab-nav button.active,.tab-nav button:hover{color:var(--text-primary)}.tab-nav button.active{background:var(--bg-card);box-shadow:var(--shadow)}.demand-alert{display:flex;align-items:center;gap:12px;padding:12px 16px;background:hsla(0,91%,71%,.1);border:1px solid hsla(0,91%,71%,.3);border-radius:8px;font-size:13px;color:var(--accent-red)}.demand-alert.warning{background:rgba(251,191,36,.1);border-color:rgba(251,191,36,.3);color:var(--accent-yellow)}@media (max-width:1200px){.chart-grid{grid-template-columns:1fr}}@media (max-width:768px){.app-header{flex-direction:column;gap:12px}.metrics-row{grid-template-columns:repeat(2,1fr)}.app-main{padding:16px}}@media (max-width:480px){.metrics-row{grid-template-columns:1fr}}.recharts-cartesian-grid-horizontal line,.recharts-cartesian-grid-vertical line{stroke:var(--border)}.recharts-text{fill:var(--text-secondary);font-size:11px}.recharts-tooltip-wrapper .recharts-default-tooltip{background:var(--bg-card)!important;border:1px solid var(--border)!important;border-radius:8px!important;box-shadow:var(--shadow)!important}.recharts-tooltip-item{color:var(--text-primary)!important;font-size:13px!important}.recharts-tooltip-label{color:var(--text-secondary)!important;font-size:12px!important}.loading{display:flex;align-items:center;justify-content:center;padding:60px;color:var(--text-muted)}.spinner{width:32px;height:32px;border:3px solid var(--border);border-top-color:var(--accent-blue);border-radius:50%;animation:spin .8s linear infinite;margin-right:12px}@keyframes spin{to{transform:rotate(1turn)}}