/* ═══════════════════════════════════════════════════════════════════════════════
   液态玻璃（Liquid Glass）· 工作台控件层 —— 2026-09-28
   -------------------------------------------------------------------------------
   用户指令：「你看看，工作台里面有哪些按键是可以做成液态玻璃的，包括工作台里面的
              其他内容，可以做一下」

   设计语言：**延续**本项目 2026-09-17 定下的「iOS 26 液态玻璃」语言，不另起一套 ——
     · 左侧导航栏   ui-refresh.css:1236  blur(30px) saturate(180%) + 半透明渐变 + 亮边 + 上下内高光
     · 顶部导航栏   ui-refresh.css:1413  同上配方
     · 工作台玻璃板 ui-refresh.css:1360  blur(28px) saturate(170%) + 30px 圆角
     · 话术结果卡   ui-refresh.css:1175  rgba(255,255,255,.72) + filter:url(#glass-distortion)
   那四处是**大板**；本文件把同一套配方**缩到控件尺度**（按钮 / 页签 / 档位 / 输入框 / 容器卡）。

   ⚠️ 四条硬约束（不遵守就会白做或打架，改本文件前先读）：
     ① **不依赖 backdrop-filter**。控件多数坐在**已经 blur 过**的玻璃板上，再 blur 一次
        采样到的是已模糊内容 → 只会发灰，还白付一层合成开销（`.rk-row` 有 72 个，
        一旦铺开就是 72 个合成层）。玻璃感改由四点撑起：
          半透明渐变 + 1px 亮边 + 上下内高光 + 悬浮投影。
     ② **必须用 !important**。目标在 pkg-calc.css 里多为 !important 规则；本文件在
        index.html 里**最后加载**（glow-card.css 之后），同级 !important 下后加载者胜。
     ③ **不抢 ::before / ::after**。这两个伪元素已被占用的元素：
          · .package-card   → glow-card.css 的指针聚光（光斑 + 描边环）
          · .uq-pcard       → joint-calc.css:561 的卡片高光
        对它们**只用 background / border / box-shadow**，绝不碰伪元素。
     ④ **不改可选中卡的底色**。.package-card / .uq-pcard / .upd-prod 都有 .active 语义
        （选中 = 橙底/玫红边），pkg-calc.css 里散落 11+ 条 !important 覆盖。本文件只给它们
        **加玻璃边缘**（亮边 + 内高光），底色交给既有规则 → 不会丢选中态。
        真正降为半透明的只有**纯容器卡**（无选中态）：.uq-block / .uq-card-board /
        .rf-form / .rf-summary / .uq-img-cell。

   ⚠️ 性能账：本文件**零 backdrop-filter**。全部是 background/box-shadow → 纯绘制，无合成层爆炸。

   ⛔ **职责边界（2026-09-29 补充，§2/§7 撤回的教训）**：
      本文件**只管面板内部控件**（#panel-quote / #panel-calc / #panel-ranking 里的按钮、
      页签、档位卡、输入框、容器卡）。**顶栏（.topbar 及其 .scene-tabs / .scene-tab /
      标题 / 用户区）不在职责范围内** —— 顶栏视觉归 ui-refresh.css 的「顶部导航栏常驻固定」
      与「灯管导航」两段独家负责。曾因越界改 .scene-tab 把顶栏灯管导航推翻，见 §2 注释。

   深浅两主题：**只改 token**（下面 :root / html[data-theme="dark"] 两组变量），
   其余规则自动跟随，不需要写两套。
   ═══════════════════════════════════════════════════════════════════════════════ */

/* ── 1. 玻璃 token ─────────────────────────────────────────────────────────────
   face  玻璃面：三段式渐变（上亮 → 中透 → 下回光），模拟折射的明暗变化
   edge  亮边：1px，玻璃最亮的一圈（受光边）
   hair  发丝描边：0 0 0 1px 的外描边，让玻璃在浅色底上仍有边界感
   hi/lo 上内高光 / 下内补光：玻璃厚度感的来源
   lift  悬浮投影：让玻璃「浮」在底面上，这是白底上唯一能自证的元素
   ──────────────────────────────────────────────────────────────────────────── */
