/* ============================================================
   RedQueen 3.0 — 视觉 token（RQ3-UIIMPL-P0-8d5w 换肤批）
   深色三栏 app：左导航 + 中对话流 + 右上下文面板
   本批 = design-tokens.md v2.0「Quiet Precision」§8.7 第 1 步（零风险换肤）：
   新 token 体系按 tokens §1-§6 定义落位；旧 54 变量 alias 指向新 token（新名+旧名
   双轨），组件类名/HTML/JS 零改动 → 全站即时获得新色板/圆角/阴影。
   后续：第 2 步组件引用旧名→新名分批切换；第 3 步观察期后删旧名 alias。
   ============================================================ */
:root {
  /* ==================== 新 token · 1 原始中性色阶（tokens §1.1 Dark 13 阶） ==================== */
  --rq-neutral-0: #080a0e;     /* 最深内嵌槽（代码块底 / inset） */
  --rq-neutral-50: #0c0f14;    /* 画布底 canvas（中栏对话区） */
  --rq-neutral-100: #11151c;   /* 面板底 panel（左/右栏、顶栏） */
  --rq-neutral-200: #171c24;   /* 浮起面 raised（卡片默认底） */
  --rq-neutral-300: #1e242e;   /* 浮起面 +1（hover 卡片、激活行） */
  --rq-neutral-400: #28303b;   /* 悬浮菜单 / popover / 下拉底 */
  --rq-neutral-500: #343c49;   /* 默认描边（强结构线） */
  --rq-neutral-600: #444d5c;   /* hover 描边、分隔强调线 */
  --rq-neutral-700: #5b6573;   /* 禁用描边 / 弱图标 */
  --rq-neutral-800: #8a94a3;   /* 次级文本 muted、占位符 */
  --rq-neutral-900: #b8c0cc;   /* 次级标题、辅助正文 */
  --rq-neutral-950: #e8edf3;   /* 主文本 default */
  --rq-neutral-1000: #f6f8fb;  /* 最高对比文本 */

  /* ==================== 新 token · 2 语义别名（tokens §1.2） ==================== */
  --color-canvas: var(--rq-neutral-50);
  --color-surface-0: var(--rq-neutral-0);
  --color-surface-1: var(--rq-neutral-100);
  --color-surface-2: var(--rq-neutral-200);
  --color-surface-3: var(--rq-neutral-300);
  --color-surface-4: var(--rq-neutral-400);
  --color-border: var(--rq-neutral-500);
  --color-border-strong: var(--rq-neutral-600);
  --color-border-subtle: rgba(184, 192, 204, 0.10);
  --color-text: var(--rq-neutral-950);
  --color-text-secondary: var(--rq-neutral-900);
  --color-text-muted: var(--rq-neutral-800);
  --color-text-disabled: var(--rq-neutral-700);
  --color-text-inverse: #10131a;

  /* ==================== 新 token · 3 覆盖/交互态（tokens §1.3） ==================== */
  --state-hover: rgba(184, 192, 204, 0.07);
  --state-active: rgba(184, 192, 204, 0.12);
  --state-selected: rgba(232, 90, 110, 0.12);
  --state-overlay: rgba(6, 8, 12, 0.60);
  --state-scrim: rgba(6, 8, 12, 0.42);
  /* G3 亮色主题批：双态结构令牌（深色值=原值，零变化；light 覆盖块按下表值切换） */
  --topbar-bg: rgba(12, 13, 18, 0.86);      /* 顶栏半透底（blur 衬底） */
  --drawer-mask: rgba(1, 4, 9, 0.55);       /* <1440/<1024 抽屉遮罩 */
  --modal-mask: rgba(4, 5, 8, 0.62);        /* 模态全屏遮罩 */
  --risk-tick-line: rgba(230, 237, 243, 0.30); /* 风险分条 25/50/75 刻度线 */
  --shadow-ink: 4, 6, 10;                   /* 阴影基准 RGB（§7：深色 rgba(4,6,10,*)） */

  /* ==================== 新 token · 4 品牌红（tokens §2；主色 #df5668→#e85a6e 深底亮化） ==================== */
  --brand-50: #fdf3f5;
  --brand-100: #f9dbe0;
  --brand-200: #f2b3bd;
  --brand-300: #ee8698;
  --brand-400: #e85a6e;        /* 主品牌色：logo 深底墨色、focus 环、选中强调 */
  --brand-500: #cf3d55;        /* 品牌实心主按钮（深底主 CTA） */
  --brand-600: #b42d44;
  --brand-700: #931f33;
  --brand-fg: #ff7585;         /* 深底品牌文字/链接 hover */
  --brand-soft: rgba(232, 90, 110, 0.12);   /* 品牌淡底（选中行、标识底） */
  --brand-soft-2: rgba(232, 90, 110, 0.20);
  --brand-line: rgba(232, 90, 110, 0.38);
  --brand-glow: rgba(232, 90, 110, 0.28);
  --logo-ink: var(--brand-400);           /* 字标墨色 · 深底亮化档（tokens §8.3） */

  /* ==================== 新 token · 5 语义功能色（tokens §3，soft/line 三件套成套） ==================== */
  --danger-400: #f2556a;
  --danger-500: #e03550;        /* 危险/恶意/P0 主色 */
  --danger-600: #c22741;
  --danger-fg: #ff7a72;
  --danger-soft: rgba(224, 53, 80, 0.12);
  --danger-line: rgba(224, 53, 80, 0.36);
  --warning-400: #f6b44a;
  --warning-500: #eea028;
  --warning-fg: #ffc25c;
  --warning-text: #f6b44a;        /* H1a #1：小字专用档；深色=400 观感（深色零变化），浅色块加深至 AA */
  --warning-soft: rgba(244, 176, 62, 0.13);
  --warning-line: rgba(244, 176, 62, 0.38);
  --success-400: #48d69a;
  --success-500: #2ebd82;
  --success-fg: #5fe3ab;
  --success-text: #48d69a;        /* H1a #1：小字专用档；深色=400 观感（深色零变化），浅色块加深至 AA */
  --success-soft: rgba(52, 210, 140, 0.13);
  --success-line: rgba(52, 210, 140, 0.38);
  --info-400: #709bff;
  --info-500: #5b8cff;
  --info-fg: #8fb0ff;
  --info-soft: rgba(104, 148, 255, 0.13);
  --info-line: rgba(104, 148, 255, 0.36);
  --purple-400: #c074e8;        /* 仅 ATT&CK 手法 / Skill 标识，禁止用于卡片描边 */
  --purple-fg: #d292f0;
  --purple-soft: rgba(180, 104, 228, 0.14);
  --purple-line: rgba(180, 104, 228, 0.36);

  /* ==================== 新 token · 6 字体（tokens §4；Inter 拉丁优先，零网络依赖） ==================== */
  --font-sans: 'Inter', 'Noto Sans SC', -apple-system, 'SF Pro Text', 'PingFang SC', 'Microsoft YaHei', system-ui, sans-serif;
  --font-mono: 'JetBrains Mono', 'SF Mono', ui-monospace, Menlo, Consolas, monospace;
  --font-display: 'Inter', 'Noto Sans SC', sans-serif;
  --text-2xs: 10.5px;  --text-xs: 11.5px;  --text-sm: 12.5px;  --text-base: 14px;
  --text-md: 15px;  --text-lg: 17px;  --text-xl: 20px;  --text-2xl: 24px;  --text-3xl: 30px;
  --weight-regular: 400;  --weight-medium: 500;  --weight-semibold: 600;  --weight-bold: 700;
  --tracking-tight: -0.015em;  --tracking-normal: 0;  --tracking-wide: 0.02em;
  --leading-none: 1;  --leading-tight: 1.3;  --leading-normal: 1.55;  --leading-relaxed: 1.7;
  --measure: 68ch;

  /* ==================== 新 token · 7 间距 / 布局尺寸（tokens §5，4/8 栅格） ==================== */
  --space-0: 0;  --space-1: 4px;  --space-2: 8px;  --space-3: 12px;  --space-4: 16px;
  --space-5: 20px;  --space-6: 24px;  --space-8: 32px;  --space-10: 40px;  --space-12: 48px;
  --space-16: 64px;  --space-20: 80px;  --space-24: 96px;
  --gap-card: 12px;  --gap-section: 24px;  --pad-panel: 16px;  --pad-card: 16px;  --inline-control: 8px;
  --width-nav: 236px;  --width-panel: 348px;  --width-chat: 760px;
  --height-topbar: 48px;  --height-composer-one: 52px;  --target-min: 44px;

  /* ==================== 新 token · 8 圆角 / 阴影 / 动效（tokens §6.1-6.3；md/lg 收紧） ==================== */
  --radius-2xs: 3px;  --radius-xs: 4px;  --radius-sm: 6px;  --radius-md: 8px;
  --radius-lg: 12px;  --radius-xl: 16px;  --radius-full: 999px;
  --shadow-xs: 0 1px 2px rgba(var(--shadow-ink), 0.30);
  --shadow-sm: 0 2px 8px rgba(var(--shadow-ink), 0.30);
  --shadow-md: 0 8px 24px rgba(var(--shadow-ink), 0.38);
  --shadow-lg: 0 16px 40px rgba(var(--shadow-ink), 0.48);
  --shadow-brand: 0 4px 16px rgba(207, 61, 85, 0.32);
  --ring-focus: 0 0 0 2px var(--color-canvas), 0 0 0 4px var(--brand-400);
  --duration-instant: 80ms;  --duration-fast: 140ms;  --duration-base: 200ms;
  --duration-slow: 320ms;  --duration-enter: 240ms;
  --ease-standard: cubic-bezier(0.2, 0, 0, 1);
  --ease-emphasized: cubic-bezier(0.3, 0, 0, 1);
  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
  --ease-in: cubic-bezier(0.7, 0, 0.84, 0.4);

  /* ==================== 新 token · 9 z-index 台账（tokens §6.4 V1.1 百段阶梯·已接线） ==================== */
  /* RQ3-UIIMPL-A1 原子切换（值跳变一次到位、不可分批）：设计师裁决「载体>遮罩」配对铁律——
     抽屉族 mask 700 / nav 800 / panel 800（左右同档、互斥由 rq.js 保证），模态族 overlay 900 /
     modal 1000（模态遮罩须盖住已打开的抽屉），toast 1100 浮于模态之上（瞬态反馈不被吞），
     tooltip 1200 永最上（pointer-events:none 不阻断）。--z-drawer 废删（左右抽屉分设
     --z-nav/--z-panel）；--z-pop/-float/-mask/-toast/-modal 新旧同名无法双轨，本批定稿新值。 */
  --z-base: 0;  --z-sticky: 100;  --z-dropdown: 200;  --z-pop: 300;
  --z-float: 400;  --z-mask: 700;  --z-nav: 800;  --z-panel: 800;
  --z-overlay: 900;  --z-modal: 1000;  --z-toast: 1100;  --z-tooltip: 1200;

  /* ============================================================
     旧 54 变量兼容层（tokens §8 迁移对照表 · 改名/废弃项 alias 指向新 token，
     组件 100+ 处旧名引用零改动；观察一个版本后按 §8.7 第 3 步删除）
     ============================================================ */
  /* ---- 表面与背景（§8.1：改名×4 + 废弃×5） ---- */
  --bg-canvas: var(--color-canvas);       /* #0d1117 → #0c0f14 */
  --bg-panel: var(--color-surface-1);     /* #161b22 → #11151c */
  --bg-raised: var(--color-surface-2);    /* #1c2128 → #171c24 */
  --bg-inset: var(--color-surface-0);     /* #010409 → #080a0e（提亮避免死黑） */
  --bg0: var(--color-surface-0);
  --bg1: var(--color-canvas);
  --bg2: var(--color-surface-1);
  --bg3: var(--color-surface-2);
  --bg4: var(--color-surface-3);          /* #21262d → #1e242e（hover 面） */
  /* ---- 描边与文本（§8.2：改名×6 + 废弃×3；次级文本整体提亮一档） ---- */
  --border-default: var(--color-border);  /* #30363d → #343c49 */
  --line: var(--color-border);
  --line2: var(--color-border-strong);    /* #3d444d → #444d5c */
  --hover-border: var(--color-border-strong);  /* 语义合并入 border-strong */
  --fg-default: var(--color-text);        /* #e6edf3 → #e8edf3 */
  --fg-muted: var(--color-text-secondary);/* #8b949e → #b8c0cc（次级正文提升一档） */
  --fg-subtle: var(--color-text-muted);   /* #868f99 → #8a94a3 */
  --text: var(--color-text);
  --muted: var(--color-text-secondary);
  --faint: var(--color-text-muted);
  /* ---- 品牌与危险（§8.3：改名×4 + 废弃×4；双红归一口径延续） ---- */
  --brand: var(--brand-400);              /* #df5668 → #e85a6e（深底亮化） */
  --danger: var(--danger-500);            /* #d9304e → #e03550 */
  /* --danger-fg / --brand-soft 新旧同名，直接取新值（新 token §4/§5 已定义，不在此重复声明） */
  --red: var(--danger-500);
  --red-2: var(--danger-fg);
  --red-soft: var(--danger-soft);         /* rgba(224,53,80,.12) */
  --red-line: var(--danger-line);         /* rgba(224,53,80,.36) */
  /* ---- 其他语义色（§8.4：改名×8，值按新板微调） ---- */
  --green: var(--success-400);            /* #3ecf8e → #48d69a */
  --green-soft: var(--success-soft);
  --amber: var(--warning-400);            /* #f0a13c → #f6b44a */
  --amber-soft: var(--warning-soft);
  --blue: var(--info-500);                /* #5b8cff 值保留 */
  --blue-soft: var(--info-soft);
  --purple: var(--purple-400);            /* #b05de0 → #c074e8（提亮）；--purple-soft 同名取新值（§5） */
  /* ---- 圆角（§8.5：md/lg 收紧，视觉更利落密度更高） ---- */
  --r-xs: var(--radius-xs);               /* 4px */
  --r-sm: var(--radius-sm);               /* 6px */
  --r-md: var(--radius-md);               /* 10px → 8px */
  --r-lg: var(--radius-lg);               /* 14px → 12px */
  /* ---- 阴影（阴影只表达浮层高度）；--shadow-sm 同名取新值（新 token §8） ---- */
  --shadow: var(--shadow-lg);
  /* ---- 动效 ---- */
  --dur-fast: var(--duration-fast);       /* 0.15s → 140ms */
  --dur-enter: var(--duration-enter);     /* 0.18s → 240ms */
  /* ---- z-index（RQ3-UIIMPL-A1：旧兼容 z 段整体移除——--z-pop/-float/-mask/-toast/-modal
     新旧同名，已并入上方新 token §9 直接定稿新档；--z-drawer 废删，左右抽屉改指
     --z-nav/--z-panel（@media 断点同步接线）） ---- */
  /* ---- 交互态（§8.5 改名） ---- */
  --hover-bg: var(--state-hover);         /* rgba(184,192,204,0.07) 中性 hover 底 */
  /* ---- 滚动条（§8.5 保留项，值取 --color-border） ---- */
  --scrollbar: var(--color-border);       /* #30363d → #343c49 */
  /* ---- 字体（改名；Inter 提前为拉丁首选） ---- */
  --font: var(--font-sans);
  --mono: var(--font-mono);
  /* ---- J4 组件透明叠加 tint 基色（RQ3-PROD-J4：分类 b——深色下列基色与深色 soft/line
     令牌基色存在历史微漂（danger #d9304e→#e03550 等），为保迁移零视觉差，tint 保留
     组件层原始基色（恰=浅色列基色），仅把 rgba 形态改 color-mix；RC 后另批评估语义归并） ---- */
  --danger-tint: #d9304e;
  --warning-tint: #f0a13c;
  --success-tint: #3ecf8e;
  --info-tint: #5b8cff;
  --purple-tint: #b05de0;
  /* 确认卡 confirmed 描边专用：深底 #48d69a（=--success-400，旧 rgba 基色零漂移），
     浅底取 #1fa971（=light --success-400），随主题切换 */
  --confirm-tint: #48d69a;
}

/* ============================================================
   G3 亮色主题批（RQ3-LIGHT-G3）：Light 主题变量层
   Quiet Precision · Light（tokens §1.4 + §2-§5 Light 列 + §7 完整映射）。
   opt-in：仅 html[data-theme='light'] 时生效；默认深色块零改动。
   覆盖两层：①原始色阶/语义别名/交互态/品牌/功能色/阴影基准——全量按表值；
   ②旧 54 变量兼容层全部为纯 var() alias（--bg0/--line/--text/… 指向新 token），
   随被指项自动切换，浅色下「双轨同值」天然成立，无需重复声明（G3 汇报附 §7 对照表）。
   ============================================================ */
