/* ============================================================
   Home Styles — Three-Column Layout
   Chat Panel | Lesson Renderer | Dashboard
   ============================================================ */

/* === Home Container === */

.home-container {
  display: none;   /* JS 控制可见性: launchHome() → flex */
  height: 100%;
  width: 100%;
  overflow: hidden;
}

/* === Left: Chat Panel === */

.chat-panel {
  width: var(--chat-panel-width);
  min-width: 280px;
  display: flex;
  flex-direction: column;
  border-right: var(--border-subtle);
  background: var(--color-bg-surface);
}

.chat-panel-header {
  padding: var(--space-4) var(--space-5);
  border-bottom: var(--border-subtle);
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: space-between;
}

.chat-panel-title {
  font-size: var(--text-sm);
  font-weight: var(--weight-medium);
  color: var(--color-text-secondary);
}

.chat-header-actions {
  display: flex;
  gap: var(--space-2);
  align-items: center;
}

.chat-header-btn {
  padding: 4px 10px;
  background: transparent;
  border: var(--border-subtle);
  border-radius: var(--radius-sm);
  color: var(--color-text-secondary);
  cursor: pointer;
  font-family: var(--font-sans);
  font-size: var(--text-xs);
  transition: all var(--duration-fast) var(--ease-out);
}

.chat-header-btn:hover {
  border-color: var(--color-accent-soft);
  color: var(--color-accent);
}

/* 登录后：个人中心（B10 验证反馈 2026-08-17）——黄底醒目按钮 */
.chat-header-btn.btn-profile {
  background: var(--color-accent);
  border-color: var(--color-accent);
  color: #0D0D0F;
  font-weight: 600;
}

.chat-header-btn.btn-profile:hover {
  background: var(--color-accent-soft);
  border-color: var(--color-accent-soft);
  color: #0D0D0F;
}

.chat-panel-messages {
  flex: 1;
  overflow-y: auto;
  padding: var(--space-4) var(--space-4);
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
}

.chat-panel-input {
  display: flex;
  gap: var(--space-2);
  padding: var(--space-3) var(--space-4);
  border-top: var(--border-subtle);
  flex-shrink: 0;
}

.home-chat-input {
  flex: 1;
  min-height: 40px;
  max-height: 120px;
  padding: var(--space-2) var(--space-3);
  background: var(--color-bg-deep);
  border: var(--border-subtle);
  border-radius: var(--radius-sm);
  color: var(--color-text-primary);
  font-family: var(--font-sans);
  font-size: var(--text-sm);
  line-height: var(--leading-normal);
  resize: none;
  transition: border-color var(--duration-fast) var(--ease-out);
}

.home-chat-input:focus {
  outline: none;
  border-color: var(--color-accent-soft);
}

.home-chat-input::placeholder {
  color: var(--color-text-tertiary);
}

.home-chat-send {
  width: 40px;
  height: 40px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--color-accent-subtle);
  border: none;
  border-radius: var(--radius-sm);
  color: var(--color-accent);
  cursor: pointer;
  flex-shrink: 0;
  transition: background var(--duration-fast) var(--ease-out);
}

.home-chat-send:hover {
  background: var(--color-accent-glow);
}

/* === Center: Lesson Renderer === */

.lesson-panel {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: stretch;
  justify-content: flex-start;
  background: var(--color-bg-deep);
  position: relative;
  overflow: hidden;
}

.lesson-empty {
  text-align: center;
  animation: fadeIn var(--duration-slow) var(--ease-out);
}

/* lessonloop 二轮 ②（2026-09-01 实景取证）：阶段卡宿主随内容区拉满——
   .lesson-content 行向 flex 使 #lesson-empty 收缩为内容宽（B79 标签重构
   遗留），阶段卡 width:100% 无宿主可依（实测 313px，与 R0c 640 列不符）。
   恢复全宽后各子内容自带宽约束（progress 520 / r0d 640 / 空态居中），
   视觉不受影响。 */
#lesson-empty {
  width: 100%;
}

.lesson-empty-icon {
  margin-bottom: var(--space-4);
  opacity: 0.4;
}

.lesson-empty-text {
  font-size: var(--text-sm);
  color: var(--color-text-tertiary);
}

/* Loading spinner for center panel */
.lesson-spinner {
  width: 32px;
  height: 32px;
  border: 3px solid var(--color-border);
  border-top-color: var(--color-accent);
  border-radius: 50%;
  animation: spin 0.8s linear infinite;
}

@keyframes spin {
  to { transform: rotate(360deg); }
}

/* 生成进度（B8 修正 2：阶段提示 + 已等待计时；B10 验证反馈：三行结构——
   标签一行 / 思考 3 行实时内容 / 计时固定一行；B12：思考区固定 3 行高度）
   */
