/* auto-qb 新版 WEB UI · 组件层: 跨视图共享的控件
 * 设计语言: 实色表面 + 1px hairline 高程(不用毛玻璃/大阴影); 控件一律小圆角;
 * 选中语言 = 左侧色条 + 柔底 + 亮字; 图标语义色一律取令牌。
 */

/* ---------------- 登录遮罩 ---------------- */
.login-mask { position: fixed; inset: 0; z-index: 50; display: flex; align-items: center; justify-content: center;
  background: radial-gradient(900px 480px at 50% -8%, var(--accent-soft), transparent 62%), var(--bg-sunken), var(--bg); }
.login-card { width: 372px; max-width: calc(100vw - 32px); padding: 30px 32px 26px; text-align: center;
  background: var(--bg-card); border: 1px solid var(--border-strong); border-radius: var(--radius-lg);
  box-shadow: var(--shadow-3); }
.login-card .brand { display: flex; align-items: center; justify-content: center; gap: 10px;
  font-family: var(--font-display); font-size: 24px; font-weight: 600; letter-spacing: .02em; }
.brand-mark { width: 30px; height: 30px; display: grid; place-items: center; flex: 0 0 auto;
  border: 1px solid var(--border); border-radius: var(--radius-sm); overflow: hidden; }
.brand-img { width: 100%; height: 100%; display: block; object-fit: cover; }
.login-card p { margin: 10px 0 16px; font-size: 12.5px; }
.login-card input { width: 100%; margin: 0 0 12px; padding: 10px 13px; border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: var(--bg-row); color: var(--fg); font-size: 14px;
  transition: border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease); }
.login-card input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--ring); }
.login-card button { width: 100%; padding: 10px; border: 0; border-radius: var(--radius-sm);
  background: var(--accent); color: var(--bg); font-size: 14px; font-weight: 600; cursor: pointer;
  transition: filter var(--dur) var(--ease); }
.login-card button:hover:not(:disabled) { filter: brightness(1.08); }
.login-card button:disabled { opacity: .5; cursor: default; }
.login-card button.secondary { margin-top: 8px; background: transparent; color: var(--fg-muted);
  border: 1px solid var(--border); font-weight: 400; }
/* FX-01 配套: 加载卡与密钥表单等高(表单实测约 218px) —— 否则\"加载卡 -> 表单\"这一步
 * 本身还会跳一次高度, 只是把闪现换成了跳动。 */
.login-loading { display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 12px; min-height: 218px; padding: 34px 32px 28px; }
.login-loading .ico { width: 26px; height: 26px; color: var(--accent); }
.login-loading p { margin: 0; }

