
:root{
  --bg:#f5f6f8; --card:#fff; --line:#e4e7ec; --txt:#1f2430; --muted:#7a8194;
  --blue:#2563eb; --red:#dc2626; --orange:#d97706; --green:#059669;
}
*{box-sizing:border-box;margin:0;padding:0}
body{font:14px/1.5 "Segoe UI","Microsoft YaHei",sans-serif;background:var(--bg);color:var(--txt)}
header{background:#101828;color:#fff;padding:10px 24px;display:flex;align-items:center;gap:24px}
header h1{font-size:17px;font-weight:600}
nav{display:flex;gap:4px}
nav button{background:none;border:none;color:#98a2b3;padding:8px 14px;cursor:pointer;font-size:14px;border-radius:6px}
nav button.active{background:var(--blue);color:#fff}
.header-actions{margin-left:auto;display:flex;align-items:center;gap:14px;flex:none}
.header-account{display:flex;align-items:center;gap:12px;border-left:1px solid #344054;padding-left:14px}
#authIdentity{color:#cbd5e1;font-size:13px;max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.header-action{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:34px;padding:0 12px;font-size:13px;border:1px solid #344054;background:transparent;color:#cbd5e1;transition:background .15s,border-color .15s}
.header-action:hover{background:var(--blue);color:#fff;border-color:#667085}
.header-action:focus-visible{outline:2px solid #84adff;outline-offset:3px}
.header-refresh svg{width:15px;height:15px;flex:none}
.header-refresh{min-width:90px}
.header-refresh[aria-busy="true"] svg{animation:s .8s linear infinite}
.header-refresh:disabled{opacity:.65;cursor:wait}
.needs-login .header-account{border-left:0;padding-left:0}
@media(max-width:1100px){header{flex-wrap:wrap;gap:12px}header nav{order:3;width:100%;overflow-x:auto}header nav button{white-space:nowrap}#authIdentity{max-width:120px}}
main{max-width:1720px;margin:16px auto;padding:0 16px}
.tab{display:none}.tab.active{display:block}
.card{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:16px;margin-bottom:16px}
.card h3{font-size:14px;margin-bottom:12px;color:#344054}
.grid4{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px}
.stat{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:14px 18px}
.stat .v{font-size:24px;font-weight:700}
.stat .l{color:var(--muted);font-size:12px;margin-top:2px}
.stat.err .v{color:var(--red)}
.row{display:flex;gap:16px;flex-wrap:wrap}
.row>.card{flex:1;min-width:380px;margin-bottom:0;overflow:auto}
#excTable td:first-child{overflow-wrap:anywhere}
#excTable th.num{width:80px}
table{width:100%;border-collapse:collapse;font-size:13px}
th,td{text-align:left;padding:7px 10px;border-bottom:1px solid var(--line);vertical-align:top}
th{color:var(--muted);font-weight:600;background:#f9fafb;position:sticky;top:0}
tr.click{cursor:pointer}tr.click:hover{background:#f0f4ff}
.num{text-align:right;font-variant-numeric:tabular-nums}
.bar{display:flex;align-items:center;gap:8px;margin:4px 0}
.bar .name{width:120px;flex:none;color:#475467;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bar .track{flex:1;background:#eef1f5;border-radius:4px;height:16px;position:relative;overflow:hidden}
.bar .fill{height:100%;border-radius:4px;background:var(--blue)}
.bar .fill.err{background:var(--red)}
.bar .v{width:70px;flex:none;text-align:right;font-variant-numeric:tabular-nums;color:#475467}
#hourChart{display:flex;align-items:flex-end;gap:2px;height:120px;padding-top:4px}
#hourChart .col{flex:1;height:100%;position:relative}
#hourChart .e,#hourChart .t{position:absolute;bottom:0;left:0;right:0;border-radius:2px 2px 0 0}
#hourChart .e{background:var(--red)}
#hourChart .t{background:#93b4f8}
#hourChart .col:hover::after{content:attr(data-tip);position:absolute;bottom:100%;left:50%;transform:translateX(-50%);
  background:#101828;color:#fff;padding:3px 8px;border-radius:4px;font-size:12px;white-space:nowrap;z-index:9}
.filters{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end}
.filters label{display:flex;flex-direction:column;gap:3px;font-size:12px;color:var(--muted)}
input,select,button,textarea{font:inherit;border:1px solid #d0d5dd;border-radius:6px;padding:6px 10px;background:#fff}
input:focus,select:focus{outline:2px solid #b2ccff;border-color:var(--blue)}
button{cursor:pointer}
.btn{background:var(--blue);border-color:var(--blue);color:#fff}
.btn.gray{background:#fff;color:#344054;border-color:#d0d5dd}
.btn.danger{background:#fff;color:var(--red);border-color:#f4b3b3}
.btn.sm{padding:3px 9px;font-size:12px}
.copy-log-btn{min-width:104px;transition:background .18s,border-color .18s,color .18s,transform .12s,box-shadow .18s}
.copy-log-btn:hover:not(:disabled){box-shadow:0 2px 6px #1018281a}
.copy-log-btn:active:not(:disabled){transform:scale(.96)}
.copy-log-btn.gray.copied{color:#067647;background:#ecfdf3;border-color:#75e0a7}
.copy-log-btn .spin{width:11px;height:11px;border-color:#667085;border-top-color:transparent;vertical-align:-2px}
.chip{padding:4px 14px;border-radius:16px;border:1px solid #d0d5dd;background:#fff;cursor:pointer;font-size:13px;color:#475467}
.chip:hover{border-color:var(--blue);color:var(--blue)}
.chip.on{background:var(--blue);color:#fff;border-color:var(--blue)}
.frow{display:flex;align-items:flex-start;gap:14px;padding:8px 0}
.frow+.frow{border-top:1px dashed var(--line)}
.flabel{flex:none;width:52px;text-align:right;color:var(--muted);font-size:13px;line-height:27px}
.fcontrols{display:flex;gap:6px 8px;flex-wrap:wrap;align-items:center;flex:1;min-height:27px}
.ovwrap{display:flex;gap:16px;align-items:flex-start}
.ovside{width:230px;flex:none;position:sticky;top:12px;padding:8px 0;align-self:flex-start}
.ovmain{flex:1;min-width:0}
.side-h{padding:10px 16px 6px;font-size:12px;font-weight:600;color:var(--muted)}
.side-list{display:flex;flex-direction:column;gap:2px;padding:0 10px}
.side-list .chip{border:none;background:none;border-radius:6px;text-align:left;padding:6px 10px}
.side-list .chip:hover{background:#eef2f7;color:var(--blue)}
.side-list .chip.on{background:var(--blue);color:#fff}
@media (max-width:1100px){.ovwrap{flex-direction:column}.ovside{width:100%;position:static}}
.lvl{display:inline-block;padding:1px 8px;border-radius:10px;font-size:12px;font-weight:600;color:#fff}
.lvl.ERROR{background:var(--red)}.lvl.FATAL{background:#7f1d1d}.lvl.WARN{background:var(--orange)}
.lvl.INFO{background:#3b82f6}.lvl.DEBUG{background:#94a3b8}.lvl.TRACE{background:#cbd5e1}
.msg{max-width:520px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mono{font-family:Consolas,monospace;font-size:12px}
.muted{color:var(--muted)}
.pager{display:flex;gap:10px;align-items:center;justify-content:flex-end;margin-top:10px;color:var(--muted)}
dialog{border:none;border-radius:10px;box-shadow:0 8px 40px rgba(0,0,0,.25);padding:0;max-width:900px;width:92vw}
dialog::backdrop{background:rgba(0,0,0,.4)}
#detailDialog{position:fixed;inset:0;margin:auto;height:fit-content;max-height:calc(100vh - 32px);max-height:calc(100dvh - 32px)}
#opsDialog{position:fixed;inset:0;margin:auto;height:fit-content;max-width:780px;max-height:92vh}
.ops-note{padding:10px 12px;background:#f0f4ff;border-radius:6px;margin-bottom:12px;color:#344054;font-size:13px}
.ops-error{background:#fff1f0;color:#b42318;white-space:pre-wrap}
.ops-form{display:grid;gap:12px}.ops-form label{display:grid;gap:6px}
.ops-form textarea{width:100%;min-height:150px;font:12px/1.6 Consolas,monospace;resize:vertical}
@media(max-width:900px){#tab-ops .grid4{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:540px){#tab-ops .grid4{grid-template-columns:minmax(0,1fr)}}
#tab-ops .stat{min-width:0}#tab-ops .ops-table{overflow-x:auto}#tab-ops .ops-table table{min-width:520px}
.ops-chart{width:100%;height:190px;display:block}.ops-actions{display:flex;gap:6px;flex-wrap:wrap}
.dhead{display:flex;justify-content:space-between;align-items:center;padding:14px 20px;border-bottom:1px solid var(--line)}
.dbody{padding:16px 20px;max-height:70vh;overflow:auto}
.meta{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:12px;font-size:13px}
.meta div span{display:block;color:var(--muted);font-size:11px}
pre.raw{background:#0f172a;color:#d6e2f0;padding:14px;border-radius:8px;overflow:auto;
  font:12px/1.55 Consolas,monospace;white-space:pre-wrap;word-break:break-all;max-height:50vh}
.form2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.form2 label{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--muted)}
.form2 .full{grid-column:1/-1}
.tip{color:var(--muted);font-size:12px;margin-top:10px}
.ok{color:var(--green)}.bad{color:var(--red)}.partial{color:var(--orange)}
#toast{position:fixed;top:18px;right:18px;background:#101828;color:#fff;padding:10px 18px;border-radius:8px;
  display:none;z-index:99;max-width:60vw}
.spin{display:inline-block;width:14px;height:14px;border:2px solid #fff;border-top-color:transparent;border-radius:50%;
  animation:s .7s linear infinite;vertical-align:-2px;margin-right:6px}
@keyframes s{to{transform:rotate(360deg)}}
