  /* ★ 全屏雷达扫描加载页（中心实、边缘渐隐透明；六维度作为节点散布在环上） */
  #status-card{position:fixed;inset:0;z-index:5000;overflow:hidden;isolation:isolate;background:#070c1a;contain:paint}
  #status-card.hide{display:none!important}
  .scan-layout,.scan-visual{display:contents}
  .scan-bg{position:absolute;inset:0;background:
      radial-gradient(70vw 70vh at 50% 50%,rgba(37,99,235,.20),transparent 62%),
      radial-gradient(45vw 45vh at 82% 84%,rgba(99,102,241,.16),transparent 60%),
      linear-gradient(160deg,#070c1a,#0b1226 55%,#0a1020)}
  .scan-bg::after{content:"";position:absolute;inset:0;opacity:.5;
      background-image:linear-gradient(rgba(56,120,220,.10) 1px,transparent 1px),linear-gradient(90deg,rgba(56,120,220,.10) 1px,transparent 1px);
      background-size:46px 46px;-webkit-mask-image:radial-gradient(circle at 50% 50%,#000,transparent 66%);mask-image:radial-gradient(circle at 50% 50%,#000,transparent 66%)}
  .sweep-rain{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;--scan-center-y:50%}

  /* 全屏雷达层：整层径向遮罩做“中心实心→边缘透明”渐隐 */
  .scan-radar{position:absolute;inset:0;pointer-events:none;
      -webkit-mask-image:radial-gradient(circle at 50% var(--scan-center-y,50%),#000 6%,#000 22%,rgba(0,0,0,.35) 46%,transparent 64%);
              mask-image:radial-gradient(circle at 50% var(--scan-center-y,50%),#000 6%,#000 22%,rgba(0,0,0,.35) 46%,transparent 64%)}
  .sr-cross{position:absolute;inset:0;
      background:linear-gradient(90deg,transparent calc(50% - .8px),rgba(96,165,250,.20) 50%,transparent calc(50% + .8px)),
                 linear-gradient(0deg,transparent calc(var(--scan-center-y,50%) - .8px),rgba(96,165,250,.20) var(--scan-center-y,50%),transparent calc(var(--scan-center-y,50%) + .8px))}
  .sr-sweep{position:absolute;left:50%;top:var(--scan-center-y,50%);width:180vmax;height:180vmax;transform:translate(-50%,-50%);border-radius:50%;
      background:conic-gradient(from 0deg,rgba(56,189,248,.18),rgba(56,189,248,.05) 10%,rgba(56,189,248,0) 30%);
      animation:sweep 3.6s linear infinite}
  .sr-wave{position:absolute;left:50%;top:var(--scan-center-y,50%);width:180vmin;height:180vmin;transform:translate(-50%,-50%) scale(.04);border-radius:50%;
      border:2px solid rgba(96,205,255,.78);box-shadow:0 0 18px rgba(56,189,248,.28),inset 0 0 14px rgba(56,189,248,.18);
      opacity:0;animation:sonar 3s linear infinite}
  .sr-wave.w2{animation-delay:1s} .sr-wave.w3{animation-delay:2s}
  .sr-core{position:absolute;left:50%;top:var(--scan-center-y,50%);transform:translate(-50%,-50%);width:84px;height:84px;border-radius:50%;
      display:block;overflow:hidden;background:radial-gradient(circle,#0c1730,#070d20);
      border:1.5px solid rgba(96,165,250,.6);box-shadow:0 0 40px rgba(56,189,248,.55);animation:corepulse 2s ease-in-out infinite}
  .sr-core .core-mtx{display:block;width:100%;height:100%}
  .sr-he{position:absolute;left:50%;top:var(--scan-center-y,50%);width:56px;height:56px;margin:-28px 0 0 -28px;pointer-events:none;z-index:3;color:#eafcff;transform-origin:50% 50%;filter:drop-shadow(0 0 6px rgba(120,180,255,.75));animation:heEmerge 2.6s ease-in-out infinite}
  .sr-he svg{display:block;width:100%;height:100%}
  html[data-theme=light] .sr-he{color:#1d4ed8;filter:drop-shadow(0 0 5px rgba(37,99,235,.45))}
  @keyframes heEmerge{0%{transform:scale(.05) rotate(0deg);opacity:0}12%{opacity:1}38%{transform:scale(1) rotate(0deg);opacity:1}55%{transform:scale(1) rotate(0deg);opacity:1}86%{transform:scale(1) rotate(360deg);opacity:1}95%{transform:scale(1) rotate(360deg);opacity:1}100%{transform:scale(.05) rotate(360deg);opacity:0}}
  @media(max-width:600px){.sr-he{width:44px;height:44px;margin:-22px 0 0 -22px}}

  /* 六维度节点：随机散布在环上（JS 定位 --x/--y），随后端进度点亮 */
  .scan-nodes{position:absolute;inset:0;pointer-events:none}
  .scan-node{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%) translate(var(--x,0),var(--y,0));
      display:inline-flex;align-items:center;gap:10px;white-space:nowrap;padding:9px 18px 9px 14px;border-radius:100px;
      background:linear-gradient(180deg,rgba(58,98,165,.22),rgba(16,26,50,.10));border:1px solid rgba(130,175,240,.22);
      box-shadow:0 8px 24px rgba(6,12,28,.38),0 0 20px rgba(56,189,248,.10),inset 0 1px 0 rgba(255,255,255,.10);
      -webkit-backdrop-filter:blur(8px) saturate(1.25);backdrop-filter:blur(8px) saturate(1.25);transition:background .4s,border-color .4s,box-shadow .4s}
  .scan-node .nhit{position:absolute;top:50%;left:18px;margin:-8px 0 0 -8px;width:16px;height:16px;border-radius:50%;
      border:1.5px solid rgba(125,211,252,.9);opacity:0;pointer-events:none;
      animation:ndripple var(--hdur,1.067s) ease-out infinite;animation-delay:var(--hdelay,0s)}
  .scan-node .nd{width:9px;height:9px;flex:0 0 auto;border-radius:50%;background:#8096bd;transition:.35s;
      box-shadow:0 0 0 3px rgba(128,150,189,.18);
      animation:ndhit var(--hdur,1.067s) ease-out infinite;animation-delay:var(--hdelay,0s)}
  .scan-node .nl{font-size:var(--qpp-type-detail-size,.875rem);font-weight:600;letter-spacing:1.2px;color:#d3deef;line-height:1}
  .scan-node.done{border-color:rgba(56,189,248,.34);background:linear-gradient(180deg,rgba(46,122,192,.26),rgba(16,34,64,.12));
      box-shadow:0 8px 24px rgba(6,12,28,.4),0 0 28px rgba(56,189,248,.24),inset 0 1px 0 rgba(255,255,255,.12)}
  .scan-node.done .nd{background:#38bdf8;box-shadow:0 0 0 3px rgba(56,189,248,.22),0 0 12px #38bdf8}
  .scan-node.done .nl{color:#c8ecfe}
  .scan-node.active{border-color:rgba(125,211,252,.85);background:linear-gradient(180deg,rgba(56,142,228,.44),rgba(28,58,108,.22));
      box-shadow:0 10px 30px rgba(6,12,28,.45),0 0 46px rgba(56,189,248,.4),inset 0 1px 0 rgba(255,255,255,.16)}
  .scan-node.active .nd{background:#eaf7ff;box-shadow:0 0 0 4px rgba(56,189,248,.3),0 0 16px #7dd3fc}
  .scan-node.active .nl{color:#f6fcff;text-shadow:0 0 12px rgba(125,211,252,.6)}

  /* 底部状态文案 */
  .scan-caption{position:absolute;left:0;right:0;bottom:8%;text-align:center;padding:0 24px}
  .scan-title{font-size:var(--qpp-type-page-title-size,2rem);font-weight:800;letter-spacing:3px;
      background-image:linear-gradient(90deg,#7dd3fc,#60a5fa,#a78bfa);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
  .scan-step{margin-top:12px;font-size:var(--qpp-type-detail-size,.875rem);color:#a9c4ef;font-family:var(--qpp-font-mono,monospace);min-height:22px}
  .scan-progress{width:min(420px,78vw);height:7px;margin:14px auto 0;border-radius:999px;background:rgba(128,159,210,.18);overflow:hidden;border:1px solid rgba(128,159,210,.18)}
  .scan-progress i{display:block;width:4%;height:100%;border-radius:inherit;background:linear-gradient(90deg,#38bdf8,#6366f1,#a855f7);box-shadow:0 0 16px rgba(99,102,241,.7);transition:width .55s ease}
  .scan-hint{margin-top:16px;font-size:var(--qpp-type-meta-size,.8125rem);color:#66799f;letter-spacing:var(--qpp-tracking-body,0)}
  .scan-motion-toggle{margin-top:12px;border:1px solid rgba(96,205,255,.48);background:rgba(22,78,145,.22);color:#ccecff;border-radius:9px;padding:7px 14px;cursor:pointer;font-weight:700}
  .scan-motion-toggle:hover{background:rgba(37,99,235,.34);border-color:rgba(125,211,252,.78)}
  html[data-motion=off] .sr-sweep,html[data-motion=off] .sr-wave,html[data-motion=off] .sr-core,html[data-motion=off] .sr-he,html[data-motion=off] .scan-node .nd,html[data-motion=off] .scan-node .nhit{animation:none!important}html[data-motion=off] .scan-node .nhit{display:none}
  .scan-cancel{margin-top:14px;border:1px solid rgba(248,113,113,.45);background:rgba(127,29,29,.14);color:#fca5a5;border-radius:9px;padding:7px 14px;cursor:pointer;font-weight:700}

  @keyframes sweep{to{transform:translate(-50%,-50%) rotate(360deg)}}
  @keyframes radarpulse{0%{transform:translate(-50%,-50%) scale(.6);opacity:.9}100%{transform:translate(-50%,-50%) scale(4.2);opacity:0}}
  @keyframes corepulse{0%,100%{box-shadow:0 0 30px rgba(56,189,248,.45)}50%{box-shadow:0 0 52px rgba(56,189,248,.85)}}
  @keyframes sonar{0%{transform:translate(-50%,-50%) scale(.05);opacity:0}5%{opacity:.85}55%{opacity:.5}100%{transform:translate(-50%,-50%) scale(1);opacity:0}}
  @keyframes mobileSonar{0%{transform:translate(-50%,-50%) scale(.06);opacity:.08}8%{opacity:.38}55%{opacity:.24}100%{transform:translate(-50%,-50%) scale(1);opacity:.06}}
  /* Keep the mobile core luminance constant to prevent any small-screen flash;
     the desktop pulse and all other mobile effects remain unchanged. */
  @keyframes mobileCorePulse{0%,50%,100%{box-shadow:0 0 38px rgba(56,189,248,.52)}}
  /* A restrained glyph pulse keeps the mobile brand mark alive without the
     large opacity/rotation jump that caused the old startup flash. */
  @keyframes mobileHePulse{0%,100%{transform:scale(.86);opacity:.72}50%{transform:scale(1.08);opacity:1}}
  @keyframes ndhit{0%{transform:scale(1)}8%{transform:scale(1.9);box-shadow:0 0 20px #7dd3fc,0 0 38px rgba(56,189,248,.8)}36%{transform:scale(1)}100%{transform:scale(1)}}
  @keyframes ndripple{0%{transform:scale(.5);opacity:0}9%{opacity:.8}100%{transform:scale(3.6);opacity:0}}
  @keyframes pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.45;transform:scale(.82)}}
  @media(max-width:600px){
      /* Mobile uses the same full-viewport radar geometry as desktop.  The
         former compact grid put chips in a short upper stage while the radar
         itself was fixed to the viewport, which made the glyph look too high
         and allowed the old upload card to remain visible below it. */
      #status-card{display:block;box-sizing:border-box;width:100vw;height:100dvh;min-height:100svh;overflow:hidden;padding:0;}
      .scan-layout{display:block;position:fixed;inset:0;width:100vw;height:100dvh;max-width:none;margin:0;min-width:0}
      .scan-visual{display:contents;position:static;width:auto;height:auto;max-width:none;margin:0}
      .scan-visual>.scan-radar{position:fixed;inset:0;width:100vw;height:100dvh;overflow:hidden;z-index:1;
          -webkit-mask-image:radial-gradient(circle farthest-corner at 50% var(--scan-center-y,50%),#000 0%,#000 34%,rgba(0,0,0,.46) 72%,rgba(0,0,0,.16) 100%);
                  mask-image:radial-gradient(circle farthest-corner at 50% var(--scan-center-y,50%),#000 0%,#000 34%,rgba(0,0,0,.46) 72%,rgba(0,0,0,.16) 100%)}
      .scan-visual>.sweep-rain{position:fixed;inset:0;width:100vw;height:100dvh;z-index:1}
      .scan-visual>.scan-radar .sr-sweep{background:conic-gradient(from 0deg,rgba(56,189,248,.32),rgba(56,189,248,.10) 12%,rgba(56,189,248,0) 34%)}
      .scan-visual>.scan-radar .sr-wave{width:120vmax;height:120vmax;opacity:.06;animation:mobileSonar 3.6s linear infinite}
      .scan-visual>.scan-radar .sr-wave.w2{animation-delay:1.2s}
      .scan-visual>.scan-radar .sr-wave.w3{animation-delay:2.4s}
      .scan-visual>.scan-radar .sr-core{width:84px;height:84px;top:var(--scan-center-y,47%);animation:mobileCorePulse 3s ease-in-out infinite;box-shadow:0 0 38px rgba(56,189,248,.52)}
      /* .sr-he is nested inside the 84px core; its top must be 50% of that
         core, never the viewport percentage inherited by the radar. */
      .scan-visual>.scan-radar .sr-he{width:56px;height:56px;margin:-28px 0 0 -28px;top:50%;animation:heEmerge 2.6s ease-in-out infinite}
      .scan-nodes{position:fixed;inset:0;z-index:2}
      /* Keep the same six-point ring rhythm as desktop, using viewport-safe
         anchors so narrow phones never push a chip outside the screen. */
      .scan-node{left:var(--mobile-x,50%);top:var(--mobile-y,50%);transform:translate(-50%,-50%);max-width:calc(100vw - 28px);padding:8px 12px;gap:7px;box-sizing:border-box}
      .scan-node .nl{font-size:var(--qpp-type-caption-size,.75rem);letter-spacing:.5px}
      .scan-caption{position:fixed;left:0;right:0;bottom:8%;inset-inline:0;padding:0 20px;min-width:0;transform:none;z-index:3}
      .scan-title{font-size:var(--qpp-type-title-size,1.25rem);letter-spacing:1.5px;line-height:1.5}
      .scan-step{font-size:var(--qpp-type-detail-size,.875rem)}
      .scan-hint{line-height:1.6}
      .scan-progress{max-width:420px;width:min(420px,78vw)}
      .scan-motion-toggle,.scan-cancel{font-size:var(--qpp-type-meta-size,.8125rem);padding:8px 14px}
      .scan-nodes .scan-node .nd,.scan-nodes .scan-node .nhit{animation:none!important}
      .scan-nodes .scan-node .nhit{display:none}
  }
  @keyframes mobileRadarHalo{0%,100%{transform:translate(-50%,-50%) scale(.94);opacity:.42}50%{transform:translate(-50%,-50%) scale(1.04);opacity:.78}}
  @media(prefers-reduced-motion:reduce){
      .sr-sweep,.sr-wave,.sr-core,.sr-core i,.sr-he,.scan-node .nd,.scan-node .nhit{animation:none}.scan-node .nhit{display:none}
      /* 用户明确选择后，仅为本次扫描恢复完整动效；其余页面仍遵从系统减弱动效设置。 */
      #status-card.motion-override .sr-sweep{animation:sweep 3.6s linear infinite}
      #status-card.motion-override .sr-wave{animation:sonar 3s linear infinite}
      #status-card.motion-override .sr-wave.w2{animation-delay:1s}#status-card.motion-override .sr-wave.w3{animation-delay:2s}
      #status-card.motion-override .sr-core{animation:corepulse 2s ease-in-out infinite}
      #status-card.motion-override .sr-he{animation:heEmerge 2.6s ease-in-out infinite}
      #status-card.motion-override .scan-node .nd{animation:ndhit var(--hdur,1.067s) ease-out infinite;animation-delay:var(--hdelay,0s)}
      #status-card.motion-override .scan-node .nhit{display:block;animation:ndripple var(--hdur,1.067s) ease-out infinite;animation-delay:var(--hdelay,0s)}
  }
  /* Keep the mobile waves on their low-contrast curve even when the browser
     advertises reduced motion.  The explicit data-motion=off rule above still
     wins with !important. */
  @media(max-width:600px){
      #status-card.motion-override .scan-visual>.scan-radar .sr-wave{animation:mobileSonar 3.6s linear infinite}
      #status-card.motion-override .scan-visual>.scan-radar .sr-wave.w2{animation-delay:1.2s}
      #status-card.motion-override .scan-visual>.scan-radar .sr-wave.w3{animation-delay:2.4s}
      #status-card.motion-override .scan-visual>.scan-radar .sr-core{animation:mobileCorePulse 3s ease-in-out infinite}
      #status-card.motion-override .scan-visual>.scan-radar .sr-he{top:50%;animation:heEmerge 2.6s ease-in-out infinite}
  }

  /* 浅色主题适配 */
  html[data-theme=light] .scan-bg{background:
      radial-gradient(70vw 70vh at 50% 50%,rgba(37,99,235,.10),transparent 62%),
      radial-gradient(45vw 45vh at 82% 84%,rgba(99,102,241,.08),transparent 60%),
      linear-gradient(160deg,#f3f7fd,#e9f0fb 55%,#eef3fc)}
  html[data-theme=light] .scan-bg::after{
      background-image:linear-gradient(rgba(37,99,235,.07) 1px,transparent 1px),linear-gradient(90deg,rgba(37,99,235,.07) 1px,transparent 1px)}
  html[data-theme=light] .sr-cross{background:linear-gradient(90deg,transparent calc(50% - .8px),rgba(37,99,235,.18) 50%,transparent calc(50% + .8px)),linear-gradient(0deg,transparent calc(var(--scan-center-y,50%) - .8px),rgba(37,99,235,.18) var(--scan-center-y,50%),transparent calc(var(--scan-center-y,50%) + .8px))}
  html[data-theme=light] .sr-sweep{background:conic-gradient(from 0deg,rgba(37,99,235,.15),rgba(37,99,235,.04) 10%,rgba(37,99,235,0) 30%)}
  html[data-theme=light] .sr-wave{border-color:rgba(37,99,235,.5)}
  html[data-theme=light] .scan-node .nhit{border-color:rgba(37,99,235,.6)}
  html[data-theme=light] .sr-core{background:radial-gradient(circle,#e6efff,#cfdfff);border-color:rgba(37,99,235,.5);box-shadow:0 0 30px rgba(37,99,235,.35)}
  html[data-theme=light] .scan-title{background-image:linear-gradient(90deg,#2563eb,#4f46e5,#7c3aed)}
  html[data-theme=light] .scan-step{color:#4666a8}
  html[data-theme=light] .scan-hint{color:#8394b3}
  html[data-theme=light] .scan-node{background:linear-gradient(180deg,rgba(255,255,255,.82),rgba(232,240,255,.5));border-color:rgba(37,99,235,.2);box-shadow:0 6px 18px rgba(37,99,235,.12),0 0 18px rgba(37,99,235,.06),inset 0 1px 0 rgba(255,255,255,.7)}
  html[data-theme=light] .scan-node .nd{background:#8aa0c8;box-shadow:0 0 0 3px rgba(37,99,235,.1)}
  html[data-theme=light] .scan-node .nl{color:#41598a}
  html[data-theme=light] .scan-node.done{border-color:rgba(37,99,235,.35);background:linear-gradient(180deg,rgba(235,244,255,.9),rgba(213,229,255,.55));box-shadow:0 6px 18px rgba(37,99,235,.14),0 0 24px rgba(37,99,235,.14),inset 0 1px 0 rgba(255,255,255,.7)}
  html[data-theme=light] .scan-node.done .nd{background:#2563eb;box-shadow:0 0 0 3px rgba(37,99,235,.18),0 0 8px rgba(37,99,235,.5)}
  html[data-theme=light] .scan-node.done .nl{color:#1d4ed8}
  html[data-theme=light] .scan-node.active{border-color:rgba(37,99,235,.55);background:linear-gradient(180deg,rgba(219,232,255,.95),rgba(188,212,255,.62));box-shadow:0 8px 22px rgba(37,99,235,.2),0 0 34px rgba(37,99,235,.22),inset 0 1px 0 rgba(255,255,255,.8)}
  html[data-theme=light] .scan-node.active .nd{background:#1d4ed8;box-shadow:0 0 0 4px rgba(37,99,235,.24),0 0 12px #2563eb}
  html[data-theme=light] .scan-node.active .nl{color:#0f2b57;text-shadow:0 0 10px rgba(37,99,235,.25)}


/* Restored brand artwork with truthful status and scalable controls. */
#status-card .scan-elapsed{font-size:var(--qpp-type-meta-size,.8125rem);line-height:1.5;color:var(--muted);margin:.5rem 0;font-variant-numeric:tabular-nums}
#status-card .scan-caption{max-width:100%;box-sizing:border-box}
#status-card .scan-step,#status-card .scan-title,#status-card .scan-hint{white-space:normal;overflow-wrap:anywhere}
#status-card .scan-motion-toggle,#status-card .scan-cancel{font-size:var(--qpp-type-detail-size,.875rem);font-family:var(--qpp-font-sans);white-space:normal}
/* Text enlargement keeps the original animated radar behind a flowing overlay. */
#status-card.scan-accessible{overflow-y:auto;overflow-x:hidden}
#status-card.scan-accessible .scan-layout{display:flex;flex-direction:column;min-height:100%;position:relative}
#status-card.scan-accessible .scan-nodes{position:relative;inset:auto;display:flex;flex-wrap:wrap;justify-content:center;gap:.5rem;padding:1rem;box-sizing:border-box}
#status-card.scan-accessible .scan-node{position:relative;left:auto;top:auto;transform:none;max-width:100%;white-space:normal}
#status-card.scan-accessible .scan-caption{position:relative;left:auto;right:auto;bottom:auto;transform:none;margin-top:auto;padding:2rem 1rem 1rem;z-index:3}
html[data-theme=light] #status-card .scan-motion-toggle{background:#eff6ff;color:#1d4ed8;border-color:#93c5fd}
html[data-theme=light] #status-card .scan-cancel{background:#fff1f2;color:#b91c1c;border-color:#fda4af}
