/* ============================================================
   j81-adaptive.css  — 全局缩放覆盖层 v9  (2026-10-14)
   ------------------------------------------------------------
   ★ 方案 A：1920×1080 设计画布 + 单系数整体缩放 ★

   【为什么本文件不再是"自适应层"】
   v8 曾用 clamp(110px,14vw,403px) 之类让元素跟随真实屏宽伸缩，
   这在"直接铺满视口"时代是对的。方案 A 改为整体缩放后，
   视口差异已由 #j81-canvas 的 scale 统一消化，
   页面内部必须回到 1920 设计稿的原始像素值，
   否则会出现「双重缩放」：人物按 vw 再算一次、云朵气泡按 % 再算一次，
   比例全面失调（正是本次要根治的病根）。

   【换算基准】1vw = 19.2px (1920/100)   1vh = 10.8px (1080/100)
   全部 vw/vh 已在 2026-10-14 批量换算为画布内像素。
   ============================================================ */

/* ---------- 0) 画布本体：全站唯一缩放入口 ---------- */
html, body {
  width: 100%;
  height: 100%;
  overflow: hidden;
  background: #020204;
}
#j81-canvas {
  position: fixed;
  left: 0;
  top: 0;
  width: 1920px;
  height: 1080px;
  transform-origin: 0 0;
  transform: scale(1);
  overflow: hidden;
}
/* body 的 min-height:100vh 会按真实屏高撑开，改为跟随画布 */
.j81-app { min-height: 1080px; }

/* ---------- 1) 五圣人物宽度：撤销 v8 的 vw 覆盖 ----------
   1920 设计稿原始值 = calc(96px * 4.2) = 403.2px
   画布恒 1920，固定像素即"等比缩放"，切勿再引vw。 */
.j81-saints-stage .saint {
  width: calc(96px * 4.2) !important;
}
/* 舞台整体去掉旧缩放，改用画布统一缩放 */
#j81-saints-stage {
  transform: translateY(-4em) !important;
  width: 100% !important;
  margin: 0 auto !important;
}

/* ---------- 2) 气泡：撤销 v8 的 %/em 方案 ----------
   1920 原始设计每角色气泡宽不同（悟空/白龙127、八戒/沙僧149、唐僧128），
   那是设计稿的呼吸感；v8 统一成 34% + em 字号抹平了差异。
   画布方案下必须还原，否则气泡与云朵比例失真。
   各角色原始定义见 journey81-opening.css:900-904。 */
.j81-saints-stage .saint-bubble {
  width: auto;
  min-width: 0;
  height: auto;
}

/* ---------- 3) 关内对话人物气泡：撤销 v8 的 clamp ----------
   换算后 clamp(64px,172.8px,118px) 中间值恒大于上限，等价于固定 118px ——
   属"意外正确"，不可控。直接回退 1920 原始固定值，
   原始定义见 j81-layout-badge_r169.css:1697/1878/2918。 */
.j81-l3-stage .j81-char-wrap .j81-bubble { height: auto !important; }
#j81-l3-char .j81-bubble { height: auto !important; }

/* ---------- 4) 闯关/画像人物栈：撤销 v8 的 min() ----------
   min(576px,480px) 同理退化为固定 480px；各角色原始宽度不同
   （悟空/八戒480、唐僧520、白龙500、沙僧540），交回原规则区分。 */
.j81-char-stack { min-width: 0 !important; }

/* ---------- 5) 底部按钮（贴底 + 最高层级，防被唐僧顶掉） ----------
   1920 原始 = max(18px, 3.5%)；3.5% 在1080 画布 = 37.8px，
   换算为固定值，随画布一起等比缩放。 */
.j81-home-cta {
  z-index: 90 !important;
  bottom: max(18px, 37.8px) !important;
}
/* ═══ 方案A 画布缩放：作废原窄屏媒体查询 ═══
   画布恒 1920×1080，高度 700px 的物理断点不再对应「矮屏」，
   在已 scale 的画布里二次抬升按钮 → 位置漂移。保留原文备查。 */
/* @media (max-height: 700px) {
  .j81-home-cta { bottom: max(4px, 15.12px) !important; gap: 10px; }
} */

/* ---------- 6) 面板防溢出 ---------- */
#j81-stage-panel, #j81-gate-panel {
  max-width: min(1804.8px, 920px) !important;
  box-sizing: border-box !important;
}

/* ══════════════════════════════════════════════════════════
   闯关判招即兴引擎 v2 · 心魔淡出 + 关末给药框
   ------------------------------------------------------------
   引擎铁律：判招对话 = 闯关真正内容；画面 = 对话的外部皮肤。
   ★ 不做进度条★ 画面只跟 AI 每轮话语走：
     他每接住一句 → 心魔淡一档（面板更亮、妖更淡）；
     命中采信信号 → 关末亮出给药框（一句话药 + 进疗程）。
   样式只负责"看得见"，节奏由 app_r185 的 lv2 分支驱动。
   ══════════════════════════════════════════════════════════ */

/* —— 心魔淡出：面板按淡出档位提亮、降饱和收敛 —— */
#j81-stage-panel { transition: filter 1s ease, box-shadow 1s ease; }
#j81-stage-panel[data-demon-fade="1"] {
  filter: brightness(1.05) saturate(0.92);
}
#j81-stage-panel[data-demon-fade="2"] {
  filter: brightness(1.12) saturate(0.80);
}
#j81-stage-panel[data-demon-fade="3"] {
  filter: brightness(1.2) saturate(0.66);
}
/* 淡出到顶：卷轴透出暖光，妖影几乎散掉 */
#j81-stage-panel[data-demon-fade="3"] .j81-stage-char,
#j81-stage-panel[data-demon-fade="3"] .j81-char-stack {
  opacity: .82;
}
#j81-stage-panel[data-demon-fade] .j81-stage-char,
#j81-stage-panel[data-demon-fade] .j81-char-stack {
  transition: opacity 1s ease;
}

/* —— 关末给药框：一句话药 + 进疗程 —— */
.j81-medicine {
  display: block; margin: 4px 0 16px; padding: 16px 20px 18px;
  border: 1px solid rgba(212,175,55,.6);
  border-left: 4px solid var(--gold, #d9b36c);
  border-radius: 8px;
  background: linear-gradient(100deg, rgba(42,33,8,.82), rgba(20,16,6,.6));
  box-shadow: 0 0 26px rgba(212,175,55,.2) inset;
  animation: j81-medicine-in .8s cubic-bezier(.2,.9,.3,1);
}
.j81-medicine[hidden] { display: none !important; }
.j81-medicine-tag {
  display: block; color: var(--gold, #d9b36c);
  font-size: 18px; letter-spacing: .24em; margin-bottom: 8px;
}
.j81-medicine-text {
  margin: 0 0 12px; color: #f7eccb;
  font-size: 27px; line-height: 1.6; font-weight: 600;
}
.j81-medicine-actions {
  margin: 0 !important;
  padding: 0 !important;
}
.j81-medicine-actions .jade-badge-btn {
  font-size: 20px !important;
  padding: .4em 1.6em !important;
}
@keyframes j81-medicine-in {
  from { opacity: 0; transform: translateY(12px); }
  to   { opacity: 1; transform: none; }
}
/* ══════════════════════════════════════════════════════════
   全网关卡 UI 纠偏（2026-10-15 指令·板块二）
   1) 场景文字整体放大（字号由 app_r185 的 fitAdaptive 按内容多寡写入行内）
   2) 题眼/扎心句做视觉锚点：引号内的「原话」金色大字带微光
   3) 版式自适应：内容少的关把正文区撑满，不留大片空缺
   真实容器 id：#j81-stage-body（正文）、#j81-stage-phase（阶段标题）
   ══════════════════════════════════════════════════════════ */

/* —— 题眼锚点：场景/对白/判词里引号内的原话，做全段钩子 —— */
#j81-stage-body .j81-hook {
  display: inline-block;
  font-size: 1.24em;
  font-weight: 900;
  color: #ffe9a8;
  line-height: 1.62;
  padding: 0 .1em;
  letter-spacing: .02em;
  text-shadow:
    0 0 22px rgba(255, 205, 90, .58),
    0 2px 0 rgba(90, 60, 0, .5);
  border-bottom: 2px solid rgba(255, 205, 90, .38);
}

/* —— 场景文字基准（fitAdaptive 会按字数覆写字号，这里给下限保护）—— */
#j81-stage-body {
  min-height: 0;
  color: #e8f0ff;
  letter-spacing: .015em;
}

/* —— 版式自适应：字少的关把行距放宽，把竖向空间填满，不留空荡 —— */
#j81-stage-body[data-len='xs'] { line-height: 2.05; }
#j81-stage-body[data-len='s']  { line-height: 1.92; }
#j81-stage-body[data-len='m']  { line-height: 1.80; }
#j81-stage-body[data-len='l']  { line-height: 1.74; }
#j81-stage-body[data-len='xl'] { line-height: 1.68; }

/* —— 阶段标题（望/闻/过）随内容长度调档 —— */
#j81-stage-phase {
  transition: font-size .2s ease;
  margin-bottom: .28em;
}

/* ══════════════════════════════════════════════════════════
   全网 UI 统一基线 v186（2026-10-15）
   基准页：第一关 · 白龙人物第一页（用户确认的标准页）
   三个病灶：
     A. 场景文字没自适应到文字框→ 已由 app_r185 的_fitTextToBox 实测解决
     B. 很多页按钮没有统一底部位置 → 本节A/B 解决
     C. 人物/云朵/气泡关系各页不一 → 本节 C 解决
   本文件加载在最后，优先级最高。
   ══════════════════════════════════════════════════════════ */

/* ───────── A. 按钮底部统一基线 ─────────
   规则：所有"文字内容区"的按钮行动一律margin-top:auto，
   永远钉在文字区底缘；文字区自身 flex:1 吃掉剩余高度。
   覆盖：闯关页 / 盘方页 / 定盘L3 页 / 画像页 / 留名页 / 首页CTA 不在内（首页独立构图）。*/
#j81-stage-panel > .j81-scroll-copy,
#j81-gate-panel > .j81-scroll-copy,
#j81-portrait-panel,
#j81-l3-holo > .j81-scroll-copy {
  justify-content: flex-start !important;
}
#j81-stage-panel > .j81-scroll-copy > .j81-scroll-actions,
#j81-gate-panel > .j81-scroll-copy > .j81-scroll-actions,
#j81-l3-holo > .j81-scroll-copy > .j81-scroll-actions,
#j81-portrait-panel > .j81-actions {
  margin-top: auto !important;
  flex: 0 0 auto !important;
  align-self: flex-start !important;
}
/* 正文区吃掉标题组与按钮行之间的全部剩余高度 —— 文字框因此恒等于「标题下→ 按钮上」 */
#j81-stage-body,
#j81-gate-rx {
  flex: 1 1 auto !important;
  min-height: 0 !important;
  align-self: stretch !important;
  display: flex !important;
  flex-direction: column !important;
  justify-content: center !important;   /* _fitTextToBox 会按内容实测量覆写 */
  overflow-y: auto !important;
}
/* 药框出现时正文让位，药框自身不撑高 */
#j81-stage-panel .j81-medicine {
  flex: 0 0 auto !important;
  margin-bottom: 8px !important;
}
#j81-stage-panel #j81-stage-choices,
#j81-stage-panel #j81-stage-hint,
#j81-stage-panel #j81-stage-cost {
  flex: 0 0 auto !important;
}
#j81-stage-panel #j81-stage-hint:empty,
#j81-stage-panel #j81-stage-cost:empty {
  display: none !important;
}