.lesson-gen-progress {
  margin-top: var(--space-3);
  font-size: 12px;
  color: var(--color-text-secondary, #aaa);
  /* B13 实测修复（CDP 2026-08-17）：根因 = 进度块随 #lesson-empty 拉满 800px，
     每行 ~66 字视觉过长 → 限宽 ~43 字/行 + 居中 */
  max-width: 520px;
  margin-left: auto;
  margin-right: auto;
}

/* 第一行：阶段标签 + 我正在想： */
.lesson-gen-progress .progress-label {
  font-weight: 600;
  color: var(--color-accent, #C4A265);
}

/* 中间：实时思考固定 3 行（高度恒定不跳动；单行强制换行、超出截断） */
.lesson-gen-progress .progress-think {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
  line-height: 1.5;
  height: calc(1.5em * 3); /* 内容不足 3 行也保持 3 行占位 */
  word-break: break-all;
  overflow-wrap: anywhere;
  margin-top: 2px;
}

/* 末行固定：「已等待 N 秒」——秒数跳动不推挤思考行 */
.lesson-gen-progress .progress-timer {
  margin-top: 4px;
  color: var(--color-text-muted, #888);
}

/* === 学习区标签栏（B8 修正 4：Mission 固定 + 课时标签，浏览器式） === */
#lesson-tabs {
  flex: none;
  display: flex;
  align-items: center;
  gap: var(--space-1);
  padding: var(--space-1) var(--space-2) 0;
  background: var(--color-bg-deep);
  border-bottom: var(--border-subtle);
}
.lesson-tab {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  padding: var(--space-1) var(--space-3);
  font-size: 12px;
  color: var(--color-text-secondary, #aaa);
  cursor: pointer;
  border: 1px solid transparent;
  border-bottom: none;
  border-radius: var(--radius-sm, 6px) var(--radius-sm, 6px) 0 0;
  user-select: none;
}
.lesson-tab:hover { color: var(--color-text, #eee); }
.lesson-tab--active {
  color: var(--color-text, #eee);
  background: var(--color-bg-card, #1E1E22);
  border-color: var(--color-border);
  box-shadow: inset 0 -2px 0 var(--color-accent);
}
.lesson-tab__close {
  background: none;
  border: none;
  color: var(--color-text-tertiary);
  font-size: 13px;
  line-height: 1;
  cursor: pointer;
  padding: 0 2px;
  border-radius: 3px;
}
.lesson-tab__close:hover {
  color: var(--color-accent);
  background: rgba(196, 162, 101, 0.12);
}

/* 标签内容区（iframe 常驻 + 共享 lesson-empty 占位） */
.lesson-content {
  flex: 1;
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 0;
}

.lesson-frame {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: none;
  background: var(--color-bg-deep);
}

/* === Right: Dashboard === */

.dashboard-panel {
  width: var(--dashboard-width);
  min-width: 240px;
  display: flex;
  flex-direction: column;
  border-left: var(--border-subtle);
  background: var(--color-bg-surface);
  overflow: hidden; /* B79：滚动交给 .dashboard-scroll，面板自身不滚 */
}

/* B79（2026-08-26）：结构改造——复用左栏 .chat-panel 结构（头部普通流 +
   独立滚动区）。B57/B75 两版 sticky 补丁（负 margin + 描边）都没能兜住
   滚动缝隙，彻底弃用 sticky：头部永远不动，只有下方 .dashboard-scroll 滚动。 */
.dashboard-panel-header {
  display: flex;
  justify-content: flex-end;
  gap: var(--space-2);
  align-items: center;
  flex-shrink: 0;
  padding: var(--space-3) var(--space-4);
  border-bottom: var(--border-subtle);
  background: var(--color-bg-surface);
}

/* B79：右侧面板唯一滚动区（同 .chat-panel-messages 的定位）。 */
.dashboard-scroll {
  flex: 1;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  gap: var(--space-5);
  padding: var(--space-4);
}

.dashboard-section {
  padding: var(--space-3);
  background: var(--color-bg-deep);
  border-radius: var(--radius-md);
  border: var(--border-subtle);
}

.dashboard-heading {
  font-size: var(--text-xs);
  font-weight: var(--weight-medium);
  color: var(--color-text-tertiary);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  margin-bottom: var(--space-3);
}

.dashboard-stat {
  margin-bottom: var(--space-3);
}

.dashboard-stat:last-child {
  margin-bottom: 0;
}

.dashboard-stat-label {
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
  margin-bottom: 2px;
}

.dashboard-stat-value {
  font-size: var(--text-sm);
  color: var(--color-text-primary);
  line-height: var(--leading-normal);
}

/* Dashboard 5-dimension keywords — concise, bold */
.dashboard-stat-value--keyword {
  font-weight: var(--font-medium);
  font-size: var(--text-base);
  letter-spacing: -0.01em;
}

.dashboard-empty-text {
  font-size: var(--text-xs);
  color: var(--color-text-disabled);
  font-style: italic;
}

/* Tags (for teachable moments in dashboard) */
.tag {
  display: inline-block;
  padding: 2px 8px;
  margin: 2px 4px 2px 0;
  background: var(--color-accent-subtle);
  color: var(--color-accent);
  border-radius: var(--radius-full);
  font-size: var(--text-xs);
  white-space: nowrap;
}

/* B36 迭代（2026-08-20 用户反馈）：学习内容条目卡片化——
   内部分组（学习路线 / 学习记录 / 术语掌握）+ 题目/简介整卡可点 */
.lc-group { margin-bottom: 10px; }
.lc-group__title {
  font-size: 11px;
  font-weight: 600;
  color: var(--color-text-muted, #888);
  margin: 2px 0 6px;
}
.lc-card {
  background: var(--color-bg-card, #1E1E22);
  border: var(--border-subtle);
  border-radius: 8px;
  padding: 8px 10px;
  margin-bottom: 6px;
}
.lc-card[role="button"] { cursor: pointer; }
.lc-card[role="button"]:hover { border-color: var(--color-accent); }
.lc-card__title {
  font-size: 13px;
  font-weight: 600;
  line-height: var(--leading-normal);
}
.lc-card__desc {
  margin-top: 3px;
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
  line-height: var(--leading-normal);
}
/* 术语卡：无跳转目标——更轻样式，区别于可点卡片 */
.lc-card--term { background: transparent; }
/* 节点 11（2026-08-24）：未登录术语卡置灰不可点（无 role，hover 不高亮；title 提示登录） */
.lc-card--locked { opacity: 0.5; cursor: not-allowed; }
/* 新记录出现时复用 dashboard dash-pulse 光晕闪烁（第一课标记完成瞬间） */
.lc-card--pulse {
  animation: dash-pulse 0.9s var(--ease-in-out) 3;
}

/* 标记本阶段完成按钮已移出 Dashboard——按 2026-08-17 裁决移至
   第一课最后（J4 成果页 + 弹窗确认 → 完成后进入下一课时）。 */

/* === Home Quick Replies === */

#home-quick-replies {
  padding: var(--space-2) var(--space-4);
  justify-content: flex-start;
  border-top: var(--border-subtle);
}

/* B60（2026-08-24）：真因修复——.quick-replies 的 display:flex 会压过 UA 的
   [hidden]（display:none），home.js 全程用 hidden 属性控制 chips 显隐 → 从未生效，
   chips 一直可见（纯聊/＋ 历史列表下方同此因）。显式补回（hub-panel 先例 B34③） */
#home-quick-replies[hidden] {
  display: none;
}

/* === Chat Action Button (inline gold CTA in message bubble) === */

.chat-action-btn {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  margin-top: 10px;
  padding: 8px 20px;
  font-size: var(--text-sm);
  font-weight: var(--weight-medium);
  font-family: var(--font-sans);
  color: var(--color-bg-deep);
  background: var(--color-accent);
  border: none;
  border-radius: var(--radius-md);
  cursor: pointer;
  transition: background 0.2s var(--ease-out),
              transform 0.2s var(--ease-out),
              opacity 0.2s var(--ease-out);
  white-space: nowrap;
}

.chat-action-btn:hover:not(:disabled) {
  background: var(--color-accent-soft);
  transform: translateY(-1px);
}

.chat-action-btn:disabled {
  opacity: 0.5;
  cursor: not-allowed;
  transform: none;
}

/* === Chat Hint — gold-accent reassurance bubble === */

.chat-hint {
  background: var(--color-accent-subtle);
  border-left: 3px solid var(--color-accent);
  border-radius: 0 var(--radius-md) var(--radius-md) 0;
  padding: 14px 18px;
  font-size: var(--text-sm);
  line-height: var(--leading-relaxed);
  color: var(--color-text-secondary);
  animation: fadeIn var(--duration-normal) var(--ease-out) forwards;
}

.chat-hint strong {
  color: var(--color-accent);
  font-weight: var(--weight-medium);
}

/* === Dashboard Pulse (Item 5: "去逛逛" highlight) === */

@keyframes dash-pulse {
  0%, 100% { box-shadow: 0 0 0 0 rgba(196, 162, 101, 0); }
  50% { box-shadow: 0 0 0 4px var(--color-accent-glow); border-color: var(--color-accent); }
}

.dashboard-section--pulse {
  animation: dash-pulse 0.9s var(--ease-in-out) 3;
}

/* === Dashboard Info Tooltips === */

.dashboard-heading-row {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
}

.dash-info {
  cursor: help;
  color: var(--color-text-tertiary);
  font-size: var(--text-sm);
  font-weight: var(--weight-normal);
  position: relative;
}

.dash-info:hover::after {
  content: attr(data-tip);
  position: absolute;
  left: 0;
  top: calc(100% + 6px);
  z-index: 30;
  width: 190px;
  background: var(--color-bg-overlay);
  color: var(--color-text-primary);
  font-size: var(--text-xs);
  line-height: var(--leading-relaxed);
  padding: var(--space-2) var(--space-3);
  border-radius: var(--radius-sm);
  border: var(--border-subtle);
  box-shadow: var(--shadow-md);
}


/* === Responsive: Stack panels on mobile === */

@media (max-width: 900px) {
  .home-container {
    flex-direction: column;
  }

  .chat-panel {
    width: 100%;
    min-width: auto;
    max-height: 40vh;
  }

  .lesson-panel {
    min-height: 40vh;
  }

  .dashboard-panel {
    width: 100%;
    min-width: auto;
    max-height: 30vh;
    flex-shrink: 0;
    border-left: none;
    border-top: var(--border-subtle);
  }

}

@media (max-width: 640px) {
  .chat-header-actions {
    gap: var(--space-1);
  }

  .chat-header-btn {
    padding: 3px 8px;
    font-size: 11px;
  }

  #home-quick-replies {
    padding: var(--space-2);
  }

  .quick-reply-chip {
    padding: 4px 10px;
    font-size: 12px;
  }

  .modal {
    padding: var(--space-5);
  }
}

/* === Debug panel mount（Welcome 同款；B8 修正 2） === */
#home-bottom-right {
  position: fixed;
  bottom: var(--space-6);
  right: var(--space-6);
  z-index: 60;
  display: flex;
  align-items: center;
  gap: var(--space-2);
}
#home-bottom-right #btn-debug-panel { position: static; }
/* .btn-icon 基础样式（api-settings 注入的同款；home 无 ApiSettings 实例） */
.btn-icon {
  background: none;
  border: none;
  color: var(--color-text-secondary, #aaa);
  cursor: pointer;
  font-size: var(--text-base, 14px);
  padding: var(--space-1, 4px);
}
.btn-icon:hover { color: var(--color-text, #eee); }

@media (max-width: 640px) {
  #home-bottom-right {
    bottom: var(--space-4);
    right: var(--space-4);
  }
}

/* === Hub 主菜单（节点 8b-1 2026-08-20） ===
   中+右区域变个人中心；右滑入动效；左栏对话保留。
   打开时 home.js 隐藏 .lesson-panel + .dashboard-panel。 */

.hub-panel {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  background: var(--color-bg-deep);
  overflow: hidden;
  animation: hub-slide-in var(--duration-normal) var(--ease-out);
}

/* display:flex 会压过 UA 的 [hidden]——显式补回（home.js 用 hidden 属性控制显隐） */
.hub-panel[hidden] { display: none; }

/* 节点 14（2026-08-24）：hub 内瞬时操作通知（删除成功等）——
   fixed 右上浮层，~4.5s 自动消失；[hidden] 显式补回（防 display 压过，B60 同款陷阱） */
.hub-notice {
  position: fixed;
  top: 20px;
  right: 24px;
  max-width: 420px;
  background: var(--color-bg-overlay);
  border: var(--border-normal);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-lg);
  padding: var(--space-3) var(--space-5);
  font-size: var(--text-sm);
  color: var(--color-text-primary);
  z-index: 95;
  animation: hub-slide-in var(--duration-fast) var(--ease-out);
}
.hub-notice[hidden] { display: none; }

@keyframes hub-slide-in {
  from { transform: translateX(32px); opacity: 0; }
  to   { transform: translateX(0); opacity: 1; }
}

.hub-header {
  flex-shrink: 0;
  border-bottom: var(--border-subtle);
  background: var(--color-bg-surface);
  padding: var(--space-3) var(--space-4);
}

.hub-header__row {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  flex-wrap: wrap;
}

.hub-back {
  background: transparent;
  border: var(--border-subtle);
  border-radius: var(--radius-sm);
  color: var(--color-text-secondary);
  cursor: pointer;
  font-family: var(--font-sans);
  font-size: var(--text-xs);
  padding: 4px 10px;
  transition: all var(--duration-fast) var(--ease-out);
}
.hub-back:hover { border-color: var(--color-accent-soft); color: var(--color-accent); }

.hub-title {
  font-size: var(--text-md);
  font-weight: var(--weight-medium);
  color: var(--color-text-primary);
}

.hub-nav {
  display: flex;
  gap: var(--space-2);
  margin-left: auto;
  align-items: center;
}

.hub-nav__item {
  background: transparent;
  border: none;
  border-radius: var(--radius-sm);
  color: var(--color-text-secondary);
  cursor: pointer;
  font-family: var(--font-sans);
  font-size: var(--text-sm);
  padding: 6px 12px;
  transition: all var(--duration-fast) var(--ease-out);
}
.hub-nav__item:hover { color: var(--color-text-primary); background: var(--color-bg-elevated); }
.hub-nav__item--active {
  color: var(--color-accent);
  background: var(--color-accent-subtle);
  font-weight: var(--weight-medium);
}
.hub-nav__item--create {
  font-size: var(--text-lg);
  padding: 2px 12px;
  line-height: 1.4;
}

.hub-view {
  flex: 1;
  overflow-y: auto;
  padding: var(--space-5) var(--space-6);
}

/* --- 统计条 --- */

.hub-stats {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: var(--space-3);
  margin-bottom: var(--space-6);
}

.hub-stat {
  background: var(--color-bg-surface);
  border: var(--border-subtle);
  border-radius: var(--radius-md);
  padding: var(--space-3) var(--space-4);
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
}

.hub-stat--placeholder {
  opacity: 0.65;
  border-style: dashed;
}

.hub-stat__label {
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
}

.hub-stat__value {
  font-size: var(--text-lg);
  font-weight: var(--weight-medium);
  color: var(--color-text-primary);
}

/* --- 路线节点图 --- */

.hub-section { margin-bottom: var(--space-6); }

.hub-section__title {
  font-size: var(--text-md);
  font-weight: var(--weight-medium);
  color: var(--color-text-primary);
  margin: 0;
}

.hub-roadmap {
  background: var(--color-bg-surface);
  border: var(--border-subtle);
  border-radius: var(--radius-md);
  padding: var(--space-4);
  margin-bottom: var(--space-5);
}

.hub-roadmap__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
  margin-bottom: var(--space-2);
}

.hub-roadmap__progress {
  font-size: var(--text-xs);
  color: var(--color-accent);
  background: var(--color-accent-subtle);
  border-radius: var(--radius-full);
  padding: 2px 10px;
  flex-shrink: 0;
}

.hub-roadmap__hint {
  margin: 0;
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
  line-height: var(--leading-relaxed);
}

.hub-tree {
  display: flex;
  flex-direction: column;
}

.hub-node {
  display: flex;
  gap: var(--space-3);
}

.hub-node--locked { opacity: 0.55; }

.hub-node__rail {
  width: 18px;
  flex-shrink: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
}

.hub-node__dot {
  width: 12px;
  height: 12px;
  border-radius: var(--radius-full);
  background: var(--color-border);
  margin-top: 4px;
  flex-shrink: 0;
}

.hub-node--done .hub-node__dot { background: var(--color-success); }
.hub-node--current .hub-node__dot {
  background: var(--color-accent);
  animation: hub-pulse 2s var(--ease-in-out) infinite;
}
.hub-node--next .hub-node__dot {
  background: transparent;
  border: 2px solid var(--color-accent-soft);
}

@keyframes hub-pulse {
  0%, 100% { box-shadow: 0 0 0 0 var(--color-accent-glow); }
  50%      { box-shadow: 0 0 0 6px transparent; }
}

.hub-node__line {
  flex: 1;
  width: 2px;
  background: var(--color-border);
  margin: 4px 0;
}

.hub-node__body {
  flex: 1;
  min-width: 0;
  padding-bottom: var(--space-5);
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}

.hub-node__head {
  display: flex;
  align-items: baseline;
  gap: var(--space-2);
  flex-wrap: wrap;
}

.hub-node__title {
  font-size: var(--text-md);
  font-weight: var(--weight-medium);
  color: var(--color-text-primary);
}

.hub-node__status {
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
}

.hub-node--done .hub-node__status { color: var(--color-success); }
.hub-node--current .hub-node__status { color: var(--color-accent); }

.hub-node__weeks {
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
  margin-left: auto;
}

.hub-node__desc {
  margin: 0;
  font-size: var(--text-sm);
  color: var(--color-text-secondary);
  line-height: var(--leading-relaxed);
}

/* lessonloop ⑪（2026-08-31）：节点参考资料行——已走阶段 = 实际引用，
   未走阶段 = 资料池；chips 与课程内引用同款（.ref-src） */
.hub-node__refs {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  flex-wrap: wrap;
  margin-top: var(--space-1);
}
.hub-node__refs-label {
  flex-shrink: 0;
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
}

.hub-node__blank {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  border: 1px dashed var(--color-border);
  border-radius: var(--radius-md);
  background: transparent;
  color: var(--color-text-tertiary);
  cursor: pointer;
  font-family: var(--font-sans);
  font-size: var(--text-sm);
  padding: var(--space-3) var(--space-4);
  text-align: left;
  transition: all var(--duration-fast) var(--ease-out);
}
.hub-node__blank:hover {
  border-color: var(--color-accent-soft);
  color: var(--color-text-secondary);
}

.hub-node__plus {
  font-size: var(--text-xl);
  color: var(--color-accent-soft);
  line-height: 1;
}

.hub-node__blank-text { line-height: var(--leading-relaxed); }

/* 查看路线图落地：空白「＋ 下一课」节点闪烁引导（2026-08-21 用户反馈） */
.hub-node__blank--pulse {
  animation: dash-pulse 0.9s var(--ease-in-out) 3;
  border-color: var(--color-accent);
}

/* --- 课程卡（收藏/置顶） --- */

.hub-course {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  background: var(--color-bg-surface);
  border: var(--border-subtle);
  border-radius: var(--radius-md);
  padding: var(--space-2) var(--space-3);
  cursor: pointer;
  transition: all var(--duration-fast) var(--ease-out);
}
.hub-course:hover { border-color: var(--color-accent-soft); }

.hub-course--live { border-color: var(--color-accent-soft); }

.hub-course__tag {
  font-size: var(--text-xs);
  color: var(--color-accent);
  background: var(--color-accent-subtle);
  border-radius: var(--radius-full);
  padding: 2px 8px;
  flex-shrink: 0;
}

.hub-course__title {
  flex: 1;
  min-width: 0;
  font-size: var(--text-sm);
  color: var(--color-text-primary);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.hub-course__meta {
  display: flex;
  gap: var(--space-1);
  flex-shrink: 0;
}

.hub-course__btn {
  background: transparent;
  border: none;
  border-radius: var(--radius-sm);
  color: var(--color-text-tertiary);
  cursor: pointer;
  font-size: var(--text-md);
  line-height: 1;
  padding: 2px 6px;
  transition: color var(--duration-fast) var(--ease-out);
}
.hub-course__btn:hover { color: var(--color-text-secondary); }
.hub-course__btn--on { color: var(--color-accent); }

/* --- 多 mission 分组（DB v7，8b-2a） --- */

.hub-groups {
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
}

.hub-group {
  background: var(--color-bg-surface);
  border: var(--border-subtle);
  border-radius: var(--radius-md);
}

.hub-group--active {
  border-color: var(--color-accent-soft);
  box-shadow: 0 0 0 1px var(--color-accent-soft);
}

.hub-group__head {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-3) var(--space-4);
  cursor: pointer;
  user-select: none;
  list-style: none; /* Firefox */
}
.hub-group__head::-webkit-details-marker { display: none; }

.hub-group__caret {
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
  transition: transform var(--duration-fast) var(--ease-out);
}
.hub-group[open] > .hub-group__head .hub-group__caret { transform: rotate(90deg); }

.hub-group__title {
  font-size: var(--text-md);
  font-weight: var(--weight-medium);
  color: var(--color-text-primary);
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.hub-group__meta {
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
  flex-shrink: 0;
}

.hub-group__activate {
  margin-left: auto;
  flex-shrink: 0;
  background: transparent;
  border: var(--border-subtle);
  border-radius: var(--radius-full);
  color: var(--color-accent);
  cursor: pointer;
  font-family: var(--font-sans);
  font-size: var(--text-xs);
  padding: 3px 10px;
  transition: all var(--duration-fast) var(--ease-out);
}
.hub-group__activate:hover {
  background: var(--color-accent-subtle);
  border-color: var(--color-accent-soft);
}

/* 节点 14（2026-08-24）：删除路线按钮（仅非现役组有；现役组不渲染）——
   低调红字，悬停变实红，确认后再删（二次确认弹窗） */
.hub-group__delete {
  flex-shrink: 0;
  background: transparent;
  border: var(--border-subtle);
  border-radius: var(--radius-full);
  color: var(--color-text-tertiary);
  cursor: pointer;
  font-family: var(--font-sans);
  font-size: var(--text-xs);
  padding: 3px 10px;
  transition: all var(--duration-fast) var(--ease-out);
}
.hub-group__delete:hover {
  border-color: var(--color-error);
  color: var(--color-error);
}

.hub-group__body {
  padding: 0 var(--space-4) var(--space-4);
}

.hub-group__new {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  width: 100%;
  background: transparent;
  border: 1px dashed var(--color-border);
  border-radius: var(--radius-md);
  color: var(--color-text-tertiary);
  cursor: pointer;
  font-family: var(--font-sans);
  font-size: var(--text-sm);
  padding: var(--space-3) var(--space-4);
  text-align: left;
  transition: all var(--duration-fast) var(--ease-out);
}
.hub-group__new:hover {
  border-color: var(--color-accent-soft);
  color: var(--color-text-secondary);
}

.hub-group__new-plus {
  font-size: var(--text-xl);
  color: var(--color-accent-soft);
  line-height: 1;
}

/* --- 术语卡详情视图（B40，2026-08-22；B41 并入「我的」+ 原地展开） --- */

.hub-terms-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-2);
}

.hub-terms-back {
  flex-shrink: 0;
  background: var(--color-bg-elevated);
  color: var(--color-text-secondary);
  border: var(--border-subtle);
  border-radius: var(--radius-sm);
  padding: 4px 10px;
  font-size: var(--text-xs);
  cursor: pointer;
  transition: color var(--transition-fast), border-color var(--transition-fast);
}

.hub-terms-back:hover {
  color: var(--color-accent);
  border-color: var(--color-accent);
}

.hub-terms-groups {
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
}

.hub-terms-group__head {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  margin-bottom: var(--space-2);
}

.hub-terms-group__title {
  font-size: var(--text-md);
  font-weight: var(--weight-medium);
  color: var(--color-text-primary);
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.hub-terms-group__count {
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
  flex-shrink: 0;
}

.hub-terms {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}

.hub-term {
  background: var(--color-bg-surface);
  border: var(--border-subtle);
  border-radius: var(--radius-md);
  padding: var(--space-3) var(--space-4);
  cursor: pointer; /* B41：可点展开/收起详情 */
  transition: border-color var(--transition-fast);
}

.hub-term:hover {
  border-color: var(--color-accent);
}

.hub-term__head {
  display: flex;
  align-items: center;
  gap: var(--space-2);
}

.hub-term__caret {
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
  flex-shrink: 0;
  transition: transform var(--transition-fast);
}

.hub-term--open .hub-term__caret {
  transform: rotate(90deg);
}

.hub-term__term {
  font-size: var(--text-md);
  font-weight: var(--weight-medium);
  color: var(--color-accent);
}

.hub-term__source {
  font-size: 10px;
  color: var(--color-text-secondary);
  background: var(--color-bg-elevated);
  border-radius: 3px;
  padding: 1px 6px;
}

/* B41：详情默认收起——展开显示完整解释 + 来源 + 来源路线 + 记录时间 */
.hub-term__detail {
  display: none;
  margin-top: var(--space-2);
  padding-top: var(--space-2);
  border-top: var(--border-subtle);
}

.hub-term--open .hub-term__detail {
  display: block;
}

.hub-term__insight {
  font-size: var(--text-sm);
  color: var(--color-text-secondary);
  line-height: var(--leading-relaxed);
  margin: 0 0 var(--space-2);
}

.hub-term__meta {
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.hub-term__meta-row {
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
  line-height: var(--leading-relaxed);
}

/* --- 术语卡总卡 + 每路线最近术语（B41，2026-08-22） --- */

.hub-terms-overview__card {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  width: 100%;
  text-align: left;
  background: var(--color-bg-surface);
  border: var(--border-subtle);
  border-radius: var(--radius-md);
  padding: var(--space-3) var(--space-4);
  cursor: pointer;
  transition: border-color var(--transition-fast);
}

.hub-terms-overview__card:hover {
  border-color: var(--color-accent);
}

.hub-terms-overview__icon {
  font-size: var(--text-lg);
}

.hub-terms-overview__text {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}

.hub-terms-overview__title {
  font-size: var(--text-md);
  font-weight: var(--weight-medium);
  color: var(--color-text-primary);
}

.hub-terms-overview__count {
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
}

.hub-terms-overview__more {
  margin-left: auto;
  flex-shrink: 0;
  font-size: var(--text-sm);
  color: var(--color-accent);
}

.hub-group__terms {
  margin-top: var(--space-3);
  padding-top: var(--space-3);
  border-top: var(--border-subtle);
}

.hub-group__terms-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-2);
  margin-bottom: var(--space-2);
}

.hub-group__terms-title {
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
}

.hub-group__terms-more {
  background: none;
  border: none;
  padding: 0;
  font-size: var(--text-xs);
  color: var(--color-accent);
  cursor: pointer;
}

.hub-group__terms-more:hover {
  text-decoration: underline;
}

.hub-group__terms-cards {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2);
}

.hub-term-mini {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  background: var(--color-bg-elevated);
  border-radius: var(--radius-sm);
  padding: 3px 8px;
  max-width: 100%;
}

.hub-term-mini__term {
  font-size: var(--text-xs);
  font-weight: var(--weight-medium);
  color: var(--color-accent);
  white-space: nowrap;
}

.hub-term-mini__source {
  font-size: 10px;
  color: var(--color-text-tertiary);
  white-space: nowrap;
}

/* --- 空态 / 占位视图 --- */

.hub-empty {
  margin: var(--space-3) 0 0;
  font-size: var(--text-sm);
  color: var(--color-text-tertiary);
  line-height: var(--leading-relaxed);
}

.hub-placeholder {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-3);
  text-align: center;
  background: var(--color-bg-surface);
  border: var(--border-subtle);
  border-radius: var(--radius-lg);
  padding: var(--space-12) var(--space-8);
  max-width: 520px;
  margin: var(--space-8) auto 0;
}

.hub-placeholder__icon {
  font-size: 40px;
  line-height: 1;
}

.hub-placeholder__title {
  margin: 0;
  font-size: var(--text-xl);
  font-weight: var(--weight-medium);
  color: var(--color-text-primary);
}

.hub-placeholder__body {
  margin: 0;
  font-size: var(--text-sm);
  color: var(--color-text-secondary);
  line-height: var(--leading-relaxed);
  max-width: 400px;
}

.hub-placeholder__badge {
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
  border: var(--border-subtle);
  border-radius: var(--radius-full);
  padding: 3px 12px;
}

.hub-placeholder__note {
  margin: 0;
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
}

/* --- 响应式：统计条收窄 --- */

@media (max-width: 900px) {
  .hub-panel {
    width: 100%;
    max-height: 50vh;
    flex-shrink: 0;
  }
  .hub-stats { grid-template-columns: repeat(3, 1fr); }
  .hub-view { padding: var(--space-4); }
}

@media (max-width: 640px) {
  .hub-stats { grid-template-columns: repeat(2, 1fr); }
}

/* === 设置视图（节点 8b-2c，2026-08-22）——§14.6-8 八项 === */

.hub-settings {
  display: flex;
  flex-direction: column;
  gap: var(--space-3, 12px);
}

.hub-settings__section {
  background: var(--color-bg-secondary, #1a1a2e);
  border: var(--border-subtle);
  border-radius: var(--radius-lg, 12px);
  padding: var(--space-4, 16px);
}

.hub-settings__head {
  margin: 0 0 var(--space-2, 8px);
  font-size: var(--text-base, 14px);
  color: var(--color-text, #eee);
}

.hub-settings__row {
  display: flex;
  align-items: center;
  gap: var(--space-3, 12px);
  margin-bottom: var(--space-2, 8px);
}

.hub-settings__label {
  flex-shrink: 0;
  min-width: 88px;
  font-size: var(--text-sm, 12px);
  color: var(--color-text-secondary, #aaa);
}

.hub-settings__value {
  font-size: var(--text-sm, 12px);
  color: var(--color-text, #eee);
}

.hub-settings__styles {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2, 8px);
}

.hub-settings-style {
  padding: 6px 14px;
  font-size: var(--text-sm, 12px);
  color: var(--color-text, #eee);
  background: var(--color-bg-tertiary, #111);
  border: 1px solid var(--color-border, #333);
  border-radius: var(--radius-full, 999px);
  cursor: pointer;
}

.hub-settings-style:hover { border-color: var(--color-accent, #4ade80); }

.hub-settings-style--active {
  background: var(--color-accent, #4ade80);
  border-color: var(--color-accent, #4ade80);
  color: #000;
  font-weight: 600;
}

.hub-settings__actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2, 8px);
  margin-top: var(--space-2, 8px);
}

.hub-settings__btn {
  padding: 6px 14px;
  font-size: var(--text-sm, 12px);
  color: var(--color-text, #eee);
  background: var(--color-bg-tertiary, #222);
  border: 1px solid var(--color-border, #333);
  border-radius: var(--radius-sm, 6px);
  cursor: pointer;
}

.hub-settings__btn:hover { background: var(--color-bg, #333); }

.hub-settings__btn--primary {
  background: var(--color-accent, #4ade80);
  border-color: var(--color-accent, #4ade80);
  color: #000;
}

.hub-settings__btn--danger {
  border-color: var(--color-danger, #f87171);
  color: var(--color-danger, #f87171);
}

.hub-settings__select,
.hub-settings__input {
  flex: 1;
  padding: 6px 10px;
  font-size: var(--text-sm, 12px);
  color: var(--color-text, #eee);
  background: var(--color-bg, #0d0d1a);
  border: 1px solid var(--color-border, #333);
  border-radius: var(--radius-sm, 6px);
}

.hub-settings__input { font-family: monospace; }

.hub-settings__select:focus,
.hub-settings__input:focus {
  outline: none;
  border-color: var(--color-accent, #4ade80);
}

.hub-settings__hint {
  margin: var(--space-2, 8px) 0 0;
  font-size: var(--text-xs, 11px);
  color: var(--color-text-tertiary, #888);
}

.hub-settings-notice {
  margin: 0;
  padding: var(--space-2, 8px) var(--space-3, 12px);
  font-size: var(--text-sm, 12px);
  color: var(--color-text, #eee);
  background: var(--color-bg-secondary, #1a1a2e);
  border: 1px solid var(--color-accent, #4ade80);
  border-radius: var(--radius-sm, 6px);
}

/* === R0a（2026-08-24）：设置「知识库」管理区（§14.18 拍板；
   B65（2026-08-25）改版：工具栏一行 / 共用行 / 分页 / ⓘ 角标 / 弹窗族） === */

.hub-settings-kb__toolbar {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--space-2, 8px);
  margin-top: var(--space-3, 12px);
}

.hub-settings-kb__input,
.hub-settings-kb__select {
  padding: 6px 10px;
  font-size: var(--text-sm, 12px);
  color: var(--color-text, #eee);
  background: var(--color-bg, #0d0d1a);
  border: 1px solid var(--color-border, #333);
  border-radius: var(--radius-sm, 6px);
}

.hub-settings-kb__input:focus,
.hub-settings-kb__select:focus {
  outline: none;
  border-color: var(--color-accent, #4ade80);
}

.hub-settings-kb__input--grow { flex: 1; font-family: inherit; }

.hub-settings-kb__meta-line {
  margin: var(--space-2, 8px) 0 0;
  font-size: var(--text-xs, 11px);
  color: var(--color-text-tertiary, #888);
}

.hub-settings-kb__docs {
  display: flex;
  flex-direction: column;
  gap: var(--space-2, 8px);
  margin-top: var(--space-3, 12px);
}

.hub-settings-kb__doc {
  padding: var(--space-2, 8px) var(--space-3, 12px);
  background: var(--color-bg, #0d0d1a);
  border: 1px solid var(--color-border, #333);
  border-radius: var(--radius-sm, 6px);
}

.hub-settings-kb__doc-head {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--space-2, 8px);
}

.hub-settings-kb__doc-title {
  font-size: var(--text-sm, 12px);
  font-weight: 600;
  color: var(--color-text, #eee);
}

.hub-settings-kb__badge {
  padding: 1px 8px;
  font-size: var(--text-xs, 11px);
  color: var(--color-accent, #4ade80);
  background: transparent;
  border: 1px solid var(--color-accent, #4ade80);
  border-radius: var(--radius-full, 999px);
}

.hub-settings-kb__badge--mission {
  color: var(--color-info, #60a5fa);
  border-color: var(--color-info, #60a5fa);
}

.hub-settings-kb__badge--src {
  color: var(--color-text-secondary, #aaa);
  border-color: var(--color-border, #333);
}

.hub-settings-kb__meta {
  font-size: var(--text-xs, 11px);
  color: var(--color-text-tertiary, #888);
}

/* B65：可点击元信息（Wiki / 字数 / 块数）——链接化的按钮样式 */
.hub-settings-kb__meta-link {
  padding: 0;
  font-size: var(--text-xs, 11px);
  color: var(--color-info, #60a5fa);
  background: none;
  border: none;
  border-bottom: 1px dashed currentColor;
  cursor: pointer;
}

.hub-settings-kb__meta-link:hover { color: var(--color-text, #eee); }

.hub-settings-kb__actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2, 8px);
  margin-top: var(--space-2, 8px);
}

.hub-settings-kb__confirm {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--space-2, 8px);
  margin-top: var(--space-2, 8px);
  padding: var(--space-2, 8px) var(--space-3, 12px);
  background: var(--color-bg, #0d0d1a);
  border: 1px dashed var(--color-accent, #4ade80);
  border-radius: var(--radius-sm, 6px);
  font-size: var(--text-sm, 12px);
  color: var(--color-text-secondary, #aaa);
}

.hub-settings-kb__confirm .hub-settings-kb__input,
.hub-settings-kb__confirm .hub-settings-kb__select { flex: 1; min-width: 140px; }

.hub-settings-kb__confirm .hub-settings-kb__input { flex: 2; }

.hub-settings-kb__result-snippet {
  margin-top: var(--space-1, 4px);
  font-size: var(--text-xs, 11px);
  line-height: 1.5;
  color: var(--color-text-secondary, #aaa);
}

.hub-settings-kb__empty {
  margin: var(--space-2, 8px) 0 0;
  font-size: var(--text-xs, 11px);
  color: var(--color-text-tertiary, #888);
}

/* B65：分页行（每 5 条一页；边界按钮 disabled） */
.hub-settings-kb__pager {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-3, 12px);
  margin-top: var(--space-3, 12px);
}

.hub-settings__btn:disabled {
  opacity: 0.4;
  cursor: not-allowed;
}

/* B65：知识库 ⓘ 角标——悬停/聚焦显示原理说明（如实：向量化索引计划中） */
.hub-kb-info {
  position: relative;
  display: inline-block;
  margin-left: var(--space-2, 8px);
  font-size: var(--text-sm, 12px);
  color: var(--color-text-tertiary, #888);
  cursor: help;
}

.hub-kb-info__tip {
  position: absolute;
  top: 140%;
  left: 0;
  z-index: 10;
  width: 300px;
  padding: var(--space-3, 12px);
  font-size: var(--text-xs, 11px);
  line-height: 1.6;
  color: var(--color-text, #eee);
  background: var(--color-bg-secondary, #1a1a2e);
  border: 1px solid var(--color-border, #333);
  border-radius: var(--radius-sm, 6px);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity 0.15s ease;
}

.hub-kb-info:hover .hub-kb-info__tip,
.hub-kb-info:focus .hub-kb-info__tip {
  opacity: 1;
  visibility: visible;
}

/* 查看原文只读浮层 */
.kb-doc-overlay {
  position: fixed;
  inset: 0;
  z-index: 2000;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, 0.6);
}

/* B63（2026-08-25）：display:flex 压过 UA [hidden]（B60③ 同一陷阱）——
   显隐走 hidden 属性，必须显式声明 hidden 态 display:none，否则
   「关闭」/「在知识库中管理」置 hidden 后浮层仍显示 */
.kb-doc-overlay[hidden] { display: none; }

.kb-doc-overlay__card {
  display: flex;
  flex-direction: column;
  width: min(720px, 86vw);
  max-height: 80vh;
  padding: var(--space-4, 16px);
  background: var(--color-bg-secondary, #1a1a2e);
  border: var(--border-subtle);
  border-radius: var(--radius-lg, 12px);
}

.kb-doc-overlay__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3, 12px);
  margin-bottom: var(--space-2, 8px);
}

.kb-doc-overlay__title {
  font-size: var(--text-base, 14px);
  font-weight: 600;
  color: var(--color-text, #eee);
}

.kb-doc-overlay__body {
  flex: 1;
  margin: 0;
  padding: var(--space-3, 12px);
  overflow: auto;
  font-family: monospace;
  font-size: var(--text-sm, 12px);
  line-height: 1.6;
  white-space: pre-wrap;
  word-break: break-word;
  color: var(--color-text, #eee);
  background: var(--color-bg, #0d0d1a);
  border: 1px solid var(--color-border, #333);
  border-radius: var(--radius-sm, 6px);
}

/* B94（2026-08-26，§14.36）：home DOM 内知识库引用来源行/芯片——
   课程对话气泡 / 教学卡 / 右栏术语卡 / hub 术语详情（与课程 iframe
   内 .ref-src 同款视觉；点击由 home 委托 → 只读浮层） */
.ref-src-row {
  font-size: 12px;
  color: var(--color-text-secondary, #9B9994);
  margin-top: 6px;
}
.ref-src {
  background: var(--color-accent-subtle, rgba(196, 162, 101, 0.12));
  border: 1px solid rgba(196, 162, 101, 0.35);
  color: var(--color-accent, #C4A265);
  border-radius: 6px;
  padding: 1px 8px;
  cursor: pointer;
  font-size: 12px;
  font-family: inherit;
  margin-left: 6px;
}
.ref-src:first-child { margin-left: 0; }
.ref-src:hover { background: rgba(196, 162, 101, 0.18); }

/* B98（2026-08-27，§14.37）：联网搜索来源行（方案 Y——app 持有真实检索来源；
   蓝色系与金色知识库引用 chips 区分；点击新开外链） */
.web-src {
  display: inline-block;
  background: rgba(96, 141, 204, 0.12);
  border: 1px solid rgba(96, 141, 204, 0.35);
  color: #7FA6D8;
  border-radius: 6px;
  padding: 1px 8px;
  cursor: pointer;
  font-size: 12px;
  text-decoration: none;
  margin-left: 6px;
}
.web-src:first-child { margin-left: 0; }
.web-src:hover { background: rgba(96, 141, 204, 0.18); }
.web-src__domain {
  color: var(--color-text-secondary, #9B9994);
  font-size: 11px;
  margin-left: 4px;
}

/* B65（2026-08-25）：知识库弹窗族——Wiki 编辑 / 分块详情 / 编辑原文
   （与只读原文浮层共用 .kb-doc-overlay 壳；[hidden] 规则同款） */
.kb-doc-overlay--modal .kb-doc-overlay__card { width: min(760px, 90vw); }

.kb-doc-overlay--modal .kb-doc-overlay__body {
  padding: 0;
  font-family: inherit;
  white-space: normal;
  background: transparent;
  border: none;
}

.kb-doc-overlay__textarea {
  width: 100%;
  min-height: 180px;
  padding: var(--space-2, 8px);
  font-family: monospace;
  font-size: var(--text-sm, 12px);
  line-height: 1.6;
  color: var(--color-text, #eee);
  background: var(--color-bg, #0d0d1a);
  border: 1px solid var(--color-border, #333);
  border-radius: var(--radius-sm, 6px);
  resize: vertical;
}

.kb-doc-overlay__textarea:focus { outline: none; border-color: var(--color-accent, #4ade80); }

.kb-doc-overlay__foot {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--space-2, 8px);
  margin-top: var(--space-3, 12px);
}

.kb-doc-overlay__hint {
  flex: 1;
  min-width: 180px;
  font-size: var(--text-xs, 11px);
  color: var(--color-text-tertiary, #888);
}

.kb-doc-overlay__chunk {
  padding: var(--space-2, 8px) var(--space-3, 12px);
  background: var(--color-bg, #0d0d1a);
  border: 1px solid var(--color-border, #333);
  border-radius: var(--radius-sm, 6px);
}

.kb-doc-overlay__chunk + .kb-doc-overlay__chunk { margin-top: var(--space-2, 8px); }

.kb-doc-overlay__chunk-head {
  font-size: var(--text-xs, 11px);
  font-weight: 600;
  color: var(--color-info, #60a5fa);
}

.kb-doc-overlay__chunk-text {
  margin: var(--space-1, 4px) 0 0;
  font-size: var(--text-sm, 12px);
  line-height: 1.6;
  color: var(--color-text-secondary, #aaa);
  word-break: break-word;
}

/* === B45（2026-08-22）：退出登录三栏遮罩（用户拍板） ===
   数据保留在 IndexedDB，遮罩揭开即恢复；学习区 = 居中占位卡 + [登录]。
   面板补 position:relative 供绝对定位遮罩锚定（面板原有布局不受影响）。 */
#chat-panel,
#lesson-panel,
#dashboard-panel {
  position: relative;
}

.home-loggedout-mask {
  position: absolute;
  inset: 0;
  z-index: 20;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--space-3, 12px);
  text-align: center;
  background: var(--color-bg, #0d0d1a);
}

.home-loggedout-mask[hidden] {
  display: none; /* flex 会压过 UA [hidden]，同 hub-panel 先例（B34③） */
}

.home-loggedout-card {
  max-width: 360px;
  width: 90%;
  padding: var(--space-6, 24px);
  background: var(--color-bg-secondary, #1a1a2e);
  border: 1px solid var(--color-border, #333);
  border-radius: var(--radius-lg, 12px);
}

.home-loggedout-card__title {
  margin: 0 0 var(--space-2, 8px);
  font-size: var(--text-lg, 16px);
  color: var(--color-text, #eee);
}

.home-loggedout-card__text {
  margin: 0 0 var(--space-4, 16px);
  font-size: var(--text-sm, 12px);
  color: var(--color-text-secondary, #aaa);
}

.home-loggedout-card__login {
  padding: var(--space-2, 8px) var(--space-5, 20px);
  font-size: var(--text-sm, 12px);
  font-weight: 600;
  background: var(--color-accent, #4ade80);
  color: #000;
  border: none;
  border-radius: var(--radius-sm, 6px);
  cursor: pointer;
}

.home-loggedout-note {
  margin: 0;
  font-size: var(--text-sm, 12px);
  color: var(--color-text-secondary, #aaa);
}

/* === B36（2026-08-20）：AI 生成期间禁用全部按钮 ===
   用户裁决：avvmo 生成任何东西时，禁用当前页面所有按钮类
   （ui-busy 门面接线 → 容器 .ai-busy；淡化统一提示） */
#home-container.ai-busy button {
  pointer-events: none;
  opacity: 0.55;
}

/* B36 例外：busy-allow——DebugPanel 放大镜随时可开（用户裁决 2026-08-20）；
   B43（2026-08-22）：hub 壳「← 回到学习」永不禁用——生成期间用户可能
   在 hub 内点「开始第一课」，必须能随时回三栏学习区看生成进度
   （否则被困在个人中心干等） */
#home-container.ai-busy button.busy-allow {
  pointer-events: auto;
  opacity: 1;
}

/* B60（2026-08-24 用户裁决）：mission 生成期「回到学习」锁定——
   B43 豁免仅对确认生成窗口失效（禁用 click 不派发 + 置灰）；
   生成落定（成功/失败）由 home._setHubBackLocked 恢复。
   注意：busy-allow 规则带元素选择器，此处必须同样带 button 才能压过 */
#home-container .hub-back:disabled,
#home-container.ai-busy button.hub-back:disabled {
  pointer-events: none;
  opacity: 0.55;
  cursor: not-allowed;
}

/* === 纯聊工作台（节点 8b-2b 2026-08-21） ===
   hub「纯净聊天」导航：左栏 = 对话历史列表；中+右区域 = 对话工作台
   （标题/记忆开关/引用菜单/消息流/输入行）。 */

/* hub-view 全高布局（纯聊模式无内边距、内部滚动） */
.hub-view--pure {
  padding: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

.pure-chat {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
}

.pure-chat__head {
  flex-shrink: 0;
  border-bottom: var(--border-subtle);
  background: var(--color-bg-surface);
  padding: var(--space-3) var(--space-4);
}

.pure-chat__headrow {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  flex-wrap: wrap;
}

.pure-chat__title {
  font-size: var(--text-md);
  font-weight: var(--weight-medium);
  color: var(--color-text-primary);
  max-width: 40ch;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.pure-chat__badge {
  font-size: var(--text-xs);
  color: var(--color-accent);
  background: var(--color-accent-subtle);
  border-radius: var(--radius-sm);
  padding: 2px 8px;
}

.pure-chat__spacer { flex: 1; }

.pure-chat__refs-btn {
  background: transparent;
  border: var(--border-subtle);
  border-radius: var(--radius-sm);
  color: var(--color-text-secondary);
  cursor: pointer;
  font-family: var(--font-sans);
  font-size: var(--text-xs);
  padding: 4px 10px;
  transition: all var(--duration-fast) var(--ease-out);
}
.pure-chat__refs-btn:hover { border-color: var(--color-accent-soft); color: var(--color-accent); }

.pure-chat__memory {
  display: flex;
  align-items: center;
  gap: 4px;
  font-size: var(--text-xs);
  color: var(--color-text-secondary);
  cursor: pointer;
  user-select: none;
}
.pure-chat__memory input { accent-color: var(--color-accent); cursor: pointer; }

.pure-chat__refs-wrap { position: relative; }

.pure-chat__refchips {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-1);
  margin-top: var(--space-2);
}
.pure-chat__refchip {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: var(--text-xs);
  color: var(--color-accent);
  background: var(--color-accent-subtle);
  border-radius: var(--radius-sm);
  padding: 2px 4px 2px 8px;
}

/* B40：chip 右上 ✕ = 取消这条引用 */
.pure-chat__refchip-x {
  background: none;
  border: none;
  border-radius: 50%;
  color: var(--color-text-tertiary);
  cursor: pointer;
  font-family: var(--font-sans);
  font-size: 10px;
  line-height: 1;
  padding: 2px 4px;
  transition: all var(--duration-fast) var(--ease-out);
}
.pure-chat__refchip-x:hover { color: var(--color-text-primary); background: var(--color-bg-elevated); }

.pure-chat__refs-menu {
  position: absolute;
  right: 0;
  top: calc(100% + 4px);
  z-index: 20;
  min-width: 260px;
  max-height: 340px;
  overflow-y: auto;
  background: var(--color-bg-surface);
  border: var(--border-subtle);
  border-radius: var(--radius-md);
  padding: var(--space-3);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25);
}

.pure-refs__group { margin-bottom: var(--space-3); }
.pure-refs__group:last-of-type { margin-bottom: var(--space-2); }

.pure-refs__label {
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
  margin-bottom: var(--space-1);
}

.pure-refs__item {
  display: block;
  width: 100%;
  text-align: left;
  background: none;
  border: none;
  border-radius: var(--radius-sm);
  padding: 5px 8px;
  cursor: pointer;
  font-family: var(--font-sans);
  font-size: var(--text-sm);
  color: var(--color-text-secondary);
  transition: background var(--duration-fast) var(--ease-out);
}
.pure-refs__item:hover { background: var(--color-bg-elevated); }
.pure-refs__item--on { color: var(--color-accent); font-weight: var(--weight-medium); }

.pure-refs__empty {
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
  margin: 2px 8px;
}

.pure-refs__clear {
  width: 100%;
  background: none;
  border: var(--border-subtle);
  border-radius: var(--radius-sm);
  padding: 5px 8px;
  cursor: pointer;
  font-family: var(--font-sans);
  font-size: var(--text-xs);
  color: var(--color-text-secondary);
}
.pure-refs__clear:hover { border-color: var(--color-accent-soft); color: var(--color-accent); }

.pure-chat__messages {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  padding: var(--space-4) var(--space-5);
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}

.pure-chat__input {
  flex-shrink: 0;
  display: flex;
  gap: var(--space-2);
  padding: var(--space-3) var(--space-4);
  border-top: var(--border-subtle);
  background: var(--color-bg-surface);
}

/* 确认生成挂进消息流的进度节点（沿用 B36 三行指示条样式） */
.pure-chat__messages .lesson-gen-progress {
  margin: var(--space-2) 0;
}

.pure-chat__input-area {
  flex: 1;
  min-height: 40px;
  max-height: 120px;
  padding: var(--space-2) var(--space-3);
  background: var(--color-bg-deep);
  border: var(--border-subtle);
  border-radius: var(--radius-sm);
  color: var(--color-text-primary);
  font-family: var(--font-sans);
  font-size: var(--text-sm);
  line-height: var(--leading-normal);
  resize: none;
  transition: border-color var(--duration-fast) var(--ease-out);
}
.pure-chat__input-area:focus { outline: none; border-color: var(--color-accent-soft); }
.pure-chat__input-area::placeholder { color: var(--color-text-tertiary); }

.pure-chat__send {
  min-width: 64px;
  height: 40px;
  background: var(--color-accent-subtle);
  border: none;
  border-radius: var(--radius-sm);
  color: var(--color-accent);
  cursor: pointer;
  flex-shrink: 0;
  font-family: var(--font-sans);
  font-size: var(--text-sm);
  transition: background var(--duration-fast) var(--ease-out);
}
.pure-chat__send:hover { background: var(--color-accent-glow); }

/* B102（2026-08-27）：只占内容高度贴底——原 flex:1 与消息区平分剩余高度，
   提示框撑到正中间，只留上半区给历史回放 */
.pure-chat__readonly {
  flex-shrink: 0;
  margin: var(--space-2) var(--space-4) var(--space-3);
  font-size: var(--text-sm);
  color: var(--color-text-tertiary);
  padding: var(--space-2) var(--space-3);
  border: 1px dashed var(--border-subtle);
  border-radius: var(--radius-sm);
  text-align: center;
}

/* B40：新路线对话五方面进展卡（常驻顶部，已知项实时点亮） */
.pure-chat__profile {
  flex-shrink: 0;
  border-bottom: var(--border-subtle);
  background: var(--color-bg-surface);
  padding: var(--space-2) var(--space-4);
}

.pure-chat__profile-inner {
  display: flex;
  gap: var(--space-2);
  overflow-x: auto;
  padding-bottom: 2px;
}

.aspect-card {
  flex: 0 0 auto;
  min-width: 96px;
  max-width: 160px;
  background: var(--color-bg-elevated);
  border: var(--border-subtle);
  border-radius: var(--radius-sm);
  padding: var(--space-2) var(--space-3);
}
.aspect-card--known {
  border-color: var(--color-accent-soft);
  background: var(--color-accent-subtle);
}

.aspect-card__label {
  font-size: 10px;
  color: var(--color-text-tertiary);
  margin-bottom: 2px;
}

.aspect-card__value {
  font-size: var(--text-xs);
  color: var(--color-text-primary);
  line-height: var(--leading-snug);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.aspect-card:not(.aspect-card--known) .aspect-card__value { color: var(--color-text-tertiary); }

/* 左栏历史列表 */
.pure-history {
  display: flex;
  flex-direction: column;
  height: 100%;
}

.pure-history__head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: var(--space-2);
}

.pure-history__hint {
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
}

.pure-history__new {
  background: transparent;
  border: var(--border-subtle);
  border-radius: var(--radius-sm);
  color: var(--color-accent);
  cursor: pointer;
  font-family: var(--font-sans);
  font-size: var(--text-xs);
  padding: 4px 10px;
  transition: all var(--duration-fast) var(--ease-out);
}
.pure-history__new:hover { border-color: var(--color-accent-soft); background: var(--color-accent-subtle); }

.pure-history__list {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
}

.pure-history__item {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-2) var(--space-3);
  border: var(--border-subtle);
  border-radius: var(--radius-sm);
  background: var(--color-bg-surface);
  cursor: pointer;
  transition: all var(--duration-fast) var(--ease-out);
}
.pure-history__item:hover { border-color: var(--color-accent-soft); }
.pure-history__item--active {
  border-color: var(--color-accent-soft);
  background: var(--color-accent-subtle);
}

.pure-history__main { flex: 1; min-width: 0; }

.pure-history__title {
  font-size: var(--text-sm);
  color: var(--color-text-primary);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.pure-history__meta {
  display: flex;
  align-items: center;
  gap: var(--space-1);
  margin-top: 2px;
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
}

.pure-history__badge {
  padding: 0 5px;
  border-radius: 3px;
  background: var(--color-bg-elevated);
  font-size: 10px;
  color: var(--color-text-secondary);
}
.pure-history__badge--new { color: var(--color-accent); }
/* B40：课程对话 / 欢迎访谈会话徽标 */
.pure-history__badge--course { color: var(--color-success); }
.pure-history__badge--welcome { color: var(--color-warning); }

.pure-history__del {
  background: none;
  border: none;
  cursor: pointer;
  font-size: var(--text-sm);
  color: var(--color-accent); /* B41：垃圾桶用主题黄——深色模式下可见 */
  opacity: 0.55;
  transition: opacity var(--duration-fast) var(--ease-out);
}
.pure-history__del:hover { opacity: 1; }

.pure-history__clear {
  align-self: center;
  margin-top: var(--space-3);
  background: none;
  border: var(--border-subtle);
  border-radius: var(--radius-sm);
  padding: 4px 12px;
  cursor: pointer;
  font-family: var(--font-sans);
  font-size: var(--text-xs);
  color: var(--color-text-tertiary);
  transition: all var(--duration-fast) var(--ease-out);
}
.pure-history__clear:hover { border-color: var(--color-accent-soft); color: var(--color-text-secondary); }

.pure-history__empty {
  font-size: var(--text-sm);
  color: var(--color-text-tertiary);
  padding: var(--space-3);
  text-align: center;
}
