/* 魅影之城(类名一律 ob- 前缀: 站点模板有 .hp / .hero 之类, 撞名会把游戏元素藏掉)。
   10-25 第六版(用户: 白色太多、太像 App Store, 战斗整屏发白看不清球): 游戏 HUD 风格 —— 深海军蓝玻璃面板 + 青色发光描边 + 金色角饰 + 白字, 主按钮金色;
   背景仍是 orbs-3d.js 的晴天海港, 战斗时四周压暗、棋盘是深色金属甲板, 彩色魔珠更显眼。旧的白色版在 backup/orbs-20261025-white/。
   尺寸用容器单位(--u = 舞台宽 / 1600)。场景: data-mode = map / battle / ritual(净化圣所) / ending */
.ob-frame{position:relative;width:min(100%,calc((100vh - 100px)*16/9));aspect-ratio:16/9;margin:0 auto;border-radius:18px;overflow:hidden;background:#0a1b3f}
html.game-full .ob-frame{position:fixed;inset:0;z-index:50;width:100vw;height:100vh;height:100dvh;aspect-ratio:auto;border-radius:0}
.ob-stage{--ob-c:#5fd0ff;--ob-b:#2f8fff;--ob-b2:#1b5fc8;--ob-gold:#ffc83d;--ob-gold2:#ff9f1c;--ob-red:#ff4f6d;--ob-ink:#f2f8ff;--ob-dim:#9ec3ea;--ob-line:#3d77b8;
  --hud:linear-gradient(180deg,#163868f0,#0b1d42f2);--hud-edge:inset 0 0 0 1px #5fd0ff77,inset 0 1px 0 #ffffff33,inset 0 0 26px #2a8cff30,0 10px 26px #00081a80;
  --brk:linear-gradient(var(--ob-gold),var(--ob-gold)) 0 0/16px 2px no-repeat,linear-gradient(var(--ob-gold),var(--ob-gold)) 0 0/2px 16px no-repeat,linear-gradient(var(--ob-gold),var(--ob-gold)) 100% 100%/16px 2px no-repeat,linear-gradient(var(--ob-gold),var(--ob-gold)) 100% 100%/2px 16px no-repeat;
  position:relative;height:100%;overflow:hidden;container-type:size;color:var(--ob-ink);background:#0a1b3f;color-scheme:dark;
  font-family:"Noto Sans SC","PingFang SC","Microsoft YaHei",system-ui,sans-serif;-webkit-user-select:none;user-select:none}
.ob-stage{--u:calc(100cqw / 1600)}
.ob-stage *{box-sizing:border-box}
.ob-stage button{font:inherit;color:inherit;cursor:pointer}
.ob-stage a{color:inherit;text-decoration:none}
.ob-stage h1,.ob-stage h2,.ob-stage h3,.ob-stage h4{margin:0;font-weight:800}
.ob-kicker{display:block;font:800 italic calc(13*var(--u))/1 "Noto Sans SC",sans-serif;letter-spacing:.24em;color:var(--ob-c)}
.ob-muted{color:var(--ob-dim);font-size:13px}

/* ---------- 背景: 3D 海港 + 各场景的压暗层(让 HUD 和魔珠更清楚) ---------- */
.ob-gl{position:absolute;inset:0;width:100%;height:100%;display:block}
.ob-defs{position:absolute;width:0;height:0;overflow:hidden}
.ob-map::before,.ob-ritual::before,.ob-battle::before,.ob-ending::before{content:"";position:absolute;inset:0;pointer-events:none}
.ob-map::before{background:linear-gradient(#071430b3,transparent 22%,transparent 62%,#071430d9)}
.ob-battle::before{background:radial-gradient(ellipse 60% 62% at 55% 52%,transparent 45%,#061230b3 100%),linear-gradient(#061230a6,transparent 18%,transparent 78%,#061230b3)}
.ob-ritual::before{background:radial-gradient(ellipse 45% 60% at 33% 50%,transparent 30%,#04020acc 100%),linear-gradient(90deg,transparent 55%,#04020ab3)}
.ob-ending::before{background:linear-gradient(90deg,#061230cc,transparent 65%)}

/* ---------- 顶栏: 和魅魔之战一样的沉浸式 —— 上沿一道渐暗, 左「← 游戏大厅」, 中间小号游戏名, 右边一排小图标(没有大菜单 / 大按钮) ---------- */
.ob-top{position:absolute;z-index:20;inset:0 0 auto;height:calc(62*var(--u));display:flex;align-items:center;justify-content:space-between;padding:0 calc(22*var(--u));background:linear-gradient(#030a1cb8,transparent);pointer-events:none}
.ob-top>*{pointer-events:auto}
.ob-hall{font-size:14px;color:#cfe8ff;text-shadow:0 1px 3px #000}
.ob-hall:hover{color:#fff}
.ob-logo{position:absolute;left:50%;transform:translateX(-50%);display:grid;justify-items:center;line-height:1.25;text-align:center}
.ob-logo small{font:800 calc(9*var(--u))/1 sans-serif;letter-spacing:.5em;color:var(--ob-c);text-shadow:0 1px 3px #000}
.ob-logo b{font:900 italic calc(22*var(--u))/1.2 "Noto Sans SC",sans-serif;letter-spacing:.06em;color:#fff;text-shadow:0 0 10px #2f8fff,0 2px 3px #000}
.ob-logo b i{font-style:inherit;color:var(--ob-gold)}
.ob-logo span{font-size:calc(11*var(--u));letter-spacing:.2em;color:#cfe8ff;text-shadow:0 1px 3px #000}
.ob-top-r{display:flex;gap:2px;align-items:center}
.ob-ico-btn{display:grid;place-items:center;width:32px;height:32px;padding:0;border:0;border-radius:50%;background:none;color:#cfe8ff;filter:drop-shadow(0 1px 2px #000)}
.ob-ico-btn:hover{color:#fff;background:#ffffff1a}
.ob-ico-btn[hidden]{display:none}
/* 顶栏的文字按钮(图标 + 字): 退出战斗(红) / 净化圣所(深蓝玻璃), 同一套小号切角样式(10-26) */
.ob-pill{display:inline-flex;align-items:center;gap:4px;margin-right:6px;padding:3px 10px 3px 7px;border:0;border-radius:0;clip-path:polygon(5px 0,100% 0,100% calc(100% - 5px),calc(100% - 5px) 100%,0 100%,0 5px);font-size:11px;font-weight:700;letter-spacing:.08em;text-shadow:0 1px 2px #000;transition:box-shadow .15s,background .15s}
.ob-pill svg{width:12px;height:12px}
.ob-pill[hidden]{display:none}
.ob-pill-red{background:#3a0a18b3;box-shadow:inset 0 0 0 1px #ff6f87aa;color:#ffc2cd}
.ob-pill-red svg{color:#ff4f6d}
.ob-pill-red:hover{background:#6a1428cc;color:#fff;box-shadow:inset 0 0 0 1px #ff6f87,0 0 10px #ff4f6d88}
.ob-pill-violet{background:var(--brk),var(--hud);box-shadow:var(--hud-edge);color:#dff4ff}
.ob-pill-violet svg{color:#c9a8ff;filter:drop-shadow(0 0 4px #8a5cffaa)}
.ob-pill-violet:hover{background:var(--brk),linear-gradient(180deg,#1f4c8cf0,#10285af2);color:#fff;box-shadow:inset 0 0 0 1px #5fd0ff,inset 0 0 18px #5fd0ff55}
/* 净化圣所(10-25 用户): 顶栏只留中间「净化圣所」四个字 + 左上「离开圣所」, 别的按钮都不要 */
.ob-hall.ob-leave{display:none;padding:0;border:0;background:none;font:inherit;font-size:14px;cursor:pointer}
.ob-stage[data-mode=ritual] .ob-leave{display:inline}
.ob-stage[data-mode=ritual] :is(a.ob-hall,.ob-top-r,.ob-logo small,.ob-logo b){display:none}
.ob-stage[data-mode=ritual] .ob-logo span{font-size:calc(20*var(--u));font-weight:900;letter-spacing:.4em;color:#efe6ff;text-shadow:0 0 12px #8a5cff,0 2px 3px #000}
.ob-stage[data-mode=ritual] .ob-top{background:linear-gradient(#04020acc,transparent)}

/* ---------- 场景切换 ---------- */
.ob-scene{position:absolute;inset:0;z-index:5;display:none}
.ob-stage[data-mode=map] .ob-map,.ob-stage[data-mode=battle] .ob-battle,.ob-stage[data-mode=ritual] .ob-ritual,.ob-stage[data-mode=ending] .ob-ending{display:block}
/* 换场景: 两块深蓝斜切板合上, 接缝一道金光 */
.ob-gate{position:absolute;inset:0;z-index:60;pointer-events:none;perspective:1100px;overflow:hidden}
/* 关幕 = 魅魔之战那种中间平分、左右开的两扇门(10-27 用户; 原来是两扇斜门, 旧版 backup/orbs-20261027-gate/): 内框 + 竖线 + 门缝边一颗星; 合上 0.55 秒, 打开 1 秒(绕门轴转开再往两边推) */
.ob-gate>i{position:absolute;top:-3%;bottom:-3%;width:50%;border:2px solid #5fd0ff55;box-shadow:inset 0 0 0 13px #061027,inset 0 0 0 14px #5fd0ff33,inset 0 0 100px #000;
  background:repeating-linear-gradient(90deg,transparent 0 18%,#5fd0ff14 18% 18.4%,transparent 18.4% 36%),linear-gradient(100deg,#0f2550,#081633 50%,#12295a);transition:transform 1s cubic-bezier(.4,0,.15,1)}
.ob-gate>i:first-of-type{left:0;transform-origin:left center;transform:translateX(-45%) rotateY(-85deg)}
.ob-gate>i:last-of-type{right:0;transform-origin:right center;transform:translateX(45%) rotateY(85deg)}
/* 合缝处: 左右门缝边各一颗星(10-27 试过封印圆章, 用户说星星就好) + 门缝两边各一道青色光线 */
.ob-gate>i::after{content:'✦';position:absolute;top:45%;color:#bff3ff;font:60px Georgia,serif;text-shadow:0 0 24px #5fd0ff}
.ob-gate>i:first-of-type::after{right:20px}.ob-gate>i:last-of-type::after{left:20px}
.ob-gate>i:first-of-type{box-shadow:inset 0 0 0 13px #061027,inset 0 0 0 14px #5fd0ff33,inset 0 0 100px #000,inset -2px 0 0 #9fe6ff,inset -14px 0 18px -10px #5fd0ff}
.ob-gate>i:last-of-type{box-shadow:inset 0 0 0 13px #061027,inset 0 0 0 14px #5fd0ff33,inset 0 0 100px #000,inset 2px 0 0 #9fe6ff,inset 14px 0 18px -10px #5fd0ff}
.ob-gate.is-shut>i{transform:none;transition-duration:.55s}
@media(prefers-reduced-motion:reduce){.ob-gate>i{transition:none}}
/* 关幕等加载时的进度(orbs.js go): 两扇幕合上的接缝下方, 百分比 = 已下载字节 */
.ob-gate-load{position:absolute;left:50%;bottom:24%;z-index:1;width:min(360px,60vw);transform:translateX(-50%);display:grid;justify-items:center;gap:8px}
.ob-gate-load[hidden]{display:none}
.ob-gate-load p{margin:0;color:#dff3ff;font-size:14px;letter-spacing:.2em;text-shadow:0 0 8px #2f8fff,0 1px 3px #000}
.ob-gate-load b{color:var(--ob-gold);font-variant-numeric:tabular-nums}
.ob-load-bar.ob-gate-bar i{width:var(--p,0%);animation:none;transition:width .2s ease-out}
.ob-loading{position:absolute;inset:0;z-index:70;display:grid;place-content:center;justify-items:center;gap:14px;background:radial-gradient(ellipse at center,#163868,#06122e);transition:opacity .5s}
.ob-loading.is-out{opacity:0;pointer-events:none}
.ob-loading>b{padding:0 .2em;font:900 italic calc(72*var(--u))/1 "Noto Sans SC",sans-serif; /* 左右留 .2em: 斜体往右倾出去的部分也要在渐变(background-clip:text)里, 不然「城」右边被切(10-27 用户) */background:linear-gradient(#fff,#9fe0ff);-webkit-background-clip:text;background-clip:text;color:transparent;filter:drop-shadow(0 0 18px #2f8fff)}
.ob-loading>b i{font-style:inherit}
.ob-loading small{letter-spacing:1em;color:var(--ob-gold);font-weight:800}
.ob-load-bar{width:min(360px,60vw);height:6px;border-radius:3px;background:#06122e;box-shadow:inset 0 0 0 1px #5fd0ff55;overflow:hidden}
.ob-load-bar i{display:block;height:100%;width:40%;background:linear-gradient(90deg,transparent,var(--ob-c),#fff);animation:ob-load 1.2s ease-in-out infinite}
@keyframes ob-load{from{transform:translateX(-100%)}to{transform:translateX(260%)}}

/* ---------- 按钮: 主按钮金色平行四边形(像「出击」), 次按钮深蓝青边 ---------- */
.ob-cta{--cut:14px;position:relative;display:inline-grid;justify-items:center;gap:1px;min-width:calc(220*var(--u));padding:calc(11*var(--u)) calc(34*var(--u));border:0;
  background:linear-gradient(#ffe68a,var(--ob-gold) 45%,var(--ob-gold2));clip-path:polygon(var(--cut) 0,100% 0,calc(100% - var(--cut)) 100%,0 100%);color:#4a2400;
  text-shadow:0 1px 0 #fff6c8;filter:drop-shadow(0 4px 0 #9a5a00) drop-shadow(0 0 12px #ffb21e88);transition:filter .15s,transform .15s;overflow:hidden}
.ob-cta b{font-size:calc(22*var(--u));font-weight:900;letter-spacing:.2em}
.ob-cta small{font:800 calc(10*var(--u))/1 sans-serif;letter-spacing:.4em;opacity:.8}
.ob-cta::after{content:"";position:absolute;inset:0;background:repeating-linear-gradient(-45deg,#ffffff26 0 6px,transparent 6px 14px);pointer-events:none}
.ob-cta::before{content:"";position:absolute;top:0;bottom:0;left:-40%;width:30%;background:linear-gradient(90deg,transparent,#ffffffbb,transparent);transform:skewX(-20deg);animation:ob-sheen 3.2s ease-in-out infinite;pointer-events:none}
@keyframes ob-sheen{0%,70%{left:-40%}100%{left:130%}}
.ob-cta:hover:not(:disabled){filter:drop-shadow(0 4px 0 #9a5a00) drop-shadow(0 0 18px #ffc83dcc) brightness(1.08);transform:translateY(-1px)}
.ob-cta:active:not(:disabled){transform:translateY(2px);filter:drop-shadow(0 1px 0 #9a5a00)}
.ob-cta:disabled{filter:grayscale(1) opacity(.6);cursor:not-allowed}
.ob-cta-ghost{background:linear-gradient(#1d4a86,#0f2a5a);color:#dff3ff;text-shadow:0 0 6px #2f8fff;filter:drop-shadow(0 3px 0 #06122e);box-shadow:inset 0 0 0 2px var(--ob-c)}
.ob-cta-ghost::before,.ob-cta-ghost::after{display:none}
.ob-cta-ghost:hover:not(:disabled){filter:drop-shadow(0 3px 0 #06122e) drop-shadow(0 0 12px #2f8fffaa)}
.ob-cta[hidden]{display:none}
.ob-cta:focus-visible,.ob-card:focus-visible,.ob-skill:focus-visible,.ob-rt-arrow:focus-visible{outline:3px solid var(--ob-gold);outline-offset:3px}

/* ---------- 选关: 上面章节条, 中间一排大角色卡(斜切竖卡, 全身立绘; 锁着的是剪影; 选中的展开), 下面信息栏 + 出击 ---------- */
 /* 章节条(10-25 用户: 排版不对、被卡片挡住、太占地方): 左上一条窄条, 一行 = 章节 · 标题 · 已净化 n/7 */
.ob-chapter{position:absolute;z-index:6;left:calc(30*var(--u));top:calc(70*var(--u));display:flex;align-items:center;gap:calc(14*var(--u));height:calc(40*var(--u));padding:0 calc(30*var(--u)) 0 calc(16*var(--u));
  background:linear-gradient(90deg,#0b1d42e6,#0b1d42b3 80%,transparent);box-shadow:inset 3px 0 0 var(--ob-gold);white-space:nowrap}
.ob-chapter .ob-kicker{font-size:calc(11*var(--u))}
.ob-chapter h1{font-size:calc(17*var(--u));font-weight:800;color:#fff;text-shadow:0 1px 3px #000}
.ob-chapter h1 em{font-style:normal;color:var(--ob-gold)}
/* 故事按钮(选关章节条 + 净化圣所): 金色切角胶囊 + 书图标 + 「故事」, 一圈金光慢慢呼吸, 要醒目 */
.ob-story-btn{display:inline-flex;align-items:center;gap:6px;padding:5px 14px 5px 10px;border:0;cursor:pointer;font:800 14px/1 "Noto Sans SC",sans-serif;letter-spacing:.16em;color:#2a1600;
  background:linear-gradient(180deg,#ffe7a3,#f5b93a 55%,#d48a12);clip-path:polygon(7px 0,100% 0,100% calc(100% - 7px),calc(100% - 7px) 100%,0 100%,0 7px);animation:ob-storyglow 2.4s ease-in-out infinite}
.ob-story-btn:hover,.ob-story-btn:focus-visible{background:linear-gradient(180deg,#fff3c8,#ffd062 55%,#e9a020);animation:none;filter:drop-shadow(0 0 10px #ffd27a)}
@keyframes ob-storyglow{0%,100%{filter:drop-shadow(0 0 2px #ffc83d88)}50%{filter:drop-shadow(0 0 10px #ffc83d)}}
@media (prefers-reduced-motion:reduce){.ob-story-btn{animation:none;filter:drop-shadow(0 0 6px #ffc83daa)}}
.ob-rt-story{position:absolute;z-index:7;left:calc(96*var(--u));top:calc(86*var(--u))}
.ob-ring{display:flex;align-items:baseline;gap:4px;padding-left:calc(14*var(--u));border-left:1px solid #5fd0ff44}
.ob-ring b{font:900 italic calc(16*var(--u))/1 sans-serif;color:var(--ob-gold)}
.ob-ring small{font-size:calc(11*var(--u));color:var(--ob-dim)}
.ob-cards{position:absolute;z-index:3;left:calc(30*var(--u));right:calc(30*var(--u));top:calc(124*var(--u));bottom:calc(140*var(--u));display:flex;gap:calc(12*var(--u));list-style:none;margin:0;padding:0}
.ob-cards li{flex:1 1 0;min-width:0;transition:flex-grow .4s cubic-bezier(.2,.8,.2,1)}
.ob-cards li.is-sel{flex-grow:2.6}
.ob-card{--sk:6deg;position:relative;display:block;width:100%;height:100%;padding:0;border:0;background:none;color:#fff;transform:skewX(calc(var(--sk) * -1));transition:transform .25s,filter .25s;filter:drop-shadow(0 10px 14px #00081acc)}
.ob-card-in{position:absolute;inset:0;overflow:hidden;background:radial-gradient(ellipse 80% 60% at 50% 35%,#2d6fc0,#0d2550 70%,#081733);box-shadow:inset 0 0 0 2px #5fd0ff88,inset 0 0 30px #2f8fff44}
.ob-card-in::before{content:"";position:absolute;inset:0;background:repeating-linear-gradient(-45deg,#ffffff08 0 10px,transparent 10px 26px),linear-gradient(transparent 60%,#5fd0ff22);pointer-events:none}
.ob-card-in::after{content:"";position:absolute;inset:auto 0 0;height:42%;background:linear-gradient(transparent,#061230f2);pointer-events:none}
.ob-card .ob-por{position:absolute;left:50%;bottom:0;height:100%;width:auto;max-width:none;transform:translateX(-50%) skewX(var(--sk));transition:transform .35s,filter .3s;pointer-events:none}
.ob-card .ob-sil{position:absolute;inset:12% 8% 0;background:#03081a;-webkit-mask:var(--sil) center bottom/contain no-repeat;mask:var(--sil) center bottom/contain no-repeat;transform:skewX(var(--sk));filter:drop-shadow(0 0 6px #5fd0ff)}
.ob-card.has-por .ob-sil{display:none}
.ob-card .ob-card-no{position:absolute;left:calc(12*var(--u));top:calc(8*var(--u));z-index:2;font:900 italic calc(34*var(--u))/1 sans-serif;color:#fff;-webkit-text-stroke:3px #0b1d42;paint-order:stroke;text-shadow:0 0 12px #2f8fff;transform:skewX(var(--sk))}
.ob-card .ob-card-tag{position:absolute;right:calc(8*var(--u));top:calc(10*var(--u));z-index:2;padding:2px 10px;font-size:calc(12*var(--u));font-weight:900;color:#fff;background:var(--ob-b);box-shadow:0 0 10px #2f8fff;white-space:nowrap}
.ob-card-plate{position:absolute;left:0;right:0;bottom:calc(14*var(--u));z-index:2;display:grid;justify-items:center;padding:0 6px;transform:skewX(var(--sk))}
.ob-card .ob-card-name{max-width:100%;font-size:calc(19*var(--u));font-weight:900;color:#fff;text-shadow:0 2px 4px #000;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ob-card .ob-card-sub{max-width:100%;font-size:calc(12*var(--u));font-weight:700;color:var(--ob-c);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ob-cards li:not(.is-sel) .ob-card-sub{display:none}
.ob-card.is-lock .ob-card-in{background:radial-gradient(ellipse 80% 60% at 50% 35%,#1a2f52,#0a1630 70%,#060e22)}
.ob-card.is-lock .ob-por{filter:brightness(0) drop-shadow(0 0 2px #9fe0ff) drop-shadow(0 0 12px #2f8fff);opacity:.9}
.ob-card.is-lock .ob-card-tag{background:#3b4a66;box-shadow:none}
.ob-card.is-lock .ob-card-no{color:#7f93b4}
.ob-card.is-freed .ob-card-tag{background:#1fae78;box-shadow:0 0 10px #1fae78}
.ob-card.is-fight .ob-card-tag{background:var(--ob-gold2);box-shadow:0 0 10px var(--ob-gold2)}
.ob-card.is-final .ob-card-in{background:radial-gradient(ellipse 80% 60% at 50% 35%,#8a1d3c,#3a0c22 70%,#1a0612);box-shadow:inset 0 0 0 2px #ff6f87aa,inset 0 0 30px #ff4f6d55}
.ob-card.is-final .ob-card-tag{background:#e0304f;box-shadow:0 0 10px #ff4f6d}
.ob-card:hover:not(.is-lock){transform:skewX(calc(var(--sk) * -1)) translateY(-6px)}
.ob-card.is-sel .ob-card-in{box-shadow:inset 0 0 0 3px var(--ob-gold),inset 0 0 40px #ffc83d44}
.ob-card.is-sel{filter:drop-shadow(0 10px 16px #00081acc) drop-shadow(0 0 18px #ffb21e99);animation:ob-sel 1.6s ease-in-out infinite alternate}
@keyframes ob-sel{to{filter:drop-shadow(0 10px 16px #00081acc) drop-shadow(0 0 30px #ffc83dcc)}}
.ob-card.is-sel .ob-por{transform:translateX(-50%) skewX(var(--sk)) scale(1.03);transform-origin:50% 100%}
.ob-sortie{position:absolute;z-index:4;left:calc(30*var(--u));right:calc(30*var(--u));bottom:calc(22*var(--u));height:calc(110*var(--u));display:flex;align-items:center;gap:calc(30*var(--u));padding:0 calc(26*var(--u)) 0 calc(34*var(--u));
  background:var(--brk),var(--hud);box-shadow:var(--hud-edge);clip-path:polygon(18px 0,100% 0,calc(100% - 18px) 100%,0 100%)}
.ob-sortie-main{display:grid;gap:2px;min-width:calc(330*var(--u))}
.ob-sortie-main small{font:900 italic calc(13*var(--u))/1.2 sans-serif;letter-spacing:.12em;color:var(--ob-c)}
.ob-sortie-main b{font-size:calc(26*var(--u));font-weight:900;line-height:1.15;color:#fff}
#ob-pick-state{display:flex;gap:calc(14*var(--u));font-size:calc(13*var(--u));color:var(--ob-dim)}
#ob-pick-state b{color:var(--ob-gold);font-size:calc(15*var(--u))}
.ob-sortie-row{display:grid;gap:6px;justify-items:start}
.ob-sortie-row>em{font-style:normal;font-size:calc(12*var(--u));font-weight:800;color:#fff;background:linear-gradient(90deg,var(--ob-b),transparent);padding:1px 14px 1px 8px}
.ob-sortie-row>span{display:flex;gap:calc(14*var(--u));flex-wrap:wrap}
/* 敌方技能 / 可获得: 只是说明 —— 小图标 + 字, 没有框, 不像能点的按钮 */
.ob-chip-ico{position:relative;display:inline-flex;align-items:center;gap:4px;font-style:normal;pointer-events:none;cursor:default}
.ob-chip-ico svg{width:calc(18*var(--u));height:calc(18*var(--u));fill:none;stroke:#ff8fa3;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.ob-chip-ico .ob-ico{width:calc(20*var(--u));height:calc(20*var(--u));stroke:var(--ob-c);filter:none}
.ob-chip-ico small{font-size:calc(12*var(--u));font-weight:700;color:#dceaff}
#ob-sortie-loot .ob-chip-ico small{color:var(--ob-gold)}
.ob-sortie-btns{margin-left:auto;display:flex;gap:12px;align-items:center}
.ob-sortie-btns .ob-go{min-width:calc(120*var(--u));padding:calc(5*var(--u)) calc(22*var(--u))}
.ob-sortie-btns .ob-go b{font-size:calc(16*var(--u))}
.ob-sortie-btns .ob-go small{font-size:calc(8*var(--u))}
.ob-sortie-btns .ob-cta-ghost{--cut:10px;min-width:0;padding:calc(6*var(--u)) calc(16*var(--u));background:linear-gradient(#b48bff,#7a4dde 55%,#4f2aa8);color:#fff;text-shadow:0 1px 2px #2a1060;box-shadow:none;filter:drop-shadow(0 3px 0 #2a1060) drop-shadow(0 0 8px #8a5cff88)}
.ob-sortie-btns .ob-cta-ghost b{font-size:calc(13*var(--u));letter-spacing:.14em}

/* ---------- 战斗 HUD(左 Boss / 中 3D 轨道 / 右光明猎手剪影) ---------- */
.ob-boss-host{position:absolute;left:-2%;top:calc(110*var(--u));bottom:0;width:36%;pointer-events:none}
.ob-boss-host::before{content:"";position:absolute;inset:18% 4% 0;background:radial-gradient(ellipse 50% 55% at 50% 62%,#ff6f9a55,transparent 72%);animation:ob-aura 5s ease-in-out infinite}
@keyframes ob-aura{50%{opacity:.55}}
.ob-boss-host canvas{position:absolute;inset:0;width:100%;height:100%}
.ob-boss-host.is-hit canvas{animation:ob-bosshit .45s}
@keyframes ob-bosshit{20%{filter:brightness(1.6) saturate(1.6) hue-rotate(-20deg)}}
.ob-boss-host.is-cast canvas{animation:ob-cast .7s}
@keyframes ob-cast{30%{filter:drop-shadow(0 0 24px #ff4f6d) brightness(1.15)}}
.ob-hunter{position:absolute;right:0;top:calc(130*var(--u));bottom:0;width:22%;pointer-events:none}
.ob-hunter svg{position:absolute;right:6%;bottom:0;height:92%;width:auto;overflow:visible;will-change:transform}
.ob-hunter-fig{filter:drop-shadow(0 0 16px #5fd0ff88)}
.ob-echo{fill:#5fd0ff}
.ob-echo-1{opacity:.22;animation:ob-echo 3.4s ease-in-out infinite}
.ob-echo-2{opacity:.12;animation:ob-echo 3.4s ease-in-out -1.7s infinite}
@keyframes ob-echo{50%{transform:translate(calc(-30*var(--u)),-6px)}}
.ob-smoke{position:absolute;right:-10%;bottom:-8%;width:100%;height:96%;border-radius:50%;background:radial-gradient(ellipse 50% 45% at 55% 50%,#9fe0ff88,transparent 70%),radial-gradient(ellipse 40% 14% at 50% 98%,#2f8fff99,transparent 72%);
  filter:blur(24px);animation:ob-smoke 5s ease-in-out infinite;will-change:transform,opacity}
@keyframes ob-smoke{50%{transform:scale(1.08,1.04) translateY(-2%);opacity:.7}}
.ob-hunter.is-hurt .ob-hunter-fig{animation:ob-hurt .5s}
@keyframes ob-hurt{25%{transform:translateX(12px) rotate(2deg);filter:drop-shadow(0 0 22px #ff2348)}}
.ob-hunter.is-shoot .ob-hunter-fig{animation:ob-shoot .25s}
@keyframes ob-shoot{40%{transform:translateX(-8px)}}
/* 铭牌(10-25 用户: 顶部占太多地方, 不要头像): 只有 名字 + 一条细血条, 贴着左上 / 右上 */
.ob-plate{position:absolute;z-index:6;top:calc(70*var(--u));width:calc(400*var(--u))}
.ob-plate-boss{left:calc(24*var(--u))}
.ob-plate-hunter{right:calc(24*var(--u));width:calc(340*var(--u));text-align:right}
.ob-plate-main{padding:0}
.ob-plate-id{display:flex;gap:10px;align-items:baseline}
.ob-plate-hunter .ob-plate-id{flex-direction:row-reverse}
.ob-plate-id b{font-size:calc(17*var(--u));font-weight:900;letter-spacing:.06em;color:#fff;text-shadow:0 0 8px #2f8fff,0 1px 3px #000}
.ob-plate-id small{color:var(--ob-dim);font-size:calc(12*var(--u));text-shadow:0 1px 3px #000}
.ob-hp{position:relative;height:calc(10*var(--u));margin-top:4px;background:#050e24cc;transform:skewX(-20deg);overflow:hidden;box-shadow:inset 0 0 0 1px #5fd0ff55}
.ob-hp>i{position:absolute;inset:0 auto 0 0;width:100%;transition:width .35s cubic-bezier(.2,.8,.2,1)}
.ob-hp .ob-hp-trail{background:#fff1b0;transition:width 1.2s ease .35s}
.ob-hp-boss>i:not(.ob-hp-trail){background:linear-gradient(#ffa3b5,var(--ob-red) 55%,#b8193a);box-shadow:0 0 8px #ff4f6d}
.ob-hp-hunter>i{left:auto;right:0;background:linear-gradient(#a8e6ff,var(--ob-b) 55%,var(--ob-b2));box-shadow:0 0 8px #2f8fff}
.ob-hp::after{content:"";position:absolute;inset:0;background:repeating-linear-gradient(90deg,transparent 0 calc(10% - 2px),#050e24 calc(10% - 2px) 10%);pointer-events:none}
.ob-hp-mark{position:absolute;left:50%;top:-1px;bottom:-1px;width:2px;background:var(--ob-gold);z-index:1}
.ob-hp span{display:none}
.ob-plate-hunter.is-warn .ob-hp{animation:ob-warnplate .6s infinite alternate}
@keyframes ob-warnplate{to{box-shadow:inset 0 0 0 1px var(--ob-red),0 0 12px #ff4f6d}}
.ob-boss-buffs{display:flex;gap:6px;margin-top:5px;min-height:18px}
.ob-boss-buffs span{padding:0 10px;font-size:12px;font-weight:900;line-height:20px;color:#fff;background:var(--ob-red);box-shadow:0 0 8px #ff4f6d;clip-path:polygon(5px 0,100% 0,calc(100% - 5px) 100%,0 100%)}
.ob-cast{position:absolute;z-index:7;left:calc(24*var(--u));top:calc(130*var(--u));display:flex;align-items:center;gap:12px;width:calc(400*var(--u));padding:8px 16px 8px 8px;color:#fff;
  background:linear-gradient(100deg,#b8193acc,#ff4f6dcc 70%,#ff4f6d33);box-shadow:inset 0 0 0 1px #ff8fa3;clip-path:polygon(0 0,100% 0,calc(100% - 14px) 100%,0 100%);animation:ob-castpulse .5s ease-in-out infinite alternate}
.ob-cast[hidden]{display:none}
@keyframes ob-castpulse{to{filter:brightness(1.2)}}
.ob-cast-ico{display:grid;place-items:center;flex:none;width:calc(48*var(--u));aspect-ratio:1;border-radius:50%;background:#2a0612;box-shadow:inset 0 0 0 2px #ff8fa3}
.ob-cast-ico svg{width:60%;height:60%;fill:none;stroke:#ffb3c2;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}
.ob-cast>div{flex:1}
.ob-cast b{display:block;font-size:calc(15*var(--u));font-weight:900}
.ob-cast small{font-size:calc(11*var(--u));opacity:.9}
.ob-cast-bar{height:6px;margin-top:4px;background:#2a0612}
.ob-cast-bar span{display:block;height:100%;background:#fff;box-shadow:0 0 8px #fff;transition:width .1s linear}
.ob-stage-title{position:absolute;z-index:6;left:50%;top:calc(66*var(--u));transform:translateX(-50%);display:flex;align-items:baseline;gap:12px;padding:3px 30px;white-space:nowrap;
  background:linear-gradient(90deg,transparent,#0b1d42b3 20%,#0b1d42b3 80%,transparent)}
.ob-stage-title small{font:900 italic calc(11*var(--u))/1 sans-serif;letter-spacing:.2em;color:var(--ob-c)}
.ob-stage-title b{font-size:calc(14*var(--u));font-weight:800;letter-spacing:.14em}
.ob-stage-title span{font-size:calc(11*var(--u));color:var(--ob-dim)}
.ob-energy{display:flex;gap:4px;align-items:center;justify-content:flex-end;margin-top:5px}
.ob-energy i{--f:0;position:relative;width:calc(46*var(--u));height:calc(8*var(--u));background:#050e24;transform:skewX(-20deg);overflow:hidden;box-shadow:inset 0 0 0 1px #ffc83d66}
.ob-energy i::after{content:"";position:absolute;inset:0;width:calc(var(--f)*100%);background:linear-gradient(#ffe68a,var(--ob-gold2));box-shadow:0 0 8px var(--ob-gold);transition:width .2s}
.ob-energy span{min-width:calc(30*var(--u));font:900 italic calc(15*var(--u))/1 sans-serif;color:var(--ob-gold)}
.ob-say{position:absolute;z-index:7;left:calc(120*var(--u));top:calc(190*var(--u));max-width:calc(330*var(--u));padding:10px 16px;background:var(--hud);border-radius:4px 16px 16px;box-shadow:var(--hud-edge);font-size:calc(16*var(--u));line-height:1.5;opacity:0;pointer-events:none}
.ob-say.is-on{animation:ob-say 3.2s forwards}
@keyframes ob-say{8%,82%{opacity:1;transform:none}0%{opacity:0;transform:translateY(6px)}100%{opacity:0}}
.ob-pops{position:absolute;inset:0;z-index:8;pointer-events:none}
.ob-pop{position:absolute;transform:translate(-50%,-50%);font:900 italic calc(26*var(--u))/1 sans-serif;color:#fff;-webkit-text-stroke:3px var(--c,#2f8fff);paint-order:stroke;text-shadow:0 0 12px var(--c,#2f8fff);animation:ob-pop 1s forwards;white-space:nowrap}
.ob-pop.is-big{font-size:calc(36*var(--u))}
@keyframes ob-pop{0%{opacity:0;transform:translate(-50%,-30%) scale(.7)}15%{opacity:1;transform:translate(-50%,-50%) scale(1.15)}100%{opacity:0;transform:translate(-50%,-160%)}}
.ob-combo{position:absolute;z-index:9;left:50%;top:40%;transform:translate(-50%,-50%);text-align:center;pointer-events:none;opacity:0}
.ob-combo small{display:block;font:900 italic calc(16*var(--u))/1 sans-serif;letter-spacing:.5em;color:var(--ob-c);text-shadow:0 0 8px #2f8fff}
.ob-combo b{padding:0 .15em;display:block;font:900 italic calc(86*var(--u))/1.05 sans-serif;background:linear-gradient(#fff 20%,#ffe68a 55%,var(--ob-gold2));-webkit-background-clip:text;background-clip:text;color:transparent;filter:drop-shadow(0 4px 0 #6a3600) drop-shadow(0 0 16px #ffb21e)}
.ob-combo.is-on{animation:ob-combo 1.1s cubic-bezier(.2,.9,.25,1) forwards}
@keyframes ob-combo{0%{opacity:0;transform:translate(-50%,-50%) scale(2.6) skewX(-8deg)}14%{opacity:1;transform:translate(-50%,-50%) scale(.92)}22%{transform:translate(-50%,-50%) scale(1.05)}70%{opacity:1;transform:translate(-50%,-50%) scale(1)}100%{opacity:0;transform:translate(-50%,-62%)}}
.ob-combo-meter{position:absolute;z-index:7;right:calc(330*var(--u));top:44%;display:grid;justify-items:center;line-height:1;pointer-events:none;animation:ob-cm .3s ease-out}
.ob-combo-meter[hidden]{display:none}
.ob-combo-meter b{padding:0 .15em;font:900 italic calc(64*var(--u))/1 sans-serif;background:linear-gradient(#fff 20%,#ffe68a 60%,var(--ob-gold2));-webkit-background-clip:text;background-clip:text;color:transparent;filter:drop-shadow(0 3px 0 #6a3600) drop-shadow(0 0 12px #ffb21e)}
.ob-combo-meter small{font:900 italic calc(14*var(--u))/1 sans-serif;letter-spacing:.3em;color:var(--ob-gold);text-shadow:0 0 6px #000}
@keyframes ob-cm{from{transform:scale(1.6);opacity:0}}
.ob-banner{position:absolute;z-index:9;left:50%;top:calc(150*var(--u));transform:translateX(-50%);padding:8px 60px;font-size:calc(18*var(--u));font-weight:900;letter-spacing:.14em;color:#fff;text-shadow:0 0 6px #000;
  background:linear-gradient(90deg,transparent,#d6304fe6 18%,#d6304fe6 82%,transparent);opacity:0;pointer-events:none;white-space:nowrap}
.ob-banner.is-blue{background:linear-gradient(90deg,transparent,#1b5fc8e6 18%,#1b5fc8e6 82%,transparent)}
.ob-banner.is-on{animation:ob-say 2.4s forwards}
.ob-next-box{position:absolute;z-index:6;left:50%;bottom:calc(14*var(--u));transform:translateX(-50%);display:grid;justify-items:center;gap:2px}
.ob-next{display:flex;gap:10px;align-items:center;padding:8px 18px;border-radius:40px;background:var(--hud);box-shadow:var(--hud-edge)}
.ob-next i{width:calc(32*var(--u));aspect-ratio:1;border-radius:50%;background:radial-gradient(circle at 35% 30%,#fff 0 10%,var(--c) 38%,color-mix(in srgb,var(--c) 55%,#000) 100%);box-shadow:0 0 10px var(--c)}
.ob-next i:first-child{width:calc(44*var(--u));box-shadow:0 0 0 3px #0b1d42,0 0 0 5px var(--ob-gold),0 0 14px 5px var(--c)}
.ob-next-box small{font-size:calc(11*var(--u));font-weight:800;color:var(--ob-dim);text-shadow:0 1px 3px #000}
.ob-skills{position:absolute;z-index:6;right:calc(20*var(--u));bottom:calc(16*var(--u));display:flex;gap:calc(12*var(--u));align-items:flex-end}
.ob-skill{--cd:0;position:relative;display:grid;place-items:center;align-content:center;width:calc(84*var(--u));aspect-ratio:1;padding:0;border:0;border-radius:50%;color:#fff;
  background:radial-gradient(circle at 50% 30%,#2d6fc0,#0f2a5a 70%,#081733);box-shadow:0 0 0 2px #0b1d42,0 0 0 4px var(--ob-c),0 0 16px 4px #2f8fff66,inset 0 2px 0 #ffffff33;transition:transform .12s,filter .2s}
.ob-sk-ico{display:grid;place-items:center;width:46%;height:46%}
.ob-sk-ico svg{width:100%;height:100%;fill:none;stroke:#bff0ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;filter:drop-shadow(0 0 4px #2f8fff)}
.ob-sk-name{font-size:calc(11*var(--u));font-weight:900;letter-spacing:.06em;text-shadow:0 1px 2px #000}
.ob-skill::after{content:attr(data-key);position:absolute;left:-4px;top:-4px;display:grid;place-items:center;width:calc(24*var(--u));aspect-ratio:1;border-radius:4px;font:900 calc(12*var(--u))/1 sans-serif;color:#fff;background:#0b1d42;box-shadow:0 0 0 1px var(--ob-c)}
.ob-cost{position:absolute;right:-6px;bottom:-4px;padding:0 6px;font:900 italic calc(12*var(--u))/1.5 sans-serif;color:#4a2400;background:linear-gradient(#ffe68a,var(--ob-gold2));border-radius:8px;box-shadow:0 0 0 2px #0b1d42}
.ob-cd{position:absolute;inset:0;border-radius:50%;background:conic-gradient(#000a calc(var(--cd)*360deg),transparent 0);pointer-events:none}
.ob-skill.is-poor{filter:saturate(.3) brightness(.7)}
.ob-skill.is-ready{animation:ob-skready 1.2s ease-in-out infinite alternate}
@keyframes ob-skready{to{box-shadow:0 0 0 2px #0b1d42,0 0 0 4px var(--ob-gold),0 0 26px 8px #ffc83daa,inset 0 2px 0 #ffffff33}}
.ob-skill.is-armed{background:radial-gradient(circle at 50% 30%,#fff1b0,var(--ob-gold) 55%,var(--ob-gold2))}
.ob-skill.is-armed .ob-sk-ico svg{stroke:#4a2400;filter:none}
.ob-skill.is-sealed{filter:grayscale(1) brightness(.6)}
.ob-skill.is-sealed::before{content:"封";position:absolute;inset:0;z-index:2;display:grid;place-items:center;border-radius:50%;font-size:calc(30*var(--u));font-weight:900;color:#fff;background:repeating-linear-gradient(45deg,#e0304fbb 0 6px,#e0304f66 6px 12px)}
.ob-skill.is-cast{animation:ob-skcast .35s}
@keyframes ob-skcast{40%{transform:scale(1.18)}}
.ob-skill:active{transform:translateY(3px)}
.ob-skill-ult{width:calc(110*var(--u));background:radial-gradient(circle at 50% 30%,#ffe68a,#d68a10 60%,#6a3600);box-shadow:0 0 0 2px #0b1d42,0 0 0 4px var(--ob-gold),0 0 18px 6px #ffb21e77,inset 0 2px 0 #ffffff55}
.ob-skill-ult .ob-sk-ico svg{stroke:#fff;fill:#ffffff33;filter:drop-shadow(0 0 4px #ff9f1c)}
.ob-sk-side{display:grid;gap:10px}
.ob-skill-sm{width:calc(46*var(--u));font-size:calc(18*var(--u));font-weight:900}
.ob-skill-sm::after{display:none}
.ob-skill:disabled{cursor:not-allowed}
.ob-intro{position:absolute;z-index:12;left:-10%;right:-10%;top:38%;display:grid;justify-items:center;padding:calc(18*var(--u)) 0;transform:skewY(-4deg) translateX(-120%);pointer-events:none;
  background:linear-gradient(90deg,transparent,#0f2a5af2 12%,#163868f7 50%,#0f2a5af2 88%,transparent);box-shadow:0 -3px 0 var(--ob-c),0 3px 0 var(--ob-gold),0 0 40px #2f8fff88}
.ob-intro.is-red{background:linear-gradient(90deg,transparent,#5a0c22f2 12%,#8a1d3cf7 50%,#5a0c22f2 88%,transparent);box-shadow:0 -3px 0 #ff8fa3,0 3px 0 var(--ob-gold),0 0 40px #ff4f6d88}
.ob-intro small{font:900 italic calc(18*var(--u))/1 sans-serif;letter-spacing:.5em;color:var(--ob-c)}
.ob-intro b{font:900 italic calc(54*var(--u))/1.15 sans-serif;color:#fff;letter-spacing:.06em;text-shadow:0 0 16px #2f8fff,0 4px 0 #000}
.ob-intro em{font:900 italic calc(16*var(--u))/1 sans-serif;letter-spacing:.6em;color:var(--ob-gold)}
.ob-intro.is-on{animation:ob-intro 1.9s cubic-bezier(.6,0,.2,1) forwards}
@keyframes ob-intro{0%{transform:skewY(-4deg) translateX(-120%)}22%,78%{transform:skewY(-4deg) translateX(0)}100%{transform:skewY(-4deg) translateX(120%)}}
.ob-warn{position:absolute;inset:0;z-index:4;pointer-events:none;opacity:0;background:radial-gradient(ellipse at center,transparent 55%,#ff1a4066 100%);transition:opacity .4s}
.ob-warn.is-on{opacity:1;animation:ob-warn .7s ease-in-out infinite alternate}
@keyframes ob-warn{to{opacity:.4}}
.ob-pause{position:absolute;inset:0;z-index:30;display:grid;place-content:center;justify-items:center;gap:18px;background:repeating-linear-gradient(-45deg,#061230e0 0 18px,#0a1b3fe0 18px 36px)}
.ob-pause[hidden]{display:none}
.ob-pause h2{font:900 italic calc(54*var(--u))/1 sans-serif;letter-spacing:.3em;color:#fff;text-shadow:0 0 18px #2f8fff,0 4px 0 #000}
.ob-fx{position:absolute;inset:0;z-index:8;width:100%;height:100%;pointer-events:none}

/* ---------- 净化圣所(无名单 / 大标题 / 预览动画, 左右三角换人) ---------- */
/* 角色脚踩在 3D 发光法阵上(orbs-3d.js FLOOR_AT), 倒影用 box-reflect。ponytail: Firefox 不支持就没倒影, 要的话改成 PIXI 里翻转一份 RenderTexture */
/* 落地门窗(10-26 用户; 原来是银幕 + 红帷幕): 窗框从地面立起, 角色站在窗里、脚踩下沿(= 地面), 只在窗里显示; 倒影跟着整扇窗。
   编辑器预览的角色区 = 窗内(levels.js HOSTS.orbs.hall) */
.ob-cinema{position:absolute;left:10%;width:53%;top:calc(84*var(--u));bottom:11%;pointer-events:none;-webkit-box-reflect:below 0 linear-gradient(transparent 70%,#ffffff40)}
.ob-cin-screen{position:absolute;left:14%;right:14%;top:0;bottom:0;overflow:hidden;-webkit-mask:linear-gradient(#000 88%,#0000);mask:linear-gradient(#000 88%,#0000)} /* 透明, 拱形的圆角由 orbs.js shapeWindow 按门的大小设; 底部 12% 渐隐, 动画慢慢融进地板(10-27 用户) */
/* 2D 拱门(orbs.js drawDoor): 金色全是 SVG 渐变; 整扇门一层投影压在场景上; 拱心石的紫晶慢慢呼吸 */
.ob-door{position:absolute;pointer-events:none;filter:drop-shadow(0 calc(4*var(--u)) calc(8*var(--u)) #000c)}
.ob-door svg{display:block;width:100%;height:100%;overflow:visible}
.ob-door .gem{animation:ob-gem 3.2s ease-in-out infinite}
@keyframes ob-gem{50%{opacity:.7}}
@media(prefers-reduced-motion:reduce){.ob-door .gem{animation:none}}
.ob-rt-actor{position:absolute;inset:0;pointer-events:none;transform-origin:50% 70%;transition:transform 1s cubic-bezier(.2,.7,.2,1)}
.ob-rt-actor canvas{position:absolute;inset:0;width:100%;height:100%}
.ob-ritual.is-pulse .ob-rt-actor{animation:ob-rtpulse 1s}
@keyframes ob-rtpulse{25%{filter:brightness(1.3) drop-shadow(0 0 30px #9fe0ff)}}
.ob-rt-arrow{position:absolute;z-index:7;top:46%;width:calc(50*var(--u));height:calc(74*var(--u));padding:0;border:0;background:none;transform:translateY(-50%);filter:drop-shadow(0 0 10px #2f8fff) drop-shadow(0 3px 0 #06122e);transition:transform .2s}
.ob-rt-arrow svg{width:100%;height:100%;fill:#163868;stroke:var(--ob-c);stroke-width:3;stroke-linejoin:round}
.ob-rt-prev{left:calc(104*var(--u))}
.ob-rt-next{left:calc(990*var(--u))}
.ob-rt-prev:hover{transform:translate(-6px,-50%) scale(1.08)}
.ob-rt-next:hover{transform:translate(6px,-50%) scale(1.08)}
.ob-rt-arrow:hover svg{fill:#1d4a86}
.ob-rt-arrow:active svg{fill:var(--ob-gold)}
.ob-rt-arrow[hidden]{display:none}
/* 左边竖能量柱: 上面 第几位 + 名字(竖排) + 状态, 中间五格从下往上灌(金), 下面 n/5 */
.ob-rt-col{position:absolute;z-index:7;left:calc(20*var(--u));top:calc(86*var(--u));bottom:calc(30*var(--u));width:calc(56*var(--u));display:flex;flex-direction:column;align-items:center;gap:calc(8*var(--u))}
#ob-rt-idx{font:800 italic calc(11*var(--u))/1 sans-serif;color:var(--ob-dim);letter-spacing:.1em;text-shadow:0 1px 3px #000}
.ob-rt-col b{writing-mode:vertical-rl;font-size:calc(22*var(--u));font-weight:900;letter-spacing:.2em;color:#fff;text-shadow:0 0 12px #8a5cff,0 2px 3px #000}
.ob-rt-col small{padding:2px 6px;font-size:calc(11*var(--u));font-weight:800;letter-spacing:.1em;color:#fff;background:#4f2aa8cc;box-shadow:inset 0 0 0 1px #b48bff}
.ob-rt-bar{--n:5;position:relative;flex:1;min-height:calc(120*var(--u));width:calc(18*var(--u));border-radius:10px;background:#06030bcc;box-shadow:inset 0 0 0 1px #ffc83d88,0 0 14px #000,0 0 10px #8a5cff55;overflow:hidden}
.ob-rt-bar i{position:absolute;left:3px;right:3px;bottom:3px;height:0;border-radius:7px;background:linear-gradient(#fff2b0,var(--ob-gold) 40%,#c97a10);box-shadow:0 0 10px var(--ob-gold);transition:height .6s cubic-bezier(.2,.8,.2,1)}
.ob-rt-bar::after{content:"";position:absolute;inset:0;background:repeating-linear-gradient(0deg,transparent 0 calc(100% / var(--n) - 2px),#06030b calc(100% / var(--n) - 2px) calc(100% / var(--n)));pointer-events:none}
.ob-rt-col em{font:900 italic calc(16*var(--u))/1 sans-serif;color:var(--ob-gold);text-shadow:0 1px 3px #000}
/* 台词: 角色旁边的气泡, 说完几秒淡出, 平时不占地方 */
.ob-rt-say{position:absolute;z-index:7;left:10%;width:53%;bottom:calc(22*var(--u));display:flex;justify-content:center;opacity:0;pointer-events:none} /* 10-26 用户: 挪到银幕下面正中(像字幕), 不挡动画 */
.ob-rt-say p{max-width:86%;margin:0;padding:12px 56px;background:radial-gradient(ellipse 50% 62% at 50% 50%,#05020dcc,#05020d66 55%,#05020d00 80%);font-size:calc(16*var(--u));line-height:1.7;letter-spacing:.06em;color:#f4eeff;text-align:center;text-shadow:0 1px 3px #000,0 0 10px #000c,0 0 18px #8a5cff55} /* 无边框沉浸式(10-27 用户): 没有底板 / 描边 / 圆角, 文字后面一团往四周淡出的暗晕托住, 像电影字幕 */
.ob-rt-say.is-on{animation:ob-say 5s forwards}
.ob-rt-pops{position:absolute;z-index:8;left:12%;width:50%;top:30%;display:grid;justify-items:center;pointer-events:none}
.ob-rt-pops .ob-pop{position:relative;transform:none}
/* 右边面板: 深色大卡 + 顶上青金双线 + 金角; 中间滚动, 底栏固定 */
/* 右侧盲盒区(10-26 用户: 无边框、浸入式): 没有底板 / 切角 / 描边, 只在屏幕右边铺一层透明→深色的柔光托住文字, 内容像浮在场景上(旧版 backup/orbs-20261026-randbox/orbs.panel-before.css) */
.ob-rt-panel{position:absolute;z-index:6;right:0;top:calc(70*var(--u));bottom:0;width:calc(500*var(--u));display:flex;flex-direction:column;padding:calc(36*var(--u)) 0 0 calc(30*var(--u));
  background:radial-gradient(120% 70% at 100% 50%,#030a1ccc,#030a1c80 55%,#030a1c00 85%);
  -webkit-mask:linear-gradient(transparent,#000 calc(40*var(--u)),#000 calc(100% - 30*var(--u)),transparent);mask:linear-gradient(transparent,#000 calc(40*var(--u)),#000 calc(100% - 30*var(--u)),transparent)}
.ob-rt-panel :is(h3,p,small,b,span){text-shadow:0 1px 3px #000c,0 0 12px #000a}
.ob-rt-scroll{flex:1;min-height:0;display:flex;flex-direction:column;gap:calc(10*var(--u));padding:calc(6*var(--u)) calc(14*var(--u)) calc(12*var(--u)) calc(20*var(--u));margin-right:calc(6*var(--u));
  overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:#5fd0ff88 transparent}
.ob-rt-scroll::-webkit-scrollbar{width:8px}
.ob-rt-scroll::-webkit-scrollbar-track{margin:8px 0;background:none}
.ob-rt-scroll::-webkit-scrollbar-thumb{border-radius:4px;background:linear-gradient(var(--ob-c),var(--ob-b));box-shadow:0 0 6px #2f8fff}
.ob-rt-scroll::-webkit-scrollbar-thumb:hover{background:linear-gradient(var(--ob-gold),var(--ob-gold2))}
.ob-rt-foot{flex:none;display:flex;align-items:center;justify-content:flex-end;gap:calc(12*var(--u));padding:calc(8*var(--u)) calc(26*var(--u)) calc(34*var(--u)) calc(20*var(--u))}
.ob-rt-foot span{margin-right:auto;font-size:calc(13*var(--u));color:var(--ob-dim)}
.ob-rt-panel .ob-rt-retry{min-width:0;width:auto;padding:calc(6*var(--u)) calc(24*var(--u));background:linear-gradient(#ffb070,#ff6a2a 50%,#e03c1c);color:#fff;text-shadow:0 1px 2px #7a1a00;
  filter:drop-shadow(0 3px 0 #7a1a00) drop-shadow(0 0 10px #ff6a2a88)}
.ob-rt-panel .ob-rt-leave{--cut:12px;min-width:0;padding:calc(6*var(--u)) calc(20*var(--u));background:linear-gradient(#2a3a5a,#162440);color:#dce6f5;text-shadow:none;box-shadow:inset 0 0 0 1px #8fa6c8;filter:drop-shadow(0 3px 0 #06122e)}
.ob-rt-panel .ob-rt-leave b{font-size:calc(15*var(--u));letter-spacing:.14em}
.ob-rt-panel .ob-rt-leave:hover:not(:disabled){box-shadow:inset 0 0 0 1px #dce6f5;filter:drop-shadow(0 3px 0 #06122e) drop-shadow(0 0 8px #8fa6c888)}
.ob-rt-panel .ob-rt-retry:hover:not(:disabled){filter:drop-shadow(0 3px 0 #7a1a00) drop-shadow(0 0 16px #ff8a4a)}
.ob-rt-panel .ob-rt-retry b{font-size:calc(15*var(--u));letter-spacing:.14em}
.ob-rt-panel h4{display:flex;align-items:baseline;gap:10px;margin:0 0 calc(6*var(--u));font-size:calc(13*var(--u));letter-spacing:.12em}
.ob-rt-panel h4 small b{color:var(--ob-gold)}
.ob-rt-panel h4 span{padding:3px 18px 3px 12px;color:#fff;background:linear-gradient(100deg,var(--ob-b),transparent);box-shadow:inset 3px 0 0 var(--ob-c)}
.ob-rt-panel h4 small{font-size:calc(12*var(--u));font-weight:400;letter-spacing:.04em;color:var(--ob-dim)}
.ob-ph-head{padding:calc(8*var(--u)) 0 0}
.ob-ph-head small{font:900 italic calc(12*var(--u))/1 sans-serif;letter-spacing:.24em;color:var(--ob-c)}
.ob-ph-head h3{margin:4px 0;font-size:calc(22*var(--u));font-weight:900;letter-spacing:.08em;color:#fff;text-shadow:0 0 12px #2f8fff}
.ob-ph-head p{margin:0;font-size:calc(12.5*var(--u));line-height:1.6;color:#c3d9f2}
.ob-ico{width:62%;height:62%;fill:none;stroke:#bff0ff;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;filter:drop-shadow(0 0 4px #2f8fff)}
/* 记忆盲盒(10-26): 净化之心计数 + 一格一个盒子; 没开 = 黄色问号方块, 开过 = 爱心徽章, 最后一格 = 彩虹的最终一幕; 刚开的那个弹一下 */
.ob-hearts{display:grid;grid-template-columns:auto auto 1fr;align-items:center;gap:calc(10*var(--u));margin:calc(4*var(--u)) 0;padding:calc(4*var(--u)) 0}
.ob-hearts .ob-heart{filter:drop-shadow(0 0 8px #ff4f9a)}
.ob-hearts .ob-heart{width:calc(30*var(--u));height:calc(30*var(--u))}
.ob-hearts b{font:900 calc(28*var(--u))/1 sans-serif;color:#fff;text-shadow:0 0 10px #ff4f9a}
.ob-hearts small{font-size:calc(11.5*var(--u));line-height:1.4;color:var(--ob-dim)}
.ob-ico.ob-heart{fill:#ff5f9e;stroke:#ffd0e4;stroke-width:1.2}
.ob-boxes{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(calc(54*var(--u)),1fr));gap:calc(4*var(--u))}
/* 盲盒 = 等轴问号方块(10-26 用户参考 temp/5mh.png; SVG 在 orbs.js boxSvg): 小、几十个也排得下 */
.ob-box{display:block;width:100%;padding:0;border:0;background:none;cursor:pointer;transition:transform .15s,filter .15s;filter:drop-shadow(0 4px 4px #0009)}
.ob-box svg{display:block;width:100%;height:auto;overflow:visible}
.ob-box:hover{transform:translateY(-3px);filter:drop-shadow(0 0 8px #5fb4ff) drop-shadow(0 4px 4px #0009)}
.ob-box:focus-visible{outline:2px solid #fff;outline-offset:2px}
.ob-bx-q{font:900 30px/1 Arial,sans-serif;fill:#fff;text-anchor:middle;paint-order:stroke;stroke:#9cc8ff;stroke-width:1.2}
.ob-bx-dot{fill:#fff;opacity:.95}
.ob-bx-n{font:900 13px/1 Arial,sans-serif;fill:#fff;text-anchor:middle;paint-order:stroke;stroke:#1d4fd0;stroke-width:2.5}
.ob-bx-ring{fill:none;stroke:#e6f4ff;stroke-width:2.6;opacity:.75}
.ob-bx-ring-back{opacity:.35}
/* 黄方块上的问号 / 编号描边用暖色 */
.ob-box .ob-bx-q{stroke:#e8a820}
.ob-box .ob-bx-n{stroke:#a05a00}
.ob-box:hover{filter:drop-shadow(0 0 8px #ffc83d) drop-shadow(0 4px 4px #0009)}
/* 开过的 = 爱心徽章(orbs.js markSvg, 参考 temp/18.png): 粉色心框(10-27 用户: 黄改粉) + 两颗红心 + 金箭, 号码在底下 */
.ob-ar-frame{stroke:#fff;stroke-width:3;paint-order:stroke;filter:drop-shadow(0 0 1.5px #7a1f3a)}
.ob-ar-heart{stroke:#7a0f2c;stroke-width:2.5}
.ob-ar-shine{fill:#fff;opacity:.55}
.ob-ar-shaft{stroke:#e0a21c;stroke-width:2.6;stroke-linecap:round}
.ob-ar-feather{stroke:#f6d36a;stroke-width:1.6;stroke-linecap:round;fill:none}
.ob-ar-head{fill:#f6c33a;stroke:#9a6a08;stroke-width:1}
.ob-ar-n{font:900 22px/1 'Arial Black',Arial,sans-serif;fill:#ff8fb3;text-anchor:middle;paint-order:stroke;stroke:#6a1030;stroke-width:4.5;stroke-linejoin:round}
.ob-box.is-open:hover{filter:drop-shadow(0 0 8px #ff8fb3) drop-shadow(0 4px 4px #0009)}
/* 最终一幕 = 彩虹盒子: 锁着压暗 + 小锁, 开完全亮、呼吸光 */
.ob-box-fin .ob-bx-q{stroke:#b44dff}
.ob-box-fin .ob-bx-n{stroke:#b44dff;font-size:15px}
.ob-fin-lock{fill:#ffc21e;stroke:#8a5200;stroke-width:1.6;filter:drop-shadow(0 0 3px #ffd24a)} /* 黄锁(10-27 用户) */
.ob-fin-lock path{fill:none;stroke:#ffd23f;stroke-width:3.2}
.ob-box-fin:not(.is-ready){cursor:not-allowed}
.ob-box-fin:not(.is-ready) svg>:not(.ob-fin-lock){filter:saturate(.35) brightness(.7)} /* 只压暗盒子, 锁保持亮黄 */
.ob-box-fin:not(.is-ready):hover{transform:none;filter:drop-shadow(0 4px 4px #0009)}
.ob-box-fin.is-ready .ob-fin-lock{display:none}
.ob-box-fin.is-ready{animation:ob-finglow 1.6s ease-in-out infinite alternate}
@keyframes ob-finglow{from{filter:drop-shadow(0 0 4px #ff7ad9) drop-shadow(0 4px 4px #0009)}to{filter:drop-shadow(0 0 12px #6bd6ff) drop-shadow(0 4px 4px #0009)}}
.ob-box.is-opening{animation:ob-boxopen .7s cubic-bezier(.2,.8,.2,1)}
@keyframes ob-boxopen{0%{transform:none}25%{transform:scale(1.18) rotate(-6deg);filter:brightness(1.8) drop-shadow(0 0 14px #fff)}55%{transform:scale(.95) rotate(3deg)}100%{transform:none}}
@media (prefers-reduced-motion:reduce){.ob-box.is-opening,.ob-box-fin.is-ready{animation:none}}
.ob-ritual.is-busy :is(.ob-rt-panel,.ob-rt-arrow) button,.ob-ritual.is-busy .ob-rt-arrow{pointer-events:none;opacity:.55}
.ob-seal{position:absolute;inset:0;z-index:40;display:grid;place-content:center;justify-items:center;gap:10px;background:radial-gradient(ellipse at center,#163868ee,#061230f5);animation:ob-seal 2s forwards}
.ob-seal[hidden]{display:none}
.ob-seal small{color:var(--ob-c);font-weight:800;letter-spacing:.4em}
.ob-seal h3{font-size:calc(46*var(--u));font-weight:900;letter-spacing:.16em;color:#fff;text-shadow:0 0 24px #2f8fff,0 4px 0 #000}
@keyframes ob-seal{0%{opacity:0}15%,80%{opacity:1}100%{opacity:0}}

/* ---------- 终幕 ---------- */
.ob-ending{display:none;padding:calc(170*var(--u)) calc(80*var(--u))}
.ob-stage[data-mode=ending] .ob-ending{display:grid;align-content:start;justify-items:start;gap:20px}
.ob-ending>*{position:relative;max-width:calc(620*var(--u))}
.ob-ending h1{font-size:calc(56*var(--u));line-height:1.3;color:#fff;text-shadow:0 0 20px #2f8fff,0 4px 0 #000}
.ob-ending h1 em{font-style:normal;color:var(--ob-gold)}
.ob-ending p{font-size:calc(18*var(--u));line-height:1.8;padding:14px 20px;background:var(--brk),var(--hud);box-shadow:var(--hud-edge)}

/* ---------- 结算: 全屏 VICTORY / DEFEAT ---------- */
.ob-result{width:100vw;height:100vh;max-width:none;max-height:none;margin:0;padding:0;border:0;display:none;place-content:center;justify-items:center;gap:calc(10*var(--u));overflow:hidden;text-align:center;
  color:#fff;background:radial-gradient(ellipse at 50% 40%,#1d4a86 0,#0b1d42 55%,#050c22 100%);font-family:"Noto Sans SC",sans-serif}
.ob-result[open]{display:grid}
.ob-result{padding:calc(40*var(--u)) 20px calc(56*var(--u));overflow:hidden;box-sizing:border-box} /* 光芒是 220vmax 的大圆, 必须裁掉, 不能滚动 */
/* 结算的按钮(10-25 用户: 太大、贴着底): 小一号, 和上面隔开 */
.ob-result .ob-dlg-btns{justify-content:center;margin:calc(14*var(--u)) 0 0}
.ob-result .ob-cta{min-width:calc(150*var(--u));padding:calc(7*var(--u)) calc(24*var(--u))}
.ob-result .ob-cta b{font-size:calc(16*var(--u));letter-spacing:.16em}
.ob-result::backdrop{background:transparent}
.ob-result.is-lose{background:radial-gradient(ellipse at 50% 40%,#3a2a3a 0,#1a1222 55%,#08060e 100%)}
.ob-rays{position:absolute;left:50%;top:36%;width:220vmax;height:220vmax;transform:translate(-50%,-50%);background:repeating-conic-gradient(#ffc83d33 0 5deg,#ffc83d00 5deg 14deg);animation:ob-rays 30s linear infinite;pointer-events:none}
.ob-result.is-lose .ob-rays{background:repeating-conic-gradient(#ffffff0d 0 5deg,#ffffff00 5deg 14deg)}
@keyframes ob-rays{to{transform:translate(-50%,-50%) rotate(360deg)}}
.ob-result>:not(.ob-rays):not(.ob-result-back){position:relative} /* 10-27 修: 原来 .ob-result>* 排在 .ob-rays 后面、优先级一样, 把光芒(220vmax)也变成了普通内容, 撑出 4000 多像素的一行, VICTORY / 按钮全被挤出画面 */
/* 返回选关 = 顶栏左上「← 游戏大厅」同一个位置同一种字(10-27 用户) */
.ob-result-back{position:absolute;z-index:1;top:calc(31*var(--u));left:calc(22*var(--u));transform:translateY(-50%);padding:0;border:0;background:none;font:inherit;font-size:14px;cursor:pointer}
.ob-result-big{padding:0 .15em;font:900 italic min(14vw,150px)/1 "Arial Black",sans-serif;letter-spacing:.04em;background:linear-gradient(#fff 15%,#ffe68a 50%,var(--ob-gold2));-webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 6px 0 #6a3600) drop-shadow(0 0 30px #ffb21e);animation:ob-big .7s cubic-bezier(.2,1.4,.4,1)}
.ob-result.is-lose .ob-result-big{background:linear-gradient(#e6e9f0,#8a96ac);-webkit-background-clip:text;background-clip:text;filter:drop-shadow(0 6px 0 #222) drop-shadow(0 0 20px #000)}
@keyframes ob-big{from{transform:scale(2.4);opacity:0}}
.ob-result .ob-kicker{color:var(--ob-c)}
.ob-result h2{font-size:28px;font-weight:900;text-shadow:0 0 12px #2f8fff}
.ob-result p{max-width:560px;margin:0;line-height:1.7;color:#c3d9f2}
.ob-result-stats{display:flex;gap:14px}
.ob-result-stats span{display:grid;min-width:120px;padding:8px 16px;background:var(--brk),var(--hud);box-shadow:var(--hud-edge)}
.ob-result-stats small{font-size:12px;color:var(--ob-dim)}
.ob-result-stats b{font:900 italic 24px/1.2 sans-serif;color:var(--ob-gold)}
.ob-result .ob-loot{justify-content:center}
.ob-result .ob-loot li{display:grid;justify-items:center;gap:2px;width:96px;padding:10px 6px;background:radial-gradient(circle at 50% 30%,#2d6fc0,#0b1d42 80%);box-shadow:inset 0 0 0 1px var(--ob-c),0 0 14px #2f8fff66;animation:ob-lootin .4s cubic-bezier(.2,1.4,.4,1) both;animation-delay:calc(.5s + var(--i,0)*.12s)}
.ob-result .ob-loot .ob-ico{width:40px;height:40px}
.ob-result .ob-loot b{font-size:12px}
.ob-result .ob-loot em{font:900 italic 16px sans-serif;color:var(--ob-gold)}
@keyframes ob-lootin{from{transform:scale(0) rotate(-20deg);opacity:0}}

/* ---------- 弹窗(确认 / 玩法) ---------- */
.ob-dlg{width:min(560px,92vw);padding:28px 32px;border:0;background:var(--brk),var(--hud);color:#fff;box-shadow:var(--hud-edge),inset 0 3px 0 var(--ob-c),inset 0 5px 0 var(--ob-gold)}
.ob-dlg::backdrop{background:#030a1ccc}
.ob-dlg h2{margin:10px 0;font-size:26px;font-weight:900;text-shadow:0 0 12px #2f8fff}
.ob-dlg p{line-height:1.75;color:#c3d9f2}
/* 故事背景: 半透明, 能看到后面的城 */
.ob-story{width:min(620px,92vw);max-height:86vh;overflow-y:auto;background:var(--brk),#0a1838a6;backdrop-filter:blur(6px)}
.ob-story::backdrop{background:#030a1c66}
.ob-story p b{color:var(--ob-gold)}
.ob-dlg-btns{display:flex;justify-content:flex-end;gap:12px;margin-top:20px;flex-wrap:wrap}
.ob-dlg .ob-cta{min-width:150px;padding:10px 24px}
.ob-dlg .ob-cta b{font-size:16px}
.ob-help{width:min(760px,94vw)}
.ob-loot{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:8px}
.ob-loot li{display:flex;align-items:center;gap:6px;padding:6px 12px;background:#06122e;box-shadow:inset 0 0 0 1px #5fd0ff55;font-weight:700}
.ob-loot .ob-ico{width:20px;height:20px}
.ob-toast{position:absolute;z-index:80;left:50%;bottom:calc(120*var(--u));transform:translateX(-50%);padding:10px 24px;background:var(--hud);box-shadow:var(--hud-edge),inset 0 -3px 0 var(--ob-gold);color:#fff;font-size:14px;font-weight:700}
.ob-toast[hidden]{display:none}

@media (prefers-reduced-motion:reduce){.ob-stage *{animation-duration:.01ms!important;animation-iteration-count:1!important}}
/* 窄屏 / 手机竖屏 */
@media (max-width:760px){
  .ob-frame{aspect-ratio:auto;height:calc(100dvh - 70px)}
  .ob-stage{--u:calc(100cqw / 760)}
  .ob-chapter{left:10px;right:10px;top:56px}.ob-chapter h1{font-size:18px;white-space:normal}.ob-ring{display:none}
  .ob-cards{left:8px;right:8px;top:120px;bottom:170px;gap:4px}.ob-cards li.is-sel{flex-grow:4}
  .ob-sortie{left:8px;right:8px;height:auto;flex-wrap:wrap;gap:8px;padding:10px 14px}.ob-sortie-main{min-width:0}.ob-sortie-row{display:none}
  .ob-boss-host{width:45%;top:40px;opacity:.9}.ob-hunter{width:30%;opacity:.8}
  .ob-plate{width:44%}.ob-plate-hunter{width:44%}.ob-stage-title,.ob-cast small{display:none}.ob-skill{width:56px}.ob-skill-ult{width:70px}.ob-combo-meter{right:12px}
  .ob-rt-panel{left:0;right:0;width:auto;top:55%;bottom:0;padding:16px 0 0 4px;background:linear-gradient(#030a1c00,#030a1ccc 18%,#030a1ce6)}.ob-cinema{left:0;width:100%;top:40px;bottom:45%}.ob-rt-col{top:60px;bottom:47%;left:6px}.ob-rt-say{left:0;width:100%;bottom:calc(45% + 4px)}.ob-rt-story{left:64px;top:60px}.ob-rt-prev{left:8px;top:30%}.ob-rt-next{left:auto;right:8px;top:30%}
}