:root[data-theme='light'] {
  /* ---- §1.4 浅色原始中性阶 13 阶 ---- */
  --rq-neutral-0: #ffffff;
  --rq-neutral-50: #f7f8fa;
  --rq-neutral-100: #f1f3f6;
  --rq-neutral-200: #e8ebef;
  --rq-neutral-300: #dde1e7;
  --rq-neutral-400: #c9cfd8;
  --rq-neutral-500: #a6aeb9;
  --rq-neutral-600: #7d8794;
  --rq-neutral-700: #5b6573;
  --rq-neutral-800: #3d4652;
  --rq-neutral-900: #262d37;
  --rq-neutral-950: #161b23;
  --rq-neutral-1000: #0c0f14;

  /* ---- §7 语义映射（注意：surface-2/4=#ffffff、surface-3=#f1f3f6，非简单原始阶倒序） ---- */
  --color-canvas: #f7f8fa;
  --color-surface-0: #ffffff;
  --color-surface-1: #f1f3f6;
  --color-surface-2: #ffffff;
  --color-surface-3: #f1f3f6;
  --color-surface-4: #ffffff;
  --color-border: #dde1e7;
  --color-border-strong: #c9cfd8;
  --color-border-subtle: rgba(22, 27, 35, 0.08);
  --color-text: #161b23;
  --color-text-secondary: #3d4652;
  --color-text-muted: #5b6573;
  --color-text-disabled: #a6aeb9;
  --color-text-inverse: #f6f8fb;

  /* ---- §7 交互/覆盖态（浅底黑叠） ---- */
  --state-hover: rgba(22, 27, 35, 0.05);
  --state-active: rgba(22, 27, 35, 0.08);
  --state-selected: rgba(223, 86, 104, 0.12);
  --state-overlay: rgba(16, 20, 28, 0.40);
  --state-scrim: rgba(16, 20, 28, 0.28);

  /* ---- §2 品牌红 Light 列 ---- */
  --brand-50: #fdf3f5;
  --brand-100: #f9dbe0;
  --brand-200: #f2b3bd;
  --brand-300: #e9818e;
  --brand-400: #df5668;            /* 浅色主品牌色：focus 环、选中强调 */
  --brand-500: #ad0c24;            /* 主 CTA 实心（浅底主按钮） */
  --brand-600: #970a1f;
  --brand-700: #7d041c;
  --brand-fg: #ad0c24;             /* 浅底品牌文字（on white 7.36:1，AA；同 --logo-ink 浅色档） */
  --brand-soft: rgba(223, 86, 104, 0.10);
  --brand-soft-2: rgba(223, 86, 104, 0.18);
  --brand-line: rgba(223, 86, 104, 0.34);
  --brand-glow: rgba(173, 12, 36, 0.24);
  --logo-ink: #ad0c24;             /* 浅底字标墨色（tokens §8.3 权威值；H1a #2：#ad0d23 → #ad0c24 双值统一） */

  /* ---- §3.1 危险 Danger Light 列 ---- */
  --danger-400: #d9304e;
  --danger-500: #c22241;
  --danger-600: #a31b36;
  --danger-fg: #cf2a47;
  --danger-soft: rgba(217, 48, 78, 0.08);
  --danger-line: rgba(217, 48, 78, 0.32);

  /* ---- §3.2 警告 Warning Light 列 ---- */
  --warning-400: #d98a1f;
  --warning-500: #c27a12;
  --warning-fg: #916208;           /* H1a #1b：#b56d08(4.07) 加深；on #f1f3f6 4.78 / on white 5.31 */
  --warning-text: #916208;        /* H1a #1a：小字专用档（pill/note 等），三种浅色面 ≥4.5 */
  --warning-soft: rgba(240, 161, 60, 0.10);
  --warning-line: rgba(240, 161, 60, 0.40);

  /* ---- §3.3 成功 Success Light 列 ---- */
  --success-400: #1fa971;
  --success-500: #178f5e;
  --success-fg: #128054;
  --success-text: #0e6b4a;        /* H1a #1a：小字专用档，on white 6.52 / on #f1f3f6 5.87 */
  --success-soft: rgba(62, 207, 142, 0.10);
  --success-line: rgba(62, 207, 142, 0.40);

  /* ---- §3.4 信息 Info Light 列 ---- */
  --info-400: #3f6fe0;
  --info-500: #2f5cc9;
  --info-fg: #2a52b8;
  --info-soft: rgba(91, 140, 255, 0.10);
  --info-line: rgba(91, 140, 255, 0.38);

  /* ---- §3.5 紫色 Light 列（仍仅限 ATT&CK / Skill） ---- */
  --purple-400: #9a3fc4;
  --purple-fg: #8a2fb3;
  --purple-soft: rgba(176, 93, 224, 0.10);
  --purple-line: rgba(176, 93, 224, 0.38);

  /* ---- §7 阴影基准色 + 双态结构令牌 ---- */
  --shadow-ink: 28, 34, 44;
  --shadow-brand: 0 4px 16px rgba(173, 12, 36, 0.24);
  --topbar-bg: rgba(247, 248, 250, 0.86);
  --drawer-mask: rgba(16, 20, 28, 0.40);
  --modal-mask: rgba(16, 20, 28, 0.40);
  --risk-tick-line: rgba(22, 27, 35, 0.22);

  /* focus 环内层取画布色——变量自动随主题，此处仅注释说明，不重复声明 */

  /* ---- J4 组件透明叠加 tint 基色（RQ3-PROD-J4：浅色列基色，与各 light soft/line 同源） ---- */
  --danger-tint: #d9304e;
  --warning-tint: #f0a13c;
  --success-tint: #3ecf8e;
  --info-tint: #5b8cff;
  --purple-tint: #b05de0;
  /* 确认卡 confirmed 描边专用浅色值（=light --success-400，旧 rgba 基色零漂移） */
  --confirm-tint: #1fa971;
}

* { box-sizing: border-box; margin: 0; padding: 0; }
/* RQ3-UI-PWA A：三栏工作台页（body.app-shell：client/index）整页不滚动，三栏各自独立滚动；
   extension 插件页为常规滚动文档页，不受 overflow:hidden 影响 */
/* RQ3-WINFIT-G2（Windows 空态浅色带修复）：html,body{height:100%} 链在 Windows Electron
   特定形态下塌陷（body 高=内容高，其下露出 html 默认白底 → 空态窗口下方一段浅色带；
   有消息内容时被内容撑满故不显）。html 深色背景为止血层：即使高度链再塌陷，露出的是
   与 --bg0 同值的 #080a0e 深底而非白色。min-height:100vh 仅兜下限，正常平台 height:100%
   与 100vh 相同零变化；分数 DPR 下 100vh 与精确 viewport 的历史差异不受影响——
   RQ3-VIEWPORT-3d8j 的 100% 优先口径保持不变（见 .app 处注释）。 */
/* G3 亮色主题批：html 止血层改 var(--bg0)（深色解析=#080a0e 与原值零变化；浅色随主题切白）。 */
html { background: var(--bg0); }
html, body { height: 100%; min-height: 100vh; }
body.app-shell { overflow: hidden; }
body {
  font-family: var(--font);
  background: var(--bg0);
  color: var(--text);
  font-size: 14px;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
}
::selection { background: color-mix(in srgb, var(--danger-tint) 35%, transparent); }
a { color: inherit; text-decoration: none; }
button { font-family: inherit; }
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-thumb { background: var(--scrollbar); border-radius: 8px; border: 2px solid var(--bg1); }
::-webkit-scrollbar-track { background: transparent; }

/* ---- B1 P0-6：键盘焦点环全局统一（brand 色 2px；零散红色 outline 一并归一，见文件尾覆盖） ---- */
.nav-item, .session-item, .tab, .btn, .chip, .scene-card, .result-item,
.ioc-row, .asset-row, .seg-btn, .at-item, select { outline: none; }
:where(.nav-item, .session-item, .tab, .btn, .chip, .scene-card, .result-item,
.ioc-row, .asset-row, .seg-btn, .at-item, .icon-btn):focus-visible {
  outline: 2px solid var(--brand); outline-offset: 1px; border-radius: var(--r-sm);
}

/* ---- B2 P2-4：原生 select 自定义外观统一（appearance:none + 内嵌箭头，跨浏览器一致；
   各处 background 用 background-color 声明以免覆盖本规则的下拉箭头 background-image） ---- */
select {
  appearance: none;
  -webkit-appearance: none;
  padding-right: 26px;
  min-height: 28px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%238b949e' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 9px center;
  cursor: pointer;
}

/* ---------------- 三栏骨架（RQ3-UI-PWA A：三栏各自独立滚动） ---------------- */
/* RQ3-VIEWPORT-3d8j（Win 缩放黑带修复）：外壳高度由 100vh 改 100%——经上方 html,body{height:100%}
   链（rq.css:85）逐级解析到精确 layout viewport 高。100vh 在 Windows 系统缩放（125%/150% 分数 DPR）
   下与实际可视视口（innerHeight）可偏差百余 px（用户实测 2292x1338@1.5 外壳仅画到 ~88%），
   叠加 body.app-shell{overflow:hidden} 无滚动兜底 → 底部露出 body 背景（--bg0）黑带，且
   fixed bottom 锚定视口的 toast/告警/进度浮层整体落在外壳之外。百分比高度走布局计算，
   与 innerHeight/fixed 定位同源，不受视口单位族的缩放取整缺陷影响；比 100dvh 方案更兼容
   旧浏览器（无需 vh 回退行）且改动最小（html,body 100% 链本已存在）。
   RQ3-WINFIT-G2：外壳补 min-height:100vh 下限兜底——Windows Electron 下 100% 高度链
   塌陷时（body 高=内容高），外壳仍至少撑满视口，空态不再露出 html 层；正常平台
   height:100% 与 100vh 取值相同零变化（同 html,body 处 G2 注释）。 */
.app { display: grid; grid-template-columns: 236px minmax(0, 1fr) 372px; height: 100%; min-height: 100vh; background: var(--bg1); }

/* 左导航 */
.nav {
  background: var(--bg2);
  border-right: 1px solid var(--line);
  display: flex; flex-direction: column; min-height: 0;
  padding: 18px 12px;
  gap: 4px;
  overflow-y: auto;
  /* RQ3-LOGO：字标墨色统一在主题变量层收口（深色 :root=var(--brand-400) #e85a6e；
     G3 浅色块=#ad0d23）——原此处局部 --logo-ink:var(--brand-400) 已删除：G3 实测它
     覆盖浅色块导致浅底字标锁回粉红；删除后深色取值与原值相同，零变化。 */
}
/* RQ3-UI-PWA：客户端左栏改为「固定头 logo + 滚区（会话历史等）+ 固定底（用户区/系统设置）」 */
.nav-v2 { padding: 0; gap: 0; overflow: hidden; }
.nav-v2 .nav-head { flex: none; display: flex; align-items: center; padding: 9px 14px; border-bottom: 1px solid var(--line); }
.nav-v2 .nav-head .nav-logo { padding: 0; }
.nav-v2 .nav-scroll { flex: 1; min-height: 0; overflow-y: auto; padding: 10px 12px 18px; }
.nav-v2 .nav-foot-area {
  flex: none; border-top: 1px solid var(--line); padding: 10px 12px 12px;
  display: flex; flex-direction: column; gap: 6px; background: var(--bg2);
}
.nav-logo { display: flex; align-items: center; gap: 8px; padding: 4px 10px 18px; }
/* RQ3-LOGO 品牌字标换代：左栏 logo 区 = REDQUEEN 字标 SVG（RED[Q]UEEN，Q 为放大圆环记号；
   结构同 icons/redqueen-wordmark.svg，内联以 currentColor 控色。
   字标高度 22-26px 档取 24px，宽度按 viewBox 比例自适应（3281:750 ≈ 4.37:1 → 约 105px） */
.nav-logo .nav-logo-svg { height: 28px; width: auto; flex: none; display: block; margin-left: -1px; color: var(--logo-ink); }
.nav-logo .sub { font-size: 11px; color: var(--muted); letter-spacing: 0.5px; white-space: nowrap; }
.nav-group-label { font-size: 11px; color: var(--faint); text-transform: uppercase; letter-spacing: 1.2px; padding: 14px 10px 6px; }
.nav-item {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 12px; border-radius: var(--r-sm);
  color: var(--muted); font-size: 13px; cursor: pointer;
  transition: background var(--dur-fast) ease-out, color var(--dur-fast) ease-out;
  position: relative; user-select: none;
}
.nav-item .ico { width: 16px; text-align: center; opacity: 0.9; }
/* B1 P1-6：中性元素 hover 永不泛红、永不位移 */
.nav-item:hover { background: var(--hover-bg); color: var(--text); }
.nav-item.active { background: var(--bg4); color: var(--text); font-weight: 600; }
/* B2 P2-3：激活红条与 .session-item 同语言（2px / inset-block 8px / brand）——原 3px + top/bottom 22% */
.nav-item.active::before {
  content: ''; position: absolute; left: 0; top: 8px; bottom: 8px;
  width: 2px; border-radius: 1px; background: var(--brand);
}
.nav-item .badge { margin-left: auto; font-size: 11px; padding: 1px 7px; border-radius: 99px; background: var(--bg4); color: var(--faint); }
.nav-sep { height: 1px; background: var(--line); margin: 14px 4px; }

/* ---- B1 P1-2：左栏折叠收纳组（工具与资产；默认收起，首屏导航 15→6 项） ---- */
.nav-collapsible { margin-top: 2px; }
.nav-collapsible .nav-group-head {
  display: flex; align-items: center; gap: 8px;
  padding: 8px 12px; border-radius: var(--r-sm); cursor: pointer; user-select: none;
  color: var(--muted); font-size: 13px;
  transition: background var(--dur-fast) ease-out, color var(--dur-fast) ease-out;
}
.nav-collapsible .nav-group-head:hover { background: var(--hover-bg); color: var(--text); }
.nav-collapsible .nav-group-head .arrow {
  font-size: 11px; color: var(--faint); transition: transform var(--dur-fast) ease-out; width: 12px;
}
.nav-collapsible.open .nav-group-head .arrow { transform: rotate(90deg); }
.nav-collapsible .nav-collapsible-body { display: none; }
.nav-collapsible.open .nav-collapsible-body { display: block; }
/* RQ3-FEEDBACK4-8k5r 任务3：更早会话折叠区（复用 nav-collapsible；无三天前会话时 rq.js 整体隐藏） */
.nav-collapsible.nav-older { margin: 2px 0 4px; }
.nav-collapsible.nav-older .session-item { padding-left: 22px; }
/* RQ3-FEEDBACK4-8k5r R3（偏差3）：会话历史区块容器 + 静态组头——组头与其他折叠组头
   （.nav-collapsible .nav-group-head）同视觉权重（13px muted / 同 padding 行高），但
   会话历史非折叠组（「更早」才是）：无箭头、不可折叠、无 hover 反馈与指针 */
.nav-history-section { margin-top: 2px; }
.nav-group-head-static {
  display: flex; align-items: center; gap: 8px;
  padding: 8px 12px; user-select: none;
  color: var(--muted); font-size: 13px;
}

/* 出域策略说明项（客户端左导航）：小字说明，非可点场景入口
   RQ3-UIIMPL-P0 问题①（设计包六问题）：窄左栏下「客户端下载」链接逐字竖排折行——
   根因 .nav-item 为 flex(row)，正文匿名项与 <a> 并排挤压。修法（纯 CSS）：
   说明项无 .ico 子项，block 化恢复常规 CJK 折行（正文容器随内容收缩 = min-width:0 语义）；
   链接 white-space:nowrap 整体不拆行，放不下时随正文流自然换行到下一行行首 */
.nav-item.policy-note { font-size: 12px; line-height: 1.4; padding-top: 7px; padding-bottom: 7px; display: block; min-width: 0; }
.nav-item.policy-note a { white-space: nowrap; }
.nav-foot { margin-top: auto; padding: 12px 10px; font-size: 11px; color: var(--faint); border-top: 1px solid var(--line); }

