/* ============================================================
   Textmolt Chat Pipeline Layer — s02 聊天核心管线（A 路 2026-07-02）
   区块: 1.A1 流式双区   2.B2 Thinking 上台
         3.B5 错误卡     4.B6 停止/继续   5.R1 空态 hero（s03）
   规范: 动效与色彩一律引用 tokens.css v2（T5: 本文件不定义 --tm-）;
         styles.css 冻结令——聊天管线新样式全部落本文件。
   Spec: docs/plans/FRONTEND_UIUX_OVERHAUL_2026-07-02/01_PLAN_CHAT_CORE.md
   ============================================================ */

/* ────────────────────────────────────────────────────────────
   1) A1 · 流式双区：已闭合块以富文本浮现（block-reveal 与既有
      blur-reveal 同族——轻位移 + 退模糊），活动尾块保持逐字弹入。
   ──────────────────────────────────────────────────────────── */
.stream-stable {
  display: flow-root;
}
.stream-stable:empty {
  display: none;
}
.stream-active {
  white-space: pre-wrap;
}
/* 活动区空时不占行高，caret 不悬空 */
.stream-active:empty {
  display: none;
}

.stream-block {
  animation: tm-block-reveal var(--tm-dur-normal) var(--tm-ease-out) both;
}
/* 块内首末元素 margin 收敛：流式块间视差贴近 finalize 后的连续排版（≤4px，plan A1 风险 1） */
.stream-block > :first-child {
  margin-top: 0;
}
.stream-block > :last-child {
  margin-bottom: 0;
}
.stream-block + .stream-block {
  margin-top: var(--tm-space-2);
}
@keyframes tm-block-reveal {
  from {
    opacity: 0;
    transform: translateY(4px);
    filter: blur(3px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
    filter: blur(0);
  }
}

/* ────────────────────────────────────────────────────────────
   2) B2 · Thinking 上台：等待首 token 的生命感。
      dot 标 [data-motion-essential]（HTML 属性）——reduce 下由
      system.css 区块 1 退化为纯不透明度脉冲（reduce ≠ 无反馈）。
      thinking-pulse / thinking-fade keyframes 复用 styles.css 既有定义。
   ──────────────────────────────────────────────────────────── */
.stream-thinking {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 2px 0;
}
.thinking-core-dot {
  flex-shrink: 0;
  width: 10px;
  height: 10px;
  border-radius: var(--tm-radius-full);
  background: rgba(var(--primary-glow-rgb), 0.9);
  box-shadow: 0 0 10px rgba(var(--primary-glow-rgb), 0.55);
  animation: thinking-pulse 1.5s ease-in-out infinite;
}
.thinking-label {
  font-size: var(--tm-text-sm);
  color: var(--text-muted);
  animation: thinking-fade 2s ease-in-out infinite;
}
.stream-thinking.leaving {
  opacity: 0;
  transition: opacity var(--tm-dur-fast) var(--tm-ease-out);
}

/* ────────────────────────────────────────────────────────────
   3) B6b ·「断墨注」（用户 0731 拍板，替换 B5 红警报卡）：
      错误=「这一笔没有落下」。断墨线（实→虚）+ ※ 灰墨陈述 +
      「再试一次」下划线小字 + 诊断码 mono 小注。
      异常态无彩色（0728 拍板延伸到卷面）：零底色/零红/零卡框。
      效果权威 docs/mockups/B6b_ERROR_INKBREAK_v1.html。
   ──────────────────────────────────────────────────────────── */
.chat-error-card {
  max-width: min(100%, calc(var(--tm-space-6) * 15));
  padding: var(--tm-space-1) 0;
  animation: tm-block-reveal var(--tm-dur-normal) var(--tm-ease-out) both;
}

.message-ai .message-bubble.message-bubble--error-card {
  padding: 0;
  white-space: normal;
  line-height: var(--tm-leading-normal);
}
/* 断墨线：一笔写到一半墨干（实→虚渐隐，微倾） */
.chat-error-stroke {
  width: 42px;
  height: 2.5px;
  border-radius: 2px;
  margin-bottom: 9px;
  transform: rotate(-1.2deg);
  background: linear-gradient(90deg, var(--tm-paper-ink-2) 0%, var(--tm-paper-ink-2) 35%, transparent 100%);
}
.chat-error-line {
  display: flex;
  gap: var(--tm-space-2);
  align-items: baseline;
  min-width: 0;
  font-size: var(--tm-text-sm);
  line-height: var(--tm-leading-relaxed);
  color: var(--tm-paper-ink-2);
}
.chat-error-mark {
  flex: none;
  font-family: var(--tm-serif);
  color: var(--tm-cinnabar);
}
.chat-error-msg {
  min-width: 0;
  overflow-wrap: anywhere;
}
.chat-error-meta {
  min-width: 0;
  margin: 5px 0 0 calc(var(--tm-space-2) + 10px);
}
.chat-error-code {
  font-size: 8.5px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--tm-paper-ink-mut);
  font-family: var(--tm-font-mono);
  line-height: var(--tm-leading-tight);
}
.chat-error-code + .chat-error-code {
  margin-top: var(--tm-space-1);
}
.chat-error-retry {
  flex: none;
  padding: 0 0 1px;
  background: none;
  border: none;
  border-bottom: 1px solid var(--tm-paper-hairline-2);
  border-radius: 0;
  font: inherit;
  font-size: var(--tm-text-xs);
  color: var(--tm-paper-ink-2);
  cursor: pointer;
  transition: color var(--tm-dur-fast) var(--tm-ease-out),
    border-color var(--tm-dur-fast) var(--tm-ease-out);
}
.chat-error-retry:hover {
  color: var(--tm-ink-purple);
  border-color: var(--tm-ink-purple);
}

