/* ============================================================
   Avanox Markets 共享设计系统
   浅色 = Client Portal（客户端）  深色 = Back Office（后台）
   主色：正红 #D70D24（对齐 Broctagon 实测 rgb(215,13,36)）
   后台深色底：#2A2727 暖深灰 / 高亮红 #F75E70（实测取色）
   盈亏配色遵循国内习惯：涨=红 / 跌=绿

   V1.10.63 视觉对齐（参考 Broctagon 客户门户资金页实测）：
     · 页面底 = #F5F8FA + **三层品牌红径向渐变**（左上 .16 / 右下 .12 / 中心 .05）
     · 卡片 = **62% 半透明白磨砂** + 24px 圆角 + 1px rgba(0,0,0,.07) 描边
              + 内嵌 1px 白色高光边（`inset`）—— 关键是**半透明**，
                否则粉渐变被白卡挡住，整页只剩下『白底上几个白块』
     · 主按钮 = 135° 品牌红渐变 + 红色辉光
     · 关键数字 = 深灰蓝→品牌红的**渐变文字**（background-clip:text）
   所有取值为参考站 getComputedStyle 实测值，非目测估计。
   ============================================================ */

/* Sora —— 自托管字体（OFL 1.1 开源可商用，与参考站界面字体一致）
 * 来源 Google Fonts Sora v17，可变字体（单文件覆盖 400–800）。
 * ⚠️ Sora **不含中文字形** —— 中文由 --font 后续的 PingFang SC / Noto Sans SC 回退，
 *    这是西文字体项目的通行做法：拉丁字形与参考站一致，中文仍用系统字（不会糊）。 */
@font-face{font-family:'Sora';font-style:normal;font-weight:400 800;font-display:swap;
  src:url('/assets/fonts/sora/sora-latin-2.woff2') format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:'Sora';font-style:normal;font-weight:400 800;font-display:swap;
  src:url('/assets/fonts/sora/sora-latin-ext-1.woff2') format('woff2');
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF;}