/* ───────── B. 人物 / 云朵 / 气泡 统一关系 ─────────
   标准页（第1 关·白龙）实测基准：
     人物 stack 宽 448px（唐僧 300px为特例，因其立绘更宽）
     云朵：底边压在人物脚下居中，宽约人物宽 52%，水平偏移按角色微调
     气泡：81×73，悬在人物头顶上方 46~80px，不与头重叠
   下面把「关系」写成同一套变量，各页只需换--char-* 数值即可对齐标准页。*/
.j81-stage-layout .j81-stage-char,
.j81-gate-layout .j81-stage-char,
.j81-l3-stage .j81-l3-char,
.j81-board-view .j81-board-char {
  transform: translate(-50%, -50%) !important;
}
/* 气泡统一规格（全网一个模子，不再各页各尺寸） */
.j81-stage-char .j81-bubble,
.j81-gate-char .j81-bubble,
.j81-l3-char .j81-bubble,
.j81-board-char .j81-bubble {
  width: 81px !important;
  height: 73px !important;
  min-width: 81px !important;
  min-height: 73px !important;
}
.j81-stage-char .j81-bubble-text,
.j81-gate-char .j81-bubble-text,
.j81-l3-char .j81-bubble-text,
.j81-board-char .j81-bubble-text {
  font-size: 26px !important;
  line-height: 1.06 !important;
  font-weight: 600 !important;
  white-space: nowrap !important;
}
/* 气泡绝不与人物立绘重叠：统一悬顶 + 最小间隙 */
.j81-stage-char .j81-bubble,
.j81-gate-char .j81-bubble,
.j81-l3-char .j81-bubble,
.j81-board-char .j81-bubble {
  bottom: auto !important;
  transform: translateX(-50%) !important;
  z-index: 6 !important;
}
/* 云朵压在人物脚下：底边对齐人物底缘，不许浮空或沉到脚以下 */
.j81-stage-char .j81-cloud,
.j81-gate-char .j81-cloud,
.j81-l3-char .j81-cloud,
.j81-board-char .j81-cloud {
  transform: translateX(-50%) !important;
  z-index: 1 !important;
  pointer-events: none !important;
}

/* 文字块包裹层：让 Range 能精确量到纯文字高度（不含 padding），
   同时作为 flex item 在框内纵向居中 */
#j81-stage-body > .j81-fit-text,
#j81-gate-rx > .j81-fit-text {
  width: 100% !important;
  flex: 0 0 auto !important;
  white-space: pre-wrap !important;
  word-break: break-word !important;
}

/* ───────── C. 定盘 L3 页：按钮同样钉底，口径与闯关页一致 ─────────
   实测旧值：L3 内层底 980 / 按钮底 897 → 底距 83px（闯关页为 20px）。
   改为内层拉满 + 按钮 margin-top:auto，全网同一基线。*/
.j81-l3-stage .j81-l3-holo .j81-l3-holo-inner {
  inset: 5% 12% 5% 8% !important;
  height: auto !important;
  display: flex !important;
  flex-direction: column !important;
  justify-content: flex-start !important;
}
.j81-l3-stage[data-layout="char-right"] .j81-l3-holo .j81-l3-holo-inner {
  inset: 5% 8% 5% 12% !important;
}
.j81-l3-stage .j81-l3-holo .j81-l3-holo-inner > .j81-scroll-actions,
.j81-l3-stage .j81-l3-holo .j81-l3-holo-inner > .j81-home-cta {
  margin-top: auto !important;
  margin-bottom: 20px !important;
  flex: 0 0 auto !important;
}
/* L3 场景文字吃掉中间剩余空间 */
.j81-l3-stage #j81-l3-desc {
  flex: 1 1 auto !important;
  align-self: stretch !important;
  display: flex !important;
  flex-direction: column !important;
  justify-content: center !important;
}

/* L3 卷轴定高：解除 aspect-ratio 主导，让内层能真正拉满、按钮钉底。
   1920 画布下取 734px（与旧设计 734.4px 一致）。*/
.j81-l3-stage[data-layout] .j81-l3-holo {
  height: 734px !important;
  max-height: 734px !important;
  aspect-ratio: auto !important;
  top: 50% !important;
  transform: translateY(-50%) !important;
}
.j81-l3-stage[data-layout="char-left"] .j81-l3-holo { right: 2% !important; left: auto !important; }
.j81-l3-stage[data-layout="char-right"] .j81-l3-holo { left: 2% !important; right: auto !important; }
.j81-l3-stage[data-layout="char-center"] .j81-l3-holo {
  left: 50% !important; right: auto !important;
  transform: translate(-50%, -50%) !important;
}

/* L3 内层底部不留边距：内层底 = holo 底，按钮 margin-bottom:20px 即为最终底距，
   与闯关页 20px 完全同口径。*/
.j81-l3-stage[data-layout] .j81-l3-holo .j81-l3-holo-inner {
  bottom: 0 !important;
  top: 5% !important;
}

/* L3 内层改为 top/bottom 撑满 holo（absolute + height:auto 会贴合内容，
   导致内层底与按钮底脱钩）。此处覆盖 height:auto。 */
.j81-l3-stage[data-layout] .j81-l3-holo .j81-l3-holo-inner {
  position: absolute !important;
  top: 5% !important;
  bottom: 0 !important;
  height: auto !important;
  max-height: none !important;
  overflow: visible !important;
}

/* L3 修正：上条 height:734 + aspect-ratio:auto 会让卷轴按内容宽度暴涨溢出屏幕。
   正确做法：宽度按视口百分比锁死，高度按 1920 画布的宽高比推导（734px ↔ 84% 视口宽）。*/
.j81-l3-stage[data-layout] .j81-l3-holo {
  width: 84% !important;
  max-width: 84% !important;
  min-width: 0 !important;
  height: auto !important;
  max-height: 734px !important;
  aspect-ratio: 2.15 / 1 !important;
}
.j81-l3-stage[data-layout="char-left"] .j81-l3-holo,
.j81-l3-stage[data-layout="char-center"] .j81-l3-holo {
  left: auto !important; right: 2% !important;
  transform: translateY(-50%) !important;
}
.j81-l3-stage[data-layout="char-right"] .j81-l3-holo {
  left: 2% !important; right: auto !important;
  transform: translateY(-50%) !important;
}

/* L3 内层最终口径：ID 级覆盖，bottom 归零使内层底 = holo 底，
   按钮 margin-bottom:20px 即最终底距，与闯关页 20px 同基线。*/
#j81-l3-holo .j81-l3-holo-inner {
  position: absolute !important;
  top: 36px !important;
  bottom: 0 !important;
  left: 8% !important;
  right: 8% !important;
  height: auto !important;
  max-height: none !important;
  overflow: visible !important;
  display: flex !important;
  flex-direction: column !important;
  justify-content: flex-start !important;
}
#j81-l3-stage[data-layout="char-right"] #j81-l3-holo .j81-l3-holo-inner {
  left: 8% !important; right: 8% !important;
}
#j81-l3-holo .j81-l3-holo-inner > .j81-scroll-actions {
  margin-top: auto !important;
  margin-bottom: 20px !important;
  flex: 0 0 auto !important;
}
#j81-l3-holo #j81-l3-desc {
  flex: 1 1 auto !important;
  align-self: stretch !important;
  display: flex !important;
  flex-direction: column !important;
  justify-content: center !important;
  margin: 0 0 12px !important;
}

/* L3 内层最终口径 v188：选择器特异性必须 ≥ 旧的
   `.j81-l3-stage[data-layout] .j81-l3-holo-inner`（0,4,0），否则 inset 被压。
   这里用 ID + attr + class 组合（1,2,1）稳定压过。 */
#j81-l3-holo .j81-l3-holo-inner[id],
.j81-l3-stage[data-layout] #j81-l3-holo .j81-l3-holo-inner {
  position: absolute !important;
  top: 36px !important;
  bottom: 0 !important;
  left: 8% !important;
  right: 8% !important;
  height: auto !important;
  max-height: none !important;
  overflow: visible !important;
  inset: auto !important;
  display: flex !important;
  flex-direction: column !important;
  justify-content: flex-start !important;
  padding: 0 !important;
}
.j81-l3-stage[data-layout] #j81-l3-holo .j81-l3-holo-inner > .j81-scroll-actions {
  margin-top: auto !important;
  margin-bottom: 20px !important;
  flex: 0 0 auto !important;
}
.j81-l3-stage[data-layout] #j81-l3-holo #j81-l3-desc {
  flex: 1 1 auto !important;
  align-self: stretch !important;
  display: flex !important;
  flex-direction: column !important;
  justify-content: center !important;
}

/* L3 卷轴水平定位最终口径：宽度 84% + 靠右 2% 时会右侧溢出
   （left:2% + width:84% = 86%，看似不溢出，但旧规则 right:2% 与之叠加导致双锚定冲突）。
   统一改为单锚点：char-left → right:2%；char-right → left:2%；center → left:50% 平移。 */
.j81-l3-stage[data-layout] .j81-l3-holo {
  position: absolute !important;
  top: 50% !important;
  width: 84% !important;
  max-width: 84% !important;
  min-width: 0 !important;
  height: auto !important;
  max-height: 734px !important;
  aspect-ratio: 2.15 / 1 !important;
  right: auto !important;
  left: auto !important;
}
.j81-l3-stage[data-layout="char-left"] .j81-l3-holo {
  left: 14% !important; right: auto !important;
  transform: translateY(-50%) !important;
}
.j81-l3-stage[data-layout="char-right"] .j81-l3-holo {
  left: 2% !important; right: auto !important;
  transform: translateY(-50%) !important;
}
.j81-l3-stage[data-layout="char-center"] .j81-l3-holo {
  left: 50% !important; right: auto !important;
  transform: translate(-50%, -50%) !important;
}

/* L3 卷轴 v189 最终收敛：用 calc 显式锁定「不越界」区间，
   彻底绕开旧规则的双锚定（left/right 同时设值）与transform 冲突。
   画布 1920 宽；卷轴 84% = 1612px 太多，收到 78% = 1498px，
   停靠在锚侧留边 2%~22%。*/