/* ---- 左栏会话历史（RQ3-UI-PWA C：滚区列表，32px 行高单行截断） ---- */
.session-list { display: flex; flex-direction: column; gap: 2px; margin: 0 0 2px; }
.session-item {
  display: flex; align-items: center; gap: 8px; height: 32px; padding: 0 10px;
  border-radius: var(--r-xs); font-size: 12.5px; color: var(--muted);
  cursor: pointer; position: relative; user-select: none; min-width: 0;
}
.session-item:hover { background: var(--hover-bg); color: var(--text); }
.session-item.active { background: var(--bg-raised); color: var(--text); }
/* B2 P2-3：红条 inset 统一 8px（与 .nav-item.active 同语言） */
.session-item.active::before {
  content: ''; position: absolute; left: 0; top: 8px; bottom: 8px;
  width: 2px; border-radius: 1px; background: var(--brand);
}
.session-item .session-title { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.session-item .session-time { flex: none; font-size: 11px; color: var(--faint); font-family: var(--mono); }
.session-item.session-empty { cursor: default; color: var(--faint); font-size: 12px; height: 28px; }
/* RQ3-FEEDBACK4-8k5r R3：原 .session-archive-link（会话历史底部 muted 链接）随入口迁入
   管理组退役——#session-archive-link 节点改为管理组二级 .nav-item 形态（id 保留，
   rq.js onclick 路由 showLocalView('sessions') 不变），此处不再需要独立样式 */

/* ---- 左栏底部固定区（用户行 + 设置行） ---- */
.nav-user {
  display: flex; align-items: center; gap: 8px; padding: 6px 8px;
  border-radius: var(--r-sm); cursor: pointer; min-width: 0;
}
.nav-user:hover { background: var(--bg3); }
.nav-avatar {
  width: 24px; height: 24px; border-radius: 50%; flex: none;
  background: var(--brand); color: #fff; display: inline-flex; align-items: center; justify-content: center;
  font-size: 12px; font-weight: 700;
}
.nav-user-text { flex: 1; min-width: 0; font-size: 12.5px; color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.nav-user-out { flex: none; color: var(--faint); font-size: 13px; padding: 2px 4px; cursor: pointer; }
.nav-user-out:hover { color: var(--danger-fg); }
.nav-settings {
  display: flex; align-items: center; gap: 8px; padding: 7px 8px;
  border-radius: var(--r-sm); font-size: 12.5px; color: var(--muted); cursor: pointer;
}
.nav-settings:hover { background: var(--hover-bg); color: var(--text); }
.nav-settings .ico { width: 16px; text-align: center; }

/* 中央对话区（RQ3-UI-PWA A：固定头 topbar → 滚区 chat → 固定底 composer） */
.center { display: flex; flex-direction: column; min-width: 0; min-height: 0; overflow: hidden; background: var(--bg1); }
.topbar {
  display: flex; align-items: center; justify-content: space-between;
  padding: 14px 26px; border-bottom: 1px solid var(--line);
  background: var(--topbar-bg); backdrop-filter: blur(8px);
  min-height: 58px; flex: none;
}
.topbar-title { font-size: 15px; font-weight: 700; display: flex; align-items: center; gap: 10px; white-space: nowrap; }
.topbar-title .muted { font-size: 12px; color: var(--muted); font-weight: 500; }
.topbar-meta { font-size: 12px; color: var(--muted); display: flex; align-items: center; gap: 8px; }
.status-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
.status-dot.ok { background: var(--green); box-shadow: 0 0 8px color-mix(in srgb, var(--success-tint) 80%, transparent); }
.status-dot.warn { background: var(--amber); box-shadow: 0 0 8px color-mix(in srgb, var(--warning-tint) 80%, transparent); }

/* ---- 客户端顶栏 v2（RQ3-UI-PWA B：48px 级，一行 ≤5 可见元素） ----
   左区=红菱形 logo +「RedQueen」14px semibold + 场景徽标；右区=SSE 状态徽标、
   （Electron 时）登录徽标、齿轮设置按钮；<1440 时追加右栏抽屉开关 */
.topbar-v2 {
  min-height: 48px; padding: 0 16px; gap: 12px;
  background: var(--bg-panel); backdrop-filter: none;
}
.topbar-v2 .topbar-left { display: flex; align-items: center; gap: 10px; min-width: 0; }
.topbar-v2 .brand-mark { color: var(--brand); font-size: 15px; line-height: 1; flex: none; }
.topbar-v2 .topbar-title { font-size: 14px; font-weight: 600; letter-spacing: 0.2px; flex: none; }
/* 场景徽标（B2 P2-10 弱化：描边/文字归中性色——品牌红不再常驻顶栏，与右侧 SSE 灰徽标同一 pill 语言） */
.scene-badge {
  font-size: 12px; padding: 4px 8px; border-radius: var(--r-xs); flex: none;
  border: 1px solid var(--line2); color: var(--muted); background: var(--bg-raised);
  white-space: nowrap; font-weight: 500; max-width: 200px;
  overflow: hidden; text-overflow: ellipsis;
}
.pill.badge-flat { font-size: 12px; padding: 4px 8px; border-radius: var(--r-xs); font-weight: 500; }
/* 顶栏图标按钮（齿轮 / 右栏开关 / 左栏开关） */
.icon-btn {
  width: 32px; height: 32px; flex: none; display: inline-flex; align-items: center; justify-content: center;
  background: transparent; border: 1px solid var(--line2); border-radius: var(--r-xs);
  color: var(--muted); cursor: pointer; font-size: 14px; line-height: 1;
  transition: color var(--dur-fast) ease-out, border-color var(--dur-fast) ease-out, background var(--dur-fast) ease-out;
}
.icon-btn:hover { color: var(--text); border-color: var(--hover-border); background: var(--hover-bg); }
/* 右栏抽屉开关（仅 <1440 视口显示，桌面三栏布局隐藏） */
.panel-toggle { display: none; }
/* 左栏抽屉开关（仅 <1024 视口显示，B1 P1-8） */
.nav-toggle { display: none; }

/* 中央对话区（RQ3-UI-PWA A：固定头 topbar → 滚区 chat → 固定底 composer）
   B2 P2-5：relative 锚定「回到底部」浮钮（浮在 composer 上方、chat 区内层） */
.center { position: relative; }
.chat { flex: 1; overflow-y: auto; min-height: 0; padding: 28px 0 20px; scroll-behavior: smooth; }
.chat-inner { max-width: 780px; margin: 0 auto; padding: 0 26px; display: flex; flex-direction: column; gap: 14px; }

/* B2 P2-5：回到底部浮钮（用户上滚暂停吸附时出现；new 消息计数由 rq.js 更新 .lbl） */
.scroll-bottom-btn {
  position: absolute; left: 50%; transform: translateX(-50%) translateY(6px);
  display: inline-flex; align-items: center; gap: 6px;
  background: var(--bg4); color: var(--text); border: 1px solid var(--line2);
  border-radius: 99px; padding: 6px 14px; font-size: 12px; font-weight: 600; font-family: inherit;
  cursor: pointer; opacity: 0; pointer-events: none; z-index: 30; box-shadow: var(--shadow-sm);
  transition: opacity var(--dur-fast) ease-out, transform var(--dur-fast) ease-out, border-color var(--dur-fast) ease-out, background var(--dur-fast) ease-out;
}
.scroll-bottom-btn.show { opacity: 1; pointer-events: auto; transform: translateX(-50%) translateY(0); }
.scroll-bottom-btn:hover { border-color: var(--hover-border); background: var(--hover-bg); }
.scroll-bottom-btn:focus-visible { outline: 2px solid var(--brand); outline-offset: 1px; }
.scroll-bottom-btn .ico { font-size: 11px; color: var(--brand); line-height: 1; }

/* idle 场景 */
.idle { text-align: center; padding: 46px 8px 20px; animation: fadeUp var(--dur-enter) ease-out; }
.idle h1 { font-size: 22px; font-weight: 800; letter-spacing: 0.3px; }
.idle .sub { color: var(--muted); margin: 8px 0 30px; font-size: 13px; }
.scene-cards { display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px; text-align: left; }
.scene-card {
  background: var(--bg3); border: 1px solid var(--line); border-radius: var(--r-md);
  padding: 16px 18px; cursor: pointer;
  transition: transform var(--dur-fast) ease-out, border-color var(--dur-fast) ease-out, box-shadow var(--dur-fast) ease-out, background var(--dur-fast) ease-out;
}
/* B1 P1-6：卡片 hover 边色/底色归中性（保留轻微上浮与阴影） */
.scene-card:hover { transform: translateY(-2px); border-color: var(--hover-border); background: var(--hover-bg); box-shadow: var(--shadow-sm); }
.scene-card .t { font-weight: 700; display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
.scene-card .t .ico { color: var(--brand); }
.scene-card .d { font-size: 12px; color: var(--muted); }
.chips { margin-top: 26px; display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; }
.chips-label { width: 100%; font-size: 11px; color: var(--faint); margin-bottom: 2px; }
.chip {
  font-size: 12px; padding: 5px 13px; border-radius: 99px;
  background: var(--bg3); border: 1px solid var(--line); color: var(--muted); cursor: pointer;
  transition: background var(--dur-fast) ease-out, border-color var(--dur-fast) ease-out, color var(--dur-fast) ease-out;
  font-family: var(--mono);
}
.chip:hover { border-color: var(--hover-border); color: var(--text); background: var(--hover-bg); }

/* 对话气泡 */
.msg { display: flex; flex-direction: column; animation: fadeUp var(--dur-enter) ease-out; }
.msg .who { font-size: 11px; color: var(--faint); margin-bottom: 4px; display: flex; gap: 8px; align-items: center; }
.msg.user { align-items: flex-end; }
/* B1 P1-11：用户气泡去蓝灰渐变归中性面语言（区分仅靠右对齐，不靠异色） */
.msg.user .bubble {
  background: var(--bg-raised);
  border: 1px solid var(--line2);
  padding: 11px 16px; border-radius: 12px 12px var(--r-sm) 12px;
  max-width: 78%; font-size: 14px;
}
.msg.agent { align-items: stretch; }
/* B1 P1-3：同回合 agent 节点并入同一 turn 容器（只保留首个身份行），节点间留组内间距 */
.msg.agent.turn > *:not(:first-child):not(.who) { margin-top: 10px; }

/* ---- B1 P0-2 / P1-10：消息流内工具调用块（替代旧 thinking 三点卡；复用 trace 的状态色语义） ---- */
.toolcall-group {
  background: var(--bg-raised); border: 1px solid var(--line); border-radius: var(--r-md);
  padding: 8px 12px; animation: fadeUp var(--dur-enter) ease-out;
}
.toolcall-summary {
  display: flex; align-items: center; gap: 8px; cursor: pointer; user-select: none;
  font-size: 12px; color: var(--muted); font-family: var(--mono);
}
.toolcall-summary:hover { color: var(--text); }
.toolcall-summary .tw { font-size: 11px; color: var(--faint); transition: transform var(--dur-fast) ease-out; }
.toolcall-group.open .toolcall-summary .tw { transform: rotate(90deg); }
.toolcall-body { display: none; flex-direction: column; gap: 2px; }
.toolcall-group.run-active .toolcall-body,
.toolcall-group.open .toolcall-body { display: flex; }
.toolcall {
  display: flex; align-items: center; gap: 8px; padding: 4px 0;
  font-size: 12.5px; min-width: 0;
}
.toolcall .tc-dot { flex: none; width: 14px; text-align: center; font-size: 11px; line-height: 1; }
.toolcall[data-state='run'] .tc-dot { color: var(--brand); }
.toolcall[data-state='run'] .tc-dot::before { content: '●'; animation: dotPulse 1.2s infinite ease-in-out; display: inline-block; }
.toolcall[data-state='done'] .tc-dot { color: var(--success-text); }
.toolcall[data-state='done'] .tc-dot::before { content: '✓'; }
.toolcall .tc-name { flex: none; font-family: var(--mono); font-weight: 600; color: var(--text); }
.toolcall .tc-desc {
  flex: 1; min-width: 0; color: var(--muted); white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis;
}
.toolcall .tc-cost { flex: none; font-family: var(--mono); font-size: 11px; color: var(--faint); }
/* 兼容：旧 thinking 三点动画（产品流已由 .toolcall 替代） */
.thinking { display: flex; align-items: center; gap: 12px; padding: 12px 16px; color: var(--muted); font-size: 13px; }
.thinking .dots { display: inline-flex; gap: 5px; }
.thinking .dots span {
  width: 7px; height: 7px; border-radius: 50%; background: var(--brand);
  animation: dotPulse 1.2s infinite ease-in-out;
}

@keyframes dotPulse {
  0%, 80%, 100% { transform: scale(0.6); opacity: 0.35; }
  40% { transform: scale(1.15); opacity: 1; }
}
@keyframes fadeUp {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: translateY(0); }
}

/* 通用卡片 */
.card {
  background: var(--bg3); border: 1px solid var(--line); border-radius: var(--r-lg);
  padding: 15px 18px; box-shadow: var(--shadow-sm);
  transition: border-color var(--dur-fast) ease-out;
}
.card:hover { border-color: var(--line2); }
.card-head { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; flex-wrap: wrap; }
.card-title { font-weight: 700; font-size: 14px; display: flex; gap: 8px; align-items: center; }
.card-title .mono { font-family: var(--mono); font-size: 13px; }
.card-body { display: flex; flex-direction: column; gap: 8px; }
.card-foot {
  margin-top: 14px; padding-top: 10px; border-top: 1px dashed var(--line);
  display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap;
}
.card-foot:empty { display: none; } /* B1 P1-7：无证据引用时整块不占位 */
.evidence-note { font-size: 12px; color: var(--faint); font-family: var(--mono); max-width: 100%; }
.evidence-note .ev { color: var(--muted); }
.evidence-note .ev:hover { color: var(--blue); text-decoration: underline; cursor: pointer; }

/* 徽章 / 标签 */
.pill {
  font-size: 11px; padding: 2px 10px; border-radius: 99px; font-weight: 600;
  display: inline-flex; align-items: center; gap: 5px; white-space: nowrap;
}
.pill.mal { background: var(--red-soft); color: var(--red-2); border: 1px solid var(--red-line); }
.pill.sus { background: var(--amber-soft); color: var(--warning-text); border: 1px solid color-mix(in srgb, var(--warning-tint) 40%, transparent); }
.pill.benign { background: var(--green-soft); color: var(--success-text); border: 1px solid color-mix(in srgb, var(--success-tint) 40%, transparent); }
.pill.tag { background: var(--bg4); color: var(--muted); border: 1px solid var(--line); font-weight: 500; }
.pill.tag.tlp { color: var(--warning-text); border-color: color-mix(in srgb, var(--warning-tint) 40%, transparent); }
/* B2 P2-11：缓存/实时状态类名驱动（.freshness[data-fresh]；缓存态沿用 tag 默认，实时态蓝系） */
.pill.tag.freshness { cursor: default; }
.pill.tag.freshness[data-fresh='live'] { color: var(--blue); border-color: color-mix(in srgb, var(--info-tint) 35%, transparent); }
.layer-badge {
  font-size: 11px; font-weight: 700; letter-spacing: 0.5px;
  padding: 2px 8px; border-radius: var(--r-sm); font-family: var(--mono);
}
.layer-badge.l1 { background: var(--blue-soft); color: var(--blue); border: 1px solid color-mix(in srgb, var(--info-tint) 35%, transparent); }
.layer-badge.l2 { background: var(--purple-soft); color: var(--purple); border: 1px solid color-mix(in srgb, var(--purple-tint) 35%, transparent); }
.layer-badge.l3 { background: var(--amber-soft); color: var(--warning-text); border: 1px solid color-mix(in srgb, var(--warning-tint) 35%, transparent); }
.degraded-note { font-size: 11px; color: var(--warning-text); }

/* 风险分条（B2 P2-12：0-25-50-75-100 档位刻度线——25/50/75 三档界线叠加在填充条上方） */
.risk-row { display: flex; align-items: center; gap: 10px; }
.risk-track { flex: 1; position: relative; height: 7px; background: var(--bg0); border-radius: 99px; overflow: hidden; border: 1px solid var(--line); }
.risk-ticks { position: absolute; inset: 0; z-index: 1; pointer-events: none; }
.risk-ticks i { position: absolute; top: 0; bottom: 0; width: 1px; background: var(--risk-tick-line); }
.risk-fill { position: relative; z-index: 0; height: 100%; border-radius: 99px; background: linear-gradient(90deg, var(--amber), var(--red)); transition: width 0.7s cubic-bezier(0.16, 1, 0.3, 1); /* B2 P2-16 唯一例外：数据条入场填充动画 */ }
.risk-score { font-family: var(--mono); font-weight: 700; font-size: 16px; color: var(--red-2); }
.kv { display: grid; grid-template-columns: 88px 1fr; gap: 4px 12px; font-size: 12.5px; }
.kv .k { color: var(--faint); }
.kv .v { color: var(--text); }
.kv .v.mono { font-family: var(--mono); font-size: 12px; word-break: break-all; }

/* ---- RQ3-UIIMPL-A2S2（设计方案 §5.2 D + §8.1 P1）：L2 内嵌确认卡 .confirm-card ----
   对话流内的写操作单确认（居中模态 → 流内卡，形态对齐 proto-new-components「D · 确认卡」）：
   危险描边 + kv 参数摘要行（.crow）+ 撤销计划块（.undo-plan，信息蓝）+ 影响面行 +
   [取消/拒绝] [确认执行/允许一次]；确认/取消后置终态（data-terminal）保留在流中作为
   审计轨迹。仅对话流上下文使用（chat 意图流 / DSH 审批卡）——资产视图等表单确认仍走
   .modal 形态（confirmDialog），两形态共用同一套确认语义。 */
.confirm-card {
  border-color: var(--danger-line);
  background: linear-gradient(180deg, var(--danger-soft), var(--bg3) 38%);
}
.confirm-card .card-title { color: var(--danger-fg); }
.confirm-card .crows { display: flex; flex-direction: column; gap: 7px; margin: 10px 0 2px; }
.confirm-card .crow { display: grid; grid-template-columns: 72px 1fr; font-size: 12.5px; gap: 4px 11px; }
.confirm-card .crow .k { color: var(--color-text-muted); }
.confirm-card .crow .v { color: var(--text); }
.confirm-card .crow .v.mono { font-family: var(--mono); font-size: 11.5px; word-break: break-all; }
.confirm-card .undo-plan {
  display: flex; gap: 10px; align-items: flex-start;
  padding: 11px 13px; border-radius: var(--r-md); margin: 12px 0 2px;
  background: var(--info-soft); border: 1px solid var(--info-line);
}
.confirm-card .undo-plan .icon { color: var(--info-fg); font-style: normal; margin-top: 1px; }
.confirm-card .undo-plan .ut { font-size: 12px; font-weight: 600; color: var(--info-fg); }
.confirm-card .undo-plan .ud { font-size: 11.5px; color: var(--color-text-secondary); margin-top: 2px; line-height: 1.55; }
.confirm-card .confirm-note { font-size: 11.5px; color: var(--muted); margin-top: 10px; line-height: 1.55; }
.confirm-card .confirm-foot {
  display: flex; gap: 8px; justify-content: flex-end; align-items: center; flex-wrap: wrap;
  margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--color-border-subtle);
}
.confirm-card .confirm-foot .confirm-state { margin-right: auto; font-size: 11.5px; font-weight: 600; color: var(--muted); }
.confirm-card .confirm-foot .confirm-state:empty { display: none; }
/* 终态：已确认（绿描边收敛危险感）/已取消·被取代（降透明度）；按钮禁用保留（审计轨迹不删除） */
.confirm-card[data-state='confirmed'] { border-color: color-mix(in srgb, var(--confirm-tint) 36%, transparent); background: linear-gradient(180deg in srgb, var(--success-soft), var(--bg3) 38%); }
.confirm-card[data-state='confirmed'] .card-title { color: var(--success-fg); }
.confirm-card[data-state='cancelled'] { opacity: 0.78; }
.confirm-card[data-terminal] .confirm-foot .btn { pointer-events: none; opacity: 0.45; }

/* 按钮 */
.btn {
  border: none; cursor: pointer; font-size: 13px; font-weight: 600;
  padding: 8px 16px; border-radius: var(--r-sm); transition: filter var(--dur-fast) ease-out, background var(--dur-fast) ease-out, border-color var(--dur-fast) ease-out, color var(--dur-fast) ease-out;
}
/* B1 P1-6：主按钮 hover 去位移，改亮度反馈 */
.btn-primary { background: linear-gradient(135deg, var(--danger), #b01f3c); color: #fff; box-shadow: 0 4px 16px color-mix(in srgb, var(--danger-tint) 35%, transparent); }
.btn-primary:hover { filter: brightness(1.06); }
.btn-primary:active { filter: brightness(0.96); }
.btn-ghost { background: transparent; color: var(--muted); border: 1px solid var(--line2); }
.btn-ghost:hover { color: var(--text); border-color: var(--hover-border); background: var(--hover-bg); }
/* B1 P1-9：危险 ghost（默认中性，hover 才显危险红——红色只随语义出现） */
.btn-ghost.btn-danger { color: var(--danger-fg); border-color: color-mix(in srgb, var(--danger-tint) 32%, transparent); }
.btn-ghost.btn-danger:hover { color: var(--danger-fg); border-color: var(--red-line); background: var(--red-soft); }
/* B1 P0-3：小按钮触控下限 ≥28px（原 5px 12px ≈ 26px） */
.btn-mini { font-size: 12px; padding: 7px 12px; }
/* 文字链接按钮（会话恢复卡「会话管理」等弱操作） */
.btn-link { background: none; border: none; color: var(--blue); cursor: pointer; font-size: 12px; padding: 4px 2px; text-decoration: underline; text-underline-offset: 3px; }
.btn-link:hover { color: var(--text); }

/* 检索/列表卡 */
.result-item {
  padding: 10px 12px; border: 1px solid var(--line); border-radius: var(--r-md);
  background: var(--bg2); transition: border-color var(--dur-fast) ease-out; cursor: pointer;
}
.result-item:hover { border-color: var(--hover-border); }
.result-item .t { font-size: 13px; font-weight: 600; margin-bottom: 3px; }
.result-item .m { font-size: 12px; color: var(--muted); display: flex; gap: 8px; flex-wrap: wrap; }

/* 报告卡（markdown-lite） */
.report-card .md h1 { font-size: 18px; font-weight: 800; margin: 2px 0 10px; }
/* B1 P1-5：章节标题去粉红（长文粉红标题刺眼且与旧红双轨），改中性 + 字重区分 */
.report-card .md h2 { font-size: 14px; font-weight: 600; margin: 16px 0 8px; color: var(--fg-default); padding-bottom: 4px; border-bottom: 1px solid var(--line); }
.report-card .md h3 { font-size: 13px; font-weight: 700; margin: 12px 0 6px; }
.report-card .md p { margin: 6px 0; font-size: 13px; color: var(--text); }
.report-card .md ul { margin: 6px 0 6px 18px; }
.report-card .md li { font-size: 13px; margin: 4px 0; }
.report-card .md code { font-family: var(--mono); font-size: 12px; background: var(--bg0); padding: 1px 6px; border-radius: 4px; border: 1px solid var(--line); word-break: break-all; }
.report-card .md blockquote {
  border-left: 3px solid var(--red); padding: 6px 14px; margin: 10px 0;
  background: var(--bg2); border-radius: 0 var(--r-sm) var(--r-sm) 0;
  font-size: 12px; color: var(--muted);
}
.report-card .md table { border-collapse: collapse; margin: 10px 0; width: 100%; font-size: 12px; }
.report-card .md th, .report-card .md td { border: 1px solid var(--line2); padding: 6px 10px; text-align: left; }
.report-card .md th { background: var(--bg4); font-weight: 600; }
.report-card .md td { font-family: var(--mono); font-size: 11px; word-break: break-all; }
.report-card .md hr { border: none; border-top: 1px dashed var(--line2); margin: 12px 0; }
.report-card .md em { color: var(--faint); }
/* B1 P1-5：长报告章节锚点行（卡头下方，11px 中性胶囊，点击 scrollIntoView） */
.report-anchors {
  display: flex; flex-wrap: wrap; gap: 6px; margin: -4px 0 12px;
  padding-bottom: 10px; border-bottom: 1px dashed var(--line);
}
.report-anchors .ra {
  font-size: 11px; color: var(--muted); background: var(--bg4); border: 1px solid var(--line);
  border-radius: 99px; padding: 2px 9px; cursor: pointer; white-space: nowrap;
  transition: color var(--dur-fast) ease-out, border-color var(--dur-fast) ease-out;
}
.report-anchors .ra:hover { color: var(--text); border-color: var(--hover-border); }

/* 底部输入区（RQ3-UI-PWA A：中栏固定底，不随消息流滚动）
   B1 P1-1：composer 瘦身（183→约 118px）——删常驻工具行与重复 hint，
   低频工具收进输入框左侧「+」溢出菜单，输入框回归唯一视觉焦点 */
.composer { flex: none; border-top: 1px solid var(--line); padding: 8px 26px 10px; background: var(--bg2); }
.composer-inner { max-width: 780px; margin: 0 auto; }
.composer-scope { font-size: 12px; color: var(--muted); display: flex; align-items: center; gap: 8px; margin-bottom: 6px; min-height: 24px; }
/* hint 并入 scope 行右侧（一行精简，placeholder 已承载输入提示） */
/* RQ3-M1-UXFIX-9w2e P1-4：min-width:0 根治 flex min-content 挤压——nowrap 文本的
   min-width:auto 使 hint 恒占整串宽度，窄视口（375px 实测）把「资产范围」标签挤成
   竖排逐字换行；改为 hint 自行 ellipsis 收缩，标签恒一行 */
.composer-scope .composer-hint-inline { margin-left: auto; font-size: 11px; color: var(--faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }
.composer-scope select {
  background-color: var(--bg4); color: var(--text); border: 1px solid var(--line2);
  border-radius: var(--r-sm); padding: 3px 8px; font-size: 12px; font-family: inherit; outline: none;
}
.composer-box {
  display: flex; gap: 8px; align-items: flex-end;
  background: var(--bg3); border: 1px solid var(--line2); border-radius: var(--r-md);
  padding: 8px 10px; transition: border-color var(--dur-fast) ease-out, box-shadow var(--dur-fast) ease-out;
}
.composer-box:focus-within { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-soft); }
.composer-box textarea {
  flex: 1; background: transparent; border: none; outline: none; resize: none;
  color: var(--text); font-family: inherit; font-size: 14px; max-height: 120px; line-height: 1.55;
  min-height: 22px;
}
.composer-hint { font-size: 11px; color: var(--faint); margin-top: 7px; text-align: center; }
/* RQ3-M2-B1 P2-1/P2-3：LLM 用量状态行告警态——额度 30 天内到期（⚠）或剩余百分比低于
   阈值（llm_quota_alert_threshold）时整行提示色（amber 警示轨，与 .degraded-note 同色系；
   仅文字变色不加底，轻量不抢焦点；renderUsageHint classList.toggle 挂载） */
.composer-hint.quota-warn { color: var(--warning-text); }
/* 「+」溢出菜单按钮（低频工具入口，composer 内常驻但弱化） */
.composer-plus { flex: none; margin-bottom: 0; }
/* 发送按钮：32px 方形图标钮（去「发送 ➤」文字） */
.composer-send { flex: none; font-size: 15px; font-weight: 700; }
.composer-send:hover { color: var(--brand); border-color: var(--brand); background: var(--brand-soft); }
/* 「+」下拉菜单（向上弹出，同 at-panel 定位模式） */
.plus-menu {
  position: absolute; bottom: calc(100% + 8px); left: 0; width: 220px;
  background: var(--bg4); border: 1px solid var(--line2); border-radius: var(--r-md);
  box-shadow: var(--shadow); z-index: var(--z-pop); padding: 6px;
  animation: fadeUp var(--dur-enter) ease-out;
}
.plus-menu-item {
  display: flex; align-items: center; gap: 8px; width: 100%; text-align: left;
  background: transparent; border: none; color: var(--text); font-size: 12.5px;
  padding: 8px 10px; border-radius: var(--r-sm); cursor: pointer; font-family: inherit;
  transition: background var(--dur-fast) ease-out;
}
.plus-menu-item:hover { background: var(--hover-bg); }
.plus-menu-item.plus-menu-danger { color: var(--danger-fg); }
.plus-menu-item.plus-menu-danger:hover { background: var(--red-soft); }

/* 右侧上下文面板（RQ3-UI-PWA A：固定头（标题行/状态行/tab 行）→ 滚区 panel-body） */
.panel { background: var(--bg2); border-left: 1px solid var(--line); display: flex; flex-direction: column; min-width: 0; min-height: 0; overflow: hidden; }
.panel-head { padding: 16px 18px 8px; font-size: 13px; font-weight: 700; color: var(--text); display: flex; justify-content: space-between; align-items: center; }
.panel-head .muted { font-weight: 500; font-size: 11px; color: var(--faint); }
/* 客户端右栏标题行 v2（RQ3-UI-PWA A·P0 + B1 P1-4：头部 133→约 88px——
   状态徽标行并入标题行右侧（同一视觉区，不再独立占行），tab 行改底部指示条语言） */
.panel-head-v2 { padding: 10px 16px 8px; flex-direction: column; align-items: stretch; gap: 0; }
.panel-head-v2 .panel-head-row { display: flex; align-items: center; gap: 8px; min-width: 0; min-height: 32px; }
.panel-head-v2 .panel-title { font-size: 13px; font-weight: 700; color: var(--text); white-space: nowrap; min-width: 0; overflow: hidden; text-overflow: ellipsis; flex: none; }
.panel-head-v2 .panel-head-sub { font-size: 11px; color: var(--fg-subtle); white-space: nowrap; flex: none; }
/* 状态徽标区（RQ3-UI-PWA B + B1 P1-4：并入标题行右侧内联排布，不再独立成行）
   RQ3-UI-FIX2 M-1：1440 视口三枚徽标（workspace/模型偏好/数据源）单行超宽时不再
   overflow 截断——允许 wrap（行距收紧 row-gap:2px）+ 可收缩（flex:0 1 auto +
   max-width:100%），窄板下三枚徽标完整可见优先于单行；单枚超宽仍椭圆兜底 */
.panel-status {
  display: flex; align-items: center; flex-wrap: wrap; column-gap: 6px; row-gap: 2px;
  margin-left: auto; min-width: 0; padding: 0; border-bottom: none; flex: 0 1 auto;
  max-width: 100%;
}
.panel-status .ws-badge,
.panel-status .pill { font-size: 11px; padding: 1px 7px; max-width: 100%; overflow: hidden; text-overflow: ellipsis; }
.tabs { display: flex; gap: 4px; padding: 4px 12px 8px; border-bottom: 1px solid var(--line); flex: none; }
.tab {
  flex: 1; text-align: center; font-size: 12px; padding: 7px 4px; border-radius: var(--r-sm);
  color: var(--muted); cursor: pointer; background: transparent; border: 1px solid transparent;
  transition: color var(--dur-fast) ease-out, background var(--dur-fast) ease-out, box-shadow var(--dur-fast) ease-out; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.tab:hover { color: var(--text); background: var(--hover-bg); }
/* B1 P1-4：tab 激活态改底部 2px 品牌指示条（替代 bg4 底块） */
.tab.active { color: var(--fg-default); background: transparent; border-color: transparent; font-weight: 600; box-shadow: inset 0 -2px 0 var(--brand); }
/* B2 P2-18：tab 数量角标（IOC×N 等；为 0 时 :empty 不占位） */
.tab-count { font-family: var(--mono); font-size: 11px; color: var(--faint); margin-left: 2px; }
.tab-count:empty { display: none; margin: 0; }
.tab.active .tab-count { color: var(--brand); }
.panel-body { flex: 1; overflow-y: auto; min-height: 0; padding: 16px 16px 24px; }
.panel-section { display: none; }
.panel-section.active { display: block; animation: fadeUp var(--dur-enter) ease-out; }
/* tab 内容区内的内嵌头部（IOC 计数行/资产矩阵导出行）：行布局，可收缩子项给足 min-width 防 2 字符逐字换行 */
.panel-section .panel-head { gap: 8px; min-width: 0; }
.panel-section .panel-head .muted { min-width: 0; flex: 1 1 auto; overflow-wrap: break-word; }
.panel-section .panel-head .asset-export { flex: none; }
.empty { text-align: center; color: var(--faint); font-size: 12px; padding: 34px 10px; }
.empty .ico { font-size: 20px; display: block; margin-bottom: 8px; opacity: 0.5; }
.empty .sub { display: block; margin-top: 6px; opacity: 0.85; }

/* RQ3-FEEDBACK4-8k5r 任务2：IOC 条目行 = 值 + 标签分组两段布局。
   修复前（用户反馈截图）：.v flex:1 + word-break:break-all 的 min-content 是单字符宽，行内
   nowrap 的 pill 争宽时值被压成 2 字符宽竖排 8 行、pill 溢出卡片右边界。
   修复后：.v 不换行 + flex-shrink:0（不被挤压）+ max-width:100% 超长截断省略（title 悬浮全文）；
   .cats 独立 wrap 容器（flex-wrap + gap，margin-left:auto 右贴齐），pill 超多时自身换行；
   行整体 flex-wrap 紧凑单/双行，不撑高卡片。 */
.ioc-row {
  display: flex; flex-wrap: wrap; align-items: center; gap: 5px 8px; padding: 8px 10px;
  background: var(--bg3); border: 1px solid var(--line); border-radius: var(--r-md); margin-bottom: 8px;
  transition: border-color var(--dur-fast) ease-out; cursor: pointer;
}
.ioc-row:hover { border-color: var(--hover-border); }
.ioc-row .v {
  font-family: var(--mono); font-size: 12px;
  flex: 0 1 auto; min-width: 0; max-width: 100%;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ioc-row .cats { display: flex; flex-wrap: wrap; align-items: center; gap: 4px; margin-left: auto; min-width: 0; }
.ioc-row .cat { font-size: 11px; }

/* 攻击链（节点圆点 + 连线） */
.chain { position: relative; padding-left: 6px; }
.chain-node { position: relative; padding: 0 0 18px 26px; }
.chain-node::before {
  content: ''; position: absolute; left: 4px; top: 5px;
  width: 11px; height: 11px; border-radius: 50%;
  background: var(--bg1); border: 2.5px solid var(--red);
  box-shadow: 0 0 10px color-mix(in srgb, var(--danger-tint) 55%, transparent); z-index: 1;
}
.chain-node::after {
  content: ''; position: absolute; left: 8.5px; top: 18px; bottom: -2px;
  width: 2px; background: linear-gradient(180deg in srgb, var(--red-line), color-mix(in srgb, var(--danger-tint) 8%, transparent));
}
.chain-node:last-child::after { display: none; }
.chain-node .stage { font-size: 12px; font-weight: 700; color: var(--red-2); }
.chain-node .tech { font-size: 12px; color: var(--text); }
.chain-node .meta { font-size: 11px; color: var(--faint); font-family: var(--mono); }
.chain-node .attck { font-size: 11px; color: var(--purple); font-family: var(--mono); }
/* B2 P2-6：攻击链阶段序号 + 同名阶段合并组（组标题 + 子技术列表） */
.chain-node .stage .chain-no {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 16px; height: 16px; margin-right: 6px; padding: 0 2px;
  border-radius: 99px; background: var(--bg4); border: 1px solid var(--line);
  color: var(--muted); font-size: 10px; font-weight: 700; font-family: var(--mono);
  vertical-align: middle;
}
.chain-node .stage .chain-count {
  margin-left: 8px; padding: 0 7px; border-radius: 99px;
  background: var(--bg4); border: 1px solid var(--line);
  color: var(--faint); font-size: 10px; font-weight: 500; font-family: var(--mono);
  vertical-align: middle;
}
.chain-sub { display: flex; flex-direction: column; gap: 6px; margin-top: 6px; }
.chain-sub-node {
  position: relative; padding: 2px 0 2px 14px;
  border-left: 1px dashed var(--line2); margin-left: 4px;
}
.chain-sub-node::before {
  content: ''; position: absolute; left: -3.5px; top: 9px;
  width: 6px; height: 6px; border-radius: 2px; /* 子技术=小方点（区别于阶段级圆点） */
  background: var(--bg1); border: 1.5px solid var(--red-line);
}
.chain-sub-node .sub-no { margin-right: 5px; font-family: var(--mono); font-size: 11px; color: var(--faint); }

/* 资产影响矩阵 */
.asset-grid { display: flex; flex-direction: column; gap: 8px; }
.asset-row { display: grid; grid-template-columns: 1fr 64px 74px; gap: 8px; align-items: center; background: var(--bg3); border: 1px solid var(--line); border-radius: var(--r-md); padding: 10px 12px; }
.asset-row .name { font-size: 12.5px; font-weight: 600; }
.asset-row .ip { font-size: 11px; color: var(--faint); font-family: var(--mono); }
.asset-row .zone { font-size: 11px; color: var(--muted); }
.risk-tag { font-size: 11px; font-weight: 700; text-align: center; padding: 3px 0; border-radius: var(--r-sm); }
.risk-tag.p0 { background: var(--red-soft); color: var(--red-2); border: 1px solid var(--red-line); }
.risk-tag.p1 { background: var(--amber-soft); color: var(--warning-text); }
.risk-tag.p2 { background: var(--blue-soft); color: var(--blue); }

/* 出域提示条 */
.egress-bar {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  background: linear-gradient(90deg in srgb, color-mix(in srgb, var(--warning-tint) 12%, transparent), color-mix(in srgb, var(--danger-tint) 10%, transparent));
  border: 1px solid color-mix(in srgb, var(--warning-tint) 45%, transparent); border-radius: var(--r-md);
  padding: 12px 16px; margin: 4px 0; animation: fadeUp var(--dur-enter) ease-out;
}
.egress-bar .ico { font-size: 16px; }
.egress-bar .txt { flex: 1; font-size: 12.5px; min-width: 200px; }
.egress-bar .txt b { color: var(--warning-text); }
.egress-bar .txt .filtered { color: var(--success-text); font-size: 12px; display: block; }

/* 客户端本地工具视图 */
.localview { animation: fadeUp var(--dur-enter) ease-out; }
.localview h3 { font-size: 15px; font-weight: 700; margin-bottom: 4px; display: flex; gap: 8px; align-items: center; }
.localview .desc { font-size: 12px; color: var(--muted); margin-bottom: 16px; }
.dropzone {
  border: 1.5px dashed var(--line2); border-radius: var(--r-lg); text-align: center;
  padding: 34px 20px; color: var(--muted); cursor: pointer; transition: border-color var(--dur-fast) ease-out, color var(--dur-fast) ease-out, background var(--dur-fast) ease-out;
  background: var(--bg2);
}
.dropzone:hover, .dropzone.dragover { border-color: var(--red); background: var(--red-soft); color: var(--text); }
.dropzone .ico { font-size: 24px; display: block; margin-bottom: 6px; }
.hash-line { font-family: var(--mono); font-size: 11px; background: var(--bg0); border: 1px solid var(--line); border-radius: var(--r-sm); padding: 7px 10px; word-break: break-all; display: flex; gap: 10px; }
.hash-line .k { color: var(--faint); min-width: 56px; }
.table-lite { width: 100%; border-collapse: collapse; font-size: 12px; }
.table-lite th { text-align: left; color: var(--faint); font-weight: 600; font-size: 11px; padding: 6px 8px; border-bottom: 1px solid var(--line2); }
.table-lite td { padding: 7px 8px; border-bottom: 1px solid var(--line); font-family: var(--mono); font-size: 11px; word-break: break-all; }
.adapter-card { display: flex; align-items: center; gap: 12px; }
.adapter-logo { width: 38px; height: 38px; border-radius: var(--r-md); background: var(--bg4); display: flex; align-items: center; justify-content: center; font-size: 17px; border: 1px solid var(--line2); }

/* 浏览器插件入口 */
.ext-app { max-width: 1080px; margin: 0 auto; padding: 28px 24px 60px; }
.ext-head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 22px; flex-wrap: wrap; gap: 10px; }
.ext-cols { display: grid; grid-template-columns: minmax(0, 1.5fr) minmax(320px, 1fr); gap: 20px; align-items: start; }
.page-card { background: var(--bg2); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 26px 28px; box-shadow: var(--shadow-sm); }
.page-card h2 { font-size: 18px; margin-bottom: 4px; }
.page-card .meta { font-size: 12px; color: var(--faint); margin-bottom: 18px; }
/* B1 P1-12：正文行高收紧 + 去 justify（中英混排+长哈希下 justify 字隙过大）；L2 高亮不再强制改粉红文字色 */
.ext-text { font-size: 14px; line-height: 1.8; color: var(--text); }
.ext-text p { margin-bottom: 14px; text-align: start; }
mark.hl { border-radius: 4px; padding: 1px 3px; cursor: pointer; background: transparent; color: inherit; transition: background var(--dur-fast) ease-out; }
mark.hl.l1 { box-shadow: inset 0 -8px 0 color-mix(in srgb, var(--info-tint) 22%, transparent); border-bottom: 2px solid var(--blue); }
mark.hl.l2 { box-shadow: inset 0 -8px 0 color-mix(in srgb, var(--danger-tint) 20%, transparent); border-bottom: 2px solid var(--danger); }
mark.hl:hover { background: color-mix(in srgb, var(--danger-tint) 18%, transparent); }
.float-card {
  position: fixed; z-index: var(--z-float); width: 380px; max-width: calc(100vw - 32px);
  background: var(--bg2); border: 1px solid var(--red-line); border-radius: var(--r-lg);
  box-shadow: var(--shadow); padding: 16px 18px; animation: fadeUp var(--dur-enter) ease-out;
}
.float-card .close-x { position: absolute; top: 10px; right: 12px; color: var(--faint); cursor: pointer; font-size: 14px; }
.float-card .close-x:hover { color: var(--text); }
.legend { display: flex; gap: 14px; font-size: 11px; color: var(--muted); margin-top: 14px; flex-wrap: wrap; }
.legend .swatch { display: inline-block; width: 16px; height: 3px; border-radius: 2px; margin-right: 5px; vertical-align: middle; }

/* 提示浮层（B2 P2-17：toast 归 --z-toast 档——遮罩/抽屉/模态之上）
   RQ3-UIIMPL-P0 问题④（设计包六问题）：toast 由底部居中改为顶部居中（顶栏下方 60px），
   不再遮挡底部 composer 输入区与固定底部的操作按钮；z 走 --z-toast（RQ3-UIIMPL-A1
   台账 V1.1：1100 > --z-modal 1000——瞬态反馈不因模态被吞）。仅动定位，
   JS 挂载逻辑（body 直挂/2.4s 自移除）不变 */
.toast {
  position: fixed; top: 60px; bottom: auto; left: 50%; transform: translateX(-50%);
  background: var(--bg4); color: var(--text); border: 1px solid var(--line2);
  padding: 10px 20px; border-radius: 99px; font-size: 12.5px; box-shadow: var(--shadow);
  animation: fadeUp var(--dur-enter) ease-out; z-index: var(--z-toast);
}

.offline-tip { position: fixed; bottom: 12px; right: 14px; font-size: 11px; color: var(--faint); background: var(--bg2); border: 1px solid var(--line); border-radius: 99px; padding: 4px 12px; z-index: var(--z-float); }

/* ============================================================
   V1.5 工作台要素（PRD 6.2 / D14-D19 降级口径）—— 沿用同一设计语言
   ============================================================ */

/* 顶栏工作区标识（D15） */
.ws-badge {
  font-family: var(--mono); font-size: 11px; padding: 2px 9px; border-radius: 99px;
  background: var(--bg4); color: var(--blue); border: 1px solid color-mix(in srgb, var(--info-tint) 35%, transparent);
  cursor: default; white-space: nowrap;
}

/* 执行轨迹（M5 降级：复用 tool_result 消息流渲染） */
.trace-item {
  background: var(--bg3); border: 1px solid var(--line); border-radius: var(--r-md);
  padding: 9px 12px; margin-bottom: 8px; animation: fadeUp var(--dur-enter) ease-out;
}
.trace-item .row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.trace-item .t { font-family: var(--mono); font-size: 11px; color: var(--faint); margin-left: auto; }
.trace-item .tool { font-family: var(--mono); font-size: 12px; font-weight: 700; color: var(--text); }
/* RQ3-UIIMPL-P0 问题⑥（设计包六问题）：轨迹长文本（summary）超 3 行渐隐收口——
   RQ3-UIIMPL-A1（上批 QC LOW 收口）：max-height 46px 实际只容 2.6 行（11px × 继承
   1.6 行高 = 17.6px/行）——改 53px（17.6 × 3 = 52.8 ≤ 53，3 行完整呈现后再截断
   渐隐）+ ::after 渐变遮罩。遮罩终点取卡片实际底色 var(--bg3)（tokens 语境的 surface
   槽位色，与卡背景一致才无缝；设计稿 payload 槽为 surface-0 深槽底，故对照表写
   surface-0）。无展开逻辑（rq.js 已截 120 字符），不加「展开全部」按钮（CSS only 批）；
   短摘要渐变上端全透明、压暗可忽略 */
.trace-item .summary {
  font-size: 11px; color: var(--muted); margin-top: 4px; font-family: var(--mono); word-break: break-all;
  max-height: 53px; overflow: hidden; position: relative;
}
.trace-item .summary::after {
  content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 16px;
  background: linear-gradient(to bottom, transparent, var(--bg3));
}
.trace-item .st { font-size: 11px; font-weight: 700; padding: 1px 8px; border-radius: 99px; font-family: var(--mono); }
.trace-item .st.ok { background: var(--green-soft); color: var(--success-text); border: 1px solid color-mix(in srgb, var(--success-tint) 40%, transparent); }
.trace-item .st.degraded { background: var(--amber-soft); color: var(--warning-text); border: 1px solid color-mix(in srgb, var(--warning-tint) 40%, transparent); }
.trace-item .st.failed { background: var(--red-soft); color: var(--red-2); border: 1px solid var(--red-line); }

/* @ 补全浮层（@skill / @文件，D17 @引用） */
.composer-box { position: relative; }
.at-panel {
  position: absolute; bottom: calc(100% + 8px); left: 0; width: min(460px, 100%);
  background: var(--bg4); border: 1px solid var(--line2); border-radius: var(--r-md);
  box-shadow: var(--shadow); z-index: var(--z-pop); max-height: 264px; overflow-y: auto;
  animation: fadeUp var(--dur-enter) ease-out; padding: 6px;
}
.at-group-label { font-size: 11px; color: var(--faint); padding: 6px 10px 3px; letter-spacing: 1px; }
.at-item { display: flex; flex-direction: column; gap: 1px; padding: 7px 10px; border-radius: var(--r-sm); cursor: pointer; }
.at-item:hover, .at-item.sel { background: var(--hover-bg); }
.at-item .nm { font-size: 12.5px; font-weight: 600; display: flex; gap: 8px; align-items: center; }
.at-item .nm .id { font-family: var(--mono); font-size: 11px; color: var(--faint); font-weight: 500; }
.at-item .ds { font-size: 11px; color: var(--muted); }
.at-item .ico { width: 15px; text-align: center; }

/* Skill 计划确认卡（D17：一键唤起、确认后跑——计划模式） */
.skill-plan-card { border-color: color-mix(in srgb, var(--purple-tint) 45%, transparent); }
.skill-plan-card .plan-params { display: flex; flex-direction: column; gap: 8px; margin: 10px 0; }
.skill-plan-card .plan-params label { font-size: 12px; color: var(--muted); display: flex; flex-direction: column; gap: 4px; }
.skill-plan-card .plan-params textarea, .skill-plan-card .plan-params input {
  background: var(--bg0); border: 1px solid var(--line2); border-radius: var(--r-sm); color: var(--text);
  font-family: var(--mono); font-size: 12px; padding: 7px 10px; outline: none; resize: vertical;
}
.skill-plan-card .plan-params textarea:focus, .skill-plan-card .plan-params input:focus { border-color: var(--red-line); }
.plan-step {
  display: flex; gap: 10px; align-items: flex-start; padding: 8px 10px;
  background: var(--bg2); border: 1px solid var(--line); border-radius: var(--r-md); margin-bottom: 6px;
}
.plan-step .no {
  width: 20px; height: 20px; border-radius: 50%; flex: none; margin-top: 1px;
  background: var(--bg1); border: 2px solid var(--red); color: var(--red-2);
  font-size: 11px; font-weight: 700; display: flex; align-items: center; justify-content: center;
}
.plan-step .tool { font-family: var(--mono); font-size: 12px; font-weight: 700; }
.plan-step .desc { font-size: 11px; color: var(--muted); }
.plan-step .tpl { font-family: var(--mono); font-size: 11px; color: var(--faint); word-break: break-all; }
.plan-check { font-size: 11px; color: var(--faint); display: flex; gap: 12px; flex-wrap: wrap; margin-top: 4px; }
.plan-check b { color: var(--success-text); font-weight: 600; }
.plan-check b.warn { color: var(--warning-text); }

/* 通用模态弹窗（本地高危操作确认 D16 / 设置 / Skill 固化确认） */
.modal-mask {
  /* RQ3-UIIMPL-A1：遮罩归 --z-overlay 档（900）——高于抽屉族 800，模态打开时须盖住
     已打开的左右抽屉；居中载体 .modal 自带 --z-modal 1000（载体>遮罩，差值固定 100） */
  position: fixed; inset: 0; z-index: var(--z-overlay); background: var(--modal-mask);
  backdrop-filter: blur(3px); display: flex; align-items: center; justify-content: center;
  animation: fadeUp var(--dur-enter) ease-out; padding: 20px;
}
.modal {
  /* RQ3-UIIMPL-A1：显式载体层级（position:relative 仅建立层叠上下文，不改 flex 布局） */
  position: relative; z-index: var(--z-modal);
  width: min(520px, 100%); background: var(--bg3); border: 1px solid var(--line2);
  border-radius: var(--r-lg); box-shadow: var(--shadow); padding: 20px 22px 18px;
  animation: fadeUp var(--dur-enter) ease-out;
  /* R3 用户实测问题②（设置面板超出视口不能滚动）：内容高于视口时 mask flex 居中会把
     上下两端推出视口外且无滚动条（硬切）。限高 = 视口 - mask padding 两侧（20px×2），
     面板改为纵向 flex：modal-body 承担滚动、modal-actions 常驻底部（等价「sticky 按钮区」
     效果，但滚动只发生在 body 内，按钮永不被滚走、无需背景遮挡）。短内容弹窗不受影响
     （max-height 不生效，flex 纵向排布与原块级流渲染一致）。 */
  max-height: calc(100vh - 40px); /* 旧浏览器回退（不识别下行百分比解析时生效） */
  /* RQ3-VIEWPORT-3d8j：限高脱离视口单位族（100vh 同受 Win 缩放偏差影响）——mask 为
     fixed inset:0（高=视口）+ padding:20px，其 content box 高恰为「视口高-40px」，
     与上行 calc(100vh - 40px) 语义严格等价，但走布局计算、与视口同源无缩放偏差 */
  max-height: 100%;
  display: flex; flex-direction: column; overflow: hidden;
}
.modal.danger { border-color: var(--red-line); }
.modal h3 { font-size: 15px; font-weight: 700; display: flex; align-items: center; gap: 8px; margin-bottom: 12px; flex-shrink: 0; }
.modal h3 .ico { color: var(--red); }
.modal .modal-body {
  font-size: 12.5px; color: var(--muted); display: flex; flex-direction: column; gap: 8px;
  overflow-y: auto; min-height: 0; flex: 1 1 auto; overscroll-behavior: contain;
}
/* R3 问题②随动：flex 容器直接子项不收缩——否则超高区块（设置面板 5 分区）会被 flex
   压缩而非撑出滚动高度（overflow 滚动失效、内容被裁的同款形态） */
.modal .modal-body > * { flex-shrink: 0; }
.modal .modal-body b { color: var(--text); }
.modal .kv { margin: 4px 0; }
.modal .deny-box {
  background: var(--red-soft); border: 1px solid var(--red-line); border-radius: var(--r-md);
  padding: 10px 14px; font-size: 12px; color: var(--text);
}
.modal .deny-box .h { color: var(--red-2); font-weight: 700; display: flex; gap: 8px; align-items: center; }
.modal .modal-actions { display: flex; gap: 10px; justify-content: flex-end; margin-top: 16px; flex-shrink: 0; }
.modal .modal-note { font-size: 11px; color: var(--faint); }
.modal select, .modal input {
  background-color: var(--bg0); border: 1px solid var(--line2); border-radius: var(--r-sm); color: var(--text);
  padding: 7px 10px; font-size: 12.5px; outline: none; width: 100%; font-family: inherit;
}
.modal select:focus, .modal input:focus { border-color: var(--red-line); }

/* 会话管理（归档最简版） */
.seg { display: flex; gap: 6px; margin: 0 0 14px; }
.seg-btn {
  flex: 1; text-align: center; font-size: 12px; padding: 7px 0; border-radius: var(--r-sm);
  color: var(--muted); cursor: pointer; background: var(--bg3); border: 1px solid var(--line);
}
.seg-btn.active { color: var(--text); background: var(--bg4); border-color: var(--brand); font-weight: 600; }
.session-row {
  background: var(--bg3); border: 1px solid var(--line); border-radius: var(--r-md);
  padding: 11px 14px; margin-bottom: 10px; display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
}
.session-row .info { flex: 1; min-width: 200px; }
.session-row .title { font-size: 13px; font-weight: 600; }
.session-row .meta { font-size: 11px; color: var(--faint); font-family: var(--mono); margin-top: 3px; display: flex; gap: 10px; flex-wrap: wrap; }
.session-row .ops { display: flex; gap: 8px; flex-wrap: wrap; }
.pill.ws { background: var(--blue-soft); color: var(--blue); border: 1px solid color-mix(in srgb, var(--info-tint) 35%, transparent); font-family: var(--mono); font-size: 11px; padding: 1px 8px; border-radius: 99px; }
.pill.archived { background: var(--bg4); color: var(--faint); border: 1px solid var(--line); font-size: 11px; padding: 1px 8px; border-radius: 99px; }

/* 审计日志（D16：V0.5 工具调用级，保留 ≥180 天） */
.audit-toolbar { display: flex; gap: 10px; margin: 12px 0 14px; flex-wrap: wrap; align-items: center; }
.audit-note { font-size: 11px; color: var(--faint); font-family: var(--mono); }
.audit-table-wrap { overflow-x: auto; }
.st-cell { font-size: 11px; font-weight: 700; font-family: var(--mono); }
.st-cell.ok { color: var(--success-text); }
.st-cell.warn { color: var(--warning-text); }
.st-cell.deny { color: var(--red-2); }

/* D2 DSH 推理回放（RQ3-REASONING-EVAL-P2-7d2k 方案 B：审计视图只读查询块） */
.dsh-replay { margin-top: 18px; padding-top: 14px; border-top: 1px dashed var(--line); }
.dsh-replay h4 { font-size: 13px; font-weight: 700; margin-bottom: 4px; display: flex; gap: 8px; align-items: center; }
.dsh-replay .desc { font-size: 12px; color: var(--muted); margin-bottom: 12px; }
/* J1 #24：会话列表选择行（下拉 + 状态/尾注 + 刷新） */
.dsh-replay-picker { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; margin-bottom: 10px; }
.dsh-replay-picker .dsh-replay-sessions { flex: 1 1 320px; min-width: 220px; font-size: 12px; }
.dsh-replay-picker .dsh-replay-sessions-status { font-size: 11px; color: var(--faint); font-family: var(--mono); }
.dsh-replay-picker .dsh-replay-sessions-err { font-size: 11px; color: var(--red-2); }
.dsh-replay-picker .dsh-replay-sessions-refresh { flex: 0 0 auto; }
.dsh-replay-form { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
.dsh-replay-form .finput { width: auto; flex: 1; min-width: 180px; font-family: var(--mono); font-size: 12px; }
.dsh-replay-form .dsh-replay-turn { flex: 0 0 150px; min-width: 120px; }
/* D4 任务5（RQ3-WRAP-D4-6h3p）：「最近会话」下拉（选入最近含 DSH 映射的会话 id） */
.dsh-replay-form .dsh-replay-recent { flex: 0 0 210px; min-width: 160px; }
.dsh-replay-out { margin-top: 12px; }
.dsh-replay-meta { font-size: 11px; color: var(--faint); font-family: var(--mono); margin-bottom: 8px; }
.dsh-replay-err { font-size: 12px; color: var(--red-2); background: var(--red-soft); border: 1px solid var(--red-line); border-radius: var(--r-sm); padding: 8px 10px; }
.dsh-replay-chunks { display: flex; flex-direction: column; gap: 6px; }
.dsh-replay-chunk { border: 1px solid var(--line); border-radius: var(--r-sm); background: var(--bg-inset); overflow: hidden; }
.dsh-replay-chunk summary { cursor: pointer; font-size: 11px; font-family: var(--mono); color: var(--muted); padding: 5px 10px; user-select: none; white-space: nowrap; }
.dsh-replay-chunk summary:hover { color: var(--text); }
.dsh-replay-chunk pre { margin: 0; padding: 8px 10px; border-top: 1px solid var(--line); font-family: var(--mono); font-size: 12px; line-height: 1.55; white-space: pre-wrap; word-break: break-word; color: var(--text); max-height: 280px; overflow-y: auto; }

/* TLP:RED 上行围栏提示条（D19：仅本地模型处理，不送第三方） */
.tlp-guard {
  display: block; width: 100%; margin-top: 8px;
  background: var(--red-soft); border: 1px solid var(--red-line); border-radius: var(--r-md);
  color: var(--text); font-size: 12px; padding: 8px 12px;
  display: flex; gap: 8px; align-items: center; flex-wrap: wrap;
}
.tlp-guard .h { color: var(--red-2); font-weight: 700; font-family: var(--mono); white-space: nowrap; }
.tlp-pill-red {
  font-size: 11px; font-weight: 700; font-family: var(--mono); padding: 0 6px; border-radius: var(--r-sm);
  background: var(--red-soft); color: var(--red-2); border: 1px solid var(--red-line); margin-left: 4px;
}
.tlp-pill-amber { font-size: 11px; font-weight: 700; font-family: var(--mono); padding: 0 6px; border-radius: var(--r-sm); background: var(--amber-soft); color: var(--warning-text); border: 1px solid color-mix(in srgb, var(--warning-tint) 40%, transparent); margin-left: 4px; }

/* 拖拽输入区高亮（拖拽上传，PRD 6.2） */
.composer-box.dragover { border-color: var(--red); background: var(--red-soft); }

/* ============================================================
   交互优化包（DESIGN-OPT §1-§6：监测闭环 / 资产矩阵 / L3 降级 /
   会话恢复 / quote 展开）—— 沿用同一 token 体系，不新增变量
   ============================================================ */

/* ---- S3 监测视图：订阅编译区 + 告警推送流（§1） ---- */
.monitor-subbox { margin: 4px 0 18px; }
.monitor-subhead { font-size: 12.5px; color: var(--muted); margin-bottom: 10px; }
.monitor-subhead b { color: var(--text); }
.monitor-subgrid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
.monitor-subcard {
  background: var(--bg2); border: 1px solid var(--line); border-radius: var(--r-md);
  padding: 12px 14px; font-size: 12.5px; animation: fadeUp var(--dur-enter) ease-out;
}
.monitor-subcard .nm { font-weight: 700; margin-bottom: 4px; }
.monitor-subcard .rl { font-family: var(--mono); font-size: 11px; color: var(--muted); }
.monitor-subcard .md { font-size: 11px; color: var(--faint); margin-top: 3px; }
.monitor-subcard-add {
  display: flex; flex-direction: column; justify-content: center; align-items: center; gap: 2px;
  border-style: dashed; border-color: var(--line2); color: var(--muted);
  cursor: pointer; text-align: center; transition: border-color var(--dur-fast) ease-out, color var(--dur-fast) ease-out, background var(--dur-fast) ease-out;
}
.monitor-subcard-add:hover { border-color: var(--hover-border); color: var(--text); background: var(--hover-bg); }
.monitor-feedhead { font-size: 12.5px; font-weight: 700; color: var(--text); margin: 6px 0 10px; display: flex; align-items: center; gap: 8px; }
.monitor-feedhead::after { content: ''; flex: 1; height: 1px; background: var(--line); }

/* 告警卡：等级左边框（§7 视觉规范 + B1 P1-9：去整卡红色横向渐变，
   红色只保留左边条与等级标，卡面回归中性——多张 P0 不再满屏泛红） */
.alert-card {
  background: var(--bg3); border: 1px solid var(--line); border-left: 3px solid var(--line2);
  border-radius: var(--r-md); padding: 13px 16px; margin-bottom: 10px;
  animation: fadeUp var(--dur-enter) ease-out; transition: opacity var(--dur-fast) ease-out;
}
.alert-card.lv-p0 { border-left-color: var(--danger); }
.alert-card.lv-p1 { border-left-color: var(--amber); }
.alert-card.lv-p2 { border-left-color: var(--line2); }
.alert-card.done { opacity: 0.55; } /* 已处置/已标记误报：视觉降级 */
.alert-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 6px; }
.alert-title { font-weight: 700; font-size: 13px; }
.alert-level {
  font-family: var(--mono); font-size: 11px; font-weight: 800; padding: 1px 9px; border-radius: var(--r-sm);
}
.alert-level.p0 { background: var(--red-soft); color: var(--danger-fg); border: 1px solid var(--red-line); }
.alert-level.p1 { background: var(--amber-soft); color: var(--warning-text); border: 1px solid color-mix(in srgb, var(--warning-tint) 40%, transparent); }
.alert-level.p2 { background: var(--bg4); color: var(--muted); border: 1px solid var(--line2); }
/* B1 P1-9：待复核角标与报告卡 .review-badge 统一为静态琥珀描边 pill（脉冲只用于实时未读） */
.alert-ai {
  font-size: 11px; font-weight: 700; font-family: var(--mono); padding: 1px 8px; border-radius: 99px;
  background: var(--amber-soft); color: var(--warning-text); border: 1px solid color-mix(in srgb, var(--warning-tint) 40%, transparent);
}
.alert-verdict { font-size: 12.5px; color: var(--text); margin-bottom: 2px; }
.alert-impact { font-size: 12px; color: var(--muted); }
.alert-impact b { color: var(--text); font-weight: 600; }
.alert-evidence { margin: 8px 0 4px; font-size: 12px; color: var(--faint); }
.alert-evidence summary { cursor: pointer; color: var(--blue); font-family: var(--mono); font-size: 11px; }
.alert-evidence[open] summary { margin-bottom: 4px; }
.alert-evidence .mono { font-family: var(--mono); font-size: 11px; word-break: break-all; }
.alert-actions { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; }
.alert-actions .btn:disabled { opacity: 0.5; cursor: not-allowed; }
.alert-actions .btn:last-child { margin-left: auto; } /* 主按钮（查看详情）推到最右 */

/* ---- 资产影响矩阵（§2：表格化 + 导出 + 排序说明；RQ3-UI-PWA：限定 tab 内容区头部，不再波及右栏外层标题行） ---- */
.panel-section .panel-head { gap: 8px; flex-wrap: wrap; }
.asset-export { font-size: 11px; padding: 3px 9px; margin-left: auto; }
.asset-matrix { margin-top: 8px; }
.asset-matrix .asset-name { color: var(--text); cursor: pointer; }
.asset-matrix .asset-name:hover { color: var(--blue); text-decoration: underline; }
.asset-matrix .ip-sub { color: var(--faint); font-size: 11px; }
.asset-sort-note { font-size: 11px; color: var(--faint); font-family: var(--mono); margin-top: 8px; }

/* ---- L3 语义层降级说明条（§3.2 + B1 P1-7：内部实现口径默认隐藏，仅 debug 旗标下显示） ---- */
.degraded-strip {
  display: none;
  background: var(--amber-soft); border: 1px solid color-mix(in srgb, var(--warning-tint) 40%, transparent); border-radius: var(--r-md);
  color: var(--warning-text); font-size: 12px; line-height: 1.7; padding: 8px 12px;
}
body.rq-debug .degraded-strip { display: block; }
/* B1 P1-7：DEGRADED 类工程口径徽标同口径收进 debug（正式界面只呈现用户语义文案） */
.pill.debug-only, .debug-only { display: none; }
body.rq-debug .pill.debug-only, body.rq-debug .debug-only { display: inline-flex; }
body.rq-debug span.debug-only { display: inline; }

/* ---- 会话恢复卡（§4.2） ---- */
.session-restore-card { border-color: color-mix(in srgb, var(--info-tint) 35%, transparent); }
.session-restore-card .restore-acts { background: var(--bg2); border: 1px solid var(--line); border-radius: var(--r-md); padding: 10px 14px; margin-top: 10px; }
.session-restore-card .act-line { font-size: 12px; color: var(--muted); font-family: var(--mono); }
.session-restore-card .restore-btns { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 12px; }

/* ---- 证据链 quote 气泡（§5：pill 点击展开） ---- */
.card-foot .evidence-note { display: block; }
.evidence-note .ev { cursor: pointer; }
.quote-pop {
  display: block; margin-top: 8px; max-width: 100%; max-height: 120px; overflow-y: auto;
  background: var(--bg0); border: 1px solid var(--line); border-left: 3px solid var(--blue);
  border-radius: var(--r-sm); padding: 8px 12px; font-family: var(--mono); font-size: 11px;
  color: var(--muted); animation: fadeUp var(--dur-enter) ease-out; word-break: break-all; line-height: 1.7;
}
.quote-pop .q { color: var(--text); margin-bottom: 4px; }
.quote-pop .s { font-size: 11px; }
.quote-pop .tlp-line { color: var(--red-2); font-weight: 700; margin-top: 4px; }
.quote-pop .tlp-line.amber { color: var(--warning-text); }
.quote-pop.tlp-red { border-left-color: var(--red); }

/* ---- 键盘可达（视觉精修：可点击卡片/单元格/证据 pill 支持 Tab 聚焦 + 焦点环） ---- */
.alert-card:focus-visible, .asset-name:focus-visible, .ev:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; border-radius: var(--r-sm); }

@media (max-width: 1440px) and (min-width: 1181px) {
  .monitor-subgrid { grid-template-columns: repeat(2, 1fr); }
}

/* ============================================================
   RQ3-UI-PWA D 响应式（B1 P1-8 补齐）：
   ≥1440 三栏；1024-1439 右栏折叠为顶栏展开按钮（overlay 抽屉）；
   <1024 左栏同策略改 fixed 抽屉 + 遮罩（顶栏汉堡开关），grid 收单列；
   <640 手机档：场景卡单列、内边距收紧。折叠状态 localStorage 持久化（rq.js initPanelToggle/initNavToggle）。
   ============================================================ */
@media (max-width: 1439px) {
  .app { grid-template-columns: 236px minmax(0, 1fr); }
  .panel {
    position: fixed; top: 0; right: 0; bottom: 0; z-index: var(--z-panel);
    width: min(372px, 92vw); transform: translateX(100%);
    transition: transform var(--dur-enter) ease-out; box-shadow: var(--shadow);
  }
  body:not(.panel-collapsed) .panel { transform: translateX(0); }
  .panel-mask {
    position: fixed; inset: 0; z-index: var(--z-mask); display: none;
    background: var(--drawer-mask);
  }
  body:not(.panel-collapsed) .panel-mask { display: block; }
  .panel-toggle { display: inline-flex; }
  .monitor-subgrid { grid-template-columns: repeat(2, 1fr); }
  .ext-cols { grid-template-columns: 1fr; }
  /* RQ3-UIIMPL-A2S1：<1440 抽屉打开时顶栏齿轮/▤ 鼠标可达——顶栏原为非定位元素（z-index
     不生效），被 fixed 抽屉（--z-panel 800）覆盖仅键盘可达。提升至 801（--z-panel+1）：
     高于右栏抽屉与左栏抽屉（--z-nav 800），仍低于模态遮罩 --z-overlay 900（模态打开时
     顶栏照常被盖）。顶栏常驻中栏顶部、两侧抽屉从其两侧滑入，浮于抽屉之上符合视觉层级；
     顶栏非「浮层载体/遮罩」族，不破坏配对铁律。position:relative 不改布局，仅建立层叠上下文。 */
  .topbar-v2 { position: relative; z-index: calc(var(--z-panel) + 1); }
  /* B1 P1-8：<1440 首次访问右栏默认折叠，▤ 开关给一次性 pulse 提示（纯 CSS 播 3 次后停；rq.js 点击后移除并记忆） */
  .panel-toggle.hint-once { animation: hintPulse 1.2s ease-in-out 3; }
}

@media (max-width: 1180px) {
  .monitor-subgrid { grid-template-columns: 1fr; }
}

/* B1 P1-8：<1024 左栏 fixed 抽屉 + 遮罩（复用右栏抽屉模式；两抽屉互斥由 rq.js 保证） */
@media (max-width: 1023px) {
  .app { grid-template-columns: minmax(0, 1fr); }
  .nav {
    position: fixed; top: 0; left: 0; bottom: 0; z-index: var(--z-nav);
    width: min(280px, 84vw); transform: translateX(-100%);
    transition: transform var(--dur-enter) ease-out; box-shadow: var(--shadow);
  }
  body:not(.nav-collapsed) .nav { transform: translateX(0); }
  .nav-mask {
    position: fixed; inset: 0; z-index: var(--z-mask); display: none;
    background: var(--drawer-mask);
  }
  body:not(.nav-collapsed) .nav-mask { display: block; }
  .nav-toggle { display: inline-flex; }
  /* RQ3-UIIMPL-A1（设计方案 P1 问题⑤）：<1024 顶栏精简——次要元素收起：品牌文字
     （◆ logo 已表意）与右侧状态 pill（SSE/登录态徽标——状态信息非操作入口）隐藏，
     保留核心五要素：汉堡 ☰ / logo / 场景徽标 / ⚙ 设置 / ▤ 右栏开关。纯 CSS 收纳
     不动 DOM（JS 徽标状态照常更新，回 ≥1024 视口即恢复显示）。scene-badge 同步
     收窄防窄屏与右侧按钮组挤溢出。 */
  .topbar-v2 { padding: 0 12px; gap: 8px; }
  .topbar-v2 .topbar-title { display: none; }
  .topbar-v2 .topbar-meta .badge-flat { display: none; }
  .topbar-v2 .scene-badge { max-width: 160px; }
}

/* B1 P1-8：手机档（场景卡单列、边距收紧、composer 进一步折叠） */
@media (max-width: 640px) {
  .scene-cards { grid-template-columns: 1fr; }
  .chat-inner, .composer-inner { padding: 0 16px; }
  .composer { padding: 8px 12px 10px; }
  .chat { padding: 20px 0 14px; }
  .monitor-subgrid { grid-template-columns: 1fr; }
  .topbar-v2 { padding: 0 10px; gap: 8px; }
  .topbar-v2 .topbar-title { display: none; }
  .alert-actions .btn { flex: 1 1 auto; }
  /* RQ3-M1-UXFIX-9w2e P1-4：composer 紧凑形态——「资产范围」标签不换行。行内 hint
     与输入框下方 .composer-hint 文案重复（client 页两处恒在），窄视口隐藏行内份腾出
     宽度；标签整行 nowrap + select 不收缩，保证 scope 行单行呈现 */
  .composer-scope { white-space: nowrap; }
  .composer-scope select { flex: none; }
  .composer-scope .composer-hint-inline { display: none; }
}

@keyframes hintPulse {
  0%, 100% { box-shadow: 0 0 0 0 transparent; }
  50% { box-shadow: 0 0 0 6px color-mix(in srgb, #f47067 28%, transparent); }
}

/* ---- B2 P2-16：prefers-reduced-motion 尊重（入场/脉冲/过渡全量降为瞬时；滚动回 instant） ---- */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
  .chat { scroll-behavior: auto; }
}

/* ============================================================
   四升级前端（任务清单 C/D/E/F 组）——沿用同一 token 体系，不新增变量
   E1 证据标注 / E2 矛盾提示 / E3 调查板 / E6-E7 研判路径 /
   E8 报告编辑 / E9 P0 复核 / F 资产管理 / SSE 消费
   ============================================================ */

/* ---- E1 证据标注按钮（pill 旁 ⭐关键 / ⚠存疑 / ✕排除）
     B1 P0-3：触控目标 ≥28px（原实测 17-18px 高，误触率高），按钮间距拉开 ---- */
.evidence-note { display: block; line-height: 2; }
/* RQ3-UI-FIX2 L-2：按钮组整体不断行（inline-flex 内换行点在按钮之间造成混排，nowrap 保持三按钮一体） */
.anno-btns { display: inline-flex; gap: 6px; margin-left: 3px; vertical-align: middle; white-space: nowrap; }
.anno-btn {
  background: var(--bg4); border: 1px solid var(--line); color: var(--faint);
  font-size: 11px; line-height: 1; padding: 6px 8px; border-radius: var(--r-sm);
  min-height: 28px; min-width: 28px;
  cursor: pointer; transition: background var(--dur-fast) ease-out, border-color var(--dur-fast) ease-out, color var(--dur-fast) ease-out; font-family: var(--mono);
  display: inline-flex; align-items: center; justify-content: center;
}
.anno-btn:hover { color: var(--text); border-color: var(--line2); background: var(--bg0); }
.anno-btn:focus-visible { outline: 2px solid var(--brand); outline-offset: 1px; }
.anno-btn-key.anno-on { background: var(--amber-soft); color: var(--warning-text); border-color: color-mix(in srgb, var(--warning-tint) 50%, transparent); }
.anno-btn-doubt.anno-on { background: var(--red-soft); color: var(--red-2); border-color: var(--red-line); }
.anno-btn-excl.anno-on { background: var(--bg0); color: var(--text); border-color: var(--line2); text-decoration: line-through; }
.evidence-note .ev.anno-marked { font-weight: 700; }
.evidence-note .ev.anno-key { color: var(--warning-text); }
.evidence-note .ev.anno-doubt { color: var(--red-2); }
.evidence-note .ev.anno-excl { color: var(--faint); text-decoration: line-through; opacity: 0.6; }
.anno-note {
  display: inline-block; font-size: 11px; font-family: var(--mono); color: var(--warning-text);
  background: var(--amber-soft); border: 1px solid color-mix(in srgb, var(--warning-tint) 35%, transparent); border-radius: var(--r-sm);
  padding: 1px 7px; margin-left: 4px; vertical-align: middle;
}

/* ---- E2 证据矛盾/时间差异提示条 ---- */
.conflict-strip {
  display: block; width: 100%; margin-top: 6px; border-radius: var(--r-md);
  font-size: 12px; padding: 7px 12px; line-height: 1.7; animation: fadeUp var(--dur-enter) ease-out;
}
.conflict-strip.conflict {
  background: var(--amber-soft); border: 1px solid color-mix(in srgb, var(--warning-tint) 50%, transparent); color: var(--warning-text);
}
.conflict-strip.stale {
  background: var(--bg4); border: 1px solid var(--line2); color: var(--muted);
}

/* ---- E3-E5 调查板 ---- */
.board-group-label {
  display: flex; align-items: center; gap: 8px; font-size: 12px; font-weight: 700;
  color: var(--muted); margin: 14px 0 8px; letter-spacing: 0.5px;
}
.board-group-label::after { content: ''; flex: 1; height: 1px; background: var(--line); }
.board-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 10px; }
.board-card {
  position: relative; /* B2 P2-9：右上角 hover 移除钮的定位锚 */
  background: var(--bg2); border: 1px solid var(--line); border-left: 3px solid var(--line2);
  border-radius: var(--r-md); padding: 11px 13px; display: flex; flex-direction: column; gap: 6px;
  transition: border-color var(--dur-fast) ease-out; animation: fadeUp var(--dur-enter) ease-out;
}
.board-card:hover { border-color: var(--hover-border); }
.board-card:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
.board-card.monitored { border-left-color: var(--green); }
.board-card .v { font-size: 12px; font-weight: 700; color: var(--text); word-break: break-all; padding-right: 22px; }
.board-card .meta { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.board-card .meta .src { font-size: 11px; color: var(--faint); font-family: var(--mono); }
.board-card .mon { display: flex; align-items: center; gap: 8px; }
.board-card .mon .t { font-size: 11px; color: var(--faint); font-family: var(--mono); margin-left: auto; }
/* B2 P2-9：移除钮改右上角 hover/focus 图标钮（危险操作不与主操作常驻同排） */
.board-remove {
  position: absolute; top: 6px; right: 6px;
  width: 24px; height: 24px; display: inline-flex; align-items: center; justify-content: center;
  background: var(--bg4); border: 1px solid var(--line2); border-radius: var(--r-xs);
  color: var(--faint); font-size: 12px; line-height: 1; cursor: pointer; padding: 0;
  opacity: 0; pointer-events: none;
  transition: opacity var(--dur-fast) ease-out, color var(--dur-fast) ease-out, border-color var(--dur-fast) ease-out, background var(--dur-fast) ease-out;
}
.board-card:hover .board-remove,
.board-card:focus-within .board-remove,
.board-remove:focus-visible { opacity: 1; pointer-events: auto; }
.board-remove:hover { color: var(--danger-fg); border-color: var(--red-line); background: var(--red-soft); }
.board-remove:focus-visible { outline: 2px solid var(--brand); outline-offset: 1px; }
.board-ops { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 2px; }
.board-foot-note { font-size: 11px; color: var(--faint); font-family: var(--mono); margin-top: 14px; }

/* ---- E6-E7 研判路径（报告卡前折叠区，默认收起） ---- */
.path-card { padding: 6px 14px; }
.path-details > summary {
  cursor: pointer; font-size: 13px; font-weight: 700; padding: 8px 2px; color: var(--text);
  display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; list-style: none; user-select: none;
}
.path-details > summary::-webkit-details-marker { display: none; }
.path-details > summary::before { content: '▸'; color: var(--red); transition: transform var(--dur-fast) ease-out; }
.path-details[open] > summary::before { transform: rotate(90deg); }
.path-details .path-sub { font-size: 11px; color: var(--faint); font-weight: 500; font-family: var(--mono); }
.path-steps { padding: 2px 0 10px; }
.path-step {
  display: flex; gap: 10px; align-items: flex-start; padding: 9px 10px; margin-bottom: 6px;
  background: var(--bg2); border: 1px solid var(--line); border-radius: var(--r-md);
}
.path-step .no {
  width: 20px; height: 20px; border-radius: 50%; flex: none; margin-top: 1px;
  background: var(--bg1); border: 2px solid var(--red); color: var(--red-2);
  font-size: 11px; font-weight: 700; display: flex; align-items: center; justify-content: center;
}
.path-main { flex: 1; min-width: 0; }
.path-row { display: flex; gap: 8px; align-items: baseline; flex-wrap: wrap; font-size: 12px; margin: 2px 0; }
.path-row .k {
  font-size: 11px; color: var(--faint); font-weight: 700; flex: none;
  background: var(--bg4); border-radius: var(--r-sm); padding: 1px 6px; letter-spacing: 0.5px;
}
.path-row .tool { font-size: 12px; font-weight: 700; color: var(--blue); }
.path-row .q { font-size: 11px; color: var(--muted); font-family: var(--mono); word-break: break-all; }
.path-row .v { color: var(--text); }
.path-conf {
  flex: none; font-family: var(--mono); font-size: 12px; font-weight: 700;
  padding: 3px 9px; border-radius: 99px; margin-top: 2px; white-space: nowrap;
}
.path-conf.up { background: var(--green-soft); color: var(--success-text); border: 1px solid color-mix(in srgb, var(--success-tint) 40%, transparent); }
.path-conf.down { background: var(--red-soft); color: var(--red-2); border: 1px solid var(--red-line); }
.path-conf.flat { background: var(--bg4); color: var(--muted); border: 1px solid var(--line2); }

/* ---- E8 报告可编辑（章节级 contenteditable + 修改琥珀高亮 + 对比） ---- */
.rev-toolbar { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 10px; }
.report-card .md .edit-on {
  outline: 1px dashed color-mix(in srgb, var(--warning-tint) 55%, transparent); outline-offset: 2px; border-radius: var(--r-sm);
  cursor: text; transition: outline-color var(--dur-fast) ease-out;
}
.report-card .md .edit-on:focus { outline: 2px solid var(--amber); background: color-mix(in srgb, var(--warning-tint) 5%, transparent); }
.report-card .md .revised {
  background: var(--amber-soft); border-radius: var(--r-sm); padding: 1px 4px;
  box-shadow: inset 0 -2px 0 color-mix(in srgb, var(--warning-tint) 60%, transparent); color: var(--text);
}
.report-card .md .revised-saved { box-shadow: inset 0 -3px 0 color-mix(in srgb, var(--warning-tint) 85%, transparent); }
.report-card .md.show-original .revised { opacity: 0.55; box-shadow: inset 0 -2px 0 color-mix(in srgb, var(--warning-tint) 30%, transparent); }

/* ---- E9 P0 复核角标（B1 P1-5/P1-9：待复核改静态琥珀描边（唯一复核信号、不再常驻脉冲），复核后绿 pill） ---- */
.pill.review-badge { font-family: var(--mono); font-size: 11px; }
.pill.review-badge.pending {
  background: var(--amber-soft); color: var(--warning-text); border: 1px solid color-mix(in srgb, var(--warning-tint) 40%, transparent);
}
.pill.review-badge.done {
  background: var(--green-soft); color: var(--success-text); border: 1px solid color-mix(in srgb, var(--success-tint) 40%, transparent);
}

/* ---- F 组 资产管理视图（实体/组件资产卡片 + 活动流时间线） ---- */
/* B1 P1-7：内部口径说明条（mock/降级）默认隐藏，仅 debug 旗标（URL ?debug=1）下显示 */
.asset-mock-note {
  display: none;
  background: var(--amber-soft); border: 1px solid color-mix(in srgb, var(--warning-tint) 40%, transparent); border-radius: var(--r-md);
  color: var(--warning-text); font-size: 12px; padding: 8px 12px; margin: 4px 0 14px; line-height: 1.7;
}
body.rq-debug .asset-mock-note { display: block; }
/* RQ3-UIIMPL-A1（设计方案 P1 问题③）：资产卡改响应式紧凑网格——auto-fill + minmax(252px,1fr)
   （对齐 proto-assets.html .entity-grid 口径），不同视口宽度下卡片等宽自适应换行、单卡列数
   随宽度自动增减；min(252px,100%) 防御极窄容器（<252px+gap）轨道最小值撑破——任何视口
   零横向溢出。原 320px 固定 min 在 1440 三栏下中列有效宽不足 2 列、大面积留白的问题一并消除 */
.assets-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(252px, 100%), 1fr)); gap: 12px; }
/* 卡内密度同步收紧（tokens 间距体系 4/8 栅格微调）：纵向 padding 13→12（--space-3）、
   行距 6→5、次级字号 12→11.5（与 .kv-mini/.ac-name 同级，卡内三级文字层次不变） */
.asset-card-v2 {
  background: var(--bg2); border: 1px solid var(--line); border-radius: var(--r-md);
  padding: 12px 14px; display: flex; flex-direction: column; gap: 5px;
  transition: border-color var(--dur-fast) ease-out; animation: fadeUp var(--dur-enter) ease-out;
}
.asset-card-v2:hover { border-color: var(--hover-border); }
.asset-card-v2.monitored { border-left: 3px solid var(--green); }
.ac-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.ac-head .ac-type { font-size: 11px; color: var(--faint); font-family: var(--mono); flex: none; }
.ac-head .v { font-size: 12.5px; font-weight: 700; word-break: break-all; flex: 1; min-width: 120px; }
.ac-name { font-size: 11.5px; color: var(--muted); }
.ac-meta { display: flex; gap: 12px; flex-wrap: wrap; font-size: 11.5px; color: var(--faint); }
.ac-meta b { color: var(--text); font-weight: 600; }
/* B2 P2-1：.kv-mini 补样式（此前 rq.js 引用但 CSS 无定义——资产卡元信息行靠裸 span/b 默认样式撑） */
.kv-mini { display: inline-flex; align-items: baseline; gap: 5px; font-size: 11.5px; color: var(--faint); white-space: nowrap; }
.kv-mini b { color: var(--text); font-weight: 600; }
/* B2 P2-2：资产管理视图内 seg（实体/组件切换；复用 .seg 体系） */
.assets-seg { max-width: 320px; margin: 0 0 14px; }
.ac-exposure { font-size: 12px; color: var(--muted); background: var(--bg3); border: 1px solid var(--line); border-radius: var(--r-sm); padding: 4px 8px; }
.asset-activity { margin-top: 4px; }
.asset-activity summary { cursor: pointer; color: var(--blue); font-family: var(--mono); font-size: 11px; }
.asset-activity[open] summary { margin-bottom: 6px; }
.tl-row { display: flex; gap: 8px; align-items: baseline; font-size: 12px; padding: 4px 0; border-bottom: 1px dashed var(--line); }
.tl-row:last-child { border-bottom: none; }
.tl-dot { width: 7px; height: 7px; border-radius: 50%; flex: none; align-self: center; }
.tl-t { color: var(--faint); font-size: 11px; flex: none; }
.tl-k { font-weight: 700; flex: none; font-size: 11px; }
.tl-x { color: var(--muted); }

/* ---- RQ3-ASSET-UI：资产 CRUD（操作栏 / 添加资产模态表单 / 卡片 hover 删除钮） ---- */
.assets-toolbar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin: 0 0 12px; }
.assets-toolbar .assets-toolbar-note { font-size: 11.5px; color: var(--faint); }
.asset-card-v2 .ac-del {
  position: absolute; top: 10px; right: 10px;
  width: 24px; height: 24px; display: inline-flex; align-items: center; justify-content: center;
  background: var(--bg3); border: 1px solid var(--line); border-radius: 6px;
  color: var(--faint); font-size: 12px; line-height: 1; cursor: pointer; padding: 0;
  opacity: 0; transition: opacity var(--dur-fast) ease-out, color var(--dur-fast) ease-out, border-color var(--dur-fast) ease-out;
}
.asset-card-v2 { position: relative; }
.asset-card-v2:hover .ac-del, .asset-card-v2 .ac-del:focus-visible { opacity: 1; }
.asset-card-v2 .ac-del:hover { color: var(--red-2); border-color: var(--red-line); }
.asset-form { display: flex; flex-direction: column; gap: 10px; margin-top: 6px; }
.asset-form label.f { display: flex; flex-direction: column; gap: 5px; font-size: 11.5px; color: var(--muted); margin: 0; }
.asset-form label.f .req { color: var(--red-2); }
.asset-form .f-hint { font-size: 11px; color: var(--faint); line-height: 1.5; }
.asset-form input, .asset-form select {
  background: var(--bg-inset); color: var(--text); border: 1px solid var(--line); border-radius: 6px;
  padding: 7px 9px; font-size: 12.5px; width: 100%; box-sizing: border-box;
}
.asset-form input:focus, .asset-form select:focus { outline: none; border-color: var(--blue); }
.asset-form .seg { margin: 0; }
.asset-form-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 10px; }
.asset-form-error {
  display: none; background: color-mix(in srgb, #d8404f 8%, transparent); border: 1px solid var(--red-line); border-radius: var(--r-sm);
  color: var(--red-2); font-size: 11.5px; padding: 7px 10px; line-height: 1.6; word-break: break-all;
}
@media (max-width: 720px) {
  .asset-form-row { grid-template-columns: 1fr; }
}

/* ---- N1 资产域收口（RQ3-N1-ASSET）：实体卡操作面（四型扫描下拉/可用性/结果回看）+ 组件卡匹配理由 + 扫描进度条卡 ---- */
.ac-ops { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.ac-ops .ac-ops-note { font-size: 10.5px; color: var(--faint); font-family: var(--mono); }
.ac-scan-wrap { position: relative; display: inline-flex; }
.ac-scan-menu {
  position: absolute; top: calc(100% + 4px); left: 0; z-index: var(--z-pop);
  min-width: 140px; padding: 4px; display: none;
  background: var(--bg2); border: 1px solid var(--line2); border-radius: var(--r-sm); box-shadow: var(--shadow);
}
.ac-scan-wrap.open .ac-scan-menu { display: block; }
.ac-scan-item {
  display: block; width: 100%; text-align: left; padding: 6px 10px; font-size: 12px;
  background: none; border: 0; border-radius: 5px; color: var(--text); cursor: pointer; white-space: nowrap;
}
.ac-scan-item:hover { background: var(--bg3); color: var(--blue); }
.ac-uptime-box, .ac-feed-box {
  background: var(--bg3); border: 1px solid var(--line); border-radius: var(--r-sm);
  padding: 8px 10px; margin: 6px 0 2px;
}
.ac-sub-head { font-size: 11.5px; color: var(--blue); font-family: var(--mono); margin: 2px 0 4px; }
.ac-sub-x { font-size: 11.5px; color: var(--faint); line-height: 1.7; word-break: break-all; }
.ac-uptime-row { display: flex; gap: 14px; flex-wrap: wrap; font-size: 12px; color: var(--muted); }
.ac-uptime-row b { color: var(--text); }
.ac-feed-row { display: flex; gap: 8px; margin: 6px 0 2px; }
.ac-feed-btn {
  background: var(--bg3); border: 1px solid var(--line); border-radius: 5px; color: var(--blue);
  font-size: 11px; font-family: var(--mono); padding: 4px 8px; cursor: pointer;
}
.ac-feed-btn:hover { border-color: var(--blue); }
.ac-precheck {
  margin-top: 6px; background: var(--amber-soft); border: 1px solid color-mix(in srgb, var(--warning-tint) 35%, transparent);
  border-radius: var(--r-sm); padding: 7px 10px;
}
.ac-precheck-h { font-size: 11px; color: var(--warning-text); font-family: var(--mono); margin-bottom: 4px; }
.ac-precheck-x { font-size: 11.5px; color: var(--muted); line-height: 1.8; word-break: break-all; }
.ac-progress { height: 6px; background: var(--bg0); border-radius: 99px; overflow: hidden; border: 1px solid var(--line); }
.ac-progress-fill { height: 100%; border-radius: 99px; background: linear-gradient(90deg, var(--blue), var(--green)); transition: width 0.4s ease-out; }
.scan-progress-note { font-size: 11.5px; color: var(--faint); margin-top: 6px; }

/* ---- SSE 消费（告警 toast / 任务进度浮层 / 顶栏徽标 / 监测视图演示行） ---- */
/* RQ3-UIIMPL-P0 问题④随动：SSE 告警浮层保持右下锚定形态——补 top:auto 抵消 .toast 新
   top:60px，防 top+bottom 双锚定把元素拉伸为纵贯视口 */
.toast.toast-alert {
  background: linear-gradient(135deg, #3a1620, #2a1a24); border: 1px solid var(--red-line);
  color: var(--red-2); font-weight: 600; left: auto; right: 22px; transform: none; bottom: 70px; top: auto;
}
#rq-task-progress {
  position: fixed; right: 22px; bottom: 22px; z-index: var(--z-toast); width: 264px;
  background: var(--bg3); border: 1px solid var(--line2); border-radius: var(--r-md);
  padding: 10px 13px; box-shadow: var(--shadow); opacity: 0; pointer-events: none;
  transform: translateY(8px); transition: opacity var(--dur-enter) ease-out, transform var(--dur-enter) ease-out;
}
#rq-task-progress.on { opacity: 1; transform: translateY(0); }
.tp-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 12px; font-weight: 600; margin-bottom: 6px; }
.tp-head .tp-pct { color: var(--blue); font-size: 12px; }
.tp-track { height: 6px; background: var(--bg0); border-radius: 99px; overflow: hidden; border: 1px solid var(--line); }
.tp-fill { height: 100%; border-radius: 99px; background: linear-gradient(90deg, var(--blue), var(--green)); transition: width var(--dur-enter) ease-out; }
.tp-step { font-size: 11px; color: var(--faint); margin-top: 5px; }
#stream-badge.ok { color: var(--success-text); border-color: color-mix(in srgb, var(--success-tint) 40%, transparent); }
#stream-badge.degraded { color: var(--warning-text); border-color: color-mix(in srgb, var(--warning-tint) 40%, transparent); }
.sse-demo-row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 12px; }
.sse-demo-note { font-size: 11px; color: var(--faint); font-family: var(--mono); }
.sse-live-row {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  background: var(--blue-soft); border: 1px solid color-mix(in srgb, var(--info-tint) 40%, transparent); border-radius: var(--r-md);
  padding: 8px 12px; margin: 4px 0 14px; font-size: 12px; color: var(--muted); animation: fadeUp var(--dur-enter) ease-out;
}
.sse-live-row .h { color: var(--blue); font-weight: 700; font-family: var(--mono); }
.sse-live-row b { color: var(--text); }

