/* ============================================================
   学术工作台 · 双主题体系
   亮色：淡雅报纸（灰米纸面 + 苔绿强调，半透明毛玻璃卡片）
   暗色：深夜墨纸（深灰纸面 + 柔和青绿，半透明毛玻璃卡片）
   ============================================================ */

/* ===== 亮色主题（默认）—— 淡雅报纸风 ===== */
:root {
  /* ============================================================
     V3 · 光感玻璃  —— 令牌层
     原则：一屏最多一层玻璃面，面内只用发丝线 + 字阶 + 留白分隔
     ============================================================ */

  /* ---------- 页面底色与 AI 光场背景 ---------- */
  --bg: #F4F2ED;
  --bg-photo: url("/static/assets/aurora-light.jpg");
  --bg-photo-blur: 84px;
  --bg-photo-filter: blur(84px) saturate(42%);
  --bg-photo-opacity: 0.42;
  --bg-photo-scale: 1.12;

  /* ---------- 玻璃面（全站唯一的面层级） ---------- */
  --glass: rgba(255, 255, 255, 0.66);
  --glass-strong: rgba(255, 255, 255, 0.80);
  --glass-thin: rgba(255, 255, 255, 0.34);
  --glass-blur: 30px;
  --glass-sat: 170%;
  --edge: rgba(255, 255, 255, 0.90);
  --edge-outer: rgba(28, 30, 27, 0.09);
  --hairline: rgba(28, 30, 27, 0.085);
  --hairline-soft: rgba(28, 30, 27, 0.048);
  --well: rgba(28, 30, 27, 0.038);

  /* ---------- 阴影阶梯 ---------- */
  --sh-1: 0 1px 2px rgba(24, 26, 23, 0.05);
  --sh-2: 0 2px 8px -2px rgba(24, 26, 23, 0.07), 0 14px 34px -16px rgba(24, 26, 23, 0.18);
  --sh-3: 0 8px 24px -8px rgba(24, 26, 23, 0.11), 0 44px 88px -36px rgba(24, 26, 23, 0.30);

  /* ---------- 动效 ---------- */
  --ease: cubic-bezier(0.22, 1, 0.36, 1);
  --ease-spring: cubic-bezier(0.34, 1.42, 0.64, 1);
  --t-fast: 140ms;
  --t-base: 260ms;
  --t-slow: 460ms;

  /* ---------- 强调与语义 ---------- */
  --accent: #0F766E;
  --accent-dim: rgba(15, 118, 110, 0.08);
  --accent-glow: rgba(15, 118, 110, 0.18);
  --accent-soft: #14B8A6;
  --amber: #B45309;
  --amber-dim: rgba(180, 83, 9, 0.08);
  --danger: #DC2626;
  --danger-dim: rgba(220, 38, 38, 0.07);
  --purple: #7C3AED;
  --purple-dim: rgba(124, 58, 237, 0.08);
  --info: #2563EB;
  --info-dim: rgba(37, 99, 235, 0.08);
  --success: #059669;
  --success-dim: rgba(5, 150, 105, 0.08);

  /* ---------- 文字 ---------- */
  --text: #1B1E1D;
  --text-secondary: #4B5350;
  --text-muted: #8A938E;

  /* ---------- 兼容层：旧令牌全部保留，指向新体系 ---------- */
  --bg-elevated: var(--glass-strong);
  --card-bg: var(--glass);
  --card-border: var(--edge-outer);
  --card-border-hover: rgba(15, 118, 110, 0.30);
  --surface-1: rgba(28, 30, 27, 0.018);
  --surface-2: rgba(28, 30, 27, 0.030);
  --surface-3: rgba(28, 30, 27, 0.046);
  --btn-text: #FFFFFF;
  --progress-end: #059669;
  --shadow-color: rgba(24, 26, 23, 0.07);
  --shadow-hover: rgba(24, 26, 23, 0.14);
  --grid-color: transparent;
  --sidebar-bg: rgba(255, 255, 255, 0.55);
  --topbar-fade: linear-gradient(180deg, var(--bg) 68%, transparent);
  --toast-bg: rgba(255, 255, 255, 0.92);
  --input-bg: var(--well);
  --checkbox-empty: #8A938E;

  /* ---------- 日报排版（不再自成一套色，全部映射到统一体系） ---------- */
  --paper-bg: transparent;
  --paper-paper: transparent;
  --paper-ink: var(--text);
  --paper-ink-soft: #232624;
  --paper-accent: var(--accent);
  --paper-muted: var(--text-secondary);
  --paper-line: var(--hairline);
  --paper-line-soft: var(--hairline-soft);
  --paper-block: transparent;
  --paper-table-head: var(--well);
  --paper-table-alt: transparent;
  --paper-fig: transparent;

  /* ---------- 尺寸 ---------- */
  --sidebar-w: 260px;
  --radius: 20px;
  --radius-lg: 20px;
  --radius-xl: 28px;
  --radius-sm: 10px;
  --radius-xs: 8px;
  --font-serif: 'Noto Serif SC', 'Songti SC', 'Source Han Serif SC', serif;
  --font-sans: 'Noto Sans SC', -apple-system, 'PingFang SC', 'Helvetica Neue', sans-serif;
  --font-mono: 'JetBrains Mono', 'SF Mono', 'Menlo', 'Consolas', monospace;

  /* 兼容别名 */
  --text-primary: var(--text);
  --text-color: var(--text);
  --card-bg-alt: var(--surface-2);
  --card-bg-hover: var(--surface-3);
  --radius-md: var(--radius-sm);
}

/* ===== 暗色主题 —— 深夜墨纸风 ===== */
[data-theme="dark"] {
  --bg: #0B0D0F;
  --bg-photo: url("/static/assets/aurora-dark.jpg");
    --bg-photo-blur: 46px;
    --bg-photo-filter: blur(46px) saturate(118%) contrast(1.06);
    --bg-photo-opacity: 0.82;
    --bg-photo-scale: 1.06;

  --glass: rgba(255, 255, 255, 0.052);
  --glass-strong: rgba(255, 255, 255, 0.085);
  --glass-thin: rgba(255, 255, 255, 0.030);
  --glass-blur: 32px;
  --glass-sat: 150%;
  --edge: rgba(255, 255, 255, 0.16);
  --edge-outer: rgba(255, 255, 255, 0.075);
  --hairline: rgba(255, 255, 255, 0.075);
  --hairline-soft: rgba(255, 255, 255, 0.045);
  --well: rgba(255, 255, 255, 0.042);

  --sh-1: 0 1px 2px rgba(0, 0, 0, 0.34);
  --sh-2: 0 2px 10px -2px rgba(0, 0, 0, 0.42), 0 16px 40px -18px rgba(0, 0, 0, 0.62);
  --sh-3: 0 10px 30px -8px rgba(0, 0, 0, 0.50), 0 48px 96px -40px rgba(0, 0, 0, 0.80);

  --accent: #5EEAD4;
  --accent-dim: rgba(94, 234, 212, 0.11);
  --accent-glow: rgba(94, 234, 212, 0.35);
  --accent-soft: #5EEAD4;
  --amber: #FBBF24;
  --amber-dim: rgba(251, 191, 36, 0.13);
  --danger: #F87171;
  --danger-dim: rgba(248, 113, 113, 0.10);
  --purple: #A78BFA;
  --purple-dim: rgba(167, 139, 250, 0.13);
  --info: #60A5FA;
  --info-dim: rgba(96, 165, 250, 0.13);
  --success: #34D399;
  --success-dim: rgba(52, 211, 153, 0.13);

  --text: #E8E6E2;
  --text-secondary: #A8AFAC;
  --text-muted: #7C8481;

  --bg-elevated: rgba(16, 19, 22, 0.86);
  --card-bg: var(--glass);
  --card-border: var(--edge-outer);
  --card-border-hover: rgba(94, 234, 212, 0.28);
  --surface-1: rgba(255, 255, 255, 0.014);
  --surface-2: rgba(255, 255, 255, 0.026);
  --surface-3: rgba(255, 255, 255, 0.044);
  --btn-text: #06201D;
  --progress-end: #34D399;
  --shadow-color: rgba(0, 0, 0, 0.30);
  --shadow-hover: rgba(0, 0, 0, 0.46);
  --grid-color: transparent;
  --sidebar-bg: rgba(11, 13, 15, 0.55);
  --topbar-fade: linear-gradient(180deg, var(--bg) 68%, transparent);
  --toast-bg: rgba(26, 29, 32, 0.94);
  --input-bg: var(--well);
  --checkbox-empty: #7C8481;

  --paper-bg: transparent;
  --paper-paper: transparent;
  --paper-ink: var(--text);
  --paper-ink-soft: #D8D6D2;
  --paper-accent: var(--accent);
  --paper-muted: var(--text-secondary);
  --paper-line: var(--hairline);
  --paper-line-soft: var(--hairline-soft);
  --paper-block: transparent;
  --paper-table-head: var(--well);
  --paper-table-alt: transparent;
  --paper-fig: transparent;
}

* { margin: 0; padding: 0; box-sizing: border-box; }

html, body {
  height: 100%;
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-sans);
  font-size: 14px;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
  transition: background 0.4s ease, color 0.4s ease;
}

/* ===== 背景层：AI 光场 + 极慢漂移（V3 去掉了网格与 DNA 水印） ===== */
.bg-layer {
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  overflow: hidden;
  background: var(--bg);
}
/* AI 光场只提供「明暗起伏」，不提供色相 —— 色相交给下面三个色晕控制，
   否则生成图自带的暖调会把整页染成粉橘色。 */
.bg-photo {
  position: absolute;
  inset: -8%;
  background-image: var(--bg-photo);
  background-size: cover;
  background-position: center 38%;
  filter: var(--bg-photo-filter);
  opacity: var(--bg-photo-opacity);
  transform: scale(var(--bg-photo-scale));
  transition: opacity 0.6s ease;
}
/* 三个色晕：只负责「空气感」，不参与信息表达 */
.bg-orb {
  position: absolute;
  border-radius: 50%;
  filter: blur(90px);
  opacity: 0.9;
  will-change: transform;
}
.bg-orb.o1 {
  width: 54vw; height: 54vw; left: -14vw; top: -18vw;
  background: radial-gradient(circle at 50% 50%, rgba(20, 184, 166, 0.12), transparent 68%);
  animation: orbDrift1 48s var(--ease) infinite;
}
.bg-orb.o2 {
  width: 48vw; height: 48vw; right: -12vw; top: 4vh;
  background: radial-gradient(circle at 50% 50%, rgba(214, 178, 112, 0.06), transparent 68%);
  animation: orbDrift2 62s var(--ease) infinite;
}
.bg-orb.o3 {
  width: 64vw; height: 64vw; left: 22vw; bottom: -32vw;
  background: radial-gradient(circle at 50% 50%, rgba(92, 124, 190, 0.08), transparent 72%);
  animation: orbDrift3 74s var(--ease) infinite;
}
[data-theme="dark"] .bg-orb.o1 { background: radial-gradient(circle at 50% 50%, rgba(94, 234, 212, 0.15), transparent 66%); }
[data-theme="dark"] .bg-orb.o2 { background: radial-gradient(circle at 50% 50%, rgba(167, 139, 250, 0.11), transparent 68%); }
[data-theme="dark"] .bg-orb.o3 { background: radial-gradient(circle at 50% 50%, rgba(56, 189, 248, 0.09), transparent 72%); }
/* 顶部主光：发布会舞台灯 */
.bg-key {
  position: absolute;
  inset: 0;
  background: radial-gradient(ellipse 78% 52% at 50% -14%, rgba(255, 255, 255, 0.62), transparent 72%);
}
[data-theme="dark"] .bg-key {
  background: radial-gradient(ellipse 78% 52% at 50% -14%, rgba(94, 234, 212, 0.075), transparent 72%);
}
/* 底部渐隐，让长页面收得干净 */
.bg-fade {
  position: absolute;
  inset: auto 0 0 0;
  height: 34vh;
  background: linear-gradient(180deg, transparent, var(--bg));
  opacity: 0.75;
}
@keyframes orbDrift1 {
  0%, 100% { transform: translate3d(0, 0, 0) scale(1); }
  50%      { transform: translate3d(6vw, 5vh, 0) scale(1.12); }
}
@keyframes orbDrift2 {
  0%, 100% { transform: translate3d(0, 0, 0) scale(1.06); }
  50%      { transform: translate3d(-7vw, 8vh, 0) scale(1); }
}
@keyframes orbDrift3 {
  0%, 100% { transform: translate3d(0, 0, 0) scale(1); }
  50%      { transform: translate3d(-5vw, -6vh, 0) scale(1.1); }
}

/* ===== 应用骨架 ===== */
.app {
  position: relative;
  z-index: 1;
  display: flex;
  min-height: 100vh;
}

/* ===== 侧边栏（悬浮式，默认收起） ===== */
.sidebar {
  width: var(--sidebar-w);
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  background: var(--sidebar-bg);
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
  border-left: 1px solid var(--hairline);
  display: flex;
  flex-direction: column;
  padding: 24px 16px;
  z-index: 30;  /* 比顶栏(20)更高，显示在最上层 */
  /* 默认收起：只露出 8px 的把手 */
  transform: translateX(calc(100% - 8px));
  transition: transform 0.35s cubic-bezier(0.22, 1, 0.36, 1), background 0.4s ease, border-color 0.4s ease;
  box-shadow: -4px 0 20px rgba(0, 0, 0, 0.08);
}
/* 展开状态 */
.sidebar.sidebar-open {
  transform: translateX(0);
  box-shadow: -8px 0 30px rgba(0, 0, 0, 0.12);
}
/* 右侧触发区域：鼠标移上去展开 */
.sidebar-trigger {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  width: 20px;
  z-index: 9;
  cursor: pointer;
}
@keyframes sidebarIn {
  from { opacity: 0; transform: translateX(-20px); }
  to { opacity: 1; transform: translateX(0); }
}

.sidebar-brand {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 0 8px 24px;
  border-bottom: 1px solid var(--card-border);
  margin-bottom: 20px;
}
.brand-mark {
  width: 40px;
  height: 40px;
  flex-shrink: 0;
  animation: brandPulse 4s ease-in-out infinite;
}
.brand-mark svg { width: 100%; height: 100%; }
@keyframes brandPulse {
  0%, 100% { filter: drop-shadow(0 0 4px var(--accent-glow)); }
  50% { filter: drop-shadow(0 0 12px var(--accent-glow)); }
}
.brand-title {
  font-family: var(--font-serif);
  font-size: 17px;
  font-weight: 700;
  color: var(--text);
  letter-spacing: 0.5px;
}
.brand-sub {
  font-size: 11px;
  color: var(--accent);
  font-family: var(--font-mono);
  letter-spacing: 1px;
  margin-top: 2px;
}

.sidebar-nav {
  flex: 1;
  display: flex;
  flex-direction: column;
  gap: 14px;
  overflow-y: auto;
}
/* 导航分组：原 10 项平铺 → 4 组，常用项在上 */
.nav-group {
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.nav-group-label {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1.4px;
  color: var(--text-muted);
  padding: 0 14px 4px;
}
.nav-item {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 9px 14px;
  background: transparent;
  border: none;
  border-radius: var(--radius-sm);
  color: var(--text-secondary);
  font-family: var(--font-sans);
  font-size: 14px;
  cursor: pointer;
  transition: all 0.25s cubic-bezier(0.22, 1, 0.36, 1);
  position: relative;
  text-align: left;
  width: 100%;
}
.nav-item svg {
  width: 18px;
  height: 18px;
  flex-shrink: 0;
  transition: transform 0.25s ease;
}
.nav-item:hover {
  background: var(--accent-dim);
  color: var(--text);
}
.nav-item:hover svg { transform: scale(1.1); }
.nav-item.active {
  background: var(--accent-dim);
  color: var(--accent);
}
.nav-item.active::before {
  content: '';
  position: absolute;
  left: 0;
  top: 50%;
  transform: translateY(-50%);
  width: 3px;
  height: 20px;
  background: var(--accent);
  border-radius: 0 3px 3px 0;
  box-shadow: 0 0 8px var(--accent-glow);
}
.nav-badge {
  margin-left: auto;
  background: var(--amber-dim);
  color: var(--amber);
  font-size: 11px;
  font-family: var(--font-mono);
  padding: 2px 8px;
  border-radius: 10px;
  min-width: 22px;
  text-align: center;
}

.sidebar-footer {
  padding-top: 20px;
  border-top: 1px solid var(--card-border);
}
.phd-mini-head {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  margin-bottom: 8px;
}
.phd-mini-label {
  font-size: 12px;
  color: var(--text-secondary);
}
.phd-mini-percent {
  font-family: var(--font-mono);
  font-size: 14px;
  color: var(--accent);
  font-weight: 500;
}
.phd-mini-bar {
  height: 4px;
  background: var(--surface-3);
  border-radius: 2px;
  overflow: hidden;
}
.phd-mini-fill {
  height: 100%;
  background: linear-gradient(90deg, var(--accent), var(--progress-end));
  border-radius: 2px;
  width: 0%;
  transition: width 1.5s cubic-bezier(0.22, 1, 0.36, 1);
  box-shadow: 0 0 8px var(--accent-glow);
}
.phd-mini-range {
  font-size: 10px;
  color: var(--text-muted);
  font-family: var(--font-mono);
  margin-top: 6px;
  letter-spacing: 0.5px;
}

/* ===== 主内容区 ===== */
.main {
  flex: 1;
  margin-right: 0;  /* 完全占满宽度，侧边栏纯悬浮 */
  min-width: 0;
  padding: 0 32px 48px;
}

/* 顶部状态栏 */
.topbar {
  position: sticky;
  top: 0;
  z-index: 5;
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 24px 0 16px;
  background: var(--topbar-fade);
}
.panel-title {
  font-family: var(--font-serif);
  font-size: 26px;
  font-weight: 700;
  color: var(--text);
  letter-spacing: 1px;
}
.topbar-date {
  font-size: 13px;
  color: var(--text-secondary);
  margin-left: 14px;
  font-family: var(--font-mono);
}
.topbar-right {
  display: flex;
  align-items: center;
  gap: 12px;
}

/* 主题切换按钮 */
.theme-toggle {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: 50%;
  color: var(--text-secondary);
  cursor: pointer;
  transition: all 0.3s cubic-bezier(0.22, 1, 0.36, 1);
  flex-shrink: 0;
}
.theme-toggle:hover {
  border-color: var(--accent);
  color: var(--accent);
  transform: rotate(15deg);
  box-shadow: 0 0 16px var(--accent-dim);
}
.theme-toggle svg { width: 18px; height: 18px; }
.theme-toggle .icon-sun { display: none; }
.theme-toggle .icon-moon { display: block; }
[data-theme="dark"] .theme-toggle .icon-sun { display: block; }
[data-theme="dark"] .theme-toggle .icon-moon { display: none; }

.weather-chip {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 14px;
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: 20px;
  font-size: 13px;
  color: var(--text-secondary);
  transition: all 0.25s ease;
}
.weather-chip svg { width: 16px; height: 16px; color: var(--accent); }
.weather-chip:hover { border-color: var(--card-border-hover); }

.btn-refresh {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 9px 18px;
  background: var(--accent-dim);
  border: 1px solid var(--accent);
  border-radius: 20px;
  color: var(--accent);
  font-family: var(--font-sans);
  font-size: 13px;
  cursor: pointer;
  transition: all 0.25s ease;
}
.btn-refresh svg { width: 15px; height: 15px; transition: transform 0.5s ease; }
.btn-refresh:hover {
  background: var(--accent);
  color: var(--btn-text);
  box-shadow: 0 4px 16px var(--accent-glow);
}
.btn-refresh.loading svg { animation: spin 1s linear infinite; }
@keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }

/* ===== 面板 ===== */
.panels { position: relative; }
.panel {
  display: none;
  animation: panelIn 0.4s cubic-bezier(0.22, 1, 0.36, 1);
}
.panel.active { display: block; }
@keyframes panelIn {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}

/* ===== 卡片 —— 半透明毛玻璃报纸质感 ===== */
.card {
  position: relative;
  background: var(--card-bg);
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px);
  border: 1px solid var(--card-border);
  border-radius: var(--radius);
  padding: 24px;
  margin-bottom: 20px;
  transition: all 0.3s cubic-bezier(0.22, 1, 0.36, 1);
  overflow: hidden;
}
.card:hover {
  border-color: var(--card-border-hover);
  transform: translateY(-2px);
  box-shadow: 0 8px 32px var(--shadow-hover);
}
.card-dot {
  position: absolute;
  top: 20px;
  left: 20px;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--accent);
  box-shadow: 0 0 6px var(--accent-glow);
  transition: all 0.3s ease;
}
.card:hover .card-dot {
  box-shadow: 0 0 12px var(--accent-glow);
  transform: scale(1.3);
}
.card-label {
  font-size: 12px;
  color: var(--text-secondary);
  text-transform: uppercase;
  letter-spacing: 1.5px;
  font-family: var(--font-mono);
  margin-bottom: 16px;
  padding-left: 16px;
}

/* 网格 */
.grid-2 {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
  gap: 20px;
  margin-bottom: 20px;
}
.grid-2 .card { margin-bottom: 0; }
.grid-3 {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 20px;
  margin-bottom: 20px;
}
.grid-3 .card { margin-bottom: 0; text-align: center; padding: 28px 20px; }

/* ===== 博士进度大卡 ===== */
.card-phd { text-align: center; }
.phd-big {
  display: flex;
  align-items: baseline;
  justify-content: center;
  margin: 8px 0 20px;
}
.phd-num {
  font-family: var(--font-mono);
  font-size: 64px;
  font-weight: 500;
  color: var(--accent);
  line-height: 1;
}
.phd-unit {
  font-size: 24px;
  color: var(--accent);
  opacity: 0.7;
  margin-left: 4px;
  font-family: var(--font-mono);
}
.phd-bar {
  height: 8px;
  background: var(--surface-3);
  border-radius: 4px;
  overflow: hidden;
  margin: 0 auto 16px;
  max-width: 360px;
}
.phd-bar-fill {
  height: 100%;
  background: linear-gradient(90deg, var(--accent), var(--progress-end));
  border-radius: 4px;
  width: 0%;
  transition: width 1.8s cubic-bezier(0.22, 1, 0.36, 1);
  position: relative;
}
.phd-bar-fill::after {
  content: '';
  position: absolute;
  right: 0;
  top: 0;
  bottom: 0;
  width: 30px;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,0.4));
  animation: barShine 2s ease-in-out infinite;
}
@keyframes barShine {
  0%, 100% { opacity: 0; transform: translateX(-10px); }
  50% { opacity: 1; transform: translateX(0); }
}
.phd-meta {
  display: flex;
  justify-content: center;
  gap: 24px;
  font-size: 12px;
  color: var(--text-muted);
  font-family: var(--font-mono);
}
.phd-days {
  margin-top: 12px;
  font-size: 13px;
  color: var(--text-secondary);
}
.phd-days strong { color: var(--amber); font-family: var(--font-mono); }

/* ===== 统计卡 ===== */
.stat-num {
  font-family: var(--font-mono);
  font-size: 36px;
  font-weight: 500;
  color: var(--text);
  line-height: 1.2;
}
.stat-label {
  font-size: 12px;
  color: var(--text-secondary);
  margin-top: 6px;
  letter-spacing: 0.5px;
}

/* ===== 待办 ===== */
.todo-mini { display: flex; flex-direction: column; gap: 10px; margin-bottom: 16px; }
.todo-mini-item {
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 13px;
  color: var(--text-secondary);
  padding: 6px 0;
  border-bottom: 1px solid var(--surface-1);
}
.todo-mini-item:last-child { border-bottom: none; }
.todo-mini-check {
  width: 16px;
  height: 16px;
  border: 1.5px solid var(--checkbox-empty);
  border-radius: 4px;
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
}
.todo-mini-item.done .todo-mini-check {
  background: var(--accent);
  border-color: var(--accent);
}
.todo-mini-item.done .todo-mini-text { text-decoration: line-through; color: var(--text-muted); }

.todo-input-row {
  display: flex;
  gap: 10px;
  margin-bottom: 20px;
}
.todo-input {
  flex: 1;
  padding: 11px 16px;
  background: var(--input-bg);
  border: 1px solid var(--card-border);
  border-radius: var(--radius-sm);
  color: var(--text);
  font-family: var(--font-sans);
  font-size: 14px;
  outline: none;
  transition: all 0.25s ease;
}
.todo-input:focus {
  border-color: var(--accent);
  box-shadow: 0 0 0 3px var(--accent-dim);
}
.todo-input::placeholder { color: var(--text-muted); }

.btn-primary {
  padding: 11px 24px;
  background: var(--accent);
  border: none;
  border-radius: var(--radius-sm);
  color: var(--btn-text);
  font-family: var(--font-sans);
  font-size: 14px;
  font-weight: 600;
  cursor: pointer;
  transition: all 0.25s ease;
  white-space: nowrap;
}
.btn-primary:hover {
  opacity: 0.9;
  box-shadow: 0 4px 16px var(--accent-glow);
  transform: translateY(-1px);
}
.btn-primary:active { transform: translateY(0); }

.btn-goto {
  background: transparent;
  border: none;
  color: var(--accent);
  font-size: 13px;
  font-family: var(--font-sans);
  cursor: pointer;
  padding: 4px 0;
  transition: all 0.2s ease;
  display: inline-flex;
  align-items: center;
  gap: 4px;
}
.btn-goto:hover { gap: 8px; opacity: 0.8; }
.btn-goto::after { content: '→'; transition: transform 0.2s ease; }

/* 概览界面：待办 + 工作日志并排 */
.dashboard-todos-and-journal {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 20px;
  margin: 8px 0;
}
.dashboard-section-title {
  font-size: 12px;
  color: var(--text-muted);
  margin-bottom: 8px;
  font-weight: 500;
}
.todo-list { display: flex; flex-direction: column; gap: 8px; }
.todo-item {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 14px 16px;
  background: var(--surface-1);
  border: 1px solid var(--card-border);
  border-radius: var(--radius-sm);
  transition: all 0.25s ease;
  animation: todoIn 0.3s ease;
}
@keyframes todoIn {
  from { opacity: 0; transform: translateX(-10px); }
  to { opacity: 1; transform: translateX(0); }
}
.todo-item:hover {
  background: var(--accent-dim);
  border-color: var(--accent);
}
.todo-check {
  width: 20px;
  height: 20px;
  border: 2px solid var(--checkbox-empty);
  border-radius: 5px;
  cursor: pointer;
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: all 0.2s ease;
  background: transparent;
}
.todo-check:hover { border-color: var(--accent); }
.todo-item.done .todo-check {
  background: var(--accent);
  border-color: var(--accent);
}
.todo-item.done .todo-check::after {
  content: '';
  width: 5px;
  height: 9px;
  border: solid var(--btn-text);
  border-width: 0 2px 2px 0;
  transform: rotate(45deg) translateY(-1px);
}
.todo-text {
  flex: 1;
  font-size: 14px;
  color: var(--text);
  transition: all 0.2s ease;
}
.todo-item.done .todo-text {
  text-decoration: line-through;
  color: var(--text-muted);
}
.todo-delete {
  background: transparent;
  border: none;
  color: var(--text-muted);
  cursor: pointer;
  padding: 4px 8px;
  border-radius: 4px;
  font-size: 16px;
  transition: all 0.2s ease;
  opacity: 0;
}
.todo-item:hover .todo-delete { opacity: 1; }
.todo-delete:hover { color: var(--danger); background: var(--danger-dim); }

/* ===== 资讯 ===== */
.news-tabs {
  display: flex;
  gap: 8px;
  margin-bottom: 20px;
  flex-wrap: wrap;
}
.news-tab {
  padding: 8px 18px;
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: 20px;
  color: var(--text-secondary);
  font-family: var(--font-sans);
  font-size: 13px;
  cursor: pointer;
  transition: all 0.25s ease;
  white-space: nowrap;
}
.news-tab:hover { border-color: var(--card-border-hover); color: var(--text); }
.news-tab.active {
  background: var(--accent-dim);
  border-color: var(--accent);
  color: var(--accent);
}

