/* ============================================================
   舰桥首页（bridge-home）
   整页一套暗色 HUD 仪表盘体系。每张卡片形状不同（切角 / 六边形 /
   斜切 / 凹口），装饰也不同（刻度尺 / 准星 / 扫描光条 / 数据条），
   不再是一个模子刻出来的方块。
   骨子是严格 grid；卡片形态、角标、坐标尺全是装饰层。
   ============================================================ */

.bh-page {
  /* 色板（2026-10-19 提亮一档：欢哥「整体有点暗，费视力」）
     原则：底色只提一点点（保住暗色气质），文字与卡片底提得多一些，
     让「字/背景」的对比拉开，而不是把整页洗灰。 */
  --bh-bg: #0C1219;
  --bh-bg2: #121A28;
  --bh-line: #38D9FF;
  --bh-line-dim: rgba(56, 217, 255, 0.35);
  --bh-ink: #DDEAF5;
  --bh-dim: #95AEBF;
  --bh-green: #2FBF9B;
  --bh-green-deep: #7FD4BC;
  --bh-green-line: rgba(47, 191, 155, 0.32);
  --bh-card-bg: rgba(19, 27, 41, 0.92);
  --bh-card-ink: #EAF4FC;
  --bh-card-dim: #B6C9D8;
  --bh-card-line: rgba(56, 217, 255, 0.24);
  --bh-card-link: #38D9FF;
  /* 琥珀（2026-10-19 欢哥问「要不要加点金黄」）：全站只给**时间**用。
     青=结构/链接、绿=在线/正常、金=时间/当前，三色各管一件事；
     金一旦铺开（按钮、链接、正文）就成花屏，所以上限锁在四处：
     时钟、本周读数、日期印章、本期主打标签。 */
  --bh-gold: #F0B429;
  --bh-gold-dim: rgba(240, 180, 41, 0.72);
  --bh-gold-line: rgba(240, 180, 41, 0.32);
  --bh-arc-bg: #0C1219;
  --bh-arc-ink: #DDEAF5;
  --bh-arc-dim: #9AAAB8;
  --bh-arc-line: rgba(56, 217, 255, 0.14);
  --bh-mono: "Cascadia Code", "Cascadia Mono", ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", monospace;
  padding-top: 0; /* 页头已散点化，不再占文档流 */
}

/* ============ 舰桥态 ============ */
.bh-bridge {
  position: relative;
  height: 100vh;
  /* 下限从 760 收到 680：760 是当年网格还是固定行高时留的保险，现在
     .bh-deck 的卡片是 fr 行，实测 680 时内容仍完整（1440×680 下最低一张卡
     底边 638）。留着 760 的后果是 1440×720 的笔记本上**首屏比视口高 40px**，
     滚一下会露出首屏尾巴，"首页正好两屏"就破了 —— 2.09 屏。 */
  min-height: 680px;
  overflow: hidden;
  background:
    radial-gradient(1000px 700px at 57% 48%, rgba(56, 217, 255, 0.085), transparent 62%),
    radial-gradient(1200px 620px at 82% 12%, rgba(56, 217, 255, 0.05), transparent 64%),
    radial-gradient(900px 520px at 14% 86%, rgba(47, 191, 155, 0.05), transparent 62%),
    radial-gradient(circle at 50% 50%, #0F1622 0%, #0A0F18 55%, #06090F 100%);
  color: var(--bh-ink);
}
/* 背景网格：中心清晰、向外渐隐 —— 不渐隐就是一张平铺壁纸，渐隐才有球面纵深 */
.bh-bridge::before {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  background:
    linear-gradient(rgba(56, 217, 255, 0.032) 1px, transparent 1px),
    linear-gradient(90deg, rgba(56, 217, 255, 0.032) 1px, transparent 1px);
  background-size: 48px 48px;
  -webkit-mask: radial-gradient(ellipse 78% 88% at 57% 48%, #000 0%, rgba(0, 0, 0, 0.5) 48%, transparent 88%);
  mask: radial-gradient(ellipse 78% 88% at 57% 48%, #000 0%, rgba(0, 0, 0, 0.5) 48%, transparent 88%);
}
.bh-bridge::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  height: 2px;
  background: linear-gradient(90deg, transparent, var(--bh-line), transparent);
  opacity: 0.6;
}

/* ---- 四角舷窗（页头品牌职能已并入左上） ---- */
.bh-porthole {
  position: absolute;
  z-index: 6;
  font-family: var(--bh-mono);
  font-size: 12.5px;
}
.bh-ph-tl { top: 24px; left: 24px; }
/* 右上角是与 bridge-chrome.css 里那条状态条拼在一起的：
   宽 202 固定、高 34、单行（读数在左、时钟在右），右边紧接「账户 / 搜索」两格。
   以前它是个两行的独立小面板，和上面两个图标按钮各排各的，所以显得散。 */
.bh-ph-tr {
  top: 24px;
  right: 24px;
  width: 202px;
  box-sizing: border-box;
  text-align: right;
}
/* 左下角：系统读数（BUILD / POSTS / SIGNAL）。
   1.7.7 从右下挪过来 —— 右下角那个位置留给「02 档案室」切屏入口，
   两块一左一右夹住底部的坐标横尺，底边才成立。
   行高压到 1.5、字号 10px：甲板底部只剩 90 来像素，三行读数按原来的
   行高会顶到周报卡的下边框上（1440×900 实测只差 4px，矮视口直接压上去）。 */
.bh-ph-br {
  bottom: 12px;
  left: 24px;
  width: 168px;
  box-sizing: border-box;
  text-align: left;
}
.bh-ph-br .bh-ph-box { padding: 8px 12px; box-sizing: border-box; }
.bh-ph-box {
  position: relative;
  background: rgba(14, 20, 32, 0.82);
  border: 1px solid var(--bh-line-dim);
  padding: 10px 14px;
  backdrop-filter: blur(6px);
}
.bh-ph-tl .bh-porthole-brand-anchor { display: block; }
.bh-ph-tl .bh-brand {
  display: block;
  font-size: 15px;
  font-weight: 600;
  color: #EAF6FF;
  letter-spacing: 0.06em;
}
.bh-ph-tl .bh-brand b { color: var(--bh-line); font-weight: 600; }
.bh-ph-tl .bh-brand:hover b { text-shadow: 0 0 10px rgba(56, 217, 255, 0.8); }
.bh-ph-tl .bh-tagline { font-size: 11.5px; color: var(--bh-dim); margin-top: 3px; max-width: 260px; }
.bh-ph-tr .bh-ph-box {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 10px;
  height: 34px;
  padding: 0 12px;
  box-sizing: border-box;
  background: rgba(10, 15, 24, 0.86);
}
.bh-ph-tr .bh-row {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  color: var(--bh-dim);
  font-size: 10.5px;
  letter-spacing: 0.16em;
  white-space: nowrap;
}
.bh-ph-tr .bh-clock {
  margin: 0;
  font-size: 13px;
  letter-spacing: 0.08em;
  /* 时间用琥珀：这一块是首屏唯一的"活"读数，冷底上有个暖点才不闷 */
  color: var(--bh-gold);
  text-shadow: 0 0 14px rgba(240, 180, 41, 0.22);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.bh-live {
  display: inline-block;
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--bh-green);
  margin-right: 6px;
  animation: bh-pulse 2s infinite;
}
@keyframes bh-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.25; } }
.bh-ph-br .bh-row { color: var(--bh-dim); font-size: 11px; line-height: 1.5; }
.bh-ph-br .bh-row b { color: var(--bh-ink); font-weight: 400; }

/* ---- 中央全息孔：网格中间那一格（第 4-6 行 × 第 6-8 列） ---- */
/* ============================================================
   全息层（bh-halo）
   它不是"中间放一个雷达图标"，而是一整套同心环铺满整个甲板：
   最外圈刻度齿、虚线中环、两条错角的轨道弧、扫描扇、准星、光点。
   z-index 压在卡片之下，mix-blend-mode:screen 只做加法发光；
   卡片本身是半透明的，环会从卡片底下穿过去 —— 这才是全息投影。
   ============================================================ */
.bh-halo {
  position: absolute;
  inset: 0;
  z-index: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  pointer-events: none;
  overflow: hidden;
}

/* 放射层：从核心向外 24 条极细光线，铺满整个视口。
   它压在卡片底下，被卡片挡住的部分自然断开 ——
   于是画面读起来是「线从卡片下面穿过去」，这是全息投影的层次来源。 */