/* ---- 键盘可达补充（四升级新增可交互元素；B1 P0-6 焦点环统一 brand 色） ---- */
.board-card:focus-visible, .anno-btn:focus-visible, .path-details summary:focus-visible, .asset-activity summary:focus-visible {
  outline: 2px solid var(--brand); outline-offset: 2px; border-radius: var(--r-sm);
}

/* ---- 响应式（RQ3-UI-PWA：≥1440 三栏；以下新组件收窄列数，右栏抽屉见顶部响应式块） ----
   RQ3-UIIMPL-A2S1（A1 批 QC MEDIUM 裁定）：删除 1181-1440 的 minmax(280px,…) 中间断点与
   ≤1180 的 .assets-grid 1fr 单列覆盖——资产网格全宽度区间统一走基线 :1416 的
   repeat(auto-fill, minmax(min(252px,100%),1fr))，随容器宽度自然降列（proto-assets .entity-grid
   同构）；极窄容器由 min(252px,100%) 下限保护不溢出。.board-grid（看板列布局，另一组件）保留 1fr。 */
@media (max-width: 1180px) {
  .board-grid { grid-template-columns: 1fr; }
  #rq-task-progress { right: 12px; bottom: 12px; width: 220px; }
}

/* ============================================================
   客户端登录·云端认证同步（RQ3-C9-AUTH / 方案 V1.1 §5）—— 沿用徽标设计语言
   ============================================================ */