/* ---------------- 吸顶层: 顶栏 + 状态条 ---------------- */
.sticky-head { position: sticky; top: 0; z-index: 30; }
/* 服务不可达横幅: 不透明实色底(半透明底在滚动内容上会透字) */
.service-banner { display: flex; align-items: center; justify-content: center; gap: 8px;
  padding: 9px 20px; text-align: center; font-weight: 600; font-size: 13px;
  color: #ffe0e0; background: #6b1f22; border-bottom: 1px solid #a33a3f; }
.service-banner .ico { color: #ffe0e0; flex: 0 0 auto; }
/* 层叠说明: 顶栏内的弹层要盖过同级吸顶状态条, 顶栏 z-index 必须更高(两吸顶层各自建立层叠上下文) */
.topbar { position: relative; z-index: 31; display: flex; align-items: center; gap: 16px; padding: 9px 18px;
  background: var(--glass); border-bottom: 1px solid var(--border-soft); }
.topbar .brand { display: flex; align-items: center; gap: 9px;
  font-family: var(--font-display); font-size: 17px; font-weight: 600; letter-spacing: .02em; }
.topbar .ver { padding: 1px 7px; border-radius: var(--radius-sm); border: 1px solid var(--border-soft);
  background: var(--surface-1); color: var(--fg-dim); font-family: var(--font-mono); font-size: 11px; font-weight: 500; }
/* 页签: 方形分段(工程感), 激活 = accent 柔底 + 内描边 */
.tabs { display: flex; gap: 2px; padding: 2px; border-radius: var(--radius-sm);
  background: var(--bg-sunken); border: 1px solid var(--border-soft); }
.tabs button { display: inline-flex; align-items: center; gap: 6px; padding: 6px 14px; border: 0;
  border-radius: var(--radius-sm); background: transparent; color: var(--fg-muted);
  font-size: 13px; cursor: pointer;
  transition: background var(--dur) var(--ease), color var(--dur) var(--ease); }
.tabs button:hover { color: var(--fg); }
.tabs button.active { background: var(--accent-soft); color: var(--accent-hi);
  box-shadow: inset 0 0 0 1px var(--accent-line); }
.spacer { flex: 1; }
.badge { display: inline-flex; align-items: center; gap: 6px; padding: 4px 11px; border-radius: 999px;
  font-size: 12px; font-weight: 600; }
.badge .dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; }
.badge.ok { background: var(--green-soft); color: var(--green); }
.badge.error { background: var(--error-soft); color: var(--error); }
.badge.warn { background: var(--warn-soft); color: var(--warn); }
.badge.warn.pending .dot { animation: dot-pulse 1.4s ease-in-out infinite; }

/* 新 UI 专属: 主题切换器 + 返回旧版(纯 DOM, 由 theme.js 绑定, 不进 Vue 状态) */
.ui-tools { display: flex; align-items: center; gap: 8px; }
.ui-link { display: inline-flex; align-items: center; gap: 5px; padding: 4px 11px; border-radius: var(--radius-sm);
  border: 1px solid var(--border-soft); background: var(--surface-1); color: var(--fg-muted);
  font-size: 12px; text-decoration: none; cursor: pointer;
  transition: background var(--dur) var(--ease), border-color var(--dur) var(--ease), color var(--dur) var(--ease); }
.ui-link:hover { background: var(--surface-2); color: var(--fg); border-color: var(--border-strong); }
.theme-pop { position: relative; }
.theme-btn .ico { color: var(--fg-muted); }
.theme-menu { position: absolute; right: 0; top: calc(100% + 6px); z-index: 40; width: 190px; padding: 6px;
  border-radius: var(--radius); background: var(--bg-elev); border: 1px solid var(--border-strong);
  box-shadow: var(--shadow-3); animation: drop-in .12s var(--ease-out); }
.theme-menu[hidden] { display: none; }
.theme-menu-title { padding: 4px 8px 6px; font-size: 11px; font-weight: 600; letter-spacing: .06em;
  color: var(--fg-dim); }
.theme-item { display: flex; align-items: center; gap: 8px; width: 100%; padding: 7px 9px;
  border: 0; border-radius: var(--radius-sm); background: transparent; color: var(--fg-soft);
  font-size: 12.5px; text-align: left; cursor: pointer;
  transition: background var(--dur) var(--ease), color var(--dur) var(--ease); }
.theme-item:hover { background: var(--surface-2); color: var(--fg); }
.theme-item.on { background: var(--accent-soft); color: var(--fg); font-weight: 600;
  box-shadow: inset 2px 0 0 var(--accent); }
.theme-item .td { width: 12px; height: 12px; flex: 0 0 auto; border-radius: 3px;
  border: 1px solid var(--border-strong);
  background: linear-gradient(135deg, var(--td-a) 50%, var(--td-b) 50%); }
.theme-item .t-kind { margin-left: auto; font-size: 10.5px; color: var(--fg-dim); font-weight: 400; }
.theme-item.on .t-kind { color: var(--accent-hi); }

/* ---------------- 状态分布条 + 筛选器(仅辅种页) ---------------- */
/* FX-09: 锁定筛选行高度 —— 批量段(FX-06 起并入本行)出现/消失时不得推动下方表格。
 * min-height = 7px*2 内边距 + 26px 内容高(批量段) + 1px 下边框(box-sizing: border-box 下
 * 边框计入 min-height, 只写 40 会在有批量段时被内容撑到 41 —— 实测差 1px) */
.status-strip { position: relative; z-index: 30; display: flex; flex-wrap: wrap; align-items: center;
  gap: 10px 12px; padding: 7px 18px; min-height: 41px; background: var(--bg);
  border-bottom: 1px solid var(--border-soft); }
.dist-bar { display: flex; flex: 0 1 240px; height: 6px; border-radius: 2px; overflow: hidden; background: var(--surface-2); }
.dist-bar > span { height: 100%; background: currentColor; transition: width .35s var(--ease); }
.dist-legend { display: flex; flex-wrap: wrap; gap: 5px; }
.dist-chip { display: inline-flex; align-items: center; gap: 6px; padding: 3px 9px; border-radius: var(--radius-sm);
  border: 1px solid var(--border-soft); background: transparent; color: var(--fg-muted); font-size: 11.5px;
  cursor: pointer; transition: background var(--dur) var(--ease), border-color var(--dur) var(--ease); }
.dist-chip:hover { background: var(--surface-2); }
.dist-chip.active { border-color: currentColor; background: var(--surface-2); font-weight: 600; }
.dist-chip .swatch { width: 8px; height: 8px; border-radius: 2px; background: currentColor; }
.dist-chip.clear { color: var(--fg-dim); }
.dist-chip.clear:hover { color: var(--fg); }
/* 无筛选时不再隐藏(仍保留占位以免按钮组左右推动), 改为降透明度的禁用态 ——
 * R02: 旧方案 visibility:hidden 虽保留了占位宽度, 但在路径筛选器右侧留下一个
 * 隐形占位造成的"幽灵空位"(实测 93px); 常驻可见 + 降透明后宽度不变、位置稳定、空位消失 */
.dist-chip.clear.is-off { opacity: .32; }
.dist-chip.clear:disabled { cursor: default; }
.dist-chip.clear.is-off:hover { background: transparent; }
.strip-tools { display: flex; align-items: center; gap: 8px; margin-left: auto; }
.strip-note { font-size: 11.5px; color: var(--fg-muted); }
.strip-note > b { color: var(--fg); }
.filter-pop { position: relative; }
.filter-btn { display: inline-flex; align-items: center; gap: 5px; padding: 3px 9px; border-radius: var(--radius-sm);
  border: 1px solid var(--border-soft); background: var(--surface-1); color: var(--fg-muted);
  font-size: 11.5px; cursor: pointer; position: relative; min-width: 92px; justify-content: center;
  transition: background var(--dur) var(--ease), border-color var(--dur) var(--ease), color var(--dur) var(--ease); }
.filter-btn:hover { background: var(--surface-2); color: var(--fg); }
.filter-btn.active { border-color: var(--accent); color: var(--accent-hi); background: var(--accent-soft); }
.filter-caret { opacity: .55; transition: transform var(--dur) var(--ease); }
.filter-btn.active .filter-caret { opacity: 1; transform: rotate(180deg); }
.filter-btn .filter-count { position: absolute; top: -6px; right: -6px; min-width: 17px; height: 17px;
  display: inline-grid; place-items: center; padding: 0 4px; border-radius: 999px;
  background: var(--accent); color: var(--bg); font-family: var(--font-mono); font-size: 10.5px; font-weight: 700;
  box-shadow: 0 0 0 2px var(--bg-row); }

/* 浮层弹层(列选择器 / 筛选器 / 主题菜单共用视觉): 左对齐 + 固定宽度(选中数变化不位移) */
.col-menu, .pop-menu { position: absolute; left: 0; top: calc(100% + 6px); z-index: 40; padding: 8px;
  border-radius: var(--radius); background: var(--bg-elev); border: 1px solid var(--border-strong);
  box-shadow: var(--shadow-3); animation: drop-in .12s var(--ease-out); }
.col-menu { width: 300px; }
.pop-menu { width: 260px; max-height: 330px; overflow-y: auto; }
.col-menu.flip-x, .pop-menu.flip-x { left: auto; right: 0; }
.pop-head { display: flex; align-items: center; justify-content: space-between; gap: 8px;
  padding: 4px 8px 6px; font-size: 11.5px; font-weight: 600; color: var(--fg-dim); }
.pop-clear { border: 0; background: transparent; color: var(--accent-hi); font-size: 11.5px; cursor: pointer; }
.pop-item { display: flex; align-items: center; gap: 7px; padding: 4px 8px; border-radius: var(--radius-sm);
  font-size: 12.5px; color: var(--fg-soft); cursor: pointer; position: relative; padding-left: 12px; }
.pop-item:hover { background: var(--surface-2); color: var(--fg); }
.pop-item input { accent-color: var(--accent); width: 14px; height: 14px; flex: 0 0 auto; }
.pop-value { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pop-count { color: var(--fg-dim); font-family: var(--font-mono); font-size: 11px; }
.pop-empty { margin: 4px 8px; color: var(--fg-dim); font-size: 12px; }
/* 多选行选中: 左侧色条 + 柔底 + 亮字; 焦点用 :focus-visible(键盘才画框, 点击不画) */
.pop-item.on { background: var(--accent-soft); color: var(--fg); font-weight: 600; }
.pop-item.on::before { content: ""; position: absolute; left: 0; top: 3px; bottom: 3px; width: 3px;
  border-radius: 999px; background: var(--accent); }
.pop-item.on .pop-count { color: var(--accent-hi); font-weight: 600; }
.pop-item:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }

/* 弹层关闭淡出(enter 仍走各弹层已有的 drop-in 动画; 配合 index.html 的 <transition name="pop">) */
.pop-leave-active { transition: opacity var(--dur-fast) var(--ease); }
.pop-leave-to { opacity: 0; }

/* 状态语义配色(分布条/chip/明细圆点共用, 与后端 kind 一一对应) */
.k-seeding, .k-seeding .swatch { color: var(--green); }
.k-downloading, .k-downloading .swatch, .k-checking, .k-checking .swatch { color: var(--blue); }
/* FX-06(D8-B): 暂停/其它保持无色相, 但字色从 --fg-dim 抬到中性中间调(--paused) ——
 * 旧写法用 dim 灰, 叠加白色高光底就读作"白底看不到字"。 */
.k-paused, .k-paused .swatch, .k-other, .k-other .swatch { color: var(--paused); }
.k-error, .k-error .swatch { color: var(--error); }

/* 表格工具按钮(列选择器入口) */
.col-picker { position: relative; }
.table-tool { display: inline-flex; align-items: center; gap: 5px; padding: 4px 11px; border-radius: var(--radius-sm);
  border: 1px solid var(--border-soft); background: var(--surface-1); color: var(--fg-muted);
  font-size: 12px; cursor: pointer;
  transition: background var(--dur) var(--ease), border-color var(--dur) var(--ease), color var(--dur) var(--ease); }
.table-tool:hover { background: var(--surface-2); color: var(--fg); }
.table-tool.active { border-color: var(--accent); background: var(--accent-soft); color: var(--accent-hi); }
.col-menu-title { padding: 8px 8px 4px; font-size: 11px; font-weight: 600; letter-spacing: .05em;
  color: var(--fg-dim); }
.col-menu-title:not(:first-child) { margin-top: 4px; padding-top: 10px; border-top: 1px solid var(--border-soft); }
.col-menu-item.locked { color: var(--fg-dim); cursor: default; }
.col-menu-item.locked:hover { background: transparent; }
.col-lock { flex: 0 0 auto; padding: 0 6px; border-radius: var(--radius-sm); background: var(--surface-2);
  color: var(--fg-dim); font-size: 10px; }
.col-tick { flex: 0 0 auto; color: var(--accent-hi); stroke-width: 2.2; }
.col-menu-actions { display: flex; gap: 6px; margin-top: 8px; padding-top: 8px;
  border-top: 1px solid var(--border-soft); }

/* ---------------- 右键菜单 ---------------- */
.ctx-menu { position: fixed; z-index: 100; min-width: 196px; padding: 6px; border-radius: var(--radius);
  background: var(--bg-card); border: 1px solid var(--border-strong); box-shadow: var(--shadow-3);
  animation: drop-in .12s var(--ease); }
.ctx-item { display: flex; align-items: center; gap: 9px; padding: 8px 11px; border-radius: var(--radius-sm);
  font-size: 13px; cursor: pointer; transition: background var(--dur) var(--ease); }
.ctx-item:hover { background: var(--bg-hover); }
.ctx-item .ico { color: var(--fg-dim); }
.ctx-item:hover .ico { color: var(--fg-muted); }
.ctx-item .ico-play { color: var(--green); }
.ctx-item .ico-pause { color: var(--warn); }
.ctx-item .ico-sync { color: var(--blue); }
.ctx-item.danger { color: var(--error); }
.ctx-item.danger .ico { color: currentColor; }
.ctx-item.danger:hover { background: var(--error-soft); }
.ctx-sep { height: 1px; background: var(--border-soft); margin: 5px 8px; }

/* ---------------- 空态 ---------------- */
.empty { display: flex; flex-direction: column; align-items: center; gap: 10px; padding: 56px 20px;
  text-align: center; color: var(--fg-dim); font-size: 13px; }
.empty .ico { width: 28px; height: 28px; opacity: .6; color: var(--accent); }

/* ---------------- toast ---------------- */
.toast-wrap { position: fixed; right: 20px; bottom: 20px; z-index: 120; display: flex; flex-direction: column;
  gap: 8px; align-items: flex-end; pointer-events: none; }
.toast { display: flex; align-items: center; gap: 9px; max-width: 380px; padding: 10px 14px;
  border-radius: var(--radius); background: var(--bg-card); border: 1px solid var(--border-strong);
  box-shadow: var(--shadow-2); font-size: 13px; pointer-events: auto; animation: toast-in .18s var(--ease); }
.toast .ico { color: var(--accent); }
.toast.ok { border-color: var(--green-line); }
.toast.ok .ico { color: var(--green); }
.toast.error { border-color: var(--error-line); }
.toast.error .ico { color: var(--error); }
.toast.busy { border-color: var(--accent-line); }
.toast.busy .ico { color: var(--accent); }
.toast.timeout { border-color: var(--warn-line); }
.toast.timeout .ico { color: var(--warn); }

/* ---------------- 站内确认框 ---------------- */
.modal-mask { position: fixed; inset: 0; z-index: 130; display: flex; align-items: center; justify-content: center;
  padding: 20px; background: var(--bg-sunken), rgba(0, 0, 0, .35); animation: fade-in .14s var(--ease); }
.modal { width: var(--modal-w-base); max-width: 100%; padding: 20px 22px; border-radius: var(--radius-lg);
  background: var(--bg-card); border: 1px solid var(--border-strong); box-shadow: var(--shadow-3);
  animation: modal-in .2s var(--ease-spring); }
.modal.wide { width: var(--modal-wide-w); }
.modal-title { display: flex; align-items: center; gap: 9px; font-size: 15px; font-weight: 600; }
.modal-title .ico { color: var(--warn); }
.modal.danger .modal-title .ico { color: var(--error); }
.modal-body { margin: 10px 0 18px; color: var(--fg-muted); font-size: 13.5px; line-height: 1.65; }
.modal-input { width: 100%; padding: 9px 12px; border-radius: var(--radius-sm); border: 1px solid var(--border);
  background: var(--bg-row); color: var(--fg); font-size: 13.5px; margin-bottom: 18px; }
.modal-input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--ring); }
.modal-check { display: flex; align-items: center; gap: 8px; margin: -6px 0 16px; padding: 9px 11px;
  border-radius: var(--radius-sm); background: var(--surface-1); border: 1px solid var(--border-soft);
  font-size: 13px; color: var(--fg-soft); cursor: pointer; }
