    :root{
    --bg:#04101f;
    --panel:rgba(9,36,62,.88);
    --line:#155273;
    --cyan:#45d9ff;
    --green:#2fe0a4;
    --amber:#ffc94d;
    --red:#ff6b6b;
    --text:#dff4ff;
    --text-2:#b8d5e8;
    --muted:#6f95b3;
    --faint:#5d87a6;
    --mono:ui-monospace,"SF Mono","JetBrains Mono",Menlo,monospace;
    --tt:7px;
  }
  *{box-sizing:border-box;margin:0;padding:0}
  html,body{height:100%}
  body{
    background:
      radial-gradient(1200px 600px at 50% -10%, rgba(25,110,170,.18), transparent 60%),
      radial-gradient(900px 500px at 50% 110%, rgba(10,70,110,.12), transparent 60%),
      var(--bg);
    color:var(--text);
    font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
    -webkit-font-smoothing:antialiased;
    overflow:hidden;
    display:flex;flex-direction:column;
  }
  body::before{
    content:"";position:fixed;inset:0;pointer-events:none;z-index:0;
    background-image:
      linear-gradient(rgba(60,150,210,.045) 1px,transparent 1px),
      linear-gradient(90deg,rgba(60,150,210,.045) 1px,transparent 1px);
    background-size:48px 48px;
    -webkit-mask-image:radial-gradient(ellipse at 50% 40%, #000 20%, transparent 88%);
    mask-image:radial-gradient(ellipse at 50% 40%, #000 20%, transparent 88%);
  }

  /* ---------------- 顶栏 ---------------- */
  .topbar{
    flex:0 0 62px;display:grid;grid-template-columns:1fr auto 1fr;align-items:center;
    padding:0 16px;position:relative;z-index:2;
    background:linear-gradient(180deg, rgba(7,29,52,.9), rgba(4,16,31,.35));
    border-bottom:1px solid rgba(21,82,115,.22);
  }
  .topbar::after{
    content:"";position:absolute;left:0;right:0;bottom:-1px;height:1px;
    background:linear-gradient(90deg,transparent,rgba(69,217,255,.55),transparent);
  }
  .weather{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text-2);min-width:0}
  .weather .now{display:flex;align-items:center;gap:8px;padding-right:10px;border-right:1px solid rgba(21,82,115,.4);white-space:nowrap}
  .weather .now svg{width:16px;height:16px;color:var(--amber);flex:0 0 16px}
  .weather .now b{font-family:var(--mono);font-size:14px;font-weight:500;color:var(--text)}
  .weather .now span{font-size:11.5px;color:var(--muted)}
  #weatherBar{display:flex;gap:1px}
  #weatherBar button{
    appearance:none;border:1px solid transparent;background:transparent;color:var(--muted);
    font-size:11.5px;padding:4px 7px;border-radius:3px;cursor:pointer;font-family:inherit;
    transition:all .16s;white-space:nowrap;
  }
  #weatherBar button:hover{color:var(--text);background:rgba(69,217,255,.08)}
  #weatherBar button.on{border-color:rgba(69,217,255,.4);background:rgba(69,217,255,.13);color:var(--cyan)}
  #weatherBar button.danger.on{border-color:rgba(255,107,107,.45);background:rgba(255,107,107,.14);color:var(--red)}

  .title-wrap{text-align:center;position:relative;padding:0 20px}
  .title-wrap h1{
    --tt:7px;
    font-size:25px;font-weight:600;letter-spacing:var(--tt);white-space:nowrap;
    /* 字距会在末字后多留一份，居中时补回，视觉中心才对得上 */
    padding-left:var(--tt);
    background:linear-gradient(180deg,var(--text) 20%,var(--cyan) 92%);
    -webkit-background-clip:text;background-clip:text;color:transparent;
    filter:drop-shadow(0 0 18px rgba(69,217,255,.25));
  }
  .title-wrap p{margin-top:3px;font-size:11px;letter-spacing:4.5px;color:var(--muted);white-space:nowrap;padding-left:4.5px}
  .title-wrap::before,.title-wrap::after{
    content:"";position:absolute;top:13px;width:130px;height:1px;
    background:linear-gradient(90deg,transparent,rgba(69,217,255,.65));
  }
  .title-wrap::before{right:calc(100% + 12px)}
  .title-wrap::after{left:calc(100% + 12px);transform:scaleX(-1)}

  .top-right{display:flex;align-items:center;justify-content:flex-end;gap:14px;font-size:12px;color:var(--muted);min-width:0}
  .clock{white-space:nowrap;font-family:var(--mono)}
  .clock b{font-size:13px;font-weight:500;color:var(--text);letter-spacing:.5px}
  .clock span{color:var(--faint);margin-left:8px;font-size:11.5px}
  .icon-btn{
    width:26px;height:26px;display:grid;place-items:center;flex:0 0 26px;
    background:rgba(20,70,105,.35);border:1px solid rgba(21,82,115,.4);
    border-radius:3px;color:var(--muted);cursor:pointer;transition:.16s;
  }
  .icon-btn:hover{color:var(--cyan);border-color:rgba(69,217,255,.45)}
  .icon-btn svg{width:13px;height:13px}
  .user{display:flex;align-items:center;gap:7px;padding-left:12px;border-left:1px solid rgba(21,82,115,.35);white-space:nowrap;color:var(--text-2);font-size:12px}
  .avatar{
    width:26px;height:26px;flex:0 0 26px;border-radius:50%;display:grid;place-items:center;padding-bottom:1px;
    background:linear-gradient(160deg,var(--muted),var(--line));
    border:1px solid rgba(69,217,255,.35);font-size:11.5px;color:var(--text);
  }

  /* ---------------- 导航 ---------------- */
  .tabs{
    flex:0 0 48px;display:flex;align-items:center;justify-content:center;gap:6px;
    padding:0 18px;position:relative;z-index:2;
  }
  .tabs button{
    height:30px;padding:0 17px;font-size:12px;letter-spacing:.8px;
    color:var(--text-2);background:linear-gradient(180deg,rgba(16,54,86,.55),rgba(6,26,46,.55));
    border:1px solid rgba(21,82,115,.32);cursor:pointer;font-family:inherit;
    position:relative;transition:all .18s;
    clip-path:polygon(7px 0,100% 0,calc(100% - 7px) 100%,0 100%);
  }
  .tabs button::before{
    content:"";display:inline-block;width:5px;height:5px;margin-right:7px;
    transform:rotate(45deg);background:currentColor;opacity:.55;vertical-align:1px;
  }
  .tabs button:hover{color:var(--text);border-color:rgba(69,217,255,.4)}
  .tabs button.on{
    color:var(--text);
    background:linear-gradient(180deg,rgba(37,143,190,.55),rgba(11,68,102,.65));
    border-color:rgba(69,217,255,.55);
    box-shadow:0 0 16px rgba(69,217,255,.18);
  }

  /* ---------------- 主布局 ---------------- */
  .layout{
    flex:1 1 auto;min-height:0;display:grid;
    grid-template-columns:296px minmax(0,1fr) 318px;gap:12px;
    padding:2px 16px 8px;position:relative;z-index:2;
  }
  .col{min-height:0;display:grid;gap:10px}
  /* 左右栏共用同一组行高：跨栏的分隔线必须落在同一条横线上 */
  .col.left,.col.right{grid-template-rows:1fr 1fr 1.18fr 1fr}

  .panel{
    position:relative;min-height:0;display:flex;flex-direction:column;
    background:linear-gradient(180deg,var(--panel),var(--panel));
    border:1px solid rgba(21,82,115,.42);border-radius:3px;
    box-shadow:inset 0 0 28px rgba(20,110,170,.07),0 6px 24px rgba(0,0,0,.25);
    overflow:hidden;
  }
  .panel::before,.panel::after{content:"";position:absolute;width:10px;height:10px;pointer-events:none;z-index:2;opacity:.75}
  .panel::before{left:-1px;top:-1px;border-left:2px solid var(--cyan);border-top:2px solid var(--cyan)}
  .panel::after{right:-1px;bottom:-1px;border-right:2px solid var(--cyan);border-bottom:2px solid var(--cyan)}
  .panel-head{
    flex:0 0 33px;display:flex;align-items:center;justify-content:space-between;
    padding:0 12px;border-bottom:1px solid rgba(21,82,115,.3);
    background:linear-gradient(90deg,rgba(28,105,155,.24),transparent 70%);
  }
  .panel-head h2{
    font-size:12.5px;font-weight:500;letter-spacing:1.6px;color:var(--text);
    display:flex;align-items:center;gap:8px;
  }
  .panel-head h2::before{
    content:"";width:3px;height:11px;
    background:linear-gradient(180deg,var(--cyan),rgba(69,217,255,.2));
    box-shadow:0 0 8px rgba(69,217,255,.6);
  }
  .panel-head h2 .scope{font-size:11px;font-weight:400;letter-spacing:.4px;color:var(--muted)}
  /* 面板右上角只做说明，不再伪装成可点链接（P0-06） */
  .more{font-size:12px;color:var(--muted);letter-spacing:.4px;white-space:nowrap;position:relative;top:-1px}
  .more.live{color:var(--muted)}
  .more.live::before{content:"";display:inline-block;width:5px;height:5px;border-radius:50%;background:var(--green);margin-right:5px;vertical-align:1px;box-shadow:0 0 6px rgba(47,224,164,.8)}
  .panel-cta{
    appearance:none;border:1px solid rgba(69,217,255,.55);background:rgba(69,217,255,.14);
    color:var(--text);font-family:inherit;font-size:12px;letter-spacing:.5px;
    padding:4px 11px;border-radius:3px;cursor:pointer;transition:.15s;white-space:nowrap;
  }
  .panel-cta:hover{background:rgba(69,217,255,.26);box-shadow:0 0 14px rgba(69,217,255,.25)}
  .card-cta{
    display:block;width:calc(100% - 24px);margin:0 12px 11px;
    appearance:none;border:1px solid rgba(47,224,164,.5);
    background:linear-gradient(180deg,rgba(26,140,110,.5),rgba(10,70,58,.5));
    color:var(--text);font-family:inherit;font-size:12.5px;letter-spacing:.8px;
    padding:7px 12px;border-radius:3px;cursor:pointer;transition:.15s;
  }
  .card-cta:hover{background:linear-gradient(180deg,rgba(36,180,140,.6),rgba(12,90,72,.6));box-shadow:0 0 16px rgba(47,224,164,.25)}
  .card-cta[hidden]{display:none}
  .panel-body{flex:1;min-height:0;padding:9px 12px 11px;display:flex;flex-direction:column;overflow:auto}
  .head-actions{display:flex;align-items:center;gap:10px;min-width:0}
  .panel-body::-webkit-scrollbar{width:3px}
  .panel-body::-webkit-scrollbar-thumb{background:rgba(69,217,255,.25)}

  /* 环境监测 */
  .env{display:grid;grid-template-columns:1fr 1fr;gap:12px 8px;flex:1;align-content:center}
  .env-item{display:flex;align-items:center;gap:8px;min-width:0}
  .env-ic{
    width:26px;height:26px;flex:0 0 26px;border-radius:50%;display:grid;place-items:center;
    color:var(--cyan);background:radial-gradient(circle,rgba(69,217,255,.16),rgba(69,217,255,.03));
    border:1px solid rgba(69,217,255,.22);
  }
  .env-ic svg{width:14px;height:14px}
  .env-meta{min-width:0}
  .env-meta span{display:block;font-size:11.5px;color:var(--muted);letter-spacing:.5px;margin-bottom:2px;white-space:nowrap}
  .env-meta b{font-family:var(--mono);font-size:14px;font-weight:500;color:var(--text);white-space:nowrap}
  .env-meta i{font-style:normal;font-size:11px;color:var(--muted);margin-left:2px}

  /* 环形图 */
  .donut-wrap{flex:1;display:flex;align-items:center;gap:14px;min-height:0}
  .donut{position:relative;width:100px;height:100px;flex:0 0 100px;border-radius:50%}
  .donut .hole{
    position:absolute;inset:13px;border-radius:50%;background:var(--bg);
    box-shadow:inset 0 0 22px rgba(0,0,0,.55);
    display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;
  }
  .donut .hole small{font-size:11px;color:var(--muted);letter-spacing:.5px}
  .donut .hole b{font-family:var(--mono);font-size:16px;font-weight:600;color:var(--text);line-height:1.15;white-space:nowrap}
  .donut .hole em{font-style:normal;font-size:11px;color:var(--muted)}
  /* 单位与数字同排，不再单独占一行 */
  .donut .hole b i{font-style:normal;font-size:11px;color:var(--muted);margin-left:2px;font-weight:400;vertical-align:1px}
  .legend{display:flex;flex-direction:column;gap:7px;flex:1;min-width:0}
  .legend li{list-style:none;display:flex;align-items:center;justify-content:space-between;font-size:11.5px;color:var(--text-2);gap:8px}
  .legend li span{display:flex;align-items:center;gap:6px;white-space:nowrap;min-width:0}
  .legend i{width:7px;height:7px;border-radius:1px;flex:0 0 7px;box-shadow:0 0 6px currentColor}
  .legend b{font-family:var(--mono);font-weight:500;color:var(--text);font-size:12px;white-space:nowrap;display:inline-flex;align-items:baseline;gap:2px}
  .legend em{font-style:normal;color:var(--faint);font-size:11px;margin-left:2px}
  /* 带百分比的图例：单位列固定宽，数字右边缘才成一条线 */
  .legend-pct em{flex:0 0 50px}

  /* 预警 */
  .warns{flex:1;display:flex;flex-direction:column;justify-content:space-around;min-height:0}
  .warn{display:flex;align-items:center;gap:8px;font-size:11.5px;color:var(--text-2);min-width:0}
  .warn[hidden]{display:none}
  .warn .dot{width:6px;height:6px;border-radius:50%;flex:0 0 6px;background:var(--amber);box-shadow:0 0 8px currentColor}
  .warn.red .dot{background:var(--red)}
  .warn span{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .warn time{font-family:var(--mono);font-size:11px;color:var(--muted);flex:0 0 auto}
  .panel-alerts.ping{animation:ping 1s ease}
  @keyframes ping{0%,100%{box-shadow:inset 0 0 28px rgba(20,110,170,.07)}50%{box-shadow:inset 0 0 40px rgba(255,107,107,.3),0 0 18px rgba(255,107,107,.25)}}

  /* 生产指标 */
  .prod-grid{flex:1;display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;gap:7px}
  .prod{
    background:linear-gradient(180deg,rgba(24,88,130,.28),rgba(8,36,60,.4));
    border:1px solid rgba(21,82,115,.3);border-radius:2px;padding:6px 9px;
    display:flex;flex-direction:column;justify-content:center;min-width:0;
  }
  .prod span{font-size:11px;color:var(--muted);letter-spacing:.4px;white-space:nowrap}
  .prod b{font-family:var(--mono);font-size:16px;font-weight:600;color:var(--text);margin-top:2px;line-height:1.1;white-space:nowrap}
  .prod b i{font-style:normal;font-size:11px;color:var(--text-2);margin-left:3px;font-weight:400}
  .prod em{font-style:normal;font-size:10px;margin-top:1px;color:var(--green);font-family:var(--mono);line-height:1.2}
  .prod em.down{color:var(--red)}

  /* 趋势 */
  #trend{flex:1;min-height:0;width:100%}

  /* 饲料 */
  .feed{flex:1;display:flex;flex-direction:column;justify-content:space-around;min-height:0}
  .feed-head,.feed-row{display:grid;grid-template-columns:1.7fr .78fr .76fr .76fr;gap:5px;align-items:center}
  .feed-head{font-size:11px;color:var(--muted);padding-bottom:4px;border-bottom:1px solid rgba(21,82,115,.25)}
  .feed-row{font-size:11px;color:var(--text-2);padding:3px 0}
  .feed-row > span:first-child{line-height:1.2}
  .feed-row b{font-family:var(--mono);font-weight:500;color:var(--text);font-size:11px}
  /* 数字与表头同列右对齐，才能纵向比大小 */
  .feed-head span:nth-child(2),.feed-head span:nth-child(3),.feed-row > b{text-align:right}
  .chip{justify-self:start;font-size:11px;padding:1px 6px;border-radius:2px;border:1px solid;letter-spacing:.5px;white-space:nowrap}
  .chip.bad{color:var(--red);border-color:rgba(255,107,107,.4);background:rgba(255,107,107,.1)}
  .chip.ok{color:var(--green);border-color:rgba(47,224,164,.35);background:rgba(47,224,164,.08)}

  /* ---------------- 中间沙盘 ---------------- */
  .center{min-height:0;display:flex;flex-direction:column;gap:10px}
  .stage-frame{
    position:relative;flex:1;min-height:0;border:1px solid rgba(21,82,115,.45);
    background:var(--bg);border-radius:3px;overflow:hidden;
    box-shadow:inset 0 0 60px rgba(10,60,100,.25),0 10px 30px rgba(0,0,0,.35);
  }
  .stage-frame::before{
    content:"";position:absolute;inset:0;pointer-events:none;z-index:3;
    background:radial-gradient(ellipse at 50% 35%,transparent 55%,rgba(2,10,20,.55) 100%);
  }
  #stage{position:absolute;inset:0}
  #stage canvas{display:block;width:100%!important;height:100%!important}
  #twinFrame,#twinFrame2d{
    position:absolute;inset:0;width:100%;height:100%;border:0;
    background:var(--bg);display:block;
  }
  #twinFrame{z-index:2}
  #twinFrame2d{z-index:1;visibility:hidden}
  body.engine2d #twinFrame{visibility:hidden}
  body.engine2d #twinFrame2d{visibility:visible}

  .corner{position:absolute;width:14px;height:14px;z-index:4;pointer-events:none;opacity:.85}
  .corner.tl{left:-1px;top:-1px;border-left:2px solid var(--cyan);border-top:2px solid var(--cyan)}
  .corner.tr{right:-1px;top:-1px;border-right:2px solid var(--cyan);border-top:2px solid var(--cyan)}
  .corner.bl{left:-1px;bottom:-1px;border-left:2px solid var(--cyan);border-bottom:2px solid var(--cyan)}
  .corner.br{right:-1px;bottom:-1px;border-right:2px solid var(--cyan);border-bottom:2px solid var(--cyan)}

  .stage-tag{
    position:absolute;left:14px;top:12px;z-index:5;display:flex;align-items:center;gap:9px;
    font-size:12px;letter-spacing:1.6px;color:var(--text-2);
    text-shadow:0 0 12px rgba(0,0,0,.85);
  }
  .stage-tag::before{content:"";width:4px;height:12px;background:var(--cyan);box-shadow:0 0 8px var(--cyan)}
  .live{
    font-family:var(--mono);font-size:11px;letter-spacing:1.2px;color:var(--green);
    border:1px solid rgba(47,224,164,.4);padding:1px 5px;border-radius:2px;
    animation:blink 2.4s infinite;
  }
  @keyframes blink{0%,100%{opacity:.45}50%{opacity:1}}

  /* 风向标：常驻沙盘左上角，风向来向 + 四方位罗盘 */
  .wind-vane{
    position:absolute;left:14px;top:44px;z-index:6;
    display:flex;align-items:center;gap:9px;
    padding:7px 10px 7px 8px;border-radius:4px;
    background:linear-gradient(180deg,rgba(6,26,46,.9),rgba(4,18,34,.82));
    border:1px solid rgba(21,82,115,.48);
    box-shadow:0 8px 24px rgba(0,0,0,.35),inset 0 0 24px rgba(69,217,255,.06);
    backdrop-filter:blur(10px);pointer-events:none;
  }
  .wv-rose{
    position:relative;width:58px;height:58px;flex:0 0 58px;border-radius:50%;
    border:1px solid rgba(69,217,255,.32);
    background:
      radial-gradient(circle at 50% 50%,rgba(69,217,255,.1),transparent 62%),
      repeating-conic-gradient(from 0deg,rgba(69,217,255,.16) 0 1deg,transparent 1deg 45deg);
    transform:rotate(var(--wv-rot,0deg));
    transition:transform .5s cubic-bezier(.2,.7,.2,1);
  }
  .wv-rose span{
    position:absolute;font-family:var(--mono);font-size:9px;color:var(--text-2);line-height:1;
    transform:translate(-50%,-50%) rotate(calc(-1 * var(--wv-rot,0deg)));
    transition:transform .5s cubic-bezier(.2,.7,.2,1);
  }
  .wv-n{left:50%;top:9%}.wv-e{left:91%;top:50%}.wv-s{left:50%;top:91%}.wv-w{left:9%;top:50%}
  .wv-needle{
    position:absolute;left:50%;top:50%;width:0;height:0;
    border-left:4px solid transparent;border-right:4px solid transparent;
    border-bottom:21px solid var(--cyan);
    transform-origin:50% 100%;
    transform:translate(-50%,-100%) rotate(315deg);
    filter:drop-shadow(0 0 5px rgba(69,217,255,.75));
    transition:transform .5s cubic-bezier(.2,.7,.2,1);
  }
  .wv-needle::after{
    content:"";position:absolute;left:-1px;top:21px;width:2px;height:9px;
    background:rgba(69,217,255,.55);border-radius:1px;
  }
  .wv-hub{
    position:absolute;left:50%;top:50%;width:5px;height:5px;border-radius:50%;
    background:var(--text);transform:translate(-50%,-50%);
    box-shadow:0 0 6px rgba(69,217,255,.8);
  }
  .wv-meta{display:flex;flex-direction:column;line-height:1.35;min-width:64px}
  .wv-meta b{font-size:13px;color:var(--text);font-weight:600;letter-spacing:.5px}
  .wv-meta span{font-size:11px;color:var(--muted)}
  .wv-meta small{font-family:var(--mono);font-size:10.5px;color:var(--faint);white-space:nowrap}

  .stage-tools{
    position:absolute;left:50%;bottom:14px;transform:translateX(-50%);z-index:21;
    display:flex;gap:2px;padding:4px;
    background:rgba(4,18,34,.82);border:1px solid rgba(21,82,115,.45);
    border-radius:5px;backdrop-filter:blur(12px);
  }
  .tool{
    appearance:none;border:0;background:transparent;color:var(--text-2);font-family:inherit;
    font-size:11.5px;letter-spacing:.4px;padding:7px 12px;border-radius:3px;cursor:pointer;
    display:flex;align-items:center;gap:6px;transition:.15s;white-space:nowrap;
  }
  .tool svg{width:13px;height:13px;opacity:.85}
  .tool:hover{color:var(--text);background:rgba(69,217,255,.1)}
  .tool.on{color:var(--cyan);background:rgba(69,217,255,.12)}

  /* 场景内浮层 */
  .card{
    position:absolute;right:14px;top:48px;width:248px;z-index:7;
    background:rgba(6,26,46,.94);border:1px solid rgba(69,217,255,.35);border-radius:3px;
    overflow:hidden;backdrop-filter:blur(14px);
    box-shadow:0 12px 32px rgba(0,0,0,.45);
    opacity:0;transform:translateX(10px);transition:opacity .2s,transform .2s;pointer-events:none;
  }
  .card.show{opacity:1;transform:translateX(0);pointer-events:auto}
  .card .head{
    padding:10px 12px;border-bottom:1px solid rgba(21,82,115,.4);
    display:flex;align-items:center;justify-content:space-between;
    background:linear-gradient(90deg,rgba(28,105,155,.28),transparent);
  }
  .card .head h3{font-size:12px;font-weight:500;letter-spacing:.6px;color:var(--text)}
  .card .head-tools{display:flex;align-items:center;gap:7px;flex:none}
  .card-fold{
    appearance:none;border:0;background:transparent;color:var(--muted);padding:0;
    width:20px;height:20px;display:grid;place-items:center;border-radius:2px;
    cursor:pointer;transition:.15s;
  }
  .card-fold:hover{color:var(--text);background:rgba(69,217,255,.12)}
  .card-fold:focus-visible{outline:1px solid rgba(69,217,255,.6);outline-offset:1px}
  .card-fold svg{width:13px;height:13px;transform:rotate(180deg);transition:transform .2s}
  /* 折叠后只留标题条，沙盘视野让出来；点标题条或箭头再展开 */
  .card.collapsed{width:auto;min-width:148px}
  .card.collapsed .card-fold svg{transform:rotate(0)}
  .card.collapsed .body,
  .card.collapsed .card-cta,
  .card.collapsed .card-scroll-hint{display:none}
  .card.collapsed .head{border-bottom:0}
  .card.collapsed .head h3{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:150px}
  .card .tag{font-size:11px;padding:2px 6px;border-radius:2px;letter-spacing:.8px;background:rgba(47,224,164,.12);color:var(--green);border:1px solid rgba(47,224,164,.3)}
  .card .tag.danger{background:rgba(255,107,107,.14);color:var(--red);border-color:rgba(255,107,107,.4)}
  .card .body{padding:4px 12px 11px}
  .row{display:flex;justify-content:space-between;padding:5px 0;font-size:12px}
  .row span{color:var(--muted)}
  .row b{font-weight:500;font-family:var(--mono);color:var(--text)}
  .card .note{
    margin-top:8px;padding:8px 9px;border-radius:3px;background:rgba(69,217,255,.06);
    border-left:2px solid rgba(69,217,255,.4);font-size:11.5px;line-height:1.7;color:var(--text-2);
  }
  .card .clue{
    padding:7px 0;border-top:1px solid rgba(21,82,115,.22);
    font-size:11.5px;line-height:1.65;color:var(--text-2);
  }
  .card .clue span{
    display:block;font-size:11px;letter-spacing:.6px;color:var(--faint);margin-bottom:2px;
  }
  .card{max-height:calc(100% - 96px);overflow:auto}
  /* 卡片内容超过高度时：细滚动条 + 底部渐隐提示，避免用户以为内容被截断 */
  .card{scrollbar-width:thin;scrollbar-color:rgba(69,217,255,.42) transparent}
  .card::-webkit-scrollbar{width:4px}
  .card::-webkit-scrollbar-track{background:transparent}
  .card::-webkit-scrollbar-thumb{background:rgba(69,217,255,.38);border-radius:2px}
  .card::-webkit-scrollbar-thumb:hover{background:rgba(69,217,255,.6)}
  .card-scroll-hint{
    position:sticky;bottom:0;z-index:3;
    display:flex;align-items:center;justify-content:center;gap:5px;
    height:34px;margin-top:-34px;
    background:linear-gradient(180deg,rgba(6,26,46,0),rgba(6,26,46,.96) 58%);
    color:var(--cyan);font-size:11px;letter-spacing:.6px;
    pointer-events:none;opacity:0;transition:opacity .2s;
  }
  .card-scroll-hint svg{width:12px;height:12px;animation:hintBob 1.6s ease-in-out infinite}
  .card-scroll-hint.show{opacity:1}
  @keyframes hintBob{0%,100%{transform:translateY(-1px)}50%{transform:translateY(2px)}}

  .alert{
    position:absolute;left:50%;bottom:64px;transform:translate(-50%,12px);z-index:6;
    display:flex;align-items:center;gap:12px;padding:9px 16px;border-radius:3px;
    background:rgba(44,14,17,.94);border:1px solid rgba(255,107,107,.35);
    box-shadow:0 0 50px rgba(255,107,107,.14);
    opacity:0;transition:all .26s;pointer-events:none;white-space:nowrap;
  }
  .alert.show{opacity:1;transform:translate(-50%,0)}
  .alert .lv{font-size:11px;letter-spacing:1.2px;padding:2px 6px;border-radius:2px;background:rgba(255,107,107,.18);color:var(--red)}
  .alert .txt{font-size:12px;color:var(--text-2)}
  .alert .time{font-size:11.5px;color:var(--muted);font-family:var(--mono)}

  .loading{
    position:absolute;inset:0;display:flex;align-items:center;justify-content:center;z-index:20;
    background:var(--bg);transition:opacity .5s;font-size:12px;letter-spacing:3px;color:var(--muted);
  }
  .loading.hide{opacity:0;pointer-events:none}
  /* 3D 沙盘：WASM 下载/编译期间 scene.js 会在 500ms 时提前把 #loading 收掉，
     用 body.engine3d 把它压回最上层，直到首帧就绪（tryTwin）或超时再移除这个类。 */
  body.engine3d .loading.hide{opacity:1;pointer-events:none}

  /* 总览数据条 */
  .overview{
    flex:0 0 76px;display:flex;align-items:stretch;position:relative;overflow:hidden;
    border:1px solid rgba(21,82,115,.42);
    background:linear-gradient(180deg,rgba(9,36,62,.88),rgba(4,20,38,.92));
    border-radius:3px;
  }
  .overview-title{
    flex:0 0 160px;display:flex;flex-direction:column;justify-content:center;gap:3px;
    padding:0 14px;border-right:1px solid rgba(21,82,115,.3);
    background:linear-gradient(90deg,rgba(28,105,155,.22),transparent);
  }
  .overview-title b{font-size:12px;letter-spacing:1.4px;color:var(--text);font-weight:500}
  .overview-title span{font-family:var(--mono);font-size:10.5px;letter-spacing:1.1px;color:var(--muted);white-space:nowrap}
  .overview-stats{flex:1;display:grid;grid-template-columns:repeat(5,1fr);align-items:center;min-width:0}
  .ostat{display:flex;align-items:center;gap:9px;padding:0 14px;border-right:1px solid rgba(21,82,115,.18);min-width:0}
  .ostat:last-child{border-right:0}
  .ostat svg{width:18px;height:18px;color:var(--cyan);opacity:.8;flex:0 0 18px}
  .ostat small{display:block;font-size:11px;color:var(--faint);margin-bottom:2px;white-space:nowrap}
  .ostat b{font-family:var(--mono);font-size:15px;font-weight:600;color:var(--text);white-space:nowrap}
  .ostat b i{font-style:normal;font-size:11px;color:var(--muted);margin-left:3px;font-weight:400}

  /* ---------------- 应急决策 ---------------- */
  .deck{
    flex:0 0 auto;position:relative;z-index:2;margin:0 16px 12px;padding:9px 14px 11px;min-width:0;
    background:linear-gradient(180deg,rgba(8,32,56,.92),rgba(4,18,34,.94));
    border:1px solid rgba(21,82,115,.42);border-radius:3px;
  }
  .deck::before{content:"";position:absolute;left:-1px;top:-1px;width:12px;height:12px;border-left:2px solid var(--cyan);border-top:2px solid var(--cyan);opacity:.75}
  .deck-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;gap:12px}
  .deck-title{display:flex;align-items:center;gap:10px;min-width:0}
  .deck-title h2{font-size:12.5px;letter-spacing:1.6px;color:var(--text);font-weight:500;white-space:nowrap}
  .badge{font-size:11px;padding:2px 6px;border:1px solid rgba(255,107,107,.4);background:rgba(255,107,107,.1);color:var(--red);border-radius:2px;letter-spacing:.6px;white-space:nowrap}
  .badge.blue{color:var(--cyan);border-color:rgba(69,217,255,.35);background:rgba(69,217,255,.08)}
  .deck-sub{font-size:11.5px;color:var(--faint);font-family:var(--mono);white-space:nowrap}
  .deck-right{display:flex;align-items:center;gap:12px;font-size:11.5px;color:var(--muted);white-space:nowrap}
  .ap b{font-family:var(--mono);color:var(--cyan);font-size:13px;margin:0 2px}
  .cost b{font-family:var(--mono);color:var(--amber);font-size:12px;margin-left:2px}
  .reset{
    font-size:11.5px;color:var(--muted);background:transparent;border:1px solid rgba(21,82,115,.45);
    border-radius:3px;padding:5px 10px;cursor:pointer;font-family:inherit;transition:.16s;
  }
  .reset:hover{color:var(--text);border-color:rgba(69,217,255,.4)}
  .confirm{
    appearance:none;border:1px solid rgba(47,224,164,.45);
    background:linear-gradient(180deg,rgba(26,140,110,.5),rgba(10,70,58,.5));
    color:var(--text);font-family:inherit;font-size:12px;letter-spacing:.6px;
    padding:6px 15px;border-radius:3px;cursor:pointer;transition:.15s;white-space:nowrap;
  }
  .confirm:hover{background:linear-gradient(180deg,rgba(36,180,140,.55),rgba(12,90,72,.55));box-shadow:0 0 16px rgba(47,224,164,.2)}
  .confirm:disabled{opacity:.35;cursor:not-allowed;box-shadow:none}

  .acts{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:8px}
  .act{
    text-align:left;position:relative;min-width:0;
    display:flex;flex-direction:column;
    background:rgba(12,42,68,.55);border:1px solid rgba(21,82,115,.38);
    border-radius:3px;padding:8px 10px;cursor:pointer;transition:.15s;
    font-family:inherit;color:inherit;
  }
  .act:hover{border-color:rgba(69,217,255,.5);background:rgba(18,62,94,.7);transform:translateY(-1px)}
  .act.sel{
    border-color:var(--cyan);
    background:rgba(69,217,255,.08);
    box-shadow:inset 0 0 14px rgba(69,217,255,.12);
  }
  .act.sel::after{content:"×";position:absolute;right:8px;top:5px;font-size:15px;line-height:1;color:var(--cyan)}
  .act .n{font-size:12px;color:var(--text);margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:14px}
  /* 选项效果提示：正负效果混在一句话里，用中性色；绿色只留给真的「赚/恢复」 */
  .act .eff{font-size:11px;color:var(--text-2);margin-bottom:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .act .m{display:flex;justify-content:space-between;gap:6px;font-size:11px;color:var(--faint);font-family:var(--mono);margin-top:auto}
  .act .m b{color:var(--amber);font-weight:500}
  .act .m b.free{color:var(--muted);font-weight:400}
  .act .side{font-size:11px;color:var(--amber);margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  /* 持续效果提示：短屏也要看得见，不跟 .side 一起被隐藏 */
  .act .persist-hint{font-size:11px;color:var(--muted);margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .act .persist-hint:empty{display:none}

  .toast{
    position:fixed;left:50%;bottom:150px;transform:translate(-50%,10px);z-index:30;
    padding:9px 16px;border-radius:3px;background:rgba(8,30,50,.96);
    border:1px solid rgba(69,217,255,.35);color:var(--text);font-size:12px;
    opacity:0;transition:all .22s;pointer-events:none;white-space:nowrap;
  }
  .toast.show{opacity:1;transform:translate(-50%,0)}

  /* ---------------- 分页 / 二级页面 ---------------- */
  [hidden]{display:none!important}
  .scrollpage{
    flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;position:relative;z-index:2;
    padding:10px 16px 12px;display:flex;flex-direction:column;gap:10px;
  }
  .scrollpage::-webkit-scrollbar{width:4px}
  .scrollpage::-webkit-scrollbar-thumb{background:rgba(69,217,255,.25);border-radius:2px}

  .page-head{flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;gap:18px}
  .ph-title{display:flex;align-items:baseline;gap:12px;min-width:0;padding-left:10px}
  .ph-title h2{font-size:17px;font-weight:600;letter-spacing:2.5px;color:var(--text);white-space:nowrap}
  .ph-title h2::before{
    content:"";display:inline-block;width:4px;height:15px;margin-right:9px;vertical-align:-2px;
    background:linear-gradient(180deg,var(--cyan),rgba(69,217,255,.15));
    box-shadow:0 0 10px rgba(69,217,255,.7);
  }
  .ph-title p{font-size:11px;color:var(--muted);letter-spacing:1.3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .page-kpis{display:flex;gap:8px;flex:0 0 auto}
  .kpi{
    flex:0 0 128px;min-width:0;padding:6px 12px;border:1px solid rgba(21,82,115,.38);border-radius:3px;
    background:linear-gradient(180deg,rgba(12,48,78,.6),rgba(5,22,40,.7));
  }
  .kpi span{display:block;font-size:11px;color:var(--muted);letter-spacing:.5px;margin-bottom:2px;white-space:nowrap}
  .kpi b{font-family:var(--mono);font-size:17px;font-weight:600;color:var(--text);white-space:nowrap;line-height:1.2}
  .kpi b i{font-style:normal;font-size:11px;color:var(--muted);margin-left:3px;font-weight:400}
  .kpi b em{font-style:normal;font-size:11px;color:var(--green);margin-left:6px}
  .kpi.bad b em{color:var(--red)}

  /* flex:1 1 auto + min-height:0：高度由父容器给定，行用 minmax(0,1fr) 收住，
     否则 ECharts 画布会把 auto 行越撑越大，整页溢出视口。 */
  .chart-grid{display:grid;gap:10px;flex:1 1 auto;min-height:0}
  .chart-grid > *{min-height:0}
  .chart-grid.monitor{
    grid-template-columns:1.5fr 1fr;grid-template-rows:minmax(0,1fr) minmax(0,1fr);
    grid-template-areas:"env device" "disease heat";
  }
  .chart-grid.production{
    grid-template-columns:1.35fr 1fr 1fr;grid-template-rows:minmax(0,1fr) minmax(0,1fr);
    grid-template-areas:"milk herd feed" "milk repro plan";
  }
  /* P0-01：决策区上提到首屏——剧情/风险 → 决策 → 研判 → 规则。
     B 版：左 7 列放信息与决策，右 5 列放态势；沙盘跨 deck/brief/rules 三行，
     高度由左列内容撑开，比例回到接近地图本身的 2:1，不再是一条扁带。 */
  .chart-grid.command{
    grid-template-columns:7fr 5fr;
    grid-template-rows:380px auto auto auto;
    grid-template-areas:
      "story risk"
      "deck  sandbox"
      "press sandbox"
      "rules sandbox";
    flex:0 0 auto;
  }
  .chart-grid.report{
    grid-template-columns:1.35fr 1fr;grid-template-rows:330px auto;
    grid-template-areas:"reports radar" "chain chain";
  }
  .area-env{grid-area:env}.area-device{grid-area:device}.area-disease{grid-area:disease}.area-heat{grid-area:heat}
  .area-milk{grid-area:milk}.area-herd{grid-area:herd}.area-feed{grid-area:feed}.area-repro{grid-area:repro}.area-plan{grid-area:plan}
  .area-story{grid-area:story}.area-risk{grid-area:risk}
  .area-sandbox{grid-area:sandbox}
  .area-deck{grid-area:deck;display:flex;flex-direction:column;min-height:0;min-width:0}
  .area-press{grid-area:press;display:grid;grid-template-columns:1fr 1fr;gap:10px;min-height:0}
  .press-card{display:flex;flex-direction:column;min-height:0;overflow:hidden}
  .press-card .panel-body{display:flex;flex-direction:column;justify-content:center;gap:5px;padding:8px 12px}
  .press-consequence{
    border-color:rgba(255,107,107,.42);
    background:linear-gradient(180deg,rgba(255,107,107,.10),rgba(4,16,31,.6));
    box-shadow:inset 0 0 40px rgba(255,80,90,.06),0 8px 26px rgba(0,0,0,.3);
  }
  .press-consequence .panel-head{
    border-bottom:1px solid rgba(255,107,107,.28);
    background:linear-gradient(90deg,rgba(255,107,107,.16),transparent);
  }
  .press-consequence .panel-head h2{color:var(--red)}
  .press-consequence .panel-head h2::before{background:var(--red);box-shadow:0 0 8px var(--red)}
  .press-consequence .more.danger{color:var(--red)}
  .press-case{
    border-color:rgba(255,201,77,.45);
    background:linear-gradient(180deg,rgba(64,48,16,.5),rgba(8,24,40,.72));
  }
  .press-case .panel-head{
    border-bottom:1px solid rgba(255,201,77,.25);
    background:linear-gradient(90deg,rgba(255,201,77,.12),transparent);
  }
  .press-case .panel-head h2{color:var(--amber)}
  .press-case .panel-head h2::before{background:var(--amber);box-shadow:0 0 8px var(--amber)}
  .conseq-big{display:flex;align-items:baseline;gap:6px}
  .conseq-big b{font-family:var(--mono);font-size:26px;line-height:1;color:var(--red);text-shadow:0 0 18px rgba(255,80,90,.45)}
  .conseq-big span{font-size:11.5px;color:var(--red)}
  .press-consequence p,.press-case p{font-size:11.3px;line-height:1.55;color:var(--text-2);margin:0}
  .conseq-chips{display:flex;flex-wrap:wrap;gap:5px}
  .conseq-chips span{
    font-size:11px;padding:2px 7px;border-radius:2px;white-space:nowrap;
    color:var(--red);border:1px solid rgba(255,107,107,.4);background:rgba(255,107,107,.12);
  }
  .case-head{display:flex;flex-direction:column;gap:3px}
  .case-tag{
    align-self:flex-start;font-size:10.5px;letter-spacing:.4px;padding:1px 6px;border-radius:2px;
    color:var(--amber);border:1px solid rgba(255,201,77,.42);background:rgba(255,201,77,.1);
  }
  .case-head b{font-size:13px;color:var(--amber);font-weight:600}
  .case-lesson{
    margin-top:1px;padding:5px 8px;border-left:2px solid rgba(255,201,77,.6);
    background:rgba(255,201,77,.07);border-radius:0 2px 2px 0;
    font-size:11.5px;line-height:1.55;color:var(--text-2);
  }
  .case-lesson b{color:var(--amber);font-weight:600;margin-right:4px}
  .season-jump{
    appearance:none;border:1px solid rgba(69,217,255,.5);background:rgba(69,217,255,.12);
    color:var(--text);font-family:inherit;font-size:11.5px;letter-spacing:.4px;
    padding:3px 9px;border-radius:2px;cursor:pointer;white-space:nowrap;transition:.15s;
  }
  .season-jump:hover{background:rgba(69,217,255,.24);color:var(--text);box-shadow:0 0 14px rgba(69,217,255,.25)}
  a.season-jump{text-decoration:none;display:inline-flex;align-items:center;justify-content:center}
  .cardlib-link{border-style:dashed;border-color:rgba(69,217,255,.35);color:var(--text-2)}
  .cardlib-link:hover{border-style:solid;color:var(--text)}
  .sandbox-body{padding:0!important;min-height:0;overflow:hidden;position:relative}
  .sandbox-body iframe{display:block;width:100%;height:100%;border:0;background:var(--bg)}
  .map-fallback{position:absolute;inset:0;z-index:2;display:flex;align-items:center;justify-content:center;background:var(--bg)}
  .map-fallback[hidden]{display:none}
  .map-fallback img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:.55}
  .map-fallback span{position:relative;z-index:1;padding:8px 12px;border:1px solid rgba(255,201,77,.45);background:rgba(6,26,46,.88);color:var(--amber);font-size:12px;border-radius:2px}
  .area-reports{grid-area:reports}.area-radar{grid-area:radar}.area-chain{grid-area:chain}
  .chart{flex:1;min-height:0;width:100%}
  /* P1-02：图表下方的数值条。大屏场景 hover 不是可靠交互，关键值必须直接写出来。 */
  .value-strip{
    flex:0 0 auto;display:flex;flex-wrap:wrap;gap:2px 12px;
    padding:5px 4px 0;border-top:1px solid rgba(21,82,115,.22);margin-top:3px;
  }
  .value-strip span{display:flex;align-items:baseline;gap:5px;font-size:11.5px;white-space:nowrap}
  .value-strip span i{font-style:normal;color:var(--muted)}
  .value-strip span b{font-family:var(--mono);font-weight:600;color:var(--text);font-size:12px}
  .value-strip span b em{font-style:normal;font-size:11px;color:var(--muted);margin-left:1px}
  .chart-grid .panel-body{padding:6px 8px 8px}
  .deck.inpage{margin:0;flex:1;min-height:0}
  /* 规则条：收起态只留「规则说明 ?」一行，hover / focus / 点击浮出三格；
     浮层绝对定位，展开收起不推挤下方布局 */
  .mission-rules{grid-area:rules;position:relative;display:flex;align-items:center;min-height:28px;outline:none}
  .rules-toggle{
    display:inline-flex;align-items:center;gap:6px;font-size:11.5px;color:var(--muted);
    padding:4px 10px;border:1px dashed rgba(21,82,115,.55);border-radius:3px;
    background:rgba(9,36,62,.5);cursor:help;white-space:nowrap;
    transition:color .14s,border-color .14s,background .14s;
  }
  .mission-rules:hover .rules-toggle,
  .mission-rules:focus-within .rules-toggle,
  .mission-rules.open .rules-toggle{
    color:var(--text-2);border-style:solid;border-color:rgba(69,217,255,.45);background:rgba(69,217,255,.08);
  }
  .rules-q{
    display:inline-grid;place-items:center;width:13px;height:13px;font-size:9.5px;line-height:1;
    border:1px solid currentColor;border-radius:50%;
  }
  .rules-panel{
    position:absolute;left:0;bottom:calc(100% + 8px);z-index:14;width:min(760px,82vw);
    display:none;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;padding:10px;
    border:1px solid rgba(21,82,115,.75);border-radius:4px;
    background:rgba(4,16,31,.97);box-shadow:0 16px 44px rgba(0,0,0,.6);
  }
  .mission-rules:hover .rules-panel,
  .mission-rules:focus-within .rules-panel,
  .mission-rules.open .rules-panel{display:grid;animation:rulesIn .14s ease-out}
  @keyframes rulesIn{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}
  .rules-panel > div{
    padding:8px 10px;border:1px solid rgba(21,82,115,.32);border-radius:3px;
    background:rgba(9,36,62,.5);
  }
  .rules-panel b{display:block;font-size:11.5px;color:var(--text);font-weight:500;margin-bottom:3px;letter-spacing:.5px}
  .rules-panel b::before{content:"";display:inline-block;width:3px;height:9px;background:var(--cyan);margin-right:6px;box-shadow:0 0 6px var(--cyan)}
  .rules-panel span{font-size:11.5px;color:var(--muted);line-height:1.5}
  .brief-grid{flex:1;display:grid;grid-template-columns:repeat(4,1fr);gap:10px;align-content:center}
  /* 研判要点放在沙盘右侧后，宽度减半，四宫格改 2×2 才不会挤成一条 */
  .area-brief .brief-grid{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr}
  .brief-grid div{
    padding:8px 10px;border-left:2px solid rgba(69,217,255,.45);
    background:rgba(10,38,64,.4);border-radius:0 3px 3px 0;
    display:flex;flex-direction:column;justify-content:center;
  }
  .brief-grid b{display:block;font-size:11px;color:var(--cyan);font-weight:500;letter-spacing:.6px;margin-bottom:4px}
  .brief-grid span{font-size:11.5px;line-height:1.65;color:var(--text-2)}

  /* 剧本进度 */
  .acts-track{display:flex;gap:8px;margin-bottom:10px;flex:0 0 auto}
  .actnode{
    flex:1;position:relative;padding:8px 10px;border:1px solid rgba(21,82,115,.32);
    border-radius:3px;background:rgba(10,38,64,.45);min-width:0;
  }
  .actnode::after{content:"";position:absolute;right:-9px;top:50%;width:8px;height:1px;background:rgba(21,82,115,.45)}
  .actnode:last-child::after{display:none}
  .actnode i{font-style:normal;font-family:var(--mono);font-size:11px;color:var(--muted)}
  .actnode b{display:block;font-size:12px;font-weight:500;color:var(--text-2);margin:1px 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .actnode span{font-size:11px;color:var(--muted)}
  .actnode.on{border-color:rgba(69,217,255,.55);background:rgba(69,217,255,.08);box-shadow:inset 0 0 14px rgba(69,217,255,.1)}
  .actnode.on i{color:var(--cyan)}
  .actnode.on b{color:var(--text)}
  .actnode.done{border-color:rgba(47,224,164,.32)}
  .actnode.done i{color:var(--green)}
  .story-body{flex:1;min-height:0;display:grid;grid-template-columns:1.1fr 1fr;gap:14px}
  .story-event{min-width:0;display:flex;flex-direction:column;min-height:0}
  .story-event h3{font-size:13px;color:var(--amber);font-weight:500;letter-spacing:.8px;margin-bottom:6px}
  .story-event p{font-size:12px;line-height:1.85;color:var(--text-2);overflow:auto;padding-right:6px}
  .clue-list{list-style:none;display:flex;flex-direction:column;gap:7px;min-height:0;overflow:auto}
  .clue-list li{background:rgba(10,38,64,.5);border-left:2px solid rgba(69,217,255,.45);padding:6px 9px;font-size:11.5px;line-height:1.6;color:var(--text)}
  .clue-list li b{display:block;font-size:11px;color:var(--faint);font-weight:400;letter-spacing:.5px;margin-bottom:2px}
  .story-tip{
    flex:0 0 auto;margin-top:10px;padding:8px 10px;border:1px dashed rgba(69,217,255,.28);
    border-radius:3px;background:rgba(10,38,64,.35);font-size:11.5px;line-height:1.6;color:var(--text-2);
  }
  .story-tip b{color:var(--cyan);font-weight:500;margin-right:8px;letter-spacing:.6px}

  /* 今日影响：抽到卡就把当天要扣的写出来，不等结算 */
  .today-impact{
    margin-top:8px;padding:7px 9px;border-radius:3px;
    background:rgba(255,107,107,.08);border-left:2px solid rgba(255,107,107,.5);
    font-size:11.5px;line-height:1.65;color:var(--text-2);flex:0 0 auto;
  }
  .today-impact b{color:var(--red);font-weight:500;margin-right:6px;letter-spacing:.5px}

  /* 持续效果条：debuff 红 / buff 绿，带剩余天数 */
  .persist-strip{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px;flex:0 0 auto}
  .persist-chip{
    display:inline-flex;align-items:center;gap:5px;font-size:11px;
    padding:2px 7px;border-radius:2px;border:1px solid;white-space:nowrap;
  }
  .persist-chip.debuff{color:var(--red);border-color:rgba(255,107,107,.42);background:rgba(255,107,107,.1)}
  .persist-chip.buff{color:var(--green);border-color:rgba(47,224,164,.42);background:rgba(47,224,164,.1)}
  .persist-chip i{font-style:normal;font-family:var(--mono);opacity:.85}

  /* 生产计划 */
  .plan-list{flex:1;display:flex;flex-direction:column;justify-content:space-around;gap:8px;min-height:0}
  .plan-item span{display:flex;justify-content:space-between;font-size:11.5px;color:var(--text-2);margin-bottom:4px}
  .plan-item span b{font-family:var(--mono);color:var(--text);font-weight:500}
  .bar{height:5px;background:rgba(21,82,115,.25);border-radius:3px;overflow:hidden}
  .bar i{display:block;height:100%;background:linear-gradient(90deg,var(--cyan),var(--cyan));border-radius:3px;box-shadow:0 0 8px rgba(69,217,255,.4)}
  .bar.amber i{background:linear-gradient(90deg,var(--amber),var(--amber));box-shadow:0 0 8px rgba(255,201,77,.35)}

  /* 报表 */
  .report-list{flex:1;min-height:0;display:flex;flex-direction:column;gap:6px;overflow:auto}
  .report-row{
    display:grid;grid-template-columns:1fr 92px 78px 60px 54px;gap:8px;align-items:center;
    padding:8px 10px;background:rgba(10,38,64,.42);border:1px solid rgba(21,82,115,.26);
    border-radius:2px;font-size:11.5px;color:var(--text-2);
  }
  .report-row b{font-weight:500;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .report-row em{font-style:normal;font-size:11px;color:var(--faint);font-family:var(--mono)}
  .report-row span{font-size:11px;color:var(--muted);white-space:nowrap}
  .report-row .st{font-size:11px;padding:1px 5px;border:1px solid rgba(47,224,164,.35);color:var(--green);border-radius:2px;text-align:center;justify-self:start;white-space:nowrap}
  .report-row .st.wait{color:var(--amber);border-color:rgba(255,201,77,.4)}
  .report-row .st.tpl{color:var(--muted);border-color:rgba(49,113,163,.45);background:rgba(20,70,105,.18)}
  .report-row button{
    appearance:none;background:transparent;border:1px solid rgba(69,217,255,.3);color:var(--text-2);
    font-family:inherit;font-size:11px;padding:3px 8px;border-radius:2px;cursor:pointer;transition:.15s;
  }
  .report-row button:hover{background:rgba(69,217,255,.1);color:var(--text)}

  /* 决策链 */
  .archive-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;flex:0 0 auto;margin-bottom:10px}
  .as-item{padding:7px 10px;border:1px solid rgba(21,82,115,.3);border-radius:2px;background:rgba(10,38,64,.35)}
  .as-item span{display:block;font-size:11px;color:var(--faint);margin-bottom:3px;letter-spacing:.4px;white-space:nowrap}
  .as-item b{font-family:var(--mono);font-size:16px;color:var(--text);font-weight:600;white-space:nowrap}
  .as-item b i{font-style:normal;font-size:11px;color:var(--muted);margin-left:3px;font-weight:400}
  .chain{flex:1;min-height:0;display:flex;flex-direction:column;overflow:auto;padding:2px 4px}
  .chain-item{position:relative;padding:0 0 14px 22px;font-size:12px;color:var(--text-2)}
  .chain-item::before{content:"";position:absolute;left:4px;top:3px;width:7px;height:7px;border-radius:50%;background:var(--cyan);box-shadow:0 0 8px rgba(69,217,255,.7)}
  .chain-item::after{content:"";position:absolute;left:7px;top:12px;bottom:0;width:1px;background:rgba(21,82,115,.4)}
  .chain-item:last-child::after{display:none}
  .chain-item b{display:block;color:var(--text);font-weight:500;margin-bottom:2px}
  .chain-item span{font-size:11px;color:var(--faint);font-family:var(--mono)}
  .chain-empty{padding:16px;font-size:12px;color:var(--muted);border:1px dashed rgba(21,82,115,.4);border-radius:3px;text-align:center}
  .chain-empty b{display:block;color:var(--text-2);font-size:12px;font-weight:500;margin-bottom:4px}
  .chain-empty p{font-size:11.5px;color:var(--muted);line-height:1.6}
  .ghost-flow{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-top:14px;text-align:left}
  .ghost-flow div{position:relative;padding:10px 12px;border:1px solid rgba(21,82,115,.28);border-radius:3px;background:rgba(8,32,56,.45)}
  .ghost-flow i{font-style:normal;font-family:var(--mono);font-size:11px;color:var(--muted)}
  .ghost-flow b{display:block;font-size:12px;color:var(--text-2);margin:2px 0 4px;font-weight:500}
  .ghost-flow span{font-size:11px;color:var(--muted);line-height:1.5}

  /* ---------------- P0-06：禁用态、演示标、报告预览弹层 ---------------- */
  .tool[disabled]{opacity:.38;cursor:not-allowed}
  .tool[disabled]:hover{color:var(--muted);background:transparent}
  .demo-tag{
    display:inline-block;font-size:12px;letter-spacing:.6px;color:var(--amber);
    border:1px solid rgba(255,201,77,.45);background:rgba(255,201,77,.1);
    padding:1px 7px;border-radius:2px;white-space:nowrap;vertical-align:2px;
  }
  .ph-title .demo-tag{margin-left:10px}
  .modal{
    position:fixed;inset:0;z-index:60;display:flex;align-items:center;justify-content:center;
    background:rgba(2,10,20,.72);backdrop-filter:blur(2px);
  }
  .modal[hidden]{display:none}
  .modal-card{
    width:min(620px,88vw);max-height:76vh;overflow:auto;padding:18px 20px 20px;
    background:linear-gradient(180deg,rgba(9,36,62,.98),rgba(4,18,34,.99));
    border:1px solid rgba(69,217,255,.45);border-radius:4px;
    box-shadow:0 24px 80px rgba(0,0,0,.6);
  }
  .modal-card h3{font-size:15px;font-weight:500;letter-spacing:1.2px;color:var(--text);margin-bottom:4px}
  .modal-card .modal-sub{font-size:12px;color:var(--muted);margin-bottom:14px}
  .modal-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:9px;margin-bottom:14px}
  .modal-grid div{padding:8px 10px;border:1px solid rgba(21,82,115,.32);border-radius:3px;background:rgba(10,38,64,.4)}
  .modal-grid span{display:block;font-size:12px;color:var(--muted);margin-bottom:3px}
  .modal-grid b{font-family:var(--mono);font-size:15px;color:var(--text);font-weight:600}
  .modal-list{font-size:12px;color:var(--text-2);line-height:1.7}
  .modal-list .row-line{display:flex;justify-content:space-between;gap:12px;padding:5px 0;border-bottom:1px dashed rgba(21,82,115,.28)}
  .modal-list .row-line em{font-style:normal;color:var(--muted);font-family:var(--mono)}
  .modal-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:16px}
  .modal-actions button{
    appearance:none;font-family:inherit;font-size:12px;padding:7px 14px;border-radius:3px;cursor:pointer;
    border:1px solid rgba(21,82,115,.5);background:transparent;color:var(--text-2);transition:.15s;
  }
  .modal-actions button:hover{color:var(--text);border-color:rgba(69,217,255,.5)}
  .modal-actions .primary{
    border-color:rgba(47,224,164,.5);background:rgba(26,140,110,.35);color:var(--text);
  }
  .modal-actions .primary:hover{background:rgba(36,180,140,.45)}

  /* P0-04 决策结果面板：before/after 增减 */
  .result-card{width:min(680px,90vw)}
  .result-note{
    font-size:12.5px;line-height:1.75;color:var(--text-2);margin-bottom:12px;
    background:rgba(10,38,64,.42);border-left:2px solid rgba(69,217,255,.45);
    padding:9px 11px;border-radius:0 3px 3px 0;
  }
  .sel-tip{margin:7px 2px 0;font-size:10.5px;letter-spacing:.3px;color:var(--faint)}
  .result-effects{
    display:flex;align-items:center;gap:5px;flex-wrap:wrap;
    margin:0 0 9px;padding:7px 9px;
    border-left:2px solid var(--cyan);border-radius:0 2px 2px 0;
    background:rgba(69,217,255,.06);
    font-size:11.5px;line-height:1.6;color:var(--text-2);
  }
  .result-effects b{flex:0 0 auto;margin-right:2px;color:var(--cyan);font-weight:500;letter-spacing:.5px}
  .result-effects em{
    font-style:normal;font-family:var(--mono);font-size:10.5px;
    padding:1px 5px;border:1px solid rgba(21,82,115,.4);border-radius:2px;color:var(--text-2);
  }
  .result-effects em.up{color:var(--green);border-color:rgba(47,224,164,.35);background:rgba(47,224,164,.06)}
  .result-effects em.down{color:var(--red);border-color:rgba(255,107,107,.35);background:rgba(255,107,107,.06)}
  .result-effects em.flat{color:var(--faint);border-style:dashed}
  .delta-cap{display:flex;align-items:baseline;gap:7px;margin:0 0 6px;font-size:11px;letter-spacing:.5px;color:var(--muted)}
  .delta-cap::before{content:"";width:3px;height:8px;background:var(--cyan);box-shadow:0 0 6px var(--cyan)}
  .delta-cap span{font-size:10.5px;letter-spacing:0;color:var(--faint)}
  .delta-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(118px,1fr));gap:9px;margin-bottom:14px}  .delta{padding:9px 11px;border:1px solid rgba(21,82,115,.32);border-radius:3px;background:rgba(10,38,64,.4)}
  .delta span{display:block;font-size:11.5px;color:var(--muted);margin-bottom:4px;white-space:nowrap}
  .delta b{font-family:var(--mono);font-size:17px;font-weight:600;color:var(--text);white-space:nowrap}
  .delta b em{font-style:normal;font-size:11px;color:var(--muted);margin-left:2px;font-weight:400}
  .delta b.up{color:var(--green)}
  .delta b.down{color:var(--red)}
  .delta small{display:block;font-size:11px;color:var(--faint);margin-top:2px;font-family:var(--mono)}
  .delta .split{
    margin-top:4px;padding-top:3px;border-top:1px dashed rgba(21,82,115,.3);
    font-size:9.8px;line-height:1.5;color:var(--faint);white-space:normal;
  }
  .delta .split b{font-weight:400;color:var(--text-2)}
  .delta .split span{display:block;white-space:nowrap}

  @media (max-width:1600px){
    .layout{grid-template-columns:266px minmax(0,1fr) 286px}
    .weather .now span{display:none}
    .title-wrap::before,.title-wrap::after{width:80px}
    .overview-title{flex-basis:118px}
    .overview-title span{display:none}
  }
  @media (max-width:1360px){
    .layout{grid-template-columns:244px minmax(0,1fr) 260px}
    .tabs button{padding:0 11px;font-size:11.5px}
    .tabs button::before{display:none}
    .title-wrap h1{font-size:21px;letter-spacing:5px;--tt:5px}
    .weather .now{display:none}
    .deck-sub{display:none}
    .page-kpis .kpi:nth-child(n+4){display:none}
  }
  @media (max-width:1100px){
    .scrollpage{padding:8px 12px 10px}
    .page-head{flex-wrap:wrap;gap:8px}
    .ph-title p{display:none}
    .chart-grid.monitor,.chart-grid.production,.chart-grid.command,.chart-grid.report{
      grid-template-columns:1fr;grid-template-rows:auto;grid-template-areas:none;min-height:0;
    }
    .area-env,.area-device,.area-disease,.area-heat,.area-milk,.area-herd,.area-feed,
    .area-repro,.area-plan,.area-story,.area-risk,.area-sandbox,.area-deck,.area-press,.area-reports,.area-radar,.area-chain,.mission-rules{grid-area:auto}
    .chart-grid .panel{min-height:280px}
    .chart-grid.command .area-deck{min-height:0}
    .ph-title{padding-left:0}
    .story-body{grid-template-columns:1fr}
    .rules-panel,.area-press{grid-template-columns:1fr}
  }
  @media (max-height:860px){
    .topbar{flex-basis:54px}
    .title-wrap h1{font-size:21px}
    .tabs{flex-basis:42px}
    .overview{flex-basis:66px}
    .deck{padding:7px 12px 9px}
    .act{padding:6px 9px}
    .act .side{display:none}
  }

  @media (max-width:1750px){
    .clock span{display:none}
  }
  @media (max-width:1500px){
    .user{padding-left:10px}
    .user .avatar{display:none}
  }
  @media (max-height:960px){
    .topbar{flex-basis:56px}
    .title-wrap h1{font-size:22px}
    .tabs{flex-basis:42px}
    .layout{gap:10px;padding:0 14px 6px}
    .col{gap:8px}
    .panel-head{flex-basis:29px;padding:0 10px}
    .panel-body{padding:6px 10px 8px}
    .env{gap:4px}
    .env-ic{width:22px;height:22px;flex:0 0 22px}
    .env-ic svg{width:12px;height:12px}
    .env-meta span{font-size:11px;margin-bottom:1px}
    .env-meta b{font-size:12.5px}
    .donut{width:82px;height:82px;flex:0 0 82px}
    .donut .hole{inset:11px}
    .donut .hole b{font-size:14px}
    .donut .hole small,.donut .hole em{font-size:11px}
    .legend{gap:4px}
    .legend li{font-size:11px}
    .warns .warn{font-size:11.5px}
    .prod-grid{gap:5px}
    .prod{padding:5px 7px}
    .prod span{font-size:11px}
    .prod b{font-size:14px}
    .prod em{font-size:11px;margin-top:2px}
    .feed-head{font-size:11px;padding-bottom:2px}
    .feed-row{font-size:11.5px;padding:1px 0}
    .overview{flex-basis:64px}
    .overview-title b{font-size:12px}
    .ostat b{font-size:13.5px}
    .ostat svg{width:16px;height:16px;flex:0 0 16px}
    .deck{padding:6px 12px 8px}
    .deck-top{margin-bottom:6px}
    .act{padding:5px 9px}
    .act .n{font-size:11.5px;margin-bottom:3px}
    .act .eff{font-size:11px;margin-bottom:2px}
    .act .m{font-size:11px}
    .act .side{display:none}
    .tool{padding:5px 10px;font-size:11px}
  }
  @media (max-height:820px){
    .topbar{flex-basis:50px}
    .title-wrap h1{font-size:19px;letter-spacing:5px;--tt:5px}
    .title-wrap p{display:none}
    .tabs{flex-basis:36px}
    .tabs button{height:26px}
    .layout{gap:8px;padding:0 12px 6px}
    .col{gap:8px}
    .panel-head{flex-basis:26px}
    .panel-head h2{font-size:12px;letter-spacing:1px}
    .panel-body{padding:4px 9px 6px}
    .donut{width:70px;height:70px;flex:0 0 70px}
    .donut .hole{inset:9px}
    .donut .hole b{font-size:12px}
    .donut .hole b i{font-size:10px}
    .donut .hole small,.donut .hole em{font-size:11px}
    .legend{gap:2px}
    .legend li{font-size:11px}
    .legend b{font-size:11.5px}
    .legend em{font-size:11px}
    .prod b{font-size:13px}
    .prod em{display:none}
    .feed-row{font-size:11px}
    .feed-head{font-size:11px}
    .overview{flex-basis:48px}
    .overview-title{flex-basis:112px;padding:0 10px}
    .overview-title b{font-size:11.5px;letter-spacing:1px}
    .overview-title span{display:none}
    .ostat{padding:0 10px;gap:7px}
    .ostat small{font-size:11px}
    .ostat b{font-size:12px}
    .deck{padding:5px 10px 7px;margin:0 12px 8px}
    .deck-title h2{font-size:12px}
    .deck-sub{display:none}
    .confirm,.reset{padding:4px 10px;font-size:11.5px}
    .act .m span{font-size:11px}
    .stage-tools{bottom:8px;padding:3px}
    .tool{padding:4px 8px;font-size:11px}
    .stage-tag{font-size:11.5px;top:9px;left:11px}
    .center{gap:6px}
  }

  /* 1080p 及更高：剧情与沙盘各多给一点高度，线索不会被裁在半行上 */
  @media (min-width:1800px){
    .layout{grid-template-columns:320px minmax(0,1fr) 344px}
  }
  @media (min-height:1000px) and (min-width:1101px){
    .chart-grid.command{grid-template-rows:400px auto auto auto}
  }

  /* ---------------- 手机 / 窄屏兜底 ---------------- */
  @media (max-width:900px){
    html,body{height:auto}
    body{display:block;overflow-x:hidden;overflow-y:auto}
    .topbar{
      position:sticky;top:0;z-index:15;display:flex;justify-content:center;
      height:52px;flex:none;padding:0 52px;
      background:rgba(4,17,32,.96);backdrop-filter:blur(8px);
    }
    .weather{display:none}
    .title-wrap h1{font-size:16px;letter-spacing:3px;--tt:3px}
    .title-wrap p{display:none}
    .title-wrap::before,.title-wrap::after{display:none}
    .top-right{position:absolute;right:10px;top:0;height:52px;gap:8px}
    .clock b{font-size:12px}
    .clock span{display:none}
    .icon-btn,.user{display:none}
    .tabs{
      display:flex;flex:0 0 auto;justify-content:flex-start;overflow-x:auto;gap:4px;
      padding:6px;position:sticky;top:52px;z-index:14;
      background:rgba(4,17,32,.94);border-bottom:1px solid rgba(21,82,115,.22);
    }
    .tabs button{flex:0 0 auto;height:27px;padding:0 8px;font-size:11px;white-space:nowrap}
    .tabs button::before{display:none}
    .scrollpage{overflow:visible;padding:8px}
    .chart-grid{min-height:0}
    .page-head{flex-direction:column;align-items:flex-start;gap:8px}
    .page-kpis{width:100%;flex-wrap:wrap}
    .page-kpis .kpi{flex:1 1 calc(50% - 4px);min-width:0}
    .page-kpis .kpi:nth-child(n+4){display:block}
    .layout{display:flex;flex-direction:column;gap:8px;padding:8px}
    .center{order:-1;display:block}
    .stage-frame{height:50vh;min-height:300px}
    .stage-tag{font-size:11.5px}
    .stage-tools{max-width:calc(100% - 16px);flex-wrap:wrap;justify-content:center}
    .tool{font-size:11px;padding:5px 8px}
    .overview{flex:none;height:auto;flex-wrap:wrap;margin-top:8px}
    .overview-title{flex:0 0 100%;padding:8px 12px;border-right:0;border-bottom:1px solid rgba(21,82,115,.3)}
    .overview-title span{display:none}
    .overview-stats{flex:0 0 100%;width:100%;grid-template-columns:1fr 1fr}
    .ostat{padding:8px 12px;border-right:0;border-bottom:1px solid rgba(21,82,115,.15)}
    .col{display:flex;flex-direction:column;gap:8px}
    .col.left{order:1}
    .col.right{order:2}
    .panel{flex:0 0 auto;min-height:178px}
    .panel-body{max-height:none}
    .deck{position:static;margin:0 8px 8px;padding:8px 10px 10px}
    .deck-top{flex-wrap:wrap;gap:8px}
    .deck-title{flex-wrap:wrap}
    .deck-sub{display:none}
    .deck-right{width:100%;justify-content:space-between}
    .acts{display:flex;overflow-x:auto;gap:8px;padding-bottom:4px}
    .act{flex:0 0 200px}
    .card{width:200px;top:40px;right:8px}
    .alert{left:8px;right:8px;bottom:88px;max-width:none;white-space:normal;font-size:11.5px;transform:translateY(8px)}
    .alert.show{transform:translateY(0)}
    .toast{max-width:calc(100% - 24px);white-space:normal;text-align:center}
  }

  /* ================================================================
   * P0-04 字号与对比度阶梯（桌面端）
   *
   * 审核结论：原来 380 个文本节点里 305 个 ≤11.5px，投影到答辩现场读不清。
   * 这里统一收口到一条阶梯，放在文件最后，覆盖前面各断点里被压小的字号：
   *   正文 12.5–13px / 辅助与标签 11.5px / 面板标题 13.5px / 页面标题 19px
   * 弱化文字统一 var(--muted)（对 var(--bg) 约 5.75:1，过 WCAG AA）。
   * 只在 ≥901px 生效，手机端维持原来的紧凑排版。
   * ================================================================ */
  @media (min-width:901px){
    .title-wrap p{font-size:11.5px}
    #weatherBar button{font-size:12px}
    .weather .now span{font-size:12px}
    .clock span{font-size:12px}
    .tabs button{font-size:12.5px}

    .panel-head h2{font-size:13.5px}
    .more{font-size:12px}
    .panel-cta{font-size:12.5px}
    .card-cta{font-size:13px}

    .env-meta span{font-size:12px}
    .env-meta b{font-size:15px}
    .env-meta i{font-size:11.5px}
    .legend li{font-size:12.5px}
    .legend b{font-size:12.5px}
    .legend em{font-size:11.5px}
    .donut .hole small,.donut .hole em{font-size:11.5px}
    .donut .hole b{font-size:17px}

    .warn{font-size:12.5px}
    .warn time{font-size:11.5px}
    .prod span{font-size:11.5px}
    .prod b{font-size:17px}
    .prod em{font-size:11.5px}
    .feed-head{font-size:11.5px}
    .feed-row{font-size:12.5px}
    .feed-row b{font-size:12.5px}
    .chip{font-size:11.5px}

    .card .head h3{font-size:12.5px}
    .card .tag{font-size:11.5px}
    .row{font-size:12.5px}
    .card .note,.card .clue{font-size:12px}
    .card .clue span{font-size:11.5px}
    .stage-tag{font-size:12.5px}
    .tool{font-size:12px}

    .overview-title b{font-size:12.5px}
    .overview-title span{font-size:11.5px}
    .ostat small{font-size:11.5px}
    .ostat b{font-size:16px}

    .deck-title h2{font-size:13px}
    .badge{font-size:11.5px}
    .deck-sub{font-size:12px}
    .deck-right{font-size:12px}
    .reset,.confirm{font-size:12.5px}
    .act .n{font-size:13px}
    .act .eff{font-size:12px}
    .act .m{font-size:11.5px}
    .act .side{font-size:11.5px}

    .ph-title h2{font-size:19px}
    .ph-title p{font-size:11.5px}
    .kpi span{font-size:11.5px}
    .kpi b{font-size:18px}
    .kpi b i{font-size:11.5px}

    .rules-panel b{font-size:12.5px}
    .rules-panel span{font-size:12px}
    .brief-grid b{font-size:11.5px}
    .brief-grid span{font-size:12px}

    .actnode i{font-size:11.5px}
    .actnode b{font-size:12.5px}
    .actnode span{font-size:11.5px}
    .story-event h3{font-size:14px}
    .story-event p{font-size:13px}
    .clue-list li{font-size:12.5px}
    .clue-list li b{font-size:11.5px}
    .story-tip{font-size:12.5px}

    .plan-item span{font-size:12.5px}
    .report-row{font-size:12.5px}
    .report-row em,.report-row span,.report-row .st,.report-row button{font-size:11.5px}
    .as-item span{font-size:11.5px}
    .as-item b{font-size:17px}
    .chain-item{font-size:13px}
    .chain-item span{font-size:11.5px}
    .chain-empty{font-size:12.5px}
    .chain-empty p{font-size:12px}
    .ghost-flow b{font-size:12.5px}
    .ghost-flow span{font-size:11.5px}

    .modal-card h3{font-size:16px}
    .modal-card .modal-sub{font-size:12.5px}
    .modal-grid span{font-size:12px}
    .modal-grid b{font-size:16px}
    .modal-list{font-size:12.5px}
    .toast{font-size:12.5px}
  }