.j81-l3-stage[data-layout] .j81-l3-holo {
  position: absolute !important;
  top: 50% !important;
  width: 78% !important;
  max-width: 78% !important;
  min-width: 0 !important;
  height: auto !important;
  max-height: 700px !important;
  aspect-ratio: 2.15 / 1 !important;
  margin: 0 !important;
}
.j81-l3-stage[data-layout="char-left"] .j81-l3-holo {
  left: 20% !important;
  right: auto !important;
  transform: translateY(-50%) !important;
}
.j81-l3-stage[data-layout="char-right"] .j81-l3-holo {
  left: 2% !important;
  right: auto !important;
  transform: translateY(-50%) !important;
}
.j81-l3-stage[data-layout="char-center"] .j81-l3-holo {
  left: 50% !important;
  right: auto !important;
  transform: translate(-50%, -50%) !important;
}

/* ══════════════════════════════════════════════════════════
   L3 卷轴 v190 最终口径
   旧规则 `#j81-l3-stage[data-layout] #j81-l3-holo`（1,2,0）压过一切类级规则，
   故本节全部用 ID + attr（≥1,2,0）书写，一处不改旧文件。
   基准（1920 画布）：卷轴宽 1400px / 高 651px（2.15:1），右缘钉 96%（不外溢）。
   ══════════════════════════════════════════════════════════ */
#j81-l3-stage[data-layout] #j81-l3-holo {
  position: absolute !important;
  top: 50% !important;
  width: 1400px !important;
  max-width: 1400px !important;
  min-width: 0 !important;
  height: 651px !important;
  max-height: 651px !important;
  aspect-ratio: auto !important;
  margin: 0 !important;
  right: auto !important;
  left: auto !important;
  padding: 0 !important;
}
#j81-l3-stage[data-layout="char-left"] #j81-l3-holo,
#j81-l3-stage[data-layout="char-center"] #j81-l3-holo {
  left: 520px !important;right: auto !important;
  transform: translateY(-50%) !important;
}
#j81-l3-stage[data-layout="char-right"] #j81-l3-holo {
  left: 0px !important; right: auto !important;
  transform: translateY(-50%) !important;
}
#j81-l3-stage[data-layout="char-center"] #j81-l3-holo {
  left: 50% !important;
  transform: translate(-50%, -50%) !important;
}
/* 内层铺满 holo，按钮 margin-bottom:20px → 与闯关页同底距 */
#j81-l3-stage[data-layout] #j81-l3-holo .j81-l3-holo-inner {
  position: absolute !important;
  top: 36px !important;
  bottom: 0 !important;
  left: 7% !important;
  right: 7% !important;
  height: auto !important;
  max-height: none !important;
  overflow: visible !important;
  display: flex !important;
  flex-direction: column !important;
  justify-content: flex-start !important;
  padding: 0 !important;
}
#j81-l3-stage[data-layout] #j81-l3-holo .j81-l3-holo-inner > .j81-scroll-actions {
  margin: auto 0 20px !important;
  flex: 0 0 auto !important;
}
#j81-l3-stage[data-layout] #j81-l3-holo #j81-l3-desc {
  flex: 1 1 auto !important;
  align-self: stretch !important;
  display: flex !important;
  flex-direction: column !important;
  justify-content: center !important;
}

/* ══════════════════════════════════════════════════════════════
   ★ 2026-10-18 最优组合收口 —— 按钮行随人物方向对齐
   规则（Kimi交接/闯关页UI修改简报_v1.md 原文）：
     按钮钉卷轴最底部；左对齐（人物在左的页右对齐）
   为什么必须写 align-self：
     父容器 .j81-l3-holo-inner 的 align-items 被 overrides_r182 设成
     flex-start，子项会收缩靠左；margin:auto 在 flex 横向**不生效**，
     只有 align-self 能把这一行单独掰到右侧。
   ══════════════════════════════════════════════════════════════ */
#j81-l3-stage[data-layout="char-left"] #j81-l3-holo .j81-l3-holo-inner > .j81-scroll-actions,
#j81-l3-stage[data-layout="char-left"] #j81-l3-holo .j81-l3-holo-inner > .j81-home-cta {
  align-self: flex-end !important;
  margin-left: auto !important;
  margin-right: 0 !important;
  margin-top: auto !important;
  margin-bottom: 20px !important;
}
#j81-l3-stage[data-layout="char-right"] #j81-l3-holo .j81-l3-holo-inner > .j81-scroll-actions,
#j81-l3-stage[data-layout="char-right"] #j81-l3-holo .j81-l3-holo-inner > .j81-home-cta {
  align-self: flex-start !important;
  margin-left: 0 !important;
  margin-right: auto !important;
  margin-top: auto !important;
  margin-bottom: 20px !important;
}

/* ══════════════════════════════════════════════════════════════
   ★★ 2026-10-18 v260 全站纠偏（第 1 批：按钮 + 文字对齐）
   依据：《UI规则全书_20261018.md》二/四/五节 + Kimi交接/闯关页UI修改简报_v1.md
   ------------------------------------------------------------
   ⚠️ 落地位置说明（重要）：
      css/j81-layoutfit_r301.css / r278.css / j81-l3fit_r256.css 等
      **并未被 index.html 加载**（基线 10-15 01:38 起就只 link 5 个 CSS），
      改那些文件不会生效。故本次所有修正一律落在 **j81-adaptive.css**（加载链末尾）。

   ⚠️ data-layout 宿主每页不同（写错整条规则静默落空）：
      L3→#j81-l3-stage；行程图→#j81-starfield（不是 #j81-board-view）；
      闯关→#j81-stage-layout；盘方→#j81-gate-layout。

   ① 按钮：钉底 20px、随人物方向对齐、**不脱离 flex 流**（static）
      历史教训：sticky 脱离钉底流，实测上移 272px；此处覆盖
      j81-layout-badge_r169.css:2436 的 `#j81-stage-panel .j81-scroll-actions{position:sticky}`。
   ② 文字：人物在左 → 右对齐；人物在右 → 左对齐（老板拍板，不得再改成一律左对齐）
   ══════════════════════════════════════════════════════════════ */

/* ① 按钮：不脱离 flex 流 + 钉底 20px（全站统一） */
#j81-stage-layout[data-layout] #j81-stage-panel .j81-scroll-actions,
#j81-gate-layout[data-layout] #j81-gate-panel .j81-scroll-actions,
#j81-l3-stage[data-layout] #j81-l3-holo .j81-scroll-actions,
#j81-l3-stage[data-layout] #j81-l3-holo .j81-home-cta,
#j81-starfield[data-layout] #j81-scroll-panel .j81-scroll-actions {
  position: static !important;
  bottom: auto !important;
  margin-top: auto !important;
  margin-bottom: 20px !important;
  flex: 0 0 auto !important;
}
/* ①b 人物在左 → 按钮右对齐（左右镜像：只写 margin-right/left 其一 + 同一个数 0） */
#j81-stage-layout[data-layout="char-left"] #j81-stage-panel .j81-scroll-actions,
#j81-gate-layout[data-layout="char-left"] #j81-gate-panel .j81-scroll-actions,
#j81-l3-stage[data-layout="char-left"] #j81-l3-holo .j81-scroll-actions,
#j81-l3-stage[data-layout="char-left"] #j81-l3-holo .j81-home-cta,
#j81-starfield[data-layout="char-left"] #j81-scroll-panel .j81-scroll-actions {
  align-self: flex-end !important;
  margin-left: auto !important;
  margin-right: 0 !important;
}
/* ①c 人物在右 → 按钮左对齐 */
#j81-stage-layout[data-layout="char-right"] #j81-stage-panel .j81-scroll-actions,
#j81-gate-layout[data-layout="char-right"] #j81-gate-panel .j81-scroll-actions,
#j81-l3-stage[data-layout="char-right"] #j81-l3-holo .j81-scroll-actions,
#j81-l3-stage[data-layout="char-right"] #j81-l3-holo .j81-home-cta,
#j81-starfield[data-layout="char-right"] #j81-scroll-panel .j81-scroll-actions {
  align-self: flex-start !important;
  margin-left: 0 !important;
  margin-right: auto !important;
}

/* ② 文字：人物在左 → 右对齐（列与其子项一起覆盖，否则继承链把值吃掉） */
#j81-stage-layout[data-layout="char-left"] #j81-stage-panel > .j81-scroll-copy,
#j81-gate-layout[data-layout="char-left"] #j81-gate-panel > .j81-scroll-copy,
#j81-l3-stage[data-layout="char-left"] .j81-l3-holo-inner,
#j81-starfield[data-layout="char-left"] #j81-scroll-panel .j81-scroll-copy {
  text-align: right !important;
  align-items: flex-end !important;
}
#j81-stage-layout[data-layout="char-left"] #j81-stage-panel > .j81-scroll-copy > *,
#j81-gate-layout[data-layout="char-left"] #j81-gate-panel > .j81-scroll-copy > *,
#j81-l3-stage[data-layout="char-left"] .j81-l3-holo-inner > *,
#j81-starfield[data-layout="char-left"] #j81-scroll-panel .j81-scroll-copy > * {
  text-align: right !important;
  align-self: flex-end !important;
}
/* ②b 人物在右 → 左对齐 */
#j81-stage-layout[data-layout="char-right"] #j81-stage-panel > .j81-scroll-copy,
#j81-gate-layout[data-layout="char-right"] #j81-gate-panel > .j81-scroll-copy,
#j81-l3-stage[data-layout="char-right"] .j81-l3-holo-inner,
#j81-starfield[data-layout="char-right"] #j81-scroll-panel .j81-scroll-copy {
  text-align: left !important;
  align-items: flex-start !important;
}
#j81-stage-layout[data-layout="char-right"] #j81-stage-panel > .j81-scroll-copy > *,
#j81-gate-layout[data-layout="char-right"] #j81-gate-panel > .j81-scroll-copy > *,
#j81-l3-stage[data-layout="char-right"] .j81-l3-holo-inner > *,
#j81-starfield[data-layout="char-right"] #j81-scroll-panel .j81-scroll-copy > * {
  text-align: left !important;
  align-self: flex-start !important;
}

/* ③ 行程图正文：吃掉剩余高度后自适应才有意义
   （css/j81-layoutfit_r278.css 的同一条规则并未被 index.html 加载，此处补齐） */
#j81-scroll-panel .j81-scroll-copy > #j81-scroll-desc {
  flex: 1 1 auto !important;
  min-height: 0 !important;
  align-self: stretch !important;
}

/* ══════════════════════════════════════════════════════════════
   ★★ 2026-10-18 v260 全站纠偏（第 2 批：行程图填充分配 + 小仪式引文）
   ══════════════════════════════════════════════════════════════ */

/* ④ 行程图正文：flex-basis 用 0 而非 auto
   用 auto 时正文按内容高度起算再 grow，会把按钮的 margin-bottom 挤出容器；
   实测 actions 底距内容列底只剩 6px（准则 20）。basis:0 让剩余空间分配干净。 */
