/* ==================================================================
   pages/library.css — 资料库（左侧目录 + 右侧预览/文献列表）
   ------------------------------------------------------------------
   依赖 static/base.css（公共层，唯一视觉来源）：
     · 版心与页头：.page-container/.page-head/.page-title/.page-subtitle
     · 卡片家族：.preview-card（预览卡：白底 + 细边 + 圆角 + 阴影）
     · 按钮：.btn/.btn-primary/.btn-outline/.btn-sm（下载、文献翻译、目录空态）
     · 徽标：.chip（文献标签）· 空态 .g-empty/.g-empty-icon/.g-empty-title/.g-empty-desc
     · 骨架：.g-skeleton/.g-skeleton-card · 错误条：.g-error
     · 状态：.toast（阴影/居中/时长，需 JS 补 .show 才可见）
     · 横滚壳：.tabs（position:relative + .has-scroll 右缘渐隐，类由 fx.js 挂）
     · 文本工具：.text-mute/.text-xs；焦点环由 base 的 :focus-visible 统一提供
   纪律（《前端显示优化方案_20260925.md》§3/§9）：
     1. 无强制覆盖（important 关键字 0 处），不重复定义 base 已有的组件；
     2. 无字面色值，颜色一律 var(--g-*)；
     3. 字号一律走 --g-fs-*（最小 12.5px），标签类不低于 12.5px；
     4. 不声明 outline，焦点样式全交 base.css；
     5. 不改 HTML 既有 class 名与任何 id（页内 JS 依赖），只补布局类。
   本页修：4-9 旧蓝残留（下载键/文献左轨/DOI 链接的旧蓝 → --g-primary/--g-info）、
     4-15 键盘可达（树行/分类行/文献行由 div+onclick 改 button 或补 role+键盘）、
     4-16 对比度（旧灰蓝小字 → --g-mute，纯装饰箭头留 --g-mute-2）、
     4-20 窄屏（Tab 提到侧栏外做横向条、侧栏单独限高、列表行允许换行）、
     4-27 字阶（卡片标题 16px 不小于正文、标签 12.5px）。
   ================================================================== */

/* ---------- 1. 页面骨架 ---------- */
body[data-page="library"] {
  display: flex; flex-direction: column;
  min-height: 100vh;   /* 降级：不支持 dvh 的浏览器 */
  min-height: 100dvh;  /* 移动端地址栏收展时页脚仍贴底 */
}
.page-container { flex: 1 1 auto; }

/* 主栅格：桌面「左栏（Tab 条 + 目录卡）／右栏（内容）」。
   Tab 条在 DOM 上是 .main-layout 的直接子项而不是 .sidebar 的子项——
   这样窄屏才能把它提到侧栏之外变成横向条，侧栏与内容不再共用一块滚动区（4-20）。 */
.main-layout {
  display: grid;
  grid-template-columns: 280px minmax(0, 1fr);
  grid-template-areas:
    "tabs content"
    "side content";
  gap: var(--g-sp-4);
  align-items: start;
}
.tab-bar { grid-area: tabs; }
.sidebar { grid-area: side; }
.content { grid-area: content; }

/* ---------- 2. Tab 条：分段控件；窄屏转横向可滚条（第 8 段） ----------
   base 提供 .tab-btn 结构基线（并档第二批），这里只留 library 的"分段式"差异：
   等宽拉伸、紧凑内距、active 渐变白字（admin 是文件夹式，两种皮肤并存）。
   .tab-bar 的网格定位（grid-area: tabs）见第 1 段。 */
.tab-bar {
  display: flex; gap: 2px;
  padding: 3px;
  background: var(--g-surface);
  border: 1px solid var(--g-line);
  border-radius: var(--g-r-md);
  box-shadow: var(--g-sh-sm);
  scrollbar-width: none;              /* 窄屏横滚不显滚动条（与 .nav-links 一致） */
}
.tab-bar::-webkit-scrollbar { display: none; }
.tab-btn { flex: 1 1 0; min-width: 0; padding: 6px var(--g-sp-1); }
.tab-btn.active { background: var(--g-grad); color: var(--g-on-primary); box-shadow: var(--g-sh-primary); }
/* 面板显隐机制走 base 的 .tab-panel（并档第二批），本页不再重复 */

/* ---------- 3. 左侧栏卡 ---------- */
.sidebar {
  min-width: 0;
  background: var(--g-surface);
  border: 1px solid var(--g-line);
  border-radius: var(--g-r-lg);
  box-shadow: var(--g-sh-sm);
  overflow-x: hidden;
  overflow-y: auto;                   /* 目录自己滚：不把内容区顶长 */
  overscroll-behavior: contain;       /* 滚到底不带动整页 */
}
/* 桌面：目录卡吸住并限高（比视口矮一截时不会再被拉成整页高） */
@media (min-width: 861px) {
  .sidebar {
    position: sticky;
    top: calc(var(--g-nav-h) + var(--g-sp-4));
    max-height: calc(100vh - var(--g-nav-h) - var(--g-sp-6));
    max-height: calc(100dvh - var(--g-nav-h) - var(--g-sp-6));
  }
}

