/* Layout: an engineering console with three columns around the 3D view
   (program, cell, signals) and a shared timeline below. */
@font-face{font-family:"IBM Plex Sans";font-weight:400;font-display:swap;src:url(../vendor/fonts/ibm-plex-sans-cyrillic-400-normal.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:"IBM Plex Sans";font-weight:400;font-display:swap;src:url(../vendor/fonts/ibm-plex-sans-latin-400-normal.woff2) format("woff2");unicode-range:U+0000-00FF,U+2000-206F,U+20AC,U+2122,U+2190-2193,U+2212}
@font-face{font-family:"IBM Plex Sans";font-weight:500;font-display:swap;src:url(../vendor/fonts/ibm-plex-sans-cyrillic-500-normal.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:"IBM Plex Sans";font-weight:500;font-display:swap;src:url(../vendor/fonts/ibm-plex-sans-latin-500-normal.woff2) format("woff2");unicode-range:U+0000-00FF,U+2000-206F,U+20AC,U+2122,U+2190-2193,U+2212}
@font-face{font-family:"IBM Plex Sans";font-weight:600;font-display:swap;src:url(../vendor/fonts/ibm-plex-sans-cyrillic-600-normal.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:"IBM Plex Sans";font-weight:600;font-display:swap;src:url(../vendor/fonts/ibm-plex-sans-latin-600-normal.woff2) format("woff2");unicode-range:U+0000-00FF,U+2000-206F,U+20AC,U+2122,U+2190-2193,U+2212}
@font-face{font-family:"IBM Plex Sans";font-weight:700;font-display:swap;src:url(../vendor/fonts/ibm-plex-sans-cyrillic-700-normal.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:"IBM Plex Sans";font-weight:700;font-display:swap;src:url(../vendor/fonts/ibm-plex-sans-latin-700-normal.woff2) format("woff2");unicode-range:U+0000-00FF,U+2000-206F,U+20AC,U+2122,U+2190-2193,U+2212}
@font-face{font-family:"IBM Plex Mono";font-weight:400;font-display:swap;src:url(../vendor/fonts/ibm-plex-mono-cyrillic-400-normal.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:"IBM Plex Mono";font-weight:400;font-display:swap;src:url(../vendor/fonts/ibm-plex-mono-latin-400-normal.woff2) format("woff2");unicode-range:U+0000-00FF,U+2000-206F,U+20AC,U+2122,U+2190-2193,U+2212}
@font-face{font-family:"IBM Plex Mono";font-weight:500;font-display:swap;src:url(../vendor/fonts/ibm-plex-mono-cyrillic-500-normal.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:"IBM Plex Mono";font-weight:500;font-display:swap;src:url(../vendor/fonts/ibm-plex-mono-latin-500-normal.woff2) format("woff2");unicode-range:U+0000-00FF,U+2000-206F,U+20AC,U+2122,U+2190-2193,U+2212}
@font-face{font-family:"IBM Plex Mono";font-weight:600;font-display:swap;src:url(../vendor/fonts/ibm-plex-mono-cyrillic-600-normal.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:"IBM Plex Mono";font-weight:600;font-display:swap;src:url(../vendor/fonts/ibm-plex-mono-latin-600-normal.woff2) format("woff2");unicode-range:U+0000-00FF,U+2000-206F,U+20AC,U+2122,U+2190-2193,U+2212}
:root{
  --bg:#E4E8E7; --panel:#F7F8F7; --panel-2:#ECEFEE; --ink:#14202B; --ink-2:#44515C; --ink-3:#5F6B75; --line:#CAD1D1;
  --accent:#0E5A8A; --accent-soft:#D4E4EF; --signal:#C2410C;
  --ok:#17693E; --ok-soft:#D8EEE1; --warn:#8A5A00; --warn-soft:#F6E8C8; --err:#AE2318; --err-soft:#F8DEDB;
  --syn-cmd:#17693E; --syn-val:#1C49B0; --syn-el:#6F36A8; --syn-lbl:#A44A06; --syn-rem:#5F6B75;
  --vp-bg:#DCE1E1; --m-machine:#8FA3AD; --m-platen:#6F8490; --m-mold:#AEB9BD; --m-robot:#E3E6E6; --m-rail:#B4BEC1;
  --m-core:#B4713A; --m-tool:#D9480F; --m-part:#E0A100; --m-sprue:#0F8A8A; --m-belt:#39424A; --m-floor:#BFC7C7; --m-edge:#3C4A52; --m-chute:#7C8A91; --m-trail:#0E5A8A;
  --sans:"IBM Plex Sans",system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;
  --mono:"IBM Plex Mono",ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
}
@media (prefers-color-scheme: dark){ :root:not([data-theme="light"]){
  --bg:#11161A; --panel:#192025; --panel-2:#222A30; --ink:#E8ECEC; --ink-2:#B2BCC1; --ink-3:#919CA3; --line:#333D44;
  --accent:#7DBBE6; --accent-soft:#1E3646; --signal:#FF8A4C;
  --ok:#62CF94; --ok-soft:#173526; --warn:#E6B450; --warn-soft:#3A2F14; --err:#FF8078; --err-soft:#43201D;
  --syn-cmd:#6FD39B; --syn-val:#8FB6FF; --syn-el:#C9A2F2; --syn-lbl:#F0A35E; --syn-rem:#919CA3;
  --vp-bg:#0E1316; --m-machine:#50636D; --m-platen:#3E505A; --m-mold:#6E7D85; --m-robot:#A9B4B9; --m-rail:#6E7B82;
  --m-core:#C98B54; --m-tool:#FF8A4C; --m-part:#F2C230; --m-sprue:#38C6C6; --m-belt:#2A3238; --m-floor:#161C20; --m-edge:#0A0E11; --m-chute:#56646C; --m-trail:#7DBBE6;
  color-scheme:dark;
}}
:root[data-theme="dark"]{
  --bg:#11161A; --panel:#192025; --panel-2:#222A30; --ink:#E8ECEC; --ink-2:#B2BCC1; --ink-3:#919CA3; --line:#333D44;
  --accent:#7DBBE6; --accent-soft:#1E3646; --signal:#FF8A4C;
  --ok:#62CF94; --ok-soft:#173526; --warn:#E6B450; --warn-soft:#3A2F14; --err:#FF8078; --err-soft:#43201D;
  --syn-cmd:#6FD39B; --syn-val:#8FB6FF; --syn-el:#C9A2F2; --syn-lbl:#F0A35E; --syn-rem:#919CA3;
  --vp-bg:#0E1316; --m-machine:#50636D; --m-platen:#3E505A; --m-mold:#6E7D85; --m-robot:#A9B4B9; --m-rail:#6E7B82;
  --m-core:#C98B54; --m-tool:#FF8A4C; --m-part:#F2C230; --m-sprue:#38C6C6; --m-belt:#2A3238; --m-floor:#161C20; --m-edge:#0A0E11; --m-chute:#56646C; --m-trail:#7DBBE6;
  color-scheme:dark;
}
*{box-sizing:border-box}
body{background:var(--bg);color:var(--ink);font:14px/1.45 var(--sans);padding-block:14px 28px;padding-left:max(16px,env(safe-area-inset-left,0px));padding-right:max(16px,env(safe-area-inset-right,0px))}
button,select,input,textarea{font:inherit;color:inherit}
button{cursor:pointer}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.wrap{max-width:1560px;margin:0 auto;display:grid;gap:10px}

.top{display:flex;flex-wrap:wrap;gap:8px 20px;align-items:flex-end;justify-content:space-between}
.top h1{margin:0;font-size:20px;font-weight:700;letter-spacing:-.005em;text-wrap:balance}
.top p{margin:2px 0 0;color:var(--ink-2);font-size:13px;max-width:72ch}
.stats{display:flex;flex-wrap:wrap;gap:6px 18px;align-items:baseline}
.stat{display:flex;flex-direction:column;min-width:0}
.stat b{font:600 16px/1.2 var(--mono);font-variant-numeric:tabular-nums}
.stat span{font-size:11.5px;color:var(--ink-3)}
.pill{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:3px;font-weight:600;font-size:13px;border:1px solid transparent;background:none;text-align:left}
.pill.ok{background:var(--ok-soft);color:var(--ok)} .pill.bad{background:var(--err-soft);color:var(--err)} .pill.warn{background:var(--warn-soft);color:var(--warn)}

.rail{display:flex;gap:3px;overflow-x:auto;padding-bottom:2px;scrollbar-width:thin}
.rail button{flex:1 0 auto;display:flex;align-items:center;gap:6px;padding:6px 10px;border:1px solid var(--line);background:var(--panel);border-radius:3px;font-size:12.5px;white-space:nowrap;color:var(--ink-2)}
.rail button i{font:600 11.5px var(--mono);font-style:normal;color:var(--ink-3)}
.rail button.on{background:var(--accent);border-color:var(--accent);color:var(--panel);font-weight:600}
.rail button.on i{color:var(--panel)}

.grid{display:grid;gap:10px;grid-template-columns:minmax(300px,385px) minmax(0,1fr) minmax(280px,330px);grid-template-areas:"prog stage side"}
.pane{background:var(--panel);border:1px solid var(--line);border-radius:4px;min-width:0;display:flex;flex-direction:column;min-height:0}
.pane-h{display:flex;align-items:stretch;border-bottom:1px solid var(--line);min-height:34px;flex:none;overflow-x:auto;scrollbar-width:none}
.tab{border:0;background:none;padding:7px 9px;font-size:12.5px;font-weight:500;color:var(--ink-2);border-bottom:2px solid transparent;margin-bottom:-1px;white-space:nowrap}
.tab.on{color:var(--ink);font-weight:600;border-bottom-color:var(--accent)}
.tab em{font-style:normal;font:600 11px var(--mono);margin-left:4px;padding:0 4px;border-radius:2px}
.tab em.ok{background:var(--ok-soft);color:var(--ok)} .tab em.bad{background:var(--err-soft);color:var(--err)}

#progPane{grid-area:prog;height:668px}
#stagePane{grid-area:stage;height:668px}
#sidePane{grid-area:side;height:668px}

/* Програма */
.listing{flex:1;overflow:auto;font:12.5px/1.62 var(--mono);padding:4px 0;min-height:0}
.ln{display:grid;grid-template-columns:42px 14px 1fr;padding:0 8px 0 6px;cursor:pointer;white-space:pre-wrap;border-left:3px solid transparent}
.ln:hover{background:var(--panel-2)}
.ln .n{color:var(--ink-3);font-size:11.5px;user-select:none}
.ln .st{color:var(--syn-cmd);font-weight:600}
.ln.cur{background:var(--accent-soft);border-left-color:var(--accent)}
.ln.ind1 .c{padding-left:1ch}.ln.ind2 .c{padding-left:2ch}
.s-cmd{color:var(--syn-cmd)} .s-val{color:var(--syn-val)} .s-el{color:var(--syn-el)} .s-lbl{color:var(--syn-lbl)} .s-rem{color:var(--syn-rem)}
.ln.is-rem{margin-top:6px}
.ln.is-rem .c{font-weight:600}
.why{flex:none;border-top:1px solid var(--line);padding:8px 11px;font-size:12.5px;min-height:82px;color:var(--ink-2)}
.why code{font:500 12px var(--mono);color:var(--ink);display:block;margin-bottom:3px;word-break:break-word}
.why .ref{color:var(--ink-3);font-size:11.5px;display:block;margin-top:3px}

/* Сцена */
#vp{position:relative;flex:1;min-height:0;background:var(--vp-bg);overflow:hidden;border-radius:4px 4px 0 0;touch-action:none;cursor:grab}
#vp:active{cursor:grabbing}
#cv{position:absolute;inset:0;width:100%;height:100%;display:block}
#tags{position:absolute;inset:0;pointer-events:none;overflow:hidden}
.tag{position:absolute;transform:translate(8px,-50%);font:500 11px var(--sans);white-space:nowrap;color:var(--ink);background:var(--panel);border:1px solid var(--line);padding:0 5px;border-radius:2px;opacity:.93}
.tag::before{content:"";position:absolute;left:-7px;top:50%;width:6px;height:6px;margin-top:-3px;border-radius:50%;background:var(--m-trail)}
.views{position:absolute;top:8px;left:8px;display:flex;flex-wrap:wrap;gap:3px;max-width:calc(100% - 16px)}
.views button,.views label{border:1px solid var(--line);background:var(--panel);padding:3px 8px;border-radius:3px;font-size:12px;color:var(--ink-2);display:flex;align-items:center;gap:4px}
.views button.on{background:var(--ink);color:var(--panel);border-color:var(--ink);font-weight:600}
.views input{margin:0;accent-color:var(--accent)}
.vhint{position:absolute;right:8px;bottom:8px;font:500 11.5px var(--mono);color:var(--ink-2);background:var(--panel);border:1px solid var(--line);padding:2px 6px;border-radius:2px}
.alarm{position:absolute;left:8px;right:8px;bottom:8px;display:flex;flex-direction:column;gap:3px}
.alarm div{background:var(--err-soft);color:var(--err);border:1px solid var(--err);padding:4px 9px;border-radius:3px;font-size:12.5px;font-weight:600}
.alarm div b{font-family:var(--mono);font-weight:600;margin-right:6px}
.alarm div.w{background:var(--warn-soft);color:var(--warn);border-color:var(--warn)}
.novp{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;padding:24px;text-align:center;color:var(--ink-2)}
.caption{flex:none;border-top:1px solid var(--line);padding:7px 11px;min-height:54px;font-size:13px}
.caption b{font-weight:600}
.transport{flex:none;border-top:1px solid var(--line);display:flex;flex-wrap:wrap;gap:6px 8px;align-items:center;padding:7px 9px}
.btn{border:1px solid var(--line);background:var(--panel-2);border-radius:3px;padding:5px 10px;font-weight:500;font-size:13px;display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.btn:hover{border-color:var(--ink-3)}
.btn.primary{background:var(--accent);border-color:var(--accent);color:var(--panel);font-weight:600;min-width:92px;justify-content:center}
.btn svg{width:12px;height:12px;fill:currentColor;flex:none}
#seek{flex:1 1 140px;min-width:100px;accent-color:var(--accent)}
.clock{font:500 13px var(--mono);font-variant-numeric:tabular-nums;white-space:nowrap}
.fld{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--ink-2)}
.fld select{background:var(--panel-2);border:1px solid var(--line);border-radius:3px;padding:3px 4px;font-size:12.5px;color:var(--ink);max-width:215px}

/* Страничен панел */
.sbody{flex:1;overflow:auto;padding:9px 11px 12px;min-height:0}
.sect{font-size:11.5px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-3);margin:11px 0 4px}
.sect:first-child{margin-top:0}
.modechip{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:0 8px;padding:5px 9px;border-radius:3px;font-weight:600;font-size:13px;background:var(--panel-2)}
.modechip.auto{background:var(--ok-soft);color:var(--ok)} .modechip.wait{background:var(--warn-soft);color:var(--warn)} .modechip.stop{background:var(--err-soft);color:var(--err)}
.ax{display:grid;grid-template-columns:18px 1fr 66px;gap:7px;align-items:center;font:500 12.5px var(--mono);padding:1.5px 0}
.ax output{text-align:right;font-variant-numeric:tabular-nums}
.bar{height:6px;background:var(--panel-2);border-radius:1px;position:relative;overflow:hidden}
.bar i{position:absolute;left:0;top:0;bottom:0;background:var(--accent);border-radius:1px}
.sig{display:grid;grid-template-columns:11px 1fr auto;gap:7px;align-items:center;font-size:12.5px;padding:1.5px 0}
.sig .led{width:10px;height:10px;border-radius:50%;border:1.5px solid var(--ink-3);background:transparent}
.sig.on .led{background:var(--ok);border-color:var(--ok)}
.sig .pin{font:400 11px var(--mono);color:var(--ink-3)}
.sig.on .lbl{font-weight:600}
.chk{display:grid;grid-template-columns:20px 1fr;gap:2px 6px;padding:6px 0;border-bottom:1px solid var(--line);font-size:12.5px}
.chk:last-child{border-bottom:0}
.chk .mk{font:700 13px var(--mono);line-height:1.3}
.chk.pass .mk{color:var(--ok)} .chk.fail .mk{color:var(--err)}
.chk .t{font-weight:500}
.chk .d{grid-column:2;color:var(--ink-2);font-size:12px}
.chk.fail .d{color:var(--err)}
.chk .r{grid-column:2;color:var(--ink-3);font-size:11px}
.chk button{grid-column:2;justify-self:start;margin-top:3px;font-size:12px;padding:2px 8px}
.manual{display:grid;grid-template-columns:18px 1fr;gap:6px;padding:5px 0;font-size:12.5px;border-bottom:1px solid var(--line)}
.manual input{margin:2px 0 0;accent-color:var(--accent)}
.manual small{display:block;color:var(--ink-3);font-size:11px}
.vals{display:grid;grid-template-columns:1fr 84px;gap:3px 8px;align-items:center;font-size:12.5px}
.vals label{color:var(--ink-2);min-width:0}
.vals input{width:100%;background:var(--panel);border:1px solid var(--line);border-radius:2px;padding:2px 5px;font:500 12.5px var(--mono);text-align:right}
.vals input:focus{border-color:var(--accent)}
.note{font-size:12px;color:var(--ink-2);margin:6px 0}
#exportTxt{width:100%;height:330px;font:11.5px/1.45 var(--mono);background:var(--panel-2);border:1px solid var(--line);border-radius:3px;padding:7px;resize:vertical;white-space:pre;overflow:auto}

/* Времева лента */
#tlPane{position:relative}
.tl-h{display:flex;flex-wrap:wrap;gap:4px 14px;justify-content:space-between;padding:6px 11px;border-bottom:1px solid var(--line);font-size:12.5px}
.tl-h b{font-weight:600}
.tl-h span{color:var(--ink-3);font-size:12px}
#tlWrap{position:relative;padding:4px 0}
#tl{display:block;width:100%;height:208px;cursor:crosshair;touch-action:none}
#tip{position:absolute;pointer-events:none;background:var(--ink);color:var(--panel);font:500 11.5px/1.4 var(--mono);padding:4px 7px;border-radius:2px;white-space:pre;z-index:3}
.foot{color:var(--ink-3);font-size:12px;max-width:110ch}

@media (max-width:1180px){
  .grid{grid-template-columns:minmax(0,1fr) minmax(0,1fr);grid-template-areas:"stage stage" "prog side"}
  #stagePane{height:600px} #progPane,#sidePane{height:520px}
}
@media (max-width:720px){
  .grid{grid-template-columns:minmax(0,1fr);grid-template-areas:"stage" "prog" "side"}
  #stagePane{height:auto} #vp{flex:none;height:62vw;min-height:300px}
  #progPane,#sidePane{height:460px}
  .tag{display:none}
  .fld select{max-width:190px}
  #tl{height:208px}
}
@media (prefers-reduced-motion:reduce){ *{scroll-behavior:auto!important} }

/* ---------- Added for the standalone app ---------- */
html,body{margin:0}
[hidden]{display:none!important}
#boot{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;padding:24px;text-align:center;background:var(--bg);z-index:50;font-size:15px;max-width:none}
#boot div{max-width:60ch}

.appbar{display:flex;flex-wrap:wrap;gap:8px 12px;align-items:center;justify-content:space-between}
.appbar h1{margin:0;font-size:18px;font-weight:700;white-space:nowrap}
.bar-left,.bar-right{display:flex;flex-wrap:wrap;gap:6px 8px;align-items:center;min-width:0}
.seg{display:inline-flex;border:1px solid var(--line);border-radius:3px;overflow:hidden;background:var(--panel)}
.seg button{border:0;background:none;padding:5px 10px;font-weight:600;font-size:12.5px;color:var(--ink-2)}
.seg button.on{background:var(--ink);color:var(--panel)}
.icon-btn{padding:5px 8px;min-width:32px;justify-content:center}
.icon-btn svg{width:14px;height:14px}
.btn:disabled{opacity:.45;cursor:default}
.btn.danger{color:var(--err)}
.btn.small{padding:2px 8px;font-size:12px}
.store{font-size:12px;color:var(--ink-3);white-space:nowrap}
.store.local{color:var(--warn);font-weight:600}

.progbar{display:flex;flex-wrap:wrap;gap:6px 18px;align-items:center;justify-content:space-between;background:var(--panel);border:1px solid var(--line);border-radius:4px;padding:7px 11px}
.proginfo{min-width:0;flex:1 1 320px}
.proginfo b{display:block;font-size:15px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.proginfo span{font-size:12.5px;color:var(--ink-3)}
.proginfo span.dirty{color:var(--warn);font-weight:600}
.banner{background:var(--warn-soft);color:var(--warn);border:1px solid var(--warn);border-radius:3px;padding:6px 11px;font-size:13px;font-weight:500}

.pane-h .spacer{flex:1}
.pane-h .edit-toggle{margin:3px 5px;padding:2px 10px;font-size:12.5px;flex:none}
.pane-h .edit-toggle.on{background:var(--accent);border-color:var(--accent);color:var(--panel);font-weight:600}

.editbar{flex:none;display:flex;flex-wrap:wrap;gap:4px;align-items:center;padding:5px 6px;border-bottom:1px solid var(--line);background:var(--panel-2)}
.editbar select{flex:1 1 130px;min-width:0;background:var(--panel);border:1px solid var(--line);border-radius:3px;padding:3px 4px;font-size:12.5px}
.editbar .btn{padding:3px 7px;font-size:12.5px;background:var(--panel)}
.editbar .sep{width:1px;align-self:stretch;background:var(--line);margin:1px 2px}
.editbar .seg button{padding:3px 8px;font-size:12px}

.ln.sel{outline:1.5px solid var(--accent);outline-offset:-1.5px}
.ln.bad .n{color:var(--err);font-weight:600}
.ln.bad{background:var(--err-soft)}
.ln.bad.cur,.ln.bad.sel{background:var(--err-soft)}

.inspect{flex:none;border-top:1px solid var(--line);padding:8px 11px;min-height:112px;max-height:230px;overflow:auto;font-size:12.5px}
.inspect h3{margin:0 0 5px;font-size:12.5px;font-weight:600;color:var(--ink)}
.inspect .fields{display:grid;grid-template-columns:minmax(90px,auto) minmax(0,1fr);gap:4px 8px;align-items:center}
.inspect label{color:var(--ink-2)}
.inspect input,.inspect select{width:100%;min-width:0;background:var(--panel);border:1px solid var(--line);border-radius:2px;padding:3px 5px;font-size:12.5px}
.inspect input[type=number]{font-family:var(--mono);text-align:right}
.inspect input:invalid,.vals input:invalid{border-color:var(--err)}
.inspect .hint{color:var(--ink-3);font-size:11.5px;grid-column:1/-1}
.inspect .issue{color:var(--err);font-size:12px;margin-top:5px}
.textedit{flex:1;min-height:0;display:flex;flex-direction:column;gap:5px;padding:7px}
.textedit textarea{flex:1;min-height:120px;width:100%;font:12px/1.5 var(--mono);background:var(--panel);border:1px solid var(--line);border-radius:3px;padding:6px;resize:none;white-space:pre;overflow:auto}
.textedit p{margin:0;font-size:12px;color:var(--ink-2)}
.textedit ul{margin:0;padding-left:16px;font-size:12px;color:var(--err);max-height:90px;overflow:auto}

.vals select{width:100%;background:var(--panel);border:1px solid var(--line);border-radius:2px;padding:2px 3px;font-size:12.5px}
.rail button .tagn{font:600 11.5px var(--mono);color:var(--ink-3)}
.rail button.on .tagn{color:var(--panel)}
.rail:empty{display:none}

dialog{border:1px solid var(--line);border-radius:6px;background:var(--panel);color:var(--ink);padding:0;width:min(940px,calc(100vw - 24px));max-height:calc(100vh - 40px)}
dialog::backdrop{background:rgba(10,15,20,.55)}
dialog.narrow{width:min(480px,calc(100vw - 24px))}
.dlg-h{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 14px;border-bottom:1px solid var(--line)}
.dlg-h h2{margin:0;font-size:15.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dlg-b{padding:12px 14px;overflow:auto;max-height:calc(100vh - 170px)}
.dlg-f{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:6px;padding:10px 14px;border-top:1px solid var(--line)}
.lib-tools{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-bottom:9px}
.lib-tools input[type=search]{flex:1 1 180px;min-width:0;background:var(--panel-2);border:1px solid var(--line);border-radius:3px;padding:5px 8px}
.lib-table{width:100%;border-collapse:collapse;font-size:13px}
.lib-table th{text-align:left;font-size:11.5px;font-weight:600;color:var(--ink-3);text-transform:uppercase;letter-spacing:.03em;padding:4px 6px;border-bottom:1px solid var(--line)}
.lib-table td{padding:7px 6px;border-bottom:1px solid var(--line);vertical-align:top}
.lib-table tr.current td{background:var(--accent-soft)}
.lib-table .nm{font-weight:600;overflow-wrap:anywhere}
.lib-table .ds{color:var(--ink-3);font-size:12px;overflow-wrap:anywhere}
.lib-table .acts{display:flex;flex-wrap:wrap;gap:3px;justify-content:flex-end}
.chip{display:inline-block;padding:1px 6px;border-radius:2px;font-size:12px;font-weight:600;white-space:nowrap}
.chip.ok{background:var(--ok-soft);color:var(--ok)}
.chip.bad{background:var(--err-soft);color:var(--err)}
.muted{color:var(--ink-3);font-size:12px}
.form{display:grid;gap:9px}
.form label{display:grid;gap:3px;font-size:12.5px;color:var(--ink-2)}
.form input,.form select,.form textarea{background:var(--panel-2);border:1px solid var(--line);border-radius:3px;padding:6px 8px;color:var(--ink);font-size:13.5px;width:100%}
.form textarea{resize:vertical;min-height:54px}
.form .hint{font-size:11.5px;color:var(--ink-3)}
.warn-box{background:var(--warn-soft);color:var(--warn);border-radius:3px;padding:6px 9px;font-size:12.5px}

#toast{position:fixed;left:50%;bottom:18px;transform:translateX(-50%);background:var(--ink);color:var(--panel);padding:8px 14px;border-radius:4px;font-size:13px;z-index:60;max-width:min(560px,calc(100vw - 24px));box-shadow:0 4px 18px rgba(0,0,0,.25)}
#toast.err{background:var(--err);color:#fff}

@media (max-width:720px){
  .lib-table .col-saved,.lib-table .col-ver{display:none}
  .appbar h1{font-size:16px}
}