#j81-scroll-panel .j81-scroll-copy > #j81-scroll-desc {
  /* ★ v260 定调：不撑满。
     行程图文案往往只有一行（如"仗着有本事，把人都看轻"），
     框撑满 296px 只放 75px 文字 → 就是老板说的"文字框只占上半部分、下方大片空白"。
     让框按内容高度收缩，剩余空间交给按钮的 margin-top:auto 吃掉（按钮仍钉底）。 */
  flex: 0 1 auto !important;
  min-height: 0 !important;
  align-self: stretch !important;
  display: flex !important;
  flex-direction: column !important;
  justify-content: flex-start !important;
}

/* ⑤ 小仪式引文：原 `top:103%` 相对全屏 1080 = 1112px，实测整条引文在屏幕外看不见。
   改 bottom 定位，钉在人物脚下、收关钮上方，水平沿用已定版的居中关系。
   ★ v231（2026-10-18）：**只提字号，位置一个字不动**。
     复核实拍 _全站体检_20261018/g5_RITE_小仪式.png 可见：引文位置本来就是对的
     （人物脚下居中、收关钮上方），我先前拿旧的 base_ 图判"引文缺失"是错的，已收回。
     真正的问题是字号 —— 原无独立字号规则，继承 body 字号，实测 ≈25px，
     低于准则⑥下限 33px。补 34px（引文属次层级，取区间下限），并限宽防换行压到人物。
     判词 #j81-rite-judge 不动：index.html:450 的 `writing-mode:vertical-rl`
     是竖排书法（设计意图），不是逐字折行。 */
#j81-rite-quote {
  top: auto !important;
  bottom: 15% !important;
  font-size: 34px !important;
  line-height: 1.55 !important;
  letter-spacing: 0.04em !important;
  max-width: 1200px !important;
  margin-left: auto !important;
  margin-right: auto !important;
  color: rgba(245, 240, 230, 0.88) !important;
}

/* ⑥ 行程图按钮底距：内容列自带 6px 金框边框，正文 flex-grow 吃满后
   把 actions 的 margin-bottom:20 整段挤出 padding box（实测只剩 6px = 边框本身）。
   解法：改由 padding-bottom 预留 14px（+6 边框 = 视觉 20px），margin 归零。 */
#j81-scroll-panel .j81-scroll-copy {
  padding-bottom: 0 !important;
}
#j81-starfield[data-layout] #j81-scroll-panel .j81-scroll-actions {
  margin-bottom: 20px !important;
}

/* ══════════════════════════════════════════════════════════════
   ★★ 2026-10-18 v193 画像五问「总结页」纠偏（#lv1-verdict-modal）
   ------------------------------------------------------------
   老板指正：这一页没跟上来，要和刚定的开屏页同一套金语言。

   体检结论（实测，非猜）：
     ① 面板 1180×998（74% 宽）—— 五问页是 1766×400 金箔卷轴，两页不同族；
     ② 标题「画像」**从来没显示过**：
        css/journey81-opening.css:570 `.gold-holo h1{color:transparent}`
        是留给「气泡金字渐变」的占位，可本页 h1 没有渐变 → 文字透明 = 隐形；
     ③ 正文 24~30px 偏小（准则⑥场景文 33~42px）；
     ④ 三镜是竖排三块，合龙下留 380px 空洞 —— 老板说的"空荡排版"。

   做法：
     A. 壳换成五问页同规格（1766.4 / max-h 1015.2 / 同 padding / flex 列）；
     B. 标题用**开屏页品牌名同款**：实心亮金 #ffe08a + 1.2px 深金描边
        + 三层暗边 + 双层外辉（不玩 background-clip，缩到 0.71 也不糊）；
     C. 三镜竖排 → 三栏横排，正文升到 30px；
     D. 正文区 flex 居中，按钮钉底左对齐（与五问页一致，无人物页不留人物位）。
   ══════════════════════════════════════════════════════════════ */

/* A. 壳：与 #j81-portrait-panel 同规格 */
#lv1-verdict-panel.j81-lv1-panel{
  width:1766.4px !important;
  max-width:1766.4px !important;
  /* ★ 高度必须给定：body 是 flex:1 + overflow:auto，
     壳若 height:auto 会跟着内容塌成 710px，合龙就被挤到可视区外（实测发生过）。 */
  height:972px !important;
  max-height:1015.2px !important;
  min-height:0 !important;
  padding:clamp(22px,34.56px,40px) clamp(36px,76.8px,64px) !important;
  box-sizing:border-box !important;
  display:flex !important;
  flex-direction:column !important;
  overflow:hidden !important;
}

/* B. 标题：开屏页品牌名同款实心亮金（补上被 transparent 挖掉的字） */
#lv1-verdict-panel h1,
#j81-portrait-panel h1,
.j81-auth-panel h1 {
  color:#ffe08a !important;
  -webkit-text-fill-color:#ffe08a !important;
  -webkit-text-stroke:1.2px rgba(96,62,4,.9);
  text-shadow:
    0 1px 0 rgba(72,46,0,.98),
    0 2px 0 rgba(138,92,10,.95),
    0 3px 0 rgba(88,58,6,.9),
    0 5px 10px rgba(0,0,0,.85),
    0 0 18px rgba(255,214,110,.55),
    0 0 42px rgba(255,198,66,.34) !important;
  font-family:"悟道中宋","STZhongsong","KaiTi",serif !important;
  font-weight:400 !important;
  letter-spacing:.16em !important;
  margin:0 0 10px !important;
}
/* 总结页标题是这一页的门面，比五问页再大一档 */
#lv1-verdict-panel h1{
  font-size:64px !important;
  text-align:center;
  text-indent:.16em;              /* 抵消末字后的字距，视觉真正居中 */
  margin:2px 0 14px !important;
}

/* C. 正文区：居中排布，短内容不再堆在上半屏；长内容才滚动 */
#lv1-verdict-body{
  flex:1 1 auto !important;
  min-height:0 !important;
  overflow:hidden !important; /* v10m 老板定调：望诊页无下拉杆，超长由 fitVerdictBody 缩字兜底 */
  display:flex !important;
  flex-direction:column !important;
  justify-content:center !important;
  gap:16px !important;
  padding:0 !important;
  scrollbar-width:none !important;
  -ms-overflow-style:none !important;
}
#lv1-verdict-body::-webkit-scrollbar{display:none !important;width:0 !important;height:0 !important;}
#lv1-verdict-panel > .j81-actions{
  flex:0 0 auto !important;
  margin-top:14px !important;
  /* v295（2026-10-25 老板实拍）：底部按钮移至右边，点起来更顺手 */
  align-self:flex-end !important;
  justify-content:flex-end !important;
}

/* D. 属性条：数值抬到 38px，人格句 19px（原 30/17 太轻） */
#lv1-verdict-panel .lv1-gauges{
  margin:0 !important;
  padding:18px 28px 20px !important;
  gap:38px !important;
}
#lv1-verdict-panel .lv1-gauge-name{ font-size:27px !important; }
#lv1-verdict-panel .lv1-gauge-val{ font-size:38px !important; }
#lv1-verdict-panel .lv1-gauge-persona{ font-size:19px !important; line-height:1.55 !important; }
#lv1-verdict-panel .lv1-gauge-note{ font-size:17px !important; }
#lv1-verdict-panel .lv1-gauge-track{ height:16px !important; }

/* E. 三镜：竖排三块 → 三栏横排，正文 24→30px（准则⑥下限 33 对题目正文，
      此页三镜属「分镜说明」，30px 与 42px 合龙形成两级，不再一条竖线拉到底） */
#lv1-verdict-panel .lv1-three{
  flex-direction:row !important;
  gap:24px !important;
  margin:0 !important;
  align-items:stretch !important;
}
#lv1-verdict-panel .lv1-shot{
  flex:1 1 0 !important;
  min-width:0 !important;
  padding:20px 24px 22px 22px !important;
  display:flex !important;
  flex-direction:column !important;
}
#lv1-verdict-panel .lv1-shot-tag{
  position:static !important;
  width:46px !important;
  height:46px !important;
  font-size:27px !important;
  margin:0 0 12px !important;
  flex:0 0 auto !important;
}
#lv1-verdict-panel .lv1-shot-sub{ font-size:18px !important; margin-bottom:8px !important; }
#lv1-verdict-panel .lv1-shot-text{ font-size:30px !important; line-height:1.6 !important; }

/* F. 合龙：全页最扎眼的一句（42→46px，金更实） */
#lv1-verdict-panel .lv1-core{
  margin:0 !important;
  padding:20px 26px 22px !important;
}
#lv1-verdict-panel .lv1-core-label{ font-size:19px !important; margin-bottom:10px !important; }
#lv1-verdict-panel .lv1-core-text{
  font-size:46px !important;
  line-height:1.42 !important;
  color:#fff3cf !important;
  -webkit-text-fill-color:#fff3cf !important;
  text-shadow:0 0 26px rgba(255,205,90,.55),0 3px 0 rgba(90,58,0,.45) !important;
}
#lv1-verdict-panel .lv1-foot{
  font-size:18px !important;
  letter-spacing:.1em !important;
  margin:0 !important;
  text-align:center !important;
}

/* G. v193 二轮微调（实拍发现）：合龙一句 46px 横铺 1584px，一眼扫不到头
   → 限宽 1280 居中、42px 落两行；foot 抬到 20px；属性条内间距放宽 */
#lv1-verdict-panel .lv1-core-text{
  font-size:42px !important;
  max-width:1280px !important;
  margin:0 auto !important;
  text-align:center !important;
}
#lv1-verdict-panel .lv1-foot{ font-size:20px !important; }
#lv1-verdict-panel .lv1-gauges{ padding:20px 32px 22px !important; }
#lv1-verdict-panel .lv1-gauge-val{ font-size:40px !important; }
#lv1-verdict-panel .lv1-gauge-persona{ font-size:18px !important; line-height:1.6 !important; margin-top:10px !important; }
#lv1-verdict-panel .lv1-three{ gap:26px !important; }

/* H. 标题已可见后，「画像」在页首与合龙上方各出现一次 —— 页首那个是页面身份，
   合龙上方这个小标签原先是替隐形标题占位，现属重复，隐去（不改文案、不改 DOM）。 */
#lv1-verdict-panel .lv1-core-label{ display:none !important; }

/* I. 行程图按钮底距：内容列自带 6px 金框边，margin-bottom:20 被挤出 padding box
   （实测 按钮底 870 / 内容列底 876 = 只剩 6px）。改由 padding 预留 14px（+6 边=20）。 */
/* 该列 border-bottom 实测 0px，故直接留 20px（不是 14+边框） */
#j81-scroll-panel .j81-scroll-copy{ padding-bottom:20px !important; }
#j81-starfield[data-layout] #j81-scroll-panel .j81-scroll-actions{ margin-bottom:0 !important; }

/* J. 真凶：css/j81-overrides_r182.css:123
   `#j81-starfield[data-layout] .j81-scroll-actions{transform:translateY(14px)!important}`
   把这排按钮整体下压 14px —— 正好把 20px 底距吃成 6px（实测 6px）。
   这里取消位移，让底距由内容列 padding-bottom:14（+6 金框边=20）决定。 */