:root{
  --lg-face: linear-gradient(168deg,
    rgba(255,255,255,.84) 0%, rgba(255,255,255,.48) 46%, rgba(255,255,255,.68) 100%);
  --lg-face-hover: linear-gradient(168deg,
    rgba(255,255,255,.96) 0%, rgba(255,255,255,.64) 46%, rgba(255,255,255,.84) 100%);
  --lg-card-face: linear-gradient(168deg,
    rgba(255,255,255,.72) 0%, rgba(255,255,255,.44) 46%, rgba(255,255,255,.62) 100%);
  --lg-field-face: linear-gradient(180deg,
    rgba(255,255,255,.72) 0%, rgba(255,255,255,.88) 100%);

  --lg-edge: rgba(255,255,255,.95);
  --lg-hair: rgba(148,163,184,.16);
  --lg-hi: rgba(255,255,255,1);
  --lg-lo: rgba(255,255,255,.55);
  /* 玻璃边缘的内发光：负 spread 让亮光只堆在边缘一圈（模拟边缘折射），中心不受影响 */
  --lg-rim: inset 0 0 14px -6px rgba(255,255,255,1);

  --lg-lift: 0 1px 2px rgba(31,38,135,.06), 0 8px 20px -10px rgba(31,38,135,.28);
  --lg-lift-hover: 0 2px 5px rgba(31,38,135,.09), 0 14px 30px -12px rgba(31,38,135,.36);
  --lg-lift-card: 0 1px 2px rgba(31,38,135,.04), 0 12px 30px -16px rgba(31,38,135,.30);
  --lg-sink: inset 0 2px 6px rgba(31,38,135,.12), inset 0 -1px 0 rgba(255,255,255,.55);
}

html[data-theme="dark"]{
  /* 深色：烟蓝玻璃（与侧栏/顶栏深色配方同源），必须**亮于**背景才有玻璃感 */
  --lg-face: linear-gradient(168deg,
    rgba(100,117,143,.60) 0%, rgba(40,52,72,.42) 46%, rgba(72,88,114,.52) 100%);
  --lg-face-hover: linear-gradient(168deg,
    rgba(122,140,168,.68) 0%, rgba(50,64,88,.48) 46%, rgba(88,106,134,.58) 100%);
  --lg-card-face: linear-gradient(168deg,
    rgba(72,88,114,.52) 0%, rgba(30,41,59,.38) 46%, rgba(52,66,90,.46) 100%);
  --lg-field-face: linear-gradient(180deg,
    rgba(15,23,42,.42) 0%, rgba(30,41,59,.34) 100%);

  --lg-edge: rgba(255,255,255,.17);
  --lg-hair: rgba(0,0,0,.40);
  --lg-hi: rgba(255,255,255,.22);
  --lg-lo: rgba(255,255,255,.06);
  --lg-rim: inset 0 0 14px -6px rgba(255,255,255,.55);

  --lg-lift: 0 1px 2px rgba(0,0,0,.32), 0 10px 24px -12px rgba(0,0,0,.62);
  --lg-lift-hover: 0 2px 5px rgba(0,0,0,.40), 0 16px 34px -14px rgba(0,0,0,.72);
  --lg-lift-card: 0 1px 2px rgba(0,0,0,.26), 0 14px 32px -18px rgba(0,0,0,.66);
  --lg-sink: inset 0 2px 7px rgba(0,0,0,.36), inset 0 -1px 0 rgba(255,255,255,.05);
}

/* ⚠️ 2026-09-28 实测修正（两个坑，缺一不可）：
   ① **特异性**：pkg-calc.css 里目标多为 `:is(#panel-upgrade,#panel-combo) .xxx` = (1,1,0)，
      与本文件同级。虽然本文件后加载理论上能赢，但为免再被后续新增规则翻盘，
      统一加 `html body` 前缀把特异性抬到 (1,1,2)，稳压 (1,1,0)。
   ② **必须拆成显式长属性**：原来写 `background: var(--lg-face) !important` ——
      这是**含 var() 的简写**，浏览器在解析阶段无法确定它设置了哪些长属性，
      于是**覆盖不住**同特异性的显式长属性声明。实测 `.package-tab` 未选中态被
      pkg-calc.css 规则 [17] 的 `background-image: initial !important` 按住不放，
      而 `.package-tab.active`（另一条规则显式写了 background-image）却生效 —— 就是这个原因。
      改为 `background-color` + `background-image` 两条显式长属性后即胜。 */