.news-list { display: flex; flex-direction: column; gap: 12px; }
.news-item {
  padding: 18px 22px;
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-left: 3px solid transparent;
  border-radius: var(--radius-sm);
  cursor: pointer;
  transition: all 0.3s cubic-bezier(0.22, 1, 0.36, 1);
  animation: newsIn 0.4s ease backwards;
}
@keyframes newsIn {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: translateY(0); }
}
.news-item:hover {
  border-left-color: var(--accent);
  background: var(--accent-dim);
  transform: translateX(4px);
}
.news-title {
  font-size: 15px;
  font-weight: 500;
  color: var(--text);
  margin-bottom: 6px;
  line-height: 1.5;
}
.news-item:hover .news-title { color: var(--accent); }
.news-meta {
  display: flex;
  gap: 14px;
  font-size: 12px;
  color: var(--text-muted);
  font-family: var(--font-mono);
}
.news-summary {
  font-size: 13px;
  color: var(--text-secondary);
  margin-top: 8px;
  line-height: 1.6;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* ===== 文件夹 ===== */
.sections-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 16px;
}
.section-card {
  padding: 22px;
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: var(--radius);
  cursor: pointer;
  transition: all 0.3s cubic-bezier(0.22, 1, 0.36, 1);
  position: relative;
  overflow: hidden;
}
.section-card::before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 2px;
  background: linear-gradient(90deg, var(--accent), transparent);
  opacity: 0;
  transition: opacity 0.3s ease;
}
.section-card:hover {
  border-color: var(--card-border-hover);
  transform: translateY(-3px);
  box-shadow: 0 12px 40px var(--shadow-hover);
}
.section-card:hover::before { opacity: 1; }
.section-icon {
  width: 40px;
  height: 40px;
  background: var(--accent-dim);
  border-radius: 10px;
  display: flex;
  align-items: center;
  justify-content: center;
  margin-bottom: 14px;
  color: var(--accent);
  transition: all 0.3s ease;
}
.section-card:hover .section-icon {
  transform: scale(1.1) rotate(-5deg);
}
.section-icon svg { width: 20px; height: 20px; }
.section-name {
  font-size: 15px;
  font-weight: 600;
  color: var(--text);
  margin-bottom: 4px;
}
.section-path {
  font-size: 11px;
  color: var(--text-muted);
  font-family: var(--font-mono);
  margin-bottom: 10px;
}
.section-stats {
  display: flex;
  gap: 16px;
  font-size: 12px;
  color: var(--text-secondary);
}
.section-stats span { font-family: var(--font-mono); color: var(--accent); }

/* ===== 研究日志 ===== */
.journal-mini { display: flex; flex-direction: column; gap: 12px; }
.journal-mini-item {
  padding: 12px 16px;
  background: var(--surface-1);
  border-radius: var(--radius-sm);
  border-left: 2px solid var(--accent);
}
.journal-mini-date {
  font-size: 11px;
  color: var(--text-muted);
  font-family: var(--font-mono);
  margin-bottom: 4px;
}
.journal-mini-text {
  font-size: 13px;
  color: var(--text-secondary);
  line-height: 1.6;
}

.journal-input-row {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.journal-input {
  width: 100%;
  padding: 14px 16px;
  background: var(--input-bg);
  border: 1px solid var(--card-border);
  border-radius: var(--radius-sm);
  color: var(--text);
  font-family: var(--font-sans);
  font-size: 14px;
  outline: none;
  resize: vertical;
  transition: all 0.25s ease;
  line-height: 1.6;
}
.journal-input:focus {
  border-color: var(--accent);
  box-shadow: 0 0 0 3px var(--accent-dim);
}
.journal-input::placeholder { color: var(--text-muted); }

.journal-list { display: flex; flex-direction: column; gap: 12px; margin-top: 20px; }
.journal-item {
  padding: 20px 24px;
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: var(--radius);
  animation: journalIn 0.4s ease backwards;
}
@keyframes journalIn {
  from { opacity: 0; transform: translateY(10px); }
  to { opacity: 1; transform: translateY(0); }
}
.journal-date {
  font-size: 12px;
  color: var(--accent);
  font-family: var(--font-mono);
  margin-bottom: 8px;
  letter-spacing: 0.5px;
}
.journal-text {
  font-size: 14px;
  color: var(--text);
  line-height: 1.7;
  white-space: pre-wrap;
}

/* ============================================================
   文献工具面板
   ============================================================ */

/* 子标签页 */
.lit-tabs {
  display: flex;
  gap: 6px;
  margin-bottom: 24px;
  background: var(--surface-1);
  padding: 5px;
  border-radius: 12px;
  width: fit-content;
}
.lit-tab {
  padding: 8px 18px;
  background: transparent;
  border: none;
  border-radius: 8px;
  color: var(--text-secondary);
  font-family: var(--font-sans);
  font-size: 13px;
  cursor: pointer;
  transition: all 0.25s ease;
  white-space: nowrap;
}
.lit-tab:hover { color: var(--text); }
.lit-tab.active {
  background: var(--card-bg);
  color: var(--accent);
  box-shadow: 0 2px 8px var(--shadow-color);
  font-weight: 600;
}

.lit-subpanel { display: none; }
.lit-subpanel.active { display: block; animation: panelIn 0.3s ease; }

/* 搜索框 */
.lit-search {
  width: 100%;
  max-width: 480px;
  padding: 11px 16px 11px 42px;
  background: var(--input-bg);
  border: 1px solid var(--card-border);
  border-radius: var(--radius-sm);
  color: var(--text);
  font-family: var(--font-sans);
  font-size: 14px;
  outline: none;
  transition: all 0.25s ease;
  margin-bottom: 20px;
}
.lit-search:focus {
  border-color: var(--accent);
  box-shadow: 0 0 0 3px var(--accent-dim);
}
.lit-search-wrap { position: relative; display: inline-block; width: 100%; max-width: 480px; }
.lit-search-wrap svg {
  position: absolute;
  left: 14px;
  top: 50%;
  transform: translateY(-50%);
  width: 16px;
  height: 16px;
  color: var(--text-muted);
  margin-bottom: 20px;
}

/* 期刊地图 */
.journal-filters {
  display: flex;
  gap: 8px;
  margin-bottom: 20px;
  flex-wrap: wrap;
}
.journal-filter {
  padding: 6px 14px;
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: 16px;
  color: var(--text-secondary);
  font-size: 12px;
  font-family: var(--font-sans);
  cursor: pointer;
  transition: all 0.2s ease;
}
.journal-filter:hover { border-color: var(--accent); color: var(--text); }
.journal-filter.active {
  background: var(--accent-dim);
  border-color: var(--accent);
  color: var(--accent);
}

.journal-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: 14px;
}
.journal-card {
  padding: 18px 20px;
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: var(--radius);
  transition: all 0.25s ease;
  cursor: default;
}
.journal-card:hover {
  border-color: var(--accent);
  transform: translateY(-2px);
  box-shadow: 0 6px 24px var(--shadow-hover);
}
.journal-card-head {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 10px;
  margin-bottom: 8px;
}
.journal-name {
  font-size: 15px;
  font-weight: 600;
  color: var(--text);
  line-height: 1.4;
}
.journal-name a { color: inherit; text-decoration: none; }
.journal-name a:hover { color: var(--accent); }
.journal-layer-tag {
  flex-shrink: 0;
  padding: 3px 8px;
  background: var(--accent-dim);
  color: var(--accent);
  font-size: 10px;
  font-family: var(--font-mono);
  border-radius: 6px;
  white-space: nowrap;
}
.journal-publisher {
  font-size: 12px;
  color: var(--text-muted);
  margin-bottom: 8px;
}
.journal-metrics {
  display: flex;
  gap: 16px;
  font-size: 12px;
  color: var(--text-secondary);
  font-family: var(--font-mono);
  margin-bottom: 8px;
}
.journal-metrics strong { color: var(--accent); font-weight: 500; }
.journal-scope {
  font-size: 12px;
  color: var(--text-secondary);
  line-height: 1.5;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* 术语表 */
.glossary-list { display: flex; flex-direction: column; gap: 10px; }
.glossary-item {
  padding: 16px 20px;
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: var(--radius-sm);
  transition: all 0.2s ease;
}
.glossary-item:hover { border-color: var(--accent); background: var(--accent-dim); }
.glossary-term {
  font-size: 15px;
  font-weight: 600;
  color: var(--accent);
  font-family: var(--font-mono);
  margin-bottom: 4px;
}
.glossary-full {
  font-size: 12px;
  color: var(--text-muted);
  font-family: var(--font-mono);
  margin-bottom: 6px;
}
.glossary-zh {
  font-size: 13px;
  color: var(--text);
  font-weight: 500;
  margin-bottom: 4px;
}
.glossary-explain {
  font-size: 13px;
  color: var(--text-secondary);
  line-height: 1.6;
}

/* 检索式库 */
.query-list { display: flex; flex-direction: column; gap: 14px; }
.query-item {
  padding: 18px 20px;
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: var(--radius);
  transition: all 0.2s ease;
}
.query-item:hover { border-color: var(--accent); }
.query-label {
  font-size: 14px;
  font-weight: 600;
  color: var(--text);
  margin-bottom: 8px;
}
.query-code {
  background: var(--surface-1);
  border: 1px solid var(--card-border);
  border-radius: 8px;
  padding: 12px 14px;
  font-family: var(--font-mono);
  font-size: 12px;
  color: var(--text-secondary);
  line-height: 1.6;
  word-break: break-all;
  margin-bottom: 10px;
  position: relative;
}
.query-meta {
  display: flex;
  gap: 16px;
  align-items: center;
  font-size: 12px;
  color: var(--text-muted);
  font-family: var(--font-mono);
}
.query-meta .count { color: var(--accent); font-weight: 500; }
.btn-copy {
  padding: 5px 12px;
  background: var(--accent-dim);
  border: 1px solid var(--accent);
  border-radius: 6px;
  color: var(--accent);
  font-size: 11px;
  font-family: var(--font-sans);
  cursor: pointer;
  transition: all 0.2s ease;
  margin-left: auto;
}
.btn-copy:hover { background: var(--accent); color: var(--btn-text); }
.query-purpose {
  font-size: 12px;
  color: var(--text-secondary);
  margin-top: 6px;
  line-height: 1.5;
}

/* ============================================================
   天气卡片
   ============================================================ */
.card-weather { margin-bottom: 20px; overflow: hidden; }
.card-weather:not(.expanded) { padding-bottom: 12px; }
.card-weather .card-label {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 4px;
}
.card-weather:not(.expanded) .card-label {
  margin-bottom: 0;
}
.weather-toggle-btn {
  background: none;
  border: none;
  cursor: pointer;
  padding: 4px;
  color: var(--text-secondary);
  border-radius: 6px;
  transition: all 0.2s;
  display: flex;
  align-items: center;
  justify-content: center;
}
.weather-toggle-btn:hover {
  color: var(--accent);
  background: var(--card-bg-alt);
}
.weather-toggle-btn svg {
  width: 16px;
  height: 16px;
  transition: transform 0.3s ease;
}
.card-weather.expanded .weather-toggle-btn svg {
  transform: rotate(180deg);
}

/* 收起状态：紧凑横条 */
.weather-compact {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 6px 0 2px;
  font-size: 14px;
  cursor: pointer;
  transition: background 0.2s;
  user-select: none;
}
.weather-compact:hover { background: transparent; }
.weather-compact-icon { font-size: 22px; flex-shrink: 0; }
.weather-compact-temp {
  font-size: 20px;
  font-weight: 300;
  color: var(--text-primary);
  flex-shrink: 0;
}
.weather-compact-desc {
  color: var(--text-primary);
  font-weight: 500;
  flex-shrink: 0;
}
.weather-compact-range {
  color: var(--text-secondary);
  font-size: 13px;
  flex-shrink: 0;
}
.weather-compact-aqi {
  margin-left: auto;
  font-size: 11px;
  padding: 2px 8px;
  border-radius: 10px;
  font-weight: 500;
  flex-shrink: 0;
}

/* 展开状态内容 */
.weather-content {
  overflow: hidden;
  animation: weatherExpand 0.3s ease;
}
@keyframes weatherExpand {
  from { opacity: 0; max-height: 0; }
  to { opacity: 1; max-height: 2000px; }
}
.weather-loading {
  padding: 24px;
  text-align: center;
  color: var(--text-secondary);
  font-size: 14px;
}
.weather-main {
  display: flex;
  gap: 32px;
  padding: 20px 24px 24px;
  align-items: flex-start;
}
.weather-temp-block { flex: 0 0 auto; }
.weather-temp {
  font-size: 64px;
  font-weight: 200;
  line-height: 1;
  letter-spacing: -2px;
  color: var(--text-primary);
}
.weather-temp::after {
  content: '°C';
  font-size: 24px;
  font-weight: 300;
  vertical-align: top;
  margin-left: 2px;
  color: var(--text-secondary);
}
.weather-desc {
  font-size: 18px;
  font-weight: 500;
  color: var(--text-primary);
  margin-top: 8px;
}
.weather-feels {
  font-size: 13px;
  color: var(--text-secondary);
  margin-top: 4px;
}
.weather-details {
  flex: 1;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 12px 16px;
}
.weather-detail-item {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 13px;
}
.weather-detail-icon { font-size: 16px; flex-shrink: 0; }
.weather-detail-label {
  color: var(--text-secondary);
  flex-shrink: 0;
  min-width: 48px;
}
.weather-detail-value {
  color: var(--text-primary);
  font-weight: 500;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* 3天预报 */
.weather-forecast {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1px;
  background: var(--card-border);
  border-top: 1px solid var(--card-border);
}
.weather-forecast-day {
  background: var(--card-bg);
  padding: 16px;
  text-align: center;
  transition: background 0.2s;
}
.weather-forecast-day:hover { background: var(--card-bg-hover); }
.weather-forecast-date {
  font-size: 12px;
  color: var(--text-secondary);
  margin-bottom: 8px;
}
.weather-forecast-date.today { color: var(--accent); font-weight: 600; }
.weather-forecast-icon { font-size: 28px; margin-bottom: 8px; }
.weather-forecast-temp {
  font-size: 15px;
  font-weight: 600;
  color: var(--text-primary);
}
.weather-forecast-temp .low { color: var(--text-secondary); font-weight: 400; }
.weather-forecast-desc {
  font-size: 12px;
  color: var(--text-secondary);
  margin-top: 4px;
}
.weather-forecast-precip {
  font-size: 11px;
  color: var(--accent);
  margin-top: 4px;
}

/* 底部：空气质量 + 指数 */
.weather-bottom {
  display: flex;
  gap: 16px;
  padding: 16px 24px 20px;
  border-top: 1px solid var(--card-border);
}
.weather-aqi {
  flex: 0 0 140px;
  text-align: center;
  padding: 12px;
  border-radius: 10px;
  background: var(--card-bg-alt);
}
.weather-aqi-label {
  font-size: 11px;
  color: var(--text-secondary);
  margin-bottom: 4px;
}
.weather-aqi-value {
  font-size: 32px;
  font-weight: 600;
  line-height: 1;
}
.weather-aqi-category {
  font-size: 13px;
  font-weight: 500;
  margin-top: 4px;
}
.weather-indices {
  flex: 1;
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  align-content: flex-start;
}
.weather-index-tag {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 12px;
  border-radius: 20px;
  font-size: 12px;
  background: var(--card-bg-alt);
  border: 1px solid var(--card-border);
  transition: all 0.2s;
}
.weather-index-tag:hover { border-color: var(--accent); }
.weather-index-name { color: var(--text-secondary); }
.weather-index-category { font-weight: 600; }

/* 预警 */
.weather-alerts {
  border-top: 1px solid var(--card-border);
  padding: 0;
}
.weather-alert-item {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 12px 24px;
  font-size: 13px;
  border-bottom: 1px solid var(--card-border);
}
.weather-alert-item:last-child { border-bottom: none; }
.weather-alert-badge {
  flex-shrink: 0;
  padding: 3px 10px;
  border-radius: 4px;
  font-size: 11px;
  font-weight: 600;
  color: #fff;
}
.weather-alert-event { font-weight: 600; color: var(--text-primary); }
.weather-alert-sender { color: var(--text-secondary); font-size: 12px; }

/* 天气详情模态框 */
.weather-modal {
  display: none;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 1000;
  align-items: center;
  justify-content: center;
}
.weather-modal.active {
  display: flex;
  animation: weatherModalFadeIn 0.2s ease;
}
@keyframes weatherModalFadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}
.weather-modal-overlay {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.5);
  backdrop-filter: blur(4px);
}
.weather-modal-content {
  position: relative;
  background: var(--card-bg);
  border-radius: 16px;
  width: 90%;
  max-width: 720px;
  max-height: 85vh;
  overflow-y: auto;
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
  animation: weatherModalSlideUp 0.3s cubic-bezier(0.22, 1, 0.36, 1);
}
@keyframes weatherModalSlideUp {
  from { transform: translateY(20px); opacity: 0; }
  to { transform: translateY(0); opacity: 1; }
}
.weather-modal-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 20px 24px;
  border-bottom: 1px solid var(--card-border);
  position: sticky;
  top: 0;
  background: var(--card-bg);
  z-index: 1;
}
.weather-modal-title {
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 16px;
  font-weight: 600;
  color: var(--text-primary);
}
.weather-modal-icon { font-size: 24px; }
.weather-modal-close {
  background: none;
  border: none;
  cursor: pointer;
  padding: 6px;
  color: var(--text-secondary);
  border-radius: 8px;
  transition: all 0.2s;
  display: flex;
  align-items: center;
  justify-content: center;
}
.weather-modal-close:hover {
  color: var(--text-primary);
  background: var(--card-bg-alt);
}
.weather-modal-close svg { width: 20px; height: 20px; }
.weather-modal-body {
  padding: 0;
}
.weather-modal-body .weather-main { padding: 24px; }
.weather-modal-body .weather-bottom { padding: 16px 24px 20px; }
.weather-modal-footer {
  padding: 12px 24px;
  border-top: 1px solid var(--card-border);
  font-size: 11px;
  color: var(--text-secondary);
  text-align: center;
}

/* 响应式 */
@media (max-width: 768px) {
  .weather-main { flex-direction: column; gap: 20px; }
  .weather-details { grid-template-columns: repeat(2, 1fr); }
  .weather-bottom { flex-direction: column; }
  .weather-aqi { flex: none; }
}

/* ============================================================
   毕业条件 & 论文管理
   ============================================================ */
.card-graduation { margin-bottom: 20px; }

/* 紧凑版（放在 grid-2 右边） */
.card-graduation-compact { display: flex; flex-direction: column; }
.grad-compact-top {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-top: 8px;
}
.grad-compact-info {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
}
.grad-compact-name {
  font-size: 13px;
  font-weight: 600;
  color: var(--text-secondary);
}
.grad-compact-count {
  display: flex;
  align-items: baseline;
  gap: 2px;
}
.grad-compact-num {
  font-size: 32px;
  font-weight: 200;
  color: var(--accent);
  line-height: 1;
}
.grad-compact-sep {
  font-size: 18px;
  font-weight: 200;
  color: var(--text-secondary);
}
.grad-compact-total {
  font-size: 18px;
  font-weight: 200;
  color: var(--text-secondary);
}
.grad-compact-hint {
  font-size: 11px;
  color: var(--text-secondary);
}
.grad-compact-bottom {
  margin-top: 12px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  flex: 1;
}

/* 毕业条件通用样式 */
.graduation-bar {
  height: 6px;
  background: var(--surface-2);
  border-radius: 3px;
  overflow: hidden;
}
.graduation-bar-fill {
  height: 100%;
  background: linear-gradient(90deg, var(--accent), var(--progress-end));
  border-radius: 3px;
  width: 0;
  transition: width 0.8s cubic-bezier(0.22, 1, 0.36, 1);
}
.graduation-add-btn {
  align-self: flex-start;
  padding: 8px 18px;
  background: var(--accent-dim);
  border: 1px solid var(--accent);
  border-radius: 20px;
  color: var(--accent);
  font-size: 13px;
  font-family: var(--font-sans);
  cursor: pointer;
  transition: all 0.2s ease;
  white-space: nowrap;
}
.graduation-add-btn:hover {
  background: var(--accent);
  color: var(--btn-text);
}

/* 论文列表 */
.pub-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
  flex: 1;
}

/* 今日待办（占满宽度） */
.card-todos-dashboard { margin-bottom: 20px; }
.todo-mini-wide {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 8px;
}
.pub-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 10px 14px;
  background: var(--surface-1);
  border: 1px solid var(--card-border);
  border-radius: 8px;
  transition: all 0.2s ease;
}
.pub-item:hover { border-color: var(--accent); }
.pub-info {
  display: flex;
  align-items: center;
  gap: 12px;
  flex: 1;
  min-width: 0;
}
.pub-title {
  font-size: 13px;
  font-weight: 600;
  color: var(--text);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.pub-journal {
  font-size: 12px;
  color: var(--accent);
  background: var(--accent-dim);
  padding: 2px 8px;
  border-radius: 10px;
  flex-shrink: 0;
}
.pub-date {
  font-size: 11px;
  color: var(--text-muted);
  font-family: var(--font-mono);
  flex-shrink: 0;
}
.pub-delete {
  background: transparent;
  border: none;
  color: var(--text-muted);
  cursor: pointer;
  font-size: 16px;
  padding: 4px 8px;
  border-radius: 4px;
  transition: all 0.2s ease;
  opacity: 0;
}
.pub-item:hover .pub-delete { opacity: 1; }
.pub-delete:hover { color: var(--danger); background: var(--danger-dim); }
.pub-empty {
  font-size: 12px;
  color: var(--text-muted);
  text-align: center;
  padding: 8px 0;
}

/* 日志删除按钮 */
.journal-delete-btn {
  background: transparent;
  border: none;
  color: var(--text-muted);
  cursor: pointer;
  font-size: 16px;
  padding: 2px 8px;
  border-radius: 4px;
  transition: all 0.2s ease;
  opacity: 0;
  margin-left: auto;
}
.journal-card:hover .journal-delete-btn { opacity: 1; }
.journal-delete-btn:hover { color: var(--danger); background: var(--danger-dim); }

/* ============================================================
   重设计：卡片式待办 + 时间线日志
   ============================================================ */

/* ===== 待办面板：卡片式 ===== */
.todo-board { display: flex; flex-direction: column; gap: 24px; }

.todo-group { display: flex; flex-direction: column; gap: 10px; }

.todo-group-header {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 0 4px;
  cursor: pointer;
  user-select: none;
}
.todo-group-title {
  font-size: 13px;
  font-weight: 600;
  color: var(--text-secondary);
  text-transform: uppercase;
  letter-spacing: 1px;
  font-family: var(--font-mono);
}
.todo-group-count {
  background: var(--surface-2);
  color: var(--text-secondary);
  font-size: 11px;
  font-family: var(--font-mono);
  padding: 2px 8px;
  border-radius: 10px;
  min-width: 20px;
  text-align: center;
}
.todo-group-toggle {
  margin-left: auto;
  color: var(--text-muted);
  font-size: 12px;
  transition: transform 0.25s ease;
}
.todo-group.collapsed .todo-group-toggle { transform: rotate(-90deg); }
.todo-group.collapsed .todo-group-body { display: none; }
.todo-group-body { display: flex; flex-direction: column; gap: 10px; }

.todo-card {
  display: flex;
  align-items: stretch;
  gap: 0;
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: var(--radius);
  overflow: hidden;
  transition: all 0.25s cubic-bezier(0.22, 1, 0.36, 1);
  animation: todoIn 0.3s ease;
}
.todo-card:hover {
  border-color: var(--accent);
  transform: translateY(-2px);
  box-shadow: 0 6px 24px var(--shadow-hover);
}
.todo-priority-bar {
  width: 4px;
  flex-shrink: 0;
  background: var(--text-muted);
}
.todo-priority-bar.high { background: var(--danger); }
.todo-priority-bar.medium { background: var(--amber); }
.todo-priority-bar.low { background: var(--text-muted); }

.todo-card-body {
  flex: 1;
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 16px 18px;
  min-width: 0;
}
.todo-card-check {
  width: 22px;
  height: 22px;
  border: 2px solid var(--checkbox-empty);
  border-radius: 6px;
  cursor: pointer;
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: all 0.2s ease;
  background: transparent;
}
.todo-card-check:hover { border-color: var(--accent); }
.todo-card.done .todo-card-check {
  background: var(--accent);
  border-color: var(--accent);
}
.todo-card.done .todo-card-check::after {
  content: '';
  width: 5px;
  height: 9px;
  border: solid var(--btn-text);
  border-width: 0 2px 2px 0;
  transform: rotate(45deg) translateY(-1px);
}
.todo-card-content { flex: 1; min-width: 0; }
.todo-card-text {
  font-size: 14px;
  color: var(--text);
  line-height: 1.5;
  transition: all 0.2s ease;
  word-break: break-word;
}
.todo-card.done .todo-card-text {
  text-decoration: line-through;
  color: var(--text-muted);
}
.todo-card-meta {
  display: flex;
  gap: 12px;
  margin-top: 4px;
  font-size: 11px;
  color: var(--text-muted);
  font-family: var(--font-mono);
}
.todo-priority-tag {
  padding: 1px 7px;
  border-radius: 4px;
  font-size: 10px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.5px;
}
.todo-priority-tag.high { background: var(--danger-dim); color: var(--danger); }
.todo-priority-tag.medium { background: var(--amber-dim); color: var(--amber); }
.todo-priority-tag.low { background: var(--surface-2); color: var(--text-muted); }

.todo-card-actions {
  display: flex;
  align-items: center;
  gap: 4px;
  padding-right: 14px;
}
.todo-card-delete {
  background: transparent;
  border: none;
  color: var(--text-muted);
  cursor: pointer;
  padding: 6px 10px;
  border-radius: 6px;
  font-size: 16px;
  transition: all 0.2s ease;
  opacity: 0;
}
.todo-card:hover .todo-card-delete { opacity: 1; }
.todo-card-delete:hover { color: var(--danger); background: var(--danger-dim); }

.todo-empty {
  text-align: center;
  padding: 48px 20px;
  color: var(--text-muted);
}
.todo-empty-icon { font-size: 40px; margin-bottom: 12px; opacity: 0.3; }
.todo-empty-text { font-size: 14px; color: var(--text-secondary); }

/* ===== 研究日志：时间线 ===== */
.journal-timeline {
  position: relative;
  padding-left: 32px;
}
.journal-timeline::before {
  content: '';
  position: absolute;
  left: 11px;
  top: 8px;
  bottom: 8px;
  width: 2px;
  background: linear-gradient(180deg, var(--accent), var(--card-border));
  border-radius: 1px;
}

.timeline-item {
  position: relative;
  margin-bottom: 20px;
  animation: journalIn 0.4s ease backwards;
}
.timeline-dot {
  position: absolute;
  left: -32px;
  top: 20px;
  width: 12px;
  height: 12px;
  background: var(--card-bg);
  border: 2.5px solid var(--accent);
  border-radius: 50%;
  z-index: 1;
  transition: all 0.25s ease;
}
.timeline-item:hover .timeline-dot {
  background: var(--accent);
  box-shadow: 0 0 0 4px var(--accent-dim);
}

.journal-card {
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: var(--radius);
  padding: 20px 22px;
  transition: all 0.25s cubic-bezier(0.22, 1, 0.36, 1);
}
.journal-card:hover {
  border-color: var(--accent);
  transform: translateX(4px);
  box-shadow: -4px 0 20px var(--accent-dim);
}
.journal-card-head {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 10px;
}
.journal-card-date {
  font-size: 13px;
  font-weight: 600;
  color: var(--accent);
  font-family: var(--font-mono);
  letter-spacing: 0.5px;
}
.journal-type-tag {
  padding: 2px 10px;
  background: var(--accent-dim);
  color: var(--accent);
  font-size: 11px;
  font-family: var(--font-sans);
  border-radius: 10px;
  font-weight: 500;
}
.journal-type-tag.日常 { background: var(--surface-2); color: var(--text-secondary); }
.journal-type-tag.想法 { background: var(--amber-dim); color: var(--amber); }
.journal-type-tag.问题 { background: var(--danger-dim); color: var(--danger); }
.journal-type-tag.进展 { background: rgba(5,150,105,0.1); color: var(--progress-end); }

.journal-card-text {
  font-size: 14px;
  color: var(--text);
  line-height: 1.75;
  white-space: pre-wrap;
  word-break: break-word;
}

.journal-filters {
  display: flex;
  gap: 8px;
  margin-bottom: 20px;
  flex-wrap: wrap;
}
.journal-filter {
  padding: 6px 14px;
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: 16px;
  color: var(--text-secondary);
  font-size: 12px;
  font-family: var(--font-sans);
  cursor: pointer;
  transition: all 0.2s ease;
}
.journal-filter:hover { border-color: var(--accent); color: var(--text); }
.journal-filter.active {
  background: var(--accent-dim);
  border-color: var(--accent);
  color: var(--accent);
  font-weight: 600;
}

/* ===== Toast ===== */
.toast {
  position: fixed;
  bottom: 32px;
  left: 50%;
  transform: translateX(-50%) translateY(20px);
  padding: 12px 24px;
  background: var(--toast-bg);
  border: 1px solid var(--card-border-hover);
  border-radius: 12px;
  color: var(--text);
  font-size: 14px;
  z-index: 100;
  opacity: 0;
  pointer-events: none;
  transition: all 0.3s cubic-bezier(0.22, 1, 0.36, 1);
  box-shadow: 0 8px 32px var(--shadow-hover);
}
.toast.show {
  opacity: 1;
  transform: translateX(-50%) translateY(0);
}

/* ===== 响应式 ===== */
@media (max-width: 900px) {
  .sidebar {
    width: 72px;
    padding: 20px 12px;
  }
  .brand-text, .nav-item span, .nav-badge, .sidebar-footer { display: none; }
  .nav-item { justify-content: center; padding: 12px; }
  .main { margin-right: 72px; padding: 0 20px 40px; }
  .phd-num { font-size: 48px; }
  .lit-tabs { overflow-x: auto; width: 100%; }
}
@media (max-width: 600px) {
  .topbar { flex-direction: column; align-items: flex-start; gap: 12px; }
  .topbar-right { width: 100%; justify-content: space-between; }
  .grid-2, .grid-3 { grid-template-columns: 1fr; }
  .phd-meta { flex-direction: column; gap: 4px; }
  .journal-grid { grid-template-columns: 1fr; }
}

/* ===== 减少动画偏好 ===== */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}