.modal-check:hover { border-color: var(--border-strong); }
.modal-check input { accent-color: var(--error); width: 15px; height: 15px; flex: 0 0 auto; }
.modal-actions { display: flex; justify-content: flex-end; gap: 9px; }
/* 待删目标信息区(值可复制)
 * R10-13: 长文本口径统一为"**单行省略 + title 全文 + 复制按钮**" —— 旧写法 overflow-wrap:
 * anywhere 会把超长 tracker URL / hash 换成很多行, 把弹窗顶高、且右边缘参差不齐。
 * 真需要多行展示的超长名/路径仍可显式标 wide(块行, 最多 3 行)。 */
.modal-details { display: flex; flex-direction: column; gap: 2px; margin: -4px 0 14px;
  padding: 10px 12px; border: 1px solid var(--border-soft); border-radius: var(--radius-sm);
  background: var(--surface-1); user-select: text; }
.modal-detail-row { display: flex; align-items: baseline; gap: 8px; font-size: 12.5px; min-width: 0; }
.modal-detail-row .ico { color: var(--fg-dim); flex: 0 0 auto; align-self: center; }
.modal-detail-row .d-label { flex: 0 0 62px; color: var(--fg-dim); font-size: 11.5px; }
.modal-detail-row .d-value { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden;
  text-overflow: ellipsis; color: var(--fg-soft); font-weight: 500; }
/* FX-23: 超长值行(种子名 / 保存路径 / 目标剧集)升格为**块行** —— 标签一行、值独占下一行,
 * 且在 / \\ . - 与空格处断行(break-word)。旧写法 overflow-wrap: anywhere 会在任意字符处硬切,
 * 中文目录名混排时被切成参差不齐的三行(用户反馈的"缩进错乱")。行数上限 3 行 + title 给全文。 */
.modal-detail-row.wide { display: grid; grid-template-columns: auto minmax(0, 1fr) auto;
  grid-template-areas: "ico label copy" "value value value"; align-items: center; row-gap: 3px;
  margin-bottom: 2px; }