/* ⚠️ 2026-09-29 补第 ③ 条坑：**`html body` 前缀把它顶到了 (1,2,2)，会连 (1,2,0) 的选中态一起压掉。**
   症状：联报「补差版 / 免单版」的**选中**项在浅色下是白字压近白玻璃 —— **1:1，整块消失**
   （元素级截图 verify-output/light-jt-switch.png 已确认；深色下 `--lg-face` 是烟蓝玻璃，所以只在浅色露馅）。
   原因：`.version-btn` / `.jt-ver-btn` 漏了 `:not(.active)`（同组的 `.cat-btn` / `.package-tab` /
   `.combo-role-btn` 都写了），而 joint-calc.css 的 `#panel-joint .version-btn.active{background:…!important}`
   只有 (1,2,0) —— 权重输在「类型选择器 2 vs 0」上。
   注意：`#panel-joint` 在 DOM 里**嵌在 `#panel-calc` 内**，所以本层会作用到联报面板。
   → 玻璃层永远不要有能力压过 `.active` 配色：**新增控件一律写 `:not(.active)`**。 */
html body :is(#panel-quote, #panel-calc, #panel-ranking) :is(
  .uq-btn:not(.uq-btn-primary), .uq-copy-all, .upd-amt:not(.active), .cat-btn:not(.active),
  .package-tab:not(.active), .category-btn,
  .rf-pill, .rf-custom-price, .combo-role-btn:not(.active), .version-btn:not(.active), .jt-ver-btn:not(.active),
  .rk-acct-segbtn:not(.on), .rk-acct-reset, .rk-acct-crumbbtn:not(.on), .rk-btn:not(.primary),
  .rk-btn-full, .btn.sm, .secondary
){
  background-color: transparent !important;
  background-image: var(--lg-face) !important;
  border-color: var(--lg-edge) !important;
  box-shadow:
    0 0 0 1px var(--lg-hair),
    var(--lg-lift),
    var(--lg-rim),
    inset 0 1px 0 var(--lg-hi),
    inset 0 -1px 0 var(--lg-lo) !important;
  transition: background .16s ease, box-shadow .16s ease, transform .16s ease,
              border-color .16s ease, color .16s ease !important;
}

html body :is(#panel-quote, #panel-calc, #panel-ranking) :is(
  .uq-btn:not(.uq-btn-primary), .uq-copy-all, .upd-amt:not(.active), .cat-btn:not(.active),
  .package-tab:not(.active), .category-btn,
  .rf-pill, .rf-custom-price, .combo-role-btn:not(.active), .version-btn:not(.active), .jt-ver-btn:not(.active),
  .rk-acct-segbtn:not(.on), .rk-acct-reset, .rk-acct-crumbbtn:not(.on), .rk-btn:not(.primary),
  .rk-btn-full, .btn.sm, .secondary
):hover{
  background-image: var(--lg-face-hover) !important;
  box-shadow:
    0 0 0 1px var(--lg-hair),
    var(--lg-lift-hover),
    var(--lg-rim),
    inset 0 1px 0 var(--lg-hi),
    inset 0 -1px 0 var(--lg-lo) !important;
}

/* 按下：玻璃「沉下去」—— 外投影收掉，改成内凹阴影 */
html body :is(#panel-quote, #panel-calc, #panel-ranking) :is(
  .uq-btn, .uq-copy-all, .upd-amt, .cat-btn, .package-tab, .category-btn,
  .rf-pill, .rf-custom-price, .combo-role-btn, .version-btn, .jt-ver-btn,
  .rk-acct-segbtn, .rk-acct-reset, .rk-acct-crumbbtn, .rk-btn, .rk-btn-full,
  .btn.sm, .secondary
):active{
  transform: translateY(1px) !important;
  box-shadow: 0 0 0 1px var(--lg-hair), var(--lg-sink) !important;
}

/* ── 2. 顶栏场景页签 .scene-tab —— ⛔ 本节已整体撤回（2026-09-29） ────────────
   历史：本节曾把未选中项做成「玻璃胶囊」、选中项做成「品牌橙→玫红**实心渐变块**」。
   ⛔ 撤回原因（用户 2026-09-28 反馈「最上面这个颜色看着很奇怪，这种大红色」）：
     顶栏这一排在 liquid-glass.css 之前就已经是 ui-refresh.css 末段定义的
     **「灯管导航」(tubelight navbar)** 外观 —— 白色胶囊容器 + 未选中纯文字 +
     选中项 `rgba(225,29,72,.10)` 浅粉底 + `#be123c` 红字 + 顶部发光灯管。
     本节把选中态改成实心渐变块 = **推翻了那套设计**；且没同步 color，
     于是 `ui-refresh.css` 的 `color:#be123c` 深红字压在红渐变上
     → 对比度极低，「完整套餐」四个字基本糊进背景，整排看着又红又脏。
   现状：本节全部规则已删除，顶栏页签回到 ui-refresh.css 的灯管导航外观。
   ⚠️ 以后**不要再往 .scene-tab 上加 background / border / box-shadow** ——
      顶栏那一排（报价表 / 排行榜 / 计算器三处共用 #sceneTabs/#rankTabs/#calcTabs）
      的视觉由 ui-refresh.css「灯管导航」段（约 2619 行起）**独家负责**。
      本文件只做面板内部控件的玻璃化，顶栏不在职责范围内。 */

