/* ══════════════════════════════════════════════════════════════════════
   换电柜平台 · 设计令牌 + 统一背景层
   ──────────────────────────────────────────────────────────────────────
   为什么要有这个文件：全站 17 个页面各写各的样式，普查下来有 **157 个不同
   的十六进制色值**，混了四套互不相干的血统（Tailwind 默认 #ef4444/#22c55e、
   Ant Design 默认 #faad14/#52c41a、商城紫、大屏青）。四套色互相打架，页面
   自然显廉价 —— 这跟"动效多不多"没关系。

   所以这里只干一件事：**把颜色和间距收成一套**。页面自己那份布局样式不用动，
   把写死的色值换成 var() 就行。改一个地方，全站跟着变。
   ══════════════════════════════════════════════════════════════════════ */

:root{
  color-scheme:dark;

  /* ── 底色梯度 ─────────────────────────────────────────────────────
     整体是一块深蓝，分四层：页面底 → 面板 → 抬起面板 → 描边。
     四层都往品牌青那个方向偏一点（不是中性灰）—— 中性灰和青色放一起会发脏。*/
  --bg-0:#04060f;        /* 页面最底，大屏用 */
  --bg-1:#060a18;        /* 页面底，后台用 */
  --surface-1:#0a1327;   /* 面板 */
  --surface-2:#0e1a33;   /* 抬起的面板 / 表头 / 悬停 */

  /* ── 品牌色 ramp（深色主题 = 青，默认）─────────────────────────────
     一条 ramp，不是一个色。深到浅各有活干：底纹 / 描边 / 主色 / 高光。
     ★ 想要半透明的品牌色（描边、光晕、悬停底），一律写
         rgb(var(--brand-rgb) / .14)
       不要写 rgba(0,210,255,.14) —— 那样换主题时它不跟着变，
       页面上会剩下一半青一半别的色，比不做主题还难看。
     ★ --brand-rgb 是空格分隔的三个数，**不是逗号**：逗号是 rgba() 的旧语法，
       rgb(var(--x) / a) 里必须是 `0 210 255` 这种写法，否则整条声明失效。*/
  --brand-rgb:0 210 255;
  --brand-900:#00323f;
  --brand-700:#0077a3;
  --brand-500:#00b8e6;
  --brand-400:#00d2ff;
  --brand-300:#7fe8ff;

  --line-1:rgb(var(--brand-rgb) / .14);   /* 常规描边 */
  --line-2:rgb(var(--brand-rgb) / .30);   /* 强调描边 / 受光边 */

  /* ── 表面 / 玻璃 / 投影 ───────────────────────────────────────────
     这一组是"整页换色"能不能成立的关键。面板底原来散在页面里写死成
     rgba(16,29,56,.88) 这种深蓝玻璃，投影写死成 rgba(0,0,0,.45) ——
     浅色主题下就是一屏黑玻璃配黑烟。收进令牌，深色给深玻璃、浅色给白玻璃。
     ★ --surf-a/--surf-b 是**面板渐变的两个端点**，不是一个整渐变 ——
       渐变定义留在选择器里写一次，主题只换端点。*/
  --surf-a:rgba(16,29,56,.88);      /* 面板渐变·上 */
  --surf-b:rgba(8,15,32,.90);       /* 面板渐变·下 */
  --glass:rgba(14,26,51,.70);       /* 按钮 / 下拉这类玻璃条 */
  --glass-soft:rgba(10,19,39,.60);  /* 输入框 / 分页 / 更淡的底 */
  --glass-strong:rgba(14,26,51,.95);/* 弹窗：必须挡住后面 */
  --side-a:#080f20; --side-b:#0a1327; --side-c:#0c1730;   /* 侧栏渐变三点 */
  --well:#0a1327;                   /* 凹槽：电池条内胆 / 行内 code */
  --sh-1:rgba(0,0,0,.28);           /* 细描影：卡片、表线 */
  --sh-2:rgba(0,0,0,.45);           /* 中：侧栏、登录卡 */
  --sh-3:rgba(0,0,0,.55);           /* 重：弹窗 */
  --grid-c:rgb(var(--brand-rgb) / .045);   /* 背景网格线 */
  --glow-1:rgb(var(--brand-rgb) / .14);    /* 光晕·主（各页自己定位置和大小）*/
  --glow-2:rgba(167,139,250,.09);          /* 光晕·副 */
  --glow-3:rgb(var(--brand-rgb) / .08);    /* 光晕·角 */

  /* ── 文字 ─────────────────────────────────────────────────────────
     四档，够用。别再从这里岔出第五档灰 —— 那正是"看着不像一套"的来源。*/
  --ink-1:#e6f1ff;       /* 标题 / 主数据 */
  --ink-2:#bcd6f5;       /* 正文 */
  --ink-3:#7a8db0;       /* 次要说明 */
  --ink-4:#5f7290;       /* 弱化 / 占位 / 空值 */

  /* ── 语义 ─────────────────────────────────────────────────────────
     全站共用这四个。新增页面请不要再出现 #22c55e / #f59e0b / #ef4444 ——
     那几个是框架默认色，和品牌青不是一套。*/
  --ok:#00e08a;
  --warn:#ffc247;
  --bad:#ff4d6d;
  --info:#4da3ff;
  --on-ok:#06231a;   /* 压在 --ok 实底上的字色：随 --ok 一起翻 */

  /* --charge / --err 是历史别名，值分别等于 --info / --bad。
     原来**只有浅色主题里定义**，青/紫/薄荷三套下引用它们的 20 处声明整条失效、
     颜色静默继承 —— 不报错，只是不对。补在这里即可，浅色块有自己的覆盖。
     想收干净的话，把 cloud-dashboard.html 里的 var(--charge)/var(--err)
     换成 var(--info)/var(--bad) 再删这两行，单独一轮做。 */
  --charge:#4da3ff;
  --err:#ff4d6d;

  /* ── 图表分类色 ───────────────────────────────────────────────────
     只在数据可视化里按角色点名使用，不要拿去当界面色。*/
  --viz-1:var(--brand-400);
  --viz-2:#ff6b9d;
  --viz-3:#a78bfa;
  --viz-4:#00e08a;

  /* ── 间距 / 圆角 ──────────────────────────────────────────────────
     4 的倍数，六档。够不成体系之前别再加档。*/
  --sp-1:4px;  --sp-2:8px;  --sp-3:12px;
  --sp-4:16px; --sp-5:24px; --sp-6:32px;
  --r-1:4px;   --r-2:6px;   --r-3:10px;

  /* ── 动效 ─────────────────────────────────────────────────────────
     产品页（干活用的后台）用 --dur，150~250ms —— 用户在任务流里，别让他等编排。
     大屏另开一套慢的，用 .bg-live 那块下面的变量。
     缓动一律 ease-out，不带过冲：弹跳是十几年前的观感。*/
  --dur-fast:150ms;
  --dur:200ms;
  --ease:cubic-bezier(.16,1,.3,1);
}

