/* 《远望》M1 · 暗冷蓝 */
:root{
  --bg:#05080b;
  --ink:#cfd8e3;
  --dim:#71829a;
  --line:#1e2a37;
  --line2:#2a3644;
  --panel:rgba(9,13,18,.97);
  --blue:#5b9bd5;
  --red:#f0483e;
  --gold:#e0af68;
  --mono:ui-monospace,Menlo,Consolas,"Cascadia Mono",monospace;
}
*{box-sizing:border-box}
html,body{height:100%}
body{
  margin:0;background:var(--bg);color:var(--ink);
  font:15px/1.7 -apple-system,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
  -webkit-font-smoothing:antialiased;
  overflow:hidden;
  user-select:none;
}
button{font-family:inherit}

/* ══════ 滚动条（全局统一，不用浏览器默认） ══════ */
*{scrollbar-width:thin;scrollbar-color:#26384a transparent}
*::-webkit-scrollbar{width:10px;height:10px}
*::-webkit-scrollbar-track{background:transparent}
*::-webkit-scrollbar-thumb{
  background:#22303f;border-radius:6px;
  border:3px solid transparent;background-clip:padding-box;
}
*::-webkit-scrollbar-thumb:hover{background:#35495e;background-clip:padding-box}
*::-webkit-scrollbar-corner{background:transparent}

/* ══════ 开场 ══════ */
.intro{
  position:fixed;inset:0;z-index:60;background:#000;
  display:none;overflow-y:auto;      /* 整个屏幕都是滚动容器，鼠标在哪儿都能滚 */
  cursor:pointer;
}
.intro.on{display:block}
/* 尾声：字幕退场，底下的设备一点点浮上来 */
.intro.out{
  opacity:0;pointer-events:none;
  transition:opacity 1s ease;
}
/* 内容短时竖向居中（靠 .intro-text 的 margin:auto），长了就自然铺开、由外层滚 */
.intro-inner{
  width:min(760px,84vw);
  margin:0 auto;min-height:100%;
  padding:10vh 0;
  display:flex;flex-direction:column;
}
.intro-text{
  margin:auto 0;
  font-size:19px;line-height:2.15;letter-spacing:.04em;color:#c3ccd8;
  opacity:0;transform:translateY(8px);
  transition:opacity .9s ease,transform .9s ease;
  white-space:normal;
}
.intro-text.in{opacity:1;transform:none}
.intro-hint{
  /* fixed：外层现在是滚动容器，absolute 会跟着内容滚走 */
  position:fixed;bottom:34px;left:0;right:0;text-align:center;
  font-size:12px;color:#3d4a58;letter-spacing:.3em;
  animation:breathe 3.2s ease-in-out infinite;
}
@keyframes breathe{0%,100%{opacity:.25}50%{opacity:.7}}

/* ══════ 桌面 ══════ */
.desktop{position:fixed;inset:0;opacity:0;pointer-events:none;transition:opacity 1.1s ease}
.desktop.on{opacity:1;pointer-events:auto}
.wall{
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  filter:brightness(1.15) saturate(1.05);
}
.desktop::after{
  content:"";position:absolute;inset:0;
  background:radial-gradient(ellipse at 50% 45%,transparent 30%,rgba(0,0,0,.55) 100%);
  pointer-events:none;
}
.mark{
  position:absolute;right:5vw;bottom:12vh;width:clamp(180px,22vw,300px);
  opacity:.09;filter:blur(.3px);pointer-events:none;
}
.mark img{width:100%;display:block}

.icons{
  position:absolute;left:clamp(20px,3vw,48px);top:clamp(48px,8vh,96px);
  display:flex;flex-direction:column;gap:clamp(12px,2.2vh,22px);
  z-index:2;
}
.icon{
  position:relative;width:100px;padding:6px 4px 8px;background:transparent;border:0;
  display:flex;flex-direction:column;align-items:center;gap:5px;
  cursor:pointer;border-radius:8px;color:var(--ink);
  transition:background .18s ease,transform .18s ease;
}
.icon:hover,.icon:focus-visible{background:rgba(120,170,225,.10);outline:none}
.icon:active{transform:scale(.97)}
.icon .ico img{
  width:52px;height:52px;display:block;
  filter:drop-shadow(0 3px 6px rgba(0,0,0,.65));
}
.icon .lbl{
  font-size:13px;letter-spacing:.12em;color:#c2cdda;
  text-shadow:0 1px 3px rgba(0,0,0,.9);
}
.dot{
  display:none;position:absolute;top:2px;right:14px;
  width:9px;height:9px;border-radius:50%;background:var(--red);
  box-shadow:0 0 8px rgba(240,72,62,.9);
}
.dot.on{display:block;animation:pulse 2.1s ease-in-out infinite}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.45}}