/* ── 3. 主操作按钮：**只叠玻璃高光，不改品牌底色** ─────────────────────────────
   品牌橙→玫红渐变是「主操作」的强调语言，改半透明会削弱层级 → 保留底色，
   加顶部受光 + 内高光 + 品牌色投影，让它变成「彩色玻璃」而非塑料块。
   覆盖对象：#up-gen-once / #up-gen-seg / #jt-gen / #cb-gen / #rf-copy /
             .uq-btn-primary / .rk-btn.primary / .combo-role-btn.active /
             .upd-amt.active / .upd-prod.active / .cat-btn.active / .package-tab.active */
html body :is(#panel-quote, #panel-calc, #panel-ranking) :is(
  .uq-btn-primary, #up-gen-once, #up-gen-seg, #jt-gen, #cb-gen, #rf-copy,
  .upd-amt.active, .cat-btn.active, .package-tab.active,
  .combo-role-btn.active, .rk-acct-segbtn.on
),
.rk-btn.primary,
.rk-acct-crumbbtn.on{
  /* ⚠️ 2026-09-28 实测修正：**这一节绝对不能写 background-image**！
     主按钮的「品牌橙→玫红」是 background-image（渐变）而非 background-color
     （`.primary` / `#up-gen-once` / `.uq-btn-primary` 都是 `background:linear-gradient(...)`）。
     原来这里用 background-image 叠一层白色高光 → **把品牌渐变整个替换掉**，
     主按钮直接变成白玻璃，主/次层级全丢（实测 `#up-gen-once` 的 backgroundColor=透明）。
     改为只用 box-shadow 的 inset 内高光表达「顶部受光」——不动背景，品牌色完整保留。
     同理第 1/2 节必须排除主按钮与选中态（`.uq-btn-primary` 带 `.uq-btn` 类会被误伤，
     `.upd-amt.active` 等选中态背景也是品牌色）。 */
  border-color: rgba(255,255,255,.34) !important;
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.48),
    inset 0 -1px 0 rgba(0,0,0,.10),
    0 8px 20px -10px rgba(225,29,72,.60) !important;
}
html body :is(#panel-quote, #panel-calc, #panel-ranking) :is(
  .uq-btn-primary, #up-gen-once, #up-gen-seg, #jt-gen, #cb-gen, #rf-copy,
  .upd-amt.active, .cat-btn.active, .package-tab.active,
  .combo-role-btn.active, .rk-acct-segbtn.on
):hover,
.rk-btn.primary:hover,
.rk-acct-crumbbtn.on:hover{
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.58),
    inset 0 -1px 0 rgba(0,0,0,.12),
    0 12px 26px -10px rgba(225,29,72,.70) !important;
}

/* ── 4. 输入控件：内凹玻璃（凹陷感 = 玻璃被按进去） ───────────────────────── */
html body :is(#panel-quote, #panel-calc, #panel-ranking) :is(
  input[type="number"], input[type="text"], input[type="search"], select, textarea
){
  background-color: transparent !important;
  background-image: var(--lg-field-face) !important;
  border-color: var(--lg-edge) !important;
  box-shadow:
    0 0 0 1px var(--lg-hair),
    var(--lg-sink) !important;
  transition: box-shadow .16s ease, border-color .16s ease, background .16s ease !important;
}
html body :is(#panel-quote, #panel-calc, #panel-ranking) :is(
  input[type="number"], input[type="text"], input[type="search"], select, textarea
):focus{
  border-color: rgba(249,115,22,.55) !important;
  box-shadow:
    0 0 0 1px var(--lg-hair),
    0 0 0 3px rgba(249,115,22,.16),
    var(--lg-sink) !important;
  outline: none !important;
}

/* ── 5. 纯容器卡 → 半透明玻璃（这是让控件玻璃「透得出东西」的前提） ─────────
   只动**没有选中态**的容器卡；有 .active 语义的卡见第 6 节。 */