/* ══════════════════════════════════════════════════════════════════════
   主题 · html[data-theme="紫" / "薄荷" / "浅色"]
   ──────────────────────────────────────────────────────────────────────
   ★ 只覆盖 :root 里那几个**颜色**令牌，间距/圆角/动效一律不动 ——
     换主题是换皮，不是换骨。结构一动，"切了主题"就变成"换了个网站"。

   ★ 第一版之所以"只有上面一点变色"：只换了 --brand-*，而**面板底、玻璃条、
     侧栏、投影是页面里写死的深蓝**，一个都不跟着走。现在那批已经收进
     表面/玻璃/侧栏/投影/凹槽那一组令牌，所以这里的每一套都必须
     **连表面一起换**，否则就是"紫色版没做完"：紫按钮配一屏海军蓝。

   ★ 文字色（--ink-*）紫/薄荷共用 #e6f1ff：#e6f1ff 压在紫底/墨绿底上对比度
     都在 13:1 以上。浅色那套必须换成近黑 —— 白底上近白字等于没写。

   ★ 语义四色（--ok/--warn/--bad/--info）深色三套不动：红永远是"故障"，
     它不该随主题变。浅色那套**必须**压暗一档，见下面浅色块里的注释。
   ══════════════════════════════════════════════════════════════════════ */