.modal-detail-row.wide > .ico { grid-area: ico; }
.modal-detail-row.wide > .d-label { grid-area: label; flex: none; }
.modal-detail-row.wide > .d-value { grid-area: value; display: -webkit-box; -webkit-box-orient: vertical;
  -webkit-line-clamp: 3; overflow: hidden; overflow-wrap: break-word; word-break: normal; }
.modal-detail-row.wide > .d-copy { grid-area: copy; align-self: center; }
/* R10-13: 复制按钮**所有行都渲染**(窄行靠悬停才显形, 不抢视觉也不占额外宽度) */
.modal-detail-row .d-copy { width: 22px; height: 22px; opacity: 0; transition: opacity var(--dur) var(--ease); }
.modal-detail-row:hover .d-copy, .modal-detail-row .d-copy:focus-visible { opacity: .75; }
.modal-detail-row .d-copy:hover { opacity: 1; }

/* ================= R10-11 路径选择器(服务端目录浏览) =================
 * “选择位置”不再是自绘候选下拉: 由服务端给真实目录树(浏览器物理上拿不到绝对路径)。
 * 宽度取尺寸令牌族的“**宽**”档(与添加窗口同档): 目录路径才是这个窗口的主体内容, 窄框放不下。 */
.modal.dir-browse { width: var(--modal-w-add); max-width: 100%; display: flex; flex-direction: column; }
.db-bar { display: flex; align-items: flex-start; gap: 8px; margin-bottom: 10px; }
.db-bar > .ce-btn { flex: 0 0 auto; white-space: nowrap; }
/* R10-11 修订: 路径**必须看得见** —— 原先单行省略, 长路径只剩开头几个字符。
 * 现改为最多 3 行换行(任意字符处断行, 中文与分隔符都不会溢出), 盘符/多级目录一眼可读;
 * 更长的仍可悬停看 title。 */
.db-path { flex: 1; min-width: 0; padding: 5px 9px; border-radius: var(--radius-sm); background: var(--bg-sunken);
  border: 1px solid var(--border-soft); color: var(--fg-soft);
  font-family: var(--font-mono); font-size: 12px; line-height: 1.55; word-break: break-all; }
.db-list { max-height: 380px; overflow-y: auto; display: flex; flex-direction: column; gap: 2px;
  padding: 4px; border-radius: var(--radius-sm); background: var(--surface-1);
  border: 1px solid var(--border-soft); }
.db-row { display: flex; align-items: center; gap: 8px; width: 100%; padding: 6px 9px; border: 0;
  border-radius: var(--radius-sm); background: transparent; color: var(--fg-muted);
  font: inherit; font-size: 12.5px; text-align: left; cursor: pointer;
  transition: background var(--dur) var(--ease), color var(--dur) var(--ease); }
.db-row:hover { background: var(--surface-2); color: var(--fg); }
.db-row .ico { color: var(--accent); flex: 0 0 auto; }
.db-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.db-new { display: flex; align-items: center; gap: 8px; margin-top: 10px; }
.db-new .add-dialog-input { flex: 1 1 auto; min-width: 0; }
/* 按钮不许被输入框挤掉宽度: input 的 flex-basis 是 100%(width:100%), 不锁按钮就会把
 * "新建"压成两行(实测: 文字竖排) */
.db-new > .ce-btn { flex: 0 0 auto; white-space: nowrap; }

/* ================= 选项胶囊(FX-20 / FX-24) =================
 * 勾选框从本项目的交互语汇中退役: 选项一律是"无勾选框的整行切换胶囊" ——
 * 左侧色块 + 柔底 + 亮字即为已选(与筛选弹层 .pop-item.on 同构, 只是横排)。
 * 添加种子窗口的 5 个选项与删除确认框的 2 个选项共用这一份。 */
.opt-pill { display: inline-flex; align-items: center; gap: 8px; padding: 7px 12px;
  border-radius: var(--radius-sm); border: 1px solid var(--border-soft); background: var(--surface-1);
  color: var(--fg-muted); font: inherit; font-size: 12.5px; cursor: pointer; user-select: none;
  transition: background var(--dur) var(--ease), border-color var(--dur) var(--ease), color var(--dur) var(--ease); }
.opt-pill:hover { border-color: var(--border-strong); color: var(--fg); }
.opt-pill .opt-dot { width: 8px; height: 8px; flex: 0 0 auto; border-radius: 2px;
  border: 1px solid var(--border-strong); background: transparent;
  transition: background var(--dur) var(--ease), border-color var(--dur) var(--ease); }
.opt-pill.on { background: var(--accent-soft); border-color: var(--accent-line); color: var(--fg); font-weight: 600; }
.opt-pill.on .opt-dot { background: var(--accent); border-color: var(--accent); }
/* 危险项(如"同时删除磁盘文件"): 选中时走错误色, 与普通选中的 accent 语义区分 */
.opt-pill.danger.on { background: var(--error-soft); border-color: var(--error-line); }
.opt-pill.danger.on .opt-dot { background: var(--error); border-color: var(--error); }
.opt-pill:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
.modal-opts { display: flex; flex-direction: column; gap: 8px; margin: -6px 0 16px; }

/* ---------------- 表单控件(ce-*) ---------------- */
.ce-btn { display: inline-flex; align-items: center; gap: 6px; padding: 7px 14px; border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: var(--bg-row); color: var(--fg); font-size: 13px; cursor: pointer;
  transition: background var(--dur) var(--ease), border-color var(--dur) var(--ease), filter var(--dur) var(--ease); }
.ce-btn:hover { background: var(--bg-hover); border-color: var(--border-strong); }
.ce-btn.primary { background: var(--accent); border-color: var(--accent); color: var(--bg); font-weight: 600; }
.ce-btn.primary:hover { filter: brightness(1.08); }
.ce-btn.ghost { background: transparent; }
.ce-btn.ghost:hover { background: var(--surface-2); }
.ce-btn.danger { color: var(--error); border-color: var(--error-line); background: transparent; }
.ce-btn.danger:hover { background: var(--error-soft); }
.ce-btn.small { padding: 5px 10px; font-size: 12px; }
.ce-btn:disabled { opacity: .45; cursor: not-allowed; }

.ce-icon { flex: 0 0 auto; width: 28px; height: 28px; display: inline-grid; place-items: center;
  border-radius: var(--radius-sm); border: 1px solid var(--border);
  background: transparent; color: var(--fg-muted); cursor: pointer; font-size: 13px; line-height: 1;
  transition: background var(--dur) var(--ease), color var(--dur) var(--ease), border-color var(--dur) var(--ease); }
.ce-icon:hover { background: var(--surface-2); color: var(--accent-hi); border-color: var(--border-strong); }
.ce-icon.danger:hover { background: var(--error-soft); color: var(--error); border-color: var(--error-line); }
.ce-icon.flat { border-color: transparent; background: transparent; }
.ce-icon.flat:hover { background: var(--surface-2); border-color: transparent; }
.ce-icon:disabled { opacity: .3; cursor: default; }
.ce-icon:disabled:hover { background: transparent; border-color: var(--border); color: var(--fg-dim); }