/* 顶栏登录态徽标：桌面端可点击（登录入口/登出确认），Web 版静态降级 */
.pill.auth-badge { user-select: none; }
.pill.auth-badge.auth-desktop { cursor: pointer; transition: filter var(--dur-fast) ease-out; }
.pill.auth-badge.auth-desktop:hover { filter: brightness(1.2); }
.pill.auth-badge.auth-web { cursor: default; }

/* 数据源徽标旁「订阅 token 已配置」小对勾（auth:status.api_key_configured 驱动） */
.api-key-hint { color: var(--success-text); font-size: 11px; font-weight: 700; }

/* 设置面板 · RedQueen API Token 区块 */
.auth-setting {
  margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--line);
  display: flex; flex-direction: column; gap: 8px;
}
.auth-setting > label { font-size: 12px; color: var(--muted); }
.auth-setting-row { display: flex; gap: 8px; align-items: center; }
.auth-setting-row input {
  flex: 1; min-width: 0; background: var(--bg2); border: 1px solid var(--line);
  border-radius: var(--r-sm); color: var(--text); font-size: 12px;
  padding: 6px 10px; font-family: var(--mono);
}
.auth-setting-row input:focus { outline: none; border-color: var(--blue); }
.auth-setting-row .btn { white-space: nowrap; }
.auth-setting-note, .auth-setting-tip { font-size: 11px; color: var(--faint); line-height: 1.6; }