html[data-theme="紫"]{
  --brand-rgb:167 139 250;
  --brand-900:#1e1046;
  --brand-700:#5b21b6;
  --brand-500:#8b5cf6;
  --brand-400:#a78bfa;
  --brand-300:#c4b5fd;
  --bg-0:#08041a; --bg-1:#0c0724; --surface-1:#150d38; --surface-2:#1e1250;
  --surf-a:rgba(30,18,80,.88); --surf-b:rgba(14,8,42,.90);
  --glass:rgba(26,15,68,.70); --glass-soft:rgba(18,10,50,.60); --glass-strong:rgba(26,15,68,.95);
  --side-a:#0b0620; --side-b:#120a2e; --side-c:#180e3c;
  --well:#150d38;
}
html[data-theme="薄荷"]{
  --brand-rgb:45 212 191;
  --brand-900:#03302c;
  --brand-700:#0f766e;
  --brand-500:#14b8a6;
  --brand-400:#2dd4bf;
  --brand-300:#99f6e4;
  --bg-0:#02110e; --bg-1:#04201b; --surface-1:#07302a; --surface-2:#0a3d35;
  --surf-a:rgba(10,55,48,.88); --surf-b:rgba(4,26,22,.90);
  --glass:rgba(8,45,39,.70); --glass-soft:rgba(5,32,27,.60); --glass-strong:rgba(8,45,39,.95);
  --side-a:#031512; --side-b:#062420; --side-c:#08302a;
  --well:#07302a;
}

/* ── 浅色 ────────────────────────────────────────────────────────────
   这不是"深色主题调亮一档"，是三件事得同时翻：
     ① 表面从"深玻璃"变"白玻璃"——投影也得从黑烟变成浅灰，否则白卡片
        底下压一坨黑，脏得比深色还难看。
     ② 品牌色要**压暗**。同一个 #00d2ff，当**填充**用在白底上没问题
        （配深字），当**文字色**用在白底上只有 1.9:1，等于看不见。
        所以 --brand-400 保持当填充，另把 --primary/--primary2 压到
        深青给文字用 —— 品牌色一个值干不了两件事。
     ③ 语义四色必须压暗：#00e08a / #ffc247 在白底上是 1.6:1 / 1.3:1。
        深色主题里它们只做高光，浅色主题里它们做的是**正文**。
   ★ color-scheme:light 不能省：滚动条、<select> 原生下拉、日期选择器
     这些浏览器自绘控件不吃 CSS 变量，只认这个。 */
html[data-theme="浅色"]{
  color-scheme:light;

  --brand-rgb:0 138 178;
  --brand-900:#00323f;
  --brand-700:#006c93;
  --brand-500:#0089b3;
  --brand-400:#00a5cc;   /* 只当填充用 */
  --brand-300:#4fc7e6;

  --bg-0:#e9eff7; --bg-1:#f4f7fc;
  --surface-1:#ffffff; --surface-2:#f1f6fb;

  --line-1:rgba(15,40,70,.13);
  --line-2:rgba(15,40,70,.22);

  --surf-a:rgba(255,255,255,.92); --surf-b:rgba(245,249,254,.94);
  --glass:rgba(255,255,255,.80); --glass-soft:rgba(244,248,253,.75); --glass-strong:rgba(255,255,255,.98);
  --side-a:#ffffff; --side-b:#fafcff; --side-c:#f2f7fc;
  --well:#e9eff7;
  --sh-1:rgba(15,40,70,.06); --sh-2:rgba(15,40,70,.10); --sh-3:rgba(15,40,70,.20);
  --grid-c:rgba(15,40,70,.05);
  --glow-1:rgb(var(--brand-rgb) / .07); --glow-2:rgba(167,139,250,.05); --glow-3:rgb(var(--brand-rgb) / .05);

  /* 四档灰全部按「白底 ≥4.5:1」倒推，不是凭感觉挑的：
     #0d1b2e 15.9:1 · #28405c 10.6:1 · #3f5872 7.4:1 · #5b6e86 4.8:1（对 #f4f7fc）。
     ★ --ink-4 是最容易翻车的一档 —— 深色主题里它只是"更淡的灰"，
       白底上 4.5:1 是个硬门槛，第一版给的 #7e90a8 只有 3.0:1。 */
  --ink-1:#0d1b2e;
  --ink-2:#28405c;
  --ink-3:#3f5872;
  --ink-4:#5b6e86;

  --ok:#067a4d; --warn:#8f5a00; --bad:#c9183c; --info:#1a63c4;
  --on-ok:#ffffff;
  --viz-1:#006c93; --viz-2:#c9183c; --viz-3:#6d28d9; --viz-4:#067a4d;

  /* ★ 下面这几个 cloud-dashboard.html 自己也定义了一份，而且它在本文件**之后**
     加载、选择器权重还一样（都是 :root）—— 单靠 :root 里的值是盖不掉的。
     `html[data-theme=...]` 权重更高，才能赢。这几个是"品牌色当文字用"的角色，
     白底上必须是深青。 */
  --primary:#006c93;
  --primary2:#00556f;
  --charge:#1a63c4;
  --err:#c9183c;
  --shadow:0 2px 10px rgba(15,40,70,.07);
  --shadow-lg:0 12px 40px rgba(15,40,70,.14);
}