#j81-starfield[data-layout] #j81-scroll-panel .j81-scroll-actions{
  transform:none !important;
}


/* ══════════════════════════════════════════════════════════════
   ★★ 2026-10-18 v195 闯关页 #j81-stage 几何纠偏（准则① ②）
   ------------------------------------------------------------
   实测（v194，char-right，人物=悟空）：
     卷轴 81.82% × 83.98%   ← 准则 79.30% × 85.69%
     人物中心 1605 / 右杆 1534 → 偏右 71px  ← 准则 ≤3px
   成因不是"某条规则写错"，而是 j81-layout-badge_r169.css 里
   自 v116 起叠了十几条互相覆盖的 !important，最后一条生效：
     #j81-stage-layout[data-layout="char-right"] #j81-stage-panel
       { left:44.9% !important; width:81.8% !important }
     #j81-stage-layout[data-layout] #j81-stage-panel { height:84vh !important }
     #j81-stage-layout[data-layout="char-right"] .j81-stage-char { left:99% !important }
   改法：在 adaptive.css（加载最末）用同级特异性 + !important 定稿，
        不再去 layer 里翻改历史规则（越改越乱）。

   数值怎么来的（1920×1080 基准）：
     卷轴宽 79.30% × 1920 = 1522.6   left 保持 44.9%+translateX(-50%) → 中心 862 不动
     卷轴高 85.69% × 1080 = 925.5
     侧杆宽 14.40% × 1522.6 = 219.3，右杆中点 = 1622.9 − 109.6 = 1513.3
     人物 left% = (1513.3 − 100.7) / 1522.6 = 92.8%
     左杆镜像 = 100 − 92.8 = 7.2%（左右只差一个减法，同一个数）
   ══════════════════════════════════════════════════════════════ */

/* ① 卷轴：79.30% × 85.69% */
#j81-stage-layout[data-layout] #j81-stage-panel{
  width:79.30% !important;
  max-width:79.30% !important;
  height:85.69% !important;
  max-height:none !important;
}

/* ② 人物中心 = 侧杆中点（char-right → 右杆；char-left → 左杆） */
#j81-stage-layout[data-layout="char-right"] #j81-stage-char{
  left:92.8% !important;
  right:auto !important;
}
#j81-stage-layout[data-layout="char-left"] #j81-stage-char{
  left:7.2% !important;
  right:auto !important;
}

/* ②b 盘方页人物：CSS 原本 `right:4%` 贴画布边缘（left:auto），
   JS 的 transform 补偿在这种定位下算不准（实测中心仍等于面板右缘）。
   与闯关页同款：改成 left 百分比 + right:auto，再由 _pinAnyChar 微调。 */
#j81-gate-layout[data-layout="char-right"] .j81-stage-char{
  left:92.8% !important;
  right:auto !important;
}
#j81-gate-layout[data-layout="char-left"] .j81-stage-char{
  left:7.2% !important;
  right:auto !important;
}

/* ══════════════════════════════════════════════════════════
   画像五问页 · 字号层级（2026-10-18 纠偏）
   ------------------------------------------------------------
   实测（1920×1080）：题干 41px / 选项 24.14px / 题号行 17.85px。
   题干与选项差 17px，层级断档 —— 选项像"注释"不像"可选项"，
   与《UI规则全书》⑥「清晰层级 + 信息密度变化」不符。
   重排为：题干 41 → 选项 30 → 题号行 22，三档拉开但不失序。
   空间核算：面板 781px 高，题号 29 + 题干 80 + 5×70 + 按钮 70 ≈ 529，
   放大后仍有余量，不会溢出。
   ══════════════════════════════════════════════════════════ */
#j81-portrait-body .phase {
  font-size: 22px !important;
  line-height: 1.45 !important;
  opacity: .92;
}
#j81-portrait-opts .j81-opt {
  gap: 16px !important;
  padding: 12px 18px !important;
  border-radius: 10px;
}
#j81-portrait-opts .j81-opt .letter {
  font-size: 30px !important;
  min-width: 1.15em !important;
  color: #ffe08a !important;
}
#j81-portrait-opts .j81-opt .txt {
  font-size: clamp(24px, 1.55vw, 30px) !important;
  line-height: 1.42 !important;
}
#j81-portrait-opts .j81-pick {
  font-size: 18px !important;
  padding: 6px 16px !important;
}


/* ══════════════════════════════════════════════════════════════
   ★★ 2026-10-18 v214 L3 页几何对齐「闯关页基线」（准则①②⑥）
   ------------------------------------------------------------
   老板实拍指出：L3 卷轴明显比闯关页小一圈、人物飘在画布左缘。

   实测（1920×1080，v213，难2/唐僧/char-left）：
     L3   卷轴 1400×651 → 72.92% × 60.28%，右缘 1949（**超出画布 29px 被裁**）
          人物中心 557 / 侧杆中线 650 → **−93px**
     闯关 卷轴 1523×925 → 79.32% × 85.65%，左缘 297，侧杆中线 407，人物 406 → −1px

   病灶：`#j81-l3-stage[data-layout] #j81-l3-holo` 把宽高**写死 px（1400/651）**，
   而这组数是按 2.15:1「横卷」算的老口径，与准则① 79.30%×85.69% 冲突；
   且 `.j81-l3-stage{inset:1.5vh 1.5vw}` 使 % 基准变成 1862.4 而非 1920，
   所以只能先把 stage 拉平到 0，% 才等于画布比例。

   数值（1920×1080）：
     宽 79.30% × 1920 = 1522.6   高 85.69% × 1080 = 925.5
     人在左 → 卷轴左缘钉 15.47%（297）→ 侧杆中线 = 297 + 14.40%×1522.6/2 = 406.6
     人在右 → 左缘 = 20.70% − 15.47% = 5.23%（100.4）→ 右缘 1623
               侧杆中线 = 1623 − 109.6 = 1513.4（与 406.6 对 960 镜像，差 0.2px）
   ══════════════════════════════════════════════════════════════ */
#j81-l3-stage { inset: 0 !important; }

#j81-l3-stage[data-layout] #j81-l3-holo{
  width: 79.30% !important;
  max-width: 79.30% !important;
  min-width: 0 !important;
  height: 85.69% !important;
  max-height: 85.69% !important;
  aspect-ratio: auto !important;
  top: 50% !important;
  transform: translateY(-50%) !important;
}
/* 左右镜像：只差一个减法，同一个数（准则·镜像铁律） */
#j81-l3-stage[data-layout="char-left"] #j81-l3-holo{
  left: 15.47% !important;
  right: auto !important;
}
#j81-l3-stage[data-layout="char-right"] #j81-l3-holo{
  left: calc(20.70% - 15.47%) !important;
  right: auto !important;
}

/* ⑥ 正文在「标题块—按钮」之间垂直居中，避免卷轴变高后正文全挤在上半部 */
#j81-l3-stage[data-layout] #j81-l3-holo .j81-l3-holo-inner > #j81-l3-desc{
  margin-top: auto !important;
  margin-bottom: auto !important;
}

/* ★ v214b 内容列避让人物（准则①「场景文字框右缘 ≤ 气泡左缘−24」的同源要求）
   人物中心钉在杆中线后，身体 340px 宽、右缘落到卷轴左缘 +18.4% 处；
   内容列原来左右各 7%，正文会压到人物身上（实拍可见"肉"字被唐僧遮住）。
   → 人物侧内缩 20%（=18.4% 人物 + 1.6% 间隙），对侧保持 7%。

   ★★★ v223（2026-10-18）老板：「场景文字框可以放大，文字自适应」
   28% 是"五人共用一个数"，且按**武器尖**（立绘整图右缘）算 —— 武器又细又高、
   多落在文字带上方，把它当墙是把正文白让一条街（实测正文框只占卷轴 65%，
   参考图 73%）。改为读 JS 由「躯干带真实像素 + 24px 间隙」算出的 CSS 变量：
     --j81-l3-aside  人物侧让位量（逐人不同，悟空/沙僧/唐僧/八戒/白龙各自量）
     --j81-l3-far    对侧留白 3%（原 7%，参考图正文几乎顶到卷轴内缘）
   变量缺失时回落到旧的 28% / 7%，保证任何异常都不会把正文压成窄条。 */
#j81-l3-stage[data-layout="char-left"] #j81-l3-holo .j81-l3-holo-inner{
  left: var(--j81-l3-aside, 28%) !important;
  right: var(--j81-l3-far, 3%) !important;
}
#j81-l3-stage[data-layout="char-right"] #j81-l3-holo .j81-l3-holo-inner{
  left: var(--j81-l3-far, 3%) !important;
  right: var(--j81-l3-aside, 28%) !important;
}


/* ══════════════════════════════════════════════════════════════
   ★★ 2026-10-18 v216 全站卷轴尺寸归一到准则①（行程图 / 盘方）
   ------------------------------------------------------------
   自查实测（1920×1080，五人）：
     L3   79.30% × 85.69%  ✅（v214 已修）
     闯关 79.30% × 85.69%  ✅
     行程图 81.80% × 84.00% ✗  盘方 81.80% × 84.00% ✗
   病灶：
     · 行程图按老写法定死 82%（char-left）/ 84%（char-right）；
     · 盘方沿用 base 84%，且 `.j81-gate-layout` 有 1.5vw inset，
       84% 是「inset 后宽度」的 84%（=画布 81.8%），双重偏差。
   改法（与 L3 完全同一组数，不再各页一套）：
     宽 79.30% / 高 85.69%；人在左 → 左缘 15.47%；
     人在右 → 左缘 = 20.70% − 15.47% = 5.23%（同一镜像数）。
     行程图原本右缘钉 98%，故左缘取 98% − 79.30% = 18.70%；
     人在右时左缘钉 2%（与右缘 98% 对称）。
   ══════════════════════════════════════════════════════════════ */

/* ⚠ 单位必须用 vw/vh，不能用 %：
   实测 #j81-starfield 的基高是 1118（不是 1080），#j81-gate-layout 带
   transform 又是窄盒 —— 写 % 会分别算成 82.79% 和 −464px（面板飞出画布）。
   vw/vh 只跟视口走，换宿主也不会失真。 */
/* ① 行程图（#j81-starfield 宿主） */
#j81-starfield[data-layout] #j81-scroll-panel{
  width: 79.30vw !important;
  max-width: 79.30vw !important;
  height: 85.69vh !important;
  max-height: none !important;
  aspect-ratio: auto !important;
}
#j81-starfield[data-layout="char-left"] #j81-scroll-panel{
  left: 18.70vw !important;
  right: auto !important;
}
#j81-starfield[data-layout="char-right"] #j81-scroll-panel{
  left: 2vw !important;
  right: auto !important;
}

