/* ═══════════════════════════════════════════════════
   M-Model V3 — Components
   按钮 / Badge / 卡片 / 输入框 / 行列表 / 骨架屏 / 弹窗
   ═══════════════════════════════════════════════════ */

/* ─── reduced-motion 全局兜底 (2026-09-26 卫生批 P3-2, 9-16 审计方案) ───
   34 组 keyframes 此前仅 1 处单点豁免; 前庭障碍用户/省电模式下全局动效归零。
   强状态指示豁免: 加载转圈/骨架屏保留(没了"加载中"反馈=用户以为卡死)。 */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
  /* 加载 spinner 豁免(community.css .cr-spinner / 本文件 .v3-dia-spin) */
  .cr-spinner, .v3-dia-spin {
    animation-duration: 700ms !important;
    animation-iteration-count: infinite !important;
  }
  /* 骨架屏豁免(.v3-skeleton / .v3-skeleton-line / 问卷 .v3-survey-skel-line) */
  .v3-skeleton, .v3-skeleton-line, .v3-survey-skel-line {
    animation-duration: 1.5s !important;
    animation-iteration-count: infinite !important;
  }
}

/* ─── Icon system ─── */
.v3-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  line-height: 0;
}
.v3-icon svg {
  width: 20px; height: 20px;
  stroke: currentColor;
  fill: none;
  stroke-width: 1.6;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.v3-icon-sm svg {
  width: 16px; height: 16px;
  stroke-width: 1.8;
}

/* ─── Buttons ─── */
/* 2026-08-14 需求5: 全局按钮/可点控件禁文字选择——电脑/PWA 环境连点按钮不再误触发选区高亮。
   仅禁按钮类(button标签+点击组件类), 不碰正文文本(聊天/帖子文字仍可复制)。 */
button,
.v3-btn,
.v3-icon-btn,
.v3-tab-item,
.v3-chip,
.v3-tag,
.v3-item-action,
.v3-list-item,
[role="button"] {
  -webkit-user-select: none;
  -moz-user-select: none;
  user-select: none;
  -webkit-touch-callout: none;
}

.v3-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--sp-xs);
  padding: 8px 16px;
  border-radius: var(--radius-md);
  border: none;
  font-family: inherit;
  font-size: var(--t-body);
  font-weight: 600;
  cursor: pointer;
  position: relative;   /* 动效批1 8A: 涟漪定位容器 */
  overflow: hidden;     /* 动效批1 8A: 裁涟漪出界 */
  transition: opacity .12s, transform .12s, border-color .12s, color .12s, background .12s;
}

.v3-btn:active { transform: scale(.97); }
.v3-btn:disabled { opacity: .4; cursor: not-allowed; transform: none; }

.v3-btn-primary {
  background: var(--c-accent);
  color: var(--c-accent-text);
}
.v3-btn-primary:hover { opacity: .9; }

.v3-btn-secondary {
  background: transparent;
  border: 1px solid var(--c-border-2);
  color: var(--c-text-2);
}
.v3-btn-secondary:hover {
  border-color: var(--c-accent-border);
  color: var(--c-accent);
}

.v3-btn-ghost {
  background: transparent;
  border: none;
  color: var(--c-accent);
  padding: 9px 14px;
  min-height: 40px;        /* 小米8触控区≥40,治历史/新对话溢出 */
}
.v3-btn-ghost:hover { opacity: .8; }
/* 导出长图按钮(chat工具栏):小米8"导出长图"4字+图标溢出14px治本 */
.v3-qa-export-btn { padding: 9px 14px; min-height: 40px; }

/* Quick action button (used in dashboard header) */
.v3-quick-btn {
  display: inline-flex;
  align-items: center;
  flex-shrink: 0;          /* 防flex父容器压缩致长文本溢出(小米8快捷问题栏) */
  gap: var(--sp-xs);
  padding: 12px 14px;  /* 8→12px(审计P2): 触摸目标扩44, 多行文本时min-height保底 */
  min-height: 44px;
  border-radius: var(--radius-md);
  border: 1px solid var(--c-border-2);
  font-size: 12px;
  line-height: 1.35;
  white-space: normal;     /* 长问题文本自然换行不溢出截断 */
  color: var(--c-text-2);
  background: transparent;
  cursor: pointer;
  font-family: inherit;
  transition: border-color .12s, color .12s;
}
.v3-quick-btn:hover {
  border-color: var(--c-accent-border);
  color: var(--c-accent);
}