/* ================================================================
 * 开场动画 · 突发灾害响应（P0-07）
 *
 * 曲线约定：
 *   --e-out  出场：快起慢收，元素「落位」用
 *   --e-in   收场：慢起快收，元素「撤走」用
 *   --e-soft 呼吸：告警灯、扫描线的往复
 * 全段只用 11 个 token 与其 rgba，不新增表外色值。
 * ================================================================ */
  :root{
    --e-out:cubic-bezier(.16,1,.3,1);
    --e-in:cubic-bezier(.7,0,.84,0);
    --e-soft:cubic-bezier(.33,1,.68,1);
  }

  /* ---------------- 系统进入动画 ---------------- */
  .boot{
    position:fixed;inset:0;z-index:100;overflow:hidden;
    display:flex;flex-direction:column;align-items:center;justify-content:center;
    background:var(--bg);
    animation:bootFailsafe .01s linear 9s forwards;
  }
  /* JS 没接管时 9 秒自动退场，避免把整页锁死 */
  @keyframes bootFailsafe{to{opacity:0;visibility:hidden;pointer-events:none}}
  .boot.leaving{
    animation:none;pointer-events:none;opacity:0;
    transition:opacity .42s var(--e-in);
  }
  .boot.gone{display:none}
  .boot.leaving .boot-stage{opacity:.35;transform:scale(1.015);filter:blur(3px);transition:all .42s var(--e-in)}
  .boot.leaving .boot-foot{opacity:0;transition:opacity .2s var(--e-in)}

  .boot-bg{position:absolute;inset:0;pointer-events:none;overflow:hidden}
  .boot-bg i{position:absolute;display:block}
  .boot-glow{
    left:50%;top:44%;width:min(92vw,1120px);height:min(72vh,720px);transform:translate(-50%,-50%);
    background:radial-gradient(closest-side,rgba(69,217,255,.16),rgba(69,217,255,.05) 54%,transparent 72%);
    filter:blur(10px);animation:bootGlow 5.2s var(--e-soft) infinite alternate;
  }
  @keyframes bootGlow{
    from{opacity:.5;transform:translate(-50%,-50%) scale(.96)}
    to{opacity:1;transform:translate(-50%,-50%) scale(1.05)}
  }
  .boot-grid{
    inset:0;
    background-image:
      linear-gradient(rgba(69,217,255,.055) 1px,transparent 1px),
      linear-gradient(90deg,rgba(69,217,255,.055) 1px,transparent 1px);
    background-size:60px 60px;
    -webkit-mask-image:radial-gradient(ellipse at 50% 46%,#000 8%,transparent 76%);
    mask-image:radial-gradient(ellipse at 50% 46%,#000 8%,transparent 76%);
    animation:bootGrid 20s linear infinite;
  }
  @keyframes bootGrid{to{background-position:60px 60px}}
  .boot-scan{
    left:0;right:0;top:-150px;height:150px;opacity:.85;
    background:linear-gradient(180deg,transparent,rgba(69,217,255,.08) 66%,rgba(69,217,255,.22) 90%,transparent);
    animation:bootScan 5.4s var(--e-soft) infinite;
  }
  @keyframes bootScan{0%{transform:translateY(0)}100%{transform:translateY(calc(100vh + 300px))}}
  .boot-vignette{
    inset:0;
    background:radial-gradient(ellipse at 50% 45%,transparent 34%,rgba(4,16,31,.78) 100%);
  }
  .boot-notch{position:absolute;width:24px;height:24px;border:1px solid rgba(69,217,255,.4);z-index:3;opacity:.85}
  .boot-notch.tl{left:22px;top:22px;border-right:0;border-bottom:0}
  .boot-notch.tr{right:22px;top:22px;border-left:0;border-bottom:0}
  .boot-notch.bl{left:22px;bottom:22px;border-right:0;border-top:0}
  .boot-notch.br{right:22px;bottom:22px;border-left:0;border-top:0}

  .boot-stage{position:relative;width:min(640px,calc(100vw - 64px));height:300px;z-index:2}
  .boot-act{
    position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;
    opacity:0;transform:translateY(10px);filter:blur(5px);pointer-events:none;
    transition:opacity .34s var(--e-out),transform .34s var(--e-out),filter .34s var(--e-out);
  }
  .boot-act.on{opacity:1;transform:none;filter:none}
  .boot-act.off{
    opacity:0;transform:translateY(-8px);filter:blur(4px);
    transition:opacity .26s var(--e-in),transform .26s var(--e-in),filter .26s var(--e-in);
  }

  .boot-mark{position:relative;width:76px;height:76px;display:grid;place-items:center;color:var(--cyan);margin-bottom:18px}
  .boot-mark svg{width:58px;height:58px;filter:drop-shadow(0 0 16px rgba(69,217,255,.45))}
  .boot-mark::before{content:"";position:absolute;inset:3px;border:1px solid rgba(69,217,255,.16);border-radius:50%}
  .boot-ring{position:absolute;inset:-10px;border:1px dashed rgba(69,217,255,.32);border-radius:50%;animation:bootSpin 9s linear infinite}
  @keyframes bootSpin{to{transform:rotate(360deg)}}
  .boot-title{
    font-size:clamp(34px,3.4vw,44px);font-weight:600;line-height:1.1;
    letter-spacing:.42em;padding-left:.42em;
    background:linear-gradient(180deg,var(--text) 28%,var(--cyan));
    -webkit-background-clip:text;background-clip:text;color:transparent;
    filter:drop-shadow(0 0 22px rgba(69,217,255,.26));
  }
  .boot-en{margin-top:11px;font-size:10.5px;letter-spacing:.5em;padding-left:.5em;color:var(--muted)}
  .boot-cn{margin-top:8px;font-size:12px;letter-spacing:.32em;padding-left:.32em;color:var(--faint)}

  .ba-panel{
    position:relative;width:100%;padding:20px 22px 18px;border-radius:3px;
    border:1px solid rgba(21,82,115,.6);
    background:linear-gradient(180deg,rgba(9,36,62,.72),rgba(4,16,31,.55));
    box-shadow:0 18px 60px rgba(0,0,0,.35),inset 0 0 30px rgba(20,110,170,.06);
    overflow:hidden;
  }
  .ba-panel::before,.ba-panel::after{content:"";position:absolute;width:14px;height:14px;border:1px solid var(--cyan);opacity:.7}
  .ba-panel::before{left:-1px;top:-1px;border-right:0;border-bottom:0}
  .ba-panel::after{right:-1px;bottom:-1px;border-left:0;border-top:0}
  .ba-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:16px}
  .ba-no{font-family:var(--mono);font-size:11px;letter-spacing:.18em;color:var(--faint)}
  .ba-tag{font-family:var(--mono);font-size:10.5px;letter-spacing:.22em;color:var(--cyan);opacity:.8}
  .ba-line{display:flex;align-items:center;gap:10px;min-height:30px}
  .ba-txt{font-size:clamp(16px,1.5vw,20px);letter-spacing:.05em;color:var(--text);white-space:nowrap}
  .ba-dots{display:flex;align-items:center;gap:3px;transition:opacity .2s var(--e-out)}
  .ba-dots i{width:3px;height:3px;border-radius:50%;background:var(--cyan);opacity:.3;animation:baDot 1.05s infinite}
  .ba-dots i:nth-child(2){animation-delay:.14s}
  .ba-dots i:nth-child(3){animation-delay:.28s}
  @keyframes baDot{0%,100%{opacity:.22;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}
  .ba-st{
    margin-left:auto;min-width:58px;text-align:right;
    font-family:var(--mono);font-size:12.5px;letter-spacing:.04em;color:var(--green);
    opacity:0;transform:scale(.86);
    transition:opacity .18s var(--e-out),transform .26s var(--e-out);
  }
  .boot-act.done .ba-dots{opacity:0}
  .boot-act.done .ba-st{opacity:1;transform:none}
  .ba-meta{margin-top:10px;font-size:11.5px;letter-spacing:.03em;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .ba-bar{margin-top:15px;height:2px;background:rgba(21,82,115,.45);overflow:hidden}
  .ba-bar i{display:block;width:0;height:100%;background:linear-gradient(90deg,var(--cyan),rgba(69,217,255,.35));transition:width .55s var(--e-out)}
  .boot-act.done .ba-bar i{width:100%}

  .ba-ready{
    display:flex;align-items:center;gap:13px;font-size:clamp(20px,2vw,26px);
    letter-spacing:.28em;padding-left:.28em;color:var(--text);
  }
  .ba-ready i{width:8px;height:8px;border-radius:50%;background:var(--green);box-shadow:0 0 14px var(--green);animation:readyPulse 1.3s var(--e-soft) infinite}
  @keyframes readyPulse{0%,100%{opacity:.35;transform:scale(.8)}50%{opacity:1;transform:scale(1.2)}}
  .boot-act[data-act="ready"] .ba-meta{text-align:center}

  .boot-foot{
    position:absolute;left:0;right:0;bottom:26px;z-index:4;
    display:flex;align-items:center;gap:14px;padding:0 clamp(22px,4vw,48px);
    font-family:var(--mono);font-size:11px;letter-spacing:.1em;color:var(--faint);
  }
  .bf-sys{white-space:nowrap}
  .bf-meter{flex:1;max-width:560px;margin-left:auto;height:1px;background:rgba(21,82,115,.55);overflow:hidden}
  .bf-meter i{display:block;width:0;height:100%;background:linear-gradient(90deg,rgba(69,217,255,.2),var(--cyan));box-shadow:0 0 8px var(--cyan);transition:width .55s var(--e-out)}
  .bf-pct{min-width:40px;text-align:right;color:var(--text-2)}
  .bf-skip{
    appearance:none;background:transparent;border:1px solid rgba(21,82,115,.55);border-radius:2px;
    color:var(--muted);font-family:inherit;font-size:11px;letter-spacing:.08em;
    padding:4px 10px;cursor:pointer;transition:.16s;
  }
  .bf-skip:hover{color:var(--text);border-color:rgba(69,217,255,.45);background:rgba(69,217,255,.08)}
  .bf-skip:focus-visible{outline:1px solid var(--cyan);outline-offset:2px}

  /* 开场结束：大屏按层落位，而不是硬切 */
  body.booted .topbar,
  body.booted .tabs,
  body.booted main:not([hidden]){animation:shellIn .8s var(--e-out) both}
  @keyframes shellIn{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}

  /* ---------------- 突发灾害 · 应急响应页 ---------------- */
  .resp-gate{
    position:fixed;inset:0;z-index:50;display:flex;flex-direction:column;overflow:hidden;
    background:
      radial-gradient(900px 640px at 24% 40%,rgba(255,107,107,.1),transparent 62%),
      radial-gradient(1100px 720px at 78% 58%,rgba(69,217,255,.06),transparent 70%),
      linear-gradient(180deg,var(--bg),rgba(4,16,31,1));
    opacity:0;transition:opacity .32s var(--e-out);
  }
  .resp-gate[hidden]{display:none}
  .resp-gate.on{opacity:1}
  .resp-gate.leaving{opacity:0;transition:opacity .3s var(--e-in)}

  .rg-bg{position:absolute;inset:0;pointer-events:none;overflow:hidden}
  .rg-bg i{position:absolute;display:block}
  .rg-glow{
    left:22%;top:46%;width:min(80vw,900px);height:min(70vh,640px);transform:translate(-50%,-50%);
    background:radial-gradient(closest-side,rgba(255,107,107,.14),rgba(255,107,107,.04) 55%,transparent 72%);
    filter:blur(12px);animation:bootGlow 6s var(--e-soft) infinite alternate;
  }
  .rg-grid{
    inset:0;
    background-image:
      linear-gradient(rgba(69,217,255,.05) 1px,transparent 1px),
      linear-gradient(90deg,rgba(69,217,255,.05) 1px,transparent 1px);
    background-size:52px 52px;
    -webkit-mask-image:radial-gradient(ellipse at 42% 50%,#000 6%,transparent 78%);
    mask-image:radial-gradient(ellipse at 42% 50%,#000 6%,transparent 78%);
  }
  .rg-scan{
    left:0;right:0;top:0;height:2px;
    background:linear-gradient(90deg,transparent,rgba(255,107,107,.55),transparent);
    box-shadow:0 0 22px rgba(255,107,107,.5);
    animation:rgScan 7s linear infinite;
  }
  @keyframes rgScan{0%{transform:translateY(-10px);opacity:0}8%{opacity:.9}92%{opacity:.9}100%{transform:translateY(100vh);opacity:0}}

  .rg-top{
    position:relative;z-index:3;flex:0 0 54px;
    display:flex;align-items:center;justify-content:space-between;gap:16px;
    padding:0 clamp(18px,3.4vw,40px);
    border-bottom:1px solid rgba(255,107,107,.18);
    background:linear-gradient(180deg,rgba(255,107,107,.06),transparent);
  }
  .rg-brand{display:flex;align-items:center;gap:10px;min-width:0;white-space:nowrap}
  .rg-brand i{width:3px;height:14px;background:var(--red);box-shadow:0 0 10px var(--red)}
  .rg-brand b{font-size:13px;font-weight:500;letter-spacing:3px;color:var(--text)}
  .rg-brand span{font-family:var(--mono);font-size:10.5px;letter-spacing:.22em;color:var(--faint)}
  .rg-top-right{display:flex;align-items:center;gap:10px;min-width:0}
  .rg-clock{font-family:var(--mono);font-size:11.5px;letter-spacing:.1em;color:var(--red);opacity:.9;white-space:nowrap}
  .rg-voice,.rg-exit{
    appearance:none;display:inline-flex;align-items:center;gap:6px;
    font-family:inherit;font-size:11.5px;letter-spacing:.06em;border-radius:2px;
    padding:5px 9px;cursor:pointer;transition:.16s;white-space:nowrap;
  }
  .rg-voice{background:rgba(69,217,255,.08);border:1px solid rgba(69,217,255,.32);color:var(--text-2)}
  .rg-voice svg{width:14px;height:14px}
  .rg-voice.on{color:var(--cyan);border-color:rgba(69,217,255,.5)}
  .rg-voice:hover{background:rgba(69,217,255,.16)}
  .rg-voice:focus-visible,.rg-exit:focus-visible{outline:1px solid var(--cyan);outline-offset:2px}
  .rg-exit{background:transparent;border:1px solid rgba(21,82,115,.55);color:var(--muted)}
  .rg-exit:hover{color:var(--text);border-color:rgba(69,217,255,.45)}
  .rg-mute{border-style:dashed}
  .rg-mute:hover{color:var(--red);border-color:rgba(255,107,107,.45)}

  .rg-main{
    position:relative;z-index:2;flex:1;min-height:0;overflow:auto;
    display:grid;grid-template-columns:minmax(0,1.18fr) minmax(0,.82fr);
    gap:clamp(24px,4vw,64px);align-items:center;
    padding:clamp(20px,3.4vh,40px) clamp(18px,5vw,72px);
  }
  .rg-brief{min-width:0}
  .rg-eyebrow{display:flex;align-items:center;gap:10px;font-size:12px;letter-spacing:.16em;color:var(--text-2)}
  .rg-pulse{width:7px;height:7px;border-radius:50%;background:var(--red);box-shadow:0 0 12px var(--red);animation:rgPulse 1.4s var(--e-soft) infinite}
  @keyframes rgPulse{0%,100%{opacity:.35;transform:scale(.8)}50%{opacity:1;transform:scale(1.25)}}
  .rg-sev{
    margin-left:4px;padding:1px 8px;border:1px solid rgba(255,107,107,.5);
    background:rgba(255,107,107,.12);color:var(--red);font-size:11px;letter-spacing:.2em;white-space:nowrap;
  }
  .rg-title{
    margin:14px 0 12px;font-size:clamp(40px,5.6vw,76px);line-height:1.06;font-weight:600;
    letter-spacing:.12em;color:var(--text);word-break:break-word;
    text-shadow:0 0 44px rgba(255,107,107,.18);
  }
  .rg-title[data-long="1"]{font-size:clamp(28px,3.6vw,50px);letter-spacing:.06em}
  .rg-title::after{
    content:"";display:block;width:68px;height:2px;margin-top:18px;
    background:linear-gradient(90deg,var(--red),rgba(255,107,107,0));
    box-shadow:0 0 14px rgba(255,107,107,.6);
  }
  .rg-lead{
    max-width:52ch;font-size:13.5px;line-height:1.9;color:var(--text-2);
    display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden;
  }
  .rg-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin:26px 0 30px;max-width:660px}
  .rg-stats div{
    padding:10px 12px;border:1px solid rgba(21,82,115,.4);border-left:2px solid rgba(255,107,107,.55);
    background:rgba(9,36,62,.55);min-width:0;
  }
  .rg-stats span{display:block;font-size:11px;letter-spacing:.08em;color:var(--muted);margin-bottom:5px;white-space:nowrap}
  .rg-stats b{display:block;font-family:var(--mono);font-size:17px;font-weight:600;color:var(--text);letter-spacing:.02em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .rg-stats b em{font-style:normal;font-size:11px;color:var(--muted);margin-left:3px;font-weight:400}
  .rg-stats b.hot{color:var(--red)}

  .rg-action{display:flex;align-items:center;gap:18px;flex-wrap:wrap}
  .rg-start{
    position:relative;appearance:none;display:inline-flex;align-items:center;gap:14px;
    height:60px;padding:0 26px;border:1px solid rgba(255,107,107,.75);border-radius:3px;
    background:linear-gradient(180deg,rgba(255,107,107,.24),rgba(255,107,107,.1));
    color:var(--text);font-family:inherit;font-size:15px;letter-spacing:.14em;cursor:pointer;
    box-shadow:0 0 0 0 rgba(255,107,107,.35),inset 0 0 24px rgba(255,107,107,.08);
    transition:background .18s,border-color .18s,transform .18s;
    animation:rgBreath 2.4s var(--e-soft) infinite;
  }
  @keyframes rgBreath{
    0%,100%{box-shadow:0 0 0 0 rgba(255,107,107,.32),inset 0 0 24px rgba(255,107,107,.06)}
    50%{box-shadow:0 0 0 12px rgba(255,107,107,0),inset 0 0 34px rgba(255,107,107,.18)}
  }
  .rg-start:hover{background:linear-gradient(180deg,rgba(255,107,107,.38),rgba(255,107,107,.2));border-color:var(--red);transform:translateY(-1px)}
  .rg-start:focus-visible{outline:2px solid var(--red);outline-offset:3px}
  .rg-start:disabled{opacity:.55;cursor:wait;animation:none}
  .rg-start-ic{
    width:0;height:0;border-left:12px solid var(--red);
    border-top:8px solid transparent;border-bottom:8px solid transparent;
    filter:drop-shadow(0 0 8px rgba(255,107,107,.8));
  }
  .rg-start kbd{
    font-family:var(--mono);font-size:10px;letter-spacing:.18em;color:var(--faint);
    border:1px solid rgba(255,107,107,.3);border-radius:2px;padding:2px 6px;
  }
  .rg-hint{font-size:11.5px;letter-spacing:.04em;color:var(--muted)}

  .rg-side{min-width:0;display:flex;flex-direction:column;align-items:center;gap:18px}
  .rg-radar{width:min(100%,320px);display:flex;flex-direction:column;gap:10px}
  .rg-radar-face{
    position:relative;aspect-ratio:1;border-radius:50%;overflow:hidden;
    border:1px solid rgba(255,107,107,.28);
    background:radial-gradient(circle at 50% 50%,rgba(255,107,107,.08),rgba(4,16,31,.2) 68%,transparent 72%);
    box-shadow:inset 0 0 60px rgba(255,107,107,.06),0 0 60px rgba(0,0,0,.35);
  }
  .rr-ring{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);border:1px solid rgba(255,107,107,.18);border-radius:50%}
  .rr-ring.r1{width:36%;height:36%}
  .rr-ring.r2{width:62%;height:62%}
  .rr-ring.r3{width:86%;height:86%}
  .rr-cross{position:absolute;background:rgba(255,107,107,.14)}
  .rr-cross.h{left:6%;right:6%;top:50%;height:1px}
  .rr-cross.v{top:6%;bottom:6%;left:50%;width:1px}
  .rr-sweep{
    position:absolute;inset:0;border-radius:50%;
    background:conic-gradient(from 0deg,transparent 0 296deg,rgba(255,107,107,.32) 342deg,rgba(255,107,107,.05) 356deg,transparent 360deg);
    animation:rrSpin 4.4s linear infinite;
  }
  @keyframes rrSpin{to{transform:rotate(360deg)}}
  .rr-blip{position:absolute;width:6px;height:6px;border-radius:50%;background:var(--red);box-shadow:0 0 10px var(--red);animation:rrBlip 2.6s var(--e-soft) infinite}
  .rr-blip.b1{left:34%;top:38%;animation-delay:.2s}
  .rr-blip.b2{left:62%;top:56%;animation-delay:1s}
  .rr-blip.b3{left:48%;top:68%;animation-delay:1.8s}
  @keyframes rrBlip{0%,100%{opacity:.25;transform:scale(.7)}12%{opacity:1;transform:scale(1.15)}40%{opacity:.2;transform:scale(.8)}}
  .rr-core{
    position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
    width:54px;height:54px;border-radius:50%;display:grid;place-items:center;
    font-family:var(--mono);font-size:20px;color:var(--red);
    border:1px solid rgba(255,107,107,.55);background:rgba(4,16,31,.82);
    box-shadow:0 0 30px rgba(255,107,107,.28),inset 0 0 18px rgba(255,107,107,.16);
  }
  .rg-radar-meta{
    display:flex;align-items:center;justify-content:space-between;gap:10px;
    padding-top:9px;border-top:1px solid rgba(21,82,115,.35);
    font-size:11.5px;color:var(--muted);
  }
  .rg-radar-meta b{font-family:var(--mono);font-size:12px;color:var(--text-2);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .rg-chain{list-style:none;width:min(100%,332px);display:flex;flex-direction:column;gap:8px}
  .rg-chain li{
    display:grid;grid-template-columns:28px minmax(0,1fr);grid-template-rows:auto auto;
    column-gap:10px;padding:8px 10px;
    border:1px solid rgba(21,82,115,.32);background:rgba(9,36,62,.5);opacity:.55;
  }
  .rg-chain li i{grid-row:1/3;align-self:center;font-style:normal;font-family:var(--mono);font-size:11px;color:var(--faint)}
  .rg-chain li b{font-size:12px;font-weight:500;color:var(--text-2)}
  .rg-chain li span{font-size:11px;color:var(--muted);line-height:1.5}
  .rg-chain li.on{opacity:1;border-color:rgba(255,107,107,.5);border-left:2px solid var(--red);background:rgba(255,107,107,.08)}
  .rg-chain li.on i{color:var(--red)}
  .rg-chain li.on b{color:var(--text)}
  .rg-demo{font-size:11px;letter-spacing:.08em;color:var(--faint)}

  .rg-foot{
    position:relative;z-index:2;flex:0 0 38px;
    display:flex;align-items:center;justify-content:space-between;gap:16px;
    padding:0 clamp(18px,3.4vw,40px);
    border-top:1px solid rgba(21,82,115,.28);
    font-family:var(--mono);font-size:10.5px;letter-spacing:.1em;color:var(--faint);
  }

  /* 入场：文案自上而下依次落位，雷达从中心展开 */
  .resp-gate.on .rg-brief > *{animation:rgIn .55s var(--e-out) both}
  .resp-gate.on .rg-brief > *:nth-child(1){animation-delay:0s}
  .resp-gate.on .rg-brief > *:nth-child(2){animation-delay:.06s}
  .resp-gate.on .rg-brief > *:nth-child(3){animation-delay:.1s}
  .resp-gate.on .rg-brief > *:nth-child(4){animation-delay:.16s}
  .resp-gate.on .rg-brief > *:nth-child(5){animation-delay:.22s}
  .resp-gate.on .rg-radar{animation:rgIn .6s .12s var(--e-out) both}
  .resp-gate.on .rg-chain{animation:rgIn .6s .2s var(--e-out) both}
  .resp-gate.on .rg-demo{animation:rgIn .6s .28s var(--e-out) both}
  @keyframes rgIn{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}

  /* ---------------- 红色告警层 ---------------- */
  .alarm-layer{
    position:fixed;inset:0;z-index:58;overflow:hidden;
    display:flex;align-items:center;justify-content:center;
    /* 必须是实底色：告警一旦响起就是全场接管，不能让下面的响应页透出来 */
    background:
      radial-gradient(1000px 760px at 50% 46%,rgba(255,107,107,.16),transparent 70%),
      var(--bg);
    opacity:0;transition:opacity .14s var(--e-out);
  }
  .alarm-layer[hidden]{display:none}
  .alarm-layer.on{opacity:1}
  .alarm-layer.out{animation:alOut .46s var(--e-in) forwards}
  @keyframes alOut{to{opacity:0;clip-path:inset(0 0 100% 0);transform:translateY(-2%)}}

  .al-flash{
    position:absolute;inset:0;pointer-events:none;opacity:0;
    background:radial-gradient(circle at 50% 46%,rgba(255,107,107,.5),rgba(255,107,107,.78) 62%,rgba(255,107,107,.9));
    filter:saturate(2) brightness(.72);
  }
  .alarm-layer.on .al-flash{animation:alStrobe .7s steps(1,end) 3 both}
  @keyframes alStrobe{0%{opacity:.82}38%{opacity:.1}46%{opacity:.74}70%{opacity:.16}100%{opacity:.34}}

  .al-vignette{
    position:absolute;inset:0;
    background:radial-gradient(ellipse at 50% 50%,transparent 28%,rgba(255,107,107,.24) 72%,rgba(4,16,31,.75) 100%);
    animation:alVignette 1.1s var(--e-soft) infinite alternate;
  }
  @keyframes alVignette{from{opacity:.5}to{opacity:1}}

  .al-stripes{
    position:absolute;left:0;right:0;height:64px;pointer-events:none;opacity:.85;
    background:repeating-linear-gradient(-45deg,rgba(255,107,107,.85) 0 14px,rgba(4,16,31,.92) 14px 28px);
    background-size:40px 40px;
  }
  .al-stripes.top{top:0;border-bottom:1px solid rgba(255,107,107,.8);animation:alStripe 1.1s linear infinite}
  .al-stripes.bottom{bottom:0;border-top:1px solid rgba(255,107,107,.8);animation:alStripe 1.1s linear infinite reverse}
  @keyframes alStripe{to{background-position:40px 0}}

  .al-sweep{
    position:absolute;top:0;bottom:0;left:-30vw;width:26vw;
    background:linear-gradient(90deg,transparent,rgba(255,107,107,.28),transparent);
    filter:blur(14px);animation:alSweep 1.25s var(--e-soft) infinite;
  }
  @keyframes alSweep{0%{transform:translateX(0);opacity:0}15%{opacity:1}100%{transform:translateX(140vw);opacity:0}}

  .al-core{position:relative;z-index:2;max-width:min(1100px,92vw);text-align:center;padding:0 24px}
  .al-badge{
    display:inline-flex;align-items:center;gap:9px;margin-bottom:22px;
    font-family:var(--mono);font-size:11px;letter-spacing:.42em;color:rgba(255,107,107,.9);
  }
  .al-badge i{width:7px;height:7px;border-radius:50%;background:var(--red);box-shadow:0 0 14px var(--red);animation:alDot .55s steps(1,end) infinite alternate}
  @keyframes alDot{from{opacity:1}to{opacity:.22}}
  .al-line{
    margin:0;font-size:clamp(26px,4.1vw,56px);line-height:1.3;font-weight:600;
    letter-spacing:.08em;color:var(--text);
    text-shadow:0 0 40px rgba(255,107,107,.55),0 0 12px rgba(223,244,255,.14);
  }
  .al-line b{color:var(--red);font-weight:600;margin-right:.15em;text-shadow:0 0 26px rgba(255,107,107,.8)}
  .alarm-layer.on .al-line{animation:alLine .5s var(--e-out) both}
  @keyframes alLine{
    from{opacity:0;transform:scale(1.08);filter:blur(6px);letter-spacing:.16em}
    to{opacity:1;transform:none;filter:none;letter-spacing:.08em}
  }
  .al-voice{margin-top:26px;display:flex;align-items:center;justify-content:center;gap:14px;font-size:13px;letter-spacing:.12em;color:var(--text-2)}
  .al-wave{display:flex;align-items:center;gap:3px;height:22px}
  .al-wave i{width:3px;height:100%;border-radius:1px;background:var(--red);opacity:.85;transform-origin:50% 50%;animation:alWave .9s var(--e-soft) infinite alternate}
  .al-wave i:nth-child(2){animation-delay:.08s}
  .al-wave i:nth-child(3){animation-delay:.16s}
  .al-wave i:nth-child(4){animation-delay:.24s}
  .al-wave i:nth-child(5){animation-delay:.32s}
  .al-wave i:nth-child(6){animation-delay:.4s}
  .al-wave i:nth-child(7){animation-delay:.48s}
  .al-wave i:nth-child(8){animation-delay:.56s}
  .al-wave i:nth-child(9){animation-delay:.64s}
  @keyframes alWave{from{transform:scaleY(.16)}to{transform:scaleY(1)}}
  .al-meta{margin-top:18px;font-family:var(--mono);font-size:12px;letter-spacing:.14em;color:var(--muted)}
  .al-progress{position:absolute;left:0;right:0;bottom:64px;height:2px;background:rgba(255,107,107,.16);overflow:hidden}
  .al-progress i{display:block;width:0;height:100%;background:var(--red);box-shadow:0 0 12px var(--red)}
  .alarm-layer.on .al-progress i{animation:alProgress 2.5s var(--e-out) forwards}
  @keyframes alProgress{to{width:100%}}

  /* 告警结束：决策区亮一下，把视线拉回要做的动作 */
  .deck:focus{outline:none}
  body.resp-lock{overflow:hidden}
  .deck.responding{border-color:rgba(255,107,107,.45);box-shadow:inset 0 0 30px rgba(255,107,107,.06)}
  .deck.responding::before{border-color:var(--red)}
  .badge.resp{
    display:inline-flex;align-items:center;gap:5px;
    color:var(--red);border-color:rgba(255,107,107,.5);background:rgba(255,107,107,.12);
  }
  .badge.resp::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--red);box-shadow:0 0 8px var(--red);animation:rgPulse 1.4s var(--e-soft) infinite}
  .badge.resp[hidden]{display:none}
  .deck.reveal{animation:deckPulse 1s var(--e-out) 1}
  @keyframes deckPulse{
    0%{box-shadow:0 0 0 0 rgba(255,107,107,.42),inset 0 0 30px rgba(255,107,107,.1)}
    100%{box-shadow:0 0 0 24px rgba(255,107,107,0),inset 0 0 30px rgba(255,107,107,.06)}
  }

  /* ---------------- 响应页 / 开场动画自适应 ---------------- */
  @media (max-width:1100px){
    .rg-main{grid-template-columns:1fr;gap:26px;align-content:start}
    .rg-side{
      display:grid;grid-template-columns:minmax(0,240px) minmax(0,1fr);
      gap:20px;align-items:center;width:100%;
    }
    .rg-radar{width:100%}
    .rg-chain{width:100%}
    .rg-demo{grid-column:1/-1}
  }
  @media (max-height:760px) and (min-width:1101px){
    .rg-main{padding-top:14px;padding-bottom:14px}
    .rg-title{font-size:clamp(34px,4.4vw,58px);margin:8px 0}
    .rg-stats{margin:16px 0 20px}
    .rg-radar{width:min(100%,250px)}
    .rg-start{height:52px}
  }
  @media (max-width:760px){
    .boot-notch{display:none}
    .boot-stage{width:calc(100vw - 32px);height:270px}
    .ba-panel{padding:16px 16px 14px}
    .ba-txt{white-space:normal;font-size:15px;line-height:1.5}
    .ba-meta{white-space:normal;line-height:1.5}
    .boot-foot{bottom:16px;gap:8px;font-size:9.5px}
    .bf-sys{display:none}

    .rg-top{flex-basis:46px;padding:0 14px}
    .rg-brand span{display:none}
    .rg-clock{display:none}
    .rg-main{padding:16px 16px 20px;gap:18px}
    .rg-title{letter-spacing:.06em}
    .rg-title::after{margin-top:12px}
    .rg-stats{grid-template-columns:1fr 1fr;margin:18px 0 20px}
    .rg-start{width:100%;justify-content:center;height:54px;font-size:14px}
    .rg-start kbd{display:none}
    .rg-hint{width:100%;text-align:center}
    .rg-side{grid-template-columns:1fr;gap:14px}
    .rg-radar{max-width:210px;margin:0 auto}
    .rg-chain,.rg-demo{display:none}
    .rg-foot{flex-basis:34px;font-size:9.5px;gap:8px}
    .rg-foot span:last-child{display:none}
    .al-stripes{height:44px}
    .al-progress{bottom:44px}
    .al-badge{font-size:10px;letter-spacing:.18em;margin-bottom:18px}
    .al-line{font-size:clamp(22px,7vw,34px);letter-spacing:.04em}
    .al-voice{margin-top:18px;font-size:11.5px;gap:10px}
    .al-meta{font-size:10.5px;line-height:1.7}
  }

  /* 动效降级：保留信息，不闪不抖 */
  @media (prefers-reduced-motion:reduce){
    .boot-bg i,.boot-ring,.ba-dots i,.ba-ready i,.rg-pulse,.rg-scan,.rg-glow,.rg-voice,
    .rr-sweep,.rr-blip,.al-badge i,.al-wave i,.al-vignette,.al-sweep,.rg-start{animation:none!important}
    .boot-act{transition-duration:.01ms}
    .boot.leaving .boot-stage{transition-duration:.01ms}
    body.booted .topbar,body.booted .tabs,body.booted main:not([hidden]){animation-duration:.01ms}
    .alarm-layer.on .al-flash{animation:none;opacity:.55}
    .alarm-layer.on .al-line{animation-duration:.01ms}
  }