/* ============================================================
   PDF 转写面板
   ============================================================ */
/* display:flex/block 会覆盖 HTML hidden 属性，显式兜底 */
#pdfFileInfo[hidden], #pdfProgressCard[hidden], #pdfResultCard[hidden], #pdfErrorBox[hidden] { display: none !important; }

/* 上传拖拽区 */
.pdf-dropzone {
  margin-top: 12px;
  border: 1.5px dashed var(--card-border);
  border-radius: var(--radius);
  background: var(--input-bg);
  padding: 28px 20px;
  text-align: center;
  cursor: pointer;
  transition: border-color .18s ease, background .18s ease;
}
.pdf-dropzone:hover,
.pdf-dropzone.dragging {
  border-color: var(--accent);
  background: var(--accent-dim);
}
.pdf-dropzone.has-file {
  padding: 14px 16px;
  text-align: left;
  border-style: solid;
}
.pdf-drop-icon {
  width: 34px; height: 34px;
  color: var(--accent);
  display: block;
  margin: 0 auto 8px;
}
.pdf-dropzone.has-file .pdf-drop-icon { display: none; }
.pdf-drop-text {
  color: var(--text-secondary);
  font-size: 13.5px;
}
.pdf-dropzone.has-file .pdf-drop-text { display: none; }
.pdf-drop-link { color: var(--accent); font-weight: 600; }
.pdf-file-info {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 13.5px;
  color: var(--text);
}
.pdf-file-info svg { width: 18px; height: 18px; color: var(--accent); flex: none; }
.pdf-file-info #pdfFileName {
  font-weight: 600;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  max-width: 46%;
}
.pdf-file-meta { color: var(--text-muted); font-size: 12px; }
.pdf-file-clear {
  margin-left: auto;
  width: 24px; height: 24px;
  border: none; border-radius: 50%;
  background: var(--surface-2);
  color: var(--text-secondary);
  font-size: 16px; line-height: 1;
  cursor: pointer; flex: none;
}
.pdf-file-clear:hover { background: var(--danger-dim); color: var(--danger); }

/* 引擎选择 */
.pdf-engine-row {
  display: flex;
  gap: 12px;
  margin-top: 14px;
  flex-wrap: wrap;
}
.pdf-engine-opt {
  flex: 1 1 240px;
  display: flex;
  align-items: flex-start;
  gap: 10px;
  padding: 12px 14px;
  border: 1px solid var(--card-border);
  border-radius: var(--radius-sm);
  background: var(--card-bg);
  cursor: pointer;
  transition: border-color .15s ease, background .15s ease;
}
.pdf-engine-opt:hover { border-color: var(--card-border-hover); }
.pdf-engine-opt input[type="radio"] { margin-top: 3px; accent-color: var(--accent); }
.pdf-engine-opt:has(input:checked) {
  border-color: var(--accent);
  background: var(--accent-dim);
}
.pdf-engine-opt.disabled { opacity: .45; cursor: not-allowed; }
.pdf-engine-name { font-size: 13.5px; font-weight: 600; color: var(--text); }
.pdf-engine-desc { font-size: 12px; color: var(--text-secondary); margin-top: 3px; line-height: 1.5; }

/* 参数与操作行 */
.pdf-action-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-top: 14px;
  flex-wrap: wrap;
}
.pdf-opts { display: flex; gap: 16px; flex-wrap: wrap; }
.pdf-opt {
  font-size: 13px;
  color: var(--text-secondary);
  display: inline-flex; align-items: center; gap: 6px;
  cursor: pointer;
}
.pdf-opt input { accent-color: var(--accent); }
.pdf-opt-ocr { color: var(--text-muted); cursor: default; }
.pdf-action-right { display: flex; align-items: center; gap: 12px; }
.pdf-worker-status { font-size: 12px; color: var(--text-muted); }
.pdf-worker-status.ok { color: var(--progress-end); }
.pdf-worker-status.bad { color: var(--danger); }

/* 进度 */
.pdf-progress-head {
  display: flex; justify-content: space-between; align-items: baseline;
  margin-bottom: 10px;
}
.pdf-progress-stage { font-size: 13.5px; font-weight: 600; color: var(--text); }
.pdf-progress-engine { font-size: 12px; color: var(--text-muted); }
.pdf-progress-bar {
  height: 6px;
  border-radius: 999px;
  background: var(--surface-2);
  overflow: hidden;
}
.pdf-progress-fill {
  height: 100%; width: 40%;
  border-radius: 999px;
  background: linear-gradient(90deg, var(--accent), var(--accent-soft));
}
.pdf-progress-fill.indeterminate {
  width: 40%;
  animation: pdf-indeterminate 1.3s ease-in-out infinite;
}
@keyframes pdf-indeterminate {
  0%   { margin-left: -40%; }
  100% { margin-left: 100%; }
}
.pdf-progress-fill.failed {
  width: 100%;
  background: var(--danger);
  animation: none;
}
.pdf-error {
  margin-top: 12px;
  padding: 10px 12px;
  border-radius: var(--radius-sm);
  background: var(--danger-dim);
  color: var(--danger);
  font-size: 12.5px;
  line-height: 1.6;
}
.pdf-error-hint { color: var(--text-secondary); margin-top: 4px; }

/* 结果区 */
.pdf-result-head {
  display: flex; justify-content: space-between; align-items: center;
  gap: 12px; flex-wrap: wrap;
  margin: 10px 0 12px;
}
.pdf-saved-path { font-size: 12px; color: var(--text-muted); font-family: ui-monospace, "SF Mono", Menlo, monospace; word-break: break-all; }
.pdf-saved-path-wrap { display: flex; align-items: center; gap: 10px; flex: 1; min-width: 0; }
.pdf-open-folder-btn { flex-shrink: 0; font-size: 12px; padding: 3px 10px; }
.pdf-result-actions { display: flex; gap: 8px; flex-wrap: wrap; }
.pdf-mini-btn {
  padding: 6px 12px;
  font-size: 12.5px;
  border: 1px solid var(--card-border);
  border-radius: var(--radius-sm);
  background: var(--card-bg);
  color: var(--text-secondary);
  cursor: pointer;
  transition: all .15s ease;
}
.pdf-mini-btn:hover { border-color: var(--accent); color: var(--accent); }
.pdf-tabs {
  display: flex; align-items: center; gap: 4px;
  border-bottom: 1px solid var(--card-border);
  margin-bottom: 12px;
}
.pdf-tab {
  padding: 8px 14px;
  font-size: 13px;
  border: none; background: none;
  color: var(--text-secondary);
  cursor: pointer;
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
}
.pdf-tab.active { color: var(--accent); border-bottom-color: var(--accent); font-weight: 600; }
.pdf-tab-badge {
  display: inline-block;
  margin-left: 6px;
  padding: 1px 7px;
  font-size: 10px;
  font-weight: 600;
  color: var(--btn-text);
  background: var(--accent);
  border-radius: 10px;
  vertical-align: middle;
  animation: pdfBadgePulse 1.5s ease-in-out infinite;
}
.pdf-tab-badge[hidden] { display: none !important; }
@keyframes pdfBadgePulse { 0%,100% { opacity: 1; } 50% { opacity: 0.5; } }
.pdf-images-info { margin-left: auto; font-size: 12px; color: var(--text-muted); }

.pdf-split {
  display: flex;
  gap: 14px;
  align-items: stretch;
  flex-wrap: wrap;
}
.pdf-preview {
  width: 100%;
}
.pdf-preview {
  max-height: 62vh;
  overflow-y: auto;
  padding: 16px 18px;
  border: 1px solid var(--card-border);
  border-radius: var(--radius-sm);
  background: var(--input-bg);
  font-size: 14px;
  line-height: 1.75;
  color: var(--text);
}
.pdf-preview h1, .pdf-preview h2, .pdf-preview h3 {
  font-family: var(--font-serif);
  margin: 14px 0 8px;
  line-height: 1.4;
}
.pdf-preview h1 { font-size: 20px; }
.pdf-preview h2 { font-size: 17px; }
.pdf-preview h3 { font-size: 15px; }
.pdf-preview p { margin: 8px 0; }
.pdf-preview ul, .pdf-preview ol { padding-left: 22px; margin: 8px 0; }
.pdf-preview li { margin: 4px 0; }
.pdf-preview blockquote {
  margin: 8px 0; padding: 6px 12px;
  border-left: 3px solid var(--accent);
  background: var(--accent-dim);
  color: var(--text-secondary);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
}
.pdf-preview code {
  font-family: var(--font-mono);
  font-size: 12.5px;
  background: var(--surface-2);
  padding: 1px 5px;
  border-radius: 4px;
}
.pdf-preview pre {
  background: var(--surface-2);
  padding: 12px;
  border-radius: var(--radius-sm);
  overflow-x: auto;
}
.pdf-preview pre code { background: none; padding: 0; }
.pdf-preview img {
  max-width: 100%;
  height: auto;
  border-radius: var(--radius-sm);
  border: 1px solid var(--card-border);
  margin: 8px 0;
  display: block;
}
.pdf-preview a { color: var(--accent); }
.pdf-source {
  width: 100%;
  min-height: 420px;
  max-height: 62vh;
  resize: vertical;
  padding: 14px;
  border: 1px solid var(--card-border);
  border-radius: var(--radius-sm);
  background: var(--input-bg);
  color: var(--text);
  font-family: var(--font-mono);
  font-size: 12.5px;
  line-height: 1.7;
  resize: vertical;
}
.pdf-source:focus { outline: none; border-color: var(--accent); }

/* ===== 图片公式汇总视图 ===== */
.pdf-assets {
  width: 100%;
  max-height: 62vh;
  overflow-y: auto;
  padding: 16px 18px;
  border: 1px solid var(--card-border);
  border-radius: var(--radius-md);
  background: var(--card-bg);
}
.pdf-assets-empty {
  padding: 40px 20px;
  text-align: center;
  color: var(--text-muted);
  font-size: 13.5px;
}
.pdf-assets-section { margin-bottom: 22px; }
.pdf-assets-section:last-child { margin-bottom: 0; }
.pdf-assets-title {
  font-size: 13.5px;
  font-weight: 600;
  color: var(--accent);
  margin-bottom: 10px;
  padding-bottom: 6px;
  border-bottom: 1px solid var(--card-border);
}
/* 图片网格 */
.pdf-assets-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
  gap: 12px;
}
.pdf-assets-img {
  border: 1px solid var(--card-border);
  border-radius: var(--radius-sm);
  overflow: hidden;
  background: var(--surface-1);
}
.pdf-assets-img img {
  display: block;
  width: 100%;
  height: 140px;
  object-fit: contain;
  background: var(--surface-1);
}
.pdf-assets-img-name {
  padding: 5px 8px;
  font-size: 10.5px;
  color: var(--text-muted);
  font-family: var(--font-mono);
  border-top: 1px solid var(--card-border);
  word-break: break-all;
}
/* 公式框 */
.pdf-formula-box {
  margin-bottom: 10px;
  border: 1px solid var(--card-border);
  border-radius: var(--radius-sm);
  overflow: hidden;
}
.pdf-formula-num, .pdf-table-num {
  padding: 5px 10px;
  font-size: 11px;
  font-weight: 600;
  color: var(--text-secondary);
  background: var(--surface-2);
  border-bottom: 1px solid var(--card-border);
}
.pdf-formula-box pre {
  margin: 0;
  padding: 12px 14px;
  background: var(--surface-1);
  overflow-x: auto;
}
.pdf-formula-box code {
  font-family: var(--font-mono);
  font-size: 13px;
  color: var(--text-color);
  background: none;
}
/* 表格 */
.pdf-table-wrap {
  margin-bottom: 14px;
  border: 1px solid var(--card-border);
  border-radius: var(--radius-sm);
  overflow: hidden;
}
.pdf-table-wrap table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12.5px;
}
.pdf-table-wrap th {
  background: var(--surface-2);
  padding: 8px 10px;
  text-align: left;
  font-weight: 600;
  border-bottom: 1px solid var(--card-border);
  white-space: nowrap;
}
.pdf-table-wrap td {
  padding: 7px 10px;
  border-bottom: 1px solid var(--card-border);
  vertical-align: top;
}
.pdf-table-wrap tr:last-child td { border-bottom: none; }
.pdf-table-wrap tr:hover td { background: var(--surface-1); }

/* 全文翻译视图 */
.pdf-translation { padding: 4px 2px; }
.pdf-translation-empty {
  text-align: center; padding: 40px 20px;
}
.pdf-translation-icon { font-size: 36px; margin-bottom: 12px; }
.pdf-translation-title { font-size: 16px; font-weight: 600; color: var(--text); margin-bottom: 8px; }
.pdf-translation-desc { font-size: 13px; color: var(--text-secondary); line-height: 1.6; max-width: 480px; margin: 0 auto 18px; }
.pdf-translation-note { font-size: 11.5px; color: var(--text-muted); margin-top: 12px; }
.pdf-translation-progress { padding: 16px 4px; }
.pdf-translation-progress-text { font-size: 13px; color: var(--text); margin-bottom: 10px; font-weight: 500; }
.pdf-translation .markdown-body { padding-top: 8px; }

/* ===== PDF 工作区：左侧「选文件 + 参数 + 进度」/ 右侧「转写结果」 ===== */
.pdf-workspace {
  display: grid;
  grid-template-columns: minmax(320px, 400px) minmax(0, 1fr);
  gap: 20px;
  align-items: start;
}
.pdf-col { min-width: 0; }
.pdf-col > .card:last-child { margin-bottom: 0; }
.pdf-result-card { min-height: 380px; }
/* 有结果时自动收起空状态（:has 不可用时只是多显示一张卡，不影响功能） */
.pdf-col-right:has(#pdfResultCard:not([hidden])) #pdfEmptyState { display: none; }

/* 空状态 */
.pdf-empty-body { padding: 18px 4px 10px; }
.pdf-empty-title {
  font-size: 15px;
  color: var(--text);
  margin-bottom: 8px;
}
.pdf-empty-desc {
  font-size: 13px;
  color: var(--text-secondary);
  line-height: 1.7;
  max-width: 46ch;
  margin-bottom: 18px;
}
.pdf-empty-steps {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.pdf-empty-steps span {
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--accent);
  background: var(--accent-dim);
  border-radius: var(--radius-xs);
  padding: 5px 10px;
}

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

/* Token 到期提醒 banner */
.pdf-token-banner {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 14px;
  padding: 10px 14px;
  border-radius: var(--radius-md);
  background: var(--amber-dim);
  border: 1px solid var(--amber);
  font-size: 13px;
  line-height: 1.5;
}
.pdf-token-banner[hidden] { display: none !important; }
.pdf-token-banner.urgent {
  background: rgba(234, 102, 104, 0.12);
  border-color: rgba(234, 102, 104, 0.45);
}
.pdf-token-icon { font-size: 15px; flex-shrink: 0; }
.pdf-token-text { flex: 1; color: var(--text-color); }
.pdf-token-link {
  flex-shrink: 0;
  color: var(--accent);
  font-weight: 600;
  text-decoration: none;
  white-space: nowrap;
}
.pdf-token-link:hover { text-decoration: underline; }

/* 上传区小字提示 */
.pdf-drop-hint {
  margin-top: 6px;
  font-size: 11.5px;
  color: var(--text-muted);
}
.pdf-dropzone.has-file .pdf-drop-hint { display: none; }

/* 文件超限内联错误 */
.pdf-file-error {
  margin-top: 10px;
  padding: 8px 12px;
  border-radius: var(--radius-sm);
  background: var(--danger-dim);
  color: var(--danger);
  font-size: 12.5px;
  line-height: 1.5;
}

/* 引擎上限徽章 */
.pdf-engine-limit {
  display: inline-block;
  margin-left: 8px;
  padding: 1px 8px;
  font-size: 11px;
  font-weight: 500;
  color: var(--accent);
  background: var(--accent-dim);
  border-radius: 999px;
  vertical-align: middle;
}

/* 进度百分比 */
.pdf-progress-pct {
  margin-left: 10px;
  font-size: 13px;
  font-weight: 700;
  color: var(--accent);
  font-variant-numeric: tabular-nums;
}

@media (max-width: 720px) {
  .pdf-engine-opt { flex: 1 1 100%; }
  .pdf-action-row { flex-direction: column; align-items: stretch; }
  .pdf-action-right { justify-content: space-between; }
  .pdf-preview { width: 100%; }
}

/* ===== P0 一键入库：弹框与表单 ===== */
#pdfIngestModal[hidden], #pdfIngestError[hidden], #pdfIngestDone[hidden], #pdfIngestFooter[hidden] { display: none !important; }
.pdf-modal {
  position: fixed; inset: 0; z-index: 1100;
  display: flex; align-items: center; justify-content: center;
}
.pdf-modal-overlay {
  position: absolute; inset: 0;
  background: rgba(0, 0, 0, 0.5); backdrop-filter: blur(4px);
}
.pdf-modal-content {
  position: relative; background: var(--card-bg);
  border-radius: 16px; width: 92%; max-width: 600px;
  max-height: 86vh; overflow-y: auto;
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.28);
  display: flex; flex-direction: column;
  animation: pdfModalIn 0.25s cubic-bezier(0.22, 1, 0.36, 1);
}
@keyframes pdfModalIn { from { transform: translateY(16px); opacity: 0; } to { transform: none; opacity: 1; } }
.pdf-modal-header {
  display: flex; align-items: center; justify-content: space-between;
  padding: 15px 20px; border-bottom: 1px solid var(--card-border);
}
.pdf-modal-title { font-size: 15px; font-weight: 600; color: var(--text); }
.pdf-modal-close {
  border: none; background: transparent; cursor: pointer; color: var(--text-muted);
  width: 30px; height: 30px; border-radius: 8px;
  display: flex; align-items: center; justify-content: center;
}
.pdf-modal-close:hover { background: var(--surface-2); color: var(--text); }
.pdf-modal-close svg { width: 18px; height: 18px; }
.pdf-modal-body { padding: 16px 20px; display: flex; flex-direction: column; gap: 12px; }
.pdf-ingest-hint {
  font-size: 12px; color: var(--text-secondary); line-height: 1.5;
  background: var(--accent-dim); border-radius: 8px; padding: 8px 10px;
}
.pdf-field { display: flex; flex-direction: column; gap: 5px; flex: 1; min-width: 0; }
.pdf-field-label { font-size: 12px; color: var(--text-secondary); }
.pdf-field-label em { color: var(--danger); font-style: normal; }
.pdf-field input, .pdf-field select, .pdf-field textarea {
  padding: 8px 10px; font-size: 13px; color: var(--text);
  border: 1px solid var(--card-border); border-radius: var(--radius-sm);
  background: var(--card-bg); outline: none; width: 100%; box-sizing: border-box;
  font-family: inherit; resize: vertical;
}
.pdf-field input:focus, .pdf-field select:focus, .pdf-field textarea:focus { border-color: var(--accent); }
.pdf-field-row { display: flex; gap: 10px; flex-wrap: wrap; }
.pdf-field-narrow { flex: 0 0 110px; }
.pdf-ai-btn {
  margin-left: 8px; padding: 2px 10px; font-size: 12px; font-weight: 600;
  border-radius: var(--radius-sm); border: 1px solid var(--accent);
  background: transparent; color: var(--accent); cursor: pointer;
  vertical-align: middle; white-space: nowrap;
}
.pdf-ai-btn:hover { background: var(--accent-dim); }
.pdf-ai-btn:disabled { opacity: 0.55; cursor: wait; }
.pdf-check { display: flex; align-items: center; gap: 8px; font-size: 12.5px; color: var(--text-secondary); cursor: pointer; }
.pdf-ingest-error {
  font-size: 12.5px; color: var(--danger); line-height: 1.5;
  background: var(--danger-dim); border-radius: 8px; padding: 8px 10px;
}
.pdf-ingest-done { border: 1px solid var(--accent); background: var(--accent-dim); border-radius: 10px; padding: 12px 14px; }
.pdf-ingest-done-title { font-size: 14px; font-weight: 600; color: var(--accent); margin-bottom: 6px; }
.pdf-ingest-path { font-size: 12px; color: var(--text-secondary); word-break: break-all; line-height: 1.7; }
.pdf-modal-footer { display: flex; justify-content: flex-end; gap: 10px; padding: 14px 20px; border-top: 1px solid var(--card-border); }
.pdf-mini-btn-primary { background: var(--accent); color: var(--btn-text); border-color: var(--accent); }
.pdf-mini-btn-primary:hover { color: var(--btn-text); opacity: 0.92; border-color: var(--accent); }
.pdf-mini-btn:disabled { opacity: 0.55; cursor: not-allowed; }
@media (max-width: 720px) {
  .pdf-field-narrow { flex: 1 1 100%; }
  .pdf-modal-content { width: 96%; }
}

/* ===== 选中文字浮动工具栏：引用到札记 ===== */
#pdfSelToolbar[hidden] { display: none !important; }
.pdf-sel-toolbar {
  position: fixed; z-index: 1200;
  display: flex; align-items: center; gap: 8px;
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: 10px;
  padding: 6px 10px;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
  animation: pdfSelIn 0.15s ease-out;
  white-space: nowrap;
}
@keyframes pdfSelIn { from { transform: translateY(4px); opacity: 0; } to { transform: none; opacity: 1; } }
.pdf-sel-btn {
  border: 1px solid var(--accent);
  background: var(--accent);
  color: var(--btn-text);
  font-size: 12.5px; font-weight: 600;
  padding: 5px 12px;
  border-radius: 7px;
  cursor: pointer;
  font-family: inherit;
  transition: opacity 0.15s;
}
.pdf-sel-btn:hover { opacity: 0.88; }
.pdf-sel-btn:disabled { opacity: 0.55; cursor: wait; }
.pdf-sel-count {
  font-size: 11px; color: var(--text-muted);
  padding-left: 4px; border-left: 1px solid var(--card-border);
}

/* ===== 图片灯箱：点击放大查看 ===== */
#pdfImgLightbox[hidden] { display: none !important; }
.pdf-img-lightbox {
  position: fixed; inset: 0; z-index: 2000;
  display: flex; align-items: center; justify-content: center;
}
.pdf-img-lightbox-overlay {
  position: absolute; inset: 0;
  background: rgba(0, 0, 0, 0.85);
  backdrop-filter: blur(6px);
}
.pdf-img-lightbox-content {
  position: relative;
  max-width: 92vw; max-height: 92vh;
  display: flex; flex-direction: column; align-items: center;
  animation: pdfImgLightboxIn 0.2s ease-out;
}
@keyframes pdfImgLightboxIn { from { transform: scale(0.92); opacity: 0; } to { transform: none; opacity: 1; } }
.pdf-img-lightbox-img {
  max-width: 92vw; max-height: 82vh;
  object-fit: contain;
  border-radius: 8px;
  box-shadow: 0 12px 48px rgba(0, 0, 0, 0.5);
  cursor: zoom-out;
}
.pdf-img-lightbox-caption {
  margin-top: 12px;
  font-size: 13px; color: rgba(255, 255, 255, 0.8);
  text-align: center; max-width: 80vw;
  line-height: 1.5;
}
.pdf-img-lightbox-close {
  position: absolute; top: -16px; right: -16px;
  width: 36px; height: 36px; border-radius: 50%;
  border: none; background: rgba(255, 255, 255, 0.15);
  color: #fff; font-size: 16px; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  transition: background 0.15s;
  backdrop-filter: blur(4px);
}
.pdf-img-lightbox-close:hover { background: rgba(255, 255, 255, 0.3); }
/* 预览区和译文区的图片可点击 */
#pdfPreview img, #pdfTransContent img {
  cursor: zoom-in;
  transition: opacity 0.15s;
}
#pdfPreview img:hover, #pdfTransContent img:hover {
  opacity: 0.88;
}

/* 译文结果栏 */
.pdf-trans-result-bar {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: 12px; padding-bottom: 10px;
  border-bottom: 1px solid var(--card-border);
}
.pdf-trans-result-label {
  font-size: 13px; font-weight: 600; color: var(--accent);
}

/* 预览/译文中的图片编号标注 */
.pdf-figure {
  display: block;
  text-align: center;
  margin: 14px 0;
}
.pdf-figure img {
  max-width: 100%;
  height: auto;
  border-radius: 6px;
  box-shadow: 0 2px 8px rgba(0,0,0,0.08);
}
.pdf-figure-num {
  display: block;
  font-size: 12px;
  color: var(--text-secondary);
  margin-top: 6px;
  font-weight: 600;
  letter-spacing: 0.5px;
}

/* 图片公式网格中的图号 */
.pdf-assets-img-name {
  font-size: 12px;
  color: var(--text-secondary);
  margin-top: 6px;
  font-weight: 600;
  text-align: center;
  word-break: break-all;
  line-height: 1.4;
}

/* 总结摘要 */
.pdf-summary-body h3 {
  font-size: 15px; font-weight: 700; margin: 18px 0 8px;
  padding-left: 10px; border-left: 3px solid var(--accent);
}
.pdf-summary-body h3:first-child { margin-top: 4px; }
.pdf-summary-body p { font-size: 14px; line-height: 1.8; color: var(--text-primary); }
.pdf-kw-tag {
  display: inline-block;
  padding: 3px 12px; margin: 3px 6px 3px 0;
  font-size: 12px; font-weight: 500;
  color: var(--accent);
  background: var(--accent-soft);
  border-radius: 999px;
}

