:root{--bg:#17191c;--panel:#1f2226;--panel2:#24282d;--line:#2c3036;--line2:#3a4048;--ink:#f2f3f4;--mut:#a6acb3;--dim:#8a9097;--acc:#ffd60a;--acc-ink:#17191c;--live:#9be15d;--warn:#f2a33a;--err:#e05545;--info:#5ba3e8;--mono:'IBM Plex Mono',ui-monospace,Menlo,Consolas,monospace;--sans:Inter,system-ui,sans-serif;--cond:'Barlow Condensed',Inter,sans-serif}
*{box-sizing:border-box;margin:0} body{background:var(--bg);color:var(--ink);font:14px/1.45 var(--sans);min-height:100vh;display:flex;flex-direction:column}
a{color:var(--acc)} code{font-family:var(--mono);font-size:.92em;background:#0f1113;padding:1px 5px;border-radius:3px}
h1{font-family:var(--cond);font-weight:700;font-size:22px;text-transform:uppercase;letter-spacing:.03em;margin:0 0 8px} h2{font-family:var(--cond);font-size:16px;color:var(--acc);text-transform:uppercase;margin:14px 0 6px}
.muted,.dim{color:var(--dim)} .small{font-size:12px} .mono{font-family:var(--mono)} .lead{color:var(--mut);max-width:80ch;margin-bottom:10px} [hidden]{display:none!important}
#top{display:flex;align-items:center;gap:14px;padding:10px 18px;border-bottom:3px solid var(--acc)} .brand{display:flex;align-items:baseline;gap:10px} .brand .home{font-family:var(--cond);font-weight:700;font-size:24px;text-transform:uppercase;color:var(--ink);text-decoration:none} .brand .mod{font-family:var(--cond);font-weight:700;font-size:24px;color:var(--acc)} .spacer{flex:1}
.engine{font-family:var(--mono);font-size:12px;color:var(--mut);display:flex;gap:8px;align-items:center} .engine .dot{width:9px;height:9px;border-radius:50%;background:var(--warn)} .engine.ready .dot{background:var(--live)} .engine.error .dot{background:var(--err)}
.banner{padding:8px 18px;background:#3d2a1e;color:#ffd7b5;font-size:13px;font-family:var(--mono);white-space:pre-wrap} .banner.err{background:#3f1f1d;color:#ffc9c2}
main{flex:1;padding:18px 22px 40px;max-width:1200px;width:100%;margin:0 auto}
.card{background:var(--panel);border:1px solid var(--line);border-radius:4px;padding:14px 16px;margin:12px 0}
.btn{font:600 13px var(--sans);padding:7px 14px;border:1px solid var(--line2);background:var(--panel2);color:var(--ink);cursor:pointer;border-radius:3px;white-space:nowrap} .btn:hover{border-color:var(--acc)} .btn.primary{background:var(--acc);color:var(--acc-ink);border-color:var(--acc)} .btn.small{padding:4px 10px;font-size:12px} .btn.big{font-size:15px;padding:10px 22px} .btn:disabled{opacity:.5;cursor:default}
input,select,textarea{font:13px var(--mono);background:#121416;color:var(--ink);border:1px solid var(--line2);border-radius:3px;padding:6px 8px;width:100%} textarea{min-height:60px} input:focus,select:focus,textarea:focus{outline:none;border-color:var(--acc)}
.grid2{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px 18px} .field label{display:block;font-size:12px;color:var(--mut);margin-bottom:3px} .field .help{font-size:11px;color:var(--dim);margin-top:3px} .row{display:flex;gap:8px;align-items:center;flex-wrap:wrap} .row input{width:auto;flex:1 1 120px} .chk{display:flex;gap:6px;align-items:center;font-size:12px;color:var(--mut)} .chk input{width:auto}
.dropzone{border:2px dashed var(--line2);border-radius:6px;padding:26px;text-align:center;background:var(--panel2)} .dropzone.over{border-color:var(--acc)} .dz-title{font-family:var(--cond);font-size:20px;text-transform:uppercase} .dz-sub{color:var(--dim);margin:6px 0}
.notice{background:#22262b;border-left:3px solid var(--dim);padding:10px 12px;margin:10px 0;color:var(--mut);font-size:13px;white-space:pre-wrap} .notice.warn{border-left-color:var(--warn)} .notice.err{border-left-color:var(--err);color:#ffc9c2}
table.plain{border-collapse:collapse;font-family:var(--mono);font-size:12px} table.plain th,table.plain td{padding:3px 8px;border-bottom:1px solid var(--line);text-align:left} table.plain td.num{text-align:right} .wrapx{overflow-x:auto}
.counts{display:flex;gap:8px;flex-wrap:wrap;margin:8px 0} .count{background:var(--panel2);border:1px solid var(--line);border-radius:3px;padding:8px 12px;min-width:110px} .count b{display:block;font-family:var(--mono);font-size:17px} .count span{font-size:11px;color:var(--dim);text-transform:uppercase}
details.sec{margin-top:10px} details.sec summary{cursor:pointer;color:var(--mut);font-size:13px} .chip{display:inline-block;font:600 11px var(--sans);padding:2px 8px;border-radius:999px;border:1px solid var(--line2);color:var(--mut);margin-right:4px;text-transform:uppercase} .chip.ok{color:var(--live)} .chip.warn{color:var(--warn)}
#foot{display:flex;gap:18px;padding:8px 18px;border-top:1px solid var(--line);font-family:var(--mono);font-size:11px;color:var(--dim);flex-wrap:wrap}
.busy{position:fixed;right:16px;bottom:16px;background:var(--panel);border:1px solid var(--line2);border-radius:4px;padding:8px 12px;display:flex;gap:8px;align-items:center;font-family:var(--mono);font-size:12px} .spin{width:12px;height:12px;border:2px solid var(--acc);border-top-color:transparent;border-radius:50%;animation:rot 1s linear infinite} @keyframes rot{to{transform:rotate(360deg)}}