/* 换笔分隔入墨（同批轻改）：胶囊卸皮，两侧发丝线 + 灰墨小字；
   模型品牌色变体一并压回灰墨（三墨秩序：工具=灰）。 */
.message-model-switch {
  gap: 10px;
}
.message-model-switch::before,
.message-model-switch::after {
  content: "";
  flex: 1;
  border-top: 1px solid var(--tm-paper-hairline);
  transform: translateY(1px);
}
.model-switch-badge,
.model-switch-badge.text-blue,
.model-switch-badge.text-green,
.model-switch-badge.text-orange,
.model-switch-badge.text-purple {
  flex: none;
  background: transparent;
  border: none;
  border-radius: 0;
  padding: 0;
  font-size: 10px;
  font-weight: var(--tm-weight-regular);
  letter-spacing: 0.08em;
  color: var(--tm-paper-ink-mut);
}

/* ────────────────────────────────────────────────────────────
   4) B6 · 停止/继续：止损不弃疗（A4-(5) stop-marker 除迁 cssText）。
      入场带一点 spring 物理感，与发送按钮 F2 家族同节奏。
   ──────────────────────────────────────────────────────────── */
.stop-marker {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-top: 8px;
  font-size: var(--tm-text-xs);
  color: var(--text-muted);
  opacity: 0.85;
  animation: tm-stop-settle var(--tm-dur-normal) var(--tm-ease-spring) both;
}
@keyframes tm-stop-settle {
  from {
    opacity: 0;
    transform: translateY(3px) scale(0.98);
  }
  to {
    opacity: 0.85;
    transform: translateY(0) scale(1);
  }
}
.stop-continue-btn {
  margin-left: 4px;
  padding: 3px 10px;
  border-radius: var(--tm-radius-full);
  font-size: var(--tm-text-2xs);
  font-weight: var(--tm-weight-semibold);
  cursor: pointer;
  color: rgb(var(--primary-glow-rgb));
  background: rgba(var(--primary-glow-rgb), 0.08);
  border: 1px solid rgba(var(--primary-glow-rgb), 0.25);
  transition: background var(--tm-dur-fast) var(--tm-ease-out),
    transform var(--tm-dur-fast) var(--tm-ease-spring);
}
.stop-continue-btn:hover {
  background: rgba(var(--primary-glow-rgb), 0.16);
  transform: translateY(-1px);
}
.stop-continue-btn:active {
  transform: translateY(0) scale(0.96);
}

/* ────────────────────────────────────────────────────────────
   5) 观墨窗空态（B5 刀① 收敛版）：空态只剩落墨问候；
      题记/门楣签在常驻刊头（masthead.css），纸面铺底全局化（下方 body 规则）；
      dark = 夜书房 token 翻转，reduce 下动画由 system.css 全局层退化。
   ──────────────────────────────────────────────────────────── */
