  /* ---------- 富文本提示词编辑器（@图片1 内联缩略图） ---------- */
  /* 提示词框是唯一带渐变的框：上深下浅的纯中性灰，外层描边常显；聚焦只把描边加深一档，不发光。 */
  .editor{position:relative;width:100%;min-height:330px;max-height:62vh;overflow:auto;
          background-color:var(--field);
          background-image:linear-gradient(180deg,var(--prompt-grad-top) 0%,var(--prompt-grad-bottom) 100%);
          color:var(--text);border:1px solid var(--prompt-line);border-radius:var(--radius-control);
          padding:12px;font:13.5px/1.95 var(--ui);white-space:pre-wrap;word-break:break-word;
          outline:none;cursor:text;caret-color:var(--accent)}
  .editor:focus{border-color:var(--prompt-line-focus);box-shadow:none}
  .tok{display:inline-flex;align-items:center;gap:5px;height:23px;padding:0 8px 0 3px;
       margin:0 2px;vertical-align:var(--tok-va,-6px);border-radius:var(--radius-tag);border:1px solid var(--accent-line);
       background:var(--accent-bg);color:var(--accent);font:11px/1 var(--mono);white-space:nowrap;
       cursor:pointer;user-select:none;transition:.14s}
  /* 图片缩略图和视频缩略图必须同高（19px）：
     标签是 inline-flex，它的基线取的是内部第一个子项的下边缘，
     两个子项高度不同 → 基线不同 → 同一个 vertical-align 会让其中一种偏上或偏下。 */
  .tok img{width:19px;height:19px;object-fit:cover;border-radius:3px;display:block;background:var(--field)}
  .tok .mwrap{position:relative;flex:none;width:34px;height:19px;border-radius:3px;overflow:hidden;
              background:var(--field);display:block}
  .tok .mwrap video{width:100%;height:100%;object-fit:cover;display:block;background:var(--field);
                    pointer-events:none}
  .tok .mwrap .mdot{position:absolute;right:2.5px;bottom:2.5px;width:4px;height:4px;border-radius:50%;
                    background:var(--ok);box-shadow:0 0 0 1.5px #000a;transition:.2s}
  /* 暂停态：角标变成一个小播放三角，暗示"悬停可播" */
  .tok .mwrap.paused .mdot{width:0;height:0;border-radius:0;background:transparent;box-shadow:none;
                    right:3.5px;bottom:3px;border-left:5px solid var(--text);
                    border-top:3.5px solid transparent;border-bottom:3.5px solid transparent}
  .tok .mwrap.bad .mdot{width:4px;height:4px;border-radius:50%;border:0;background:var(--warn);
                    right:2.5px;bottom:2.5px}
  .tok .mwrap.busy .mdot{width:4px;height:4px;border-radius:50%;border:0;background:var(--warn);
                    right:2.5px;bottom:2.5px;animation:mdotPulse 1s ease-in-out infinite}
  @keyframes mdotPulse{0%,100%{opacity:.35}50%{opacity:1}}
  .tok.vid{border-color:var(--ok-line);background:var(--ok-bg);color:var(--ok);padding-left:4px}
  .tok.missing{border-color:var(--warn-line);background:var(--warn-bg);color:var(--warn);padding-left:8px}
  /* 没有缩略图时补一个同高的空子项，基线才和带图的标签一致（见上面的说明） */
  .tok.missing::before{content:'';width:0;height:19px;margin-right:-5px}
  .tok.missing .lb::before{content:'!';margin-right:5px;font-weight:700;opacity:.85}
  .tok:hover{border-color:var(--accent);background:var(--accent-bg2)}
  .tok.vid:hover{border-color:var(--ok);background:var(--ok-bg)}
  .tok.missing:hover{border-color:var(--warn);background:var(--warn-bg)}
  /* 提示词卡底部：左边操作提示，右边直接提交（不用滚到最下面） */
  .edfoot{display:flex;align-items:flex-start;gap:12px;margin-top:10px}
  .edfoot .hint{flex:1;min-width:0;margin:0}
  .edact{display:flex;gap:8px;flex:none}
  .edact button{height:34px;padding:0 16px;border-radius:var(--radius-control);font-size:13px}
  .edact .mini.ghost{background:transparent;border:1px solid var(--line)}
  #btnSubmit{min-width:118px}
  #btnSubmit:disabled{opacity:.55;cursor:not-allowed}
  @media (max-width:760px){
    .edfoot{flex-direction:column;align-items:stretch}
    .edact{justify-content:flex-end}
  }
  /* 悬停预览也是同一套：只淡入 + 4px 轻位移，缓动跟弹层保持一致 */
  #tokpop{position:fixed;z-index:80;pointer-events:none;opacity:0;transform:translate3d(0,4px,0);
          transition:opacity .15s cubic-bezier(.16,1,.3,1),transform .15s cubic-bezier(.16,1,.3,1)}
  #tokpop.show{opacity:1;transform:none}
  #tokpop img,#tokpop video{display:block;max-width:300px;max-height:190px;border-radius:var(--radius-control);
              border:1px solid var(--line2);box-shadow:0 14px 36px #000b;background:var(--field)}
  #tokpop video{width:300px;height:169px;object-fit:cover}
  #tokpop .cap{position:absolute;left:0;right:0;bottom:0;padding:5px 8px;font:10.5px var(--mono);
               color:var(--text2);background:linear-gradient(#0000,#000c);border-radius:0 0 8px 8px;
               display:flex;justify-content:space-between;gap:8px}
  #tokpop .wrap{position:relative}

  /* ---------- @ 提及候选菜单 ---------- */
  #atmenu{position:fixed;z-index:90;width:296px;padding:5px;max-height:272px;overflow:auto}
  #atmenu[hidden]{display:none}
  #atmenu .hd{font:10.5px var(--mono);color:var(--dim);padding:3px 7px 5px;letter-spacing:.6px;
              display:flex;justify-content:space-between;gap:8px}
  .atopt{display:flex;align-items:center;gap:8px;padding:5px 7px;border-radius:var(--radius-tag);cursor:pointer;
         font:12px var(--mono);color:var(--text2)}
  .atopt img{width:36px;height:25px;object-fit:cover;border-radius:var(--radius-tag);background:var(--field);flex:none}
  .atopt .noph{width:36px;height:25px;border-radius:var(--radius-tag);background:var(--field);border:1px solid var(--line);
               flex:none}
  .atopt .nm{color:var(--dim);font-size:11px;overflow:hidden;text-overflow:ellipsis;
             white-space:nowrap;flex:1;min-width:0}
  .atopt .lb{color:var(--accent)}
  /* @ 提及候选：高亮是「待选中」这一层，用中性浅灰；蓝色只留给正文里的引用标签 */
  .atopt:hover,.atopt.on{background:var(--dd-hover)}
  .atopt.on .nm{color:var(--text2)}
  .atopt.vid .lb{color:var(--ok)}
  #atmenu .empty{padding:8px;color:var(--dim);font-size:12px}
  #atmenu .foot{border-top:1px solid var(--line);margin-top:4px;padding:5px 7px 2px;
                font-size:10.5px;color:var(--dim2);display:flex;gap:10px}
  .row{display:flex;gap:8px;align-items:center;margin-top:9px;flex-wrap:wrap}
  .hint{font-size:11px;color:var(--dim)}
  .hint.strong{font-size:12px;font-weight:700;color:var(--text)}