/* ============================================================
   PWA 深化批次（RQ3-P2-BATCH：P2-2 离线徽标 / P2-3 安装引导 / P2-5 sprite 图标）
   ============================================================ */

/* ---- P2-5：SVG sprite 图标（icons/rq-sprite.svg，rq.js ico() 注入；emoji 为天然兜底） ----
   尺寸随字号（1em）、基线对齐；描边图标继承 currentColor（.ico 行内色 / 语义色 token） */
.rq-svg {
  width: 1em; height: 1em; display: inline-block; vertical-align: -0.125em;
  fill: none; stroke: currentColor; flex: none;
}
/* 实心 symbol（vuln/bolt/skill 等 fill=currentColor）不继承描边描边默认 */
.rq-svg use { pointer-events: none; }
.ico .rq-svg { width: 14px; height: 14px; vertical-align: -2px; }
.card-title .ico .rq-svg { width: 13px; height: 13px; }
.empty .ico .rq-svg { width: 20px; height: 20px; }
.btn .rq-svg, .pill .rq-svg { width: 12px; height: 12px; vertical-align: -1.5px; margin-right: 1px; }
.icon-btn > .rq-svg, .composer-send > .rq-svg { width: 14px; height: 14px; vertical-align: 0; }
h3 .rq-svg { width: 14px; height: 14px; vertical-align: -2px; }
.at-item .ico .rq-svg { width: 13px; height: 13px; }