/* ---------- 4. 侧栏区头 + 资料目录树 ---------- */
.tree-header, .side-header {
  position: sticky; top: 0; z-index: 2;
  display: flex; align-items: center; justify-content: space-between; gap: var(--g-sp-2);
  padding: var(--g-sp-3);
  background: var(--g-surface);
  border-bottom: 1px solid var(--g-line-2);
  color: var(--g-ink-2); font-size: var(--g-fs-sm); font-weight: 700;
}
.side-count { color: var(--g-mute); font-size: var(--g-fs-xs); font-weight: 400; }

/* 留出左右 8px：行的焦点环（base 的 :focus-visible，2px + 2px 偏移）不被卡片圆角裁掉 */
#tree-container, #final-tree-container, #topic-tree { padding: 0 var(--g-sp-2) var(--g-sp-2); }

/* 目录行：<button> 承载点击（键盘 Tab + Enter/Space 原生可用，修 4-15）。
   层级缩进仍由 JS 生成的内联 padding-left 决定。 */
.tree-item {
  display: flex; align-items: center; gap: 6px;
  width: 100%; min-height: 32px; padding: 6px var(--g-sp-3);
  border: none; border-radius: var(--g-r-sm);
  background: none; color: var(--g-ink-2);
  font-size: var(--g-fs-sm); text-align: left;
  cursor: pointer; user-select: none;
  transition: background var(--g-dur) var(--g-ease), color var(--g-dur) var(--g-ease);
}
.tree-item:hover { background: var(--g-surface-2); }
.tree-item.active { background: var(--g-primary-soft); color: var(--g-primary); font-weight: 600; }
.tree-item .icon { flex: 0 0 18px; width: 18px; text-align: center; font-size: var(--g-fs-xs); }
.tree-item .name { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tree-item .size { flex: 0 0 auto; font-size: var(--g-fs-xs); color: var(--g-mute); }
.tree-item.folder > .icon { color: var(--g-c5); }
.tree-item.file > .name { padding-left: var(--g-sp-5); }
.tree-children { display: none; }
.tree-children.open { display: block; }
/* 目录/文献接口失败时的错误条与空态（配色走 base 的 .g-error/.g-empty，这里只给缩进） */
.sidebar .g-error, .sidebar .g-empty { margin: var(--g-sp-2) var(--g-sp-3); }

/* ---------- 5. 文献分类树 + 搜索 ---------- */
.search-wrap { padding: var(--g-sp-2) var(--g-sp-3) var(--g-sp-3); }
.topic-group { margin-bottom: 2px; }
/* 分类标题：<button>（4-15），箭头旋转表达展开态 */
.topic-title {
  display: flex; align-items: center; gap: 6px;
  width: 100%; min-height: 32px; padding: 6px var(--g-sp-3);
  border: none; border-radius: var(--g-r-sm);
  background: none; color: var(--g-ink);
  font-size: var(--g-fs-sm); font-weight: 700; text-align: left;
  cursor: pointer; user-select: none;
  transition: background var(--g-dur) var(--g-ease);
}
.topic-title:hover { background: var(--g-surface-2); }
.topic-title .arrow {
  flex: 0 0 auto; color: var(--g-mute-2);
  font-size: var(--g-fs-xs);
  transition: transform var(--g-dur-2) var(--g-ease);
}
.topic-title .arrow.open { transform: rotate(90deg); }
.sub-children { display: none; }
.sub-children.open { display: block; }
/* 子分类行：<button>（4-15），计数靠 flex 两端对齐（原来的 float 已去掉） */
.sub-item {
  display: flex; align-items: center; justify-content: space-between; gap: var(--g-sp-2);
  width: 100%; min-height: 30px; padding: 5px var(--g-sp-3) 5px var(--g-sp-6);
  border: none; border-radius: var(--g-r-sm);
  background: none; color: var(--g-mute);
  font-size: var(--g-fs-sm); text-align: left;
  cursor: pointer; user-select: none;
  transition: background var(--g-dur) var(--g-ease), color var(--g-dur) var(--g-ease);
}
.sub-item:hover { background: var(--g-surface-2); color: var(--g-ink); }
.sub-item.active { background: var(--g-primary-soft); color: var(--g-primary); font-weight: 600; }
.sub-item .count { flex: 0 0 auto; color: var(--g-mute); font-size: var(--g-fs-xs); font-weight: 400; }

/* ---------- 6. 右侧内容：文件预览卡 ---------- */
.content { min-width: 0; display: flex; flex-direction: column; }
/* 白底/细边/圆角/阴影走 base 的 .preview-card，这里只补内距与外距 */
.preview-container { padding: var(--g-sp-5); margin-bottom: var(--g-sp-3); }
.preview-title {
  display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between;
  gap: var(--g-sp-2);
  margin-bottom: var(--g-sp-3); padding-bottom: var(--g-sp-2);
  border-bottom: 1px solid var(--g-line-2);
  color: var(--g-ink); font-size: var(--g-fs-md); font-weight: 700;
  overflow-wrap: anywhere;            /* 长文件名不许撑破卡片（4-20） */
}
.preview-meta { color: var(--g-mute); font-size: var(--g-fs-xs); font-weight: 400; }
.preview-text {
  max-height: 60vh; overflow-y: auto;
  padding: var(--g-sp-2) 0;
  white-space: pre-wrap; overflow-wrap: anywhere;
  color: var(--g-ink-2); font-size: var(--g-fs-base); line-height: 1.9;
}
.preview-images { text-align: center; }
.preview-images img {
  margin: 0 auto var(--g-sp-3);
  border: 1px solid var(--g-line); border-radius: var(--g-r-sm);
  box-shadow: var(--g-sh-sm);
}
.preview-actions { display: flex; justify-content: center; margin-bottom: var(--g-sp-4); }
.btn-download { min-width: 132px; }   /* 外观走 base 的 .btn .btn-primary */

/* 加载占位：.g-loading 已收编进 base（并档第二批），本页只用 #loading 容器放骨架 */
#loading .g-skeleton { margin-bottom: var(--g-sp-3); }
/* 错误条：几何在本页，配色走 base 的 .g-error（bg/文字/描边色） */
.error-msg {
  display: block; padding: var(--g-sp-3) var(--g-sp-4);
  border-width: 1px; border-style: solid;
  border-radius: var(--g-r-md);
  text-align: center; font-size: var(--g-fs-sm);
}
.content .error-msg { margin: var(--g-sp-2) 0 0; }

/* ---------- 7. 文献列表 ---------- */
.lit-count { margin-bottom: var(--g-sp-3); color: var(--g-mute); font-size: var(--g-fs-sm); }
/* 文献行外观 .lit-item 已收编进 base（并档第二批）；键盘可达走 role=button + tabindex（4-15） */
/* 标题 16px / 700：不再比正文（14px）小（4-27） */
.lit-title {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--g-sp-2);
  margin-bottom: 4px;
  color: var(--g-ink); font-size: var(--g-fs-md); font-weight: 700;
}
.lit-title .btn-translate { flex: 0 0 auto; }
.lit-meta {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--g-sp-3);
  color: var(--g-mute); font-size: var(--g-fs-sm);
}
.lit-authors { color: var(--g-ink-2); }
.lit-journal { color: var(--g-mute); font-style: italic; }
.lit-date { color: var(--g-mute); }
.lit-doi { color: var(--g-info); font-size: var(--g-fs-xs); font-weight: 600; text-decoration: none; }
.lit-doi:hover { text-decoration: underline; }
.lit-pdf { color: var(--g-ok); }
.lit-tags { display: flex; flex-wrap: wrap; gap: var(--g-sp-1); margin-top: var(--g-sp-2); }
/* .lit-tag 的外观（pill + 12.5px + 中性底）由 base 的 .chip 提供，本文件不再重复 */
.lit-abstract {
  display: none; margin-top: var(--g-sp-2);
  color: var(--g-ink-2); font-size: var(--g-fs-sm); line-height: 1.7;
}
.lit-abstract.show { display: block; }
.lit-translation {
  display: none; margin-top: var(--g-sp-2); padding: var(--g-sp-3);
  border-left: 3px solid var(--g-warn); border-radius: var(--g-r-sm);
  background: var(--g-warn-bg);
  font-size: var(--g-fs-sm); line-height: 1.7;
}
.lit-translation.show { display: block; }
.lit-translation .zt-label { margin-bottom: 2px; color: var(--g-warn); font-size: var(--g-fs-xs); font-weight: 600; }
.lit-translation .zt-title { margin-bottom: 2px; font-size: var(--g-fs-base); }
.lit-translation .zt-abstract { color: var(--g-ink-2); font-size: var(--g-fs-sm); }