:root{
  --red:#D70D24; --red-hi:#EA3B52; --red-600:#B90B1E; --red-700:#920917; --red-soft:#FCE9EB;
  --black:#1F242B; --ink:#252A31; --ink-2:#63737F; --gray:#919EAB;
  --bg:#F5F8FA; --card:#FFFFFF; --line:#E4E9EE; --chip:#EEF2F5;
  --done:#12B76A; --warn:#F79009; --info:#2E6BE6; --violet:#7A5AF8;
  --radius:12px; --radius-sm:8px;
  --shadow:0 1px 2px rgba(16,24,40,.04),0 6px 20px rgba(16,24,40,.06);
  --font:'Sora',-apple-system,BlinkMacSystemFont,"PingFang SC","Noto Sans SC","Segoe UI",Roboto,sans-serif;
  --mono:ui-monospace,Menlo,Consolas,monospace;

  /* ---- V1.10.63 参考站规格令牌 ---- */
  --radius-xl:24px;                            /* 大卡圆角（参考站 24px） */
  --card-glass:rgba(255,255,255,.62);          /* 磨砂卡底（半透明，粉渐变可透出） */
  --card-stroke:rgba(0,0,0,.07);               /* 卡描边 */
  --card-inset:rgba(255,255,255,.95);          /* 卡内嵌高光边 */
  --chip-stroke:#DFE3E8;                       /* 行动卡/磁贴描边 */
  --glass-blur:10px;
  --ink-strong:#303842;                        /* 参考站深灰蓝（数字/标题） */
  --grad-ink:linear-gradient(90deg,#303842 0%,#D70D24 120%);   /* 渐变数字 */
  --grad-cta:linear-gradient(135deg,#D70D24 0%,rgba(215,13,36,.75) 70%);
  --glow-cta:0 4px 24px rgba(215,13,36,.5);
  --tint-red-10:rgba(215,13,36,.10);           /* 圆形图标底 */
  --tint-red-12:rgba(215,13,36,.12);
  /* 整页粉渐变（三层径向：左上强 / 右下中 / 中心弱） */
  --grad-page:
    radial-gradient(80% 60% at 15% 10%, rgba(215,13,36,.16) 0px, rgba(0,0,0,0) 60%),
    radial-gradient(60% 80% at 85% 90%, rgba(215,13,36,.12) 0px, rgba(0,0,0,0) 60%),
    radial-gradient(50% 50%, rgba(215,13,36,.05) 0px, rgba(0,0,0,0) 70%);
}
body.dark{
  --bg:#2A2727; --card:#343031; --line:#454142; --chip:#3C3839;
  --ink:#F7F4F4; --ink-2:#C2BFBF; --gray:#969394;
  --red:#F75E70; --red-hi:#F98A98; --red-600:#E04A5D; --red-soft:#45262B;
  --shadow:0 1px 2px rgba(0,0,0,.4),0 8px 24px rgba(0,0,0,.35);
  /* 深色下同样保留体系：磨砂卡改为半透明深色，渐变改用亮粉红（#F75E70） */
  --card-glass:rgba(52,48,49,.72);
  --card-stroke:rgba(255,255,255,.08);
  --card-inset:rgba(255,255,255,.07);
  --chip-stroke:rgba(255,255,255,.12);
  --ink-strong:#F7F4F4;
  --grad-ink:linear-gradient(90deg,#F7F4F4 0%,#F75E70 120%);
  --grad-cta:linear-gradient(135deg,#F75E70 0%,rgba(247,94,112,.75) 70%);
  --glow-cta:0 4px 24px rgba(247,94,112,.42);
  --tint-red-10:rgba(247,94,112,.14);
  --tint-red-12:rgba(247,94,112,.16);
  --grad-page:
    radial-gradient(80% 60% at 15% 10%, rgba(247,94,112,.18) 0px, rgba(0,0,0,0) 60%),
    radial-gradient(60% 80% at 85% 90%, rgba(247,94,112,.13) 0px, rgba(0,0,0,0) 60%),
    radial-gradient(50% 50%, rgba(247,94,112,.06) 0px, rgba(0,0,0,0) 70%);
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
/* V1.10.63：整页粉渐变（`fixed` = 视口固定，滚动时渐变不跟着跑 —— 参考站 .q-layout 铺满视口的效果） */
body{font-family:var(--font);background-color:var(--bg);background-image:var(--grad-page);background-attachment:fixed;background-repeat:no-repeat;color:var(--ink);font-size:14px;line-height:1.55;-webkit-font-smoothing:antialiased}
a{color:inherit;text-decoration:none}
button,input,select,textarea{font-family:inherit;font-size:14px;color:inherit}
::-webkit-scrollbar{width:8px;height:8px}
::-webkit-scrollbar-thumb{background:var(--line);border-radius:8px}

/* ---------- 登录页 ---------- */
.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(900px 500px at 20% 10%,#47060F 0%,#1C0306 45%,#100E0F 100%);padding:24px}
.login-card{width:100%;max-width:420px;background:var(--card);border-radius:18px;padding:34px 32px;box-shadow:0 24px 60px rgba(0,0,0,.45)}
.login-card .logo{display:block;width:220px;height:auto;margin:0 auto 6px}
/* V1.10.26 登录卡片品牌字样：`#lg-title` 会被「当前登录方式」占用，
 * 品牌名单独一行常驻（运营在后台改「品牌设置 → 登录页品牌字样」即刻生效） */
.login-card .lg-brand{text-align:center;font-weight:700;font-size:15px;letter-spacing:.3px;color:var(--red);margin:2px 0 2px}
/* V1.10.64：原先此处有 `body.dark .login-card{background:#343031}` —— 与 `--card` 在
   深色下的取值完全相同，属冗余；客户端登录卡改用 --card-glass 后一并删除。 */
.login-card h1{font-size:20px;text-align:center;margin:14px 0 4px}
.login-card .sub{text-align:center;color:var(--gray);font-size:12.5px;margin-bottom:22px}
.login-card .demo-tip{background:var(--chip);border-radius:10px;padding:10px 12px;font-size:12px;color:var(--ink-2);margin-top:16px;line-height:1.7}
.login-card .demo-tip b{color:var(--red)}
/* V1.10.47 经营主体披露（合规）：客户须能看出在与哪个法人签约。
 * 登录页页脚与侧栏底部各一处 —— 登录前、登录后都能看到。 */
.legal-foot{max-width:420px;margin:14px auto 0;text-align:center;font-size:11.5px;line-height:1.6;color:var(--gray);opacity:.9;word-break:break-word}
.legal-line{margin-top:8px;padding-top:8px;border-top:1px solid var(--line);font-size:11px;line-height:1.55;opacity:.62;word-break:break-word}
/* 后台页脚（内容区底部，低调一行） */
.legal-foot-adm{padding:14px 20px 18px;text-align:center;font-size:11.5px;line-height:1.6;color:var(--gray);opacity:.66;word-break:break-word}
.login-links{display:flex;justify-content:space-between;font-size:12.5px;margin-top:14px;color:var(--ink-2)}
/* V1.10.43 登录页底部 App 下载栏
 * 放在登录卡片之下、同一列居中容器内（.login-wrap 是横向 flex，所以这里再包一层纵向容器）。
 * 浅色主题是白卡，深色主题（body.dark）用深底 —— 两端都在登录页会被看到，必须都适配。 */
.dl-shell{width:100%;max-width:420px}
.dl-bar{margin-top:14px;background:var(--card);border-radius:14px;padding:14px 16px 15px;
  box-shadow:0 14px 34px rgba(0,0,0,.3)}
.dl-bar-t{font-size:13px;font-weight:650;display:flex;align-items:center;gap:6px}
.dl-bar-t .mi-18{font-size:17px;color:var(--red)}
.dl-bar-sub{font-size:11.5px;color:var(--gray);margin:3px 0 10px}
.dl-items{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.dl-item{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;
  padding:11px 4px;border-radius:10px;border:1px solid var(--line);background:var(--chip);
  cursor:pointer;font:inherit;font-size:11.5px;color:var(--ink);transition:border-color .15s,color .15s}
.dl-item:hover:not([disabled]){border-color:var(--red);color:var(--red)}
.dl-item[disabled]{opacity:.42;cursor:not-allowed}
.dl-item .mi{font-size:21px}
.dl-item .sz{font-size:10.5px;color:var(--gray)}
.dl-bar-note{font-size:11px;color:var(--gray);margin-top:9px;line-height:1.65}
@media(max-width:400px){.dl-bar{padding:12px}.dl-item{padding:9px 2px}}
/* V1.10.0 登录方式切换（用户可选：密码 / 认证器动态码 / 刷脸 / 邮箱验证码） */
.lg-tabs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-bottom:6px}
.lg-tab{display:flex;align-items:center;justify-content:center;gap:6px;padding:10px 8px;border:1.5px solid var(--line);
  border-radius:10px;background:var(--card);color:var(--ink-2);font-size:12.5px;font-weight:600;cursor:pointer;
  transition:.15s;font-family:inherit;min-width:0}
.lg-tab .material-icons{font-size:17px}
.lg-tab:hover{border-color:var(--gray);color:var(--ink)}
.lg-tab.on{border-color:var(--red);background:var(--red-soft);color:var(--red-600)}
body.dark .lg-tab.on{color:var(--red-hi)}
.lg-tab-hint{font-size:11.5px;color:var(--gray);line-height:1.65;margin:0 0 14px;min-height:32px}
#lg-body-pass,#lg-body-face,#lg-body-email{margin-bottom:2px}

/* ══ V1.10.64 客户端登录页重设计 ═══════════════════════════════════════════
   ① 背景：深红黑 → **与内页同一套粉渐变**。用 `var(--grad-page)` 而非复制字面量 ——
      内页调整渐变时登录页自动跟随，不会各存一份、日后改一处漏一处。
   ② 卡片：不透明白 → 与内页一致的**磨砂玻璃**（--card-glass / --radius-xl / 内嵌高光）。
   ③ 桌面端卡片锁定 **9:16 竖版**（420×746.7）。
      这里用 `min-height` 而**不是** `aspect-ratio`：aspect-ratio 在内容更高时不会撑高盒子，
      内容会直接溢出；而「注册」与「双因子」两个视图的内容远高于 747px，必须能自然长高。
      ≥821px 断点下卡片宽度恒等于 max-width 420px，故 min-height 严格等于 9:16。

   ⚠️ 全部以 `body.client` 限定作用域 —— `.login-wrap`/`.login-card` 与后台（body.admin）
      和开发日记共用，后台只覆盖了背景/圆角/阴影，**不会覆盖 display / min-height**，
      不限定就会把后台登录页一起改成 9:16 竖版。 */
body.client .login-wrap{
  background-color:var(--bg);
  background-image:var(--grad-page);
  background-attachment:fixed;background-repeat:no-repeat;
  padding:32px 24px 40px;
}
body.client .login-card{
  background:var(--card-glass);
  border:1px solid var(--card-stroke);
  border-radius:var(--radius-xl);
  box-shadow:inset 0 1px 0 0 var(--card-inset),0 12px 40px rgba(16,24,40,.07);
  backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
  padding:36px 34px 30px;
  display:flex;flex-direction:column;
}
@media(min-width:821px){
  body.client .login-card{min-height:calc(420px * 16 / 9)}   /* 9:16 竖版 */
}
/* 头图区 / 表单区分层：9:16 多出来的高度全部转成留白，表单在「选项卡+提示」与「底部链接」之间垂直居中 */
body.client .login-card .lg-head{flex:none;text-align:center}
body.client .login-card .lg-body{flex:1;display:flex;flex-direction:column}
body.client .login-card #lg-ways{flex:1;display:flex;flex-direction:column}
body.client .login-card #lg-body-pass,
body.client .login-card #lg-body-face,
body.client .login-card #lg-body-email,
body.client .login-card #lg-mfa{margin-block:auto}
body.client .login-card .lg-brand{margin-top:6px}
body.client .login-card .lg-head .sub{margin-bottom:26px}
/* 磨砂卡内的选项卡：不透明白会像贴了补丁，改半透明 */
body.client .lg-tab{background:rgba(255,255,255,.5)}
body.client .lg-tab.on{background:var(--red-soft)}
body.dark.client .lg-tab{background:rgba(255,255,255,.06)}
body.dark.client .lg-tab.on{background:rgba(247,94,112,.16)}
/* App 下载栏：与登录卡同材质，不再单独一块不透明白 */
body.client .dl-bar{
  background:var(--card-glass);border:1px solid var(--card-stroke);border-radius:var(--radius-xl);
  box-shadow:inset 0 1px 0 0 var(--card-inset);
  backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
}
body.client .legal-foot{opacity:.95}

/* ---------- 布局 ---------- */
.app{display:flex;min-height:100vh}
.sidebar{width:236px;flex:none;background:var(--card-glass);border-right:1px solid var(--card-stroke);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);display:flex;flex-direction:column;position:sticky;top:0;height:100vh;overflow-y:auto}
.sidebar .brand{padding:18px 18px 14px;border-bottom:1px solid var(--line)}
/*
 * 品牌标识（V1.10.47 品牌改造）：
 *   旧 logo 是 JPEG（白底 + 深色字），所以浅色底靠 `mix-blend-mode:multiply` 消白底、
 *   深色底靠 `filter:invert(1)` 把深字反成白字 —— 但 invert 会把**品牌红也反成青色**。
 *   现在改为 SVG（**背景透明**），两种技巧都不再需要：
 *     · 浅色主题 → /assets/logo.svg      （深色字标 + 品牌红标记）
 *     · 后台     → /assets/logo-dark.svg （白色字标 + 品牌红标记，保留品牌色）
 *       （后台 <body class="dark admin"> 固定深色，直接用深色版，不套 filter）
 *     · 门户深色模式（可选切换，非 admin）→ 用白剪影，避免 invert 产生的青色错色
 */
.sidebar .brand img{width:100%;max-width:180px;height:auto;display:block}
/* V1.10.62 侧栏品牌区重排：
   logo 图本身已含「AVANOX MARKETS」字标 → 原先下方重复的一行品牌名去掉；
   域名由「只读小字」改为可点击的**官网**入口（与生成链接用的 DOMAIN() 是两码事，见 portal.js 的 SITE_URL）。*/
.sidebar .brand .brand-lockup{display:block}
.sidebar .brand .brand-site{display:flex;align-items:center;gap:5px;margin-top:9px;padding:5px 9px;border-radius:8px;background:var(--chip);color:var(--ink-2);font-size:11px;font-weight:600;letter-spacing:.1px;transition:background .18s ease,color .18s ease}
.sidebar .brand .brand-site:hover{background:var(--red-soft);color:var(--red)}
.sidebar .brand .brand-site .material-icons{font-size:13px;flex:none;opacity:.7}
.sidebar .brand .brand-site span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
body.dark:not(.admin) .sidebar .brand img{filter:brightness(0) invert(1) brightness(1.15)}
body.dark:not(.admin) .login-card .logo{filter:brightness(0) invert(1) brightness(1.15)}
.sidebar nav{padding:10px 10px 24px;flex:1}
.nav-group{margin-bottom:2px}
.nav-item{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:10px;color:var(--ink-2);cursor:pointer;font-size:13.5px;position:relative;user-select:none}
.nav-item .ic{width:18px;text-align:center;font-size:15px;flex:none;opacity:.9}
.nav-item:hover{background:var(--chip);color:var(--ink)}
.nav-item.active{background:linear-gradient(90deg,var(--red) 0%,var(--red-hi) 100%);color:#fff;font-weight:600;box-shadow:0 6px 16px rgba(215,13,36,.28)}
body.dark .nav-item.active{background:rgba(247,94,112,.14);color:var(--red);box-shadow:none}
.nav-item .arrow{margin-left:auto;font-size:11px;opacity:.6}
.nav-sub{max-height:0;overflow:hidden;transition:max-height .22s ease}
.nav-sub.open{max-height:520px}
.nav-sub a{display:block;padding:7px 12px 7px 40px;font-size:13px;color:var(--gray);border-radius:8px}
.nav-sub a:hover{background:var(--chip);color:var(--ink)}
.nav-sub a.active{color:var(--red);font-weight:600;background:var(--red-soft)}
/* V1.10.76 「帮助与客服」收进 5 个模块后新增一层：子分组标题 + 更深缩进的子项 + 子项标签。
   ⚠️ 标签用 currentColor 做**描边**而不是填色：这样它自动跟随链接色（常态灰 / 选中红），
      深浅两套主题都不用各写一遍；填色方案在选中态的浅红底上会糊成一片、看不清字。 */
.nav-subgrp{padding:9px 12px 2px 40px;font-size:11px;font-weight:600;letter-spacing:.4px;color:var(--gray)}
.nav-sub a[data-sub]{padding-left:52px;font-size:12.5px}
.nav-sub a .nl-tag{margin-left:7px;font-size:10px;padding:0 5px;border-radius:6px;border:1px solid currentColor;opacity:.72;line-height:1.7}
.main{flex:1;min-width:0;display:flex;flex-direction:column}
.topbar{min-height:58px;background:var(--card-glass);border-bottom:1px solid var(--card-stroke);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);display:flex;align-items:center;flex-wrap:wrap;gap:14px;padding:8px 20px;position:sticky;top:0;z-index:30;row-gap:6px}
.topbar .breadcrumb{font-size:14px;font-weight:600}
.topbar .right{margin-left:auto;display:flex;align-items:center;gap:14px}
/* More 下拉：锚定到**整条顶栏**的底部，而不是锚定到 More 按钮自己。
   ⚠️ 原来锚定按钮（top:40px）+ 窄屏顶栏换行时，下拉会压住第二行的顶栏图标 ——
   实测「More 打开状态下点齿轮没反应」（点击被下拉吞掉）。锚定 .topbar 后两种布局都不重叠。 */
.more-dd{position:absolute;top:calc(100% + 6px);right:20px;z-index:60;margin:0;padding:8px;min-width:210px;max-height:70vh;overflow:auto}
.icon-btn{width:34px;height:34px;border-radius:9px;border:1px solid var(--line);background:transparent;display:grid;place-items:center;cursor:pointer;font-size:15px;position:relative}
.icon-btn:hover{background:var(--chip)}
.dot{position:absolute;top:-5px;right:-6px;background:var(--red);color:#fff;font-size:10px;border-radius:20px;padding:1px 6px;font-weight:700;line-height:1.5}
.avatar{width:32px;height:32px;border-radius:50%;background:var(--red);color:#fff;display:grid;place-items:center;font-weight:700;font-size:13px;cursor:pointer;border:0;padding:0;box-sizing:border-box}
.content{padding:20px 22px 60px;max-width:1500px;width:100%}
.notice-bar{background:#FFF7E6;border-bottom:1px solid #FCE7BC;color:#8A5A00;font-size:12.5px;padding:8px 20px;display:flex;gap:8px;align-items:center}
body.dark .notice-bar{background:#3A2A08;border-color:#5A4010;color:#F5C86A}

/* ---------- 卡片 / 网格 ---------- */
/* V1.10.63 磨砂卡：62% 半透明白 + 24px 圆角 + 内嵌白色高光边（参考站 .q-card 实测规格）
   半透明是关键 —— 不透明白卡会把整页粉渐变完全遮住，只剩『白底 + 白块』。 */
.card{background:var(--card-glass);border:1px solid var(--card-stroke);border-radius:var(--radius-xl);box-shadow:inset 0 1px 0 0 var(--card-inset);padding:20px;margin-bottom:16px;backdrop-filter:blur(var(--glass-blur));-webkit-backdrop-filter:blur(var(--glass-blur))}
.card.tight{padding:14px}
/* ⚠️ V1.10.29：**通用** .card-h 必须允许换行。
 * 工具行（多下拉 + 输入 + 按钮）在 390px 下不会换行 → 直接撑出 document 级横向溢出。
 * 此前只在两个局部容器上打过补丁（.quant-main / #secw-body），
 * 于是 leads / clients / approval 等页照旧溢出 —— 同型缺陷修局部不修全局 = 漏网。
 * 桌面端宽度足够时 flex-wrap 不会触发换行，行为不变。 */
.card-h{display:flex;align-items:center;gap:10px;margin-bottom:14px;flex-wrap:wrap;row-gap:9px}
.card-h h3{font-size:15px;font-weight:650;min-width:0}
.card-h .right{margin-left:auto;display:flex;gap:8px;align-items:center;flex-wrap:wrap;row-gap:8px;min-width:0;max-width:100%}
.card-h select,.card-h input,.card-h .btn{max-width:100%}
.grid{display:grid;gap:14px}
.g2{grid-template-columns:repeat(2,minmax(0,1fr))}
.g3{grid-template-columns:repeat(3,minmax(0,1fr))}
.g4{grid-template-columns:repeat(4,minmax(0,1fr))}
.g5{grid-template-columns:repeat(5,minmax(0,1fr))}
@media(max-width:1180px){.g4,.g5{grid-template-columns:repeat(2,minmax(0,1fr))}.g3{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:820px){.g2,.g3,.g4,.g5{grid-template-columns:minmax(0,1fr)}.sidebar{display:none}}
/* 移动端栅格必须用 minmax(0,1fr)：1fr 的最小尺寸为 auto，宽表格/长串会把栅格撑爆 → 页面横向溢出 */
.g2>*, .g3>*, .g4>*, .g5>*{min-width:0}
.kpi{background:var(--card-glass);border:1px solid var(--card-stroke);border-radius:var(--radius-xl);padding:16px 18px;box-shadow:inset 0 1px 0 0 var(--card-inset);backdrop-filter:blur(var(--glass-blur));-webkit-backdrop-filter:blur(var(--glass-blur))}
.kpi .lbl{font-size:12px;color:var(--gray);display:flex;align-items:center;gap:6px}
.kpi .val{font-size:22px;font-weight:700;margin-top:6px;letter-spacing:-.4px;font-variant-numeric:tabular-nums}
.kpi .sub{font-size:11.5px;color:var(--gray);margin-top:4px}
.kpi.accent{border-left:3px solid var(--red)}

/* ---------- V1.10.63 资金页组件（取值全部来自参考站 getComputedStyle 实测） ---------- */
/* 区块小标题：11px/600 + 1.1px 字距（参考站 .dash-section-label 的大写间距感） */
.dash-label{font-size:11px;font-weight:600;letter-spacing:1.1px;color:var(--ink-2)}
/* 渐变数字：深灰蓝 → 品牌红（参考站 .funds-balance-overview__hero 实测）
   ⚠️ 必须三件套齐全：background-clip:text + color:transparent + -webkit-text-fill-color，
   少任一在部分浏览器会退化成实心黑字（-webkit-text-fill-color 是 Safari/WebKit 的关键项）。 */
.grad-num{background:var(--grad-ink);-webkit-background-clip:text;background-clip:text;color:transparent;-webkit-text-fill-color:transparent;font-weight:700;font-variant-numeric:tabular-nums;letter-spacing:-.1px}
/* 行动卡（.act-card--featured = 参考站入金卡：红渐变 + 红色辉光） */
.act-card{display:flex;align-items:center;gap:16px;padding:20px 24px;border-radius:var(--radius-xl);border:1px solid var(--chip-stroke);cursor:pointer;transition:border-color .18s ease,background .18s ease;background:transparent;color:inherit;text-decoration:none;min-height:85px}
.act-card:hover{border-color:var(--red);background:var(--tint-red-10)}
.act-card--featured{background:var(--grad-cta);border-color:transparent;box-shadow:var(--glow-cta);color:#fff}
.act-card--featured:hover{filter:brightness(1.06);background:var(--grad-cta)}
.act-card__icon{width:44px;height:44px;border-radius:14px;display:flex;align-items:center;justify-content:center;background:var(--tint-red-12);color:var(--red);flex:none}
.act-card--featured .act-card__icon{background:rgba(255,255,255,.2);color:#fff}
.act-card__body{min-width:0;flex:1}
.act-card__label{display:block;font-size:15px;font-weight:500;color:var(--ink-strong)}
.act-card--featured .act-card__label{font-weight:700;color:#fff}
.act-card__sub{display:block;font-size:11px;color:var(--gray);margin-top:2px}
.act-card--featured .act-card__sub{color:rgba(255,255,255,.75)}
/* 快捷磁贴（参考站 .funds-shortcuts__tile：140×135 / 24px 圆角 / 红色 10% 圆形图标底） */
.tile{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:14px 8px;border:1px solid var(--chip-stroke);border-radius:var(--radius-xl);text-decoration:none;color:inherit;transition:border-color .18s ease,background .18s ease;text-align:center}
.tile:hover{border-color:var(--red);background:var(--tint-red-10)}
.tile__icon{width:36px;height:36px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:var(--tint-red-10);color:var(--red);flex:none}
.tile__label{display:block;font-size:12px;font-weight:500;color:var(--ink-2)}
/* 胶囊分段器（参考站 7天/14天/30天 切换） */
.seg{display:inline-flex;border:1px solid var(--chip-stroke);border-radius:100px;padding:2px;gap:2px}
.seg button{border:none;background:transparent;padding:4px 12px;font-size:11px;font-weight:500;color:var(--ink-2);cursor:pointer;border-radius:100px;transition:.15s}
.seg button:hover{color:var(--red)}
.seg button.on{color:var(--red);background:var(--tint-red-10);font-weight:600}
/* 涨跌徽标（沿用本项目「涨=红 / 跌=绿」约定，不照搬参考站的绿=涨） */
.delta{display:inline-flex;align-items:center;gap:2px;border-radius:100px;padding:3px 10px;font-size:11.2px;font-weight:600}
.delta--up{background:rgba(215,13,36,.12);color:var(--red);box-shadow:0 0 12px rgba(215,13,36,.28)}
.delta--down{background:rgba(18,183,106,.14);color:var(--done);box-shadow:0 0 12px rgba(18,183,106,.28)}
body.dark .delta--up{background:rgba(247,94,112,.16);box-shadow:0 0 12px rgba(247,94,112,.26)}
/* 钱包/交易账户占比条 */
.ratio{display:flex;height:8px;border-radius:100px;overflow:hidden;background:var(--chip);margin:10px 0 8px}
.ratio i{display:block;height:100%;transition:width .3s ease}
.ratio i.r1{background:var(--grad-cta)}
.ratio i.r2{background:var(--ink-strong);opacity:.22}
/* 余额主卡（参考站 696×314 的双栏：左数字 + 右侧占比图例） */
.bal-card{display:flex;gap:24px;flex-wrap:wrap}
.bal-card__main{flex:1 1 300px;min-width:0}
.bal-card__side{flex:1 1 300px;min-width:0}
/* 资金总览两栏（参考站：左余额主卡 1.55 份 / 右行动区 1 份） */
.split-2{display:grid;grid-template-columns:minmax(0,1.55fr) minmax(0,1fr);gap:16px;align-items:start}
.split-2>*{min-width:0}
@media(max-width:1100px){.split-2{grid-template-columns:minmax(0,1fr)}}
/* 粉调卡片 / 首页 hero：替代原先硬编码的 `#FFF8F9` / `#fff→#FFF3F4` 白底 ——
   那些不透明白会把整页粉渐变完全挡住，与新的磨砂体系冲突（V1.10.63 统一清理）。 */
/* 轻量块（钱包币种 / 汇率快照）：实底 --chip，与磨砂主卡形成层次。
   不用 .card —— 91 个半透明卡层层叠加会糊成一片。 */
.wcard{background:var(--chip);border-radius:14px;padding:12px;display:flex;align-items:center;gap:10px}
/* V1.10.65 币种图标：法币 = 国旗（30×22，4:3 不变形、不裁剪）；加密 = 同轮廓的字母徽标。
   两者轮廓一致（同宽高同圆角），一行排开时视觉整齐；内描边让浅色国旗（如日本）在白底上也有边界。 */
.ccy-ic{width:30px;height:22px;border-radius:5px;flex:none;object-fit:cover;display:block;
  box-shadow:inset 0 0 0 1px rgba(0,0,0,.10)}
.ccy-ic--coin{display:flex;align-items:center;justify-content:center;
  background:linear-gradient(135deg,#525E70,#333C49);color:#fff;
  font-size:11px;font-weight:700;line-height:1;letter-spacing:0;user-select:none}
body.dark .ccy-ic{box-shadow:inset 0 0 0 1px rgba(255,255,255,.14)}

/* ---------- V1.10.66 客户端下载页（四平台卡片） ---------- */
/* 顶部品牌区：左文右码。窄屏自动堆叠（flex-wrap）。 */
.dl-hero{display:flex;gap:22px;align-items:center;flex-wrap:wrap}
.dl-hero-txt{flex:1 1 320px;min-width:0}
.dl-hero-logo{width:100%;max-width:190px;height:auto;display:block;margin-bottom:12px}
.dl-hero h3{font-size:19px;margin:0 0 6px}
.dl-hero p{margin:0;font-size:13px;line-height:1.75}
.dl-hero .qr-box{flex:none;display:flex;flex-direction:column;align-items:center;gap:8px}
.dl-hero .qr-img{width:132px;height:132px;padding:9px;background:#fff;border-radius:16px;
  border:1px solid var(--card-stroke);box-shadow:inset 0 1px 0 0 var(--card-inset)}
.dl-hero .qr-img svg{width:100%;height:100%;display:block}
.dl-hero .qr-tip{font-size:11px;color:var(--gray);text-align:center;line-height:1.5}
.dl-hero .qr-tip b{color:var(--ink-2)}

/* 平台卡：图标 + 名称 + 定位 + 体积 + 分步说明 + 按钮 */
.pcard{display:flex;flex-direction:column;padding:18px;border:1px solid var(--chip-stroke);
  border-radius:var(--radius-xl);background:var(--chip);transition:border-color .18s ease}
.pcard:hover{border-color:var(--red)}
.pcard-h{display:flex;align-items:center;gap:11px;margin-bottom:10px}
.pcard-ic{width:38px;height:38px;border-radius:12px;background:var(--tint-red-10);color:var(--red);
  display:flex;align-items:center;justify-content:center;flex:none}
.pcard-ic .material-icons{font-size:21px}
.pcard-h b{font-size:14.5px}
.pcard-tag{margin-left:7px;font-size:11px;font-weight:600;color:var(--gray)}
.pcard-d{font-size:12.5px;color:var(--ink-2);line-height:1.7;margin-bottom:8px}
.pcard-d b{color:var(--ink)}
.pcard-meta{font-size:11.5px;color:var(--gray);margin-bottom:10px}
/* 安装步骤：编号用品牌红，行距放宽 —— 这几行是「下到了不会装」的解药 */
.psteps{margin:0 0 12px;padding-left:0;list-style:none;counter-reset:s}
.psteps li{counter-increment:s;position:relative;padding-left:24px;margin-bottom:7px;
  font-size:12px;line-height:1.65;color:var(--ink-2)}
.psteps li:before{content:counter(s);position:absolute;left:0;top:1px;width:16px;height:16px;
  border-radius:50%;background:var(--tint-red-12);color:var(--red);font-size:10.5px;font-weight:700;
  display:flex;align-items:center;justify-content:center}
.psteps li b{color:var(--ink)}
.pc-btn{margin-top:auto;width:100%;justify-content:center}
.pc-note{font-size:11.5px;color:var(--gray);line-height:1.7;background:var(--card-glass);
  border:1px solid var(--card-stroke);border-radius:12px;padding:9px 11px;margin-bottom:12px}
.kbd{display:inline-block;padding:0 5px;border:1px solid var(--line);border-radius:5px;
  background:var(--card-glass);font-size:11px;line-height:16px}

/* ---------- V1.10.66 小火 AI 新手工作指南 ---------- */
@keyframes gdIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}
@keyframes gdPulse{0%,100%{box-shadow:0 0 0 9999px rgba(15,18,22,.55),0 0 0 2.5px var(--red),0 0 0 8px rgba(215,13,36,.26)}
                   50%{box-shadow:0 0 0 9999px rgba(15,18,22,.55),0 0 0 2.5px var(--red),0 0 0 14px rgba(215,13,36,.12)}}

/* 常驻面板：坐在 AI 悬浮球正上方（球在 bottom:22 高 56，故面板 bottom:92 不重叠） */
.gd-panel{position:fixed;right:22px;bottom:92px;width:332px;z-index:91;padding:14px 16px;
  background:var(--card-glass);border:1px solid var(--card-stroke);border-radius:20px;
  box-shadow:inset 0 1px 0 0 var(--card-inset),0 16px 44px rgba(16,24,40,.2);
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);animation:gdIn .3s ease}
.gd-panel-h{display:flex;align-items:center;gap:7px;font-size:13px;margin-bottom:8px}
.gd-ai{font-size:15px;line-height:1}
.gd-panel-h .gd-x{margin-left:auto;cursor:pointer;color:var(--gray);font-size:19px;line-height:1;padding:0 3px}
.gd-panel-h .gd-x:hover{color:var(--red)}
.gd-panel-ai{font-size:12px;color:var(--ink-2);line-height:1.65;margin-bottom:10px;
  background:var(--tint-red-10);border-radius:12px;padding:8px 11px}
.gd-bar{height:6px;border-radius:100px;background:var(--chip);overflow:hidden}
.gd-bar i{display:block;height:100%;background:var(--grad-cta);transition:width .3s ease}
.gd-panel-meta{display:flex;justify-content:space-between;font-size:11px;color:var(--gray);margin:6px 0 10px}
.gd-chs{display:flex;flex-direction:column;gap:3px;max-height:196px;overflow-y:auto;margin-bottom:11px}
.gd-ch{display:flex;align-items:center;gap:8px;width:100%;text-align:left;font:inherit;font-size:12.5px;
  padding:7px 9px;border:none;border-radius:10px;background:transparent;color:var(--ink-2);cursor:pointer;transition:.15s}
.gd-ch:hover{background:var(--chip);color:var(--ink)}
.gd-ch.on{background:var(--tint-red-12);color:var(--red);font-weight:600}
.gd-ch.done{color:var(--done)}
.gd-ch .material-icons{font-size:16px;flex:none;opacity:.85}
.gd-ch span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.gd-ch em{font-style:normal;font-size:10.5px;color:var(--gray);background:var(--chip);
  border-radius:100px;padding:0 7px;line-height:16px;flex:none}
.gd-ch.on em{background:rgba(255,255,255,.6);color:var(--red)}
.gd-acts{display:flex;gap:8px}
.gd-panel.folded .gd-chs,.gd-panel.folded .gd-panel-ai,.gd-panel.folded .gd-bar,
.gd-panel.folded .gd-panel-meta{display:none}
.gd-panel.folded{width:240px}

/* 聚光灯：单元素超大 box-shadow 压暗四周，目标区域天然"挖孔"（无接缝）。
   ⚠️ 整层 pointer-events:none —— 客户必须仍能点被高亮的那个按钮，
      遮罩若吃掉点击就成了"指给你看却不让你按"，比不指还糟。 */
.gd-layer{position:fixed;inset:0;z-index:200;pointer-events:none}
.gd-hole{position:absolute;border-radius:14px;animation:gdPulse 1.8s ease-in-out infinite;
  transition:left .2s ease,top .2s ease,width .2s ease,height .2s ease}
.gd-tip{position:absolute;pointer-events:auto;background:var(--card);border:1px solid var(--line);
  border-radius:16px;box-shadow:0 18px 46px rgba(16,24,40,.3);padding:13px 15px;animation:gdIn .22s ease}
.gd-tip-h{display:flex;align-items:center;gap:6px;font-size:12px;margin-bottom:7px}
.gd-tip-h .gd-ai{font-size:14px}
.gd-tip-h .gd-pos{margin-left:auto;font-size:10.5px;color:var(--gray);font-weight:600}
.gd-tip-t{font-size:14px;font-weight:700;margin-bottom:5px;color:var(--ink-strong)}
.gd-tip-d{font-size:12.5px;line-height:1.75;color:var(--ink-2)}
.gd-tip-d b{color:var(--red)}
.gd-tip-ai{font-size:11.5px;line-height:1.65;color:var(--ink-2);background:var(--tint-red-10);
  border-radius:10px;padding:7px 10px;margin-top:8px}
.gd-tip-f{display:flex;gap:8px;margin-top:11px}
.gd-tip-f .btn{flex:1;justify-content:center}

/* 入口卡（使用指引页）与紧凑入口（首页） */
.gd-entry .gd-prov{display:flex;flex-wrap:wrap;gap:6px;margin-top:14px;padding-top:12px;border-top:1px solid var(--line)}
.gd-prov-i{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;color:var(--ink-2);
  background:var(--chip);border-radius:100px;padding:4px 11px}
.gd-prov-i .material-icons{font-size:14px;color:var(--red)}
.gd-promo{display:flex;align-items:center;gap:11px}
.gd-promo-ic{font-size:22px;line-height:1;flex:none}
.gd-promo b{font-size:13.5px}

@media(max-width:820px){
  .gd-panel{right:12px;left:12px;width:auto;bottom:86px;max-height:52vh;overflow-y:auto}
  .gd-panel.folded{width:auto}
  .gd-tip{width:auto !important;left:12px !important;right:12px}
}

/* ---------- V1.10.67 多语言：顶栏语言开关 + 门户语言选择弹窗 ---------- */
/* 语种多了（10 个）塞不进「中 / EN」两段式，改为胶囊 + 下拉列表 */
.lb-lang{position:relative;cursor:pointer;display:inline-flex;align-items:center;gap:5px;user-select:none}
.lb-lang .lb-cur{font-size:12px;font-weight:600;white-space:nowrap}
.lb-lang .lb-pop{display:none;position:absolute;top:calc(100% + 8px);right:0;min-width:208px;z-index:210;
  background:var(--card);border:1px solid var(--line);border-radius:14px;
  box-shadow:0 18px 48px rgba(16,24,40,.28);padding:6px;max-height:min(400px,72vh);overflow-y:auto;text-align:left}
.lb-lang.open .lb-pop{display:block;animation:lbIn .16s ease}
@keyframes lbIn{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
.lb-item{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:10px;
  font-size:12.5px;color:var(--ink-2);cursor:pointer;transition:.15s}
.lb-item:hover{background:var(--chip);color:var(--ink)}
.lb-item.on{background:var(--tint-red-10);color:var(--red);font-weight:600}
.lb-item .lb-nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lb-item .lb-code{font-size:10.5px;color:var(--gray);font-family:var(--mono);flex:none}
.lb-item .material-icons{font-size:15px;flex:none}

/* 门户「语言」弹窗里的语种列表（与顶栏下拉同一份语言清单） */
.lang-list{display:grid;gap:6px;max-height:min(380px,62vh);overflow-y:auto}
.lang-row{display:flex;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--line);
  border-radius:12px;cursor:pointer;transition:.15s}
.lang-row:hover{border-color:var(--red);background:var(--red-soft)}
.lang-row.on{border-color:var(--red);background:var(--red-soft)}
.lang-row .lang-nm{flex:1;min-width:0;font-weight:600;font-size:13px}
.lang-row .lang-code{font-size:10.5px;color:var(--gray);font-family:var(--mono);flex:none}
.lang-row .material-icons{font-size:16px;color:var(--red);flex:none}
.card--tint{background:var(--tint-red-10)}
.card--hero{background:linear-gradient(120deg,var(--card-glass) 0%,rgba(215,13,36,.07) 100%)}
body.dark .card--hero{background:linear-gradient(120deg,var(--card-glass) 0%,rgba(247,94,112,.10) 100%)}

/* ---------- 表格 ---------- */
.table-wrap{overflow:auto;border:1px solid var(--line);border-radius:var(--radius);background:var(--card)}.content.wide{max-width:1780px;padding-left:12px;padding-right:12px}
.table-wrap.dense table{font-size:11.5px}
.table-wrap.dense thead th{padding:7px 5px}
.table-wrap.dense tbody td{padding:7px 5px}
.table-wrap.sticky-col thead th:first-child,
.table-wrap.sticky-col tbody td:first-child{position:sticky;left:0;z-index:3;background:var(--card)}
.table-wrap.sticky-col thead th:first-child{background:var(--chip)}
.table-wrap.sticky-col thead th:last-child,
.table-wrap.sticky-col tbody td:last-child{position:sticky;right:0;z-index:3;background:var(--card);box-shadow:-7px 0 8px -7px rgba(0,0,0,.22)}
.table-wrap.sticky-col thead th:last-child{background:var(--chip)}
.table-wrap.sticky-col tbody tr:hover td:first-child,
.table-wrap.sticky-col tbody tr:hover td:last-child{background:var(--red-soft)}
body.dark .table-wrap.sticky-col tbody tr:hover td:first-child,
body.dark .table-wrap.sticky-col tbody tr:hover td:last-child{background:#3C3738}
.table-hint{display:flex;align-items:center;gap:6px;margin-top:8px;font-size:11.5px;color:var(--gray);line-height:1.6}
.table-hint b{color:var(--ink-2)}

table{width:100%;border-collapse:collapse;font-size:13px;white-space:nowrap}
thead th{position:sticky;top:0;background:var(--chip);color:var(--ink-2);text-align:left;font-weight:600;padding:10px 12px;border-bottom:1px solid var(--line);z-index:2}
tbody td{padding:10px 12px;border-bottom:1px solid var(--line);color:var(--ink)}
tbody tr:last-child td{border-bottom:none}
tbody tr:hover{background:var(--red-soft)}
body.dark tbody tr:hover{background:#3C3738}
td.wrap{white-space:normal;min-width:180px}
.empty{padding:40px;text-align:center;color:var(--gray);font-size:13px}

/* ---------- 徽标 / 标签 ---------- */
.badge{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;padding:2px 9px;border-radius:20px;font-weight:600;line-height:1.7}
.b-red{background:#FCE9EB;color:#B90B1E}.b-green{background:#E4F7EC;color:#0B8A50}
.b-amber{background:#FEF1DE;color:#B26A00}.b-blue{background:#E7EEFD;color:#1D4ED8}
.b-violet{background:#EFEBFE;color:#5B3BF5}.b-gray{background:var(--chip);color:var(--ink-2)}
body.dark .b-red{background:#45262B;color:#F98A98}body.dark .b-green{background:#1E3A2C;color:#4ADE9B}
body.dark .b-amber{background:#43331A;color:#F7C86A}body.dark .b-blue{background:#22304E;color:#8AB4FF}
body.dark .b-violet{background:#322A55;color:#B8A6FF}body.dark .b-gray{background:#3C3839;color:#C2BFBF}
.tag-row{display:flex;gap:5px;flex-wrap:wrap}

/* ---------- 按钮 / 表单 ---------- */
.btn{border:none;border-radius:9px;padding:9px 16px;font-weight:600;font-size:13.5px;cursor:pointer;display:inline-flex;align-items:center;gap:7px;transition:.15s;background:var(--chip);color:var(--ink);white-space:nowrap}
.btn:hover{filter:brightness(.97)}
.btn.primary{background:var(--grad-cta);color:#fff;box-shadow:var(--glow-cta)}
.btn.primary:hover{filter:brightness(1.06)}
.btn.ghost{background:transparent;border:1px solid var(--line)}
.btn.sm{padding:6px 11px;font-size:12.5px;border-radius:8px}
.btn.danger{background:#FCE9EB;color:#B90B1E}
.btn:disabled{opacity:.5;cursor:not-allowed}
.field{margin-bottom:14px}
.field label{display:block;font-size:12.5px;font-weight:600;color:var(--ink-2);margin-bottom:6px}
.field .req{color:var(--red)}
.field input,.field select,.field textarea{width:100%;padding:10px 12px;border:1px solid var(--line);border-radius:9px;background:var(--card);outline:none;transition:.15s}
body.dark .field input,body.dark .field select,body.dark .field textarea{background:#2E2B2C}
.field input:focus,.field select:focus,.field textarea:focus{border-color:var(--red);box-shadow:0 0 0 3px var(--red-soft)}
.field .hint{font-size:11.5px;color:var(--gray);margin-top:5px}
.field .err{font-size:11.5px;color:var(--red);margin-top:5px;font-weight:600}
.form-row{display:grid;grid-template-columns:1fr 1fr;gap:14px}
@media(max-width:760px){.form-row{grid-template-columns:1fr}}
.radio-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px}
.radio-card{border:1.5px solid var(--line);border-radius:10px;padding:12px;cursor:pointer;font-size:13px;font-weight:600;display:flex;flex-direction:column;gap:4px}
.radio-card small{font-weight:400;color:var(--gray);font-size:11.5px}
.radio-card.on{border-color:var(--red);background:var(--red-soft);color:var(--red-700)}
body.dark .radio-card.on{color:#FF8B95}

/* V1.10.61 入金通道卡（合并原「选择卡 + 信息卡」两套 UI）
 * 字段用 dl 网格渲染：左列字段名、右列取值 —— 三张卡**纵向天然对齐**（原实现三张卡
 * 因行数不同而参差不齐）。收款信息单独一份 .payinfo，只在选中通道下方展开。 */
.pay-cards{grid-template-columns:repeat(auto-fit,minmax(240px,1fr))}
.pay-cards .radio-card{padding:14px 16px;gap:0}
.pay-cards .radio-card.lock{opacity:.78}
.rc-top{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:10px;font-size:13px}
.rc-kv{display:grid;grid-template-columns:auto 1fr;gap:4px 10px;margin:0;font-size:11.5px;font-weight:400}
.rc-kv dt{color:var(--gray);white-space:nowrap}
.rc-kv dd{margin:0;text-align:right;color:var(--ink);overflow-wrap:anywhere}
.rc-warn{margin-top:10px;padding-top:8px;border-top:1px dashed var(--line);font-size:11.5px;font-weight:400;color:var(--warn)}
.payinfo{margin-top:12px;border:1px solid var(--line);border-radius:10px;padding:12px 14px;background:var(--chip)}
.payinfo.empty{color:var(--gray);font-size:12px;text-align:center;padding:14px}
.payinfo-h{font-size:12px;font-weight:700;color:var(--ink);margin-bottom:8px}
.payinfo-row{display:flex;gap:10px;font-size:12px;margin-top:4px}
.payinfo-row .k{color:var(--gray);min-width:84px;flex:none}
.payinfo-row b{word-break:break-all}
/* ══ V1.10.100 宽表「全部列可达」＋自由文本列收口 ══════════════════════════════════
 * 需求：「后台端，客户管理，把 UI 界面尺寸调整一下，显示内容要全部可以看到，
 *        方便操作员设置。左边菜单要跟随右边滚动，方便左右点」
 * 实测（改动前，1600 视口）：客户表 18 列共 1768px，容器 1426px ⇒ 被裁 344px，
 *   末列「操作（详情）」落在视野外 —— 操作员要先横滚到最右才点得到「详情」，
 *   点完还得滚回来看是谁的行。处理见 .content.wide / .dense / .sticky-col 三条。
 * ⚠️ 为什么必须同时收口自由文本列（.cell-clip）：本表是 `table-layout:auto`，
 *   **列宽由最宽内容决定** ⇒ "18 列能否一屏显全"会随数据漂移。实测同一次改动里，
 *   夹具客户域名一变长，「邮箱」列就从 134px 涨到 198px、整表 1524→1579px，
 *   1600 视口又开始裁 56px —— 只调字号/列距的话，这个保证随时会被某条真实数据推翻。
 *   收口后实测：表格自然宽 ~1461px ⇒ **视口 ≥1540px 即零横滚**（1600 余量 ~60px / 1920 ~380px）。
 * ⚠️ 收口 ≠ 藏信息：省略号只影响显示宽度，**完整值仍在 title**（悬停即见、可复制）。 */
.cell-clip{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:130px}
.cell-clip.w120{max-width:120px}
.cell-clip.w130{max-width:130px}
.cell-clip.w110{max-width:110px}
.cell-clip.w100{max-width:100px}

/* ══ V1.10.98 入金页重排 ＋ 加密币收款「左 USDT · 右 USDC」══════════════════════════
 * ⚠️ 先说一个必须记住的教训：这批 .pay-qr-* 样式在 V1.10.95 写过一次，
 *    但**既没进发布清单、又被后续 sync-from-server 从本机覆盖**，结果线上一直是
 *    「有类名、无样式」的裸 div（看着乱、地址也没对齐）。所以：**新增 CSS 必须
 *    把 theme.css 一起列进发布文件**，否则改样式等于没改（本项目铁律：发布只发改过的文件，
 *    漏一个文件不会有任何报错，只会静默不生效）。 */

/* 分步区块：每一步一个视觉单元，客户按 ①②③ 走，不必在长表单里找"下一步填什么" */
.dp-step{margin-top:18px;padding-top:16px;border-top:1px solid var(--line)}
.dp-step.first{margin-top:0;padding-top:0;border-top:0}
.dp-step-h{display:flex;align-items:center;gap:8px;margin-bottom:12px;flex-wrap:wrap}
.dp-step-n{flex:none;width:22px;height:22px;border-radius:50%;background:var(--red);color:#fff;font-size:12px;font-weight:700;display:inline-flex;align-items:center;justify-content:center}
.dp-step-h b{font-size:13.5px}
/* 提交区：左边摘要（让客户提交前一眼复核选了哪个账户/通道/币种/金额），右边按钮 */
.dp-submit{margin-top:18px;padding-top:16px;border-top:1px solid var(--line);display:flex;gap:14px;align-items:center;flex-wrap:wrap}
.dp-summary{flex:1;min-width:220px;font-size:12.5px;line-height:1.75;color:var(--ink-2);background:var(--chip);border-radius:10px;padding:10px 12px}
.dp-summary b{color:var(--ink)}

/* 加密币收款：**显式两列**（左 USDT / 右 USDC）。
 * 为什么不用 V1.10.95 那版的 auto-fit：客户核对时"左右对照"是固定心智，
 *   列数随视口宽度漂移会让人重新找位置；显式两列则位置恒定。
 * 只有 1 张卡时（单币种通道）用 .one 落成单列，避免半宽留白。
 * 窄屏（≤820px）才落成上下，避免地址被挤成竖条。 */
.pay-qr-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:4px;align-items:start}
.pay-qr-grid.one{grid-template-columns:1fr}
@media (max-width:820px){.pay-qr-grid{grid-template-columns:1fr}}
.pay-qr{border:1px solid var(--line);border-radius:12px;padding:14px;background:var(--card)}
.pay-qr-h{display:flex;align-items:center;gap:8px;font-size:13.5px;font-weight:700;margin-bottom:10px}
.pay-qr-b{display:flex;gap:14px;align-items:flex-start}
/* 二维码必须白底黑码：深色主题下用 var(--card) 会变成深底 → 扫不出来 */
.pay-qr-img{flex:none;background:#fff;padding:8px;border:1px solid var(--line);border-radius:10px;line-height:0}
.pay-qr-info{min-width:0;flex:1}
.pay-qr-addr{font-size:12.5px;line-height:1.6;word-break:break-all;margin:6px 0 10px;padding:9px 11px;background:var(--chip);border:1px dashed var(--line);border-radius:9px;font-family:var(--mono)}
.pay-qr-warn{margin-top:10px;font-size:11.5px;line-height:1.65;border-radius:8px;padding:8px 10px;background:#FFF7E6;color:#8A5A00}
body.dark .pay-qr-warn{background:#3A2A08;color:#F5C86A}
.pay-qr-fail{width:152px;height:152px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;font-size:12px;color:var(--gray);background:var(--chip);border-radius:8px}
@media (max-width:620px){.pay-qr-b{flex-direction:column;align-items:stretch}.pay-qr-img{align-self:center}}
.tabs{display:flex;gap:4px;border-bottom:1px solid var(--line);margin-bottom:16px;overflow-x:auto}
.tab{padding:9px 14px;font-size:13.5px;color:var(--gray);cursor:pointer;border-bottom:2px solid transparent;white-space:nowrap;font-weight:600}
.tab.active{color:var(--red);border-bottom-color:var(--red)}
.switch{width:42px;height:24px;border-radius:20px;background:var(--line);position:relative;cursor:pointer;transition:.2s;flex:none}
.switch.on{background:var(--red)}
.switch::after{content:'';position:absolute;width:18px;height:18px;border-radius:50%;background:#fff;top:3px;left:3px;transition:.2s}
.switch.on::after{left:21px}

/* ---------- 弹窗 / 提示 ---------- */
.mask{position:fixed;inset:0;background:rgba(12,12,16,.55);display:grid;place-items:center;z-index:90;padding:20px}
.modal{background:var(--card);border-radius:16px;width:100%;max-width:620px;max-height:88vh;overflow:auto;box-shadow:0 30px 70px rgba(0,0,0,.4)}
.modal.wide{max-width:900px}
.modal-h{display:flex;align-items:center;padding:18px 22px;border-bottom:1px solid var(--line);position:sticky;top:0;background:var(--card);z-index:2}
.modal-h h3{font-size:16px}
.modal-h .x{margin-left:auto;cursor:pointer;color:var(--gray);font-size:20px;line-height:1}
.modal-b{padding:20px 22px}
.modal-f{padding:14px 22px;border-top:1px solid var(--line);display:flex;justify-content:flex-end;gap:10px;position:sticky;bottom:0;background:var(--card)}
/* ==========================================================================
   等待 / 进度弹窗（V1.10.70 · pf=progress modal）
   用途：门户「开立模拟/真实账户」等**需要等服务端往返**的操作，给出明确的
         「正在做什么 + 已等待多久」读数。此前这些操作点击后毫无反馈，
         用户以为卡住便反复点击（实测某客户 63 秒点了 7 次、真建出 7 个账号）。
   ⚠️ 这是**三方共用**的 theme.css，但 pm- 前缀为本轮新建、无同名冲突，
      且不触碰任何全局选择器（不影响后台界面）。
   ========================================================================== */
.pmodal{background:var(--card);border-radius:16px;width:100%;max-width:360px;padding:22px 22px 18px;box-shadow:0 30px 70px rgba(0,0,0,.4);text-align:center}
.pm-head{display:flex;align-items:center;justify-content:center;gap:10px;margin-bottom:12px}
.pm-title{font-size:15px;font-weight:600;color:var(--ink)}
.pm-spin{width:16px;height:16px;flex:none;border-radius:50%;border:2px solid var(--red-soft,#F7D5DA);border-top-color:var(--red,#D70D24);animation:pmSpin .8s linear infinite}
@keyframes pmSpin{to{transform:rotate(360deg)}}
/* 完成 / 失败态：停转并换成状态字（纯 CSS，无需额外 DOM） */
.pm-spin.pm-done{animation:none;border-color:var(--done,#16A34A);border-top-color:var(--done,#16A34A)}
.pm-spin.pm-fail{animation:none;border-color:var(--warn,#B45309);border-top-color:var(--warn,#B45309)}
.pm-stage{font-size:13px;color:var(--ink-2);line-height:1.6;min-height:20px}
.pm-track{margin:12px 0 8px;height:5px;border-radius:99px;background:var(--chip);overflow:hidden}
.pm-bar{display:block;height:100%;width:6%;border-radius:99px;background:var(--red,#D70D24);transition:width .18s linear}
.pm-read{font-size:12px;color:var(--gray)}
.pm-read b{color:var(--ink-2);font-variant-numeric:tabular-nums;font-weight:600}
.pm-est{color:var(--warn,#B45309)}
.pm-tip{font-size:11.5px;color:var(--gray);margin-top:8px;min-height:14px}
.pmodal.pm-ok .pm-bar{background:var(--done,#16A34A)}
.pmodal.pm-err .pm-bar{background:var(--warn,#B45309)}
/* 深色主题（门户 body.dark）：pm 用的是 --card/--chip/--ink 等令牌，天然跟随；
   仅把描边色补一下，避免深底上转圈看不清。 */
body.dark .pm-spin{border-color:rgba(255,255,255,.22);border-top-color:var(--red,#F75E70)}
body.dark .pm-track{background:rgba(255,255,255,.10)}
/* ⚠️ pointer-events:none 是必须的：提示框浮在右上角，正好压住顶栏最后几个图标 —
   没有这一条，一条刚弹出的 toast 会让「通知中心 / 设置 / 头像」在 2.8 秒内点不动
   （V1.10.25 用 Playwright 点击顶栏时实测复现：toast 拦截 pointer events）。
   提示本身不含交互元素，整层不吃事件没有任何副作用。 */
#toasts{position:fixed;right:20px;top:18px;z-index:200;display:flex;flex-direction:column;gap:10px;pointer-events:none}
.toast{background:var(--card);border:1px solid var(--line);border-left:4px solid var(--red);border-radius:10px;padding:12px 16px;box-shadow:var(--shadow);font-size:13px;min-width:260px;max-width:400px;animation:slide .25s ease}
.toast.ok{border-left-color:var(--done)}.toast.warn{border-left-color:var(--warn)}
@keyframes slide{from{opacity:0;transform:translateX(20px)}to{opacity:1;transform:none}}
.drawer{position:fixed;top:0;right:0;bottom:0;width:min(620px,94vw);background:var(--card);box-shadow:-20px 0 60px rgba(0,0,0,.35);z-index:95;overflow-y:auto;animation:drawerIn .22s ease}
@keyframes drawerIn{from{transform:translateX(40px);opacity:.4}to{transform:none;opacity:1}}

/* ---------- 杂项 ---------- */
.muted{color:var(--gray)}.small{font-size:12px}.mono{font-family:var(--mono)}
.tnum{font-variant-numeric:tabular-nums}
.up{color:#D70D24;font-weight:600}.down{color:#12B76A;font-weight:600}
.pill{display:inline-flex;align-items:center;gap:6px;background:var(--chip);border-radius:20px;padding:5px 12px;font-size:12.5px;font-weight:600}
.bar{height:8px;border-radius:8px;background:var(--chip);overflow:hidden}
.bar>i{display:block;height:100%;background:var(--red);border-radius:8px}
.progress-steps{display:flex;gap:0;margin:8px 0 18px}
.step{flex:1;text-align:center;font-size:12px;color:var(--gray);position:relative;padding-top:26px;font-weight:600}
.step::before{content:'';position:absolute;top:6px;left:50%;transform:translateX(-50%);width:14px;height:14px;border-radius:50%;background:var(--line);z-index:2}
.step::after{content:'';position:absolute;top:12px;left:0;right:0;height:2px;background:var(--line)}
.step:first-child::after{left:50%}.step:last-child::after{right:50%}
.step.done,.step.on{color:var(--red)}
.step.done::before,.step.on::before{background:var(--red)}
.step.done::after{background:var(--red)}
.hint-box{background:var(--chip);border-radius:10px;padding:12px 14px;font-size:12.5px;color:var(--ink-2);line-height:1.75}
.hint-box.warn{background:#FFF7E6;color:#8A5A00}
body.dark .hint-box.warn{background:#3A2A08;color:#F5C86A}
.hint-box b{color:var(--red)}
.list-row{display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line)}
.list-row:last-child{border-bottom:none}
.blank{color:var(--red);font-weight:700;font-family:var(--mono)}
.lock{opacity:.65}

/* ---------- 新手引导 ---------- */
.ob-coach{position:fixed;right:22px;bottom:22px;width:300px;background:var(--card);border:1px solid var(--line);border-radius:14px;box-shadow:0 12px 32px rgba(23,26,31,.18);padding:14px 16px;z-index:90;animation:obIn .35s ease}
@keyframes obIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
.ob-coach-h{display:flex;justify-content:space-between;align-items:center;font-size:11.5px;color:var(--gray);margin-bottom:8px;font-weight:600}
.ob-coach-h #ob-dismiss{cursor:pointer;color:var(--red);font-weight:600}
.ob-coach-t{font-weight:700;font-size:14.5px;margin-bottom:4px}
.ob-coach-d{font-size:12px;color:var(--gray);margin-bottom:10px;line-height:1.6}
.ob-step{display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px solid var(--line)}
.ob-step:last-child{border-bottom:none}
.ob-ic{width:26px;height:26px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:13px;font-weight:700;flex:none}

/* ---------- 移动端适配（UI 审查修复） ---------- */
.nav-burger{display:none}
.m-nav{display:none}
@media(max-width:820px){
  .nav-burger{display:grid}
  .topbar{gap:10px;padding:0 12px;overflow-x:auto;overflow-y:hidden}
  .topbar .right{gap:8px;flex:none}
  .m-nav.open{display:block}
  .m-nav-bg{position:fixed;inset:0;background:rgba(23,26,31,.45);z-index:96}
  .m-nav-panel{position:fixed;top:0;left:0;bottom:0;width:284px;max-width:86vw;background:var(--card);z-index:97;overflow-y:auto;padding:14px 10px;box-shadow:20px 0 60px rgba(0,0,0,.28);animation:mIn .22s ease}
  @keyframes mIn{from{transform:translateX(-30px);opacity:.4}to{transform:none;opacity:1}}
  .icon-btn{width:40px;height:40px}
  .btn.sm{padding:8px 12px}
  .ob-coach{right:12px;bottom:12px;width:calc(100vw - 24px);max-width:320px}
}
@media(max-width:1360px){.topbar #global-search span{display:none}}
.wm{position:relative}
.wm::after{content:'DEMO';position:absolute;right:10px;top:8px;font-size:10px;color:var(--gray);letter-spacing:2px}

/* ---------- V1.7.0 AI 助手悬浮窗 ---------- */
.ai-fab{position:fixed;right:22px;bottom:22px;width:56px;height:56px;border-radius:50%;border:none;cursor:pointer;
  background:linear-gradient(135deg,var(--red) 0%,var(--red-600) 100%);color:#fff;z-index:92;
  box-shadow:0 10px 26px rgba(215,13,36,.38);display:flex;align-items:center;justify-content:center;transition:.2s}
.ai-fab:hover{transform:translateY(-2px);box-shadow:0 14px 32px rgba(215,13,36,.46)}
.ai-fab.hide{opacity:0;pointer-events:none;transform:scale(.8)}
.ai-fab .material-icons{font-size:26px}
.ai-panel{position:fixed;right:22px;bottom:22px;width:372px;max-height:min(620px,86vh);background:var(--card);border:1px solid var(--line);
  border-radius:16px;box-shadow:0 18px 48px rgba(16,24,40,.24);z-index:93;display:none;flex-direction:column;overflow:hidden}
.ai-panel.open{display:flex;animation:aiIn .24s ease}
@keyframes aiIn{from{transform:translateY(14px);opacity:.3}to{transform:none;opacity:1}}
.ai-head{display:flex;align-items:center;gap:10px;padding:12px 14px;background:linear-gradient(120deg,#fff 0%,#FFF3F4 100%);border-bottom:1px solid var(--line)}
.ai-avatar{width:34px;height:34px;border-radius:10px;background:var(--red-soft);color:var(--red);display:flex;align-items:center;justify-content:center;flex:none}
.ai-x{cursor:pointer;color:var(--gray);font-size:22px;line-height:1;padding:0 4px}
.ai-badges{display:flex;gap:6px;padding:8px 14px;border-bottom:1px solid var(--line);flex-wrap:wrap}
.ai-body{padding:12px 14px;overflow-y:auto;flex:1;min-height:180px;max-height:320px;background:var(--bg)}
.ai-hint{font-size:12.5px;color:var(--gray);line-height:1.7;background:var(--card);border:1px dashed var(--line);border-radius:10px;padding:10px 12px}
.ai-msg{margin-bottom:10px;display:flex;flex-direction:column}
.ai-msg.u{align-items:flex-end}
.ai-msg.a{align-items:flex-start}
.ai-bub{max-width:88%;padding:9px 12px;border-radius:12px;font-size:13px;line-height:1.65;white-space:normal;word-break:break-word}
.ai-msg.u .ai-bub{background:var(--red);color:#fff;border-bottom-right-radius:4px}
.ai-msg.a .ai-bub{background:var(--card);border:1px solid var(--line);border-bottom-left-radius:4px}
.ai-tag{font-size:10.5px;color:var(--gray);margin-bottom:3px}
.ai-quick{display:flex;gap:6px;padding:8px 14px;flex-wrap:wrap;border-top:1px solid var(--line)}
.ai-chip{font-size:12px;padding:4px 10px;border-radius:999px;background:var(--chip);cursor:pointer;color:var(--ink);white-space:nowrap}
.ai-chip:hover{background:var(--red-soft);color:var(--red)}
.ai-input{display:flex;gap:8px;align-items:flex-end;padding:10px 14px 12px;border-top:1px solid var(--line)}
.ai-input textarea{flex:1;resize:none;border:1px solid var(--line);border-radius:10px;padding:8px 10px;max-height:88px;background:transparent;outline:none}
.ai-input textarea:focus{border-color:var(--red)}
/* 新手指南教练上移，避免与 AI 悬浮按钮重叠 */
.ob-coach{bottom:96px}
@media(max-width:820px){
  .ai-fab{right:12px;bottom:12px;width:52px;height:52px}
  .ai-panel{right:10px;left:10px;bottom:10px;width:auto;max-height:80vh}
  .ob-coach{bottom:80px}
}

/* ============================================================
   V1.8.0 MT5 量化交易专属 CRM · 后台独立功能域
   ============================================================ */
.quant-wrap{display:flex;gap:16px;align-items:flex-start}
.quant-side{width:216px;flex:none;position:sticky;top:10px;background:var(--card);border:1px solid var(--line);border-radius:14px;padding:10px;box-shadow:var(--shadow)}
.qs-title{display:flex;align-items:center;gap:8px;font-weight:700;padding:6px 10px 11px;color:var(--red);border-bottom:1px solid var(--line);margin-bottom:8px;font-size:13.5px}
.qs-item{display:flex;align-items:center;gap:9px;padding:9px 10px;border-radius:9px;cursor:pointer;font-size:13px;color:var(--ink);opacity:.85}
.qs-item:hover{background:var(--chip);opacity:1}
.qs-item.on{background:rgba(215,13,36,.13);color:var(--red);opacity:1;font-weight:650}
.qs-badge{margin-left:auto;background:var(--red);color:#fff;border-radius:20px;padding:0 6px;font-size:10.5px}
.qs-foot{margin-top:10px;padding-top:10px;border-top:1px solid var(--line)}
.quant-main{flex:1;min-width:0}
/* 策略页左右分栏：用类而非内联样式，便于在窄屏降级为单列（内联样式会盖过媒体查询） */
.q-split{display:grid;grid-template-columns:300px minmax(0,1fr)}
.q-split>*{min-width:0}
.q-sub{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:12px}
.q-code{background:var(--chip);border:1px solid var(--line);border-radius:10px;padding:12px;font-family:var(--mono);font-size:11.5px;line-height:1.65;max-height:340px;overflow:auto;white-space:pre;color:var(--ink)}
.q-kv{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px}
.q-meter{height:6px;border-radius:6px;background:var(--chip);overflow:hidden;margin-top:5px}
.q-meter>i{display:block;height:100%;background:var(--done)}
.q-meter.warn>i{background:var(--warn)}
.q-meter.bad>i{background:var(--red)}
.q-role-chip{display:inline-flex;align-items:center;gap:6px;font-size:12px;padding:4px 9px;border-radius:20px;background:var(--chip)}
.q-flow{display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-size:12px;margin:4px 0 0}
.q-flow i{font-style:normal;padding:3px 9px;border-radius:7px;background:var(--chip)}
.q-flow i.on{background:rgba(18,183,106,.16);color:var(--done);font-weight:600}
@media(max-width:980px){
  /* 纵向堆叠时必须 stretch：继承自桌面端的 align-items:flex-start 会让子项按内容宽度收缩，
     宽表格/长串会直接把工作区撑出屏幕（原为 877px 溢出） */
  .quant-wrap{flex-direction:column;align-items:stretch}
  .q-split{grid-template-columns:minmax(0,1fr)}
  .quant-side{width:100%;position:static}
  .qs-item{display:inline-flex;width:auto;margin:2px 0}
  .quant-side{display:flex;flex-wrap:wrap;gap:2px}
  .qs-title,.qs-foot{width:100%}
}
/* 量化工作区内的宽表格/代码块一律内部滚动，绝不撑破页面 */
.quant-main .table-wrap{max-width:100%}
.quant-main .q-code{max-width:100%}

/* ============================================================
   V1.9.0 量化配套软件与动态分析体系 · 动态分析域样式
   依《量化交易CRM系统｜配套软件与动态分析体系》§7 指标体系
   ============================================================ */
/* 侧边栏分组（原 9 模块扩到 20 模块，必须分组否则一屏放不下） */
.qs-group{font-size:10.5px;letter-spacing:.06em;color:var(--gray);padding:10px 10px 4px;font-weight:650}
.qs-group:first-of-type{padding-top:2px}
.qs-dot{margin-left:auto;width:6px;height:6px;border-radius:50%;background:var(--done);box-shadow:0 0 0 3px rgba(18,183,106,.18)}
.qs-item .qs-badge{margin-left:auto}
.qs-item .qs-dot+.qs-badge,.qs-item .qs-badge+.qs-dot{margin-left:6px}

/* 交易室大屏（文档 §8 九宫格） */
.q-wallcard{background:linear-gradient(180deg,rgba(215,13,36,.05),transparent 200px)}
.q-wall{display:flex;flex-direction:column;gap:12px}
.qw-row{display:grid;gap:12px}
.qw-2{grid-template-columns:repeat(2,minmax(0,1fr))}
.qw-3{grid-template-columns:repeat(3,minmax(0,1fr))}
.qw-4{grid-template-columns:repeat(4,minmax(0,1fr))}
.qw-cell{background:var(--chip);border:1px solid var(--line);border-radius:12px;padding:12px;min-width:0}
.qw-span2{grid-column:span 2}
.qw-h{font-size:11.5px;color:var(--gray);font-weight:650;letter-spacing:.03em;margin-bottom:9px;display:flex;align-items:center;gap:6px}
.qw-big{font-size:26px;font-weight:700;line-height:1.15;font-variant-numeric:tabular-nums}
.qw-kv{display:flex;flex-wrap:wrap;gap:6px 16px;font-size:12px;color:var(--ink-2);margin-top:9px}
.qw-kv.col{flex-direction:column;gap:5px}
.qw-kv b{color:var(--ink);font-variant-numeric:tabular-nums}
.qw-scroll{max-height:250px;overflow:auto}
.qw-li{display:flex;align-items:center;gap:8px;padding:5px 2px;border-bottom:1px dashed var(--line);font-size:12px}
.qw-li:last-child{border-bottom:0}
.qw-bar{display:flex;align-items:center;gap:8px;font-size:11.5px;margin:5px 0}
.qw-bar>span{width:56px;flex:none;color:var(--ink-2)}
.qw-bar>i{display:block;height:7px;border-radius:6px;background:var(--red);opacity:.75;min-width:3px}
.qw-bar>b{font-variant-numeric:tabular-nums;white-space:nowrap}
.c-up{color:var(--red);font-weight:600}
.c-dn{color:var(--done);font-weight:600}

/* 相关性矩阵热力图 */
.q-corr-wrap{overflow:auto;max-width:100%}
table.q-corr{border-collapse:separate;border-spacing:2px;font-size:10.5px;font-variant-numeric:tabular-nums}
table.q-corr th{font-weight:600;color:var(--ink-2);padding:2px 5px;font-size:10px;white-space:nowrap}
table.q-corr td{width:30px;height:24px;text-align:center;border-radius:5px;color:var(--ink)}

/* 全链路追踪时间线 */
.q-trace{border:1px solid var(--line);border-radius:11px;margin-bottom:9px;overflow:hidden;background:var(--card)}
.q-trace.bad{border-color:rgba(215,13,36,.45);background:rgba(215,13,36,.05)}
.q-trace-h{display:flex;align-items:center;gap:10px;padding:9px 12px;cursor:pointer;flex-wrap:wrap;font-size:12.5px}
.q-trace-h:hover{background:var(--chip)}
.q-trace-h .right{margin-left:auto}
.q-trace-b{padding:4px 12px 12px;border-top:1px dashed var(--line)}
.q-flow i.bad{background:rgba(215,13,36,.14);color:var(--red);font-weight:600}

/* 风险提示条（组合级 / 大屏告警） */
.qw-alert{display:flex;gap:8px;align-items:flex-start;font-size:11.5px;line-height:1.55;padding:8px 10px;border-radius:9px;margin-bottom:7px;background:var(--chip);border-left:3px solid var(--gray)}
.qw-alert>b{flex:none;font-size:10.5px;padding:1px 6px;border-radius:5px;background:rgba(0,0,0,.08)}
.qw-alert.p0{border-left-color:var(--red);background:rgba(215,13,36,.1)}
.qw-alert.p0>b{background:var(--red);color:#fff}
.qw-alert.p1{border-left-color:var(--warn);background:rgba(247,144,9,.1)}
.qw-alert.p1>b{background:var(--warn);color:#fff}
.qw-alert.p2{border-left-color:var(--info);background:rgba(46,107,230,.08)}
.qw-alert.p2>b{background:var(--info);color:#fff}
.qw-alert.p3{border-left-color:var(--done);background:rgba(18,183,106,.08)}
.qw-alert.p3>b{background:var(--done);color:#fff}

/* 归因 / 仪表盘辅助 */
.q-metric-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:10px}

/* 卡片头在量化工作区内允许换行：V1.9.0 的时序数据页头部放了 2 个下拉 + 2 个按钮，
 * 桌面端 .card-h 不换行会在 390px 直接撑出 90px 横向溢出（实测缺陷，已修正）。 */
.quant-main .card-h{flex-wrap:wrap;row-gap:9px}
.quant-main .card-h .right{flex-wrap:wrap;row-gap:8px}
.quant-main .card-h>h3{min-width:0}
.quant-main .card-h select{max-width:100%}

@media(max-width:1180px){
  .qw-4{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media(max-width:980px){
  .qw-2,.qw-3,.qw-4{grid-template-columns:minmax(0,1fr)}
  .qw-span2{grid-column:auto}
  .qs-group{width:100%}
  .qw-big{font-size:22px}
}

/* 网络状态监控：右上角图标固定在视口，给顶栏右侧操作簇预留空间，避免遮挡头像/退出 */
body.has-sf-net .topbar .right{margin-right:96px}
@media(max-width:640px){
  body.has-sf-net .topbar .right{margin-right:0}
  #sf-net{top:8px;right:8px;padding:4px 8px}
  #sf-net .sf-net-ms{display:none}
}

/* ============ V1.9.6 人脸采集弹窗（门户 / 后台共用） ============ */
.face-modal{max-width:520px}
.face-stage{position:relative;border-radius:12px;overflow:hidden;background:#0B0D10;aspect-ratio:4/3;display:grid;place-items:center}
.face-stage video{width:100%;height:100%;object-fit:cover;display:block;transform:scaleX(-1)}
.face-guide{position:absolute;inset:0;pointer-events:none;display:grid;place-items:center}
.face-oval{width:52%;height:76%;border:2.5px dashed rgba(255,255,255,.55);border-radius:50%;
  box-shadow:0 0 0 9999px rgba(0,0,0,.28);transition:.25s}
.face-badge{position:absolute;left:10px;top:10px;font-size:11.5px;font-weight:600;padding:3px 10px;border-radius:20px;
  background:rgba(0,0,0,.55);color:#fff;backdrop-filter:blur(3px)}
.face-badge.ok{background:rgba(18,183,106,.9)}
.face-badge.warn{background:rgba(247,144,9,.92)}
.face-badge.err{background:rgba(215,13,36,.92)}
.face-flash{position:absolute;inset:0;background:#fff;opacity:0;pointer-events:none;transition:opacity .32s}
.face-flash.on{opacity:.75}
.face-st{margin-top:12px;font-size:13px;color:var(--ink-2);min-height:20px;font-weight:500}
.face-st.ok{color:var(--done)}.face-st.warn{color:#B26A00}.face-st.err{color:var(--red)}
.face-bar{height:4px;background:var(--chip);border-radius:4px;overflow:hidden;margin-top:10px}
.face-bar>i{display:block;height:100%;width:0;background:var(--red);border-radius:4px;transition:width .28s linear}
.face-tip{font-size:12px;color:var(--gray);margin-top:10px;line-height:1.6}
@media(max-width:520px){.face-modal{max-width:100%}.face-oval{width:62%;height:80%}}

/* ============ V1.10.0 多因素认证（MFA / TOTP / 恢复码） ============ */
/* 登录页内联第二步面板 */
.mfa-panel{border:1px solid var(--line);border-radius:var(--radius);background:var(--chip);
  padding:16px 16px 14px;margin-top:14px;text-align:left}
.mfa-panel-h{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;margin-bottom:12px}
.mfa-panel-h b{font-size:14px;color:var(--ink)}
.mfa-panel-h .small{color:var(--ink-2)}
/* 验证码输入：等宽、居中、字距拉开 */
.mfa-input{font-family:var(--mono);font-size:20px;letter-spacing:.32em;text-align:center;font-weight:600;
  width:100%;padding:11px 12px;border:1px solid var(--line);border-radius:10px;background:var(--card);
  color:var(--ink);outline:none;transition:.15s}
.mfa-input::placeholder{letter-spacing:.08em;font-weight:400;color:var(--gray);font-size:14px}
.mfa-input:focus{border-color:var(--red);box-shadow:0 0 0 3px var(--red-soft)}
body.dark .mfa-input{background:#2E2B2C}
/* 倒计时提示行 */
.mfa-cd{font-size:12px;color:var(--gray);margin:8px 0 2px;line-height:1.6}
.mfa-cd b{font-family:var(--mono);color:var(--ink-2)}
.mfa-cd.soon b{color:var(--red)}
/* 恢复码网格 */
.mfa-codes{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px;margin:14px 0 0}
.mfa-codes code{display:block;font-family:var(--mono);font-size:14px;font-weight:600;letter-spacing:.06em;
  padding:9px 11px;border:1px dashed var(--line);border-radius:8px;background:var(--chip);color:var(--ink);text-align:center}
.mfa-code-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:14px}
/* 因子选择卡片（与 stepUpDialog 共用） */
.mfa-inline{display:grid;gap:8px}
.mfa-opt{display:flex;flex-direction:column;gap:2px;padding:11px 13px;border:1.5px solid var(--line);
  border-radius:10px;background:var(--card);cursor:pointer;transition:.15s}
.mfa-opt:hover{border-color:var(--gray)}
.mfa-opt b{font-size:13.5px;color:var(--ink)}
.mfa-opt span{font-size:11.5px;color:var(--gray);line-height:1.55}
.mfa-opt.on{border-color:var(--red);background:var(--red-soft)}
.mfa-opt.on b{color:var(--red-600)}
body.dark .mfa-opt.on b{color:var(--red-hi)}
/* 绑定向导：二维码 + 步骤说明 */
.mfa-bind{display:grid;grid-template-columns:minmax(0,240px) minmax(0,1fr);gap:18px;align-items:start}
.mfa-qr{border:1px solid var(--line);border-radius:12px;padding:12px;background:#fff;display:grid;place-items:center}
.mfa-qr svg,.mfa-qr img{width:100%;height:auto;max-width:216px;display:block}
.mfa-bind-side{display:grid;gap:12px;min-width:0}
.mfa-step b{display:block;font-size:12.5px;color:var(--ink);margin-bottom:4px}
.mfa-step .small{color:var(--gray);line-height:1.65}
.mfa-secret{display:flex;align-items:center;gap:8px;margin:6px 0 4px;flex-wrap:wrap}
.mfa-secret code{font-family:var(--mono);font-size:13px;font-weight:600;letter-spacing:.08em;
  padding:8px 11px;border:1px solid var(--line);border-radius:8px;background:var(--chip);color:var(--ink);
  word-break:break-all;flex:1;min-width:0}
@media(max-width:640px){
  .mfa-bind{grid-template-columns:1fr}
  .mfa-qr{max-width:240px;margin:0 auto}
  .mfa-input{font-size:18px;letter-spacing:.24em}
}
/* 安全中心：四类验证方式卡片 */
.sec-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px}
.sec-card{display:flex;flex-direction:column;gap:8px;background:var(--card);border:1px solid var(--line);
  border-radius:var(--radius);padding:16px;min-width:0;transition:.15s}
.sec-card.on{border-color:rgba(18,183,106,.45);box-shadow:0 2px 12px rgba(18,183,106,.08)}
.sec-card-h{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.sec-card-h i{color:var(--gray)}
.sec-card.on .sec-card-h i{color:var(--done)}
.sec-card-h b{font-size:14px;color:var(--ink)}
.sec-card-h .badge,.sec-card-h [class^="b-"]{margin-left:auto}
.sec-card-f{display:flex;gap:8px;flex-wrap:wrap;margin-top:auto;padding-top:4px}
.sec-pol{display:grid;gap:8px}
.sec-pol .mfa-opt{width:100%}
@media(max-width:520px){.sec-grid{grid-template-columns:1fr}}


/* ============================================================
   V1.10.6 · 悬浮窗口（门户「交易平台 → MT5」终端）
   零依赖纯 CSS：拖拽/缩放由 ui.js 的 floatWindow 用 pointer 事件驱动，这里只管外观。
   ⚠️ 移动端（<=759px）一律由 .full 铺满，隐藏缩放手柄 —— 手机上拖窗口不可用。
   ============================================================ */
.fwin{position:fixed;display:flex;flex-direction:column;overflow:hidden;min-width:0;
  background:var(--card);border:1px solid var(--line);border-radius:14px;
  box-shadow:0 10px 30px rgba(16,24,40,.16),0 30px 70px rgba(16,24,40,.22)}
body.dark .fwin{box-shadow:0 10px 30px rgba(0,0,0,.5),0 30px 70px rgba(0,0,0,.45)}
.fwin.full{left:0!important;top:0!important;width:100%!important;height:100%!important;border-radius:0;border:0}
.fwin.min{left:auto!important;top:auto!important;right:22px;bottom:88px;width:326px;height:auto!important;min-height:0}
/* 最小化后停在右下角，但必须**高于 AI 悬浮球**（56px 高 + 22px 底边距）——
   否则压住 AI 助手按钮，用户得先把终端恢复或关掉才能问 AI。 */
/* ⚠️ 全屏时右下角的「网络状态」胶囊 #sf-net 层级是 99999（刻意拉满，要始终可见），
   会盖住窗口右上角的最小化 / 最大化 / 关闭三个按钮（实测 Playwright 报
   "svg from #sf-net subtree intercepts pointer events"）。这里不动它的层级，
   改为**给它让位** —— 与门户顶栏 `body.has-sf-net .topbar .right{margin-right:96px}` 同一套做法。 */
body.has-sf-net .fwin.full .fwin-h{padding-right:118px}
/* ⚠️ 最小化必须**直接隐藏内容区**。只把 .fwin 的 height 置为 auto 是不够的：
   内容区是 flex:1，父高 auto 时它会按内容撑开（实测 3272px），而窗口又是「右下角锚定」，
   于是标题栏被顶到视口上方 → 看起来像「点了最小化整个窗口没了」，实际上标题栏飞到了屏幕外。 */
.fwin.min .fwin-b{display:none}
.fwin.dragging,.fwin.resizing{user-select:none}
.fwin-h{height:44px;flex:none;display:flex;align-items:center;gap:9px;padding:0 8px 0 14px;
  background:var(--chip);border-bottom:1px solid var(--line);cursor:move;touch-action:none;min-width:0}
.fwin.full .fwin-h{cursor:default}
.fwin.min .fwin-h{cursor:pointer}
.fwin-ic{font-size:19px;color:var(--red);flex:none}
.fwin-t{font-weight:700;font-size:13.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.fwin-tag{margin-left:auto;display:flex;align-items:center;gap:6px;min-width:0;overflow:hidden;
  font-size:11.5px;color:var(--ink-2);white-space:nowrap}
.fwin-tag:empty{display:none}
.fwin-acts{display:flex;gap:2px;flex:none}
.fwin-btn{border:0;background:transparent;width:30px;height:30px;padding:0;box-sizing:border-box;
  border-radius:8px;display:grid;place-items:center;cursor:pointer;color:var(--ink-2);font-family:inherit}
.fwin-btn:hover{background:var(--card);color:var(--ink)}
.fwin-btn[data-fw="close"]:hover{background:var(--red);color:#fff}
.fwin-btn:focus-visible{outline:2px solid var(--red);outline-offset:1px}
.fwin-btn .material-icons{font-size:17px}
.fwin.min .fwin-btn[data-fw="min"]{display:none}
.fwin-b{flex:1;min-height:0;overflow:auto;background:var(--bg);position:relative}
.fwin-r{position:absolute;right:0;bottom:0;width:18px;height:18px;cursor:nwse-resize;touch-action:none;z-index:3}
.fwin-r::after{content:'';position:absolute;right:3px;bottom:3px;width:8px;height:8px;
  border-right:2px solid var(--gray);border-bottom:2px solid var(--gray);opacity:.65}
.fwin.min .fwin-r,.fwin.full .fwin-r{display:none}
@media(max-width:759px){.fwin-r{display:none}.fwin-h{cursor:default}}

/* ---------- 窗内：MT5 终端 ---------- */
.mt5t{height:100%;display:flex;flex-direction:column;min-height:0}
.mt5t-tabs{flex:none;display:flex;align-items:center;gap:6px;padding:8px 12px;background:var(--card);
  border-bottom:1px solid var(--line);overflow-x:auto}
.mt5t-tab{flex:none;border:1px solid var(--line);background:var(--card);color:var(--ink-2);
  border-radius:999px;padding:6px 14px;font-size:12.5px;font-weight:650;cursor:pointer;
  display:inline-flex;align-items:center;gap:6px;font-family:inherit;white-space:nowrap}
.mt5t-tab .material-icons{font-size:15px}
.mt5t-tab:hover{color:var(--ink);border-color:var(--gray)}
.mt5t-tab.on{background:var(--red);border-color:var(--red);color:#fff}
.mt5t-tabs-r{margin-left:auto;display:flex;align-items:center;gap:8px;flex:none;font-size:11.5px;color:var(--ink-2)}
.mt5t-body{flex:1;min-height:0;position:relative}
.mt5t-pane{display:none;height:100%;min-height:0}
.mt5t-pane.on{display:flex;flex-direction:column}
.mt5t-frame{flex:1;min-height:0;width:100%;border:0;background:#12161a;display:block}
.mt5t-note{flex:none;display:flex;align-items:center;gap:8px;padding:7px 12px;font-size:11.5px;
  color:var(--ink-2);background:var(--card);border-top:1px solid var(--line)}
.mt5t-ph{flex:1;display:flex;align-items:center;justify-content:center;padding:26px;min-height:0;overflow:auto}
.mt5t-phc{max-width:520px;text-align:center}
.mt5t-phc>.material-icons{font-size:44px;color:var(--gray);display:block;margin-bottom:10px}
.mt5t-phc h4{font-size:16px;margin-bottom:6px}
.mt5t-phc p{font-size:12.5px;color:var(--ink-2);line-height:1.75;margin-bottom:14px}
.mt5t-phc .row{display:flex;gap:8px;justify-content:center;flex-wrap:wrap}
.mt5t-grid{flex:1;min-height:0;display:grid;grid-template-columns:minmax(0,300px) minmax(0,1fr)}
.mt5t-watch{border-right:1px solid var(--line);background:var(--card);overflow:auto;min-width:0}
.mt5t-watch-h{position:sticky;top:0;z-index:1;display:flex;align-items:center;gap:8px;
  padding:9px 12px;background:var(--card);border-bottom:1px solid var(--line);font-size:11.5px;color:var(--ink-2)}
.mt5t-watch-h b{color:var(--ink);font-size:12.5px}
.mt5t-row{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:8px;align-items:center;
  padding:7px 12px;border-bottom:1px solid var(--line);cursor:pointer;min-width:0}
.mt5t-row:hover{background:var(--chip)}
.mt5t-row.on{background:var(--red-soft)}
body.dark .mt5t-row.on{background:rgba(247,94,112,.14)}
.mt5t-sym{font-weight:700;font-size:12.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mt5t-sub{font-size:10.5px;color:var(--gray)}
.mt5t-px{font-family:var(--mono);font-size:12.5px;text-align:right;font-variant-numeric:tabular-nums}
.mt5t-chg{font-family:var(--mono);font-size:11.5px;text-align:right;min-width:58px;font-variant-numeric:tabular-nums}
.mt5t-side{display:flex;flex-direction:column;min-width:0;min-height:0;overflow:auto;padding:12px;gap:12px}
.mt5t-side-h{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.mt5t-side-h .sym{font-weight:800;font-size:16px}
.mt5t-tfs{display:flex;gap:4px;margin-left:auto;flex-wrap:wrap}
.mt5t-tf{border:1px solid var(--line);background:var(--card);border-radius:6px;padding:3px 9px;
  font-size:11px;cursor:pointer;color:var(--ink-2);font-family:inherit;font-weight:600}
.mt5t-tf.on{background:var(--red);border-color:var(--red);color:#fff}
.mt5t-chart{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:10px;min-width:0}
.mt5t-legend{display:flex;gap:14px;flex-wrap:wrap;font-size:11.5px;color:var(--ink-2);margin-bottom:6px}
.mt5t-legend b{color:var(--ink);font-family:var(--mono)}
.mt5t-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:8px}
.mt5t-kpi{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:9px 11px;min-width:0}
.mt5t-kpi .l{font-size:10.5px;color:var(--gray);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mt5t-kpi .v{font-size:15px;font-weight:750;font-family:var(--mono);font-variant-numeric:tabular-nums;
  overflow:hidden;text-overflow:ellipsis}
.mt5t-dl{padding:20px;overflow:auto}
.mt5t-dl .card{margin-bottom:12px}
.mt5t-file{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.mt5t-file>.material-icons{font-size:34px;color:var(--red);flex:none}
.mt5t-file .meta{min-width:0}
.mt5t-file .meta b{display:block;font-size:14px;overflow:hidden;text-overflow:ellipsis}
@media(max-width:759px){
  .mt5t-grid{grid-template-columns:minmax(0,1fr)}
  .mt5t-watch{max-height:34vh;border-right:0;border-bottom:1px solid var(--line)}
  .mt5t-side{padding:10px}
}

/* V1.10.53 · 侧栏「叶子入口」：没有子项、点击即执行的一级菜单行（如「网页端交易平台」）。
 * 复用 .nav-item 的观感（它本身就是一级项），只补三点差异：
 *   ① 右侧标签 .nl-tag（标注交付方式，如「免下载」）—— 与 .nav-item 的折叠箭头区分开，
 *      客户一眼能看出"这一项不是展开组、而是直接能用的东西"；
 *   ② 与上一个分组之间留出间距，避免被读成上一组的延续项；
 *   ③ 明确 hover/active 态，证明它是可点的（它没有箭头，不点一下看不出能点）。
 * ⚠️ V1.10.6 的 `.nav-sub .nav-launch`（分组内的"开终端"按钮）随本次信息架构调整**已删除** ——
 *    那个快捷动作已挪到本叶子入口上。留着会变成无人引用的死样式，
 *    日后有人误用它又会造出"子项点了不开窗"的困惑（正是本次要消除的那种）。 */
.nav-item.nav-leaf{position:relative;margin-top:6px}
.nav-item.nav-leaf .nl-t{margin-right:auto}
.nav-item.nav-leaf .nl-tag{font-size:9.5px;font-weight:700;letter-spacing:.3px;
  background:var(--red);color:#fff;border-radius:999px;padding:1px 7px;flex:none;white-space:nowrap}
.nav-item.nav-leaf:hover{background:var(--chip);color:var(--ink)}
.nav-item.nav-leaf.active{background:var(--red-soft);color:var(--red);font-weight:600}
.nav-item.nav-leaf:focus-visible{outline:2px solid var(--red);outline-offset:-2px}

/* V1.10.53 · 下载卡片（平台总览页 / 各平台页共用）
 * 为什么不是普通按钮排一行：每个终端要同时表达「是什么 / 多大体积 / 能不能下」三件事，
 * 一行文字按钮塞不下，客户会分不清哪个是 Windows、哪个是手机端。 */
.dl-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(215px,1fr));gap:10px;margin-top:4px}
.dl-card{display:flex;align-items:center;gap:11px;width:100%;text-align:left;font-family:inherit;
  padding:12px 13px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--card);
  cursor:pointer;transition:border-color .15s,background-color .15s}
.dl-card:hover:not(.off){border-color:var(--red);background:var(--red-soft)}
.dl-card:focus-visible{outline:2px solid var(--red);outline-offset:-2px}
.dl-card .ic{flex:none;width:34px;height:34px;border-radius:9px;background:var(--chip);
  display:flex;align-items:center;justify-content:center;color:var(--ink-2)}
.dl-card:hover:not(.off) .ic{background:var(--red);color:#fff}
.dl-card .bd{min-width:0;flex:1}
.dl-card .bd b{display:block;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dl-card .bd .sb{display:block;font-size:11px;color:var(--gray);margin-top:1px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dl-card .act{flex:none;font-size:12px;font-weight:600;color:var(--red);white-space:nowrap}
/* 未分发：不可点、视觉降级，且按钮文字明确写「未分发」——不给死链，也不假装能下 */
.dl-card.off{opacity:.55;cursor:not-allowed;background:var(--chip)}
.dl-card.off .act{color:var(--gray);font-weight:500}

/* V1.10.24 安全中心卡片头在窄屏允许换行
 * 缺陷（实测）：安全中心「全量安全事件审计」的卡片头放了 3 个筛选下拉 + 关键字输入 + 2 个按钮，
 * 桌面端 .card-h 不换行 → 390px 下把整页撑到 scrollWidth 614（document 级横向溢出，
 * 表格本身有 .table-wrap 可横向滚动，但工具行没有）。
 * 修法与 .quant-main 同款：允许卡片头与工具组换行、允许标题收缩、下拉与输入框不超宽。
 * 排查方法记在案：逐个 display:none 卡片/子块读 documentElement.scrollWidth，定位到回落值的那一块。 */
#secw-body .card-h{flex-wrap:wrap;row-gap:9px}
#secw-body .card-h .right{margin-left:0;flex-wrap:wrap;row-gap:8px;width:100%;justify-content:flex-end}
#secw-body .card-h>h3{min-width:0}
#secw-body .card-h select,#secw-body .card-h input{max-width:100%}
@media(min-width:900px){
  #secw-body .card-h .right{margin-left:auto;width:auto}
}

/* ============================================================ V1.10.25 顶栏工作台
   消息中心 / 通知中心（右侧滑出面板）· 用户菜单（下拉）· 应用市场（卡片网格）。
   对标 Broctagon Back Office 的形态，但只保留真实可用的动作。 */

/* 顶栏图标未读徽标（沿用 .dot 的视觉，独立类名避免与其它页面冲突） */
.tb-dot{position:absolute;top:-5px;right:-6px;background:var(--red);color:#fff;font-size:10px;border-radius:20px;padding:1px 6px;font-weight:700;line-height:1.5;pointer-events:none}
.avatar{display:inline-flex;align-items:center;justify-content:center;gap:1px;width:auto;min-width:32px;padding:0 6px 0 0;height:32px}
.tb-caret{font-size:16px;margin-left:-2px;opacity:.85}
.tb-user{position:relative;display:inline-flex;align-items:center}

/* ---------- 用户菜单（下拉） ---------- */
.wb-menu{position:absolute;top:calc(100% + 8px);right:0;width:288px;background:var(--card);border:1px solid var(--line);border-radius:14px;box-shadow:0 18px 48px rgba(0,0,0,.45);z-index:120;overflow:hidden;animation:wbIn .16s ease}
@keyframes wbIn{from{transform:translateY(-6px);opacity:.5}to{transform:none;opacity:1}}
.wb-me{display:flex;gap:11px;align-items:center;padding:14px 14px 12px;border-bottom:1px solid var(--line)}
.wb-av{width:40px;height:40px;border-radius:50%;background:var(--red);color:#fff;display:grid;place-items:center;font-weight:700;font-size:16px;flex:0 0 auto}
.wb-meb{min-width:0}
.wb-men{font-weight:700;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wb-mee{font-size:12px;color:var(--ink-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wb-mei{font-size:11px;color:var(--gray);margin-top:2px}
.wb-mlist{padding:6px}
.wb-mfoot{padding:6px;border-top:1px solid var(--line)}
.wb-mi{display:flex;align-items:center;gap:10px;width:100%;padding:9px 10px;border:0;background:transparent;border-radius:9px;cursor:pointer;font-size:13.5px;text-align:left;color:var(--ink)}
.wb-mi:hover{background:var(--chip)}
.wb-mi.danger{color:var(--red)}
.wb-mi-go{margin-left:auto;opacity:.5}
.wb-mi-tag{margin-left:auto;font-size:11px;color:var(--gray);border:1px solid var(--line);border-radius:20px;padding:1px 8px}
.wb-mi-tag.on{color:#4ADE9B;border-color:#2A5A44}
.wb-mi-s{font-size:11.5px;color:var(--gray);padding:6px 10px 2px}

/* ---------- 滑出面板（消息中心 / 通知中心） ---------- */
.wb-panel{display:flex;flex-direction:column;height:100%;min-height:100%}
.wb-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:16px 16px 12px;border-bottom:1px solid var(--line);position:sticky;top:0;background:var(--card);z-index:2}
.wb-title{display:flex;align-items:center;gap:9px;min-width:0}
.wb-title h3{font-size:15.5px;font-weight:700;white-space:nowrap}
.wb-acts{display:flex;align-items:center;gap:6px;flex:0 0 auto}
.wb-tabs{display:flex;gap:6px;padding:10px 16px;border-bottom:1px solid var(--line);flex-wrap:wrap;position:sticky;top:57px;background:var(--card);z-index:1}
.wb-tabs .tab{padding:4px 12px;border-radius:20px;font-size:12.5px;border:1px solid var(--line);cursor:pointer}
.wb-tabs .tab.active{background:rgba(247,94,112,.16);color:var(--red);border-color:transparent}
.wb-scroll{flex:1;overflow-y:auto;padding:8px 12px 14px}
.wb-item{display:flex;gap:11px;align-items:flex-start;padding:11px 10px;border-radius:11px;cursor:pointer;border:1px solid transparent}
.wb-item:hover{background:var(--chip);border-color:var(--line)}
.wb-item.hi{border-left:3px solid var(--red)}
.wb-ic{width:32px;height:32px;border-radius:9px;background:var(--chip);display:grid;place-items:center;flex:0 0 auto;color:var(--ink-2)}
.wb-item.lv-warn .wb-ic{color:#F7C86A}
.wb-item.lv-ok .wb-ic{color:#4ADE9B}
.wb-item.lv-info .wb-ic{color:#8AB4FF}
.wb-bd{min-width:0;flex:1}
.wb-t{font-size:13.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wb-s{font-size:12px;color:var(--ink-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:1px}
.wb-meta{display:flex;flex-direction:column;align-items:flex-end;gap:4px;flex:0 0 auto}
.wb-time{font-size:11px;color:var(--gray);white-space:nowrap}
.wb-empty{display:flex;flex-direction:column;align-items:center;gap:8px;padding:52px 16px;color:var(--gray)}
.wb-empty .material-icons{font-size:38px;opacity:.5}
.wb-foot{padding:0 16px 16px}
.wb-ver{border:1px solid var(--line);border-radius:12px;padding:12px 13px;background:var(--bg)}
.wb-ver-h{display:flex;align-items:center;gap:7px;font-size:13px;margin-bottom:6px}
.wb-ver-h .material-icons{color:var(--red)}
.wb-ver-b{font-size:12.5px;color:var(--ink-2);line-height:1.75;margin-bottom:10px}
.wb-note{font-size:13px;line-height:1.95}
.wb-note ol{padding-left:20px}

/* ---------- 下载中心 ---------- */
.wb-dl{display:flex;flex-direction:column;gap:10px}
.wb-dlc{display:flex;gap:12px;align-items:center;border:1px solid var(--line);border-radius:12px;padding:13px;background:var(--bg)}
.wb-dli{width:38px;height:38px;border-radius:10px;background:var(--chip);display:grid;place-items:center;flex:0 0 auto;color:var(--ink-2)}
.wb-dlb{min-width:0;flex:1}
.wb-dla{flex:0 0 auto}

/* ---------- 应用市场 ---------- */
.apps-tools{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.apps-tools input{width:190px;background:var(--bg);border:1px solid var(--line);border-radius:9px;padding:6px 11px;font-size:13px}
.apps-stat{font-size:12.5px;color:var(--gray);margin:10px 0 2px}
.apps-sec{margin-top:16px}
.apps-sec-h{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:700;color:var(--ink-2);margin-bottom:10px}
.apps-sec-h span{background:var(--chip);border-radius:20px;padding:0 8px;font-size:11px;font-weight:600;color:var(--gray)}
.apps-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(252px,1fr));gap:12px}
.app-card{border:1px solid var(--line);border-radius:14px;padding:14px;background:var(--bg);display:flex;flex-direction:column;gap:9px;min-width:0;transition:.15s}
.app-card.on{border-color:#2A5A44}
.app-card.off{opacity:.82}
.app-card:hover{box-shadow:var(--shadow)}
.app-top{display:flex;align-items:center;justify-content:space-between;gap:8px}
.app-ic{width:38px;height:38px;border-radius:11px;background:var(--chip);display:grid;place-items:center;color:var(--red)}
.mi-22{font-size:22px}
.app-nm{font-size:14px;font-weight:700}
.app-ds{font-size:12.5px;color:var(--ink-2);line-height:1.7;flex:1}
.app-ft{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:2px}
.app-cat{font-size:11px;color:var(--gray);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* 窄屏：面板铺满、卡片单列、右键工具行换行（避免把整页撑出横向滚动） */
@media(max-width:640px){
  .drawer{width:100vw}
  .apps-grid{grid-template-columns:1fr}
  .wb-menu{width:min(288px,92vw)}
  .wb-head{flex-wrap:wrap;row-gap:8px}
  .wb-acts{width:100%;justify-content:flex-end}
  .wb-tabs{position:static}
}

/* ---------------------------------------------------------------- 设置中心（V1.10.26）
   对标 Broctagon Back Office：左侧「客户端 / 后台」两节模块树 + 右侧模块内容。
   ⚠️ 窄屏栅格必须 minmax(0,1fr) + 子项 min-width:0，否则长文本会把整页撑出横向滚动。 */
.sc-wrap{display:grid;grid-template-columns:252px minmax(0,1fr);gap:18px;margin-top:14px;align-items:start}
.sc-nav{border-right:1px solid var(--line);padding-right:12px;position:sticky;top:74px;max-height:calc(100vh - 108px);overflow:auto}
.sc-sec{margin-bottom:14px}
.sc-sec-h{display:flex;align-items:baseline;gap:8px;font-size:11.5px;font-weight:700;letter-spacing:.4px;color:var(--gray);text-transform:uppercase;padding:4px 8px}
.sc-item{display:flex;align-items:center;gap:9px;padding:7px 9px;border-radius:9px;cursor:pointer;font-size:13px;color:var(--ink-2);min-width:0}
.sc-item:hover{background:var(--chip)}
.sc-item.active{background:var(--chip);color:var(--ink);font-weight:600;box-shadow:inset 2px 0 0 var(--red)}
.sc-item.kid{padding-left:22px;font-size:12.5px}
.sc-item .material-icons{font-size:17px;color:var(--gray);flex:0 0 auto}
.sc-item.active .material-icons{color:var(--red)}
.sc-item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sc-dot{width:6px;height:6px;border-radius:50%;background:#35C88A;margin-left:auto;flex:0 0 auto}
.sc-grp-h{display:flex;align-items:center;gap:8px;padding:7px 9px;border-radius:9px;cursor:pointer;font-size:13px;color:var(--ink-2)}
.sc-grp-h:hover{background:var(--chip)}
.sc-grp-h span{flex:1}
.sc-grp .sc-kids{display:none}
.sc-grp.open .sc-kids{display:block}
.sc-grp.open>.sc-grp-h{color:var(--ink);font-weight:600}
.sc-body{min-width:0}
.sc-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap}
.sc-title{font-size:15px;font-weight:700}
.sc-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:14px;margin-top:6px}
.sc-cell{min-width:0}
/* ⚠️ 主题里的输入框样式只覆盖 `.field` 内部（`.field input{...}`），设置中心的字段不在 .field 内，
 * 缺少下面三条时控件会回落到浏览器默认的**白底**，而文字继承深色主题的浅色 → 内容不可见。
 * 这里把同一套外观显式复制给设置中心的控件，不与 .field 的间距/标签规则耦合。 */
.sc-cell input,.sc-cell select,.sc-cell textarea{width:100%;padding:10px 12px;border:1px solid var(--line);border-radius:9px;background:var(--card);outline:none;transition:.15s;color:var(--ink)}
body.dark .sc-cell input,body.dark .sc-cell select,body.dark .sc-cell textarea{background:#2E2B2C}
.sc-cell input:focus,.sc-cell select:focus,.sc-cell textarea:focus{border-color:var(--red);box-shadow:0 0 0 3px var(--red-soft)}
.sc-cell input::placeholder,.sc-cell textarea::placeholder{color:var(--gray);opacity:.75}
.sc-cell input[type=color]{width:44px;padding:0;border-radius:8px;cursor:pointer;background:none}
.sc-cell.wide{grid-column:1/-1}
.sc-opts{display:flex;gap:6px;flex-wrap:wrap;margin-top:6px}
.sc-opt{cursor:pointer;padding:3px 11px;border-radius:20px;font-size:12.5px;background:var(--chip);color:var(--ink-2);border:1px solid transparent;white-space:nowrap}
.sc-opt:hover{border-color:var(--line)}
.sc-opt.on{background:var(--red);color:#fff}
.sc-color{width:44px;height:34px;padding:0;border:1px solid var(--line);border-radius:8px;background:none;cursor:pointer}
.sc-tabs{display:flex;gap:6px;flex-wrap:wrap;margin-top:12px;border-bottom:1px solid var(--line);padding-bottom:10px}
.sc-tab{cursor:pointer;padding:4px 12px;border-radius:20px;font-size:12.5px;background:var(--chip);color:var(--ink-2)}
.sc-tab.on{background:var(--red);color:#fff}
@media(max-width:900px){
  .sc-wrap{grid-template-columns:1fr;gap:12px}
  .sc-nav{border-right:none;border-bottom:1px solid var(--line);padding-right:0;padding-bottom:10px;max-height:240px}
}

/* ==================================================== V1.10.27 交易平台接入控制台
   窄屏硬规则：栅格一律 minmax(0,1fr) 且子项 min-width:0，否则长端点地址会把整页撑出横向滚动。 */
.plat-card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);margin-top:14px;overflow:hidden}
.plat-card-h{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;padding:14px 16px;border-bottom:1px solid var(--line);flex-wrap:wrap}
.plat-card-l{min-width:0}
.plat-name{font-size:15.5px;font-weight:700;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.plat-caps{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.plat-cap{font-size:11.5px;padding:2px 9px;border-radius:20px;background:var(--chip);color:var(--gray);border:1px solid var(--line)}
.plat-cap.on{background:rgba(18,183,106,.12);color:var(--done);border-color:rgba(18,183,106,.35);font-weight:600}
.plat-docs{display:flex;gap:8px;flex-wrap:wrap}
.plat-doc{font-size:12px;color:var(--info);text-decoration:none;border:1px solid var(--line);border-radius:8px;padding:4px 10px;white-space:nowrap}
.plat-doc:hover{border-color:var(--info)}
.plat-ch{border-bottom:1px solid var(--line);padding:13px 16px}
.plat-ch:last-child{border-bottom:none}
.plat-ch-h{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap}
.plat-ch-t{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0}
.plat-ch-t b{font-size:14px}
.plat-ch-a{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.plat-st{font-size:11.5px;font-weight:700;padding:3px 10px;border-radius:20px;white-space:nowrap}
.plat-st.ok{background:rgba(18,183,106,.14);color:var(--done)}
.plat-st.mid{background:rgba(247,144,9,.14);color:var(--warn)}
.plat-st.no{background:var(--chip);color:var(--gray)}
.plat-st.bad{background:rgba(215,13,36,.12);color:var(--red)}
.plat-note{font-size:12px;color:var(--ink-2);line-height:1.75;margin-top:8px;min-width:0}
.plat-probe{font-size:12px;margin-top:8px;border-radius:8px;padding:7px 10px;line-height:1.6;word-break:break-word}
.plat-probe.ok{background:rgba(18,183,106,.10);color:var(--done)}
.plat-probe.bad{background:rgba(247,144,9,.12);color:var(--warn)}
.plat-body{display:none;margin-top:12px;padding-top:12px;border-top:1px dashed var(--line)}
.plat-ch.open .plat-body{display:block}
.plat-acts{display:flex;gap:10px;margin-top:12px;flex-wrap:wrap}
.plat-paths{margin-top:12px;font-size:12px;color:var(--ink-2)}
.plat-paths summary{cursor:pointer;font-weight:600}
.plat-pre{background:var(--chip);border:1px solid var(--line);border-radius:8px;padding:10px 12px;margin-top:8px;overflow-x:auto;
  font-family:var(--mono);font-size:11.5px;line-height:1.8;white-space:pre;color:var(--ink)}
.plat-add{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:12px}
.plat-add select,.plat-add input{padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:var(--card);color:var(--ink);font-size:13px;min-width:0}
.plat-add select{min-width:200px}
.tbl-wrap{overflow-x:auto}
.tbl{width:100%;border-collapse:collapse;font-size:12.8px}
.tbl th{font-size:11.5px;color:var(--gray);font-weight:600;text-align:left;padding:8px 10px;border-bottom:1px solid var(--line);white-space:nowrap}
.tbl td{padding:9px 10px;border-bottom:1px solid var(--line);color:var(--ink)}
.tbl tbody tr:last-child td{border-bottom:none}
.plat-matrix th,.plat-matrix td{text-align:center}
.plat-matrix th:first-child,.plat-matrix td:first-child,.plat-matrix th:nth-child(2),.plat-matrix td:nth-child(2){text-align:left}
.mx-dot{display:inline-block;width:9px;height:9px;border-radius:50%;background:var(--line)}
.mx-dot.on{background:var(--done)}
.pill.p-ok{background:rgba(18,183,106,.14);color:var(--done)}
.pill.p-mid{background:rgba(247,144,9,.14);color:var(--warn)}
.pill.p-no{background:var(--chip);color:var(--gray)}
/* V1.10.28 数据同步：`.p-no` 语义是「不可用 / 灰」而不是「出错了」——
 * 差异与失败要用**红色**，所以另起一个 p-bad，避免把「没有」和「不对」画成同一个颜色。 */
.pill.p-bad{background:rgba(215,13,36,.12);color:var(--red)}
/* 金额列右对齐 + 等宽数字：一列数扫一眼就能比大小，不用逐位对齐 */
.tbl .num{text-align:right;font-variant-numeric:tabular-nums}
.tbl th.num{text-align:right}
@media(max-width:900px){
  .plat-card-h,.plat-ch-h{flex-direction:column;align-items:stretch}
  .plat-add select{min-width:0;width:100%}
  .plat-add input{flex:1 1 100%;max-width:none!important}
}