html body :is(#panel-quote, #panel-calc, #panel-ranking) :is(
  .uq-block, .uq-card-board, .uq-img-cell, .uq-group,
  .rf-form, .rf-summary, .rk-acct-section, .rk-acct-tool
){
  background-color: transparent !important;
  background-image: var(--lg-card-face) !important;
  border-color: var(--lg-edge) !important;
  box-shadow:
    0 0 0 1px var(--lg-hair),
    var(--lg-lift-card),
    var(--lg-rim),
    inset 0 1px 0 var(--lg-hi),
    inset 0 -1px 0 var(--lg-lo) !important;
}

/* ── 6. 可选中卡 → **只加玻璃边缘，底色交给既有规则** ───────────────────────
   .uq-pcard（自带伪元素高光）/ .upd-prod（active=橙底）
   这两者一旦被改底色，pkg-calc.css 里 11+ 条 !important 的选中态就会失效。
   故只补「亮边 + 上内高光 + 悬浮投影」的玻璃边缘。

   ⚠️ **.package-card 已从本节移除**（2026-09-28 实测）：
     pkg-calc.css 里有 `:is(#panel-upgrade,#panel-combo) .target-package-panel .package-card`
     特异性 (1,2,0)，**高于**本节的 (1,1,2) → 玻璃边缘写上去也不生效（实测 inset=false）。
     要压过它得再堆 id，属于无意义军备竞赛；而 .package-card 本身已有 glow-card.css 的
     指针聚光 + 完整选中态，玻璃边缘的边际收益极低 → 直接不做，避免误导后来人。 */
html body :is(#panel-quote, #panel-calc, #panel-ranking) :is(.uq-pcard, .upd-prod){
  border-color: var(--lg-edge) !important;
  box-shadow:
    0 0 0 1px var(--lg-hair),
    var(--lg-lift),
    var(--lg-rim),
    inset 0 1px 0 var(--lg-hi) !important;
}

/* ── 7. 深色下的文字色跟随 —— ⛔ 本节已整体撤回（2026-09-29） ─────────────────
   本节原本**只**有 .scene-tab 的深色覆盖（把未选中项染成烟蓝玻璃胶囊、
   选中项染成实心渐变块 + 白字），随 §2 一并撤回。
   深色顶栏页签同样回到 ui-refresh.css 灯管导航段的深色规则：
     未选中 `rgba(203,213,225,.78)` ｜ 选中 `#fda4af` + `rgba(225,29,72,.18)` 浅粉底
     ｜ 灯管 `linear-gradient(90deg,#fb923c,#f43f5e)` + 玫红光晕。 */