/* ══════════════════════════════════════════════════════════════════════
   统一背景层 · .app-bg（静态）
   ──────────────────────────────────────────────────────────────────────
   任何页面套上就是同一套底：深蓝底 + 两团光晕 + 一层细网格。
   静态版，后台页面直接用 —— 干活的地方不该有东西在动。*/
.app-bg{
  background:
    radial-gradient(1100px 620px at 50% -8%,var(--glow-1),transparent 70%),
    radial-gradient(900px 520px at 8% 104%,var(--glow-2),transparent 70%),
    radial-gradient(900px 520px at 96% 100%,var(--glow-3),transparent 70%),
    var(--bg-1);
}
/* 宿主元素必须是 positioned（body 上用时补一句 position:relative 即可）——
   用 absolute 不用 fixed：fixed 在 transform 祖先里会被"就地捕获"，
   大屏的 #stage 是带 transform:scale 的，行为反而不确定。absolute 好推。*/
.app-bg::before{
  content:"";position:absolute;inset:0;pointer-events:none;z-index:0;
  background-image:
    linear-gradient(var(--grid-c) 1px,transparent 1px),
    linear-gradient(90deg,var(--grid-c) 1px,transparent 1px);
  background-size:48px 48px;
}

/* ══════════════════════════════════════════════════════════════════════
   .bg-live —— 在 .app-bg 基础上加"在动"的那两层：漂移网格 + 星点
   ──────────────────────────────────────────────────────────────────────
   ★ 只给大屏用，别往后台页面上套。
     impeccable 的 product register 把"装饰性动效"列为禁止项，原话是
     "Product loads into a task; users don't want to watch it load" ——
     在工作台上，动效是拖后腿，不是加分。

   ★ 为什么用 transform 而不是 background-position：
     背景是 1920×1080 一整块。background-position 每帧要重画整块的两层渐变，
     挂墙上的机器一天要重画几百万次；transform 平移是合成器干的活，
     画面再大也只是搬一个图层。

   ★ 前庭敏感的人看这种到处在动的屏会难受，而这一页恰好是动效最多的那页 ——
     prefers-reduced-motion 在文件末尾统一关掉，不能只做好看那一半。
   ══════════════════════════════════════════════════════════════════════ */
.bg-live::before{
  inset:-48px;                       /* 平移 48px 后边上不能漏白 */
  will-change:transform;
  animation:bg-grid 14s linear infinite;
}
@keyframes bg-grid{to{transform:translate(48px,48px)}}

/* 星点：一个 2×2 的空盒子 + 22 个 box-shadow 当点。
   background:none 是有意的 —— 盒子自己那个点在 top:-90px 的框外，不画它就不会
   在画面外露一颗。用 box-shadow 而不是 22 个 div：一个图层搬来搬去，
   比 22 个元素各自动画便宜得多。
   alternate 是防"跳帧"：单向平移走完一轮会整体弹回起点，那个回跳肉眼看得见。*/
.bg-live::after{
  content:"";position:absolute;left:0;top:-90px;width:2px;height:2px;border-radius:50%;
  background:none;pointer-events:none;z-index:0;will-change:transform;
  box-shadow:
    120px 240px 2px rgba(127,232,255,.75),  340px 470px 2px rgba(255,255,255,.45),
    610px 280px 2px rgba(167,139,250,.6),   880px 520px 2px rgba(127,232,255,.6),
   1150px 350px 2px rgba(255,255,255,.4),  1420px 560px 2px rgba(127,232,255,.7),
   1700px 290px 2px rgba(167,139,250,.55), 1860px 490px 2px rgba(255,255,255,.45),
    200px 650px 2px rgba(127,232,255,.6),   470px 790px 2px rgba(167,139,250,.5),
    760px 700px 2px rgba(255,255,255,.4),  1010px 870px 2px rgba(127,232,255,.7),
   1300px 750px 2px rgba(167,139,250,.6),  1560px 840px 2px rgba(255,255,255,.45),
   1810px 680px 2px rgba(127,232,255,.55),   90px 950px 2px rgba(167,139,250,.5),
    380px 1090px 2px rgba(255,255,255,.4),  640px 1210px 2px rgba(127,232,255,.6),
    930px 1030px 2px rgba(167,139,250,.55),1210px 1130px 2px rgba(255,255,255,.45),
   1480px 1250px 2px rgba(127,232,255,.65),1740px 990px 2px rgba(167,139,250,.5);
  animation:bg-stars 70s linear infinite alternate;
}
@keyframes bg-stars{to{transform:translate(0,90px)}}