/* ---------- 8. 响应式（断点与 base 的 860 / 560 对齐） ---------- */
@media (max-width: 860px) {
  /* Tab 条提到侧栏之外做横向条：可横滚 + 右缘渐隐（base 的 .tabs.has-scroll） */
  .main-layout {
    grid-template-columns: minmax(0, 1fr);
    grid-template-areas:
      "tabs"
      "side"
      "content";
  }
  .tab-bar {
    flex-wrap: nowrap;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    overscroll-behavior-x: contain;
  }
  .tab-btn { flex: 0 0 auto; min-width: 84px; min-height: 40px; padding: 6px var(--g-sp-3); }
  /* 侧栏单独限高、自己滚：与内容区不再挤进同一滚动区（修 4-20） */
  .sidebar { max-height: 40vh; }
  .preview-container { padding: var(--g-sp-4); }
  .lit-item { padding: var(--g-sp-3); }
}
@media (max-width: 560px) {
  .page-head { margin-bottom: var(--g-sp-4); }
  .tab-btn { min-width: 76px; }
  .lit-meta { gap: var(--g-sp-2); }
  .lit-title { font-size: var(--g-fs-base); }   /* 小屏标题回到 14px/700，仍不小于正文 */
  .preview-text { max-height: 52vh; }
}