/* ===== 结构化文献精读摘要 ===== */
.sum-oneliner {
  font-size: 17px; font-weight: 700; line-height: 1.7;
  color: var(--text);
  padding: 16px 20px; margin-bottom: 20px;
  background: var(--accent-dim);
  border-left: 4px solid var(--accent);
  border-radius: 0 8px 8px 0;
}
.sum-abstract-en {
  font-style: italic; color: var(--text-secondary);
  background: var(--surface-1);
  padding: 14px 18px; border-radius: 8px;
  border: 1px solid var(--card-border);
}
.sum-findings { list-style: none; padding: 0; margin: 0; }
.sum-findings li {
  position: relative; padding: 8px 0 8px 24px;
  font-size: 14px; line-height: 1.8; color: var(--text);
  border-bottom: 1px dashed var(--card-border);
}
.sum-findings li:last-child { border-bottom: none; }
.sum-findings li::before {
  content: "▸"; position: absolute; left: 4px; top: 8px;
  color: var(--accent); font-weight: 700;
}
.sum-sl-grid {
  display: grid; grid-template-columns: 1fr 1fr; gap: 16px;
  margin: 16px 0;
}
.sum-sl-card {
  padding: 16px 18px; border-radius: 10px;
  border: 1px solid var(--card-border);
}
.sum-sl-card h4 {
  font-size: 14px; font-weight: 700; margin: 0 0 10px;
  padding-bottom: 8px; border-bottom: 2px solid;
}
.sum-sl-card ul { margin: 0; padding-left: 18px; }
.sum-sl-card li { font-size: 13.5px; line-height: 1.8; margin-bottom: 6px; color: var(--text-secondary); }
.sum-sl-card li:last-child { margin-bottom: 0; }
.sum-strengths { background: var(--accent-dim); }
.sum-strengths h4 { color: var(--accent); border-color: var(--accent); }
.sum-limitations { background: var(--amber-dim); }
.sum-limitations h4 { color: var(--amber); border-color: var(--amber); }
@media (max-width: 720px) {
  .sum-sl-grid { grid-template-columns: 1fr; }
}

/* ===== 摘要深度选择按钮 ===== */
.sum-depth-buttons {
  display: flex; gap: 12px; margin-top: 16px; justify-content: center;
}
.sum-depth-btn {
  display: flex; flex-direction: column; align-items: center;
  padding: 14px 20px; min-width: 110px;
  border: 2px solid var(--card-border);
  background: var(--surface-1);
  border-radius: 12px; cursor: pointer;
  transition: all 0.2s ease;
}
.sum-depth-btn:hover:not(:disabled) {
  border-color: var(--accent);
  transform: translateY(-2px);
}
.sum-depth-btn.active {
  border-color: var(--accent);
  background: var(--accent-dim);
}
.sum-depth-btn:disabled {
  opacity: 0.5; cursor: not-allowed;
}
.sum-depth-icon { font-size: 22px; margin-bottom: 4px; }
.sum-depth-name { font-size: 14px; font-weight: 700; color: var(--text); }
.sum-depth-desc { font-size: 11px; color: var(--text-secondary); margin-top: 2px; }

/* ===== 关键突破（deep 模式）===== */
.sum-breakthroughs { margin: 12px 0; }
.sum-breakthrough-item {
  padding: 14px 16px; margin-bottom: 10px;
  background: var(--surface-1);
  border: 1px solid var(--card-border);
  border-left: 4px solid var(--accent);
  border-radius: 0 8px 8px 0;
}
.sum-breakthrough-title {
  font-size: 15px; font-weight: 700; color: var(--text);
  display: flex; align-items: center; gap: 8px; margin-bottom: 6px;
}
.sum-breakthrough-num {
  display: inline-flex; align-items: center; justify-content: center;
  width: 22px; height: 22px; border-radius: 50%;
  background: var(--accent); color: #fff; font-size: 12px; font-weight: 700;
}
.sum-breakthrough-stars {
  margin-left: auto; color: var(--amber); font-size: 13px; letter-spacing: 1px;
}
.sum-breakthrough-desc {
  font-size: 13.5px; line-height: 1.8; color: var(--text-secondary); margin-bottom: 4px;
}
.sum-breakthrough-why {
  font-size: 12.5px; color: var(--accent); font-style: italic;
}

/* ===== 疑惑清单（deep 模式）===== */
.sum-questions { margin: 12px 0; }
.sum-question-item {
  padding: 12px 16px; margin-bottom: 8px;
  background: var(--surface-1);
  border: 1px solid var(--card-border);
  border-radius: 8px;
}
.sum-question-critical { border-left: 4px solid var(--danger); }
.sum-question-method { border-left: 4px solid var(--amber); }
.sum-question-understanding { border-left: 4px solid var(--info); }
.sum-question-type {
  display: inline-block; font-size: 11px; font-weight: 700;
  padding: 2px 8px; border-radius: 4px; margin-bottom: 6px;
}
.sum-question-critical .sum-question-type { background: var(--danger-dim); color: var(--danger); }
.sum-question-method .sum-question-type { background: var(--amber-dim); color: var(--amber); }
.sum-question-understanding .sum-question-type { background: var(--info-dim); color: var(--info); }
.sum-question-text {
  font-size: 14px; line-height: 1.7; color: var(--text); margin-bottom: 4px;
}
.sum-question-impact {
  font-size: 12.5px; color: var(--text-secondary); font-style: italic;
}

/* ===== 严重程度标签 ===== */
.sum-severity {
  font-size: 11px; font-weight: 700; padding: 1px 6px; border-radius: 3px;
  margin-left: 4px;
}
.sum-severity-高 { background: var(--danger-dim); color: var(--danger); }
.sum-severity-中 { background: var(--amber-dim); color: var(--amber); }
.sum-severity-低 { background: var(--success-dim); color: var(--success); }

/* ===== 摘要结果栏（深度切换 + 保存） ===== */
.sum-result-bar {
  display: flex; justify-content: space-between; align-items: center;
  padding: 12px 16px; margin-bottom: 16px;
  background: var(--surface-1);
  border: 1px solid var(--card-border);
  border-radius: 10px;
  flex-wrap: wrap; gap: 10px;
}
.sum-depth-switch {
  display: flex; gap: 4px;
  background: var(--surface-2);
  padding: 3px; border-radius: 8px;
}
.sum-switch-btn {
  padding: 6px 14px; font-size: 13px; font-weight: 500;
  border: none; background: transparent; color: var(--text-secondary);
  border-radius: 6px; cursor: pointer; transition: all 0.15s;
}
.sum-switch-btn:hover { color: var(--text); }
.sum-switch-btn.active {
  background: var(--accent); color: #fff;
  box-shadow: 0 1px 3px rgba(0,0,0,0.15);
}
.sum-result-actions {
  display: flex; align-items: center; gap: 10px;
}

/* ===== 摘要卡片库 ===== */
.sum-filter-bar {
  display: flex; gap: 8px; margin: 16px 0;
  flex-wrap: wrap;
}
.sum-filter-btn {
  padding: 8px 18px; font-size: 13px; font-weight: 500;
  border: 1px solid var(--card-border); background: var(--surface-1);
  color: var(--text-secondary); border-radius: 999px; cursor: pointer;
  transition: all 0.15s;
}
.sum-filter-btn:hover { border-color: var(--accent); color: var(--accent); }
.sum-filter-btn.active {
  background: var(--accent); color: #fff; border-color: var(--accent);
}

.sum-card-list {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
  gap: 16px;
}
.sum-card {
  background: var(--surface-1);
  border: 1px solid var(--card-border);
  border-radius: 12px; padding: 18px;
  cursor: pointer; transition: all 0.2s;
}
.sum-card:hover {
  transform: translateY(-2px);
  box-shadow: 0 4px 16px rgba(0,0,0,0.08);
  border-color: var(--accent);
}
.sum-card-header {
  display: flex; justify-content: space-between; align-items: center;
  margin-bottom: 10px;
}
.sum-card-depth {
  font-size: 11px; font-weight: 700; padding: 3px 10px; border-radius: 4px;
}
.sum-depth-quick { background: var(--info-dim); color: var(--info); }
.sum-depth-standard { background: var(--accent-dim); color: var(--accent); }
.sum-depth-deep { background: var(--purple-dim); color: var(--purple); }
.sum-card-date {
  font-size: 11px; color: var(--text-muted);
}
.sum-card-title {
  font-size: 15px; font-weight: 700; color: var(--text);
  line-height: 1.5; margin-bottom: 8px;
}
.sum-card-year {
  font-size: 12px; font-weight: 400; color: var(--text-muted);
  margin-left: 6px;
}
.sum-card-oneliner {
  font-size: 13px; color: var(--text-secondary); line-height: 1.7;
  margin-bottom: 10px;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden;
}
.sum-card-keywords {
  display: flex; flex-wrap: wrap; gap: 4px;
}
.sum-card-kw {
  font-size: 11px; padding: 2px 8px; border-radius: 4px;
  background: var(--surface-2); color: var(--text-muted);
}

.sum-empty {
  text-align: center; padding: 60px 20px;
}
.sum-empty-icon { font-size: 48px; margin-bottom: 16px; opacity: 0.5; }
.sum-empty-title { font-size: 18px; font-weight: 700; color: var(--text); margin-bottom: 8px; }
.sum-empty-desc { font-size: 14px; color: var(--text-secondary); max-width: 480px; margin: 0 auto; line-height: 1.7; }

.sum-detail-body {
  max-width: 860px; margin: 0 auto; padding: 20px;
}

/* ============================================================
   热点日报板块（报纸版面风，已接入工作台双主题体系）
   ============================================================ */
#panel-hotspots { }
.hs-masthead { display:flex; justify-content:space-between; align-items:flex-end; gap:16px;
  border-top:3px double var(--text); border-bottom:1px solid var(--text);
  padding:14px 4px 12px; margin-bottom:14px; flex-wrap:wrap; }
.hs-masthead-title { font-family:var(--font-serif); font-size:24px; font-weight:700;
  letter-spacing:.18em; color:var(--text); }
.hs-masthead-sub { font-size:12.5px; color:var(--text-secondary); margin-top:4px; letter-spacing:.04em; }
.hs-masthead-actions { display:flex; gap:8px; }
.hs-btn { display:inline-flex; align-items:center; gap:6px; font-size:13px; font-family:var(--font-sans);
  color:var(--text); background:var(--bg-elevated); border:1px solid var(--card-border);
  border-radius:4px; padding:6px 12px; cursor:pointer; text-decoration:none; transition:all .15s; }
.hs-btn svg { width:14px; height:14px; }
.hs-btn:hover { border-color:var(--accent); color:var(--accent); }
.hs-btn-primary { background:var(--text); color:var(--bg); border-color:var(--text); }
.hs-btn-primary:hover { background:var(--accent); border-color:var(--accent); color:var(--btn-text); }
.hs-hint { background:var(--surface-2); border-left:4px solid var(--accent);
  padding:11px 16px; font-size:13px; line-height:1.85; color:var(--text-secondary); border-radius:0 6px 6px 0;
  margin-bottom:18px; }
.hs-hint code { background:var(--accent-dim); color:var(--accent); padding:1px 6px;
  border-radius:3px; font-family:var(--font-mono); font-size:12px; }
.hs-day-group { margin-bottom:18px; }
.hs-day-label { font-family:var(--font-serif); font-weight:700; font-size:15px; letter-spacing:.2em;
  color:var(--text); border-bottom:2px solid var(--text); padding-bottom:5px; margin-bottom:10px;
  display:flex; align-items:center; gap:10px; }
.hs-day-label::after { content:""; flex:1; border-bottom:1px dashed var(--card-border); }
.hs-list { display:flex; flex-direction:column; gap:10px; }
.hs-item { display:flex; align-items:center; gap:14px; background:var(--card-bg);
  border:1px solid var(--card-border); border-radius:6px; padding:13px 16px; cursor:pointer;
  transition:all .16s; }
.hs-item:hover { border-color:var(--accent); box-shadow:0 3px 12px var(--shadow-hover); transform:translateY(-1px); }
.hs-session { flex:0 0 auto; font-size:12.5px; font-weight:700; letter-spacing:.1em;
  border:1px solid var(--accent); color:var(--accent); border-radius:3px; padding:2px 9px; }
.hs-session-pm { border-color:var(--amber); color:var(--amber); }
.hs-item-main { flex:1; min-width:0; }
.hs-item-title { font-family:var(--font-serif); font-size:15.5px; font-weight:700; color:var(--text); }
.hs-item-meta { font-size:12px; color:var(--text-secondary); margin-top:3px; }
.hs-item-arrow { flex:0 0 auto; font-size:13px; color:var(--text-secondary); transition:all .15s; }
.hs-item:hover .hs-item-arrow { color:var(--accent); transform:translateX(3px); }
.hs-empty { text-align:center; padding:56px 20px; color:var(--text-secondary);
  background:var(--card-bg); border:1px dashed var(--card-border); border-radius:8px; }
.hs-empty-icon { margin-bottom:12px; color:var(--text-muted); opacity:.75; }
.hs-empty-icon svg { width:38px; height:38px; }
.hs-empty-text { font-family:var(--font-serif); font-size:17px; font-weight:700; color:var(--text); margin-bottom:6px; }
.hs-empty-hint { font-size:12.5px; line-height:1.8; }
.hs-detail-head { display:flex; align-items:center; gap:14px; margin-bottom:12px; flex-wrap:wrap; }
.hs-detail-title { font-family:var(--font-serif); font-size:17px; font-weight:700;
  letter-spacing:.1em; color:var(--text); flex:1; min-width:160px; }

/* ============================================================
   日报详情排版（报纸版面风，已接入工作台双主题体系）
   不再使用 iframe，直接注入工作台页面，自动继承主题
   ============================================================ */
.paper-wrap {
  background: var(--paper-bg);
  color: var(--paper-ink);
  font-family: var(--font-serif);
  line-height: 1.95;
  padding: 28px 14px 60px;
  border-radius: var(--radius);
  border: 1px solid var(--paper-line);
}
.paper-wrap .paper {
  max-width: 980px; margin: 0 auto;
  background: var(--paper-paper);
  padding: 50px 58px 56px;
  box-shadow: 0 2px 18px var(--shadow-color);
  border-radius: 4px;
}
/* 报头 */
.paper-wrap .topbar { display: flex; justify-content: space-between; font-size: 13.5px; color: var(--paper-muted); letter-spacing: .08em; }
.paper-wrap .masthead { text-align: center; padding: 18px 0 10px; border-top: 3px double var(--paper-ink); border-bottom: 1px solid var(--paper-ink); margin-top: 10px; }
.paper-wrap .masthead h1 { font-size: 54px; letter-spacing: .42em; text-indent: .42em; font-weight: 900; color: var(--paper-ink-soft); }
.paper-wrap .metaline { display: flex; justify-content: space-between; flex-wrap: wrap; gap: 6px; font-size: 13.5px; color: var(--paper-muted); padding: 8px 2px; border-bottom: 3px double var(--paper-ink); }
/* 说明框 */
.paper-wrap .dedup { background: var(--paper-block); border-left: 4px solid var(--paper-accent); padding: 13px 18px; margin: 22px 0 8px; font-size: 14.5px; line-height: 1.9; color: var(--paper-muted); border-radius: 0 6px 6px 0; }
.paper-wrap .dedup b { color: var(--paper-accent); }
/* 版面 */
.paper-wrap .sec { margin-top: 34px; }
.paper-wrap .sec-head { display: flex; justify-content: space-between; align-items: baseline; border-bottom: 2px solid var(--paper-ink); padding-bottom: 7px; margin-bottom: 16px; }
.paper-wrap .sec-head h2 { font-size: 21px; letter-spacing: .32em; text-indent: .32em; font-weight: 900; color: var(--paper-ink); }
.paper-wrap .sec-head .kw { font-size: 13px; color: var(--paper-muted); letter-spacing: .12em; }
.paper-wrap .art { margin-bottom: 20px; }
.paper-wrap .atitle { font-size: 20px; font-weight: 900; line-height: 1.6; margin-bottom: 10px; color: var(--paper-ink); }
.paper-wrap .ptag { display: inline-block; color: var(--paper-accent); font-size: 13.5px; border: 1px solid var(--paper-accent); border-radius: 3px; padding: 0 6px; margin-right: 8px; vertical-align: 2px; letter-spacing: .1em; font-weight: 700; }
.paper-wrap p.body { font-size: 16px; text-align: justify; text-indent: 2em; margin-bottom: 9px; color: var(--paper-ink); }
.paper-wrap p.body.noind { text-indent: 0; }
.paper-wrap .dropcap::first-letter { float: left; font-size: 46px; line-height: .95; padding: 4px 8px 0 0; color: var(--paper-accent); font-weight: 900; }
.paper-wrap .highlight { background: var(--paper-block); border-left: 4px solid var(--paper-accent); padding: 11px 18px; margin: 12px 0; font-size: 15.5px; text-align: justify; text-indent: 2em; color: var(--paper-muted); border-radius: 0 6px 6px 0; }
.paper-wrap .srcline { font-size: 13px; color: var(--paper-muted); margin-top: 10px; border-top: 1px dashed var(--paper-line); padding-top: 7px; }
.paper-wrap .tip { font-size: 14.5px; color: var(--paper-muted); text-indent: 2em; text-align: justify; }
/* 头版双栏 */
.paper-wrap .head-grid { display: grid; grid-template-columns: 1.85fr 1.15fr; gap: 30px; }
.paper-wrap .rail .rblock { padding: 11px 0; border-top: 1px dashed var(--paper-line-soft); }
.paper-wrap .rail .rblock:first-child { border-top: none; padding-top: 2px; }
.paper-wrap .rlabel { display: inline-block; font-size: 12.5px; color: var(--paper-accent); border: 1px solid var(--paper-accent); padding: 0 7px; border-radius: 2px; margin-bottom: 5px; letter-spacing: .15em; }
.paper-wrap .rblock h4 { font-size: 16.5px; font-weight: 900; margin-bottom: 4px; color: var(--paper-ink); }
.paper-wrap .rblock p { font-size: 14px; color: var(--paper-muted); text-align: justify; line-height: 1.85; }
/* 表格 */
.paper-wrap table.data { width: 100%; border-collapse: collapse; margin: 12px 0; font-size: 14.5px; }
.paper-wrap table.data th { background: var(--paper-table-head); border: 1px solid var(--paper-line); padding: 8px 10px; font-weight: 700; text-align: left; color: var(--paper-ink); }
.paper-wrap table.data td { border: 1px solid var(--paper-line); padding: 7px 10px; vertical-align: top; color: var(--paper-ink); }
.paper-wrap table.data tr:nth-child(even) td { background: var(--paper-table-alt); }
.paper-wrap table.data .c { text-align: center; white-space: nowrap; }
/* 图表框 */
.paper-wrap .fig { border: 1px solid var(--paper-line); background: var(--paper-fig); padding: 18px 20px 14px; margin: 14px 0 6px; border-radius: 4px; }
.paper-wrap .fig h5 { text-align: center; font-size: 16px; font-weight: 900; margin-bottom: 4px; color: var(--paper-ink); }
.paper-wrap .fig .sub { text-align: center; font-size: 13px; color: var(--paper-muted); margin-bottom: 10px; }
.paper-wrap .figcap { text-align: center; font-size: 13.5px; color: var(--paper-muted); margin: 8px 4px 0; line-height: 1.8; }
.paper-wrap .figcap b { color: var(--paper-ink); }
/* 流程图 */
.paper-wrap .flow { display: flex; flex-direction: column; gap: 12px; margin: 6px 0; }
.paper-wrap .flow-row { display: grid; grid-template-columns: 1fr 46px 1.5fr; align-items: stretch; gap: 0; }
.paper-wrap .flow-left { background: var(--paper-block); border: 1px solid var(--paper-line); display: flex; flex-direction: column; justify-content: center; padding: 10px 14px; border-radius: 4px 0 0 4px; }
.paper-wrap .flow-left .lv { font-size: 13px; color: var(--paper-muted); }
.paper-wrap .flow-left .bn { font-size: 19px; font-weight: 900; color: var(--paper-accent); }
.paper-wrap .flow-arrow { display: flex; align-items: center; justify-content: center; color: var(--paper-accent); font-size: 24px; font-weight: 900; }
.paper-wrap .flow-right { background: var(--paper-paper); border: 1px solid var(--paper-line); border-left: none; padding: 10px 14px; font-size: 14px; line-height: 1.8; border-radius: 0 4px 4px 0; color: var(--paper-ink); }
.paper-wrap .flow-right b { color: var(--paper-accent); }
/* 堆叠条 */
.paper-wrap .stackbar { display: flex; height: 48px; margin: 14px 30px 8px; border: 1px solid var(--paper-line-soft); border-radius: 4px; overflow: hidden; }
.paper-wrap .stackbar div { display: flex; align-items: center; justify-content: center; color: #fff; font-size: 15px; font-weight: 700; letter-spacing: .05em; }
.paper-wrap .seg-d { background: var(--paper-accent); width: 45.5%; }
.paper-wrap .seg-g { background: var(--accent); width: 27.3%; }
.paper-wrap .seg-o { background: var(--amber); width: 27.2%; }
.paper-wrap .scale-note { text-align: center; font-size: 13.5px; color: var(--paper-muted); margin-bottom: 10px; }
.paper-wrap .cumline { display: flex; justify-content: space-around; flex-wrap: wrap; gap: 8px; border-top: 1px solid var(--paper-line); padding-top: 12px; font-size: 14.5px; color: var(--paper-ink); }
.paper-wrap .cumline span b { font-size: 16px; }
/* 速览列表 */
.paper-wrap ul.briefs { list-style: none; margin: 6px 0 4px; }
.paper-wrap ul.briefs li { font-size: 15px; line-height: 1.9; padding: 6px 0 6px 18px; position: relative; text-align: justify; border-bottom: 1px dashed var(--paper-line-soft); color: var(--paper-ink); }
.paper-wrap ul.briefs li:last-child { border-bottom: none; }
.paper-wrap ul.briefs li::before { content: "▪"; color: var(--paper-accent); position: absolute; left: 2px; top: 6px; }
.paper-wrap ul.briefs li b { font-weight: 900; }
/* 观察哨 */
.paper-wrap .watch-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 26px; }
.paper-wrap .watch-grid h4 { font-size: 15.5px; margin-bottom: 6px; color: var(--paper-ink); }
.paper-wrap .watch-grid p, .paper-wrap .watch-grid li { font-size: 14.5px; color: var(--paper-muted); }
.paper-wrap ul.track-list { list-style: none; }
.paper-wrap ul.track-list li { padding: 5px 0 5px 16px; position: relative; line-height: 1.85; border-bottom: 1px dashed var(--paper-line-soft); color: var(--paper-ink); }
.paper-wrap ul.track-list li:last-child { border-bottom: none; }
.paper-wrap ul.track-list li::before { content: "—"; color: var(--paper-accent); position: absolute; left: 0; }
/* 跨日追踪 */
.paper-wrap .track-row { display: grid; grid-template-columns: 200px 1fr; gap: 14px; font-size: 14.5px; padding: 8px 2px; border-bottom: 1px dashed var(--paper-line); }
.paper-wrap .track-row .ev { font-weight: 900; color: var(--paper-ink); }
.paper-wrap .track-row .st { color: var(--paper-muted); text-align: justify; }
/* 页脚 */
.paper-wrap .footer { margin-top: 36px; border-top: 3px double var(--paper-ink); padding-top: 14px; text-align: center; font-size: 13px; color: var(--paper-muted); line-height: 2; }
.paper-wrap .footer .disc { margin-top: 4px; color: var(--paper-muted); }
@media (max-width: 760px) {
  .paper-wrap .paper { padding: 30px 20px; }
  .paper-wrap .masthead h1 { font-size: 38px; }
  .paper-wrap .head-grid, .paper-wrap .watch-grid { grid-template-columns: 1fr; gap: 14px; }
  .paper-wrap .flow-row { grid-template-columns: 1fr; }
  .paper-wrap .flow-arrow { transform: rotate(90deg); height: 22px; }
  .paper-wrap .flow-right { border-left: 1px solid var(--paper-line); border-top: none; }
  .paper-wrap .track-row { grid-template-columns: 1fr; gap: 2px; }
  .paper-wrap .stackbar { margin: 14px 0 8px; }
}


/* ============================================================================
   V3 · 光感玻璃层   (2026-09-11)
   ----------------------------------------------------------------------------
   旧版的问题不是「不好看」，是把「面」和「分隔」混为一谈了：
   面板有底色、卡片有底色、卡片里的说明框还有底色 —— 三层半透明方块叠起来，
   就是那种「一堆方块图层」的观感；背景再铺一层 48px 网格，更像草稿纸。

   V3 的规则只有四条：
     ① 一屏最多一层玻璃面（.card / .paper / 浮层）。面板本身永远透明。
     ② 面内分隔只用 1px 发丝线 + 字阶 + 留白，不再用色块画分隔。
     ③ 强调色只做点缀：数字、图标、1px 标记、激活态。不做大面积填充。
     ④ 阴影只用来表达高度，不用来画边框。

   本层位于文件末尾，用于覆盖上面的旧规则；不再需要的旧规则会在后续版本清理。
   ============================================================================ */

/* ---------- §0  令牌扩展 ---------- */
:root {
  --rule: rgba(28, 30, 27, 0.10);
  --rule-strong: rgba(28, 30, 27, 0.24);
}
[data-theme="dark"] {
  --rule: rgba(255, 255, 255, 0.085);
  --rule-strong: rgba(255, 255, 255, 0.20);
}

/* ============================================================================
   §1  外壳：侧边栏 / 顶栏
   ============================================================================ */

.app { position: relative; z-index: 1; }

.sidebar {
  padding: 26px 14px 18px;
  background: var(--sidebar-bg);
  backdrop-filter: blur(28px) saturate(var(--glass-sat));
  -webkit-backdrop-filter: blur(28px) saturate(var(--glass-sat));
  border-left: 1px solid var(--hairline);
}
.sidebar-brand {
  padding: 0 8px 20px;
  border-bottom: 1px solid var(--hairline-soft);
  margin-bottom: 16px;
}
.brand-mark { width: 36px; height: 36px; }
.brand-title { font-size: 16.5px; letter-spacing: 0.2px; }
.brand-sub { font-size: 10.5px; letter-spacing: 1.2px; }

.sidebar-nav { position: relative; gap: 16px; }
/* z-index 对 flex 项生效，无需 position: relative；
   加了它会让 .nav-item 的 offsetParent 变成组，埋下上面那个胶囊错位的坑。 */
.nav-group { gap: 2px; z-index: 1; }
.nav-group-label {
  font-size: 10px;
  letter-spacing: 1.5px;
  padding: 0 12px 6px;
  color: var(--text-muted);
  opacity: 0.82;
}
.nav-item {
  border-radius: 11px;
  padding: 9.5px 12px;
  font-size: 13.5px;
  color: var(--text-secondary);
  isolation: isolate;
  transition:
    background var(--t-fast) var(--ease),
    color var(--t-fast) var(--ease),
    transform var(--t-fast) var(--ease);
}
.nav-item svg { width: 17px; height: 17px; opacity: 0.82; transition: opacity var(--t-fast) var(--ease); }
.nav-item:hover { background: var(--well); color: var(--text); transform: translateX(2px); }
.nav-item:hover svg { transform: none; opacity: 1; }
.nav-item.active {
  background: transparent;
  color: var(--accent);
  box-shadow: none;
}
.nav-item.active svg { opacity: 1; }
.nav-item.active::before { display: none; }
.nav-item.active .nav-badge { background: var(--accent-dim); color: var(--accent); }

/* 滑动的激活胶囊：比「给某一项加底色」更有整体感 */
.nav-ink {
  position: absolute;
  left: 0;
  width: 100%;
  height: 38px;
  border-radius: 11px;
  background: var(--glass-strong);
  box-shadow: inset 0 1px 0 var(--edge), 0 0 0 1px var(--edge-outer), var(--sh-1);
  opacity: 0;
  z-index: 0;
  pointer-events: none;
}
.nav-ink.ready {
  opacity: 1;
  transition: transform var(--t-slow) var(--ease-spring), height var(--t-base) var(--ease), opacity var(--t-base) var(--ease);
}

.nav-badge {
  margin-left: auto;
  background: var(--well);
  color: var(--text-secondary);
  font-size: 10.5px;
  padding: 1.5px 7px;
  border-radius: 999px;
  min-width: 20px;
}

.sidebar-footer { border-top: 1px solid var(--hairline-soft); padding-top: 18px; }
.phd-mini-bar { border-radius: 999px; background: var(--well); }

/* ---------- 主区与顶栏 ---------- */
.main { padding: 0 40px 88px; }