/* ─── Badges ─── */
.v3-badge {
  display: inline-flex;
  padding: 2px 7px;
  border-radius: var(--radius-sm);
  font-size: 11px;
  font-weight: 500;
}
.v3-badge-up   { background: var(--c-up-bg);   color: var(--c-up); }
.v3-badge-accent { background: var(--c-accent-bg); color: var(--c-accent); }
.v3-badge-down { background: var(--c-down-bg); color: var(--c-down); }
.v3-badge-neutral { background: var(--c-surface-2); color: var(--c-text-2); }
.v3-badge-warning { background: rgba(245,158,11,0.12); color: #f59e0b; }
.v3-btn-danger { background: var(--c-up); color: #fff; }
.v3-btn-danger:hover { background: #dc2626; }

/* ─── Cards ─── */
.v3-card {
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  border-radius: var(--radius-md);
  transition: border-color .12s;
}
.v3-card:hover {
  border-color: var(--c-accent-border);
}

/* ─── Stat Card ─── */
.v3-stat-card {
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  border-radius: var(--radius-md);
  padding: var(--sp-sm) var(--sp-md);
}
.v3-stat-num {
  font-size: var(--t-stat-sm);
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--c-text);
}
.v3-stat-label {
  font-size: 11px;
  color: var(--c-text-3);
  margin-top: 2px;
}
.v3-stat-blue .v3-stat-num { color: var(--c-accent, #818cf8); }
.v3-stat-green .v3-stat-num { color: #34d399; }
.v3-stat-amber .v3-stat-num { color: #f59e0b; }
.v3-stat-red .v3-stat-num { color: var(--c-up); }

/* ─── Rise / Fall colors (大陆习惯：红涨绿跌) ─── */
/* 需求3 A+D(2026-07-07): 涨跌色升级圆角pill(主题变量+淡背景胶囊), 强调感
   box-decoration-break:clone(🟠-2收口) 长文本跨行时每段独立圆角, 不破损 */
.v3-rise { color: var(--c-up); font-weight: 600; background: var(--c-up-bg); padding: 0 6px; border-radius: 8px; -webkit-box-decoration-break: clone; box-decoration-break: clone; }
.v3-fall { color: var(--c-down); font-weight: 600; background: var(--c-down-bg); padding: 0 6px; border-radius: 8px; -webkit-box-decoration-break: clone; box-decoration-break: clone; }
.v3-flat { color: var(--c-text-2); }
.v3-stat-sub {
  font-size: 11px;
  margin-top: 2px;
}

/* ─── Input ─── */
.v3-input {
  width: 100%;
  padding: 8px 14px;
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  border-radius: var(--radius-md);
  color: var(--c-text);
  font-family: inherit;
  font-size: var(--t-body);
  outline: none;
  transition: border-color .12s;
}
.v3-input::placeholder { color: var(--c-text-3); }
.v3-input:focus { border-color: var(--c-accent); }

/* Search input wrapper */
.v3-search {
  display: flex;
  align-items: center;
  gap: var(--sp-sm);
  padding: 8px 14px;
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  border-radius: var(--radius-md);
  color: var(--c-text-3);
  font-size: var(--t-body);
  cursor: text;
  transition: border-color .12s;
}
.v3-search:focus-within { border-color: var(--c-accent); }
.v3-search input {
  flex: 1;
  background: transparent;
  border: none;
  outline: none;
  color: var(--c-text);
  font-family: inherit;
  font-size: inherit;
}
.v3-search input::placeholder { color: var(--c-text-3); }

/* ─── Pills / Filters ─── */
.v3-pill {
  display: inline-flex;
  flex-shrink: 0;          /* 不被父容器压缩(v497 起横滚模式正好需要: 放不下就溢出待滑, 不挤不换行) */
  padding: 7px 15px;
  border-radius: 6px;
  font-size: 12px;
  font-weight: 500;
  background: var(--c-surface-2);
  color: var(--c-text-2);
  cursor: pointer;
  border: none;
  font-family: inherit;
  transition: background .12s, color .12s;
  white-space: nowrap;
}
/* 触摸目标扩44px(审计P2): 视觉不变, ::before隐形热区上下各扩9px(30→48高) */
.v3-pill { position: relative; }
.v3-pill::before { content: ''; position: absolute; inset: -9px 0; }
.v3-pill:hover { color: var(--c-text); }
.v3-pill.active {
  background: var(--c-accent-bg);
  color: var(--c-accent);
}

/* ─── 单行横滑+末尾渐隐行(v497 2026-10-11 主人令) ───
   内容库博主切换器/热词栏: 同一行放不下就横向滑动, 末尾渐隐示意可滑。
   1:1 复刻聊天室顶部房间胶囊行 .cr-tabs-inner v422 范式(主人 9-06 亲定参数):
   overflow-x:auto + 藏滚动条 + mask black 70%→transparent 100% + padding-right 8% 纯透明带。
   mask 恒定打在容器视口上(滚动时右端始终渐隐), 与聊天室行为一致。 */
.v3-hscroll-row {
  overflow-x: auto; overflow-y: hidden;
  /* padding-top 必须留: overflow 裁剪边界=padding box, 限免角标 top:-7px+描边探出 pill 顶 ~8.5px,
     无 padding 则移动端溢出滚动时角标顶被 overflow-y:hidden 切掉(主人 10-11 移动端实测) */
  padding-top: 10px; padding-bottom: 3px;
  -webkit-overflow-scrolling: touch; scrollbar-width: none;
  -webkit-mask-image: linear-gradient(to right, black 70%, transparent 100%);
  mask-image: linear-gradient(to right, black 70%, transparent 100%);
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  padding-right: 8%;
}
.v3-hscroll-row::-webkit-scrollbar { display: none; }

/* ─── Target Row ─── */
.v3-trow {
  display: flex;
  align-items: center;
  padding: 10px var(--sp-lg);
  border-bottom: 1px solid var(--c-border);
  cursor: pointer;
  transition: background .12s;
}
.v3-trow:last-child { border-bottom: none; }
.v3-trow:hover { background: var(--c-surface-2); }
.v3-trow-expanded {
  background: var(--c-surface-2);
  border-left: 3px solid var(--c-accent);
}

.v3-trow-name {
  font-size: var(--t-body);
  font-weight: 600;
  color: var(--c-text);
  min-width: 100px;
}
.v3-trow-sectors {
  font-size: 11px;
  color: var(--c-text-2);
  margin-left: var(--sp-md);
}
.v3-trow-count {
  font-size: var(--t-meta);
  color: var(--c-text-3);
  margin-left: auto;
  font-variant-numeric: tabular-nums;
}
.v3-trow-star {
  margin-left: var(--sp-md);
  color: var(--c-text-3);
  cursor: pointer;
  background: transparent;
  border: none;
  padding: 2px;
  line-height: 0;
}
.v3-trow-star.active { color: var(--c-accent); }
.v3-trow-star svg {
  width: 14px; height: 14px;
  stroke: currentColor; fill: currentColor;
  stroke-width: 1.6;
}

/* ─── Video Card ─── */
.v3-video-card {
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  border-radius: var(--radius-md);
  overflow: hidden;
  cursor: pointer;
  transition: border-color .15s, box-shadow .15s, transform .15s;
}
.v3-video-card:hover {
  border-color: var(--c-accent-border);
  box-shadow: var(--c-shadow);
  transform: translateY(-2px);
}
.v3-video-cover {
  aspect-ratio: 3 / 4;
  background: var(--c-surface-2);
  position: relative;
  overflow: hidden;
}
.v3-video-conf {
  position: absolute;
  top: var(--sp-sm);
  right: var(--sp-sm);
  font-size: var(--t-meta);
  padding: 2px 6px;
  border-radius: var(--radius-sm);
  font-weight: 600;
}
.v3-video-pin {
  position: absolute;
  top: var(--sp-sm);
  left: var(--sp-sm);
  font-size: var(--t-meta);
  padding: 2px 6px;
  border-radius: var(--radius-sm);
  font-weight: 600;
  background: var(--c-accent);
  color: var(--c-accent-text);
}
/* ── 已删除视频卡片：封面保留仅发灰(与正常卡视觉一致, 不再换文本块避免误以为平台删的) ── */
.v3-video-pin-del {
  background: #5a5a6a;
  color: #fff;
}
.v3-video-deleted .v3-video-cover {
  filter: brightness(.88);
}

/* ── 视频内容禁止复制（防盗用；存图请用详情页"存图"按钮）── */
.v3-video-card, .v3-video-card *,
.v3-modal, .v3-modal * {
  -webkit-user-select: none;
  -moz-user-select: none;
  user-select: none;
  -webkit-touch-callout: none;
}
.v3-video-dur {
  position: absolute;
  bottom: var(--sp-sm);
  right: var(--sp-sm);
  font-size: var(--t-meta);
  padding: 1px 5px;
  border-radius: 3px;
  background: rgba(0,0,0,.65);
  color: #fff;
  font-variant-numeric: tabular-nums;
}
.v3-video-tag {
  display: inline-block;
  font-size: var(--t-meta);
  padding: 1px 5px;
  border-radius: 3px;
  background: var(--c-accent-bg);
  color: var(--c-accent);
  margin-left: 6px;
  vertical-align: middle;
}
.v3-video-pinned {
  border-color: var(--c-accent-border);
}
.v3-video-body { padding: 4px 5px 5px; }
.v3-video-title {
  font-size: var(--t-body);
  font-weight: 500;
  line-height: 1.4;
  color: var(--c-text);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  font-size: 12px;
}
.v3-video-meta {
  font-size: var(--t-meta);
  color: var(--c-text-3);
  margin-top: 6px;
}

/* Mobile: horizontal video card */
@media (max-width: 768px) {
  .v3-video-card-h {
    display: flex;
    flex-direction: row;
  }
  .v3-video-card-h .v3-video-cover {
    width: 100px;
    height: 72px;
    flex-shrink: 0;
  }
  .v3-video-card-h .v3-video-body {
    padding: var(--sp-sm) 10px;
  }
}

/* ─── Chat ─── */
.v3-chat-bubble {
  display: inline-block;   /* 对齐.cr-bubble: 气泡宽收内容自适应(原block被col flex stretch拉满致user气泡撑420px离头像远=问题2真凶) */
  padding: 10px 14px;
  border-radius: 12px;
  font-size: var(--t-body);
  line-height: 1.6;
}
.v3-chat-bubble-user {
  max-width: 420px;
  background: var(--c-accent-bg);
  color: var(--c-accent);
  border-radius: 12px 12px 4px 12px;
  margin-left: auto;
}
.v3-chat-bubble-bot {
  max-width: 680px;
  background: var(--c-surface-2);
  color: var(--c-text);
  border-radius: 12px 12px 12px 4px;
  padding: 14px 16px;
  font-size: 14px;
  line-height: 1.75;
  word-break: break-word;
}
@media (max-width: 768px) {
  .v3-chat-bubble {
    max-width: 80%;
  }
  .v3-chat-bubble-user {
    max-width: 100%;   /* 反馈2治本(2026-08-01): 原80%把user气泡卡死在80%×col, 375视口col仅163→气泡content 130px装不下9字(需135)强行换行(实测"今天大盘到底怎么走"H=68=2行); 放宽到100%(对齐bot)让9字单行, 超长消息走word-break; 桌面端420px上限不动 */
  }
  .v3-chat-bubble-bot {
    max-width: 92%;
  }
}

/* ─── Skeleton ─── */
/* 动效批2 12A 金色流光: 基类升级为"呼吸底纹 + 金色高光扫过"双层组合, 全站骨架自动受益;
 *   reduced-motion 全局兜底下 sweep 归零停在高光带不可见区 = 纯灰块, 无害 */
.v3-skeleton {
  background: var(--c-surface-2);
  border-radius: var(--radius-sm);
  animation: skeleton-pulse 1.5s ease infinite;
  position: relative;
  overflow: hidden;
}
.v3-skeleton::after {
  content: '';
  position: absolute;
  top: 0; right: 0; bottom: 0; left: 0;   /* 不用 inset: 站点基线 Chrome83 */
  background: linear-gradient(100deg, transparent 30%, rgba(236,170,11,.16) 50%, transparent 70%);
  background-size: 220% 100%;
  animation: v3-skel-sweep 1.4s linear infinite;
  pointer-events: none;
}
.v3-skeleton-line {
  height: 12px;
  margin-bottom: var(--sp-sm);
}

@keyframes skeleton-pulse {
  0%, 100% { opacity: 1; }
  50% { opacity: .5; }
}
@keyframes v3-skel-sweep {
  from { background-position: 120% 0; }
  to { background-position: -120% 0; }
}

/* ─── Empty State ─── */
.v3-empty {
  text-align: center;
  padding: 48px var(--sp-xl);
  color: var(--c-text-3);
}
.v3-empty-icon {
  font-size: 32px;
  margin-bottom: var(--sp-md);
}
.v3-empty h2 {
  font-size: var(--t-h2);
  font-weight: 600;
  color: var(--c-text-2);
  margin-bottom: var(--sp-sm);
}
.v3-empty p {
  font-size: var(--t-body);
  max-width: 320px;
  margin: 0 auto;
}

/* Chrome83/MIUI WebView 兼容(小米8范式 task#112):
   -webkit-tap-highlight-color 治底部菜单/button 点击金色边框(MIUI 给 focus/active 默认渲染系统金色);
   button:focus/a:focus outline:none 保险(其他设备不渲染,MIUI 渲染)。 */
* { -webkit-tap-highlight-color: transparent; }
button:focus, a:focus { outline: none; }
button:focus-visible, a:focus-visible { outline: auto; }

/* ─── Modal ─── */
.v3-modal-overlay {
  display: none;
  position: fixed;
  top: 0; right: 0; bottom: 0; left: 0;
  background: rgba(0,0,0,.5);
  backdrop-filter: blur(8px);
  z-index: 200;
  align-items: center;
  justify-content: center;
}
/* v350(2026-08-21) 主人 5 区 V2: 个人资料弹窗全屏 — 100vw 100vh 无圆角, 滚动条给 body 区域 */
.v3-modal.v3-modal-fullscreen {
  max-width: 100vw !important;
  width: 100vw;
  height: 100vh;
  max-height: 100vh;
  border-radius: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
}
.v3-modal.v3-modal-fullscreen .v3-modal-body {
  flex: 1;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
}
.v3-modal-overlay.active { display: flex; }
.v3-modal {
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  border-radius: var(--radius-lg);
  width: 90%;
  max-width: 560px;
  height: 75vh;
  max-height: 600px;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
.v3-modal-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: var(--sp-lg) 20px;
  border-bottom: 1px solid var(--c-border);
  flex-shrink: 0;
}
.v3-modal-close {
  background: transparent;
  border: none;
  color: var(--c-text-3);
  font-size: 18px;
  cursor: pointer;
  padding: 4px 8px;
}
.v3-modal-close:hover { color: var(--c-text); }
.v3-modal-body {
  padding: 20px;
  flex: 1;
  overflow-y: auto;
}

/* ─── 视频弹窗→抽屉化(2026-08-06): header 返回钮 + 快捷钮, 演变 chip/时间轴 ─── */
.v3-modal-hleft { display: flex; align-items: center; gap: 6px; flex: 1; min-width: 0; }
.v3-modal-hright { display: flex; align-items: center; gap: 2px; flex-shrink: 0; }
.v3-modal-back {
  background: transparent; border: none; color: var(--c-text-3);
  padding: 4px 6px; cursor: pointer; display: flex; align-items: center;
  border-radius: 6px; flex-shrink: 0;
}
.v3-modal-back:hover { color: var(--c-text); background: var(--c-bg-2); }
.v3-modal-shot {
  background: transparent; border: none; font-size: 18px;
  padding: 4px 6px; cursor: pointer; border-radius: 6px; line-height: 1;
}
.v3-modal-shot:hover { background: var(--c-bg-2); }
.v3-modal-shot:active { transform: scale(.96); }
.v3-modal-shot.loading { opacity: .6; pointer-events: none; }

/* 演变 tab: v440 四轮(2026-09-17 主人选C行式紧凑)重设计
   头部=单工具行(概念chip+范围分段+转发钮), 条目=方向色竖条+日期/徽章/标题同行+reasoning两行截断 */
.v3-ev-toolbar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 12px 12px 4px; }
.v3-ev-chips { display: flex; gap: 6px; flex-wrap: wrap; flex: 1; min-width: 0; }
.v3-ev-chip {
  padding: 4px 11px; border-radius: 999px; font-size: 12px; font-weight: 600;
  border: 1px solid var(--c-border); background: transparent;
  color: var(--c-text-3); cursor: pointer; white-space: nowrap;
}
.v3-ev-chip.active { background: var(--c-accent); color: #16161a; border-color: var(--c-accent); }
.v3-ev-ranges {
  display: flex; gap: 2px; padding: 2px; margin-left: auto; flex-shrink: 0;
  background: var(--c-bg-2); border: 1px solid var(--c-border); border-radius: 12px;
}
.v3-ev-range {
  padding: 3px 9px; border-radius: 10px; font-size: 11px;
  border: none; background: transparent;
  color: var(--c-text-3); cursor: pointer;
}
.v3-ev-range.active { background: var(--c-accent); color: #16161a; font-weight: 600; }
.v3-ev-toolbar .v3-elem-askai { flex-shrink: 0; padding: 4px 9px; font-size: 11px; }
.v3-ev-list { padding: 2px 12px 16px; }
.v3-ev-item {
  display: flex; gap: 10px; padding: 11px 0;
  border-bottom: 1px solid var(--c-border); cursor: pointer; align-items: stretch;
}
.v3-ev-item:last-child { border-bottom: none; }
.v3-ev-item:active { background: var(--c-bg-2); }
.v3-ev-bar { width: 3px; border-radius: 2px; background: var(--c-text-3); flex-shrink: 0; }
.v3-ev-item.ev-up .v3-ev-bar { background: var(--c-up); }
.v3-ev-item.ev-down .v3-ev-bar { background: var(--c-down); }
.v3-ev-main { flex: 1; min-width: 0; }
.v3-ev-top { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; flex-wrap: wrap; }
.v3-ev-date { font-size: 12px; color: var(--c-text-3); font-family: ui-monospace, monospace; }
.v3-ev-ts { font-size: 10px; color: var(--c-text-3); flex-shrink: 0; }
.v3-ev-badge { font-size: 11px; padding: 1px 7px; border-radius: 4px; font-weight: 600; flex-shrink: 0; }
.v3-ev-item.ev-up .v3-ev-badge { background: rgba(207,64,64,.12); color: var(--c-up); }
.v3-ev-item.ev-down .v3-ev-badge { background: rgba(0,172,78,.12); color: var(--c-down); }
.v3-ev-item.ev-flat .v3-ev-badge { background: var(--c-bg-2); color: var(--c-text-3); }
.v3-ev-title { font-size: 13.5px; font-weight: 600; color: var(--c-text); line-height: 1.4; }
.v3-ev-reason {
  font-size: 12.5px; color: var(--c-text-2); line-height: 1.6;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.v3-ev-arrow { align-self: center; color: var(--c-text-3); flex-shrink: 0; font-size: 16px; }
.v3-ev-empty { text-align: center; color: var(--c-text-3); font-size: 13px; padding: 30px 0; }

/* ─── 标的详情展开区(方案A 2026-10-05 主人拍板): 演变置顶 + 走势/摘要/关联视频折叠 ─── */
/* 外层容器已带 padding, 覆盖 v3-ev 系列内边距防双重缩进; 无概念chips抢位, range分段改靠左 */
#v3TgtEvBox .v3-ev-toolbar { padding: 4px 0 0; }
#v3TgtEvBox .v3-ev-ranges { margin-left: 0; }
#v3TgtEvBox .v3-ev-list { padding: 2px 0 12px; }
/* 折叠头: 虚线分隔演变区, 弱文字引导展开; 箭头字符由 toggleFold 切换 */
.v3-tgt-fold {
  display: flex; justify-content: space-between; align-items: center;
  margin-top: 6px; padding: 11px 2px;
  border-top: 1px dashed var(--c-border);
  font-size: 12px; color: var(--c-text-3); cursor: pointer;
  user-select: none; -webkit-user-select: none;
}
.v3-tgt-fold:active { color: var(--c-text-2); }
.v3-tgt-fold-arrow { font-size: 10px; flex-shrink: 0; }
/* 收起头: 展开详情顶部显式收起入口(2026-10-05 主人令), 风格同 .v3-tgt-fold, 靠右小入口不抢演变区 */
.v3-tgt-collapse {
  display: flex; justify-content: flex-end; align-items: center; gap: 4px;
  margin: -2px 0 8px; padding: 4px 2px;
  font-size: 12px; color: var(--c-text-3); cursor: pointer;
  user-select: none; -webkit-user-select: none;
}
.v3-tgt-collapse:active { color: var(--c-text-2); }

/* 演变 tab 红点提示(有 asset_views 才显) */
.v3-tab-dot {
  display: inline-block; width: 6px; height: 6px; border-radius: 50%;
  background: var(--c-accent); margin-left: 3px; vertical-align: middle;
}

/* ─── Theme Switch (v238 方案A·裸图标对:去pill容器精致化) ─── */
.v3-theme-switch {
  display: flex;
  align-items: center;
  gap: 2px;
}
.v3-theme-btn {
  width: 26px; height: 26px;
  border: none;
  border-radius: 6px;
  background: transparent;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--c-text-3);
  transition: background .12s, color .12s;
}
.v3-theme-btn:hover { background: var(--c-surface); color: var(--c-text-2); }
.v3-theme-btn.active {
  background: var(--c-accent-bg);
  color: var(--c-accent);
}
.v3-theme-btn svg {
  width: 15px; height: 15px;
  stroke: currentColor;
  fill: none;
  stroke-width: 1.8;
}
/* v241: i-moon 是 fill 型新月 path, 被 .v3-theme-btn svg{fill:none} 压成空壳看不见;
   只给 dark 钮(i-moon) 开 fill, light 钮(i-sun stroke 型)不动(🟠6)。 */
.v3-theme-btn[data-theme="dark"] svg { fill: currentColor; stroke: none; }


/* ═══════════════════════════════════════════════════
   Grids — responsive helpers
   ═══════════════════════════════════════════════════ */
/* .v3-grid-stats 已删(2026-10-05): 唯一消费者 dashboard 三统计卡改快览条(方案D), 死类清场 */
.v3-grid-videos {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: 6px;
}

@media (max-width: 768px) {
  .v3-grid-videos {
    grid-template-columns: repeat(3, 1fr);
    gap: 6px;
  }
  /* 移动端触摸目标提至44px(WCAG/iOS HIG,A6); theme-btn/pill高频筛选 */
  .v3-theme-btn { width: auto; min-width: 44px; min-height: 44px; }
  .v3-forum-pills .v3-pill { min-height: 44px; padding: 8px 14px; }

}

/* ─── Chat Shell (full height layout, no parent scroll) ─── */
.v3-chat-shell {
  display: flex;
  flex-direction: column;
  height: 100%;
}
#page-chat.active {
  position: absolute;
  top: 0; right: 0; bottom: 0; left: 0;
  padding: 0 var(--sp-lg);
  overflow: hidden;
}
.v3-chat-header {
  padding: 12px 0;
  border-bottom: 1px solid var(--c-border);
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-shrink: 0;
}
.v3-chat-body {
  flex: 1;
  display: flex;
  min-height: 0;
  overflow: hidden;
}
.v3-chat-messages {
  flex: 1;
  overflow-y: auto;
  padding: 16px 8px;   /* 反馈1(2026-08-01主人定): 左右16→8减半, 头像距边17→9(主人报"双方头像离各自边框太远要缩小一半间距"), 本轮覆盖原"禁贴边"诉求; 8px仍留呼吸不真贴边, 聊天室.cr-stream同步 */
  display: flex;
  flex-direction: column;
  gap: 8px;   /* 对齐.cr-stream gap8, 原14行间距过大(问题1) */
}

/* ─── A方案(2026-08-01 主人定): AI对话气泡包 row+头像+昵称+时间, 复用社区聊天室.cr-msg范式 ───
   AI=M-Model AI(金色M方块头像) / 用户=用户名(首字母hash色头像), 时间北京时间每条显示 */
.v3-chat-row { display: flex; gap: 8px; max-width: 95%; }   /* 对齐.cr-msg 95%, 原88%致内容离边缘过远(问题1) */
.v3-chat-row.user { align-self: flex-end; flex-direction: row-reverse; }
.v3-chat-col { min-width: 0; max-width: 100%; }   /* block容器对齐.cr-msg-body(去flex column, stretch不再拽气泡) */
.v3-chat-meta {
  display: flex; align-items: center; gap: 8px; margin-bottom: 4px;
  font-size: 12px; color: var(--c-text-3); flex-wrap: wrap;
}
.v3-chat-row.user .v3-chat-meta { justify-content: flex-end; }   /* 对齐.cr-msg.self meta靠右(保留昵称→时间顺序, 原row-reverse反序了) */
.v3-chat-row.user .v3-chat-col { text-align: right; }   /* 反馈1治本(2026-08-01): inline-block气泡在block col里默认左对齐, 被meta撑宽的col右侧留大空隙(gap实测25px离头像远); text-align:right让短气泡右靠到col右边缘=gap降到8与长气泡统一紧贴头像(对齐聊天室.cr-msg.self .cr-msg-body同改) */
.v3-chat-name { font-weight: 600; font-size: 12px; color: var(--c-text); }
.v3-chat-name.ai { color: var(--c-accent); }
.v3-chat-time { color: var(--c-text-3); font-size: 11px; }
.v3-chat-avatar {
  width: 32px; height: 32px; border-radius: var(--radius-md); flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: 14px; font-weight: 700; color: #fff;
}
.v3-chat-avatar.ai { background: linear-gradient(135deg, #FFE08A, #9C6E08); color: #3a2a00; }
/* 思考态气泡在 row 内宽度自然撑开 col, 不用额外处理 */
.v3-chat-row .v3-chat-bubble { margin-left: 0; }   /* 覆盖 user 气泡原 margin-left:auto(改由 row 对齐) */
/* 反馈2治本(2026-08-01): 移动端AI回答气泡太窄频繁换行可读性差(375视口实测仅261px=row95%+col+气泡92%嵌套砍两刀+padding32+avatar32+gap8挤没).
   ①row gap 减半 8→4(主人定: AI头像和用户头像间距统一减半, 气泡顺带往两边扩) ②bot气泡 max-width 92%→100%(占满col不再二次砍, 聊天室同步). 桌面端不动. */
@media (max-width: 768px) {
  .v3-chat-row { gap: 4px; }
  .v3-chat-bubble-bot { max-width: 100%; }
}
.v3-chat-history {
  width: 220px;
  border-right: 1px solid var(--c-border);
  overflow-y: auto;
  flex-shrink: 0;
  margin-right: 12px;
}
.v3-chat-input-bar {
  padding: 12px 16px;   /* 左右16防输入框/热词栏贴边,与消息区对齐 */
  border-top: 1px solid var(--c-border);
  display: flex;
  gap: 10px;
  flex-shrink: 0;
}
/* v328(2026-08-20) AI 对话页键盘态范式: 跟 .cr-keyboard-open .cr-composer (v322d) 对齐, 走 fixed+translateY。
   真凶: .v3-chat-input-bar 原在 .v3-content flex 流底部, kbOpen 时浏览器改 viewport height → flex 重排
   引发输入条位置"跳"(主人报"页面会闪烁"); 且因 v3-content 没推, 文本框也不在键盘顶。
   治本: 键盘态 fixed 到视口底部, app.js _vvHandler L1438 扩推 selector 同时推 .v3-chat-input-bar 上键盘顶 */
.cr-keyboard-open .v3-chat-input-bar {
  position: fixed;
  left: 0; right: 0; bottom: 0;
  background: var(--c-surface, #1a1a26);
  padding-bottom: 12px;
  transform: translateY(0);
  will-change: transform;
  z-index: 200;
  transition: transform 0.18s ease-out;
}
/* AI对话热词栏(2026-07-19): 单行横滚, 不换行不顶下输入框(治主人提的移动端/ web输入框被挤下去)。
   桌面5个chip一行展示得下, 移动端窄屏横滚浏览, 输入框永远贴底可见。滚动条隐藏美观。 */
.v3-chat-hot-q-row {
  display: flex;
  flex-wrap: nowrap;
  gap: 6px;
  margin: 0 12px;
  padding: 6px 4px 2px;
  align-items: center;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none; /* Firefox 隐藏滚动条 */
}
.v3-chat-hot-q-row::-webkit-scrollbar { display: none; } /* Chrome/Safari 隐藏 */
.v3-chat-hot-q-row > * { flex-shrink: 0; white-space: nowrap; } /* chip/label 不被压缩不换行 */
.v3-chat-welcome {
  text-align: center;
  padding: 30px 0 20px;
  color: var(--c-text-3);
  font-size: 13px;
  line-height: 1.6;
}
.v3-chat-welcome-icon {
  margin-bottom: 8px;
}
.v3-chat-warning {
  font-size: 12px;
  color: var(--c-accent);
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 4px;
  margin-top: 4px;
}
.v3-chat-quick-actions {
  display: flex;
  gap: 8px;
  justify-content: center;
  margin-bottom: 24px;
  flex-wrap: wrap;
}
.v3-chat-typing {
  display: inline-flex;
  gap: 4px;
  align-items: center;
  padding: 2px 0;
}
.v3-chat-typing span {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--c-text-3);
  animation: typing-dot 1.2s ease infinite;
}
.v3-chat-typing span:nth-child(2) { animation-delay: .2s; }
.v3-chat-typing span:nth-child(3) { animation-delay: .4s; }

/* ─── 递进式分析步骤动画(子任务1) ─── */
.v3-chat-phases {
  display: flex;
  flex-direction: column;
  gap: 5px;
}
.v3-chat-phase {
  font-size: 13px;
  color: var(--c-text-3);
  line-height: 1.4;
  animation: v3-phase-in .35s ease both;
}
.v3-chat-phase::before {
  content: '◦ ';
  color: var(--c-text-4);
}
@keyframes v3-phase-in {
  from { opacity: 0; transform: translateY(4px); }
  to { opacity: 1; transform: translateY(0); }
}

@keyframes typing-dot {
  0%, 60%, 100% { transform: translateY(0); opacity: .4; }
  30% { transform: translateY(-4px); opacity: 1; }
}

/* ─── AI 思考动画(方案2·问题自适应: 脉动光环 + 步骤流) ───
   主人认可脉动光环主视觉; 步骤流逐条推进, 到"深度推理"步停住等后端。
   数据驱动: 步骤文案在 chat.js THINKING_STEPS_CONFIG, 改文案/加意图不改样式。 */
.v3-chat-bubble-bot.v3-thinking {
  display: flex;
  gap: 13px;
  align-items: flex-start;
}
/* 左: 脉动光环主图标 */
.v3-think-ring {
  position: relative;
  width: 46px; height: 46px;
  flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
}
.v3-think-core {
  width: 32px; height: 32px;
  border-radius: 50%;
  background: linear-gradient(135deg, #f5c542, var(--c-accent));
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 9px; font-weight: 700; color: #1a1500;
  box-shadow: 0 0 16px rgba(236,170,11,.28);
  position: relative; z-index: 2;
  letter-spacing: .3px;
}
.v3-think-wave {
  position: absolute;
  width: 32px; height: 32px;
  border: 2px solid var(--c-accent);
  border-radius: 50%;
  opacity: 0;
}
.v3-think-wave.w1 { animation: v3ThinkPulse 2s ease-out infinite; }
.v3-think-wave.w2 { animation: v3ThinkPulse 2s ease-out infinite .66s; }
.v3-think-wave.w3 { animation: v3ThinkPulse 2s ease-out infinite 1.33s; }
@keyframes v3ThinkPulse {
  0% { transform: scale(.7); opacity: .85; }
  100% { transform: scale(2); opacity: 0; }
}
/* 右: 步骤流 */
.v3-think-steps {
  flex: 1;
  display: flex; flex-direction: column;
  gap: 1px;
  padding-top: 2px;
  min-width: 0;
}
.v3-think-step {
  display: flex; align-items: center; gap: 9px;
  font-size: 13px; padding: 3px 0;
  transition: color .3s; line-height: 1.3;
}
.v3-think-step .si {
  width: 16px; height: 16px; flex-shrink: 0;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 11px;
}
.v3-think-step .st { flex: 1; min-width: 0; }
.v3-think-step.done { color: var(--c-text-3); }
.v3-think-step.done .si { color: var(--c-accent); }
.v3-think-step.active { color: var(--c-text); }
.v3-think-step.active .si .sp {
  width: 13px; height: 13px;
  border: 2px solid rgba(236,170,11,.25);
  border-top-color: var(--c-accent);
  border-radius: 50%;
  animation: v3ThinkSpin .8s linear infinite;
  display: inline-block;
}
.v3-think-step.active .st { animation: v3ThinkPulseTxt 1.5s ease-in-out infinite; }
.v3-think-step.pending { color: var(--c-text-3); opacity: .5; }
/* 等待提示(2026-07-23 主人定): 动画推进到「深度推理」步停住时渐显, 安抚用户耐心(复杂问题30-60s)。
   简单问题秒回(_removeLoading 早)不会推进到推理步→不显示, 天然只在慢问题上出现。 */
.v3-think-hint {
  margin-top: 8px; padding-top: 8px;
  border-top: 1px dashed var(--c-border, rgba(255,255,255,.1));
  font-size: 11.5px; color: var(--c-text-3); line-height: 1.45;
  opacity: 0; transition: opacity .6s ease;
}
.v3-think-hint.show { opacity: 1; }
.v3-think-hint b { color: var(--c-accent); font-weight: 600; }
@keyframes v3ThinkSpin { to { transform: rotate(360deg); } }
@keyframes v3ThinkPulseTxt { 0%,100%{opacity:1;} 50%{opacity:.55;} }
/* 移动端: 主图标+字号微调(小米8等老 WebView 实测重点) */
@media (max-width: 768px) {
  .v3-think-ring { width: 40px; height: 40px; }
  .v3-think-core { width: 28px; height: 28px; }
  .v3-think-wave { width: 28px; height: 28px; }
  .v3-think-step { font-size: 12.5px; gap: 7px; }
  .v3-chat-bubble-bot.v3-thinking { gap: 10px; }
}

/* ─── History Item ─── */
.v3-history-item {
  padding: 10px 12px;
  border-radius: var(--radius-sm);
  cursor: pointer;
  transition: background .12s;
}
.v3-history-item:hover {
  background: var(--c-surface-2);
}

/* ─── Settings Row ─── */
.v3-settings-row {
  width: 100%;
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 12px 16px;
  border: none;
  background: transparent;
  border-bottom: 1px solid var(--c-border);
  cursor: pointer;
  font-size: 13px;
  font-family: inherit;
  color: var(--c-text);
  text-align: left;
  transition: background .12s;
}
.v3-settings-row:last-child { border-bottom: none; }
.v3-settings-row:hover { background: var(--c-surface-2); }

/* ─── Error Bar ─── */
.v3-error-bar {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 16px;
  background: var(--c-up-bg);
  border-radius: var(--radius-md);
  color: var(--c-up);
  font-size: 13px;
}
.v3-error-bar .v3-btn { color: var(--c-text); }   /* 重试钮次级样式在红底上保可读 */

/* ─── 全局骨架屏(P1-4 2026-09-18): 各页加载占位统一 shimmer 条, 配 V3.skeleton() 用 ─── */
.v3-skel-bar {
  height: 12px;
  border-radius: 6px;
  min-width: 60px;
  background: linear-gradient(90deg, var(--c-surface-3) 0%, var(--c-surface-2) 50%, var(--c-surface-3) 100%);
  background-size: 200% 100%;
  animation: v3-shimmer 1.4s ease-in-out infinite;
}
@keyframes v3-shimmer {
  0% { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}

/* ─── Mobile chat fix ─── */
@media (max-width: 768px) {
  #page-chat.active {
    padding: 0 var(--sp-sm);
  }
  .v3-chat-history {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 56px;
    width: 100%;
    height: auto;
    z-index: 150;
    background: var(--c-surface);
    margin-right: 0;
    border-right: none;
    padding: 16px;
    overflow-y: auto;
  }

}

/* ─── Settings Page ─── */
.v3-settings-header {
  display: flex;
  align-items: center;
  gap: var(--sp-lg);
  margin-bottom: 28px;
  flex-wrap: nowrap;  /* v331-11: 三段式 header 不换行, 头像+name/role+chip 横向一排 */
}
.v3-settings-info { flex: 1; min-width: 0; }  /* 撑到右, 内容长 ellipsis, 让 chip 贴右 */
.v3-settings-name { font-size: 16px; font-weight: 700; color: var(--c-text); line-height: 1.3; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.v3-settings-role { font-size: var(--t-meta); color: var(--c-text-3); margin-top: 2px; }

.v3-settings-avatar {
  width: 48px;
  height: 48px;
  border-radius: 50%;
  background: var(--c-accent);
  color: var(--c-accent-text);
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: 18px;
  flex-shrink: 0;
}
.v3-settings-avatar.v3-settings-avatar-sm { width: 40px !important; height: 40px !important; font-size: 14px; }   /* v350 资料抽屉头部 1/5 横排用 */
/* 需求⑤: 自定义头像 img 叠层(绝对定位铺满 avatar 容器, 404→onerror 自移除→露底层首字母+渐变) */
.v3-settings-avatar, .v3-header-avatar, .v3-sidebar-avatar { position: relative; overflow: hidden; }
.v3-avatar-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; border-radius: inherit; pointer-events: none; }

/* 认证用户头像星标叠加层(需求5, 2026-08-12): 金色星标 absolute 叠在头像右下角 */
.v3-verified-star {
  position: absolute; bottom: -2px; right: -2px;
  display: inline-flex; align-items: center; justify-content: center;
  width: 16px; height: 16px; border-radius: 50%;
  background: #fff; cursor: pointer; z-index: 2;
  box-shadow: 0 1px 3px rgba(0,0,0,0.15); transition: transform .15s;
}
.v3-verified-star-icon { width: 12px; height: 12px; color: #D4A017; fill: #D4A017; }
.v3-verified-star:hover { transform: scale(1.15); }
/* 触摸目标扩44(审计P2): 头像padding外圈+星标位置——header头像padding 6px时星标bottom/right归零贴边 */
.v3-header-avatar .v3-verified-star { bottom: 6px; right: 6px; }  /* 贴32px视觉头像角(44框-6px padding), 原bottom:0会悬空贴44框角 */
.v3-header-avatar .v3-avatar-img { top: 6px; left: 6px; width: calc(100% - 12px); height: calc(100% - 12px); }  /* 圈进32视觉圆(44框-6px padding×2); inset+auto对img替换元素会取原图128px固有尺寸, 必须显式calc */

/* 会员专属交流群按钮(2026-07-31 需求2): 头像右侧空白区, margin-left:auto 推到 header 右端;
   全员可见, 非付费灰态+付费金态, 点击分流 onMemberGroupTap */
.v3-settings-member-btn {
  margin-left: auto;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 8px 14px;
  border-radius: 999px;
  border: 1px solid var(--c-border);
  background: var(--c-card);
  color: var(--c-text-3);
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
  flex-shrink: 0;
  transition: transform .1s;
}
.v3-settings-member-btn:active { transform: scale(.94); }
.v3-settings-member-btn.is-paid {
  border-color: var(--c-accent);
  color: var(--c-accent);
  background: color-mix(in srgb, var(--c-accent) 12%, transparent);
}

.v3-settings-name {
  font-size: var(--t-h2);
  font-weight: 600;
}

.v3-settings-role {
  font-size: var(--t-meta);
  color: var(--c-text-3);
}

/* v331(2026-08-20) 会员档 chip: 头像右边, 胶囊形, 跟主题色一致 (复用 .v3-settings-member-btn 范式, 但更紧凑)
   - margin-left: auto 推到 header 右端
   - i-diamond SVG icon + 文字"剩 N 天" / "未开通"
   - 点跳 /membership (复用 v329 V3Settings.openMembership) */
.v3-membership-chip {
  margin-left: auto;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 4px 10px;
  border-radius: 16px;
  border: 1px solid var(--c-accent);
  background: color-mix(in srgb, var(--c-accent) 12%, transparent);
  color: var(--c-accent);
  font-size: 12px;
  font-weight: 600;
  cursor: pointer;
  white-space: nowrap;
  flex-shrink: 0;
  transition: transform .1s, background .18s;
  line-height: 1.2;
}
.v3-membership-chip:active { transform: scale(.94); }
.v3-membership-chip:hover { background: color-mix(in srgb, var(--c-accent) 22%, transparent); }
.v3-membership-chip-icon { display: inline-flex; align-items: center; opacity: 0.9; }
.v3-membership-chip-text { line-height: 1; }
/* v331 header 内 name+role 容器撑开, chip 推到右 (无此 class → flex 紧贴 avatar, chip 仍能 margin-left:auto 推右, 兼容也行)
   显式声明更稳, 跟现有 .v3-settings-header display:flex + gap:var(--sp-lg) 配套 */
.v3-settings-info { flex: 1; min-width: 0; }

.v3-settings-section-label {
  font-size: var(--t-meta);
  color: var(--c-text-3);
  padding: var(--sp-md) var(--sp-lg) var(--sp-sm);
}

.v3-settings-section {
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  border-radius: var(--radius-md);
  overflow: hidden;
  margin-bottom: var(--sp-md);
}

.v3-settings-row {
  width: 100%;
  display: flex;
  align-items: center;
  gap: var(--sp-md);
  padding: 12px var(--sp-lg);
  border: none;
  border-bottom: 1px solid var(--c-border);
  background: transparent;
  cursor: pointer;
  font-size: var(--t-body);
  font-family: inherit;
  color: var(--c-text);
  text-align: left;
  transition: background .12s;
}
.v3-settings-row:last-child { border-bottom: none; }
.v3-settings-row:hover { background: var(--c-surface-2); }

.v3-settings-row-icon {
  width: 20px;
  height: 20px;
  color: var(--c-text-2);
  flex-shrink: 0;
}

.v3-settings-row-label {
  flex: 1;
}

.v3-settings-row-chevron {
  width: 14px;
  height: 14px;
  color: var(--c-text-3);
  flex-shrink: 0;
}

.v3-settings-theme-bar {
  display: flex;
  gap: var(--sp-sm);
  padding: var(--sp-md) var(--sp-lg);
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  border-radius: var(--radius-md);
  margin-bottom: var(--sp-md);
}

.v3-settings-theme-btn {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
}

.v3-settings-danger {
  color: var(--c-down);
}

.v3-settings-footer {
  text-align: center;
  margin-top: 28px;
  font-size: var(--t-meta);
  color: var(--c-text-3);
}

/* ─── QR Modal (Donate / Group) ─── */
.v3-qr-cards {
  display: flex;
  gap: var(--sp-lg);
  justify-content: center;
  flex-wrap: wrap;
}
.v3-qr-card {
  text-align: center;
}
.v3-qr-img-wrap {
  width: 160px;
  height: 160px;
  border-radius: var(--radius-md);
  overflow: hidden;
  border: 1px solid var(--c-border);
  background: var(--c-surface-2);
  margin-bottom: var(--sp-sm);
}
.v3-qr-img-wrap img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  cursor: zoom-in;
}
.v3-qr-label {
  font-size: var(--t-meta);
  color: var(--c-text-2);
}
.v3-qr-toggle-bar {
  margin-top: var(--sp-md);
  padding-top: var(--sp-md);
  border-top: 1px dashed var(--c-border-2);
  text-align: center;
}
.v3-qr-tip {
  font-size: var(--t-meta);
  color: var(--c-text-3);
  margin-top: var(--sp-sm);
  line-height: 1.5;
}

/* ─── Chat Markdown ─── */
.v3-chat-bubble-bot p { margin: 0 0 10px; line-height: 1.75; }
.v3-chat-bubble-bot p:last-child { margin-bottom: 0; }
.v3-chat-bubble-bot strong { color: var(--c-text); font-weight: 600; }
.v3-chat-bubble-bot ul, .v3-chat-bubble-bot ol {
  margin: 6px 0;
  padding-left: 20px;
}
.v3-chat-bubble-bot li {
  margin: 4px 0;
  line-height: 1.7;
}
.v3-chat-bubble-bot blockquote {
  margin: 8px 0;
  padding: 6px 12px;
  border-left: 3px solid var(--c-accent);
  background: var(--c-surface-3);
  border-radius: 0 6px 6px 0;
  color: var(--c-text-2);
  font-size: 13px;
}
/* Bubble内标题层次 — 需求3 A+D(2026-07-07): h2加左竖条强标题感, 删旧冗余定义(DRY) */
.v3-md-h1 { font-size: 16px; font-weight: 700; margin: 14px 0 8px; color: var(--c-accent); }
.v3-md-h2 { font-size: 15px; font-weight: 700; margin: 14px 0 6px; padding: 4px 0 4px 10px; border-left: 3px solid var(--c-accent); border-bottom: 1px solid var(--c-border); color: var(--c-accent); }
.v3-md-h3 { font-size: 14px; font-weight: 600; margin: 10px 0 4px; color: var(--c-accent); }
/* 代码块容器(需求3 A+D,2026-07-07): 工具栏(lang+复制) + pre, 整体边框背景 */
.v3-md-code {
  margin: 8px 0;
  border: 1px solid var(--c-border);
  border-radius: var(--radius-sm);
  overflow: hidden;
  background: var(--c-surface-3);
}
.v3-md-code-bar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 5px 12px;
  border-bottom: 1px solid var(--c-border);
  background: rgba(255,255,255,0.03);
  font-size: 11px;
}
.v3-md-code-lang { color: var(--c-text-2); font-family: var(--font-mono); }
.v3-md-code-copy { color: var(--c-accent); cursor: pointer; user-select: none; font-size: 11px; }
.v3-md-code-copy:hover { opacity: 0.8; }
/* pre 保留 v3-md-codeblock class(兼容 app.js 横滑 closest 判断), 但样式瘦身成容器内层 */
.v3-md-codeblock {
  margin: 0;
  border: none;
  border-radius: 0;
  padding: 12px 14px;
  overflow-x: auto;
  font-family: var(--font-mono);
  font-size: 12px;
  line-height: 1.5;
  white-space: pre;
}
/* 数字胶囊(需求3 A+D,2026-07-07): 淡金背景圆角, 突出金额/规模/倍数类数字 */
.v3-md-num {
  background: var(--c-accent-bg);
  color: var(--c-accent);
  padding: 0 5px;
  border-radius: 6px;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
}
.v3-md-inline {
  background: var(--c-surface-3);
  padding: 1px 5px;
  border-radius: 3px;
  font-family: var(--font-mono);
  font-size: 0.9em;
}
/* 需求3(2026-07-07): markdown 表格样式——边框/表头底色/斑马行,对比数据一目了然 */
.v3-md-table {
  width: 100%;
  border-collapse: collapse;
  margin: 8px 0 12px;
  font-size: 13px;
  table-layout: fixed;     /* 固定布局列宽均分,窄屏(移动端375)不撑破气泡 */
}
.v3-md-table th, .v3-md-table td {
  border: 1px solid var(--c-border);
  padding: 6px 9px;
  text-align: left;
  word-break: break-word;  /* 长内容换行,绝不撑破气泡 */
}
.v3-md-table th {
  background: var(--c-accent-bg);
  color: var(--c-accent);
  font-weight: 600;
}
.v3-md-table tr:nth-child(even) td {
  background: rgba(255,255,255,0.025);
}
.v3-md-hr {
  border: none;
  border-top: 1px solid var(--c-border-2);
  margin: 10px 0;
}
.v3-md-link { color: var(--c-accent); text-decoration: underline; }

/* ─── Pick Card (weibo) ─── */
.v3-pick-card {
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  border-radius: var(--radius-md);
  padding: 14px 16px;
  margin-bottom: 12px;
  transition: border-color .12s;
}
.v3-pick-card:hover { border-color: var(--c-accent-border); }
.v3-pick-cat {
  display: inline-block;
  font-size: var(--t-meta);
  padding: 2px 8px;
  border-radius: 3px;
  background: var(--c-accent-bg);
  color: var(--c-accent);
  font-weight: 500;
  margin-bottom: 8px;
}
.v3-pick-text {
  font-size: 13px;
  line-height: 1.7;
  white-space: pre-wrap;
  margin-bottom: 10px;
}
.v3-pick-images {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 4px;
  margin-bottom: 10px;
}
.v3-pick-img {
  width: 100%;
  aspect-ratio: 1;
  object-fit: cover;
  border-radius: var(--radius-sm);
}
.v3-pick-comments {
  background: var(--c-surface-2);
  border-radius: var(--radius-sm);
  padding: 8px 10px;
}
.v3-pick-comment {
  font-size: 12px;
  line-height: 1.6;
  color: var(--c-text-2);
  padding: 3px 0;
}
.v3-pick-comment b {
  color: var(--c-accent);
  font-weight: 500;
}
.v3-pick-more {
  font-size: 11px;
  color: var(--c-text-3);
  padding-top: 4px;
}

/* ─── Tab Bar (video detail modal) ─── */
.v3-tab-bar {
  display: flex;
  gap: 0;
  border-bottom: 1px solid var(--c-border);
  margin: 0 -20px;
  padding: 0 20px;
}
.v3-tab-btn {
  flex: 1;
  padding: 10px 0;
  border: none;
  background: transparent;
  color: var(--c-text-3);
  font-size: 13px;
  font-weight: 500;
  font-family: inherit;
  cursor: pointer;
  position: relative;
  transition: color .12s;
}
.v3-tab-btn:hover { color: var(--c-text-2); }
.v3-tab-btn.active { color: var(--c-accent); }
.v3-tab-btn.active::after {
  content: '';
  position: absolute;
  bottom: -1px;
  left: 20%;
  right: 20%;
  height: 2px;
  background: var(--c-accent);
  border-radius: 1px;
}
/* 转录tab一键复制按钮(2026-08-16): 会员复制全文, 非会员弹升级引导 */
.v3-copy-btn {
  display: inline-flex;
  align-items: center;
  padding: 5px 12px;
  border: 1px solid var(--c-accent-border);
  border-radius: 14px;
  background: transparent;
  color: var(--c-accent);
  font-size: 12px;
  font-family: inherit;
  cursor: pointer;
  transition: background .12s, opacity .12s;
}
.v3-copy-btn:hover { background: var(--c-accent-bg); }
.v3-copy-btn:active { opacity: .8; }
/* 存图按钮：固定宽不挤tab，靠右 */
.v3-tab-shot {
  flex: none;
  padding: 8px 12px;
  border: none;
  background: var(--c-accent-bg);
  color: var(--c-accent);
  font-size: 12px;
  font-weight: 600;
  font-family: inherit;
  cursor: pointer;
  border-radius: var(--radius-sm);
  margin-left: auto;
  align-self: center;
  transition: background .12s;
}
.v3-tab-shot:hover { background: var(--c-accent-border); }
.v3-tab-shot:active { transform: scale(.96); }
.v3-tab-shot.loading { opacity: .6; pointer-events: none; }

/* ─── 移动端: 视频弹窗→贴底抽屉(2026-08-06, iOS Peek 半屏) ─── */
/* 桌面端保持居中弹窗(上面 .v3-modal 默认样式); 仅 ≤768px 改贴底抽屉 */
@media (max-width: 768px) {
  .v3-modal-overlay {
    align-items: flex-end;       /* 贴底 */
    padding: 0;
  }
  .v3-modal {
    width: 100% !important;      /* !important 压过 videos.js 内联 maxWidth:640 */
    max-width: none !important;
    height: 58vh;                /* Peek 半屏默认态 */
    max-height: none;
    border-radius: 16px 16px 0 0;
    border-left: none; border-right: none; border-bottom: none;
    transition: height .3s ease;
    /* 顶部拖拽手柄(伪元素) */
    padding-top: 8px;
  }
  .v3-modal::before {
    content: '';
    display: block;
    width: 36px; height: 4px;
    border-radius: 2px;
    background: var(--c-border);
    margin: 0 auto 4px;
    flex-shrink: 0;
  }
  .v3-modal.expanded { height: 92vh; }
  .v3-modal-header { padding: 8px 12px 10px; }
  /* 5 个纯文字 tab 移动端微调防挤 */
  .v3-tab-btn { font-size: 12px; padding: 9px 0; }
  .v3-modal-back { padding: 4px 4px; }
  .v3-modal-shot { font-size: 17px; padding: 4px 5px; }
}

/* ≤340 老设备(320屏): tab nowrap+缩字号11px 防折行裁字(主流375+不受影响) */
@media (max-width: 340px) {
  .v3-tab-btn { white-space: nowrap; font-size: 11px; overflow: hidden; }
}

.v3-sticky-bar {
  position: -webkit-sticky;
  position: sticky;
  top: calc(-1 * var(--sp-xl));
  z-index: 10;
  background: var(--c-bg);
  padding-top: var(--sp-xl);
  padding-bottom: 12px;
  margin-top: calc(-1 * var(--sp-xl));
  /* 强制创建新的堆叠上下文，防止 iOS Safari sticky 失效 */
  transform: translateZ(0);
  -webkit-transform: translateZ(0);
  will-change: transform;
}
/* ─── Hide LightweightCharts watermark/branding ─── */
.v3-kline-chart a,
.v3-kline-chart [class*="copyright"],
.v3-kline-chart [class*="watermark"],
.v3-kline-chart [class*="apply-overflow"] + a {
  display: none !important;
  pointer-events: none !important;
  position: absolute !important;
  left: -9999px !important;
}

/* ─── Weibo Modal ─── */
.v3-weibo-item {
  padding-bottom: 16px;
  margin-bottom: 16px;
  border-bottom: 1px solid var(--c-border);
}
.v3-weibo-item:last-child {
  border-bottom: none;
  margin-bottom: 0;
  padding-bottom: 0;
}
.v3-weibo-text {
  font-size: 13px;
  line-height: 1.7;
  margin-bottom: 10px;
  white-space: pre-wrap;
}
.v3-weibo-images {
  display: flex;
  gap: 6px;
  margin-bottom: 10px;
  overflow-x: auto;
}
.v3-weibo-img {
  width: 100px;
  height: 100px;
  object-fit: cover;
  border-radius: var(--radius-sm);
  flex-shrink: 0;
  cursor: pointer;
}
.v3-weibo-comments {
  background: var(--c-surface-2);
  border-radius: var(--radius-sm);
  padding: 8px 10px;
}
.v3-weibo-comment {
  font-size: 12px;
  line-height: 1.6;
  color: var(--c-text-2);
  padding: 3px 0;
}
.v3-weibo-comment b {
  color: var(--c-accent);
  font-weight: 500;
}
.v3-weibo-cat {
  display: inline-block;
  font-size: var(--t-meta);
  padding: 1px 6px;
  border-radius: 3px;
  background: var(--c-accent-bg);
  color: var(--c-accent);
  margin-bottom: 6px;
}

/* ─── Hot Comment (video detail) ─── */
.v3-comment-item {
  padding: 8px 10px;
  background: var(--c-surface-2);
  border-radius: var(--radius-sm);
  margin-bottom: 6px;
}
/* v440(2026-09-17 需求3): 转发气泡点击定位高亮 — 滚到目标评论后金色描边闪烁2次示意落点
   (评论卡背景有 inline style, 用 outline 动画避免被压住) */
@keyframes v3-locate-flash {
  0%, 100% { outline: 2px solid transparent; outline-offset: 1px; }
  50% { outline: 2px solid var(--c-accent); outline-offset: 1px; }
}
.v3-locate-flash { animation: v3-locate-flash 650ms ease-in-out 2; }
.v3-comment-text {
  font-size: 13px;
  line-height: 1.6;
  margin-bottom: 4px;
}
.v3-comment-meta {
  font-size: 11px;
  color: var(--c-text-3);
  display: flex;
  gap: 8px;
  align-items: center;
}
.v3-comment-badge {
  font-size: var(--t-meta);
  padding: 1px 5px;
  border-radius: 3px;
  font-weight: 500;
}
/* 评论图片缩略图(2026-07-20): flex-wrap 换行排列自适应弹窗宽度,
   禁止横向溢出(PWA窄屏不逼用户横划), 只随评论tab上下滚动.
   96px缩略图+8gap(主人2026-07-20要"再大些看着自然"), max-width:100%保证
   永不超评论区宽度——一行容几张由弹窗宽度自动决定, flex-wrap自动换行 */
.v3-comment-images {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 6px;
  max-width: 100%;
}
.v3-comment-thumb {
  width: 96px;
  height: 96px;
  border-radius: 8px;
  object-fit: cover;
  flex-shrink: 0;
  cursor: pointer;
  background: var(--c-surface-3);
}

/* ─── K-line Chart ─── */
.v3-kline-section {
  padding: 16px 20px;
  background: var(--c-surface-2);
}
.v3-kline-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 10px;
}
.v3-kline-title {
  font-size: 12px;
  color: var(--c-text-3);
  font-weight: 600;
}
.v3-kline-periods {
  display: flex;
  gap: 4px;
}
.v3-kline-periods .v3-pill {
  font-size: 11px;
  padding: 3px 10px;
}
.v3-kline-chart {
  width: 100%;
  height: 320px;
  border-radius: var(--radius-sm);
  overflow: hidden;
  background: var(--c-surface);
  border: 1px solid var(--c-border);
}
.v3-kline-legend {
  padding: 6px 0;
  font-size: 11px;
  color: var(--c-text-2);
  font-variant-numeric: tabular-nums;
  line-height: 1.8;
  min-height: 20px;
}


/* ═══════════════════════════════════════════════════
   Dashboard video grid & compact cards
   ═══════════════════════════════════════════════════ */
/* 概览三卡网格(2026-10-05 主人令): 移动端单列顺排, ≥900px PC 一行三列(快览条不进网格保持全宽);
   子卡 JS 内联 margin-bottom 由 !important 清零, 间距统一走 grid gap */
.v3-dash-cards {
  display: grid;
  grid-template-columns: 1fr;
  gap: 16px;
  margin-bottom: 20px;
}
.v3-dash-cards > div {
  margin-bottom: 0 !important;
}
@media (min-width: 900px) {
  .v3-dash-cards {
    grid-template-columns: repeat(3, 1fr);
    align-items: stretch;
  }
}
.v3-dash-video-grid {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: 6px;
}
.v3-dash-video-grid .v3-video-card .v3-video-cover {
  aspect-ratio: 3 / 4;
}
.v3-video-thumb {
  aspect-ratio: 3 / 4;
  background: var(--c-surface-2);
  overflow: hidden;
  position: relative;
}
.v3-video-thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform .2s;
}
.v3-video-card:hover .v3-video-thumb img {
  transform: scale(1.05);
}
.v3-video-info {
  padding: 6px 8px 8px;
}
.v3-video-info .v3-video-title {
  font-size: 12px;
  font-weight: 500;
  line-height: 1.35;
  color: var(--c-text);
  display: -webkit-box;
  -webkit-line-clamp: 1;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.v3-video-info .v3-video-meta {
  font-size: 11px;
  color: var(--c-text-3);
  margin-top: 3px;
}

/* ═══════════════════════════════════════════════════
   Mobile video grid — unified (must be last for priority)
   ═══════════════════════════════════════════════════ */
@media (max-width: 768px) {
  .v3-grid-videos,
  .v3-dash-video-grid {
    grid-template-columns: repeat(3, 1fr) !important;
    gap: 6px !important;
  }
  .v3-grid-videos .v3-video-card .v3-video-cover,
  .v3-dash-video-grid .v3-video-card .v3-video-cover {
    aspect-ratio: 3 / 4;
  }
}

/* 通知红点(社区 .v3-forum-badge 用; v239 顶栏 dot 改用 .v3-header-notif-dot 独立样式, 旧 sidebar .v3-notif-badge 系列 DOM 已删清死代码) */
.v3-bnav-item { position: relative; }
.v3-forum-badge {
  position: absolute;
  top: 2px;
  left: 50%;
  margin-left: 6px;  /* 贴 svg 图标右上角(按钮内容居中, 中线右移6px≈图标右缘) */
  min-width: 16px;
  height: 16px;
  padding: 0 4px;
  border-radius: 8px;
  background: var(--c-up);
  color: #fff;
  font-size: 10px;
  font-weight: 700;
  line-height: 1;
  box-sizing: border-box;
  display: none;
  align-items: center;
  justify-content: center;
  z-index: 5;
}

/* 2026-08-02: APP 新版更新红点(顶部 nav "我的" + 底部 bnav "我的"按钮) — 仿 .v3-forum-badge 定位,
   纯圆点无数字,引流用户进设置页检查更新。只 APP 环境显(PWA 浏览器用户不被 APK 更新骚扰)。 */
.v3-nav-item, .v3-bnav-item { position: relative; }  /* bnav 已有,nav 补 relative 兜底红点定位 */

/* v262(2026-08-06): PC sidebar 论坛/聊天室未读红点(PC 无底栏走 sidebar 导航, 原只底栏有 badge PC 看不到) */
.v3-sidebar-badge {
  position: absolute;
  top: 4px;
  right: 4px;
  min-width: 16px;
  height: 16px;
  padding: 0 4px;
  border-radius: 8px;
  background: var(--c-up);
  color: #fff;
  font-size: 10px;
  font-weight: 700;
  line-height: 1;
  box-sizing: border-box;
  display: none;
  align-items: center;
  justify-content: center;
  z-index: 5;
}
.v3-tab-update-dot {
  position: absolute;
  top: 6px;
  right: 50%;
  margin-right: -16px;  /* 贴 svg 图标右上角(按钮内容居中, 中线右移≈图标右缘) */
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: #ec111a;
  box-shadow: 0 0 0 3px rgba(236,17,26,.22);
  display: none;
  z-index: 5;
}

/* ═══ 动效批1 (2026-10-01, UI-MOTION-PLAN-2026-10-01.md 批1交互反馈类) ═══
   曲线参数 SSOT = dev-artifacts/ui-motion-choose-page-2026-10-01.html (主人拍板 demo 实测值) */

/* 8A 按钮缩放涟漪: JS 事件委托(app.js DOMContentLoaded)按点击坐标生成 .v3-ripple, 这里只定样式 */
.v3-ripple {
  position: absolute;
  border-radius: 50%;
  background: rgba(255,255,255,.45);
  transform: scale(0);
  animation: v3-rip .55s ease-out forwards;
  pointer-events: none;
}
@keyframes v3-rip { to { transform: scale(3.2); opacity: 0; } }

/* 6C 涨跌方向浮标: 仅方向徽标挂 v3-dir-up/down(置信徽标不挂, 高置信≠看涨); CSS 三角 + 2.4s 轻浮 */
.v3-dir-up::before, .v3-dir-down::before {
  content: '';
  display: inline-block;
  width: 0; height: 0;
  border-left: 4px solid transparent;
  border-right: 4px solid transparent;
  margin-right: 3px;
  flex-shrink: 0;
}
.v3-dir-up::before {
  border-bottom: 6px solid currentColor;
  animation: v3-dir-float-up 2.4s ease-in-out infinite;
}
.v3-dir-down::before {
  border-top: 6px solid currentColor;
  animation: v3-dir-float-down 2.4s ease-in-out infinite;
}
@keyframes v3-dir-float-up { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-2px); } }
@keyframes v3-dir-float-down { 0%,100% { transform: translateY(0); } 50% { transform: translateY(2px); } }

/* 14A 徽章弹跳出现: 底栏未读/侧栏红点/APK更新点, display:none→flex 切换时自动重播 */
@keyframes v3-badge-pop {
  0%   { transform: scale(0); opacity: 0; }
  55%  { transform: scale(1.35); opacity: 1; }
  100% { transform: scale(1); opacity: 1; }
}
.v3-forum-badge, .v3-sidebar-badge, .v3-tab-update-dot {
  animation: v3-badge-pop .4s cubic-bezier(.3,1.4,.5,1) both;
  transform-origin: center;
}

/* ═══ 动效批2 (2026-10-01, UI-MOTION-PLAN-2026-10-01.md 批2进场体系) ═══
 * 2A 页面方向滑动进场: _switchPage 按 .v3-page DOM 顺序判方向, 新页 index 大 = 从右滑入(l), 小 = 从左滑入(r);
 *   class 挂上后 animationend 自摘, display:none→block 切换天然重播
 */
@keyframes v3-page-in-l { from { transform: translateX(26px); } to { transform: none; } }
@keyframes v3-page-in-r { from { transform: translateX(-26px); } to { transform: none; } }
.v3-page.v3-page-in-l { animation: v3-page-in-l .3s cubic-bezier(.2,0,0,1) both; }
.v3-page.v3-page-in-r { animation: v3-page-in-r .3s cubic-bezier(.2,0,0,1) both; }

/* 7A 逐卡上浮 + 7B 骨架交叉淡入(合并实现): 容器常驻 .v3-stagger, 子项 innerHTML 重建即逐卡错落上浮;
 *   skeleton 态被数据 innerHTML 替换时新子项同款上浮 = 感知上的"骨架→内容交叉";
 *   延迟 45ms/卡 步进, 第 8 张起封顶 315ms 防长列表拖沓
 */
@keyframes v3-card-up { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: none; } }
.v3-stagger > * { animation: v3-card-up .45s cubic-bezier(.2,.8,.2,1) both; }
.v3-stagger > :nth-child(2) { animation-delay: 45ms; }
.v3-stagger > :nth-child(3) { animation-delay: 90ms; }
.v3-stagger > :nth-child(4) { animation-delay: 135ms; }
.v3-stagger > :nth-child(5) { animation-delay: 180ms; }
.v3-stagger > :nth-child(6) { animation-delay: 225ms; }
.v3-stagger > :nth-child(7) { animation-delay: 270ms; }
.v3-stagger > :nth-child(n+8) { animation-delay: 315ms; }

/* ═══ 动效批3 (2026-10-01, UI-MOTION-PLAN-2026-10-01.md 批3结构性改动) ═══
 * 1C 主题切换 View Transitions 圆形揭示: 关掉默认 cross-fade(两帧叠加), 新主题层由 JS clip-path
 *   circle 从点击点扩开盖旧画面; ::view-transition 伪元素 Chrome111+/Safari18+ 才存在,
 *   老内核无此伪元素 = 天然降级为普通切换(JS 侧另有 startViewTransition feature-detect)
 */
::view-transition-old(root), ::view-transition-new(root) { animation: none; mix-blend-mode: normal; }
::view-transition-old(root) { z-index: 1; }
::view-transition-new(root) { z-index: 2; }

/* 16A/16C 多空对冲条生长: chat.js 渲染初始 width 0 + data-w 终值, IntersectionObserver 滚入视口
 *   后 JS 设终值触发本过渡; 数字同步用 rAF 900ms(JS 侧), 与本曲线同期完成
 */
.p16-grow { transition: width .9s cubic-bezier(.2, .8, .2, 1); }

/* 10C 关注星标点亮: 星星默认描边, 已关注填色, 关注瞬间旋入点亮(demo p10-spin 参数) */
.v3-follow-btn .star-ic { display: inline-flex; margin-right: 4px; vertical-align: -2px; }
.v3-follow-btn .star-ic svg { fill: none; stroke: currentColor; transition: fill .3s; }
.v3-follow-btn.v3-follow-btn-on .star-ic svg { fill: currentColor; }
@keyframes v3-star-in { from { transform: rotate(-120deg) scale(.5); opacity: 0; } to { transform: rotate(0) scale(1); opacity: 1; } }
.v3-follow-btn.star-done .star-ic svg { animation: v3-star-in .4s ease; }

/* 2C 详情页内容微缩放进场(demo p2 参数 scale .85→1 + translateY 12px→0): 论坛帖详情/发帖
   overlay 的内容区进场, topbar 保持稳定只动内容 — modal 家族弹窗进场已由 13B v3c-modal-pop 覆盖不重复 */
.v3-full-overlay > .v3-full-body { animation: v3-zoom-in .28s cubic-bezier(.2, .9, .3, 1); }
@keyframes v3-zoom-in { from { opacity: 0; transform: scale(.85) translateY(12px); } to { opacity: 1; transform: none; } }

/* 12B 骨架屏呼吸图标位(demo p12-breath 参数 opacity .45↔1 1.5s): 加载中的内容类型图标占位块自带
   呼吸, 告知"正在加载什么" — 组合体系分工: 12A 流光做底纹 + 12B 呼吸做图标位 + 12C 波浪做文本行,
   图标位独立呼吸不叠 12A 流光(与 demo p12-b.breath 同理关流光层) */
.v3-skel-icon {
  width: 40px; height: 40px;
  border-radius: 12px;
  background: var(--c-surface-2);
  display: flex; align-items: center; justify-content: center;
  color: var(--c-text-3);
  animation: v3-sk-breath 1.5s ease-in-out infinite;
}
.v3-skel-icon svg { width: 20px; height: 20px; stroke: currentColor; fill: none; stroke-width: 1.6; }
@keyframes v3-sk-breath { 0%, 100% { opacity: .45; } 50% { opacity: 1; } }
/* 视频封面骨架场景: 3:4 封面块中央居中(cover 已 position:relative, transform 静态不参与呼吸) */
.v3-video-cover .v3-skel-icon { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); }

/* 1C 主题钮日月旋转 morph(demo p1c 参数 旋转 .45s cubic-bezier(.3,1.3,.4,1)): 切换主题时
   _syncThemeIcon 重注 innerHTML → 新 svg 元素自带动画自动播 = 太阳↔月亮旋转切换, 零 JS 改动;
   首屏初始同步也会播一次(一次性 .45s 无害, 反有点仪式感) */
.v3-sidebar-theme-toggle svg { animation: v3-theme-spin .45s cubic-bezier(.3, 1.3, .4, 1); }
@keyframes v3-theme-spin { from { transform: rotate(-180deg) scale(.5); opacity: 0; } to { transform: none; opacity: 1; } }

/* ═══════════════════════════════════════════════════
 * 老内核 WebView 兜底（2026-07-01 主人小米8实锤 #14续：图片"没加载"真根因）
 * ═══════════════════════════════════════════════════
 * 病灶：aspect-ratio（Chrome88+/2021-01 才支持）老系统 WebView 不支持
 *      → 视频封面/缩略图/精选图容器高度塌陷为 0
 *      → background-image 和 img 虽加载但 0 高度看不见 = 主人说的"图片没加载"
 *      PWA 走 Chrome 浏览器（自动更新）没事，APP 走系统老 WebView（小米8 Android8.0 未更 WebView）中招
 *      （与上次 oklch 雪崩同套路：内核差异，非代码差异）
 * 修法：@supports not 检测不支持 aspect-ratio 时给 min-height 兜底
 *      新内核（支持 aspect-ratio）整块跳过，精确比例完全不受影响
 * ⚠️ 这是真·渐进增强：@supports 是特性检测（Chrome25+ 可靠）
 *      ≠ oklch 双声明错修（对 custom property 无效因变量不校验语法，已 #14 全删 oklch 根治）
 * ═══════════════════════════════════════════════════ */
@supports not (aspect-ratio: 3 / 4) {
  .v3-video-cover,
  .v3-video-cover-text,
  .v3-video-thumb { min-height: 180px; }
  .v3-pick-img { min-height: 100px; }
}

/* ═══════════════════════════════════════════════════
 * 需求⑥: "支持作者"提视觉等级（2026-07-01）
 *   首页低调横幅卡 + 我的页金边入口卡 + 打赏弹窗品牌渐变头图
 *   全用现有 CSS 变量贴合深黑+金色调性，YAGNI 不搞感谢墙
 * ═══════════════════════════════════════════════════ */

/* 我的页"支持作者"强化行：金边渐变卡（区别于普通 v3-settings-row）*/
.v3-settings-donate-row {
  display: flex; align-items: center; gap: 12px;
  width: 100%; padding: 14px 16px; margin-top: 8px;
  background: linear-gradient(135deg, rgba(236,170,11,.14), rgba(236,170,11,.03));
  border: 1px solid rgba(236,170,11,.32);
  border-radius: var(--radius-md);
  cursor: pointer; text-align: left;
  transition: border-color .15s, transform .1s;
}
.v3-settings-donate-row:active { transform: scale(.99); }
.v3-settings-donate-row-icon { color: var(--c-accent); flex-shrink: 0; display: flex; }
.v3-settings-donate-row-body { flex: 1; min-width: 0; }
.v3-settings-donate-row-label { font-size: 15px; font-weight: 600; color: var(--c-text); line-height: 1.3; }
.v3-settings-donate-row-sub { font-size: 12px; color: var(--c-text-3); margin-top: 2px; }
.v3-settings-donate-row-arrow { color: var(--c-text-3); flex-shrink: 0; }

/* 打赏弹窗品牌渐变头图（body 内圆角卡片，金底深字）*/
.v3-donate-hero {
  margin-bottom: var(--sp-md);
  padding: 22px 16px;
  background: linear-gradient(135deg, var(--c-accent) 0%, #B8800A 100%);
  border-radius: var(--radius-md);
  text-align: center; color: #1a1300;
}
.v3-donate-hero-icon { display: flex; justify-content: center; margin-bottom: 6px; }
.v3-donate-hero-title { font-size: 18px; font-weight: 700; }
.v3-donate-hero-slogan { font-size: 12px; opacity: .75; margin-top: 2px; }

/* ═══════════════════════════════════════════════════════
   需求⑧ 微论坛样式 (2026-07-02)
   入口卡(dashboard) / 主页列表(forum.js) / 详情+评论+composer(forum-post.js)
   纯 DOM 配套样式，全用现有 CSS 变量(守 light/dark 双主题)，零硬编码色值
   ═══════════════════════════════════════════════════════ */

/* ─── 论坛主页(forum.js) ─── */
/* v383(2026-08-30) 主人原话"第一个元素区域可以删除了": .v3-forum-head 标题区已删(forum.js 不再渲染), CSS 规则同步删 */
.v3-forum-pills {
  display: flex; gap: 8px; overflow-x: auto; padding-bottom: 6px;
  margin-bottom: 12px; -webkit-overflow-scrolling: touch;
}
.v3-forum-pills::-webkit-scrollbar { display: none; }

.v3-forum-card {
  padding: 14px; cursor: pointer;
  transition: border-color .15s;
}
.v3-forum-card:hover { border-color: var(--c-accent-border); }

/* v406(2026-09-05 主人拍) 论坛卡片多列布局: 大屏 1 列显宽浪费, 根据终端宽度自适应
   < 768px 1列(手机单手浏览不动)
   768~1199px 2列(平板/小PC, 卡片宽度约 360-580)
   ≥ 1200px 3列(桌面端, 卡片宽度约 380-440 不挤)
   实现 = grid minmax(0,1fr) 媒体查询, 0 JS resize 监听(媒体查询浏览器原生, 不抖不重排);
   minmax(0,1fr) 防 intrinsic width 撑爆列宽(跟 .v3-forum-card { min-width:0 } 配合);
   grid item 默认 stretch, 同行卡片自动等高(复用 v404 等高 206 锚);
   .v3-forum-card { min-width:0 } 让 flex 两栏(left+thumb) 能被 grid 强制压缩, 修 375 移动端卡片撑爆 603px > 视口 375px bug;
   margin-bottom 清零, 间距改由 grid gap 接管(避免 grid 里 margin 重叠成 2 倍). */
#v3ForumList,
.v3-forum-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 10px;
}
#v3ForumList .v3-forum-card,
.v3-forum-grid .v3-forum-card { margin-bottom: 0; min-width: 0; }
@media (min-width: 768px) {
  #v3ForumList, .v3-forum-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 1200px) {
  #v3ForumList, .v3-forum-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
/* v488 概览社区动态移动端引导条(A+D 方案 D): 「共 N 条·去论坛看全部」, 金色品牌胶囊, JS 移动端才 append */
.v3-dash-forum-more {
  display: flex;
  align-items: center;
  justify-content: center;
  /* margin-bottom 64px: 避让底部浮层(PWA 安装横幅/发帖 FAB), 滚到底不被盖 */
  margin: 14px auto 64px;
  padding: 10px 24px;
  border: 1px solid var(--c-accent);
  border-radius: 999px;
  color: var(--c-accent);
  font-size: 13px;
  font-weight: 600;
  text-decoration: none;
  width: fit-content;
}
.v3-dash-forum-more:active { opacity: .75; }
.v3-forum-card-top { display: flex; align-items: center; gap: 10px; }
.v3-forum-avatar {
  width: 34px; height: 34px; border-radius: 50%; flex-shrink: 0;
  position: relative; overflow: hidden;  /* 头像联动: .v3-avatar-img absolute需relative锚定否则占满屏 */
  background: var(--c-accent-bg); color: var(--c-accent);
  display: flex; align-items: center; justify-content: center;
  font-size: 14px; font-weight: 700;
}
.v3-forum-avatar-sm { width: 26px; height: 26px; font-size: var(--t-meta); }
.v3-forum-card-meta { flex: 1; min-width: 0; }
.v3-forum-card-title {
  font-size: 16.5px; font-weight: 700; color: var(--c-text);
  margin-top: 8px; line-height: 1.4; letter-spacing: -0.2px;
}
.v3-forum-card-snippet {
  font-size: var(--t-meta); color: var(--c-text-2);
  margin-top: 4px; line-height: 1.5;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.v3-forum-card-foot {
  display: flex; gap: 18px; margin-top: 10px;
  padding-top: 8px; border-top: 1px solid var(--c-border);
  align-items: center;   /* 2026-08-10 需求4: stat/sep 垂直居中, 治分隔符竖线歪斜 */
  flex-wrap: wrap; row-gap: 4px;   /* v404: 320 窄屏 foot(赞stack+评论+时间+pin钮)塞不下时兜底折行不溢出, 375+ 不触发 */
}
.v3-forum-stat {
  display: inline-flex; align-items: center; gap: 4px;
  font-size: var(--t-meta); color: var(--c-text-3);
  font-variant-numeric: tabular-nums; white-space: nowrap;   /* 2026-08-10 需求4: 等宽数字防位数变化跳动 */
  /* v350.8(2026-08-21) 主人 #1 治本: v350.7 #2 把 span 改 button 后, <button> 浏览器 user-agent 默认背景
     rgb(239,239,239) 漏重置导致 chip 白底. 全局重置 button-as-stat 背景/边框/光标, light+dark 双主题一致 */
  background: transparent; border: none; padding: 0; cursor: pointer;
  font-family: inherit;
}
.v3-forum-stat:focus-visible { outline: 2px solid var(--c-accent); outline-offset: 2px; border-radius: 4px; }
.v3-forum-stat-on { color: var(--c-like-flat); }
/* 2026-08-10 需求3 + v350.7 主人 #4: 已点赞实心金心(用 i-heart-fill 实心 symbol, 替代 v350.4 单色 fill, 实心视觉更清晰) */
/* 2026-08-10 需求3: 点赞弹跳动画(详情页 toggle 点赞成功触发, 列表卡静态实心) */
/* 2026-08-10 需求3: 点赞弹跳动画(详情页 toggle 点赞成功触发, 列表卡静态实心) */
/* 动效批1 9B: 关键帧对齐弹簧过冲(p9-spring demo 参数), 曲线换弹簧 */
@keyframes v3-heart-pop {
  0% { transform: scale(1); }
  30% { transform: scale(1.4); }
  55% { transform: scale(.85); }
  75% { transform: scale(1.12); }
  100% { transform: scale(1); }
}
.v3-heart-popping svg { animation: v3-heart-pop .5s cubic-bezier(.3,1.3,.4,1); transform-origin: center; }
.v3-forum-sep { width: 1px; height: 14px; background: var(--c-border-2); flex-shrink: 0; }   /* 2026-08-04 P0: 操作行竖线分组(社交|统计) */
.v3-pill-mini { padding: 2px 8px; font-size: 11px; border-radius: 4px; }
.v3-forum-deleted { opacity: .55; }
.v3-forum-deleted-tag {
  flex-shrink: 0; padding: 2px 8px; font-size: 11px;
  background: var(--c-surface-3); color: var(--c-text-3); border-radius: 4px;
}

/* ─── 任务② 置顶帖金边视觉(2026-07-06, DRY 金边渐变范式 L1470) ─── */
.v3-forum-card.v3-forum-pinned {
  background: linear-gradient(135deg, rgba(236,170,11,.10), rgba(236,170,11,.02));
  border-color: rgba(236,170,11,.38);
}
.v3-forum-pin-icon {                                  /* 标题前 📌 图标 */
  color: var(--c-accent); flex-shrink: 0; display: inline-flex; align-items: center;
}
.v3-forum-num-tag {                                    /* v343(2026-08-21) 帖子显示编号 #N: 金色徽章, 软删保留不释放 */
  display: inline-flex; align-items: center; flex-shrink: 0;
  font-size: 12px; font-weight: 600; line-height: 1.4;
  padding: 1px 7px; border-radius: 4px;
  color: var(--c-accent); background: var(--c-accent-bg);
  border: 1px solid rgba(236,170,11,.38);
  letter-spacing: 0.2px; font-variant-numeric: tabular-nums;
}
/* v404(2026-09-05) 主人拍「置顶按钮缩小」: 文字大按钮 → 图钉 icon 小钮, 高 20px 不再撑高 foot 行;
   已置顶帖(v3-forum-pinned 卡)金色常亮, 未置顶灰色, 语义走 button title+aria-label */
.v3-forum-pin-btn {
  margin-left: auto; padding: 3px; line-height: 0; flex-shrink: 0;
  min-height: 0;   /* 全局 button min-height:44px 会撑高 foot 行, icon 小钮必须压回 */
  color: var(--c-text-3); background: transparent; border: none; border-radius: 6px;
  cursor: pointer; transition: transform .1s, color .15s;
  position: relative;
}
/* v404 触控热区补偿(治 7-31 44px 规则删除后的误触回退): 视觉 20px 小钮, 伪元素扩到 ~44px;
   横向 inset 12px < foot gap 18px 不侵入邻居, 纵向 foot 行内无邻居安全 */
.v3-forum-pin-btn::after { content: ''; position: absolute; inset: -12px; }
.v3-forum-pin-btn:active { transform: scale(.92); }
.v3-forum-card.v3-forum-pinned .v3-forum-pin-btn { color: var(--c-accent); }

/* ─── v404-c(2026-09-05 主人拍) 卡片 grid 两列 ───
   左列 = 标题行+正文行(纵向堆叠), 右列 = 图(纵向跨标题+正文两行 stretch 跟满);
   min-height 96 当等高锚(锁帖卡 title+snippet+hint 胶囊实测 96, 取最高内容), 有图/无图/锁帖卡片高度统一 */
.v3-forum-card-grid {
  display: flex; gap: 10px; margin-top: 6px;
  min-height: 96px; align-items: stretch;
}
.v3-forum-card-left { flex: 1; min-width: 0; }
.v3-forum-card-main { min-width: 0; }
.v3-forum-card-title-text {          /* v404-c 超长标题跑马灯: 外层裁剪(短标题静止不变), 溢出时 JS 加渐隐 mask */
  display: block; overflow: hidden; white-space: nowrap; min-width: 0;
}
.v3-forum-card-title-text.v3-marquee-on {   /* 只在真溢出时右缘渐隐, 短标题不加 */
  -webkit-mask-image: linear-gradient(90deg, #000 86%, transparent);
  mask-image: linear-gradient(90deg, #000 86%, transparent);
}
.v3-forum-card-title-inner { display: inline-block; }
.v3-forum-card-title-inner.v3-marquee-run { /* 内层滚动体: 尾部留 28px 间距, 滚到露出全文再回起点 */
  padding-right: 28px;
  animation: v3-forum-marquee var(--dur, 8s) linear infinite;
}
@keyframes v3-forum-marquee {
  0%, 10% { transform: translateX(0); }
  90%, 100% { transform: translateX(calc(-100% + var(--mw, 100%))); }
}
@media (prefers-reduced-motion: reduce) {
  .v3-forum-card-title-inner.v3-marquee-run { animation: none; }
}
.v3-forum-card-main .v3-forum-lock-hint { margin-top: 6px; }

/* ─── 需求5 帖子会员可见性锁定及打码遮罩 (2026-08-14) ─── */
.v3-forum-lock-card {
  position: relative;
  border: 1px dashed var(--c-accent-border) !important;
  background: var(--c-surface-2) !important;
}
/* v372 Issue 2 角标(2026-08-28 主人 1 字不改立选 A): 锁态帖卡右上角"会员专享"小角标
   会员/非会员都显, 让会员有"哦这是会员帖我正能看"身份感, 非会员有"哦原来这帖要会员"提示
   配合 v-forum-lock-card 虚线金色边框 双重提示, 复用 SVG #i-lock */
.v3-forum-card-badge {
  position: absolute;
  top: 8px;
  right: 8px;
  display: inline-flex;
  align-items: center;
  gap: 3px;
  padding: 2px 8px 2px 6px;
  background: var(--c-accent);
  color: #1a1f28;
  font-size: 10.5px;
  font-weight: 600;
  border-radius: 10px;
  line-height: 1.4;
  z-index: 1;
  box-shadow: 0 1px 3px rgba(0,0,0,0.2);
}
.v3-forum-card-badge svg { color: #1a1f28; flex-shrink: 0; }
.v3-forum-lock-hint {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 13px;
  color: var(--c-accent);
  font-weight: 600;
  margin-top: 8px;
  padding: 6px 10px;
  background: var(--c-accent-bg);
  border-radius: 6px;
  border: 1px solid rgba(236, 170, 11, 0.15);
}
.v3-forum-lock-hint svg {
  color: var(--c-accent);
  flex-shrink: 0;
}
.v3-forum-lock-mask {
  position: absolute;
  left: 0; right: 0; bottom: 0; top: 0;
  background: linear-gradient(180deg, rgba(var(--c-surface-rgb), 0) 0%, rgba(var(--c-surface-rgb), 0.3) 40%, rgba(var(--c-surface-rgb), 0.95) 90%, var(--c-surface) 100%);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: flex-end;
  padding: 16px;
  z-index: 5;
  pointer-events: none;
}

/* ─── 任务③ 管理员徽章(2026-07-06, 评论/子评论 author 旁) ─── */
.v3-admin-badge {
  display: inline-flex; align-items: center;
  padding: 1px 6px; margin-left: 6px; font-size: 10px; font-weight: 700;
  color: #1a1300; background: linear-gradient(135deg, var(--c-accent), #B8800A);
  border-radius: 3px; vertical-align: middle; line-height: 1.6; white-space: nowrap;
}
/* 2026-08-12 需求2: 会员类别标签(Plus/Pro) —— 金色边框 outline 风格, 与管理员实心区分 */
.v3-role-badge {
  display: inline-flex; align-items: center;
  padding: 1px 6px; margin-left: 6px; font-size: 10px; font-weight: 700;
  color: var(--c-accent); border: 1px solid var(--c-accent);
  border-radius: 3px; vertical-align: middle; line-height: 1.6; white-space: nowrap;
  background: transparent;
}

/* ─── 全屏浮层(发帖 forum.js.openNewPost / 详情 forum-post.js.open 共用) ─── */
.v3-full-overlay {
  position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1000;
  background: var(--c-bg);
  display: flex; flex-direction: column;
}
.v3-full-topbar {
  position: sticky; top: 0; z-index: 2;
  display: flex; align-items: center; gap: 8px;
  /* 2026-08-05: 让出安卓状态栏——dahubenhu/小米8 进论坛详情/发帖,顶栏(‹返回+标题)被系统状态栏吃掉 */
  padding: calc(env(safe-area-inset-top, 0px) + 12px) 14px 12px;
  background: var(--c-bg);
  border-bottom: 1px solid var(--c-border);
}
.v3-full-back {
  background: none; border: none; color: var(--c-text);
  display: flex; align-items: center; cursor: pointer; padding: 4px;
}
.v3-full-title { font-size: 16px; font-weight: 600; color: var(--c-text); }
.v3-full-body {
  flex: 1; overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 14px;
}
.v3-full-body-with-composer { padding-bottom: 80px; }   /* 底部 composer fixed 留白防遮 */

/* 桌面端详情/发帖浮层改居中面板(2026-08-01 主人定,治"点进去全屏+正文贴边"):
   原全屏 fixed inset:0 拉满屏宽 → 桌面宽屏文字贴屏幕边、点进去"又全屏"。
   主流社区(Reddit/掘金/即刻)详情都是居中列,对齐本站论坛列表/聊天室(480-760px margin:auto)布局。
   桌面:overlay 两侧半透明遮罩,topbar+body+composer 连成 680 居中面板(圆角+阴影),上下留白不贴屏边;
   移动端(<769px)保持原全屏(屏窄全屏合理),不动。 */
@media (min-width: 769px) {
  .v3-full-overlay {
    background: rgba(0, 0, 0, .55);   /* 两侧半透明遮罩,透出后面 app 上下文 */
    align-items: center;              /* flex column 下子元素水平居中成面板 */
    padding: 24px 0;                  /* 面板上下离屏边,治贴边 */
  }
  .v3-full-overlay > .v3-full-topbar {
    width: 100%; max-width: 680px;
    border-radius: 12px 12px 0 0;
    border-top: 1px solid var(--c-border);
    border-left: 1px solid var(--c-border);
    border-right: 1px solid var(--c-border);
    box-shadow: 0 8px 32px rgba(0, 0, 0, .4);
  }
  .v3-full-overlay > .v3-full-body {
    width: 100%; max-width: 680px;
    background: var(--c-bg);
    border-left: 1px solid var(--c-border);
    border-right: 1px solid var(--c-border);
    padding: 18px 22px;               /* 正文边距加大,治文字贴边 */
    box-shadow: 0 8px 32px rgba(0, 0, 0, .4);
  }
  /* composer 原 fixed 全宽 → 桌面端也居中收窄,与面板连体(同 680 宽)
     v251(2026-08-05): 加 .v3-full-overlay 父选择器提特异性——治源码顺序覆盖:
     基础规则 .v3-forum-composer(下方 1844)写在 @media 之后,同特异性后者赢,
     致桌面 left:0(基础)覆盖 left:50%(本块)但 transform:translateX(-50%)(本块,基础没写)仍生效
     → left:0+translateX(-50%)+width:680 = 整体左偏 340px 跑到屏幕左侧。加父选择器拉高特异性根治。 */
  .v3-full-overlay .v3-forum-composer {
    left: 50%; right: auto; transform: translateX(-50%);
    width: 100%; max-width: 680px;
    border-radius: 0 0 12px 12px;
    border-left: 1px solid var(--c-border);
    border-right: 1px solid var(--c-border);
    border-bottom: 1px solid var(--c-border);
    box-shadow: 0 8px 32px rgba(0, 0, 0, .4);
  }
}
.v3-field-label {
  font-size: var(--t-meta); color: var(--c-text-3);
  margin-bottom: 6px; font-weight: 500;
}
.v3-pill-row { display: flex; gap: 8px; flex-wrap: wrap; }

/* ─── 帖子详情(forum-post.js) ─── */
.v3-forum-detail { margin-bottom: 14px; padding: 14px; border-bottom: 1px solid var(--c-border-2); }  /* v350.7(2026-08-21) 主人 #5: 加 padding 14px 跟 .v3-forum-card 一致, 治"主内容贴边没边距" */
.v3-forum-detail-title {
  font-size: 22px; font-weight: 700; color: var(--c-text);
  margin-top: 14px; line-height: 1.3; letter-spacing: -0.3px;
}
.v3-forum-detail-title .v3-forum-num-tag {            /* v343 详情页编号: 详情 h2 字号 22 比列表 14 大, num-tag 自适应 13px */
  font-size: 13px; padding: 2px 9px;
}
.v3-forum-detail-content {
  font-size: var(--t-body); color: var(--c-text);
  line-height: 1.6; margin-top: 8px; white-space: pre-wrap; word-break: break-word;
}
.v3-forum-detail-acts {
  display: flex; gap: 16px; margin-top: 12px;
  padding-top: 10px; border-top: 1px solid var(--c-border);
}
.v3-forum-act {
  display: inline-flex; align-items: center; gap: 4px;
  background: none; border: none; cursor: pointer;
  color: var(--c-text-3); font-size: var(--t-meta); font-family: inherit;
  padding: 4px 2px; transition: color .12s;
}
.v3-forum-act:hover { color: var(--c-text-2); }
.v3-forum-act-on { color: var(--c-like-flat); }           /* v350(2026-08-21) 主人 4 区: 金棕主题色 + v350.7 #4 已点赞心改 i-heart-fill 实心 (CSS fill 不再必要) */
.v3-forum-stat-on, .v3-forum-act-on {
  /* v350(2026-08-21) 主人 4 区: 金棕单色高亮(去渐变文字特效, 金棕主题用单色更清晰) */
  font-weight: 700;
}
.v3-forum-act-danger { color: var(--c-down); }          /* 删除按钮红 */
.v3-forum-act-danger:hover { color: var(--c-down); opacity: .8; }

.v3-forum-cmt-title {
  font-size: var(--t-body); font-weight: 700; color: var(--c-text-2);
  margin: 14px 0 10px; padding: 8px 12px;
  background: var(--c-surface-2); border-radius: 8px;
  border-left: 3px solid var(--c-accent);              /* P1③: 评论标题浅背景条+金竖线锚点 */
}
/* 2026-08-12 #7: 评论排序切换按钮条 */
.v3-forum-sort-bar { display: flex; gap: 6px; margin: 12px 0 4px; }
/* v350.10(2026-08-21) 主人 #3 重发: 恢复 v350.7 同行模式 (范围左 + 排序右 space-between), label-less 沿用 v350.8 (主人 v350.7 时拍"只留快捷按钮")
   v383(2026-08-30) 主人原话"筛选和排序所在行应该固定在页面顶部": sticky 钉 .v3-content 滚动容器顶.
   负 margin 拉满宽(--pad-page 桌面28/移动16 自动适配) + bg 防内容两侧穿出 + 底边框分层. */
.v3-forum-sort-wrap { display: flex; flex-direction: row; justify-content: space-between; align-items: center; gap: 8px; flex-wrap: wrap;
  position: sticky; top: 0; z-index: 20;
  margin: 0 calc(-1 * var(--pad-page)) 8px; padding: 10px var(--pad-page) 8px;
  background: var(--c-bg); border-bottom: 1px solid var(--c-border);
}
.v3-forum-sort-row {
  display: inline-flex; align-items: center; gap: 6px; flex-wrap: wrap;
}
.v3-forum-sort-btn {
  font-size: 12px; padding: 4px 14px; border-radius: 14px;
  border: 1px solid var(--c-border); background: var(--c-surface);
  color: var(--c-text-2); cursor: pointer; transition: all .15s;
}
/* 触摸目标扩44px(审计P2): 视觉不变, ::before隐形热区(26高→44) */
.v3-forum-sort-btn { position: relative; }
.v3-forum-sort-btn::before { content: ''; position: absolute; inset: -9px 0; }
.v3-forum-sort-btn:hover { border-color: var(--c-accent); color: var(--c-accent); }
.v3-forum-sort-on, .v3-forum-sort-on:hover {
  background: var(--c-accent); color: var(--c-accent-text); border-color: var(--c-accent);
  font-weight: 600;
}
.v3-forum-date-divider {                          /* P1⑦: 日期分组分隔条(CSS原零定义裸div补样式,对比度提到text-2) */
  font-size: 11px; color: var(--c-text-2); text-align: center;
  margin: 16px 0 8px; letter-spacing: .5px;
}
.v3-forum-comment { margin-bottom: 8px; }
.v3-forum-cmt-head { display: flex; align-items: center; gap: 8px; }
.v3-forum-cmt-author { font-size: var(--t-meta); font-weight: 600; color: var(--c-text); }
.v3-forum-cmt-content {
  font-size: var(--t-body); color: var(--c-text); line-height: 1.55;
  margin-top: 4px; white-space: pre-wrap; word-break: break-word;
}
.v3-forum-cmt-acts { display: flex; gap: 14px; margin-top: 4px; }

/* 子评论(2层楼中楼)：竖线缩进(border-left 省 margin，B站/知乎范式) */
.v3-forum-children {
  margin-left: 12px; padding-left: 10px;
  border-left: 2px solid var(--c-border); margin-top: 6px;
}
.v3-forum-child { padding: 6px 0; }
.v3-forum-child + .v3-forum-child { border-top: 1px solid var(--c-border); }

/* 需求5: 我的帖子/评论/回复特殊标记(金边高亮+作者名金色"（我）") */
.v3-forum-mine {
  border: 1px solid var(--c-accent) !important;
  box-shadow: 0 0 0 2px var(--c-accent-bg);
  border-radius: var(--radius-md);
}
.v3-forum-mine .v3-forum-cmt-author { color: var(--c-accent); }
.v3-forum-expand {
  background: none; border: none; cursor: pointer;
  color: var(--c-accent); font-size: var(--t-meta); font-family: inherit;
  padding: 4px 0; margin-top: 2px;
}

/* 底部评论输入条(fixed，盖在 overlay 之上，z 高于 body) */
.v3-forum-composer {
  position: fixed; bottom: 0; left: 0; right: 0; z-index: 1001;
  /* 2026-08-05: 让出安卓底部导航条 safe-area,回复输入条不被系统手势条/导航栏遮 */
  padding: 8px 12px calc(env(safe-area-inset-bottom, 0px) + 8px);
  background: var(--c-bg);
  border-top: 1px solid var(--c-border);
}
/* v368 调研3(2026-08-28 主人原话 1 字不改): 论坛 PWA 输入法盖输入框 → 跟 chat-room v358 1:1 范式,
   键盘态 fixed + translateY(-overlap) 顶键盘上沿(由 app.js L1514 推 selector 列表加 .v3-forum-composer 驱动).
   收键盘归 0(translateY(0)). */
.cr-keyboard-open .v3-forum-composer { transform: translateY(0); transition: transform 0.18s ease-out; }

/* ═══ v252(2026-08-05) 小米8/窄屏(≤414px)样式收口 ═══
   断点 380→414(主人2026-08-05定): 小米8真机 WebView CSS 宽度≈412px>380, 原 @media380 对小米8不触发,
   v248e/v251 一堆窄屏修复全失效(铁律"只修小米8"反让小米8漏在断点外)。抬到 414 覆盖小米8(412)+常见 360-411 窄屏机。
   治用户反馈:①头像+昵称+管理员徽章挤一团 ②视频库筛选标签拥挤+热词栏无间距 ③顶栏头像误触铃铛。 */
@media (max-width: 414px) {
  /* ① 论坛评论:头像+昵称+徽章 收间距 */
  .v3-forum-cmt-head { gap: 4px; }
  /* 管理员徽章全局收(帖子/评论/列表卡所有徽章都缩,治咬昵称尾巴) */
  .v3-admin-badge { margin-left: 4px; padding: 1px 4px; font-size: 9px; }
  /* ① 个人设置:头像缩+昵称/会员群钮间距收 */
  .v3-settings-header { gap: var(--sp-sm); }
  .v3-settings-avatar { width: 44px; height: 44px; }  /* 40→44(审计P2): 移动端触摸目标达标 */
  .v3-settings-name { font-size: 15px; }
  /* ② 视频库筛选标签:padding/字号收,治一长串标签挤一行 */
  .v3-pill { padding: 5px 10px; font-size: 11px; }
  /* ② 热词栏间距(治"大家都在搜按钮无间距"): gap 4→6px 更明显 */
  #v3HotSearchRow { gap: 6px; }
  /* ② 热词栏按钮放大胶囊化(项6,2026-08-05 主人反馈"快捷按钮样式还是没解决"):
     原 .v3-pill 全局 5px 10px/11px/实测高26.5px 触摸目标远低 iOS HIG 44px + 深灰底 rgb(28,28,40)
     近似背景糊一片(对比度低看着小气)。scoped #v3HotSearchRow(特异性 0,2,0 > 全局 .v3-pill 0,1,0)
     不污染 forum-pills/kline-periods 等其他 .v3-pill。参考 vant Tag(round) 胶囊设计: 圆角999+
     边框+适中padding, min-height 提触摸目标, 配色提亮对比度。 */
  #v3HotSearchRow .v3-pill {
    padding: 6px 12px; font-size: 12px; min-height: 30px;
    border-radius: 999px; border: 1px solid var(--c-border-2);
    background: var(--c-surface-3); color: var(--c-text);   /* v253(项6): surface-3(#222230)+亮字(#E1E5EB)比 base surface-2+灰字对比度高一档, 深色主题不糊; 原用 surface-2/text-2 与 base 同值等于没覆盖=主人"没解决"真因 */
  }
  #v3HotSearchRow .v3-pill:active { background: var(--c-accent-bg); color: var(--c-accent); border-color: var(--c-accent-border); }
  /* ③ 顶栏头像误触铃铛治本(小米8窄屏): 间距加大防点头像左缘误触铃铛
     ⚠️ 必须加父级 .v3-page-header 提升特异性(0,2,0)>base(0,1,0),否则 base 规则(写在 @media 后)
        同特异性后写覆盖 @media 致缩小失效——铁律 [[css-source-order-overrides-media]] v248e 同根因
     2026-08-12 审计P2: 触摸目标回扩44×44(误触防线=gax 10px间距,与44标准不冲突;
     中心距36+10+30=76 → 44+10+44=98 反而更宽更不易误触) */
  .v3-page-header .v3-ph-actions { gap: 10px; }
  .v3-page-header .v3-header-bell { width: 44px; height: 44px; }
  .v3-page-header .v3-header-avatar { width: 44px; height: 44px; font-size: 13px; }
}
.v3-forum-reply-hint {
  font-size: var(--t-meta); color: var(--c-text-2);
  padding: 2px 0 6px; display: flex; align-items: center; gap: 8px;
}
.v3-forum-reply-cancel { color: var(--c-accent); cursor: pointer; font-size: var(--t-meta); }
.v3-forum-composer-row { display: flex; gap: 8px; align-items: center; }
.v3-forum-composer-input { flex: 1; font-size: 16px; }  /* 2026-08-10 16px 防 iOS focus 自动放大(<=16px 触发 zoom) */
.v3-forum-send { flex-shrink: 0; padding: 8px 12px; display: flex; align-items: center; }

/* 举报原因选择弹层(forum-post.js 用 v3-modal-mask+v3-modal-title，原 components.css 无此两类，补) */
.v3-modal-mask {
  position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1100;
  background: rgba(0,0,0,.5);
  display: flex; align-items: center; justify-content: center; padding: 20px;
}
.v3-modal-mask .v3-modal { width: 100%; max-width: 340px; }
.v3-modal-title {
  padding: 12px 16px; font-size: 15px; font-weight: 600; color: var(--c-text);
  border-bottom: 1px solid var(--c-border);
}
.v3-forum-picker { padding: 4px 0; }

/* ─── 2026-08-03 需求2: 点赞人列表弹窗 ─── */
.v3-forum-likers { max-height: 70vh; display: flex; flex-direction: column; }
.v3-forum-likers-body { overflow-y: auto; -webkit-overflow-scrolling: touch; max-height: 56vh; padding: 4px 0; }
.v3-forum-liker-row {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 16px; border-bottom: 1px solid var(--c-border);
}
.v3-forum-liker-avatar {
  width: 30px; height: 30px; border-radius: 50%; flex: none;
  position: relative; overflow: hidden;  /* 头像联动: .v3-avatar-img absolute需relative锚定否则占满屏 */
  display: flex; align-items: center; justify-content: center;
  color: #fff; font-size: 13px; font-weight: 600;
}
.v3-forum-liker-info { flex: 1; min-width: 0; }
.v3-forum-liker-name { font-size: 14px; font-weight: 600; color: var(--c-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v3-forum-liker-role { font-size: 12px; margin-top: 1px; }
.v3-forum-likers-empty { padding: 28px 16px; text-align: center; color: var(--c-text-3); font-size: 14px; }
.v3-forum-liker-more { padding: 10px 16px; text-align: center; color: var(--c-text-3); font-size: 12px; }
/* role 配色(与 community.js 徽章语义一致:admin红/sub_admin紫/pro蓝/plus金/user灰) */
.v3-forum-liker-role.role-admin, .v3-forum-liker-role.role-sub_admin { color: var(--c-role-admin); }
.v3-forum-liker-role.role-pro { color: var(--c-role-pro); }
.v3-forum-liker-role.role-promax { color: var(--c-role-pro); }
.v3-forum-liker-role.role-plus { color: var(--c-role-plus); }
.v3-forum-liker-role.role-user { color: var(--c-text-3); }
/* 点赞数字入口按钮(紧贴心形toggle,去掉左侧多余间距) */
.v3-forum-likers-num { padding-left: 2px !important; font-variant-numeric: tabular-nums; }

/* ─── 2026-08-04 点赞人列表 A方案: avatar stack(内嵌) + 底部 sheet(展开) ─── */
/* 触发态: 列表卡/详情主帖点赞数 → 前3头像重叠堆叠 + "+N" */
.v3-forum-stack-wrap { display: inline-flex; align-items: center; gap: 5px; }
.v3-forum-stack { display: inline-flex; align-items: center; vertical-align: middle; }
.v3-forum-stack-ava {
  width: 20px; height: 20px; border-radius: 50%; flex-shrink: 0;
  position: relative; overflow: hidden;  /* 头像联动: .v3-avatar-img absolute需relative锚定否则占满屏 */
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 9px; font-weight: 700; color: #fff;
  margin-left: -7px; border: 1.5px solid var(--c-surface);   /* 边框=卡片底色做分隔,列表卡场景(--c-card 项目未定义,用--c-surface) */
}
.v3-forum-stack-ava:first-child { margin-left: 0; }
.v3-forum-stack-more {
  width: 20px; height: 20px; border-radius: 50%; flex-shrink: 0;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 8px; font-weight: 700; color: var(--c-text-2);
  margin-left: -7px; border: 1.5px solid var(--c-surface);
  background: rgba(255,255,255,0.06);
}
/* 详情页 stack 在操作按钮里, 边框色对齐页面背景而非卡片底 */
.v3-forum-likers-stack { display: inline-flex; align-items: center; padding: 6px 4px 6px 8px !important; gap: 0; }
.v3-forum-likers-stack .v3-forum-stack-ava,
.v3-forum-likers-stack .v3-forum-stack-more { border-color: var(--c-bg); }

/* 展开态: 点 stack → 底部 sheet(替代居中重弹窗,移动端单手够得着) */
.v3-forum-likers-mask { align-items: flex-end; }   /* 蒙层内容底部对齐 */
.v3-forum-likers-sheet {
  width: 100%; max-width: 520px; margin: 0 auto; max-height: 72vh;
  background: var(--c-surface); border-radius: 18px 18px 0 0; border-top: 1px solid var(--c-border-2);
  padding: 8px 0 16px; display: flex; flex-direction: column;
  box-shadow: 0 -10px 40px rgba(0,0,0,.5);
  animation: v3-sheet-up .28s cubic-bezier(.2,.9,.3,1);
}
@keyframes v3-sheet-up { from { transform: translateY(100%); } to { transform: translateY(0); } }
.v3-forum-sheet-handle { width: 36px; height: 4px; border-radius: 2px; background: var(--c-text-3); margin: 4px auto 8px; flex-shrink: 0; }
.v3-forum-sheet-head { display: flex; align-items: center; justify-content: space-between; padding: 0 16px 10px; border-bottom: 1px solid var(--c-border); flex-shrink: 0; }
.v3-forum-sheet-ttl { font-size: 15px; font-weight: 700; color: var(--c-text); }
.v3-forum-sheet-close { background: none; border: none; color: var(--c-text-2); font-size: 24px; line-height: 1; padding: 0 4px; cursor: pointer; }
.v3-forum-sheet-close:active { color: var(--c-text); }
/* sheet 内 body 随 sheet 弹性伸缩(覆盖原固定 max-height:56vh) */
.v3-forum-likers-sheet .v3-forum-likers-body { max-height: none; flex: 1; }
/* ─── v399: 征集帖「理由」按钮 + 编辑理由底部 sheet(forum-post.js._openReasonEditor, mask 复用 v3-forum-likers-mask 底部对齐) ─── */
.v3-survey-reason-btn {
  flex-shrink: 0; display: inline-flex; align-items: center;
  border: 1px solid var(--c-border); color: var(--c-text-2); background: transparent;
  font-size: 11px; font-weight: 600; padding: 3px 9px; border-radius: 999px;
  cursor: pointer; font-family: inherit;
}
.v3-survey-reason-btn:active { opacity: .75; }
.v3-survey-reason-sheet {
  width: 100%; max-width: 520px; margin: 0 auto; background: var(--c-surface);
  border-radius: 18px 18px 0 0; border-top: 1px solid var(--c-border-2);
  padding: 8px 0 16px; display: flex; flex-direction: column;
  box-shadow: 0 -10px 40px rgba(0,0,0,.5);
  animation: v3-sheet-up .28s cubic-bezier(.2,.9,.3,1);
}
.v3-survey-reason-who { padding: 0 16px 8px; font-size: 12px; color: var(--c-text-2); }
.v3-survey-reason-ta {
  margin: 0 16px; min-height: 88px; border: 1px solid var(--c-border); border-radius: 10px;
  padding: 10px; font-size: 13px; font-family: inherit; resize: vertical;
  background: var(--c-bg); color: var(--c-text);
}
.v3-survey-reason-ta:focus { outline: none; border-color: var(--c-accent); }
.v3-survey-reason-cnt { margin: 5px 18px 12px; font-size: 11px; color: var(--c-text-3); text-align: right; }
.v3-survey-reason-save {
  display: block; width: calc(100% - 32px); margin: 0 16px; border: none;
  background: var(--c-accent); color: var(--c-accent-text); font-size: 14px; font-weight: 700;
  padding: 11px; border-radius: 999px; cursor: pointer; font-family: inherit;
}
.v3-survey-reason-save:disabled { opacity: .6; }
/* ─── 2026-08-03 需求3: 浏览次数(列表卡/详情操作行右端只读展示) ─── */
.v3-forum-stat-view { margin-left: auto; color: var(--c-text-3); }
.v3-forum-view-stat { margin-left: auto; color: var(--c-text-3); font-size: 13px; }
.v3-forum-reason-btn {
  display: block; width: 100%; text-align: left;
  padding: 12px 16px; background: none; border: none;
  color: var(--c-text); font-size: var(--t-body); font-family: inherit;
  cursor: pointer; transition: background .12s;
}
.v3-forum-reason-btn:hover { background: var(--c-surface-2); }
.v3-forum-reason-cancel {
  display: block; width: 100%; padding: 12px 16px;
  background: none; border: none; border-top: 1px solid var(--c-border);
  color: var(--c-text-3); font-size: var(--t-body); font-family: inherit; cursor: pointer;
}

/* 操作提示 toast(forum-post.js._toast，最高 z 盖一切) */
.v3-forum-toast {
  position: fixed; left: 50%; bottom: 96px; transform: translateX(-50%);
  z-index: 1200;
  background: rgba(0,0,0,.85); color: #fff;
  padding: 10px 18px; border-radius: var(--radius-md);
  font-size: var(--t-meta);
  opacity: 1; transition: opacity .4s;
  max-width: 80vw; text-align: center;
}
.v3-forum-toast-out { opacity: 0; }

/* ═══════════════════════════════════════════════════════
   内容库容器(2026-07-02 主人定:视频+精选+标的三合一,底栏6→4)
   tab 栏复用 .v3-tab-bar/.v3-tab-btn;panel 用 .v3-lib-panel
   避开 _switchPage 的 .v3-page 全文档扫描(必修1,否则切走库 panel 被强制 remove active → 切回空白)
   ═══════════════════════════════════════════════════════ */

/* panel 显隐(非 .v3-page,不归 _switchPage 管,library 自管) */
.v3-lib-panel { display: none; }
.v3-lib-panel.active {
  display: block;
  animation: page-fade .15s ease;   /* 复用 layout.css 现成 keyframe,切 tab 淡入 */
}

/* 必修4: tab 栏吸顶 + 子页 sticky-bar 让位叠加(三子页 _render 同构注入 .v3-sticky-bar) */
#page-library .v3-lib-tabbar {
  position: sticky;
  top: 0;
  z-index: 10;
  background: var(--c-bg);
  /* 覆盖 .v3-tab-bar 的 margin:0 -20px(那是 modal 通栏场景;内容库 panel 内不需要负 margin) */
  margin: 0;
  padding: 0 20px;
}
/* 子页 .v3-sticky-bar 原本 top:calc(-1*var(--sp-xl)) + margin-top负值(独立页贴 page 顶设计);
   内容库内 tab 栏已占顶,要让位:吸在 tab 栏下方,去掉 page 级负 margin/padding 留白 */
#page-library .v3-lib-panel > .v3-sticky-bar {
  top: 44px;            /* 吸在 tab 栏下方(实测 tab 栏高=44px,tab-btn min-height:44 撑高,见下) */
  padding-top: 8px;     /* 覆盖原 var(--sp-xl),tab 栏已占顶不需大留白 */
  margin-top: 0;        /* 覆盖原 calc(-1*var(--sp-xl)),不钻出 panel 顶钻到 tab 栏 */
}
/* tab 栏已标识当前内容(视频/精选/标的),子页 h1「标的池」等冗余,隐藏省垂直空间 */
#page-library .v3-lib-panel > .v3-sticky-bar h1 { display: none; }

/* 移动端触摸达标(主人铁律:tab 触摸高度≥44px 苹果HIG最小推荐);
   .v3-tab-btn 原 padding:10px 0 仅 39px,内容库限定撑到 44 + flex 垂直水平居中文字 */
#page-library .v3-lib-tabbar .v3-tab-btn {
  min-height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
}

/* ═══════════════════════════════════════════════════════
   微论坛配图(2026-07-03 主人定:帖子+评论九宫格,客户端压缩后上传)
   九宫格画廊(列表摘要/详情大图/评论紧凑三态) + 发帖/评论配图选择器 UI
   全用现有 CSS 变量贴合深黑+金色调性;老内核 aspect-ratio 兜底照搬 b52f386 范式
   ═══════════════════════════════════════════════════════ */

/* ── 九宫格画廊容器(列表摘要/详情大图/评论紧凑三态) ── */
.v3-forum-images {
  display: grid;
  gap: 6px;
  margin-top: 8px;
}
.v3-forum-images--list { gap: 4px; max-width: 240px; }       /* 列表卡摘要最多3小格,窄 */
.v3-forum-images--detail { gap: 8px; margin-top: 10px; }     /* 详情大图撑满宽 */
.v3-forum-images--comment {
  display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px;   /* 评论配图小缩略图横排不拉满(对齐小红书/掘金/即刻) */
}
.v3-forum-images--comment .v3-forum-images__cell {
  width: 80px; height: 80px; aspect-ratio: auto; flex: 0 0 auto;  /* 固定小方块,不随容器宽度拉伸 */
}
.v3-forum-images__cell {
  position: relative;
  aspect-ratio: 1 / 1;                 /* 九宫格正方格(Chrome88+,老内核下方 @supports 兜底) */
  overflow: hidden;
  border-radius: 6px;
  background: var(--c-surface-2);
  border: 0; padding: 0; cursor: pointer;
}
.v3-forum-images__cell:active { opacity: .85; }
.v3-forum-images__img { width: 100%; height: 100%; object-fit: cover; display: block; }
.v3-forum-images--comment .v3-forum-images__cell { border-radius: 4px; }
/* v404-c(2026-09-05 主人拍): 右列图纵向跨标题行+正文行 — thumb 挪进 grid 当右列,
   stretch 跟满左列(标题+正文)总高, 长标题/多行正文时图自动变高; 等高锚在 grid min-height */
.v3-forum-images--thumb {
  display: flex; flex: 0 0 33%; max-width: 33%;
  margin-top: 0; gap: 0;
  align-self: stretch; height: auto;
}
.v3-forum-images--thumb .v3-forum-images__cell {
  width: 100%; height: 100%; aspect-ratio: auto; border-radius: 8px;
}
.v3-forum-images--thumb .v3-forum-images__img {
  position: absolute; inset: 0;   /* 老内核 height:100% 相对 auto 父级塌陷铁律, absolute 填满 */
}
.v3-forum-images__more {
  position: absolute; right: 4px; bottom: 4px;
  padding: 1px 6px; font-size: 10px; line-height: 1.5;
  background: rgba(0,0,0,.55); color: #fff; border-radius: 8px;
  pointer-events: none; white-space: nowrap;
}

/* 老内核 WebView 兜底(aspect-ratio Chrome88+ 才支持,小米8塌陷铁律,照搬 1332 范式) */
@supports not (aspect-ratio: 1 / 1) {
  .v3-forum-images--list .v3-forum-images__cell { min-height: 72px; }
  .v3-forum-images--detail .v3-forum-images__cell { min-height: 110px; }
  .v3-forum-images--comment .v3-forum-images__cell { min-height: 64px; }
}

/* ── 发帖配图选择器(openNewPost 浮层内,3列九宫格 + 虚线添加钮) ── */
.v3-post-img-thumbs {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 8px;
  margin-top: 8px;
}
.v3-post-img-add {
  aspect-ratio: 1 / 1;
  min-height: 80px;
  border: 1.5px dashed var(--c-border);
  border-radius: var(--radius-md);
  background: var(--c-surface-2);
  color: var(--c-text-3);
  display: flex; align-items: center; justify-content: center;
  cursor: pointer; transition: border-color .15s, color .15s;
}
.v3-post-img-add:hover { border-color: var(--c-accent); color: var(--c-accent); }
.v3-post-img-add:disabled { opacity: .5; cursor: not-allowed; }
.v3-post-img-thumb {
  position: relative;
  aspect-ratio: 1 / 1;
  min-height: 80px;
  border-radius: var(--radius-md);
  overflow: hidden;
  background: var(--c-surface-2);
}
.v3-post-img-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.v3-post-img-rm {
  position: absolute; top: 4px; right: 4px;
  width: 22px; height: 22px;
  border-radius: 50%;
  background: rgba(0,0,0,.65); color: #fff;
  border: 0; padding: 0;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer;
}
.v3-post-img-rm-sm { width: 18px; height: 18px; }    /* 评论紧凑版缩小 */

/* 发帖选择器老内核兜底 */
@supports not (aspect-ratio: 1 / 1) {
  .v3-post-img-add, .v3-post-img-thumb { min-height: 80px; }
}

/* ── 评论输入条紧凑配图(composer 内横向滚动预览,48px 缩略图) ── */
.v3-forum-composer-img {
  flex-shrink: 0;
  width: 36px; height: 36px;
  border-radius: var(--radius-md);
  background: var(--c-surface-2);
  border: 1px solid var(--c-border);
  color: var(--c-text-2);
  display: flex; align-items: center; justify-content: center;
  cursor: pointer; transition: color .15s, border-color .15s;
}
.v3-forum-composer-img:hover { color: var(--c-accent); border-color: var(--c-accent-border); }
.v3-forum-composer-img:disabled { opacity: .5; cursor: not-allowed; }
.v3-forum-composer-thumbs {
  display: flex; gap: 6px;
  overflow-x: auto;
  padding: 6px 0 2px;
  -webkit-overflow-scrolling: touch;
}
.v3-forum-composer-thumbs::-webkit-scrollbar { display: none; }
.v3-forum-composer-thumb {
  position: relative;
  flex-shrink: 0;
  width: 48px; height: 48px;
  border-radius: 6px;
  overflow: hidden;
  background: var(--c-surface-2);
}
.v3-forum-composer-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* ═══════════════════════════════════════════════════
   图片大图灯箱(主人2026-07-03需求:所有图片支持点大图+下载)
   关键布局样式内联在 app.js V3.previewImage 保证零依赖可用,
   这里仅做老内核 inset 兜底(小米8范式 b52f386)。
   (v398.5: 下载/保存按钮已删, 原 .v3-img-preview__dl:hover 死规则一并清)
   ═══════════════════════════════════════════════════ */
@supports not (inset: 0) {
  .v3-img-preview { top: 0; left: 0; right: 0; bottom: 0; }
}

/* ═══════════════════════════════════════════════════
   v62-20260706c: 论坛编辑功能 + admin删除 + 视频元素问AI
   ①② forum-post.js 编辑/admin删除入口
   ③ chat.js+videos.js 视频弹窗4类元素问AI快速入口
   ═══════════════════════════════════════════════════ */

/* —— 「已编辑」灰色小标记(标题旁+评论内容旁) —— */
.v3-edited-tag {
  display: inline-block;
  margin-left: 6px;
  padding: 1px 6px;
  font-size: var(--t-meta);
  color: var(--c-text-3);
  background: var(--c-surface-2);
  border-radius: var(--radius-sm);
  vertical-align: middle;
  font-weight: normal;
}

/* —— 编辑按钮(铅笔风格,常规次要色) —— */
.v3-edit-btn {
  color: var(--c-text-2);
  background: transparent;
  border: none;
  cursor: pointer;
  font-size: var(--t-meta);
  padding: 2px 6px;
}
.v3-edit-btn:hover { color: var(--c-text-1); text-decoration: underline; }

/* —— admin 删除按钮(红字,区别于作者删除常规色) —— */
.v3-admin-del-btn {
  color: var(--c-down);
  background: transparent;
  border: none;
  cursor: pointer;
  font-size: var(--t-meta);
  padding: 2px 6px;
}
.v3-admin-del-btn:hover { text-decoration: underline; }

/* 编辑浮层复用 forum.js 的 .v3-full-* 系列(已存在),提示条圆角 */
#v3EditMsg { border-radius: var(--radius-sm); }

/* —— 视频弹窗元素旁"问AI"小按钮(紧凑,不抢主体视觉) —— */
.v3-elem-askai {
  display: inline-flex;
  align-items: center;
  gap: 2px;
  font-size: 11px;
  line-height: 1;
  padding: 3px 8px;
  color: var(--c-accent);
  background: var(--c-accent-bg);
  border: 1px solid var(--c-accent-border);
  border-radius: 10px;
  cursor: pointer;
  white-space: nowrap;
  transition: background .15s, color .15s;
  vertical-align: middle;
}
.v3-elem-askai:hover { background: var(--c-accent); color: var(--c-accent-text); }
@media (max-width: 480px) {
  .v3-elem-askai { padding: 4px 10px; }
}

/* —— _renderVideoWelcome 元素摘要行(标题下方) —— */
.v3-elem-summary {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: wrap;
  margin: -4px 0 10px;
  padding: 6px 10px;
  background: var(--c-accent-bg);
  border: 1px solid var(--c-accent-border);
  border-radius: var(--radius-sm);
  line-height: 1.4;
}
.v3-elem-summary .v3-elem-tag {
  flex-shrink: 0;
  font-size: 10px;
  font-weight: 600;
  padding: 1px 6px;
  color: var(--c-accent);
  background: rgba(0,0,0,0);
  border-radius: 4px;
  letter-spacing: .5px;
}
.v3-elem-summary .v3-elem-text {
  font-size: 12px;
  color: var(--c-text-2);
  word-break: break-all;
  flex: 1;
  min-width: 0;
}

/* —— 问题5(2026-07-08): 元素问AI的用户气泡上下文胶囊 ——
   主人诉求: 用户气泡要显示"带着啥问的"(视频+元素), 不只原文
   用户气泡背景是 --c-accent-bg(琥珀金淡), 胶囊用中性半透灰叠层
   (亮暗主题都可见, rgba 老 WebView 兼容, 避 task#157 inset 简写坑) */
.v3-ask-ctx {
  margin-bottom: 6px;
  padding-bottom: 6px;
  border-bottom: 1px solid rgba(127,127,127,0.2);
}
.v3-ask-ctx-video {
  font-size: 11px;
  opacity: 0.78;
  line-height: 1.3;
  margin-bottom: 4px;
  word-break: break-all;
}
.v3-ask-ctx-elem {
  display: flex;
  align-items: center;
  gap: 5px;
  flex-wrap: wrap;
  background: rgba(127,127,127,0.13);
  border-radius: 6px;
  padding: 3px 8px;
  line-height: 1.4;
}
.v3-ask-ctx-elem .v3-elem-tag {
  flex-shrink: 0;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .5px;
  opacity: 0.85;
}
.v3-ask-ctx-elem .v3-elem-text {
  font-size: 11.5px;
  opacity: 0.8;
  word-break: break-all;
  flex: 1;
  min-width: 0;
}
.v3-ask-ctx-msg {
  margin-top: 2px;
}
@media (max-width: 768px) {
  .v3-ask-ctx-video { font-size: 10.5px; }
  .v3-ask-ctx-elem .v3-elem-text { font-size: 11px; }
}

/* ══════════════ 付费计划调研投票页（survey.js，2026-07-16）══════════════ */
/* v87(2026-07-16治iOS PWA"背景页"bug):overlay 退化为纯盖板(对齐灯箱写法),
   不自身滚动——iOS WebKit standalone 下"fixed全屏 + 自身overflow滚动"会触发合成层层叠 bug,
   内容画到 .v3-app 之下成"背景页"。滚动下沉到 .v3-survey-wrap 内层,overlay 只当不透明盖板。 */
.v3-survey-overlay {
  position: fixed; top: 0; left: 0; right: 0; bottom: 0;
  background: var(--c-bg); z-index: 10000;
  display: flex; flex-direction: column; overflow: hidden;
}
.v3-survey-header {
  flex-shrink: 0; display: flex; align-items: center; gap: 8px;
  /* task#8(2026-08-11): safe-area-top 防安卓状态栏遮挡（belt-and-suspenders 第三层） */
  padding: calc(env(safe-area-inset-top, 0px) + 12px) 16px 12px; background: var(--c-bg);
  border-bottom: 1px solid var(--c-border); max-width: 680px; margin: 0 auto; box-sizing: border-box;
}
.v3-survey-back {
  width: 32px; height: 32px; flex: 0 0 32px; display: flex; align-items: center; justify-content: center;
  background: transparent; border: none; color: var(--c-text); cursor: pointer; border-radius: 8px;
}
.v3-survey-back:active { background: var(--c-surface-2); }
.v3-survey-title { flex: 1; text-align: center; font-weight: 600; font-size: 15px; color: var(--c-text); }
/* v87:wrap 承接滚动(原 overlay 自滚下沉到此),flex:1 占满 overlay 减 header 余高
   v88:补 min-height:0 —— flex column 子项默认 min-height:auto 会撑开 item 阻止 overflow 生效,
       Chrome83(MIUI WebView)尤甚;min-height:0 是 flex 滚动容器标准写法,防 wrap 拿不到高度致内容不可滚 */
.v3-survey-wrap { max-width: 680px; width: 100%; margin: 0 auto; padding: 16px 16px 48px; box-sizing: border-box; flex: 1; min-height: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; }

.v3-survey-intro {
  background: linear-gradient(160deg, var(--c-accent-bg), transparent 70%);
  border: 1px solid var(--c-accent-border); border-radius: 14px; padding: 18px 16px; margin-bottom: 16px;
}
.v3-survey-intro-badge {
  display: inline-block; font-size: 11px; color: var(--c-accent); background: var(--c-accent-bg);
  padding: 3px 10px; border-radius: 20px; margin-bottom: 10px; font-weight: 600;
}
.v3-survey-intro-h { font-size: 16px; font-weight: 600; color: var(--c-text); margin-bottom: 10px; }
.v3-survey-intro-p { font-size: 13px; line-height: 1.7; color: var(--c-text-2); margin-bottom: 10px; }
.v3-survey-intro-p:last-child { margin-bottom: 0; }

.v3-survey-card {
  background: var(--c-surface); border: 1px solid var(--c-border); border-radius: 14px;
  padding: 16px; margin-bottom: 12px;
}
.v3-survey-card-readonly { opacity: 0.92; }
.v3-survey-card-head { display: flex; align-items: flex-start; gap: 10px; margin-bottom: 4px; }
.v3-survey-card-no {
  flex: 0 0 26px; height: 26px; border-radius: 8px; background: var(--c-accent-bg); color: var(--c-accent);
  font-size: 12px; font-weight: 700; display: flex; align-items: center; justify-content: center;
}
.v3-survey-card-title { font-size: 14.5px; font-weight: 600; color: var(--c-text); line-height: 1.45; flex: 1; padding-top: 2px; }
.v3-survey-card-desc { font-size: 12px; color: var(--c-text-3); margin: 6px 0 10px 36px; line-height: 1.5; }
.v3-survey-opts { margin-top: 10px; }

.v3-survey-opt {
  display: flex; align-items: flex-start; gap: 10px; width: 100%; box-sizing: border-box;
  padding: 11px 12px; margin-bottom: 8px; text-align: left; cursor: pointer;
  background: var(--c-surface-2); border: 1px solid var(--c-border-2); border-radius: 10px;
  color: var(--c-text); font-size: 13.5px; line-height: 1.5; transition: border-color .15s, background .15s;
}
.v3-survey-opt:active { background: var(--c-surface-3); }
.v3-survey-opt.selected { border-color: var(--c-accent); background: var(--c-accent-bg); }
.v3-survey-opt-radio {
  flex: 0 0 16px; width: 16px; height: 16px; margin-top: 2px; border-radius: 50%;
  border: 2px solid var(--c-text-3); box-sizing: border-box; transition: all .15s;
}
.v3-survey-opt.selected .v3-survey-opt-radio { border-color: var(--c-accent); background: var(--c-accent); box-shadow: inset 0 0 0 3px var(--c-surface); }
.v3-survey-opt-check {
  flex: 0 0 16px; width: 16px; height: 16px; margin-top: 2px; border-radius: 4px;
  border: 2px solid var(--c-text-3); box-sizing: border-box; transition: all .15s;
}
.v3-survey-opt.selected .v3-survey-opt-check { border-color: var(--c-accent); background: var(--c-accent); }
.v3-survey-opt.selected .v3-survey-opt-check::after {
  content: ''; display: block; width: 4px; height: 8px; margin: 1px auto; border: solid var(--c-accent-text);
  border-width: 0 2px 2px 0; transform: rotate(45deg);
}
.v3-survey-opt-body { flex: 1; }
.v3-survey-opt-label { display: block; }
.v3-survey-opt-sub { display: block; font-size: 11.5px; color: var(--c-text-3); margin-top: 3px; }
.v3-survey-other-input {
  width: 100%; box-sizing: border-box; margin: 0 0 8px; padding: 10px 12px; resize: vertical;
  background: var(--c-surface-2); border: 1px solid var(--c-border-2); border-radius: 10px;
  color: var(--c-text); font-size: 13px; font-family: inherit; line-height: 1.5;
}

.v3-survey-text {
  width: 100%; box-sizing: border-box; padding: 12px; resize: vertical;
  background: var(--c-surface-2); border: 1px solid var(--c-border-2); border-radius: 10px;
  color: var(--c-text); font-size: 13px; font-family: inherit; line-height: 1.6;
}
.v3-survey-imgs { margin-top: 12px; }
.v3-survey-img-tip { font-size: 11.5px; color: var(--c-text-3); margin-bottom: 8px; }
.v3-survey-img-grid { display: flex; flex-wrap: wrap; gap: 8px; }
.v3-survey-img-add {
  width: 72px; height: 72px; border: 1px dashed var(--c-border-2); border-radius: 10px;
  background: var(--c-surface-2); color: var(--c-text-3); font-size: 12px; cursor: pointer;
  display: flex; align-items: center; justify-content: center; text-align: center; padding: 4px;
}
.v3-survey-img-thumb { position: relative; width: 72px; height: 72px; border-radius: 10px; overflow: hidden; }
.v3-survey-img-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.v3-survey-img-del {
  position: absolute; top: 2px; right: 2px; width: 18px; height: 18px; border-radius: 50%;
  background: rgba(0,0,0,0.6); color: #fff; border: none; font-size: 14px; line-height: 1; cursor: pointer;
}

.v3-survey-footer { margin-top: 16px; }
.v3-survey-deadline { font-size: 12px; color: var(--c-text-3); text-align: center; margin-bottom: 12px; line-height: 1.5; }
.v3-survey-submit { width: 100%; padding: 13px; font-size: 15px; font-weight: 600; border-radius: 10px; }

.v3-survey-locked { text-align: center; padding: 28px 16px 8px; }
.v3-survey-locked-icon {
  width: 52px; height: 52px; margin: 0 auto 12px; border-radius: 50%;
  background: var(--c-down-bg); color: var(--c-down); font-size: 26px; font-weight: 700;
  display: flex; align-items: center; justify-content: center;
}
.v3-survey-locked-msg { font-size: 14px; color: var(--c-text-2); line-height: 1.6; }

.v3-survey-review { margin-top: 8px; padding-left: 36px; }
.v3-survey-review-val { font-size: 13px; color: var(--c-text); padding: 8px 12px; background: var(--c-accent-bg); border-radius: 8px; }
.v3-survey-review-bullet { font-size: 13px; color: var(--c-text); padding: 6px 12px; background: var(--c-accent-bg); border-radius: 8px; margin-bottom: 6px; }
.v3-survey-review-text { font-size: 13px; color: var(--c-text-2); line-height: 1.6; white-space: pre-wrap; word-break: break-word; }
@media (max-width: 768px) {
  .v3-survey-card { padding: 14px; }
  .v3-survey-opt { padding: 10px; }
}

/* ============================================================
 * 2026-07-24 全量辩证分析: 输入区开关 + 锚点卡 + 导出按钮
 * 配色: accent 金 #ECAA0B 强调; ⚠️提醒用琥珀 #C08000(非红绿, 避A股撞色——红涨绿跌, 正面禁绿)
 * ============================================================ */

/* 开关行: 输入区上方独立一行(开关+提醒横排, 移动端窄屏提醒换行) */
.v3-chat-dialectics-row {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 8px 4px 0;
  font-size: 12px;
}

/* toggle 开关(label 包裹隐藏的 checkbox, 用 span 画滑块) */
.v3-dia-toggle { display: inline-flex; align-items: center; gap: 7px; cursor: pointer; user-select: none; }
.v3-dia-toggle input { position: absolute; opacity: 0; width: 0; height: 0; }
.v3-dia-switch {
  position: relative; width: 34px; height: 18px; border-radius: 999px;
  background: rgba(255,255,255,0.14); transition: background .2s; flex-shrink: 0;
}
.v3-dia-switch::after {
  content: ''; position: absolute; top: 2px; left: 2px; width: 14px; height: 14px;
  border-radius: 50%; background: #fff; transition: transform .2s;
}
.v3-dia-toggle input:checked + .v3-dia-switch { background: var(--c-accent); }  /* 开=accent 金 */
.v3-dia-toggle input:checked + .v3-dia-switch::after { transform: translateX(16px); }
.v3-dia-label { font-size: 13px; font-weight: 600; color: var(--c-text); }

/* ⚠️ 提醒文案: 琥珀色(醒目但不撞 A 股跌色绿) */
.v3-dia-tip { color: #C08000; font-size: 11.5px; }

/* 辩证增强视觉卡 v5(2026-07-24 全量分析专用, LLM <<<DIA>>> 9行结构化契约块渲染 6 组件)
   配色: 看多=红 var(--c-up) / 看空=绿 var(--c-down)(A股红涨绿跌惯例, 绿=负面符合项目避撞色约束) */
.v3-dia2-wrap { margin-top: 12px; }
.v3-dia2 { background: var(--c-accent-bg); border: 1px solid var(--c-accent-border); border-radius: 10px; padding: 11px 12px; }
.v3-dia2 .a-conf { display: flex; align-items: baseline; gap: 8px; font-size: 12.5px; margin-bottom: 8px; }
.v3-dia2 .a-conf .lb { font-size: 9.5px; font-weight: 700; background: var(--c-accent); color: #0c0c14; padding: 1px 5px; border-radius: 3px; flex-shrink: 0; }
.v3-dia2 .a-conf .tx { color: var(--c-text); line-height: 1.5; }
/* ⓪ 核心结论前置 TLDR 速览卡(2026-08-09): 对标 WorkBuddy 开头结论卡, 卡顶部 3 秒抓重点(金渐变结论条+3 关键标签chip) */
.v3-dia2 .a-tldr { background: linear-gradient(135deg, rgba(236,170,11,.12), rgba(236,170,11,.04)); border: 1px solid var(--c-accent-border); border-radius: 10px; padding: 9px 11px; margin-bottom: 9px; }
.v3-dia2 .a-tldr-ess { display: flex; gap: 7px; align-items: baseline; font-size: 12.5px; line-height: 1.5; }
.v3-dia2 .a-tldr-ess .lb { font-size: 9px; font-weight: 700; background: var(--c-accent); color: #0c0c14; padding: 2px 6px; border-radius: 3px; flex-shrink: 0; }
.v3-dia2 .a-tldr-ess .tx { color: var(--c-text); font-weight: 500; }
.v3-dia2 .a-tldr-kw { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 7px; }
.v3-dia2 .a-tldr-kw .kw-chip { font-size: 10.5px; padding: 2px 8px; border-radius: 10px; background: rgba(236,170,11,.10); border: 1px solid rgba(236,170,11,.25); color: var(--c-accent); line-height: 1.5; }
/* ⑪ 矛盾转化条件(提升清单第2条,2026-08-09): 突破金/受阻蓝中性配色不暗示涨跌 */
.v3-dia2 .a-cond { background: rgba(255,255,255,.03); border: 1px solid var(--c-border); border-radius: 10px; padding: 8px 10px; margin-bottom: 8px; }
.v3-dia2 .a-cond .h { font-size: 9.5px; font-weight: 700; color: var(--c-text-2); margin-bottom: 6px; }
.v3-dia2 .a-cond .cd { display: flex; gap: 7px; align-items: baseline; font-size: 11.5px; line-height: 1.5; padding: 3px 0; }
.v3-dia2 .a-cond .cd .lb { font-size: 9px; font-weight: 700; padding: 2px 6px; border-radius: 3px; flex-shrink: 0; }
.v3-dia2 .a-cond .cd.up .lb { background: rgba(236,170,11,.18); color: var(--c-accent); }
.v3-dia2 .a-cond .cd.dn .lb { background: rgba(91,163,232,.18); color: #5BA3E8; }
.v3-dia2 .a-cond .cd .tx { color: var(--c-text); }
/* ⑫ 关键观测变量(提升清单第3条,2026-08-09): "接下来盯什么"锚点清单 */
.v3-dia2 .a-watch { background: rgba(255,255,255,.03); border: 1px solid var(--c-border); border-radius: 10px; padding: 8px 10px; margin-bottom: 8px; }
.v3-dia2 .a-watch .h { font-size: 9.5px; font-weight: 700; color: var(--c-text-2); margin-bottom: 6px; }
.v3-dia2 .a-watch .w-row { display: flex; flex-wrap: wrap; gap: 6px; align-items: baseline; font-size: 11px; padding: 4px 0; line-height: 1.5; border-top: 1px dashed rgba(255,255,255,.06); }
.v3-dia2 .a-watch .w-row:first-of-type { border-top: none; padding-top: 0; }
.v3-dia2 .a-watch .nm { font-size: 11.5px; font-weight: 600; color: var(--c-accent); }
.v3-dia2 .a-watch .st { color: var(--c-text-2); font-size: 10.5px; }
.v3-dia2 .a-watch .sg { color: #5BA3E8; font-size: 10.5px; }
/* ⑬ 辩证框架说明(提升清单第6条,2026-08-09): 原生details可选折叠, 纯前端静态零LLM */
.v3-dia2 .a-legend { margin-top: 6px; border-top: 1px dashed rgba(255,255,255,.08); padding-top: 6px; }
.v3-dia2 .a-legend summary { font-size: 10.5px; color: var(--c-text-3); cursor: pointer; list-style: none; padding: 2px 0; }
.v3-dia2 .a-legend summary::-webkit-details-marker { display: none; }
.v3-dia2 .a-legend summary::before { content: "▸ "; }
.v3-dia2 .a-legend[open] summary::before { content: "▾ "; }
.v3-dia2 .a-legend .lg-body { padding-top: 6px; }
.v3-dia2 .a-legend .lg-item { display: flex; gap: 8px; font-size: 10.5px; line-height: 1.6; padding: 1px 0; }
.v3-dia2 .a-legend .lg-k { color: var(--c-accent); flex-shrink: 0; min-width: 88px; }
.v3-dia2 .a-legend .lg-v { color: var(--c-text-2); }
.v3-dia2 .a-duo { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; background: rgba(255,255,255,.03); border: 1px solid var(--c-border); padding: 8px; border-radius: 10px; margin-bottom: 8px; }
.v3-dia2 .a-duo .cl { font-size: 10px; font-weight: 700; margin-bottom: 4px; }
.v3-dia2 .a-duo .up { color: var(--c-up); }
.v3-dia2 .a-duo .dn { color: var(--c-down); }
.v3-dia2 .a-duo ul { list-style: none; margin: 0; padding: 0; }
.v3-dia2 .a-duo li { font-size: 11.5px; padding: 1px 0 1px 9px; position: relative; color: var(--c-text); line-height: 1.5; }
.v3-dia2 .a-duo li::before { content: ""; position: absolute; left: 0; top: 7px; width: 4px; height: 4px; border-radius: 50%; }
.v3-dia2 .a-duo .up-list li::before { background: var(--c-up); }
.v3-dia2 .a-duo .dn-list li::before { background: var(--c-down); }
.v3-dia2 .a-pct { background: rgba(255,255,255,.03); border: 1px solid var(--c-border); border-radius: 10px; padding: 8px 10px; margin-bottom: 8px; }
.v3-dia2 .a-pct .h { font-size: 9.5px; font-weight: 700; color: var(--c-text-2); margin-bottom: 6px; }
.v3-dia2 .a-pct .pbar { height: 14px; border-radius: 7px; overflow: hidden; display: flex; }
.v3-dia2 .a-pct .pbar .u { background: var(--c-up); }
.v3-dia2 .a-pct .pbar .d { background: var(--c-down); }
.v3-dia2 .a-pct .pleg { display: flex; justify-content: space-between; margin-top: 5px; font-size: 10px; }
.v3-dia2 .a-pct .pleg .up { color: var(--c-up); font-weight: 600; }
.v3-dia2 .a-pct .pleg .dn { color: var(--c-down); font-weight: 600; }
.v3-dia2 .a-q { display: flex; align-items: center; gap: 8px; background: rgba(255,255,255,.03); border: 1px solid var(--c-border); padding: 7px 10px; border-radius: 10px; font-size: 11.5px; margin-bottom: 8px; }
.v3-dia2 .a-q .lb { font-size: 9.5px; font-weight: 700; color: var(--c-accent); flex-shrink: 0; }
.v3-dia2 .a-q .bar { flex: 1; height: 6px; background: rgba(255,255,255,.08); border-radius: 4px; overflow: hidden; }
.v3-dia2 .a-q .bar .f { height: 100%; background: linear-gradient(90deg, #C08000, var(--c-accent)); border-radius: 4px; }
.v3-dia2 .a-q .v { color: var(--c-accent); font-weight: 600; font-size: 10.5px; flex-shrink: 0; }
.v3-dia2 .a-pe { display: flex; align-items: stretch; gap: 5px; font-size: 11px; margin-bottom: 8px; }
.v3-dia2 .a-pe .box { flex: 1; padding: 7px 8px; border-radius: 7px; }
.v3-dia2 .a-pe .phen { background: rgba(255,255,255,.05); color: var(--c-text-2); border: 1px solid var(--c-border); }
.v3-dia2 .a-pe .ess { background: rgba(236,170,11,.10); color: var(--c-text); border: 1px solid var(--c-accent-border); }
.v3-dia2 .a-pe .box .lb { font-size: 9px; font-weight: 700; display: block; margin-bottom: 2px; }
.v3-dia2 .a-pe .phen .lb { color: var(--c-text-3); }
.v3-dia2 .a-pe .ess .lb { color: var(--c-accent); }
.v3-dia2 .a-pe .arr { display: flex; align-items: center; color: var(--c-accent); font-size: 13px; }
/* === 2026-07-24 方案B 新增组件(三时段/催化剂风险/可能性) === */
/* 2026-08-08 合规止血: 操作建议信号灯(.a-act)整块下线, 6 行样式移除 */
/* ⑦ 三时段推演: 短/中/长期三栏, 按方向着色(原⑧, 信号灯删后顺位前移) */
.v3-dia2 .a-time { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 5px; background: rgba(255,255,255,.03); border: 1px solid var(--c-border); padding: 8px; border-radius: 10px; margin-bottom: 8px; }
.v3-dia2 .a-time .tc { padding: 5px 4px; border-radius: 6px; background: rgba(255,255,255,.03); text-align: center; }
.v3-dia2 .a-time .tc .tlb { font-size: 9px; font-weight: 700; color: var(--c-text-2); margin-bottom: 3px; }
.v3-dia2 .a-time .tc .tv { font-size: 10.5px; line-height: 1.4; }
.v3-dia2 .a-time .tc.up .tv { color: var(--c-up); }
.v3-dia2 .a-time .tc.dn .tv { color: var(--c-down); }
.v3-dia2 .a-time .tc.flat .tv { color: var(--c-text-2); }
/* ⑨ 催化剂 vs 风险: 左正向红/右负向绿 */
.v3-dia2 .a-cat { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-bottom: 8px; }
.v3-dia2 .a-cat .ccb { padding: 7px 8px; border-radius: 8px; font-size: 11px; line-height: 1.5; }
.v3-dia2 .a-cat .ccb.pos { background: rgba(207,64,64,.08); border: 1px solid rgba(207,64,64,.3); }
.v3-dia2 .a-cat .ccb.neg { background: rgba(0,172,78,.08); border: 1px solid rgba(0,172,78,.3); }
.v3-dia2 .a-cat .ccb .hlb { font-size: 9.5px; font-weight: 700; margin-bottom: 3px; display: block; }
.v3-dia2 .a-cat .ccb.pos .hlb { color: var(--c-up); }
.v3-dia2 .a-cat .ccb.neg .hlb { color: var(--c-down); }
/* ⑩ 可能性现实性: 大概率金/小概率灰 */
.v3-dia2 .a-pos { background: rgba(255,255,255,.03); border: 1px solid var(--c-border); padding: 8px 10px; border-radius: 10px; margin-bottom: 8px; font-size: 11px; line-height: 1.55; }
.v3-dia2 .a-pos .pl { display: flex; gap: 6px; margin-bottom: 3px; }
.v3-dia2 .a-pos .pl:last-child { margin-bottom: 0; }
.v3-dia2 .a-pos .pl .k { font-size: 9px; font-weight: 700; padding: 1px 5px; border-radius: 3px; flex-shrink: 0; height: fit-content; }
.v3-dia2 .a-pos .pl .k.hi { background: rgba(236,170,11,.2); color: var(--c-accent); }
.v3-dia2 .a-pos .pl .k.lo { background: rgba(255,255,255,.08); color: var(--c-text-2); }
/* ✦ 博主观点 × 数据辩证 交叉验证(护城河组件, 2026-08-09): 双栏博主🎬金/数据📊蓝 + 关系条(背离红/印证绿/中性灰)
   对标 WorkBuddy 纯数据单视角——这里多一栏"模型先生博主视角", 是抄不走的差异化 */
.v3-dia2 .a-cv-wrap { background: rgba(255,255,255,.03); border: 1px solid var(--c-border); padding: 8px; border-radius: 10px; margin-bottom: 8px; }
.v3-dia2 .a-cv-lab { font-size: 9.5px; font-weight: 700; color: var(--c-accent); margin-bottom: 7px; }
.v3-dia2 .a-cv { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-bottom: 8px; }
.v3-dia2 .a-cv .cvb { padding: 7px 8px; border-radius: 8px; font-size: 11px; line-height: 1.5; }
.v3-dia2 .a-cv .cvb .lb { font-size: 9.5px; font-weight: 700; margin-bottom: 3px; display: block; }
.v3-dia2 .a-cv .cvb .dir { font-weight: 700; font-size: 12px; display: block; }
.v3-dia2 .a-cv .cvb .tx { font-size: 10.5px; color: var(--c-text); margin-top: 2px; display: block; }
.v3-dia2 .a-cv .cvb.view { background: rgba(236,170,11,.10); border: 1px solid rgba(236,170,11,.32); }
.v3-dia2 .a-cv .cvb.view .lb, .v3-dia2 .a-cv .cvb.view .dir { color: var(--c-accent); }
.v3-dia2 .a-cv .cvb.data { background: rgba(91,163,232,.08); border: 1px solid rgba(91,163,232,.32); }
.v3-dia2 .a-cv .cvb.data .lb, .v3-dia2 .a-cv .cvb.data .dir { color: #5BA3E8; }
.v3-dia2 .a-rel { display: flex; align-items: center; gap: 8px; padding: 8px 10px; border-radius: 8px; font-size: 11.5px; font-weight: 600; line-height: 1.45; }
.v3-dia2 .a-rel.warn { background: rgba(207,64,64,.08); border: 1px solid rgba(207,64,64,.3); color: var(--c-up); }
.v3-dia2 .a-rel.ok { background: rgba(0,172,78,.08); border: 1px solid rgba(0,172,78,.3); color: var(--c-down); }
.v3-dia2 .a-rel.flat { background: rgba(255,255,255,.04); border: 1px solid var(--c-border); color: var(--c-text-2); }
.v3-dia2 .a-rel .ic { font-size: 14px; flex-shrink: 0; }
/* LITE 简版朴素化(更紧凑, 拉开与 full 视觉差距) */
.v3-dia2.lite .a-pct { padding: 6px 8px; }
.v3-dia2 .dia-sum { background: rgba(236,170,11,.10); border: 1px solid var(--c-accent-border); border-radius: 10px; padding: 9px 11px; font-size: 12.2px; color: var(--c-text); line-height: 1.65; }
.v3-dia2 .dia-sum .hh { font-size: 10px; font-weight: 700; color: var(--c-accent); margin-bottom: 4px; }

/* 导出长图按钮(secondary 描边, accent 金字) */
.v3-dia-export {
  margin-top: 10px; padding: 5px 14px; font-size: 12px; width: auto;
  border-color: var(--c-accent-border); color: var(--c-accent);
}
.v3-dia-export:disabled { opacity: .7; cursor: wait; }  /* 修正② 导出中禁用 */
.v3-dia-export .v3-dia-spin {  /* 修正② 等待动画 spinner */
  display: inline-block; width: 11px; height: 11px; margin-right: 5px; vertical-align: -1px;
  border: 2px solid rgba(236,170,11,.35); border-top-color: var(--c-accent); border-radius: 50%;
  animation: v3-dia-spin .7s linear infinite;
}
@keyframes v3-dia-spin { to { transform: rotate(360deg); } }
@media (max-width: 768px) {
  .v3-dia-tip { font-size: 11px; }
}

/* ═══ 第三批B(2026-07-31): 评论发送 loading 态(防老人以为卡死重复点) ═══ */
.v3-forum-send.is-loading { opacity: .7; }
.v3-forum-send.is-loading svg { display: none; }
.v3-forum-send.is-loading::after { content: '发送中'; font-size: var(--t-meta); }

/* ═══ 第三批(2026-07-31): 论坛触摸目标全达标 44px(移动端) ═══ */
/* 报告 REPORT-2026-07-30-community-audit #6: .v3-forum-act 22-26 / expand 22 / send 34 / composer-img 36 / pin-btn 22 全不达 iOS HIG 44×44;
   桌面端鼠标精确保持紧凑不动,仅移动端撑高治误触;放文件末尾确保同特异性覆盖前面基础规则(后定义生效) */
@media (max-width: 768px) {
  .v3-forum-act { min-height: 44px; padding: 10px 8px; }                    /* 赞/评论/举报/删除(帖子底+评论区通用) */
  .v3-forum-expand { min-height: 44px; display: inline-flex; align-items: center; padding: 8px 4px; }  /* 楼中楼展开N条回复 */
  .v3-forum-send { min-height: 44px; }                                      /* 评论发送钮 */
  .v3-forum-composer-img { width: 44px; height: 44px; }                     /* 发图钮 36→44 */
  .v3-forum-reply-cancel { min-height: 44px; display: inline-flex; align-items: center; padding: 0 8px; }  /* 取消回复小链接 */
  /* v404(2026-09-05) 主人拍「置顶按钮缩小」撤 pin-btn 44px 触控规则——44px 大钮把卡片底部(foot 行)撑高
     (主人原话: 卡片内底部太高就是置顶按钮撑高的); icon 小钮 20px, 触控热区由 ::after 负 inset 扩回 44px */
}

/* ═══ 第三批(2026-07-31): 论坛桌面 max-width 居中(对齐聊天室 cr-stream 760 范式) ═══ */
/* 报告 REPORT-2026-07-30-community-audit: 论坛列表/详情桌面满宽(1384px)长文本一行拉满不可读,
   与聊天室已收窄的 760 不一致。论坛内容含九宫格配图+标题,比纯文字稍宽,820 合理。
   滚动容器 .cr-forum-panel(community.css:196)是论坛列表+详情统一主内容区,
   居中收窄其对齐聊天室体验。仅桌面>768 生效,移动端满宽贴边(沉浸式不变)。 */
@media (min-width: 769px) {
  .cr-forum-panel {
    max-width: 820px; margin-left: auto; margin-right: auto; width: 100%;
  }
}

/* === 音频原声条(2026-08-03 Pro专属, 视频弹窗博主口播原音播放) === */
.v3-audio-bar {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 14px; margin: 0;
  background: var(--c-surface); border-bottom: 1px solid rgba(255,255,255,.06);
  flex-shrink: 0;
}
/* 自定义播放器(2026-08-03 主人4需求): 无原生下载钮=禁下载 + 音量竖向浮层独立不挡进度条 */
.v3-aud-player { display: flex; align-items: center; gap: 10px; flex: 1; min-width: 0; }
.v3-aud-player audio { display: none; } /* 隐藏原生audio只用它播放, 控制全走自定义DOM */
.v3-aud-play { flex-shrink: 0; width: 34px; height: 34px; border-radius: 50%; border: none;
  background: var(--c-accent); color: #1a1a26; cursor: pointer; padding: 0;
  display: flex; align-items: center; justify-content: center; }
.v3-aud-play svg { display: block; } /* SVG block 级去掉行内基线空隙, 天然精准居中金色圆圈 */
.v3-aud-play:active { transform: scale(.94); }
.v3-aud-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 5px; }
.v3-aud-meta { display: flex; justify-content: space-between; align-items: center; gap: 8px; }
.v3-aud-title { color: var(--c-accent); font-weight: 600; font-size: 12px; white-space: nowrap; }
.v3-aud-time { font-size: 11px; color: var(--c-text-2); font-variant-numeric: tabular-nums; white-space: nowrap; }
.v3-aud-time b { color: var(--c-text); font-weight: 500; }
.v3-aud-seek { position: relative; height: 6px; background: rgba(255,255,255,.10); border-radius: 3px; cursor: pointer;
  touch-action: none; } /* 拖拽时禁浏览器默认水平滚动, pointer事件独占 */
.v3-aud-fill { position: absolute; left: 0; top: 0; height: 100%; width: 0%;
  background: var(--c-accent); border-radius: 3px; }
.v3-aud-thumb { position: absolute; top: 50%; left: 0; width: 12px; height: 12px; margin-left: -6px;
  transform: translateY(-50%); background: var(--c-accent); border-radius: 50%;
  box-shadow: 0 1px 4px rgba(0,0,0,.45); pointer-events: none; transition: transform .12s; } /* 圆点thumb, pointer-events:none让事件穿透到bar */
.v3-aud-seek:hover .v3-aud-thumb { transform: translateY(-50%) scale(1.15); }
.v3-audio-label {
  font-size: 12px; color: var(--c-text-2); white-space: nowrap; flex-shrink: 0;
}
/* 锁态: 非Pro点升级 */
.v3-audio-locked {
  cursor: pointer; gap: 12px; padding: 10px 14px;
  background: linear-gradient(90deg, rgba(255,224,138,.10), rgba(156,110,8,.06));
  transition: background .15s;
}
.v3-audio-locked:active { background: linear-gradient(90deg, rgba(255,224,138,.18), rgba(156,110,8,.10)); }
.v3-audio-locked:hover { background: linear-gradient(90deg, rgba(255,224,138,.16), rgba(156,110,8,.08)); }
.v3-audio-text { flex: 1; min-width: 0; display: flex; flex-direction: column; line-height: 1.3; }
.v3-audio-text b { font-size: 13px; color: var(--c-accent); font-weight: 600; }
.v3-audio-text small { font-size: 11px; color: var(--c-text-2); }
.v3-audio-arrow { color: var(--c-accent); font-size: 14px; flex-shrink: 0; }
@media (max-width: 768px) {
  .v3-aud-play { width: 32px; height: 32px; }
}

/* ═══ v237(2026-08-04) 全局常驻顶栏右区组件: 🔔通知钮 + 👤头像钮(移动端底栏砍"我的", 挪顶栏头像) ═══ */
.v3-header-bell, .v3-header-avatar {
  position: relative;
  border: none;
  background: transparent;
  cursor: pointer;
  padding: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  color: var(--c-text-2);
  -webkit-tap-highlight-color: transparent;
}
.v3-header-bell { width: 44px; height: 44px; border-radius: var(--radius-md); }
.v3-header-bell:active { background: var(--c-surface-2); }
.v3-header-bell svg { width: 20px; height: 20px; }
/* v241: i-bell 是纯 path(fill 型), 双主题靠 var(--c-text-2) 自适应(需求2 主题适配);
   顶栏 + sidebar footer 铃铛共用此规则。 */
.v3-header-bell svg, .v3-sidebar-bell svg { fill: var(--c-text-2); stroke: none; }
/* 通知红点(顶栏铃铛 dot, 独立 ID #v3HeaderNotifBadge 由 feedback.js _refreshBadge 显隐) */
.v3-header-notif-dot {
  position: absolute; top: 6px; right: 6px;
  width: 8px; height: 8px; border-radius: 50%;
  background: var(--c-accent); border: 1.5px solid var(--c-bg);
}
.v3-header-avatar {
  width: 32px; height: 32px; border-radius: 50%;
  /* 触摸目标扩44px(审计P2): 视觉32不变, 透明padding外圈=隐形热区 */
  padding: 6px; background-clip: content-box;
  /* v241: 固定渐变删, 让位 JS _renderAvatar 行内设深色系渐变(需求4 首字母+配色块, 白字 #fff) */
  color: #fff; font-weight: 700; font-size: 14px;
}

/* ═══ v241(2026-08-04) sidebar footer(PC 专用, 需求1: PC 删顶栏后入口挪 sidebar 底部) ═══ */
/* 变体A: 主题/🔔/头像 三按钮垂直堆叠, 紧凑省事, 靠 sidebar flex 末尾自然贴底 */
.v3-sidebar-footer {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  padding-top: 8px;
  border-top: 1px solid var(--c-border);
  margin-top: 4px;
}
.v3-sidebar-footer button {
  position: relative;
  border: none;
  background: transparent;
  cursor: pointer;
  padding: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  color: var(--c-text-2);
  -webkit-tap-highlight-color: transparent;
  transition: color .12s, background .12s;
}
.v3-sidebar-footer button:hover { color: var(--c-text); background: var(--c-surface); }
/* sidebar 主题单钮(循环 light↔dark, 图标由 app.js _syncSidebarThemeToggle 切 i-sun/i-moon) */
.v3-sidebar-theme-toggle { width: 40px; height: 40px; border-radius: var(--radius-md); }
.v3-sidebar-theme-toggle svg { width: 18px; height: 18px; }
.v3-sidebar-bell { width: 40px; height: 40px; border-radius: var(--radius-md); }
.v3-sidebar-bell:active { background: var(--c-surface-2); }
.v3-sidebar-bell svg { width: 20px; height: 20px; }
/* sidebar 通知红点(独立 ID #v3SidebarNotifBadge, feedback.js _refreshBadge 多实例显隐) */
.v3-sidebar-notif-dot {
  position: absolute; top: 7px; right: 8px;
  width: 8px; height: 8px; border-radius: 50%;
  background: var(--c-accent); border: 1.5px solid var(--c-bg);
}
.v3-sidebar-avatar {
  width: 34px; height: 34px; border-radius: 50%;
  color: #fff; font-weight: 700; font-size: 14px;
  /* background 由 app.js _renderAvatar 行内设深色系渐变 */
}

/* ─── Batch B(2026-08-05) 关注按钮 + 个人主页弹窗(forum-profile.js) ─── */
.v3-full-close {
  margin-left: auto;             /* 推到顶栏右端 */
  background: none; border: none; color: var(--c-text-2);
  display: flex; align-items: center; cursor: pointer; padding: 4px;
}
.v3-follow-btn {
  /* v261(2026-08-06): 描边小号风(主人定B变体), 实心金棕块在profile头部太抢眼→透明底+金棕描边柔和不抢主题 */
  flex-shrink: 0; font-size: 12px; font-weight: 600;
  padding: 4px 12px; border-radius: 14px; border: 1px solid var(--c-accent); cursor: pointer;
  min-height: 26px; background: transparent; color: var(--c-accent);
}
.v3-follow-btn:active { opacity: .7; }
.v3-follow-btn:disabled { opacity: .6; }
.v3-follow-btn.v3-follow-btn-sm { font-size: 11px; padding: 3px 9px; min-height: 24px; position: relative; }
/* 2026-09-26 卫生批 P3-3: 视觉尺寸不动, ::before 透明扩 hit-area 至 44px(24+2×10) 提升移动端点击准确率 */
.v3-follow-btn.v3-follow-btn-sm::before { content: ''; position: absolute; inset: -10px; }
.v3-follow-btn.v3-follow-btn-on {
  /* v350(2026-08-21) 主人 3 区 V3 金棕: 已关注态 = 金棕底白字(品牌色), hover 红字"取消关注" (JS mouseenter/mouseleave 切文字) */
  background: var(--c-accent); color: var(--c-accent-text);
  border: 1px solid var(--c-accent);
}
.v3-follow-btn.v3-follow-btn-on:hover {
  background: transparent; color: #ff3b30;
  border-color: #ff3b30;
}
.v3-profile-head {
  display: flex; align-items: center; gap: 12px;
  padding: 4px 0 14px; border-bottom: 1px solid var(--c-border);
}
/* v350.8(2026-08-21) 主人 #6 治本: head 卡 = 头像 + info(bio 内部化) 共享同色卡背景, 让 bio 跟头像明显属同一人
   浅底 = var(--c-surface-2) 跟普通区段区分, 但不抢 tab/列表眼. 圆角让 head 跟 tab 边界清晰 */
.v3-profile-head.v3-profile-head-card {
  background: var(--c-surface-2);
  border-radius: 12px;
  padding: 14px;
  margin-bottom: 4px;
  border: 1px solid var(--c-border);
}
/* v350.7(2026-08-21) 主人 #6: 删 bio 折叠, 直接显示(主人原话"个人主页为何没有加载个人简介" = 不该折叠)
   v350.8 主人 #6: bio 挪进 head.info 内部, 跟 nickname+粉丝数同列 */
.v3-profile-bio {
  font-size: 13px; line-height: 1.6; color: var(--c-text-2);
  white-space: pre-wrap; word-break: break-word;
  margin-top: 6px; padding-top: 6px;
  border-top: 1px dashed var(--c-border);   /* v350.8 视觉锚: 跟昵称/粉丝数同列, 虚线隔开但同属一个"卡" */
}
/* v350(2026-08-21) 主人 4 区 V2: 移动端 (innerWidth<768) 主页用 60vh 贴底抽屉, 桌面端保持全屏 overlay */
@media (max-width: 768px) {
  .v3-profile-drawer-mobile.v3-full-overlay {
    align-items: stretch;     /* v382 真凶: 原 align-items:flex-end + justify-content:center 搞反了
                                 flex-direction:column 下 justify=垂直主轴 align=水平交叉轴
                                 "贴底抽屉"=垂直贴底(justify:flex-end) + 水平撑满(align:stretch)
                                 原写法→topbar 缩成 164px 飘右边 + body 垂直居中 = 用户所见"集中在屏幕中间" */
    justify-content: flex-end;
  }
  /* v350 + .v3-full-body(forum-profile.js 实际 DOM 是 .v3-full-overlay > topbar+body, 无 .v3-full-content) */
  .v3-profile-drawer-mobile > .v3-full-content,
  .v3-profile-drawer-mobile > .v3-full-body,
  .v3-profile-drawer-mobile .v3-full-card {
    max-height: 60vh !important;
    height: 60vh;
    overflow-y: auto;
    border-radius: 16px 16px 0 0 !important;
    margin: 0;
    animation: v3-drawer-up .25s ease-out;
  }
  .v3-profile-drawer-mobile .v3-full-topbar {
    border-radius: 16px 16px 0 0;
  }
}
@keyframes v3-drawer-up {
  from { transform: translateY(100%); }
  to { transform: translateY(0); }
}
.v3-profile-avatar { width: 52px; height: 52px; font-size: 22px; }
.v3-profile-info { flex: 1; min-width: 0; }
.v3-profile-tabs {
  display: flex; gap: 8px; padding: 12px 0 8px;
  border-bottom: 1px solid var(--c-border);
}
.v3-profile-tab {
  background: none; border: none; cursor: pointer;
  font-size: 13px; color: var(--c-text-3);
  padding: 8px 10px; border-radius: 8px; min-height: 40px;
}
.v3-profile-tab.v3-profile-tab-on {
  color: var(--c-text); font-weight: 600; background: var(--c-surface-2);
}
.v3-profile-content { padding-top: 10px; }
.v3-profile-postcard { padding: 10px 12px; margin-bottom: 8px; }
.v3-profile-userrow {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 12px; margin-bottom: 8px;
}

/* v366.4(2026-08-27 晚) Bug 3 治本: forum-profile.js L196-199 加了 .v3-profile-stats 容器 + 2 个 .v3-profile-stat 卡片 (主人原话"是不是因为加了帖子被点赞、被回复导致的? 你好好调整一下这两个数据在个人主页中的位置和样式"),
   components.css 全文无对应 CSS 规则, 2 卡片默认 block 上下堆叠撑破 head 卡布局.
   治本: head.info 内部横向 2 卡片等宽, 跟头像/昵称/粉丝数同列, 视觉从属 head 卡, 不再撑破布局 */
.v3-profile-stats {
  display: flex;
  gap: 8px;
  margin-top: 8px;
}
.v3-profile-stat {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 6px 10px;
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  border-radius: 8px;
  flex: 1;
  min-width: 0;
}
.v3-profile-stat svg { color: var(--c-accent); flex-shrink: 0; }
.v3-profile-stat-num { font-weight: 600; font-size: 13px; color: var(--c-text); }
.v3-profile-stat-lbl { font-size: 12px; color: var(--c-text-3); }

/* v372+v373 分页器 (v372 经典分页器 1 字不改立选 A, v373 治本 1 行布局 + sticky bottom + 移动端适配):
   v373 真凶: 信息 1 行 (居中) + 按钮 1 行 (居中) 分 2 行, 移动端 9+ 按钮挤换行; 1 行布局: info 左 + row 右 (flex justify-between, 移动端 stack).
   v373 sticky bottom: position sticky bottom 0, 永远贴底可见, 长列表翻看时不分心. */
.v3-video-pager {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
  padding: 12px 0 8px;
}
.v3-video-pager-info {
  font-size: 12px;
  color: var(--c-text-3);
  text-align: center;
}
.v3-video-pager-row {
  display: flex;
  flex-wrap: nowrap;  /* v373 治本补丁(2026-08-28 主人反馈 3 Playwright 真验后): 删 wrap 防 PC 1 行布局被 row 内部 wrap 撑成 2 行.
                         nowrap + overflow-x: auto 横向 scroll 适配窄屏 (移动端父级已改 column 2 行, 内部 nowrap 不影响移动端). */
  justify-content: center;
  align-items: center;
  gap: 4px;
  overflow-x: auto;  /* v373 补丁: nowrap 后 button 多溢出横向 scroll, 不撑高 */
}
.v3-pager-ellipsis {
  display: inline-flex;
  align-items: center;
  padding: 0 6px;
  color: var(--c-text-3);
  font-size: 12px;
  user-select: none;
}
.v3-pager-jump {
  display: inline-flex;
  align-items: center;
  margin-left: 8px;
  color: var(--c-text-3);
  font-size: 12px;
}
.v3-pager-jump-input {
  width: 48px;
  padding: 4px 6px;
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  border-radius: 6px;
  color: var(--c-text);
  font-size: 12px;
  text-align: center;
  margin: 0 4px;
  -moz-appearance: textfield;
}
.v3-pager-jump-input::-webkit-outer-spin-button,
.v3-pager-jump-input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.v3-pager-jump-input:focus { outline: none; border-color: var(--c-accent); }
.v3-pager-jump-go { padding: 4px 10px !important; font-size: 12px; }
.v3-pill.active {
  background: var(--c-accent) !important;
  color: #1a1f28 !important;
  border-color: var(--c-accent) !important;
  font-weight: 600;
}
.v3-pill[disabled] { opacity: 0.4; cursor: not-allowed; }

/* v373 sticky bottom 主体(videos 列表页生效, 主人 1 字不改立反馈 2):
   主人原话: "分页信息能不能始终保持在屏幕底部"
   v373 治本补丁(2026-08-28 主人反馈 2 Playwright 真验后): sticky → fixed
     真凶: v3-content 是 v74 治本定的页级滚动容器 (overflow-y:auto, height calc(100vh - header)),
       sticky 跟 v3-content 滚 → 跟 v3-content 底 731px 走, viewport 844 → diff 69px 没贴 viewport 底.
     治本: position fixed 钉 viewport bottom 0 + z-index 100 (浮层覆盖, 不参与 v3-content 滚动布局).
     videos.js _renderPager 末尾给 v3-content padding-bottom:80px 留空间, 防止 fixed 浮层挡最后一行视频.
   v374 治本(2026-08-28 主人 1 字不改立反馈 2): 撤 fixed 改回 sticky 跟 v3-content 底 731 走
     真凶(主人 17:30+ 反馈): v373 fixed 钉 viewport bottom 0 = 钉错位置, 钉到 844 去了
       主人原话"在内容库区域底部" = v3-content 底 731, 不是 viewport 底 844
       v3-content 是 overflow-y:auto 滚动容器 (v74 治本), position:sticky 跟 v3-content 滚 = 跟 v3-content 底 731 走
       主人口径 "PC 端分页条都超出内容库区域了" = 跟 v3-content 区域底 731 有 113px 差距, 完全溢出
       主人口径 "移动端都找不到分页条了" = fixed 浮层在 v3-content 外 + 移动端 v3-content 高度更小
     治本: 撤 position:fixed 改 position:sticky, 跟 v3-content 滚, 跟 v3-content 底 731 走 (跟 v3-content 平齐)
     videos.js L246-247 paddingBottom 80 兜底同步删 (sticky 不浮层不挡内容, 不用 padding)
   z-index 100 高于卡片不挡模态.
   只在 videos 列表页 #v3VideoPager 生效 (videos.js L155 创建, 唯一节点, 不影响其他场景). */
#v3VideoPager {
  /* v376 治本(2026-08-28 主人 1 字不改立反馈 1): 改回 fixed 钉 viewport 底 (v373 49c2440 范式 1:1 沿用)
     真凶: v374 sticky 跟 v3-content 滚, v3-content 短 (内容库 1 页) 时 v3-content 实际底 < viewport 底,
     sticky 钉 v3-content 实际底 = 钉 v3-content 内容底部, 不在视口底, 主人大屏浏览器实测"看不到分页条"
     跟 v374 撤 fixed 矛盾, v376 主人新反馈优先, KISS 拍脸"立刻干 0 选" */
  position: fixed;
  /* v377 治本(2026-08-28 主人 1 字不改立反馈 2): 加 left: var(--sidebar-w) PC 端 sidebar 偏移
     真凶: v376 改回 fixed 钉 viewport 底 (v373 范式 1:1), 但 left: 0; right: 0 让 fixed 元素占 viewport 全宽 1920
     PC 端 sidebar 宽 56px (theme.css --sidebar-w) 在 .v3-main margin-left 已让位, 但 fixed 脱离文档流不受 .v3-main margin-left 影响,
     主人 PC 端实测"分页条超出右侧内容库显示区域, 覆盖到了左侧菜单栏" = fixed 浮层覆盖 sidebar
     治本: left: var(--sidebar-w) 让 PC 端浮层从 sidebar 右边缘开始, 移动端 media 块内 left: 0 兜底 (跟 layout.css L222 sidebar hidden 1:1 沿用) */
  left: var(--sidebar-w);
  right: 0;
  bottom: 0;
  background: var(--c-bg);
  padding: 10px 12px;
  box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.08);
  z-index: 100;
  border-top: 1px solid var(--c-border);
}
/* v373 1 行展示 (主人 1 字不改立反馈 3): info 左 + row 右, flex justify-between, 移动端仍 2 行 (容不下 stack).
   v373 治本补丁(2026-08-28 主人反馈 3 Playwright 真验后): 加 display: flex
     真凶: 默认 #v3VideoPager display: block, 仅 flex-direction:row 无效, 子元素 block 排版上下排.
     治本: display: flex + flex-direction: row + justify-content: space-between, info row 水平排成 1 行. */
#v3VideoPager {
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  align-items: center;
  text-align: left;
}
#v3VideoPager .v3-video-pager-info { text-align: left; flex-shrink: 0; }
#v3VideoPager .v3-video-pager-row { flex-shrink: 1; }
#v3VideoPager .v3-pager-jump { display: none; } /* 移动端隐藏 "跳" 字, 按钮自带 Go */

/* v383(2026-08-30) 论坛分页器 #v3ForumPager — 复用内容库 v3-video-pager-* / v3-pill / v3-pager-* 全套子件样式,
   容器布局对齐 #v3VideoPager 1 行模式(info 左 + row 右).
   v383.1(2026-08-30 主人验收反馈"论坛的分页条没有固定在论坛页面底部"): 流内改 fixed 钉底, 定位 1:1 对齐
   #v3VideoPager v376-v378 范式: PC left:var(--sidebar-w) 防盖 sidebar / bottom:0; 移动 left:0 +
   bottom:var(--bottom-nav-h) 抬到 v3-bottom-nav 顶(v378 同款). FAB 重叠处理: 移动端 .v3-forum-fab
   bottom 抬到 pager 之上(见下 media); 列表遮挡用 #page-forum padding-bottom 兜底. */
#page-forum { padding-bottom: 70px; }   /* fixed pager(PC ~50px) 列表尾部遮挡兜底 */
#v3ForumPager {
  position: fixed;
  left: var(--sidebar-w);
  right: 0;
  bottom: 0;
  display: flex; flex-direction: row; justify-content: space-between; align-items: center;
  text-align: left; padding: 10px 12px;
  background: var(--c-bg);
  box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.08);
  z-index: 100;
  border-top: 1px solid var(--c-border);
}
#v3ForumPager .v3-video-pager-info { text-align: left; flex-shrink: 0; }
#v3ForumPager .v3-video-pager-row { flex-shrink: 1; }
#v3ForumPager .v3-pager-jump { display: none; } /* 移动端隐藏 "跳" 字, 按钮自带 Go */
@media (max-width: 640px) {
  /* v383.2(2026-08-30 主人反馈"和内容库的分页条一个问题, 占用太多高度了, 能不能信息在同一行展示"):
     移动端两行 stack(推翻 v373 "容不下" 决策, 主人 8-30 拍一行) 改单行 row — info 左 + 按钮右同 1 行,
     高度 ~68px→~40px; 极窄屏放不下时 .v3-video-pager-row 自带 overflow-x:auto 横滚兜底(v373 已有). */
  #page-forum { padding-bottom: 110px; }   /* 移动端 pager 单行(~40px+safe) + 呼吸 */
  #v3ForumPager { left: 0; bottom: calc(var(--bottom-nav-h) + env(safe-area-inset-bottom, 0px) + 8px);
    padding: 6px 10px calc(6px + env(safe-area-inset-bottom, 0px)); }
    /* v386c: nav 总高从 56→56+safe+8(border-box 修复), pager 底也同步抬到 nav 顶, 防坐进 nav 被盖住 */
  #v3ForumPager .v3-video-pager-info { font-size: 11px; }
  #v3ForumPager .v3-video-pager-row { gap: 3px; }
  #v3ForumPager .v3-pill { padding: 3px 8px !important; font-size: 12px !important; }
  #v3ForumPager .v3-pager-jump-input { width: 38px; padding: 3px 4px; font-size: 11px; }
  #v3ForumPager .v3-pager-jump-go { padding: 3px 8px !important; font-size: 11px !important; }
  /* FAB 抬高规则在 community.css(基础规则同文件, 写这里会被后注入的 community.css 反超 — v383.1 实测踩坑) */
}

/* v373 移动端 media query (max-width: 640px, 主人 1 字不改立反馈 2+3): 字号缩 / 间距缩 / sticky bottom + safe-area 适配
   iPhone X+ 底部 home indicator 留 34px 安全区. */
@media (max-width: 640px) {
  #v3VideoPager {
    /* v383.2(2026-08-30 主人反馈"和内容库的分页条一个问题, 占用太多高度了, 能不能信息在同一行展示"):
       两行 stack(推翻 v373 "移动端容不下" 决策, 主人 8-30 拍一行) 改单行 row, 高度 ~68→~40px.
       极窄屏 .v3-video-pager-row overflow-x:auto 横滚兜底(v373 已有); 内容库/论坛(#v3ForumPager)同步改. */
    padding: 6px 10px calc(6px + env(safe-area-inset-bottom, 0px));
    left: 0;  /* v377 治本: 移动端 sidebar hidden (layout.css L222), fixed 浮层 left: var(--sidebar-w) 偏右 56px 错, 改 left: 0 */
    bottom: calc(var(--bottom-nav-h) + env(safe-area-inset-bottom, 0px) + 8px);
    /* v378 治本(2026-08-28 主人 19:40+ 反馈"移动端分页条又被你搞没了"): 抬高 56px 避开 v3-bottom-nav
       真凶: v376 实施改回 fixed 钉 viewport 底 (b68f05d) + v377 改 left 偏移, 老王漏查移动端 .v3-bottom-nav 重叠
       实测 (Playwright 412x915):
         - v3-bottom-nav: top=859, bottom=915, h=56, z-index=100, position=fixed
         - #v3VideoPager: top=846.5, bottom=915, h=68.5, z-index=100, position=fixed
         - overlap=true, 859-915 区间 56px 高度 v3-bottom-nav 完全覆盖 pager 按钮, elementFromPoint(206, 880)=SVG (.v3-bottom-nav icon)
       v386c: nav 总高从 56→56+safe+8(border-box 修复), pager 底同步抬到 nav 顶, 防坐进 nav 被盖住 */
  }
  #v3VideoPager .v3-video-pager-info { font-size: 11px; }
  #v3VideoPager .v3-video-pager-row { gap: 3px; }
  #v3VideoPager .v3-pill { padding: 3px 8px !important; font-size: 12px !important; }
  #v3VideoPager .v3-pager-jump-input { width: 38px; padding: 3px 4px; font-size: 11px; }
  #v3VideoPager .v3-pager-jump-go { padding: 3px 8px !important; font-size: 11px !important; }
}

/* ============================================================
   v388 论坛调研征集 (Forum Survey)
   ============================================================ */

/* --- 帖子底部汇总区块 --- */
.v3-survey-summary {
  margin: 16px 0;
  padding: 16px;
  background: var(--c-card);
  border-radius: var(--radius-md);
  border: 1px solid var(--c-border);
}
/* v395: inline 变体 — 征集区嵌进正文卡片内(原独立卡片会卡片套卡片), 浅底无边框 */
.v3-survey-summary-inline {
  margin: 14px 0 4px;
  padding: 12px;
  background: var(--c-bg-2);
  border: none;
}
.v3-survey-summary-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 12px;
}
.v3-survey-summary-title {
  display: flex;
  align-items: center;
  font-size: var(--t-subtitle);
  font-weight: 600;
  color: var(--c-text-1);
}
.v3-survey-summary-title .v3-svg-icon { color: var(--c-accent); }
.v3-survey-summary-stat {
  font-size: var(--t-meta);
  color: var(--c-text-2);
}
.v3-survey-summary-ranks {
  margin-bottom: 12px;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
/* v395: 行内双态投票按钮 — 未投描边金色「投票」/已投灰底「已投✓」点击取消 */
.v3-survey-vote-btn {
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  gap: 2px;
  border: 1px solid var(--c-accent);
  color: var(--c-accent);
  background: transparent;
  font-size: 11px;
  font-weight: 600;
  padding: 3px 10px;
  border-radius: 999px;
  cursor: pointer;
}
.v3-survey-vote-btn .v3-svg-icon { width: 11px; height: 11px; }
.v3-survey-vote-btn:active { opacity: .75; }
.v3-survey-vote-btn:disabled { opacity: .45; cursor: default; }
.v3-survey-vote-btn-on {
  background: var(--c-bg-3);
  border-color: var(--c-border);
  color: var(--c-text-3);
}
.v3-survey-sm-rank-row {
  display: flex;
  align-items: center;
  gap: 10px;
}
.v3-survey-sm-rank-num {
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: var(--c-bg-2);
  color: var(--c-text-3);
  font-size: 11px;
  font-weight: 600;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
.v3-survey-sm-rank-top1 { background: linear-gradient(135deg, #FFD700, #FFA500); color: #fff; }
.v3-survey-sm-rank-top2 { background: linear-gradient(135deg, #C0C0C0, #A0A0A0); color: #fff; }
.v3-survey-sm-rank-top3 { background: linear-gradient(135deg, #CD7F32, #A0522D); color: #fff; }
.v3-survey-sm-rank-info {
  flex: 1;
  min-width: 0;
}
.v3-survey-sm-rank-name-row {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-bottom: 4px;
}
.v3-survey-sm-rank-name {
  font-size: var(--t-body);
  font-weight: 500;
  color: var(--c-text-1);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 60%;
}
.v3-survey-sm-rank-plat {
  font-size: 10px;
  padding: 1px 6px;
  border-radius: 4px;
  background: var(--c-accent-bg);
  color: var(--c-accent);
  flex-shrink: 0;
}
.v3-survey-sm-rank-bar {
  height: 4px;
  background: var(--c-bg-2);
  border-radius: 2px;
  overflow: hidden;
}
.v3-survey-sm-rank-bar-fill {
  height: 100%;
  background: linear-gradient(90deg, var(--c-accent), var(--c-accent-dim));
  border-radius: 2px;
  transition: width .3s;
}
.v3-survey-sm-rank-votes {
  font-size: var(--t-meta);
  color: var(--c-text-2);
  flex-shrink: 0;
  min-width: 32px;
  text-align: right;
}
.v3-survey-sm-threshold-tag {
  color: var(--c-accent);
  display: flex;
  align-items: center;
  flex-shrink: 0;
}
.v3-survey-summary-btn-row {
  display: flex;
  gap: 8px;
}
.v3-survey-summary-btn {
  flex: 1;
}

/* --- 征集页 overlay --- */
.v3-survey-body {
  padding-bottom: 100px;
}
.v3-survey-skeleton {
  padding: 16px;
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.v3-survey-skel-line {
  background: var(--c-bg-2);
  border-radius: 8px;
  animation: v3-skel-pulse 1.5s ease-in-out infinite;
}
@keyframes v3-skel-pulse {
  0%, 100% { opacity: .6; }
  50% { opacity: 1; }
}

/* 简介区 */
.v3-survey-intro {
  padding: 20px 16px;
  background: linear-gradient(135deg, var(--c-accent-bg), transparent);
  border-bottom: 1px solid var(--c-border);
}
.v3-survey-intro-title {
  font-size: 20px;
  font-weight: 700;
  color: var(--c-text-1);
  margin-bottom: 6px;
}
.v3-survey-intro-desc {
  font-size: var(--t-body);
  color: var(--c-text-2);
  line-height: 1.5;
  margin-bottom: 14px;
}
.v3-survey-stat-row {
  display: flex;
  gap: 10px;
}
.v3-survey-stat-card {
  flex: 1;
  padding: 12px 8px;
  background: var(--c-card);
  border-radius: var(--radius-md);
  text-align: center;
  border: 1px solid var(--c-border);
}
.v3-survey-stat-num {
  font-size: 20px;
  font-weight: 700;
  color: var(--c-accent);
}
.v3-survey-stat-label {
  font-size: 11px;
  color: var(--c-text-3);
  margin-top: 2px;
}

/* 已参与标记 */
.v3-survey-done-tag {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 4px;
  margin: 12px 16px 0;
  padding: 8px 12px;
  background: var(--c-up-bg);
  color: var(--c-up);
  border-radius: var(--radius-sm);
  font-size: var(--t-body);
  font-weight: 500;
}

/* section 标题 */
.v3-survey-section-title {
  display: flex;
  align-items: center;
  padding: 20px 16px 10px;
  font-size: var(--t-subtitle);
  font-weight: 600;
  color: var(--c-text-1);
}
.v3-survey-section-title .v3-svg-icon { color: var(--c-accent); }

/* 排行榜 */
.v3-survey-rank-list {
  padding: 0 16px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.v3-survey-rank-item {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 12px;
  background: var(--c-card);
  border-radius: var(--radius-md);
  border: 1px solid var(--c-border);
  position: relative;
}
.v3-survey-rank-num {
  width: 28px;
  height: 28px;
  border-radius: 50%;
  background: var(--c-bg-2);
  color: var(--c-text-3);
  font-size: 13px;
  font-weight: 700;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
.v3-survey-rank-top1 { background: linear-gradient(135deg, #FFD700, #FFA500); color: #fff; }
.v3-survey-rank-top2 { background: linear-gradient(135deg, #C0C0C0, #A0A0A0); color: #fff; }
.v3-survey-rank-top3 { background: linear-gradient(135deg, #CD7F32, #A0522D); color: #fff; }
.v3-survey-rank-main {
  flex: 1;
  min-width: 0;
}
.v3-survey-rank-head {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 6px;
}
.v3-survey-rank-name {
  font-size: var(--t-body);
  font-weight: 600;
  color: var(--c-text-1);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.v3-survey-rank-platform {
  font-size: 10px;
  padding: 2px 8px;
  border-radius: 4px;
  background: var(--c-accent-bg);
  color: var(--c-accent);
  flex-shrink: 0;
}
.v3-survey-rank-bar {
  height: 6px;
  background: var(--c-bg-2);
  border-radius: 3px;
  overflow: hidden;
  margin-bottom: 4px;
}
.v3-survey-rank-bar-fill {
  height: 100%;
  background: linear-gradient(90deg, var(--c-accent), var(--c-accent-dim));
  border-radius: 3px;
  transition: width .3s;
}
.v3-survey-rank-foot {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.v3-survey-rank-votes {
  font-size: var(--t-meta);
  color: var(--c-text-2);
  font-weight: 500;
}
.v3-survey-rank-pct {
  font-size: var(--t-meta);
  color: var(--c-text-3);
}
.v3-survey-threshold-tag {
  display: flex;
  align-items: center;
  gap: 3px;
  font-size: 11px;
  font-weight: 600;
  color: var(--c-accent);
  background: var(--c-accent-bg);
  padding: 4px 8px;
  border-radius: 6px;
  flex-shrink: 0;
}

/* 已提交回顾 */
.v3-survey-my-list {
  padding: 0 16px;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.v3-survey-my-item {
  padding: 12px;
  background: var(--c-card);
  border-radius: var(--radius-md);
  border: 1px solid var(--c-border);
}
.v3-survey-my-head {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 6px;
}
.v3-survey-my-name {
  font-size: var(--t-body);
  font-weight: 600;
  color: var(--c-text-1);
}
.v3-survey-my-reason {
  font-size: var(--t-meta);
  color: var(--c-text-2);
  line-height: 1.5;
}

/* 添加博主区 */
.v3-survey-add-wrap {
  padding: 0 16px 16px;
  position: relative;
}
.v3-survey-add-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-bottom: 12px;
}
.v3-survey-added-item {
  padding: 12px;
  background: var(--c-card);
  border-radius: var(--radius-md);
  border: 1px solid var(--c-border);
}
.v3-survey-added-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 4px;
}
.v3-survey-added-name {
  font-size: var(--t-body);
  font-weight: 600;
  color: var(--c-text-1);
}
.v3-survey-added-del {
  background: transparent;
  border: none;
  color: var(--c-text-3);
  cursor: pointer;
  padding: 4px;
  display: flex;
  align-items: center;
}
.v3-survey-added-del:hover { color: var(--c-down); }
.v3-survey-added-meta {
  font-size: var(--t-meta);
  color: var(--c-text-3);
  margin-bottom: 6px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.v3-survey-added-reason {
  font-size: var(--t-meta);
  color: var(--c-text-2);
  line-height: 1.4;
}
/* 快捷选择 chip 区 */
.v3-survey-quick {
  margin-bottom: 16px;
}
.v3-survey-quick-head {
  display: flex;
  align-items: center;
  font-size: var(--t-meta);
  font-weight: 600;
  color: var(--c-accent);
  margin-bottom: 8px;
}
.v3-survey-quick-title {
  margin-left: 2px;
}
.v3-survey-quick-scroll {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  margin: 0 -16px;
  padding: 2px 16px 6px;
}
.v3-survey-quick-list {
  display: flex;
  gap: 8px;
  padding-right: 4px;
}
.v3-survey-quick-chip {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 6px 12px;
  background: var(--c-card);
  border: 1px solid var(--c-border);
  border-radius: 16px;
  font-size: var(--t-meta);
  color: var(--c-text-2);
  cursor: pointer;
  transition: all .15s;
}
.v3-survey-quick-chip:active {
  background: var(--c-bg-2);
  transform: scale(.97);
}
.v3-survey-quick-chip-name {
  font-weight: 500;
  color: var(--c-text-1);
}
.v3-survey-quick-chip-votes {
  font-size: 10px;
  color: var(--c-accent);
  background: var(--c-accent-bg);
  padding: 1px 6px;
  border-radius: 8px;
}
.v3-survey-quick-chip-added {
  opacity: .6;
  cursor: not-allowed;
  background: var(--c-up-bg);
  border-color: var(--c-up);
  color: var(--c-up);
}
.v3-survey-quick-chip-added .v3-svg-icon { color: var(--c-up); }
/* v394: 历史已投博主置灰禁点（同一博主仅可提名一次） */
.v3-survey-quick-chip-voted {
  opacity: .45;
  cursor: not-allowed;
  background: var(--c-bg-2);
  border-color: var(--c-border);
  color: var(--c-text-3);
}
.v3-survey-quick-chip-voted .v3-survey-quick-chip-votes { color: var(--c-text-3); background: transparent; }

/* 待提名列表标题 */
.v3-survey-add-list-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 8px;
}
.v3-survey-add-list-title {
  font-size: var(--t-body);
  font-weight: 600;
  color: var(--c-text-1);
}
.v3-survey-add-count {
  font-size: var(--t-meta);
  color: var(--c-text-3);
}
.v3-empty-tip-sm {
  font-size: var(--t-meta);
  padding: 20px 12px;
}

/* 添加切换按钮 */
.v3-survey-add-toggle {
  width: 100%;
  margin-bottom: 12px;
  display: flex;
  align-items: center;
  justify-content: center;
}

/* 内联表单 */
.v3-survey-form-wrap {
  max-height: 0;
  overflow: hidden;
  transition: max-height .3s ease;
}
.v3-survey-form-open {
  max-height: 2000px;
}
.v3-survey-add-form {
  padding: 14px;
  background: var(--c-card);
  border: 1px solid var(--c-border);
  border-radius: var(--radius-md);
  margin-bottom: 12px;
}
.v3-survey-form-title {
  display: flex;
  align-items: center;
  font-size: var(--t-body);
  font-weight: 600;
  color: var(--c-text-1);
  margin-bottom: 12px;
  padding-bottom: 10px;
  border-bottom: 1px solid var(--c-border);
}
.v3-survey-form-title .v3-svg-icon { color: var(--c-accent); }

/* 平台选择 chip */
.v3-survey-plat-row {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.v3-survey-plat-chip {
  cursor: pointer;
}
.v3-survey-plat-chip input {
  display: none;
}
.v3-survey-plat-chip span {
  display: inline-block;
  padding: 6px 14px;
  border-radius: 16px;
  border: 1px solid var(--c-border);
  font-size: var(--t-body);
  color: var(--c-text-2);
  background: var(--c-bg);
  transition: all .2s;
}
.v3-survey-plat-chip input:checked + span {
  background: var(--c-accent-bg);
  border-color: var(--c-accent);
  color: var(--c-accent);
  font-weight: 500;
}
.v3-survey-other-wrap {
  margin-top: 10px;
}

/* 截图上传 */
.v3-survey-upload-row {
  margin-top: 8px;
}
.v3-survey-upload-btn {
  width: 100%;
  height: 100px;
  border: 2px dashed var(--c-border);
  border-radius: var(--radius-md);
  background: var(--c-bg-2);
  color: var(--c-text-3);
  cursor: pointer;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 6px;
}
.v3-survey-upload-btn:hover {
  border-color: var(--c-accent);
  color: var(--c-accent);
}
.v3-survey-img-preview {
  position: relative;
  display: inline-block;
}
.v3-survey-img-preview img {
  width: 100%;
  max-height: 200px;
  object-fit: cover;
  border-radius: var(--radius-md);
}
.v3-survey-img-del {
  position: absolute;
  top: 6px;
  right: 6px;
  width: 24px;
  height: 24px;
  border-radius: 50%;
  background: rgba(0,0,0,.6);
  color: #fff;
  border: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
}

/* 表单按钮 */
.v3-survey-form-btns {
  display: flex;
  gap: 10px;
  margin-top: 16px;
}
.v3-survey-form-btns .v3-btn {
  flex: 1;
}

/* 未填写理由提示（选填态，灰色斜体） */
.v3-survey-reason-empty {
  color: var(--c-text-3) !important;
  font-style: italic;
}

/* 理由必填态（红色提示） */
.v3-survey-reason-required {
  color: var(--c-danger) !important;
  font-style: italic;
  font-weight: 500;
}

/* 空理由卡片加左边框提示 */
.v3-survey-added-item-no-reason {
  border-left: 3px solid var(--c-danger);
  padding-left: 10px;
}

/* 底部提交栏（流式，跟随内容滚动） */
.v3-survey-submit-bar {
  margin-top: 20px;
  padding-top: 16px;
  border-top: 1px solid var(--c-border);
}
.v3-survey-submit-btn {
  width: 100%;
  display: block;
}

/* 征集页内容容器（PC 居中限制宽度） */
.v3-survey-page {
  max-width: 680px;
  margin: 0 auto;
  width: 100%;
}

/* 发帖浮层 - 帖子类型选择 */
.v3-post-type-row {
  display: flex;
  gap: 10px;
  margin-top: 8px;
}
.v3-post-type-chip {
  cursor: pointer;
}
.v3-post-type-chip input { display: none; }
.v3-post-type-chip span {
  display: inline-block;
  padding: 8px 18px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--c-border);
  font-size: var(--t-body);
  color: var(--c-text-2);
  background: var(--c-bg);
  transition: all .2s;
}
.v3-post-type-chip input:checked + span {
  background: var(--c-accent-bg);
  border-color: var(--c-accent);
  color: var(--c-accent);
  font-weight: 500;
}
.v3-post-type-tip {
  margin-top: 8px;
  padding: 8px 12px;
  background: var(--c-accent-bg);
  color: var(--c-accent);
  border-radius: var(--radius-sm);
  font-size: var(--t-meta);
  line-height: 1.4;
}

/* ═══ v468(2026-09-28) 全局快讯弹条 news-toast.js 配套 .nt-*(news房上新→任意页顶部5s弹条, v468.3加圆环倒计时) ═══ */
.nt-toast {
  position: fixed;
  top: calc(env(safe-area-inset-top, 0px) + 10px);
  left: 50%;
  display: flex;
  align-items: center;
  gap: 10px;
  max-width: min(440px, calc(100vw - 24px));
  padding: 10px 14px;
  background: var(--c-bg-2);
  border: 1px solid rgba(34, 158, 217, .30); /* v468.1 边框对齐快讯卡同款蓝(rgba(34,158,217,.30)) */
  border-radius: var(--radius-md);
  box-shadow: 0 8px 28px rgba(0, 0, 0, .35);
  z-index: 950;
  opacity: 0;
  transform: translate(-50%, -12px);
  pointer-events: none;
  cursor: pointer;
  transition: opacity .25s ease, transform .25s ease;
}
.nt-toast.show {
  opacity: 1;
  transform: translate(-50%, 0);
  pointer-events: auto;
}
.nt-icon {
  width: 18px;
  height: 18px;
  flex: none;
  stroke: rgb(34, 158, 217); /* v468.1 快讯蓝#229ED9(TG蓝, 与聊天室快讯卡图标stroke同源) */
  fill: none;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.nt-tag {
  flex: none;
  font-size: var(--t-meta);
  font-weight: 600;
  color: rgb(34, 158, 217); /* v468.1 快讯蓝(与 .cr-bot-tag 标签色同源) */
}
.nt-text {
  flex: 1;
  min-width: 0;
  font-size: var(--t-body);
  color: var(--c-text-1);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
/* ── v468.3 圆环倒计时(主人 demo 验收定稿): SVG 圆环顺时针走完=消失, 圆心读秒 5→1(替代原 .nt-time 时间戳) ── */
.nt-ring {
  position: relative;
  flex: none;
  width: 30px;
  height: 30px;
}
.nt-ring svg {
  width: 30px;
  height: 30px;
  transform: rotate(-90deg); /* 圆环起点转到 12 点钟, 顺时针走 */
  display: block;
}
.nt-ring-bg {
  fill: none;
  stroke: rgba(34, 158, 217, .18); /* 快讯蓝同源浅底轨 */
  stroke-width: 3;
}
.nt-ring-fg {
  fill: none;
  stroke: rgb(34, 158, 217); /* 快讯蓝#229ED9, 与图标/标签同源 */
  stroke-width: 3;
  stroke-linecap: round;
  stroke-dasharray: 62.83; /* 2πr(r=10), 必须与 news-toast.js RING_C 一致 */
  stroke-dashoffset: 0;
}
.nt-ring-num {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 14px;
  font-weight: 700;
  color: rgb(34, 158, 217);
  font-variant-numeric: tabular-nums;
}
/* 悬停/按住暂停: 圆环+读秒变浅蓝提示"暂停中"(news-toast.js _setPaused 切类) */
.nt-toast.is-paused .nt-ring-fg { stroke: rgb(124, 196, 232); }
.nt-toast.is-paused .nt-ring-num { color: rgb(124, 196, 232); }