.chat-welcome-slot {
  display: contents;
}
/* 全局纸面铺底（用户 0728「彻底清除旧前端观感」）：不再只在空态铺纸——
   任何状态（会话/登出提示/错误）都落在纸上，旧灰蓝网格底彻底退场；
   thread 面族的纸面化（便笺/落墨）随刀③ 收编。 */
body {
  background: linear-gradient(var(--tm-paper-veil), var(--tm-paper-veil)), var(--tm-paper-texture) var(--tm-paper);
  background-size: auto, 300px 300px;
}
.ambient-mesh-container {
  display: none;
}
.chat-welcome {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  text-align: left;
  margin: 0;
  padding: 6px 0 20px;
  animation: tm-welcome-rise var(--tm-dur-slow) var(--tm-ease-expo) both;
}
.chat-welcome-greet {
  margin-top: 30px;
  font-family: var(--tm-serif);
  font-size: 23px;
  line-height: 1.4;
  color: var(--tm-paper-ink);
}
.chat-welcome-greet em {
  font-style: normal;
  color: var(--tm-ink-purple-strong);
}
@keyframes tm-welcome-rise {
  from {
    opacity: 0;
    transform: translateY(8px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
.chat-welcome.leaving {
  opacity: 0;
  transform: translateY(-10px) scale(0.98);
  transition: opacity var(--tm-dur-normal) var(--tm-ease-out),
    transform var(--tm-dur-normal) var(--tm-ease-out);
}

/* ────────────────────────────────────────────────────────────
   6) s06 打磨批（01_PLAN C1/C2/C4/C8）：长会话性能 / 滚动语义 /
      代码块折叠 / 同模型分组与压缩段隐藏。
   ──────────────────────────────────────────────────────────── */

/* C1 · 恢复会话批量化：restoring 期间禁入场动画，瞬时呈现无群舞 */
.chat.restoring .message {
  animation: none;
  opacity: 1;
  transform: none;
}

/* C1 · 渐进渲染裁剪：视口外消息跳过渲染（Chromium 85+ 生效，旧内核忽略；
   入场动画只在视口内触发，与 slide-in-up 共存无冲突） */
.chat .message {
  content-visibility: auto;
  contain-intrinsic-size: auto 72px;
}

/* C2 · 离底期间收到新增量：scroll-status 按钮亮圆点 */
/* 定位祖先 = composer-container（按钮在 glass-panel 之外，免受其 overflow:hidden 裁切） */
.composer-container {
  position: relative;
}

.composer-glass-panel {
  position: relative;
}

#btn-scroll-status.scroll-status-btn {
  position: absolute;
  /* U8c：移至左列 "+" 按钮正上方（用户反馈恢复旧布局：↓ 在 ➕ 之上） */
  inset-inline-start: var(--tm-space-3);
  bottom: calc(100% + var(--tm-space-2));
  width: var(--tm-space-6);
  height: var(--tm-space-6);
  padding: 0;
  overflow: visible;
  color: var(--tm-brand-blue);
  background: var(--tm-glass-bg-strong);
  border: 1px solid color-mix(in srgb, var(--tm-brand-blue) 28%, transparent);
  box-shadow: var(--tm-shadow-2);
  opacity: 0;
  pointer-events: none;
  transform: translateY(var(--tm-space-2)) scale(0.96);
  transition:
    opacity var(--tm-dur-fast) var(--tm-ease-out),
    transform var(--tm-dur-fast) var(--tm-ease-out),
    background var(--tm-dur-fast) var(--tm-ease-out),
    border-color var(--tm-dur-fast) var(--tm-ease-out);
}

#btn-scroll-status.scroll-status-btn.scrolled-up {
  height: var(--tm-space-6);
  opacity: 1;
  pointer-events: auto;
  transform: translateY(0) scale(1);
  background: var(--tm-glass-bg);
}

#btn-scroll-status.scroll-status-btn.scrolled-up:hover {
  background: var(--tm-glass-bg-strong);
  border-color: color-mix(in srgb, var(--tm-brand-blue) 42%, transparent);
  transform: translateY(0) scale(1);
}