/* ── 8. 降级与无障碍 ────────────────────────────────────────────────────────── */
@media (prefers-reduced-motion: reduce){
  html body :is(#panel-quote, #panel-calc, #panel-ranking) :is(
    .uq-btn, .uq-copy-all, .upd-amt, .cat-btn, .package-tab, .category-btn,
    .rf-pill, .rf-custom-price, .combo-role-btn, .version-btn, .jt-ver-btn,
    .rk-acct-segbtn, .rk-acct-reset, .rk-acct-crumbbtn, .rk-btn, .rk-btn-full,
    .btn.sm, .secondary
  ), html body .scene-tab{ transition: none !important; }
}
/* 高对比度偏好：退回实心底，保证可读性优先 */
@media (prefers-contrast: more){
  :root{ --lg-face: #fff; --lg-face-hover: #fff; --lg-card-face: #fff; --lg-field-face: #fff; }
  html[data-theme="dark"]{ --lg-face: #1e293b; --lg-face-hover: #334155; --lg-card-face: #1e293b; --lg-field-face: #0f172a; }
}

/* ── 9. 工作区环境光「光斑归位」：把三团看不见的光搬回首屏（2026-09-28 实测修） ──
   ⚠️ 上一版这里写的是「给 .workspace > .panel 叠一层环境光」，方向错了 ——
      实测证明：面板 rect 高 2926px，橙斑 at 4% 96% 落在 y≈2905，首屏根本看不见，
      等于什么都没做（A/B 差异只有 0.52%~4.7%，平均 ΔRGB 仅 −13）。

   真正根因（实测，不是推测）：
     ① `--ui-bg`（ui-refresh.css:1367-1383）画在 `#workspace` 上，而 `#workspace` 实测
        高 3022px —— 整页滚动，滚动容器是 **html**，不是某个内层 div（见 _env-scroll.js 输出）。
     ② CSS 径向渐变的百分比是按**元素自身高度**解析的，于是：
          蓝 at 86% 78% → y ≈ 2357        橙 at 3% 88% → y ≈ 2659
          绿 at 52% 108% → y ≈ 3264
        三团光斑**全部落在首屏（y<900）之外**；首屏工作区实际只剩
        「暖白(12% -8%) + 粉白(108% 4%) + 平底 #f5f0f2」。
     ③ 这就是「玻璃板发灰、玻璃控件看着像白卡」的**真正原因**：板背后压根没有色彩可透。
        控件层本身（§1~§8）没问题，是它背后的光不在该在的地方。

   修法两条：
     ① `background-attachment: fixed` —— 让光斑百分比按**视口**解析，且滚动时固定在视口，
        内容从光里穿过（物理上也对：光源在房间里，不是贴在内容上，滚到页面中部也有光）。
     ② 光斑重排为对角平衡：蓝=右上（数据/中性语义）、橙=左下（品牌语义）。
        橙斑中心 x 取 26%（视口 1460 → x≈380）而不是 3%，因为面板左边界在 x≈216、
        侧栏占 0~216，取 3%（x≈44）会被侧栏整块吃掉，只剩右尾巴露出来。

   为什么只覆盖 `.workspace`、不去改 `--ui-bg` token：
     直接改 token 会连带登录页 `.app`（ui-refresh.css:46）一起变色；本块只覆盖
     `body.shell-ready .workspace` 一个选择器 → 登录页 / 弹窗 / 非工作区零影响。
   特异性：浅色 (0,2,2) 压 ui-refresh.css:47 的 (0,2,0)；
          深色 (0,3,2) 与 ui-refresh.css:806 同特异性，靠**后加载**取胜（本文件是最后一个 CSS）。
   移动端：`background-attachment: fixed` 在 iOS Safari 会逐帧重绘，窄屏回退 scroll +
           像素定位，保证光斑仍落在首屏内（见 §9.1）。 */
html body.shell-ready .workspace{
  background:
    radial-gradient(1080px 620px at 90% 6%, rgba(10,132,255,.15) 0%, rgba(10,132,255,0) 62%),
    radial-gradient(1000px 580px at 26% 96%, rgba(249,115,22,.16) 0%, rgba(249,115,22,0) 62%),
    radial-gradient(1200px 600px at 12% -8%, #fff7f0 0%, rgba(255,247,240,0) 55%),
    radial-gradient(1000px 520px at 108% 4%, #fff1f2 0%, rgba(255,241,242,0) 52%),
    #f5f0f2 !important;
  background-attachment: fixed !important;
}
html[data-theme="dark"] body.shell-ready .workspace{
  background:
    radial-gradient(1080px 620px at 90% 6%, rgba(10,132,255,.20) 0%, rgba(10,132,255,0) 62%),
    radial-gradient(1000px 580px at 26% 96%, rgba(249,115,22,.18) 0%, rgba(249,115,22,0) 62%),
    radial-gradient(1100px 600px at 12% -8%, rgba(249,115,22,.10) 0%, rgba(249,115,22,0) 55%),
    radial-gradient(1000px 520px at 108% 4%, rgba(225,29,72,.10) 0%, rgba(225,29,72,0) 52%),
    #0a0f1c !important;
  background-attachment: fixed !important;
}
/* ── 9.1 窄屏回退：不用 fixed（iOS 上逐帧重绘），改用像素定位把光斑钉在首屏内 ── */
@media (max-width:768px){
  html body.shell-ready .workspace{
    background:
      radial-gradient(760px 460px at calc(100% - 40px) 88px, rgba(10,132,255,.15) 0%, rgba(10,132,255,0) 62%),
      radial-gradient(720px 440px at 80px 700px, rgba(249,115,22,.16) 0%, rgba(249,115,22,0) 62%),
      radial-gradient(900px 500px at 10% -6%, #fff7f0 0%, rgba(255,247,240,0) 55%),
      #f5f0f2 !important;
    background-attachment: scroll !important;
  }
  html[data-theme="dark"] body.shell-ready .workspace{
    background:
      radial-gradient(760px 460px at calc(100% - 40px) 88px, rgba(10,132,255,.20) 0%, rgba(10,132,255,0) 62%),
      radial-gradient(720px 440px at 80px 700px, rgba(249,115,22,.18) 0%, rgba(249,115,22,0) 62%),
      radial-gradient(900px 500px at 10% -6%, rgba(249,115,22,.10) 0%, rgba(249,115,22,0) 55%),
      #0a0f1c !important;
    background-attachment: scroll !important;
  }
}