/* ② 盘方（宿主带 transform，% 基准不可靠 → 同样走 vw/vh） */
#j81-gate-layout[data-layout] #j81-gate-panel{
  /* 实测 v217：面板被 translate(-50%,-50%) 居中，与我写的 left 相互抵消
     → 跑到 −464px。这里把纵向位移定死为 -50%，横向交给 left。 */
  top: 50% !important;
  transform: translateY(-50%) !important;
  width: 79.30vw !important;
  max-width: 79.30vw !important;
  height: 85.69vh !important;
  max-height: none !important;
  aspect-ratio: auto !important;
}
#j81-gate-layout[data-layout="char-left"] #j81-gate-panel{
  left: 15.47vw !important;
  right: auto !important;
}
#j81-gate-layout[data-layout="char-right"] #j81-gate-panel{
  left: calc(20.70vw - 15.47vw) !important;
  right: auto !important;
}

/* ★ v219 正文左右内边距清零 —— 对齐铁律（人物在左→文字右对齐）
   实测闯关页：内容列 511→1742，标题/选项/按钮右缘都 = 1742，
   唯独正文 #j81-stage-body 带 45.1px 左右 padding → 文字右缘只有 1696，
   比标题短 46px（实拍可见正文块"缩进"了一截）。盘方同源。
   ★ v10k（2026-10-19 老板定调）：改为左右各留 24px——框右边线仍钉 1742 对齐铁律，
   文字在框内四周不贴边；45px 缩进观感改由"框=对齐块"消化。 */
#j81-stage-layout[data-layout] #j81-stage-body,
#j81-gate-layout[data-layout] #j81-gate-rx{
  padding-left: 24px !important;
  padding-right: 24px !important;
}

/* ★ v220 老板 10-18 实拍三条：
   ① 云朵没居中 → 已改 JS（CLOUD_CX 按立绘脚心质心）
   ② 场景文字框可以放大、文字自适应 → L3 上限 42→56px（JS 内 _cap2）
   ③ 顶部文字还要下移（按参考示意图：标题块距卷轴上缘约 9~10% 高）
      实测原 top:36px = 39px/3.9%，贴着上边框。改 9% ≈ 83px。 */
#j81-l3-stage[data-layout] #j81-l3-holo .j81-l3-holo-inner{
  top: 9% !important;
}

/* ══════════════════════════════════════════════════════════════
   ★★ 2026-10-18 v230 过招页（duel chat）纠偏
   ------------------------------------------------------------
   【来源】静态审查 css/journey81.css:1383~1420 定位；
           ⚠ 老板电脑死机后沙箱不可用（Bash/PowerShell/Grep 全部
           sandbox creation failed），本段**未经实拍复核**，待工具恢复后验。
   违规三条：
     ① 准则⑥「场景文字 33~42px」—— .j81-duel-msg 写 font-size:0.95em，
        实测 ≈28px，低于下限 33px。
     ② 卡片 max-width:84% 偏窄，占不满对话列。
     ③ 「顶部被裁」真因不是高度：chat 本来就有 max-height:38vh +
        overflow-y:auto，滚动是好的；错在
          scrollbar-width:none  +  ::-webkit-scrollbar{display:none}
        把滚动条彻底藏了，而 JS 又 setTimeout 把 scrollTop 钉到
        scrollHeight（底部）→ 上面的消息既看不见、也无从滚起。
   改法：字号进准则⑥区间、卡片放宽、滚动条改「细而可见」。
   不动：max-height:38vh（保留滚动兜底，不无限增高）。
   ══════════════════════════════════════════════════════════════ */
.j81-duel-chat{
  max-height: 38vh !important;
  overflow-y: auto !important;
  scrollbar-width: thin !important;
  scrollbar-color: rgba(212,175,55,0.5) transparent !important;
}
.j81-duel-chat::-webkit-scrollbar{ display: block !important; width: 6px !important; }
.j81-duel-chat::-webkit-scrollbar-thumb{
  background: rgba(212,175,55,0.5) !important; border-radius: 3px !important;
}
.j81-duel-chat::-webkit-scrollbar-track{ background: transparent !important; }
.j81-duel-msg{
  max-width: 88% !important;
  font-size: 1.15em !important;   /* 0.95em≈28px → ≈34px，进准则⑥ */
  line-height: 1.6 !important;
}


/* ══════════════════════════════════════════════════════════════
   ★★ 2026-10-18 v10 全站卷轴水平归位（老板 23:36 抽查 · 示意102~106）
   ------------------------------------------------------------
   【背景】v195/v196/v216 三代规则都把「侧杆 14.40%」当成**卷轴宽**的
   14.40% 来算杆心（≈110px），把人物钉进卷轴内 ~108px；
   人物钉杆已由 app_r185.js v233 改为**实测杆件元素中心**（差≤3px）。
   本段把**卷轴本身**水平归位到「杆心 = 画布 14.40%（=276.5px）」。

   【数值】杆件中心实测在卷轴左缘 +2px（gs-rod 12px 宽，骑跨缘上）
     → 卷轴左缘目标 = 276.5 − 2 = 274.5px = 14.297vw
     → 镜像（char-right 右缘）= 1920 − 274.5 − 1522.55 = 122.95
        即 calc(20.70vw − 14.297vw)（20.70 = 100 − 79.30，镜像铁律同一数）

   【垂直】行程图原 top:48.3% 使卷轴上缘 59 / 下缘 984（准则 76.7/1002.1，
   上移 18px，老板图2「整体上移、底部黑空」）→ 归 50%。
   闯关/盘方/L3 垂直已 ✅（77.3/1002.7，差 0.6px 不动）。
   ══════════════════════════════════════════════════════════════ */

/* ① 闯关页 STAGE 面板（char-left 右移前缘现状 296.6 → 274.5） */
#j81-stage-layout[data-layout="char-left"] #j81-stage-panel{
  left: calc(50% + 75.8px) !important;   /* 274.5 + 半宽 761.275 − 960 */
  right: auto !important;
}
#j81-stage-layout[data-layout="char-right"] #j81-stage-panel{
  left: calc(50% - 75.8px) !important;   /* 镜像同一个数（镜像铁律） */
  right: auto !important;
}

/* ② 盘方 GATE 面板（v216 用 vw/vh → 全改布局 px）
   【为什么用 px】画布是「1920×1080 固定排版 + transform 整体缩放」：
   布局 px 恒为设计稿值、随画布等比缩放；vw/vh 跟浏览器窗口走，
   1366×607 窗口下 79.30vw 只有 1083（应 1522）、85.69vh 只有 520（应 925）
   → 卷轴缩水 30%/44%（老板行程图实拍「卷轴变小、贴顶、底部黑空」真因）。
   px 的包含块原点和 vw 解析完全一致（1920 窗口下逐像素相同），只是不再随窗口失真。 */
#j81-gate-layout[data-layout] #j81-gate-panel{
  width: 1522.55px !important;
  max-width: 1522.55px !important;
  height: 925.44px !important;
  max-height: none !important;
}
#j81-gate-layout[data-layout="char-left"] #j81-gate-panel{
  left: 274.5px !important;
  right: auto !important;
}
#j81-gate-layout[data-layout="char-right"] #j81-gate-panel{
  left: 122.95px !important;   /* = 1920 − 274.5 − 1522.55（镜像铁律同一数推导） */
  right: auto !important;
}

/* ③ 行程图 BOARD 面板（同②，vw/vh → 布局 px；镜像铁律同一数）
   【垂直】top 的 50% 包含块是 #j81-starfield（实测高 1043.4 ≠ 画布 1080，
   原解析出 521.7 → 卷轴上缘 59，老板图2「整体上移、底部黑空」）。
   +18.3px 把解析值顶到 540，与闯关/盘方/L3 同一条 77.3/1002.7 线。 */
#j81-starfield[data-layout] #j81-scroll-panel{
  width: 1522.55px !important;
  max-width: 1522.55px !important;
  height: 925.44px !important;
  max-height: none !important;
}
#j81-starfield[data-layout="char-left"] #j81-scroll-panel{
  left: 274.5px !important;
  right: auto !important;
  top: calc(50% + 18.3px) !important;
}
#j81-starfield[data-layout="char-right"] #j81-scroll-panel{
  left: 122.95px !important;
  right: auto !important;
  top: calc(50% + 18.3px) !important;
}

/* ④ L3 出场页卷轴（15.47% → 14.297%，同一镜像数） */
#j81-l3-stage[data-layout="char-left"] #j81-l3-holo{
  left: 14.297% !important;
  right: auto !important;
}
#j81-l3-stage[data-layout="char-right"] #j81-l3-holo{
  left: calc(20.70% - 14.297%) !important;
  right: auto !important;
}

/* ⑤ L3 按钮上移（老板图1：按钮太低；以图3 闯关页底距 67px 为标准）
   现状底距 26px → 需净上移 41px。
   ⚠ #j81-l3-desc 带 margin-top/bottom:auto（垂直居中），会先吃掉固定
   20px 推量（实测两组数：+41→上移 21，+82→上移 62，位移=mb−20）
   → 写 61，实测落点即 26+41=67。 */
#j81-l3-stage[data-layout] #j81-l3-holo .j81-l3-holo-inner > .j81-scroll-actions{
  margin-bottom: 61px !important;
}

/* ⑥ L3 对侧留白 3% → 3.55%（老板图1：右对齐右边留白太少；
   图3 闯关页实测 卷轴右缘−内容右缘 = 54px = 卷轴宽 3.55%，对齐到同一值。
   JS 只写 --j81-l3-aside（人物侧），对侧恒走本段。） */
#j81-l3-stage[data-layout="char-left"] #j81-l3-holo .j81-l3-holo-inner{
  right: 3.55% !important;
}
#j81-l3-stage[data-layout="char-right"] #j81-l3-holo .j81-l3-holo-inner{
  left: 3.55% !important;
}

/* ⑦ STAGE/GATE 内容框绝对位置补偿（2026-10-18 v10 追加）
   内容框以 inset 锚在面板内（left/right 内缩 %），面板左移 22.1px 后
   内容框跟着左移，而老板确认的图3 文字布局是**绝对位置**（右缘 1742）。
   负外边距把框缘推回：char-left 扩右缘、char-right 扩左缘，
   同一个数 22.1px（镜像铁律）。框宽不变、右对齐文字右缘回到 1742。 */
#j81-stage-layout[data-layout="char-left"] #j81-stage-panel > .j81-scroll-copy,
#j81-gate-layout[data-layout="char-left"] #j81-gate-panel > .j81-scroll-copy{
  margin-right: -22.1px !important;
}
#j81-stage-layout[data-layout="char-right"] #j81-stage-panel > .j81-scroll-copy,
#j81-gate-layout[data-layout="char-right"] #j81-gate-panel > .j81-scroll-copy{
  margin-left: -22.1px !important;
}

/* ⑧ 行程图容器 .j81-board-view 高度（2026-10-19 v10b 双视口实测揪出）
   journey81.css 写死 height:100vh / max-height:100dvh —— 它在 #j81-canvas
   **内部**（画布恒 1920×1080 布局 px、整体 transform 缩放），100vh 让容器
   高度跟着浏览器窗口走：1366×607 窗口下只占画布上部 607/1080，
   底部 44% 全黑、星图与境界条整体上浮（老板行程图实拍「底部大片黑空」真因）。
   钉 1080px（=设计稿满幅，1920 窗口下与 100vh 逐像素相同）。 */
