*{box-sizing:border-box}html,body{margin:0;height:100%;font-family:-apple-system,"PingFang SC","Microsoft YaHei",sans-serif;background:#f0f2f5;color:#303133}
.layout{display:flex;height:100vh}.aside{width:210px;background:#001529;color:#fff;flex-shrink:0;overflow:auto;transition:width .2s}.aside.collapsed{width:64px}
.logo{height:56px;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:16px;color:#fff;border-bottom:1px solid #ffffff14;white-space:nowrap;overflow:hidden}
.aside .el-menu{border-right:none}.main{flex:1;display:flex;flex-direction:column;min-width:0}
.header{height:56px;background:#fff;display:flex;align-items:center;padding:0 16px;box-shadow:0 1px 4px #00152914;gap:12px;z-index:2}
.header .sp{flex:1}.tabs{background:#fff;padding:4px 12px 0;border-bottom:1px solid #e4e7ed}.tabs .el-tabs__header{margin:0}
.content{flex:1;overflow:auto;padding:16px}.card{background:#fff;border-radius:6px;padding:16px;margin-bottom:16px}
.toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:12px}.toolbar .el-input,.toolbar .el-select{width:180px}
.stat{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:16px;margin-bottom:16px}
.stat .item{background:#fff;border-radius:6px;padding:16px}.stat .t{color:#909399;font-size:13px}.stat .v{font-size:24px;font-weight:600;margin-top:6px}.stat .s{color:#909399;font-size:12px;margin-top:4px}
.chart{height:300px}.pager{display:flex;justify-content:flex-end;margin-top:12px}.rtp-bar{background:#fef0f0;color:#f56c6c;padding:6px 16px;font-size:13px;display:flex;align-items:center;gap:12px;border-bottom:1px solid #fde2e2}
.login{height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#001529,#1e3c72)}.login .box{width:380px;background:#fff;border-radius:8px;padding:32px}
.green{color:#67c23a}.red{color:#f56c6c}.muted{color:#909399}.mono{font-family:Menlo,Consolas,monospace;font-size:12px}
.md{line-height:1.7}.md pre{background:#f6f8fa;padding:12px;overflow:auto;border-radius:4px}.md code{background:#f6f8fa;padding:1px 4px;border-radius:3px}.md table{border-collapse:collapse}.md td,.md th{border:1px solid #dcdfe6;padding:4px 8px}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}@media(max-width:1100px){.grid2{grid-template-columns:1fr}}
pre.json{background:#f6f8fa;padding:8px;max-height:300px;overflow:auto;font-size:12px;margin:0}

/* 在线管理 */
.pl-up{color:#f56c6c;font-weight:600}.pl-down{color:#67c23a;font-weight:600}.dot-on{display:inline-block;width:8px;height:8px;border-radius:50%;background:#67c23a;margin-right:6px;box-shadow:0 0 0 2px #67c23a33}
.ev{padding:6px 16px;line-height:1.9;background:#fafafa}
.kpis{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;margin:10px 0}.kpi{background:#fff;border:1px solid #ebeef5;border-radius:6px;padding:10px 14px}.kpi .t{color:#909399;font-size:12px}.kpi .v{font-size:20px;font-weight:600;margin-top:4px}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:12px}.grid2>.card{margin:0}.ct{font-weight:600;margin-bottom:6px}.ch{height:300px}.ch2{height:240px}

/* ===== UI 打磨（2026-11-01）：统一视觉 + 手机端适配 ===== */
:root{--el-border-radius-base:6px}
.card{box-shadow:0 1px 2px #0000000a;border:1px solid #ebeef5}.stat .item,.kpi{box-shadow:0 1px 2px #0000000a;transition:box-shadow .2s}.stat .item:hover,.kpi:hover{box-shadow:0 4px 12px #0000001a}
.el-table th.el-table__cell{background:#fafafa!important;color:#606266;font-weight:600}.el-table .cell{white-space:nowrap}
.content::-webkit-scrollbar,.aside::-webkit-scrollbar{width:6px;height:6px}.content::-webkit-scrollbar-thumb,.aside::-webkit-scrollbar-thumb{background:#c0c4cc;border-radius:3px}
.aside-mask{position:fixed;inset:0;background:#0006;z-index:1999}
@media(max-width:1200px){.kpis{grid-template-columns:repeat(3,1fr)}}
@media(max-width:767px){
 .layout.mobile .aside{position:fixed;left:0;top:0;bottom:0;z-index:2000;width:220px;box-shadow:2px 0 12px #0004}
 .layout.mobile .aside.collapsed{width:0;box-shadow:none}
 .header{padding:0 10px;gap:8px;height:48px}.header .el-breadcrumb{font-size:13px;white-space:nowrap;overflow:hidden}.hide-m{display:none}
 .content{padding:8px}.card{padding:10px;margin-bottom:10px}
 .stat{grid-template-columns:1fr 1fr;gap:8px}.stat .item{padding:10px}.stat .v{font-size:18px}
 .kpis{grid-template-columns:1fr 1fr;gap:8px}.kpi .v{font-size:16px}
 .grid2{grid-template-columns:1fr!important}.chart,.ch{height:240px}.ch2{height:200px}
 .toolbar{gap:6px}.toolbar .el-input,.toolbar .el-select,.toolbar .el-date-editor{width:100%!important;max-width:100%}
 .toolbar .el-date-editor.el-range-editor{min-width:0}
 .pager .el-pagination{flex-wrap:wrap;justify-content:center;row-gap:6px}.pager .el-pagination__sizes,.pager .el-pagination__jump{display:none}
 .el-dialog{width:94vw!important;margin-top:4vh!important}.el-drawer{width:100vw!important}.el-message-box{width:90vw!important}
 .rtp-bar{flex-wrap:wrap;font-size:12px;padding:6px 10px}
 .tabs{padding:2px 6px 0}.tabs .el-tabs__item{padding:0 10px!important;font-size:13px}
 .login .box{width:92vw;padding:24px}
 .el-descriptions__table{table-layout:auto}
}
.stat .item.clk{cursor:pointer}.stat .item.clk:hover{border-color:#409eff}.stat .item{border:1px solid transparent}
.mcards{display:flex;flex-direction:column;gap:8px;min-height:80px}.mc{border:1px solid #ebeef5;border-radius:8px;padding:10px 12px;background:#fff;font-size:13px;line-height:1.8}.mc:active{background:#f5f7fa}
.mc-h{display:flex;justify-content:space-between;font-size:14px}.mc-r{display:flex;justify-content:space-between;gap:8px;align-items:center}.mc-r .mono{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:60%}
.show-m{display:none}@media(max-width:767px){.show-m{display:inline}.rtp-bar{flex-wrap:nowrap;gap:6px}.rtp-bar .show-m{flex:1}}
/* RTP 简易控制台 */
.rtp-head{display:flex;flex-wrap:wrap;align-items:center;gap:10px}.rtp-head .rh-l{display:flex;align-items:center;gap:16px;flex-wrap:wrap;flex:1}.rh-sw{display:flex;align-items:center;gap:8px}.rh-r{display:flex;align-items:center;gap:8px}.rh-tip{width:100%;font-size:12px}
.lv-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:8px;width:100%}.lv{border:1px solid #dcdfe6;border-radius:6px;padding:8px 4px;text-align:center;cursor:pointer;line-height:1.4;transition:all .15s}.lv b{display:block;font-size:16px}.lv span{font-size:12px;color:#909399}.lv:hover{border-color:#409eff}.lv.on{border-color:#409eff;background:#ecf5ff;color:#409eff}.lv.on span{color:#409eff}
.rr{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:8px 0;border-bottom:1px solid #f0f0f0}.rr-b{display:flex;align-items:center;gap:8px;flex-shrink:0}
.adv{padding:0 16px}.adv .el-collapse-item__header{border-bottom:none}
@media(max-width:767px){.lv-grid{grid-template-columns:repeat(3,1fr)}.rr{flex-wrap:wrap}.adv{padding:0 10px}}
@media(max-width:767px){.rtp-head .rh-l{flex:0 0 100%;justify-content:space-between}.rtp-head .el-radio-group{flex-wrap:nowrap}.rh-r{width:100%;justify-content:space-between}}
.fold-btn{display:none}
@media(max-width:767px){.fold-btn{display:inline-flex}
 .toolbar.folded>*:not(:first-child):not(.fold-btn):not(.el-button--primary){display:none!important}
 .toolbar.folded>:first-child{width:auto!important;flex:1}.toolbar.folded{flex-wrap:nowrap}}
@media(max-width:767px){
 .el-descriptions.is-bordered .el-descriptions__body tbody{display:block}
 .el-descriptions.is-bordered .el-descriptions__body tr{display:flex;flex-wrap:wrap}
 .el-descriptions.is-bordered .el-descriptions__body .el-descriptions__label{flex:0 0 32%;box-sizing:border-box}
 .el-descriptions.is-bordered .el-descriptions__body .el-descriptions__content{flex:0 0 68%;box-sizing:border-box;word-break:break-all}
}
/* 可读键值 */
.kv-t{border-collapse:collapse;width:100%;font-size:12px}.kv-t th{background:#fafafa;color:#606266;font-weight:500;text-align:left;padding:4px 8px;border:1px solid #ebeef5;width:30%;white-space:nowrap;vertical-align:top}.kv-t td{padding:4px 8px;border:1px solid #ebeef5;word-break:break-all}
.kv-inline{display:inline-flex;flex-wrap:wrap;gap:2px 10px;font-size:12px;line-height:1.7}.kv-i{white-space:nowrap}.kv-k{color:#909399}.kv-sub{padding-left:6px}
.kv-grid{border-collapse:collapse;margin:2px 0}.kv-grid td{border:1px solid #dcdfe6;min-width:28px;height:24px;text-align:center;font-size:12px;font-weight:600;background:#fafafa}
.devdata{margin-top:8px}
@media(max-width:767px){.content .card{overflow-x:auto}.ct{display:flex;flex-wrap:wrap;align-items:center;gap:6px}.ct .el-radio-group{flex-wrap:wrap;margin-left:0!important}.el-descriptions__table{width:100%}}
.md table{display:block;overflow-x:auto;max-width:100%}.md code{word-break:break-all}
/* 只读账号：隐藏写操作（服务端同样会拒绝） */
body[data-role=readonly] .content .el-button--success,body[data-role=readonly] .content .el-button--danger,body[data-role=readonly] .content .el-button--warning,body[data-role=readonly] .rtp-form,body[data-role=readonly] .rh-sw .el-switch,body[data-role=readonly] .el-table .el-dropdown,body[data-role=readonly] .rtp-bar .el-button--danger{display:none!important}
.ro-bar{position:fixed;bottom:0;left:0;right:0;z-index:3000;background:#fdf6ec;color:#b88230;font-size:12px;text-align:center;padding:4px}
.ck-t th{width:110px}.ck-t td{line-height:1.6}

.m-warn{color:#f56c6c;background:#fef0f0;border:1px solid #fbc4c4;border-radius:6px;padding:6px 10px;margin-top:6px;font-size:13px;font-weight:600}
.m-row{background:#fff5f5}
.live{margin-bottom:12px}.live-h{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:0 0 8px}.live-h .muted{font-size:12px}
.live-g{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.lp .ct{display:flex;gap:8px;align-items:center;font-weight:600;margin-bottom:8px}
.lp-sys{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:10px}.lp-sys>div{background:#f7f8fa;border-radius:6px;padding:6px 8px;display:flex;flex-direction:column;min-width:0}
.lp-sys span{font-size:12px;color:#909399}.lp-sys b{font-size:18px}.lp-sys i{font-style:normal;font-size:11px;color:#909399;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.lp-svc{display:grid;grid-template-columns:1fr 1fr;gap:4px 10px}.sv{display:flex;align-items:center;gap:6px;font-size:12px;min-width:0}.sv span{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sv em{font-style:normal;color:#909399}.sv.bad{color:#f56c6c}.sv.bad em{color:#f56c6c}
.dot{width:8px;height:8px;border-radius:50%;flex:none}.dot.ok{background:#67c23a}.dot.no{background:#f56c6c;box-shadow:0 0 0 3px #fde2e2}
.lp-list .li{display:flex;justify-content:space-between;gap:8px;font-size:13px;padding:3px 0;border-bottom:1px dashed #eee}.ell{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.lp-err{font-size:12px;color:#f56c6c;background:#fef0f0;border-radius:4px;padding:3px 6px;margin-top:4px;word-break:break-all}
.lm{border:1px solid #ebeef5;border-radius:6px;padding:6px 8px;margin-bottom:6px}.lm.low{border-color:#f5c48c;background:#fdf6ec}.lm-a{display:flex;gap:6px;align-items:center}.lm-b{display:flex;gap:12px;flex-wrap:wrap;font-size:12px;color:#606266;margin-top:4px}
@media (max-width:1100px){.live-g{grid-template-columns:1fr}}

.pf-tip{background:#ecf5ff;border-radius:6px;padding:10px 12px;margin-bottom:12px;font-size:14px}.pf-empty .ct{font-weight:600;margin:4px 0 6px}.clickable{cursor:pointer}

@media (max-width:420px){.lp-svc{grid-template-columns:1fr}}
.sys-form{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:0 24px}.sys-by{font-size:11px;width:100%}.sys{margin-bottom:12px}