/* ---- P2-2：顶栏离线徽标（琥珀系：降级/只读语义，§5.1 warning 档；与 SSE 降级徽标同语言） ---- */
.pill.offline-badge {
  color: var(--warning-text); border: 1px solid color-mix(in srgb, var(--warning-tint) 45%, transparent);
  background: var(--amber-soft); cursor: default; user-select: none;
}
.pill.offline-badge .rq-svg { stroke: var(--amber); }

/* ---- P2-3：顶栏安装入口（beforeinstallprompt 触发后出现；中性面 + 品牌悬停） ---- */
.pill.install-btn {
  color: var(--text); background: var(--bg4); border: 1px solid var(--line2);
  cursor: pointer; user-select: none; font-family: inherit;
  transition: border-color var(--dur-fast) ease-out, background-color var(--dur-fast) ease-out;
}
.pill.install-btn:hover { border-color: var(--brand); background: var(--brand-soft); }
.pill.install-tip {
  color: var(--fg-muted); background: var(--bg4); border: 1px solid var(--line2);
  cursor: pointer; user-select: none; max-width: 320px;
}
.pill.install-tip:hover { color: var(--text); }

/* ---- 平台登录 modal（RQ3-REALIFY-LOGIN：左栏用户区统一登录入口，三通道） ---- */
.platform-login { display: flex; flex-direction: column; gap: 8px; margin-top: 8px; }
.platform-login input {
  background: var(--bg-inset); color: var(--text); border: 1px solid var(--line);
  border-radius: var(--r-sm); padding: 8px 10px; font-size: 12.5px; width: 100%;
}
.platform-login input:focus { outline: none; border-color: var(--blue); }
.platform-login .auth-setting-row input { width: auto; flex: 1; }
.platform-login .nav-group-head .arrow { display: inline-block; width: 14px; color: var(--faint); }

/* ---- RQ3-PROD-AGENT：Agent 模式 LLM 正文卡（SSE delta 流式追加，mdLite 渲染） ---- */
.agent-md-card .agent-md p { margin: 6px 0; font-size: 13px; color: var(--text); }
.agent-md-card .agent-note {
  margin-top: 8px; padding: 6px 10px; font-size: 12px; color: var(--warning-text);
  border: 1px dashed color-mix(in srgb, var(--warning-tint) 50%, transparent); border-radius: var(--r-sm); background: var(--bg2);
}

