*{box-sizing:border-box}:root{--navy:#102a43;--blue:#0d70d5;--line:#d9e2ec;--muted:#627d98;--bg:#f5f8fb;--bad:#b42318}body{background:var(--bg);color:#172b4d;margin:0;font:14px Inter,Microsoft YaHei,Arial,sans-serif}button,input,select{font:inherit}button{cursor:pointer}.app{min-height:100vh}.topbar{background:var(--navy);color:#fff;align-items:center;gap:22px;height:64px;padding:0 28px;display:flex}.brand{font-size:20px;font-weight:800}.brand small{color:#a9c5e5;letter-spacing:1.3px;margin-top:2px;font-size:10px;display:block}.grow{flex:1}.pill{border:1px solid #ffffff38;border-radius:20px;padding:7px 11px;font-size:12px}.online{color:#a7f3d0}.offline{color:#cbd5e1}.language{color:#fff;background:0 0;border:1px solid #fff5;border-radius:5px;padding:7px 10px}.shell{grid-template-columns:228px 1fr;min-height:calc(100vh - 64px);display:grid}.sidebar{border-right:1px solid var(--line);background:#fff;padding:18px 10px}.nav-item{text-align:left;color:#486581;background:0 0;border:0;border-radius:6px;width:100%;margin:2px 0;padding:12px 15px;font-weight:600}.nav-item:hover,.nav-item.active{color:var(--blue);background:#eaf4ff}.nav-item span{margin-right:11px}.main{width:100%;max-width:1550px;margin:auto;padding:28px}.page-head{justify-content:space-between;align-items:flex-start;margin-bottom:20px;display:flex}.page-head h1{margin:0 0 5px;font-size:24px}.page-head p{color:var(--muted);margin:0}.grid{gap:18px;display:grid}.two{grid-template-columns:repeat(2,minmax(0,1fr))}.three{grid-template-columns:repeat(3,minmax(0,1fr))}.metrics{grid-template-columns:repeat(6,minmax(0,1fr))}.card{border:1px solid var(--line);background:#fff;border-radius:10px;padding:20px;box-shadow:0 1px 2px #102a4308}.card h2{margin:0 0 16px;font-size:16px}.metric{padding:17px}.metric .label{color:var(--muted);font-size:12px}.metric strong{color:#102a43;margin-top:7px;font-size:25px;display:block}.metric em{color:var(--muted);font-size:12px;font-style:normal}.form{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px 16px;display:grid}.field{color:#486581;gap:6px;font-size:12px;font-weight:600;display:grid}.field input,.field select{color:#243b53;background:#fff;border:1px solid #bcccdc;border-radius:5px;padding:9px 10px}.sample-control{align-items:center;gap:8px;display:flex}.sample-control select{flex:1;min-width:0}.sample-control input{width:92px}.actions{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.btn{color:#fff;background:#0d70d5;border:1px solid #0d70d5;border-radius:5px;padding:9px 14px;font-weight:700}.btn.secondary{color:#0d70d5;background:#fff}.btn.danger{background:#b42318;border-color:#b42318}.btn:disabled{opacity:.5;cursor:not-allowed}.hint{color:var(--muted);font-size:12px}.notice{color:#9a3412;background:#fff7ed;border-left:4px solid #fb923c;border-radius:4px;margin:15px 0;padding:12px 14px}.status{align-items:center;gap:7px;font-weight:700;display:inline-flex}.dot{background:#94a3b8;border-radius:50%;width:8px;height:8px}.dot.up{background:#22c55e}.readout{border-collapse:collapse;width:100%}.readout td{border-bottom:1px solid #eef2f7;padding:10px 2px}.readout td:last-child{text-align:right;color:#102a43;font-weight:700}.terminal{color:#b8e3ff;white-space:pre-wrap;background:#0b172a;border-radius:7px;min-height:190px;max-height:310px;padding:13px;font:12px ui-monospace,Consolas,monospace;overflow:auto}.terminal .error{color:#fca5a5}.terminal .sent{color:#fde68a}.faults{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;display:grid}.fault{color:#829ab1;background:#f7fafc;border-radius:5px;padding:9px;font-size:12px}.fault.on{color:var(--bad);background:#fff1f2;font-weight:700}.progress{background:#e5edf5;border-radius:8px;height:9px;overflow:hidden}.progress div{background:#0d70d5;height:100%;transition:width .2s}.file{background:#fbfdff;border:1px dashed #9fb3c8;border-radius:7px;padding:15px}@media (width<=1000px){.shell{grid-template-columns:1fr}.sidebar{padding:8px;display:flex;overflow:auto}.nav-item{white-space:nowrap;width:auto}.main{padding:18px}.metrics{grid-template-columns:repeat(3,1fr)}.two,.three{grid-template-columns:1fr}}@media (width<=560px){.topbar{padding:0 14px}.topbar .pill{display:none}.metrics{grid-template-columns:repeat(2,1fr)}.form{grid-template-columns:1fr}.main{padding:14px}.page-head{display:block}.page-head .actions{margin-top:13px}.sample-control input{width:110px}}@media (width<=1200px){.monitor-metrics{grid-template-columns:repeat(4,minmax(0,1fr));overflow:visible}.monitor-metrics .metric{min-width:0}.fault-list{min-width:760px}}@media (width<=700px){.monitor-metrics{grid-template-columns:repeat(2,minmax(0,1fr))}.charge-switch{flex-direction:column;align-items:flex-start}.fault-strip{flex-direction:column;align-items:flex-start;gap:12px}.fault-code{border:0;padding:0}.fault-list{min-width:760px}.config-options{grid-column:1/-1}}@media (width<=1200px){.monitor-metrics{grid-template-columns:repeat(4,minmax(0,1fr));overflow:visible}.monitor-metrics .metric{min-width:0}.fault-list{min-width:760px}}@media (width<=700px){.monitor-metrics{grid-template-columns:repeat(2,minmax(0,1fr))}.charge-switch{flex-direction:column;align-items:flex-start}.fault-strip{flex-direction:column;align-items:flex-start;gap:12px}.fault-code{border:0;padding:0}.fault-list{min-width:760px}.config-options{grid-column:1/-1}}.monitor-metrics{grid-template-columns:repeat(8,minmax(132px,1fr));padding-bottom:2px;overflow-x:auto}.monitor-metrics .metric{min-width:132px}.fault-strip{align-items:center;gap:22px;padding:14px 18px;display:flex;overflow-x:auto}.fault-code{border-right:1px solid var(--line);gap:5px;min-width:136px;padding-right:16px;display:grid}.fault-code b{color:#102a43;font-size:15px}.fault-code code{color:#486581;font:12px ui-monospace,Consolas,monospace}.fault-list{flex:1;justify-content:space-between;align-items:flex-start;gap:17px;min-width:900px;display:flex}.fault-item{white-space:nowrap;color:#486581;flex-direction:column;align-items:center;gap:7px;font-size:12px;display:flex}.fault-lamp{background:#28a745;border-radius:50%;width:17px;height:17px;display:block;box-shadow:inset 0 1px 3px #0004,0 0 0 2px #d7e5d9}.charge-switch{justify-content:space-between;align-items:center;gap:16px;display:flex}.charge-switch h2{margin-bottom:6px}.charge-switch .hint{margin:0}.config-form select,.config-form input{min-height:44px;font-size:15px}.config-form select{cursor:pointer}.config-options{flex-direction:column;justify-content:end;gap:12px;padding-bottom:1px;display:flex}.check-row{color:#243b53;align-items:center;gap:8px;min-height:20px;font-size:14px;display:flex}.check-row input{width:16px;height:16px;margin:0}.device-actions{border-top:1px solid var(--line);margin-top:20px;padding-top:20px}.device-actions h2{margin-bottom:8px}.charge-curve{height:100%}.charge-curve table{border-collapse:collapse;width:100%;font-size:13px}.charge-curve th,.charge-curve td{text-align:right;border-bottom:1px solid #e6edf5;padding:8px 6px}.charge-curve th:first-child,.charge-curve td:first-child{text-align:left}.charge-curve th{color:#486581;background:#f8fbfe;font-weight:700}.write-success-toast{z-index:1000;color:#fff;background:#102a43;border-radius:10px;padding:22px 34px;font-size:18px;font-weight:700;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:0 18px 45px #102a4366}.metric strong{white-space:nowrap;font-size:23px}.calibration-reading{background:#f4faff;border:1px solid #b9d8f5;border-radius:7px;margin:0 0 12px;padding:12px 14px}.calibration-reading strong{color:#0d70d5;font-size:26px}.calibration-input{color:#243b53;border:1px solid #bcccdc;border-radius:5px;width:96px;padding:8px}@media (width<=1200px){.monitor-metrics{grid-template-columns:repeat(4,minmax(0,1fr));overflow:visible}.monitor-metrics .metric{min-width:0}.fault-list{min-width:760px}}@media (width<=700px){.monitor-metrics{grid-template-columns:repeat(2,minmax(0,1fr))}.charge-switch{flex-direction:column;align-items:flex-start}.fault-strip{flex-direction:column;align-items:flex-start;gap:12px}.fault-code{border:0;padding:0}.fault-list{min-width:760px}.config-options{grid-column:1/-1}}.calibration-reading{grid-column:2;margin:0}.calibration-list>.card>.actions{grid-column:1}.calibration-steps .actions{justify-content:flex-start}.calibration-steps .btn{min-width:58px}@media (width<=850px){.calibration-list>.card{grid-template-columns:1fr}.calibration-reading,.calibration-list>.card>.actions,.calibration-steps{grid-column:1}.calibration-reading strong{text-align:left}}.calibration-list{grid-template-columns:1fr!important}.calibration-list>.card{grid-template-columns:minmax(180px,220px) minmax(150px,180px) auto!important;align-items:center!important;gap:12px 18px!important;display:grid!important}.calibration-list>.card h2{grid-column:1/-1!important;margin:0!important}.calibration-reading{grid-column:1!important;justify-content:center!important;align-self:stretch!important;align-items:center!important;margin:0!important;display:flex!important}.calibration-reading strong{text-align:center!important;margin:0!important;font-size:42px!important}.calibration-list>.card>.actions{flex-direction:column!important;grid-column:2!important;align-items:stretch!important;display:flex!important}.calibration-list>.card>.actions .btn,.calibration-input{width:100%!important}.calibration-steps{grid-column:3!important;gap:9px!important;display:grid!important}.calibration-steps .actions{grid-template-columns:repeat(4,minmax(52px,1fr))!important;gap:8px!important;display:grid!important}.calibration-steps .btn{width:100%!important;min-width:0!important}@media (width<=850px){.calibration-list>.card{grid-template-columns:1fr!important}.calibration-reading,.calibration-list>.card>.actions,.calibration-steps{grid-column:1!important}.calibration-steps .actions{grid-template-columns:repeat(4,minmax(45px,1fr))!important}}.monitor-status-row{grid-template-columns:minmax(170px,1fr) minmax(360px,2fr) minmax(170px,1fr);align-items:stretch;gap:18px;display:grid}.monitor-status-row>.metric,.monitor-status-row>.charge-switch{margin:0}.monitor-status-row>.metric{border:1px solid var(--line);background:#fff;border-radius:10px;box-shadow:0 1px 2px #102a4308}.monitor-status-row .charge-switch{padding:16px 20px}@media (width<=850px){.monitor-status-row{grid-template-columns:1fr}.monitor-status-row .charge-switch{align-items:flex-start}}.monitor-status-row{grid-template-columns:minmax(165px,.8fr) minmax(280px,1.25fr) minmax(280px,1.7fr)!important}.fault-lamp,.charge-lamps i{position:relative;overflow:hidden;background:radial-gradient(circle at 35% 28%,#e8ffe8 0 8%,#49d45b 16%,#15913a 54%,#075b27 100%)!important;box-shadow:inset 0 -2px 4px #003f1f,inset 0 2px 3px #fff9,0 0 0 2px #d7e5d9,0 2px 5px #0004!important}.fault-lamp.alert,.charge-lamps i.on{background:radial-gradient(circle at 35% 28%,#ffe7e7 0 8%,#ff6565 16%,#e21b1b 54%,#8d0000 100%)!important;box-shadow:inset 0 -2px 4px #650000,inset 0 2px 3px #fff9,0 0 0 2px #ffd6d6,0 2px 5px #0004!important}.fault-lamp:after,.charge-lamps i:after{content:"";filter:blur(.5px);background:#fff9;border-radius:50%;width:36%;height:21%;position:absolute;top:14%;left:23%}.monitor-metrics .metric{padding:20px!important}.charge-indicator{flex-direction:column!important;justify-content:center!important;display:flex!important}.charge-indicator .label{color:#243b53;font-size:16px!important;font-weight:700!important}.charge-lamps{align-items:center;gap:17px;margin-top:13px;display:flex}.charge-lamps i{border-radius:50%;width:24px;height:24px;display:block;background:radial-gradient(circle at 35% 28%,#f2f4f7 0 8%,#9aa5b1 18%,#65758b 55%,#344150 100%)!important;box-shadow:inset 0 -2px 4px #263340,inset 0 2px 3px #fff9,0 0 0 2px #d9e2ec,0 2px 5px #0004!important}.fault-code b{font-size:21px!important}.fault-code code{font-size:17px!important}.fault-item{font-size:16px!important}.fault-lamp{background:radial-gradient(circle at 36% 28%,#eaffea 0 5%,#3ac957 15%,#138438 56%,#075424 100%)!important;width:24px!important;height:24px!important;box-shadow:inset 0 -2px 4px #003f1f,inset 0 1px 2px #fff8,0 0 0 2px #d7e5d9,0 1px 3px #0003!important}.fault-lamp.alert{background:radial-gradient(circle at 36% 28%,#ffeaea 0 5%,#f24b4b 15%,#d91515 56%,#850000 100%)!important;box-shadow:inset 0 -2px 4px #650000,inset 0 1px 2px #fff8,0 0 0 2px #ffd6d6,0 1px 3px #0003!important}.charge-lamps i{background:radial-gradient(circle at 36% 28%,#f4f6f8 0 5%,#949fac 16%,#667586 57%,#344150 100%)!important;box-shadow:inset 0 -2px 4px #263340,inset 0 1px 2px #fff8,0 0 0 2px #d9e2ec,0 1px 3px #0003!important}.charge-lamps i.on{background:radial-gradient(circle at 36% 28%,#ffeaea 0 5%,#f24b4b 15%,#d91515 56%,#850000 100%)!important;box-shadow:inset 0 -2px 4px #650000,inset 0 1px 2px #fff8,0 0 0 2px #ffd6d6,0 1px 3px #0003!important}.fault-lamp:after,.charge-lamps i:after{opacity:.55!important;width:28%!important;height:15%!important;top:18%!important;left:27%!important}.charge-indicator{flex-direction:row!important;align-items:center!important}.charge-indicator .label{white-space:nowrap}.charge-lamps{gap:22px!important;margin:0 0 0 28px!important}.fault-item{gap:10px!important}.charge-indicator{justify-content:flex-start!important}.charge-lamps{gap:30px!important;margin-left:34px!important}.monitor-metrics{grid-template-columns:repeat(5,minmax(0,1fr))!important;overflow:visible!important}.monitor-metrics .metric{min-width:0!important;padding:22px!important}.monitor-metrics .metric .label{font-size:16px!important}.monitor-metrics .metric strong{font-size:34px!important}.monitor-metrics .metric em{font-size:14px!important}@media (width<=1200px){.monitor-metrics{grid-template-columns:repeat(5,minmax(0,1fr))!important}}@media (width<=850px){.monitor-metrics{grid-template-columns:repeat(2,minmax(0,1fr))!important}}.upgrade-status{resize:vertical;color:#173b63;box-sizing:border-box;background:#f8fbff;border:1px solid #9db9d9;border-radius:6px;width:100%;min-height:220px;margin-top:16px;padding:12px;font:14px/1.6 Consolas,Microsoft YaHei,monospace;display:block}.xml-file-name{box-sizing:border-box;color:#243b53;background:#f8fbff;border:1px solid #b9cbe0;border-radius:6px;width:100%;min-height:42px;margin-top:12px;padding:9px 11px;display:block}.xml-file-name::placeholder{color:#829ab1}.charge-curve input[readonly]{cursor:default;background:#f8fbff}.curve-head{justify-content:space-between;align-items:center;margin-bottom:12px;display:flex}.curve-head h2{margin:0}.curve-tools{align-items:center;gap:14px;display:flex}.curve-legend{color:#486581;align-items:center;gap:12px;font-size:13px;display:flex}.curve-legend label,.curve-legend span{align-items:center;gap:5px;display:inline-flex}.curve-legend label{cursor:pointer}.curve-legend input{accent-color:#1976d2;width:14px;height:14px;margin:0}.curve-legend i{border-top:3px solid;border-radius:2px;width:20px;display:inline-block}.curve-legend i.current{border-color:#e33434}.curve-legend i.voltage{border-color:#1d72c9}.curve-toggle{padding:6px 10px;font-size:12px}.curve-table-wrap{overflow-x:auto}.curve-table{border-collapse:collapse;width:100%;min-width:700px}.curve-table th,.curve-table td{text-align:center;white-space:nowrap;border-bottom:1px solid #e4edf5;padding:8px 10px}.curve-table th{color:#486581;font-size:12px}.curve-table-input{text-align:center;color:#243b53;background:#fff;border:1px solid #bcccdc;border-radius:4px;width:76px;padding:5px 6px}.curve-table-input[readonly]{background:0 0;border-color:#0000}.curve-chart{width:100%;min-width:500px;max-width:760px;margin:0 auto;position:relative;overflow:hidden}.curve-chart svg{touch-action:none;-webkit-user-select:none;user-select:none;width:100%;height:auto;min-height:310px;display:block}.axis{stroke:#637b91;stroke-width:1.4px}.current-axis{stroke:#d92929}.voltage-axis{stroke:#2374c6}.grid-line{stroke:#b6c2ce;stroke-width:1px;stroke-dasharray:5 5}.current-line{stroke:#e33434;stroke-width:3px;fill:none}.current-dash{stroke:#9aa7b4;stroke-width:1.5px;stroke-dasharray:5 4}.voltage-line{stroke:#1d72c9;stroke-width:3px;fill:none}.drag-handle{fill:#fff;stroke:#e33434;stroke-width:3px;cursor:ns-resize}.turn-handle{fill:#fff5f5;stroke:#e33434;stroke-width:3px;cursor:ns-resize}.axis-label{fill:#526b82;font-size:13px}.current-text{fill:#d92929}.voltage-text{fill:#1d72c9}.stage-label{fill:#425c73;font-size:13px}.open-loop-message{fill:#c62828;letter-spacing:3px;font-size:29px;font-weight:800}.curve-value{z-index:2;color:#a61b1b;text-align:center;background:#fff;border:1px solid #e33434;border-radius:4px;width:52px;padding:2px 3px;font-size:11px;position:absolute;transform:translate(-50%,-135%)}@media (width<=700px){.curve-head{flex-direction:column;align-items:flex-start;gap:8px}.curve-tools{justify-content:space-between;width:100%}.curve-chart,.charge-curve{overflow-x:auto}}