.topbar {
  position: sticky;
  top: 0;
  z-index: 20;
  margin: 0 -40px;
  padding: 20px 40px 16px;
  background: transparent;
  border-bottom: 1px solid transparent;
  transition: background var(--t-base) var(--ease), border-color var(--t-base) var(--ease);
}
.topbar.is-stuck {
  background: var(--glass-thin);
  backdrop-filter: blur(26px) saturate(var(--glass-sat));
  -webkit-backdrop-filter: blur(26px) saturate(var(--glass-sat));
  border-bottom-color: var(--hairline);
}
.panel-title { font-size: 30px; letter-spacing: -0.01em; }
.topbar-date { font-size: 12.5px; color: var(--text-muted); }

.theme-toggle {
  width: 38px; height: 38px;
  background: var(--glass-strong);
  border: 1px solid var(--edge-outer);
  box-shadow: inset 0 1px 0 var(--edge);
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px);
}
.theme-toggle:hover {
  border-color: var(--card-border-hover);
  transform: none;
  box-shadow: inset 0 1px 0 var(--edge), 0 4px 16px -6px var(--accent-glow);
}

.weather-chip {
  background: var(--glass-strong);
  border: 1px solid var(--edge-outer);
  box-shadow: inset 0 1px 0 var(--edge);
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px);
  border-radius: 999px;
  font-size: 12.5px;
}

.btn-refresh {
  background: var(--accent);
  border: 1px solid transparent;
  color: var(--btn-text);
  border-radius: 999px;
  font-size: 12.5px;
  padding: 9px 18px;
  box-shadow: 0 8px 22px -10px var(--accent-glow), inset 0 1px 0 rgba(255, 255, 255, 0.22);
  transition: transform var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease), filter var(--t-fast) var(--ease);
}
.btn-refresh:hover { filter: brightness(1.06); box-shadow: 0 12px 28px -10px var(--accent-glow), inset 0 1px 0 rgba(255, 255, 255, 0.22); }
.btn-refresh:active { transform: scale(0.97); }

/* ============================================================================
   §2  面：卡片与面板
   ============================================================================ */

.panels { position: relative; }
.panel { animation: none; }
.panel.active { animation: panelIn 0.5s var(--ease) both; }

.card {
  background: var(--glass);
  backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  border: 1px solid var(--edge-outer);
  border-radius: var(--radius);
  padding: 26px 26px 24px;
  box-shadow: inset 0 1px 0 var(--edge), var(--sh-2);
  transition:
    transform var(--t-base) var(--ease),
    box-shadow var(--t-base) var(--ease),
    border-color var(--t-base) var(--ease);
}
.card:hover {
  transform: translateY(-3px);
  border-color: var(--edge-outer);
  box-shadow: inset 0 1px 0 var(--edge), var(--sh-3);
}
.card-dot {
  top: 26px; left: 26px;
  width: 5px; height: 5px;
  box-shadow: none;
  background: var(--accent);
}
.card:hover .card-dot { transform: none; box-shadow: 0 0 0 3px var(--accent-dim); }
.card-label {
  font-size: 11px;
  letter-spacing: 1.6px;
  margin-bottom: 18px;
  color: var(--text-muted);
}

/* 统计卡：去方块，只留数字与字阶 */
.stat-card {
  background: var(--glass);
  backdrop-filter: blur(20px) saturate(var(--glass-sat));
  -webkit-backdrop-filter: blur(20px) saturate(var(--glass-sat));
  border: 1px solid var(--edge-outer);
  border-radius: var(--radius);
  box-shadow: inset 0 1px 0 var(--edge), var(--sh-1);
  transition: transform var(--t-base) var(--ease), box-shadow var(--t-base) var(--ease);
}
.stat-card:hover { transform: translateY(-3px); box-shadow: inset 0 1px 0 var(--edge), var(--sh-2); }
.stat-num { font-family: var(--font-mono); letter-spacing: -0.02em; }
.stat-label { font-size: 11px; letter-spacing: 1.4px; color: var(--text-muted); }

/* 面板内不再有「面中面」：把旧的内层填充压到几乎不可见，
   需要分隔的地方一律交给发丝线 */
.pdf-result-card,
.pdf-progress-card,
.todo-mini,
.journal-mini,
.card-graduation-compact,
.grad-compact-info {
  background: transparent;
  border-color: var(--hairline-soft);
}

/* ============================================================================
   §3  按钮：收敛成 主要 / 次要 / 迷你 三档
   ============================================================================ */

.hs-btn, .pdf-mini-btn, .sum-filter-btn, .sum-switch-btn,
.sum-depth-btn, .graduation-add-btn, .pdf-ai-btn, .pdf-open-folder-btn,
.hs-btn:link, .hs-btn:visited {
  border-radius: var(--radius-sm);
  border: 1px solid var(--edge-outer);
  background: var(--glass-strong);
  color: var(--text);
  font-family: var(--font-sans);
  box-shadow: inset 0 1px 0 var(--edge);
  transition:
    transform var(--t-fast) var(--ease),
    background var(--t-fast) var(--ease),
    border-color var(--t-fast) var(--ease),
    box-shadow var(--t-fast) var(--ease);
}
.hs-btn:hover, .pdf-mini-btn:hover, .sum-filter-btn:hover, .sum-switch-btn:hover,
.sum-depth-btn:hover, .graduation-add-btn:hover,
.pdf-ai-btn:hover, .pdf-open-folder-btn:hover {
  transform: translateY(-1px);
  border-color: var(--card-border-hover);
  background: var(--glass-strong);
  color: var(--accent);
  box-shadow: inset 0 1px 0 var(--edge), 0 6px 18px -10px var(--shadow-hover);
}
.hs-btn:active, .pdf-mini-btn:active, .sum-filter-btn:active, .sum-switch-btn:active,
.graduation-add-btn:active, .pdf-ai-btn:active {
  transform: translateY(0) scale(0.975);
}

/* 主要档 */
.hs-btn-primary, .pdf-mini-btn-primary, .btn-primary {
  background: var(--accent);
  color: var(--btn-text);
  border-color: transparent;
  box-shadow: 0 8px 22px -10px var(--accent-glow), inset 0 1px 0 rgba(255, 255, 255, 0.22);
}
.hs-btn-primary:hover, .pdf-mini-btn-primary:hover, .btn-primary:hover {
  background: var(--accent);
  color: var(--btn-text);
  filter: brightness(1.07);
  box-shadow: 0 12px 28px -10px var(--accent-glow), inset 0 1px 0 rgba(255, 255, 255, 0.22);
}
/* 激活档（筛选 / 深度切换） */
.sum-filter-btn.active, .sum-depth-btn.active, .sum-switch-btn.active, .pdf-mini-btn.active {
  background: var(--accent);
  color: var(--btn-text);
  border-color: transparent;
  box-shadow: 0 8px 20px -10px var(--accent-glow);
}

/* ============================================================================
   §4  输入、凹槽与焦点
   ============================================================================ */

.todo-input, .journal-input, .lit-search, .pdf-field input, .pdf-field select,
input[type="text"], input[type="search"], input[type="number"], textarea, select {
  background: var(--well);
  border: 1px solid var(--edge-outer);
  border-radius: var(--radius-sm);
  color: var(--text);
  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.03);
  transition: border-color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease);
}
.todo-input:focus, .journal-input:focus, .lit-search:focus,
input:focus, textarea:focus, select:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: 0 0 0 4px var(--accent-dim);
}
::placeholder { color: var(--text-muted); }

:where(button, a, input, textarea, select, [tabindex]):focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
}

/* ============================================================================
   §5  列表行：用发丝线代替一层层卡片
   ============================================================================ */

.hs-masthead {
  border-top: none;
  border-bottom: 1px solid var(--hairline);
  padding: 2px 2px 16px;
  align-items: flex-end;
}
.hs-masthead-title { font-size: 22px; letter-spacing: 0.10em; }
.hs-masthead-sub { font-size: 12.5px; color: var(--text-muted); letter-spacing: 0; }

.hs-hint {
  background: linear-gradient(90deg, var(--accent-dim), transparent 72%);
  border-left: 2px solid var(--accent);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
  padding: 14px 20px;
  font-size: 13px;
  line-height: 1.85;
  color: var(--text-secondary);
}
.hs-hint code {
  background: var(--well);
  color: var(--accent);
  border-radius: 5px;
  padding: 1px 6px;
  font-family: var(--font-mono);
  font-size: 12px;
}

.hs-list { gap: 0; }
.hs-day-label { border-bottom: 1px solid var(--rule); }

.hs-item {
  background: transparent;
  border: 1px solid transparent;
  border-bottom-color: var(--hairline-soft);
  border-radius: var(--radius-sm);
  padding: 15px 14px;
  box-shadow: none;
  transition:
    background var(--t-fast) var(--ease),
    border-color var(--t-fast) var(--ease),
    box-shadow var(--t-fast) var(--ease);
}
.hs-item:last-child { border-bottom-color: transparent; }
.hs-item:hover {
  background: var(--well);
  border-color: transparent;
  transform: none;
  box-shadow: inset 0 1px 0 var(--edge);
}
.hs-item-title { font-size: 15px; letter-spacing: 0; }
.hs-item-meta { font-size: 11.5px; color: var(--text-muted); }
.hs-item-arrow { opacity: 0.5; }

.hs-session {
  border: 1px solid transparent;
  background: var(--accent-dim);
  color: var(--accent);
  border-radius: 999px;
  font-size: 11px;
  padding: 3px 10px;
  letter-spacing: 0.08em;
}
.hs-session-pm { background: var(--amber-dim); color: var(--amber); border-color: transparent; }

/* ============================================================================
   §6  热点日报 · 报纸版面（这次改动的重点）
   ----------------------------------------------------------------------------
   两个真问题：
     a) .paper-wrap 有底色 + 描边，.paper 又有底色 → 外面套一圈灰环，
        这就是截图里那个「框」。
     b) 生成器实际输出的 .block/.btitle/.chartbox/.cap/.note/.quick/
        .watch/.wtitle/.wbody/.sub 全都没有对应样式（旧规则写的是 .rblock 等
        早已不用的类名），所以一大块内容是「裸的」。这里补齐。
   ============================================================================ */

.paper-wrap {
  background: transparent;
  border: none;
  border-radius: 0;
  padding: 6px 0 40px;
  color: var(--text);
  font-family: var(--font-serif);
  line-height: 1.95;
  font-size: 15px;
}

.paper-wrap .paper {
  position: relative;
  max-width: 1020px;
  margin: 0 auto;
  background: var(--glass);
  backdrop-filter: blur(34px) saturate(var(--glass-sat));
  -webkit-backdrop-filter: blur(34px) saturate(var(--glass-sat));
  border: 1px solid var(--edge-outer);
  border-radius: var(--radius-xl);
  padding: 58px 66px 62px;
  box-shadow: inset 0 1px 0 var(--edge), var(--sh-3);
  animation: unfoldIn 0.75s var(--ease) both;
}
@keyframes unfoldIn {
  from { opacity: 0; transform: translateY(18px) scale(0.994); }
  to   { opacity: 1; transform: none; }
}

/* 报头 */
.paper-wrap .topbar {
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 8px;
  font-size: 11.5px;
  font-family: var(--font-mono);
  color: var(--text-muted);
  letter-spacing: 0.10em;
  padding-bottom: 11px;
  border-bottom: 1px solid var(--hairline);
}
.paper-wrap .masthead {
  text-align: center;
  padding: 30px 0 22px;
  border-bottom: 1px solid var(--rule);
  margin-top: 0;
}
.paper-wrap .masthead h1 {
  font-size: 66px;
  line-height: 1.06;
  font-weight: 900;
  color: var(--text);
  letter-spacing: 0.28em;
  text-indent: 0.28em;
  animation: mastheadSettle 1.15s var(--ease) both;
}
@keyframes mastheadSettle {
  from { letter-spacing: 0.46em; text-indent: 0.46em; opacity: 0; }
  to   { letter-spacing: 0.28em; text-indent: 0.28em; opacity: 1; }
}
.paper-wrap .masthead .sub {
  font-family: var(--font-mono);
  font-size: 11.5px;
  letter-spacing: 0.34em;
  color: var(--text-muted);
  margin-top: 14px;
}
.paper-wrap .metaline {
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 8px;
  font-family: var(--font-mono);
  font-size: 11.5px;
  color: var(--text-muted);
  letter-spacing: 0.02em;
  padding: 12px 0 14px;
  border-bottom: 1px solid var(--rule);
}

/* 本期说明（原文案框）：渐变淡出，而不是又一块灰底 */
.paper-wrap .dedup,
.paper-wrap .quick {
  background: linear-gradient(90deg, var(--accent-dim), transparent 78%);
  border-left: 2px solid var(--accent);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
  padding: 16px 22px 16px 20px;
  font-size: 14px;
  line-height: 1.95;
  color: var(--text-secondary);
}
.paper-wrap .dedup { margin: 26px 0 8px; }
.paper-wrap .dedup b { color: var(--accent); font-weight: 700; }
.paper-wrap .quick {
  margin: 18px 0 0;
  font-size: 13px;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.paper-wrap .quick span { display: block; }

/* 版面 */
.paper-wrap .sec { margin-top: 44px; }
.paper-wrap .sec-head {
  position: relative;
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 16px;
  border-bottom: 1px solid var(--rule-strong);
  padding-bottom: 9px;
  margin-bottom: 20px;
}
.paper-wrap .sec-head::before {
  content: '';
  position: absolute;
  left: 0; bottom: -1px;
  width: 44px; height: 2px;
  background: var(--accent);
  border-radius: 2px;
}
.paper-wrap .sec-head h2 {
  font-size: 20px;
  font-weight: 900;
  letter-spacing: 0.26em;
  text-indent: 0.26em;
  color: var(--text);
}
.paper-wrap .sec-head .kw {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.08em;
  color: var(--text-muted);
  white-space: nowrap;
}

/* 头版双栏：用一根竖发丝线分栏，不再用两个盒子 */
.paper-wrap .head-grid {
  display: grid;
  grid-template-columns: 1.75fr 1fr;
  gap: 0;
}
.paper-wrap .head-grid > .main {
  margin-left: 0;
  padding: 0 34px 0 0;
  flex: none;
  min-width: 0;
}
.paper-wrap .rail {
  border-left: 1px solid var(--hairline);
  padding-left: 34px;
  display: flex;
  flex-direction: column;
  gap: 26px;
}

.paper-wrap .art { margin-bottom: 26px; }
.paper-wrap .art:last-child { margin-bottom: 0; }
.paper-wrap .atitle {
  font-size: 21px;
  font-weight: 900;
  line-height: 1.5;
  margin-bottom: 10px;
  color: var(--text);
  letter-spacing: 0.005em;
}
.paper-wrap .ptag {
  display: inline-block;
  font-family: var(--font-sans);
  font-size: 10.5px;
  font-weight: 600;
  color: var(--accent);
  background: var(--accent-dim);
  border: none;
  border-radius: 6px;
  padding: 2px 8px;
  margin-right: 9px;
  vertical-align: 3px;
  letter-spacing: 0.08em;
}
.paper-wrap p.body {
  font-size: 15px;
  line-height: 1.98;
  text-align: justify;
  text-indent: 2em;
  margin-bottom: 8px;
  color: var(--text);
}
.paper-wrap p.body.noind { text-indent: 0; }
.paper-wrap .dropcap::first-letter {
  float: left;
  font-size: 52px;
  line-height: 0.86;
  padding: 6px 10px 0 0;
  color: var(--accent);
  font-weight: 900;
}

/* 侧栏条目：原来是没有任何样式的裸 div */
.paper-wrap .block { display: block; }
.paper-wrap .btitle {
  font-size: 15px;
  font-weight: 900;
  line-height: 1.55;
  margin-bottom: 7px;
  color: var(--text);
}
.paper-wrap .bbody {
  font-size: 13.5px;
  line-height: 1.9;
  color: var(--text-secondary);
  text-align: justify;
}
.paper-wrap .bsrc,
.paper-wrap .srcline {
  font-family: var(--font-mono);
  font-size: 10.5px;
  color: var(--text-muted);
  letter-spacing: 0.02em;
  line-height: 1.7;
  margin-top: 9px;
  padding-top: 8px;
  border-top: 1px dashed var(--hairline-soft);
}

/* 图表框 */
.paper-wrap .chartbox,
.paper-wrap .fig {
  border: 1px solid var(--hairline);
  background: transparent;
  border-radius: var(--radius-sm);
  padding: 18px 20px 14px;
  margin: 16px 0 14px;
}
.paper-wrap .chartbox svg { display: block; width: 100%; height: auto; }
.paper-wrap .cap,
.paper-wrap .figcap {
  font-size: 12.5px;
  color: var(--text-secondary);
  text-align: center;
  line-height: 1.8;
  margin-bottom: 10px;
  letter-spacing: 0.01em;
}
.paper-wrap .note {
  font-family: var(--font-mono);
  font-size: 10.5px;
  color: var(--text-muted);
  line-height: 1.75;
  margin-top: 10px;
  padding-top: 8px;
  border-top: 1px dashed var(--hairline-soft);
}

/* 观察哨 / 跨期追踪 */
.paper-wrap .watch-grid { gap: 40px; }
.paper-wrap .watch { min-width: 0; }
.paper-wrap .wtitle {
  font-size: 15.5px;
  font-weight: 900;
  line-height: 1.55;
  margin-bottom: 8px;
  color: var(--text);
}
.paper-wrap .wbody p.body { font-size: 14px; }
.paper-wrap .watch + .watch { border-left: 1px solid var(--hairline); padding-left: 40px; }

.paper-wrap .track-row {
  display: grid;
  grid-template-columns: 190px 1fr;
  gap: 26px;
  margin-top: 44px;
  padding-top: 22px;
  border-top: 1px solid var(--rule-strong);
  border-bottom: none;
}
.paper-wrap .track-row h3 {
  font-size: 15px;
  font-weight: 900;
  letter-spacing: 0.14em;
  color: var(--text);
  line-height: 1.7;
}
.paper-wrap .track-row ul { list-style: none; }
.paper-wrap .track-row li {
  font-size: 13.5px;
  line-height: 1.85;
  color: var(--text-secondary);
  padding: 7px 0 7px 16px;
  position: relative;
  border-bottom: 1px dashed var(--hairline-soft);
}
.paper-wrap .track-row li:last-child { border-bottom: none; }
.paper-wrap .track-row li::before {
  content: '';
  position: absolute;
  left: 3px; top: 15px;
  width: 4px; height: 4px;
  border-radius: 50%;
  background: var(--accent);
  opacity: 0.6;
}

.paper-wrap .highlight {
  background: linear-gradient(90deg, var(--accent-dim), transparent 78%);
  border-left: 2px solid var(--accent);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
  padding: 13px 20px;
  margin: 14px 0;
  font-size: 14.5px;
  color: var(--text-secondary);
}
.paper-wrap .flow-left {
  background: linear-gradient(90deg, var(--accent-dim), transparent 85%);
  border: 1px solid var(--hairline);
  border-right: none;
  border-radius: var(--radius-sm) 0 0 var(--radius-sm);
}
.paper-wrap .flow-right {
  background: transparent;
  border: 1px solid var(--hairline);
  border-left: none;
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
}
.paper-wrap .stackbar { border-radius: var(--radius-xs); }
.paper-wrap .seg-d { background: var(--accent); }
.paper-wrap .seg-g { background: var(--info); }
.paper-wrap .seg-o { background: var(--amber); }

.paper-wrap table.data { border-collapse: separate; border-spacing: 0; }
.paper-wrap table.data th {
  background: var(--well);
  border: 1px solid var(--hairline);
  font-weight: 700;
  color: var(--text);
}
.paper-wrap table.data td { border: 1px solid var(--hairline); color: var(--text); }
.paper-wrap table.data tr:nth-child(even) td { background: transparent; }

.paper-wrap ul.briefs li, .paper-wrap ul.track-list li {
  border-bottom: 1px dashed var(--hairline-soft);
  color: var(--text);
}
.paper-wrap ul.briefs li::before { content: ''; width: 4px; height: 4px; border-radius: 50%; background: var(--accent); top: 14px; }

.paper-wrap .footer {
  margin-top: 46px;
  border-top: 1px solid var(--rule-strong);
  padding-top: 18px;
  text-align: left;
  font-family: var(--font-mono);
  font-size: 10.5px;
  line-height: 2;
  color: var(--text-muted);
}
.paper-wrap .footer b { color: var(--text-secondary); font-weight: 600; }
.paper-wrap .footer .disc { color: var(--text-muted); }

@media (max-width: 900px) {
  .paper-wrap .paper { padding: 32px 22px 38px; border-radius: var(--radius-lg); }
  .paper-wrap .masthead h1 { font-size: 40px; letter-spacing: 0.2em; text-indent: 0.2em; }
  .paper-wrap .head-grid { grid-template-columns: 1fr; }
  .paper-wrap .head-grid > .main { padding: 0; }
  .paper-wrap .rail { border-left: none; padding-left: 0; border-top: 1px solid var(--hairline); padding-top: 26px; }
  .paper-wrap .watch-grid { grid-template-columns: 1fr; gap: 26px; }
  .paper-wrap .watch + .watch { border-left: none; padding-left: 0; border-top: 1px solid var(--hairline); padding-top: 22px; }
  .paper-wrap .track-row { grid-template-columns: 1fr; gap: 10px; }
}

/* ============================================================================
   §7  浮层
   ============================================================================ */

.weather-modal-overlay, .pdf-modal-overlay, .pdf-img-lightbox-overlay {
  background: rgba(10, 12, 14, 0.44);
  backdrop-filter: blur(10px) saturate(120%);
  -webkit-backdrop-filter: blur(10px) saturate(120%);
}
.weather-modal-content, .pdf-modal-content {
  background: var(--glass-strong);
  backdrop-filter: blur(34px) saturate(var(--glass-sat));
  -webkit-backdrop-filter: blur(34px) saturate(var(--glass-sat));
  border: 1px solid var(--edge-outer);
  border-radius: var(--radius-lg);
  box-shadow: inset 0 1px 0 var(--edge), var(--sh-3);
}
.pdf-img-lightbox-content { border-radius: var(--radius-lg); overflow: hidden; }

.toast {
  background: var(--toast-bg);
  backdrop-filter: blur(24px) saturate(var(--glass-sat));
  -webkit-backdrop-filter: blur(24px) saturate(var(--glass-sat));
  border: 1px solid var(--edge-outer);
  border-radius: var(--radius-sm);
  box-shadow: inset 0 1px 0 var(--edge), var(--sh-3);
}

/* ============================================================================
   §8  动效
   ============================================================================ */

@keyframes riseIn {
  from { opacity: 0; transform: translateY(16px) scale(0.986); filter: blur(7px); }
  to   { opacity: 1; transform: none; filter: none; }
}
.panel.active .card,
.panel.active .stat-card {
  animation: riseIn 0.62s var(--ease) backwards;
}

/* 主题切换：从按钮位置扩开的圆形揭示 */
html.theme-switching::view-transition-old(root) { animation: none; }
html.theme-switching::view-transition-new(root) {
  animation: themeReveal 0.52s var(--ease);
  mix-blend-mode: normal;
}
@keyframes themeReveal {
  from { clip-path: circle(0% at var(--reveal-x, 92%) var(--reveal-y, 5%)); }
  to   { clip-path: circle(150% at var(--reveal-x, 92%) var(--reveal-y, 5%)); }
}
html.theme-switching { transition: none !important; }

/* 面板标题：切页时轻微上浮 */
.panel-title { transition: opacity var(--t-fast) var(--ease); }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
    scroll-behavior: auto !important;
  }
  .bg-orb { animation: none !important; }
  .paper-wrap .masthead h1 { animation: none !important; }
}

/* ============================================================================
   §9  ⌘K 命令面板
   ============================================================================ */

.cmdk-overlay {
  position: fixed;
  inset: 0;
  z-index: 200;
  display: none;
  align-items: flex-start;
  justify-content: center;
  padding: 14vh 20px 20px;
  background: rgba(10, 12, 14, 0.42);
  backdrop-filter: blur(12px) saturate(120%);
  -webkit-backdrop-filter: blur(12px) saturate(120%);
}
.cmdk-overlay.open { display: flex; animation: cmdkFade 0.2s var(--ease) both; }
@keyframes cmdkFade { from { opacity: 0; } to { opacity: 1; } }