/* ---- S2.2「从此轮重试」（DSH fork，RQ3-DSH-S2-DEEP-7w3n）：agent 回复卡右上角悬浮操作 ---- */
.agent-md-card { position: relative; }
.agent-md-card > .dsh-retry-btn {
  position: absolute; top: 6px; right: 8px;
  font-size: 11px; line-height: 1; padding: 5px 8px; border-radius: var(--r-sm);
  color: var(--faint); background: transparent; border: 1px solid transparent;
  cursor: pointer; opacity: 0; transition: opacity .12s ease;
}
.agent-md-card:hover > .dsh-retry-btn { opacity: 1; }
.agent-md-card > .dsh-retry-btn:hover { color: var(--blue); border-color: var(--line); background: var(--bg2); }

/* ============================================================
   A2S3A 任务2/3（RQ3-UIIMPL-A2S3A-9f4t）：
   · .turnp 轮次进度徽标（设计方案 §5.2 G .turn-progress，对照 proto-cloud-home）
   · .error-head/.error-d/.code-hint 错误卡结构（§5.2 F .error-card，对照
     proto-new-components F——错误图标 + 标题 + 正文 + 获取途径/正确格式等宽块）
   · 任务1 适配：degraded-strip/agent-note 的 icon+span 结构基线对齐
   ============================================================ */
/* ---- 任务2：回合 meta 行右侧轮次徽标（round 事件实时「第 N 轮」+ 分段点亮；done 终态
     「N 轮 · M 次工具 · T s」）——纯展示，SSE 消费与确认流零触碰 ---- */
.msg .who .turnp {
  margin-left: auto; display: inline-flex; align-items: center; gap: 7px;
  font-family: var(--mono); font-size: 11px; color: var(--faint);
  white-space: nowrap;
}
.turn-segs { display: inline-flex; gap: 3px; }
.turn-segs i { width: 14px; height: 3px; border-radius: 2px; background: var(--bg4); }
.turn-segs i.on { background: var(--brand); }
@media (prefers-reduced-motion: reduce) { .turnp, .turn-segs i { transition: none; } }

/* ---- 任务3：错误卡（agent 流 tool_result FAILED 独立卡 + scan 检索失败回执内嵌行共用） ---- */
.card.error-card { border-color: var(--red-line); }
.error-head {
  display: flex; align-items: center; gap: 10px; margin: 8px 0 9px;
}
.asset-op-card .error-head { margin-top: 10px; }
.error-icon {
  flex: none; width: 28px; height: 28px; border-radius: var(--radius-full);
  background: var(--red-soft); color: var(--red-2);
  display: inline-flex; align-items: center; justify-content: center;
}
.error-icon .rq-svg { width: 15px; height: 15px; }
.error-title { font-size: 13.5px; font-weight: 700; color: var(--text); min-width: 0; }
.error-d { font-size: 12.5px; color: var(--muted); line-height: 1.6; margin-bottom: 10px; word-break: break-word; }
.code-hint {
  background: var(--bg-inset); border: 1px solid var(--color-border-subtle); border-radius: var(--radius-md);
  padding: 9px 12px; font-family: var(--mono); font-size: 10.5px; color: var(--muted);
  margin-bottom: 6px; line-height: 1.6; word-break: break-all; white-space: pre-wrap;
}
.code-hint .ck { color: var(--success-fg); margin-bottom: 4px; }

/* ============================================================
   A2S3B-2（RQ3-UIIMPL-A2S3B2-3c8v）：计划先行卡 .plan-card（设计方案 §5.2 A / §8.1 P2
   「计划先行卡（+ 可编辑）」最小版——对照 proto-new-components「A·计划先行卡」）：
   标题行（icon+「执行计划」+summary+步数徽标）→ 步骤列表（.pstep 序号+desc+.tchip 工具名
   mono chip，时间轴竖线连接）→ 底部「等待确认」态+「回复可调整计划」提示。
   可编辑留后续批（调整靠对话交互——卡上不设按钮）。执行联动：.pstep[data-done="1"]
   序号圈置 ✓ 完成态（后续 tool_call 事件按工具名精确匹配点亮，不匹配不点亮）。
   ============================================================ */
.card.plan-card { border-color: var(--brand-line); }
.plan-head { display: flex; align-items: center; gap: 8px; margin-bottom: 11px; min-width: 0; flex-wrap: wrap; }
.plan-ico {
  flex: none; width: 26px; height: 26px; border-radius: var(--radius-full);
  background: var(--brand-soft); color: var(--brand-400);
  display: inline-flex; align-items: center; justify-content: center;
}
.plan-ico .rq-svg { width: 14px; height: 14px; }
.plan-title { font-size: 13.5px; font-weight: 700; color: var(--text); white-space: nowrap; }
.plan-sum { font-size: 12px; color: var(--muted); min-width: 0; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.plan-count {
  flex: none; margin-left: auto; font-family: var(--mono); font-size: 10.5px; padding: 2px 9px;
  border-radius: var(--radius-full); background: var(--bg4); border: 1px solid var(--line);
  color: var(--muted); white-space: nowrap;
}
.plan-steps { display: flex; flex-direction: column; gap: 11px; margin-bottom: 12px; }
.pstep { display: grid; grid-template-columns: 24px minmax(0, 1fr); gap: 0 10px; position: relative; padding-bottom: 11px; }
.pstep:last-child { padding-bottom: 0; }
.pstep:not(:last-child)::before { content: ''; position: absolute; left: 11px; top: 26px; bottom: 1px; width: 1.5px; background: var(--line); }
.pno {
  width: 22px; height: 22px; margin-top: 1px; border-radius: 50%;
  border: 1.5px solid var(--line2); background: var(--bg3);
  display: flex; align-items: center; justify-content: center;
  font-family: var(--mono); font-size: 10px; color: var(--faint); z-index: 1;
}
.pstep[data-done="1"] .pno { border-color: var(--success-line); background: var(--green-soft); color: var(--success-fg); }
.pstep[data-done="1"] .pno .rq-svg { width: 12px; height: 12px; }
.pstep .pt { font-size: 12.5px; font-weight: 600; color: var(--text); line-height: 1.5; display: flex; gap: 7px; align-items: center; flex-wrap: wrap; min-width: 0; }
.tchip {
  flex: none; font-family: var(--mono); font-size: 10px; padding: 1px 6px;
  border-radius: var(--r-xs); background: var(--bg-inset); border: 1px solid var(--line);
  color: var(--info-fg); white-space: nowrap;
}
/* A2S3B-2 回流修复（RQ3-UIIMPL-A2S3B2-FIX-5d9n 安全 LOW）：steps>50 截断渲染的卡上标注行 */
.plan-trunc { font-size: 11px; color: var(--faint); margin: -6px 0 10px 34px; }
.plan-foot {
  display: flex; gap: 10px; align-items: center; justify-content: space-between; flex-wrap: wrap;
  padding: 9px 12px; border-radius: var(--r-md);
  background: var(--bg-inset); border: 1px solid var(--color-border-subtle);
}
.plan-wait { display: inline-flex; gap: 6px; align-items: center; font-size: 11.5px; font-weight: 600; color: var(--warning-fg); white-space: nowrap; }
.plan-wait .rq-svg { width: 12px; height: 12px; }
.plan-hint { font-size: 11px; color: var(--faint); min-width: 0; text-align: right; }

/* ============================================================
   A2S3b-3（RQ3-UIIMPL-A2S3B3-7k4m）：mini-form 表单卡 .mini-form-card（设计方案
   §5.2 B / §8.1 P2「mini-form schema 渲染卡」——对照 proto-new-components
   「B·对话内嵌 mini-form 卡」）：标题行（form icon+title）→ hint 行 → 字段列表
   （.ffield：.flabel 必填 * 标记 + .finput 文本/数字/下拉）→ 底部状态位+提交按钮
   （必填未填齐禁用）。终态：[data-state="submitted"]（已提交）字段只读化 /
   [data-state="cancelled"]（被后续操作取代）——卡保留在流中作轨迹（A2S2 同款口径）。
   ============================================================ */
.card.mini-form-card { border-color: var(--info-line); }
.mf-head { display: flex; align-items: center; gap: 8px; margin-bottom: 5px; min-width: 0; }
.mf-ico {
  flex: none; width: 26px; height: 26px; border-radius: var(--radius-full);
  background: var(--info-soft); color: var(--info-fg);
  display: inline-flex; align-items: center; justify-content: center;
}
.mf-ico .rq-svg { width: 14px; height: 14px; }
.mf-title { font-size: 13.5px; font-weight: 700; color: var(--text); min-width: 0; overflow-wrap: anywhere; }
.mf-hint { font-size: 11.5px; color: var(--muted); line-height: var(--leading-normal); margin-bottom: 12px; overflow-wrap: anywhere; }
.ffield { margin-bottom: 11px; }
.ffield:last-of-type { margin-bottom: 0; }
.flabel { display: flex; font-size: 12px; font-weight: 600; color: var(--color-text-secondary); margin-bottom: 6px; overflow-wrap: anywhere; }
.flabel .req { color: var(--danger-fg); margin-left: 3px; }
.finput {
  width: 100%; height: 32px; background: var(--bg-inset); border: 1px solid var(--line);
  border-radius: var(--r-sm); padding: 0 10px; color: var(--text);
  font-size: 13px; font-family: inherit; box-sizing: border-box;
}
select.finput { cursor: pointer; }
.finput:focus { outline: none; border-color: var(--brand-400); box-shadow: 0 0 0 3px var(--brand-soft); }
.finput:disabled { opacity: 0.55; cursor: not-allowed; }
.mf-foot {
  display: flex; gap: 8px; align-items: center; justify-content: flex-end;
  margin-top: 13px; padding-top: 11px; border-top: 1px solid var(--color-border-subtle);
}
.mf-state { display: inline-flex; gap: 5px; align-items: center; font-size: 11.5px; color: var(--muted); margin-right: auto; }
.mf-state .rq-svg { width: 12px; height: 12px; }
.mini-form-card[data-state="submitted"] .mf-state { color: var(--success-fg); font-weight: 600; }
.mf-note { font-size: 11px; color: var(--faint); margin-top: 9px; line-height: 1.55; }

/* ---- 任务1 适配：icon+span 结构的条状容器（SVG 与文本基线对齐、间距 8） ---- */
.degraded-strip { display: none; gap: 8px; align-items: baseline; }
body.rq-debug .degraded-strip { display: flex; }
.degraded-strip .rq-svg { flex: none; align-self: center; color: var(--amber); }
.degraded-strip span { min-width: 0; }
.agent-note { display: flex; gap: 8px; align-items: baseline; }
.agent-note .rq-svg { flex: none; align-self: center; }
.agent-note span { min-width: 0; }
.asset-mock-note { display: flex; gap: 8px; align-items: baseline; }
.asset-mock-note .rq-svg { flex: none; align-self: center; }
.asset-mock-note span { min-width: 0; }
.anno-flag .rq-svg { width: 12px; height: 12px; vertical-align: -1.5px; }
.layer-badge .rq-svg { width: 11px; height: 11px; vertical-align: -1px; }
.toolcall-summary .rq-svg { width: 12px; height: 12px; }

/* ---- A2S3A 任务4：品牌壳（设计方案 §5.2 H .brand-shell——下载页/404 独立页统一容器；
     对照 proto-download.html：居中卡 = 字标 + 头部（标题/版本）+ 主内容 + 版本脚行） ---- */
.brand-shell {
  background: var(--color-surface-1); border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-xl); box-shadow: var(--shadow-lg);
  max-width: 640px; width: 100%;
}
.brand-shell-head {
  display: flex; align-items: center; gap: 10px; padding: 14px 20px;
  border-bottom: 1px solid var(--color-border);
}
.brand-shell-head .wordmark { font-size: 14px; font-weight: 700; letter-spacing: 3px; white-space: nowrap; color: var(--text); }
.brand-shell-head .wordmark .q { color: var(--brand); }
.brand-shell-head .st { font-size: 14px; font-weight: 700; color: var(--text); }
.brand-shell-head .smeta { font-size: 11.5px; color: var(--color-text-muted); }
.brand-shell-head .sp { flex: 1; }
.brand-shell-head .ver { font-family: var(--font-mono); font-size: 11px; color: var(--color-text-muted); white-space: nowrap; }
.brand-shell-body { padding: 20px; }
.brand-shell-foot {
  padding: 12px 20px; border-top: 1px solid var(--color-border);
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  font-size: 11px; color: var(--color-text-muted); line-height: 1.6;
}
.brand-shell-foot .sp { flex: 1; }
.brand-shell-foot .mono { font-family: var(--font-mono); }

/* ---- D3（RQ3-UX-D3-9k2f）：扫描发起回执取消控制 + 终态记录只读一行卡 ---- */
/* 发起回执行内 mono（任务号/资源一号 UUID 等宽可复制——persist rows mono 标记恢复侧同款） */
.asset-op-card .mono { font-family: var(--mono); font-size: 11.5px; word-break: break-all; user-select: all; }
/* 发起回执「取消扫描」按钮行（任务进行中显示；终态后整行换 .scan-terminal-note 标注） */
.scan-launch-actions .scan-cancel-btn { display: inline-flex; align-items: center; gap: 5px; }
.scan-launch-actions .scan-terminal-note { display: inline-flex; align-items: center; gap: 5px; font-family: var(--mono); }
/* 终态记录只读一行卡（confirm_record / form_record 会话恢复重放——操作名·决策·时间）：
   独立 class 不与 .asset-op-card/.confirm-card/.mini-form-card 形态断言交叉；不重建可交互
   确认/表单形态（与实时终态卡不双渲染、不误当待确认）。 */
.op-record-card { padding: 10px 14px; }
.op-record-card .op-record-line { display: flex; align-items: center; gap: 7px; font-size: 12px; flex-wrap: wrap; }
.op-record-card .op-record-line .rq-svg { width: 13px; height: 13px; flex: none; }
.op-record-card .op-record-op { font-family: var(--mono); font-size: 11.5px; color: var(--text); word-break: break-all; }
.op-record-card .op-record-sep { color: var(--color-text-muted); }
.op-record-card .op-record-dec { font-weight: 600; color: var(--text); }
.op-record-card .op-record-t { color: var(--color-text-muted); }
.op-record-card .op-record-undo {
  display: flex; gap: 6px; align-items: flex-start; margin-top: 7px; padding-top: 6px;
  border-top: 1px dashed var(--line); font-size: 11px; color: var(--muted); line-height: 1.55;
}
.op-record-card .op-record-undo .rq-svg { width: 12px; height: 12px; flex: none; margin-top: 1px; color: var(--info-fg); }

/* ============================================================
   K1 独立登录页（RQ3-CLOUD-AUTH-K1：login.html 专用，scoped 不触壳）
   仅用既有令牌；品牌红 Q 标 + 居中卡；暗/亮主题随 :root[data-theme] 自动切换。
   ============================================================ */
.login-page {
  min-height: 100vh; min-height: 100dvh;
  display: flex; align-items: center; justify-content: center;
  padding: 24px 16px;
  background:
    radial-gradient(1200px 600px at 50% -10%, color-mix(in srgb, var(--brand) 9%, transparent), transparent 60%),
    var(--bg-canvas);
}
.login-card {
  width: 100%; max-width: 380px;
  background: var(--bg-panel);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-md);
  padding: 26px 24px 20px;
}
.login-brand { display: flex; align-items: center; gap: 12px; margin-bottom: 18px; }
.login-brand-q { width: 44px; height: 44px; flex: none; color: var(--logo-ink); }
.login-brand-text { min-width: 0; }
.login-wordmark {
  font-size: var(--text-xl); font-weight: 700; line-height: 1.25;
  color: var(--text); letter-spacing: 0.3px;
}
.login-subtitle { font-size: var(--text-xs); color: var(--muted); margin-top: 1px; }

.login-alert {
  font-size: var(--text-sm); line-height: 1.55; color: var(--danger-fg);
  background: var(--brand-soft); border: 1px solid color-mix(in srgb, var(--danger-tint) 34%, transparent);
  border-radius: var(--radius-sm); padding: 8px 10px; margin-bottom: 12px;
  word-break: break-word;
}

.login-form { display: flex; flex-direction: column; gap: 12px; }
.login-field-group { display: flex; flex-direction: column; gap: 5px; }
.login-field-group > label { font-size: var(--text-sm); color: var(--muted); font-weight: 500; }
.login-field {
  width: 100%; min-height: 44px;
  background: var(--bg-inset); border: 1px solid var(--line);
  border-radius: var(--radius-sm); color: var(--text);
  font-size: var(--text-base); padding: 8px 11px; font-family: inherit;
}
.login-field::placeholder { color: var(--color-text-muted, var(--muted)); }
.login-field:focus { outline: none; border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-soft-2); }

.login-captcha-row { display: flex; gap: 8px; align-items: stretch; }
.login-captcha-row .login-field { flex: 1; min-width: 0; }
.login-captcha-img {
  height: 44px; width: auto; flex: none;
  border: 1px solid var(--line); border-radius: var(--radius-sm);
  background: var(--bg-inset); cursor: pointer;
}
.login-captcha-img:focus-visible { outline: 2px solid var(--brand); outline-offset: 1px; }
.login-state { font-size: var(--text-xs); color: var(--muted); line-height: 1.5; }

.login-submit { width: 100%; min-height: 44px; font-size: var(--text-base); margin-top: 2px; }
.login-note { font-size: var(--text-xs); color: var(--color-text-muted, var(--muted)); line-height: 1.65; }

.login-sid-fold { margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--line); }
.login-sid-fold > summary {
  cursor: pointer; list-style: none;
  color: var(--muted); font-size: var(--text-sm); min-height: 32px;
  display: flex; align-items: center;
}
.login-sid-fold > summary::-webkit-details-marker { display: none; }
.login-sid-fold > summary .arrow { display: inline-block; margin-right: 6px; transition: transform var(--dur-fast) ease-out; font-size: 11px; }
.login-sid-fold[open] > summary .arrow { transform: rotate(90deg); }
.login-sid-body { margin-top: 8px; display: flex; flex-direction: column; gap: 8px; }
.login-guide-steps { margin: 2px 0 0; padding-left: 20px; font-size: var(--text-sm); line-height: 1.75; color: var(--text); }
.login-guide-steps b { font-weight: 600; }
.login-sid-input {
  width: 100%; resize: vertical;
  background: var(--bg-inset); color: var(--text);
  border: 1px solid var(--line); border-radius: var(--radius-sm);
  padding: 8px 10px; font-size: var(--text-sm); font-family: var(--mono);
}
.login-sid-input:focus { outline: none; border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-soft-2); }
.login-sid-btnrow { display: flex; gap: 8px; align-items: center; }
.login-sid-btnrow .btn { min-height: 36px; }

@media (max-width: 420px) {
  .login-card { padding: 22px 18px 18px; }
}