.bh-halo::before {
  content: "";
  position: absolute;
  left: 57%;
  top: 50%;
  width: 170vmax;
  height: 170vmax;
  transform: translate(-50%, -50%);
  border-radius: 50%;
  background: repeating-conic-gradient(
    from 0deg,
    rgba(56, 217, 255, 0.1) 0deg 0.14deg,
    transparent 0.14deg 15deg
  );
  -webkit-mask: radial-gradient(circle, transparent 0 6%, #000 11%, rgba(0, 0, 0, 0.55) 42%, transparent 70%);
  mask: radial-gradient(circle, transparent 0 6%, #000 11%, rgba(0, 0, 0, 0.55) 42%, transparent 70%);
}
/* 同心背景环：比锚体更大的几道圈，只在中心外圈露一点，给画面兜底 */
.bh-halo::after {
  content: "";
  position: absolute;
  left: 57%;
  top: 50%;
  width: 118vmax;
  height: 118vmax;
  transform: translate(-50%, -50%);
  border-radius: 50%;
  background: repeating-radial-gradient(
    circle,
    transparent 0 96px,
    rgba(56, 217, 255, 0.055) 96px 97px,
    transparent 97px 192px
  );
  -webkit-mask: radial-gradient(circle, transparent 0 16%, #000 34%, rgba(0, 0, 0, 0.4) 58%, transparent 82%);
  mask: radial-gradient(circle, transparent 0 16%, #000 34%, rgba(0, 0, 0, 0.4) 58%, transparent 82%);
}

.bh-anchor {
  position: relative;
  width: min(84vh, 90vmin);
  aspect-ratio: 1 / 1;
  flex: 0 0 auto;
  pointer-events: none;
  mix-blend-mode: screen;
  opacity: 0.52;
  /* 环心往左挪到「频道卡下方、两张下排卡之间」的空当上，
     否则核心正好被卡片压住，整页就只剩几段莫名其妙的弧 */
  left: -4%;
  top: 7%;
}
/* ---- 环系：由外到内 6 层，比例跟锚体走（百分比），换视口不会散架 ---- */
/* 方框锁定：把全息核心框成一个"读数窗"，中间那格空当才有落点。
   用方框而不是圆框 —— 整页都是方的，这里也不破例。 */
.bh-anchor::after {
  content: "";
  position: absolute;
  left: 50%;
  top: 50%;
  width: 148px;
  height: 148px;
  transform: translate(-50%, -50%);
  pointer-events: none;
  --c: rgba(56, 217, 255, 0.72);
  --l: 16px;
  background:
    linear-gradient(var(--c), var(--c)) 0 0 / var(--l) 1px no-repeat,
    linear-gradient(var(--c), var(--c)) 0 0 / 1px var(--l) no-repeat,
    linear-gradient(var(--c), var(--c)) 100% 0 / var(--l) 1px no-repeat,
    linear-gradient(var(--c), var(--c)) 100% 0 / 1px var(--l) no-repeat,
    linear-gradient(var(--c), var(--c)) 0 100% / var(--l) 1px no-repeat,
    linear-gradient(var(--c), var(--c)) 0 100% / 1px var(--l) no-repeat,
    linear-gradient(var(--c), var(--c)) 100% 100% / var(--l) 1px no-repeat,
    linear-gradient(var(--c), var(--c)) 100% 100% / 1px var(--l) no-repeat,
    /* 四条边只留中段一小截，形成"断续的锁定框" */
    linear-gradient(90deg, transparent 40%, rgba(56, 217, 255, 0.46) 40%, rgba(56, 217, 255, 0.46) 60%, transparent 60%) 0 0 / 100% 1px no-repeat,
    linear-gradient(90deg, transparent 40%, rgba(56, 217, 255, 0.46) 40%, rgba(56, 217, 255, 0.46) 60%, transparent 60%) 0 100% / 100% 1px no-repeat,
    linear-gradient(180deg, transparent 40%, rgba(56, 217, 255, 0.46) 40%, rgba(56, 217, 255, 0.46) 60%, transparent 60%) 0 0 / 1px 100% no-repeat,
    linear-gradient(180deg, transparent 40%, rgba(56, 217, 255, 0.46) 40%, rgba(56, 217, 255, 0.46) 60%, transparent 60%) 100% 0 / 1px 100% no-repeat;
}
/* 八向辐射分割线：从核心射到外环，把圆切成扇区 —— 少了这个，它只是个圈 */
.bh-anchor::before {
  content: "";
  position: absolute;
  inset: 5%;
  border-radius: 50%;
  background: repeating-conic-gradient(
    from 0deg,
    rgba(56, 217, 255, 0.15) 0deg 0.2deg,
    transparent 0.2deg 45deg
  );
  -webkit-mask: radial-gradient(circle, transparent 0 14%, #000 14.4% 95.6%, transparent 96%);
  mask: radial-gradient(circle, transparent 0 14%, #000 14.4% 95.6%, transparent 96%);
}
.bh-ring-scale,
.bh-ring-tier,
.bh-ring, .bh-ring2, .bh-ring3,
.bh-orbit { position: absolute; border-radius: 50%; }

/* 最外圈：90 根刻度齿，用 conic 渐变画 + radial mask 只留最外一条 */
.bh-ring-scale {
  inset: -1.5%;
  background: repeating-conic-gradient(
    from 0deg,
    rgba(56, 217, 255, 0.8) 0deg 0.24deg,
    transparent 0.24deg 2.2deg
  );
  -webkit-mask: radial-gradient(circle, transparent 0 96.2%, #000 96.6% 99.1%, transparent 99.5%);
  mask: radial-gradient(circle, transparent 0 96.2%, #000 96.6% 99.1%, transparent 99.5%);
  animation: bh-spin-slow 120s linear infinite;
}
.bh-ring-tier { inset: 5.5%; border: 1px solid rgba(56, 217, 255, 0.36); }
.bh-ring { inset: 0; border: 1px solid rgba(56, 217, 255, 0.42); }
.bh-ring2 {
  inset: 17%;
  border: 1px dashed rgba(56, 217, 255, 0.28);
  animation: bh-spin-slow 160s linear infinite reverse;
}
.bh-ring3 { inset: 32%; border: 1px solid rgba(56, 217, 255, 0.24); }

/* 两条错角轨道弧：只亮一条边，转起来像在自转的环 */
.bh-orbit { border: 1px solid transparent; }
.bh-orbit.o1 {
  inset: 9.5%;
  border-top-color: rgba(56, 217, 255, 0.9);
  border-right-color: rgba(56, 217, 255, 0.3);
  animation: bh-spin-slow 46s linear infinite;
}
.bh-orbit.o2 {
  inset: 23%;
  border-bottom-color: rgba(47, 191, 155, 0.8);
  border-left-color: rgba(47, 191, 155, 0.24);
  animation: bh-spin-slow 32s linear infinite reverse;
}

.bh-sweep {
  position: absolute;
  inset: 0;
  border-radius: 50%;
  background: conic-gradient(from 0deg, rgba(56, 217, 255, 0.22), transparent 68deg, transparent 360deg);
  animation: bh-spin 12s linear infinite;
}
@keyframes bh-spin { to { transform: rotate(360deg); } }
@keyframes bh-spin-slow { to { transform: rotate(360deg); } }
.bh-cross-h, .bh-cross-v { position: absolute; background: rgba(56, 217, 255, 0.16); }
.bh-cross-h { left: 2%; right: 2%; top: 50%; height: 1px; }
.bh-cross-v { top: 2%; bottom: 2%; left: 50%; width: 1px; }
/* 核心：实心点 + 一圈呼吸光环 */
.bh-core {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  width: 14px;
  height: 14px;
  border-radius: 50%;
  background: var(--bh-line);
  box-shadow: 0 0 18px rgba(56, 217, 255, 0.95), 0 0 60px rgba(56, 217, 255, 0.45);
}
.bh-core::after {
  content: "";
  position: absolute;
  inset: -14px;
  border-radius: 50%;
  border: 1px solid rgba(56, 217, 255, 0.5);
  animation: bh-breathe 3.4s ease-in-out infinite;
}
/* 核心外一对反向旋转的短弧 —— 贾维斯那圈永远在转的东西 */
.bh-core::before {
  content: "";
  position: absolute;
  inset: -30px;
  border-radius: 50%;
  border: 1px solid transparent;
  border-top-color: rgba(56, 217, 255, 0.75);
  border-bottom-color: rgba(56, 217, 255, 0.45);
  animation: bh-spin 7s linear infinite;
}
@keyframes bh-breathe {
  0%, 100% { transform: scale(0.72); opacity: 0.9; }
  50% { transform: scale(1.35); opacity: 0.15; }
}
/* 读数标签贴在核心下方，不跟着环走 */
.bh-anchor-label {
  position: absolute;
  left: 50%;
  top: calc(50% + 30px);
  transform: translateX(-50%);
  font-family: var(--bh-mono);
  font-size: 11px;
  color: rgba(56, 217, 255, 0.72);
  white-space: nowrap;
  letter-spacing: 0.3em;
  padding: 3px 10px;
  background: rgba(8, 12, 19, 0.55);
  border-left: 1px solid rgba(56, 217, 255, 0.4);
  border-right: 1px solid rgba(56, 217, 255, 0.4);
}
.bh-blip {
  position: absolute;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--bh-green);
  box-shadow: 0 0 10px rgba(47, 191, 155, 0.9);
}
.bh-blip::after {
  content: "";
  position: absolute;
  inset: -6px;
  border-radius: 50%;
  border: 1px solid rgba(47, 191, 155, 0.45);
  animation: bh-breathe 3s ease-in-out infinite;
}
.bh-blip.b1 { left: 38%; top: 22%; animation: bh-pulse 3s infinite 0.4s; }
.bh-blip.b2 { left: 66%; top: 58%; animation: bh-pulse 3s infinite 1.2s; }
.bh-blip.b3 { left: 30%; top: 66%; animation: bh-pulse 3s infinite 2s; }

/* ---- 观察窗：4-6 行 × 6-8 列 ----
   这一格必须空着 —— 全息核心就在它中央，压一张卡片上去等于把核心埋了。
   但"空"也要有边界：左右各一道中间亮两头散的竖边，加一个顶标，
   读起来就是"这里是个窗口"，而不是"这块没填"。 */
.bh-void {
  grid-area: 4 / 6 / 6 / 9;
  position: relative;
  z-index: 2;
  pointer-events: none;
}
.bh-void__edge {
  position: absolute;
  top: 8%;
  bottom: 8%;
  width: 1px;
  background: linear-gradient(180deg, transparent, rgba(56, 217, 255, 0.26), transparent);
}
.bh-void__edge.l { left: 0; }
.bh-void__edge.r { right: 0; }

/* ---- 环绕卡片：非对称仪表盘网格 ----
   12 列 × 8 行，块的大小刻意拉开差距：
   ┌─────────────┬───────┬─────────┐
   │  主屏 5×5   │频道 3 │  雷达 4 │
   │             ├───┬───┤         │
   │             │ 孔 3  │         │
   ├──────┬──────┴───┴───┼─────────┤
   │ 周报 5             │ 工具 4  │
   └──────┴──────────────┴─────────┘
   中间那格是空的，专门留给全息雷达。 */
.bh-deck {
  position: relative;
  z-index: 3;
  box-sizing: border-box;
  height: 100%;
  max-width: 1240px;
  width: 100%;
  margin: 0 auto;
  /* 右边多留一条：右侧频道柱贴在视口右缘（right:26px 起），
     若不留这条，1280 这类视口下导航会压在雷达卡右边缘上。 */
  padding: 128px 194px 92px 32px;
  display: grid;
  gap: 26px;
  grid-template-columns: repeat(12, 1fr);
  grid-template-rows: repeat(8, 1fr);
}
.bh-deck > * {
  transition: transform 0.42s cubic-bezier(0.2, 0.9, 0.3, 1.2), filter 0.3s;
}

/* 坐标标尺：左边一道竖尺、底下一道横尺。
   两层齿（短齿 14px / 长齿 70px）+ 一条基线，画出来就是"仪表边框"，
   比再加几张卡片更能把画面从"几个方块"变成"一个界面"。 */
.bh-deck::before,
.bh-deck::after {
  content: "";
  position: absolute;
  z-index: 2;
  pointer-events: none;
}
.bh-deck::before {
  left: 14px;
  top: 96px;
  bottom: 76px;
  width: 10px;
  background:
    repeating-linear-gradient(180deg, rgba(56, 217, 255, 0.42) 0 1px, transparent 1px 14px) left top / 5px 100% no-repeat,
    repeating-linear-gradient(180deg, rgba(56, 217, 255, 0.72) 0 1px, transparent 1px 70px) left top / 10px 100% no-repeat,
    linear-gradient(180deg, rgba(56, 217, 255, 0.18), rgba(56, 217, 255, 0.18)) left top / 1px 100% no-repeat;
}
.bh-deck::after {
  left: 200px;   /* 让开左下角的读数舷窗（宽 168 + 外边距 24） */
  right: 200px;  /* 让开右下角的「02 档案室」面板 */
  bottom: 22px;
  height: 10px;
  background:
    repeating-linear-gradient(90deg, rgba(56, 217, 255, 0.38) 0 1px, transparent 1px 14px) left bottom / 100% 5px no-repeat,
    repeating-linear-gradient(90deg, rgba(56, 217, 255, 0.66) 0 1px, transparent 1px 70px) left bottom / 100% 10px no-repeat,
    linear-gradient(90deg, rgba(56, 217, 255, 0.16), rgba(56, 217, 255, 0.16)) left bottom / 100% 1px no-repeat;
}

/* ---- 切屏入口：右下角，造型与左下角读数舷窗完全同款 ----
   （同一套底色 / 边框 / 圆角 / backdrop blur / 内边距，只是内容换成了两个文本行）
   它既是"下面还有一屏"的指示，也是滚轮被接管之后的兜底入口。 */
.bh-scroll-hint {
  position: absolute;
  right: 24px;
  bottom: 12px;
  z-index: 6;
  width: 168px;
  box-sizing: border-box;
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  justify-content: center;
  gap: 3px;
  min-height: 63px; /* = 左下读数舷窗的高度（3 行 ×15 + 上下 8 + 边框 2），两块顶边齐平 */
  padding: 8px 12px;
  font-family: var(--bh-mono);
  text-align: right;
  color: var(--bh-dim);
  background: rgba(14, 20, 32, 0.82);
  border: 1px solid var(--bh-line-dim);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  cursor: pointer;
  transition: border-color 0.18s, background 0.18s, color 0.18s, box-shadow 0.18s;
}
.bh-scroll-hint:hover,
.bh-scroll-hint:focus-visible {
  color: var(--bh-ink);
  background: rgba(14, 20, 32, 0.96);
  border-color: var(--bh-line);
  box-shadow: 0 0 0 1px rgba(56, 217, 255, 0.14), 0 0 22px rgba(56, 217, 255, 0.16);
  outline: none;
}
.bh-scroll-hint__tag {
  font-size: 10.5px;
  letter-spacing: 0.16em;
  color: var(--bh-card-link);
  opacity: 0.85;
}
.bh-scroll-hint__tx {
  display: inline-flex;
  align-items: baseline;
  gap: 6px;
  font-size: 11.5px;
  letter-spacing: 0.06em;
  color: var(--bh-ink);
}
.bh-scroll-hint__tx b {
  font-weight: 400;
  color: var(--bh-line);
  animation: bh-hint-bob 1.9s ease-in-out infinite;
}
@keyframes bh-hint-bob {
  0%, 100% { transform: translateY(-1px); opacity: 0.5; }
  50% { transform: translateY(2px); opacity: 1; }
}

/* 通用卡身：**正正方方的矩形，没有闭合边框**。
   位置严格对齐网格（不旋转、不位移）——歪斜错位那套试过，出来的效果是"没对齐"
   而不是"刻意"，已经全部撤掉。
   冲击力靠另外两件事：一是去掉四边那圈完整边框，只留四角 L 括号 + 两条断开的半边线；
   二是卡片半透明，底下那层全息环从卡面里透出来。 */
.bh-card {
  position: relative;
  background:
    /* 顶部一层往下衰减的薄光，让区块有"被照亮的面"，而不是一块平玻璃 */
    linear-gradient(180deg, rgba(56, 217, 255, 0.09), transparent 46%),
    linear-gradient(160deg, rgba(17, 25, 39, 0.93), rgba(9, 13, 21, 0.88));
  color: var(--bh-card-ink);
  border: 0;
  overflow: hidden;
  backdrop-filter: blur(3px) saturate(1.1);
  -webkit-backdrop-filter: blur(3px) saturate(1.1);
  filter: drop-shadow(0 12px 30px rgba(0, 0, 0, 0.55));
  /* 1px 极淡的全边框（用 box-shadow 画，不占布局）：
     没有它，方正的矩形在深底上根本"看不出是方的"，只剩一团浮着的字。 */
  box-shadow:
    0 0 0 1px rgba(56, 217, 255, 0.18),
    inset 0 1px 0 rgba(56, 217, 255, 0.3),
    inset 0 0 90px rgba(56, 217, 255, 0.045);
}
/* 角标画在 ::after 上：::before 被各卡自己的装饰（刻度条/准星/扫描光）占着，
   放在 ::before 会被逐卡覆盖掉 —— 这就是"卡片边界感忽然没了"的原因。 */
.bh-card::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 5;
  pointer-events: none;
  --c: rgba(56, 217, 255, 0.85);
  --d: rgba(56, 217, 255, 0.3);
  --l: 26px;
  background:
    linear-gradient(var(--c), var(--c)) 0 0 / var(--l) 1px no-repeat,
    linear-gradient(var(--c), var(--c)) 0 0 / 1px var(--l) no-repeat,
    linear-gradient(var(--c), var(--c)) 100% 0 / var(--l) 1px no-repeat,
    linear-gradient(var(--c), var(--c)) 100% 0 / 1px var(--l) no-repeat,
    linear-gradient(var(--c), var(--c)) 0 100% / var(--l) 1px no-repeat,
    linear-gradient(var(--c), var(--c)) 0 100% / 1px var(--l) no-repeat,
    linear-gradient(var(--c), var(--c)) 100% 100% / var(--l) 1px no-repeat,
    linear-gradient(var(--c), var(--c)) 100% 100% / 1px var(--l) no-repeat,
    /* 上边左起 66% 渐隐、下边右起 42% 渐隐 —— 两条断开的半边线。
       有它们，区块边界一眼能认出来；断开，就不会退回成"卡片框"。 */
    linear-gradient(90deg, var(--d), transparent) 0 0 / 66% 1px no-repeat,
    linear-gradient(270deg, var(--d), transparent) 100% 100% / 42% 1px no-repeat,
    /* 左侧中段一道"脊" */
    linear-gradient(var(--d), transparent) 0 50% / 1px 38% no-repeat;
}
.bh-card:hover {
  transform: translateY(-5px);
  filter: drop-shadow(0 18px 46px rgba(0, 0, 0, 0.66));
  box-shadow:
    0 0 0 1px rgba(56, 217, 255, 0.46),
    inset 0 1px 0 rgba(56, 217, 255, 0.46),
    inset 0 0 110px rgba(56, 217, 255, 0.09);
  z-index: 10;
}
.bh-card:hover::after { --c: #6FE6FF; --d: rgba(56, 217, 255, 0.55); }

/* 各自的错位：不共享网格线，边缘刻意错开 —— 规整对齐本身就是"不科幻" */
.bh-card .bh-tag {
  display: block;
  font-family: var(--bh-mono);
  font-size: 11px;
  letter-spacing: 0.14em;
  color: var(--bh-card-link);
}
/* 本期主打那一张的标签单独走琥珀：一眼能分出手里这张是"这一期"的，
   而不是又一条频道名。 */
.bh-card-feat .bh-tag {
  /* 这行压在封面照片上，而这批照片偏亮（内存条是浅蓝），
     只给字加投影还是糊 —— 补一条「左实右虚」的暗衬，不破坏裸文字的轻盈感 */
  display: inline-block;
  margin-left: -8px;
  padding: 3px 34px 3px 8px;
  color: var(--bh-gold);
  background: linear-gradient(90deg, rgba(6, 10, 16, 0.88), rgba(6, 10, 16, 0));
  text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
}
.bh-card h3 { font-size: 16px; font-weight: 600; line-height: 1.45; margin: 8px 0 6px; color: var(--bh-card-ink); }
.bh-card p { font-size: 13px; color: var(--bh-card-dim); line-height: 1.6; }
.bh-card .bh-meta {
  font-family: var(--bh-mono);
  font-size: 11px;
  color: var(--bh-arc-dim);
  margin-top: 10px;
  display: flex;
  justify-content: space-between;
}

/* —— 主屏：封面铺满整块，文字压在左下角，底部一条刻度条 —— */
.bh-card-feat {
  grid-area: 1 / 1 / 6 / 6;
  position: relative;
  display: block;
  background: #0E1420;
}
/* 底部刻度条挂在 .bh-txt 上（卡片的 ::after 留给角标） */
.bh-card-feat .bh-txt::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: -26px;
  width: 42%;
  height: 5px;
  background: repeating-linear-gradient(90deg, rgba(56, 217, 255, 0.65) 0 2px, transparent 2px 7px);
  opacity: 0.8;
  pointer-events: none;
  z-index: 3;
}
.bh-card-feat .bh-txt {
  position: relative;
  z-index: 2;
  box-sizing: border-box;
  height: 100%;
  padding: 24px 26px 26px;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
}
.bh-card-feat h3 { font-size: 25px; line-height: 1.34; margin: 9px 0 8px; }
.bh-card-feat .bh-txt p {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
  font-size: 13px;
  line-height: 1.6;
  color: #A9BFCD;
  max-width: 34em;
}
.bh-card-feat .bh-cover {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  background: #0E1420;
}
/* 封面是 1200×630 的成图（左下角烤了标题），按右半幅取图：
   避开烤进图里的标题被横向裁成碎字形，只留照片 */
.bh-card-feat .bh-cover img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: right center;
  opacity: 0.95;
  /* 封面色调必须并进 HUD 的冷色里。
     一张原色照片放在全息界面中央，整个幻觉就破了 ——
     先去饱和、再 sepia + hue-rotate 拉成青蓝，明暗层次保留。 */
  filter: grayscale(0.72) sepia(0.32) hue-rotate(158deg) saturate(2.1) brightness(0.82) contrast(1.12);
}
/* 再叠一层青色，把暖色彻底压住（之前封面偏黄褐，和整体青调打架） */
.bh-card-feat .bh-cover::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0; /* 压在照片之上、暗角遮罩之下，否则会把遮罩的明度一起抬起来 */
  pointer-events: none;
  background: linear-gradient(158deg, rgba(56, 217, 255, 0.22), rgba(8, 12, 19, 0.4));
  mix-blend-mode: color;
}
/* 左下角压暗，保证压在照片上的标题可读，同时吃掉成图烤进去的字。
   底下那条横向暗带是 1.7.8 补的：封面成图（1200×630）右下角本来烤了一行
   「日期 · 域名」，卡片按右半幅取图之后那行字会留在卡底，跟卡脚这行读数叠在一起。
   与其把读数挪开，不如让成图的烤字沉进暗带里 —— 日期卡上角本来就有个日期戳。 */
.bh-card-feat .bh-cover::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background:
    linear-gradient(0deg, rgba(8, 12, 19, 0.97) 0%, rgba(8, 12, 19, 0.9) 8%, rgba(8, 12, 19, 0.5) 19%, transparent 38%),
    radial-gradient(ellipse 132% 104% at 0% 116%, rgba(8, 12, 19, 0.98) 0%, rgba(8, 12, 19, 0.92) 42%, transparent 82%),
    linear-gradient(180deg, rgba(8, 12, 19, 0.5) 0%, transparent 22%);
  pointer-events: none;
}
.bh-card-feat .bh-cover .bh-stamp {
  position: absolute;
  right: 14px;
  top: 14px;
  z-index: 2;
  font-family: var(--bh-mono);
  font-size: 11px;
  color: var(--bh-gold);
  background: rgba(11, 15, 23, 0.78);
  border: 1px solid var(--bh-gold-line);
  padding: 4px 8px;
  letter-spacing: 0.16em;
}
/* 主屏卡脚：左边「阅读全文」，紧跟一行读数（正文字数 / 阅读时长）。
   两个都压左边 —— 封面成图的右下角本来就烤了一行日期和域名，
   卡脚铺到右端就会跟它叠字。 */
.bh-card-feat .bh-feat-foot {
  margin-top: 12px;
  display: flex;
  align-items: baseline;
  justify-content: flex-start;
  gap: 16px;
}
.bh-readout {
  font-family: var(--bh-mono);
  font-size: 11px;
  letter-spacing: 0.08em;
  color: var(--bh-dim);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.bh-card-feat .bh-cta {
  font-family: var(--bh-mono);
  font-size: 12.5px;
  color: var(--bh-card-link);
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
.bh-card-feat .bh-cta::after { content: "→"; transition: transform 0.2s; }
.bh-card-feat:hover .bh-cta::after { transform: translateX(4px); }

/* —— 雷达：右侧一列读数，右上角准星 —— */
.bh-card-radar {
  grid-area: 1 / 9 / 6 / 13;
  padding: 22px;
  min-height: 0;
  display: flex;
  flex-direction: column;
  border-color: var(--bh-green-line);
}
.bh-card-radar .bh-radar-head {
  display: flex;
  flex: 1;
  flex-direction: column;
  justify-content: center;
  color: inherit;
}
.bh-card-radar .bh-radar-head p {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
/* 读数区上面一条虚线，把「说明」和「数据」分开 */
.bh-card-radar .bh-rows {
  padding-top: 14px;
  border-top: 1px dashed var(--bh-green-line);
}
/* 右上准星（圆 + 竖线）—— 竖线并进 background，把 ::after 让给角标 */
.bh-card-radar::before {
  content: "";
  position: absolute;
  right: 16px;
  top: 16px;
  width: 13px;
  height: 13px;
  border: 1px solid rgba(47, 191, 155, 0.55);
  border-radius: 50%;
  box-shadow: inset 0 0 0 3px rgba(47, 191, 155, 0.12);
  background: linear-gradient(rgba(47, 191, 155, 0.45), rgba(47, 191, 155, 0.45)) 50% -12px / 1px 21px no-repeat;
  pointer-events: none;
  z-index: 6;
}
.bh-card-radar .bh-tag { color: var(--bh-green); }
.bh-card-radar h3 { color: #DFF5EC; }
.bh-card-radar .bh-rows { margin-top: auto; }
.bh-card-radar .bh-rrow {
  display: flex;
  justify-content: space-between;
  font-family: var(--bh-mono);
  font-size: 11.5px;
  color: var(--bh-green-deep);
  padding: 5px 0;
  border-bottom: 1px dashed var(--bh-green-line);
}
.bh-card-radar .bh-rrow:hover { color: #DFF5EC; }

/* —— 频道：带数据条的通道表 ——
   原来就是"名字 …… 40 篇"两列右对齐，六行看下来像一张没写完的目录。
   现在每行底下压一条按篇数归一化的淡光条，右端一道亮边收口，
   左边加两位通道号 —— 同样的六行，读起来是仪表上的通道读数。 */
.bh-card-chan {
  grid-area: 1 / 6 / 4 / 9;
  padding: 18px 20px 16px;
  display: flex;
  flex-direction: column;
}
.bh-card-chan .bh-chan-list {
  margin-top: 12px;
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.bh-card-chan .bh-ch {
  position: relative;
  display: grid;
  grid-template-columns: 18px 1fr auto;
  align-items: center;
  gap: 8px;
  padding: 5px 8px 5px 10px;
  font-family: var(--bh-mono);
  font-size: 12px;
  color: var(--bh-card-dim);
  transition: color 0.18s;
}
/* 底衬数据条：宽度来自模板里的 --w（篇数 / 最多那个频道）。
   用绝对定位铺在文字底下，不占栅格 —— 名字长到缩短号也不会被挤走。 */
.bh-card-chan .bh-ch__bar {
  position: absolute;
  left: 0;
  top: 1px;
  bottom: 1px;
  width: var(--w, 0%);
  background: linear-gradient(90deg, rgba(56, 217, 255, 0.22), rgba(56, 217, 255, 0.05));
  border-right: 1px solid rgba(56, 217, 255, 0.45);
  transition: background 0.2s, border-color 0.2s;
  pointer-events: none;
}
.bh-card-chan .bh-ch__no {
  position: relative;
  font-size: 10.5px;
  letter-spacing: 0.06em;
  /* 0.4 在深底上只有 2.7:1，编号是导航不是装饰，得读得出来 */
  color: rgba(56, 217, 255, 0.72);
  transition: color 0.18s;
}
.bh-card-chan .bh-ch__name {
  position: relative;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.bh-card-chan .bh-ch__n {
  position: relative;
  color: var(--bh-card-link);
  font-weight: 400;
  font-variant-numeric: tabular-nums;
}
.bh-card-chan .bh-ch:hover { color: var(--bh-card-ink); }
.bh-card-chan .bh-ch:hover .bh-ch__no { color: var(--bh-card-link); }
.bh-card-chan .bh-ch:hover .bh-ch__bar {
  background: linear-gradient(90deg, rgba(56, 217, 255, 0.34), rgba(56, 217, 255, 0.08));
  border-color: rgba(56, 217, 255, 0.85);
}

/* —— 周报：顶部一条来回扫过的光 —— */
.bh-card-week {
  grid-area: 6 / 1 / 9 / 6;
  padding: 20px 22px;
  display: flex;
  flex-direction: column;
}
.bh-card-week::before {
  content: "";
  position: absolute;
  top: 0;
  left: -40%;
  width: 40%;
  height: 2px;
  background: linear-gradient(90deg, transparent, var(--bh-line), transparent);
  animation: bh-sweep-line 4.5s linear infinite;
  pointer-events: none;
}
@keyframes bh-sweep-line {
  0% { left: -40%; }
  100% { left: 100%; }
}
/* 右上角超大水印期号：跟雷达卡的 TARGET: W42 是同一个数字，
   两处对上了，才知道"这一周"指的就是同一周。只做水印，不抢标题。 */
.bh-week-mark {
  position: absolute;
  right: 16px;
  top: 10px;
  font-family: var(--bh-mono);
  font-size: 56px;
  line-height: 1;
  font-weight: 600;
  letter-spacing: -0.02em;
  color: rgba(56, 217, 255, 0.075);
  pointer-events: none;
  user-select: none;
}

/* —— 发射记录：底部中间那格的 12 周柱状图 ——
   放这张表之前，这一格（6-8 行 × 6-8 列）是完全空的：左下有周报卡、
   右下有工具卡、中间塌下去一个 234×215 的洞，整块甲板看着没排完。
   现在用近 12 周的真实发文量补上 —— 洞补平了，还多了一处"时间轴"。
   柱子由下往上长出来，并且错峰入场，这一屏就自带一口气。 */
.bh-card-log {
  grid-area: 6 / 6 / 9 / 9;
  padding: 16px 16px 13px;
  display: flex;
  flex-direction: column;
  min-height: 0;
}
.bh-card-log .bh-log {
  flex: 1;
  display: flex;
  align-items: flex-end;
  gap: 4px;
  min-height: 0;
  margin-top: 12px;
  padding-bottom: 1px;
  border-bottom: 1px solid rgba(56, 217, 255, 0.16);
}
.bh-card-log .bh-log__col {
  position: relative;
  flex: 1 1 0;
  height: 100%;
  display: flex;
  align-items: flex-end;
}
.bh-card-log .bh-log__bar {
  display: block;
  width: 100%;
  height: var(--h, 4%);
  min-height: 2px;
  background: linear-gradient(180deg, rgba(56, 217, 255, 0.62), rgba(56, 217, 255, 0.1));
  transform-origin: bottom center;
  animation: bh-bar-grow 0.6s cubic-bezier(0.2, 0.9, 0.3, 1.25) both;
  animation-delay: calc(var(--i, 1) * 45ms);
}
.bh-card-log .bh-log__col.is-now .bh-log__bar {
  background: linear-gradient(180deg, #8BEFFF, rgba(56, 217, 255, 0.34));
  box-shadow: 0 0 12px rgba(56, 217, 255, 0.45);
}
@keyframes bh-bar-grow {
  from { transform: scaleY(0); opacity: 0.2; }
  to { transform: scaleY(1); opacity: 1; }
}
/* 本周那根柱子头顶的读数 —— 只有它带标签，其余柱子只留高度 */
.bh-card-log .bh-log__now {
  position: absolute;
  left: 50%;
  bottom: calc(var(--h, 0%) + 4px);
  transform: translateX(-50%);
  font-family: var(--bh-mono);
  font-size: 10.5px;
  letter-spacing: 0.08em;
  /* 柱状图上只有"本周"这根带头标，它指时间，所以是金的 */
  color: var(--bh-gold);
  white-space: nowrap;
  font-weight: 400;
}
.bh-card-log .bh-log-foot {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 8px;
  margin-top: 6px;
  font-family: var(--bh-mono);
  font-size: 10.5px;
  letter-spacing: 0.04em;
  color: var(--bh-dim);
  white-space: nowrap;
}
.bh-card-log .bh-log-foot b { color: var(--bh-card-ink); font-weight: 400; }

/* —— 工具：右下角双向交叉线 —— */
.bh-card-tools {
  grid-area: 6 / 9 / 9 / 13;
  padding: 20px 22px;
  display: flex;
  flex-direction: column;
}
/* 两张文字卡：日期行压在卡片底部，别让下半截空着 */
.bh-card-week .bh-meta,
.bh-card-tools .bh-meta { margin-top: auto; }
.bh-card-tools::before {
  content: "";
  position: absolute;
  right: 8px;
  bottom: 8px;
  width: 15px;
  height: 15px;
  opacity: 0.5;
  background:
    linear-gradient(45deg, transparent 46%, rgba(56, 217, 255, 0.75) 46%, rgba(56, 217, 255, 0.75) 54%, transparent 54%),
    linear-gradient(-45deg, transparent 46%, rgba(56, 217, 255, 0.55) 46%, rgba(56, 217, 255, 0.55) 54%, transparent 54%);
  pointer-events: none;
}

/* ---- 档案室态（同套暗色 HUD） ---- */
.bh-archive {
  position: relative;
  isolation: isolate;
  /* 转盘让第二屏比一屏还矮时，整页最大滚动量不够、首屏会永远露出下面一截
     （实测 1440×900：内容 852、视口 900，滚到底首屏还剩 48px） */
  min-height: 100vh;
  background: var(--bh-arc-bg);
  color: var(--bh-arc-ink);
  border-top: 1px solid var(--bh-arc-line);
  padding: 0 0 80px;
}
/* 第二屏的背景也是仪表的一部分：顶部一层从中间散开的冷光，加一组 48px 的
   细网格往下渐隐。原来这里是纯色 #0B0F17，从首屏翻下来等于从驾驶舱掉进一张
   普通网页 —— 全靠这一层把两屏接成同一艘船。 */
.bh-archive::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background:
    radial-gradient(1000px 520px at 50% 0%, rgba(56, 217, 255, 0.12), transparent 72%),
    linear-gradient(rgba(56, 217, 255, 0.042) 1px, transparent 1px),
    linear-gradient(90deg, rgba(56, 217, 255, 0.042) 1px, transparent 1px);
  background-size: auto, 48px 48px, 48px 48px;
  -webkit-mask: linear-gradient(180deg, #000, rgba(0, 0, 0, 0.55) 52%, transparent 88%);
  mask: linear-gradient(180deg, #000, rgba(0, 0, 0, 0.55) 52%, transparent 88%);
}
/* 第二屏自己的页头：常驻（sticky）。
   首屏那套页头是散点式的、随首屏滚走了，到第二屏完全没有导航可点，
   所以这条必须做成真正能用的顶栏：品牌 / 频道 / 检索 / 读数 / 返回。 */
.bh-arc-bar {
  position: sticky;
  top: 0;
  z-index: 60;
  display: flex;
  align-items: center;
  gap: 18px;
  box-sizing: border-box;
  height: 56px;
  padding: 0 24px;
  background: rgba(9, 13, 21, 0.94);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border-bottom: 1px solid var(--bh-arc-line);
  font-size: 13px;
}
/* 底边一道从中间亮起来的线，和首屏那条顶线同一套语言 */
.bh-arc-bar::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: -1px;
  height: 1px;
  background: linear-gradient(90deg, transparent, rgba(56, 217, 255, 0.5), transparent);
  pointer-events: none;
}
.bh-arc-logo {
  font-weight: 600;
  font-size: 14.5px;
  font-family: var(--bh-mono);
  letter-spacing: 0.06em;
  color: #EAF6FF;
  white-space: nowrap;
}
.bh-arc-logo b { color: var(--bh-card-link); font-weight: 600; }
.bh-arc-mode {
  font-family: var(--bh-mono);
  font-size: 10.5px;
  letter-spacing: 0.18em;
  color: var(--bh-card-link);
  padding: 4px 8px;
  border: 1px solid rgba(56, 217, 255, 0.24);
  white-space: nowrap;
  /* 频道轴搬去右侧之后，顶栏的弹性由它承担：检索框 / 篇数 / 返回靠右 */
  margin-right: auto;
}
/* ---- 第二屏的频道菜单：还是首屏那根竖轴，只是搬到了本屏右侧中部 ----
   菜单的 DOM 与 class 跟首屏一模一样（`.site-nav--inline > .nav-list`），
   所以主轴那一整套皮肤（竖轴 / 分支刻度 / `counter()` 两位编号 / 二级菜单）
   一个字不用重写就自动生效，这里只改"它待在哪儿"：
   一条铺满整屏高度的绝对定位轨道，菜单自己在轨道里 sticky 粘在视口中线。
   ⚠ 覆盖必须带 `:is(body.bridge-home, .bridge-home)` 前缀 —— 同特异性下
   bridge-chrome.css 比本文件后加载，光写 `.bh-arc-rail .site-nav--inline` 抢不过
   它那条 `position:absolute`，菜单会掉到轨道顶部、随内容滚走。 */
.bh-arc-shell {
  position: relative;
  /* 右侧 200 是给频道竖轴让的位；让位放在这一层，内层用 margin:auto 才能居中 */
  padding-right: 200px;
}
.bh-arc-rail {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  width: 200px;
  z-index: 2;
  /* 轨道本身不吃鼠标事件：它铺满整屏高，否则会挡住列表右侧那一条的点击 */
  pointer-events: none;
}
:is(body.bridge-home, .bridge-home) .bh-arc-rail .site-nav--inline {
  position: sticky;
  right: auto;
  /* 落点跟首屏同一个变量（bridge-chrome.css 里的 --hud-nav-top = 27vh）：
     两屏菜单必须停在视口里同一个高度，否则翻过屏就往下跳 164px。
     以前这里按"56~100vh 这一带居中"算成 50vh-44px，位置本身就比首屏低，
     欢哥 10-19 直接点出来了 —— 以首屏为准，不再自己算一套。 */
  top: var(--hud-nav-top, 27vh);
  width: 152px;
  /* 到达第二屏时菜单就落在这个点上，之后一直不动（margin 比 top 少一个
     顶栏高度 57px —— 顶栏 sticky 在 0、含 1px 下边框，shell 从 57 起算）。
     两个值不这么配的话，进屏那一刻它会比落点低 50 多像素，一滚动再"跳"上去。 */
  margin: calc(var(--hud-nav-top, 27vh) - 57px) 26px 0 auto;
}
/* 901~1180 这一档顶栏下面还压着一条 34px 的横带切换器（.bh-lay--strip），
   shell 从 91 起算而不是 57 —— margin 要多退这 34，否则菜单落点比首屏低 35px
   （1024×768 实测 265 vs 230，sticky 还没到落点，一屏就这么高，永远补不上）。 */
@media (min-width: 901px) and (max-width: 1180px) {
  :is(body.bridge-home, .bridge-home) .bh-arc-rail .site-nav--inline {
    margin-top: calc(var(--hud-nav-top, 27vh) - 91px);
  }
}
.bh-arc-search {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 176px;
  height: 30px;
  padding: 0 10px;
  box-sizing: border-box;
  background: rgba(14, 20, 32, 0.9);
  border: 1px solid var(--bh-arc-line);
  transition: border-color 0.15s;
}
.bh-arc-search:focus-within { border-color: var(--bh-line); }
.bh-arc-search__pre { font-family: var(--bh-mono); font-size: 11px; color: var(--bh-line); opacity: 0.8; }
.bh-arc-search__input {
  flex: 1;
  min-width: 0;
  height: 100%;
  padding: 0;
  font-family: var(--bh-mono);
  font-size: 12px;
  color: var(--bh-arc-ink);
  background: none;
  border: 0;
  outline: none;
}
.bh-arc-search__input::placeholder { color: var(--bh-arc-dim); }
/* 这一格现在是按钮（2026-10-19）：点它开首屏那个搜索弹窗，不再自带输入框。
   外形必须与原来的输入框一模一样 —— 两屏看到的是同一个检索口，
   只是点下去的反应从"就地打字"变成"弹出搜索层"。 */
.bh-arc-search--btn {
  cursor: pointer;
  text-align: left;
  font-family: var(--bh-mono);
  color: var(--bh-arc-dim);
  transition: border-color 0.15s, background-color 0.15s;
}
.bh-arc-search--btn:hover {
  border-color: var(--bh-line);
  background: rgba(18, 27, 42, 0.95);
}
.bh-arc-search--btn:focus-visible {
  outline: 2px solid rgba(56, 217, 255, 0.55);
  outline-offset: 2px;
}
.bh-arc-search__ph { font-size: 12px; letter-spacing: 0.04em; color: var(--bh-arc-dim); }
.bh-arc-search--btn:hover .bh-arc-search__ph { color: var(--bh-arc-ink); }
.bh-arc-count {
  font-family: var(--bh-mono);
  font-size: 11px;
  letter-spacing: 0.12em;
  color: var(--bh-arc-dim);
  white-space: nowrap;
}
.bh-arc-count b { color: var(--bh-arc-ink); font-weight: 400; }
.bh-arc-back {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 30px;
  padding: 0 12px;
  font-family: var(--bh-mono);
  font-size: 12px;
  letter-spacing: 0.08em;
  color: var(--bh-card-link);
  background: rgba(56, 217, 255, 0.06);
  border: 1px solid rgba(56, 217, 255, 0.32);
  cursor: pointer;
  white-space: nowrap;
  transition: background 0.15s, border-color 0.15s;
}
.bh-arc-back:hover { background: rgba(56, 217, 255, 0.14); border-color: var(--bh-card-link); }
.bh-arc-inner {
  position: relative;
  z-index: 1;
  max-width: 980px;
  /* 让位交给 .bh-arc-shell 的 padding-right，这里才能整体居中。
     早先写的是 margin-left:auto —— 那只会把整块内容顶到最右边，
     看着就是"第二屏的内容跑到右边去了"。 */
  margin: 0 auto;
  padding: 36px 32px 0;
}
/* 桌面端：顶栏 / 内容 / 底部读数条三段式，整屏正好一份 100vh。
   标题 + 转盘 + 分页作为一组在中间那段里垂直居中。 */
/* 136 = 顶栏 56 + .bh-archive 的 padding-bottom 80。 */
@media (min-width: 901px) {
  /* 底部那 80px 本来是为长列表留的呼吸位，转盘只占一屏之后就成了"内容整体偏上"：
     实测顶部空 26、底部空 100。底部读数条接手这个位置，所以 padding 归零，
     由 .bh-foot 自己占 46px。 */
  .bh-archive {
    display: flex;
    flex-direction: column;
    padding-bottom: 0;
  }
  .bh-arc-bar { flex: 0 0 auto; }
  .bh-arc-shell {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
  }
  .bh-foot { flex: 0 0 auto; }
  /* 居中交给 inner 自己的 `margin: auto`，不用 justify-content 也不用
     min-height:100%：
     ① `min-height:100%` 是百分比，父级高度又由 flex 协商得出 —— 首屏那次布局
        会算出 1827（多 28px 空白，滚到底能看到页尾下面一条空带），要等任意一次
        样式失效才纠正回 1800，等于每个访客首访都吃这个 bug；
     ② `justify-content:center` 在内容超高时会把顶部顶出容器外且滚不回来，
        而 flex 子项的 `margin:auto` 溢出时会自动退化成 0，是"安全的居中"。 */
  .bh-arc-inner {
    display: flex;
    flex-direction: column;
    margin: auto;
    /* ⚠ width:100% 是必需的，不是可有可无的兜底。
       横向的 `margin:auto` 会顶掉 flex 的 `align-self:stretch`（跨轴自动外边距
       优先于拉伸），内层于是变成"收缩到内容宽"：转盘那套因为盘面有固定宽度
       还能到 756，换成书架/星图这类没有固有宽度的布局就只剩标题那 192px ——
       表现是「最新文章」被挤成竖排、右上角读数折成三行。
       显式给满宽 + border-box（本文件没有全局 border-box，忘了会多出 64px 内边距）。 */
    width: 100%;
    box-sizing: border-box;
  }
}

/* 标题 + 读数原来各占一行，把转盘挤小了 60 多像素。改成绝对定位浮在
   转盘外接矩形的上方两角（圆形盘面的角本来就是空的），高度全让给转盘。 */
.bh-arc-hd {
  position: absolute;
  top: 0;
  left: 32px;
  right: 32px;
  z-index: 3;
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 16px;
  pointer-events: none;
}
.bh-arc-hd > * { pointer-events: auto; }
.bh-arc-hd h2 { font-size: 20px; font-weight: 600; color: var(--bh-arc-ink); }
.bh-arc-hd__rd { font-family: var(--bh-mono); font-size: 11px; letter-spacing: 0.08em; color: var(--bh-arc-dim); font-variant-numeric: tabular-nums; }
.bh-arc-empty { color: var(--bh-arc-dim); padding: 40px 0; }

.bh-pager {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  margin-top: 36px;
  font-family: var(--bh-mono);
  font-size: 12.5px;
}
.bh-pager__btn { color: var(--bh-card-link); padding: 8px 14px; border: 1px solid var(--bh-arc-line); }
.bh-pager__btn:hover { border-color: var(--bh-card-link); }
.bh-pager__num { color: var(--bh-arc-dim); }
/* 转盘居中，分页再左右甩开就对不上了：整条收成居中的一组 */
.bh-flow + .bh-pager {
  justify-content: center;
  gap: 26px;
  margin-top: 22px;
}
/* 换页是 fetch 就地替换，不整页刷新 —— 等的这一小段里不能毫无反馈，
   又不能让盘面塌掉，只压一点透明度并锁住点击。 */
.bh-arc-body.is-loading {
  opacity: 0.42;
  pointer-events: none;
  transition: opacity 0.18s linear;
}

/* ============================================================
   底部读数条（1.8.0）
   原来第二屏下面还接着父主题那条波浪页脚，整页 2.2 屏，滚到底多出一截。
   现在首页只有两屏：页脚里真正有用的三行（站点名 / 描述 / 版权）压缩成
   这一条，跟顶栏 .bh-arc-bar 一上一下对称。样式沿用第二屏那套等宽小字。
   ============================================================ */
.bh-foot {
  display: flex;
  align-items: center;
  gap: 12px;
  min-height: 46px;
  padding: 0 32px;
  border-top: 1px solid var(--bh-arc-line);
  background: rgba(8, 12, 19, 0.55);
  font-family: var(--bh-mono);
  font-size: 11px;
  letter-spacing: 0.08em;
  color: var(--bh-arc-dim);
  font-variant-numeric: tabular-nums;
}
.bh-foot__brand {
  color: var(--bh-arc-ink);
  letter-spacing: 0.04em;
  white-space: nowrap;
}
.bh-foot__brand b { color: var(--bh-card-link); font-weight: 600; }
/* 描述可能很长，宁可省略也不换行 —— 一换行这条就变高，整屏比例跟着乱 */
.bh-foot__desc {
  min-width: 0;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
.bh-foot__fill { flex: 1 1 auto; }
.bh-foot__meta { white-space: nowrap; }
.bh-foot__sep { color: rgba(56, 217, 255, 0.22); }

/* 首页只要两屏：父主题那条波浪页脚不在首页出现（内容已并进 .bh-foot）。
   ⚠ <footer> 只是视觉壳，wp_footer() 与全部脚本都在它外面 —— 隐藏它不掉任何功能。 */
:is(body.bridge-home, .bridge-home) .site-footer,
:is(body.bridge-home, .bridge-home) #app-footer {
  display: none;
}

/* ---- 无障碍 / 降级 ---- */
.bh-sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
@media (prefers-reduced-motion: reduce) {
  .bh-sweep, .bh-live, .bh-blip, .bh-card-week::before { animation: none; }
  .bh-deck > * { transition: none; }
  /* 图表 / 索引轴 / 逐行进场一并停掉：这些动效只是装饰，
     对 vestibular 敏感的人是纯负担；停掉之后内容一样完整。 */
  .bh-card-log .bh-log__bar { animation: none; }
  /* 场景贯穿：姿态切换改成瞬移，不再有位移过程（详见文件末尾那段） */
}

/* 矮视口（笔记本 768/800 高）收紧留白，避免网格溢出首屏。
   左上舷窗以前压在 top:54 —— 牌子比这个数还高，正好盖住主屏卡的上边框，
   1280×800 下看得一清二楚，这里连位置带字号一起收。 */
@media (max-height: 820px) and (min-width: 901px) {
  /* 底部 82px 是给左下读数舷窗（高 ~63 + 外边距 12）留的：
     原来 70px 时舷窗顶会压到周报卡下边框上 */
  .bh-deck { padding: 94px 186px 82px 32px; gap: 14px; }
  .bh-ph-tl, .bh-ph-tr { top: 14px; }
  .bh-ph-tl .bh-brand { font-size: 13.5px; }
  .bh-ph-tl .bh-tagline { font-size: 11px; margin-top: 2px; }
  .bh-card-feat h3 { font-size: 21px; }
  .bh-card-feat .bh-txt p { -webkit-line-clamp: 2; }
  /* 矮视口下频道卡只剩 213px 高，6 行按原行高会顶到卡片下边框（1024×768 实测），
     这里把行距和内边距一起收一格 */
  .bh-card-chan { padding: 14px 16px 12px; }
  .bh-card-chan .bh-chan-list { margin-top: 8px; gap: 1px; }
  .bh-card-chan .bh-ch { padding-top: 4px; padding-bottom: 4px; }
}

/* 更矮的视口（≤700 高，960×600 / 1440×640 这类）：.bh-bridge 那条 680 的
   min-height 会让首屏本身比视口还高，"首页正好两屏"直接破（2.13 屏）。
   这一档把下限撤掉 —— 卡片是 fr 行，跟着 Deck 一起收，不会溢出；
   留白再收一档，左下读数舷窗与右下切屏入口仍然不压卡片。 */
@media (max-height: 700px) and (min-width: 901px) {
  .bh-bridge { min-height: 0; }
  .bh-deck { padding: 76px 186px 82px 32px; gap: 12px; }
  .bh-deck::before { top: 64px; }
  .bh-ph-tl, .bh-ph-tr { top: 12px; }
  .bh-ph-tl .bh-brand { font-size: 13px; }
  .bh-ph-tl .bh-tagline { display: none; }
  .bh-card-feat h3 { font-size: 19px; }
  .bh-card p { font-size: 12.5px; }
  .bh-card-log .bh-log { height: 74px; }
}

/* ---- 移动端整体回退 ---- */
@media (max-width: 900px) {
  /* 移动端页头是 sticky 的、本身就在流里，这里再加 56 就是两倍留白 */
  .bh-page { padding-top: 0; }
  .bh-bridge { height: auto; min-height: 0; padding-bottom: 40px; }
  .bh-deck {
    height: auto;
    grid-template-columns: 1fr;
    grid-template-rows: auto;
    padding: 18px 18px 40px;
    gap: 16px;
    align-content: start;
  }
  .bh-card-feat, .bh-card-radar, .bh-card-chan, .bh-card-week, .bh-card-tools, .bh-card-log {
    grid-area: auto;
    transform: none;
    min-height: 0;
    clip-path: none;
  }
  /* 观察窗是给"中间那个洞"兜边界的，单栏里没有洞，两块边线只会平白多两条竖线 */
  .bh-void { display: none; }
  .bh-card-log .bh-log { height: 88px; flex: 0 0 auto; }
  /* 单栏里主屏改成「封面在上、文字在下」，封面不再是绝对定位 */
  .bh-card-feat { display: flex; flex-direction: column; }
  .bh-card-feat .bh-cover { position: relative; inset: auto; min-height: 210px; order: -1; }
  .bh-card-feat .bh-txt { height: auto; padding: 18px 20px 22px; justify-content: flex-start; }
  .bh-card-feat h3 { font-size: 20px; }
  /* 单栏时封面横向铺满整幅，成图底部的烤字会整段露出来。
     渐变必须压到图片底 42% 都是不透明的，否则烤字会和卡内标题重影。 */
  .bh-card-feat .bh-cover::before {
    background: linear-gradient(
      0deg,
      #0C1219 0%,
      rgba(11, 15, 23, 0.97) 34%,
      rgba(11, 15, 23, 0.72) 50%,
      transparent 72%
    );
  }
  .bh-halo { display: none; } /* 全息层在单栏里没有位置，留着只会和卡片打架 */
  /* 坐标尺是给"漂浮在空间里"的桌面布局兜框的，单栏里只会压住卡片左缘 */
  .bh-deck::before, .bh-deck::after { display: none; }
  .bh-ph-br { display: none; }
  /* 左上舷窗写的是站名，移动端 sticky 顶栏已经有一份，别重复 */
  .bh-ph-tl { display: none; }
  /* 时间面板改为正常流：单栏下它不再和状态条拼成一条，
     就那么浮着只会顶出一大片空白（原来首屏顶部空掉两百来像素就是它造成的） */
  .bh-ph-tr {
    position: static;
    display: flex;
    justify-content: flex-end;
    width: auto;
    float: none;
    padding: 16px 18px 0;
  }
  .bh-ph-tr .bh-ph-box { height: 30px; padding: 0 10px; }
  /* 整屏切换只在桌面生效（单栏本来就是一条长页），提示面板一并不给 */
  .bh-scroll-hint { display: none; }
  /* 单栏下页头是 sticky 的（z-index 900），这条顶栏若还压在 top:0，
     会整条被页头盖住 —— 「↑ 舰桥」就再也点不到了。让到页头下面去。 */
  .bh-arc-bar {
    top: 56px;
    height: 46px;
    gap: 12px;
    padding: 0 16px;
  }
  /* 顶栏让到 56 之下以后，它 sticky 时会相对原位下移 56px，正好把「最新文章」
     这行标题压到它下面（实测标题 top:71、顶栏占 56~102）。给第二屏补同样高的
     上内边距，顶栏的原位就落在 56 —— 落屏那一刻不位移，标题也不会被吃掉。
     这段空白正好被上面 sticky 的页头盖住，看不见。 */
  .bh-archive { padding-top: 56px; }
  .bh-arc-search, .bh-arc-count { display: none; }
  /* 移动端有 sticky 页头 + 抽屉里的全套导航，右侧这根竖轴既没地方也没必要 */
  .bh-arc-rail { display: none; }
  /* 品牌名上面那条 sticky 页头已经有了，这里再来一遍就是两行同样的字；
     换成模式徽标（ARCHIVE · 档案室），这行才是在说"你在哪一屏"。 */
  .bh-arc-logo { display: none; }
  .bh-arc-back { margin-left: auto; }
  .bh-arc-inner { padding: 24px 16px 0; }
  .bh-arc-shell { padding-right: 0; }
  /* 单栏：标题回到文档流，不要浮着 */
  .bh-arc-hd { position: static; margin-bottom: 10px; }
  .bh-arc-hd__rd { display: none; }
  /* 单栏不做整屏切换，第二屏不撑满一屏；底部补足到"滚到底时第二屏正好露出来"，
     否则差 44px 滚不到位，顶栏会让到 56 却没人盖，看到一截空带。
     1.8.0 起底部读数条自己占了 46，补白相应从 124 收到 78。 */
  .bh-archive { min-height: 0; padding-bottom: 78px; }
  /* 单栏一行放不下，读数条折成两行；高度自适应，不再固定 */
  .bh-foot {
    flex-wrap: wrap;
    gap: 6px 10px;
    padding: 12px 16px;
    font-size: 11px;
  }
  .bh-foot__fill { flex-basis: 100%; height: 0; }
}

/* 盘径本身已经由 --size 的 vh 算式照顾到所有高度，这里只压一压小屏的字号 */
@media (max-height: 790px) and (min-width: 901px) {
  .bh-flow__hub { padding: 9px 10px 10px; }
  /* 矮视口里 hub 只剩 200 上下，标题必须收到 2 行，否则底部的读数 / OPEN
     一定会被挤出去（窗高固定、超出即裁） */
  .bh-flow__hub-meta { gap: 4px; font-size: 10.5px; letter-spacing: 0.04em; }
  .bh-flow__hub-t { font-size: 13px; margin-top: 5px; -webkit-line-clamp: 2; }
  .bh-flow__hub-ex { font-size: 11px; margin-top: 5px; }
  .bh-flow__hub-foot { padding-top: 7px; }
}

/* ============================================================
   档案室 · 布局切换器（1.9.0 起，2.0 只剩这一件）
   六套陈列合成一套「场景贯穿」之后，这里剩下的只有切换器本身：
   两个实例、同一份 DOM，选中项记在 localStorage。
   ============================================================ */




/* ---- 布局切换器 ----------------------------------------------------
   两个实例、同一份 DOM：
     · .bh-lay--rail   左舷竖轴，≥1181 出现（绝对定位铺在 shell 的左侧留白里，
                       不吃高度预算）；
     · .bh-lay--strip  顶栏下面一条横带，901~1180 出现。这一档横着放不下
                       竖轴（会挤掉 138px 正文宽），竖着放又没地方，只能横躺。
                       它占 34px 高，所以这一档的场景高度算式要同步减 34
                       （见下面 @media 1180 段落里的 --size 覆盖）——
                       不减就是第二屏 2.05 屏。 */
.bh-lay {
  font-family: var(--bh-mono);
  box-sizing: border-box;
}
.bh-lay--rail,
.bh-lay--strip {
  display: none;
}
.bh-lay__list {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 0;
  margin: 0;
  padding: 0;
  list-style: none;
}
.bh-lay__item {
  position: relative;
}
.bh-lay__btn {
  position: relative;
  box-sizing: border-box;
  width: 100%;
  padding: 0;
  background: none;
  border: 0;
  color: var(--bh-arc-dim);
  font: inherit;
  text-align: left;
  cursor: pointer;
  transition: color 0.18s;
}
.bh-lay__btn b {
  font-weight: 400;
  letter-spacing: 0.08em;
  color: rgba(180, 197, 212, 0.92);
  transition: color 0.18s;
}
.bh-lay__btn span {
  display: block;
  overflow: hidden;
  font-size: 12.5px;
  line-height: 1.32;
  letter-spacing: 0.02em;
  white-space: nowrap;
  text-overflow: ellipsis;
}
.bh-lay__btn i {
  display: block;
  margin-top: 2px;
  overflow: hidden;
  font-style: normal;
  font-size: 10.5px;
  letter-spacing: 0.08em;
  color: rgba(180, 197, 212, 0.92);
  white-space: nowrap;
  text-overflow: ellipsis;
  transition: color 0.18s;
}
.bh-lay__btn:hover,
.bh-lay__btn:focus-visible {
  color: var(--bh-arc-ink);
  outline: none;
}
.bh-lay__item.is-on .bh-lay__btn {
  color: var(--bh-arc-ink);
}
.bh-lay__item.is-on .bh-lay__btn b {
  color: var(--bh-card-link);
}
.bh-lay__item.is-on .bh-lay__btn i {
  color: rgba(56, 217, 255, 0.62);
}

/* 左舷竖轴：铺满第二屏内容区左侧，菜单自己在里面垂直居中。
   轨道本身不吃鼠标事件（它铺满整屏高，否则会挡住左边那列节点的点击）。 */
@media (min-width: 1181px) {
  .bh-lay--rail {
    display: flex;
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    /* 156 而不是 138：字号上调后 122px 的可用宽放不下「陈列六种排布」，
       也不能把英文名截成 TIME CORRIDO，宽度让给这一列 */
    width: 156px;
    z-index: 3;
    flex-direction: column;
    justify-content: center;
    padding-left: 16px;
    pointer-events: none;
    border-right: 1px solid rgba(56, 217, 255, 0.06);
    background: linear-gradient(90deg, rgba(9, 13, 21, 0.92), rgba(9, 13, 21, 0.34) 68%, transparent);
  }
  .bh-lay--rail .bh-lay__hd,
  .bh-lay--rail .bh-lay__list {
    pointer-events: auto;
  }
  .bh-lay--rail .bh-lay__hd {
    margin-bottom: 14px;
    /* rail 自己已经有 16px 左内边距，这里不再叠加；
       字号上调后「DISPLAY · 陈列六种排布」要一行放得下 */
    padding-left: 0;
    font-size: 10.5px;
    line-height: 1.75;
    letter-spacing: 0.06em;
    color: rgba(56, 217, 255, 0.8);
    pointer-events: none;
  }
  .bh-lay--rail .bh-lay__hd span {
    display: block;
    letter-spacing: 0.1em;
    color: rgba(180, 197, 212, 0.92);
  }
  /* 竖轴版每个按钮自己写着中文名 + 英文代号，横带版那块「01 · RADIAL DIAL」
     名牌在这儿是重复的，而且在窄列里会折成两行 */
  .bh-lay--rail .bh-lay__tag {
    display: none;
  }
  /* 菜单竖轴：一条从上到下渐隐的轨道 */
  .bh-lay--rail .bh-lay__list::before {
    content: "";
    position: absolute;
    left: 10px;
    top: 6px;
    bottom: 6px;
    width: 1px;
    background: linear-gradient(180deg, transparent, rgba(56, 217, 255, 0.26) 12%, rgba(56, 217, 255, 0.26) 88%, transparent);
  }
  .bh-lay--rail .bh-lay__btn {
    display: grid;
    /* 26 而不是 15：编号自己还带 13px 左内边距（给菱形让位），
       列宽只给 15 的话编号会顶出列、跟名字压在一起 2px */
    grid-template-columns: 26px 1fr;
    align-items: baseline;
    gap: 1px 7px;
    padding: 8px 4px 8px 0;
  }
  /* 英文代号必须落在「名字」那一列的第二行。grid 自动放置不会这么放，
     它会把这个第三子元素丢回第一列 —— 13px 宽的槽里再 overflow:hidden，
     RADIAL DIAL 只剩 "RA…"，看着像跟下一个布局的名字叠在一起。 */
  .bh-lay--rail .bh-lay__btn > i {
    grid-column: 2;
    margin-top: 0;
    font-size: 10px;
  }
  /* 菱形节点：跟首屏竖轴同一种标记，只是这里代表"布局"而不是"频道" */
  .bh-lay--rail .bh-lay__btn::before {
    content: "";
    position: absolute;
    left: 7px;
    top: 50%;
    width: 7px;
    height: 7px;
    margin-top: -3.5px;
    box-sizing: border-box;
    border: 1px solid rgba(56, 217, 255, 0.34);
    background: #0C1219;
    transform: rotate(45deg);
    transition: background-color 0.2s, box-shadow 0.25s, border-color 0.2s;
  }
  .bh-lay--rail .bh-lay__btn b {
    padding-left: 13px;
    font-size: 10.5px;
  }
  .bh-lay--rail .bh-lay__item.is-on .bh-lay__btn::before {
    background: var(--bh-line);
    border-color: var(--bh-line);
    box-shadow: 0 0 0 3px rgba(56, 217, 255, 0.14), 0 0 14px rgba(56, 217, 255, 0.7);
  }
  /* 选中项从画面左缘拉一条亮线 */
  .bh-lay--rail .bh-lay__item.is-on .bh-lay__btn::after {
    content: "";
    position: absolute;
    left: -6px;
    top: 5px;
    bottom: 5px;
    width: 2px;
    background: linear-gradient(180deg, transparent, var(--bh-line), transparent);
  }
}

/* 顶栏下的横带（901~1180）：编号当按钮，左边挂着当前布局的名牌 */
@media (min-width: 901px) and (max-width: 1180px) {
  .bh-lay--strip {
    display: flex;
    position: relative;
    flex: 0 0 auto;
    align-items: center;
    gap: 14px;
    height: 34px;
    padding: 0 32px;
    border-bottom: 1px solid rgba(56, 217, 255, 0.07);
    background: rgba(9, 13, 21, 0.55);
  }
  .bh-lay--strip .bh-lay__list {
    flex-direction: row;
    gap: 3px;
    overflow-x: auto;
    overflow-y: hidden;
    scrollbar-width: none;
  }
  .bh-lay--strip .bh-lay__list::-webkit-scrollbar {
    height: 0;
  }
  .bh-lay--strip .bh-lay__btn {
    display: grid;
    place-items: center;
    width: 30px;
    height: 24px;
    border: 1px solid var(--bh-arc-line);
    background: rgba(14, 20, 32, 0.9);
    font-size: 11px;
    text-align: center;
    transition: color 0.15s, border-color 0.15s, background-color 0.15s;
  }
  .bh-lay--strip .bh-lay__btn span,
  .bh-lay--strip .bh-lay__btn i {
    display: none;
  }
  .bh-lay--strip .bh-lay__btn b {
    padding: 0;
    font-size: 11px;
  }
  .bh-lay--strip .bh-lay__btn:hover {
    border-color: rgba(56, 217, 255, 0.5);
  }
  .bh-lay--strip .bh-lay__item.is-on .bh-lay__btn {
    color: #06131B;
    background: var(--bh-card-link);
    border-color: var(--bh-card-link);
  }
  .bh-lay--strip .bh-lay__item.is-on .bh-lay__btn b {
    color: #06131B;
  }
  .bh-lay__tag {
    flex: 0 0 auto;
    font-size: 10.5px;
    letter-spacing: 0.18em;
    color: rgba(56, 217, 255, 0.62);
    white-space: nowrap;
  }
  .bh-lay__tag::before {
    content: "▚ ";
    opacity: 0.7;
  }
  /* 左侧竖轴没有，正文照旧从中间开始 */
  .bh-arc-shell {
    padding-left: 0;
  }
}
@media (min-width: 1181px) {
  .bh-arc-shell {
    padding-left: 156px;
  }
}

/* 五个场景共用的「OPEN →」与图片兜底 */
.bh-open {
  font-family: var(--bh-mono);
  font-size: 10.5px;
  letter-spacing: 0.14em;
  color: var(--bh-card-link);
  white-space: nowrap;
}
.bh-open::after {
  content: "▸";
  margin-left: 5px;
  display: inline-block;
  transition: transform 0.2s;
}
.bh-open:hover::after {
  transform: translateX(3px);
}
/* 封面取不到时的兜底：斜纹 + 大编号，比弹一个破图图标体面得多 */
.bh-ph {
  position: relative;
  overflow: hidden;
  background:
    repeating-linear-gradient(135deg, rgba(56, 217, 255, 0.10) 0 1px, transparent 1px 9px),
    linear-gradient(160deg, rgba(20, 32, 46, 0.95), rgba(9, 14, 22, 0.95));
}
.bh-ph b {
  position: absolute;
  right: 7px;
  bottom: 2px;
  font-family: var(--bh-mono);
  font-size: 18px;
  font-weight: 400;
  letter-spacing: 0.06em;
  color: rgba(56, 217, 255, 0.22);
}

/* ============================================================
   场景贯穿（2026-10-18，替掉六套独立 .bh-scene）
   六套陈列不再是六个盒子，而是同一批节点的六种姿态。
   JS 只改每个节点的 --x/--y/--z/--rx/--ry/--rz/--s，
   六套姿态共用同一条固定顺序的变换链，所以切换时 transition
   能在任意两姿态之间连续插值 —— 卡片是飞过去的，不是淡入淡出。
   ============================================================ */
.bh-flow {
  /* 尺寸口径与旧 .bh-wheel 完全一致（三上限同时约束），
     两屏红线不允许这里自己发明算式 */
  --size: min(700px, calc(100vw - 300px), calc(100vh - 208px));
  --nw: calc(var(--size) * 0.20);
  --nh: calc(var(--size) * 0.15);
  position: relative;
  width: 100%;
  height: min(700px, calc(100vh - 208px));
  margin: 0 auto;
  isolation: isolate;
  /* 背景层是 1.5~1.9 倍缩放铺满的，不裁就会把整页撑出横滚。
     ⚠ 裁必须裁在这一层：里面那层 .bh-flow__space 带 perspective +
     preserve-3d，它自己一裁，命中测试就和绘制位置错位（1.9.1 胶片踩过）。 */
  overflow: hidden;
}
/* 3D 空间本身绝不能 overflow:hidden —— preserve-3d 配 overflow 会让
   Chromium 的命中测试与绘制位置错位（1.9.1 胶片踩过）。
   裁剪交给外层 .bh-flow。
   ⚠⚠ 也绝不能要 preserve-3d：实测本机 Chromium 在 perspective +
      preserve-3d 的容器里，子元素带 -3.5°~-0.5° 的小负 rotateY 时
      命中测试整体退化到父级（elementFromPoint 返回 .bh-flow__space、
      真实鼠标也点不到），|ry|≥4° 与 ry≥0 都正常，与位置/z 无关。
      书架第二列（ry=-2.5）和星图一颗（ry=-0.8）正是踩在这个区间里。
      节点全是叶子、没有 3D 子孙，根本不需要共享 3D 上下文 —— 改成 flat
      之后命中测试全绿，透视照旧生效（z=200 实测放大量 1.154）。
      代价是兄弟节点按 DOM 序遮挡而非真 3D 相交：六套姿态逐一量过，
      要么不重叠，要么 DOM 序恰好等于纵深序（胶片越靠外 z 越大、序号也越大）。 */
.bh-flow__space {
  position: absolute;
  inset: 0;
  perspective: 1500px;
  perspective-origin: 50% 50%;
  transform-style: flat;
}

/* ---- 节点：统一变换模型 ---- */
.bh-flow__node {
  position: absolute;
  left: 50%;
  top: 50%;
  width: var(--nw);
  height: var(--nh);
  margin: calc(var(--nh) / -2) 0 0 calc(var(--nw) / -2);
  display: block;
  overflow: hidden;
  color: var(--bh-card-ink);
  background: rgba(12, 18, 28, 0.92);
  border: 1px solid rgba(56, 217, 255, 0.16);
  box-shadow: 0 10px 26px rgba(0, 0, 0, 0.45);
  transform:
    translate3d(var(--x, 0px), var(--y, 0px), var(--z, 0px))
    rotateX(var(--rx, 0deg))
    rotateY(var(--ry, 0deg))
    rotateZ(var(--rz, 0deg))
    scale(var(--s, 1));
  /* ⚠ 函数顺序写死，六套姿态必须原样复用这一串 —— 顺序一变，
     transition 就无法在两种姿态之间插值，会退化成瞬变。
   ⚠ 缓动 0.78s + 每节点 14ms 错峰：同时动像整块平移，错峰才像
     一串卡片各自归位。
   ⚠ 宽/高/边距也在过渡里：书脊（窄高）、站点、星点这些形态是
     纯 CSS 按 [data-lay] 换的，尺寸变化跟变换一起动画，不是跳变。 */
  transition:
    transform 0.78s cubic-bezier(0.22, 0.61, 0.36, 1),
    width 0.78s cubic-bezier(0.22, 0.61, 0.36, 1),
    height 0.78s cubic-bezier(0.22, 0.61, 0.36, 1),
    margin 0.78s cubic-bezier(0.22, 0.61, 0.36, 1),
    opacity 0.5s ease,
    border-color 0.24s, box-shadow 0.28s, background-color 0.24s;
  transition-delay: calc(var(--i, 0) * 14ms);
  will-change: transform;
  outline: none;
}
/* 转盘慢转期间：--spin 每帧都在变，过渡会让它一直追不上、转起来一顿一顿。
   给它关掉过渡直接设值；切到别套姿态时移除这个类，过渡恢复，
   从当前位置（含 spin）继续插值到新姿态 —— 模型一致，插值仍然成立。 */
.bh-flow__node.is-spinning {
  transition: none;
}
.bh-flow__node:hover,
.bh-flow__node:focus-visible {
  border-color: rgba(56, 217, 255, 0.44);
  background: rgba(16, 24, 36, 0.96);
}
.bh-flow__node.is-focus {
  z-index: 5;
  border-color: rgba(56, 217, 255, 0.66);
  background: rgba(18, 28, 42, 0.97);
  box-shadow:
    0 0 0 1px rgba(56, 217, 255, 0.22),
    0 0 26px rgba(56, 217, 255, 0.24),
    0 12px 30px rgba(0, 0, 0, 0.5);
}
.bh-flow__nd-img {
  position: relative;
  display: block;
  height: calc(var(--nh) * 0.58);
  overflow: hidden;
  background: rgba(8, 13, 20, 0.9);
}
.bh-flow__nd-img img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: left center;
  filter: grayscale(0.45) sepia(0.12) hue-rotate(158deg) saturate(0.82) brightness(0.7);
  transition: filter 0.3s, transform 0.5s;
}
.bh-flow__node:hover .bh-flow__nd-img img,
.bh-flow__node.is-focus .bh-flow__nd-img img { filter: none; }
.bh-flow__node.is-focus .bh-flow__nd-img img { transform: scale(1.04); }
.bh-flow__nd-scan {
  position: absolute;
  left: 0;
  right: 0;
  top: -2px;
  height: 2px;
  background: linear-gradient(90deg, transparent, rgba(56, 217, 255, 0.9), transparent);
  opacity: 0;
}
.bh-flow__node.is-focus .bh-flow__nd-scan {
  opacity: 1;
  animation: bh-flow-scan 1.9s ease-out infinite;
}
@keyframes bh-flow-scan {
  0% { transform: translateY(0); opacity: 0; }
  25% { opacity: 1; }
  100% { transform: translateY(calc(var(--nh) * 0.58)); opacity: 0; }
}
.bh-flow__nd-no {
  position: absolute;
  left: 5px;
  top: 4px;
  z-index: 2;
  padding: 1px 3px;
  font-family: var(--bh-mono);
  font-size: 10px;
  line-height: 1;
  letter-spacing: 0.12em;
  color: rgba(56, 217, 255, 0.85);
  background: rgba(6, 10, 16, 0.78);
  font-variant-numeric: tabular-nums;
}
.bh-flow__nd-ch {
  position: absolute;
  right: 5px;
  top: 4px;
  z-index: 2;
  padding: 1px 4px;
  font-family: var(--bh-mono);
  font-size: 10px;
  line-height: 1;
  letter-spacing: 0.04em;
  color: #06121a;
  background: rgba(56, 217, 255, 0.86);
}
.bh-flow__nd-t {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  padding: 4px 7px 0;
  font-size: 11px;
  line-height: 1.32;
  color: var(--bh-card-dim);
  transition: color 0.2s;
}
.bh-flow__node.is-focus .bh-flow__nd-t { color: var(--bh-card-ink); }

/* ---- 星图连线：跟着节点当前位置一起变形 ---- */
.bh-flow__link {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 100px;
  height: 2px;
  margin-top: -1px;
  transform-origin: 0 50%;
  background: linear-gradient(90deg, rgba(56, 217, 255, 0.5), rgba(56, 217, 255, 0.12));
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.5s ease, transform 0.78s cubic-bezier(0.22, 0.61, 0.36, 1);
  transition-delay: calc(var(--i, 0) * 14ms);
}
.bh-flow__link.is-on { opacity: 1; }

/* ---- 圆心详情窗：只在转盘姿态出现 ---- */
.bh-flow__hub {
  position: absolute;
  left: 50%;
  top: 50%;
  z-index: 3;
  width: calc(var(--size) * 0.4);
  margin-left: calc(var(--size) * -0.2);
  margin-top: -84px;
  padding: 14px 16px 13px;
  background: linear-gradient(180deg, rgba(11, 20, 31, 0.97), rgba(6, 12, 19, 0.98));
  border: 1px solid rgba(56, 217, 255, 0.34);
  box-shadow: 0 0 0 1px rgba(56, 217, 255, 0.1), 0 30px 70px -40px rgba(56, 217, 255, 0.6);
  opacity: 0;
  transform: scale(0.94);
  pointer-events: none;
  transition: opacity 0.5s ease, transform 0.62s cubic-bezier(0.22, 0.61, 0.36, 1);
  transition-delay: 0.1s;
}
.bh-flow__hub.is-on {
  opacity: 1;
  transform: scale(1);
  pointer-events: auto;
}
.bh-flow__hub-meta {
  display: flex;
  align-items: center;
  gap: 7px;
  font-family: var(--bh-mono);
  font-size: 10.5px;
  line-height: 1;
  letter-spacing: 0.08em;
  color: var(--bh-arc-dim);
}
.bh-flow__hub-meta b { color: var(--bh-line); font-weight: 600; }
.bh-flow__hub-t {
  margin: 9px 0 7px;
  font-size: 14px;
  line-height: 1.45;
  font-weight: 650;
}
.bh-flow__hub-t a { color: #E3F0FA; text-decoration: none; }
.bh-flow__hub-t a:hover { color: var(--bh-line); }
.bh-flow__hub-ex {
  margin: 0;
  font-size: 12px;
  line-height: 1.6;
  color: var(--bh-arc-dim);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.bh-flow__hub-foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-top: 11px;
  padding-top: 9px;
  border-top: 1px solid var(--bh-arc-line);
  font-family: var(--bh-mono);
  font-size: 10.5px;
  letter-spacing: 0.14em;
  color: var(--bh-arc-dim);
}
.bh-flow__open { color: var(--bh-line); text-decoration: none; font-weight: 600; }
.bh-flow__open:hover { text-decoration: underline; }

/* ---- 2080 表面：圆心窗的角标断线 + 光台投影 + 数据流读数 ----
   与五套场景 hero 同一套语言（转盘 1.9.4 语言化） */
.bh-flow__hub::before, .bh-flow__hub::after {
  content: ''; position: absolute; width: 13px; height: 13px; pointer-events: none;
}
.bh-flow__hub::before { left: -1px; top: -1px; border-left: 2px solid rgba(63, 217, 255, 0.85); border-top: 2px solid rgba(63, 217, 255, 0.85); }
.bh-flow__hub::after { right: -1px; bottom: -1px; border-right: 2px solid rgba(63, 217, 255, 0.85); border-bottom: 2px solid rgba(63, 217, 255, 0.85); }
.bh-flow__hub-light {
  position: absolute; left: 6%; right: 6%; bottom: -14px; height: 13px;
  background: radial-gradient(50% 100% at 50% 0%, rgba(63, 217, 255, 0.24), transparent 72%);
  pointer-events: none; opacity: 0; transition: opacity 0.5s ease 0.1s;
}
.bh-flow__hub.is-on .bh-flow__hub-light { opacity: 1; }
.bh-flow__hub-stream {
  display: block; overflow: hidden; height: 11px; margin-top: 8px; opacity: 0.5;
  -webkit-mask: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent);
  mask: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent);
}
.bh-flow__hub-stream i {
  display: inline-block; white-space: nowrap; font-style: normal;
  font-family: var(--bh-mono); font-size: 10.5px; letter-spacing: 0.2em;
  color: rgba(63, 217, 255, 0.75);
  animation: bh-stream 11s linear infinite;
}
.bh-flow__hub:hover .bh-flow__hub-stream i { animation-duration: 2.4s; }
@media (prefers-reduced-motion: reduce) {
  .bh-flow__hub-stream i { animation-duration: 40s !important; }
}

/* ---- 详情窗配图：默认收起，主角姿态（书架/走廊/星图/甲板）展开 ----
   转盘的圆心窗与胶片的下方详情区不带图 —— 前者要紧凑，后者的图就在当前帧上 */
.bh-flow__hub-img {
  display: none;
  position: relative; /* 图位上的透明链接以它为基准铺满 */
  height: calc(var(--size) * 0.20);
  margin: -14px -16px 10px;
  overflow: hidden;
  background: rgba(8, 13, 20, 0.9);
}
/* 图位＝链接：整块盖一层透明 <a>，点图跟点标题走同一个 href（JS 在 setFocus 里同步）。
   不用"给 <img> 包一层 <a>"是怕打乱 paintHero 里 insertBefore 的位置逻辑。 */
.bh-flow__hub-img > .bh-flow__hub-hit,
.bh-holo-hero__img > .bh-holo-hero__hit {
  position: absolute;
  inset: 0;
  z-index: 3;
  display: block;
}
.bh-flow__hub-img img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: left center;
  filter: grayscale(0.35) sepia(0.1) hue-rotate(158deg) saturate(0.85) brightness(0.78);
}

/* ============================================================
   六姿态角色分化（2026-10-18b，欢哥：「除了转盘，剩下 5 个布局
   还不如第一版」）—— 1.9.2 把五套姿态做成了 8 张同尺寸小卡摆位，
   丢了第一版"主角-配角"的复合结构。本段把角色还回来：
     hub = 每套布局的主角详情位（转盘圆心 / 书架左侧大卡 /
           走廊上方大卡 / 星图右下窗 / 甲板右侧窗 / 胶片下方详情区）
     节点 = 配角，按姿态换形态（书脊 / 站点 / 星点 / 胶片帧 / 甲板块）
   位姿仍走统一变换链（切换照样连续插值飞过去），形态是纯 CSS
   按 [data-lay] 换 —— JS 只搬变量，不碰样式。
   全部收在 ≥901 里：单栏强制转盘，不吃这些形态。 */
@media (min-width: 901px) {

  /* ---- 书架：hub=左侧主角大卡，节点=右侧一排竖脊书 ---- */
  .bh-flow[data-lay="shelf"] .bh-flow__hub {
    left: 3.5%;
    top: 50%;
    margin: 0;
    width: calc(var(--size) * 0.345);
    transform: translateY(-50%) scale(0.96);
  }
  .bh-flow[data-lay="shelf"] .bh-flow__hub.is-on { transform: translateY(-50%) scale(1); }
  .bh-flow[data-lay="shelf"] .bh-flow__hub-img { display: block; height: calc(var(--size) * 0.21); }
  .bh-flow[data-lay="shelf"] .bh-flow__hub-t { font-size: 15px; }
  .bh-flow[data-lay="shelf"] .bh-flow__hub-ex { -webkit-line-clamp: 3; }

  .bh-flow[data-lay="shelf"] .bh-flow__node {
    /* 书脊：窄高盒子（692 尺寸下 54×298），位姿让 8 本依次搭在一起 */
    width: calc(var(--size) * 0.078);
    height: calc(var(--size) * 0.43);
    margin: calc(var(--size) * -0.215) 0 0 calc(var(--size) * -0.039);
    background: linear-gradient(180deg, rgba(16, 26, 40, 0.96), rgba(9, 15, 24, 0.97));
    border-color: rgba(56, 217, 255, 0.22);
  }
  .bh-flow[data-lay="shelf"] .bh-flow__nd-img,
  .bh-flow[data-lay="shelf"] .bh-flow__nd-ch { display: none; }
  .bh-flow[data-lay="shelf"] .bh-flow__nd-no {
    position: static;
    display: block;
    padding: 9px 0 0;
    background: none;
    text-align: center;
    font-size: 10.5px;
  }
  .bh-flow[data-lay="shelf"] .bh-flow__nd-t {
    /* 书名竖排：中文书脊从右起列，与第一版一致 */
    display: block;
    -webkit-line-clamp: unset;
    -webkit-box-orient: unset;
    position: absolute;
    top: 32px;
    bottom: 12px;
    left: 6px;
    right: 6px;
    padding: 0;
    writing-mode: vertical-rl;
    font-size: 11px;
    line-height: 1.5;
    letter-spacing: 0.05em;
    overflow: hidden;
  }
  .bh-flow[data-lay="shelf"] .bh-flow__node.is-focus {
    background: linear-gradient(180deg, rgba(20, 34, 52, 0.98), rgba(10, 18, 28, 0.98));
    border-color: rgba(56, 217, 255, 0.6);
  }

  /* ---- 走廊：hub=上方大详情卡，节点=下方站台线上的 8 个站点 ---- */
  .bh-flow[data-lay="cor"] .bh-flow__hub {
    left: 50%;
    top: 10px;
    margin: 0;
    width: min(620px, 74%);
    transform: translateX(-50%) scale(0.96);
  }
  .bh-flow[data-lay="cor"] .bh-flow__hub.is-on { transform: translateX(-50%) scale(1); }
  .bh-flow[data-lay="cor"] .bh-flow__hub-img { display: block; height: calc(var(--size) * 0.185); }

  .bh-flow[data-lay="cor"] .bh-flow__node {
    /* 站点：无框透明，顶一条站台线 + 菱形刻度，大编号 + 频道 + 标题 */
    width: calc(var(--size) * 0.16);
    height: calc(var(--size) * 0.15);
    margin: calc(var(--size) * -0.075) 0 0 calc(var(--size) * -0.08);
    background: transparent;
    border: 0;
    border-top: 1px solid rgba(56, 217, 255, 0.3);
    border-radius: 0;
    box-shadow: none;
    overflow: visible;
    padding-top: 9px;
  }
  .bh-flow[data-lay="cor"] .bh-flow__node::before {
    content: '';
    position: absolute;
    left: 50%;
    top: -3.5px;
    width: 6px;
    height: 6px;
    margin-left: -3px;
    transform: rotate(45deg);
    background: rgba(56, 217, 255, 0.55);
  }
  .bh-flow[data-lay="cor"] .bh-flow__nd-img { display: none; }
  .bh-flow[data-lay="cor"] .bh-flow__nd-no {
    position: static;
    display: block;
    padding: 0;
    background: none;
    font-size: 21px;
    letter-spacing: 0.05em;
    color: rgba(227, 240, 250, 0.55);
  }
  .bh-flow[data-lay="cor"] .bh-flow__nd-ch {
    position: static;
    display: block;
    padding: 3px 0 0;
    background: none;
    font-size: 10.5px;
    color: var(--bh-arc-dim);
  }
  .bh-flow[data-lay="cor"] .bh-flow__nd-t { padding: 3px 0 0; color: var(--bh-card-dim); }
  .bh-flow[data-lay="cor"] .bh-flow__node.is-focus {
    background: transparent;
    box-shadow: none;
    border-top-color: rgba(56, 217, 255, 0.85);
  }
  .bh-flow[data-lay="cor"] .bh-flow__node.is-focus::before { background: var(--bh-line); }
  .bh-flow[data-lay="cor"] .bh-flow__node.is-focus .bh-flow__nd-no { color: var(--bh-line); }
  .bh-flow[data-lay="cor"] .bh-flow__node.is-focus .bh-flow__nd-t { color: var(--bh-card-ink); }

  /* ---- 星图：hub=右下详情窗（预置坐标已避开右下象限），节点=光点+星名 ---- */
  .bh-flow[data-lay="stars"] .bh-flow__hub {
    left: auto;
    right: 3%;
    top: auto;
    bottom: 4%;
    margin: 0;
    width: calc(var(--size) * 0.32);
  }
  .bh-flow[data-lay="stars"] .bh-flow__hub-img { display: block; height: calc(var(--size) * 0.115); margin-bottom: 8px; }
  .bh-flow[data-lay="stars"] .bh-flow__hub-ex { -webkit-line-clamp: 3; }

  .bh-flow[data-lay="stars"] .bh-flow__node {
    display: flex;
    align-items: center;
    width: calc(var(--size) * 0.245);
    height: 36px;
    margin: -18px 0 0 calc(var(--size) * -0.1225);
    background: transparent;
    border: 0;
    box-shadow: none;
    overflow: visible;
    padding-left: 22px;
  }
  .bh-flow[data-lay="stars"] .bh-flow__node::before {
    content: '';
    position: absolute;
    left: 4px;
    top: 50%;
    width: 11px;
    height: 11px;
    margin: -5.5px 0 0 -5.5px;
    border-radius: 50%;
    background: #39d9ff;
    box-shadow: 0 0 14px rgba(56, 217, 255, 0.85);
  }
  .bh-flow[data-lay="stars"] .bh-flow__nd-img { display: none; }
  .bh-flow[data-lay="stars"] .bh-flow__nd-no {
    position: static;
    flex: 0 0 auto;
    padding: 0;
    background: none;
    font-size: 10.5px;
    color: rgba(56, 217, 255, 0.75);
  }
  .bh-flow[data-lay="stars"] .bh-flow__nd-ch {
    position: static;
    flex: 0 0 auto;
    padding: 0 0 0 6px;
    background: none;
    font-size: 10.5px;
    color: var(--bh-arc-dim);
  }
  .bh-flow[data-lay="stars"] .bh-flow__nd-t {
    display: block;
    -webkit-line-clamp: 1;
    padding: 0 0 0 7px;
    font-size: 11px;
    line-height: 1.3;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    color: rgba(200, 226, 244, 0.8);
  }
  .bh-flow[data-lay="stars"] .bh-flow__node.is-focus { background: transparent; box-shadow: none; }
  .bh-flow[data-lay="stars"] .bh-flow__node.is-focus::before { box-shadow: 0 0 22px rgba(56, 217, 255, 1); }
  .bh-flow[data-lay="stars"] .bh-flow__node.is-focus .bh-flow__nd-t { color: #E3F0FA; }

  /* ---- 胶片：节点保持卡片形态（帧就是图），hub=下方详情区（不带图） ---- */
  .bh-flow[data-lay="film"] .bh-flow__hub {
    left: 50%;
    top: auto;
    bottom: 3.5%;
    margin: 0;
    width: min(600px, 66%);
    transform: translateX(-50%) scale(0.96);
  }
  .bh-flow[data-lay="film"] .bh-flow__hub.is-on { transform: translateX(-50%) scale(1); }
  .bh-flow[data-lay="film"] .bh-flow__hub-ex { -webkit-line-clamp: 2; }

  /* ---- 甲板：节点保持卡片形态（正立，倾斜感由背景网格承担），
          hub=右侧详情窗，浮在甲板右缘上（与第一版一致） ---- */
  .bh-flow[data-lay="iso"] .bh-flow__hub {
    left: auto;
    right: 3%;
    top: 50%;
    margin: 0;
    width: calc(var(--size) * 0.315);
    transform: translateY(-50%) scale(0.96);
  }
  .bh-flow[data-lay="iso"] .bh-flow__hub.is-on { transform: translateY(-50%) scale(1); }
  .bh-flow[data-lay="iso"] .bh-flow__hub-img { display: block; height: calc(var(--size) * 0.16); }
  .bh-flow[data-lay="iso"] .bh-flow__hub-ex { -webkit-line-clamp: 3; }

  /* ---- 步进按钮：非转盘姿态从圆心窗两侧挪到右上角（圆心位姿只剩
          转盘在用；书架的书脊、走廊的站台、胶片的帧都路过舞台中部，
          按钮摆正中就是 1.9.2 踩过的"压节点"） ---- */
  .bh-flow[data-lay]:not([data-lay="dial"]) .bh-flow__step {
    top: 14px;
    margin-top: 0;
  }
  .bh-flow[data-lay]:not([data-lay="dial"]) .bh-flow__step--prev { left: auto; right: 78px; }
  .bh-flow[data-lay]:not([data-lay="dial"]) .bh-flow__step--next { left: auto; right: 38px; }
}

/* ---- 背景六层：交叉淡入，不是硬切 ---- */
.bh-flow__amb { position: absolute; inset: 0; pointer-events: none; }
.bh-flow__amb > * {
  position: absolute;
  inset: 0;
  opacity: 0;
  transition: opacity 0.72s ease;
}
.bh-flow__amb > .is-on { opacity: 1; }
.bh-flow__amb-ring {
  background: repeating-conic-gradient(from 0deg at 50% 50%,
    rgba(56, 217, 255, 0.2) 0 0.35deg, transparent 0.35deg 3deg);
  -webkit-mask: radial-gradient(circle at 50% 50%,
    transparent calc(var(--size) * 0.33), #000 calc(var(--size) * 0.34),
    #000 calc(var(--size) * 0.46), transparent calc(var(--size) * 0.47));
  mask: radial-gradient(circle at 50% 50%,
    transparent calc(var(--size) * 0.33), #000 calc(var(--size) * 0.34),
    #000 calc(var(--size) * 0.46), transparent calc(var(--size) * 0.47));
  animation: bh-flow-spin 90s linear infinite;
}
.bh-flow__amb-line {
  background: repeating-linear-gradient(90deg, rgba(56, 217, 255, 0.16) 0 1px, transparent 1px 78px);
  -webkit-mask: linear-gradient(180deg, transparent 52%, #000 78%, #000 100%);
  mask: linear-gradient(180deg, transparent 52%, #000 78%, #000 100%);
}
.bh-flow__amb-tunnel {
  background:
    repeating-linear-gradient(0deg, rgba(56, 217, 255, 0.14) 0 1px, transparent 1px 64px),
    repeating-linear-gradient(90deg, rgba(56, 217, 255, 0.1) 0 1px, transparent 1px 96px);
  transform: perspective(420px) rotateX(64deg) scale(1.9);
  transform-origin: 50% 84%;
  -webkit-mask: linear-gradient(180deg, transparent 12%, #000 62%, #000 100%);
  mask: linear-gradient(180deg, transparent 12%, #000 62%, #000 100%);
}
.bh-flow__amb-stars {
  background-image:
    radial-gradient(1.5px 1.5px at 12% 22%, rgba(56, 217, 255, 0.8), transparent),
    radial-gradient(1.2px 1.2px at 28% 68%, rgba(190, 230, 255, 0.6), transparent),
    radial-gradient(1.6px 1.6px at 44% 14%, rgba(56, 217, 255, 0.7), transparent),
    radial-gradient(1.1px 1.1px at 62% 74%, rgba(190, 230, 255, 0.55), transparent),
    radial-gradient(1.5px 1.5px at 76% 26%, rgba(56, 217, 255, 0.75), transparent),
    radial-gradient(1.2px 1.2px at 88% 62%, rgba(190, 230, 255, 0.5), transparent),
    radial-gradient(1.1px 1.1px at 18% 88%, rgba(56, 217, 255, 0.45), transparent),
    radial-gradient(1.4px 1.4px at 68% 46%, rgba(190, 230, 255, 0.6), transparent);
}
.bh-flow__amb-deck {
  background:
    repeating-linear-gradient(90deg, rgba(56, 217, 255, 0.16) 0 1px, transparent 1px 92px),
    repeating-linear-gradient(0deg, rgba(56, 217, 255, 0.16) 0 1px, transparent 1px 76px);
  transform: perspective(760px) rotateX(58deg) scale(1.5);
  transform-origin: 50% 96%;
  -webkit-mask: linear-gradient(180deg, transparent 30%, #000 66%, #000 100%);
  mask: linear-gradient(180deg, transparent 30%, #000 66%, #000 100%);
}
.bh-flow__amb-frame {
  background: linear-gradient(180deg, rgba(56, 217, 255, 0.05), transparent 22%, transparent 78%, rgba(56, 217, 255, 0.05));
  box-shadow: inset 0 0 0 1px rgba(120, 200, 255, 0.13), inset 0 0 90px rgba(56, 217, 255, 0.06);
}
@keyframes bh-flow-spin { to { transform: rotate(360deg); } }

/* ---- 地平线：唯一始终存在的一条光，位置随布局变 ---- */
.bh-flow__horizon {
  position: absolute;
  left: 0;
  right: 0;
  top: 50%;
  height: 1px;
  background: linear-gradient(90deg, transparent,
    rgba(56, 217, 255, 0.42) 22%, rgba(56, 217, 255, 0.62) 50%,
    rgba(56, 217, 255, 0.42) 78%, transparent);
  box-shadow: 0 0 22px rgba(56, 217, 255, 0.4);
  transition: top 0.92s cubic-bezier(0.22, 0.61, 0.36, 1), opacity 0.6s;
  pointer-events: none;
}

/* ---- 左右步进：贴在圆心窗两侧 ----
   ⚠ 不能把这一对按钮摆在舞台正中：它们 z-index 高于卡片，压在盘心就会把
      路过盘心的那张卡整个盖掉（书架姿态实测左右各有一张点不到）。
      位置跟圆心窗走 —— 窗宽 calc(var(--size) * 0.4)，两边各让 26px。 */
.bh-flow__ctrl {
  position: absolute;
  inset: 0;
  z-index: 6;
  pointer-events: none;
}
.bh-flow__step {
  position: absolute;
  top: 50%;
  margin-top: -15px;
  pointer-events: auto;
  width: 30px;
  height: 30px;
  padding: 0;
  border: 1px solid rgba(56, 217, 255, 0.34);
  border-radius: 50%;
  background: rgba(8, 14, 22, 0.9);
  color: var(--bh-line);
  font-size: 17px;
  line-height: 1;
  cursor: pointer;
  transition: border-color 0.2s, background-color 0.2s, transform 0.2s;
}
.bh-flow__step--prev { left: calc(50% - var(--size) * 0.2 - 26px - 15px); }
.bh-flow__step--next { left: calc(50% + var(--size) * 0.2 + 26px - 15px); }
.bh-flow__step:hover {
  border-color: rgba(56, 217, 255, 0.7);
  background: rgba(14, 24, 36, 0.96);
  transform: scale(1.06);
}
.bh-flow__step:focus-visible {
  outline: 2px solid rgba(56, 217, 255, 0.5);
  outline-offset: 2px;
}

/* ---- 901~1180：顶栏下面多一条 34px 的横带切换器，场景高度必须同步收 ---- */
@media (min-width: 901px) and (max-width: 1180px) {
  .bh-flow {
    height: min(700px, calc(100vh - 242px));
    --size: min(700px, calc(100vw - 300px), calc(100vh - 242px));
  }
}

/* ---- 单栏：强制转盘，节点缩小 ---- */
@media (max-width: 900px) {
  .bh-flow {
    --size: min(560px, calc(100vw - 40px), calc(100vh - 180px));
    --nw: calc(var(--size) * 0.26);
    --nh: calc(var(--size) * 0.19);
    height: min(560px, calc(100vh - 180px));
  }
  .bh-flow__hub {
    width: calc(var(--size) * 0.56);
    margin-left: calc(var(--size) * -0.28);
    margin-top: -62px;
    padding: 11px 12px;
  }
  .bh-flow__hub-ex { display: none; }
  .bh-flow__hub-t { font-size: 13px; margin: 7px 0 6px; }
}

@media (prefers-reduced-motion: reduce) {
  .bh-flow__node,
  .bh-flow__link,
  .bh-flow__amb > *,
  .bh-flow__hub,
  .bh-flow__horizon {
    transition-duration: 0.01s !important;
    transition-delay: 0s !important;
  }
  .bh-flow__amb-ring { animation: none; }
  .bh-flow__node.is-focus .bh-flow__nd-scan { animation: none; }
}

/* ============================================================
   2080 场景（方案 A「全息重构」，2026-10-18 深夜欢哥拍板）
   方案 A：每套陈列独立 DOM —— hero 服务端渲染（无 JS 也有内容）、
   配角 JS 拿节点 data-* 现搭，表面用 2080 设计语言重做：
   01 光台投影（卡脚光锥/光带）02 角标断线边框（四角 L 标）
   03 景深雾（远景降透明降饱和）04 数据流读数（卡脚 hex 流，hover 加速）
   切换 = 投影重组（光扫 + 交叉溶解），不再强求统一变换模型的连续
   插值 —— 那是把布局表达力换掉换来的。
   ⚠ 场景层盖在 .bh-flow__space 之上；scene 模式下转盘整层淡出，
     1.9.3 的姿态/形态规则全部不用删（层不可见即失效）。
   ⚠ 场景只存在于 ≥901：单栏强制转盘。
   ============================================================ */
.bh-scenes { display: none; }
@media (min-width: 901px) {
  .bh-flow__space { transition: opacity 0.45s ease; }
  .bh-flow__ctrl { transition: opacity 0.3s ease; }
  .bh-flow[data-mode="scene"] .bh-flow__space { opacity: 0; pointer-events: none; }
  .bh-flow[data-mode="scene"] .bh-flow__step { opacity: 0; pointer-events: none; }

  .bh-scenes {
    display: block;
    position: absolute;
    inset: 0;
    z-index: 4;
    pointer-events: none;
  }
  .bh-scene {
    position: absolute;
    inset: 0;
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.4s ease, visibility 0s linear 0.4s;
  }
  .bh-scene.is-on {
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
    transition: opacity 0.45s ease;
  }
  /* 光扫重组：进场时一道斜光扫过整个场景 */
  .bh-scene::after {
    content: '';
    position: absolute;
    inset: 0;
    background: linear-gradient(100deg, transparent 32%, rgba(63, 217, 255, 0.12) 46%, rgba(227, 240, 250, 0.2) 50%, rgba(63, 217, 255, 0.12) 54%, transparent 68%);
    transform: translateX(-110%);
    pointer-events: none;
  }
  .bh-scene.is-on::after { animation: bh-sweep 0.95s cubic-bezier(0.22, 0.61, 0.36, 1) 0.05s 1 both; }
  @keyframes bh-sweep { to { transform: translateX(110%); } }

  /* ---- 书架：hero 全息主角卡 + 光台上的横放书堆 ---- */
  .bh-scene[data-scene="shelf"] {
    display: flex;
    align-items: stretch;
    gap: 28px;
    padding: 20px 24px 26px;
  }
  .bh-holo-hero {
    position: relative;
    flex: 0 0 30%;
    min-width: 0;
    display: flex;
    flex-direction: column;
    padding: 13px 13px 11px;
    background: linear-gradient(180deg, rgba(13, 23, 35, 0.94), rgba(9, 16, 26, 0.96));
    border: 1px solid rgba(63, 217, 255, 0.14);
    box-shadow: 0 20px 44px rgba(0, 0, 0, 0.45);
  }
  /* 01 光台投影：主角卡脚下的一线光 */
  .bh-holo-hero::after {
    content: '';
    position: absolute;
    left: 4%;
    right: 4%;
    bottom: -15px;
    height: 14px;
    background: radial-gradient(50% 100% at 50% 0%, rgba(63, 217, 255, 0.22), transparent 72%);
    pointer-events: none;
  }
  /* 02 角标断线边框：四角 L 标是实的，整框只留极淡一条 */
  .bh-holo-hero .bh-corn { position: absolute; width: 13px; height: 13px; pointer-events: none; }
  .bh-holo-hero .bh-corn:nth-of-type(1) { left: -1px; top: -1px; border-left: 2px solid rgba(63, 217, 255, 0.85); border-top: 2px solid rgba(63, 217, 255, 0.85); }
  .bh-holo-hero .bh-corn:nth-of-type(2) { right: -1px; top: -1px; border-right: 2px solid rgba(63, 217, 255, 0.85); border-top: 2px solid rgba(63, 217, 255, 0.85); }
  .bh-holo-hero .bh-corn:nth-of-type(3) { left: -1px; bottom: -1px; border-left: 2px solid rgba(63, 217, 255, 0.85); border-bottom: 2px solid rgba(63, 217, 255, 0.85); }
  .bh-holo-hero .bh-corn:nth-of-type(4) { right: -1px; bottom: -1px; border-right: 2px solid rgba(63, 217, 255, 0.85); border-bottom: 2px solid rgba(63, 217, 255, 0.85); }
  .bh-holo-hero__img { position: relative; display: block; height: 42%; overflow: hidden; background: rgba(8, 13, 20, 0.9); }
  .bh-holo-hero__img img {
    display: block; width: 100%; height: 100%;
    object-fit: cover; object-position: left center;
    filter: grayscale(0.35) sepia(0.1) hue-rotate(158deg) saturate(0.85) brightness(0.8);
    transition: filter 0.3s;
  }
  .bh-holo-hero:hover .bh-holo-hero__img img { filter: none; }
  .bh-holo-hero.is-refresh .bh-holo-hero__img img { animation: bh-hero-img 0.5s ease 1; }
  @keyframes bh-hero-img { 0% { opacity: 0.35; } 100% { opacity: 1; } }
  .bh-holo-scan {
    position: absolute; left: 0; right: 0; top: -2px; height: 2px;
    background: linear-gradient(90deg, transparent, rgba(63, 217, 255, 0.9), transparent);
    opacity: 0;
  }
  .bh-scene.is-on .bh-holo-scan, .bh-holo-hero.is-refresh .bh-holo-scan { animation: bh-holo-scan 1.5s ease-out 1; }
  @keyframes bh-holo-scan { 0% { opacity: 0; top: 0; } 12% { opacity: 0.9; } 92% { opacity: 0.9; } 100% { opacity: 0; top: 100%; } }
  .bh-holo-hero__meta { display: flex; align-items: center; gap: 7px; margin-top: 10px; font-family: var(--bh-mono); font-size: 10.5px; line-height: 1; letter-spacing: 0.08em; color: var(--bh-arc-dim); }
  .bh-holo-hero__meta b { color: var(--bh-line); font-weight: 600; }
  .bh-holo-hero__t { margin: 8px 0 6px; font-size: 15px; line-height: 1.45; font-weight: 650; }
  .bh-holo-hero__t a { color: #E3F0FA; text-decoration: none; }
  .bh-holo-hero__t a:hover { color: var(--bh-line); }
  .bh-holo-hero__ex {
    margin: 0; flex: 1 1 auto; min-height: 0;
    font-size: 12px; line-height: 1.62; color: var(--bh-arc-dim);
    display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
  }
  .bh-holo-hero__foot {
    display: flex; align-items: center; justify-content: space-between;
    margin-top: 9px; padding-top: 8px; border-top: 1px solid var(--bh-arc-line);
    font-family: var(--bh-mono); font-size: 10.5px; letter-spacing: 0.14em; color: var(--bh-arc-dim);
  }
  .bh-holo-open { color: var(--bh-line); text-decoration: none; font-weight: 600; }
  .bh-holo-open:hover { text-decoration: underline; }
  /* 04 数据流读数：卡脚 hex 流，hover 加速 —— 机器在呼吸 */
  .bh-holo-stream {
    display: block; overflow: hidden; height: 12px; margin-top: 8px; opacity: 0.55;
    -webkit-mask: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent);
    mask: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent);
  }
  .bh-holo-stream i {
    display: inline-block; white-space: nowrap; font-style: normal;
    font-family: var(--bh-mono); font-size: 10.5px; letter-spacing: 0.2em;
    color: rgba(63, 217, 255, 0.75);
    animation: bh-stream 11s linear infinite;
  }
  .bh-holo-hero:hover .bh-holo-stream i { animation-duration: 2.4s; }
  @keyframes bh-stream { to { transform: translateX(-50%); } }

  .bh-rack {
    position: relative; flex: 1 1 auto; min-width: 0;
    display: flex; flex-direction: column; justify-content: center; align-items: stretch;
    gap: 7px; padding: 4px 8px 18px;
  }
  /* 堆脚光台：最底下那本书压着的一线光 */
  .bh-rack::after {
    content: ''; position: absolute; left: 2%; right: 2%; bottom: 12px; height: 10px;
    background: radial-gradient(50% 100% at 50% 50%, rgba(63, 217, 255, 0.18), transparent 72%);
    pointer-events: none;
  }
  /* 横放书堆：每本一条横壳，书脊朝左、页口朝右，书名横排 */
  .bh-book {
    position: relative; flex: 0 0 auto;
    height: calc(var(--size) * 0.052);
    display: flex; align-items: center; gap: 12px;
    padding: 0 16px 0 14px;
    background: linear-gradient(180deg, rgba(23, 49, 74, 0.92), rgba(10, 22, 35, 0.95));
    border: 1px solid rgba(63, 217, 255, 0.16);
    text-decoration: none;
    transition: transform 0.38s cubic-bezier(0.22, 0.61, 0.36, 1), border-color 0.25s, box-shadow 0.3s, opacity 0.3s, filter 0.3s;
  }
  /* 书壳厚边三色交替（书脊朝外那一条） */
  .bh-book:nth-child(3n + 1) { border-left: 8px solid rgba(63, 217, 255, 0.75); }
  .bh-book:nth-child(3n + 2) { border-left: 8px solid rgba(94, 158, 255, 0.7); }
  .bh-book:nth-child(3n)     { border-left: 8px solid rgba(151, 118, 255, 0.55); }
  /* 厚薄差：同架书不一样厚 */
  .bh-book:nth-child(2n) { height: calc(var(--size) * 0.046); }
  .bh-book:nth-child(3n) { height: calc(var(--size) * 0.057); }
  /* 03 景深雾：堆顶堆底两端的几本更淡、更不饱和 */
  .bh-book:nth-child(1), .bh-book:nth-child(8) { opacity: 0.48; filter: saturate(0.5) brightness(0.85); }
  .bh-book:nth-child(2), .bh-book:nth-child(7) { opacity: 0.68; filter: saturate(0.75); }
  .bh-book:nth-child(3), .bh-book:nth-child(6) { opacity: 0.87; }
  .bh-book b { flex: 0 0 auto; font-family: var(--bh-mono); font-weight: 500; font-size: 10.5px; letter-spacing: 0.12em; color: rgba(111, 203, 238, 0.9); }
  .bh-book__t {
    flex: 1 1 auto; min-width: 0; overflow: hidden;
    white-space: nowrap; text-overflow: ellipsis;
    font-size: 12px; line-height: 1.4; letter-spacing: 0.05em;
    color: rgba(207, 241, 255, 0.85);
  }
  .bh-book__d {
    flex: 0 0 auto; font-family: var(--bh-mono); font-size: 10.5px; letter-spacing: 0.1em;
    color: var(--bh-arc-dim); opacity: 0.7;
  }
  /* 页口纹理：右缘一排页纸 */
  .bh-book::before {
    content: ''; position: absolute; right: 0; top: 2px; bottom: 2px; width: 5px;
    background: repeating-linear-gradient(180deg, rgba(227, 240, 250, 0.14) 0 1px, transparent 1px 3px);
    pointer-events: none;
  }
  /* 抽书：hover 从堆里抽出一截，脚下光台亮起反光 */
  .bh-book::after {
    content: ''; position: absolute; left: 8%; right: 8%; bottom: -9px; height: 8px;
    background: radial-gradient(50% 100% at 50% 0%, rgba(63, 217, 255, 0.22), transparent 75%);
    pointer-events: none; opacity: 0; transition: opacity 0.3s;
  }
  .bh-book:hover, .bh-book.is-focus {
    opacity: 1; filter: none;
    transform: translateX(-14px);
    border-color: rgba(63, 217, 255, 0.7);
    box-shadow: 0 0 0 1px rgba(63, 217, 255, 0.25), 0 0 30px rgba(63, 217, 255, 0.26), 0 14px 30px rgba(0, 0, 0, 0.5);
    z-index: 2;
  }
  .bh-book:hover::after, .bh-book.is-focus::after { opacity: 1; }
  .bh-book.is-focus b { color: #9FE8FF; }

  /* ============================================================
     2080 场景 · 时间走廊（上 hero 大卡 + 下轨道站台）
     ============================================================ */
  .bh-scene[data-scene="cor"] { display: flex; flex-direction: column; gap: 10px; padding: 18px 30px 14px; }
  /* 走廊 hero：横向大卡（图左文右）。hero 六个孩子平铺变 grid 双列 ——
     标签不用动模板，纯 CSS 重排 */
  .bh-scene[data-scene="cor"] .bh-holo-hero {
    flex: 0 0 auto; height: 44%; min-height: 218px;
    display: grid;
    grid-template-columns: 290px 1fr;
    grid-template-rows: auto auto 1fr auto auto;
    grid-template-areas: "img meta" "img t" "img ex" "img foot" "img stream";
    column-gap: 18px; align-content: stretch;
  }
  .bh-scene[data-scene="cor"] .bh-holo-hero__img { grid-area: img; height: auto; }
  .bh-scene[data-scene="cor"] .bh-holo-hero__meta { grid-area: meta; margin-top: 2px; }
  .bh-scene[data-scene="cor"] .bh-holo-hero__t { grid-area: t; margin: 6px 0 0; font-size: 17px; }
  .bh-scene[data-scene="cor"] .bh-holo-hero__ex { grid-area: ex; margin-top: 6px; -webkit-line-clamp: 4; }
  .bh-scene[data-scene="cor"] .bh-holo-hero__foot { grid-area: foot; margin-top: 8px; }
  .bh-scene[data-scene="cor"] .bh-holo-stream { grid-area: stream; margin-top: 6px; }
  .bh-cor { position: relative; flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
  .bh-cor__track {
    position: relative; flex: 1 1 auto; min-height: 0;
    perspective: 900px; overflow: hidden;
  }
  /* 中轴竖光束：走廊的纵深锚点 */
  .bh-cor__track::after {
    content: ''; position: absolute; left: 50%; top: 0; width: 1px; height: 62%; margin-left: -0.5px;
    background: linear-gradient(180deg, rgba(63, 217, 255, 0.45), rgba(63, 217, 255, 0.06) 70%, transparent);
    box-shadow: 0 0 18px rgba(63, 217, 255, 0.35);
    pointer-events: none;
  }
  .bh-cor__floor {
    position: absolute; left: -10%; right: -10%; bottom: 0; height: 40%;
    transform: rotateX(74deg); transform-origin: bottom center;
    background:
      linear-gradient(180deg, rgba(63, 217, 255, 0.16), transparent 66%),
      repeating-linear-gradient(90deg, rgba(63, 217, 255, 0.24) 0 1px, transparent 1px 58px),
      repeating-linear-gradient(0deg, rgba(63, 217, 255, 0.20) 0 1px, transparent 1px 46px);
    -webkit-mask: linear-gradient(180deg, transparent, #000 26%, #000 92%, transparent);
    mask: linear-gradient(180deg, transparent, #000 26%, #000 92%, transparent);
  }
  .bh-cor__stops {
    position: absolute; left: 50%; top: 6%;
    display: flex; align-items: flex-start;
    transform-style: preserve-3d;
    transition: transform 0.5s cubic-bezier(0.22, 0.9, 0.24, 1);
  }
  .bh-cor__stop {
    position: relative; flex: 0 0 auto; width: 156px; margin-right: 6px;
    display: flex; flex-direction: column; align-items: center; gap: 9px;
    transform: translateY(var(--ty, 0px)) scale(var(--sc, 0.9));
    opacity: var(--op, 0.5);
    text-decoration: none;
    transition: transform 0.45s cubic-bezier(0.22, 0.9, 0.24, 1), opacity 0.35s;
  }
  .bh-cor__stop .num { font-family: var(--bh-mono); font-size: 26px; font-weight: 500; letter-spacing: 0.06em; line-height: 1; color: rgba(63, 217, 255, 0.28); transition: color 0.3s; }
  .bh-cor__stop .pt { width: 11px; height: 11px; border: 1px solid rgba(63, 217, 255, 0.5); transform: rotate(45deg); background: rgba(6, 10, 16, 0.9); transition: background-color 0.3s, box-shadow 0.3s; }
  .bh-cor__stop .tag { font-family: var(--bh-mono); font-size: 10.5px; letter-spacing: 0.1em; color: var(--bh-arc-dim); white-space: nowrap; transition: color 0.3s; }
  .bh-cor__stop .dl { font-family: var(--bh-mono); font-size: 10px; letter-spacing: 0.1em; color: rgba(63, 217, 255, 0.28); transition: color 0.3s; }
  .bh-cor__stop .tl {
    font-size: 11.5px; line-height: 1.4; color: var(--bh-arc-dim); text-align: center; width: 146px;
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
    opacity: 0; transition: opacity 0.3s;
  }
  .bh-cor__stop.is-on { transform: translateY(-12px) scale(1.14); opacity: 1; }
  .bh-cor__stop.is-on .num { color: var(--bh-line); }
  .bh-cor__stop.is-on .pt { background: var(--bh-line); border-color: var(--bh-line); box-shadow: 0 0 0 4px rgba(63, 217, 255, 0.12), 0 0 18px rgba(63, 217, 255, 0.8); }
  .bh-cor__stop.is-on .tag { color: rgba(63, 217, 255, 0.75); }
  .bh-cor__stop.is-on .dl { color: rgba(63, 217, 255, 0.6); }
  .bh-cor__stop.is-on .tl { opacity: 1; }
  .bh-cor__stop:hover { opacity: 0.92; }
  /* 轨道线 + 当前停靠光带（纯装饰，别挡站台命中） */
  .bh-cor__rail {
    position: absolute; left: 0; right: 0; top: calc(6% + 78px); height: 1px;
    background: linear-gradient(90deg, transparent, rgba(63, 217, 255, 0.35) 18%, rgba(63, 217, 255, 0.35) 82%, transparent);
    pointer-events: none;
  }
  .bh-cor__rail::after {
    content: ''; position: absolute; left: 50%; top: -1px; width: 140px; height: 3px; margin-left: -70px;
    background: radial-gradient(closest-side, rgba(63, 217, 255, 0.9), transparent);
  }
  .bh-cor__nav {
    position: absolute; left: 0; right: 0; bottom: 6px;
    display: flex; align-items: center; justify-content: space-between;
    font-family: var(--bh-mono); font-size: 10.5px; letter-spacing: 0.12em; color: var(--bh-arc-dim);
  }
  .bh-cor__nav button {
    width: 34px; height: 34px; display: grid; place-items: center; font-size: 16px; cursor: pointer;
    color: rgba(63, 217, 255, 0.8); background: transparent; border: 1px solid rgba(63, 217, 255, 0.24);
  }
  .bh-cor__nav button:hover { border-color: var(--bh-line); background: rgba(63, 217, 255, 0.08); }
  .bh-cor__ruler { display: flex; align-items: flex-end; height: 16px; margin: 6px 4px 0; }
  .bh-cor__ruler i { flex: 1 1 auto; height: 5px; border-left: 1px solid rgba(63, 217, 255, 0.22); }
  .bh-cor__ruler i:nth-child(5n + 1) { height: 10px; border-left-color: rgba(63, 217, 255, 0.4); }

  /* ============================================================
     2080 场景 · 星图星座（全幅星野 + 右缘 hero）
     ============================================================ */
  .bh-scene[data-scene="stars"] .bh-holo-hero {
    position: absolute; right: 26px; top: 50%; transform: translateY(-50%);
    width: 340px; z-index: 3;
  }
  .bh-scene[data-scene="stars"] .bh-holo-hero__img { height: 34%; }
  .bh-stars { position: absolute; inset: 0; overflow: hidden; }
  .bh-stars__grid {
    position: absolute; inset: 0;
    background:
      repeating-linear-gradient(90deg, rgba(63, 217, 255, 0.055) 0 1px, transparent 1px 72px),
      repeating-linear-gradient(0deg, rgba(63, 217, 255, 0.055) 0 1px, transparent 1px 72px);
    -webkit-mask: radial-gradient(ellipse 78% 76% at 40% 50%, #000 30%, transparent 92%);
    mask: radial-gradient(ellipse 78% 76% at 40% 50%, #000 30%, transparent 92%);
  }
  .bh-stars__rings { position: absolute; left: 40%; top: 50%; transform: translate(-50%, -50%); pointer-events: none; }
  .bh-stars__rings i { position: absolute; left: 50%; top: 50%; border: 1px solid rgba(63, 217, 255, 0.1); border-radius: 50%; transform: translate(-50%, -50%); }
  .bh-stars__br { position: absolute; width: 22px; height: 22px; border: 1px solid rgba(63, 217, 255, 0.34); pointer-events: none; }
  .bh-stars__br:nth-of-type(1) { left: 14px; top: 12px; border-right: 0; border-bottom: 0; }
  .bh-stars__br:nth-of-type(2) { right: 404px; top: 12px; border-left: 0; border-bottom: 0; }
  .bh-stars__br:nth-of-type(3) { left: 14px; bottom: 12px; border-right: 0; border-top: 0; }
  .bh-stars__br:nth-of-type(4) { right: 14px; bottom: 12px; border-left: 0; border-top: 0; }
  .bh-stars__layer {
    position: absolute; inset: 0;
    transform: translate(calc(var(--px, 0) * 1px), calc(var(--py, 0) * 1px));
    transition: transform 0.4s ease-out;
  }
  .bh-stars__svg { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; }
  .bh-stars__svg line { stroke: rgba(63, 217, 255, 0.3); stroke-width: 1; stroke-dasharray: 2 7; animation: bh-dashmarch 9s linear infinite; }
  @keyframes bh-dashmarch { to { stroke-dashoffset: -180; } }
  .bh-star { position: absolute; left: var(--x); top: var(--y); transform: translate(-50%, -50%); display: block; text-align: center; text-decoration: none; }
  .bh-star__dot {
    position: relative; display: block; width: var(--d, 13px); height: var(--d, 13px); margin: 0 auto;
    border-radius: 50%; background: #8FE8FF;
    box-shadow: 0 0 0 3px rgba(63, 217, 255, 0.12), 0 0 18px rgba(63, 217, 255, 0.75);
    transition: box-shadow 0.25s, background-color 0.25s, transform 0.25s;
  }
  .bh-star__dot::after { content: ''; position: absolute; inset: -9px; border-radius: 50%; border: 1px solid rgba(63, 217, 255, 0.28); opacity: 0; }
  .bh-star__lb {
    display: block; margin: 12px 0 0 -84px; width: 168px; font-size: 11px; line-height: 1.45; color: #9DB2C4;
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
    transition: color 0.25s;
  }
  .bh-star__no { display: block; margin-top: 5px; font-family: var(--bh-mono); font-size: 10.5px; letter-spacing: 0.14em; color: var(--bh-arc-dim); }
  .bh-star:hover .bh-star__dot, .bh-star.is-on .bh-star__dot {
    background: #BFF2FF;
    box-shadow: 0 0 0 4px rgba(63, 217, 255, 0.16), 0 0 30px rgba(63, 217, 255, 0.9);
    transform: scale(1.15);
  }
  .bh-star.is-on .bh-star__dot::after { opacity: 1; animation: bh-ping 2.2s ease-out infinite; }
  @keyframes bh-ping {
    0% { transform: scale(0.72); opacity: 0.9; }
    70% { transform: scale(1.5); opacity: 0; }
    100% { opacity: 0; }
  }
  .bh-star.is-on .bh-star__lb, .bh-star:hover .bh-star__lb { color: #E3F0FA; }
  .bh-stars__ct {
    position: absolute; left: var(--x); top: var(--y); transform: translate(-50%, -50%);
    font-family: var(--bh-mono); font-size: 10.5px; letter-spacing: 0.2em; color: rgba(63, 217, 255, 0.45);
    pointer-events: none;
  }

  /* ============================================================
     2080 场景 · 胶片灯箱（上帧带 + 下 hero 横卡）
     ============================================================ */
  .bh-scene[data-scene="film"] { display: flex; flex-direction: column; justify-content: center; gap: 16px; padding: 10px 24px 16px; }
  .bh-film { position: relative; flex: 0 0 auto; }
  .bh-film__box {
    position: relative; height: 224px; overflow: hidden;
    perspective: 1400px;
    background: linear-gradient(180deg, rgba(8, 12, 19, 0.96), rgba(5, 8, 13, 0.98));
    border-top: 1px solid rgba(63, 217, 255, 0.12);
    border-bottom: 1px solid rgba(63, 217, 255, 0.12);
    box-shadow: inset 0 0 90px rgba(63, 217, 255, 0.06);
  }
  /* 齿孔 */
  .bh-film__box::before, .bh-film__box::after {
    content: ''; position: absolute; left: 0; right: 0; height: 9px;
    background: repeating-linear-gradient(90deg, rgba(233, 246, 255, 0.2) 0 9px, transparent 9px 30px);
    -webkit-mask: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
    mask: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
    pointer-events: none;
  }
  .bh-film__box::before { top: 6px; }
  .bh-film__box::after { bottom: 6px; }
  .bh-film__lamp {
    position: absolute; left: 50%; top: 50%; width: 420px; height: 220px; margin: -110px 0 0 -210px;
    background: radial-gradient(closest-side, rgba(63, 217, 255, 0.16), transparent 72%);
    pointer-events: none;
  }
  .bh-film__strip {
    position: absolute; left: 50%; top: 44px;
    display: flex; align-items: center; gap: 16px; transform-style: preserve-3d;
    transform: translateX(var(--off, 0px));
    transition: transform 0.55s cubic-bezier(0.22, 0.9, 0.24, 1);
    /* ⚠ 命中测试：strip 的盒子在 z=0 平面，整条挡在身后帧（z<0）前面 ——
       1.9.2 转盘同款问题。父层关指针，帧自己开回来。 */
    pointer-events: none;
  }
  .bh-fr {
    position: relative; flex: 0 0 auto; width: 210px; height: 136px; overflow: hidden;
    background: #080d14; border: 1px solid rgba(63, 217, 255, 0.14); text-decoration: none;
    pointer-events: auto;
    transform: rotateY(var(--ry, 0deg)) translateZ(var(--tz, -90px)) scale(var(--sc, 0.82));
    transition: transform 0.5s cubic-bezier(0.22, 0.9, 0.24, 1), border-color 0.3s, box-shadow 0.35s, filter 0.3s;
    filter: grayscale(0.5) brightness(0.62);
  }
  .bh-fr img { width: 100%; height: 100%; object-fit: cover; display: block; }
  .bh-fr__no {
    position: absolute; left: 6px; top: 5px; font-family: var(--bh-mono); font-size: 10.5px;
    letter-spacing: 0.12em; color: rgba(233, 246, 255, 0.55); background: rgba(4, 7, 11, 0.7); padding: 1px 4px;
  }
  .bh-fr.is-on {
    transform: rotateY(0deg) translateZ(40px) scale(1.06); filter: none;
    border-color: rgba(63, 217, 255, 0.62);
    box-shadow: 0 0 0 1px rgba(63, 217, 255, 0.2), 0 0 46px rgba(63, 217, 255, 0.28), 0 22px 44px rgba(0, 0, 0, 0.6);
  }
  .bh-fr:hover { filter: grayscale(0.15) brightness(0.9); }
  .bh-fr.is-on:hover { filter: none; }
  .bh-film__cnt {
    position: absolute; right: 16px; top: 14px; z-index: 2; text-align: right;
    font-family: var(--bh-mono); letter-spacing: 0.14em; pointer-events: none;
  }
  .bh-film__cnt b { display: block; font-size: 22px; font-weight: 400; color: rgba(63, 217, 255, 0.75); line-height: 1.1; }
  .bh-film__cnt span { display: block; font-size: 10px; color: var(--bh-arc-dim); margin-top: 3px; }
  /* 胶片 hero：横向字幕卡（图左文右） */
  .bh-scene[data-scene="film"] .bh-holo-hero {
    flex: 0 1 auto; min-height: 0;
    display: grid;
    grid-template-columns: 236px 1fr;
    grid-template-rows: auto auto 1fr auto auto;
    grid-template-areas: "img meta" "img t" "img ex" "img foot" "img stream";
    column-gap: 16px;
  }
  .bh-scene[data-scene="film"] .bh-holo-hero__img { grid-area: img; height: auto; }
  .bh-scene[data-scene="film"] .bh-holo-hero__meta { grid-area: meta; margin-top: 2px; }
  .bh-scene[data-scene="film"] .bh-holo-hero__t { grid-area: t; margin: 6px 0 0; font-size: 16px; }
  .bh-scene[data-scene="film"] .bh-holo-hero__ex { grid-area: ex; margin-top: 5px; -webkit-line-clamp: 2; }
  .bh-scene[data-scene="film"] .bh-holo-hero__foot { grid-area: foot; margin-top: 7px; }
  .bh-scene[data-scene="film"] .bh-holo-stream { grid-area: stream; margin-top: 5px; }

  /* ============================================================
     2080 场景 · 等距甲板（悬浮面板 + 右缘 hero）
     ============================================================ */
  .bh-iso { position: absolute; inset: 0; overflow: hidden; }
  .bh-iso__wrap {
    position: absolute; left: 44%; top: 54%; transform: translate(-50%, -50%);
    perspective: 1250px; perspective-origin: 50% 50%;
  }
  .bh-iso__deck {
    position: relative; width: 820px; height: 430px;
    transform-style: preserve-3d;
    /* 916px 舞台装不下 v1 的 1.03 满幅 —— 收到 0.88，左缘正好贴舞台 */
    transform: rotateX(52deg) rotateZ(-34deg) scale(0.88);
    /* ⚠ 命中测试：甲板盒子挡住面板（1.9.2 转盘同款问题）—— 父层关指针，
       面板自己开回来。 */
    pointer-events: none;
  }
  .bh-iso__floor {
    position: absolute; left: -200px; top: -200px; width: 1220px; height: 830px;
    background:
      radial-gradient(ellipse 60% 58% at 50% 50%, rgba(63, 217, 255, 0.1), transparent 72%),
      repeating-linear-gradient(90deg, rgba(63, 217, 255, 0.3) 0 1px, transparent 1px 68px),
      repeating-linear-gradient(0deg, rgba(63, 217, 255, 0.3) 0 1px, transparent 1px 68px);
    -webkit-mask: radial-gradient(ellipse 54% 54% at 50% 50%, #000 26%, transparent 80%);
    mask: radial-gradient(ellipse 54% 54% at 50% 50%, #000 26%, transparent 80%);
    border: 1px solid rgba(63, 217, 255, 0.14);
    transform: translateZ(-1px);
  }
  .bh-pl {
    position: absolute; left: var(--x); top: var(--y); width: 186px; height: 118px;
    display: block; overflow: hidden; padding: 9px 10px; text-decoration: none;
    background: linear-gradient(160deg, rgba(20, 30, 44, 0.97), rgba(9, 14, 22, 0.97));
    border: 1px solid rgba(63, 217, 255, 0.2);
    pointer-events: auto;
    transform-style: preserve-3d;
    transform: rotateZ(34deg) rotateX(-52deg) translateZ(var(--z, 0px));
    transition: transform 0.45s cubic-bezier(0.22, 0.9, 0.24, 1), border-color 0.3s, box-shadow 0.35s, background-color 0.3s;
  }
  .bh-pl .no { font-family: var(--bh-mono); font-size: 10.5px; letter-spacing: 0.14em; color: rgba(63, 217, 255, 0.5); }
  .bh-pl .ch { font-family: var(--bh-mono); font-size: 10.5px; letter-spacing: 0.1em; color: rgba(63, 217, 255, 0.35); margin-left: 6px; }
  .bh-pl .t { display: block; margin-top: 6px; font-size: 12px; line-height: 1.45; font-weight: 600; color: #CFF1FF; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
  .bh-pl .bar { position: absolute; left: 0; bottom: 0; height: 2px; width: 100%; background: linear-gradient(90deg, rgba(63, 217, 255, 0.5), transparent); }
  /* ⚠ 抬升不走 translateZ：透视原点在甲板中心，z 越大面板越往象限外
     漂（左下面板直接出画），hover 还会从鼠标底下溜走 —— 位置不动，
     用放大 + 提亮 + 发光表达「上浮」。 */
  .bh-pl:hover {
    border-color: rgba(63, 217, 255, 0.55);
    box-shadow: 0 0 28px rgba(63, 217, 255, 0.22);
    filter: brightness(1.1);
  }
  .bh-pl.is-on {
    transform: rotateZ(34deg) rotateX(-52deg) scale(1.08);
    filter: brightness(1.12) saturate(1.05);
    border-color: rgba(63, 217, 255, 0.75);
    background: linear-gradient(160deg, rgba(26, 38, 54, 0.99), rgba(11, 18, 28, 0.99));
    box-shadow: 0 0 0 1px rgba(63, 217, 255, 0.22), 0 0 60px rgba(63, 217, 255, 0.3), 0 40px 60px rgba(0, 0, 0, 0.6);
    /* 焦点帆浮到 hero 前面 —— 永远完整可见 */
    z-index: 4;
  }
  .bh-pl.is-on .t { color: #fff; }
  .bh-scene[data-scene="iso"] .bh-holo-hero {
    position: absolute; right: 30px; top: 50%; transform: translateY(-50%);
    width: 330px; z-index: 3;
  }
  .bh-scene[data-scene="iso"] .bh-holo-hero__img { height: 32%; }
  .bh-iso__hint {
    position: absolute; left: 30px; bottom: 22px;
    font-family: var(--bh-mono); font-size: 10.5px; letter-spacing: 0.12em; color: var(--bh-arc-dim);
  }

  @media (prefers-reduced-motion: reduce) {
    .bh-scene::after, .bh-holo-scan, .bh-holo-hero.is-refresh .bh-holo-hero__img img,
    .bh-stars__svg line, .bh-star.is-on .bh-star__dot::after { animation: none !important; }
    .bh-holo-stream i { animation-duration: 40s !important; }
    .bh-book, .bh-cor__stops, .bh-cor__stop, .bh-film__strip, .bh-fr, .bh-pl { transition-duration: 0.01s !important; }
  }
}