.cmdk {
  width: 100%;
  max-width: 580px;
  background: var(--glass-strong);
  backdrop-filter: blur(38px) saturate(var(--glass-sat));
  -webkit-backdrop-filter: blur(38px) saturate(var(--glass-sat));
  border: 1px solid var(--edge-outer);
  border-radius: var(--radius-lg);
  box-shadow: inset 0 1px 0 var(--edge), var(--sh-3);
  overflow: hidden;
  animation: cmdkIn 0.32s var(--ease-spring) both;
}
@keyframes cmdkIn {
  from { opacity: 0; transform: translateY(-14px) scale(0.97); }
  to   { opacity: 1; transform: none; }
}
.cmdk-input-row {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 18px 20px;
  border-bottom: 1px solid var(--hairline);
}
.cmdk-input-row svg { width: 18px; height: 18px; color: var(--text-muted); flex-shrink: 0; }
.cmdk-input {
  flex: 1;
  border: none !important;
  background: transparent !important;
  box-shadow: none !important;
  font-family: var(--font-sans);
  font-size: 15px;
  color: var(--text);
  padding: 0;
}
.cmdk-input:focus { outline: none; box-shadow: none !important; }
.cmdk-list { max-height: 52vh; overflow-y: auto; padding: 8px; }
.cmdk-group-label {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1.5px;
  color: var(--text-muted);
  padding: 12px 12px 6px;
}
.cmdk-item {
  display: flex;
  align-items: center;
  gap: 12px;
  width: 100%;
  padding: 10px 12px;
  border: none;
  background: transparent;
  border-radius: var(--radius-sm);
  color: var(--text);
  font-family: var(--font-sans);
  font-size: 13.5px;
  text-align: left;
  cursor: pointer;
  transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.cmdk-item svg { width: 17px; height: 17px; color: var(--text-muted); flex-shrink: 0; }
.cmdk-item .cmdk-item-sub {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 10.5px;
  color: var(--text-muted);
}
.cmdk-item.active,
.cmdk-item:hover {
  background: var(--accent-dim);
  color: var(--accent);
}
.cmdk-item.active svg, .cmdk-item:hover svg { color: var(--accent); }
.cmdk-empty { padding: 26px 12px; text-align: center; font-size: 13px; color: var(--text-muted); }
.cmdk-foot {
  display: flex;
  gap: 16px;
  padding: 11px 20px;
  border-top: 1px solid var(--hairline);
  font-family: var(--font-mono);
  font-size: 10.5px;
  color: var(--text-muted);
}
.cmdk-foot kbd {
  font-family: var(--font-mono);
  background: var(--well);
  border-radius: 5px;
  padding: 1px 6px;
  margin-right: 4px;
}
body.cmdk-open { overflow: hidden; }

/* 顶栏的 ⌘K 入口 */
.topbar-search {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 10px 8px 12px;
  background: var(--glass-strong);
  border: 1px solid var(--edge-outer);
  border-radius: 999px;
  box-shadow: inset 0 1px 0 var(--edge);
  color: var(--text-muted);
  font-family: var(--font-sans);
  font-size: 12.5px;
  cursor: pointer;
  transition: border-color var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.topbar-search:hover { border-color: var(--card-border-hover); color: var(--text-secondary); }
.topbar-search svg { width: 15px; height: 15px; }
.topbar-search kbd {
  font-family: var(--font-mono);
  font-size: 10px;
  background: var(--well);
  border-radius: 5px;
  padding: 1.5px 5px;
  color: var(--text-muted);
}

/* ---------- §10  收尾：窄屏 ---------- */
@media (max-width: 1100px) {
  .main { padding: 0 24px 72px; }
  .topbar { margin: 0 -24px; padding: 18px 24px 14px; }
}

/* ============================================================================
   V3.1 · 首轮实测后的修正
   ----------------------------------------------------------------------------
   实测发现三件事：
     1) AI 生成的光场自带暖调，饱和度没压住时整页会偏粉橘 —— 已把光场改为
        「只提供明暗起伏」，色相完全交给三个色晕控制。
     2) 亮色模式下玻璃面与纸底对比不足，卡片糊在一起 —— 提高玻璃不透明度。
     3) V3 里误把 .pdf-result-card 等顶层卡片也设成了透明（它们本身就是 .card），
        这里按「顶层卡片 = 玻璃面 / 卡内次级区块 = 无填充」重新区分。
   ============================================================================ */

/* ---------- 顶层卡片：是面，要玻璃 ---------- */
.pdf-result-card,
.pdf-progress-card {
  background: var(--glass);
  backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  border-color: var(--edge-outer);
  box-shadow: inset 0 1px 0 var(--edge), var(--sh-2);
}

/* ---------- 卡内次级区块：不是面，不要填充 ---------- */
.todo-mini,
.journal-mini,
.card-graduation-compact,
.grad-compact-info {
  background: transparent;
  box-shadow: none;
}

/* ---------- PDF 拖拽区：虚线轮廓，不用色块 ---------- */
.pdf-dropzone {
  background: transparent;
  border: 1px dashed var(--rule);
  border-radius: var(--radius);
  transition: border-color var(--t-fast) var(--ease), background var(--t-fast) var(--ease);
}
.pdf-dropzone:hover,
.pdf-dropzone.dragging {
  border-color: var(--accent);
  background: var(--accent-dim);
}
.pdf-dropzone.has-file {
  background: var(--accent-dim);
  border-style: solid;
  border-color: var(--accent);
}

/* ---------- 引擎选项：未选中完全透明，选中只在左侧立一条标记 ----------
   这样一组选项里最多只有一个带色元素，不会又变成「一堆方块」。            */
.pdf-engine-row { display: flex; flex-direction: column; gap: 4px; }
.pdf-engine-opt {
  background: transparent;
  border: 1px solid transparent;
  border-radius: var(--radius-sm);
  padding: 12px 14px;
  transition: background var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease);
}
.pdf-engine-opt:hover {
  background: var(--well);
  border-color: transparent;
}
.pdf-engine-opt:has(input:checked) {
  background: var(--accent-dim);
  border-color: transparent;
  box-shadow: inset 3px 0 0 0 var(--accent);
}

/* ---------- 侧边栏底部留白 ---------- */
.sidebar { padding-bottom: 24px; }

/* ---------- V3.2 修正 ----------
   把 .pdf-engine-row 改成 column 之后，子项原本的 flex: 1 1 240px 里
   flex-basis 从「宽度」变成了「高度」，选项被撑成 240px 高的大色块。
   这里把子项的伸缩规则改回「高度由内容决定」。                        */
.pdf-engine-row { flex-direction: column; }
.pdf-engine-opt { flex: 0 0 auto; width: 100%; }

/* 已选文件时只要一条 accent 描边，不要再叠一层色底 */
.pdf-dropzone.has-file { background: transparent; }

/* 光场色晕稍微抬一点存在感：上一版压得过头，页面太「白」了 */
:root .bg-orb.o1 {
  left: -6vw; top: -24vw;
  background: radial-gradient(circle at 50% 50%, rgba(20, 184, 166, 0.15), transparent 68%);
}

/* ---------- V3.3 修正 ----------
   .sidebar-nav 是 flex: 1 的滚动容器，但缺 min-height: 0 ——
   flex 项默认不会缩到内容高度以下，于是它把 .sidebar-footer 顶出视口，
   侧边栏底部的「2026.09 — 2030.06」被裁掉。                          */
.sidebar-nav { min-height: 0; }

/* 博士进度是居中排版的 hero 卡，左上角那个圆点会和居中标题打架 */
.card-phd .card-dot { display: none; }

/* ---------- 行内 SVG 图标：替代原先混用的 emoji ---------- */
.ico-inline {
  width: 14px;
  height: 14px;
  flex: none;
  vertical-align: -2px;
}
.sum-depth-icon .ico-inline { width: 20px; height: 20px; vertical-align: 0; }
.sum-empty-icon .ico-inline { width: 30px; height: 30px; vertical-align: 0; }
.pdf-translation-icon { display: flex; align-items: center; justify-content: center; }
.pdf-translation-icon .ico-inline { width: 22px; height: 22px; }
.pdf-token-icon { display: inline-flex; align-items: center; }
.pdf-ai-btn .ico-inline, .pdf-mini-btn .ico-inline, .hs-btn .ico-inline,
.sum-filter-btn .ico-inline, .sum-switch-btn .ico-inline { margin-right: 5px; }
.pdf-sel-btn .ico-inline { margin-right: 5px; }


/* ============================================================================
   V4 · 天气弹窗改版（去 emoji → 线性 SVG）+ 暗夜背景通透度修正
   约定：只做覆盖，不改动上方主表。
   ============================================================================ */

/* ---------- 暗夜背景：从「灰雾」改成「黑场 + 冷光」 ----------
   根因：暗色下 --bg-photo-opacity 高达 0.95，而旧底图均值 RGB(48,46,46)、
   饱和度仅 11%、亮度只在 40–82 之间 —— 等于把整页压在一层灰雾上。
   现在底图换成近黑 + 冷色光核（亮度 2–103、饱和度 69%），并把不透明度降到 0.82。 */
[data-theme="dark"] .bg-orb { opacity: 0.72; }
[data-theme="dark"] .bg-orb.o1 { background: radial-gradient(circle at 50% 50%, rgba(94, 234, 212, 0.10), transparent 68%); }
[data-theme="dark"] .bg-orb.o2 { background: radial-gradient(circle at 50% 50%, rgba(167, 139, 250, 0.085), transparent 70%); }
[data-theme="dark"] .bg-orb.o3 { background: radial-gradient(circle at 50% 50%, rgba(56, 189, 248, 0.075), transparent 72%); }
[data-theme="dark"] .bg-key { background: radial-gradient(ellipse 74% 46% at 50% -16%, rgba(94, 234, 212, 0.10), transparent 70%); }
[data-theme="dark"] .bg-fade { height: 28vh; opacity: 0.85; }

/* 细颗粒。大面积暗部渐变在 8bit 屏上一定会出色带，色带本身就会被读成「脏」，
   叠一层极轻的胶片颗粒即可打散。静态图层，不参与滚动重绘。 */
.bg-grain {
  position: absolute;
  inset: 0;
  opacity: 0.25;
  mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23g)' opacity='0.5'/%3E%3C/svg%3E");
}
[data-theme="light"] .bg-grain { opacity: 0.14; }

/* ---------- 线性图标的基础规范 ---------- */
.wx-ico {
  width: 1em;
  height: 1em;
  display: block;
  flex: 0 0 auto;
}
.wx-ico-xs { width: 12px; height: 12px; }

/* ---------- 弹窗外壳 ---------- */
.weather-modal-content { border-radius: var(--radius-xl); }
.weather-modal-header {
  padding: 18px 24px;
  background: var(--glass-strong);
  -webkit-backdrop-filter: blur(20px) saturate(var(--glass-sat));
  backdrop-filter: blur(20px) saturate(var(--glass-sat));
  border-bottom: 1px solid var(--hairline);
}
.weather-modal-title { font-size: 15px; gap: 9px; letter-spacing: 0.01em; }
.weather-modal-icon { display: flex; align-items: center; color: var(--accent); font-size: 22px; }
.weather-modal-close { border-radius: 999px; padding: 7px; }
.weather-modal-close:hover { background: var(--well); color: var(--text); }
.weather-modal-footer {
  padding: 11px 24px 12px;
  border-top: 1px solid var(--hairline-soft);
  font-size: 11px;
  color: var(--text-muted);
  letter-spacing: 0.01em;
}
[data-theme="dark"] .weather-modal-content { background: rgba(22, 26, 30, 0.74); }

/* ---------- 当前天气 ---------- */
.weather-modal-body .weather-main { padding: 26px 24px 22px; gap: 26px; }
.weather-temp-block { display: flex; align-items: center; gap: 18px; }
.weather-now-icon {
  display: flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
  font-size: 54px;
  color: var(--accent);
  filter: drop-shadow(0 8px 20px var(--accent-glow));
}
.weather-readout { display: flex; flex-direction: column; min-width: 0; }
.weather-temp { font-size: 66px; letter-spacing: -0.04em; }
.weather-temp::after { font-size: 22px; margin-left: 3px; }
.weather-desc { font-size: 17px; margin-top: 6px; }
.weather-feels { font-size: 12.5px; color: var(--text-muted); margin-top: 3px; }

/* 详情：图标 / 标签 / 数值三列，数值统一右对齐 + 等宽数字，杜绝右侧参差 */
.weather-details { gap: 13px 20px; }
.weather-detail-item {
  display: grid;
  grid-template-columns: 15px auto minmax(0, 1fr);
  align-items: center;
  gap: 8px;
  min-width: 0;
}
.weather-detail-icon { display: flex; color: var(--text-muted); font-size: 15px; }
.weather-detail-label { min-width: 0; color: var(--text-muted); font-size: 12.5px; }
.weather-detail-value {
  text-align: right;
  font-family: var(--font-mono);
  font-size: 12.5px;
  font-weight: 500;
  letter-spacing: -0.01em;
}

/* ---------- 三日预报 ---------- */
.weather-forecast {
  gap: 1px;
  background: var(--hairline);
  border-top: 1px solid var(--hairline);
}
.weather-forecast-day {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 7px;
  padding: 18px 14px 17px;
  background: transparent;
}
.weather-forecast-day:hover { background: var(--well); }
.weather-forecast-day:has(.weather-forecast-date.today) { background: var(--accent-dim); }
.weather-forecast-day:has(.weather-forecast-date.today):hover { background: var(--accent-dim); }
.weather-forecast-day:has(.weather-forecast-date.today)::before {
  content: '';
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 2px;
  background: var(--accent);
}
.weather-forecast-date { margin-bottom: 0; font-size: 11.5px; letter-spacing: 0.02em; }
.weather-forecast-date.today { color: var(--accent); font-weight: 600; }
.weather-forecast-icon { font-size: 30px; margin-bottom: 0; color: var(--text-secondary); }
.weather-forecast-day:has(.weather-forecast-date.today) .weather-forecast-icon { color: var(--accent); }
.weather-forecast-temp {
  display: flex;
  align-items: baseline;
  gap: 3px;
  font-family: var(--font-mono);
  font-size: 14px;
  letter-spacing: -0.01em;
}
.weather-forecast-desc { margin-top: 0; font-size: 11.5px; color: var(--text-muted); }
.weather-forecast-precip {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  margin-top: 0;
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--accent);
}