.j81-board-view{
  height: 1080px !important;
  max-height: none !important;
}

/* ⑨ BOARD 面板 top 去百分号（50% 的包含块星图高度曾被 ⑧ 牵连、
   且 % 基准随容器链抖动；纯 px 一劳永逸。539.4 − translateY(462.72) = 76.7
   → 卷轴上缘 77.3，与闯关/盘方/L3 同线。） */
#j81-starfield[data-layout="char-left"] #j81-scroll-panel,
#j81-starfield[data-layout="char-right"] #j81-scroll-panel{
  top: 539.4px !important;
}

/* ══════════════════════════════════════════════════════════════
   ★ v10i（2026-10-19 老板微调）：行程图文框/按钮右缘钉到示意图标定线
   ──────────────────────────────────────────────────────────────
   问题：BOARD 文框右缘实测 1716@1366 / 1711@1920，与 STAGE/GATE 的
   标定线 1742 差 26~31px，且随视口漂移（链路三层内边距含
   clamp(16,2vw,32) 与 vw/% 项，框本身被 JS 内联 width:100% 钉死，
   margin 补偿不生效——实测确认）。
   改法：文框右缘 = 内容列边框右缘 − 内容列 padding-right，而
   内容列边框右缘 = 1779 − clamp(16,2vw,32)（双视口实测拟合，vw 项
   来自面板 padding）。故 padding-right = 37px − clamp(16,2vw,32)，
   文框/按钮/右对齐文字任意视口均钉到 1742.1（=STAGE 标定线）。
   只动 char-left（右对齐页），char-right 镜像页不动。 */
.j81-starfield[data-layout="char-left"] #j81-scroll-panel .j81-scroll-copy {
  padding-right: calc(37px - clamp(16px, 2vw, 32px)) !important;
}

/* ══════════════════════════════════════════════════════════════
   ★ v10j（2026-10-19 老板定调）：判招对话区无下拉杆
   JS 只渲染"当下这轮"（app_r185 v10j），对话不再累积，
   这里把对话区滚动彻底关掉——一屏显示完，任何情况不出下拉杆。 */
.j81-duel-chat{
  max-height: none !important;
  overflow-y: visible !important;
  scrollbar-width: none !important;
}
.j81-duel-chat::-webkit-scrollbar{ display: none !important; width: 0 !important; }

/* ══════════════════════════════════════════════════════════════
   ★ v10k（2026-10-19 老板定调）
   ① 画像五问整屏无下拉杆双保险：面板/正文/舞台任何情况下不画滚动条
     （整屏放下一靠 fitPortraitStem 题干自适应、二靠 shrinkPortraitToFit
       选项降档兜底，app_r185 v10k）；
   ② 场景文字框（电流感粗边框）文字别贴边：横向留白 18 → 24px，
     竖向留白由 hugBoxToText 下限 6 → 14px 保证（app_r185 v10k）。 */
#j81-portrait-panel,
#j81-portrait-body,
#j81-portrait-stage {
  scrollbar-width: none !important;
  -ms-overflow-style: none !important;
}
#j81-portrait-panel ::-webkit-scrollbar,
#j81-portrait-body ::-webkit-scrollbar,
#j81-portrait-stage ::-webkit-scrollbar {
  display: none !important;
  width: 0 !important;
  height: 0 !important;
}
.j81-scroll {
  padding-left: 24px !important;
  padding-right: 24px !important;
}


/* ══════════════════════════════════════════════════════════════
   ★ v10n（2026-10-19）行程图 BOARD 面板底部纠偏 —— 按示意图97标定
   ------------------------------------------------------------
   老板 16:39 实拍：「全部人物的闯关页第二页底部超出边界」。
   标定（布局px，k=0.7292 由左右缘 274.5/1797 反推校验 ±3px）：
     面板 顶 48 / 底 ~815（高 ~767）
     芯片行 738-773（距底框 ~42）
     按钮 583-638（说明框底→按钮顶 ~124）
   现状：面板 77.3→1002.7（高 925.44，底缘超出标定 ~185），
   芯片 944-970、按钮 823-907（margin-top:auto 钉死面板底）。
   面板内容栈实测 919 塞不进 767 → 底饰金条与芯片行脱流钉底。 */
#j81-starfield[data-layout] #j81-scroll-panel{
  height: 744px !important;
  max-height: none !important;
  top: 62px !important;
  transform: none !important;   /* 抵消 layout-badge 的 translateY(-50%) */
}
#j81-starfield[data-layout="char-left"] #j81-scroll-panel,
#j81-starfield[data-layout="char-right"] #j81-scroll-panel{
  top: 62px !important;
}
/* 底饰金条：脱流钉面板底缘（原本就是装饰性底框） */
#j81-starfield[data-layout] #j81-scroll-panel .j81-scroll-chrome-bot{
  position: absolute !important;
  left: 0 !important;
  right: 0 !important;
  bottom: 0 !important;
}
/* 芯片行：它 DOM 上在 .j81-scroll-chrome-bot 内 → 以底条为包含块。
   v10o：面板底缘 815→806，底条随之下移 → bottom 18→41，芯片底缘保持 764（距框 42） */
#j81-starfield[data-layout] #j81-scroll-panel .j81-realm-legend{
  position: absolute !important;
  top: auto !important;
  bottom: 18px !important;
  left: 54px !important;
  right: 54px !important;
  margin-top: 0 !important;
}
/* 按钮：v10o 面板顶 48→62（内容整体下移 14），margin 63→51，按钮顶保持 ~583 */
#j81-starfield[data-layout] #j81-scroll-panel .j81-scroll-actions{
  margin-top: 13px !important;
  margin-bottom: 0 !important;
}


/* ══════════════════════════════════════════════════════════════
   ★ v10p（2026-10-19）闯关页 STAGE 按示意图98标定（老板 17:42 实拍）
   ------------------------------------------------------------
   老板：①顶部内容超出对齐边界 ②底部按钮要上移 ③八戒站卷轴左下角
        ④（图2 行程图）场景文字太小、拉大文字框、勿贴边
   示意98标定（布局px，k≈0.7401 由左右缘 274.5/1797 校验）：
     面板 顶 ~65 / 底 ~841（高 ~776）；人物中心≈面板中心 ~453
     场景文框 370-528；选项条 560-600；hint 628-669；按钮 740-781
   现状：面板 77.3→1002.7（高 925.5，底缘超出 ~160）；
        人物垂直钉画布中心 540 → 相对面板偏低，站"左下角"。 */
#j81-stage-layout[data-layout="char-left"] #j81-stage-panel,
#j81-stage-layout[data-layout="char-right"] #j81-stage-panel{
  height: 71.85% !important;   /* 1080 的 71.85% = 776；65+776=841 回标定 */
  max-height: none !important;
  top: 65px !important;
  /* v10p 勘误：left 是"中心锚"（calc(50%±75.8)=中心 1035.8/884.2），
     横向居中靠 translateX(-50%)；写 none 会让卷轴右移 761px 画出 1920。
     只需抵消 translateY(-50%)（垂直改由 top:65 钉），横向保留。 */
  transform: translateX(-50%) !important;
}
/* 人物垂直：钉画布中心 50% → 面板中心（top:50% + 元素自带 translateY(-50%)，
   人物盒中心=面板中心 453，与示意98一致）；
   横向仍由 _pinAnyChar 钉杆中心（v10 规则②老板拍板，不动） */
#j81-stage-layout[data-layout="char-left"] .j81-stage-char,
#j81-stage-layout[data-layout="char-right"] .j81-stage-char{
  top: 50% !important;
}

/* ══════════════════════════════════════════════════════════════
   v10q（2026-10-19 18:02 老板抽查）：唐僧云朵偏小、沙僧人/泡偏离——
   真因在 app_r185 的内联钉（applyCharToDom + normalizeCharGeometry），
   已从 JS 侧修；此块仅留勘误记录，勿再叠 CSS（内联 important 压一切）。 */

/* ══════════════════════════════════════════════════════════════
   v10r（2026-10-19 18:17 老板实拍）：行程图 BOARD 卷轴太窄（五人皆然）。
   示意97 标定（真实页面红框页）：面板 ≈244-1820（宽 1576，82%）；
   现状 274.5-1797（1522.55，79.3%）。做法：面板左右各外扩 27、宽 +54；
   内容列改钉布局 px 保持原位（右缘守 1742 标定，desc 左缘 348 不动）。
   char-right 按镜像铁律取 1920−x。 */
#j81-starfield[data-layout] #j81-scroll-panel{
  width: 1576.55px !important;
  max-width: 1576.55px !important;
}
#j81-starfield[data-layout="char-left"] #j81-scroll-panel{
  left: 247.5px !important;
}
#j81-starfield[data-layout="char-right"] #j81-scroll-panel{
  left: 95.95px !important;
}
/* 内容列：绝对位置不变 → 相对新面板钉 px（char-left 内容 348-1742） */
#j81-starfield[data-layout="char-left"] #j81-scroll-panel > .j81-scroll-copy{
  left: 100.5px !important;
  right: 82px !important;
}
/* char-right 镜像（内容 178-1572） */
#j81-starfield[data-layout="char-right"] #j81-scroll-panel > .j81-scroll-copy{
  left: 82px !important;
  right: 100.5px !important;
}

/* v10r 勘误1：scroll-copy 不是面板直接子级（> Combinator 落空），
   去 > 提特异性重钉；右缘 1769.1 → 守 1742。 */
#j81-starfield[data-layout="char-left"] #j81-scroll-panel .j81-scroll-copy{
  left: 100.5px !important;
  right: 82px !important;
}
#j81-starfield[data-layout="char-right"] #j81-scroll-panel .j81-scroll-copy{
  left: 82px !important;
  right: 100.5px !important;
}
/* ★ v10s（2026-10-19）：老板定调——内容唯一边界=回纹内对角四点，其他规定作废。
   芯片行原钉面板底 18px，会越过内容边界(面板底−74)压到底部回纹；
   改为锚在 apex 底上方 10px（面板 bottom = 74+10 = 84）。 */
#j81-starfield[data-layout] #j81-scroll-panel .j81-realm-legend{
  bottom: 84px !important;
}
/* ★ v10t（2026-10-19 19:04 老板指出）：闯关操作条的底部渐隐垫底
   （r169.css 2437 行加的暗色渐变）会从牌匾 PNG 的透明下缘透出，
   三个按钮全部像被横刀切断（"底框有颜色遮挡"）。
   v10s 后内容已钉死在回纹框内、不再滚动，该垫底已无存在必要——撤除。 */
