  /* ---------- 右下角：日志悬浮 + 版本号 ---------- */
  #logFab{position:fixed;right:18px;bottom:34px;z-index:70;display:inline-flex;align-items:center;gap:7px;
    background:var(--panel2);border:1px solid var(--line2);border-radius:var(--radius-card);padding:6px 13px;
    font:12px var(--mono);color:var(--text2);cursor:pointer;box-shadow:0 8px 24px #0009;transition:.15s}
  #logFab:hover{background:var(--hover);border-color:var(--line2);color:var(--text)}
  #logFab.on{background:var(--accent-bg2);border-color:var(--accent-line);color:var(--text)}
  #logFab .lgdot{width:6px;height:6px;border-radius:50%;background:var(--line2);flex:none}
  #logFab.hasnew .lgdot{background:var(--warn);box-shadow:0 0 0 3px #ffb02022}
  #logPop{position:fixed;right:18px;bottom:76px;z-index:70;width:min(460px,calc(100vw - 36px));
    height:258px;display:flex;flex-direction:column;
    overflow:hidden;
    animation:popin .18s cubic-bezier(.16,1,.3,1)}
  #logPop[hidden]{display:none}
  #logPop .lhead{display:flex;align-items:center;gap:6px;padding:8px 10px;
    border-bottom:1px solid var(--line);font:11.5px var(--mono);color:var(--text2);letter-spacing:.5px}
  #log{flex:1;font:11.5px/1.65 var(--mono);color:var(--text2);background:var(--field);padding:9px 11px;
    overflow:auto;white-space:pre-wrap;word-break:break-word}
  #log .t{color:var(--dim2)}
  #log .e{color:var(--err)}
  #log .g{color:var(--ok)}
  #appver{position:fixed;right:20px;bottom:11px;z-index:70;font:10.5px var(--mono);color:var(--dim2);
    letter-spacing:.4px;pointer-events:none;user-select:none}

  /* ---------- 输出：任务记录弹出框 ---------- */
  .outdir{display:flex;align-items:center;gap:7px;font:10.5px var(--mono);color:var(--dim2);
    margin:-2px 0 8px;padding:4px 7px;background:var(--field);border:1px solid var(--line);border-radius:var(--radius-control)}
  .outdir span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .outdir a{color:var(--accent);cursor:pointer;flex:none}
  .outdir a:hover{text-decoration:underline}
  #outCard{position:relative}
  .histpop{position:absolute;inset:34px 8px 8px;z-index:20;background:var(--pop);
    border:1px solid var(--line2);border-radius:var(--radius-control);box-shadow:0 18px 48px #000c;
    display:flex;flex-direction:column;overflow:hidden;animation:popin .18s cubic-bezier(.16,1,.3,1)}
  .histpop[hidden]{display:none}
  .histpop .hhead{display:flex;align-items:center;gap:6px;padding:8px 9px;white-space:nowrap;
    border-bottom:1px solid var(--line);font:11.5px var(--mono);color:var(--text2)}
  .histpop .hhead .tip{font-size:10px;color:var(--dim2);overflow:hidden;text-overflow:ellipsis;
    flex:1;min-width:0}
  .histpop .hhead button{flex:none;white-space:nowrap}
  /* 删除历史：风险动作单独用错误色，卡片头与任务记录弹窗头共用一套 */
  .mini.ghost.danger,.histpop .hhead button.danger{color:var(--err);border-color:var(--err-line);
    background:var(--err-bg)}
  .mini.ghost.danger:hover,.histpop .hhead button.danger:hover{border-color:var(--err);background:var(--err-bg)}
  .hlist{flex:1;overflow:auto;padding:7px;display:flex;flex-direction:column;gap:6px}
  .hrow{background:var(--field);border:1px solid var(--line);border-radius:var(--radius-control);padding:7px 8px}
  .hrow:hover{border-color:var(--line2)}
  .hrow .htop{display:flex;align-items:center;gap:7px;margin-bottom:4px;flex-wrap:wrap}
  .hrow .hmeta{font:10px var(--mono);color:var(--dim)}
  .hrow .hprompt{font:11px/1.6 var(--mono);color:var(--text2);max-height:52px;overflow:hidden;
    display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}
  .hrow .hacts{display:flex;gap:10px;margin-top:5px}
  .hrow .hacts a{font:10.5px var(--mono);color:var(--accent);cursor:pointer;text-decoration:none}
  .hrow .hacts a:hover{text-decoration:underline}
  .hrow .hacts a.dim{color:var(--dim2)}
  .pill{font:10px var(--mono);padding:1px 7px;border-radius:var(--radius-card);border:1px solid;display:inline-block}
  .pill.run{color:var(--warn);border-color:var(--warn-line);background:var(--warn-bg)}
  .pill.ok{color:var(--ok);border-color:var(--ok-line);background:var(--ok-bg)}
  .pill.err{color:var(--err);border-color:var(--err-line);background:var(--err-bg)}
  .pill.idle{color:var(--dim);border-color:var(--line);background:var(--panel2)}

  /* ---------- 输出：已生成的成片（横向紧凑行） ---------- */
  .outlist{display:flex;flex-direction:column;gap:6px;max-height:520px;overflow:auto;
           padding-right:2px}
  /* 占位区 / 成片区：只是两个分组容器（占位区要能原地打补丁而不动动画），
     display:contents 让里面的 .oitem 依旧直接参与 .outlist 的 flex 排布和 gap */
  #pendBox,#doneBox{display:contents}
  .oitem{flex:0 0 auto;display:flex;gap:9px;align-items:center;background:var(--panel2);
         border:1px solid var(--line);border-radius:var(--radius-control);padding:6px 8px 6px 6px;
         transition:border-color .15s,background .15s}
  .oitem:hover{border-color:var(--line2);background:var(--hover)}
  .oitem[draggable="true"]{cursor:grab}
  .oitem .ov{position:relative;flex:0 0 116px;width:116px;height:65px;border-radius:var(--radius-tag);
             background:#000;cursor:zoom-in;overflow:hidden;border:1px solid var(--line)}
  .oitem .ov video{width:100%;height:100%;object-fit:cover;display:block}
  .oitem .ov .oplay{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
    width:22px;height:22px;border-radius:50%;background:#000b;border:1px solid #ffffff33;
    display:flex;align-items:center;justify-content:center;font-size:8px;color:var(--on-media);
    padding-left:1px;transition:.16s;pointer-events:none}
  .oitem .ov.playing .oplay{opacity:0;transform:translate(-50%,-50%) scale(.8)}
  .oitem .ov .onew{position:absolute;left:4px;top:4px;background:#1d4ed8e0;
    border:1px solid #6f9dff99;border-radius:var(--radius-tag);font:9px var(--mono);padding:0 4px;
    color:#fff;letter-spacing:.2px}
  .oitem .ov .obadge{position:absolute;right:4px;bottom:3px;background:#000c;border-radius:var(--radius-tag);
    font:9px var(--mono);padding:0 4px;color:var(--on-media)}
  .oitem .ov .oload{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
    font-size:9px;color:var(--on-media-dim);background:#000b;border-radius:var(--radius-tag);padding:2px 5px;display:none;
    white-space:nowrap}
  .oitem .ov.loading .oload{display:block}
  .oitem .ov.loading .oplay{display:none}
  .oitem .ometa{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px;
    font:11px/1.5 var(--mono);color:var(--dim);position:relative}
  .oitem .ometa>b{padding-right:64px}      /* 给右上角价格胶囊让位 */
  /* 右上角价格胶囊：视频按 token、图片按张，估算值前面加 ≈ */
  .oitem .ocost{position:absolute;right:0;top:0;display:inline-flex;align-items:center;
    height:17px;padding:0 6px;border-radius:var(--radius-tag);background:var(--panel2);
    border:1px solid var(--line);color:var(--text2);font:10.5px var(--mono);
    font-variant-numeric:tabular-nums;white-space:nowrap}
  .oitem .ocost.est{color:var(--dim)}
  .oitem .ocost.off{color:var(--dim2)}
  .oitem .ometa b{color:var(--text);font-weight:500;font-size:11.5px;overflow:hidden;
    text-overflow:ellipsis;white-space:nowrap}
  .oitem .ometa .orow{display:flex;align-items:baseline;gap:8px;justify-content:space-between}
  .oitem .ometa .ospec{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
  .oitem .ometa .otime{color:var(--dim2);flex:none;font-size:10.5px}
  .oitem .ometa .acts{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end;row-gap:2px}
  .oitem .ometa .acts a{color:var(--accent);font-size:10.5px;text-decoration:none;cursor:pointer;
    white-space:nowrap}
  .oitem .ometa .acts a:hover{text-decoration:underline}
  .oempty{color:var(--dim);font-size:12px;padding:8px 0}
  /* 图片面板底部的价格提示 */
  .hintcost{color:var(--text2);font-variant-numeric:tabular-nums}
  .hintcost b{color:var(--text);font-weight:600}
  .hintcost.off{color:var(--dim2)}
  /* 每条成片下面那行「这一版用的提示词」 */
  /* 这一行只用来读/选中复制，点了不触发任何动作（曾经点一下就「重新编辑」，极易误触） */
  .oitem .oprompt{font:10.5px/1.5 var(--mono);color:var(--dim);overflow:hidden;text-overflow:ellipsis;
    white-space:nowrap;cursor:text;user-select:text;-webkit-user-select:text}
  .oitem .ometa .acts a.rd{color:var(--ok)}
  .oitem .ometa .acts a.cn{color:var(--warn)}
  /* 生成中的占位条目 */
  .oitem.pending{border-color:var(--accent-line);background:var(--field)}
  .oitem.pending .ov{cursor:default;border-color:var(--line2)}
  .oitem.pending .ov video{filter:saturate(.6) brightness(.72)}
  .oitem .ov .otimer{position:absolute;left:4px;top:4px;z-index:2;background:#000c;
    border:1px solid #ffffff2e;border-radius:var(--radius-tag);font:9.5px var(--mono);padding:0 5px;
    color:var(--on-media);letter-spacing:.4px;backdrop-filter:blur(2px)}
  .oitem.pending .ov .otimer{background:#0b1a2ee6;border-color:var(--accent-line);color:var(--on-media)}
  .oitem .ov .ospin{position:absolute;left:50%;top:50%;width:24px;height:24px;margin:-12px 0 0 -12px;
    border-radius:50%;border:2px solid #ffffff2e;border-top-color:var(--accent);
    animation:ospin .9s linear infinite}
  @keyframes ospin{to{transform:rotate(360deg)}}
  .oitem .ov .ostate{position:absolute;left:0;right:0;bottom:0;padding:10px 5px 3px;
    font:9.5px var(--mono);color:var(--on-media);text-align:center;
    background:linear-gradient(#0000,#000c)}
  /* 图片占位卡里的进度条：单张不知道进度就来回跑，多张按 done/total 走 */
  .oprog{height:4px;border-radius:3px;background:var(--line);overflow:hidden;margin:3px 0 5px}
  .oprog i{display:block;height:100%;width:0;border-radius:inherit;background:var(--accent);
    transition:width .45s cubic-bezier(.4,0,.2,1)}
  /* 不定进度：整段匀速扫过去（transform 走合成层，比 margin-left 顺），
     起点终点都在轨道外，循环接缝看不出来 */
  .oprog.indet i{width:38%;animation:oprogmove 1.35s cubic-bezier(.45,0,.55,1) infinite;
    will-change:transform}
  @keyframes oprogmove{0%{transform:translateX(-102%)}100%{transform:translateX(263%)}}
  .oitem.pending.failed{border-color:var(--err-line);background:var(--err-bg)}
  .oitem.pending.failed .ospin{display:none}
  .oitem.pending.failed .ov video{filter:grayscale(1) brightness(.5)}

  /* ---------- 本工具消耗（秒级，本地算） ---------- */
  .spend{display:inline-flex;align-items:center;gap:4px;font:11px var(--mono);color:var(--accent);
    background:var(--accent-bg);border:1px solid var(--accent-line);border-radius:var(--radius-tag);padding:2px 7px;
    white-space:nowrap;cursor:pointer;transition:.15s}
  .spend[hidden]{display:none}
  .spend:hover{border-color:var(--accent-line);background:var(--accent-bg2)}
  .spend b{color:var(--text);font-weight:600}
  .spend.est b{color:var(--warn)}
  .spendpanel{margin:7px 0 9px;padding:9px;background:var(--field);border:1px solid var(--line);
    border-radius:var(--radius-control)}
  .spgrid{display:grid;grid-template-columns:repeat(4,1fr);gap:6px}
  .spcell{background:var(--panel2);border:1px solid var(--line);border-radius:var(--radius-tag);padding:6px 7px}
  .spcell span{display:block;font:10px var(--mono);color:var(--dim);letter-spacing:.3px}
  .spcell b{display:block;font:14px var(--mono);color:var(--text);margin-top:2px}
  .spcell i{font:9.5px var(--mono);color:var(--dim2);font-style:normal}
  .spnote{font:10px/1.6 var(--mono);color:var(--dim);margin:7px 0 0}
  .splist{max-height:196px;overflow:auto;margin-top:6px}
  .sprow{display:flex;gap:8px;align-items:baseline;font:10.5px var(--mono);color:var(--text2);
    padding:3px 0;border-top:1px solid var(--line)}
  .sprow .d{color:var(--dim2);flex:none}
  .sprow .t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .sprow .c{color:var(--accent);flex:none}