/* ---------- 空气质量：方块 → 环形表盘 ---------- */
.weather-modal-body .weather-bottom { padding: 20px 24px 22px; gap: 26px; border-top: 1px solid var(--hairline); }
.weather-aqi {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  gap: 15px;
  padding: 0;
  background: none;
  border-radius: 0;
  text-align: left;
}
.weather-aqi-ring { position: relative; width: 78px; height: 78px; flex: 0 0 auto; }
.aqi-ring-svg { width: 78px; height: 78px; transform: rotate(-90deg); }
.aqi-ring-track { fill: none; stroke: var(--hairline); stroke-width: 2.2; }
.aqi-ring-arc {
  fill: none;
  stroke: var(--aqi-color, var(--accent));
  stroke-width: 2.2;
  stroke-linecap: round;
  transition: stroke-dashoffset 760ms var(--ease), stroke 300ms var(--ease);
}
.weather-aqi-value {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-mono);
  font-size: 25px;
  font-weight: 600;
  line-height: 1;
  letter-spacing: -0.03em;
}
.weather-aqi-meta { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.weather-aqi-label { margin-bottom: 0; font-size: 11px; color: var(--text-muted); letter-spacing: 0.02em; }
.weather-aqi-category { margin-top: 0; font-size: 14px; font-weight: 600; }

/* ---------- 生活指数胶囊 ---------- */
.weather-index-tag {
  gap: 7px;
  padding: 7px 12px 7px 10px;
  border-radius: 999px;
  background: var(--well);
  border: 1px solid transparent;
  transition: background var(--t-base) var(--ease), border-color var(--t-base) var(--ease);
}
.weather-index-tag:hover { background: var(--accent-dim); border-color: var(--accent-glow); }
.weather-index-ico { display: flex; color: var(--text-muted); font-size: 13px; transition: color var(--t-base) var(--ease); }
.weather-index-tag:hover .weather-index-ico { color: var(--accent); }
.weather-index-name { color: var(--text-secondary); }
.weather-index-category { color: var(--text); }

/* ---------- 天气预警 ---------- */
.weather-alerts { border-top: 1px solid var(--hairline); }
.weather-alert-item { padding: 12px 24px; gap: 11px; font-size: 12.5px; border-bottom: 1px solid var(--hairline-soft); }
.weather-alert-badge { border-radius: 999px; padding: 3px 10px; font-size: 10.5px; letter-spacing: 0.02em; }
.weather-alert-event { color: var(--text); font-weight: 500; }
.weather-alert-sender { margin-left: auto; color: var(--text-muted); font-size: 11.5px; }

/* ---------- 小屏收敛 ---------- */
@media (max-width: 720px) {
  .weather-now-icon { font-size: 42px; }
  .weather-temp { font-size: 52px; }
  .weather-modal-body .weather-bottom { flex-direction: column; align-items: flex-start; gap: 20px; }
}

/* ---------- V4.1 光学修正 ----------
   1) 详情改 2 列：右对齐等宽数值后，3 列会让「1023 hPa / 06:09 / 18:47」这类长值被省略号截断；
   2) 小尺寸线性图标必须补偿描边，否则 15px 下笔画被缩放成 1px 会显得发虚。
      大图标（54px）反而要收细，两处分别处理。 */
.weather-details { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.weather-detail-label { white-space: nowrap; }

.weather-detail-icon { font-size: 16px; }
.weather-detail-icon .wx-ico { stroke-width: 1.9; }
.weather-index-ico { font-size: 14px; }
.weather-index-ico .wx-ico { stroke-width: 2; }
.weather-forecast-icon .wx-ico { stroke-width: 1.6; }
.weather-now-icon .wx-ico { stroke-width: 1.45; }
.weather-modal-icon .wx-ico { stroke-width: 1.8; }
.weather-forecast-precip .wx-ico { stroke-width: 2; }

/* ============================================================================
   V5 · 天气弹窗可读性修正（仅亮色）
   实测：亮色 --text-muted #8A938E 在弹窗近白玻璃面 (#E7E7E7) 上对比度仅 2.56:1，
        低于 WCAG 大字门槛 3:1，更远低于正文 4.5:1；同一个令牌在暗色下是 4.60:1 达标。
   处理：用一个中间令牌把「标签层」在亮色提到 --text-secondary (#4B5350 → 6.51:1)，
        暗色保持原样。层级仍清晰：数值/正文 13.2:1 > 标签 6.51:1。
   不动全局 --text-muted（属用户已定稿的设计系统，另议）。
   ============================================================================ */
:root { --wx-label: var(--text-secondary); }
[data-theme="dark"] { --wx-label: var(--text-muted); }

.weather-detail-label,
.weather-detail-icon { color: var(--wx-label); }
.weather-forecast-date:not(.today),
.weather-forecast-desc { color: var(--wx-label); }

/* ============================================================================
   V6 · 去掉侧栏底部那条多余的横杠
   ----------------------------------------------------------------------------
   那条横杠是 .sidebar-nav 的横向滚动条（有轨道 + 圆角滑块），不是装饰线。
   成因：这里只声明了 overflow-y: auto，而按 CSS 规范，一轴不是 visible 时
   另一轴会自动提升为 auto —— 于是 .nav-item:hover 的 translateX(2px)
   （实测 scrollWidth 233 > clientWidth 231）就触发了一条横向滚动条，
   常驻在 footer 上方，也就是我们不想看到的「横杠」。
   导航本来就不该横向滚动：把横向直接关掉，纵向滚动仍保留给「窗口太矮」的场景。
   ============================================================================ */
.sidebar-nav { overflow-x: hidden; }

/* ===== V6：顶刊标题中文翻译 + 科技爱好者周刊板块（2026-09-11） ===== */
.news-title-zh {
  font-size: 12.5px;
  line-height: 1.5;
  color: var(--text-secondary);
  margin-top: 3px;
  font-weight: 400;
}
/* ===== V8：日报型板块 UI 统一（2026-09-11 晚） =====
   周刊条目并入 hs-item 归档风格；空态图标全部换内联 SVG（界面禁 emoji） */
a.hs-item { text-decoration: none; color: inherit; }
.hs-session-wk {
  background: var(--accent-dim);
  color: var(--accent);
  border-color: transparent;
  font-family: var(--font-mono);
}
.sum-card-depth svg {
  width: 12px;
  height: 12px;
  margin-right: 4px;
  vertical-align: -1.5px;
}
.todo-empty-icon svg { width: 36px; height: 36px; }
.pdf-img-lightbox-close svg { width: 15px; height: 15px; display: block; }

/* ===== V7：arXiv 追踪（文献工具子面板）+ 前沿瞭望通道标签（2026-09-11） ===== */
.arxiv-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 16px;
  flex-wrap: wrap;
}
.arxiv-hint { font-size: 12.5px; color: var(--text-secondary); }
.arxiv-hint a { color: var(--accent); text-decoration: none; }
.arxiv-hint a:hover { text-decoration: underline; }
.arxiv-list { display: flex; flex-direction: column; gap: 10px; }
.arxiv-item {
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: var(--radius-sm);
  padding: 14px 18px;
  transition: all 0.2s ease;
  animation: todoIn 0.3s ease;
}
.arxiv-item:hover {
  border-color: var(--accent);
  box-shadow: 0 3px 12px var(--shadow-hover);
  transform: translateY(-1px);
}
.arxiv-main { min-width: 0; }
.arxiv-title {
  font-family: var(--font-sans);
  font-size: 14px;
  font-weight: 600;
  color: var(--text);
  text-decoration: none;
  line-height: 1.55;
}
.arxiv-title:hover { color: var(--accent); }
.arxiv-abs {
  font-size: 12.5px;
  color: var(--text-secondary);
  line-height: 1.7;
  margin-top: 5px;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.arxiv-meta {
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
  font-size: 11px;
  color: var(--text-muted);
  margin-top: 7px;
  font-family: var(--font-mono);
}
.arxiv-id { color: var(--accent); font-weight: 500; }
.hs-session-fr { background: var(--accent-dim); color: var(--accent); border-color: transparent; }

/* ===== V9：摘要卡片检索 / 标签（2026-09-11 深夜） ===== */
.sum-toolbar { margin: 14px 0 10px; }
.sum-search {
  display: flex;
  align-items: center;
  gap: 8px;
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: var(--radius-md);
  padding: 9px 14px;
  transition: border-color .15s ease, box-shadow .15s ease;
}
.sum-search:focus-within {
  border-color: var(--accent);
  box-shadow: 0 0 0 3px var(--accent-dim);
}
.sum-search .ico-inline { width: 15px; height: 15px; color: var(--text-muted); flex: 0 0 auto; }
.sum-search input {
  flex: 1;
  min-width: 0;
  border: 0;
  outline: 0;
  background: transparent;
  font-family: var(--font-sans);
  font-size: 13.5px;
  color: var(--text);
}
.sum-search input::placeholder { color: var(--text-muted); }
.sum-search input::-webkit-search-cancel-button { -webkit-appearance: none; }

.sum-tag-filter { display: flex; flex-wrap: wrap; gap: 7px; margin-bottom: 14px; }
.sum-tag-btn {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font-family: var(--font-sans);
  font-size: 12px;
  padding: 4px 11px;
  border-radius: 999px;
  border: 1px solid var(--card-border);
  background: transparent;
  color: var(--text-secondary);
  cursor: pointer;
  transition: all .15s ease;
}
.sum-tag-btn:hover { border-color: var(--accent); color: var(--accent); }
.sum-tag-btn.active { background: var(--accent-dim); color: var(--accent); border-color: transparent; }
.sum-tag-count { font-family: var(--font-mono); font-size: 10.5px; opacity: .65; }

.sum-card-tags { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.sum-card-tag {
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--accent);
  background: var(--accent-dim);
  padding: 2px 8px;
  border-radius: 4px;
}

.sum-tags-editor {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
  padding: 10px 14px;
  margin-bottom: 12px;
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: var(--radius-md);
}
.sum-tags-label { font-size: 12px; color: var(--text-muted); flex: 0 0 auto; }
.sum-tag-chips { display: inline-flex; flex-wrap: wrap; gap: 6px; }
.sum-tag-chip {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font-size: 12px;
  color: var(--accent);
  background: var(--accent-dim);
  padding: 3px 9px;
  border-radius: 999px;
  cursor: pointer;
  transition: opacity .15s ease;
}
.sum-tag-chip:hover { opacity: .75; }
.sum-tag-chip .ico-inline { width: 11px; height: 11px; }
.sum-tag-empty { font-size: 12px; color: var(--text-muted); }
.sum-tags-editor input {
  flex: 1;
  min-width: 140px;
  border: 0;
  outline: 0;
  background: transparent;
  font-family: var(--font-sans);
  font-size: 13px;
  color: var(--text);
}
.sum-tags-editor input::placeholder { color: var(--text-muted); }

/* ===== V9 补充：资讯条目「送转写」按钮 ===== */
.news-transcribe-btn {
  margin-left: auto;
  flex: 0 0 auto;
  font-family: var(--font-sans);
  font-size: 11.5px;
  padding: 3px 10px;
  border-radius: 999px;
  border: 1px solid var(--accent);
  background: transparent;
  color: var(--accent);
  cursor: pointer;
  transition: all .15s ease;
}
.news-transcribe-btn:hover { background: var(--accent-dim); box-shadow: 0 1px 6px var(--shadow-hover); }
.news-transcribe-btn:active { transform: translateY(1px); }

/* ===== V9 补充：资讯相关度过滤 ===== */
.news-filter-row {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  flex-wrap: wrap;
  margin-bottom: 14px;
}
.news-filter-row .news-tabs { flex: 1; min-width: 0; margin-bottom: 0; }
.news-rel-toggle {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  flex: 0 0 auto;
  font-family: var(--font-sans);
  font-size: 12.5px;
  padding: 5px 12px;
  border-radius: 999px;
  border: 1px solid var(--card-border);
  background: transparent;
  color: var(--text-secondary);
  cursor: pointer;
  transition: all .15s ease;
}
.news-rel-toggle svg { width: 13px; height: 13px; }
.news-rel-toggle:hover { border-color: var(--accent); color: var(--accent); }
.news-rel-toggle.active { background: var(--accent-dim); color: var(--accent); border-color: transparent; }
.news-matched {
  font-size: 11px;
  color: var(--text-muted);
  font-family: var(--font-mono);
  margin-top: 4px;
}

/* ===== V10：今日工作台（概览顶部动线入口） ===== */
.today-board {
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: var(--radius-lg);
  padding: 20px 22px;
  margin-bottom: 24px;
}
.today-head { margin-bottom: 16px; }
.today-title {
  font-family: var(--font-serif);
  font-size: 19px;
  font-weight: 700;
  color: var(--text);
  letter-spacing: .04em;
}
.today-sub {
  font-size: 12.5px;
  color: var(--text-secondary);
  margin-top: 5px;
  font-family: var(--font-mono);
}
.today-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 18px;
}
@media (max-width: 1080px) {
  .today-grid { grid-template-columns: 1fr; gap: 14px; }
}
.today-col { min-width: 0; }
.today-col-head {
  display: flex;
  align-items: center;
  gap: 7px;
  font-size: 12px;
  font-weight: 500;
  color: var(--text-muted);
  letter-spacing: .08em;
  padding-bottom: 8px;
  border-bottom: 1px solid var(--hairline, var(--card-border));
  margin-bottom: 10px;
}
.today-count {
  font-family: var(--font-mono);
  background: var(--accent-dim);
  color: var(--accent);
  border-radius: 999px;
  padding: 0 7px;
  font-size: 10.5px;
}
.today-empty { font-size: 12.5px; color: var(--text-muted); padding: 6px 0; }

.today-todo, .today-feed, .today-paper {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 7px 8px;
  margin: 0 -8px;
  border-radius: 8px;
  cursor: pointer;
  transition: background .15s ease;
}
.today-todo:hover, .today-feed:hover, .today-paper:hover { background: var(--surface-2, var(--accent-dim)); }
.today-todo-dot {
  width: 6px; height: 6px; border-radius: 50%;
  background: var(--accent); flex: 0 0 auto;
}
.today-todo-text {
  font-size: 13px; color: var(--text);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.today-more { font-size: 11.5px; color: var(--text-muted); padding: 4px 0 0; cursor: pointer; }
.today-more:hover { color: var(--accent); }

.today-feed-name { font-size: 13px; color: var(--text); flex: 0 0 auto; }
.today-feed-latest {
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--text-muted);
  margin-left: auto;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.today-new {
  font-size: 10px;
  background: var(--accent);
  color: var(--btn-text, #fff);
  border-radius: 3px;
  padding: 1px 5px;
  flex: 0 0 auto;
}
.today-paper-title {
  font-size: 13px; color: var(--text);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.today-paper-date {
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--text-muted);
  margin-left: auto;
  flex: 0 0 auto;
}

/* ===== V10 补充：已入库标记 ===== */
.news-flags {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  margin-top: 5px;
}
.news-owned {
  font-size: 10.5px;
  font-family: var(--font-sans);
  color: var(--success, #059669);
  border: 1px solid currentColor;
  border-radius: 3px;
  padding: 1px 6px;
  opacity: .85;
}
.news-matched {
  font-size: 11px;
  color: var(--text-muted);
  font-family: var(--font-mono);
}

/* ============================================================================
   V11 · 转写结果头部改版 + 顶栏窄屏收纳
   约定：只做覆盖，不改动上方主表。
   背景：结果头部原来裸露 data/pdf_jobs/...result.md 内部路径（又长又丑，
   窄窗口时 break-all 逐字竖排）；顶栏右侧四胶囊在窗口收窄时把「面板标题 +
   日期」挤压竖排，滚动后玻璃底未及时出现还叠影。
   ========================================================================== */

/* ---------- 一、转写结果头部：文件名 masthead ---------- */
.pdf-result-head {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: 10px 16px;
  margin: 8px 0 14px;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--hairline, var(--card-border));
}
.pdf-result-id {
  flex: 1 1 280px;
  min-width: 0;
}
.pdf-result-title {
  font-family: var(--font-serif);
  font-size: 17px;
  font-weight: 700;
  line-height: 1.45;
  color: var(--text);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.pdf-result-meta {
  margin-top: 4px;
  font-family: var(--font-mono);
  font-size: 11.5px;
  color: var(--text-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.pdf-result-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  flex: 0 0 auto;
}
.pdf-result-actions .pdf-mini-btn { white-space: nowrap; }

/* 很窄时标题允许折两行，按钮行自动换行 */
@media (max-width: 760px) {
  .pdf-result-title {
    white-space: normal;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
  }
  .pdf-result-actions { flex: 1 1 100%; }
}

/* ---------- 二、顶栏窄屏收纳：先搜后天再刷，逐级收成图标 ---------- */
.topbar-left { min-width: 0; }
.panel-title { white-space: nowrap; }

@media (max-width: 1380px) {
  .topbar-search span, .topbar-search kbd { display: none; }
  .topbar-search {
    width: 38px; height: 38px;
    padding: 0; gap: 0;
    justify-content: center;
  }
  .topbar-search svg { flex: 0 0 auto; }
}
@media (max-width: 1240px) {
  .weather-chip span { display: none; }
  .weather-chip {
    width: 38px; height: 38px;
    padding: 0; gap: 0;
    justify-content: center;
  }
  .weather-chip svg { flex: 0 0 auto; }
}
@media (max-width: 1120px) {
  .btn-refresh span { display: none; }
  .btn-refresh {
    width: 38px; height: 38px;
    padding: 0; gap: 0;
    justify-content: center;
  }
  .btn-refresh svg { flex: 0 0 auto; }
}
@media (max-width: 980px) {
  .topbar-date { display: none; }
}

/* ============================================================================
   V12 · 转写完成后的工作区比例
   背景：结果显示后，左侧「上传 PDF」卡使命完成却仍占 320–400px，
   右侧可读内容被挤成细条（1100px 窗口时右栏仅 ~360px）。
   ========================================================================== */

/* 一、结果卡出现时：左栏收窄，把宽度让给右侧内容 */
.pdf-workspace:has(#pdfResultCard:not([hidden])) {
  grid-template-columns: minmax(260px, 312px) minmax(0, 1fr);
}

/* 二、单列断点提前：≤1280px 就上下堆叠，结果区拿全宽
   （须连 :has 结果态选择器一起写，否则其 ID 特异度会压过本条） */
@media (max-width: 1280px) {
  .pdf-workspace,
  .pdf-workspace:has(#pdfResultCard:not([hidden])) { grid-template-columns: 1fr; }
}

/* ============================================================================
   V13 · 升级批：勾选模式/综述模态/轻收录/番茄钟/周回顾/日志互链
   约定：只做覆盖与新增，不改动上方主表。
   ========================================================================== */

/* ---------- 一、摘要卡片勾选模式 ---------- */
.sum-card { position: relative; }
.sum-card-check {
  position: absolute;
  top: 14px; right: 14px;
  width: 20px; height: 20px;
  border: 1.5px solid var(--edge-outer, var(--card-border));
  border-radius: 50%;
  background: var(--glass-strong);
  cursor: pointer;
  opacity: 0;
  transition: opacity var(--t-fast) var(--ease), background var(--t-fast) var(--ease);
  z-index: 2;
}
.sum-select-on .sum-card-check { opacity: .55; }
.sum-card-check:hover { opacity: 1; }
.sum-card.selected .sum-card-check {
  opacity: 1;
  background: var(--accent);
  border-color: var(--accent);
  box-shadow: 0 0 0 3px var(--accent-dim);
}
.sum-card.selected { border-color: var(--accent); }

.sum-action-bar {
  position: sticky;
  bottom: 16px;
  z-index: 30;
  display: flex;
  align-items: center;
  gap: 10px;
  margin-top: 16px;
  padding: 10px 16px;
  border-radius: 14px;
  background: var(--glass-strong);
  border: 1px solid var(--edge-outer);
  backdrop-filter: blur(22px) saturate(var(--glass-sat));
  -webkit-backdrop-filter: blur(22px) saturate(var(--glass-sat));
  box-shadow: 0 14px 40px -14px var(--shadow-hover), inset 0 1px 0 var(--edge);
}
.sum-action-count {
  font-family: var(--font-mono);
  font-size: 12.5px;
  color: var(--text-secondary);
  margin-right: auto;
}

/* ---------- 二、综述草稿模态 ---------- */
.review-modal { position: fixed; inset: 0; z-index: 1500; }
.review-modal-overlay {
  position: absolute; inset: 0;
  background: rgba(10, 14, 13, .45);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
}
.review-modal-content {
  position: absolute;
  left: 50%; top: 50%;
  transform: translate(-50%, -50%);
  width: min(860px, 92vw);
  max-height: 86vh;
  display: flex;
  flex-direction: column;
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: var(--radius-lg, 20px);
  box-shadow: 0 30px 80px -20px rgba(0,0,0,.35);
  overflow: hidden;
}
.review-modal-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 16px 20px 10px;
}
.review-modal-title {
  font-family: var(--font-serif);
  font-size: 17px; font-weight: 700; color: var(--text);
}
.review-modal-toolbar {
  display: flex; gap: 8px; flex-wrap: wrap;
  padding: 0 20px 12px;
}
.review-modal-toolbar input {
  flex: 1 1 240px;
  background: var(--well);
  border: 1px solid var(--edge-outer);
  border-radius: var(--radius-sm, 8px);
  padding: 8px 12px;
  font-size: 13px;
  color: var(--text);
}
.review-modal-status {
  padding: 10px 20px;
  font-size: 12.5px;
  color: var(--text-secondary);
  font-family: var(--font-mono);
}
.review-modal-body {
  margin: 0 20px 20px;
  padding: 18px 20px;
  overflow-y: auto;
  background: var(--input-bg, var(--well));
  border: 1px solid var(--edge-outer);
  border-radius: var(--radius-md, 12px);
  font-size: 14px;
  line-height: 1.8;
  color: var(--text);
}
.review-modal-body h1, .review-modal-body h2 { font-family: var(--font-serif); font-size: 17px; margin: 18px 0 8px; }
.review-modal-body h3 { font-size: 14.5px; margin: 14px 0 6px; color: var(--accent); }
.review-modal-body p { margin: 6px 0; }
.review-modal-body ul { margin: 6px 0; padding-left: 20px; }

/* ---------- 三、资讯「收录」按钮 ---------- */
.news-quick-add-btn {
  margin-left: 6px;
  font-size: 11px;
  font-family: var(--font-sans);
  color: var(--text-secondary);
  background: var(--glass-strong);
  border: 1px solid var(--edge-outer);
  border-radius: 999px;
  padding: 2px 10px;
  cursor: pointer;
  transition: color var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease);
}
.news-quick-add-btn:hover { color: var(--accent); border-color: var(--accent); }

/* ---------- 四、待办「专注」按钮 ---------- */
.todo-card-pomo {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  font-size: 12px;
  color: var(--text-muted);
  background: none;
  border: none;
  cursor: pointer;
  padding: 6px;
  transition: color var(--t-fast) var(--ease);
}
.todo-card-pomo:hover { color: var(--accent); }

/* ---------- 五、番茄钟浮条 ---------- */
/* display:flex 会覆盖 hidden 的 UA 样式，必须显式兜底 */
.pomo-timer[hidden] { display: none !important; }
.sum-action-bar[hidden] { display: none !important; }
.review-modal[hidden] { display: none !important; }
.pomo-timer {
  position: fixed;
  right: 24px; bottom: 24px;
  z-index: 1400;
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 12px 16px;
  border-radius: 18px;
  background: var(--glass-strong);
  border: 1px solid var(--edge-outer);
  backdrop-filter: blur(24px) saturate(var(--glass-sat));
  -webkit-backdrop-filter: blur(24px) saturate(var(--glass-sat));
  box-shadow: 0 18px 50px -16px var(--shadow-hover), inset 0 1px 0 var(--edge);
}
.pomo-ring { width: 46px; height: 46px; transform: rotate(-90deg); flex: 0 0 auto; }
.pomo-ring-bg { fill: none; stroke: var(--edge-outer); stroke-width: 4; }
.pomo-ring-fg {
  fill: none;
  stroke: var(--accent);
  stroke-width: 4;
  stroke-linecap: round;
  stroke-dasharray: 125.6;
  stroke-dashoffset: 0;
  transition: stroke-dashoffset 1s linear;
}
.pomo-clock {
  font-family: var(--font-mono);
  font-size: 20px;
  font-weight: 600;
  color: var(--text);
  line-height: 1.1;
}
.pomo-task {
  font-size: 11px;
  color: var(--text-muted);
  max-width: 150px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.pomo-btns { display: flex; flex-direction: column; gap: 4px; }
.pomo-btn {
  font-size: 11px;
  font-family: var(--font-sans);
  color: var(--text-secondary);
  background: none;
  border: 1px solid var(--edge-outer);
  border-radius: 8px;
  padding: 3px 10px;
  cursor: pointer;
  transition: color var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease);
}
.pomo-btn:hover { color: var(--accent); border-color: var(--accent); }

/* ---------- 未完成待办只读状态条（替代旧番茄计时浮条） ---------- */
.todo-status-bar[hidden] { display: none !important; }
.todo-status-bar {
  position: fixed;
  right: 24px; bottom: 24px;
  z-index: 1400;
}
.todo-status-link {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 11px 16px;
  border-radius: 16px;
  background: var(--glass-strong);
  border: 1px solid var(--edge-outer);
  backdrop-filter: blur(24px) saturate(var(--glass-sat));
  -webkit-backdrop-filter: blur(24px) saturate(var(--glass-sat));
  box-shadow: 0 18px 50px -16px var(--shadow-hover), inset 0 1px 0 var(--edge);
  text-decoration: none;
  color: var(--text);
  font-size: 13px;
  font-family: var(--font-sans);
  transition: transform 0.2s ease, border-color 0.2s ease;
}
.todo-status-link:hover { transform: translateY(-1px); border-color: var(--accent); }
.todo-status-main b { color: var(--accent); font-family: var(--font-mono); font-size: 15px; margin: 0 2px; }
.todo-status-seg { font-size: 12px; color: var(--text-muted); padding: 2px 9px; border-radius: 999px; background: var(--surface-1); }
.todo-status-seg.is-overdue { color: #d9534f; background: rgba(217, 83, 79, 0.12); }
.todo-status-seg.is-today { color: #e08a1e; background: rgba(240, 173, 78, 0.14); }
.todo-status-seg.is-future { color: var(--accent); background: var(--accent-dim); }
.todo-status-go { font-size: 12px; color: var(--accent); white-space: nowrap; }
body:has(.read-task:not([hidden])) .todo-status-bar { bottom: 152px; }

/* 首页/研思只读待办分组列表 */
.todo-mini-group { font-size: 12px; color: var(--text-muted); margin: 8px 0 2px; font-weight: 600; }
.todo-mini-group:first-child { margin-top: 0; }
.todo-mini-item .todo-mini-dot { width: 7px; height: 7px; border-radius: 50%; flex: 0 0 auto; }
.todo-mini-item.is-overdue .todo-mini-dot { background: #d9534f; }
.todo-mini-item.is-today .todo-mini-dot { background: #e08a1e; }
.todo-mini-item.is-future .todo-mini-dot { background: var(--text-muted); }
.todo-mini-item .todo-mini-text { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.todo-mini-item .todo-mini-meta { font-size: 11px; color: var(--text-muted); flex: 0 0 auto; font-family: var(--font-mono); }
.todo-mini-empty { color: var(--text-muted); font-size: 13px; padding: 8px 0; }

/* 研思日志面板只读提示条 */
.journal-readonly-tip {
  font-size: 12px;
  color: var(--text-muted);
  background: var(--accent-dim);
  border: 1px dashed var(--card-border);
  border-radius: var(--radius-sm);
  padding: 8px 14px;
  margin-bottom: 16px;
}

/* ---------- 六、研究日志「本周回顾」 ---------- */
.week-review {
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: var(--radius-lg);
  padding: 18px 22px;
  margin-bottom: 24px;
}
.week-review-head { display: flex; align-items: baseline; gap: 12px; margin-bottom: 14px; }
.week-review-title {
  font-family: var(--font-serif);
  font-size: 16px; font-weight: 700; color: var(--text);
}
.week-review-range {
  font-family: var(--font-mono);
  font-size: 11.5px; color: var(--text-muted);
}
.week-review-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 12px;
}
@media (max-width: 900px) { .week-review-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.week-cell {
  display: flex; flex-direction: column; gap: 2px;
  padding: 10px 14px;
  border-radius: var(--radius-md, 10px);
  background: var(--glass-thin);
  border: 1px solid var(--edge-outer);
}
.week-num {
  font-family: var(--font-mono);
  font-size: 22px;
  font-weight: 600;
  color: var(--accent);
  line-height: 1.2;
}
.week-num em { font-style: normal; font-size: 12px; color: var(--text-muted); }
.week-label { font-size: 11.5px; color: var(--text-secondary); }

/* ---------- 七、日志 ↔ 卡片互链 ---------- */
.journal-card-link {
  color: var(--accent);
  text-decoration: underline;
  text-decoration-color: var(--accent-dim);
  text-underline-offset: 3px;
  cursor: pointer;
}
.journal-card-link:hover { text-decoration-color: var(--accent); }
.sum-journal-mentions {
  margin-top: 18px;
  padding-top: 14px;
  border-top: 1px solid var(--hairline, var(--card-border));
}
.sum-mentions-head {
  font-size: 12px;
  font-weight: 600;
  color: var(--text-secondary);
  letter-spacing: .06em;
  margin-bottom: 8px;
}
.sum-mention-item {
  font-size: 12.5px;
  color: var(--text-secondary);
  line-height: 1.6;
  padding: 6px 10px;
  border-radius: 8px;
  background: var(--glass-thin);
  margin-bottom: 6px;
}
.sum-mention-date {
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--text-muted);
  margin-right: 8px;
}
.sum-mention-empty { color: var(--text-muted); }

/* ============================================================================
   V14 · 标签 AI 建议 + 综述引用可点击
   ========================================================================== */

/* ---------- 一、标签 AI 建议 ---------- */
.sum-tag-ai-btn {
  flex: 0 0 auto;
  font-size: 11.5px;
  font-family: var(--font-sans);
  color: var(--accent);
  background: var(--accent-dim);
  border: 1px solid transparent;
  border-radius: 999px;
  padding: 3px 12px;
  cursor: pointer;
  transition: opacity var(--t-fast) var(--ease);
}
.sum-tag-ai-btn:hover { opacity: .8; }
.sum-tag-ai-btn:disabled { opacity: .5; cursor: wait; }

.sum-tag-suggest {
  flex: 1 1 100%;
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 6px;
  padding-top: 8px;
  border-top: 1px dashed var(--hairline, var(--card-border));
  margin-top: 2px;
}
.sum-tag-suggest-hint { font-size: 12px; color: var(--text-muted); }
.sum-tag-suggest-label {
  font-size: 11px;
  color: var(--text-muted);
  font-family: var(--font-mono);
  letter-spacing: .04em;
}
.sum-tag-suggest-chip {
  font-size: 12px;
  font-family: var(--font-sans);
  color: var(--text-secondary);
  background: transparent;
  border: 1px dashed var(--edge-outer, var(--card-border));
  border-radius: 999px;
  padding: 3px 11px;
  cursor: pointer;
  transition: all var(--t-fast) var(--ease);
}
.sum-tag-suggest-chip:hover { border-color: var(--accent); color: var(--accent); }
.sum-tag-suggest-chip.selected {
  background: var(--accent);
  border-style: solid;
  border-color: var(--accent);
  color: var(--btn-text);
}
.sum-tag-suggest-adopt {
  font-size: 11.5px;
  font-family: var(--font-sans);
  color: var(--btn-text);
  background: var(--accent);
  border: none;
  border-radius: var(--radius-sm);
  padding: 4px 12px;
  cursor: pointer;
  margin-left: auto;
}
.sum-tag-suggest-adopt:hover { filter: brightness(1.07); }
.sum-tag-suggest-close {
  background: none;
  border: none;
  color: var(--text-muted);
  font-size: 15px;
  line-height: 1;
  cursor: pointer;
  padding: 0 2px;
}
.sum-tag-suggest-close:hover { color: var(--accent); }

/* ---------- 二、综述引用 [n] ---------- */
.review-cite {
  display: inline-block;
  font-family: var(--font-mono);
  font-size: 11px;
  line-height: 1.4;
  color: var(--accent);
  background: var(--accent-dim);
  border-radius: 4px;
  padding: 0 4px;
  margin: 0 1px;
  cursor: pointer;
  vertical-align: 1px;
  transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.review-cite:hover {
  background: var(--accent);
  color: var(--btn-text);
}
.review-cite-missing {
  color: var(--text-muted);
  background: var(--glass-thin);
  cursor: default;
}

/* ============================================================================
   V15 · 转写工作区改通栏：上传在上（横向铺开、变矮），结果区拿全宽
   背景：原来左栏 320–400px 只为一张上传卡，下方大片空白；
   结果区被挤在右侧。改为「上传卡通栏 + 结果全宽」。
   ========================================================================== */

.pdf-workspace { display: block; }   /* 原两列栅格让位；grid 属性自然失效 */

.pdf-col-left {
  display: flex;
  gap: 16px;
  flex-wrap: wrap;
  align-items: flex-start;
  margin-bottom: 20px;
}
.pdf-col-left > .card {
  flex: 1 1 420px;
  margin-bottom: 0;
}

/* 上传卡：左拖拽 / 右引擎与操作，整体高度压缩 */
.pdf-upload-card {
  display: grid;
  grid-template-columns: minmax(240px, 0.85fr) minmax(360px, 1.35fr);
  gap: 4px 22px;
  align-items: start;
}
/* 标题行：dot 与 label 显式对齐（absolute 的 dot 必须与 label 让位量匹配，
   否则通栏后圆点会压在「上传」二字上） */
.pdf-upload-card > .card-dot {
  top: 25px;
  left: 25px;
}
.pdf-upload-card > .card-label {
  grid-column: 1 / -1;
  padding-left: 15px;
}
.pdf-upload-card > #pdfDropzone {
  grid-column: 1;
  grid-row: 2 / span 2;
  margin-top: 10px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-self: stretch;
  min-height: 150px;
}
.pdf-upload-card > .pdf-engine-row {
  grid-column: 2;
  margin-top: 10px;
}
.pdf-upload-card > .pdf-action-row { grid-column: 2; }
/* 通栏后引擎卡不必再挤最小宽度 */
.pdf-upload-card .pdf-engine-opt { min-width: 0; }

@media (max-width: 1000px) {
  .pdf-upload-card { grid-template-columns: 1fr; }
  .pdf-upload-card > #pdfDropzone { grid-column: 1; grid-row: auto; min-height: 0; }
  .pdf-upload-card > .pdf-engine-row,
  .pdf-upload-card > .pdf-action-row { grid-column: 1; }
}

/* ============================================================================
   V16 · 窄屏侧栏收口：≤900px 侧栏变 72px 图标栏时，分组标签须一并隐藏
   （原断点隐藏了 .nav-item span / .brand-text，漏了 .nav-group-label，
    导致「核心工作 / 文献·转写」等分组名在窄栏里竖排一字一行）
   ========================================================================== */
@media (max-width: 900px) {
  .nav-group-label { display: none; }
  .nav-group { gap: 4px; margin-bottom: 10px; }
  .brand { justify-content: center; }
}

/* V17 · 转写失败信息：带引擎日志尾部，长文本限高可滚，保留换行便于阅读 */
.pdf-error {
  white-space: pre-wrap;
  word-break: break-word;
  max-height: 240px;
  overflow-y: auto;
  font-family: var(--font-mono);
  font-size: 12px;
}
.pdf-error-hint { white-space: normal; font-family: var(--font-sans); }

/* ============================================================================
   V18 · 上传卡窄容器排版修正
   问题：视口 1000–1200 之间上传卡仍是两列，右列（引擎区）只有 ~430px，
   两个引擎卡并排后说明文字被挤成窄条（"1-2 分 / 钟"断行、长标签被裁）。
   对策：断点提前到 1180；单列时引擎卡拿到整行宽度，说明文字自然舒展。
   ========================================================================== */
@media (max-width: 1180px) {
  .pdf-upload-card { grid-template-columns: 1fr; }
  .pdf-upload-card > #pdfDropzone {
    grid-column: 1;
    grid-row: auto;
    min-height: 0;
  }
  .pdf-upload-card > .pdf-engine-row,
  .pdf-upload-card > .pdf-action-row { grid-column: 1; }
}
/* 引擎行是 column 方向（一行一个引擎卡）：flex-basis 作用于**高度**，
   写 280px 会把卡片撑成固定 280px 高、内容只占一半，上传卡无谓变高。
   高度交回内容决定即可。 */
.pdf-upload-card .pdf-engine-opt { flex: 0 0 auto; min-width: 0; }
/* 勾选项允许换行、不被 flex 收缩裁掉（原「扫描件自动 OCR（无…」被截断） */
.pdf-upload-card .pdf-opt,
.pdf-action-row .pdf-opt {
  min-width: 0;
  white-space: normal;
}
@media (max-width: 760px) {
  .pdf-opt { flex: 1 1 100%; }
}

/* ============================================================================
   V19 · 译文库（列表 + 详情）
   ========================================================================== */
.trans-list { display: flex; flex-direction: column; gap: 10px; }
.trans-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  padding: 14px 18px;
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: var(--radius-md);
  cursor: pointer;
  transition: border-color var(--t-fast) var(--ease), transform var(--t-fast) var(--ease);
}
.trans-item:hover { border-color: var(--accent); transform: translateY(-1px); }
.trans-item-main { min-width: 0; }
.trans-item-title {
  font-family: var(--font-serif);
  font-size: 15.5px;
  font-weight: 700;
  color: var(--text);
}
.trans-item-meta {
  font-family: var(--font-mono);
  font-size: 11.5px;
  color: var(--text-muted);
  margin-top: 4px;
}
.trans-item-excerpt {
  font-size: 12.5px;
  color: var(--text-secondary);
  margin-top: 6px;
  line-height: 1.6;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.trans-item .hs-item-arrow { flex: 0 0 auto; }
.trans-detail-meta {
  display: flex;
  gap: 14px;
  flex-wrap: wrap;
  font-family: var(--font-mono);
  font-size: 11.5px;
  color: var(--text-muted);
  padding: 0 2px 14px;
  border-bottom: 1px solid var(--hairline, var(--card-border));
  margin-bottom: 16px;
}
/* 详情头三个元素（返回 / 标题 / 删除）：标题占满中间，删除靠右 */
.hs-detail-head .hs-detail-title { flex: 1; }

/* ============================================================================
   V20 · 侧栏未读徽标
   有未读 → 红底白字（数量=未读篇数）；读完 → 恢复常态（数量=总数）
   ========================================================================== */
.nav-badge.is-unread {
  background: var(--danger);
  color: #fff;
  box-shadow: 0 0 0 3px var(--danger-dim);
  font-weight: 600;
}

/* ============================================================================
   V21 · 四方互链（卡片 ↔ 译文 ↔ 精读 ↔ 原文 PDF）+ 原文精读正文
   ========================================================================== */

/* ---------- 一、关联条：三个详情页顶部共用 ---------- */
.xref-bar {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
  padding: 10px 14px;
  margin: 2px 0 18px;
  border-radius: 12px;
  background: var(--glass-thin);
  border: 1px solid var(--edge-outer, var(--card-border));
}
.xref-label {
  font-family: var(--font-mono);
  font-size: 11.5px;
  letter-spacing: .08em;
  color: var(--text-muted);
  margin-right: 2px;
}
.xref-btn {
  font-family: var(--font-sans);
  font-size: 12.5px;
  color: var(--text-secondary);
  background: var(--card-bg);
  border: 1px solid var(--edge-outer, var(--card-border));
  border-radius: 999px;
  padding: 4px 13px;
  cursor: pointer;
  transition: color var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease), opacity var(--t-fast) var(--ease);
}
.xref-btn.is-on:hover { border-color: var(--accent); color: var(--accent); }
/* 还没有对应内容的入口：虚线灰态，点了会给一句「怎么生成」的提示 */
.xref-btn.is-off { opacity: .5; border-style: dashed; cursor: help; }
.xref-btn.is-off:hover { opacity: .75; }
.xref-btn.is-current {
  background: var(--accent-dim);
  color: var(--accent);
  border-color: transparent;
  cursor: default;
}
.xref-btn.xref-pdf { color: var(--accent); border-color: var(--accent-dim); margin-left: auto; }
.xref-btn.xref-pdf:hover { border-color: var(--accent); background: var(--accent-dim); }

/* 精读结果条上的「已存入精读库」小标 */
.pdf-read-archived {
  font-family: var(--font-mono);
  font-size: 11.5px;
  color: var(--accent);
  background: var(--accent-dim);
  border-radius: 999px;
  padding: 3px 10px;
  margin-left: 10px;
  margin-right: auto;   /* 把后面的按钮推到右侧 */
}

/* ---------- 二、精读正文：原文 / 译文 / 解读 三级层次 ---------- */
/* 原文（引用块）—— 降低视觉权重，作为「对照物」存在 */
.reading-body blockquote {
  margin: 0 0 12px;
  padding: 10px 16px;
  border-left: 3px solid var(--edge-outer, var(--card-border));
  border-radius: 0 8px 8px 0;
  background: var(--glass-thin);
  font-size: 13.5px;
  line-height: 1.8;
  color: var(--text-secondary);
}
.reading-body blockquote p { margin: 0 0 8px; }
.reading-body blockquote p:last-child { margin-bottom: 0; }

/* 译文 —— 正文，读的主线 */
.reading-body > p.rd-zh { margin: 0 0 14px; line-height: 1.95; }
.reading-body > p:not(.rd-note):not(.rd-zh) { margin: 0 0 14px; line-height: 1.95; }

/* 解读 —— 旁注块，苔绿引一条，自带「解读」小标 */
.reading-body .rd-note {
  margin: 2px 0 22px;
  padding: 12px 16px 12px 16px;
  border-radius: 10px;
  background: var(--accent-dim);
  font-size: 13.5px;
  line-height: 1.85;
  color: var(--text);
}
.reading-body .rd-note::before {
  content: '解读';
  display: block;
  font-family: var(--font-mono);
  font-size: 10.5px;
  letter-spacing: .14em;
  color: var(--accent);
  margin-bottom: 5px;
}
.reading-body h2 {
  font-family: var(--font-serif);
  font-size: 17px;
  margin: 30px 0 14px;
  padding-bottom: 7px;
  border-bottom: 1px solid var(--hairline, var(--card-border));
}
.reading-body h2:first-child { margin-top: 6px; }
.reading-body img { max-width: 100%; height: auto; border-radius: 8px; }

/* ============================================================================
   V22 · 原文精读改为服务端生成：浮动进度条 + 关联条「生成中」态
   （生成不再依赖当前页面，所以进度必须能在任何面板看到）
   ========================================================================== */

/* ---------- 一、浮动进度条（放在侧栏右侧的空白区，避开底部居中的 toast 与右下番茄钟）---------- */
.read-task {
  position: fixed;
  left: 284px;
  bottom: 96px;
  z-index: 1400;
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 10px 14px;
  border-radius: 16px;
  background: var(--glass-strong);
  border: 1px solid var(--edge-outer);
  backdrop-filter: blur(24px) saturate(var(--glass-sat));
  -webkit-backdrop-filter: blur(24px) saturate(var(--glass-sat));
  box-shadow: 0 18px 50px -16px var(--shadow-hover), inset 0 1px 0 var(--edge);
}
/* display:flex 会盖掉 [hidden] 的 UA 样式 —— 必须显式兜底（踩过的老坑） */
.read-task[hidden] { display: none !important; }
@media (max-width: 900px) { .read-task { left: 96px; right: 24px; } }

.read-task-ring { width: 42px; height: 42px; transform: rotate(-90deg); flex: 0 0 auto; }
.read-task-ring-bg { fill: none; stroke: var(--edge-outer); stroke-width: 4; }
.read-task-ring-fg {
  fill: none;
  stroke: var(--accent);
  stroke-width: 4;
  stroke-linecap: round;
  stroke-dasharray: 113.1;
  stroke-dashoffset: 113.1;
  transition: stroke-dashoffset .6s linear;
}
.read-task-info { min-width: 0; }
.read-task-title { font-size: 12.5px; font-weight: 600; color: var(--text); }
.read-task-sub {
  font-family: var(--font-mono);
  font-size: 11.5px;
  color: var(--text-muted);
  margin-top: 2px;
}
.read-task-cancel {
  font-family: var(--font-sans);
  font-size: 11.5px;
  color: var(--text-secondary);
  background: none;
  border: 1px solid var(--edge-outer);
  border-radius: 8px;
  padding: 3px 10px;
  cursor: pointer;
  transition: color var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease);
}
.read-task-cancel:hover { color: var(--danger); border-color: var(--danger); }

/* ---------- 二、关联条「生成中」态（与「当前所在」区分开）---------- */
.xref-btn.is-busy {
  font-family: var(--font-mono);
  font-size: 11.5px;
  color: var(--accent);
  background: var(--accent-dim);
  border-style: dashed;
  border-color: var(--accent);
  cursor: pointer;
}

/* ============================================================================
   V23 · 原文精读浮动进度卡（重做）
   原版问题：① 压在左下角、紧贴侧栏边缘，还和页面底部信息挤在一起；
   ② 只有一个 42px 小圆环 + 两行小字，段数与百分比挤在一句括号里，信息薄；
   ③ 「取消」是个硬边方框按钮，突兀；④ 没有进入/完成的正反馈。
   新版：右下角三段式进度卡（状态行 / 进度条行 / 明细行），带进入动画与完成态。
   ========================================================================== */

.read-task {
  left: auto;
  right: 28px;
  bottom: 26px;
  width: 320px;
  padding: 14px 16px 13px;
  display: block;              /* 覆盖旧版的 flex 横排 */
  border-radius: 18px;
  background: var(--glass-strong);
  border: 1px solid var(--edge-outer);
  box-shadow: 0 22px 60px -22px var(--shadow-hover),
              0 2px 10px -4px rgba(0, 0, 0, .16),
              inset 0 1px 0 var(--edge);
  animation: readTaskIn .28s var(--ease) both;
}
@keyframes readTaskIn {
  from { opacity: 0; transform: translateY(12px) scale(.98); }
  to   { opacity: 1; transform: none; }
}
.read-task[hidden] { display: none !important; }

/* 精读卡与番茄钟同在右下角：精读卡占主位，番茄钟让到上方 */
body:has(.read-task:not([hidden])) .pomo-timer { bottom: 152px; }

/* ---------- 状态行 ---------- */
.read-task-head { display: flex; align-items: center; gap: 9px; }
.read-task-dot {
  flex: 0 0 auto;
  width: 7px; height: 7px;
  border-radius: 50%;
  background: var(--accent);
  box-shadow: 0 0 0 3px var(--accent-dim);
  animation: readTaskPulse 1.7s ease-in-out infinite;
}
@keyframes readTaskPulse { 0%, 100% { opacity: 1; } 50% { opacity: .32; } }
.read-task-title {
  flex: 1;
  min-width: 0;
  font-size: 12.5px;
  font-weight: 600;
  color: var(--text);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.read-task-cancel {
  flex: 0 0 auto;
  margin-right: -5px;
  padding: 3px 7px;
  font-family: var(--font-sans);
  font-size: 11.5px;
  color: var(--text-muted);
  background: none;
  border: none;
  border-radius: 7px;
  cursor: pointer;
  transition: color var(--t-fast) var(--ease), background var(--t-fast) var(--ease);
}
.read-task-cancel:hover { color: var(--danger); background: var(--danger-dim); }
.read-task-cancel:disabled { opacity: .55; cursor: default; }
.read-task-cancel:disabled:hover { color: var(--text-muted); background: none; }

/* ---------- 进度条行 ---------- */
.read-task-bar { display: flex; align-items: center; gap: 10px; margin: 12px 0 9px; }
.read-task-track {
  flex: 1;
  height: 6px;
  border-radius: 999px;
  background: var(--accent-dim);
  overflow: hidden;
}
.read-task-fill {
  width: 0;
  height: 100%;
  border-radius: 999px;
  background: var(--accent);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .28);
  transition: width .6s var(--ease);
}
.read-task-pct {
  flex: 0 0 auto;
  width: 36px;
  text-align: right;
  font-family: var(--font-mono);
  font-size: 12.5px;
  font-weight: 600;
  color: var(--accent);
  font-variant-numeric: tabular-nums;
}

/* ---------- 明细行 ---------- */
.read-task-foot {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 10px;
  font-family: var(--font-mono);
  font-size: 11px;
  line-height: 1.5;
}
.read-task-count { color: var(--text-secondary); }
.read-task-eta { color: var(--text-muted); text-align: right; }

/* ---------- 完成态：停留一拍给正反馈，再收起来 ---------- */
.read-task.is-done .read-task-dot {
  animation: none;
  background: var(--success);
  box-shadow: 0 0 0 3px var(--success-dim);
}
.read-task.is-done .read-task-title { color: var(--success); }
.read-task.is-done .read-task-fill { background: var(--success); }
.read-task.is-done .read-task-pct { color: var(--success); }
.read-task.is-done .read-task-cancel { display: none; }

@media (max-width: 900px) {
  .read-task { left: 16px; right: 16px; width: auto; bottom: 16px; }
  body:has(.read-task:not([hidden])) .pomo-timer { bottom: 168px; }
}

/* ============================================================================
   V24 · 专注面板（番茄钟集合）
   原番茄钟寄生在待办卡上：必须先有待办才能开始、固定 25 分钟、无历史记录，
   且计时靠「每秒减 1」——标签页切到后台会被浏览器降频，计时随之变慢。
   本段是「专注」面板的样式；计时逻辑（时间戳 + 持久化）在 app.js 里。
   ========================================================================== */

.focus-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 330px;
  gap: 20px;
  align-items: start;
  margin-bottom: 20px;
}
@media (max-width: 1180px) { .focus-grid { grid-template-columns: 1fr; } }
.focus-side { display: flex; flex-direction: column; gap: 20px; }

/* ---------- 一、计时舞台 ---------- */
.focus-stage { display: flex; flex-direction: column; align-items: center; padding: 30px 24px 26px; }

.focus-ring-wrap {
  position: relative;
  width: 248px; height: 248px;
  display: flex; align-items: center; justify-content: center;
}
.focus-ring { width: 100%; height: 100%; display: block; }
.focus-ring-track {
  fill: none;
  stroke: var(--edge-outer, var(--card-border));
  stroke-width: 10;
}
.focus-ring-progress {
  fill: none;
  stroke: var(--accent);
  stroke-width: 10;
  stroke-linecap: round;
  stroke-dasharray: 678.6;              /* 2πr, r=108 */
  stroke-dashoffset: 678.6;             /* 满格为「刚开始」= 全暗，随时间补满 */
  transform: rotate(-90deg);            /* 12 点方向起笔 */
  transform-origin: 50% 50%;
  transition: stroke-dashoffset .25s linear, stroke .45s var(--ease);
}
/* 计时中：环带一层柔和光晕 */
.focus-ring-wrap.is-running .focus-ring-progress {
  filter: drop-shadow(0 0 7px var(--accent-dim)) drop-shadow(0 0 2px var(--accent));
}
.focus-ring-wrap.is-paused .focus-ring-progress { stroke: var(--text-muted); filter: none; }
.focus-ring-wrap.is-break .focus-ring-progress { stroke: var(--info, #2563EB); }
.focus-ring-wrap.is-done .focus-ring-progress { stroke: var(--success); filter: drop-shadow(0 0 10px var(--success-dim)); }

/* 中心信息 */
.focus-center {
  position: absolute;
  inset: 0;
  display: flex; flex-direction: column;
  align-items: center; justify-content: center;
  gap: 4px;
  pointer-events: none;
}
.focus-mode-chip {
  font-family: var(--font-mono);
  font-size: 10.5px;
  letter-spacing: .18em;
  color: var(--accent);
  background: var(--accent-dim);
  border-radius: 999px;
  padding: 3px 10px;
}
.focus-time {
  font-family: var(--font-mono);
  font-size: 52px;
  font-weight: 600;
  line-height: 1.05;
  letter-spacing: -.02em;
  color: var(--text);
  font-variant-numeric: tabular-nums;
}
.focus-task-label {
  max-width: 170px;
  font-size: 12px;
  color: var(--text-muted);
  text-align: center;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* 暂停：数字降调 + 环变灰（已在上面处理环） */
.focus-ring-wrap.is-paused .focus-time { color: var(--text-secondary); }

/* 完成瞬间：三圈扩散波 + 数字弹一下 */
.focus-ripples { position: absolute; inset: 0; pointer-events: none; }
.focus-ripples span {
  position: absolute; inset: 14px;
  border-radius: 50%;
  border: 2px solid var(--success);
  opacity: 0;
  animation: focusRipple 1.8s var(--ease) forwards;
}
.focus-ripples span:nth-child(2) { animation-delay: .35s; }
.focus-ripples span:nth-child(3) { animation-delay: .7s; }
@keyframes focusRipple {
  0%   { transform: scale(.72); opacity: .55; }
  100% { transform: scale(1.18); opacity: 0; }
}
.focus-ring-wrap.is-done .focus-time { animation: focusPop .6s var(--ease); }
@keyframes focusPop {
  0% { transform: scale(1); }
  35% { transform: scale(1.09); }
  100% { transform: scale(1); }
}

.focus-actions {
  display: flex; align-items: center; gap: 10px;
  margin-top: 24px;
  min-height: 42px;
}
.focus-btn-main {
  font-family: var(--font-sans);
  font-size: 14.5px;
  font-weight: 600;
  color: var(--btn-text, #fff);
  background: var(--accent);
  border: none;
  border-radius: 999px;
  padding: 11px 34px;
  cursor: pointer;
  transition: transform .18s var(--ease), filter .18s var(--ease), box-shadow .18s var(--ease);
  box-shadow: 0 10px 26px -12px var(--accent);
}
.focus-btn-main:hover { filter: brightness(1.07); transform: translateY(-1px); }
.focus-btn-main:active { transform: translateY(0) scale(.98); }
.focus-btn-ghost {
  font-family: var(--font-sans);
  font-size: 13px;
  color: var(--text-secondary);
  background: var(--glass-thin);
  border: 1px solid var(--edge-outer, var(--card-border));
  border-radius: 999px;
  padding: 9px 20px;
  cursor: pointer;
  transition: color .18s var(--ease), border-color .18s var(--ease), background .18s var(--ease);
}
.focus-btn-ghost:hover { color: var(--accent); border-color: var(--accent); }
.focus-btn-danger:hover { color: var(--danger); border-color: var(--danger); background: var(--danger-dim); }

/* 完成后的下一步建议条 */
.focus-next {
  display: flex; align-items: center; gap: 10px;
  margin-top: 16px;
  padding: 10px 14px;
  border-radius: 12px;
  background: var(--success-dim);
  border: 1px solid transparent;
  animation: focusItemIn .4s var(--ease) both;
}
.focus-next-text { font-size: 12.5px; color: var(--text-secondary); margin-right: auto; }
.focus-next-btn {
  font-family: var(--font-sans);
  font-size: 12.5px;
  color: var(--btn-text, #fff);
  background: var(--success);
  border: none;
  border-radius: 999px;
  padding: 6px 14px;
  cursor: pointer;
  transition: filter .18s var(--ease);
}
.focus-next-btn:hover { filter: brightness(1.08); }
.focus-next-skip {
  font-family: var(--font-sans);
  font-size: 12.5px;
  color: var(--text-muted);
  background: none; border: none;
  padding: 6px 8px;
  cursor: pointer;
}
.focus-next-skip:hover { color: var(--text-secondary); }

/* ---------- 二、设置区 ---------- */
.focus-field { display: flex; flex-direction: column; gap: 9px; margin-top: 14px; }
.focus-field-label {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: .06em;
  color: var(--text-muted);
}
.focus-presets { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 7px; }
.focus-preset {
  font-family: var(--font-mono);
  font-size: 13px;
  color: var(--text-secondary);
  background: var(--glass-thin);
  border: 1px solid var(--edge-outer, var(--card-border));
  border-radius: 9px;
  padding: 8px 0;
  text-align: center;
  cursor: pointer;
  transition: all .18s var(--ease);
}
.focus-preset:hover { border-color: var(--accent); color: var(--accent); }
.focus-preset.active {
  color: var(--btn-text, #fff);
  background: var(--accent);
  border-color: var(--accent);
  transform: translateY(-1px);
  box-shadow: 0 6px 16px -8px var(--accent);
}
.focus-select {
  width: 100%;
  font-family: var(--font-sans);
  font-size: 13px;
  color: var(--text);
  background: var(--input-bg, var(--well, var(--glass-thin)));
  border: 1px solid var(--edge-outer, var(--card-border));
  border-radius: 9px;
  padding: 9px 11px;
  cursor: pointer;
}
.focus-hint { margin-top: 12px; font-size: 11.5px; line-height: 1.6; color: var(--text-muted); }

/* ---------- 三、今日统计 ---------- */
.focus-today { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-top: 14px; }
.focus-stat {
  display: flex; flex-direction: column; gap: 2px;
  padding: 10px 12px;
  border-radius: 11px;
  background: var(--glass-thin);
  border: 1px solid var(--edge-outer, var(--card-border));
}
.focus-stat-num {
  font-family: var(--font-mono);
  font-size: 21px;
  font-weight: 600;
  color: var(--accent);
  line-height: 1.2;
  font-variant-numeric: tabular-nums;
}
.focus-stat-num em { font-style: normal; font-size: 11px; color: var(--text-muted); margin-left: 2px; }
.focus-stat-label { font-size: 11px; color: var(--text-secondary); }

/* ---------- 四、近 7 天柱图 ---------- */
.focus-bars {
  display: flex; align-items: flex-end; gap: 10px;
  height: 156px;
  margin-top: 16px;
  padding-top: 4px;
}
.focus-bar { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 6px; height: 100%; }
.focus-bar-track {
  flex: 1; width: 100%;
  display: flex; align-items: flex-end;
  background: var(--glass-thin);
  border-radius: 9px;
  overflow: hidden;
}
.focus-bar-fill {
  width: 100%;
  height: var(--h, 0%);
  border-radius: 9px;
  background: var(--accent);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .22);
  transform-origin: bottom;
  animation: focusBarGrow .75s var(--ease) both;
}
.focus-bar.is-today .focus-bar-fill { box-shadow: inset 0 1px 0 rgba(255, 255, 255, .22), 0 0 0 2px var(--accent-dim); }
.focus-bar.is-empty .focus-bar-fill { background: none; }
@keyframes focusBarGrow { from { transform: scaleY(0); } to { transform: scaleY(1); } }
.focus-bar-label { font-family: var(--font-mono); font-size: 10.5px; color: var(--text-muted); }
.focus-bar-val { font-family: var(--font-mono); font-size: 11px; color: var(--text-secondary); }
.focus-bars-hint {
  margin-top: 12px;
  font-size: 12px;
  color: var(--text-muted);
}

/* ---------- 五、记录列表 ---------- */
.focus-log { display: flex; flex-direction: column; gap: 8px; margin-top: 14px; }
.focus-log-item {
  display: flex; align-items: center; gap: 12px;
  padding: 11px 14px;
  border-radius: 11px;
  background: var(--glass-thin);
  border: 1px solid var(--edge-outer, var(--card-border));
  animation: focusItemIn .42s var(--ease) both;
  animation-delay: calc(var(--i, 0) * 45ms);
}
@keyframes focusItemIn { from { opacity: 0; transform: translateY(7px); } to { opacity: 1; transform: none; } }
.focus-log-dot {
  width: 8px; height: 8px; border-radius: 50%; flex: 0 0 auto;
  background: var(--accent);
}
.focus-log-item.is-break .focus-log-dot { background: var(--info, #2563EB); }
.focus-log-item.is-giving-up .focus-log-dot { background: var(--text-muted); }
.focus-log-main { flex: 1; min-width: 0; }
.focus-log-title {
  font-size: 13px; color: var(--text);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.focus-log-title.is-empty { color: var(--text-muted); }
.focus-log-meta {
  font-family: var(--font-mono);
  font-size: 10.5px;
  color: var(--text-muted);
  margin-top: 3px;
}
.focus-log-min {
  font-family: var(--font-mono);
  font-size: 13px;
  font-weight: 600;
  color: var(--accent);
  flex: 0 0 auto;
}
.focus-log-item.is-break .focus-log-min { color: var(--info, #2563EB); }
.focus-log-empty {
  padding: 26px 0;
  text-align: center;
  font-size: 12.5px;
  color: var(--text-muted);
}

/* ---------- 六、侧栏徽标：计时中显示剩余时间 ---------- */
.nav-badge.is-timing {
  font-family: var(--font-mono);
  font-size: 10.5px;
  background: var(--accent);
  color: var(--btn-text, #fff);
  font-weight: 600;
  padding: 1px 6px;
  box-shadow: 0 0 0 3px var(--accent-dim);
}
.nav-badge.is-timing.is-paused { background: var(--text-muted); box-shadow: none; }

/* ============================================================
   文斋开拓（文献阅读工作台）
   ============================================================ */
.wenzhai-workspace {
  display: flex;
  flex-direction: column;
  gap: 12px;
  height: calc(100vh - 140px);
  min-height: 500px;
}

/* 互斥显示：空状态 vs 主内容区 */
.wenzhai-workspace.show-empty .wenzhai-main {
  display: none !important;
}

.wenzhai-workspace:not(.show-empty) .wenzhai-empty-state {
  display: none !important;
}

/* 顶栏（一行布局） */
.wenzhai-topbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 10px 16px;
  background: var(--glass);
  border: 1px solid var(--card-border);
  border-radius: var(--radius-md);
  backdrop-filter: blur(var(--glass-blur));
}

.wenzhai-topbar-left {
  display: flex;
  align-items: center;
  gap: 10px;
  flex: 1;
}

.wenzhai-file-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 8px 12px;
  background: var(--surface-1);
  border: 1px solid var(--card-border);
  border-radius: var(--radius-sm);
  cursor: pointer;
  font-size: 12px;
  white-space: nowrap;
  transition: all var(--t-fast) var(--ease);
}
.wenzhai-file-btn:hover {
  background: var(--accent-dim);
  border-color: var(--accent);
}

.wenzhai-input-wrap {
  flex: 1;
  max-width: 300px;
}
.wenzhai-input-wrap input {
  width: 100%;
  padding: 8px 12px;
  background: var(--surface-1);
  border: 1px solid var(--card-border);
  border-radius: var(--radius-sm);
  font-size: 12px;
  outline: none;
  transition: border-color var(--t-fast) var(--ease);
}
.wenzhai-input-wrap input:focus {
  border-color: var(--accent);
}

.wenzhai-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 8px 12px;
  border: none;
  border-radius: var(--radius-sm);
  cursor: pointer;
  font-size: 12px;
  transition: all var(--t-fast) var(--ease);
}
.wenzhai-btn-primary {
  background: var(--accent);
  color: #fff;
}
.wenzhai-btn-primary:hover {
  background: var(--accent-soft);
}
.wenzhai-btn-sm {
  padding: 6px 10px;
  font-size: 11px;
}

.wenzhai-topbar-right {
  display: flex;
  align-items: center;
  gap: 2px;
  overflow-x: auto;
  scrollbar-width: thin;
  padding: 2px 0;
}
.wenzhai-topbar-right::-webkit-scrollbar {
  height: 4px;
}
.wenzhai-topbar-right::-webkit-scrollbar-thumb {
  background: var(--card-border);
  border-radius: 2px;
}

.wenzhai-tool-btn {
  width: 26px;
  height: 26px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: none;
  border-radius: var(--radius-sm);
  cursor: pointer;
  color: var(--text);
  transition: all var(--t-fast) var(--ease);
  font-size: 12px;
}
.wenzhai-tool-btn:hover {
  background: var(--accent-dim);
  color: var(--accent);
}

.wenzhai-page-label {
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--text);
  margin: 0 2px;
  min-width: 30px;
  text-align: center;
}

.wenzhai-zoom-label {
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--text);
  margin: 0 2px;
  min-width: 36px;
  text-align: center;
}

.wenzhai-sep {
  width: 1px;
  height: 16px;
  background: var(--card-border);
  margin: 0 3px;
}

/* PDF 显示区域（最大化） */
.wenzhai-scroller {
  flex: 1;
  display: flex;
  background: var(--glass);
  border: 1px solid var(--card-border);
  border-radius: var(--radius-md);
  overflow: hidden;
  position: relative;
  box-shadow: var(--sh-1);
}

/* 拖拽区域 */
.wenzhai-dropzone {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 40px;
  text-align: center;
  cursor: pointer;
  transition: all var(--t-base) var(--ease);
}
.wenzhai-dropzone:hover {
  background: var(--accent-dim);
}

.dropzone-icon {
  font-size: 48px;
  color: var(--text-muted);
  margin-bottom: 16px;
  opacity: 0.5;
}
.dropzone-title {
  font-size: 16px;
  color: var(--text);
  margin-bottom: 12px;
  font-weight: 500;
}
.dropzone-desc {
  font-size: 12px;
  color: var(--text-muted);
  line-height: 1.8;
  margin-bottom: 16px;
}
.dropzone-tips {
  list-style: none;
  padding: 0;
  margin: 0;
  font-size: 12px;
  color: var(--text-muted);
  line-height: 2;
}

/* PDF 画布 */
.wenzhai-canvas-wrap {
  flex: 1;
  display: flex;
  justify-content: center;
  padding: 20px;
  overflow: auto;
}
#wenzhaiCanvas {
  max-width: 100%;
  box-shadow: var(--sh-2);
}

/* 笔记浮动面板 */
.wenzhai-note-panel {
  position: absolute;
  top: 100px;
  right: 20px;
  width: 300px;
  max-height: calc(100vh - 200px);
  display: flex;
  flex-direction: column;
  background: var(--glass);
  border: 1px solid var(--card-border);
  border-radius: var(--radius-md);
  backdrop-filter: blur(var(--glass-blur));
  box-shadow: var(--sh-3);
  z-index: 50;
  overflow: hidden;
}

.wenzhai-note-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 12px 16px;
  border-bottom: 1px solid var(--card-border);
}
.wenzhai-note-head h3 {
  font-size: 14px;
  font-weight: 600;
  color: var(--text);
  margin: 0;
}

/* 标签页 */
.wenzhai-tabs {
  display: flex;
  border-bottom: 1px solid var(--card-border);
}
.wenzhai-tab {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  padding: 8px;
  background: transparent;
  border: none;
  cursor: pointer;
  font-size: 12px;
  color: var(--text-muted);
  transition: all var(--t-fast) var(--ease);
  border-bottom: 2px solid transparent;
}
.wenzhai-tab:hover {
  color: var(--text);
}
.wenzhai-tab.is-on {
  color: var(--accent);
  border-bottom-color: var(--accent);
}

/* 面板内容 */
.wenzhai-pane {
  flex: 1;
  display: none;
  flex-direction: column;
  padding: 16px;
  overflow: auto;
}
.wenzhai-pane.is-on {
  display: flex;
}

.wenzhai-pane-actions {
  display: flex;
  gap: 8px;
  margin-bottom: 16px;
  flex-wrap: wrap;
}

.wenzhai-empty {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  font-size: 12px;
  color: var(--text-muted);
  padding: 20px;
}

/* 按钮变体 */
.wenzhai-btn-ghost {
  background: transparent;
  border: 1px solid var(--card-border);
  color: var(--text-muted);
}
.wenzhai-btn-ghost:hover {
  background: var(--surface-1);
  color: var(--text);
}

/* 更多菜单 */
.wenzhai-more-panel {
  position: absolute;
  top: 60px;
  right: 20px;
  width: 280px;
  padding: 16px;
  background: var(--glass);
  border: 1px solid var(--card-border);
  border-radius: var(--radius-md);
  backdrop-filter: blur(var(--glass-blur));
  box-shadow: var(--sh-3);
  z-index: 100;
}
.wenzhai-more-panel h4 {
  font-size: 13px;
  font-weight: 600;
  color: var(--text);
  margin: 0 0 12px 0;
}
.wenzhai-keys {
  display: grid;
  grid-template-columns: 80px 1fr;
  gap: 6px 12px;
  margin: 0;
  font-size: 11px;
}
.wenzhai-keys dt {
  font-family: var(--font-mono);
  color: var(--accent);
  font-weight: 500;
}
.wenzhai-keys dd {
  margin: 0;
  color: var(--text-muted);
}

/* 响应式 */
@media (max-width: 1100px) {
  .wenzhai-input-wrap {
    max-width: 200px;
  }
  .wenzhai-topbar-right {
    gap: 0;
  }
}

/* 窄屏：预设按钮整行铺开，柱图压缩 */
@media (max-width: 620px) {
  .focus-presets { display: grid; grid-template-columns: repeat(4, 1fr); }
  .focus-bar-label, .focus-bar-val { display: none; }
  .focus-bars { height: 120px; }
}

/* ===== 文斋开拓：文献工作台 ===== */

/* 模式切换按钮 */
.wenzhai-mode-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 12px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: var(--bg-card);
  color: var(--text);
  font-size: 13px;
  cursor: pointer;
  transition: all 0.2s;
}
.wenzhai-mode-btn:hover {
  border-color: var(--primary);
  color: var(--primary);
}
.wenzhai-mode-btn.active {
  background: var(--primary);
  color: white;
  border-color: var(--primary);
}

/* 空状态 */
.wenzhai-empty-state {
  flex: 1;
  display: none;
  align-items: center;
  justify-content: center;
  padding: 40px;
  margin: 20px;
  background: var(--bg-card);
  border-radius: 12px;
  border: 1px solid var(--border);
}

/* 空状态激活时显示 */
.wenzhai-workspace.show-empty .wenzhai-empty-state {
  display: flex;
}

/* 转写进度 */
.wenzhai-progress {
  padding: 20px;
  margin: 20px;
  background: var(--bg-card);
  border-radius: 12px;
  border: 1px solid var(--border);
}
.wenzhai-progress-head {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 12px;
  font-size: 14px;
}
.wenzhai-progress-pct {
  color: var(--primary);
  font-weight: 600;
}
.wenzhai-progress-bar {
  height: 6px;
  background: var(--bg-hover);
  border-radius: 3px;
  overflow: hidden;
}
.wenzhai-progress-fill {
  height: 100%;
  background: var(--primary);
  border-radius: 3px;
  transition: width 0.3s;
  width: 0%;
}
.wenzhai-error {
  margin-top: 12px;
  padding: 10px;
  background: rgba(239, 68, 68, 0.1);
  border: 1px solid rgba(239, 68, 68, 0.3);
  border-radius: 8px;
  color: #ef4444;
  font-size: 13px;
}

/* 主内容区：沉浸式/对照模式 */
.wenzhai-main {
  flex: 1;
  display: none;
  overflow: hidden;
  gap: 0;
}

/* 主内容区激活时显示 */
.wenzhai-main.active {
  display: flex;
}

/* PDF 预览区域 */
.wenzhai-pdf-viewer {
  flex: 1;
  display: flex;
  align-items: flex-start;
  justify-content: center;
  overflow: auto;
  background: var(--bg-secondary, #f5f5f5);
  padding: 20px;
}

.wenzhai-pdf-viewer canvas {
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
  background: white;
}

/* 对照模式：左侧中文翻译面板 */
.wenzhai-translation-pane {
  width: 45%;
  min-width: 300px;
  max-width: 50%;
  display: none;
  flex-direction: column;
  background: var(--bg-card);
  border-right: 1px solid var(--border);
  overflow: hidden;
}

/* 对照模式激活时显示翻译面板 */
.wenzhai-main.has-translation .wenzhai-translation-pane {
  display: flex;
}

/* 右侧编辑区（始终显示） */
.wenzhai-editor-pane {
  flex: 1;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  background: var(--bg-card);
  margin: 20px;
  border-radius: 12px;
  border: 1px solid var(--border);
}

/* 面板头部 */
.wenzhai-pane-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 12px 16px;
  border-bottom: 1px solid var(--border);
  background: var(--bg-card);
}
.wenzhai-pane-head h3 {
  margin: 0;
  font-size: 14px;
  font-weight: 600;
  color: var(--text);
}
.wenzhai-pane-actions {
  display: flex;
  gap: 8px;
}

/* 面板内容区 */
.wenzhai-pane-body {
  flex: 1;
  overflow-y: auto;
  padding: 20px;
  line-height: 1.8;
}

/* 表单样式（设置面板） */
.wenzhai-form {
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.wenzhai-form-item {
  display: flex;
  flex-direction: column;
  gap: 6px;
  font-size: 13px;
}
.wenzhai-form-item > span {
  color: var(--text-muted);
}
.wenzhai-form-item select {
  padding: 6px 10px;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: var(--bg-input);
  color: var(--text);
  font-size: 13px;
}
.wenzhai-checkbox-group {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.wenzhai-checkbox-group label {
  display: flex;
  align-items: center;
  gap: 6px;
  cursor: pointer;
}

/* 沉浸式模式（默认）：编辑区占满整个宽度 */
.wenzhai-main:not(.has-translation) .wenzhai-editor-pane {
  flex: 1;
}

/* 对照模式：左侧翻译面板显示 */
.wenzhai-main.has-translation .wenzhai-translation-pane {
  display: flex;
}

/* Markdown 内容样式 */
.wenzhai-pane-body.markdown-body {
  max-width: 900px;
  margin: 0 auto;
}
.wenzhai-pane-body.markdown-body h1,
.wenzhai-pane-body.markdown-body h2,
.wenzhai-pane-body.markdown-body h3 {
  margin-top: 1.5em;
  margin-bottom: 0.5em;
}
.wenzhai-pane-body.markdown-body p {
  margin-bottom: 1em;
}
.wenzhai-pane-body.markdown-body img {
  max-width: 100%;
  border-radius: 8px;
}