.scroll-status-btn.has-new {
  position: relative;
}
.scroll-status-btn.has-new::after {
  content: "";
  position: absolute;
  top: 2px;
  right: 2px;
  width: 6px;
  height: 6px;
  border-radius: var(--tm-radius-full);
  background: rgb(var(--primary-glow-rgb));
  box-shadow: 0 0 6px rgba(var(--primary-glow-rgb), 0.8);
}

/* C4 · 代码块 sticky 语言头：wrapper 放开裁剪（圆角改由首尾元素自持），
   header 粘在 chat 视口顶；悬浮时背后是代码文字 → 底色必须不透明 */
.markdown-body .code-block-wrapper {
  overflow: visible;
}
.markdown-body .code-block-header {
  position: sticky;
  top: 0;
  z-index: 1;
  border-radius: 12px 12px 0 0;
  background: #1a212e; /* ≈ 原 3% white 叠加 #111827 的不透明合成值 */
}
:root[data-theme="dark"] .markdown-body .code-block-header {
  background: #161616; /* ≈ 原 rgba(30,30,30,.4) 叠加 #0a0a0a */
}
.markdown-body .code-block-wrapper pre {
  border-radius: 0 0 12px 12px;
}

/* C4 · 超长代码块折叠：380px 渐隐窗口 + 尾部展开按钮 */
.markdown-body .code-block-wrapper.collapsed pre {
  max-height: 380px;
  overflow: hidden;
  border-radius: 0;
  -webkit-mask-image: linear-gradient(to bottom, #000 82%, transparent);
  mask-image: linear-gradient(to bottom, #000 82%, transparent);
}
.markdown-body .code-expand-btn {
  width: 100%;
  padding: 8px;
  font-size: var(--tm-text-2xs);
  font-weight: var(--tm-weight-semibold);
  letter-spacing: 0.02em;
  color: var(--text-muted);
  background: transparent;
  border: none;
  border-top: 1px solid rgba(255, 255, 255, 0.06);
  border-radius: 0 0 12px 12px;
  cursor: pointer;
  transition: color var(--tm-dur-fast) var(--tm-ease-out),
    background var(--tm-dur-fast) var(--tm-ease-out);
}
.markdown-body .code-expand-btn:hover {
  color: var(--text-secondary);
  background: rgba(255, 255, 255, 0.04);
}

/* C8 · 同模型连答折叠 sender：分组视觉（gap 28px 视觉折半） */
.message-ai--cont .message-sender {
  display: none;
}
.message-ai--cont {
  margin-top: -14px;
}

/* C8 · 压缩段隐藏（display:none 表达「已压缩不再计入上下文」的真实语义，
   直接减负渲染——与 C1 相辅）；show-compacted 下降透明恢复可见 */
.message.compacted {
  display: none;
}
.chat.show-compacted .message.compacted {
  display: flex;
  opacity: 0.55 !important; /* 压过 styles.css 的 0.22 !important 存量补丁 */
  filter: none;
}
.compacted-toggle {
  align-self: center;
  padding: 4px 12px;
  max-width: 800px;
  border-radius: var(--tm-radius-full);
  font-size: var(--tm-text-2xs);
  font-weight: var(--tm-weight-medium);
  color: var(--text-muted);
  background: var(--tm-glass-bg-faint);
  border: 1px solid var(--tm-brand-purple-alpha-10);
  cursor: pointer;
  transition: color var(--tm-dur-fast) var(--tm-ease-out),
    border-color var(--tm-dur-fast) var(--tm-ease-out),
    transform var(--tm-dur-fast) var(--tm-ease-spring);
}
.compacted-toggle:hover {
  color: var(--text-secondary);
  border-color: var(--tm-brand-purple-alpha-28);
  transform: translateY(-1px);
}
.compacted-toggle:active {
  transform: translateY(0) scale(0.97);
}

/* ────────────────────────────────────────────────────────────
   7) E§5.5 · 回访「上次进度」卡（>4h 回流时消息流末尾轻卡）：
      玻璃底 + 品牌紫点缀，与消息流形态区隔但不喧宾。
   ──────────────────────────────────────────────────────────── */
.resume-card {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 8px 12px;
  width: 100%;
  max-width: 800px;
  margin: 0 auto;
  padding: 10px 14px;
  border-radius: var(--tm-radius-xl);
  background: var(--tm-glass-bg-faint);
  border: 1px solid var(--tm-brand-purple-alpha-10);
  animation: tm-block-reveal var(--tm-dur-normal) var(--tm-ease-out) both;
}
.resume-card-body {
  display: flex;
  align-items: center;
  gap: 8px;
  min-width: 0;
}
.resume-card-clock {
  flex-shrink: 0;
  display: inline-flex;
  color: var(--tm-brand-purple);
  opacity: 0.85;
}
.resume-card-text {
  font-size: var(--tm-text-xs);
  line-height: 1.5;
  color: var(--text-muted);
}
.resume-card-actions {
  display: flex;
  gap: 8px;
  margin-left: auto;
}
.resume-card-btn {
  padding: 4px 12px;
  border-radius: var(--tm-radius-full);
  font-size: var(--tm-text-2xs);
  font-weight: var(--tm-weight-semibold);
  cursor: pointer;
  color: var(--text-secondary);
  background: transparent;
  border: 1px solid var(--tm-brand-purple-alpha-10);
  transition: color var(--tm-dur-fast) var(--tm-ease-out),
    border-color var(--tm-dur-fast) var(--tm-ease-out),
    transform var(--tm-dur-fast) var(--tm-ease-spring);
}
.resume-card-btn:hover {
  border-color: var(--tm-brand-purple-alpha-28);
  transform: translateY(-1px);
}
.resume-card-btn:active {
  transform: translateY(0) scale(0.97);
}
.resume-card-btn--primary {
  color: rgb(var(--primary-glow-rgb));
  background: rgba(var(--primary-glow-rgb), 0.08);
  border-color: rgba(var(--primary-glow-rgb), 0.25);
}

/* ────────────────────────────────────────────────────────────
   P2-10（0723 真机）：welcome 首屏不满一屏也能滚——罪魁是常驻 180px 垫片。
   welcome 态把垫片改为「可收缩弹性垫」：空间富余保持 composer 遮挡预留，
   空间不足先收缩垫片（至 12px）再让页面滚动 → 内容装得下就绝不出滚动条。
   不支持 :has() 的老 WebView 维持常驻垫片（安全回退，只是可多滚一段）。
   ──────────────────────────────────────────────────────────── */
@supports selector(:has(*)) {
  .chat:has(.chat-welcome) .chat-spacer {
    height: auto;
    flex: 0 1 var(--composer-safe-area);
    min-height: 12px;
  }
  .chat:has(.chat-welcome) .chat-welcome {
    flex-shrink: 0;
  }
}

/* 署名开卷门（guest 空态 composer 位；复用 .ink-signin-row 词汇，微调进 composer 容器） */
.composer-signin-door {
  margin: 0 4px 8px;
  width: calc(100% - 8px);
}
.composer-signin-door.hidden { display: none; }

/* ============================================================
   B5 刀③ · 对话流纸面化（2026-07-31）
   效果权威 = docs/mockups/B5_SCROLL_THREAD_v2.html 幕三。
   三墨秩序：玄=AI 正文、朱=你的手书、灰=工具、紫=AI 动作。
   本区覆盖 styles.css 旧气泡皮（同特异度选择器靠加载顺序后置取胜）。
   ============================================================ */

/* ── 你的话 = 朱批便笺：band 纸 + 细边 + 微影 + 楷体朱墨；
      倾斜挂在 content 包壳上（气泡自带 projectile 动画会吃掉 transform）── */
body:not([data-bubble-theme="white"]) .message-user .message-bubble,
body[data-bubble-theme="white"] .message-user .message-bubble {
  background: var(--tm-paper-band);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  border: 1px solid var(--tm-paper-hairline);
  border-radius: 9px 9px 9px 3px;
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06);
  padding: 9px 13px;
  font-family: var(--tm-kai);
  font-weight: var(--tm-weight-regular);
  font-size: 13.5px;
  line-height: 1.75;
  color: var(--tm-cinnabar);
  filter: none;
}
body:not([data-bubble-theme="white"]) .message-user .message-bubble:hover,
body[data-bubble-theme="white"] .message-user .message-bubble:hover {
  background: var(--tm-paper-band);
  filter: none;
}
/* 便笺没入刊头/案头下方时不发光：纸片只是压深一点影 */
body:not([data-bubble-theme="white"]) .message-user .message-bubble.submerged,
body[data-bubble-theme="white"] .message-user .message-bubble.submerged {
  color: var(--tm-cinnabar);
  border-color: var(--tm-paper-hairline-2);
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  filter: none;
}
/* 暗档便笺：styles.css 的 dark 气泡补丁（白 6% 透明玻璃）特异度更高，压回夜纸 */
:root[data-theme="dark"] body:not([data-bubble-theme="white"]) .message-user .message-bubble,
:root[data-theme="dark"] body[data-bubble-theme="white"] .message-user .message-bubble,
:root[data-theme="dark"] body:not([data-bubble-theme="white"]) .message-user .message-bubble:hover,
:root[data-theme="dark"] body[data-bubble-theme="white"] .message-user .message-bubble:hover {
  background: var(--tm-paper-band);
}
.message-user .message-content {
  transform: rotate(-0.4deg);
}
.message-user.message-user--alt .message-content {
  transform: rotate(0.35deg);
}
.message-user.message-user--alt .message-bubble {
  border-radius: 9px 9px 3px 9px;
}
/* 西文手书 = Georgia italic + rubric（楷体族对拉丁字形回落 Georgia，补斜体） */
html[lang^="en"] .message-user .message-bubble {
  font-style: italic;
}

/* ── AI = 玄墨衬线正文直接落墨（无气泡、无头像、无 sender 行）── */
.message-ai .message-avatar {
  display: none;
}
.message-sender {
  display: none;
}
.message-ai--cont {
  margin-top: 0;
}
.message-ai .message-bubble {
  font-family: var(--tm-serif);
  font-size: 14.5px;
  line-height: 1.75;
  color: var(--tm-paper-ink);
}

/* ── 代码 = 抄件框（mockup .copybox：raised 纸 + 发丝边 + 灰墨 mono）── */
.message-ai .markdown-body .code-block-wrapper {
  background: var(--tm-paper-raised);
  border: 1px solid var(--tm-paper-hairline);
  border-radius: 8px;
  box-shadow: none;
}
.message-ai .markdown-body .code-block-wrapper:hover {
  box-shadow: none;
  border-color: var(--tm-paper-hairline-2);
  transform: none;
}
.message-ai .markdown-body .code-block-header {
  background: var(--tm-paper-band);
  border-bottom: 1px solid var(--tm-paper-hairline);
  border-radius: 8px 8px 0 0;
}
:root[data-theme="dark"] .message-ai .markdown-body .code-block-header {
  background: var(--tm-paper-band);
}
.message-ai .markdown-body .code-lang {
  color: var(--tm-paper-ink-mut);
}
/* 抄件框不做 Mac 窗控点仪式（纸面无窗） */
.message-ai .markdown-body .code-lang::before {
  display: none;
}
.message-ai .markdown-body .code-block-wrapper pre {
  border-radius: 0 0 8px 8px;
}
.message-ai .markdown-body pre code {
  color: var(--tm-paper-ink-2);
  font-size: 11.5px;
}
/* hljs 语法色改墨系（原 VS-dark palette 是暗底色，压不上纸面）；
   built_in/title/params 一并入墨（k3 轮实证 open/print/len 漏成青绿） */
.message-ai .markdown-body pre .hljs-keyword { color: var(--tm-ink-purple-strong); }
.message-ai .markdown-body pre .hljs-string { color: var(--tm-cinnabar); font-style: normal; }
.message-ai .markdown-body pre .hljs-number { color: var(--tm-paper-exlibris-2); }
.message-ai .markdown-body pre .hljs-comment { color: var(--tm-paper-ink-mut); font-style: italic; }
.message-ai .markdown-body pre .hljs-function { color: var(--tm-paper-exlibris); }
.message-ai .markdown-body pre .hljs-built_in,
.message-ai .markdown-body pre .hljs-title,
.message-ai .markdown-body pre .hljs-params,
.message-ai .markdown-body pre .hljs-attr { color: var(--tm-paper-exlibris); }
/* 暗档抄件框：styles.css 的 dark 补丁（#0a0a0a 黑 slab + VS-dark 色）特异度更高，
   逐条压回夜书房纸系（k3 轮实证） */
:root[data-theme="dark"] .message-ai .markdown-body .code-block-wrapper {
  background: var(--tm-paper-raised);
  border-color: var(--tm-paper-hairline);
}
:root[data-theme="dark"] .message-ai .markdown-body pre code {
  color: var(--tm-paper-ink-2);
}
:root[data-theme="dark"] .message-ai .markdown-body pre .hljs-keyword { color: var(--tm-ink-purple-strong); }
:root[data-theme="dark"] .message-ai .markdown-body pre .hljs-string { color: var(--tm-cinnabar); font-style: normal; }
:root[data-theme="dark"] .message-ai .markdown-body pre .hljs-number { color: var(--tm-paper-exlibris-2); }
:root[data-theme="dark"] .message-ai .markdown-body pre .hljs-comment { color: var(--tm-paper-ink-mut); }
:root[data-theme="dark"] .message-ai .markdown-body pre .hljs-function,
:root[data-theme="dark"] .message-ai .markdown-body pre .hljs-built_in,
:root[data-theme="dark"] .message-ai .markdown-body pre .hljs-title,
:root[data-theme="dark"] .message-ai .markdown-body pre .hljs-params,
:root[data-theme="dark"] .message-ai .markdown-body pre .hljs-attr { color: var(--tm-paper-exlibris); }
/* 抄件框「复制」钮：撤玻璃药丸改纸上细字（copied 态紫墨确认，不上绿灯） */
.message-ai .markdown-body .code-copy-btn {
  border: 1px solid var(--tm-paper-hairline);
  color: var(--tm-paper-ink-mut);
  background: transparent;
  font-family: inherit;
}
.message-ai .markdown-body .code-copy-btn:hover {
  background: transparent;
  color: var(--tm-ink-purple-strong);
  border-color: var(--tm-ink-purple-strong);
}
.message-ai .markdown-body .code-copy-btn.copied {
  background: transparent;
  border-color: var(--tm-ink-purple-strong);
  color: var(--tm-ink-purple-strong);
}
.message-ai .markdown-body .code-expand-btn {
  color: var(--tm-paper-ink-mut);
  border-top: 1px solid var(--tm-paper-hairline);
}
.message-ai .markdown-body .code-expand-btn:hover {
  color: var(--tm-paper-ink-2);
  background: var(--tm-paper-band);
}

/* ── 页边小工具（誊入文档/复制/钉入记忆）：灰墨小字，hover 现身已有全局律 ── */
.message-actions {
  gap: 12px;
}
.message-action-btn {
  width: auto;
  height: auto;
  padding: 2px 3px;
  border: 0;
  background: transparent;
  color: var(--tm-paper-ink-mut);
  font-size: 10px;
  letter-spacing: 0.06em;
  border-radius: var(--tm-radius-xs);
}
.message-action-btn svg {
  display: none;
}
.message-action-btn .ma-label {
  pointer-events: none;
}
.message-action-btn:hover,
.message-action-btn.primary:hover {
  color: var(--tm-ink-purple-strong);
  background: transparent;
  border-color: transparent;
  box-shadow: none;
  transform: none;
}
.message-action-btn.primary,
.message-action-btn.pin-btn {
  color: var(--tm-paper-ink-mut);
}
.message-action-btn.memory-btn.is-memorized {
  color: var(--tm-ink-purple-strong);
}
:root[data-theme="dark"] .message-action-btn.primary:hover {
  background: transparent;
  border-color: transparent;
}

/* ── 流式 = 墨滴光标（紫墨呼吸；替代旧竖线光标）── */
.typing-cursor::after {
  width: 7px;
  height: 13px;
  background: var(--tm-brand-purple);
  border-radius: 40% 40% 55% 55%;
  box-shadow: none;
  margin-left: 3px;
  top: 1px;
  animation: tm-inkpulse 1.1s ease-in-out infinite;
}
@keyframes tm-inkpulse {
  0%, 100% { opacity: 0.9; transform: scale(1); }
  50% { opacity: 0.45; transform: scale(0.86); }
}

/* ── 随稿适配纸面：回到底部钮 / 回访卡 / 压缩段钮 / 交接卡（撤玻璃改纸）── */
#btn-scroll-status.scroll-status-btn {
  color: var(--tm-ink-purple-strong);
  background: var(--tm-paper-raised);
  border: 1px solid var(--tm-paper-hairline-2);
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
#btn-scroll-status.scroll-status-btn.scrolled-up,
#btn-scroll-status.scroll-status-btn.scrolled-up:hover {
  background: var(--tm-paper-raised);
  border-color: var(--tm-paper-hairline-2);
}
.resume-card {
  background: var(--tm-paper-band);
  border: 1px solid var(--tm-paper-hairline);
}
.resume-card-text {
  color: var(--tm-paper-ink-2);
}
.compacted-toggle {
  background: var(--tm-paper-band);
  border: 1px solid var(--tm-paper-hairline);
  color: var(--tm-paper-ink-mut);
}
.compacted-toggle:hover {
  color: var(--tm-paper-ink-2);
  border-color: var(--tm-paper-hairline-2);
}
.baton-pass-card {
  background: var(--tm-paper-band);
  border: 1px solid var(--tm-paper-hairline);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
}
.baton-pass-text {
  color: var(--tm-paper-ink-2);
}
.baton-tag {
  background: var(--tm-paper-raised);
  border: 1px solid var(--tm-paper-hairline);
  color: var(--tm-paper-ink-2);
  box-shadow: none;
}
/* 引用 chip（sk-cite-chip）底面随纸（描边/防伪语义在 zotero.css 不动） */
.message-ai .sk-cite-chip {
  background: var(--tm-paper-raised);
}