.osbar{
  position:fixed;left:0;right:0;bottom:0;height:38px;z-index:58;
  display:flex;align-items:center;gap:14px;padding:0 18px;
  background:linear-gradient(to top,rgba(4,7,10,.94),rgba(4,7,10,.42));
  border-top:1px solid rgba(90,120,150,.16);
  font-size:12px;color:#6b7c91;letter-spacing:.18em;
}
/* 七天里只留按钮，其它系统文字淡出 */
body.in-seven .osbar .osname,
body.in-seven .osbar .readbar{opacity:0;pointer-events:none}
body.in-seven .osbar{background:linear-gradient(to top,rgba(8,3,4,.92),rgba(8,3,4,.30));border-top-color:rgba(120,40,40,.22)}
.osmid{flex:1}
.ghost{
  background:transparent;border:1px solid #26323f;color:#6b7c91;
  border-radius:5px;padding:3px 10px;font-size:12px;cursor:pointer;letter-spacing:.1em;
}
.ghost:hover{color:#a9bacd;border-color:#3a4a5c}

/* 档案进度：右下角 5 个光点 */
.readbar{display:inline-flex;align-items:center;gap:8px;margin-right:6px}
.readbar .rb-lbl{font-size:11.5px;color:#52657a;letter-spacing:.18em}
.readbar .rb-num{font-size:11.5px;color:#52657a;letter-spacing:.1em;font-family:var(--mono)}
.readbar i{
  width:8px;height:8px;border-radius:50%;display:block;
  background:#141d26;border:1px solid #2b3a4a;
  transition:background .3s ease,box-shadow .3s ease,border-color .3s ease;
}
.readbar i.on{
  background:#5cf59a;border-color:#2f6b48;
  box-shadow:0 0 9px rgba(92,245,154,.7);
}
/* 「我好想回家」跳脸：正文的字号、正文的字体，就中间几行，一行行正常排下来 */
.homescare{
  position:fixed;inset:0;z-index:94;overflow:hidden;pointer-events:none;
  display:flex;flex-direction:column;
  justify-content:center;align-items:flex-start;
  animation:homeFlash .7s steps(1,end) 1 both;
}
.homerow{
  white-space:nowrap;letter-spacing:0;
  font-size:24px;line-height:.82;   /* 行距比字高小：行行压住上半行的下沿 */
  color:#c31119;
}
@keyframes homeFlash{
  0%{opacity:0}
  5%{opacity:1}
  14%{opacity:.22}
  22%{opacity:1}
  34%{opacity:.45}
  44%{opacity:1}
  56%{opacity:.28}
  66%{opacity:1}
  80%{opacity:.55}
  90%{opacity:1}
  100%{opacity:0}
}

/* ── 档案点亮：夸张到不可能看不见 ── */
@keyframes rbDotPop{
  0%{transform:scale(1)}
  9%{transform:scale(4.6)}
  22%{transform:scale(1.15)}
  34%{transform:scale(2.8)}
  48%{transform:scale(1.4)}
  60%{transform:scale(2)}
  76%{transform:scale(1.2)}
  100%{transform:scale(1)}
}
.readbar i.pop{
  position:relative;z-index:2;
  animation:rbDotPop .95s cubic-bezier(.25,.8,.3,1) 1 both;
  box-shadow:0 0 16px 4px rgba(92,245,154,.95), 0 0 44px 12px rgba(92,245,154,.42);
}
@keyframes rbGlow{
  0%{filter:none}
  16%{filter:drop-shadow(0 0 14px rgba(92,245,154,.95)) brightness(1.9)}
  44%{filter:drop-shadow(0 0 7px rgba(92,245,154,.65)) brightness(1.3)}
  100%{filter:none}
}
.readbar.glow{animation:rbGlow 1s ease 1 both}
@keyframes numPop{
  0%{transform:scale(1);color:#52657a}
  14%{transform:scale(2.2);color:#c6ffdf}
  40%{transform:scale(1.35);color:#7ef0ae}
  100%{transform:scale(1);color:#52657a}
}
.readbar .rb-num.popnum{
  display:inline-block;animation:numPop .95s ease 1 both;
}
/* 从档案点往外扩的三圈涟漪 */
@keyframes ringOut{
  0%{transform:scale(.35);opacity:.95}
  70%{opacity:.30}
  100%{transform:scale(7.5);opacity:0}
}
.ringout{
  position:fixed;z-index:69;pointer-events:none;
  width:22px;height:22px;margin:-11px 0 0 -11px;border-radius:50%;
  border:2px solid rgba(92,245,154,.95);
  box-shadow:0 0 12px rgba(92,245,154,.6);
  animation:ringOut .85s cubic-bezier(.2,.7,.3,1) 1 both;
}

/* ══════ 窗口 ══════ */
.modal{
  position:fixed;inset:0;z-index:50;display:none;
  align-items:center;justify-content:center;
  background:rgba(2,4,6,.62);backdrop-filter:blur(2px);
}
.modal.on{display:flex}
.win{
  width:min(900px,93vw);height:min(80vh,820px);
  display:flex;flex-direction:column;
  background:var(--panel);border:1px solid var(--line2);border-radius:10px;
  box-shadow:0 24px 70px rgba(0,0,0,.75),0 0 0 1px rgba(120,170,225,.05) inset;
  animation:winin .22s ease;
}
@keyframes winin{from{opacity:0;transform:translateY(10px) scale(.99)}to{opacity:1;transform:none}}
.win-bar{
  display:flex;align-items:center;gap:12px;padding:0 8px 0 16px;height:44px;
  border-bottom:1px solid var(--line);flex:0 0 auto;
  font-size:13px;letter-spacing:.14em;color:#93a4b8;
}
.win-bar #win-title{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.win-bar #win-close{
  width:30px;height:30px;border:0;background:transparent;color:#66788c;
  font-size:20px;line-height:1;cursor:pointer;border-radius:5px;
}
.win-bar #win-close:hover{background:rgba(240,72,62,.16);color:#ff8b84}
.win-body{
  flex:1;min-height:0;overflow-y:auto;padding:18px 20px 26px;
  user-select:text;scrollbar-gutter:stable;
}
/* 故障期间直接把滚动容器锁死（最硬的兜底） */
body.noinput .win-body{overflow:hidden}

/* 单张图片：不滚动、不出现拉条 */
.win-body.viewerwin{overflow:hidden;padding:12px}
.win-body.viewerwin .viewer{
  height:100%;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:12px;
}
.win-body.viewerwin .viewer img{
  max-width:100%;max-height:100%;
  width:auto;height:auto;object-fit:contain;border-radius:6px;
}

/* 内置 PDF：整个窗口交给浏览器阅读器，不留内边距和拉条 */
.win-body.pdfwin{overflow:hidden;padding:0;background:#0b0f14}
.win-body.pdfwin .pdfobj{display:block;width:100%;height:100%;border:0}
.pdfalt{padding:26px 24px;color:#93a4b8;font-size:14px;line-height:2;text-align:center}
.pdfalt a{color:#5b9bd5;text-decoration:none;border-bottom:1px solid rgba(91,155,213,.4)}
.pdfalt a:hover{color:#8fc0e8}

/* ══════ 通用文字 ══════ */
.sys{margin:0 0 12px;font-size:13.5px;color:#9fb2c6;letter-spacing:.04em}
.sys.dim{color:#61748a}
.sys.bad{color:#ff8b84}
.mono{font-family:var(--mono);font-size:13px;color:#b6c7dd}
.dim{color:var(--dim)}
.err{margin:8px 0 0;min-height:1.2em;font-size:13px;color:var(--red)}

/* ══════ 通信日志 ══════ */
.log{margin:10px 0 0}
.msg{
  padding:7px 12px;margin:0 0 5px;border-left:2px solid #1d2836;
  background:rgba(255,255,255,.018);border-radius:0 5px 5px 0;
}
.mhead{display:flex;flex-wrap:wrap;gap:9px;align-items:baseline;margin-bottom:2px}
.mt{font-family:var(--mono);font-size:12px;color:#6f8298}
.mk{
  font-size:11px;color:#7d8fa3;border:1px solid #26323f;border-radius:3px;
  padding:0 5px;line-height:1.5;
}
.mf{font-size:13px;color:#a8c3e0;letter-spacing:.06em}
.mto{font-size:12px;color:#4f5f72}
.mx{font-size:14px;color:#d6e0ec;line-height:1.65;white-space:pre-wrap}
/* 重点句：加粗 + 提亮 + 极淡底色，像被系统标了出来 */
.mx b{
  font-weight:700;color:#fff;
  background:rgba(120,170,225,.10);
  border-radius:3px;padding:0 2px;
  box-shadow:0 0 0 1px rgba(120,170,225,.10);
}
.msg.sos{border-left-color:var(--red);background:rgba(240,72,62,.06)}
.msg.sos .mx{color:#ff8b84;font-family:var(--mono);letter-spacing:.1em}
.msg.warn{border-left-color:var(--gold);background:rgba(224,175,104,.05)}
.msg.warn .mx{color:#f0c88a}
.sep{text-align:center;color:#37445a;margin:10px 0;letter-spacing:.5em;font-size:12px}

/* 每一天的分隔 · 吸顶 */
.daysep{
  position:sticky;top:0;z-index:4;
  display:flex;align-items:center;gap:14px;
  margin:26px 0 14px;padding:10px 0 8px;
  background:#0a0f15;
  box-shadow:0 10px 14px -10px rgba(0,0,0,.95);
}
.daysep:first-child{margin-top:4px}
.daysep::before,.daysep::after{
  content:"";height:1px;flex:1;
  background:linear-gradient(to right,transparent,#2c3d4f 40%,#2c3d4f 60%,transparent);
}
.daysep span{
  flex:0 0 auto;white-space:nowrap;
  font-size:13px;letter-spacing:.3em;color:#93bce0;
  border:1px solid #2b3f54;background:rgba(44,74,104,.22);
  border-radius:20px;padding:4px 18px 4px 22px;
}

/* ══════ 校验 / 输入 ══════ */
.auth,.authbox{
  display:flex;flex-wrap:wrap;gap:10px;align-items:center;
  margin-top:20px;padding:16px;border:1px solid var(--line);border-radius:8px;
  background:rgba(255,255,255,.015);
}
.auth label{font-size:13px;color:#7d8fa3;letter-spacing:.1em}
.auth .err{width:100%}
.authbox{flex-direction:column;align-items:flex-start;gap:8px}
.authbox p{margin:0;font-size:14px}
.authbox input{width:100%;max-width:320px}
.authbox .err{width:auto}
input[type=text],input[type=password]{
  background:#080d12;border:1px solid #24313f;border-radius:6px;
  color:#e6edf5;padding:8px 11px;font-size:14px;font-family:var(--mono);
  letter-spacing:.14em;outline:none;transition:border-color .16s;
}
input:focus{border-color:#3d6c9e;box-shadow:0 0 0 3px rgba(61,108,158,.15)}
.auth button,.authbox button{
  background:#16222e;border:1px solid #2c3c4d;color:#c3d3e4;
  border-radius:6px;padding:8px 20px;font-size:14px;cursor:pointer;letter-spacing:.1em;
}
.auth button:hover,.authbox button:hover{background:#1d2d3c;border-color:#3d6c9e}

/* ══════ 文件列表 ══════ */
.files{display:flex;flex-direction:column;gap:4px;margin-top:8px}
.file,.dir{
  position:relative;display:flex;align-items:center;gap:12px;width:100%;
  padding:10px 34px 10px 12px;background:transparent;border:0;border-radius:6px;
  cursor:pointer;text-align:left;color:var(--ink);
  transition:background .16s ease;
}
.file:hover,.dir:hover{background:rgba(120,170,225,.09)}
.file .fico img,.dir .fico img{width:30px;height:30px;display:block;opacity:.9}
.file .fmeta,.dir .fmeta{display:flex;flex-direction:column;gap:1px}
.file .fmeta b,.dir .fmeta b{font-size:14.5px;font-weight:600;color:#d6e0ec;letter-spacing:.06em}
.file .fmeta i,.dir .fmeta i{font-style:normal;font-size:12px;color:#5e7188}
.file .dot,.dir .dot{top:50%;right:12px;transform:translateY(-50%)}
.empty{
  margin:14px 0 0;padding:22px 16px;text-align:center;
  font-size:13px;color:#4f5f72;letter-spacing:.14em;
  border:1px dashed #1c2836;border-radius:8px;background:rgba(255,255,255,.012);
}

/* ══════ 定位 · 雷达 ══════ */
.radarwrap{
  display:flex;flex-direction:column;align-items:center;
  gap:16px;margin:10px 0 26px;
}
.radar{
  position:relative;flex:0 0 auto;
  width:min(320px,68vw);aspect-ratio:1;border-radius:50%;overflow:hidden;
  background:
    radial-gradient(circle at 50% 50%, rgba(38,92,72,.40) 0%, rgba(14,26,23,.90) 62%, rgba(6,10,9,.97) 100%);
  border:1px solid #1e3a31;
  box-shadow:
    0 0 0 1px rgba(110,255,190,.06) inset,
    0 0 34px rgba(60,200,140,.10),
    0 0 60px rgba(60,200,140,.05) inset;
}
/* 同心圈 + 十字线 */
.radar .rgrid{
  position:absolute;inset:0;border-radius:50%;
  background-image:
    repeating-radial-gradient(circle at 50% 50%,
      transparent 0 15.6%, rgba(120,255,190,.11) 15.6% 16%, transparent 16% 32%),
    linear-gradient(to right, transparent calc(50% - .5px), rgba(120,255,190,.14) calc(50% - .5px),
      rgba(120,255,190,.14) calc(50% + .5px), transparent calc(50% + .5px)),
    linear-gradient(to bottom, transparent calc(50% - .5px), rgba(120,255,190,.14) calc(50% - .5px),
      rgba(120,255,190,.14) calc(50% + .5px), transparent calc(50% + .5px));
}
/* 扫描扇形 */
.radar .sweep{
  position:absolute;inset:0;border-radius:50%;
  background:conic-gradient(from 0deg,
    rgba(110,255,180,.34) 0deg,
    rgba(110,255,180,.10) 26deg,
    transparent 72deg,
    transparent 360deg);
  animation:radarspin 4.2s linear infinite;
}
@keyframes radarspin{to{transform:rotate(360deg)}}
/* 光点 */
.blip{
  position:absolute;width:11px;height:11px;margin:-5.5px 0 0 -5.5px;
  border-radius:50%;
}
.blip.g{background:#5cf59a;box-shadow:0 0 14px 4px rgba(92,245,154,.55);animation:blipg 2.1s ease-in-out infinite}
.blip.r{background:#ff5a5a;box-shadow:0 0 14px 4px rgba(255,90,90,.55);animation:blipr 2.1s ease-in-out infinite}
.blip::after{
  content:"";position:absolute;inset:-7px;border-radius:50%;
  border:1px solid currentColor;opacity:0;animation:ping 2.6s ease-out infinite;
}
.blip.g{color:#5cf59a}
.blip.r{color:#ff5a5a}
.blip .tag{
  position:absolute;left:15px;top:-5px;font-style:normal;
  font-family:var(--mono);font-size:11px;letter-spacing:.04em;
  color:#8ff5bb;text-shadow:0 0 6px rgba(0,0,0,.9);white-space:nowrap;
}
@keyframes blipg{0%,100%{transform:scale(1);opacity:1}50%{transform:scale(1.28);opacity:.8}}
@keyframes blipr{0%,100%{transform:scale(1);opacity:1}50%{transform:scale(1.28);opacity:.8}}
@keyframes ping{
  0%{transform:scale(.6);opacity:.75}
  70%{transform:scale(2.1);opacity:0}
  100%{transform:scale(2.1);opacity:0}
}
.radarlegend{
  display:flex;flex-direction:row;justify-content:center;gap:26px;
  font-size:13px;color:#93a7bc;
}
.radarlegend span{display:flex;align-items:center;gap:8px}
.ldot{width:9px;height:9px;border-radius:50%;display:inline-block}
.ldot.g{background:#5cf59a;box-shadow:0 0 8px rgba(92,245,154,.7)}
.ldot.r{background:#ff5a5a;box-shadow:0 0 8px rgba(255,90,90,.7)}
@media (prefers-reduced-motion: reduce){
  .radar .sweep,.blip,.blip::after{animation:none}
}

/* 成员坐标表 */
.loctable{width:100%;border-collapse:collapse;font-size:13.5px;margin-top:4px}
.loctable th,.loctable td{padding:10px 12px;border-bottom:1px solid var(--line);text-align:left}
.loctable th{font-size:11.5px;font-weight:600;color:#61748a;letter-spacing:.16em;background:rgba(255,255,255,.02)}
.loctable td.n{color:#a8c3e0;letter-spacing:.06em;width:88px}
.loctable td.c{font-family:var(--mono);font-size:13px;color:#dbe4ee;letter-spacing:.05em;white-space:nowrap}
.loctable tr:last-child td{border-bottom:0}
.taga{color:#9ece6a;font-size:12px;letter-spacing:.14em}
.tagd{color:#f7768e;font-size:12px;letter-spacing:.14em}

/* ══════ 表格（孢子浓度） ══════ */
.sheet{margin-top:12px;overflow-x:auto;border:1px solid #1e2a37;border-radius:8px}
table.grid{width:100%;border-collapse:collapse;font-family:var(--mono);font-size:14px}
table.grid th,table.grid td{
  padding:11px 8px;text-align:center;border-right:1px solid #16202b;border-bottom:1px solid #16202b;
  white-space:nowrap;
}
table.grid th{
  font-weight:400;color:#6f7d90;background:#101821;letter-spacing:.04em;
}
table.grid td{color:#dbe4ee;background:#0b1119}
table.grid tr:last-child td{border-bottom:0}
table.grid th:last-child,table.grid td:last-child{border-right:0}

/* ══════ 卫星摄像 ══════ */
.satgrid{
  display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;
  margin:16px 0 6px;padding:18px;border:1px solid var(--line);border-radius:8px;
  background:rgba(255,255,255,.015);max-width:640px;
}
.satlbl{font-size:13px;color:#7d8fa3;letter-spacing:.14em;white-space:nowrap}
.satrow{display:flex;align-items:center;gap:5px;flex-wrap:wrap}
.satrow input[type=number]{
  width:62px;padding:7px 4px;text-align:center;
  background:#080d12;border:1px solid #24313f;border-radius:6px;
  color:#e6edf5;font-family:var(--mono);font-size:14px;outline:none;
  transition:border-color .16s;
  -moz-appearance:textfield;
}
.satrow input[type=number]:focus{border-color:#3d6c9e;box-shadow:0 0 0 3px rgba(61,108,158,.15)}
.satrow input[type=number]::-webkit-outer-spin-button,
.satrow input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.satrow .u{color:#5e7188;font-size:13px;margin-right:5px}
.satrow select{
  background:#080d12;border:1px solid #24313f;border-radius:6px;
  color:#e6edf5;font-size:14px;padding:7px 8px;outline:none;
  letter-spacing:.08em;cursor:pointer;
}
.satrow select:focus{border-color:#3d6c9e}
#sat-go{
  grid-column:2;justify-self:start;
  background:#16222e;border:1px solid #2c3c4d;color:#c3d3e4;
  border-radius:6px;padding:9px 26px;font-size:14px;cursor:pointer;letter-spacing:.18em;
}
#sat-go:hover{background:#1d2d3c;border-color:#3d6c9e}
.satimg{position:relative;margin:14px 0 0;width:100%;max-width:560px}
.satimg img{
  width:100%;display:block;border-radius:6px;
  border:1px solid #1b2634;background:#0a0f14;
}

/* ── 故障 / 惊吓：拍到「聚集的紫木」时 ── */
/* 全屏拦截层：故障期间任何点击都落在它身上 */
.blocker{
  position:fixed;inset:0;z-index:96;display:none;
  pointer-events:auto;background:transparent;cursor:default;
}
.blocker.on{display:block}
.glitch{
  position:fixed;inset:0;z-index:90;opacity:0;pointer-events:none;
  background:
    repeating-linear-gradient(to bottom,
      rgba(0,0,0,.86) 0 5px, transparent 5px 24px),
    linear-gradient(to bottom, rgba(255,30,60,.13), rgba(0,200,255,.13));
}
.glitch.on{
  pointer-events:auto;              /* 这几百毫秒里不吃任何点击 */
  animation:gbar .5s steps(1,end) 1 both;
}
@keyframes gbar{
  0%{opacity:.92}
  16%{opacity:.22}
  30%{opacity:.88}
  44%{opacity:.12}
  58%{opacity:.74}
  72%{opacity:.18}
  84%{opacity:.6}
  100%{opacity:0}
}
/* 卫星图位置上换成纯色块 + 乱码 */
.curse{display:none}
.satimg.scare img{visibility:hidden}
.satimg.scare .curse{
  display:flex;align-items:center;justify-content:center;
  position:absolute;inset:0;border-radius:6px;
  background:#050607;border:1px solid #3a1518;
  font-family:var(--mono);font-size:15px;letter-spacing:.28em;
  color:#b83a2c;text-shadow:0 0 10px rgba(200,50,40,.55);
  user-select:none;overflow:hidden;
}
.satimg.scare .curse::after{
  content:"";position:absolute;inset:0;border-radius:6px;
  background:repeating-linear-gradient(to bottom,
    rgba(190,40,40,.10) 0 2px, transparent 2px 7px);
  mix-blend-mode:screen;
}
/* 窗口硬跳错位，不回弹 */
.win.shift{animation:gshift .5s steps(1,end) 1 both}
@keyframes gshift{
  0%{transform:translateX(6px)}
  18%{transform:translateX(-4px)}
  34%{transform:translateX(3px)}
  50%{transform:translateX(-6px)}
  66%{transform:translateX(2px)}
  82%{transform:translateX(-3px)}
  100%{transform:translateX(0)}
}

/* ══════ 数字华容道 3×3 ══════ */
.win-body.pzwin{display:flex;flex-direction:column;align-items:center}
.win-body.pzwin > p{text-align:center}
.pzwin .pzbox{
  margin:22px 0 16px;padding:14px;border-radius:14px;
  border:1px solid #263340;
  background:linear-gradient(#0d151d,#0a1016);
  box-shadow:0 14px 36px rgba(0,0,0,.5),inset 0 0 0 1px rgba(120,170,225,.045);
}
.puzzle{position:relative;width:222px;height:222px}
.puzzle.noanim .pz-t{transition:none}
.pz-t{
  position:absolute;left:0;top:0;width:70px;height:70px;
  display:flex;align-items:center;justify-content:center;
  font-family:var(--mono);font-size:25px;color:#cfe0f0;
  background:#131d28;border:1px solid #26333f;border-radius:9px;
  cursor:default;user-select:none;
  transition:transform .19s cubic-bezier(.32,.02,.32,1),
             background .16s ease,border-color .16s ease,color .2s ease;
  will-change:transform;
}
.pz-t.near{cursor:pointer;border-color:#33465c}
.pz-t.near:hover{background:#1b2a38;border-color:#3d6c9e}
.pz-t.near:active{filter:brightness(1.18)}
.pz-t.ok{color:#9ece6a;border-color:#26382a;background:#101a13}
.pzstat{
  font-family:var(--mono);font-size:12.5px;color:#6f8298;
  letter-spacing:.12em;margin:0;
}

/* ══════ 红色窗口：只有「对话」用 ══════ */
.win.redwin{
  background:rgba(15,9,10,.975);
  border-color:#4a2429;
  box-shadow:
    0 24px 70px rgba(0,0,0,.78),
    0 0 0 1px rgba(190,70,70,.07) inset,
    0 0 56px rgba(150,40,45,.13);
}
.win.redwin .win-bar{
  border-bottom-color:#3a2225;
  color:#b98d88;
  background:linear-gradient(to bottom, rgba(66,28,31,.60), rgba(66,28,31,0));
}
.win.redwin .win-bar #win-close{color:#8a625f}
.win.redwin .win-bar #win-close:hover{background:rgba(240,72,62,.20);color:#ff9a94}
.win.redwin .win-body{
  background:radial-gradient(ellipse at 50% -10%, rgba(140,36,38,.13), transparent 62%);
}
.win.redwin .win-body::-webkit-scrollbar-thumb{background:#3b2226;background-clip:padding-box}
.win.redwin .win-body::-webkit-scrollbar-thumb:hover{background:#5a3036;background-clip:padding-box}

/* ── 尾声的那一个窗口：没有关闭键，只有一句话 ── */
.win.noclose .win-bar #win-close{display:none}
/* 标题是重度故障字（每个字母挂 42 个附加符），溢出就裁在标题栏里，别糊到窗口上 */
.win.noclose .win-bar{overflow:hidden}
.win.noclose .win-bar #win-title{overflow:hidden;line-height:1.7}
.win-body.thxwin{display:flex;align-items:center;justify-content:center}
.thx{
  display:flex;align-items:flex-start;gap:16px;
  width:min(560px,88%);animation:thxIn 1.1s ease both;
}
@keyframes thxIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
.thx-ava{
  width:52px;height:52px;flex:0 0 auto;border-radius:6px;
  object-fit:cover;
  border:1px solid #4a2a2c;background:#0a0607;
  filter:brightness(.78) saturate(.75) contrast(1.05);
}
.thx-body{
  flex:1;min-width:0;padding:11px 16px;
  background:rgba(140,36,38,.10);
  border:1px solid #3a2225;border-radius:9px;
}
.thx-txt{
  font-size:16px;line-height:1.9;color:#e3d2cd;letter-spacing:.06em;
  white-space:pre-wrap;
}
.thx-cur{
  display:inline-block;width:7px;height:16px;margin-left:2px;
  background:#c8a49e;vertical-align:-3px;
  animation:thxCur 1.1s steps(1,end) infinite;
}
@keyframes thxCur{0%,50%{opacity:1}50.01%,100%{opacity:0}}

/* ══════ 尾声之后：点一下结束 ══════ */
/* 红通道遮罩：纯红 + multiply 只留下原图的 R 分量，相当于把 G、B 两个通道杀掉。
   切换不做过渡——就是硬切一下，画面直接变红。 */
.epimask{
  position:fixed;inset:0;z-index:59;pointer-events:none;
  background:#f00;mix-blend-mode:multiply;
  opacity:0;
}
body.epi-red .epimask{opacity:1}
/* 冷蓝的壁纸红分量本来就低，先提亮再乘，不然会黑成一片 */
body.epi-red .desktop,
body.epi-red .osbar{
  filter:brightness(1.55) contrast(1.06);
}
.endhint{
  position:fixed;left:0;right:0;bottom:36px;z-index:71;
  text-align:center;font-size:12px;letter-spacing:.3em;color:#7e8fa0;
  opacity:0;pointer-events:none;transition:opacity .9s ease;
}
.endhint.on{opacity:1;animation:breathe 3.2s ease-in-out infinite}
.credits{
  position:fixed;inset:0;z-index:72;display:none;
  align-items:center;justify-content:center;background:#000;
}
.credits.on{display:flex;animation:crIn 1.6s ease both}
@keyframes crIn{from{opacity:0}to{opacity:1}}
.cr-inner{text-align:center;animation:crUp 2.4s ease both}
@keyframes crUp{
  from{opacity:0;transform:translateY(12px)}
  35%{opacity:1}
  to{opacity:1;transform:none}
}
.cr-title{
  font-size:34px;letter-spacing:.5em;text-indent:.5em;
  color:#cdd8e4;margin-bottom:30px;
}
.cr-name{
  font-size:15px;letter-spacing:.3em;text-indent:.3em;
  color:#8b9dae;margin-bottom:16px;
}
.cr-bili{
  font-size:12px;letter-spacing:.2em;color:#4e5d6c;
}

/* ══════ 聊天记录 ══════ */
.chat{max-width:720px;margin:0 auto;display:flex;flex-direction:column;gap:10px}
.chatday{display:flex;justify-content:center;margin:20px 0 8px}
.chatday:first-child{margin-top:2px}
.chatday span{
  font-size:12px;color:#a0827e;letter-spacing:.2em;
  border:1px solid #3a2b2a;background:rgba(120,50,45,.10);
  border-radius:20px;padding:3px 15px;
}
.cm{display:flex;flex-direction:column;max-width:74%}
.cm.l{align-self:flex-start;align-items:flex-start}
.cm.r{align-self:flex-end;align-items:flex-end}
.cm.cont{margin-top:-6px}
.cm.cont .cwho{display:none}
.cwho{font-size:11.5px;color:#8f7370;letter-spacing:.14em;margin:0 5px 4px}
.cbub{
  padding:9px 14px;border-radius:12px;
  font-size:14.5px;line-height:1.8;white-space:pre-wrap;
  background:#1d1918;border:1px solid #332b29;color:#d5cdc9;
}
.cm.l .cbub{border-top-left-radius:4px}
/* 标了 b 的消息：加粗、提亮，一眼能看出是关键数字 */
.cbub.key{
  font-weight:700;color:#fff;
  border-color:#4a5f78;
  box-shadow:0 0 0 1px rgba(140,190,235,.10) inset;
}
.cm.r .cbub{
  background:#3c1a1d;border-color:#5e2a2f;color:#f4dedb;border-top-right-radius:4px;
}
.cnone{
  align-self:center;font-size:12.5px;color:#6d5a57;
  letter-spacing:.12em;margin:3px 0 8px;
}
/* 【…】系统动作 */
.csys{
  align-self:center;margin:4px 0 10px;
  font-family:var(--mono);font-size:12px;letter-spacing:.1em;
  color:#5d7286;background:rgba(255,255,255,.03);
  border:1px solid #22303e;border-radius:20px;padding:3px 14px;
}
/* 对话里的图片：贴右侧，和丁渠的气泡同一列 */
.cm.cimg{margin:2px 0 4px;cursor:zoom-in}
.cm.cimg img{
  display:block;width:100%;max-width:250px;border-radius:10px;
  border:1px solid #4a2429;background:#120d0d;
  transition:border-color .16s ease,transform .16s ease;
}
.cm.cimg:hover img{border-color:#7a3a40;transform:translateY(-1px)}
.chatend{
  align-self:stretch;margin:30px 0 0;padding-top:16px;
  border-top:1px solid #2a2220;
  font-size:12.5px;color:#8a7672;letter-spacing:.06em;
  text-align:center;line-height:1.9;
}

/* ══════ 逐条推进：思考动画 + 点击发送 ══════ */
.cbub.dots{display:flex;align-items:center;gap:5px;padding:14px 16px}
.cbub.dots i{
  width:6px;height:6px;border-radius:50%;display:block;background:#7e93aa;
  animation:tdot 1.15s ease-in-out infinite;
}
.cbub.dots i:nth-child(2){animation-delay:.17s}
.cbub.dots i:nth-child(3){animation-delay:.34s}
@keyframes tdot{
  0%,100%{opacity:.22;transform:translateY(0)}
  40%{opacity:1;transform:translateY(-3px)}
}

.sendbub{
  background:none;border:0;padding:0;margin:2px 0 6px;
  display:flex;flex-direction:column;align-items:flex-end;gap:5px;
  width:auto;max-width:74%;cursor:pointer;text-align:right;
  font-family:inherit;
}
.sendbub .ghostbub{
  background:rgba(120,170,225,.04);
  border:1px dashed #35485c;color:#93a7bc;
  border-top-right-radius:4px;
  transition:border-color .16s ease,color .16s ease,background .16s ease;
}
.sendbub:hover .ghostbub{
  border-color:#5b9bd5;color:#dbe4ee;background:rgba(120,170,225,.10);
}
.sendbub .sendhint{
  font-size:11.5px;color:#5b9bd5;letter-spacing:.16em;
  opacity:.75;transition:opacity .16s ease;
}
.sendbub:hover .sendhint{opacity:1}
.sendbub:active .ghostbub{transform:translateY(1px)}

/* ══════ 提示表 ══════ */
.hints{width:100%;border-collapse:collapse;margin-top:10px;font-size:14px}
.hints th,.hints td{padding:9px 12px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top}
.hints th{font-size:12px;font-weight:600;color:#61748a;letter-spacing:.16em;background:rgba(255,255,255,.02)}
.hints td:first-child{width:96px;color:#a8c3e0}
.hints .mono{font-size:14px;color:#d8b877;letter-spacing:.1em}
/* 五个档案点全亮之后：吕枫那条被划掉，后面补上白色的 QIANXIAN */
.hints .mono.strike{
  text-decoration:line-through;text-decoration-thickness:1.5px;
  text-decoration-color:rgba(200,90,90,.85);
  opacity:.5;
}
.hints .mono.qx{
  color:#fff;font-weight:700;letter-spacing:.14em;
  text-shadow:0 0 10px rgba(255,255,255,.25);
}

/* ══════ 影印件 ══════ */
.paper{
  max-width:700px;margin:0 auto;color:#c6d0dc;
  font-size:14.5px;line-height:2;
}
.paper h3{font-size:16px;text-align:center;letter-spacing:.3em;margin:6px 0 22px;color:#dbe4ee}
.paper h4{font-size:14px;margin:22px 0 8px;color:#9fb2c6;letter-spacing:.1em;font-weight:600}
.paper p{margin:6px 0}
.paper .indent{padding-left:2em;white-space:pre-wrap;color:#a9b7c7}
.paper .center{text-align:center}
.paper .stamp{font-size:12px;color:#5a6b80;letter-spacing:.1em;margin:14px 0}
.paper .blank{height:14px;border-bottom:1px dashed #22303e}

/* ══════ 日记 ══════ */
.diary{max-width:720px;margin:0 auto}
.entry{margin:0 0 38px}
.dhead{
  display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;
  padding-bottom:10px;margin-bottom:16px;border-bottom:1px solid #1a2532;
}
.ddate,.dtemp{font-size:15px;font-weight:600;color:#dbe4ee;letter-spacing:.08em}
.dweek{font-size:12px;color:#5e7188;letter-spacing:.18em}
.dbody p{margin:0 0 12px;font-size:14.5px;line-height:2.05;color:#c9d5e2}
.dbody p.attach{
  margin:18px 0;padding:10px 14px;border:1px dashed #22303e;border-radius:6px;
  color:#66788e;font-size:13px;letter-spacing:.06em;background:rgba(255,255,255,.015);
}
.dbody b{
  font-weight:700;color:#fff;background:rgba(120,170,225,.10);
  border-radius:3px;padding:0 2px;box-shadow:0 0 0 1px rgba(120,170,225,.10);
}
.dfig{margin:20px 0 26px}
.dfig img{
  width:100%;max-width:520px;display:block;border-radius:6px;
  border:1px solid #1b2634;background:#0a0f14;
}
.dfig.narrow img{max-width:330px}

/* ══════ 图片 ══════ */
.pics{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:10px}
@media(max-width:700px){.pics{grid-template-columns:1fr}}
.pic{
  background:transparent;border:1px solid var(--line);border-radius:8px;padding:8px;
  cursor:pointer;display:flex;flex-direction:column;gap:8px;color:var(--ink);
  transition:border-color .16s,background .16s;
}
.pic:hover{border-color:#3d6c9e;background:rgba(120,170,225,.06)}
.pic img{
  width:100%;aspect-ratio:4/3;object-fit:cover;border-radius:5px;display:block;
  background:#0a0f14;
}
.pic:nth-child(2) img{aspect-ratio:4/3;object-fit:contain}
.pname{font-family:var(--mono);font-size:11.5px;color:#5e7188;text-align:left}

.viewer{text-align:center}
.viewer img{max-width:100%;max-height:66vh;border-radius:6px;display:block;margin:0 auto}

/* ══════ 笔记（右侧，任何界面可用） ══════ */
.notes{
  position:fixed;right:0;top:0;bottom:0;z-index:65;
  display:flex;align-items:stretch;
  transform:translateX(calc(100% - 28px));
  transition:transform .3s cubic-bezier(.4,0,.2,1);
  pointer-events:none;
}
.notes.open{transform:none}
.notes-tab{
  position:relative;
  pointer-events:auto;align-self:center;flex:0 0 28px;
  height:104px;width:28px;padding:9px 0;
  background:rgba(11,17,24,.94);
  border:1px solid #26333f;border-right:0;border-radius:8px 0 0 8px;
  color:#7d8fa3;font-size:12px;letter-spacing:.34em;cursor:pointer;
  writing-mode:vertical-rl;text-orientation:upright;
  text-align:center;line-height:1.25;
  transition:color .16s,background .16s;
}
.notes-tab:hover{color:#c3d3e4;background:rgba(22,32,44,.96)}
.notes-tab.has{color:#9ece6a}
.notes-tab.has::after{
  content:"";position:absolute;top:6px;left:50%;transform:translateX(-50%);
  width:5px;height:5px;border-radius:50%;background:#5cf59a;
  box-shadow:0 0 6px rgba(92,245,154,.9);
}
.notes-panel{
  pointer-events:auto;flex:0 0 auto;
  width:min(360px,84vw);display:flex;flex-direction:column;
  background:rgba(7,11,16,.975);
  border-left:1px solid #26333f;
  box-shadow:-18px 0 40px rgba(0,0,0,.5);
}
.notes-head{
  display:flex;align-items:center;gap:10px;flex:0 0 auto;
  height:44px;padding:0 8px 0 16px;
  border-bottom:1px solid var(--line);
  font-size:13px;letter-spacing:.2em;color:#93a4b8;
}
.notes-head span{flex:1}
.notes-head button{
  width:30px;height:30px;border:0;background:transparent;color:#66788c;
  font-size:20px;line-height:1;cursor:pointer;border-radius:5px;
}
.notes-head button:hover{background:rgba(240,72,62,.16);color:#ff8b84}
#notes-area{
  flex:1;min-height:0;width:100%;resize:none;
  background:transparent;border:0;outline:none;
  padding:16px 18px;color:#cfdae6;
  font:14px/1.95 -apple-system,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
  letter-spacing:.02em;
  user-select:text;
}
#notes-area::placeholder{color:#3f4d5e}

/* ── 黑白故障：林一日记的紫木照片首次完整露出 ── */
body.bw #desktop, body.bw #modal, body.bw #notes{filter:grayscale(1) contrast(1.14)}

/* 血字故障：「红色的。」那一行整行搬到最上层重画，只有它是红的 */
.bloodover{
  position:fixed;z-index:93;pointer-events:none;
  white-space:nowrap;overflow:hidden;
  color:#c01118;font-weight:700;
  text-shadow:0 0 10px rgba(190,20,30,.6);
  opacity:0;
}
.bloodover.on{animation:bloodFill .7s steps(1,end) 1 both}
@keyframes bloodFill{
  0%{opacity:0}
  7%{opacity:1}
  22%{opacity:.30}
  36%{opacity:1}
  50%{opacity:.45}
  64%{opacity:1}
  80%{opacity:.65}
  92%{opacity:1}
  100%{opacity:0}
}
/* 下三分之一直接黑掉 */
.darkbottom{
  position:fixed;left:0;right:0;bottom:0;height:34%;
  background:#000;z-index:90;pointer-events:none;
}

/* 纵向黑线：故障那种硬闪 */
.vlines{position:fixed;inset:0;z-index:92;pointer-events:none;opacity:0}
.vlines i{position:absolute;top:0;bottom:0;background:#000;display:block}
.vlines.on{animation:vlineFlick .7s steps(1,end) 1 both}
/* 错乱的红色横线 */
.blines{position:fixed;inset:0;z-index:92;pointer-events:none;opacity:0}
.blines i{
  position:absolute;display:block;background:#000;
}
.blines.on{animation:vlineFlick .7s steps(1,end) 1 both}
@keyframes vlineFlick{
  0%{opacity:0}
  6%{opacity:1}
  20%{opacity:.25}
  33%{opacity:.95}
  48%{opacity:.4}
  61%{opacity:1}
  76%{opacity:.5}
  89%{opacity:.9}
  100%{opacity:0}
}
/* 故障期间一律不许操作 */
/* 故障期间一律不许操作（包括子元素自己声明的 pointer-events） */
body.noinput #desktop,
body.noinput #desktop *,
body.noinput #modal,
body.noinput #modal *,
body.noinput #notes,
body.noinput #notes *,
body.noinput .osbar,
body.noinput .osbar *,
body.noinput .devbar,
body.noinput .devbar *{pointer-events:none !important}
body.noinput{cursor:default}
body.noinput *{user-select:none !important}
.glitch.lines{background:none}
.glitch.lines.on{
  background:
    linear-gradient(to bottom, transparent 0 11%, rgba(0,0,0,.96) 11% 12.6%, transparent 12.6% 100%),
    linear-gradient(to bottom, transparent 0 44%, rgba(0,0,0,.90) 44% 45.2%, transparent 45.2% 100%),
    linear-gradient(to bottom, transparent 0 73%, rgba(0,0,0,.96) 73% 74.8%, transparent 74.8% 100%);
  animation:gfline 1s steps(1,end) 1 both;
}
@keyframes gfline{
  0%{opacity:0}
  6%{opacity:1}
  16%{opacity:0}
  26%{opacity:1}
  38%{opacity:0}
  48%{opacity:1}
  60%{opacity:0}
  70%{opacity:1}
  80%{opacity:0}
  88%{opacity:1}
  96%{opacity:0}
  100%{opacity:0}
}

/* 进入最后环节前的规则说明卡 */
.sv-brief{
  align-self:center;width:100%;max-width:560px;
  margin:34px 0 12px;padding:22px 24px;
  border:1px solid #2b3d4f;border-radius:10px;
  background:rgba(120,170,225,.045);
  text-align:center;
}
.sv-brief .br-t{
  font-size:12.5px;letter-spacing:.36em;color:#7d8fa3;margin-bottom:18px;
}
.sv-brief .br-l{
  font-size:14px;line-height:2;color:#c3d3e4;margin:0 0 7px;
}
.sv-brief .br-l b{color:#fff;font-weight:600}
#toSeven{
  margin-top:20px;
  background:#16222e;border:1px solid #3d6c9e;color:#dbe8f5;
  border-radius:8px;padding:13px 42px;font-size:15px;cursor:pointer;
  letter-spacing:.22em;
  transition:background .16s ease,border-color .16s ease,box-shadow .16s ease;
}
#toSeven:hover{
  background:#1d2f42;border-color:#5b9bd5;
  box-shadow:0 0 24px rgba(91,155,213,.32);
}

/* ══════ 进入七天：画面被撕开的转场 ══════ */
.warp{
  position:fixed;inset:0;z-index:59;display:none;
  pointer-events:none;opacity:0;background:#070405;overflow:hidden;
}
.warp.on{
  display:block;pointer-events:auto;
  animation:warpBase 1.42s steps(1,end) 1 both;
}
/* 底色一块一块地跳：冷蓝 → 暗红 → 血红，最后落在 .seven 的底色上 */
@keyframes warpBase{
  0%{background:#05080b;opacity:1}
  12%{background:#1a0607}
  26%{background:#0a0506}
  42%{background:#5a0f10}
  54%{background:#0f0506}
  70%{background:#7a1214}
  84%{background:#1a0608}
  100%{background:#070405;opacity:1}
}
/* 压在上面的扫描线，从上往下扫过去 */
.warp::before{
  content:"";position:absolute;inset:-40% 0;
  background:repeating-linear-gradient(to bottom,
    rgba(0,0,0,.80) 0 3px, transparent 3px 10px);
}
.warp.on::before{animation:warpScan 1.42s steps(1,end) 1 both}
@keyframes warpScan{
  0%{transform:translateY(-22%);opacity:.55}
  20%{transform:translateY(-9%);opacity:.95}
  40%{transform:translateY(7%);opacity:.7}
  62%{transform:translateY(19%);opacity:1}
  82%{transform:translateY(31%);opacity:.6}
  100%{transform:translateY(40%);opacity:0}
}
/* 几条错位的色带，横着甩过去 */
.warp::after{
  content:"";position:absolute;inset:-15% 0;mix-blend-mode:screen;
  background:linear-gradient(to bottom,
    transparent 0 10%,
    rgba(226,44,44,.62) 10% 15%,
    transparent 15% 33%,
    rgba(40,196,240,.42) 33% 37%,
    transparent 37% 58%,
    rgba(240,70,58,.55) 58% 64%,
    transparent 64% 82%,
    rgba(120,26,26,.60) 82% 89%,
    transparent 89% 100%);
}
.warp.on::after{animation:warpBars 1.42s steps(1,end) 1 both}
@keyframes warpBars{
  0%{transform:translateY(0);opacity:0}
  8%{transform:translateY(-10%);opacity:1}
  22%{transform:translateY(16%);opacity:.72}
  38%{transform:translateY(-26%);opacity:1}
  52%{transform:translateY(5%);opacity:.6}
  68%{transform:translateY(-13%);opacity:1}
  84%{transform:translateY(23%);opacity:.85}
  100%{transform:translateY(0);opacity:0}
}
/* 底下的东西被往后拽：放大、模糊、偏色，然后没了 */
body.warping #modal .win,
body.warping #desktop .icon,
body.warping .osbar{
  animation:warpOut 1.16s cubic-bezier(.4,0,.72,1) 1 both;
}
@keyframes warpOut{
  0%{transform:scale(1) translateX(0);filter:none;opacity:1}
  18%{transform:scale(1.02) translateX(-4px);filter:blur(1px) hue-rotate(14deg);opacity:1}
  42%{transform:scale(1.09) translateX(7px);filter:blur(3px) hue-rotate(-20deg);opacity:.86}
  70%{transform:scale(1.28) translateX(-9px);filter:blur(7px) hue-rotate(44deg);opacity:.5}
  100%{transform:scale(1.6) translateX(0);filter:blur(18px) saturate(.15);opacity:0}
}
@media (prefers-reduced-motion:reduce){
  .warp{display:none !important}
  body.warping #modal .win,
  body.warping #desktop .icon,
  body.warping .osbar{animation:none !important}
}

/* ══════ 最终七天 · 血红 ══════ */
.seven{
  position:fixed;inset:0;z-index:55;display:none;
  background:
    radial-gradient(ellipse at 50% 38%, rgba(96,18,20,.34), transparent 66%),
    radial-gradient(ellipse at 50% 100%, rgba(60,10,12,.55), transparent 60%),
    #070405;
}
.seven.on{display:block}
/* 两侧的双螺旋：压在正文之下、暗角之上，静静转，不抢字 */
.helix{
  position:absolute;top:0;bottom:0;z-index:1;
  width:min(150px,14vw);height:100%;display:block;
  pointer-events:none;
  filter:blur(1.6px);
}
.helix-l{left:0}
.helix-r{right:0}
.seven::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(ellipse at 50% 50%, transparent 40%, rgba(0,0,0,.75) 100%);
}
.sv-body{
  position:absolute;inset:0;z-index:1;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  padding:6vh 6vw;text-align:center;
  perspective:1700px;
}
/* 七天顶部的温度折线（独立于页面，不参与碎页/翻页/乱码） */
.sv-chart{flex:0 0 auto;margin-bottom:16px}
.svchart{
  display:block;width:min(470px,80vw);height:auto;
  margin:0 auto;overflow:visible;
}
.svchart .svc-v{font-size:9.5px;fill:#a8767b;letter-spacing:.02em}
.svchart .svc-v.cur{fill:#f0a0a5}
.svchart .svc-d{font-size:8.5px;fill:#5c4145;letter-spacing:.04em}
.svchart .svc-d.cur{fill:#a8767b}
/* 每天新长出来的那一段：从起点画到终点 */
.svchart .svc-grow{
  stroke-dasharray:1;stroke-dashoffset:1;
  animation:svcGrow .6s cubic-bezier(.33,.7,.3,1) 1 both;
}
@keyframes svcGrow{ from{stroke-dashoffset:1} to{stroke-dashoffset:0} }
/* 新的那个点和新数值 */
.svchart .svc-newdot{
  transform-box:fill-box;transform-origin:center;
  animation:svcDot .5s cubic-bezier(.3,.8,.3,1) .32s 1 both;
}
@keyframes svcDot{
  0%{opacity:0;transform:scale(0)}
  55%{opacity:1;transform:scale(1.7)}
  100%{opacity:1;transform:scale(1)}
}
.svchart .svc-newtxt{animation:svcTxt .45s ease .5s 1 both}
@keyframes svcTxt{ from{opacity:0} to{opacity:1} }
/* ── 七天全程的故障质感（压在文字之上，不吃点击） ── */
.svfx{
  position:absolute;inset:0;z-index:2;
  pointer-events:none;overflow:hidden;
}
.svfx-noise{
  position:absolute;inset:-40px;opacity:0;
  background-repeat:repeat;
  mix-blend-mode:overlay;
}
.svfx-noise.on{animation:svNoise .30s steps(1,end) infinite}
@keyframes svNoise{
  0%{opacity:.16;background-position:0 0}
  17%{opacity:.04;background-position:-34px 21px}
  33%{opacity:.19;background-position:26px -30px}
  50%{opacity:.02;background-position:-15px 44px}
  67%{opacity:.13;background-position:38px 9px}
  83%{opacity:.06;background-position:-22px -18px}
  100%{opacity:.15;background-position:12px 33px}
}
.svfx-lines{position:absolute;inset:0}
.svfx-line{
  position:absolute;background:#000;opacity:0;
  animation:svLine .22s steps(1,end) 1 both;
}
.svfx-line.hz{left:0;right:0}
.svfx-line.vt{top:0;bottom:0}
@keyframes svLine{
  0%{opacity:.92}
  18%{opacity:.15}
  30%{opacity:.85}
  52%{opacity:.30}
  70%{opacity:.7}
  100%{opacity:0}
}
/* 文字被打了以下：先闪一下，字面已经换成乱码 */
.svtxt-flick{animation:svTxtFlick .22s steps(1,end) 1 both}
@keyframes svTxtFlick{
  0%{opacity:1;filter:none}
  18%{opacity:.28;filter:blur(.7px)}
  38%{opacity:1;filter:hue-rotate(28deg)}
  58%{opacity:.45;filter:blur(.4px)}
  78%{opacity:1;filter:none}
  100%{opacity:1;filter:none}
}
/* 每天的一页：新的一天从右侧翻落 */
.sv-page{
  display:flex;flex-direction:column;align-items:center;
  width:100%;transform-origin:left center;transform-style:preserve-3d;
}
@keyframes svIn{
  0%{transform:rotateY(86deg);opacity:.12}
  100%{transform:rotateY(0deg);opacity:1}
}
.sv-body.turn-in  .sv-page{animation:svIn .44s cubic-bezier(.22,.7,.3,1) both}
/* 碎块：每个字一个 span，飞散时模糊、旋转、缩小 */
.shard{
  display:inline-block;
  transition:
    transform .76s cubic-bezier(.32,0,.55,1),
    opacity .70s ease,
    filter .76s ease;
  will-change:transform,filter,opacity;
}
/* 没有文字的元素（氧气罐）跟着一起飞 */
.o2.shard-fly,
.sv-actions button.shard-fly{
  transition:
    transform .76s cubic-bezier(.32,0,.55,1),
    opacity .70s ease,
    filter .76s ease;
  will-change:transform,filter,opacity;
  animation:none;
}

/* 决策期间：整页元素极轻微地各自晃动，节奏互相错开 */
@keyframes svWaver{
  0%,100%{transform:translate(0,0) rotate(0deg)}
  25%{transform:translate(.7px,-1.3px) rotate(.11deg)}
  50%{transform:translate(-.9px,.9px) rotate(-.10deg)}
  75%{transform:translate(.5px,1.2px) rotate(.07deg)}
}
.sv-page > *{animation:svWaver 5.6s ease-in-out infinite;will-change:transform}
.sv-page > *:nth-child(1){animation-duration:6.6s;animation-delay:-.4s}
.sv-page > *:nth-child(2){animation-duration:5.1s;animation-delay:-1.9s}
.sv-page > *:nth-child(3){animation-duration:7.2s;animation-delay:-3.1s}
.sv-page > *:nth-child(4){animation-duration:5.9s;animation-delay:-2.4s}
.sv-page > *:nth-child(5){animation-duration:6.8s;animation-delay:-.9s}
.sv-page > *:nth-child(6){animation-duration:5.4s;animation-delay:-3.7s}
.sv-page > *:nth-child(7){animation-duration:7.6s;animation-delay:-1.4s}
.sv-page > *:nth-child(8){animation-duration:6.1s;animation-delay:-4.2s}

@media (prefers-reduced-motion: reduce){
  .sv-page > *{animation:none}
  .shard,.o2.shard-fly,.sv-actions button.shard-fly{transition:none}
  .sv-actions button{animation:none;box-shadow:0 0 18px rgba(220,60,55,.28)}
}
.sv-day{
  font-size:13px;letter-spacing:.42em;color:#8a4a45;
  margin-bottom:24px;
}
.sv-line{font-size:14px;color:#a8776f;letter-spacing:.06em;margin:0 0 14px}
.sv-temp{
  font-family:var(--mono);font-size:clamp(62px,12.5vh,104px);line-height:1;
  color:#f6ece9;letter-spacing:.02em;margin:0 0 14px;
  text-shadow:0 0 46px rgba(220,60,55,.35),0 0 14px rgba(220,60,55,.20);
}
.sv-temp i{
  display:block;font-style:normal;font-family:inherit;
  font-size:14px;line-height:1.4;letter-spacing:.22em;
  color:#a85a54;margin-bottom:12px;
}
.sv-temp span{font-size:.40em;color:#8a5a56;margin-left:8px}
.sv-count{font-size:13.5px;color:#9c6b64;letter-spacing:.16em;margin-bottom:30px}
.sv-count b{color:#e6c9c4;font-weight:600}
.sv-o2{display:flex;align-items:center;gap:7px;margin-bottom:30px}
.sv-o2 .lbl{font-size:12px;color:#8a4a45;letter-spacing:.22em;margin-right:9px}
/* 氧气罐：空/满两种状态外框完全一致，只有内胆颜色和辉光不同 */
.o2{
  position:relative;display:block;box-sizing:border-box;
  width:15px;height:30px;
  border:1px solid #5a2a2b;border-radius:4px;
  background:#0f0809;
  transition:border-color .4s ease;
}
.o2::before{
  content:"";position:absolute;z-index:1;pointer-events:none;
  left:3px;top:5px;bottom:5px;width:2px;border-radius:2px;
  background:rgba(255,255,255,.18);
  transition:background .4s ease;
}
.o2::after{
  content:"";position:absolute;left:2px;right:2px;top:2px;bottom:2px;
  border-radius:2px;
  background:#c33a34;
  box-shadow:0 0 6px rgba(200,50,45,.42);
  transition:background .45s ease,box-shadow .45s ease;
}
.o2.spent{border-color:#2c191a}
.o2.spent::before{background:rgba(255,255,255,.05)}
.o2.spent::after{background:#1a1012;box-shadow:none}
.sv-ask{font-size:15px;color:#d9c2bd;letter-spacing:.12em;margin-bottom:22px}
.sv-actions{display:flex;gap:16px;flex-wrap:wrap;justify-content:center}
/* 玩家要点的两个按钮：一直有微微的光在脉动 */
@keyframes svBtnGlow{
  0%,100%{box-shadow:0 0 10px rgba(200,50,45,.14),inset 0 0 9px rgba(200,50,45,.05)}
  50%    {box-shadow:0 0 32px rgba(230,64,58,.46),inset 0 0 17px rgba(230,64,58,.17)}
}
@keyframes svBtnGlowSoft{
  0%,100%{box-shadow:0 0 8px rgba(200,50,45,.10),inset 0 0 8px rgba(200,50,45,.04)}
  50%    {box-shadow:0 0 20px rgba(230,64,58,.26),inset 0 0 12px rgba(230,64,58,.10)}
}
.sv-actions button{
  background:#180d0e;border:1px solid #6e2b2d;color:#f0dcd8;
  border-radius:7px;padding:13px 40px;font-size:15px;cursor:pointer;
  letter-spacing:.22em;
  animation:svBtnGlow 3.6s ease-in-out infinite;
  transition:background .18s ease,border-color .18s ease,color .18s ease,transform .12s ease;
}
.sv-actions button.warn{
  background:#140b0c;border-color:#5a2527;color:#dcbab5;
  animation:svBtnGlowSoft 4.2s ease-in-out infinite;
}
.sv-actions button:hover{
  animation:none;
  background:#2a1112;border-color:#c9463f;color:#fff;
  box-shadow:0 0 36px rgba(235,68,60,.58),inset 0 0 20px rgba(235,68,60,.22);
}
.sv-actions button.warn:hover{
  animation:none;
  background:#24100f;border-color:#b8554c;color:#ffe2dd;
  box-shadow:0 0 28px rgba(220,80,70,.42),inset 0 0 16px rgba(220,80,70,.16);
}
.sv-actions button:active{transform:translateY(1px) scale(.985)}
.sv-tree{
  margin-top:36px;font-size:13.5px;color:#7a4a46;letter-spacing:.06em;
}
.sv-empty{height:96px}
.sv-beat{font-size:15px;color:#d3bcb7;letter-spacing:.04em;line-height:2}
.sv-beat .sick{color:#ff8b84}

/* 结局的字幕层（累积式）：不再限高、不再裁切，由 #intro 整屏滚动 */
.intro.accum .intro-inner{
  width:min(720px,86vw);
}
.intro.accum .intro-text{
  opacity:1;transform:none;font-size:16px;line-height:2.15;color:#c3ccd8;
}
.intro.accum .intro-text p{
  margin:0 0 15px;opacity:0;transform:translateY(7px);
  transition:opacity .75s ease,transform .75s ease;
}
.intro.accum .intro-text p.in{opacity:1;transform:none}
.intro.accum .intro-text p:last-child{color:#e8eef5}

/* 结局之后的大按钮：回到设备重新翻线索 */
.back7{
  position:fixed;left:50%;bottom:46px;transform:translateX(-50%);
  z-index:62;display:none;
  background:#16222e;border:1px solid #3d6c9e;color:#dbe8f5;
  border-radius:10px;padding:16px 56px;
  font-size:16px;letter-spacing:.26em;cursor:pointer;
  box-shadow:0 0 26px rgba(91,155,213,.26),0 0 0 1px rgba(120,170,225,.08) inset;
  transition:background .18s ease,border-color .18s ease,box-shadow .18s ease;
}
.back7.on{display:block;animation:backfade .55s ease both}
/* 坏结局下面那行提示：压得很轻，不抢正文，也不进字幕 */
.badtip{
  position:fixed;left:50%;bottom:22px;transform:translateX(-50%);
  z-index:61;display:none;
  font-size:13px;letter-spacing:.06em;color:#7c8b9c;
  white-space:nowrap;pointer-events:none;
}
.badtip.on{display:block;animation:backfade .8s ease both}
.back7:hover{
  background:#1d2f42;border-color:#5b9bd5;color:#fff;
  box-shadow:0 0 40px rgba(91,155,213,.5),0 0 0 1px rgba(140,190,235,.16) inset;
}
.back7:active{transform:translateX(-50%) translateY(1px)}
@keyframes backfade{
  from{opacity:0;transform:translate(-50%,12px)}
  to{opacity:1;transform:translate(-50%,0)}
}

/* ══════ toast ══════ */
.toast{
  position:fixed;left:50%;bottom:64px;transform:translate(-50%,14px);
  z-index:70;padding:10px 20px;border-radius:7px;
  background:rgba(10,15,22,.96);border:1px solid #2a3644;
  font-size:13.5px;color:#e8eef5;letter-spacing:.06em;
  opacity:0;pointer-events:none;transition:opacity .35s ease,transform .35s ease;
  max-width:min(640px,86vw);text-align:center;
}
.toast.on{opacity:1;transform:translate(-50%,0)}
/* 玩家心路：暖色 + 左侧琥珀竖条，和系统提示区分开 */
.toast.think{
  color:#ecd2ab;
  border-color:#4a3c28;
  background:rgba(26,20,13,.965);
  padding-left:24px;
  letter-spacing:.05em;
  box-shadow:0 8px 28px rgba(0,0,0,.55),inset 2px 0 0 #b8873c;
}

/* ══════ 开发面板（?dev=1） ══════ */
.devbar{
  /* z-index 要高过 #modal(50)：不然一开窗口，它就被弹窗底板盖住，看不见也点不到 */
  position:fixed;left:12px;bottom:48px;z-index:66;
  display:flex;align-items:center;gap:6px;flex-wrap:wrap;
  max-width:min(760px,92vw);
  padding:7px 10px;border-radius:8px;
  background:rgba(8,12,17,.96);border:1px solid #2b3a4a;
  font:12px/1.4 var(--mono);color:#7d90a6;
}
.devbar b{color:#ff8b84;letter-spacing:.2em;margin-right:4px}
.devbar button{
  background:#121c26;border:1px solid #26333f;color:#8ea4bb;
  border-radius:4px;padding:2px 8px;font-size:11.5px;cursor:pointer;
  font-family:inherit;
}
.devbar button:hover{background:#1a2836;color:#cfe0f0;border-color:#3d6c9e}
.devstat{margin-left:6px;color:#4b5b6d}
