/* 查看器弹窗 */
  .vmask{position:fixed;inset:0;background:#000b;display:none;z-index:80;padding:2.5vh 2vw}
  .vmask.show{display:block}
  .vmodal{position:relative;width:96vw;height:95vh;margin:0 auto;background:var(--panel);
    border:1px solid var(--line);border-radius:12px;overflow:hidden;box-shadow:0 20px 60px #000a;
    padding-top:44px}
  .vbar{position:absolute;left:0;right:0;top:0;height:44px;display:flex;align-items:center;gap:10px;
    padding:0 56px 0 16px;border-bottom:1px solid var(--line);background:var(--panel)}
  .vtitle{min-width:0;flex:1;color:var(--txt);font-size:14px;font-weight:700;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .vtitle .muted{color:var(--muted);font-weight:600;margin-right:8px}
  .vbar .vact{background:var(--panel2);color:var(--txt);border:1px solid var(--line);
    border-radius:8px;padding:6px 12px;font-size:12.5px;font-weight:600;cursor:pointer}
  .vbar .vact:hover{border-color:var(--accent);color:#fff}
  .vbar .vact.moved{display:none}
  .vmodal .x{position:absolute;right:10px;top:5px;z-index:2;background:var(--panel2);
    border:1px solid var(--line);color:var(--txt);border-radius:8px;width:34px;height:34px;
    cursor:pointer;font-size:18px}
  .vmodal iframe{width:100%;height:100%;border:0;display:block;border-radius:0 0 12px 12px}
  .st{font-size:12px;padding:2px 8px;border-radius:20px}
  .st.run{background:#3a2a08;color:#ffcf6b} .st.err{background:#3a1414;color:#ffb4b4}
  .st.ok{background:#13351f;color:#7fe3a3}
  .badge{font-size:11px;padding:2px 9px;border-radius:20px;font-weight:600}
  .b-matched{background:#13351f;color:#7fe3a3} .b-relaxed{background:#3a2a08;color:#ffcf6b}
  .b-deburr{background:#0e2a40;color:#7fd3f5} .b-unmatched{background:#3a1414;color:#ffb4b4}
  /* 详情 modal */
  .mask{position:fixed;inset:0;background:#000a;display:none;z-index:50;
    padding:30px;overflow:auto}
  .mask.show{display:block}
  .ai-material-float{position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);
    z-index:90;display:none;align-items:center;gap:10px;padding:12px 18px;
    border:1px solid var(--line);border-radius:999px;background:rgba(18,24,35,.78);
    color:var(--txt);box-shadow:0 12px 36px #0006;backdrop-filter:blur(10px);
    font-size:14px;font-weight:650}
  .ai-material-float.show{display:flex}
  .ai-material-float .spin{width:14px;height:14px;border:2px solid #ffffff55;
    border-top-color:var(--accent);border-radius:50%;animation:spin .8s linear infinite}
  /* 任务进度条（工作台表格上方） */
  .task-progress-float{display:none;align-items:flex-start;gap:12px;padding:12px 16px;margin-bottom:10px;
    width:100%;box-sizing:border-box;
    border:1px solid #ffffff22;border-radius:14px;background:rgba(18,24,35,.78);
    box-shadow:0 8px 24px #0004;backdrop-filter:blur(10px);
    color:var(--txt)}
  .task-progress-float.show{display:flex}
  .task-progress-float .spin{width:16px;height:16px;border:2px solid #ffffff55;flex:0 0 16px;margin-top:2px;
    border-top-color:var(--accent);border-radius:50%;animation:spin .8s linear infinite}
  .task-progress-body{flex:1;min-width:0}
  .task-progress-title{font-size:14px;font-weight:700;color:var(--txt);min-height:1.25em}
  .task-progress-msg{font-size:12.5px;color:var(--muted);margin-top:4px;line-height:1.45;
    min-height:2.9em;font-variant-numeric:tabular-nums;word-break:break-all}
  .task-progress-bar-wrap{height:6px;background:#ffffff18;border-radius:999px;margin-top:12px;overflow:hidden}
  .task-progress-bar{height:100%;background:linear-gradient(90deg,var(--accent),#7c9cff);width:0;
    transition:width .2s ease;border-radius:999px}
  .task-progress-actions{margin-top:12px;display:flex;justify-content:flex-end}
  .task-progress-actions .btn.stop-all{border-color:#7f1d1d;color:#ffb4b4}
  .task-progress-actions .btn.stop-all:hover:not(:disabled){background:#3a1414;color:#fff}
  @keyframes spin{to{transform:rotate(360deg)}}
  .modal{max-width:1000px;margin:0 auto;background:var(--panel);
    border:1px solid var(--line);border-radius:14px;padding:22px;position:relative}
  .modal .x{position:absolute;right:14px;top:12px;background:var(--panel2);
    border:1px solid var(--line);color:var(--txt);border-radius:8px;
    width:34px;height:34px;cursor:pointer;font-size:18px;line-height:1;
    display:flex;align-items:center;justify-content:center;padding:0;
    touch-action:manipulation;transition:background .12s,border-color .12s,color .12s}
  .modal .x:hover{background:#33405e;border-color:#3d4d70;color:#fff}
  .modal .x:focus-visible{outline:2px solid #6ea8fe;outline-offset:2px}
  .meta{display:flex;gap:18px;flex-wrap:wrap;color:var(--muted);font-size:13px;margin:10px 0 4px}
  .meta b{color:var(--txt)}
  .route{display:flex;flex-wrap:wrap;align-items:stretch;gap:8px;margin-top:8px}
  .stage{background:var(--panel2);border:1px solid var(--line);border-radius:10px;
    padding:10px 12px;min-width:150px;flex:1 1 150px}
  .stage .n{font-weight:700;color:#cfe0ff} .stage .e{color:var(--muted);font-size:12px;margin-top:4px;line-height:1.5}
  .stage .c{color:var(--accent2);font-size:11px;margin-top:4px}
  .flow-route{display:flex;align-items:center;flex-wrap:wrap;gap:6px;line-height:1.7}
  .flow-step{display:inline-flex;align-items:center;border:1px solid #2b3857;background:#101a2c;
    border-radius:999px;padding:3px 10px;color:#dbeafe;font-weight:650;font-size:12px}
  .flow-arrow{color:var(--muted);font-size:12px}
  .route-feat-cell{position:relative;display:inline-block;cursor:help}
  .route-feat-cell:hover .route-feat-label{text-decoration:underline;text-decoration-style:dashed;text-underline-offset:3px}
  .proc-ok{color:#cfe0ff}
  .proc-partial{color:#ffcf6b;font-weight:700}
  .proc-missing{color:#ffb4b4;font-weight:700}
  .arrow{align-self:center;color:var(--muted)}
  .summary{background:#10243f;border:1px solid #1c3a63;border-radius:10px;
    padding:14px;white-space:pre-wrap;line-height:1.7;font-size:13.5px;margin-top:12px}
  .stat{color:var(--muted);font-size:13px;margin:6px 0 12px}
  .fg{border:1px solid var(--line);border-radius:10px;margin-bottom:10px;overflow:hidden}
  .fg>summary{cursor:pointer;padding:12px 14px;background:var(--panel2);
    display:flex;align-items:center;gap:10px;font-size:13.5px;list-style:none}
  .fg>summary::-webkit-details-marker{display:none}
  .fg .body{padding:12px 16px;font-size:13px;line-height:1.7}
  .cnt{margin-left:auto;color:var(--muted)}
  .kv{color:var(--muted)} .kv b{color:var(--txt);font-weight:600}
  .kv a{color:var(--accent);text-decoration:none;border-bottom:1px dashed #4f8cff99}
  .kv a:hover{color:#fff;border-bottom-color:var(--accent)}
  table.tr{border-collapse:collapse;width:100%;margin-top:8px;font-size:12px}
  table.tr td,table.tr th{border:1px solid var(--line);padding:5px 8px;text-align:left}
  table.tr th{background:var(--panel2);color:var(--muted)}
  .ok2{color:#7fe3a3} .no2{color:#ffb4b4}
  a.dl{color:var(--accent);font-size:13px;text-decoration:none}
  