/* ── 表格入墨（0731 用户实证：旧靛紫斑马纹压不上纸面）——
      表头 band 纸 + 发丝线格 + 玄墨字；斑马行 raised 纸 ── */
.message-ai .markdown-body table {
  font-size: 12.5px;
}
.message-ai .markdown-body th,
.message-ai .markdown-body td {
  border: 1px solid var(--tm-paper-hairline);
  color: var(--tm-paper-ink-2);
}
.message-ai .markdown-body th {
  background: var(--tm-paper-band);
  color: var(--tm-paper-ink);
  font-weight: var(--tm-weight-semibold);
}
.message-ai .markdown-body tr:nth-child(even) {
  background: var(--tm-paper-raised);
}

/* ════════════════════════════════════════════════════════════
   InlineBanner 纸上告示化（0813 采纳 AUDIT A-2）：彩底警报卡→纸上告示。
   四 type 语义与 JS 结构零改动；error 以朱砂短界线标级，warning 以
   hairline-2，其余同底同边——异常语言与聊天内断墨注同族。
   ════════════════════════════════════════════════════════════ */
.inline-banner,
.inline-banner.banner-info,
.inline-banner.banner-warning,
.inline-banner.banner-error,
.inline-banner.banner-success {
  background: var(--tm-paper-band);
  border: 1px solid var(--tm-paper-hairline);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}
