
:root{color-scheme:light;--ink:#18252d;--muted:#71808a;--line:#dbe5e8;--panel:#fff;--canvas:#f3f7f8;--nav:#103d46;--nav2:#0b3037;--accent:#087f70;--good:#16824e;--warn:#bb7200;--bad:#bd3547;--blue:#286b9f}*{box-sizing:border-box}body{margin:0;background:var(--canvas);color:var(--ink);font:14px Arial,'Microsoft YaHei',sans-serif}button,input,select{font:inherit}button{cursor:pointer}header{background:var(--nav);color:#fff}.bar{max-width:1500px;margin:auto;padding:18px 28px 14px;display:flex;justify-content:space-between;align-items:center;gap:20px}.brand b{font-size:22px;letter-spacing:0}.brand span{display:block;color:#b8d2d3;font-size:12px;margin-top:6px}.health{font-size:12px;color:#d9ebea;text-align:right}.tabs{max-width:1500px;margin:auto;padding:0 28px;display:flex;gap:8px;position:relative;z-index:1000;pointer-events:auto}.tabs button{position:relative;z-index:1;border:0;background:transparent;color:#c9dedd;padding:12px 22px;border-radius:6px 6px 0 0}.tabs button.active{background:var(--canvas);color:var(--nav);font-weight:bold}.view{max-width:1500px;margin:auto;padding:24px 28px 44px}.hidden{display:none!important}.monitor-layout{display:grid;grid-template-columns:190px minmax(0,1fr);gap:20px}.side{align-self:start;background:var(--nav2);padding:10px;border-radius:8px;position:sticky;top:16px}.side-title{color:#9ec3c4;padding:12px 13px 8px;font-size:12px}.side button{display:block;width:100%;border:0;text-align:left;background:transparent;color:#d5e7e7;padding:12px 13px;border-radius:5px}.side button.active{background:#1b6c70;color:#fff;font-weight:bold}.overview{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:20px}.summary{background:var(--panel);border:1px solid var(--line);border-radius:7px;padding:15px}.summary span{display:block;color:var(--muted);font-size:12px}.summary b{display:block;font-size:22px;margin-top:7px}.section-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:0 0 13px}.section-head h2{margin:0;font-size:19px}.section-head span,.note{color:var(--muted);font-size:12px}.cabinet-grid,.card-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.cabinet{background:var(--panel);border:1px solid var(--line);border-radius:8px;overflow:hidden}.cabinet h3{margin:0;padding:14px 16px;background:#eaf4f2;color:#15514d;font-size:16px}.device-list{display:grid;grid-template-columns:1fr 1fr;gap:11px;padding:12px}.device,.meter{background:var(--panel);border:1px solid var(--line);border-radius:7px;padding:14px;min-width:0}.device[data-detail-device]{cursor:pointer}.device[data-detail-device]:hover{border-color:var(--accent);box-shadow:0 2px 10px rgba(8,127,112,.12)}.point-modal{width:min(1200px,calc(100vw - 32px));max-height:calc(100vh - 32px);border:0;border-radius:8px;padding:0;box-shadow:0 20px 60px rgba(0,0,0,.25)}.point-modal::backdrop{background:rgba(10,30,35,.48)}.modal-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:16px 18px;border-bottom:1px solid var(--line);background:#edf5f3}.modal-head h2{margin:0;font-size:18px;color:#15514d}.modal-close{border:0;border-radius:5px;background:#46636b;color:#fff;padding:7px 11px}.modal-body{padding:16px;overflow:auto;max-height:calc(100vh - 115px)}.device-top,.meter-top{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:11px}.device-top b,.meter h3{font-size:15px}.badge{font-size:11px;padding:4px 7px;border-radius:4px;white-space:nowrap;background:#edf2f3;color:#65747c}.badge.good{background:#e5f5eb;color:var(--good)}.badge.warn{background:#fff2d7;color:var(--warn)}.badge.bad{background:#fee8eb;color:var(--bad)}.metrics{display:grid;grid-template-columns:1fr 1fr;gap:8px 14px}.metric{min-width:0;border-bottom:1px solid #eef2f3;padding-bottom:6px}.metric span{display:block;color:var(--muted);font-size:11px}.metric strong{display:block;margin-top:4px;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.metric.emphasis strong{color:var(--accent);font-size:15px}.subhead{font-size:13px;font-weight:bold;color:#255d5b;padding:14px 0 8px;border-bottom:1px solid var(--line);margin-bottom:10px}.bms-card{grid-column:span 2}.bms-main{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px}.bms-main .metric{background:#f7faf9;border:0;padding:9px}.cluster-table,.tou-table{border-collapse:collapse;width:100%;background:#fff;font-size:12px}.cluster-table th,.cluster-table td,.tou-table th,.tou-table td{border:1px solid var(--line);padding:8px;text-align:right;white-space:nowrap}.cluster-table th,.tou-table th{background:#edf5f3;color:#17524d}.cluster-table th:first-child,.cluster-table td:first-child,.tou-table th:first-child,.tou-table td:first-child{text-align:left}.card-grid.single{grid-template-columns:1fr}.meters-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.meter-values{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}.meter-value{background:#f7faf9;border-radius:5px;padding:9px;min-width:0}.meter-value span{display:block;color:var(--muted);font-size:11px}.meter-value b{display:block;margin-top:5px;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.meter-wide{grid-column:span 2}.toolbar,.report-toolbar{display:flex;gap:10px;align-items:end;flex-wrap:wrap;background:var(--panel);border:1px solid var(--line);border-radius:7px;padding:13px;margin-bottom:16px}.field{display:grid;gap:5px;color:var(--muted);font-size:12px}.field input,.field select{border:1px solid #b9c8cf;border-radius:5px;padding:8px;background:#fff;color:var(--ink)}.action{border:0;border-radius:5px;background:var(--accent);color:#fff;padding:9px 13px}.action.secondary{background:#46636b}.cell-grid{display:grid;grid-template-columns:repeat(20,minmax(0,1fr));gap:5px;background:#fff;border:1px solid var(--line);border-radius:7px;padding:12px}.energy-cell-grid{display:grid;grid-template-columns:repeat(30,minmax(0,1fr));gap:4px;background:#fff;border:1px solid var(--line);border-radius:7px;padding:12px;max-height:510px;overflow:auto}.energy-cell{min-width:0;border:1px solid #d7e1e2;border-radius:4px;padding:5px 2px;background:#f7faf9;color:#496069;font-size:10px;text-align:center}.energy-cell.has-data{background:#eaf7ef;border-color:#a9d9ba;color:#166a42}.energy-cell.selected{outline:2px solid var(--accent);outline-offset:-2px;font-weight:bold}.energy-cell.missing{color:#9aa8ae}.energy-analysis-layout{display:grid;grid-template-columns:minmax(0,1fr) minmax(360px,.8fr);gap:16px}.energy-metric-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin:13px 0}.energy-metric{background:#f7faf9;border:1px solid var(--line);border-radius:6px;padding:10px}.energy-metric span{display:block;color:var(--muted);font-size:11px}.energy-metric b{display:block;margin-top:5px;font-size:16px;color:#15514d}.energy-vsoc svg{display:block;width:100%;height:auto;min-height:300px}@media(max-width:1050px){.energy-analysis-layout{grid-template-columns:1fr}.energy-cell-grid{grid-template-columns:repeat(20,minmax(0,1fr))}}@media(max-width:700px){.energy-cell-grid{grid-template-columns:repeat(10,minmax(0,1fr))}.energy-analysis-layout{grid-template-columns:1fr}.energy-vsoc svg{min-height:250px}}.cell{min-width:0;min-height:52px;border:1px solid #d7e1e2;border-radius:4px;padding:5px;background:#f7faf9;text-align:center}.cell span{display:block;color:var(--muted);font-size:10px}.cell b{display:block;margin-top:5px;font-size:12px;font-weight:normal;white-space:nowrap}.cell.low{background:#e6f1ff;border-color:#98c7f2;color:#0d4d89}.cell.high{background:#fee7e7;border-color:#edaaaa;color:#982537}.cell.mid{background:#eaf7ef;border-color:#a9d9ba;color:#166a42}.cell.missing{background:#f1f4f5;color:#7d8990}.report-summary{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin:16px 0}.report-table{width:100%;border-collapse:collapse;background:#fff;border:1px solid var(--line)}.report-table th,.report-table td{padding:10px;border:1px solid var(--line);text-align:right;white-space:nowrap}.report-table th{background:#edf5f3;color:#164d48}.report-table td:first-child,.report-table th:first-child{text-align:left}.alarm-list{display:grid;gap:10px}.alarm{background:#fff;border:1px solid var(--line);border-left:4px solid var(--bad);border-radius:6px;padding:13px}.alarm.warn{border-left-color:var(--warn)}.alarm b{display:block;margin-bottom:5px}.alarm span{font-size:12px;color:var(--muted)}.point-details{margin-top:12px;border-top:1px solid var(--line);padding-top:10px}.point-details summary{color:#15514d;font-weight:bold;cursor:pointer}.point-details table{margin-top:10px}.aircon-list{display:grid;gap:16px}.aircon-card{background:var(--panel);border:1px solid var(--line);border-radius:7px;padding:0;color:var(--ink);cursor:pointer}.aircon-card:hover{border-color:var(--accent);box-shadow:0 2px 10px rgba(8,127,112,.12)}.aircon-card .device-top{padding:14px 18px;margin:0;border-bottom:1px solid var(--line);background:#edf5f3}.aircon-card .device-top b{font-size:17px;color:#15514d}.aircon-more{color:var(--accent);font-size:13px}.aircon-card .badge{background:#edf5f3;color:#496069}.aircon-card .badge.good{background:#e5f4ea;color:var(--good)}.aircon-card .badge.warn{background:#fff3db;color:var(--warn)}.aircon-card .badge.bad{background:#fde8eb;color:var(--bad)}.aircon-body{padding:18px}.aircon-values{display:grid;grid-template-columns:repeat(3,minmax(160px,1fr));gap:16px 26px;max-width:960px}.aircon-value{font-size:15px;font-weight:bold;color:#496069;white-space:nowrap}.aircon-value strong{margin-left:9px;font-size:16px;color:var(--ink)}.aircon-divider{height:1px;background:var(--line);margin:20px 0;max-width:calc(100% - 280px)}.aircon-alerts{display:grid;grid-template-columns:repeat(4,minmax(155px,1fr));gap:12px}.aircon-alert{display:flex;justify-content:center;align-items:center;gap:8px;min-height:38px;border-radius:5px;font-size:14px;font-weight:bold}.aircon-alert::before{content:'●';font-size:12px}.aircon-alert.good{background:#e5f4ea;color:var(--good)}.aircon-alert.bad{background:#fde8eb;color:var(--bad)}.aircon-alert.unknown{background:#eef2f4;color:#71808a}.aircon-alert.warn{background:#fff3db;color:var(--warn)}.aircon-note{margin:14px 0 0;color:var(--muted);font-size:12px}.metric-chart-grid{display:grid;grid-template-columns:1fr;gap:18px;margin-top:18px}.metric-chart{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:18px;min-width:0}.metric-chart-head{display:flex;align-items:start;justify-content:space-between;gap:16px;flex-wrap:wrap}.metric-chart h3{margin:0;color:#15514d;font-size:17px}.metric-chart .note{margin:6px 0 12px;display:block}.metric-chart svg{display:block;width:100%;height:auto;min-height:390px}.chart-controls{display:flex;align-items:end;justify-content:end;gap:7px;flex-wrap:wrap}.chart-controls .field{min-width:130px}.chart-controls .field input{padding:7px}.chart-range{display:flex;overflow:hidden;border:1px solid #b9c8cf;border-radius:5px}.chart-range button{border:0;border-right:1px solid #b9c8cf;background:#fff;color:#496069;padding:7px 10px}.chart-range button:last-child{border-right:0}.chart-range button.active{background:#e4f1ee;color:#08695e;font-weight:bold}.chart-gridline{stroke:#dbe5e8;stroke-width:1}.chart-axis{stroke:#9eafb5;stroke-width:1}.chart-label{fill:#71808a;font-size:11px}.chart-value{fill:#18252d;font-size:11px;font-weight:bold}.chart-legend{display:flex;gap:14px;flex-wrap:wrap;color:#496069;font-size:12px;margin:8px 0}.chart-key{display:inline-flex;align-items:center;gap:5px}.chart-key i{width:10px;height:10px;border-radius:2px;display:inline-block}.chart-key i.line{height:3px;border-radius:4px}.chart-empty{display:grid;place-items:center;min-height:390px;color:var(--muted);background:#f7faf9;border:1px dashed var(--line);border-radius:5px;font-size:13px}@media(max-width:700px){.metric-chart{padding:14px}.metric-chart-head{display:block}.chart-controls{justify-content:start;margin-top:12px}.chart-controls .field{min-width:calc(50% - 4px)}.metric-chart svg{min-height:310px}}.settings-layout{display:grid;grid-template-columns:190px minmax(0,1fr);gap:20px}.settings-panel{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:18px}.settings-panel h2{margin:0 0 6px;font-size:19px}.settings-panel h3{margin:20px 0 10px;font-size:15px}.settings-panel .note{margin:0 0 14px}.settings-actions{display:flex;gap:10px;flex-wrap:wrap;margin:14px 0}.period-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.period-card{background:#f7faf9;border:1px solid var(--line);border-radius:6px;padding:13px}.period-card h3{margin:0 0 10px;color:#15514d}.period-row{display:grid;grid-template-columns:70px 1fr;gap:8px;align-items:center;margin:7px 0}.period-row input{width:100%;border:1px solid #b9c8cf;border-radius:5px;padding:8px;background:#fff}.tariff-grid{display:grid;grid-template-columns:repeat(4,minmax(130px,1fr));gap:12px}.tariff-grid .field input{width:100%}.settings-table{width:100%;border-collapse:collapse;font-size:13px}.settings-table th,.settings-table td{border:1px solid var(--line);padding:9px;text-align:left;vertical-align:top}.settings-table th{background:#edf5f3;color:#15514d}.settings-source{padding:10px;background:#f7faf9;border-left:3px solid var(--accent);color:#496069;font-size:12px}.settings-side{background:var(--nav2)}.energy-flow{--flow-duration:5.2s;--flow-strength:1;overflow:visible;background:radial-gradient(circle at 50% 48%,rgba(8,127,112,.1),transparent 34%),linear-gradient(145deg,#fafdfe 0%,#eef7f6 52%,#e4f1f0 100%);border:1px solid #c8dfdc;border-radius:18px;color:var(--ink);min-height:620px;box-shadow:0 18px 38px rgba(16,61,70,.12)}.energy-flow-head{border-radius:18px 18px 0 0;background:linear-gradient(90deg,#103d46,#17615f);border-bottom:1px solid rgba(8,127,112,.25);padding:20px 25px;display:flex;justify-content:space-between;gap:14px;align-items:center}.energy-flow-head h2{margin:0;font-size:21px;letter-spacing:.04em}.energy-flow-head span{color:#d4eeea;font-size:12px}.energy-flow-canvas{position:relative;overflow:visible;min-height:555px;padding:48px 7%;display:grid;grid-template-columns:1fr 1fr 1fr;grid-template-rows:1fr 1fr 1fr;gap:28px 13%;align-items:center}.energy-flow-lines{position:absolute;z-index:0;inset:36px 7%;width:86%;height:calc(100% - 72px);pointer-events:none;overflow:visible}.energy-flow-lines path{fill:none;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke}.energy-flow-lines .flow-aura{display:none}.energy-flow-lines .flow-track{stroke:rgba(8,127,112,.42);stroke-width:4.2}.energy-flow-lines{opacity:0}.energy-flow-lines.is-aligned{opacity:1}.energy-flow-lines .flow-particle{stroke:transparent;stroke-width:0}.energy-flow-lines .flow-particle.active{stroke-width:4.6;stroke-dasharray:0 22 12 106;stroke-linecap:round;animation:energy-pulse var(--flow-duration) linear infinite;will-change:stroke-dashoffset;opacity:calc(.46 + var(--flow-strength) * .54)}.energy-flow-lines .flow-link.reverse .flow-particle{animation-direction:reverse}.energy-flow-lines .flow-particle.phase-b{animation-delay:calc(var(--flow-duration) / -3)}.energy-flow-lines .flow-particle.phase-c{animation-delay:calc(var(--flow-duration) / -1.5)}@keyframes energy-pulse{from{stroke-dashoffset:0}to{stroke-dashoffset:-140}}@media(prefers-reduced-motion:reduce){.energy-flow-lines .flow-particle.active{animation:none}}.energy-node{position:relative;z-index:1;min-width:178px;max-width:270px;background:linear-gradient(145deg,#ffffff,#eaf5f3);border:1px solid #a8d2cd;border-radius:14px;padding:16px 18px;box-shadow:0 10px 24px rgba(16,61,70,.12),inset 0 1px rgba(255,255,255,.9)}.energy-node-title{display:flex;align-items:center;gap:9px;margin-bottom:10px}.energy-icon{display:grid;place-items:center;flex:0 0 42px;width:42px;height:42px;border-radius:13px;background:linear-gradient(145deg,#d8f1ed,#a9d9d2);border:1px solid #8abfb8;color:#087f70;box-shadow:inset 0 1px rgba(255,255,255,.85),0 6px 14px rgba(16,61,70,.12)}.energy-icon svg{width:32px;height:32px;fill:none;stroke:currentColor;stroke-width:1.45;stroke-linecap:round;stroke-linejoin:round}.energy-icon.grid{color:#286b9f;background:linear-gradient(145deg,#ddecf8,#b9d7ee);border-color:#9dbfdc}.energy-icon.pv{color:#a96b00;background:linear-gradient(145deg,#fff4d2,#f2d68a);border-color:#dfbd5c}.energy-icon.storage{color:#087f70;background:linear-gradient(145deg,#d5f1eb,#9ed8cc);border-color:#78bcb1}.energy-icon.flow{color:#17615f;background:linear-gradient(145deg,#d8f1ef,#a8d8d1);border-color:#85c1b9}.energy-icon.load{color:#5d4ba8;background:linear-gradient(145deg,#eae5fb,#c9bef0);border-color:#b3a7df}.energy-icon .device-fill{fill:currentColor;stroke:none;opacity:.18}.energy-icon .device-glass{fill:currentColor;stroke:none;opacity:.32}.energy-icon .device-accent{stroke:#fff;opacity:.82}.energy-node b{font-size:15px}.energy-node strong{font-size:23px;color:var(--accent);letter-spacing:.02em}.energy-node small{display:block;margin-top:7px;color:#587177;font-size:12px;line-height:1.5}.energy-node.storage{min-width:270px}.energy-storage-metrics{display:grid;grid-template-columns:1fr 1fr;gap:9px 13px;margin-top:10px}.energy-storage-metrics span{color:#587177;font-size:11px}.energy-storage-metrics i{display:block;color:var(--ink);font-size:13px;font-style:normal;margin-top:3px}.energy-node.grid{grid-column:1;grid-row:1;justify-self:center}.energy-node.pv{grid-column:3;grid-row:1;justify-self:center}.energy-node.storage{grid-column:1;grid-row:3;justify-self:center}.energy-node.flow{grid-column:2;grid-row:2;justify-self:center;min-width:210px;text-align:center;background:linear-gradient(145deg,#e8f7f3,#c9e8e1);border-color:#58a99d;box-shadow:0 12px 26px rgba(16,61,70,.16)}.energy-node.flow .energy-node-title{justify-content:center}.energy-node.flow .energy-icon{background:rgba(255,255,255,.14);border-color:rgba(255,255,255,.52);color:#fff}.energy-node.load{grid-column:3;grid-row:3;justify-self:center}.energy-flow-note{margin:0;padding:14px 24px;background:rgba(3,22,50,.86);border-top:1px solid rgba(101,199,236,.2);color:#bfd5e7;font-size:12px}.energy-flow-note b{color:#fff}.energy-flow-unavailable{color:#ffdb93}.energy-flow-summary{display:flex;gap:16px;flex-wrap:wrap}.energy-flow-summary b{color:#16e4c6}@media(max-width:700px){.energy-flow{min-height:0;border-radius:12px}.energy-flow-head{display:block}.energy-flow-head span{display:block;margin-top:7px}.energy-flow-canvas{min-height:810px;padding:30px 12%;grid-template-columns:1fr;grid-template-rows:repeat(5,auto);gap:20px}.energy-flow-canvas::before{left:50%;top:78px;bottom:78px}.energy-flow-lines{display:none}.energy-node,.energy-node.pv,.energy-node.grid,.energy-node.storage,.energy-node.flow,.energy-node.load{grid-column:1;grid-row:auto;justify-self:stretch;max-width:none}.energy-node{padding:13px 15px}}@media(max-width:1050px){.settings-layout{grid-template-columns:1fr}.period-grid{grid-template-columns:1fr}}@media(max-width:1050px){.cabinet-grid,.meters-grid{grid-template-columns:1fr}.meter-wide,.bms-card{grid-column:auto}.overview{grid-template-columns:repeat(2,1fr)}.cell-grid{grid-template-columns:repeat(12,minmax(0,1fr))}}@media(max-width:700px){.bar{padding:15px 16px}.tabs{padding:0 16px;overflow:auto}.tabs button{padding:11px 15px;white-space:nowrap}.view{padding:16px}.monitor-layout{grid-template-columns:1fr}.side{position:static;display:flex;overflow:auto;gap:4px}.side-title{display:none}.side button{white-space:nowrap;width:auto}.device-list,.bms-main{grid-template-columns:1fr}.bms-card{grid-column:auto}.metrics,.meter-values{grid-template-columns:1fr 1fr}.overview,.report-summary{grid-template-columns:1fr 1fr}.cell-grid{grid-template-columns:repeat(6,minmax(0,1fr))}.health{display:none}.report-table{font-size:11px;display:block;overflow:auto}}

.energy-flow{isolation:isolate;background:radial-gradient(circle at 50% 46%,rgba(8,127,112,.12),transparent 18%),radial-gradient(circle at 50% 50%,rgba(99,185,176,.14),transparent 47%),linear-gradient(145deg,#fbfdfd 0%,#edf6f5 48%,#e1efed 100%)}.energy-flow::before{content:'';position:absolute;z-index:-1;inset:0;opacity:.72;background-image:linear-gradient(rgba(8,127,112,.045) 1px,transparent 1px),linear-gradient(90deg,rgba(8,127,112,.045) 1px,transparent 1px);background-size:34px 34px;mask-image:radial-gradient(ellipse at center,#000 8%,transparent 78%)}.energy-flow-head{position:relative;overflow:hidden;background:linear-gradient(90deg,#103d46,#17615f)}.energy-flow-head h2{display:flex;align-items:center;gap:10px}.energy-flow-lines .flow-aura{stroke:rgba(8,127,112,.13);stroke-width:15;filter:blur(4.5px)}.energy-flow-lines .flow-track{stroke:rgba(25,125,119,.43);stroke-width:var(--flow-width,6.2)}.energy-flow-lines .flow-particle{stroke:transparent;stroke-width:0}.energy-flow-lines .flow-particle.active{stroke-width:calc(var(--flow-width,5.4) + .7);stroke-dasharray:0 18 12 108;filter:drop-shadow(0 1px 1px rgba(10,57,66,.32));opacity:1}.energy-flow-lines .flow-link.grid-to-flow .flow-particle.active,.energy-flow-lines .flow-link.flow-to-load .flow-particle.active{stroke:#007c70}.energy-flow-lines .flow-link.grid-to-storage .flow-particle.active{stroke:#1474a8}.energy-flow-lines .flow-link.pv-to-flow .flow-particle.active,.energy-flow-lines .flow-link.pv-to-load .flow-particle.active{stroke:#b47500}.energy-flow-lines .flow-link.storage-to-flow .flow-particle.active{stroke:#006b60}.energy-flow-lines .flow-link.flow-to-grid .flow-particle.active{stroke:#65429b}.energy-node{overflow:visible;backdrop-filter:blur(7px);border-color:#a8d2cd;box-shadow:0 14px 28px rgba(16,61,70,.13),inset 0 1px rgba(255,255,255,.86);transition:transform .22s ease,border-color .22s ease,box-shadow .22s ease}.energy-node:hover{transform:translateY(-2px);border-color:#5eafa4;box-shadow:0 16px 30px rgba(16,61,70,.18)}.energy-icon{position:relative;box-shadow:0 7px 14px rgba(16,61,70,.12)}.energy-icon::after{content:'';position:absolute;inset:5px;border:1px solid currentColor;border-radius:9px;opacity:.14}.energy-node strong{display:block}.energy-node.flow{overflow:visible;background:linear-gradient(145deg,#f7fcfb,#dceeea);border-color:#76bdb4;box-shadow:0 0 0 6px rgba(8,127,112,.06),0 0 28px rgba(8,127,112,.12),0 16px 30px rgba(16,61,70,.16)}.energy-flow.is-storage-charging .energy-node.storage{border-color:#589cbf;box-shadow:0 0 0 4px rgba(77,143,185,.08),0 0 24px rgba(77,143,185,.14),0 16px 30px rgba(16,61,70,.14)}.energy-flow.is-storage-discharging .energy-node.storage{border-color:#42a692;box-shadow:0 0 0 4px rgba(8,127,112,.08),0 0 24px rgba(8,127,112,.14),0 16px 30px rgba(16,61,70,.14)}.energy-flow.is-grid-exporting .energy-node.grid{border-color:#9a87c7}.energy-flow-note{position:relative;background:linear-gradient(90deg,#103d46,#17615f,#103d46);letter-spacing:.015em}.energy-flow-note::before{content:'ENERGY FLOW / LIVE';float:right;color:rgba(218,247,242,.72);font:10px Consolas,monospace;letter-spacing:.13em}@media(prefers-reduced-motion:reduce){.energy-flow-lines .flow-particle.active{animation:none}}.energy-flow{min-height:500px;border-radius:14px}.energy-flow-head{padding:14px 20px}.energy-flow-head h2{font-size:18px}.energy-flow-canvas{min-height:380px;padding:34px 8%;gap:18px 11%}.energy-flow-lines{inset:26px 8%;width:84%;height:calc(100% - 52px)}.energy-node{min-width:154px;max-width:232px;padding:12px 14px;border-radius:12px}.energy-node.storage{min-width:232px}.energy-node.flow{min-width:178px}.energy-node-title{gap:7px;margin-bottom:7px}.energy-icon{flex-basis:34px;width:34px;height:34px;border-radius:10px}.energy-icon svg{width:25px;height:25px}.energy-node strong{font-size:19px}.energy-node small{margin-top:5px;font-size:11px}.energy-storage-metrics{gap:6px 10px;margin-top:7px}.energy-flow-note{padding:10px 20px}.home-overview{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;padding:12px 20px;background:rgba(232,245,242,.86);border-bottom:1px solid #c7dfdb}.home-overview-item{min-width:0;padding:9px 11px;border:1px solid #c5ded9;border-radius:9px;background:rgba(255,255,255,.8)}.home-overview-item span{display:block;color:#59727b;font-size:11px;white-space:nowrap}.home-overview-item strong{display:block;margin-top:4px;color:#173c44;font-size:16px;white-space:nowrap}.home-overview-item strong.positive{color:#087f70}.home-overview-item strong.negative{color:#ad6c00}@media(max-width:900px){.home-overview{grid-template-columns:repeat(2,minmax(0,1fr))}.energy-flow-canvas{min-height:400px;padding-inline:5%;gap:15px 6%}}@media(max-width:700px){.energy-flow{min-height:0}.energy-flow-canvas{min-height:0;padding:18px}.home-overview{padding:10px;gap:7px}.home-overview-item{padding:8px}.home-overview-item strong{font-size:14px}}.home-running-chart{margin-top:20px;background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:18px}.home-running-chart-head{display:flex;justify-content:space-between;gap:14px;align-items:start;flex-wrap:wrap}.home-running-chart h2{margin:0;color:#15514d;font-size:19px}.home-running-chart-head .note{display:block;margin:6px 0 0}.home-running-controls{display:flex;align-items:end;gap:8px;flex-wrap:wrap}.home-running-controls button{border:1px solid #b9c8cf;border-radius:5px;background:#fff;color:#244a50;padding:8px 10px}.home-running-controls button:disabled{cursor:not-allowed;opacity:.48}.home-running-legend{display:flex;gap:14px;flex-wrap:wrap;margin:14px 0 9px;color:#496069;font-size:12px}.home-running-legend span{display:inline-flex;align-items:center;gap:5px}.home-running-legend label{display:inline-flex;align-items:center;gap:5px;cursor:pointer}.home-running-legend input{margin:0;accent-color:var(--accent)}.home-running-legend i{width:17px;height:3px;border-radius:3px;display:inline-block}.home-running-canvas-wrap{position:relative;min-height:410px;border:1px solid #e1e8ea;border-radius:7px;background:#fbfcfc;overflow:hidden}.home-running-canvas{display:block;width:100%;height:410px;touch-action:none;cursor:grab}.home-running-canvas.dragging{cursor:grabbing}.home-running-status{margin:9px 0 0;min-height:18px}.home-running-empty{position:absolute;inset:0;display:grid;place-items:center;padding:26px;text-align:center;color:var(--muted);background:rgba(251,252,252,.86)}.controller-curve-wrap{position:relative;min-height:410px;border:1px solid #e1e8ea;border-radius:7px;background:#fbfcfc;overflow:hidden}.controller-curve-canvas{display:block;width:100%;height:410px;touch-action:none;cursor:grab}.controller-curve-canvas.dragging{cursor:grabbing}.controller-curve-empty{position:absolute;inset:0;display:grid;place-items:center;padding:26px;text-align:center;color:var(--muted);background:rgba(251,252,252,.86)}@media(max-width:700px){.controller-curve-wrap,.controller-curve-canvas{min-height:320px;height:320px}}@media(max-width:700px){.home-running-chart{padding:14px}.home-running-canvas-wrap,.home-running-canvas{min-height:320px;height:320px}.home-running-controls .field{min-width:135px}}.energy-node-title{position:relative}.home-status{position:relative;display:inline-flex;align-items:center;margin-left:auto;flex:0 0 auto}.home-status i{width:10px;height:10px;border-radius:50%;background:#92a2aa;box-shadow:0 0 0 3px rgba(146,162,170,.16)}.home-status.good i{background:#38d68c;box-shadow:0 0 0 3px rgba(56,214,140,.16)}.home-status.warn i{background:#ffc15c;box-shadow:0 0 0 3px rgba(255,193,92,.16)}.home-status.bad i{background:#ff6f82;box-shadow:0 0 0 3px rgba(255,111,130,.16)}.home-status-tooltip{position:absolute;z-index:50;top:100%;right:0;width:max-content;max-width:310px;height:auto;max-height:260px;margin-top:0;padding:9px 10px;border:1px solid rgba(159,223,245,.48);border-radius:6px;background:rgba(1,20,46,.96);color:#eaf8ff;font-size:11px;font-weight:normal;line-height:1.6;box-shadow:0 10px 22px rgba(0,0,0,.28);opacity:0;visibility:hidden;transform:translateY(0);transition:opacity .16s ease}.home-status:hover .home-status-tooltip,.home-status:focus-within .home-status-tooltip{opacity:1;visibility:visible;transform:translateY(0)}.home-status-tooltip>span{display:block}.home-status-tooltip{overflow-y:scroll;overflow-x:hidden;overscroll-behavior:contain;touch-action:pan-y;scrollbar-gutter:stable;scrollbar-width:thin;scrollbar-color:rgba(140,236,255,.7) rgba(5,37,76,.72);pointer-events:auto}.home-status-tooltip::-webkit-scrollbar{width:7px}.home-status-tooltip::-webkit-scrollbar-track{background:rgba(5,37,76,.72);border-radius:8px}.home-status-tooltip::-webkit-scrollbar-thumb{background:rgba(140,236,255,.7);border-radius:8px}.home-status-tooltip::-webkit-scrollbar-thumb:hover{background:#b8f5ff}.home-status-tooltip b{color:#8cecff;font-size:12px}.home-status-tooltip span{display:block;white-space:normal}.home-status-tooltip .health-detail-alert{width:100%;border:0;border-radius:4px;padding:3px 5px;background:rgba(255,111,130,.17);color:#ffc5ce;text-align:left;cursor:pointer;font:inherit;line-height:1.55}.home-status-tooltip .health-detail-alert:hover,.home-status-tooltip .health-detail-alert:focus-visible{background:rgba(255,111,130,.34);outline:1px solid #ff9cab}.home-status:has(.home-status-tooltip:hover) .home-status-tooltip{opacity:1;visibility:visible;transform:translateY(0)}.home-status-tooltip:hover{opacity:1;visibility:visible}.energy-flow:has(.home-status:hover),.energy-flow:has(.home-status:focus-within){z-index:20;position:relative}.home-status-tooltip .home-status-table{width:100%;margin-top:8px;border-collapse:collapse;font-size:12px;line-height:1.45}.home-status-tooltip .home-status-table th,.home-status-tooltip .home-status-table td{padding:5px 7px;border-bottom:1px solid rgba(125,164,160,.28);text-align:left;white-space:nowrap}.home-status-tooltip .home-status-table th{color:#527076;font-weight:600}.home-status-tooltip .home-status-table td:first-child{min-width:82px}.home-status-tooltip .home-status-table tr.good td{color:#15725d}.home-status-tooltip .home-status-table tr.warn td{color:#9a6900}.home-status-tooltip .home-status-table tr.bad td{color:#b53b43}.home-status-tooltip .home-status-table .health-detail-alert{width:auto;padding:0;border:0;border-radius:0;background:transparent;color:inherit;font:inherit;text-align:left;text-decoration:underline;cursor:pointer}.energy-tooltip{min-height:20px;margin:8px 0;color:#15514d;font-size:12px;line-height:1.55}.energy-curve-point{cursor:crosshair}.energy-vsoc{overflow:hidden}.energy-vsoc svg{touch-action:pan-y}.energy-cell-grid{max-height:280px;overflow:auto}.action[aria-disabled='true']{pointer-events:none;opacity:.48}
.cell-period-workspace{display:grid;gap:16px}.cell-period-toolbar{margin-bottom:0}.period-selection-panel{border:1px solid var(--line);border-radius:8px;background:linear-gradient(145deg,#fbfdfd,#f2f8f7);overflow:hidden}.period-selection-head{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:13px 15px;border-bottom:1px solid var(--line);background:#edf5f3}.period-selection-title{display:flex;align-items:baseline;gap:9px;color:#15514d}.period-selection-title b{font-size:15px}.period-selection-title span{color:var(--muted);font-size:12px}.period-selection-message{margin:0;color:var(--muted);font-size:12px}.cell-picker-grid{display:grid;grid-template-columns:repeat(20,minmax(0,1fr));gap:6px;padding:14px;max-height:370px;overflow:auto}.cell-picker{position:relative;display:block;min-width:0}.cell-picker input{position:absolute;opacity:0;pointer-events:none}.cell-picker span{display:grid;place-items:center;min-height:36px;border:1px solid #d4e0e2;border-radius:5px;background:#fff;color:#496069;font-size:12px;font-variant-numeric:tabular-nums;transition:background .16s ease,border-color .16s ease,box-shadow .16s ease,color .16s ease}.cell-picker:hover span{border-color:#78aaa4;background:#f3faf8;color:#15514d}.cell-picker input:focus-visible+span{outline:2px solid #58a99d;outline-offset:2px}.cell-picker input:checked+span{border-color:var(--accent);background:linear-gradient(145deg,#0d8a7b,#07695f);color:#fff;font-weight:bold;box-shadow:0 3px 8px rgba(8,127,112,.24)}.period-result-head{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-top:2px}.period-result-head h3{margin:0!important;color:#15514d}.period-result-legend{display:flex;gap:8px;flex-wrap:wrap;color:var(--muted);font-size:12px}.period-result-legend span{display:inline-flex;align-items:center;gap:5px}.period-result-legend i{width:9px;height:9px;border-radius:50%;display:inline-block}.period-result-legend .good{background:var(--good)}.period-result-legend .partial{background:var(--warn)}.period-result-legend .missing{background:#98a5ab}.cell-period-results{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:11px}.cell-period-card{min-width:0;border:1px solid var(--line);border-top:3px solid #98a5ab;border-radius:8px;background:#fff;overflow:hidden;box-shadow:0 1px 3px rgba(16,61,70,.04)}.cell-period-card.good{border-top-color:var(--good)}.cell-period-card.partial{border-top-color:var(--warn)}.cell-period-card.missing{border-top-color:#98a5ab}.cell-period-card-head{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:10px 11px;background:#f6faf9;border-bottom:1px solid #e5eded}.cell-period-card-head b{font-size:14px;color:#15514d}.period-quality{padding:3px 6px;border-radius:4px;font-size:10px;font-weight:bold}.period-quality.good{background:#e5f5eb;color:var(--good)}.period-quality.partial{background:#fff1d7;color:#9a6200}.period-quality.missing{background:#edf1f2;color:#6e7d84}.cell-period-voltage{display:flex;justify-content:space-between;align-items:baseline;gap:8px;padding:10px 11px 8px}.cell-period-voltage span{font-size:11px;color:var(--muted)}.cell-period-voltage strong{font-size:18px;color:#15514d;white-space:nowrap}.cell-period-metrics{display:grid;grid-template-columns:1fr 1fr;margin:0 11px 11px;border:1px solid #e3ecec;border-radius:5px;overflow:hidden}.cell-period-metric{min-width:0;padding:7px 8px;background:#fff;border-right:1px solid #e3ecec;border-bottom:1px solid #e3ecec}.cell-period-metric:nth-child(2n){border-right:0}.cell-period-metric:nth-last-child(-n+2){border-bottom:0}.cell-period-metric span{display:block;color:var(--muted);font-size:10px;white-space:nowrap}.cell-period-metric b{display:block;margin-top:3px;color:#2e4b51;font-size:12px;font-weight:normal;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cell-period-empty{grid-column:1/-1;padding:30px;border:1px dashed #b9cdd0;border-radius:8px;background:#f7faf9;color:var(--muted);text-align:center}.cell-period-footnote{margin:0;color:var(--muted);font-size:12px}@media(max-width:1200px){.cell-picker-grid{grid-template-columns:repeat(15,minmax(0,1fr))}.cell-period-results{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(max-width:850px){.cell-picker-grid{grid-template-columns:repeat(10,minmax(0,1fr))}.cell-period-results{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:700px){.period-selection-head{align-items:flex-start;flex-direction:column}.cell-picker-grid{grid-template-columns:repeat(6,minmax(0,1fr));padding:10px;gap:5px;max-height:330px}.cell-picker span{min-height:34px}.cell-period-results{grid-template-columns:1fr}.cell-period-toolbar .action{flex:1}.cell-period-voltage strong{font-size:17px}}
.cell-picker.voltage-low span{border-color:#2586d1;background:#e9f4ff;color:#0d4d89;font-weight:bold}
.cell-picker.voltage-high span{border-color:#d55555;background:#fff0ee;color:#9b3030;font-weight:bold}
.cell-picker.voltage-low input:checked+span{background:linear-gradient(145deg,#287fc3,#155a99);border-color:#155a99;color:#fff}
.cell-picker.voltage-high input:checked+span{background:linear-gradient(145deg,#d65b51,#a93831);border-color:#a93831;color:#fff}
.period-voltage-legend{display:flex;gap:12px;flex-wrap:wrap;font-size:12px;color:var(--muted)}
.period-voltage-legend span{display:inline-flex;align-items:center;gap:5px}.period-voltage-legend i{width:9px;height:9px;border-radius:50%;display:inline-block}.period-voltage-legend .low{background:#2586d1}.period-voltage-legend .high{background:#d55555}
.cell-period-chart{margin-top:4px}.cell-period-chart-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.cell-period-chart-controls{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.cell-period-chart-controls select{min-height:32px;border:1px solid var(--line);border-radius:5px;padding:0 8px;background:#fff;color:var(--ink)}
.cell-period-chart-wrap{position:relative;height:350px;margin-top:10px;border:1px solid var(--line);border-radius:6px;background:#fff;overflow:hidden}.cell-period-chart-canvas{display:block;width:100%;height:100%;touch-action:none;cursor:crosshair}.cell-period-chart-canvas.dragging{cursor:grabbing}.cell-period-chart-tooltip{position:absolute;z-index:2;pointer-events:none;max-width:220px;padding:8px 10px;border-radius:5px;background:rgba(16,61,70,.94);color:#fff;font-size:12px;line-height:1.55;box-shadow:0 3px 12px rgba(16,61,70,.22)}
@media(max-width:700px){.cell-period-chart-wrap{height:300px}.cell-period-chart-head{align-items:flex-start}.cell-period-chart-controls{width:100%}}


/* ===== 登录界面（管理员门禁） ===== */
.login-overlay{position:fixed;inset:0;z-index:10000;display:none;align-items:center;justify-content:center;background:linear-gradient(135deg,#0b1a20,#123038 55%,#0d2026);font-family:'Roboto','PingFang SC','Segoe UI',Arial,sans-serif}
.login-card{width:372px;max-width:92vw;box-sizing:border-box;background:#ffffff;border-radius:16px;padding:30px 28px 26px;box-shadow:0 18px 50px rgba(0,0,0,.45)}
.login-logo{margin-bottom:22px}
.login-logo b{display:block;font-size:22px;color:#123038}
.login-logo span{display:block;margin-top:6px;font-size:12.5px;color:#6b7a80}
.login-field{margin-bottom:14px}
.login-field label{display:block;font-size:13px;color:#37484e;margin-bottom:6px;font-weight:600}
.login-field input{width:100%;box-sizing:border-box;height:40px;padding:0 12px;border:1px solid #d5e0e4;border-radius:8px;font-size:14px;color:#1a1b1c;background:#fafcfc;outline:none}
.login-field input:focus{border-color:#168a68;background:#fff;box-shadow:0 0 0 3px rgba(22,138,104,.12)}
.login-remember{display:flex;align-items:center;gap:6px;margin:4px 0 14px;font-size:13px;color:#52676e;cursor:pointer;user-select:none}
.login-remember input{width:15px;height:15px;accent-color:#168a68;cursor:pointer}
.login-error{color:#c0392b;font-size:12.5px;margin:0 0 10px}
.login-btn{width:100%;height:42px;border:0;border-radius:8px;background:linear-gradient(135deg,#168a68,#0f7a5e);color:#fff;font-size:15px;font-weight:600;cursor:pointer;letter-spacing:4px}
.login-btn:hover{background:linear-gradient(135deg,#13805f,#0d6e54)}
.login-btn:active{transform:translateY(1px)}
.logout-btn{margin-left:auto;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.35);color:#fff;border-radius:6px;padding:4px 12px;font-size:12px;cursor:pointer}
.logout-btn:hover{background:rgba(255,255,255,.2)}
body.ems-locked header,body.ems-locked main,body.ems-locked dialog{visibility:hidden}