/* ══════════════════════════════════════════════════════════════════════
   屏幕四角光带 · .stage-corners
   ──────────────────────────────────────────────────────────────────────
   参考大屏上最显眼的那一笔：四个屏幕角各有一段从角尖往外渐隐的光带 +
   一团柔光。它不承载任何信息 —— 但要的就是这个：**大屏是给人看的**，
   这点装饰让画面有"被框住"的感觉，比四边空空荡荡强得多。

   ★ 只给大屏用。后台页面套这个是纯粹的噪音。

   ★ 这个 div 必须是 position:absolute：大屏的 #stage 是 display:grid，
     普通子元素会被当成一个格子直接破坏版面，绝对定位才能脱离网格流。
     同理它自带 pointer-events:none，不挡底下任何东西。*/
.stage-corners{
  position:absolute;inset:0;pointer-events:none;z-index:1;
  background:
    /* 四团柔光：让角落"亮起来"，主要在面板之间的缝和画布留白里看得见 */
    radial-gradient(560px 400px at 0 0,rgb(var(--brand-rgb) / .15),transparent 68%),
    radial-gradient(560px 400px at 100% 0,rgb(var(--brand-rgb) / .11),transparent 68%),
    radial-gradient(560px 400px at 0 100%,rgba(167,139,250,.11),transparent 68%),
    radial-gradient(560px 400px at 100% 100%,rgb(var(--brand-rgb) / .13),transparent 68%),
    /* 八个 220px 的 L 形亮线，从角尖一路渐隐。做粗一点（3px）——
       大屏是隔着几米看的，2px 在这个距离上基本看不见。 */
    linear-gradient(90deg,var(--brand-300),transparent) 0 0/220px 3px no-repeat,
    linear-gradient(180deg,var(--brand-300),transparent) 0 0/3px 220px no-repeat,
    linear-gradient(270deg,var(--brand-300),transparent) 100% 0/220px 3px no-repeat,
    linear-gradient(180deg,var(--brand-300),transparent) 100% 0/3px 220px no-repeat,
    linear-gradient(90deg,var(--brand-300),transparent) 0 100%/220px 3px no-repeat,
    linear-gradient(0deg,var(--brand-300),transparent) 0 100%/3px 220px no-repeat,
    linear-gradient(270deg,var(--brand-300),transparent) 100% 100%/220px 3px no-repeat,
    linear-gradient(0deg,var(--brand-300),transparent) 100% 100%/3px 220px no-repeat;
}

/* ══════════════════════════════════════════════════════════════════════
   统一面板 · .app-panel
   ──────────────────────────────────────────────────────────────────────
   "高级感"缺的往往不是颜色，是**厚度**。一块纯色矩形不管配色多准都发闷。
   这里给三层光：
     ① 外圈一圈暗描边  → 把面板从背景上"抠"出来
     ② 顶边亮一点      → 受光面，一眼有立体感
     ③ 内部一层辉光    → 不是纯平色块
   ★ 注意 `border-top-color` 单独提亮那行：这是整套里最便宜、效果最明显的一笔。*/
.app-panel{
  position:relative;
  background:linear-gradient(180deg,var(--surf-a),var(--surf-b));
  border:1px solid var(--line-1);
  border-top-color:var(--line-2);
  border-radius:var(--r-2);
  box-shadow:
    0 0 0 1px var(--sh-1),
    inset 0 1px 0 rgb(var(--brand-rgb) / .10),
    inset 0 0 40px rgb(var(--brand-rgb) / .10);
}

/* ══════════════════════════════════════════════════════════════════════
   降低动效 —— 不是可选项
   ══════════════════════════════════════════════════════════════════════ */
@media (prefers-reduced-motion:reduce){
  .bg-live::before,.bg-live::after{animation:none!important}
  *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;
    transition-duration:.01ms!important;scroll-behavior:auto!important}
}
