/* ============================================================
   杜鸣OJ · v2 学习体验层样式
   ------------------------------------------------------------
   只在 .v2 容器内生效；body.v2-mode / body.v2-parent 负责
   给现有顶栏和页面底色换肤（由 v2.js 在路由进入/离开时切换）。
   深色主题：#0B1220 / #22D3EE / #F59E0B · 圆角 12px
   ============================================================ */

.v2 {
  --v2-bg: #0B1220;
  --v2-panel: #0F1A2E;
  --v2-panel-2: #111F38;
  --v2-line: rgba(148, 163, 184, .16);
  --v2-line-strong: rgba(148, 163, 184, .28);
  --v2-text: #E6EDF7;
  --v2-muted: #94A3B8;
  --v2-dim: #64748B;
  --v2-cyan: #22D3EE;
  --v2-cyan-deep: #0891B2;
  --v2-amber: #F59E0B;
  --v2-green: #34D399;
  --v2-red: #FB7185;
  --v2-violet: #A78BFA;

  /* 语义化软色阶：深色主题下的浅灰/浅色文本与渐变面板底色。
     浅色主题在 body[data-theme="light"] 两处（body 级 + .v2 级）整体覆写
     为可读的深色阶，深浅两套共用同一份 HTML，深色渲染保持不变。 */
  --v2-text-soft: #CBD5E1;     /* 次级正文（收拢原硬编码 #CBD5E1/#D7E3F4/#E2E8F0） */
  --v2-text-bright: #E6EDF7;   /* 强调正文（收拢原硬编码 #E6EDF7） */
  --v2-cyan-soft: #A5F3FC;     /* 青色系软文本（chips/tags/stat） */
  --v2-cyan-hover: #67E8F9;    /* 链接悬停青 */
  --v2-green-soft: #6EE7B7;
  --v2-amber-soft: #FCD34D;
  --v2-red-soft: #FDA4AF;
  --v2-violet-soft: #C4B5FD;
  --v2-hero-grad: linear-gradient(135deg, #0E1B31, #0B1526);
  --v2-passport-grad: linear-gradient(160deg, #0E1B31, #0A1424);
  --v2-parent-grad: linear-gradient(165deg, #0F1B30, #0A1424);
  --v2-shadow-lg: 0 30px 70px rgba(0, 0, 0, .35);

  /* 组件级硬编码色收拢（P0-7 + F4）：深色默认值在此定义（=原硬编码值），
     深色主题逐像素不变；浅色覆写在 body[data-theme="light"] .v2 块给深色可读值。 */
  --v2-tag-fg: #A8B6C9;                        /* .v2-tag 默认文字 */
  --v2-star-off: rgba(148, 163, 184, .32);     /* 未点亮星 */
  --v2-star-on: #FBBF24;                       /* 点亮星 */
  --v2-entry-red: #FCA5A5;                     /* 红色入口 meta 文字 */
  --v2-score-ok: #34D399;                      /* 评分三档 */
  --v2-score-mid: #FBBF24;
  --v2-score-low: #F87171;
  --v2-code-hl-fg: #A5F3FC;                    /* 代码高亮行文字 */
  --v2-ln-fg: rgba(148, 163, 184, .38);        /* 行号 */
  --v2-chart-stroke: #22D3EE;                  /* 雷达/迷你折线主色 */
  --v2-chart-dot-ring: #0B1220;                /* 图表数据点描边（=深色底色） */
  --v2-grid-empty-fg: rgba(148, 163, 184, .28);/* 网格表格空格 */
  --v2-trace-bg: #080d17;                      /* 执行回放代码区背景 */
  --v2-trace-fg: #E6EDF7;                      /* 执行回放代码区文字（原继承 --v2-text） */
  --v2-trace-input-bg: rgba(15, 23, 42, .7);   /* 执行回放输入区背景 */
  --v2-trace-input-fg: #cbd5e1;                /* 执行回放输入区文字 */

  --v2-radius: 12px;
  --v2-mono: "Cascadia Code", "JetBrains Mono", Consolas, "Courier New", monospace;

  color: var(--v2-text);
  font-size: 14px;
  line-height: 1.65;
  -webkit-font-smoothing: antialiased;
}

/* ---------------- 浅色主题（body[data-theme="light"]） ----------------
   由顶栏「深色/浅色」按钮切换；选择器特异性高于 .v2 与 body.v2-mode，
   覆盖背景、顶栏、导航与全部主题变量，深浅两套共用同一份 HTML。 */
body[data-theme="light"] { background: #F1F5F9; }
body.v2-mode[data-theme="light"] { background: #F1F5F9; }
body.v2-mode[data-theme="light"] .topbar {
  background: rgba(255, 255, 255, .95);
  border-bottom-color: rgba(15, 23, 42, .10);
}
body[data-theme="light"] .brand { color: #0F172A; }
body[data-theme="light"] .brand-name em { color: #0891B2; }
body[data-theme="light"] .brand-badge { color: #0891B2; background: rgba(8, 145, 178, .10); border-color: rgba(8, 145, 178, .25); }
body[data-theme="light"] .nav a { color: #64748B; }
body[data-theme="light"] .nav a:hover { background: rgba(15, 23, 42, .06); color: #0F172A; }
body[data-theme="light"] .nav a.active { background: rgba(8, 145, 178, .10); color: #0891B2; }
body[data-theme="light"] .userbox .who { color: #64748B; }
body[data-theme="light"] .userbox .who b { color: #0F172A; }
body[data-theme="light"] .userbox .btn.ghost { color: #475569; border-color: rgba(15, 23, 42, .20); }

/* body 级浅色变量：供 .v2 容器之外的组件（家长周报卡 .v2-parent-card 等）继承。
   下方卡片/墨水变量只在浅色定义：深色主题走各使用点的 var() fallback（=原值），
   深色渲染与旧版逐像素一致。 */
body[data-theme="light"] {
  --v2-text-soft: #475569;
  --v2-text-bright: #0F172A;
  --v2-cyan-soft: #0E7490;
  --v2-cyan-hover: #0E7490;
  --v2-green-soft: #059669;
  --v2-amber-soft: #B45309;
  --v2-red-soft: #E11D48;
  --v2-violet-soft: #7C3AED;
  --v2-hero-grad: linear-gradient(135deg, #FFFFFF, #EAF0F7);
  --v2-passport-grad: linear-gradient(160deg, #FFFFFF, #EEF2F8);
  --v2-parent-grad: linear-gradient(165deg, #FFFFFF, #EDF2F9);
  --v2-shadow-lg: 0 24px 60px rgba(15, 23, 42, .10);
  /* 卡片/面板背景（原深色 rgba 渐变的浅色等价物） */
  --v2-card-grad: linear-gradient(180deg, #FFFFFF, #F8FAFC);
  --v2-card-grad-hi: linear-gradient(180deg, #FFFFFF, #F8FAFC);
  --v2-card-grad-soft: linear-gradient(180deg, #FFFFFF, #F8FAFC);
  --v2-panel-grad-a: linear-gradient(160deg, #FFFFFF, #F1F5F9);
  --v2-panel-grad-b: linear-gradient(160deg, #FFFFFF, #F1F5F9);
  --v2-panel-flat-75: #F8FAFC;
  --v2-panel-flat-80: #F1F5F9;
  --v2-panel-flat-60: #F1F5F9;
  --v2-editor-bg: #F8FAFC;
  /* 深色墨水叠加（原 rgba(2,8,20,.x)）的浅色等价物 */
  --v2-ink: rgba(15, 23, 42, .05);
  --v2-ink-strong: rgba(15, 23, 42, .08);
}

body[data-theme="light"] .v2 {
  --v2-bg: #FFFFFF;
  --v2-panel: #F8FAFC;
  --v2-panel-2: #F1F5F9;
  --v2-line: rgba(15, 23, 42, .12);
  --v2-line-strong: rgba(15, 23, 42, .22);
  --v2-text: #0F172A;
  --v2-muted: #475569;
  --v2-dim: #64748B;
  --v2-cyan: #0891B2;
  --v2-cyan-deep: #0E7490;
  --v2-amber: #D97706;
  --v2-green: #059669;
  --v2-red: #E11D48;
  --v2-violet: #7C3AED;
  --v2-text-soft: #475569;
  --v2-text-bright: #0F172A;
  --v2-cyan-soft: #0E7490;
  --v2-cyan-hover: #0E7490;
  --v2-green-soft: #059669;
  --v2-amber-soft: #B45309;
  --v2-red-soft: #E11D48;
  --v2-violet-soft: #7C3AED;
  --v2-hero-grad: linear-gradient(135deg, #FFFFFF, #EAF0F7);
  --v2-passport-grad: linear-gradient(160deg, #FFFFFF, #EEF2F8);
  --v2-parent-grad: linear-gradient(165deg, #FFFFFF, #EDF2F9);
  --v2-shadow-lg: 0 24px 60px rgba(15, 23, 42, .10);

  /* P0-7 + F4 组件级硬编码色的浅色覆写：统一为白底上可读的深色值 */
  --v2-tag-fg: #475569;
  --v2-star-off: rgba(71, 85, 105, .35);
  --v2-star-on: #B45309;
  --v2-entry-red: #B91C1C;
  --v2-score-ok: #059669;
  --v2-score-mid: #B45309;
  --v2-score-low: #E11D48;
  --v2-code-hl-fg: #0E7490;
  --v2-ln-fg: rgba(71, 85, 105, .45);
  --v2-chart-stroke: #0891B2;
  --v2-chart-dot-ring: #FFFFFF;
  --v2-grid-empty-fg: rgba(71, 85, 105, .35);
  --v2-trace-bg: #F8FAFC;
  --v2-trace-fg: #0F172A;
  --v2-trace-input-bg: #F1F5F9;
  --v2-trace-input-fg: #334155;
}

/* ---------------- 剧场配套练习 ---------------- */
.v2-practice { margin-top: 18px; }
.v2-practice-list { display: flex; flex-direction: column; gap: 8px; }
.v2-practice-item {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 14px; border-radius: var(--v2-radius, 12px);
  border: 1px solid var(--v2-line); background: var(--v2-panel);
  color: var(--v2-text); text-decoration: none;
  transition: border-color .15s, background .15s;
}
.v2-practice-item:hover { border-color: var(--v2-cyan); background: var(--v2-panel-2); }
.v2-practice-code { font-family: var(--v2-mono); color: var(--v2-cyan); font-size: 13px; }
.v2-practice-title { flex: 1; }

/* ---------------- 深色主题：旧 style.css 变量覆盖 ----------------
   旧页面（题库/做题/聊天等）用 style.css 的 :root 变量，本身是浅色。
   CSS 变量会继承：在 body[data-theme="dark"] 上重定义这些变量，
   所有旧页面的卡片/文字/边框即跟随深色，无需逐条改旧样式。 */
[data-theme="dark"] {
  --bg: #0f172a;
  --card: #1e293b;
  --text: #e2e8f0;
  --text-2: #94a3b8;
  --text-3: #64748b;
  --border: #334155;
  --primary: #818cf8;
  --primary-light: rgba(129, 140, 248, .14);
  --shadow: 0 1px 3px rgba(0, 0, 0, .4), 0 4px 14px rgba(0, 0, 0, .3);
  --ac: #4ade80;
  --wa: #f87171;
  --tle: #fb923c;
  --re: #c084fc;
  --ce: #60a5fa;
  --pending: #64748b;
}

/* 顶栏背景是 style.css 硬编码的浅色，深色时必须一起压暗，
   否则浅色文字（--text 变量已变浅）压在浅色顶栏上，品牌与导航看不清。 */
[data-theme="dark"] .topbar {
  background: rgba(15, 23, 42, .94);
  border-bottom-color: rgba(148, 163, 184, .14);
}

/* ---------------- 顶栏主题切换按钮 ---------------- */
.theme-toggle {
  margin-left: 10px;
  padding: 6px 10px;
  border-radius: 8px;
  border: 1px solid rgba(148, 163, 184, .25);
  background: transparent;
  color: var(--v2-text-soft, #CBD5E1);
  cursor: pointer;
  font-size: 15px;
  line-height: 1;
  transition: background .15s, color .15s, border-color .15s;
}
.theme-toggle:hover {
  background: rgba(148, 163, 184, .12);
  color: var(--v2-text-bright, #E6EDF7);
}
body[data-theme="light"] .theme-toggle {
  color: #475569;
  border-color: rgba(15, 23, 42, .20);
}
body[data-theme="light"] .theme-toggle:hover {
  background: rgba(15, 23, 42, .06);
  color: #0F172A;
}

.v2 *,
.v2 *::before,
.v2 *::after { box-sizing: border-box; }

.v2 h1, .v2 h2, .v2 h3, .v2 h4 { line-height: 1.3; color: var(--v2-text); }
.v2 p { margin: 0; }
.v2 a { color: var(--v2-cyan); text-decoration: none; }
.v2 a:hover { color: var(--v2-cyan-hover, #67E8F9); }
.v2 button { font-family: inherit; }
.v2 :focus-visible { outline: 2px solid var(--v2-cyan); outline-offset: 2px; }

.v2-small { font-size: 12px; }
.v2-muted { color: var(--v2-muted); }
.v2-row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.v2-between { justify-content: space-between; }
.v2-wrap { flex-wrap: wrap; }
.v2-center { justify-content: center; }
.v2-mt { margin-top: 14px; }
.v2-mb { margin-bottom: 14px; }
.v2-noprint { }

/* ---------------- 深色外壳 ----------------
   注意：以下规则统一加 :not([data-theme="light"]) 作用域。
   旧版浅色规则（body[data-theme="light"] .nav a:hover 等）与旧版深色规则
   特异性相同（均 0,3,2），源码在后者，浅色永远被深色覆盖，导致浅色主题下
   顶栏出现近白文字留白。加作用域后深浅彻底互斥，不再依赖源码顺序。 */
body.v2-mode:not([data-theme="light"]) { background: #070C16; }
body.v2-mode:not([data-theme="light"]) .topbar {
  background: rgba(11, 18, 32, .94);
  border-bottom-color: rgba(148, 163, 184, .14);
}
body.v2-mode:not([data-theme="light"]) .brand,
body.v2-mode:not([data-theme="light"]) .brand:hover { color: var(--v2-text, #E6EDF7); }
body.v2-mode:not([data-theme="light"]) .brand-name em { color: #22D3EE; }
body.v2-mode:not([data-theme="light"]) .brand-badge {
  color: var(--v2-cyan-hover, #67E8F9);
  background: rgba(34, 211, 238, .1);
  border-color: rgba(34, 211, 238, .25);
}
body.v2-mode:not([data-theme="light"]) .nav a { color: var(--v2-muted, #94A3B8); }
body.v2-mode:not([data-theme="light"]) .nav a:hover { background: rgba(148, 163, 184, .1); color: var(--v2-text-bright, #E6EDF7); }
body.v2-mode:not([data-theme="light"]) .nav a.active { background: rgba(34, 211, 238, .12); color: #22D3EE; }
body.v2-mode:not([data-theme="light"]) .userbox .who { color: var(--v2-muted, #94A3B8); }
body.v2-mode:not([data-theme="light"]) .userbox .who b { color: var(--v2-text-bright, #E6EDF7); }
body.v2-mode:not([data-theme="light"]) .userbox .btn.ghost {
  background: transparent;
  color: var(--v2-text-soft, #CBD5E1);
  border-color: rgba(148, 163, 184, .25);
}
/* 家长周报沉浸模式：深色渐变底（浅色主题下覆写为浅灰底，见下） */
body.v2-parent:not([data-theme="light"]) {
  background:
    radial-gradient(circle at 50% 0%, #14243F, #0B1220 62%) fixed,
    #0B1220;
}
body.v2-parent[data-theme="light"] { background: #F1F5F9; }
body.v2-parent .topbar { display: none !important; }
body.v2-parent .view { max-width: none; padding: 0; }

/* ---------------- 版式 ---------------- */
.v2-head {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 18px;
  flex-wrap: wrap;
  margin-bottom: 18px;
}
.v2-head h1, .v2-theater-copy h1 { font-size: 28px; font-weight: 800; letter-spacing: -.02em; }
.v2-head-copy .v2-sub, .v2-theater-copy .v2-sub {
  color: var(--v2-muted);
  margin-top: 6px;
  font-size: 14px;
  max-width: 720px;
}
.v2-eyebrow {
  font-size: 11.5px;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--v2-cyan);
  font-weight: 700;
  margin-bottom: 6px;
}
.v2-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.v2-link {
  color: var(--v2-cyan);
  font-size: 13px;
  background: none;
  border: none;
  padding: 0;
  cursor: pointer;
  font-weight: 600;
}
.v2-link:hover { color: var(--v2-cyan-soft, #A5F3FC); }

/* ---------------- 卡片 / 栅格 ---------------- */
.v2-card {
  background: var(--v2-card-grad, linear-gradient(180deg, rgba(17, 31, 56, .92), rgba(15, 26, 46, .92)));
  border: 1px solid var(--v2-line);
  border-radius: var(--v2-radius);
  padding: 20px;
  box-shadow: 0 1px 0 rgba(255, 255, 255, .03) inset, 0 14px 30px rgba(2, 6, 16, .18);
}
.v2-card--glow {
  border-color: rgba(245, 158, 11, .22);
  background:
    radial-gradient(circle at 100% 0%, rgba(245, 158, 11, .12), transparent 55%),
    var(--v2-card-grad-hi, linear-gradient(180deg, rgba(17, 31, 56, .95), rgba(15, 26, 46, .95)));
}
.v2-card-h {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-bottom: 12px;
  flex-wrap: wrap;
}
.v2-card-h h2 { font-size: 15px; font-weight: 700; }
.v2-card h2 { font-size: 15px; }
.v2-card h3 { font-size: 14px; }

.v2-grid { display: grid; gap: 14px; margin-bottom: 14px; }
.v2-grid:last-child { margin-bottom: 0; }
.v2-grid--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.v2-grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.v2-grid--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.v2-grid--sidebar { grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr); }
.v2-grid > .v2-card { min-width: 0; }

.v2-big {
  font-size: 40px;
  font-weight: 800;
  font-variant-numeric: tabular-nums;
  letter-spacing: -.03em;
  line-height: 1.1;
  margin: 4px 0 6px;
}
.v2-big small { font-size: 14px; font-weight: 600; color: var(--v2-muted); }
.v2-card > .v2-muted { font-size: 13px; }
.v2-level-now {
  margin-top: 12px;
  display: inline-flex;
  font-size: 12px;
  color: var(--v2-amber-soft, #FCD34D);
  background: rgba(245, 158, 11, .1);
  border: 1px solid rgba(245, 158, 11, .22);
  padding: 3px 9px;
  border-radius: 999px;
}

/* ---------------- 按钮 ---------------- */
.v2-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  padding: 9px 18px;
  border-radius: 10px;
  border: 1px solid transparent;
  background: linear-gradient(135deg, #22D3EE, #0EA5E9);
  color: #04121C;
  font-size: 14px;
  font-weight: 700;
  line-height: 1.2;
  cursor: pointer;
  text-decoration: none;
  transition: transform .15s, filter .15s, background .15s, border-color .15s;
  white-space: nowrap;
}
.v2-btn:hover { color: #04121C; filter: brightness(1.08); transform: translateY(-1px); }
.v2-btn:active { transform: none; }
.v2-btn:disabled { opacity: .5; cursor: not-allowed; transform: none; filter: none; }
.v2-btn.ghost {
  background: transparent;
  color: var(--v2-text-soft, #CBD5E1);
  border-color: var(--v2-line-strong);
}
.v2-btn.ghost:hover { color: var(--v2-text-bright, #E6EDF7); border-color: rgba(34, 211, 238, .5); background: rgba(34, 211, 238, .06); }
.v2-btn.amber { background: linear-gradient(135deg, #FBBF24, #F59E0B); color: #1C1200; }
.v2-btn.violet { background: linear-gradient(135deg, #C4B5FD, #8B5CF6); color: #150B2E; }
.v2-btn.danger { background: rgba(251, 113, 133, .12); color: var(--v2-red-soft, #FDA4AF); border-color: rgba(251, 113, 133, .35); }
.v2-btn.danger:hover { background: rgba(251, 113, 133, .2); color: var(--v2-red-soft, #FDA4AF); }
.v2-btn.small { padding: 6px 12px; font-size: 12.5px; border-radius: 8px; }
.v2-btn.on { background: rgba(34, 211, 238, .14); color: var(--v2-cyan-soft, #A5F3FC); border-color: rgba(34, 211, 238, .4); }

/* ---------------- 表单 ---------------- */
.v2-form { display: flex; flex-direction: column; gap: 12px; }
.v2-form--inline { flex-direction: row; align-items: stretch; flex-wrap: wrap; }
.v2-form--inline .v2-input { flex: 1; min-width: 190px; }
.v2-field { display: flex; flex-direction: column; gap: 6px; }
.v2-field > span { font-size: 12px; color: var(--v2-muted); font-weight: 600; }
.v2-input, .v2-select {
  width: 100%;
  background: var(--v2-ink-strong, rgba(3, 9, 20, .55));
  border: 1px solid var(--v2-line-strong);
  border-radius: 10px;
  color: var(--v2-text);
  padding: 10px 12px;
  font: inherit;
  font-size: 14px;
  transition: border-color .15s, box-shadow .15s;
}
.v2-input::placeholder { color: rgba(148, 163, 184, .55); }
.v2-input:focus, .v2-select:focus {
  outline: none;
  border-color: var(--v2-cyan);
  box-shadow: 0 0 0 3px rgba(34, 211, 238, .12);
}
textarea.v2-input { min-height: 84px; resize: vertical; }
.v2-form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
.v2-err { color: var(--v2-red-soft, #FDA4AF); font-size: 13px; min-height: 18px; margin-top: 8px; }
.v2-notice {
  padding: 10px 14px;
  border-radius: 10px;
  background: rgba(34, 211, 238, .08);
  border: 1px solid rgba(34, 211, 238, .25);
  color: var(--v2-cyan-soft, #A5F3FC);
  font-size: 13px;
  margin-bottom: 14px;
}
.v2-notice.bad { background: rgba(251, 113, 133, .08); border-color: rgba(251, 113, 133, .3); color: var(--v2-red-soft, #FDA4AF); }

/* ---------------- 标签 / 徽章 ---------------- */
.v2-chip {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 3px 10px;
  border-radius: 999px;
  background: rgba(148, 163, 184, .1);
  border: 1px solid var(--v2-line);
  font-size: 12px;
  color: var(--v2-text-soft, #CBD5E1);
  white-space: nowrap;
}
.v2-chip.cyan { background: rgba(34, 211, 238, .1); border-color: rgba(34, 211, 238, .25); color: var(--v2-cyan-soft, #A5F3FC); }
.v2-chip.amber { background: rgba(245, 158, 11, .1); border-color: rgba(245, 158, 11, .28); color: var(--v2-amber-soft, #FCD34D); }
.v2-chip.green { background: rgba(52, 211, 153, .1); border-color: rgba(52, 211, 153, .28); color: var(--v2-green-soft, #6EE7B7); }
.v2-chip.violet { background: rgba(167, 139, 250, .12); border-color: rgba(167, 139, 250, .3); color: var(--v2-violet-soft, #C4B5FD); }
.v2-chip.green { }
.v2-tag {
  display: inline-flex;
  align-items: center;
  padding: 2px 8px;
  border-radius: 999px;
  background: rgba(148, 163, 184, .12);
  border: 1px solid transparent;
  font-size: 11.5px;
  color: var(--v2-tag-fg, #A8B6C9);
  white-space: nowrap;
  line-height: 1.7;
}
.v2-tag.cyan { background: rgba(34, 211, 238, .1); color: var(--v2-cyan-hover, #67E8F9); }
.v2-tag.amber { background: rgba(245, 158, 11, .12); color: var(--v2-amber-soft, #FCD34D); }
.v2-tag.green { background: rgba(52, 211, 153, .12); color: var(--v2-green-soft, #6EE7B7); }
.v2-tag.violet { background: rgba(167, 139, 250, .14); color: var(--v2-violet-soft, #C4B5FD); }
.v2-stars { display: inline-flex; gap: 2px; font-size: 13px; line-height: 1; }
.v2-star { color: var(--v2-star-off, rgba(148, 163, 184, .32)); }
.v2-star.on { color: var(--v2-star-on, #FBBF24); text-shadow: 0 0 8px rgba(245, 158, 11, .35); }
.v2-diff {
  display: inline-flex;
  align-items: center;
  padding: 1px 7px;
  border-radius: 6px;
  font-size: 11px;
  font-weight: 700;
  font-family: var(--v2-mono);
  background: rgba(148, 163, 184, .12);
  color: var(--v2-text-soft, #CBD5E1);
}
.v2-diff--1, .v2-diff--2 { background: rgba(52, 211, 153, .12); color: var(--v2-green-soft, #6EE7B7); }
.v2-diff--3 { background: rgba(245, 158, 11, .12); color: var(--v2-amber-soft, #FCD34D); }
.v2-diff--4, .v2-diff--5 { background: rgba(251, 113, 133, .14); color: var(--v2-red-soft, #FDA4AF); }

/* ---------------- 统计卡 ---------------- */
.v2-stat {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 14px 16px;
  border-radius: var(--v2-radius);
  background: var(--v2-card-grad-soft, linear-gradient(180deg, rgba(17, 31, 56, .9), rgba(15, 26, 46, .9)));
  border: 1px solid var(--v2-line);
  min-width: 0;
}
.v2-stat > span { font-size: 12px; color: var(--v2-muted); }
.v2-stat > strong {
  font-size: 24px;
  font-weight: 800;
  font-variant-numeric: tabular-nums;
  line-height: 1.25;
  letter-spacing: -.02em;
}
.v2-stat > small { font-size: 11.5px; color: var(--v2-dim); }
.v2-stat--cyan > strong { color: var(--v2-cyan-hover, #67E8F9); }
.v2-stat--green > strong { color: var(--v2-green-soft, #6EE7B7); }
.v2-stat--amber > strong { color: var(--v2-amber-soft, #FCD34D); }
.v2-stat--violet > strong { color: var(--v2-violet-soft, #C4B5FD); }

/* ---------------- 进度条 ---------------- */
.v2-bar {
  height: 8px;
  border-radius: 999px;
  background: rgba(148, 163, 184, .14);
  overflow: hidden;
}
.v2-bar-fill {
  display: block;
  height: 100%;
  min-width: 2px;
  border-radius: inherit;
  background: linear-gradient(90deg, #0891B2, #22D3EE);
  transition: width .45s ease;
}
.v2-bar-fill.cyan { background: linear-gradient(90deg, #0891B2, #22D3EE); }
.v2-bar-fill.green { background: linear-gradient(90deg, #059669, #34D399); }
.v2-bar-fill.amber { background: linear-gradient(90deg, #D97706, #FBBF24); }
.v2-bar-fill.violet { background: linear-gradient(90deg, #7C3AED, #C4B5FD); }
.v2-bar-fill.red { background: linear-gradient(90deg, #BE123C, #FB7185); }

.v2-bar-row { margin-bottom: 13px; }
.v2-bar-row:last-child { margin-bottom: 0; }
.v2-bar-name {
  display: flex;
  align-items: baseline;
  gap: 8px;
  font-size: 13px;
  margin-bottom: 5px;
  color: var(--v2-text-soft, #CBD5E1);
}
.v2-bar-name b {
  margin-left: auto;
  font-variant-numeric: tabular-nums;
  color: var(--v2-text);
}
.v2-bar-name em { font-style: normal; font-size: 11px; font-weight: 700; }
.v2-bar-name em.up { color: var(--v2-green-soft, #6EE7B7); }
.v2-bar-name em.down { color: var(--v2-red-soft, #FDA4AF); }
.v2-dims { margin-top: 12px; }

/* ---------------- 空状态 / 骨架 ---------------- */
.v2-empty {
  text-align: center;
  padding: 32px 16px;
  color: var(--v2-muted);
  border: 1px dashed var(--v2-line-strong);
  border-radius: var(--v2-radius);
  background: rgba(148, 163, 184, .025);
}
.v2-empty--lg { padding: 56px 20px; margin-top: 18px; }
.v2-empty-icon { font-size: 32px; margin-bottom: 8px; line-height: 1; }
.v2-empty h2, .v2-empty h3 { font-size: 16px; color: var(--v2-text); margin-bottom: 6px; }
.v2-empty p { font-size: 13px; max-width: 520px; margin: 0 auto 12px; }
.v2-empty-cta { display: flex; justify-content: center; gap: 10px; flex-wrap: wrap; margin-top: 12px; }

.v2-skel {
  position: relative;
  overflow: hidden;
  background: rgba(148, 163, 184, .1);
  border-radius: 10px;
}
.v2-skel::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, transparent, rgba(148, 163, 184, .14), transparent);
  transform: translateX(-100%);
  animation: v2-shimmer 1.4s infinite;
}
.v2-skel-title { width: 42%; height: 34px; margin-bottom: 18px; }
.v2-skel-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; margin-bottom: 16px; }
.v2-skel-card { height: 132px; }
.v2-skel-line { height: 16px; margin-bottom: 10px; }
.v2-skel-line.short { width: 62%; }
@keyframes v2-shimmer { 100% { transform: translateX(100%); } }
.v2-spinner {
  display: inline-block;
  width: 14px;
  height: 14px;
  border: 2px solid rgba(34, 211, 238, .3);
  border-top-color: #22D3EE;
  border-radius: 50%;
  animation: v2-spin .8s linear infinite;
  vertical-align: -2px;
}
@keyframes v2-spin { to { transform: rotate(360deg); } }

/* ---------------- 今日航线 ---------------- */
.v2-hero {
  position: relative;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 20px;
  padding: 26px 28px;
  border-radius: 16px;
  border: 1px solid rgba(34, 211, 238, .18);
  background:
    radial-gradient(circle at 90% 20%, rgba(34, 211, 238, .16), transparent 45%),
    radial-gradient(circle at 10% 100%, rgba(99, 102, 241, .15), transparent 50%),
    var(--v2-hero-grad, linear-gradient(135deg, #0E1B31, #0B1526));
  margin-bottom: 14px;
  overflow: hidden;
}
.v2-hero h1 { font-size: 30px; font-weight: 800; letter-spacing: -.02em; }
.v2-hero .v2-sub { margin-top: 6px; color: var(--v2-muted); font-size: 14px; }
.v2-hero .v2-sub b { color: var(--v2-cyan-hover, #67E8F9); }
.v2-hero-stats { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 16px; }
.v2-orbit { position: relative; width: 130px; height: 130px; flex: none; opacity: .8; }
.v2-orbit i {
  position: absolute;
  left: 50%;
  top: 50%;
  border-radius: 50%;
  border: 1px solid rgba(34, 211, 238, .25);
  transform: translate(-50%, -50%);
}
.v2-orbit i:nth-child(1) { width: 128px; height: 128px; animation: v2-orbit-spin 18s linear infinite; }
.v2-orbit i:nth-child(2) { width: 84px; height: 84px; border-color: rgba(245, 158, 11, .3); animation: v2-orbit-spin 12s linear infinite reverse; }
.v2-orbit i:nth-child(3) { width: 16px; height: 16px; background: #22D3EE; border: none; box-shadow: 0 0 22px rgba(34, 211, 238, .8); }
.v2-orbit i:nth-child(1)::after,
.v2-orbit i:nth-child(2)::after {
  content: "";
  position: absolute;
  top: -3px;
  left: 50%;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: #22D3EE;
  box-shadow: 0 0 10px rgba(34, 211, 238, .9);
}
.v2-orbit i:nth-child(2)::after { background: #F59E0B; box-shadow: 0 0 10px rgba(245, 158, 11, .9); }
@keyframes v2-orbit-spin { to { transform: translate(-50%, -50%) rotate(360deg); } }

.v2-quicklinks {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  margin-bottom: 14px;
}
.v2-quicklinks a {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 7px 12px;
  border-radius: 9px;
  border: 1px solid var(--v2-line);
  background: rgba(148, 163, 184, .05);
  color: var(--v2-text-soft, #CBD5E1);
  font-size: 12.5px;
  transition: border-color .15s, background .15s;
}
.v2-quicklinks a:hover { border-color: rgba(34, 211, 238, .4); background: rgba(34, 211, 238, .06); color: var(--v2-text-bright, #E6EDF7); }
.v2-quicklinks span { font-size: 14px; }

.v2-tasks { display: flex; flex-direction: column; gap: 8px; }
.v2-task {
  display: grid;
  grid-template-columns: 38px minmax(0, 1fr) auto;
  gap: 12px;
  align-items: center;
  padding: 11px 14px;
  border-radius: 10px;
  border: 1px solid transparent;
  background: var(--v2-ink, rgba(2, 8, 20, .3));
  color: var(--v2-text);
  transition: border-color .15s, background .15s, transform .15s;
}
.v2-task:hover { border-color: rgba(34, 211, 238, .35); background: rgba(34, 211, 238, .05); color: var(--v2-text); transform: translateX(2px); }
.v2-task-icon {
  width: 34px;
  height: 34px;
  display: grid;
  place-items: center;
  border-radius: 9px;
  background: rgba(34, 211, 238, .1);
  border: 1px solid rgba(34, 211, 238, .18);
  font-size: 16px;
}
.v2-task-main { min-width: 0; }
.v2-task-main b { display: block; font-size: 14px; font-weight: 650; }
.v2-task-main small { display: block; color: var(--v2-muted); font-size: 12px; margin-top: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v2-task-meta { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--v2-muted); }
.v2-task.done { opacity: .6; }
.v2-task.done .v2-task-icon { background: rgba(52, 211, 153, .14); border-color: rgba(52, 211, 153, .3); color: var(--v2-green-soft, #6EE7B7); }

.v2-loop { display: flex; gap: 6px; margin-top: 14px; }
.v2-loop-step {
  flex: 1;
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 3px;
  padding: 8px 4px;
  border-radius: 9px;
  border: 1px solid var(--v2-line);
  background: var(--v2-ink, rgba(2, 8, 20, .25));
}
.v2-loop-icon { font-size: 15px; line-height: 1.2; }
.v2-loop-step b { font-size: 11px; color: var(--v2-muted); font-weight: 600; }
.v2-loop-step.done { border-color: rgba(52, 211, 153, .35); background: rgba(52, 211, 153, .08); }
.v2-loop-step.done b { color: var(--v2-green-soft, #6EE7B7); }
.v2-loop-line { display: none; }

.v2-scene-cta {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 14px;
  border-radius: 10px;
  border: 1px solid rgba(34, 211, 238, .22);
  background: rgba(34, 211, 238, .05);
  color: var(--v2-text);
  transition: border-color .15s, transform .15s;
}
.v2-scene-cta:hover { color: var(--v2-text); border-color: rgba(34, 211, 238, .5); transform: translateY(-1px); }
.v2-scene-emoji { font-size: 28px; }
.v2-scene-cta-text { display: flex; flex-direction: column; min-width: 0; }
.v2-scene-cta-text small { color: var(--v2-muted); font-size: 12px; }
.v2-arrow { margin-left: auto; color: var(--v2-cyan); font-size: 18px; }

/* ---------------- 学习中心 ---------------- */
.v2-entries { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 14px; margin-bottom: 14px; }
.v2-entry {
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: 20px;
  border-radius: 14px;
  border: 1px solid var(--v2-line);
  background: var(--v2-panel-grad-a, linear-gradient(160deg, rgba(17, 31, 56, .95), rgba(12, 22, 40, .95)));
  color: var(--v2-text);
  transition: transform .18s, border-color .18s;
}
.v2-entry:hover { color: var(--v2-text); transform: translateY(-3px); }
.v2-entry--cyan:hover { border-color: rgba(34, 211, 238, .5); }
.v2-entry--amber:hover { border-color: rgba(245, 158, 11, .5); }
.v2-entry--violet:hover { border-color: rgba(167, 139, 250, .5); }
.v2-entry--green:hover { border-color: rgba(52, 211, 153, .5); }
.v2-entry-icon { font-size: 30px; line-height: 1.1; }
.v2-entry-body b { display: block; font-size: 17px; font-weight: 750; }
.v2-entry-body small { display: block; color: var(--v2-muted); font-size: 12.5px; margin-top: 3px; }
.v2-entry-meta {
  margin-top: auto;
  padding-top: 8px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  font-size: 11.5px;
  color: var(--v2-dim);
}
.v2-entry--cyan .v2-entry-meta { color: var(--v2-cyan-hover, #67E8F9); }
.v2-entry--amber .v2-entry-meta { color: var(--v2-amber-soft, #FCD34D); }
.v2-entry--violet .v2-entry-meta { color: var(--v2-violet-soft, #C4B5FD); }
.v2-entry--green .v2-entry-meta { color: var(--v2-green-soft, #6EE7B7); }
.v2-entry--red:hover { border-color: rgba(248, 113, 113, .5); }
.v2-entry--red .v2-entry-meta { color: var(--v2-entry-red, #FCA5A5); }
.v2-entry-meta i { font-style: normal; font-size: 15px; }

.v2-kmap { display: flex; flex-direction: column; gap: 14px; }
.v2-branch h3 {
  font-size: 12px;
  color: var(--v2-cyan);
  letter-spacing: .06em;
  margin-bottom: 7px;
}
.v2-nodes { display: flex; flex-wrap: wrap; gap: 6px; }
.v2-node {
  font-size: 12px;
  padding: 4px 10px;
  border-radius: 999px;
  background: rgba(148, 163, 184, .08);
  border: 1px solid var(--v2-line);
  color: var(--v2-muted);
  cursor: default;
}
.v2-node.done {
  background: rgba(52, 211, 153, .1);
  border-color: rgba(52, 211, 153, .3);
  color: var(--v2-green-soft, #6EE7B7);
}
.v2-node.done::before { content: "✓ "; font-size: 10px; }
.v2-cycle { list-style: none; display: flex; flex-direction: column; gap: 14px; }
.v2-cycle li { display: flex; gap: 12px; align-items: flex-start; }
.v2-cycle li > span {
  flex: none;
  width: 32px;
  height: 32px;
  display: grid;
  place-items: center;
  border-radius: 9px;
  background: rgba(34, 211, 238, .08);
  border: 1px solid rgba(34, 211, 238, .18);
}
.v2-cycle b { font-size: 13.5px; }
.v2-cycle p { color: var(--v2-muted); font-size: 12.5px; margin-top: 2px; }
.v2-cycle + .v2-row { margin-top: 16px; }

/* ---------------- 剧场列表 ---------------- */
.v2-progress-card { margin-bottom: 14px; }
.v2-progress-card .v2-muted { font-size: 13px; }
.v2-progress-card .v2-small { margin-top: 8px; }
.v2-scene-grid, .v2-level-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 14px;
}
.v2-scene-card {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 18px;
  border-radius: 14px;
  border: 1px solid var(--v2-line);
  background: var(--v2-panel-grad-b, linear-gradient(160deg, rgba(17, 31, 56, .95), rgba(12, 22, 40, .96)));
  color: var(--v2-text);
  position: relative;
  transition: transform .18s, border-color .18s;
}
.v2-scene-card:hover { color: var(--v2-text); transform: translateY(-3px); border-color: rgba(34, 211, 238, .45); }
.v2-scene-card.done { border-color: rgba(52, 211, 153, .25); }
.v2-scene-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; }
.v2-scene-icon {
  width: 44px;
  height: 44px;
  display: grid;
  place-items: center;
  border-radius: 12px;
  font-size: 22px;
  background: rgba(34, 211, 238, .08);
  border: 1px solid rgba(34, 211, 238, .18);
}
.v2-scene-card h3 { font-size: 16px; font-weight: 700; }
.v2-scene-tags { display: flex; flex-wrap: wrap; gap: 5px; }
.v2-scene-meta {
  display: flex;
  gap: 10px;
  flex-wrap: wrap;
  font-size: 11.5px;
  color: var(--v2-dim);
  margin-top: auto;
  padding-top: 6px;
}
.v2-scene-go { font-size: 12px; color: var(--v2-cyan); font-weight: 600; margin-top: 4px; }

/* ---------------- 剧场播放器 ---------------- */
.v2-theater-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 18px;
  flex-wrap: wrap;
  margin-bottom: 16px;
}
.v2-theater-copy { min-width: 0; }
.v2-theater-copy h1 { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 4px; }
.v2-theater-copy .v2-link { display: inline-block; margin-bottom: 6px; }
.v2-theater-status { display: flex; gap: 8px; flex-wrap: wrap; }
.v2-stage {
  display: grid;
  grid-template-columns: minmax(0, 1.5fr) minmax(280px, .85fr);
  gap: 14px;
  align-items: stretch;
  margin-bottom: 14px;
}
.v2-viz {
  min-height: 330px;
  border-radius: 14px;
  border: 1px solid var(--v2-line);
  background:
    radial-gradient(circle at 50% 0%, rgba(34, 211, 238, .07), transparent 60%),
    var(--v2-ink-strong, rgba(2, 8, 20, .45));
  padding: 20px;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: auto;
}
.v2-viz-inner { width: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; }
.v2-side { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
.v2-narr {
  padding: 16px 18px;
  border-radius: 12px;
  border: 1px solid var(--v2-line);
  background: var(--v2-card-grad, linear-gradient(180deg, rgba(17, 31, 56, .92), rgba(15, 26, 46, .92)));
}
.v2-narr-top { margin-bottom: 8px; }
.v2-narr p { font-size: 14px; line-height: 1.75; color: var(--v2-text-soft, #CBD5E1); }

.v2-controls {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  padding: 12px 14px;
  border-radius: 12px;
  border: 1px solid var(--v2-line);
  background: var(--v2-panel-flat-75, rgba(15, 26, 46, .75));
}
.v2-seek-wrap { flex: 1 1 180px; min-width: 150px; display: flex; align-items: center; }
.v2-seek {
  width: 100%;
  height: 4px;
  accent-color: #22D3EE;
  cursor: pointer;
}
.v2-step {
  font-size: 12px;
  color: var(--v2-muted);
  font-variant-numeric: tabular-nums;
  min-width: 56px;
  text-align: center;
}
.v2-speed { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--v2-muted); }
.v2-speed .v2-select { width: auto; padding: 5px 8px; font-size: 12px; }

.v2-array-scroll { max-width: 100%; overflow-x: auto; padding: 6px 2px; }
.v2-array { display: flex; align-items: flex-end; justify-content: center; gap: 8px; min-width: max-content; padding: 0 6px; }
.v2-cell-wrap { display: flex; flex-direction: column; align-items: center; gap: 5px; }
.v2-idx { font-size: 10px; color: rgba(148, 163, 184, .5); font-variant-numeric: tabular-nums; }
.v2-cell {
  min-width: 54px;
  height: 54px;
  padding: 0 6px;
  display: grid;
  place-items: center;
  border-radius: 10px;
  background: rgba(148, 163, 184, .08);
  border: 1px solid var(--v2-line);
  font-family: var(--v2-mono);
  font-weight: 700;
  font-size: 14px;
  transition: background .2s, border-color .2s, transform .2s;
}
.v2-cell.hl {
  background: rgba(34, 211, 238, .18);
  border-color: rgba(34, 211, 238, .75);
  color: var(--v2-cyan-soft, #A5F3FC);
  box-shadow: 0 0 0 3px rgba(34, 211, 238, .1);
  transform: translateY(-2px);
}
.v2-cell.target { border-color: rgba(245, 158, 11, .7); color: var(--v2-amber-soft, #FCD34D); }
.v2-cell.in-range { background: rgba(34, 211, 238, .06); }
.v2-cell.dim { opacity: .35; }
.v2-ptr { min-height: 15px; display: flex; gap: 3px; }
.v2-ptr em {
  font-style: normal;
  font-size: 9px;
  text-transform: uppercase;
  letter-spacing: .04em;
  padding: 0 4px;
  border-radius: 4px;
  background: rgba(245, 158, 11, .16);
  color: var(--v2-amber-soft, #FCD34D);
}
.v2-viz-legend { display: flex; gap: 8px; flex-wrap: wrap; justify-content: center; margin-top: 12px; }

.v2-bars {
  display: flex;
  align-items: flex-end;
  justify-content: center;
  gap: 10px;
  width: 100%;
  height: 250px;
  padding: 16px 6px 0;
  overflow-x: auto;
}
.v2-bar-col {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: flex-end;
  gap: 5px;
  flex: 1 1 0;
  min-width: 32px;
  max-width: 80px;
  height: 100%;
}
.v2-bar-value { font-size: 11px; color: var(--v2-muted); font-variant-numeric: tabular-nums; }
.v2-bar-track {
  width: 100%;
  flex: 1;
  display: flex;
  align-items: flex-end;
  border-radius: 6px;
  background: rgba(148, 163, 184, .05);
  min-height: 80px;
}
.v2-bar-rect {
  display: block;
  width: 100%;
  border-radius: 6px 6px 2px 2px;
  background: linear-gradient(180deg, #67E8F9, #0891B2);
  transition: height .3s ease;
}
.v2-bar-rect.hl {
  background: linear-gradient(180deg, #FDE68A, #F59E0B);
  box-shadow: 0 0 18px rgba(245, 158, 11, .3);
}
.v2-bar-index { font-size: 10px; color: var(--v2-dim); }

.v2-stack { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; min-height: 220px; }
.v2-stack-item {
  position: relative;
  min-width: 150px;
  padding: 10px 18px;
  text-align: center;
  border-radius: 8px;
  border: 1px solid var(--v2-line-strong);
  background: rgba(148, 163, 184, .07);
  font-family: var(--v2-mono);
  font-size: 14px;
}
.v2-stack-item.hl {
  border-color: rgba(34, 211, 238, .6);
  background: rgba(34, 211, 238, .12);
  color: var(--v2-cyan-soft, #A5F3FC);
}
.v2-stack-top {
  margin-left: 8px;
  font-size: 9.5px;
  color: var(--v2-amber-soft, #FCD34D);
  background: rgba(245, 158, 11, .14);
  padding: 1px 5px;
  border-radius: 4px;
  vertical-align: 2px;
}
.v2-stack-empty { color: var(--v2-muted); font-size: 13px; padding: 20px; }

.v2-grid-scroll { max-width: 100%; overflow: auto; padding: 4px; }
.v2-grid-table { border-collapse: separate; border-spacing: 4px; margin: 0 auto; font-family: var(--v2-mono); }
.v2-grid-table th { font-size: 10px; font-weight: 500; color: var(--v2-dim); padding: 2px 4px; }
.v2-grid-table td {
  min-width: 40px;
  height: 38px;
  padding: 3px 8px;
  text-align: center;
  border-radius: 6px;
  border: 1px solid var(--v2-line);
  background: rgba(148, 163, 184, .06);
  font-size: 12px;
}
.v2-grid-table td.hl {
  border-color: rgba(34, 211, 238, .65);
  background: rgba(34, 211, 238, .16);
  color: var(--v2-cyan-soft, #A5F3FC);
}
.v2-grid-corner { background: none; }

.v2-tree-scroll, .v2-graph-scroll { width: 100%; overflow: auto; }
.v2-tree, .v2-graph { width: 100%; height: auto; min-width: 300px; max-height: 420px; display: block; }
.v2-tree-edge, .v2-graph-edge { stroke: rgba(148, 163, 184, .25); stroke-width: 1.5; }
.v2-tree-node circle, .v2-graph-node circle {
  fill: rgba(15, 26, 46, .96);
  stroke: rgba(148, 163, 184, .4);
  stroke-width: 1.5;
}
.v2-tree-node text, .v2-graph-node text {
  fill: var(--v2-text-soft, #CBD5E1);
  font-family: var(--v2-mono);
  font-size: 11px;
}
.v2-tree-node.hl circle, .v2-graph-node.hl circle {
  fill: rgba(34, 211, 238, .18);
  stroke: #22D3EE;
  stroke-width: 2;
}
.v2-tree-node.hl text, .v2-graph-node.hl text { fill: var(--v2-cyan-soft, #A5F3FC); }
.v2-arrow-head { fill: rgba(148, 163, 184, .45); }

.v2-code {
  width: 100%;
  margin: 0;
  padding: 12px;
  max-height: 340px;
  overflow: auto;
  border-radius: 10px;
  border: 1px solid var(--v2-line);
  background: var(--v2-ink-strong, rgba(2, 8, 20, .55));
  color: var(--v2-text-soft, #CBD5E1);
  font-family: var(--v2-mono);
  font-size: 13px;
  line-height: 1.75;
  white-space: pre-wrap;
}
.v2-code-line { display: flex; gap: 12px; padding: 0 6px; border-radius: 4px; }
.v2-code-line.hl { background: rgba(34, 211, 238, .12); color: var(--v2-code-hl-fg, #A5F3FC); }
.v2-ln {
  flex: none;
  width: 22px;
  text-align: right;
  color: var(--v2-ln-fg, rgba(148, 163, 184, .38));
  user-select: none;
  font-size: 11px;
}
.v2-code-text { flex: 1; white-space: pre-wrap; overflow-wrap: anywhere; }

.v2-predict {
  padding: 16px;
  border-radius: 12px;
  border: 1px solid rgba(34, 211, 238, .22);
  background: var(--v2-card-grad-hi, linear-gradient(180deg, rgba(17, 31, 56, .96), rgba(15, 26, 46, .96)));
}
.v2-predict.ok { border-color: rgba(52, 211, 153, .45); }
.v2-predict.bad { border-color: rgba(251, 113, 133, .4); }
.v2-predict-q { font-size: 14px; font-weight: 650; color: var(--v2-text-bright, #E6EDF7); margin-bottom: 10px; line-height: 1.6; }
.v2-options { display: flex; flex-direction: column; gap: 8px; }
.v2-option {
  text-align: left;
  padding: 10px 12px;
  border-radius: 8px;
  border: 1px solid var(--v2-line-strong);
  background: rgba(148, 163, 184, .07);
  color: var(--v2-text-soft, #CBD5E1);
  font: inherit;
  font-size: 13.5px;
  cursor: pointer;
  transition: border-color .15s, background .15s;
}
.v2-option:hover:not(:disabled) { border-color: rgba(34, 211, 238, .55); background: rgba(34, 211, 238, .07); }
.v2-option:disabled { cursor: default; }
.v2-option.correct { border-color: rgba(52, 211, 153, .6); background: rgba(52, 211, 153, .14); color: var(--v2-green-soft, #6EE7B7); }
.v2-option.wrong { border-color: rgba(251, 113, 133, .6); background: rgba(251, 113, 133, .13); color: var(--v2-red-soft, #FDA4AF); }
.v2-option.muted { opacity: .5; }
.v2-explain {
  margin-top: 10px;
  padding: 9px 12px;
  border-left: 3px solid rgba(245, 158, 11, .65);
  border-radius: 0 6px 6px 0;
  background: rgba(245, 158, 11, .08);
  color: var(--v2-amber-soft, #FCD34D);
  font-size: 13px;
  line-height: 1.7;
}
.v2-predict .v2-btn { margin-top: 12px; }

.v2-result {
  display: flex;
  gap: 16px;
  align-items: flex-start;
  margin-top: 14px;
  padding: 18px;
  border-radius: 12px;
  border: 1px solid var(--v2-line);
  background: var(--v2-panel-flat-80, rgba(15, 26, 46, .8));
}
.v2-result.ok { border-color: rgba(52, 211, 153, .4); background: rgba(52, 211, 153, .06); }
.v2-result.bad { border-color: rgba(251, 113, 133, .4); background: rgba(251, 113, 133, .06); }
.v2-result.loading { justify-content: center; align-items: center; color: var(--v2-muted); font-size: 13px; }
.v2-result-icon { font-size: 34px; line-height: 1; flex: none; }
.v2-result-body { min-width: 0; }
.v2-result h2 { font-size: 17px; font-weight: 700; margin-bottom: 6px; }
.v2-result p { font-size: 13px; color: var(--v2-text-soft, #CBD5E1); }
.v2-result-reward { display: flex; gap: 6px; flex-wrap: wrap; margin: 8px 0 12px; }

.v2-branches { margin-top: 16px; }
.v2-branches > .v2-card-h { margin-bottom: 10px; }
.v2-branch {
  border: 1px solid var(--v2-line);
  border-radius: 10px;
  background: rgba(148, 163, 184, .03);
  padding: 10px 14px;
  margin-bottom: 8px;
}
.v2-branch summary { cursor: pointer; font-size: 13px; font-weight: 600; color: var(--v2-text-soft, #CBD5E1); }
.v2-branch summary:hover { color: var(--v2-cyan); }
.v2-branch p { margin-top: 8px; font-size: 13px; color: var(--v2-muted); line-height: 1.75; }
.v2-branch-viz { margin-top: 10px; }
.v2-branch .v2-code { max-height: 240px; }

/* ---------------- 道场 ---------------- */
.v2-dojo-grid {
  display: grid;
  grid-template-columns: minmax(0, 1.15fr) minmax(0, .85fr);
  gap: 14px;
  align-items: start;
}
.v2-editor {
  width: 100%;
  min-height: 430px;
  padding: 14px;
  border-radius: 10px;
  border: 1px solid var(--v2-line-strong);
  background: var(--v2-editor-bg, #060D18);
  color: var(--v2-text-soft, #CBD5E1);
  font-family: var(--v2-mono);
  font-size: 13.5px;
  line-height: 1.7;
  resize: vertical;
  tab-size: 4;
  white-space: pre;
  overflow: auto;
}
.v2-editor:focus {
  outline: none;
  border-color: var(--v2-cyan);
  box-shadow: 0 0 0 3px rgba(34, 211, 238, .12);
}
.v2-dojo-actions { margin-top: 12px; }
.v2-hint {
  margin-top: 10px;
  padding: 10px 12px;
  border-radius: 8px;
  border: 1px solid rgba(245, 158, 11, .28);
  background: rgba(245, 158, 11, .08);
  color: var(--v2-amber-soft, #FCD34D);
  font-size: 13px;
  line-height: 1.7;
}
.v2-check { }
.v2-check.loading { display: flex; align-items: center; gap: 8px; color: var(--v2-muted); font-size: 13px; padding: 18px 0; }
.v2-check h2 { font-size: 16px; margin-bottom: 4px; }
.v2-check.ok h2 { color: var(--v2-green-soft, #6EE7B7); }
.v2-check.bad h2 { color: var(--v2-red-soft, #FDA4AF); }
.v2-check-head { display: flex; gap: 12px; align-items: flex-start; }
.v2-check-icon { font-size: 24px; line-height: 1.2; flex: none; }
.v2-check-copy { min-width: 0; }
.v2-check-copy p { font-size: 13px; color: var(--v2-muted); margin-top: 2px; }
.v2-check-stars { margin-left: auto; flex: none; }
.v2-test-list { display: flex; flex-direction: column; gap: 6px; margin-top: 14px; }
.v2-test-row {
  display: grid;
  grid-template-columns: 54px 1fr auto;
  align-items: center;
  gap: 10px;
  padding: 8px 11px;
  border-radius: 8px;
  border: 1px solid var(--v2-line);
  background: var(--v2-ink, rgba(2, 8, 20, .32));
}
.v2-test-name { font-family: var(--v2-mono); font-size: 12px; color: var(--v2-muted); }
.v2-case-pill { font-size: 12px; font-weight: 650; }
.v2-case-pill.ok { color: var(--v2-green-soft, #6EE7B7); }
.v2-case-pill.bad { color: var(--v2-red-soft, #FDA4AF); }
.v2-test-time { font-size: 11px; color: var(--v2-dim); font-variant-numeric: tabular-nums; }
.v2-check-reward { margin-top: 12px; }
.v2-level-card {
  display: flex;
  flex-direction: column;
  gap: 7px;
  padding: 18px;
  border-radius: 14px;
  border: 1px solid var(--v2-line);
  background: var(--v2-panel-grad-b, linear-gradient(160deg, rgba(17, 31, 56, .95), rgba(12, 22, 40, .96)));
  color: var(--v2-text);
  transition: transform .18s, border-color .18s;
}
.v2-level-card:hover { color: var(--v2-text); transform: translateY(-3px); border-color: rgba(245, 158, 11, .45); }
.v2-level-card.done { border-color: rgba(52, 211, 153, .28); }
.v2-level-top { display: flex; justify-content: space-between; align-items: center; gap: 8px; }
.v2-level-diff { font-size: 11px; }
.v2-level-card h3 { font-size: 16px; font-weight: 700; }
.v2-level-stars { display: flex; align-items: center; gap: 7px; }
.v2-level-stars small { font-size: 11px; color: var(--v2-dim); }
.v2-level-meta {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 8px;
  font-size: 11.5px;
  color: var(--v2-dim);
  margin-top: auto;
  padding-top: 5px;
}
.v2-level-meta .v2-scene-go { margin: 0; }

/* ---------------- 竞赛 ---------------- */
.v2-track-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; margin-bottom: 14px; }
.v2-track-card {
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: 18px;
  border-radius: 14px;
  border: 1px solid var(--v2-line);
  background: var(--v2-panel-grad-b, linear-gradient(160deg, rgba(17, 31, 56, .95), rgba(12, 22, 40, .96)));
}
.v2-track-card:hover { border-color: rgba(167, 139, 250, .4); }
.v2-track-main { display: flex; flex-direction: column; gap: 7px; color: var(--v2-text); }
.v2-track-main:hover { color: var(--v2-text); }
.v2-track-top { display: flex; justify-content: space-between; align-items: flex-start; gap: 8px; }
.v2-track-icon {
  width: 42px;
  height: 42px;
  display: grid;
  place-items: center;
  border-radius: 11px;
  font-size: 21px;
  background: rgba(167, 139, 250, .1);
  border: 1px solid rgba(167, 139, 250, .2);
}
.v2-track-card h3 { font-size: 17px; font-weight: 750; }
.v2-track-card p { font-size: 12.5px; }
.v2-track-meta {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 11.5px;
  color: var(--v2-dim);
  margin-top: 4px;
}
.v2-track-meta .v2-scene-go { margin: 0; }
.v2-contest-list { display: flex; flex-direction: column; gap: 8px; }
.v2-contest {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 11px 14px;
  border-radius: 10px;
  border: 1px solid var(--v2-line);
  background: var(--v2-ink, rgba(2, 8, 20, .28));
  color: var(--v2-text);
  transition: border-color .15s, background .15s;
}
.v2-contest:hover { color: var(--v2-text); border-color: rgba(34, 211, 238, .35); background: rgba(34, 211, 238, .04); }
.v2-contest-icon { font-size: 20px; flex: none; }
.v2-contest-main { display: flex; flex-direction: column; min-width: 0; flex: 1; }
.v2-contest-main b { font-size: 13.5px; font-weight: 650; }
.v2-contest-main small { font-size: 11.5px; color: var(--v2-muted); margin-top: 1px; }
.v2-contest-status {
  flex: none;
  font-size: 11.5px;
  padding: 2px 9px;
  border-radius: 999px;
  color: var(--v2-muted);
  background: rgba(148, 163, 184, .1);
}
.v2-contest.live .v2-contest-status { color: var(--v2-green-soft, #6EE7B7); background: rgba(52, 211, 153, .12); }
.v2-contest.live { border-color: rgba(52, 211, 153, .25); }
.v2-contest.ended { opacity: .65; }

.v2-stages { display: flex; flex-direction: column; gap: 12px; }
.v2-stage-block {
  padding: 16px 18px;
  border-radius: 12px;
  border: 1px solid var(--v2-line);
  background: var(--v2-panel-flat-60, rgba(15, 26, 46, .6));
}
.v2-stage-block.active { border-color: rgba(34, 211, 238, .35); background: rgba(34, 211, 238, .04); }
.v2-stage-block.passed { border-color: rgba(52, 211, 153, .22); }
.v2-stage-head { display: flex; align-items: flex-start; gap: 12px; }
.v2-stage-index {
  flex: none;
  width: 28px;
  height: 28px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  border: 1px solid var(--v2-line-strong);
  font-size: 12px;
  font-weight: 700;
  color: var(--v2-muted);
}
.v2-stage-block.active .v2-stage-index { border-color: var(--v2-cyan); color: var(--v2-cyan-soft, #A5F3FC); background: rgba(34, 211, 238, .12); }
.v2-stage-block.passed .v2-stage-index { border-color: rgba(52, 211, 153, .5); color: var(--v2-green-soft, #6EE7B7); background: rgba(52, 211, 153, .1); }
.v2-stage-head > div { flex: 1; min-width: 0; }
.v2-stage-head h3 { font-size: 15px; }
.v2-stage-head p { font-size: 12.5px; color: var(--v2-muted); margin-top: 2px; }
.v2-problem-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; margin-top: 12px; }
.v2-problem {
  display: flex;
  align-items: center;
  gap: 9px;
  padding: 8px 11px;
  border-radius: 8px;
  border: 1px solid var(--v2-line);
  background: var(--v2-ink, rgba(2, 8, 20, .25));
  color: var(--v2-text);
  font-size: 12.5px;
}
.v2-problem:hover { color: var(--v2-text); border-color: rgba(34, 211, 238, .4); }
.v2-problem-code { font-family: var(--v2-mono); font-weight: 700; font-size: 11.5px; color: var(--v2-muted); }
.v2-problem-title { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v2-problem-status { font-size: 10.5px; color: var(--v2-dim); flex: none; }
.v2-problem.ac { border-color: rgba(52, 211, 153, .3); }
.v2-problem.ac .v2-problem-status { color: var(--v2-green-soft, #6EE7B7); }
.v2-problem.tried { border-color: rgba(245, 158, 11, .24); }
.v2-problem.tried .v2-problem-status { color: var(--v2-amber-soft, #FCD34D); }

/* ---------------- 成长 ---------------- */
.v2-radar-wrap { display: flex; justify-content: center; padding: 4px 0 8px; }
.v2-radar { width: 100%; max-width: 380px; height: auto; }
.v2-radar-ring { fill: none; stroke: rgba(148, 163, 184, .16); stroke-width: 1; }
.v2-radar-axis { stroke: rgba(148, 163, 184, .12); stroke-width: 1; }
.v2-radar-area { fill: rgba(34, 211, 238, .14); stroke: none; }
.v2-radar-poly { fill: none; stroke: var(--v2-chart-stroke, #22D3EE); stroke-width: 2; stroke-linejoin: round; }
.v2-radar-dot { fill: var(--v2-chart-stroke, #22D3EE); stroke: var(--v2-chart-dot-ring, #0B1220); stroke-width: 1.5; }
.v2-radar-label { fill: var(--v2-muted, #94A3B8); font-size: 10.5px; font-weight: 600; }
.v2-radar-score { fill: var(--v2-cyan-hover, #67E8F9); font-size: 10px; font-weight: 700; }

.v2-timeline { list-style: none; display: flex; flex-direction: column; gap: 0; max-height: 430px; overflow: auto; padding-right: 4px; }
.v2-timeline li { display: flex; gap: 12px; position: relative; padding-bottom: 18px; }
.v2-timeline li::before {
  content: "";
  position: absolute;
  left: 15px;
  top: 30px;
  bottom: 0;
  width: 1px;
  background: var(--v2-line);
}
.v2-timeline li:last-child { padding-bottom: 0; }
.v2-timeline li:last-child::before { display: none; }
.v2-tl-icon {
  flex: none;
  width: 31px;
  height: 31px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: rgba(34, 211, 238, .08);
  border: 1px solid rgba(34, 211, 238, .2);
  font-size: 14px;
  z-index: 1;
}
.v2-tl-body { min-width: 0; padding-top: 2px; }
.v2-tl-body b { font-size: 13px; font-weight: 650; }
.v2-tl-body p { font-size: 12.5px; color: var(--v2-muted); margin-top: 2px; }
.v2-tl-body small { display: block; font-size: 10.5px; color: var(--v2-dim); margin-top: 3px; }

.v2-badges { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; }
.v2-badge {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  text-align: center;
  padding: 16px 10px;
  border-radius: 12px;
  border: 1px solid var(--v2-line);
  background: var(--v2-ink, rgba(2, 8, 20, .25));
}
.v2-badge-icon { font-size: 28px; line-height: 1.2; filter: drop-shadow(0 4px 12px rgba(245, 158, 11, .18)); }
.v2-badge b { font-size: 12.5px; font-weight: 650; }
.v2-badge small { font-size: 10.5px; color: var(--v2-muted); line-height: 1.5; }
.v2-badge .v2-small { font-size: 10px; }
.v2-capsule-note {
  margin: 10px 0 14px;
  padding: 12px 14px;
  border-left: 3px solid rgba(245, 158, 11, .6);
  border-radius: 0 8px 8px 0;
  background: rgba(245, 158, 11, .06);
  color: var(--v2-amber-soft, #FCD34D);
  font-size: 13.5px;
  line-height: 1.7;
  min-height: 46px;
}
.v2-spark-wrap { padding-top: 6px; }
.v2-spark { width: 100%; height: auto; display: block; }
.v2-spark-area { fill: rgba(34, 211, 238, .12); stroke: none; }
.v2-spark-line { fill: none; stroke: var(--v2-chart-stroke, #22D3EE); stroke-width: 2.2; stroke-linejoin: round; stroke-linecap: round; }
.v2-spark-dot { fill: var(--v2-chart-stroke, #22D3EE); stroke: var(--v2-chart-dot-ring, #0B1220); stroke-width: 2; }
.v2-spark-meta { display: flex; justify-content: space-between; gap: 10px; font-size: 11px; color: var(--v2-dim); margin-top: 4px; }

/* ---------------- 护照 ---------------- */
.v2-passport-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 16px;
  flex-wrap: wrap;
}
.v2-passport {
  max-width: 820px;
  margin: 0 auto;
  padding: 34px 38px;
  border-radius: 18px;
  border: 1px solid rgba(148, 163, 184, .25);
  background:
    radial-gradient(circle at 85% 0%, rgba(245, 158, 11, .1), transparent 45%),
    radial-gradient(circle at 10% 100%, rgba(34, 211, 238, .08), transparent 50%),
    var(--v2-passport-grad, linear-gradient(160deg, #0E1B31, #0A1424));
  box-shadow: var(--v2-shadow-lg, 0 30px 70px rgba(0, 0, 0, .35));
}
.v2-passport-head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 12px;
  padding-bottom: 18px;
  border-bottom: 1px solid var(--v2-line);
  flex-wrap: wrap;
}
.v2-passport-brand { font-size: 14px; font-weight: 800; letter-spacing: .06em; color: var(--v2-text-bright, #E6EDF7); }
.v2-passport-brand span { color: var(--v2-amber); }
.v2-passport-date { font-size: 11.5px; color: var(--v2-muted); }
.v2-passport-who {
  display: flex;
  align-items: center;
  gap: 18px;
  padding: 24px 0 20px;
  flex-wrap: wrap;
}
.v2-passport-avatar {
  width: 78px;
  height: 78px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  font-size: 40px;
  background: rgba(34, 211, 238, .1);
  border: 1px solid rgba(34, 211, 238, .3);
  flex: none;
}
.v2-passport-who h1 { font-size: 28px; font-weight: 800; letter-spacing: -.02em; }
.v2-passport-who p { font-size: 12.5px; color: var(--v2-muted); margin-top: 2px; }
.v2-passport-elo { margin-left: auto; text-align: right; }
.v2-passport-elo span { display: block; font-size: 11px; color: var(--v2-muted); letter-spacing: .1em; }
.v2-passport-elo strong { font-size: 32px; font-weight: 800; color: var(--v2-amber-soft, #FCD34D); font-variant-numeric: tabular-nums; }
.v2-passport-stats { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; margin-bottom: 22px; }
.v2-passport-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 26px; margin-bottom: 22px; }
.v2-passport-grid h2, .v2-passport-badges h2 {
  font-size: 12px;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--v2-muted);
  padding-bottom: 8px;
  margin-bottom: 10px;
  border-bottom: 1px solid var(--v2-line);
}
.v2-passport-grid .v2-radar { max-width: 300px; }
.v2-timeline--print { max-height: none; overflow: visible; }
.v2-passport-badges { margin-bottom: 24px; }
.v2-passport-badge-row { display: flex; flex-wrap: wrap; gap: 8px; }
.v2-passport-badge {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 5px 11px;
  border-radius: 999px;
  border: 1px solid var(--v2-line);
  background: rgba(148, 163, 184, .06);
  font-size: 12px;
}
.v2-passport-badge i { font-style: normal; font-size: 15px; }
.v2-passport-foot {
  display: flex;
  justify-content: space-between;
  gap: 12px;
  padding-top: 16px;
  border-top: 1px solid var(--v2-line);
  font-size: 11px;
  color: var(--v2-dim);
  flex-wrap: wrap;
}

/* ---------------- 教师 ---------------- */
.v2-teach-code {
  margin-top: 14px;
  padding: 14px;
  border-radius: 10px;
  border: 1px solid rgba(52, 211, 153, .3);
  background: rgba(52, 211, 153, .07);
}
.v2-teach-code > span { display: block; font-size: 11.5px; color: var(--v2-muted); }
.v2-teach-code code {
  display: block;
  font-family: var(--v2-mono);
  font-size: 20px;
  letter-spacing: .1em;
  color: var(--v2-green-soft, #6EE7B7);
  margin: 6px 0 10px;
  word-break: break-all;
}
.v2-teach-code p { margin-top: 8px; }
.v2-class-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
.v2-class-card {
  display: flex;
  flex-direction: column;
  gap: 3px;
  padding: 14px;
  border-radius: 10px;
  border: 1px solid var(--v2-line);
  background: var(--v2-ink, rgba(2, 8, 20, .28));
  color: var(--v2-text);
  transition: border-color .15s, background .15s;
}
.v2-class-card:hover { color: var(--v2-text); border-color: rgba(34, 211, 238, .4); background: rgba(34, 211, 238, .04); }
.v2-class-icon { font-size: 20px; }
.v2-class-card b { font-size: 13.5px; }
.v2-class-card small { font-size: 11px; color: var(--v2-muted); font-family: var(--v2-mono); }
.v2-class-card .v2-scene-go { margin-top: 6px; }

.v2-tabs {
  display: flex;
  gap: 4px;
  padding: 4px;
  border-radius: 10px;
  border: 1px solid var(--v2-line);
  background: var(--v2-ink, rgba(2, 8, 20, .35));
  margin-bottom: 14px;
  width: fit-content;
  max-width: 100%;
  overflow-x: auto;
}
.v2-tab {
  border: none;
  background: none;
  color: var(--v2-muted);
  padding: 7px 16px;
  border-radius: 7px;
  font-size: 13px;
  cursor: pointer;
  white-space: nowrap;
}
.v2-tab:hover { color: var(--v2-text); }
.v2-tab.on { background: rgba(34, 211, 238, .12); color: var(--v2-cyan-soft, #A5F3FC); font-weight: 650; }

.v2-scroll { overflow-x: auto; }
.v2-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.v2-table th {
  text-align: left;
  font-size: 11px;
  color: var(--v2-dim);
  font-weight: 600;
  padding: 8px 10px;
  border-bottom: 1px solid var(--v2-line);
  white-space: nowrap;
}
.v2-table td {
  padding: 10px;
  border-bottom: 1px solid rgba(148, 163, 184, .07);
  color: var(--v2-text-soft, #CBD5E1);
  vertical-align: middle;
}
.v2-table tr:last-child td { border-bottom: none; }
.v2-table tbody tr:hover { background: rgba(148, 163, 184, .035); }
.v2-table-who { display: inline-flex; align-items: center; gap: 7px; }
.v2-table-who i { font-style: normal; font-size: 17px; }

.v2-heat-row {
  display: grid;
  grid-template-columns: 110px minmax(0, 1fr) 48px;
  align-items: center;
  gap: 10px;
  margin-bottom: 10px;
}
.v2-heat-row:last-child { margin-bottom: 0; }
.v2-heat-name { font-size: 12.5px; color: var(--v2-text-soft, #CBD5E1); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v2-heat-val { font-size: 11px; color: var(--v2-muted); text-align: right; font-variant-numeric: tabular-nums; }

.v2-stuck-list { display: flex; flex-direction: column; gap: 8px; }
.v2-stuck {
  display: flex;
  gap: 10px;
  align-items: flex-start;
  padding: 10px 12px;
  border-radius: 9px;
  border: 1px solid rgba(245, 158, 11, .18);
  background: rgba(245, 158, 11, .04);
}
.v2-stuck-avatar { font-size: 20px; }
.v2-stuck b { font-size: 13px; }
.v2-stuck p { font-size: 12px; color: var(--v2-muted); margin-top: 1px; }
.v2-stuck small { font-size: 10.5px; color: var(--v2-dim); }

.v2-assign-list { display: flex; flex-direction: column; gap: 8px; }
.v2-assign {
  padding: 12px 14px;
  border-radius: 10px;
  border: 1px solid var(--v2-line);
  background: var(--v2-ink, rgba(2, 8, 20, .25));
}
.v2-assign-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; flex-wrap: wrap; margin-bottom: 8px; }
.v2-assign-head b { font-size: 13.5px; }
.v2-lecture { margin-top: 4px; }
.v2-lecture h3 { font-size: 17px; margin-bottom: 10px; }
.v2-lecture h4 { font-size: 13px; color: var(--v2-cyan); margin: 16px 0 8px; }
.v2-lecture ul { padding-left: 20px; display: flex; flex-direction: column; gap: 6px; font-size: 13px; color: var(--v2-text-soft, #CBD5E1); }
.v2-lecture li::marker { color: rgba(34, 211, 238, .6); }
.v2-md { font-size: 13.5px; line-height: 1.8; color: var(--v2-text-soft, #CBD5E1); }
.v2-md p { margin: 0 0 10px; }
.v2-md ul, .v2-md ol { padding-left: 22px; margin-bottom: 10px; }
.v2-md code { font-family: var(--v2-mono); font-size: 12px; background: rgba(34, 211, 238, .1); padding: 1px 5px; border-radius: 4px; color: var(--v2-cyan-soft, #A5F3FC); }
.v2-md pre { background: var(--v2-ink-strong, rgba(2, 8, 20, .6)); padding: 12px; border-radius: 8px; overflow: auto; }
.v2-md h1, .v2-md h2, .v2-md h3 { margin: 14px 0 8px; }

/* ---------------- 我的学习码 ---------------- */
.v2-me-head { display: flex; align-items: center; gap: 14px; margin-bottom: 14px; }
.v2-avatar {
  width: 64px;
  height: 64px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  font-size: 34px;
  background: rgba(34, 211, 238, .09);
  border: 1px solid rgba(34, 211, 238, .26);
  flex: none;
}
.v2-me-head b { font-size: 17px; }
.v2-avatar-list { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 14px; }
.v2-avatar-opt {
  width: 38px;
  height: 38px;
  display: grid;
  place-items: center;
  font-size: 20px;
  border-radius: 9px;
  border: 1px solid var(--v2-line);
  background: rgba(148, 163, 184, .06);
  cursor: pointer;
  transition: border-color .15s, background .15s, transform .15s;
}
.v2-avatar-opt:hover { border-color: rgba(34, 211, 238, .5); transform: translateY(-1px); }
.v2-avatar-opt.on { border-color: var(--v2-cyan); background: rgba(34, 211, 238, .14); }
.v2-me-stats { margin-top: 16px; }
.v2-code-box {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 12px 14px;
  border-radius: 10px;
  border: 1px dashed rgba(34, 211, 238, .35);
  background: rgba(34, 211, 238, .05);
  margin-bottom: 10px;
  flex-wrap: wrap;
}
.v2-code-box code {
  flex: 1;
  min-width: 160px;
  font-family: var(--v2-mono);
  font-size: 19px;
  letter-spacing: .12em;
  color: var(--v2-cyan-soft, #A5F3FC);
  word-break: break-all;
}
.v2-code-box + .v2-small { margin-bottom: 10px; }
.v2-share-card {
  padding: 14px;
  border-radius: 10px;
  border: 1px solid rgba(52, 211, 153, .28);
  background: rgba(52, 211, 153, .05);
}
.v2-share-row {
  display: grid;
  grid-template-columns: 64px minmax(0, 1fr) auto;
  align-items: center;
  gap: 8px;
  margin-bottom: 8px;
}
.v2-share-row > span { font-size: 12px; color: var(--v2-muted); }
.v2-share-row .v2-input { font-family: var(--v2-mono); font-size: 12px; padding: 7px 10px; }
.v2-danger {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  margin-top: 16px;
  padding-top: 14px;
  border-top: 1px solid rgba(251, 113, 133, .18);
  flex-wrap: wrap;
}
.v2-danger b { font-size: 13px; color: var(--v2-red-soft, #FDA4AF); }

/* ---------------- 家长周报 ---------------- */
.v2-parent-wrap {
  max-width: 760px;
  margin: 0 auto;
  padding: 30px 18px 60px;
}
.v2-parent-brand {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 7px;
  font-size: 13px;
  font-weight: 700;
  color: var(--v2-muted, #94A3B8);
  letter-spacing: .08em;
  margin-bottom: 20px;
}
.v2-parent-brand span { color: var(--v2-amber, #F59E0B); font-size: 16px; }
.v2-parent-card {
  background:
    radial-gradient(circle at 100% 0%, rgba(34, 211, 238, .08), transparent 50%),
    var(--v2-parent-grad, linear-gradient(165deg, #0F1B30, #0A1424));
  border: 1px solid rgba(148, 163, 184, .18);
  border-radius: 16px;
  padding: 30px;
  box-shadow: var(--v2-shadow-lg, 0 30px 70px rgba(0, 0, 0, .35));
}
.v2-parent-icon { font-size: 36px; margin-bottom: 8px; }
.v2-parent-card h1 { font-size: 23px; font-weight: 800; margin-bottom: 8px; }
.v2-parent-card > p { color: var(--v2-muted, #94A3B8); font-size: 13.5px; }
.v2-pin-form { display: flex; gap: 10px; margin: 20px 0 8px; flex-wrap: wrap; }
.v2-pin-input {
  flex: 1;
  min-width: 150px;
  padding: 12px 16px;
  border-radius: 10px;
  border: 1px solid rgba(148, 163, 184, .3);
  background: var(--v2-ink-strong, rgba(2, 8, 20, .5));
  color: var(--v2-text-bright, #E6EDF7);
  font-family: var(--v2-mono);
  font-size: 22px;
  letter-spacing: .35em;
  text-align: center;
}
.v2-pin-input:focus { outline: none; border-color: #22D3EE; box-shadow: 0 0 0 3px rgba(34, 211, 238, .12); }
.v2-parent-err { color: var(--v2-red-soft, #FDA4AF); font-size: 13px; min-height: 20px; margin-top: 4px; }
.v2-parent-foot { text-align: center; font-size: 11px; color: #475569; margin-top: 16px; }
.v2-parent-report-head {
  display: flex;
  align-items: center;
  gap: 14px;
  padding-bottom: 18px;
  border-bottom: 1px solid var(--v2-line);
  flex-wrap: wrap;
}
.v2-parent-report-head > div:nth-child(2) { flex: 1; min-width: 160px; }
.v2-parent-report-head h1 { font-size: 21px; margin: 0; }
.v2-parent-report-head p { font-size: 11.5px; color: var(--v2-muted); margin-top: 3px; }
.v2-parent-avatar {
  width: 56px;
  height: 56px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  font-size: 30px;
  background: rgba(34, 211, 238, .1);
  border: 1px solid rgba(34, 211, 238, .28);
  flex: none;
}
.v2-parent-stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; margin: 20px 0; }
.v2-parent-sec { padding: 18px 0; border-top: 1px solid var(--v2-line); }
.v2-parent-sec h2 {
  font-size: 12px;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--v2-cyan-hover, #67E8F9);
  margin-bottom: 10px;
}
.v2-parent-list { list-style: none; display: flex; flex-direction: column; gap: 10px; }
.v2-parent-list li { display: flex; gap: 10px; align-items: flex-start; font-size: 13.5px; color: var(--v2-text-soft, #CBD5E1); }
.v2-parent-list li > span { flex: none; }
.v2-parent-list small { display: block; font-size: 10.5px; color: var(--v2-muted); margin-top: 2px; }
.v2-parent-deltas { display: flex; flex-wrap: wrap; gap: 7px; }
.v2-delta {
  font-size: 12px;
  padding: 4px 10px;
  border-radius: 999px;
  background: rgba(148, 163, 184, .1);
  color: var(--v2-text-soft, #CBD5E1);
}
.v2-delta.up { background: rgba(52, 211, 153, .12); color: var(--v2-green-soft, #6EE7B7); }
.v2-delta.down { background: rgba(251, 113, 133, .12); color: var(--v2-red-soft, #FDA4AF); }
.v2-parent-diff {
  padding: 14px 16px;
  border-radius: 10px;
  border: 1px solid rgba(245, 158, 11, .25);
  background: rgba(245, 158, 11, .06);
  margin-top: 16px;
}
.v2-parent-diff h2 { color: var(--v2-amber-soft, #FCD34D); }
.v2-parent-diff b { display: block; font-size: 15px; margin-bottom: 4px; }
.v2-parent-diff p { font-size: 13px; color: var(--v2-text-soft, #CBD5E1); line-height: 1.75; }
.v2-parent-report-foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding-top: 16px;
  border-top: 1px solid var(--v2-line);
  font-size: 10.5px;
  color: var(--v2-dim);
  flex-wrap: wrap;
}

/* ---------------- 播放器状态增强（数组命中 / 柱状状态 / BFS 网格 / 栈输入串） ---------------- */
.v2-cell.found {
  background: rgba(52, 211, 153, .2);
  border-color: rgba(52, 211, 153, .8);
  color: var(--v2-green-soft, #6EE7B7);
  box-shadow: 0 0 0 3px rgba(52, 211, 153, .12);
}
.v2-bar-rect.compare { background: linear-gradient(180deg, #67E8F9, #0891B2); box-shadow: 0 0 16px rgba(34, 211, 238, .28); }
.v2-bar-rect.swap { background: linear-gradient(180deg, #FDE68A, #F59E0B); box-shadow: 0 0 16px rgba(245, 158, 11, .3); }
.v2-bar-rect.done,
.v2-bar-rect.sorted { background: linear-gradient(180deg, #6EE7B7, #059669); }
.v2-bar-rect.pivot { background: linear-gradient(180deg, #C4B5FD, #8B5CF6); box-shadow: 0 0 16px rgba(167, 139, 250, .3); }
.v2-viz-note {
  margin-top: 10px;
  text-align: center;
  font-size: 12px;
  color: var(--v2-muted);
  line-height: 1.6;
}
.v2-stack-source {
  display: flex;
  gap: 3px;
  justify-content: center;
  flex-wrap: wrap;
  margin: 10px 0 4px;
  font-family: var(--v2-mono);
}
.v2-stack-source span {
  width: 25px;
  height: 29px;
  display: grid;
  place-items: center;
  border-radius: 5px;
  border: 1px solid var(--v2-line);
  background: rgba(148, 163, 184, .06);
  color: var(--v2-muted);
  font-size: 13px;
}
.v2-stack-source span.on {
  background: rgba(245, 158, 11, .9);
  border-color: var(--v2-amber, #F59E0B);
  color: #1C1200;
  font-weight: 700;
}
.v2-grid-table td { position: relative; }
.v2-grid-main { display: block; line-height: 1; }
.v2-grid-dist {
  position: absolute;
  right: 3px;
  bottom: 1px;
  font-size: 8.5px;
  line-height: 1;
  color: var(--v2-cyan-hover, #67E8F9);
  opacity: .85;
}
.v2-grid-table th {
  max-width: 96px;
  white-space: normal;
  line-height: 1.25;
  overflow-wrap: anywhere;
}
.v2-grid-table td.empty { color: var(--v2-grid-empty-fg, rgba(148, 163, 184, .28)); }
.v2-grid-table td.wall {
  background: rgba(2, 8, 20, .8);
  color: #475569;
  border-color: rgba(148, 163, 184, .08);
}
.v2-grid-table td.path { box-shadow: inset 0 0 0 1px rgba(52, 211, 153, .4); }
.v2-grid-table td.queued { background: rgba(245, 158, 11, .12); }
.v2-grid-table td.cur { outline: 2px solid rgba(34, 211, 238, .7); outline-offset: -3px; }
.v2-grid-table td.start { color: var(--v2-green-soft, #6EE7B7); font-weight: 700; }
.v2-grid-table td.end { color: var(--v2-amber-soft, #FCD34D); font-weight: 700; }
.v2-grid-table td.hl { color: var(--v2-cyan-soft, #A5F3FC); }

/* ---------------- 链接型卡片/按钮的颜色修正 ----------------
   .v2 a 的优先级高于组件类，这里显式覆盖，保持深色卡片里的正文色。 */
.v2 a.v2-task,
.v2 a.v2-entry,
.v2 a.v2-scene-card,
.v2 a.v2-level-card,
.v2 a.v2-track-main,
.v2 a.v2-class-card,
.v2 a.v2-contest,
.v2 a.v2-problem,
.v2 a.v2-scene-cta { color: var(--v2-text); }
.v2 a.v2-task:hover,
.v2 a.v2-entry:hover,
.v2 a.v2-scene-card:hover,
.v2 a.v2-level-card:hover,
.v2 a.v2-track-main:hover,
.v2 a.v2-class-card:hover,
.v2 a.v2-contest:hover,
.v2 a.v2-problem:hover,
.v2 a.v2-scene-cta:hover { color: var(--v2-text); }

.v2 a.v2-btn { color: #04121C; }
.v2 a.v2-btn.ghost { color: var(--v2-text-soft, #CBD5E1); }
.v2 a.v2-btn.amber { color: #1C1200; }
.v2 a.v2-btn.violet { color: #150B2E; }
.v2 a.v2-btn.danger { color: var(--v2-red-soft, #FDA4AF); }
.v2 a.v2-btn:hover { color: #04121C; }
.v2 a.v2-btn.ghost:hover { color: var(--v2-text-bright, #E6EDF7); }
.v2 a.v2-btn.amber:hover { color: #1C1200; }
.v2 a.v2-btn.violet:hover { color: #150B2E; }
.v2 a.v2-btn.danger:hover { color: var(--v2-red-soft, #FDA4AF); }

/* ---------------- 响应式 ---------------- */
@media (max-width: 1080px) {
  .v2-grid--4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .v2-badges { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

@media (max-width: 940px) {
  .v2-grid--3 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .v2-grid--sidebar { grid-template-columns: minmax(0, 1fr); }
  .v2-stage { grid-template-columns: minmax(0, 1fr); }
  .v2-viz { min-height: 280px; }
  .v2-dojo-grid { grid-template-columns: minmax(0, 1fr); }
  .v2-editor { min-height: 320px; }
  .v2-scene-grid, .v2-level-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .v2-entries { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .v2-entry { padding: 16px; }
  .v2-track-grid { grid-template-columns: minmax(0, 1fr); }
  .v2-passport { padding: 26px 24px; }
  .v2-passport-grid { grid-template-columns: minmax(0, 1fr); gap: 20px; }
  .v2-parent-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (max-width: 720px) {
  .v2 { font-size: 13.5px; }
  .v2-head h1, .v2-theater-copy h1 { font-size: 23px; }
  .v2-hero { padding: 20px; }
  .v2-hero h1 { font-size: 24px; }
  .v2-orbit { display: none; }
  .v2-grid--2, .v2-grid--3, .v2-grid--4 { grid-template-columns: minmax(0, 1fr); }
  .v2-skel-grid { grid-template-columns: minmax(0, 1fr); }
  .v2-scene-grid, .v2-level-grid { grid-template-columns: minmax(0, 1fr); }
  .v2-entries { grid-template-columns: minmax(0, 1fr); }
  .v2-badges { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .v2-form-grid { grid-template-columns: minmax(0, 1fr); }
  .v2-form--inline { flex-direction: column; }
  .v2-controls { gap: 8px; padding: 10px; }
  .v2-controls .v2-btn { padding: 6px 10px; font-size: 12px; }
  .v2-seek-wrap { order: 5; flex-basis: 100%; }
  .v2-step { min-width: 44px; }
  .v2-bars { height: 210px; gap: 6px; }
  .v2-viz { padding: 12px; min-height: 240px; }
  .v2-array { gap: 5px; }
  .v2-cell { min-width: 40px; height: 44px; font-size: 12.5px; }
  .v2-idx { font-size: 9px; }
  .v2-ptr em { font-size: 8px; padding: 0 3px; }
  .v2-result { flex-direction: column; gap: 10px; }
  .v2-result-icon { font-size: 28px; }
  .v2-problem-list { grid-template-columns: minmax(0, 1fr); }
  .v2-heat-row { grid-template-columns: 88px minmax(0, 1fr) 42px; }
  .v2-class-grid { grid-template-columns: minmax(0, 1fr); }
  .v2-passport { padding: 20px 16px; border-radius: 12px; }
  .v2-passport-who h1 { font-size: 22px; }
  .v2-passport-elo { margin-left: 0; text-align: left; }
  .v2-passport-stats { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .v2-passport-stats .v2-stat { padding: 10px 8px; }
  .v2-passport-stats .v2-stat > strong { font-size: 18px; }
  .v2-parent-card { padding: 20px 16px; }
  .v2-parent-wrap { padding: 18px 12px 40px; }
  .v2-share-row { grid-template-columns: 52px minmax(0, 1fr); }
  .v2-share-row > button { grid-column: 2; }
  .v2-tabs { width: 100%; }

  /* 表格转卡片 */
  .v2-table thead { display: none; }
  .v2-table, .v2-table tbody, .v2-table tr, .v2-table td { display: block; width: 100%; }
  .v2-table tr {
    border: 1px solid var(--v2-line);
    border-radius: 10px;
    padding: 8px 12px;
    margin-bottom: 8px;
    background: var(--v2-ink, rgba(2, 8, 20, .25));
  }
  .v2-table td {
    border: none;
    padding: 5px 0;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    text-align: right;
  }
  .v2-table td::before {
    content: attr(data-label);
    flex: none;
    color: var(--v2-muted);
    font-size: 11.5px;
    text-align: left;
  }
  body.v2-mode .topbar { padding: 8px 12px; gap: 8px; flex-wrap: wrap; }
  body.v2-mode .brand { order: 1; }
  body.v2-mode .userbox { order: 2; margin-left: auto; }
  body.v2-mode .nav {
    order: 3; flex: 0 0 100%; width: 100%;
    overflow-x: auto; padding: 4px 0 2px; gap: 4px;
    -webkit-overflow-scrolling: touch;
  }
  body.v2-mode .nav a {
    flex: 0 0 auto; white-space: nowrap;
    font-size: 13px; padding: 6px 10px;
  }
  body.v2-mode .brand-badge { display: none; }
  body.v2-mode .userbox .who b { display: none; }
  body.v2-mode .userbox .role-tag { display: none; }
}

@media (prefers-reduced-motion: reduce) {
  .v2 *, .v2 *::before, .v2 *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
  }
}

/* ---------------- 打印 ---------------- */
@media print {
  html { background: #fff !important; }
  body, body.v2-mode, body.v2-parent { background: #fff !important; color: #111 !important; }
  .topbar, #toast-wrap, .v2-noprint { display: none !important; }
  .view { max-width: none !important; padding: 0 !important; margin: 0 !important; }
  .v2 { color: #111 !important; font-size: 12px; }
  .v2-passport-bar { display: none !important; }
  .v2-passport {
    max-width: none;
    border: 1px solid #d8dee9;
    border-radius: 0;
    background: #fff !important;
    box-shadow: none;
    padding: 10mm 12mm;
    color: #111 !important;
    page-break-inside: avoid;
  }
  /* 打印宽度约 794px，会命中 940px 的“单列”断点；护照需要强制双列才装得下一页 */
  .v2-passport-grid {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) !important;
    gap: 10mm !important;
    margin-bottom: 6mm !important;
  }
  .v2-passport-stats { margin-bottom: 6mm !important; }
  .v2-passport-badges { margin-bottom: 6mm !important; }
  .v2-passport-who { padding: 12px 0 10px !important; }
  .v2-passport-avatar { width: 58px !important; height: 58px !important; font-size: 30px !important; }
  .v2-passport-who h1 { font-size: 24px !important; }
  .v2-passport .v2-radar { max-width: 240px; }
  .v2-passport .v2-timeline li { padding-bottom: 10px; }
  .v2-passport-badge-row { gap: 6px; }
  .v2-passport-badge { padding: 3px 9px; font-size: 11px; }
  .v2-passport-foot { padding-top: 8px; }
  .v2-passport h1, .v2-passport h2, .v2-passport b,
  .v2-passport .v2-tl-body b, .v2-passport-brand { color: #111 !important; }
  .v2-passport .v2-muted, .v2-passport p, .v2-passport-date,
  .v2-passport .v2-tl-body p, .v2-passport-foot { color: #475569 !important; }
  .v2-passport .v2-stat {
    background: #f8fafc !important;
    border-color: #e2e8f0 !important;
    color: #111 !important;
  }
  .v2-passport .v2-stat > span, .v2-passport .v2-stat > small { color: #64748b !important; }
  .v2-passport .v2-stat > strong { color: #0f172a !important; }
  .v2-passport-head, .v2-passport-foot, .v2-passport-grid h2,
  .v2-passport-badges h2, .v2-parent-sec, .v2-parent-report-head { border-color: #e2e8f0 !important; }
  .v2-passport-grid h2, .v2-passport-badges h2 { color: #64748b !important; }
  .v2-radar-ring, .v2-radar-axis { stroke: #cbd5e1 !important; }
  .v2-radar-area { fill: rgba(14, 165, 233, .12) !important; }
  .v2-radar-poly { stroke: #0284C7 !important; }
  .v2-radar-dot { fill: #0284C7 !important; stroke: #fff !important; }
  .v2-radar-label { fill: #334155 !important; }
  .v2-radar-score { fill: #64748b !important; }
  .v2-passport-elo strong { color: #b45309 !important; }
  .v2-passport-brand span { color: #b45309 !important; }
  .v2-passport-badge { background: #f8fafc !important; border-color: #e2e8f0 !important; }
  .v2-passport-badge i { color: #b45309; }

  .v2-parent-wrap { max-width: none; padding: 0; }
  .v2-parent-card {
    background: #fff !important;
    border: 1px solid #e2e8f0 !important;
    box-shadow: none;
    color: #111 !important;
    padding: 12mm;
  }
  .v2-parent-card h1, .v2-parent-card h2, .v2-parent-card b { color: #111 !important; }
  .v2-parent-card p, .v2-parent-list li, .v2-parent-diff p { color: #334155 !important; }
  .v2-parent-brand { color: #64748b !important; }
  .v2-parent-stats .v2-stat { background: #f8fafc !important; border-color: #e2e8f0 !important; }
  .v2-parent-stats .v2-stat > strong { color: #0f172a !important; }
  .v2-parent-stats .v2-stat > span { color: #64748b !important; }
  .v2-parent-diff { background: #fffbeb !important; border-color: #fcd34d !important; }
  .v2-parent-report-foot { border-color: #e2e8f0 !important; }
}

/* ===== 执行回放 ===== */
.v2-trace-grid { display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(0, .75fr); gap: 16px; }
.v2-trace-code {
  max-height: 520px; overflow: auto; border-radius: 10px;
  border: 1px solid rgba(148, 163, 184, .18); background: var(--v2-trace-bg, #080d17);
  color: var(--v2-trace-fg, var(--v2-text));
  padding: 8px 0; font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
  font-size: 13px; line-height: 1.65;
}
.v2-trace-line { display: flex; gap: 12px; padding: 1px 12px; white-space: pre; }
.v2-trace-line .v2-ln { color: #475569; min-width: 2.5em; text-align: right; user-select: none; }
.v2-trace-line.hl { background: rgba(34, 211, 238, .14); box-shadow: inset 3px 0 0 #22d3ee; }
.v2-trace-input { margin-top: 12px; }
.v2-trace-input pre {
  margin: 6px 0 0; padding: 10px 12px; border-radius: 8px; overflow: auto;
  background: var(--v2-trace-input-bg, rgba(15, 23, 42, .7)); border: 1px solid rgba(148, 163, 184, .14);
  color: var(--v2-trace-input-fg, #cbd5e1); font-size: 12px; white-space: pre-wrap;
}
.v2-trace-vars { min-height: 220px; }
.v2-trace-meta { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-bottom: 10px; }
.v2-var-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.v2-var-table th, .v2-var-table td {
  text-align: left; padding: 7px 9px; border-bottom: 1px solid rgba(148, 163, 184, .12);
  vertical-align: top;
}
.v2-var-table th { color: var(--v2-muted, #94A3B8); font-weight: 500; font-size: 12px; }
.v2-var-table code { color: var(--v2-text-soft, #CBD5E1); word-break: break-all; }
.v2-trace-controls { display: flex; gap: 12px; align-items: center; }
@media (max-width: 820px) {
  .v2-trace-grid { grid-template-columns: 1fr; }
  .v2-trace-controls { flex-wrap: wrap; }
  .v2-feyn-grid { grid-template-columns: 1fr; }
  .v2-feyn-result-top { flex-direction: column; align-items: flex-start; gap: 8px; }
}

/* 家长周报打印：压到一页 A4 */
@media print {
  .v2-parent-wrap { padding: 0 !important; }
  .v2-parent-brand { margin-bottom: 8px !important; }
  .v2-parent-card { padding: 9mm 10mm !important; }
  .v2-parent-report-head { padding-bottom: 8px !important; }
  .v2-parent-stats {
    grid-template-columns: repeat(4, minmax(0, 1fr)) !important;
    gap: 6px !important;
    margin: 10px 0 !important;
  }
  .v2-parent-stats .v2-stat { padding: 8px 9px !important; }
  .v2-parent-sec { padding: 9px 0 !important; }
  .v2-parent-sec h2 { margin-bottom: 6px !important; }
  .v2-parent-list { gap: 5px !important; }
  .v2-parent-list li { font-size: 12.5px !important; }
  .v2-parent-diff { margin-top: 6px !important; padding: 9px 11px !important; }
  .v2-parent-report-foot { padding-top: 8px !important; }
}

/* ============================================================
   #/pricing 套餐页（To C 订阅 + To B 席位）
   ============================================================ */
.v2-pricing-wrap { display: flex; flex-direction: column; gap: 18px; }
.v2-pricing-status {
  display: flex; align-items: center; justify-content: space-between;
  gap: 16px; flex-wrap: wrap;
  padding: 18px 20px; border-radius: 14px;
  border: 1px solid var(--v2-line);
  background: linear-gradient(135deg, rgba(15, 23, 42, .6), rgba(2, 6, 23, .4));
}
.v2-pricing-status.pro {
  border-color: rgba(251, 191, 36, .35);
  background: linear-gradient(135deg, rgba(251, 191, 36, .10), rgba(245, 158, 11, .04));
}
.v2-pricing-status h2 { margin: 0 0 4px; font-size: 19px; }
.v2-pricing-status p { margin: 0; }
.v2-pricing-status-r { display: flex; flex-direction: column; align-items: flex-end; gap: 6px; }
.v2-pricing-grid {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 16px; align-items: stretch;
}
.v2-pricing-card {
  border: 1px solid var(--v2-line); border-radius: 14px; padding: 20px;
  background: rgba(15, 23, 42, .35);
  display: flex; flex-direction: column; gap: 12px;
}
.v2-pricing-card.dim { opacity: .72; }
.v2-pricing-card.cur {
  border-color: rgba(251, 191, 36, .45);
  box-shadow: 0 0 0 1px rgba(251, 191, 36, .18), 0 8px 30px rgba(251, 191, 36, .06);
}
.v2-pricing-card-h { display: flex; align-items: center; justify-content: space-between; }
.v2-pricing-card-h h3 { margin: 0; font-size: 17px; }
.v2-pricing-price { font-size: 34px; font-weight: 700; line-height: 1; }
.v2-pricing-price small { font-size: 14px; font-weight: 400; opacity: .7; margin-left: 4px; }
.v2-pricing-feats { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 9px; }
.v2-pricing-feats li { position: relative; padding-left: 22px; font-size: 14px; line-height: 1.55; }
.v2-pricing-feats li::before {
  content: '✓'; position: absolute; left: 0; top: 0;
  color: var(--v2-cyan); font-weight: 700;
}
.v2-pricing-card-cta { margin-top: auto; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.v2-pricing-org { border-color: rgba(167, 139, 250, .35); }
@media (max-width: 720px) {
  .v2-pricing-grid { grid-template-columns: minmax(0, 1fr); }
  .v2-pricing-status-r { align-items: stretch; width: 100%; }
  .v2-pricing-status-r .v2-btn { justify-content: center; }
}