.ce-input { flex: 1 1 220px; max-width: 420px; min-width: 120px; padding: 7px 11px; border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: var(--bg-row); color: var(--fg); font-size: 13px;
  transition: border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease); }
.ce-input:hover { border-color: var(--border-strong); }
.ce-input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--ring); }
.ce-input::placeholder { color: var(--fg-dim); }
.ce-input.ce-select { flex: 0 1 240px; }
.ce-unit-group { display: inline-flex; align-items: center; gap: 0; flex: 0 0 auto; }
.ce-unit-group .ce-input { max-width: none; min-width: 0; }
.ce-unit-group .ce-num { flex: 0 0 92px; width: 92px; border-top-right-radius: 0;
  border-bottom-right-radius: 0; text-align: right; }
.ce-unit-group .ce-unit-select { flex: 0 0 auto; width: auto; min-width: 76px; max-width: 110px;
  margin-left: -1px; border-top-left-radius: 0; border-bottom-left-radius: 0;
  background: var(--bg-sunken); color: var(--fg-muted); }
.ce-unit-group .ce-unit-select:focus { position: relative; z-index: 1; }
.ce-inline-input { flex: 0 0 auto; width: 130px; min-width: 0; max-width: none; }
.ce-inline-select { flex: 0 0 auto; width: auto; min-width: 150px; max-width: 260px; }
.ce-unit { font-size: 12px; color: var(--fg-dim); }

.ce-switch { display: inline-flex; align-items: center; gap: 9px; cursor: pointer; user-select: none; }
.ce-switch input { position: absolute; opacity: 0; width: 0; height: 0; }
.ce-slider { position: relative; width: 38px; height: 21px; border-radius: 999px; background: var(--border-strong);
  transition: background var(--dur) var(--ease); flex: 0 0 auto; }
.ce-slider::after { content: ""; position: absolute; top: 2.5px; left: 2.5px; width: 16px; height: 16px;
  border-radius: 50%; background: var(--fg-muted);
  transition: transform var(--dur) var(--ease), background var(--dur) var(--ease); }
.ce-switch:hover .ce-slider { background: var(--fg-dim); }
.ce-switch input:checked + .ce-slider { background: var(--accent); }
.ce-switch input:checked + .ce-slider::after { transform: translateX(17px); background: var(--bg); }
.ce-switch input:focus-visible + .ce-slider { box-shadow: 0 0 0 3px var(--ring); }
.ce-switch-text { font-size: 12px; color: var(--fg-dim); }
.ce-inline-switch { margin-left: 6px; padding-left: 8px; border-left: 1px solid var(--border-soft); }
.ce-inline-switch .ce-slider { width: 30px; height: 17px; }
.ce-inline-switch .ce-slider::after { width: 13px; height: 13px; top: 2px; left: 2px; }
.ce-inline-switch input:checked + .ce-slider::after { transform: translateX(13px); }
.ce-inline-switch .ce-switch-text { font-size: 11.5px; color: var(--fg-dim); }

.ce-checks { display: flex; gap: 14px; align-items: center; flex-wrap: wrap; }
.ce-check { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; cursor: pointer; }
.ce-check input { accent-color: var(--accent); width: 15px; height: 15px; }

.ce-list { flex: 1 1 100%; display: flex; flex-direction: column; gap: 6px; }
.ce-list-row { display: flex; align-items: center; gap: 6px; }
.ce-list-row .ce-input { flex: 1 1 auto; max-width: 460px; }
.ce-list.is-pattern { padding: 6px 8px; border-radius: var(--radius); background: var(--surface-1);
  border: 1px solid var(--border-soft); border-left: 3px solid var(--pink); }
.ce-list.is-pattern .ce-list-head { display: flex; align-items: center; gap: 6px; cursor: pointer;
  user-select: none; padding: 2px 4px; transition: background var(--dur) var(--ease); }
.ce-list.is-pattern .ce-list-head:hover { background: var(--surface-2); }
.ce-list.is-pattern .ce-list-head .caret { color: var(--pink); opacity: .65;
  transform: rotate(0deg); transition: transform var(--dur) var(--ease-spring); }
.ce-list.is-pattern .ce-list-head .caret.open { transform: rotate(90deg); }
.ce-list-sum { font-size: 11.5px; color: var(--fg-dim); }
.ce-list-body { padding-top: 4px; }

.ce-add-btn { display: flex; align-items: center; justify-content: center; gap: 6px; width: 100%;
  padding: 8px 12px; border-radius: var(--radius-sm); border: 1px dashed var(--border-strong);
  background: transparent; color: var(--fg-muted); font-size: 12.5px; cursor: pointer;
  transition: background var(--dur) var(--ease), border-color var(--dur) var(--ease), color var(--dur) var(--ease); }
.ce-add-btn:hover { border-color: var(--accent); color: var(--fg); background: var(--accent-soft); }
.ce-add-btn .ico { color: var(--green); opacity: .85; }
.ce-add-btn:hover .ico, .ce-add-btn.open .ico { opacity: 1; }
.ce-add-btn.open { border-style: solid; border-color: var(--accent); color: var(--fg); background: var(--accent-soft); }
.ce-add-btn.inline { width: auto; padding: 4px 10px; font-size: 12px; }
.ce-add-form { display: flex; flex-direction: column; gap: 6px; margin-top: 6px; padding: 8px;
  border-radius: var(--radius-sm); background: var(--bg-sunken); border: 1px solid var(--border); }
.ce-add-form .ce-input { flex: 1 1 auto; width: 100%; max-width: none; }
.ce-add-form-actions { display: flex; justify-content: flex-end; gap: 6px; }

.ce-picker { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 6px;
  padding: 10px; border-radius: var(--radius); background: var(--bg-sunken); border: 1px solid var(--border); }
.ce-picker-item { display: flex; flex-direction: column; gap: 2px; padding: 7px 10px; text-align: left;
  border-radius: var(--radius-sm); border: 1px solid var(--border-soft); background: var(--surface-1);
  color: var(--fg); font-size: 12.5px; cursor: pointer;
  transition: background var(--dur) var(--ease), border-color var(--dur) var(--ease); }
.ce-picker-item:hover { border-color: var(--accent); background: var(--accent-soft); }
.ce-picker-item.danger:hover { border-color: var(--error); background: var(--error-soft); }
.ce-picker-name { display: flex; align-items: center; gap: 6px; font-weight: 600; }
.ce-picker-help { color: var(--fg-dim); font-size: 11.5px; line-height: 1.45; }

.ce-risk { display: inline-flex; align-items: center; gap: 3px; padding: 0 6px; border-radius: var(--radius-sm);
  background: var(--warn-soft); color: var(--warn); font-size: 10.5px; white-space: nowrap; }
.ce-risk .ico { width: 11px; height: 11px; }
.ce-risk-line { flex-basis: 100%; display: flex; align-items: flex-start; gap: 7px; margin: 2px 0 0;
  padding: 6px 10px; border-radius: var(--radius-sm); background: var(--error-soft);
  border: 1px solid var(--error-line); color: var(--fg-soft); font-size: 12px; line-height: 1.5; }
