*{margin:0;padding:0;box-sizing:border-box}html,body,#root{height:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.login-page{height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#0f0c29,#1a1a3e 40%,#24243e);position:relative;overflow:hidden}.login-bg-dots{position:absolute;inset:0;background-image:radial-gradient(circle,rgba(22,119,255,.15) 1px,transparent 1px);background-size:30px 30px}.login-container{position:relative;z-index:1;width:380px;text-align:center}.login-header{margin-bottom:32px}.login-logo{width:64px;height:64px;margin:0 auto 16px;border-radius:16px;overflow:hidden;box-shadow:0 8px 24px #1677ff66}.login-title{color:#fff;font-size:24px;font-weight:700;margin:0;letter-spacing:2px}.login-subtitle{color:#ffffff80;font-size:13px;margin-top:6px}.login-form-card{background:#ffffff14;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.1);border-radius:16px;padding:28px 24px 12px}.login-form-card .ant-input-affix-wrapper,.login-form-card .ant-input{background:#ffffff0f!important;border-color:#ffffff26!important;color:#fff!important;border-radius:8px!important}.login-form-card .ant-input::placeholder{color:#ffffff59!important}.login-form-card .ant-input-affix-wrapper:hover,.login-form-card .ant-input-affix-wrapper-focused{border-color:#1677ff!important}.login-form-card .ant-btn-default{background:#ffffff14!important;border-color:#fff3!important;color:#fff!important}.login-form-card .ant-btn-default:hover{border-color:#1677ff!important;color:#4096ff!important}.login-form-card .ant-btn-primary{background:linear-gradient(135deg,#1677ff,#4096ff)!important;border:none!important;box-shadow:0 4px 16px #1677ff66}.login-footer{color:#ffffff40;font-size:12px;margin-top:24px}.dashboard{height:100vh;display:flex;flex-direction:column;background:#f0f2f5}.dashboard-header{height:48px;background:#001529;display:flex;align-items:center;padding:0 16px;color:#fff;flex-shrink:0}.header-left h1{font-size:15px;font-weight:600;color:#fff;margin:0;white-space:nowrap}.header-tabs{display:flex;gap:2px;margin:0 24px;flex:1;justify-content:center}.header-tab{padding:6px 16px;border-radius:6px;font-size:13px;cursor:pointer;color:#fffa;transition:all .15s;display:flex;align-items:center;gap:5px;white-space:nowrap}.header-tab:hover{color:#fff;background:#ffffff15}.header-tab.active{color:#fff;background:#1677ff;font-weight:600}.header-right{display:flex;align-items:center;gap:4px}.dashboard-content{flex:1;display:flex;flex-direction:column;overflow:hidden}.global-filter{flex-shrink:0}.global-filter .filter-bar{padding:6px 16px;background:#fff;border-bottom:1px solid #f0f0f0}.overview-view{flex:1;display:flex;flex-direction:column;overflow:hidden}.dashboard-body{flex:1;display:flex;overflow:hidden}.overview-bar{display:flex;gap:12px;padding:10px 16px;background:#fff;border-bottom:1px solid #f0f0f0;flex-shrink:0;align-items:center}.overview-item{display:flex;align-items:center;gap:6px;padding:4px 12px;border-radius:6px;background:#f5f5f5;font-size:13px;cursor:pointer}.overview-item .num{font-size:18px;font-weight:700}.overview-item.danger{background:#fff1f0;color:red}.overview-item.offnet{background:#e6f4ff;color:#1677ff}.overview-item.warning{background:#fff7e6;color:#d46b08}.overview-item.success{background:#f6ffed;color:#389e0d}.overview-item.recovered{background:#e6fffb;color:#08979c}.overview-item.info{background:#e6f4ff;color:#1677ff}.alert-ticker{display:flex;gap:6px;padding:4px 16px;background:#fff8f0;border-bottom:1px solid #f0f0f0;align-items:center;flex-wrap:nowrap;overflow-x:auto;flex-shrink:0}.alert-ticker-label{font-size:11px;font-weight:700;color:#ff4d4f;background:#fff1f0;padding:1px 8px;border-radius:8px;white-space:nowrap;flex-shrink:0}.alert-ticker-item{font-size:12px;padding:2px 8px;border-left:3px solid #ff4d4f;background:#fff;border-radius:4px;cursor:pointer;white-space:nowrap;transition:background .15s}.alert-ticker-item:hover{background:#f0f5ff}.dashboard.dark .alert-ticker{background:#4d1a0a;border-color:#5d2010}.dashboard.dark .alert-ticker-label{background:#5d1515;color:#ff8080}.dashboard.dark .alert-ticker-item{background:#1a1a3e;color:#ddd}.dashboard.dark .alert-ticker-item:hover{background:#0d2137}.map-area{flex:1;position:relative}.map-area>div{height:100%;width:100%}.right-panel{width:380px;display:flex;flex-direction:column;background:#fff;border-left:1px solid #f0f0f0;flex-shrink:0}.right-panel-header{padding:10px 16px;border-bottom:1px solid #f0f0f0;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.right-panel-list{flex:1;overflow-y:auto;padding:8px}.station-card{padding:10px 12px;margin-bottom:6px;border-radius:8px;border:1px solid #f0f0f0;cursor:pointer;transition:all .15s}.station-card:hover{border-color:#1677ff;box-shadow:0 1px 4px #00000014}.station-card.offline{border-left:4px solid #ff0000;background:#fff1f0}.station-card.offnet{border-left:4px solid #1677ff;background:#e6f4ff}.station-card.warning{border-left:3px solid #faad14;background:#fffbe6}.station-card.normal{border-left:3px solid #52c41a}.station-card.recovered{border-left:4px solid #36cfc9;background:#e6fffb}.station-card-header{display:flex;justify-content:space-between;align-items:center}.station-card-code{font-weight:700;font-size:15px}.station-card-name{font-size:13px;color:#888;margin-top:3px}.station-card-metrics{display:flex;gap:14px;margin-top:6px;font-size:13px;color:#666}.station-card-metrics span{display:flex;align-items:center;gap:3px}.station-card.normal .status-badge{animation:breathe 3s ease-in-out infinite}@keyframes breathe{0%,to{opacity:1}50%{opacity:.5}}.station-card.recovered .status-badge{animation:recoverPulse 2s ease-in-out infinite}@keyframes recoverPulse{0%,to{box-shadow:0 0 #36cfc966}50%{box-shadow:0 0 0 4px #36cfc91a}}.status-badge{display:inline-block;padding:2px 10px;border-radius:10px;font-size:12px;font-weight:600}.status-badge.normal{background:#f6ffed;color:#389e0d}.status-badge.offline{background:red;color:#fff}.status-badge.off_net{background:#1677ff;color:#fff}.status-badge.delay,.status-badge.low_runrate{background:#fff7e6;color:#d46b08}.status-badge.recovered{background:#e6fffb;color:#08979c}.filter-bar{display:flex;gap:4px;padding:6px 16px;flex-wrap:wrap;align-items:center}.filter-btn{padding:2px 10px;border-radius:12px;font-size:12px;cursor:pointer;border:1px solid #d9d9d9;background:#fff;transition:all .15s;white-space:nowrap}.filter-btn:hover{border-color:#1677ff;color:#1677ff}.filter-btn.active{background:#1677ff;color:#fff;border-color:#1677ff}.filter-select{border:1px solid #d9d9d9;border-radius:12px;padding:2px 8px;font-size:12px;outline:none;min-width:90px;background:#fff;color:#333;appearance:auto}.filter-select.active{background:#1677ff;color:#fff;border-color:#1677ff}.filter-search-wrapper{position:relative;display:inline-flex;align-items:center;margin-left:auto}.filter-search{border:1px solid #d9d9d9;border-radius:12px;padding:3px 28px 3px 10px;font-size:12px;outline:none;width:140px}.filter-search:focus{border-color:#1677ff}.filter-search-clear{position:absolute;right:6px;top:50%;transform:translateY(-50%);width:16px;height:16px;line-height:14px;text-align:center;border-radius:50%;background:#ccc;color:#fff;font-size:12px;cursor:pointer;-webkit-user-select:none;user-select:none}.filter-search-clear:hover{background:#999}.filter-date-input{border:1px solid #d9d9d9;border-radius:6px;padding:2px 8px;font-size:12px;outline:none}.map-popup{font-size:13px;line-height:1.6;min-width:180px}.map-popup .title{font-weight:600;font-size:14px;margin-bottom:4px}.map-popup .row{display:flex;justify-content:space-between}.map-popup .label{color:#999}.station-svg-icon{background:none!important;border:none!important}.heatmap-view{flex:1;display:flex;flex-direction:column;overflow:hidden}.heatmap-scroll{flex:1;overflow:auto;padding:0 8px 8px}.heatmap-table{border-collapse:collapse;font-size:11px;width:auto}.heatmap-table th,.heatmap-table td{border:1px solid #333;padding:1px 2px;text-align:center;line-height:1.2}.heatmap-table th{font-weight:600;font-size:10px;position:sticky;top:0;z-index:3;background:#fafafa;padding:2px 3px}.heatmap-table td{min-width:22px;height:18px;font-size:9px}.alerts-view{flex:1;display:flex;flex-direction:row;overflow:hidden}.alerts-list{flex:1;overflow-y:auto;padding:8px 16px}.alert-card{padding:10px 14px;margin-bottom:8px;border-radius:8px;border:1px solid #f0f0f0;border-left:4px solid #ff4d4f;cursor:default}.alert-card-header{display:flex;justify-content:space-between;align-items:center}.gaps-view{flex:1;display:flex;flex-direction:column;overflow:hidden}.gaps-list{flex:1;overflow-y:auto;padding:0 16px 16px}.gaps-table{border-collapse:collapse;width:100%;font-size:13px}.gaps-table th,.gaps-table td{border:1px solid #e8e8e8;padding:6px 10px;text-align:left}.gaps-table th{font-weight:600;font-size:12px;background:#fafafa;position:sticky;top:0;z-index:1}.gaps-table tr:hover{background:#f5f5f5}.detail-overlay{position:fixed;inset:0;background:#0006;z-index:1000;display:flex;justify-content:flex-end}.detail-drawer{width:420px;height:100%;background:#fff;overflow-y:auto;box-shadow:-4px 0 20px #00000026;animation:slideIn .2s ease}@keyframes slideIn{0%{transform:translate(100%)}to{transform:translate(0)}}.detail-header{padding:16px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #f0f0f0}.detail-close{font-size:18px;cursor:pointer;color:#999;padding:4px 8px}.detail-close:hover{color:#333}.detail-status-row{display:flex;gap:16px;padding:12px 16px;border-bottom:1px solid #f0f0f0}.detail-status-item{display:flex;flex-direction:column;gap:2px}.detail-status-label{font-size:11px;color:#999}.detail-info{display:flex;gap:16px;flex-wrap:wrap;padding:10px 16px;font-size:12px;color:#888;border-bottom:1px solid #f0f0f0}.detail-charts{padding:8px 16px}.detail-chart-block{margin-bottom:16px}.detail-chart-title{font-size:12px;font-weight:600;margin-bottom:4px;color:#666}.detail-chart-axis{display:flex;justify-content:space-between;font-size:10px;color:#999}.dashboard.dark{background:#1a1a2e}.dashboard.dark .dashboard-header{background:#0f0f23}.dashboard.dark .global-filter .filter-bar,.dashboard.dark .overview-bar{background:#16213e;border-color:#1a1a3e}.dashboard.dark .overview-item{background:#1a1a3e;color:#ccc}.dashboard.dark .overview-item.info{background:#0d2137;color:#69b1ff}.dashboard.dark .overview-item.success{background:#0d2a12;color:#73d13d}.dashboard.dark .overview-item.danger{background:#4d0a0a;color:#f66}.dashboard.dark .overview-item.offnet{background:#0a1d3d;color:#80bfff}.dashboard.dark .overview-item.warning{background:#4d3a00;color:#ffe066}.dashboard.dark .overview-item.recovered{background:#0a2e2c;color:#5cdbd3}.dashboard.dark .right-panel{background:#16213e;border-color:#1a1a3e}.dashboard.dark .right-panel-header{border-color:#1a1a3e;color:#ddd}.dashboard.dark .station-card{background:#1a1a3e;border-color:#2a2a4e}.dashboard.dark .station-card.offline{background:#4d0a0a;border-left:5px solid #ff3333}.dashboard.dark .station-card.offline .station-card-code{color:#ff8080}.dashboard.dark .station-card.offline .station-card-name{color:#f99}.dashboard.dark .station-card.offline .status-badge{background:#f22;color:#fff}.dashboard.dark .station-card.offnet{background:#0a1d3d;border-left:5px solid #4d9fff}.dashboard.dark .station-card.offnet .station-card-code{color:#80bfff}.dashboard.dark .station-card.offnet .status-badge{background:#1677ff;color:#fff}.dashboard.dark .station-card.warning{background:#4d3a00;border-left:5px solid #ffcc00}.dashboard.dark .station-card.warning .station-card-code{color:#ffe066}.dashboard.dark .station-card.warning .station-card-name{color:#ffd666}.dashboard.dark .station-card.warning .status-badge{background:#fc0;color:#000}.dashboard.dark .station-card.recovered{background:#0a2e2c;border-left:5px solid #36cfc9}.dashboard.dark .station-card.recovered .station-card-code{color:#5cdbd3}.dashboard.dark .station-card.recovered .station-card-name{color:#87e8de}.dashboard.dark .station-card.recovered .status-badge{background:#13615a;color:#5cdbd3}.dashboard.dark .station-card.normal .status-badge{background:#1a3a1a;color:#73d13d}.dashboard.dark .station-card:hover{border-color:#1677ff;box-shadow:0 1px 6px #1677ff4d}.dashboard.dark .station-card-code{color:#ddd}.dashboard.dark .station-card-name{color:#888}.dashboard.dark .station-card-metrics{color:#999}.dashboard.dark .filter-btn{background:#1a1a3e;border-color:#2a2a4e;color:#bbb}.dashboard.dark .filter-btn:hover{border-color:#1677ff;color:#69b1ff}.dashboard.dark .filter-btn.active{background:#1677ff;color:#fff;border-color:#1677ff}.dashboard.dark .filter-select{background:#1a1a3e;border-color:#2a2a4e;color:#bbb}.dashboard.dark .filter-select.active{background:#1677ff;color:#fff}.dashboard.dark .filter-search{background:#1a1a3e;border-color:#2a2a4e;color:#ddd}.dashboard.dark .filter-search-clear{background:#555;color:#ddd}.dashboard.dark .filter-search-clear:hover{background:#777}.dashboard.dark .alert-card{background:#1a1a3e;border-color:#2a2a4e;color:#ddd}.dashboard.dark .alert-card-header span{color:#ddd}.dashboard.dark .heatmap-table th{background:#16213e;color:#ccc;border-color:#2a2a4e}.dashboard.dark .heatmap-table td{border-color:#2a2a4e;color:#ddd}.dashboard.dark .heatmap-scroll{color:#ddd}.dashboard.dark .gaps-table th{background:#16213e;color:#ccc;border-color:#2a2a4e}.dashboard.dark .gaps-table td{border-color:#2a2a4e;color:#ccc}.dashboard.dark .gaps-table tr:hover{background:#1a1a3e}.dashboard.dark .detail-drawer{background:#16213e;color:#ddd}.dashboard.dark .detail-drawer.dark{background:#16213e}.dashboard.dark .detail-header{border-color:#2a2a4e;color:#ddd}.dashboard.dark .detail-close{color:#888}.dashboard.dark .detail-close:hover{color:#fff}.dashboard.dark .detail-status-row{border-color:#2a2a4e}.dashboard.dark .detail-status-item span{color:#ddd}.dashboard.dark .detail-status-label{color:#999!important}.dashboard.dark .detail-info{border-color:#2a2a4e;color:#aaa}.dashboard.dark .detail-chart-title{color:#ccc}.dashboard.dark .detail-chart-block{color:#ddd}.dashboard.dark .filter-date-input{background:#1a1a3e!important;border-color:#2a2a4e!important;color:#ddd!important}.dashboard.dark .alerts-view,.dashboard.dark .gaps-view,.dashboard.dark .heatmap-view,.dashboard.dark .heatmap-toolbar,.dashboard.dark .right-panel-header span{color:#ddd}.runrate-view{flex:1;display:flex;flex-direction:column;overflow:hidden}@media(max-width:900px){.right-panel{width:300px}.header-tabs{gap:0}.header-tab{padding:6px 10px;font-size:12px}.detail-drawer{width:340px}}