#j81-stage-panel .j81-scroll-actions{
  background: none !important;
}
/* ══════════════════════════════════════════════════════════════
   ★ v10u（2026-10-19 19:14+19:11 老板两组抽查，行程图 BOARD 页三问题）
   ──────────────────────────────────────────────────────────────
   ① kicker 与 HUD 芯片撞车 + 八角标被文框压：v10s 把内容列 padding
     清零后，kicker（内容列首件）顶到 166.7，与顶饰带 HUD 芯片
     （163.7-200.8）同高重叠成一团；场景文框随之上移 45px，
     盖住星图当前难八角标（底 399.9）。给 kicker 加 50px 顶距，
     一并解决（kicker 216.7 > 饰带底 209.8；文框底 417.8 > 399.9）。
   ② 卷轴窄、悟空悬在右下角卷外：面板再镜像加宽 120
     （1576.55→1696.55），人物钉杆随之外移，悬挂量 253→~180。
     回纹边界由 pinApexAll 运行时自动重算，内容列自动跟。 */
#j81-starfield[data-layout] #j81-scroll-panel .j81-scroll-copy > .j81-scroll-kicker{
  margin-top: 50px !important;
}
#j81-starfield[data-layout] #j81-scroll-panel{
  width: 1696.55px !important;
  max-width: 1696.55px !important;
}
#j81-starfield[data-layout="char-left"] #j81-scroll-panel{
  left: 187.5px !important;
}
#j81-starfield[data-layout="char-right"] #j81-scroll-panel{
  left: 36px !important;
}
/* ══════════════════════════════════════════════════════════════
   ★ v10v（2026-10-19 19:30 老板抽查）：盘方页场景文框+对话框太靠上、
   底部留白太多。GATE 内容栈里 219px 空闲全被按钮的 margin-top:auto
   吃掉（文框 269-448、对话框 482-570、按钮 823-907）。
   给场景文框(#j81-gate-rx)也加 margin-top:auto，空闲一分为二：
   文框组整体下移居中，上下呼吸均匀（各 ~126px）。 */
#j81-starfield[data-layout] #j81-gate-panel .j81-scroll-copy > #j81-gate-rx,
#j81-gate-panel .j81-scroll-copy > #j81-gate-rx{
  margin-top: auto !important;
}
/* ══════════════════════════════════════════════════════════════
   ★ v10w（2026-10-19 19:32 老板抽查）：判词页底部按钮没严格贴布局
   边界，底缘悬空 61px（margin-bottom:61px 历史值）。清零，
   按钮即钉到回纹框底（内盒底 = apex 底，pinApexAll 保证）。 */
#j81-l3-stage[data-layout] #j81-l3-holo .j81-l3-holo-inner > .j81-scroll-actions{
  margin-bottom: 0 !important;
}

/* ───────── v10x 卷轴同宽窄（2026-10-19 22:40 指令）─────────
   事实（puppeteer 实测，1920 画布坐标）：
     盘方页卷轴宽 1696（char-left: 187.5~1884 / char-right: 36~1732.5）
     闯关/入关页卷轴仅 1522，老板多次要求"和其他页一样宽窄"。
   三板中心点本就一致（char-left 1035.8 / char-right 884.2，与盘方相同），
   故只需把 width 放宽到 1696，位置关系自动与盘方页重合。 */
/* ───────── v10y 说话阶段空间压榨治理（2026-10-19 22:55 指令）─────────
   病根（puppeteer 实测，1920 画布坐标）：内容列 141~765 内，
   血条行 37 + 段题 35+距 + 标题 66+距 + 副题 28+距 ≈ 234px 头部，
   正文框只剩 102.7px（内高 ~67），180 字妖说白溢出 ~75px 被选项行切断
   （老板截图「场景文字被压缩看不见」）。
   ① hp 血条行：lv2 引擎恒空但仍占 37px → :empty 隐藏。
   ② 头部三元素外边距收到呼吸级（原累计 ~69px 间距）。
   释放 ~87px 由正文框 flex 吃回，FIT_MIN=22 下 142px 文本完整可见。
   注：内容列四至 pinApexAll 内联 inset 钉死（18:48 回纹规则），此处不动。 */
#j81-stage-hp:empty { display: none !important; }
#j81-stage-panel #j81-stage-phase { margin: 4px 0 2px !important; }
#j81-stage-panel #j81-stage-title { margin: 2px 0 4px !important; }
#j81-stage-panel #j81-stage-sub { margin: 2px 0 6px !important; }
#j81-stage-layout[data-layout] #j81-stage-panel,
#j81-gate-layout[data-layout] #j81-gate-panel {
  width: 1696px !important;
  max-width: 1696px !important;
}

/* （旧 v10y 内容列 top/bottom 覆盖已删：pinApexAll 内联 inset !important
   压一切 CSS，该段从不生效，只会误导后来者。空间治理见上方同名注释块。 */

/* ───────── v10y-2 说话阶段正文框空间治理（2026-10-19 23:20 实测追加）─────────
   三处实测赘肉（1920 画布坐标）：
   ① 正文框 margin .45em/.6em（随字号 9.9+13.2px）——清零，框顶直接贴段题；
   ② 过招选项壳 .j81-trial-box padding 12+12、margin-top 4 ——收到 6/6/0；
   ③ 输入框 line-height 1.5（34.8px）——收到 1.35，行高压到 ~31px。
   合计再释放 ~50px 由正文框 flex 吃回。 */
#j81-stage-panel #j81-stage-body { margin: 0 !important; }
#j81-stage-panel #j81-stage-choices .j81-trial-box {
  padding-top: 6px !important;
  padding-bottom: 6px !important;
  margin-top: 0 !important;
}
#j81-stage-panel .j81-ask-line textarea.j81-input { line-height: 1.35 !important; }

/* ───────── v10z 给药框拉通内容列（2026-10-20 00:21 实拍纠偏配套）─────────
   原随右对齐缩在右半列（实测宽仅 858），空出左半失衡；拉通后与场景文字框
   同宽同线，进疗程按钮仍在框内左下。 */
#j81-stage-layout[data-layout] #j81-stage-panel > .j81-scroll-copy > #j81-medicine { align-self: stretch !important; }

/* ───────── v10z5 全板同宽同格（2026-10-20 02:18 老板：卷轴窄感蔓延）─────────
   病根（puppeteer 实测 1920 画布坐标，char-left 布局）：
     BOARD  188~1884 ✅ / STAGE 188~1884 ✅（v10x 已修好）
     GATE   274~1971 ❌ v10x 只把宽 1522→1696，左缘没动 → 右缘溢出画布 51px
     L3     274~1797 ❌ 宽仍 1522（79.30%），从未加宽
   统一钉到主板网格（镜像铁律：char-right = 1920 − 右缘/左缘 互换）：
     char-left 187.5~1883.5，char-right 36.5~1732.5，全板宽 1696。 */
#j81-gate-layout[data-layout="char-left"] #j81-gate-panel { left: 187.5px !important; right: auto !important; }
#j81-gate-layout[data-layout="char-right"] #j81-gate-panel { left: 36.5px !important; right: auto !important; }
#j81-l3-stage[data-layout] #j81-l3-holo {
  width: 1696px !important;
  max-width: 1696px !important;
}
#j81-l3-stage[data-layout="char-left"] #j81-l3-holo { left: 187.5px !important; right: auto !important; }
#j81-l3-stage[data-layout="char-right"] #j81-l3-holo { left: 36.5px !important; right: auto !important; }

/* ───────── v10z9（2026-10-20 22:20 老板抽查纠偏）─────────
   ① 四板加高 776/744/734 → 860（画布px，纵向居中不变）：
     卷轴占屏高 79.6%（原 71.9%）。多轮「卷轴偏窄/按钮偏上把空间压榨/
     场景文字被压缩」的共同背景是板矮——内容挤在板内上中部，板外下方
     大片星空留白。加高后内容列由 pinApexAll 按回纹自动重钉，正文框
     flex 吃回新增空间，按钮仍钉底（margin-bottom:20 不变）。
     L3 顺带解掉 734 上限（判词页与其他板同高同格）。
   ② 唐僧人物调小 ~12%（实测生效源为 r169:2928 的 min(24vw,430px)，
     同特异性后到者赢，改 21vw/380；只动 STAGE 唐僧，BOSS 未点名 GATE/BOARD 不动）：
     老板实拍「唐僧有点偏大，云朵大小合适」——只缩人物，云朵/气泡
     由 normalizeCharGeometry 按人物底缘/顶缘自动重钉，比例关系不动。
     只动 STAGE/GATE 的唐僧（BOSS 看的第2难页）；BOARD 人物未点名不动。 */
#j81-stage-layout[data-layout] #j81-stage-panel,
#j81-gate-layout[data-layout] #j81-gate-panel,
#j81-starfield[data-layout] #j81-scroll-panel,
#j81-l3-stage[data-layout] #j81-l3-holo {
  height: 860px !important;
  max-height: none !important;
  aspect-ratio: auto !important;
}
/* 唐僧尺寸不由 CSS 管：app_r185 applyCharToDom 内联钉（v10z9 起 300px，
   云朵百分比反补偿保持像素不变）。此处故意留空，防后来者再改 CSS 空转。 */

/* ══════════════════════════════════════════════════════════════
   ★ v281（2026-10-21 18:28 老板疑「卷轴过宽过大」——查实并全站归位）
   ──────────────────────────────────────────────────────────────
   现状（puppeteer 实测）：四板全 1696 宽（88.3%，187.5~1884），
   超出图1(106_246)标定右缘 95%(=1824)；char-left 人物杆在 187.5，
   白龙立绘被挤到屏缘（18:27 实拍银枪贴边、险些出屏）。
   归位到 v10r 网格（示意97 标定 244~1820，右缘与图1 的 95% 吻合）：
     宽 1576.55（82.1%），char-left 247.5~1824.05，char-right 95.95~1672.5。
   四板同宽同中心（「一样宽窄」铁律不破），中心仍是 1035.8/884.2，
   只是把 v10u/v10x/v10z5 三轮回超 widening 收回到 v10r 标定值。
   v10y 空间治理、v10z9 高度 860 均与宽度无关，不动。
   STAGE 的 left 是 calc(50%±75.8) 钉中心，宽变左右对称收，无需动 left。 */
#j81-stage-layout[data-layout] #j81-stage-panel,
#j81-gate-layout[data-layout] #j81-gate-panel,
#j81-starfield[data-layout] #j81-scroll-panel,
#j81-l3-stage[data-layout] #j81-l3-holo {
  width: 1576.55px !important;
  max-width: 1576.55px !important;
}
#j81-gate-layout[data-layout="char-left"] #j81-gate-panel { left: 247.5px !important; right: auto !important; }
#j81-gate-layout[data-layout="char-right"] #j81-gate-panel { left: 95.95px !important; right: auto !important; }
#j81-starfield[data-layout="char-left"] #j81-scroll-panel { left: 247.5px !important; right: auto !important; }
#j81-starfield[data-layout="char-right"] #j81-scroll-panel { left: 95.95px !important; right: auto !important; }
#j81-l3-stage[data-layout="char-left"] #j81-l3-holo { left: 247.5px !important; right: auto !important; }
#j81-l3-stage[data-layout="char-right"] #j81-l3-holo { left: 95.95px !important; right: auto !important; }