.inline-banner.banner-error {
  border-left: 2px solid var(--tm-cinnabar);
}
.inline-banner.banner-warning {
  border-left: 2px solid var(--tm-paper-hairline-2);
}
/* 彩色图标退场：告示只靠文字说话 */
.inline-banner .banner-icon-wrapper {
  display: none;
}
.inline-banner .banner-message {
  color: var(--tm-paper-ink-2);
  font-size: 12.5px;
}
/* 实心紫按钮退场（全 app 实心只留 send）：描边小字钮 */
.inline-banner .banner-btn-primary {
  background: none;
  border: 1px solid var(--tm-paper-hairline-2);
  color: var(--tm-ink-purple-strong);
}
.inline-banner .banner-btn-primary:hover {
  background: var(--tm-paper-raised);
  transform: none;
}
.inline-banner .banner-btn-secondary {
  border-color: var(--tm-paper-hairline-2);
  color: var(--tm-paper-ink-2);
}

/* 系统提示（msg.meta）入纸（0813 采纳 AUDIT A-3）：摘工程感虚线框，
   断墨注同族排印——无框、※ 前缀、灰墨居左 */
.msg.meta {
  align-self: flex-start;
  border: 0;
  background: transparent;
  color: var(--tm-paper-ink-2);
  padding: 4px 0;
}
.msg.meta::before {
  content: "※ ";
  color: var(--tm-paper-ink-mut);
}