.ce-risk-line .ico { flex: 0 0 auto; margin-top: 1px; color: var(--error); }
.ce-help { flex-basis: 100%; margin: 0; font-size: 12px; color: var(--fg-dim); line-height: 1.5; }
.ce-hint { font-style: normal; font-weight: 400; font-size: 11.5px; color: var(--fg-dim); }
.ce-empty-hint { flex-basis: 100%; margin: 0; padding: 8px 12px; border-radius: var(--radius-sm);
  background: var(--surface-1); color: var(--fg-dim); font-size: 12.5px; }
.ce-tag { font-size: 10.5px; padding: 1px 6px; border-radius: var(--radius-sm); background: var(--surface-2); color: var(--fg-dim); }
.ce-req { color: var(--error); }
.ce-spacer { flex: 1; }
.ce-pseudo { font-size: 12.5px; color: var(--warn); }

/* 顶栏搜索框 */
.top-search { display: flex; align-items: center; gap: 8px; }
.search-box { position: relative; display: flex; align-items: center; }
.search-box > .ico { position: absolute; left: 11px; color: var(--cyan); pointer-events: none; opacity: .85; }
.top-search input { width: 240px; padding: 7px 32px 7px 33px; border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: var(--bg-sunken); color: var(--fg); font-size: 13px;
  transition: border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease), width var(--dur) var(--ease); }
.top-search input::placeholder { color: var(--fg-dim); }
.top-search input:focus { outline: none; width: 300px; border-color: var(--accent); box-shadow: 0 0 0 3px var(--ring); }
.search-clear { position: absolute; right: 6px; width: 20px; height: 20px; display: grid; place-items: center;
  border: 0; border-radius: var(--radius-sm); background: transparent; color: var(--fg-dim); cursor: pointer; padding: 0; }
.search-clear:hover { background: var(--surface-2); color: var(--fg); }
.search-clear .ico { width: 12px; height: 12px; }

/* 按下反馈(可点元素统一轻微回缩) */
.tabs button:active, .table-tool:active, .dist-chip:active, .filter-btn:active,
.ce-btn:active, .ce-icon:active, .ctx-item:active, .pop-item:active, .col-menu-item:active,
.ce-side-item:active, .ce-master-item:active, .ce-picker-item:active, .theme-item:active { transform: scale(.975); }
.ce-icon:active, .ctx-item:active { transform: scale(.96); }

/* 设置页下拉外观统一(仍为原生 select, 仅外观) */
select.ce-input, .ce-inline-select, .ce-select, .ce-unit-group .ce-unit-select {
  appearance: none; -webkit-appearance: none; -moz-appearance: none;
  padding-right: 30px; border-radius: var(--radius-sm); cursor: pointer; text-overflow: ellipsis;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23808f9f' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.3 6.3 8 10l3.7-3.7'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 9px center; background-size: 12px 12px;
}
select.ce-input:hover, .ce-inline-select:hover, .ce-select:hover, .ce-unit-group .ce-unit-select:hover {
  border-color: var(--border-strong);
}
select.ce-input:focus, .ce-inline-select:focus, .ce-select:focus, .ce-unit-group .ce-unit-select:focus {
  border-color: var(--accent); box-shadow: 0 0 0 3px var(--ring); outline: none;
}
.ce-unit-group .ce-unit-select {
  padding-right: 26px;
  background-position: right 7px center;
  border-top-left-radius: 0;
  border-bottom-left-radius: 0;
  border-top-right-radius: var(--radius-sm);
  border-bottom-right-radius: var(--radius-sm);
}
select option { background: var(--bg-elev); color: var(--fg); }
.col-menu { max-height: 70vh; overflow-y: auto; }

/* ================= 添加种子对话框(R1B) —— 类名 .add-dialog 前缀 =================
 * 复用 .modal-mask/.modal/.modal-title/.modal-actions 视觉语言(仅引用 tokens 令牌, 不散写色值);
 * 预览区为静态说明(D4 接管语义) + 已有辅种组前缀计数(纯前端比对, 不发请求)。
 */
/* FX-19: 窗口从 640px 放宽到 760px —— 三个字段一行(路径 1.6fr + 分类 + 标签)时输入框不再局促 */
.modal.add-dialog { width: var(--modal-w-add); max-height: calc(100vh - 120px); display: flex; flex-direction: column; padding-bottom: 16px; }
.add-dialog-x { margin-left: auto; }
.add-dialog-body { overflow-y: auto; margin: 0 -4px; padding: 0 4px; }
.add-dialog-field { margin-top: 18px; }
.add-dialog-field:first-child { margin-top: 6px; }
.add-dialog-label { display: block; margin-bottom: 6px; color: var(--fg-dim); font-size: 11.5px; font-weight: 600;
  letter-spacing: .04em; }
.add-dialog-input, .add-dialog-textarea { width: 100%; padding: 8px 11px; border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: var(--bg-row); color: var(--fg); font-size: 13px; }
.add-dialog-input:focus, .add-dialog-textarea:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--ring); }
.add-dialog-textarea { resize: vertical; min-height: 72px; font-family: var(--font-mono); font-size: 12.5px; line-height: 1.55; }
.add-dialog-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.add-dialog-grid .add-dialog-field { margin-top: 18px; }
/* 保存路径独占一整行(R10-11 修订): 路径是本窗口最长的输入(绝对路径 + 盘符 + 中文目录),
 * 原先与分类/标签并成 3 列时只剩 ~400px, 输入框里看到的永远只是开头一截。
 * 分类与标签仍两列均分(双列后每个都比原先 1.6fr/1fr 更宽)。 */
.add-dialog-grid .add-dialog-pathfield { grid-column: 1 / -1; }
/* W2-FE-1(DLG-03/04): 来源行(文件选择 + 添加链接按钮) / 分类标签 combobox / 选择位置面板(复用 .pop-menu 视觉) */
.add-dialog-source { display: flex; flex-wrap: wrap; gap: 8px; }
.add-dialog-source .add-dialog-filepick { flex: 1 1 auto; min-width: 0; }
.add-dialog-linkbtn { flex: 0 0 auto; }
.add-dialog-combo { position: relative; }
/* FX-18 根因修复: 浮层是 position:absolute + top: calc(100% + 4px), 因此**容器必须有定位祖先**。
 * .add-dialog-combo 有 relative, 但包着路径输入框与"选择位置"按钮的 .add-dialog-pathrow **没有** ——
 * 最近的定位祖先是 .modal-mask(position: fixed; inset: 0), 于是 top: 100% 换算到视口下沿之外,
 * 面板被渲染到屏幕外, 表现为"点了没反应"。 */
.add-dialog-pathrow { position: relative; display: flex; flex-wrap: wrap; gap: 8px; }
/* FX-18: 浮层锚点从"整个 field 盒"下沉到"输入行" —— .add-dialog-field 是 grid 项, 默认被拉伸到
 * 同行最高项的底边, 用 100% 定位就会离输入框很远。包一层 .add-input-row(relative) 后,
 * 面板宽度与输入框逐像素对齐、顶边贴住输入框下缘。 */
.add-input-row { position: relative; display: flex; align-items: center; gap: 8px; min-width: 0; }
.add-input-row > .add-dialog-input { flex: 1 1 auto; min-width: 0; }
/* R10-11 修订: 输入行必须能**撑满**剩余的同行空间 —— 原先只有 min-width:0 没有增长因子,
 * 它在 flex 行里退到"内容宽"(input 的 auto 宽 ≈ 180px), 结果是保存路径独占整行后右侧
 * 仍留一大片空白(用户: "路径输入框太小")。 */
