:root{--bg:#e6ebf2;--panel:#f6f8fb;--panel2:#e8edf4;--fg:#15202b;--muted:#64758a;--border:#c9d3df;--accent:#0d7d88;--onacc:#fff;--ok:#15803d;--bad:#c62828;--warn:#c27400;--ed-bg:#fff;--mono:"Cascadia Mono","JetBrains Mono",Consolas,Menlo,monospace;--hh:40px}
:root[data-theme=minimal]{--bg:#f1f1f1;--panel:#fff;--panel2:#f3f3f3;--fg:#111;--muted:#777;--border:#dcdcdc;--accent:#111;--onacc:#fff;--ed-bg:#fff}
:root[data-theme=dark]{--bg:#0b1016;--panel:#131a22;--panel2:#1a232d;--fg:#d9e3ed;--muted:#7a8da1;--border:#263341;--accent:#37c4ae;--onacc:#03211a;--warn:#f2a93b;--ed-bg:#0e141b}
:root[data-theme=tech]{--bg:#06080b;--panel:#0d1218;--panel2:#141b23;--fg:#c9d6e2;--muted:#6f8294;--border:#1f2a36;--accent:#22d3a0;--onacc:#00150e;--ed-bg:#080b0f}
:root[data-theme=midnight]{--bg:#0f0d1b;--panel:#171429;--panel2:#201c38;--fg:#e8e6f7;--muted:#9a95c4;--border:#2d2850;--accent:#a78bfa;--onacc:#120a2a;--ed-bg:#0f0d1b}
*{box-sizing:border-box}html,body{margin:0}body{background:var(--bg);color:var(--fg);font:13.5px/1.5 system-ui,"Segoe UI",Tahoma,Arial,sans-serif}
a{color:var(--accent);text-decoration:none}h1,h2,h3{margin:.2em 0 .5em}h3{font-size:15px}
.muted{color:var(--muted)}.small{font-size:12px}.ltr{direction:ltr;text-align:left}.mono{font-family:var(--mono)}.grow{flex:1}.wrapany{word-break:break-all}
.center{display:grid;place-items:center;min-height:60vh}
.row{display:flex;align-items:center;gap:8px}.row.between{justify-content:space-between}.row.end{justify-content:flex-end}.row.wrap{flex-wrap:wrap}.gap{gap:10px}
.top{display:flex;align-items:center;gap:14px;height:var(--hh);padding:0 14px;background:var(--panel);border-bottom:1px solid var(--border);position:sticky;top:0;z-index:30}
.brand{font-weight:700;font-size:16px;color:var(--fg)}.brand span{color:var(--accent)}
nav{display:flex;gap:4px}nav a{padding:6px 12px;border-radius:8px;color:var(--fg)}nav a.on,nav a:hover{background:var(--panel2);color:var(--accent)}
.page{max-width:1200px;margin:0 auto;padding:16px}.page.narrow,.narrow{max-width:640px}
.card{background:var(--panel);border:1px solid var(--border);border-radius:10px;padding:14px;margin:10px 0}
.btn{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border-radius:8px;border:1px solid var(--border);background:var(--panel2);color:var(--fg);cursor:pointer;font:inherit}
.btn:hover{border-color:var(--accent)}.btn.primary{background:var(--accent);color:var(--onacc);border-color:var(--accent);font-weight:600}.btn.danger{background:var(--bad);color:#fff;border-color:var(--bad)}
.btn.ghost{background:transparent;border-color:transparent}.btn.ghost:hover{background:var(--panel2)}.danger-t{color:var(--bad)}.btn.block{display:flex;width:100%;justify-content:center;margin-top:8px}
.btn:disabled,.btn.disabled{opacity:.45;pointer-events:none}
.input{width:100%;padding:7px 10px;border-radius:8px;border:1px solid var(--border);background:var(--bg);color:var(--fg);font:inherit}.input.sm{width:auto;min-width:80px;padding:4px 8px}textarea.input{resize:vertical}
.field{display:block;margin:8px 0}.field>span{display:block;font-size:12px;color:var(--muted);margin-bottom:3px}
.auth{display:grid;place-items:center;min-height:100vh;padding:16px}.auth .card{width:100%;max-width:380px}
.badge{display:inline-block;padding:2px 9px;border-radius:99px;font-size:12px;background:var(--panel2);border:1px solid var(--border)}.badge.ok{color:var(--ok);border-color:var(--ok)}.badge.bad{color:var(--bad);border-color:var(--bad)}
.grid{display:grid;gap:12px}.cards{grid-template-columns:repeat(auto-fill,minmax(250px,1fr))}.stats{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:0 12px}.grid2.big{grid-template-columns:repeat(auto-fit,minmax(380px,1fr));gap:12px}
.stat .big{font-size:26px;font-weight:700}
.drop{border:2px dashed var(--border);border-radius:12px;padding:26px;text-align:center;cursor:pointer;margin:10px 0}.drop:hover{border-color:var(--accent)}
.bar{height:8px;background:var(--panel2);border-radius:4px;overflow:hidden;margin:6px 0}.bar i{display:block;height:100%;background:var(--accent)}
.proj{display:flex;flex-direction:column;gap:4px}
.tabs{display:flex;gap:2px;border-bottom:1px solid var(--border);margin-bottom:10px;overflow-x:auto}.tab{padding:8px 14px;background:none;border:0;border-bottom:2px solid transparent;color:var(--fg);cursor:pointer;font:inherit;white-space:nowrap}.tab.on{border-color:var(--accent);color:var(--accent)}
.chips{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0}.chip{padding:3px 11px;border-radius:99px;border:1px solid var(--border);background:var(--panel2);color:var(--fg);cursor:pointer;font:inherit;font-size:12px}.chip.on{background:var(--accent);color:var(--onacc);border-color:var(--accent)}.chip.static{cursor:default}
.tbl{width:100%;border-collapse:collapse}.tbl th,.tbl td{padding:6px 8px;border-bottom:1px solid var(--border);text-align:start;vertical-align:top}.tbl tr.dim{opacity:.5}tr.lnk{cursor:pointer}tr.lnk:hover{background:var(--panel2)}.lnk{cursor:pointer;color:var(--accent)}
.scroll{overflow:auto;max-width:100%}pre.log{background:var(--bg);padding:10px;border-radius:8px;overflow:auto;font-size:12px;white-space:pre-wrap}
.overlay{position:fixed;inset:0;background:rgba(0,0,0,.55);display:grid;place-items:center;z-index:50;padding:12px}.modal{background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:16px;width:100%;max-width:480px;max-height:90vh;overflow:auto}
.alert{padding:8px 12px;border-radius:8px;margin:8px 0;border:1px solid var(--border)}.alert.bad{background:rgba(220,38,38,.14);border-color:var(--bad)}.alert.warn{background:rgba(217,119,6,.14);border-color:var(--warn)}.alert.ok{background:rgba(22,163,74,.14);border-color:var(--ok)}
.toasts{position:fixed;bottom:14px;inset-inline-end:14px;display:flex;flex-direction:column;gap:6px;z-index:90}.toast{background:var(--panel);border:1px solid var(--border);border-inline-start:4px solid var(--ok);padding:9px 14px;border-radius:8px;max-width:360px;box-shadow:0 4px 18px rgba(0,0,0,.3)}.toast.err{border-inline-start-color:var(--bad)}
.bars{display:flex;gap:6px;align-items:flex-end;height:110px}.bars div{display:flex;flex-direction:column;align-items:center;font-size:10px;color:var(--muted)}.bars i{display:block;width:22px;background:var(--accent);border-radius:3px 3px 0 0}
.axis{border:1px solid var(--border);border-radius:8px;padding:8px;margin:8px 0}
.step{align-items:flex-start;margin:8px 0}.dot{width:22px;height:22px;border-radius:50%;display:grid;place-items:center;border:1px solid var(--border);flex:none;font-size:12px}.dot.ok{background:var(--ok);color:#fff}.dot.no{background:var(--bad);color:#fff}.ver{padding:8px 0;border-bottom:1px solid var(--border)}


/* ===== WinOLS-style workbench ===== */
.ico{flex:none}
.ws{display:flex;flex-direction:column;height:calc(100vh - var(--hh));background:var(--bg);direction:ltr;overflow:hidden}
html[dir=rtl] :is(.docpad,.modal,.overlay,.maphead,.empty,.sidehead,.alert,.mdrop,.ttable summary,.dtab span){direction:rtl}
input[type=checkbox]{accent-color:var(--accent)}
.menubar{display:flex;gap:0;padding:0 6px;background:var(--panel);border-bottom:1px solid var(--border);position:relative;z-index:25}
.mnu{position:relative}.mbtn{background:none;border:0;color:var(--fg);padding:5px 11px;font:inherit;cursor:pointer;border-radius:5px;margin:2px 0}.mbtn:hover,.mbtn.on{background:var(--panel2);color:var(--accent)}
.mdrop{position:absolute;top:100%;left:0;min-width:250px;background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:4px;box-shadow:0 12px 32px rgba(0,0,0,.35);z-index:40}
.mdrop hr{border:0;border-top:1px solid var(--border);margin:4px 2px}.mi{display:flex;align-items:center;gap:8px;width:100%;background:none;border:0;color:var(--fg);padding:6px 8px;font:inherit;text-align:start;cursor:pointer;border-radius:5px}.mi:hover:not(:disabled){background:var(--accent);color:var(--onacc)}.mi:disabled{opacity:.4;cursor:default}
.mi .chk{width:14px;color:var(--accent)}.mi:hover .chk{color:inherit}kbd{font:11px var(--mono);opacity:.65;direction:ltr}
.toolbar2{display:flex;align-items:center;gap:6px;padding:4px 8px;background:var(--panel);border-bottom:1px solid var(--border);flex-wrap:wrap;min-height:38px}
.tb{display:grid;place-items:center;width:30px;height:28px;border-radius:6px;border:1px solid transparent;background:none;color:var(--fg);cursor:pointer}.tb:hover:not(:disabled){background:var(--panel2);border-color:var(--border)}.tb.on{background:color-mix(in srgb,var(--accent) 22%,transparent);color:var(--accent);border-color:color-mix(in srgb,var(--accent) 50%,transparent)}.tb:disabled{opacity:.3;cursor:default}
.vsep{width:1px;align-self:stretch;background:var(--border);margin:3px 3px}
.seg{display:inline-flex;border:1px solid var(--border);border-radius:6px;overflow:hidden;direction:ltr}.seg button{background:var(--panel2);border:0;border-inline-end:1px solid var(--border);color:var(--fg);padding:4px 10px;font:inherit;font-size:12px;cursor:pointer}.seg button:last-child{border:0}.seg button.on{background:var(--accent);color:var(--onacc);font-weight:600}
.projname{font-size:13px;max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.btn.sm{padding:3px 10px;font-size:12px;border-radius:6px}.input.sm{padding:3px 8px;font-size:12px;border-radius:6px}
.wsbody{display:flex;flex:1;min-height:0}
.side{width:300px;flex:none;border-inline-end:1px solid var(--border);background:var(--panel);display:flex;flex-direction:column;gap:6px;padding:8px;min-height:0}
.sidehead{font-weight:600;font-size:12px;color:var(--muted)}
.ttable{flex:1;min-height:0;overflow:auto;border:1px solid var(--border);border-radius:6px;background:var(--ed-bg);font-size:12px}
.tth,.trow{display:grid;grid-template-columns:20px 58px 1fr 52px;gap:4px;align-items:center;padding:3px 6px}
.tth{position:sticky;top:0;background:var(--panel2);color:var(--muted);border-bottom:1px solid var(--border);z-index:1}
.trow{cursor:pointer;white-space:nowrap}.trow>span:nth-child(3){overflow:hidden;text-overflow:ellipsis}.trow:hover{background:var(--panel2)}.trow.on{background:var(--accent);color:var(--onacc)}.trow.on .muted{color:inherit}
.ttable summary{cursor:pointer;padding:4px 6px;background:var(--panel);border-block:1px solid var(--border);font-weight:600;display:flex;align-items:center;gap:6px;list-style:none}.ttable summary::-webkit-details-marker{display:none}
.sidefoot{font-size:11px;color:var(--muted)}.pad{padding:8px}
.mdi{flex:1;min-width:0;display:flex;flex-direction:column}
.doctabs{display:flex;gap:2px;padding:4px 6px 0;background:var(--panel2);border-bottom:1px solid var(--border);overflow-x:auto;min-height:32px}
.dtab{display:flex;align-items:center;gap:7px;padding:5px 6px 5px 10px;border:1px solid transparent;border-bottom:0;border-radius:7px 7px 0 0;color:var(--muted);cursor:pointer;white-space:nowrap;font-size:12.5px}.dtab:hover{color:var(--fg)}
.dtab.on{background:var(--panel);border-color:var(--border);color:var(--fg);box-shadow:inset 0 2px var(--accent);margin-bottom:-1px}
.dtab button{display:grid;place-items:center;background:none;border:0;color:inherit;opacity:.55;width:18px;height:18px;border-radius:4px;cursor:pointer}.dtab button:hover{opacity:1;background:var(--border)}
.docarea{flex:1;min-height:0;position:relative;background:var(--panel)}
.doc{position:absolute;inset:0;visibility:hidden;pointer-events:none;display:flex;flex-direction:column;overflow:auto}.doc.on{visibility:visible;pointer-events:auto}
.docpad{padding:12px}.empty{height:100%;display:grid;place-content:center;justify-items:center;color:var(--muted)}
.statusbar{display:flex;align-items:center;gap:0;background:var(--panel);border-top:1px solid var(--border);font-size:12px;color:var(--muted);height:26px;padding:0 4px;flex:none}
.sb{unicode-bidi:plaintext;padding:0 12px;border-inline-end:1px solid var(--border);white-space:nowrap;line-height:26px}.sb:last-child{border:0}.sb b{color:var(--fg)}.sb.bad{color:var(--bad)}
.strip{display:flex;align-items:center;gap:6px;padding:5px 8px;border-bottom:1px solid var(--border);background:var(--panel);flex-wrap:wrap;flex:none}
/* hex */
.hexwin,.graphwin,.mapwin{display:flex;flex-direction:column;height:100%;min-height:0}
.hexscroll{flex:1;min-height:0;overflow:auto;background:var(--ed-bg);font:12.5px/21px var(--mono);outline:none;user-select:none;position:relative}
.hexhead{position:sticky;top:0;z-index:3;display:flex;height:24px;line-height:24px;background:var(--panel2);border-bottom:1px solid var(--border);color:var(--muted)}
.ha-addr{width:9ch;flex:none;padding-inline-start:8px}.hcells{display:flex;flex:none}.hcells>span{flex:none;text-align:center}.hexhead .hcells>span{color:var(--accent)}
.hside{flex:none;min-width:14ch;padding-inline-start:1.5ch;color:var(--muted);overflow:hidden}.hexhead .hside{padding-inline-start:1.5ch}
.hrow{position:absolute;left:0;height:21px;display:flex;white-space:nowrap;width:100%}.hrow.alt{background:color-mix(in srgb,var(--fg) 3.5%,transparent)}.hrow:hover{background:color-mix(in srgb,var(--accent) 8%,transparent)}
.haddr{width:9ch;flex:none;padding-inline-start:8px;color:var(--muted);border-inline-end:1px solid var(--border);margin-inline-end:0}
.hc{flex:none;text-align:center;cursor:default}.hc.ld{opacity:.35}.hc.sel{background:color-mix(in srgb,var(--accent) 34%,transparent)}.hc.cur{background:var(--accent);color:var(--onacc)}.hc.chg{color:var(--warn);font-weight:700}.hc.chg.cur{color:var(--onacc);box-shadow:inset 0 0 0 2px var(--warn)}
.hexscroll .hc:nth-child(4n){border-inline-end:1px solid color-mix(in srgb,var(--border) 70%,transparent)}
.rbar{display:block;height:7px;margin-top:7px;border-radius:2px;background:linear-gradient(90deg,color-mix(in srgb,var(--accent) 45%,transparent),var(--accent))}
.inspect{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:5px 10px;border-top:1px solid var(--border);background:var(--panel);flex:none;min-height:34px}
.kv{font:12px var(--mono);color:var(--fg)}.kv em{font-style:normal;color:var(--muted);margin-inline-end:5px}
.graphbox{flex:1;min-height:0;position:relative;background:var(--ed-bg)}.graphbox canvas{position:absolute;inset:0;width:100%;height:100%;cursor:grab;touch-action:none}.graphbox canvas:active{cursor:grabbing}
/* map window */
.maphead{display:flex;align-items:center;gap:8px;padding:7px 10px;border-bottom:1px solid var(--border);flex-wrap:wrap;flex:none}
.mapbody{flex:1;min-height:0;overflow:auto;background:var(--ed-bg)}
.maptable{outline:none;min-height:100%;padding:8px}
table.mt{border-collapse:separate;border-spacing:0;font:12.5px var(--mono);user-select:none}
.mt th,.mt td{border-inline-end:1px solid var(--border);border-bottom:1px solid var(--border);padding:3px 8px;text-align:end;min-width:52px;white-space:nowrap}
.mt thead th{position:sticky;top:0;z-index:2;background:var(--panel2);color:var(--accent);border-top:1px solid var(--border)}
.mt tbody th{position:sticky;left:0;z-index:1;background:var(--panel2);color:var(--accent);border-inline-start:1px solid var(--border)}
.mt .corner{left:0;z-index:3;color:var(--muted);font-weight:400}.mt .rbh{min-width:110px;border-inline-start:0}
.mt td{color:var(--fg);cursor:cell}.mt td.sel{background:var(--accent)!important;color:var(--onacc)}.mt td.cur{outline:2px solid var(--fg);outline-offset:-2px}.mt td.chg{outline:2px solid var(--warn);outline-offset:-2px;font-weight:700}.mt td.chg.cur{outline-color:var(--fg)}
.mt td.rb{padding:2px 8px;border-inline-start:0;vertical-align:bottom}.harm{display:flex;align-items:flex-end;gap:1px;height:16px;direction:ltr;margin-top:2px}.harm i{display:block;flex:none;width:4px;min-height:0;background:var(--accent)}
.cell-in{width:72px;font:inherit;background:var(--bg);color:var(--fg);border:1px solid var(--accent);border-radius:3px}
.mapops{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:6px 10px;border-top:1px solid var(--border);background:var(--panel);flex:none}
.maptabs{display:flex;align-items:center;gap:6px;padding:0 8px;border-top:1px solid var(--border);background:var(--panel2);flex:none;min-height:34px;flex-wrap:wrap}
.maptabs>button{background:none;border:1px solid transparent;border-top:0;border-radius:0 0 6px 6px;color:var(--muted);padding:6px 14px;font:inherit;font-size:12.5px;cursor:pointer}.maptabs>button.on{background:var(--panel);color:var(--accent);border-color:var(--border);box-shadow:inset 0 -2px var(--accent);margin-top:-1px}
.axis{border:1px solid var(--border);border-radius:8px;padding:8px;margin:8px 0}
.step{align-items:flex-start;margin:8px 0}.dot{width:22px;height:22px;border-radius:50%;display:grid;place-items:center;border:1px solid var(--border);flex:none;font-size:12px}.dot.ok{background:var(--ok);color:#fff}.dot.no{background:var(--bad);color:#fff}.ver{padding:8px 0;border-bottom:1px solid var(--border)}
:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.hexscroll:focus-visible,.maptable:focus-visible{outline-offset:-2px}
@media(max-width:800px){.side{position:absolute;z-index:22;height:calc(100% - 70px);box-shadow:0 0 30px #000}.grid2{grid-template-columns:1fr}.hide-m{display:none}.projname{display:none}}
@media(prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}
