/* ===========================================================
 * app.css —— 精简版控制台 · 现代深色主题
 * 保留原有类名约定（.card>.bd、.tnode .bd、.sitem 等），仅重做视觉
 * =========================================================== */
:root{
  --bg:#0a1020; --bg2:#0e1729;
  --panel:#111d33; --panel2:#16243f; --panel3:#1b2b4a;
  --bd:#22314f; --bd2:#2c3e63;
  --tx:#e8eefb; --tx2:#8ba0c2; --tx3:#5f739a;
  --pri:#4f8cff; --pri2:#6ea8fe; --pri-d:#3b74e0;
  --ok:#34d399; --err:#f87171; --warn:#fbbf24; --cyan:#22d3ee; --vio:#a78bfa;
  --code:#080e1c; --codeTx:#cfe0ff;
  --nav:#0c1526;
  --shadow:0 6px 22px rgba(0,0,0,.34);
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{font-family:-apple-system,"Segoe UI","Microsoft YaHei",sans-serif;
     background:radial-gradient(1200px 600px at 15% -10%,#16274a 0%,var(--bg) 55%) fixed;
     color:var(--tx);font-size:13px;line-height:1.5;
     display:flex;flex-direction:column;overflow:hidden}
button,input,select,textarea{font-family:inherit;font-size:13px}
::-webkit-scrollbar{width:10px;height:10px}
::-webkit-scrollbar-thumb{background:#2a3b5e;border-radius:6px;border:2px solid transparent;background-clip:padding-box}
::-webkit-scrollbar-thumb:hover{background:#3a5182;background-clip:padding-box}
::-webkit-scrollbar-track{background:transparent}
code{font-family:Consolas,"Courier New",monospace;background:#0c1730;color:#9ecbff;
     padding:1px 5px;border-radius:4px;font-size:11.5px;border:1px solid #1d2c4a}

/* ---------- 顶栏 ---------- */
.hd{height:54px;flex:0 0 54px;display:flex;align-items:center;gap:12px;padding:0 16px;
    background:linear-gradient(180deg,rgba(19,32,58,.96),rgba(12,21,38,.96));
    border-bottom:1px solid var(--bd);backdrop-filter:blur(8px)}
.hd .logo{display:flex;align-items:center;gap:9px;font-weight:600;letter-spacing:.3px}
.hd .logo .mark{display:grid;place-items:center;width:28px;height:28px;border-radius:8px;
    font-size:12px;font-weight:800;color:#04122e;
    background:linear-gradient(135deg,var(--cyan),var(--pri));box-shadow:0 3px 10px rgba(79,140,255,.45)}
.hd .logo .tt{font-size:15px}
.hd .logo .sub{font-size:11px;color:var(--tx3);font-weight:400;margin-left:2px}
.hd .sp{flex:1}
.chips{display:flex;gap:6px;align-items:center;flex-wrap:nowrap;overflow:hidden}
.chip{display:inline-flex;align-items:center;gap:5px;padding:3px 9px;border-radius:20px;
      background:#0f1c33;border:1px solid var(--bd);color:var(--tx2);font-size:11px;white-space:nowrap}
.chip b{color:var(--tx);font-weight:600}
.chip .dot{width:6px;height:6px}
.hd .st{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--tx2)}
.dot{width:8px;height:8px;border-radius:50%;background:var(--err);display:inline-block;
     box-shadow:0 0 0 3px rgba(248,113,113,.15)}
.dot.on{background:var(--ok);box-shadow:0 0 0 3px rgba(52,211,153,.18)}
.hd select{background:#0f1c33;color:var(--tx);border:1px solid var(--bd2);border-radius:7px;
           padding:5px 9px;max-width:260px;outline:none}
.hd select:focus{border-color:var(--pri)}
.hbtn{background:#17253f;color:var(--tx);border:1px solid var(--bd2);padding:6px 12px;
      border-radius:7px;cursor:pointer;transition:.15s}
.hbtn:hover{background:#1f3157;border-color:#3a5182}
.hbtn.danger{color:#ffb3b3;border-color:#5a2733;background:#2a1520}
.hbtn.danger:hover{background:#43141f;border-color:#8b2635;color:#ffd0d0}
.hdsep{flex:0 0 1px;width:1px;height:20px;background:var(--bd2);margin:0 2px}
.hbtn.reload{color:#bcd3f7;border-color:#2c4a7a;background:#132444}
.hbtn.reload:hover{background:#1b3461;border-color:#3a6aa8;color:#e8f0ff}

/* ---------- 主体 ---------- */
.body{flex:1;display:flex;min-height:0}
.nav{width:154px;flex:0 0 154px;display:flex;flex-direction:column;gap:3px;padding:10px 8px;
     background:linear-gradient(180deg,var(--nav),#0a1220);border-right:1px solid var(--bd)}
.nav a{display:flex;align-items:center;gap:9px;padding:9px 11px;color:var(--tx2);cursor:pointer;
       font-size:13px;border-radius:8px;border:1px solid transparent;transition:.15s}
.nav a i{font-style:normal;font-size:15px;width:18px;text-align:center;filter:saturate(.9)}
.nav a:hover{background:#15223c;color:var(--tx)}
.nav a.on{background:linear-gradient(90deg,#1b2e52,#15243f);color:#fff;font-weight:600;
          border-color:#274067;box-shadow:inset 3px 0 0 var(--pri)}
.nav .sp2{flex:1}
.nav .hint{color:var(--tx3);line-height:1.6;padding:8px 11px;border-top:1px solid var(--bd)}
main{flex:1;min-width:0;overflow:auto;padding:14px 16px}
.tab{display:none}
.tab.on{display:block;animation:fade .18s ease}
@keyframes fade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}

/* 页头 */
.pagehd{margin-bottom:12px}
.pagehd h2{font-size:16px;font-weight:600;margin-bottom:3px}
.pagehd p{font-size:12px;max-width:900px}

/* ---------- 通用卡片 ---------- */
.card{background:linear-gradient(180deg,var(--panel),#0f1a2e);border:1px solid var(--bd);
      border-radius:12px;box-shadow:var(--shadow)}
.card>.hd2{padding:10px 13px;border-bottom:1px solid var(--bd);font-weight:600;font-size:12.5px;
           display:flex;align-items:center;gap:8px;flex-wrap:wrap;
           background:linear-gradient(180deg,rgba(27,43,74,.5),transparent)}
.card>.bd{padding:12px}
.stack{display:flex;flex-direction:column;gap:12px}
.stack>div{background:linear-gradient(180deg,var(--panel),#0f1a2e);border:1px solid var(--bd);
           border-radius:12px;overflow:hidden}
.padx{padding:9px 12px}
.rowbtns{display:flex;gap:8px;flex-wrap:wrap;border-bottom:1px solid var(--bd)}
.muted{color:var(--tx2)}
.tiny{font-size:11px}
.xsmall{font-size:11.5px}
.mono{font-family:Consolas,"Courier New",monospace}
.pill{background:#16243f;border:1px solid var(--bd2);color:var(--tx2);padding:2px 9px;border-radius:20px}
.vd{width:1px;height:18px;background:var(--bd2);margin:0 2px}
.chk{display:inline-flex;align-items:center;gap:4px;cursor:pointer}

/* 按钮 */
.btn{background:linear-gradient(180deg,var(--pri2),var(--pri));color:#04122e;border:none;
     padding:6px 13px;border-radius:7px;cursor:pointer;font-weight:600;transition:.15s;
     box-shadow:0 2px 8px rgba(79,140,255,.28)}
.btn:hover{filter:brightness(1.08)}
.btn:active{transform:translateY(1px)}
.btn.gh{background:#17253f;color:var(--tx);border:1px solid var(--bd2);box-shadow:none;font-weight:500}
.btn.gh:hover{background:#1f3157;border-color:#3a5182}
.btn.ok{background:linear-gradient(180deg,#4ade80,#22c55e);color:#04240f;
        box-shadow:0 2px 8px rgba(34,197,94,.3)}
.btn.dn{background:#2a1520;color:#ffb3b3;border:1px solid #5a2733;box-shadow:none}
.btn.dn:hover{background:#43141f;border-color:#8b2635;color:#ffd6d6}
/* 次级“清理/取消”类：琥珀色，区别于红色危险操作 */
.btn.dnl{background:#2a2113;color:#fcd34d;border:1px solid #5c4a1c;box-shadow:none}
.btn.dnl:hover{background:#3d3014;border-color:#8a6d24;color:#ffe6a3}
.btn:disabled{background:#22314f;color:#5f739a;border-color:#22314f;box-shadow:none;cursor:not-allowed}
.btn.sm{padding:4px 10px;font-size:12px}
input[type=text],select,textarea{background:#0c1730;border:1px solid var(--bd2);
     border-radius:7px;padding:6px 9px;outline:none;color:var(--tx);transition:.15s}
input[type=text]::placeholder{color:var(--tx3)}
input[type=text]:focus,select:focus,textarea:focus{border-color:var(--pri);
     box-shadow:0 0 0 3px rgba(79,140,255,.16)}
select{cursor:pointer}
input[type=checkbox]{accent-color:var(--pri);width:14px;height:14px;cursor:pointer}

/* 双栏 */
.split{display:grid;gap:14px}
.split.s240{grid-template-columns:248px 1fr}
.split.s320{grid-template-columns:310px 1fr}
.split.s340{grid-template-columns:330px 1fr}
/* 图片模块：左侧截图列收窄到刚好放得下 720 宽的截图；右侧工具列占其余全部宽度 */
.split.s-img{grid-template-columns:minmax(0,744px) minmax(400px,1fr)}
@media(max-width:1500px){.split.s-img{grid-template-columns:minmax(0,620px) minmax(340px,1fr)}}
@media(max-width:1080px){.split{grid-template-columns:1fr !important}}

/* ---------- 脚本模块 ---------- */
.slist{max-height:calc(100vh - 300px);overflow:auto;padding:4px 8px}
.sitem{padding:8px 10px;border:1px solid transparent;border-radius:8px;cursor:pointer;
       display:flex;align-items:center;gap:6px;margin-bottom:3px;transition:.15s}
.sitem:hover{background:#16243f}
.sitem.on{background:linear-gradient(90deg,#1d3157,#16243f);border-color:#2b4870}
.sitem .n{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sitem .ext{color:var(--tx3);font-weight:400;margin-left:1px}
.sitem .x{color:var(--tx3);font-size:15px;line-height:1;padding:2px 6px;border-radius:5px}
.sitem .x:hover{background:#3a1520;color:var(--err)}
#editor{width:100%;height:calc(100vh - 340px);min-height:300px;border:1px solid var(--bd);
        border-radius:9px;overflow:hidden}
.editor-foot{display:flex;justify-content:space-between;margin-top:9px}

/* ---------- 布局分析 ---------- */
.toolbar-card{margin-bottom:14px}
.tree{max-height:calc(100vh - 285px);overflow:auto;padding:6px}
.tnode{padding:3px 8px;cursor:pointer;white-space:nowrap;font-size:12px;border-radius:5px;
       font-family:Consolas,monospace;border-left:2px solid transparent}
.tnode:hover{background:#16243f}
.tnode.on{background:#1d3157;border-left-color:var(--pri)}
.tnode .cls{color:#7f95bb}
.tnode .txt{color:#e8f0ff;font-weight:600}
.tnode .idc{color:var(--vio)}
.tnode .desc{color:var(--cyan)}
.tnode .bd{color:var(--tx3)}
.kv{display:grid;grid-template-columns:82px 1fr;gap:5px 10px;font-size:12px}
.kv .k{color:var(--tx2)}
.kv .v{word-break:break-all;font-family:Consolas,monospace;color:#cfe0ff}
pre.code{background:var(--code);color:var(--codeTx);border:1px solid #17243f;border-radius:8px;
         padding:11px;font-family:Consolas,monospace;font-size:12px;white-space:pre-wrap;
         max-height:300px;overflow:auto;line-height:1.6}

/* ---------- 图片处理 ---------- */
.canvas-wrap{position:relative;background:#070d19;border-radius:8px;overflow:auto;margin:11px;
             max-height:calc(100vh - 205px);text-align:center;border:1px solid #17243f;
             overscroll-behavior:contain}
/* 截图显示区：高度上限 1080；宽度跟随左侧列（列上限 744 → 内容宽 720），超出则容器滚动 */
#shot{cursor:crosshair;display:block;margin:0 auto;width:auto;height:auto;
      max-width:min(720px,100%);max-height:1080px}
.canvas-wrap.panning{cursor:grabbing}
/* 取色放大镜：鼠标进入截图区即跟随显示放大的像素块 */
.loupe{position:fixed;z-index:9995;display:none;pointer-events:none;padding:3px;
       background:linear-gradient(180deg,var(--panel),#0f1a2e);
       border:1px solid var(--bd2);border-radius:5px;
       box-shadow:0 8px 18px rgba(0,0,0,.6)}
.loupe.on{display:block}
.loupe #loupe-cv{display:block;border-radius:3px;image-rendering:pixelated;
                 background:#0b1020}
/* 框选过程中的实时边框（绝对定位覆盖层，避免每帧重绘画布） */
#sel-box{display:none;position:absolute;pointer-events:none;z-index:5;
         border:1px dashed #22d3ee;background:rgba(34,211,238,.16);
         box-shadow:0 0 0 1px rgba(2,8,20,.75), inset 0 0 0 1px rgba(2,8,20,.45)}
/* 生成代码框改为可编辑文本域：Ctrl+A 只全选框内内容 */
textarea.code{background:var(--code);color:var(--codeTx);border:1px solid #17243f;border-radius:8px;
              padding:11px;font-family:Consolas,monospace;font-size:12px;line-height:1.6;
              width:100%;box-sizing:border-box;height:220px;resize:vertical;
              white-space:pre;overflow:auto;outline:none;tab-size:2}
textarea.code:focus{border-color:var(--pri);box-shadow:0 0 0 2px rgba(56,189,248,.16)}

/* 图片模块右栏：整体字号加大，便于阅读 */
.img-side .hd2{font-size:13.5px}
.img-side .hd2 .tiny{font-size:12px}
.img-side .tiny{font-size:12.5px}
.img-side .bd{line-height:1.75}
.img-side .reg-grid{gap:10px 12px}
.img-side .reg-grid label{font-size:14.5px}
.img-side .reg-grid input{font-size:15px;padding:9px 12px}
.img-side .dirpath{font-size:14px;padding:9px 12px;line-height:1.5}
.img-side .ptrow{font-size:12.5px}
.img-side .ptrow .hex{font-size:12px}
.img-side .frow{font-size:13px}
.img-side .frow .fs{font-size:12px}
#cursor-info{position:sticky;top:0;left:0;background:rgba(8,14,28,.88);color:#bcd3f7;
             font-size:11px;font-family:Consolas,monospace;padding:4px 10px;text-align:left;
             border-bottom:1px solid #17243f;backdrop-filter:blur(4px)}
.ptlist{max-height:280px;overflow:auto;padding:4px 8px}
.ptrow{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:7px;font-size:12px}
.ptrow:hover{background:#16243f}
.ptrow .sw{width:16px;height:16px;border-radius:4px;border:1px solid #3a5182;flex:0 0 16px}
.ptrow .xy{font-family:Consolas,monospace;color:var(--tx2);min-width:104px}
.ptrow .hex{font-family:Consolas,monospace;color:#cfe0ff;cursor:pointer}
.ptrow .hex:hover{color:var(--cyan)}
.ptrow .x{margin-left:auto;color:var(--tx3);cursor:pointer;padding:0 6px;border-radius:4px}
.ptrow .x:hover{background:#3a1520;color:var(--err)}

/* 区域截图：命名 / 坐标 / 目录 */
.reg-grid{display:grid;grid-template-columns:auto 1fr;gap:7px 9px;align-items:center}
.reg-grid label{white-space:nowrap}
.reg-grid input{width:100%;font-family:Consolas,monospace;font-size:12px}
.dirpath{background:#0c1730;border:1px solid var(--bd2);border-radius:7px;padding:6px 9px;
         color:var(--tx2);word-break:break-all;font-family:Consolas,monospace;font-size:11px}
.frow{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:7px;font-size:12px}
.frow:hover{background:#16243f}
.frow .fn{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
          font-family:Consolas,monospace;color:#cfe0ff}
.frow .fs{color:var(--tx3);font-family:Consolas,monospace;font-size:11px}

/* ---------- 文件管理 ---------- */
.quickbar{display:flex;gap:7px;flex-wrap:wrap;padding:9px 13px;border-bottom:1px solid var(--bd);
          background:rgba(12,22,42,.5)}
.qbtn{background:#132138;border:1px solid var(--bd2);color:var(--tx2);border-radius:20px;
      padding:3px 11px;font-size:11.5px;cursor:pointer;transition:.15s}
.qbtn:hover{background:#1d3157;color:#fff;border-color:#3a5182}
table.ft{width:100%;border-collapse:collapse;font-size:12px}
table.ft th{text-align:left;padding:9px 11px;border-bottom:1px solid var(--bd);color:var(--tx2);
            font-weight:600;background:#0f1a2e;position:sticky;top:0;z-index:1}
table.ft th.sortable{cursor:pointer;user-select:none}
table.ft th.sortable:hover{color:var(--tx)}
table.ft th .ar{color:var(--pri);font-size:10px}
table.ft td{padding:7px 11px;border-bottom:1px solid #16233c}
table.ft tr:hover td{background:#14203a}
table.ft tr.on td{background:#1a2c4d}
.ft .nm{display:flex;align-items:center;gap:7px;cursor:pointer}
.ft .ic{width:16px;text-align:center}
.ftbox{max-height:calc(100vh - 320px);overflow:auto}
.dir{color:var(--pri2);font-weight:600}

/* 端切换分段控件 */
.seg{display:inline-flex;background:#0c1730;border:1px solid var(--bd2);border-radius:8px;padding:2px}
.seg button{background:transparent;border:none;color:var(--tx2);padding:5px 12px;border-radius:6px;
            cursor:pointer;font-size:12px;transition:.15s}
.seg button:hover{color:#fff}
.seg button.on{background:linear-gradient(180deg,var(--pri2),var(--pri));color:#04122e;font-weight:600}

/* 双端互传栏 */
.xferbar{padding:9px 13px;border-bottom:1px solid var(--bd);background:rgba(20,34,60,.42);
         display:flex;flex-direction:column;gap:7px}
.xrow{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.xlabel{flex:0 0 78px;font-size:11.5px;color:var(--cyan)}
.xrow input{flex:1;min-width:180px;font-family:Consolas,monospace;font-size:11.5px}
.xrow .btn.sm{flex:0 0 auto}

/* 当前路径面包屑：像网址一样可点各段跳转 */
.crumb{display:flex;flex-wrap:wrap;align-items:center;gap:1px;flex:1;min-width:200px;
       background:#0c1730;border:1px solid var(--bd2);border-radius:7px;padding:3px 7px;
       font-family:Consolas,monospace;font-size:11.5px}
.crumb .cseg{background:transparent;border:none;color:var(--pri2);cursor:pointer;
             padding:2px 6px;border-radius:5px;font-family:Consolas,monospace;font-size:11.5px;transition:.12s}
.crumb .cseg:hover{background:#1d3157;color:#fff;text-decoration:underline}
.crumb .cseg.cur{background:#1b2b4a;color:#fff;font-weight:600;cursor:default}
.crumb .cseg.cur:hover{text-decoration:none}
.crumb .csep{color:var(--tx3);padding:0 1px;user-select:none}
.crumb .cempty{color:var(--tx3);padding:2px 6px}

/* 表格勾选列 */
table.ft th.ckcol,table.ft td.ckcol{width:34px;text-align:center;padding-left:9px;padding-right:0}
table.ft th.ckcol input,table.ft td.ckcol input{margin:0}

/* ---------- 文件管理：左右双栏 ---------- */
.fm{display:grid;grid-template-columns:1fr 1fr;gap:14px;align-items:start}
@media(max-width:1400px){.fm{grid-template-columns:1fr}}
.pane{background:linear-gradient(180deg,var(--panel),#0f1a2e);border:1px solid var(--bd);
      border-radius:12px;box-shadow:var(--shadow);display:flex;flex-direction:column;
      min-width:0;overflow:hidden}
.pane .phd{display:flex;align-items:center;gap:8px;padding:9px 12px;border-bottom:1px solid var(--bd);
           font-weight:600;font-size:12.5px;
           background:linear-gradient(180deg,rgba(27,43,74,.55),transparent)}
.pane .phd .ptitle{flex:0 0 auto}
.pane .phd .psub{margin-left:auto;font-weight:400;color:var(--tx3)}
.pane .ptools{display:flex;flex-wrap:wrap;gap:6px;padding:9px 12px;border-bottom:1px solid var(--bd)}
.pane .ptools .ppath{flex:1;min-width:130px;font-family:Consolas,monospace;font-size:11.5px}
.pane .ptools .pfilter{width:88px}
.pane .pcrumb{display:flex;flex-wrap:wrap;align-items:center;gap:1px;margin:8px 12px 0;
              background:#0c1730;border:1px solid var(--bd2);border-radius:7px;padding:3px 7px;
              font-family:Consolas,monospace;font-size:11.5px}
.pane .pquick{display:flex;flex-wrap:wrap;gap:6px;padding:7px 12px}
.pane .pbar{display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:8px 12px;
            border-top:1px solid var(--bd);border-bottom:1px solid var(--bd);
            background:rgba(12,22,42,.5)}
.pane .pbar .psel{margin-left:auto}
.pane .ptable{flex:1;min-height:190px;max-height:calc(100vh - 430px);overflow:auto}
.pane .ptable table.ft th, .pane .ptable table.ft td{padding:6px 8px}
.pane .ptable table.ft th{font-size:11.5px}
.pane .ptable .btn.sm{padding:2px 7px;font-size:11px}

/* ---------- 页内弹窗 ---------- */
.modal-mask{position:fixed;inset:0;background:rgba(4,9,20,.62);backdrop-filter:blur(2px);
            display:none;align-items:center;justify-content:center;z-index:9999}
.modal-mask.on{display:flex}
.modal{width:380px;max-width:92vw;background:linear-gradient(180deg,var(--panel),#0f1a2e);
       border:1px solid var(--bd2);border-radius:12px;box-shadow:0 18px 50px rgba(0,0,0,.55);
       overflow:hidden;animation:pop .14s ease}
@keyframes pop{from{transform:scale(.96);opacity:0}to{transform:none;opacity:1}}
.modal .mtitle{padding:12px 15px;border-bottom:1px solid var(--bd);font-weight:600;font-size:13px}
.modal .mbody{padding:14px 15px}
.modal .mbody input{width:100%;font-family:Consolas,monospace;font-size:13px}
.modal .mfoot{display:flex;justify-content:flex-end;gap:8px;padding:11px 15px;
              border-top:1px solid var(--bd);background:rgba(12,22,42,.5)}

/* ---------- 右侧日志面板 ---------- */
.console{flex:0 0 384px;width:384px;min-width:0;background:var(--code);
         border-left:1px solid var(--bd);display:flex;flex-direction:column;
         box-shadow:-6px 0 22px rgba(0,0,0,.4);
         transition:flex-basis .18s ease,width .18s ease}
.console .ch{flex:0 0 auto;display:flex;align-items:center;gap:8px;flex-wrap:wrap;
             padding:8px 11px;background:linear-gradient(180deg,#111d33,#0c1526);
             font-size:12px;color:var(--tx2);border-bottom:1px solid var(--bd)}
.console .ch .sp{flex:1}
.console .ch .ctitle{display:flex;align-items:center;gap:7px;color:var(--tx);font-weight:600}
.console .ch .cdot{width:7px;height:7px;border-radius:50%;background:var(--cyan);
                   box-shadow:0 0 8px var(--cyan)}
.console .ch button{background:#17253f;color:var(--tx2);border:1px solid var(--bd2);
                    padding:3px 10px;border-radius:6px;cursor:pointer;font-size:12px}
.console .ch button:hover{background:#1f3157;color:#fff}
/* 日志暂停状态徽标 */
.console .ch .cstate{font-size:11px;padding:2px 8px;border-radius:20px;
                     background:#3a2b12;color:#fcd34d;border:1px solid #6b5320;white-space:nowrap}
.console #log{flex:1;min-height:0;overflow:auto;padding:9px 12px;font-family:Consolas,monospace;
     font-size:12px;white-space:pre-wrap;word-break:break-word;line-height:1.65;color:#a9bcdd}
/* 右键上下文菜单 */
.ctx{position:fixed;display:none;z-index:9999;min-width:132px;padding:5px;
     background:linear-gradient(180deg,var(--panel),#0f1a2e);border:1px solid var(--bd2);
     border-radius:9px;box-shadow:0 12px 34px rgba(0,0,0,.55);user-select:none}
.ctx.on{display:block}
.ctx button{display:block;width:100%;text-align:left;background:transparent;border:none;
            color:var(--tx2);font-size:12.5px;padding:7px 11px;border-radius:6px;cursor:pointer;
            font-family:inherit}
.ctx button:hover:not(:disabled){background:#1d3157;color:#fff}
.ctx button:disabled{color:var(--tx3);cursor:default}
.ctx button.on{color:var(--pri2);font-weight:600}
.ctx button.on::after{content:" ✓";font-weight:400}
.ctx .sep{height:1px;margin:4px 7px;background:var(--bd)}
/* 文件预览浮层 */
.viewer{position:fixed;inset:0;z-index:9990;display:none;background:rgba(4,9,20,.74);
        backdrop-filter:blur(3px);align-items:center;justify-content:center;padding:22px}
.viewer.on{display:flex}
.viewer .vbox{width:min(1240px,97vw);height:min(88vh,940px);display:flex;flex-direction:column;
              background:linear-gradient(180deg,var(--panel),#0f1a2e);border:1px solid var(--bd2);
              border-radius:12px;box-shadow:0 22px 64px rgba(0,0,0,.6);overflow:hidden}
.viewer .vhd{flex:0 0 auto;display:flex;align-items:center;gap:10px;flex-wrap:wrap;
             padding:10px 14px;border-bottom:1px solid var(--bd);
             background:linear-gradient(180deg,#111d33,#0c1526)}
.viewer .vhd .sp{flex:1}
.viewer .vname{font-weight:600;color:var(--tx);font-size:13px;word-break:break-all}
.viewer .vpath{max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.viewer .vbody{flex:1;min-height:0;display:flex;align-items:flex-start;justify-content:flex-start;
               background:#070d19;overflow:auto;padding:12px;position:relative}
.viewer #fview-img{width:100%;height:100%;object-fit:contain;margin:auto;
                   box-shadow:0 8px 26px rgba(0,0,0,.55);border-radius:4px}
.viewer #fview-img.raw{width:auto;height:auto;max-width:none;max-height:none;
                       object-fit:fill;box-shadow:none}
.viewer #fview-text{align-self:stretch;margin:0;width:100%;max-height:100%;
                    overflow:auto;white-space:pre-wrap;word-break:break-word;
                    font-family:Consolas,monospace;font-size:12.5px;line-height:1.6;
                    color:#a9bcdd;text-align:left}
.viewer #fview-empty{text-align:center;line-height:1.9;margin:auto}
.viewer .hide{display:none !important}
/* 收起：只留一条窄边栏 */
.console.min{flex:0 0 48px;width:48px}
.console.min .ch{flex:1;flex-direction:column;flex-wrap:nowrap;gap:10px;
                 padding:12px 5px;border-bottom:none}
.console.min .ctitle{writing-mode:vertical-rl;text-orientation:mixed;letter-spacing:2px;
                     color:var(--tx);font-size:12px}
.console.min .ch .sp{flex:0 0 14px}
.console.min #c-count,.console.min #c-clear,.console.min #c-state{display:none}
.console.min #log{display:none}
@media(max-width:1400px){.console{flex-basis:330px;width:330px}}
#log .t{color:#7dd3fc}
#log .g{color:#86efac}
#log .r{color:#fca5a5}
#log .y{color:#fcd34d}
#log img{max-width:100%;max-height:150px;border-radius:6px;margin:4px 0;
         border:1px solid #22314f;display:block;object-fit:contain}

/* ============ 云机状态 ============ */
.cloud-wrap{display:flex;flex-direction:column;gap:14px;padding:4px 2px 20px}
.cloud-group{margin:0}
.cloud-group .cg-flag{font-weight:600;color:var(--tx);font-size:14px}
.cloud-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
           padding:8px 12px;border-bottom:1px solid var(--bd);background:#0e1a30}
.cloud-tbl{width:100%;border-collapse:collapse;font-size:12.5px}
.cloud-tbl thead th{position:sticky;top:0;text-align:left;padding:8px 10px;
            background:#13213a;color:var(--tx2);font-weight:600;cursor:pointer;
            border-bottom:1px solid var(--bd2);user-select:none;white-space:nowrap}
.cloud-tbl thead th:hover{background:#1b2e52;color:var(--tx)}
.cloud-tbl thead th.ck{width:34px;text-align:center;cursor:default}
.cloud-tbl tbody td{padding:7px 10px;border-bottom:1px solid #16233c;vertical-align:top}
.cloud-tbl tbody tr.on{background:rgba(52,211,153,.05)}
.cloud-tbl tbody tr.off{opacity:.6}
.cloud-tbl tbody tr:hover{background:#13203a}
.cloud-tbl .cgn{font-weight:600;color:var(--tx)}
.cloud-tbl .ops{white-space:nowrap}
.cloud-tbl .tag{display:inline-block;padding:2px 8px;border-radius:20px;font-size:11px}
.cloud-tbl .tag.run{background:rgba(34,211,238,.16);color:var(--cyan);
            border:1px solid rgba(34,211,238,.4)}
.cloud-tbl .tag.idle{background:#16233c;color:var(--tx3);border:1px solid var(--bd)}
.btn.xs{padding:3px 8px;font-size:11px;border-radius:6px}
.btn.dn{color:#ffb3b3;border-color:#5a2733;background:#2a1520}
.btn.dn:hover{background:#43141f;border-color:#8b2635;color:#ffd0d0}
.cloud-log-row td{padding:0 !important}
.cloud-log{max-height:220px;overflow:auto;background:#070d19;padding:8px 12px;
          font-family:Consolas,monospace;font-size:11.5px;line-height:1.6;color:#a9bcdd}
.cloud-log .cl-line{white-space:pre-wrap;word-break:break-word}
.cloud-log .cl-line.err{color:#fca5a5}

/* 项目名下的机器编号快捷定位条 */
.cloud-mnos{display:flex;flex-wrap:wrap;gap:6px;padding:8px 12px;
           border-bottom:1px solid var(--bd);background:rgba(8,14,26,.4)}
.cloud-mnos .muted{font-size:11px;color:var(--tx3);align-self:center;margin-right:2px}
.cloud-mno{display:inline-block;padding:2px 9px;border-radius:14px;font-size:11px;
          background:#16233c;color:var(--tx3);border:1px solid var(--bd);cursor:pointer;
          transition:all .15s}
.cloud-mno:hover{background:#1d3b66;color:var(--tx);border-color:#2d5fa6}
.cloud-mno.on{background:var(--cyan);color:#04121c;border-color:var(--cyan);font-weight:600}

/* 表格里的机器编号单元格（可点击定位） */
.cloud-tbl .mno{cursor:pointer;color:var(--cyan);text-decoration:underline dotted;
               text-underline-offset:2px;font-weight:600;white-space:nowrap}
.cloud-tbl .mno:hover{background:rgba(34,211,238,.12)}
.cloud-tbl tbody tr.mno-empty .mno{color:var(--tx3);text-decoration:none;font-weight:400}

/* 定位高亮动画 */
.cloud-tbl tbody tr.flash{animation:cloudFlash 1.4s ease}
@keyframes cloudFlash{
  0%{background:rgba(34,211,238,.45)}
  100%{background:transparent}
}
/* 定位后持续高亮（跨轮询保持） */
.cloud-tbl tbody tr.located{box-shadow:inset 3px 0 0 var(--cyan);
          background:rgba(34,211,238,.10)}

/* 顶部「按机器编号定位」输入框 */
.cloud-locate{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:10px}
.cloud-locate input{width:120px;padding:5px 9px;border-radius:7px;
                    border:1px solid var(--bd);background:#08101c;color:var(--tx);font-size:13px}
.cloud-locate input:focus{outline:none;border-color:var(--cyan)}

/* 云机状态：单行「日志输出」列（原「被控设备+项目名」合并列，等宽） */
.cloud-tbl td.clog{max-width:260px;min-width:180px;overflow:hidden;white-space:nowrap;
              text-overflow:ellipsis;color:var(--tx2);font-size:12px;font-family:ui-monospace,Consolas,monospace}
.cloud-tbl td.clog.err{color:var(--red,#f87171)}
.cloud-tbl th.clog-th{min-width:180px}

/* 当前脚本列：前两个脚本 tag 并排，可换行 */
.cloud-tbl td.cscripts .tag{margin:1px 4px 1px 0;max-width:120px;overflow:hidden;
                      text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}

/* 按IP排列：相同 IP 高亮 + 台数徽标 */
.cloud-tbl td.cip .ipdup{color:#fbbf24;font-weight:600}
.cloud-tbl .ipdup-n{display:inline-block;padding:0 6px;border-radius:9px;font-size:10.5px;
              background:rgba(251,191,36,.16);color:#fbbf24;border:1px solid rgba(251,191,36,.35)}
/* 工具栏「按IP排列」勾选项 */
.cloud-bar .cg-iplabel{display:inline-flex;align-items:center;gap:5px;cursor:pointer;
                 color:var(--tx2);user-select:none}
.cloud-bar .cg-iplabel input{accent-color:var(--cyan);cursor:pointer}

/* ===========================================================
 * 登录界面 —— 全屏玻璃拟态遮罩，覆盖在控制台上方
 * =========================================================== */
.login-mask{
  position:fixed;inset:0;z-index:9999;
  display:flex;align-items:center;justify-content:center;
  background:
    radial-gradient(900px 500px at 20% -10%, rgba(79,140,255,.18) 0%, transparent 55%),
    radial-gradient(700px 500px at 90% 110%, rgba(167,139,250,.16) 0%, transparent 55%),
    linear-gradient(160deg,#0a1020 0%, #0b1322 55%, #0a0f1e 100%);
  animation:loginFade .35s ease;
}
.login-mask.hide{display:none}
@keyframes loginFade{from{opacity:0}to{opacity:1}}

.login-card{
  position:relative;width:380px;max-width:92vw;
  padding:34px 34px 24px;
  border-radius:20px;overflow:hidden;
  background:linear-gradient(180deg, rgba(22,36,63,.9), rgba(14,23,41,.96));
  border:1px solid var(--bd2);
  box-shadow:0 20px 60px rgba(0,0,0,.5), inset 0 1px 0 rgba(255,255,255,.04);
  backdrop-filter:blur(14px);
  animation:loginPop .4s cubic-bezier(.2,.9,.3,1.2);
}
@keyframes loginPop{from{opacity:0;transform:translateY(18px) scale(.97)}to{opacity:1;transform:none}}
.login-bg-glow{position:absolute;top:-70px;right:-60px;width:180px;height:180px;border-radius:50%;
  background:radial-gradient(circle, rgba(34,211,238,.28), transparent 70%);pointer-events:none}
.login-bg-glow::after{content:'';position:absolute;bottom:-80px;left:-90px;width:200px;height:200px;
  border-radius:50%;background:radial-gradient(circle, rgba(79,140,255,.22), transparent 70%)}

.login-logo{position:relative;display:flex;align-items:center;gap:12px;margin-bottom:10px}
.login-mark{display:grid;place-items:center;width:46px;height:46px;border-radius:13px;
  font-size:17px;font-weight:800;color:#04122e;
  background:linear-gradient(135deg,var(--cyan),var(--pri));
  box-shadow:0 6px 18px rgba(79,140,255,.45)}
.login-logo-txt .login-tt{font-size:19px;font-weight:700;letter-spacing:.3px}
.login-logo-txt .login-sub{font-size:11.5px;color:var(--tx3)}
.login-desc{position:relative;font-size:12px;color:var(--tx2);margin-bottom:22px}

.login-field{position:relative;display:block;margin-bottom:16px}
.login-label{display:block;font-size:12px;color:var(--tx2);margin-bottom:6px;font-weight:500}
.login-input-wrap{position:relative;display:flex;align-items:center}
.login-ico{position:absolute;left:12px;font-size:14px;opacity:.65;pointer-events:none}
.login-input-wrap input{
  width:100%;background:rgba(8,14,28,.75);border:1px solid var(--bd2);
  border-radius:10px;padding:11px 38px 11px 36px;color:var(--tx);outline:none;
  transition:.15s;font-size:14px}
.login-input-wrap input::placeholder{color:var(--tx3)}
.login-input-wrap input:focus{border-color:var(--pri);box-shadow:0 0 0 3px rgba(79,140,255,.15)}
.login-eye{position:absolute;right:10px;background:none;border:none;color:var(--tx3);font-size:15px;
  cursor:pointer;padding:4px;line-height:1;border-radius:6px}
.login-eye:hover{color:var(--tx)}

.login-err{min-height:16px;font-size:12px;color:var(--err);margin:-6px 0 8px;padding-left:2px}

.login-btn{width:100%;padding:12px;border:none;border-radius:11px;cursor:pointer;
  font-size:15px;font-weight:700;letter-spacing:4px;color:#04122e;
  background:linear-gradient(135deg,var(--pri2),var(--pri) 60%,var(--vio));
  box-shadow:0 6px 20px rgba(79,140,255,.38);transition:.18s}
.login-btn:hover{filter:brightness(1.08);box-shadow:0 8px 26px rgba(79,140,255,.5)}
.login-btn:active{transform:translateY(1px)}
.login-btn:disabled{filter:saturate(.3) brightness(.8);cursor:wait}

.login-foot{position:relative;display:flex;align-items:center;justify-content:space-between;
  margin-top:18px;padding-top:14px;border-top:1px solid var(--bd)}
.login-foot .tiny b{color:var(--pri2)}
.login-save{display:inline-flex;align-items:center;gap:5px;font-size:11px;color:var(--tx2);cursor:pointer}
.login-save label{cursor:pointer;user-select:none}