.add-dialog-pathrow > .add-input-row { flex: 1 1 auto; }
.add-input-row > .add-pop { left: 0; right: 0; width: auto; }
.add-dialog-pathrow .add-dialog-input { flex: 1 1 auto; min-width: 0; }
.add-dialog-pathbtn { flex: 0 0 auto; white-space: nowrap; }
.add-pop { top: calc(100% + 4px); width: 100%; z-index: 60; }
.add-pop-list { max-height: 210px; overflow-y: auto; }
.add-pop-item { cursor: pointer; }
/* 文件选择按钮(隐藏原生 input, label 即按钮)与已选文件 chips */
.add-dialog-filepick { display: flex; align-items: center; gap: 8px; padding: 9px 12px; border-radius: var(--radius-sm);
  border: 1px dashed var(--border-strong); background: var(--surface-1); color: var(--fg-muted); font-size: 13px;
  cursor: pointer; user-select: none; }
.add-dialog-filepick:hover { border-color: var(--accent); color: var(--fg); }
.add-dialog-filepick .ico { color: var(--accent); }
.add-dialog-filepick input[type="file"] { display: none; }
.add-dialog-filelist { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.add-dialog-filechip { display: inline-flex; align-items: center; gap: 5px; max-width: 100%; padding: 3px 4px 3px 9px;
  border-radius: 999px; background: var(--surface-1); border: 1px solid var(--border-soft); font-size: 12px;
  color: var(--fg-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.add-dialog-chipx { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px;
  border-radius: 50%; border: none; background: transparent; color: var(--fg-dim); cursor: pointer; flex: 0 0 auto; }
.add-dialog-chipx:hover { background: var(--error-soft); color: var(--error); }
.add-dialog-chipx .ico { width: 10px; height: 10px; }
/* FX-20: 选项区改胶囊容器的横排流式布局(与原 .add-dialog-checks 同位) */
.add-dialog-opts { display: flex; flex-wrap: wrap; gap: 8px; }
.add-dialog-hint { margin-top: 7px; color: var(--fg-dim); font-size: 11.5px; }
/* FX-21: 警告行**常驻占位** —— 勾选"跳过校验"前后窗口高度不变。
 * 用 visibility(而非 opacity)是为了让占位高度由真实文本决定, 不依赖人工估高。 */
.add-dialog-hint-warn { color: var(--error); visibility: hidden; }
.add-dialog-hint-warn.on { visibility: visible; }
/* D4 接管预览(静态说明区): 弱化底色 + 当前配置语义文案 */
.add-dialog-preview { margin-top: 16px; padding: 11px 13px; border-radius: var(--radius-sm);
  background: var(--surface-1); border: 1px solid var(--border-soft); }
.add-dialog-preview-title { display: flex; align-items: center; gap: 7px; font-size: 12px; font-weight: 600;
  color: var(--accent); letter-spacing: .03em; }
.add-dialog-preview-line { margin: 8px 0 0; color: var(--fg-muted); font-size: 12.5px; line-height: 1.6; }
.add-dialog-preview-line b { color: var(--fg); font-weight: 600; }
.add-dialog-preview-line.dim { color: var(--fg-dim); }
@media (max-width: 900px) {
  .modal.add-dialog { width: 100%; }
  .add-dialog-grid { grid-template-columns: 1fr; }
}

/* ============ 种子编辑能力(D 轮) — 多字段编辑对话框/抽屉工具栏/行内小按钮 ============
 * 与 atlas 同构; 仅引用 tokens(颜色令牌由 themes/*.css 提供)。 */
.modal-body { overflow-wrap: anywhere; }  /* 长路径/URL(如删除 tracker 确认)在确认框内可断行 */
.modal-fields { display: flex; flex-direction: column; gap: 12px; margin: 10px 0 18px; }
.modal-field { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.modal-field-label { font-size: 12px; font-weight: 600; color: var(--fg-muted); }
.modal-field input { width: 100%; padding: 9px 12px; border-radius: var(--radius-sm); border: 1px solid var(--border);
  background: var(--bg); color: var(--fg); font-size: 13.5px; }
.modal-field input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--ring); }
.drawer-toolbar { display: flex; align-items: center; gap: 10px; margin: 0 0 10px; }
.drawer-toolbar .ce-btn { display: inline-flex; align-items: center; gap: 6px; }
.drawer-toolbar-hint { font-size: 11.5px; color: var(--fg-dim); }
.drawer-table th.th-act { width: 1%; }
.drawer-table td.cell-act { white-space: nowrap; text-align: right; padding-top: 4px; }
.row-btn { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; padding: 0;
  border: 0; border-radius: var(--radius-sm); background: transparent; color: var(--fg-dim); cursor: pointer;
  transition: background var(--dur) var(--ease), color var(--dur) var(--ease); }
.row-btn:hover { background: var(--bg-hover); color: var(--fg); }
.row-btn.danger:hover { background: var(--error-soft); color: var(--error); }
.drawer-table td.clickable { cursor: pointer; }
.drawer-table tr.sel td { background: var(--accent-soft); }
.prio-btn { padding: 2px 9px; border: 1px solid var(--border); border-radius: var(--radius-sm);
  background: transparent; color: var(--fg-soft); font: inherit; font-size: 11.5px; cursor: pointer;
  transition: border-color var(--dur) var(--ease), color var(--dur) var(--ease); }
.prio-btn:hover { border-color: var(--accent); color: var(--accent); }
.prio-btn.skipped { color: var(--fg-dim); }


/* ================= 统计面板对话框(FE-2C) —— 复用 .modal/.add-dialog 视觉语言(仅引用 tokens) =================
 * server_state 字段直取, 缺失显示 —; 键值行斑马纹, 右值用 mono 数据字体。
 */
.modal.stats-dialog { width: var(--modal-w-narrow); }
.stats-grid { display: flex; flex-direction: column; gap: 2px; margin-top: 6px; }
.stats-row { display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  padding: 7px 9px; border-radius: var(--radius-sm); }
.stats-row:nth-child(odd) { background: var(--bg-row); }
.stats-row .lbl { flex: 0 0 auto; color: var(--fg-dim); font-size: 12px; }
.stats-row .val { color: var(--fg); font-weight: 600; font-size: 12.5px; text-align: right;
  font-family: var(--font-mono); overflow-wrap: anywhere; }

/* ================= 分类/标签管理对话框(FE-2C2) —— 与 atlas 同构, 复用 .modal/.add-dialog 视觉语言 =================
 * 列表行(名字 + 保存路径 + 行级操作) / 新建行 / 底部提示; 全部只引用既有 tokens。
 */
.modal.mgr-dialog { width: var(--modal-w-form); }
.mgr-list { display: flex; flex-direction: column; margin: 4px 0 14px; max-height: 300px; overflow-y: auto; }
.mgr-row { display: flex; align-items: center; gap: 10px; padding: 7px 2px; }
.mgr-row + .mgr-row { border-top: 1px solid var(--border-soft); }
.mgr-name { flex: 0 1 auto; min-width: 80px; max-width: 40%; font-weight: 600; font-size: 13px; color: var(--fg);
  overflow-wrap: anywhere; }
.mgr-sub { flex: 1 1 auto; min-width: 0; color: var(--fg-dim); font-size: 11.5px;
  font-family: var(--font-mono); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mgr-sub.dim { font-style: italic; }
.mgr-acts { flex: 0 0 auto; display: flex; gap: 6px; }
.mgr-empty { margin: 10px 0; color: var(--fg-dim); font-size: 12.5px; }
.mgr-new { display: flex; gap: 8px; }
.mgr-new .add-dialog-input { flex: 1 1 auto; width: auto; min-width: 0; }
.mgr-new .add-dialog-input + .add-dialog-input { flex: 1.4 1 auto; }
.mgr-new .ce-btn { flex: 0 0 auto; }
.mgr-hint { display: flex; align-items: center; gap: 8px; margin-top: 10px; padding: 8px 11px;
  border-radius: var(--radius-sm); background: var(--warn-soft); border: 1px solid var(--warn);
  color: var(--warn); font-size: 11.5px; line-height: 1.5; }
.mgr-hint .ico { flex: 0 0 auto; }

/* 筛选弹层底部管理入口(FE-2C2): sticky 吸底(长列表滚动时管理入口不滚走), 顶部细线与列表区分隔 */
.pop-mgr-btn { position: sticky; bottom: -8px; display: flex; align-items: center; gap: 6px;
  margin: 6px -8px -8px; padding: 8px 8px 8px 10px; border: 0; border-top: 1px solid var(--border-soft);
  background: var(--bg-elev); color: var(--accent-hi); font: inherit; font-size: 12px; cursor: pointer;
  border-radius: 0 0 var(--radius) var(--radius); }
/* hover 底色必须不透明: --surface-2 是半透明高光, 直接当背景会让吸底按钮透出滚过的
 * 选项行( FIX-02 "管理标签"项 hover 背景变透明 ); 用同色渐变把高光叠进 --bg-elev, 仍只引用令牌 */
.pop-mgr-btn:hover { color: var(--fg); background: linear-gradient(var(--surface-2), var(--surface-2)), var(--bg-elev); }

/* ================= CTX-01 彩色图标集(波次三 W2) =================
 * 右键菜单此前除 开始/暂停/汇报 三个语义色与危险项外, 其余图标一律继承 --fg-dim(灰),
 * 15+ 项看起来"全都没颜色"。这里按操作族补色, 色值一律来自令牌(themes/*.css 单点可调)。 */
.ctx-item .ico-info { color: var(--cyan); }       /* 查看: 详细信息 */
.ctx-item .ico-gauge { color: var(--limit-hit); } /* 编辑: 限速 */
.ctx-item .ico-percent { color: var(--pink); }    /* 编辑: 分享率 */
.ctx-item .ico-move { color: var(--teal); }       /* 编辑: 移动 */
.ctx-item .ico-rename { color: var(--indigo); }   /* 编辑: 重命名 */
.ctx-item .ico-copy { color: var(--blue); }       /* 复制族 */
.ctx-item .ico-recheck { color: var(--accent); }  /* 维护: 重新校验 */
.ctx-item .ico-super { color: var(--violet); }    /* 高级: 超级做种 */
.ctx-item .ico-force { color: var(--warn); }      /* 高级: 强制开始 */
.ctx-item .ico-queue { color: var(--teal); }      /* 队列族(与"移动"同族: 位置语义) */
.ctx-item .ico-tmm { color: var(--green); }       /* 自动种子管理开关 */
.ctx-item .ico-export { color: var(--lime); }     /* 导出 .torrent */
.ctx-item .ico-folder { color: var(--accent-hi); } /* FX-14: 打开目标文件夹(走系统默认程序) */
.ctx-item .ico-tune { color: var(--violet); }      /* FX-15: 次级菜单入口(高级能力) */

/* ================= FX-15 次级菜单(flyout) =================
 * 一级只放 PT 日常高频动作; qB 通用能力进子面板。子面板锚在父项右缘, 靠右时向左翻(flip-x)。
 * 展开交互: hover 与点击都能展开(@mouseenter + @click.stop), 键盘用户走 Enter/Space。
 * 注意: 父项必须 position: relative —— 与"浮层缺定位祖先"是同一类坑(FX-18)。 */
/* FX-28: 表头右键菜单里的"当前口径"勾标(与 .ctx-caret 同位置语言: 右缘对齐, 不挤占文案) */
.ctx-item .ctx-tick { margin-left: auto; stroke-width: 2.4; }
.ctx-item.has-sub { position: relative; }
.ctx-item.has-sub .ctx-caret { margin-left: auto; color: var(--fg-dim); opacity: .7;
  transform: rotate(-90deg); transition: transform var(--dur) var(--ease); }
.ctx-item.has-sub.open .ctx-caret { opacity: 1; transform: none; color: var(--accent-hi); }
.ctx-item.has-sub.open { background: var(--bg-hover); }
.ctx-sub { position: absolute; left: calc(100% + 4px); top: -6px; z-index: 1;
  min-width: 190px; padding: 6px; border-radius: var(--radius);
  background: var(--bg-card); border: 1px solid var(--border-strong); box-shadow: var(--shadow-3);
  animation: drop-in .12s var(--ease); }
.ctx-sub.flip-x { left: auto; right: calc(100% + 4px); }
/* 点位图标: 统计 / 运行日志(章节入口) 此前同样无颜色 */
.ico-chart { color: var(--cyan); }
.ico-log { color: var(--pink); }
.ico-risk { color: var(--warn); }   /* 风险标识(RFB-02 件2: 紧凑图标替代文字徽标) */

/* ================= CTX-02 触发源强调 =================
 * 右键菜单弹出期间把被作用的那一行框出来, 让"这次操作针对谁"一眼可见。
 * 刻意**不改背景**: 行底色已承担状态语义, 再叠一层会互相打架 —— 只用内描边强调。
 * 标记与清理都在共享层(app.js _markCtxSource/_clearCtxSource), 双 UI 同源。 */
.group-row.ctx-src, .member-row.ctx-src, .show-row.ctx-src, .ep-row.ctx-src {
  box-shadow: inset 2px 0 0 var(--accent), inset 0 0 0 1px var(--accent-line); }
.ctx-anchor.ctx-src { box-shadow: 0 0 0 2px var(--ring); border-radius: var(--radius-sm); }

/* ================= W4 顶栏: 一级导航三态 + 设置右置 + 品牌动态化 ================= */
/* 设置按钮独立成组靠右(与左侧视图导航分列); 复用 .tabs 的 hover/active 语言 */
.tabs-right { margin-left: auto; }
.brand-name { font-family: var(--font-display); letter-spacing: .02em; }
.brand-name .qb { font-size: .86em; }   /* qb 字样略微减小 */
.brand-mark .brand-orbit { width: 20px; height: 20px; color: var(--accent); }
/* 卫星绕心旋转: 12s 线性匀速, 低干扰; prefers-reduced-motion 由 base.css 全局降级停转 */
@keyframes orbit-spin { to { transform: rotate(360deg); } }
.brand-orbit { animation: orbit-spin 12s linear infinite; transform-origin: 50% 50%; }
