:root{--bg:#07100f;--surface:#0b1715;--surface2:#0e1d1a;--line:#1b302b;--soft:#10231f;--text:#e4f1ed;--muted:#789088;--green:#58edaa;--cyan:#69d8d0;--danger:#ff7d70;--mono:'DM Mono',monospace;--sans:'Noto Sans SC',sans-serif}
*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:radial-gradient(circle at 85% 0,rgba(55,126,101,.12),transparent 32%),var(--bg);color:var(--text);font:14px/1.55 var(--sans)}button{font:inherit;color:inherit}.topbar{height:72px;position:sticky;top:0;z-index:10;display:grid;grid-template-columns:1fr auto 1fr;align-items:center;padding:0 clamp(18px,4vw,58px);border-bottom:1px solid var(--line);background:rgba(7,16,15,.9);backdrop-filter:blur(18px)}.brand{display:flex;align-items:center;gap:12px;color:inherit;text-decoration:none;width:max-content}.brand-mark{display:grid;grid-template-columns:repeat(3,5px);gap:3px;align-items:end;height:25px}.brand-mark i{display:block;width:5px;border-radius:4px;background:var(--green)}.brand-mark i:nth-child(1){height:11px}.brand-mark i:nth-child(2){height:18px}.brand-mark i:nth-child(3){height:25px}.brand b{display:block;font:500 17px var(--mono);letter-spacing:.08em}.brand small{display:block;color:var(--muted);font:8px var(--mono);letter-spacing:.17em}.live-state{display:flex;align-items:center;gap:11px}.pulse{width:7px;height:7px;border-radius:50%;background:var(--green);box-shadow:0 0 0 5px rgba(88,237,170,.08),0 0 16px var(--green);animation:pulse 2s infinite}.live-state strong,.live-state small{display:block}.live-state strong{font-size:12px}.live-state small{color:var(--muted);font-size:9px;margin-top:1px}.top-actions{justify-self:end;display:flex;align-items:center;gap:9px}.top-actions>span{color:var(--muted);font:11px var(--mono);margin-right:5px}.icon-button{width:35px;height:35px;border:1px solid var(--line);border-radius:8px;background:var(--surface);cursor:pointer}.icon-button:hover{border-color:#3c6a5c;color:var(--green)}main{max-width:1540px;margin:auto;padding:0 clamp(18px,4vw,58px) 62px}.intro{min-height:270px;display:grid;grid-template-columns:1.2fr .8fr;align-items:center;border-bottom:1px solid var(--line)}.eyebrow{margin:0 0 10px;color:var(--green);font:9px var(--mono);letter-spacing:.18em}.intro h1{margin:0;font-size:clamp(42px,6vw,72px);line-height:.98;letter-spacing:-.055em}.intro h1 span{color:var(--green)}.intro-meta{justify-self:end;max-width:410px}.intro-meta p{color:#94aaa3;line-height:1.8;margin:17px 0 9px}.intro-meta>small{color:var(--muted)}.intro-meta>small b{color:#bcd0ca;font:500 10px var(--mono)}.result-state{width:max-content;display:flex;align-items:center;gap:7px;padding:6px 10px;border:1px solid var(--line);border-radius:20px;color:var(--muted);font:9px var(--mono);letter-spacing:.07em}.result-state i{width:5px;height:5px;border-radius:50%;background:var(--muted)}.result-state.success{color:var(--green);border-color:#285642}.result-state.success i{background:var(--green)}.result-state.error{color:var(--danger);border-color:#613b36}.result-state.error i{background:var(--danger)}
.metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin:20px 0 34px}.metrics article{min-height:118px;padding:18px 20px;border:1px solid var(--line);border-radius:11px;background:linear-gradient(145deg,var(--surface2),var(--surface))}.metrics span,.metrics small{display:block;color:var(--muted);font-size:10px}.metrics strong{display:block;margin:10px 0 2px;font:500 29px var(--mono)}.section-heading{display:flex;align-items:end;justify-content:space-between;margin:0 2px 15px}.section-heading h2{margin:0;font-size:22px;letter-spacing:-.03em}.section-heading>span{color:var(--muted);font:9px var(--mono);letter-spacing:.08em}.live-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.telemetry-card{border:1px solid var(--line);border-radius:12px;background:var(--surface);overflow:hidden;min-width:0}.card-head{display:flex;align-items:center;justify-content:space-between;padding:16px 18px;border-bottom:1px solid var(--line);background:linear-gradient(90deg,rgba(88,237,170,.04),transparent)}.card-title{display:flex;align-items:center;gap:10px}.type-icon{width:31px;height:31px;border:1px solid #2c5e4c;border-radius:8px;display:grid;place-items:center;color:var(--green);font:500 10px var(--mono);background:#0b2119}.card-title strong,.card-title small{display:block}.card-title strong{font-size:13px}.card-title small{color:var(--muted);font:8px var(--mono);margin-top:2px}.card-status{text-align:right}.card-status b{display:block;color:var(--green);font:500 10px var(--mono)}.card-status small{display:block;color:var(--muted);font:8px var(--mono);margin-top:2px}.card-fields{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px;background:var(--line)}.data-field{min-height:78px;padding:12px 13px;background:var(--surface)}.data-field>span{display:block;color:var(--muted);font-size:9px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.data-field strong{display:block;margin-top:6px;font:500 13px var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.data-field strong small{color:#73948a;font-size:9px}.data-field>small{display:block;color:#567068;font:8px var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:2px}.loading-card{grid-column:1/-1;min-height:260px;display:flex;flex-direction:column;align-items:center;justify-content:center;border:1px solid var(--line);border-radius:12px;background:var(--surface)}.loading-card strong{margin-top:22px}.loading-card small{color:var(--muted);margin-top:5px}.scanner{width:65px;height:65px;border:1px solid #315447;border-radius:50%;position:relative}.scanner:before{content:'';position:absolute;inset:8px;border:1px dashed #29463c;border-radius:50%;animation:spin 5s linear infinite}.scanner:after{content:'';position:absolute;left:50%;top:50%;width:24px;height:2px;transform-origin:left;background:var(--green);box-shadow:0 0 8px var(--green);animation:spin 1.8s linear infinite}
.pv-overview{grid-column:1/-1}.pv-overview>.card-head{min-height:84px}.pv-total{text-align:right}.pv-total>span,.pv-total>em{display:block;color:var(--muted);font:8px var(--mono);font-style:normal}.pv-total>strong{display:block;color:var(--green);font:500 25px var(--mono);margin:2px 0}.pv-total>strong small{font-size:11px}.pv-matrix{display:grid;grid-template-columns:1fr;background:var(--line);gap:1px}.pv-row{display:grid;grid-template-columns:120px repeat(4,minmax(110px,1fr));gap:1px;background:var(--line)}.pv-label,.pv-cell{background:var(--surface);min-height:58px;display:flex;align-items:center;justify-content:center}.pv-label{justify-content:flex-start;padding:0 18px;color:var(--muted);font-size:10px}.pv-cell{flex-direction:column;padding:8px 10px}.pv-cell strong{font:500 16px var(--mono)}.pv-cell small{color:var(--muted);font:8px var(--mono);margin-top:2px}.pv-channel{color:var(--green);font:500 13px var(--mono);background:var(--soft)}.power-row .pv-cell strong{color:var(--green);font-size:19px}.pv-state{padding:5px 9px;border:1px solid #325a4d;border-radius:14px;color:var(--green);font-size:10px}.state-故障{color:var(--danger);border-color:#6c3f38}.state-受限,.state-等待{color:#e4b15a;border-color:#67532c}.pv-details{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--line);border-top:1px solid var(--line)}.pv-channel-detail{display:grid;grid-template-columns:1fr 1fr;gap:12px;padding:16px 18px;background:var(--surface)}.pv-channel-detail div span,.pv-channel-detail div b{display:block}.pv-channel-detail div span{color:var(--muted);font-size:8px}.pv-channel-detail div b{font:500 10px var(--mono);margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pv-channel-detail .wide{grid-column:1/-1}
.fault-overview,.bms-overview{grid-column:1/-1}.fault-overview.has-fault{border-color:#68423d}.fault-overview.has-fault>.card-head{background:linear-gradient(90deg,rgba(255,125,112,.09),transparent)}.fault-total{text-align:right}.fault-total strong,.fault-total span{display:block}.fault-total strong{color:var(--danger);font:500 25px var(--mono)}.fault-total span{color:var(--muted);font-size:8px}.fault-list{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1px;background:var(--line)}.fault-row{min-height:70px;display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:8px;padding:12px 14px;background:var(--surface)}.fault-row span,.fault-row small{color:var(--muted);font-size:8px}.fault-row b{font-size:10px}.fault-row.danger b,.fault-row.latched b{color:var(--danger)}.fault-row.warning b{color:#e4b15a}.fault-empty{grid-column:1/-1;display:flex;align-items:center;gap:12px;padding:18px;background:var(--surface)}.fault-empty b{color:var(--green)}.fault-empty span{color:var(--muted);font-size:9px}.bms-summary{text-align:right}.bms-summary>span,.bms-summary>em{display:block;color:var(--muted);font:8px var(--mono);font-style:normal}.bms-summary>strong{display:block;color:var(--cyan);font:500 23px var(--mono)}.bms-summary small{font-size:10px}.bms-stats{display:grid;grid-template-columns:repeat(5,1fr);gap:1px;background:var(--line)}.bms-stats span{padding:11px 15px;background:var(--surface);color:var(--muted);font-size:9px}.bms-stats b{float:right;color:var(--text);font:500 11px var(--mono)}.bms-cells{display:grid;grid-template-columns:repeat(8,minmax(90px,1fr));gap:1px;background:var(--line);border-top:1px solid var(--line)}.bms-cell{min-height:72px;padding:11px;background:var(--surface)}.bms-cell span,.bms-cell small{display:block;color:var(--muted);font:8px var(--mono)}.bms-cell strong{display:block;margin:4px 0 1px;font:500 16px var(--mono)}.bms-cell.lowest strong{color:#e4b15a}.bms-cell.highest strong{color:var(--cyan)}.bms-cell.invalid{opacity:.45}.bms-legacy{padding:18px;background:var(--surface);border-top:1px solid var(--line)}.bms-legacy b,.bms-legacy span{display:block}.bms-legacy b{color:#e4b15a}.bms-legacy span{margin-top:4px;color:var(--muted);font-size:10px}
.stream-section{margin-top:38px}.recent-list{border:1px solid var(--line);border-radius:12px;overflow:hidden;background:var(--surface)}.stream-row{display:grid;grid-template-columns:90px 1.2fr .8fr .7fr 90px;align-items:center;gap:15px;min-height:48px;padding:0 16px;border-bottom:1px solid var(--line);font:10px var(--mono)}.stream-row:last-child{border:0}.stream-row:hover{background:var(--soft)}.stream-time,.stream-topic{color:var(--muted)}.stream-type{color:var(--green)}.stream-crc{color:var(--cyan)}.stream-seq{text-align:right;color:#a7bbb5}footer{height:66px;border-top:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;padding:0 clamp(18px,4vw,58px);color:#40554f;font:9px var(--mono);letter-spacing:.12em}.toast{position:fixed;right:24px;bottom:24px;z-index:99;padding:11px 16px;border-radius:8px;background:#def8ed;color:#0c2a20;font-weight:600;font-size:11px;transform:translateY(20px);opacity:0;pointer-events:none;transition:.25s}.toast.show{transform:none;opacity:1}.toast.error{background:#ffd4cf;color:#421814}body.light{--bg:#edf3f0;--surface:#f8fbfa;--surface2:#fff;--line:#cad9d3;--soft:#e2ece8;--text:#10211c;--muted:#657b74;--green:#128b5b;--cyan:#167f78;--danger:#b43b31;background:var(--bg)}.light .topbar{background:rgba(237,243,240,.9)}.light .telemetry-card,.light .data-field,.light .recent-list,.light .loading-card{background:#f8fbfa}.light .type-icon{background:#e4f2eb}.light .metrics article{background:#f8fbfa}
@keyframes pulse{50%{opacity:.45;box-shadow:0 0 0 9px rgba(88,237,170,0)}}@keyframes spin{to{transform:rotate(360deg)}}
@media(max-width:950px){.topbar{grid-template-columns:1fr auto}.live-state{display:none}.intro{grid-template-columns:1fr;gap:24px;padding:55px 0}.intro-meta{justify-self:start}.metrics{grid-template-columns:repeat(2,1fr)}.live-grid{grid-template-columns:1fr}.card-fields{grid-template-columns:repeat(2,minmax(0,1fr))}.pv-row{grid-template-columns:88px repeat(4,minmax(85px,1fr))}.pv-details{grid-template-columns:repeat(2,1fr)}.fault-list{grid-template-columns:repeat(2,1fr)}.bms-cells{grid-template-columns:repeat(6,1fr)}.stream-row{grid-template-columns:75px 1fr .7fr 70px}.stream-topic{display:none}}
@media(max-width:560px){.brand small,.top-actions>span{display:none}.topbar{padding:0 15px}.intro h1{font-size:42px}.metrics{grid-template-columns:1fr 1fr}.metrics article{min-height:102px;padding:14px}.metrics strong{font-size:23px}.card-fields{grid-template-columns:1fr 1fr}.data-field{min-height:72px;padding:10px}.pv-overview{overflow-x:auto}.pv-overview>.card-head,.pv-matrix,.pv-details{min-width:620px}.pv-details{grid-template-columns:repeat(4,1fr)}.fault-list{grid-template-columns:1fr}.bms-stats{grid-template-columns:repeat(2,1fr)}.bms-cells{grid-template-columns:repeat(3,1fr)}.stream-row{grid-template-columns:65px 1fr 60px;padding:0 10px;gap:8px}.stream-crc{display:none}footer span:last-child{display:none}}
.debug-section{margin:0 0 38px}.operator-bar{display:flex;align-items:end;gap:10px;padding:14px;border:1px solid var(--line);border-radius:12px 12px 0 0;background:var(--surface2)}.operator-bar label{flex:1}.operator-bar label span{display:block;color:var(--muted);font-size:9px;margin-bottom:6px}.operator-bar input{width:100%;height:40px;border:1px solid var(--line);border-radius:8px;background:var(--bg);color:var(--text);padding:0 12px;font:12px var(--mono);outline:none}.operator-bar input:focus{border-color:var(--green)}.action{min-height:40px;border:1px solid #2e7c5d;border-radius:8px;padding:0 14px;background:#153e30;color:var(--green);font-weight:600;font-size:11px;cursor:pointer}.action:hover:not(:disabled){filter:brightness(1.18)}.action:disabled{opacity:.4;cursor:not-allowed}.action.secondary{background:var(--surface);border-color:var(--line);color:var(--text)}.action.danger{border-color:#8c4c43;background:#47241f;color:#ffaaa1}.operation-state{min-width:155px;height:40px;display:flex;align-items:center;padding:0 12px;border:1px solid var(--line);border-radius:8px;color:var(--muted);font-size:10px}.operation-state.success{color:var(--green);border-color:#285642}.operation-state.error{color:var(--danger);border-color:#613b36}.debug-grid{display:grid;grid-template-columns:.8fr 1.2fr;gap:1px;background:var(--line);border:1px solid var(--line);border-top:0;border-radius:0 0 12px 12px;overflow:hidden}.debug-card{padding:20px;background:var(--surface)}.debug-card header{display:flex;justify-content:space-between;align-items:start}.debug-card h3{margin:0;font-size:18px}.debug-card header>span{color:var(--green);font:9px var(--mono)}.debug-card>p{color:var(--muted);font-size:11px}.load-controls{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:18px 0 12px}.load-controls>div{display:grid;gap:8px;padding:14px;border:1px solid var(--line);border-radius:9px;background:var(--soft)}.load-controls span{color:var(--muted);font:10px var(--mono)}.load-actions{display:grid;grid-template-columns:1fr 1fr;gap:7px}.load-actions .action{padding:0 8px}.action.load-off{border-color:#7f524b;background:#3d2926;color:#ffaaa1}.debug-card>small{color:var(--muted);font-size:9px}.ota-warning{display:flex;gap:10px;padding:11px 13px;margin:15px 0;border:1px solid #70502d;border-radius:8px;background:rgba(228,177,90,.07)}.ota-warning b{color:#e4b15a;font-size:10px;white-space:nowrap}.ota-warning span{color:#af9b79;font-size:10px}.ota-warning.ready{border-color:#285642;background:rgba(88,237,170,.06)}.ota-warning.ready b{color:var(--green)}.file-picker{display:block;padding:16px;border:1px dashed #36584e;border-radius:9px;cursor:pointer}.file-picker input{display:none}.file-picker strong,.file-picker small{display:block}.file-picker small{color:var(--muted);font-size:9px}.ota-meta{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;margin:10px 0}.ota-meta span{padding:8px 10px;border:1px solid var(--line);border-radius:6px;color:var(--muted);font:9px var(--mono)}.progress{height:5px;border-radius:5px;background:var(--soft);overflow:hidden}.progress i{display:block;width:0;height:100%;background:var(--green);transition:.2s}.ota-actions{display:flex;align-items:center;gap:12px;margin-top:12px}.ota-actions span{color:var(--muted);font-size:10px}@media(max-width:950px){.debug-grid{grid-template-columns:1fr}.operator-bar{align-items:stretch;flex-wrap:wrap}.operator-bar label{flex-basis:100%}}@media(max-width:560px){.load-controls,.ota-meta{grid-template-columns:1fr}.operation-state{width:100%}.debug-card{padding:15px}.ota-warning{display:block}}
.timer-card{grid-column:1/-1}.timer-table{display:grid;gap:8px;margin:16px 0}.timer-row{display:grid;grid-template-columns:72px 72px 110px minmax(320px,1fr) 90px 72px;gap:8px;align-items:center;padding:9px;border:1px solid var(--line);border-radius:8px;background:var(--soft)}.timer-row strong{font-size:10px}.timer-row input[type=time],.timer-row select{height:34px;border:1px solid var(--line);border-radius:6px;background:var(--bg);color:var(--text);padding:0 8px}.timer-days{display:flex;flex-wrap:wrap;gap:5px}.timer-days label{display:flex;align-items:center;gap:2px;color:var(--muted);font-size:9px}.timer-enable{display:flex;align-items:center;gap:5px;font-size:9px;color:var(--muted)}.timer-row .action{min-height:34px}.timer-row.busy{opacity:.55}@media(max-width:950px){.timer-row{grid-template-columns:65px 70px 105px 1fr}.timer-days{grid-column:1/-1}.timer-row .action{grid-column:4}}@media(max-width:560px){.timer-row{grid-template-columns:1fr 1fr}.timer-days,.timer-row .action{grid-column:1/-1}}
.series-card{grid-column:1/-1}.series-control{display:grid;grid-template-columns:minmax(210px,1fr) minmax(150px,220px) 120px;gap:10px;align-items:end;margin:16px 0 12px}.series-control>div,.series-control label{display:grid;gap:6px}.series-control span{color:var(--muted);font-size:9px}.series-control strong{min-height:40px;display:flex;align-items:center;padding:0 12px;border:1px solid var(--line);border-radius:8px;background:var(--soft);font:12px var(--mono)}.series-control select{height:40px;border:1px solid var(--line);border-radius:8px;background:var(--bg);color:var(--text);padding:0 10px;font:12px var(--mono)}@media(max-width:700px){.series-control{grid-template-columns:1fr 1fr}.series-control>div{grid-column:1/-1}}@media(max-width:480px){.series-control{grid-template-columns:1fr}}
