:root{--bg:#f6f7f9;--card:#fff;--bd:#dde1e6;--tx:#1f2933;--mut:#66788a;--pri:#2456c9;--ok:#15803d;--warn:#b45309;--bad:#b91c1c}
*{box-sizing:border-box}body{margin:0;font:14px/1.45 system-ui,-apple-system,Segoe UI,sans-serif;background:var(--bg);color:var(--tx)}
header{background:#111827;color:#fff;display:flex;align-items:center;gap:1.5rem;padding:.6rem 1.5rem}
header .brand{font-weight:700;font-size:16px}header nav a{color:#cbd5e1;text-decoration:none;margin-right:1rem;padding:.3rem 0}
header nav a.active,header nav a:hover{color:#fff;border-bottom:2px solid #60a5fa}header .right{margin-left:auto;font-size:13px}
header .right form{display:inline}header .right button{background:none;border:0;color:#cbd5e1;cursor:pointer;text-decoration:underline;font:inherit}
main{max-width:1200px;margin:1.2rem auto;padding:0 1rem}
h1{font-size:20px;margin:.2rem 0 1rem}h2{font-size:16px;margin:1.4rem 0 .6rem}
.card{background:var(--card);border:1px solid var(--bd);border-radius:8px;padding:1rem;margin-bottom:1rem}
.grid{display:grid;gap:1rem;grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}
.stat{background:var(--card);border:1px solid var(--bd);border-radius:8px;padding:.8rem 1rem}.stat .n{font-size:26px;font-weight:700}.stat .l{color:var(--mut);font-size:12px;text-transform:uppercase;letter-spacing:.04em}
.n.ok{color:var(--ok)}.n.bad{color:var(--bad)}.n.warn{color:var(--warn)}
table{border-collapse:collapse;width:100%;background:var(--card)}th,td{border:1px solid var(--bd);padding:5px 9px;text-align:left;vertical-align:top}
th{background:#eef1f5;font-weight:600;white-space:nowrap}table.kv th{width:280px;background:#f7f8fa;font-weight:500}
tr.pending td:nth-child(2){background:#fff8dc}tr.running td:nth-child(2){background:#dbeafe}tr.done td:nth-child(2){background:#dcfce7}tr.failed td:nth-child(2){background:#fee2e2}
.badge{display:inline-block;padding:1px 8px;border-radius:10px;font-size:12px;background:#e5e7eb}.badge.ok{background:#dcfce7;color:var(--ok)}.badge.bad{background:#fee2e2;color:var(--bad)}.badge.warn{background:#fef3c7;color:var(--warn)}
.msg{padding:8px 12px;margin:6px 0;border-radius:6px;background:#e0e7ff}.msg.success{background:#dcfce7}.msg.error{background:#fee2e2}.msg.warning{background:#fef3c7}
button,.btn{background:var(--pri);color:#fff;border:0;border-radius:6px;padding:6px 12px;font:inherit;cursor:pointer;text-decoration:none;display:inline-block}
button.sec,.btn.sec{background:#fff;color:var(--tx);border:1px solid var(--bd)}button:disabled{opacity:.45;cursor:not-allowed}
form.inline{display:inline}input[type=text],input[type=password],select,textarea{border:1px solid var(--bd);border-radius:6px;padding:5px 8px;font:inherit}
.filters{display:flex;flex-wrap:wrap;gap:.6rem;align-items:end;margin-bottom:.8rem}.filters label{display:block;font-size:12px;color:var(--mut)}
pre{background:#0f172a;color:#e2e8f0;padding:10px;border-radius:6px;overflow:auto;max-height:420px;font-size:12px}
details{margin:.4rem 0}summary{cursor:pointer;font-weight:600}.mut{color:var(--mut)}.pager{margin:.8rem 0}.pager a{margin-right:.6rem}
.bar{background:#e5e7eb;border-radius:6px;height:12px;overflow:hidden}.bar>div{background:var(--ok);height:100%}
.err{max-width:520px;word-break:break-word;font-size:12px}code{background:#eef1f5;padding:1px 4px;border-radius:4px}
