:root{
  --bg:#f6f8fb; --ink:#0f172a; --muted:#64748b; --line:#e2e8f0;
  --brand:#2563eb; --brand2:#1e3a8a; --accent:#0ea5e9;
  --ok:#16a34a; --warn:#d97706; --bad:#dc2626; --card:#ffffff;
}
*{box-sizing:border-box}
body{margin:0;font-family:"Segoe UI",system-ui,-apple-system,"Microsoft YaHei",sans-serif;
  color:var(--ink);background:var(--bg);line-height:1.6}
/* r91（2026-09-23）用户口径「字体统一」：
   表单控件（button/input/select/option）与等宽片段（code/pre）原本落到浏览器 UA 默认字体
   —— 控件是 Arial、等宽是 monospace，两套都没有中文字形，Windows 上中文一律回退成宋体。
   实测症状：页面里 `fund.fund_attribute.基金名称` 这类表名/字段名 code 片段、
   以及「+ 上传净值表」「搜索」等按钮都显示为宋体。这里统一补中文回退：
   英文部分外观不变，只有中文字形回到站点基准黑体。 */
button,input,select,textarea,optgroup,option{font-family:inherit}
a{color:var(--brand);text-decoration:none}
.wrap{max-width:1080px;margin:0 auto;padding:0 20px}
.muted{color:var(--muted)}
.small{font-size:13px}

/* topbar */
/* r287：品牌「·」左右空白收窄 —— 顶栏 flex gap 已给 8px，margin 取负抵消到 6px；
   页脚 / 导语无 gap，margin 3px 即净空白 */
.topbar{background:#fff;border-bottom:1px solid var(--line);position:sticky;top:0;z-index:10}
.nav{display:flex;align-items:center;justify-content:space-between;height:58px}
.brand{font-weight:800;font-size:20px;color:var(--brand2)}
.brand .bdot,.brand .bzh{color:var(--muted);font-weight:500;font-size:14px}
.bdot{margin:0 3px}
.brand .bdot{margin-left:-2px;margin-right:-2px}
.nav nav{display:flex;align-items:center;gap:18px}
.nav nav a{color:#334155;font-size:15px}
.nav nav a.active,.nav nav a:hover{color:var(--brand)}
.btn{display:inline-block;padding:9px 18px;border-radius:8px;font-size:14px;font-weight:600;cursor:pointer;border:1px solid transparent;margin:0}
.btn.primary{background:var(--brand);color:#fff}
.btn.primary:hover{background:var(--brand2)}
.btn.ghost{background:#fff;color:var(--brand);border-color:var(--brand)}
.btn.small{padding:5px 10px;font-size:13px}
/* r332：工具条里的按钮与标签栏、搜索框同档（34px 高 / 13px 字 / padding 0 15px = .nav-tab 同款）。
   限定在 .admin-toolbar 下：弹窗内、表格行内的 .btn.small 不受影响。 */
.admin-toolbar .btn.small{display:inline-flex;align-items:center;justify-content:center;
  height:34px;padding:0 15px;font-size:13px}
.btn.danger{background:#fff;color:var(--bad);border-color:#fecaca}
.btn.danger:hover{background:#fef2f2}

/* hero */
.hero{padding:64px 0 48px;text-align:center;background:linear-gradient(135deg,#eff6ff,#f6f8fb)}
.hero h1{font-size:40px;margin:0 0 14px;color:var(--brand2);line-height:1.25}
.hero h1 .sub-brand{font-size:18px;font-weight:600;color:var(--muted);margin-left:10px}
.lead{font-size:18px;color:var(--muted);max-width:680px;margin:0 auto 26px}
.cta{display:flex;gap:14px;justify-content:center}

/* blocks */
.block{padding:54px 0}
.block.alt{background:#fff;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.block h2{font-size:28px;margin:0 0 24px;color:var(--brand2)}
.sub{margin:28px 0 14px;font-size:18px;color:#334155}
.section-desc{color:var(--muted);font-size:15px;margin:-10px 0 22px;max-width:720px}
.note{margin-top:18px;color:var(--muted);font-size:13px}

/* two-pillar business */
.pillars{display:grid;grid-template-columns:repeat(2,1fr);gap:22px;margin-top:8px}
.pillar{background:var(--card);border:1px solid var(--line);border-radius:16px;padding:26px;box-shadow:0 2px 8px rgba(15,23,42,.05);display:flex;flex-direction:column}
.pillar:nth-child(1){border-top:4px solid var(--brand)}
.pillar:nth-child(2){border-top:4px solid var(--accent)}
.pico{width:44px;height:44px;border-radius:12px;background:linear-gradient(135deg,var(--brand),var(--brand2));color:#fff;display:flex;align-items:center;justify-content:center;font-size:22px;font-weight:800;margin-bottom:14px}
.pillar:nth-child(2) .pico{background:linear-gradient(135deg,var(--accent),#0369a1)}
.pillar h3{margin:0 0 4px;font-size:22px;color:var(--brand2)}
.ptag{margin:0 0 12px;font-size:13px;font-weight:600;color:var(--accent);letter-spacing:.3px}
.pillar>p{margin:0 0 14px;color:#334155;font-size:15px}
.plist{margin:0 0 16px;padding-left:20px;color:var(--muted);font-size:14px}
.plist li{margin:6px 0}
.expand{margin:18px 0 16px;padding:10px 12px;background:#f0f9ff;border:1px solid #bae6fd;border-radius:10px;font-size:13px;color:#075985}
.expand b{color:var(--accent)}
.pcta{display:flex;gap:10px;margin-top:auto}

/* grids */
.grid4{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}
.grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.grid2{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}
.card{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:24px;box-shadow:0 1px 3px rgba(15,23,42,.06)}
.card.slim{padding:18px}
.card h3,.card h4{margin:8px 0 6px;color:var(--brand2)}
.card p{margin:0;color:var(--muted);font-size:14px}
.tag{display:inline-block;font-size:11px;letter-spacing:1px;color:var(--accent);background:#e0f2fe;padding:2px 8px;border-radius:999px}

.table-scroll{width:100%;overflow-x:auto;border:1px solid var(--line);border-radius:8px}
.table-scroll .doc-tbl{width:100%;min-width:520px;margin:0}


/* steps */
.steps{display:grid;grid-template-columns:repeat(5,1fr);gap:14px}
.step{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:22px}
.num{width:30px;height:30px;border-radius:50%;background:var(--brand);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;margin-bottom:10px}
.step h4{margin:0 0 6px;font-size:15px}
.step p{margin:0;font-size:13px;color:var(--muted)}

/* price */
.pricing-wrap{display:grid;grid-template-columns:repeat(2,1fr);gap:22px}
.price-table{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:22px;box-shadow:0 1px 3px rgba(15,23,42,.05)}
.price-table h3{margin:0 0 16px;font-size:18px;color:var(--brand2)}
.price-table table{width:100%;border-collapse:collapse;font-size:14px}
.price-table th,.price-table td{padding:14px 10px;text-align:left;border-bottom:1px solid var(--line)}
.price-table th:nth-child(2),.price-table td:nth-child(2){text-align:right}
.price-table th{background:#f8fafc;color:#475569;font-weight:600}
.price-table tr:last-child td{border-bottom:none}
.price-table .role{font-weight:600;color:var(--brand2)}

/* edition comparison (homepage) */
.edition-tbl{width:100%;border-collapse:collapse;font-size:14px;min-width:520px;background:#f4f8ff}
.edition-tbl th,.edition-tbl td{padding:13px 12px;text-align:left;border-bottom:1px solid var(--line)}
.edition-tbl th{background:#e7f0ff;color:var(--brand2);font-weight:700;border-bottom:2px solid #cfe0ff}
.edition-tbl td:first-child{font-weight:600;color:var(--brand2)}
.edition-tbl .yes{color:var(--brand);font-weight:700;text-align:center}
.edition-tbl .no{color:var(--muted);text-align:center}
.price-table .tax{color:var(--brand);font-weight:700;font-size:16px}
/* payment */
.pay-wrap{display:grid;grid-template-columns:1fr;gap:16px;align-items:stretch;width:100%}
.pay-card{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:24px;box-shadow:0 1px 3px rgba(15,23,42,.05);display:flex;flex-direction:column}
.pay-card h3{margin:0 0 10px;color:var(--brand2)}
.pay-card .small{margin:0 0 14px;color:var(--muted);font-size:13px}
.pay-card .qr{display:block;max-width:220px;width:100%;margin:auto auto 0;border:1px solid var(--line);border-radius:10px}
.pay-table{width:100%;border-collapse:collapse;font-size:15px}
.pay-table td{padding:14px 10px;border-bottom:1px solid var(--line);vertical-align:top}
.pay-table td:first-child{width:90px;color:var(--muted);font-size:14px}
.pay-table tr:last-child td{border-bottom:none}
.price{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:20px;text-align:center}
.price h4{margin:0 0 10px;color:var(--brand2)}
.amount{font-size:26px;font-weight:800;color:var(--brand)}
.amount small{font-size:13px;font-weight:500;color:var(--muted)}
.price p{color:var(--muted);font-size:13px;margin:8px 0 0}

/* auth */
.auth{max-width:420px;margin:60px auto;background:#fff;border:1px solid var(--line);border-radius:14px;padding:30px}
.auth h2{margin:0 0 6px;color:var(--brand2)}
.form{display:flex;flex-direction:column;gap:14px;margin-top:18px}
.form label{display:flex;flex-direction:column;gap:6px;font-size:14px;color:#334155}
.form input{padding:10px 12px;border:1px solid var(--line);border-radius:8px;font-size:15px}
.form input:focus{outline:2px solid #bfdbfe;border-color:var(--brand)}

/* dashboard / tables */
.dash{max-width:980px;margin:36px auto}
.admin{max-width:980px;margin:0 auto}
.dash-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}
.stat{background:#fff;border:1px solid var(--line);border-radius:10px;padding:12px 16px;margin-bottom:16px;color:#334155}
.tbl{width:100%;border-collapse:collapse;background:#fff;border:1px solid var(--line);border-radius:10px;overflow:hidden;font-size:14px}
.tbl th,.tbl td{padding:11px 12px;text-align:left;border-bottom:1px solid var(--line)}
.tbl th{background:#f1f5f9;color:#475569;font-weight:600}
.tbl tr:last-child td{border-bottom:none}
.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,"Microsoft YaHei",monospace}
.prod{font-weight:600;color:var(--brand2)}
.badge{padding:2px 10px;border-radius:999px;font-size:12px;font-weight:600}
.badge.active{background:#dcfce7;color:var(--ok)}
.badge.expired{background:#fee2e2;color:var(--bad)}
.badge.pending{background:#fef3c7;color:var(--warn)}
.copy{margin-left:8px;border:1px solid var(--line);background:#fff;border-radius:6px;padding:2px 8px;font-size:12px;cursor:pointer}
.empty{padding:40px;text-align:center;color:var(--muted);background:#fff;border:1px dashed var(--line);border-radius:10px}

/* admin */
.panel{background:#fff;border:1px solid var(--line);border-radius:10px;padding:14px;margin-bottom:20px}
.cust{background:#fff;border:1px solid var(--line);border-radius:10px;padding:16px;margin-bottom:18px}
.cust-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
.ops{display:flex;gap:8px}
.inline{display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;align-items:center}
.inline input,.inline select{padding:8px 10px;border:1px solid var(--line);border-radius:8px;font-size:14px}
.adduser{background:#f8fafc;padding:12px;border-radius:8px}
.row-form{display:inline-flex;flex-wrap:wrap;gap:8px;align-items:center}
.row-form input,.row-form select{padding:7px 9px;border:1px solid var(--line);border-radius:8px;font-size:14px}
.row-form .pw{width:120px}
.cust-table .acc{min-width:140px;line-height:1.5}
.cust-table .ops{white-space:nowrap}
.cust-table .add-row td{background:#f8fafc}
.flash{background:#eff6ff;border:1px solid #bfdbfe;color:var(--brand2);padding:10px 14px;border-radius:8px;margin-bottom:16px}

/* footer */
/* r226（2026-10-06）：深色块 → 与正文同底色（var(--bg)）+ 顶端一条灰线。用户口径
   「背景不要深色，跟前面背景一样的颜色就行了。然后划一条灰色的线区分一下就行了。」
   r311（2026-10-08）：登录后页脚收敛为**同一版式**（品牌行 + 备案行 + 版权行），三份实现
   （app.py 公开页 / 客户中心、admin_layout.py 后台、sqg848_module.py 客户系统）共用本样式表。
   原 `.foot .biz` 系（后台页脚的商务合作 / 办公地址块）已随该块一并删除；
   联系方式的唯一落点回到 `/about#contact`（`_BIZ_LINES` / `_BIZ_ADDR` / `_BIZ_EMAIL`）。
   ⚠️ 改本文件必须同步全站 5 处 style.css?v= 缓存版本号（清单见 guides_module.py 顶部注释）。 */
/* r317（2026-10-08）：页脚由「三行块」收成**一行条**，与顶栏等高（用户口径：「页眉页脚的高度
   一致一下，现在看着页眉高度小、页脚高度大」）。
   实测：顶栏 `.nav{height:60px}` + 1px 下边线 = 61px；页脚原 `padding:26px 0` + 品牌行 + 版权行
   = 140px ⇒ 头轻脚重。现改 `.foot-in` 一行两列（左品牌 / 右版权+备案号），
   min-height:60px + 1px 上边线 = 61px，与顶栏逐像素等高。
   备案号随之由「整行 `.beian`」改「行内片段」（`admin_layout.beian_inline()`，拼在版权句末）
   ⇒ 页脚恒为一行，管局下号后高度不变。`.foot .beian` 三条规则随整行实现一并删除。
   窄屏（≤560px）折成两行居中，不再强求等高。 */
.foot{background:var(--bg);color:#334155;border-top:1px solid var(--line);font-size:14px}
.foot-in{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-start;gap:18px;min-height:58px}
/* `<p>` 的 UA 默认 margin:1em 0 在桌面被 min-height 吸收、窄屏 column 后暴露（实测手机 132px）
   ⇒ 清零。桌面高度不受影响（内容 22.4px < min-height 60px）。 */
.foot-in>p{margin:0}
.foot .muted{color:var(--muted)}
.foot a{color:var(--muted);text-decoration:none}
.foot a:hover{text-decoration:underline;color:var(--brand)}

@media(max-width:900px){
  .grid4,.grid3{grid-template-columns:repeat(2,1fr)}
  .grid2,.pay-wrap{grid-template-columns:1fr}
  .pillars,.pricing-wrap{grid-template-columns:1fr}
  .steps{grid-template-columns:1fr}
  .hero h1{font-size:30px}
  .nav nav{gap:10px;font-size:13px}
}
@media(max-width:560px){
  .grid4,.grid3{grid-template-columns:1fr}
  .tbl{font-size:12px}
  /* r317：窄屏页脚折成两行居中（不再强求与顶栏等高） */
  .foot-in{min-height:0;padding:9px 0}
}

/* client center */
.client{display:flex;gap:0;max-width:1080px;margin:0 auto;padding:0 20px;align-items:flex-start}
/* r115：后台（admin_layout 外壳）统一全屏宽。
   此前只有「净值更新」一页用页面级 body:has(.nvpage) 放宽到 1480，其余二级页被
   .client(1080) 与 .admin(980) 双重钳在中间 ⇒ 同一个后台宽窄不一（实测 1920 视口下
   nav-update 1212px、其余页 812px）。现改为：凡 admin_layout 产出的页面
   （<body class="admin-shell">）一律 max-width:none。
   ⚠️ .wrap（顶栏 / 页脚）、.client（正文）、.admin（卡片）必须**一起**放宽 ——
      只放宽其中一层会让表格比页头多伸出一截、左右对不齐。 */
body.admin-shell .wrap,
body.admin-shell .client,
body.admin-shell .admin{max-width:none}
.cnav{position:sticky;top:60px;align-self:flex-start;width:200px;flex:0 0 200px;padding:24px 0;border-right:1px solid var(--line)}
.cnav-item{display:block;padding:7px 14px 7px 26px;border-radius:8px;color:#64748b;font-size:13px;margin-bottom:3px}
.cnav-item:hover{background:#eff6ff;color:var(--brand)}
.cnav-item.active{background:var(--brand);color:#fff;font-weight:600}

/* error-log page (20260911) */
.cnav-item{display:flex;align-items:center;justify-content:space-between;gap:8px}
.cnav-badge{flex:0 0 auto;min-width:18px;height:18px;padding:0 5px;border-radius:999px;background:var(--bad);color:#fff;font-size:11px;font-weight:600;line-height:18px;text-align:center}
.cnav-item.active .cnav-badge{background:#fff;color:var(--brand)}
/* r108：.sm 与 .small 收敛为同一档「小按钮」——原来是两个尺寸（4px/12px vs 5px/13px），
   同一个后台里「小按钮」大小不一。保留 .sm 作等价别名以免旧用法变样，新代码统一写 .small。 */
.btn.sm{padding:5px 10px;font-size:13px}
.btn[disabled]{opacity:.45;cursor:not-allowed}
.badge.err{background:#fee2e2;color:var(--bad)}
.badge.info{background:#e0f2fe;color:#0369a1}
.inline-form{display:inline-block;margin:0 6px 0 0}
/* r110：错误日志页统一到「标题 / 筛选 / 列表」后**已删除**的类 ——
     .errstat            4 个统计数字与下方标签页计数完全重复
     .logfilter / .logtab 标签页并入统一 .nav-tabs / .nav-tab
     .logdetail          traceback 改为消息格的悬停 title，不再把行撑成多行
     .logmsg / .lognote  单行省略由 .adm-list 统一提供，不再限宽、不再三行截断 */
.logrow.ignored td{opacity:.62}
.logrow.ignored td:first-child{box-shadow:none}
.logrow.unread td{background:#fffafa}
.logrow.unread td:first-child{box-shadow:inset 3px 0 0 var(--bad)}
/* 未读圆点：r110 起并入首列「时间」（原先自占一列且表头为空，钉住它没有意义） */
.logdot{color:var(--bad);font-size:15px;line-height:1;margin-right:6px}
.logacts{white-space:nowrap}
.nowrap{white-space:nowrap}
.small{font-size:12px}
pre,code,kbd,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,"Microsoft YaHei",monospace}
code{background:#f1f5f9;border-radius:4px;padding:1px 5px;font-size:12px}

.cnav-group{margin-bottom:18px}
.cnav-group:last-child{margin-bottom:0}
.cnav-group-title{padding:0 14px 10px;font-size:16px;font-weight:700;letter-spacing:.02em;color:#1f2937}
.cbody{flex:1;min-width:0;padding:64px 0 28px 28px}
.who{color:#475569;font-size:14px;margin-right:8px}
.acct-tbl td:nth-child(1){width:170px;background:#f8fafc;color:var(--muted);font-weight:600}
.alert{padding:12px 16px;border-radius:10px;margin:14px 0;font-size:14px}
.alert.ok{background:#f0fdf4;border:1px solid #bbf7d0;color:#166534}
.alert.warn{background:#fffbeb;border:1px solid #fde68a;color:#92400e}
.pay-email{max-width:480px;margin:8px 0 4px}
/* docs */
.doc{background:#fff;border:1px solid var(--line);border-radius:12px;padding:22px;margin:16px 0;box-shadow:0 1px 3px rgba(15,23,42,.05)}
.myauth-sec{margin:24px 0}
.info-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px 28px;background:#fff;border:1px solid var(--line);border-radius:12px;padding:18px 20px;box-shadow:0 1px 3px rgba(15,23,42,.05)}
.info-card{background:#fff;border:1px solid var(--line);border-radius:12px;padding:18px 20px;box-shadow:0 1px 3px rgba(15,23,42,.05)}
.info-card .info-grid{border:none;box-shadow:none;padding:0;background:transparent}
.auth-foot{display:flex;flex-wrap:wrap;gap:16px 24px;align-items:center;justify-content:space-between;margin-top:18px;padding-top:16px;border-top:1px dashed var(--line)}
.amount-line{display:flex;align-items:baseline;gap:10px}
.amount-label{font-size:14px;color:var(--muted);font-weight:600}
.thanks{margin-top:14px;color:var(--brand);font-weight:700;font-size:15px}
.info-cell{display:flex;flex-direction:column;gap:4px}
.info-cell label{font-size:12px;color:var(--muted);font-weight:600;letter-spacing:.02em}
.info-cell span{font-size:15px;color:#1f2937}
/* r306：客户信息框内的文本型入口（修改密码）。与 .info-cell span 同字号，
   仅以品牌色 + hover 下划线表示可点击，不要做成按钮。 */
.info-cell .pw-link{font-size:15px;color:var(--brand);text-decoration:none;cursor:pointer;transition:color .15s}
.info-cell .pw-link:hover,.info-cell .pw-link:focus{color:var(--brand2);text-decoration:underline;text-underline-offset:2px}
.doc-page{background:#fff;padding:26px 30px;color:#1f2937;max-width:760px;margin:0 auto}
.doc-tbl .right{text-align:right;font-weight:600}
.doc-tbl .money{font-variant-numeric:tabular-nums;font-weight:600}
.doc-tbl tfoot td{border-top:2px solid var(--line);background:#f8fafc;padding:10px 14px}
.doc-tbl tfoot td.right{text-align:right}
.center{text-align:center}

.doc-head{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:12px}
.doc-head h3{margin:0;color:var(--brand2)}
.doc-tbl{width:100%;border-collapse:collapse;font-size:14px;margin-bottom:10px}
.doc-tbl td{padding:11px 14px;border:1px solid var(--line);line-height:1.6}
.doc-tbl td:nth-child(odd){background:#f8fafc;color:var(--muted);width:120px;white-space:nowrap}
.doc-list{margin:0;padding-left:20px;color:#334155;font-size:14px}
.doc-list li{margin:6px 0}
.doc-p{margin:10px 0;line-height:1.75;color:#1f2937;font-size:14px}
.doc-h{margin:18px 0 6px;font-size:17px;color:var(--brand2);border-left:3px solid var(--brand);padding-left:10px}
.doc-note{margin:8px 0;font-size:13px;color:#475569}
/* quote builder */
.quote-builder{padding:22px;margin:16px 0}
.quote-builder h3{margin:0 0 12px;font-size:17px;color:var(--brand2)}
.quote-line{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:12px}
.quote-line select{min-width:280px;flex:1}
.quote-lines{margin-top:10px}
.quote-mini{width:100%;max-width:480px;border-collapse:collapse;font-size:14px}
.quote-mini th,.quote-mini td{padding:7px 9px;border:1px solid var(--line);text-align:left}
.quote-mini th{background:#f8fafc;color:var(--muted);font-weight:500}
.quote-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;margin-bottom:14px}
.quote-form label{display:flex;flex-direction:column;gap:5px;font-size:14px;color:#334155}
.quote-form input{padding:9px 11px;border:1px solid var(--line);border-radius:8px;font-size:14px}
.quote-actions{margin-top:8px}
/* quote doc */
.quote-doc{position:relative}
.quote-tbl{width:100%;border-collapse:collapse;font-size:14px;margin:14px 0}
.quote-tbl th,.quote-tbl td{padding:10px 12px;border:1px solid var(--line);text-align:center}
.quote-tbl th{background:#f8fafc;color:#475569;font-weight:600}
.quote-tbl td:nth-child(2),.quote-tbl td:nth-child(5),.quote-tbl tfoot td{text-align:right}
.quote-tbl tfoot td{background:#f8fafc}
.quote-meta{margin:16px 0;padding:14px;background:#f8fafc;border-radius:10px;font-size:14px}
.quote-meta p{margin:4px 0}
.quote-footer{display:flex;justify-content:flex-end;align-items:flex-end;margin-top:18px;font-size:14px}
.quote-footer p{margin:4px 0}
.quote-stamp{text-align:right}
.quote-seal{width:130px;height:130px;object-fit:contain;opacity:.95}
/* 印章叠在合计行上 */
.qtotal-label{position:relative}
.qseal{position:absolute;right:-30px;top:50%;transform:translateY(-50%);width:104px;height:104px;opacity:.88;pointer-events:none}
/* quote family + roles */
.quote-family{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:6px}
.fam{display:flex;gap:10px;align-items:flex-start;padding:12px;border:1px solid var(--line);border-radius:10px;cursor:pointer}
.fam input{margin-top:3px}
.fam small{color:var(--muted)}
.quote-roles{display:flex;flex-direction:column;gap:10px}
.role-row{display:grid;grid-template-columns:1fr auto auto;align-items:center;gap:12px;padding:12px;border:1px solid var(--line);border-radius:10px}
.role-row.locked{background:#f8fafc}
.role-name{font-size:15px}
.badge.req{display:inline-block;margin-left:6px;padding:1px 7px;font-size:11px;color:#fff;background:var(--brand);border-radius:999px;vertical-align:middle}
.role-price{color:#475569;font-size:14px;white-space:nowrap}
.role-qty{color:var(--muted)}
.role-chk{display:flex;align-items:center;gap:6px;font-size:15px}
.role-qty-in{width:72px;padding:7px 9px;border:1px solid var(--line);border-radius:8px;font-size:14px}
@media(max-width:560px){.quote-family{grid-template-columns:1fr}.role-row{grid-template-columns:1fr}.role-price,.role-qty-in{justify-self:start}}
/* fill-in 表单字段 */
.fill-in{width:100%;padding:7px 9px;border:1px solid var(--line);border-radius:7px;font-size:14px;font-family:inherit;color:#1f2937;background:#fff;box-sizing:border-box}
.fill-in:focus{outline:2px solid #2563eb;border-color:#2563eb}
select.fill-in{cursor:pointer}
/* print */
@page{size:A4;margin:14mm 12mm}
@media print{
  .topbar,.foot,.cnav,.quote-builder,.no-print,.expand{display:none!important}
  .client{padding:0}
  .cbody{padding:0;max-width:none}
  .doc{box-shadow:none;border:none;margin:0 auto;padding:0;max-width:780px}
  .quote-tbl th,.quote-tbl td{font-size:13px;padding:8px}
  .quote-seal{width:110px;height:110px}
  input.fill-in,select.fill-in{border:none;border-bottom:1px solid #94a3b8;border-radius:0;padding:2px 4px;background:none;appearance:none;-webkit-appearance:none}
  body{background:#fff;color:#000}
}
/* PDF 导出模式：截图前去掉卡片阴影/外框，保持干净单据 */
.pdf-mode .doc{box-shadow:none!important;border:none!important;margin:0!important}
.doc-actions{display:flex;gap:10px;margin-top:14px}
/* case / solutions */
.case .case-banner{background:linear-gradient(135deg,#eff6ff,#f6f8fb);border:1px solid var(--line);border-radius:14px;padding:26px;margin-bottom:18px}
.case-banner h3{margin:8px 0 6px;font-size:24px;color:var(--brand2)}
.case-banner p{margin:0;color:#334155}
@media(max-width:900px){
  .client{flex-direction:column}
  .cnav{width:100%;flex:none;border-right:none;border-bottom:1px solid var(--line);display:flex;gap:8px;overflow-x:auto;padding:12px 0}
  .cnav-item{margin-bottom:0;white-space:nowrap}
  .cnav-group{display:flex;align-items:center;gap:8px;flex:0 0 auto;margin-bottom:0}
  .cnav-group-title{padding:0 6px 0 0;white-space:nowrap}
  .cbody{padding:20px 0}
}

/* 首页业务双线区分 */
.eyebrow{display:inline-block;font-size:12px;font-weight:700;letter-spacing:.08em;color:var(--brand);background:#dbeafe;padding:5px 14px;border-radius:999px;margin-bottom:18px}
.band{background:#eaf2ff;margin:0 -20px;padding:54px 20px;border-top:1px solid #d3e3ff;border-bottom:1px solid #d3e3ff}
.divider{display:flex;align-items:center;justify-content:center;gap:18px;padding:14px 0;color:var(--muted);font-size:14px;text-align:center}
/* 首页使用说明备注 */
.home-notes{margin-top:22px;padding:16px 20px;background:#fff8f0;border-left:4px solid var(--brand);border-radius:10px;list-style:none}
.home-notes li{position:relative;padding-left:24px;margin:8px 0;color:#5b4636;font-size:14px;line-height:1.7}
.home-notes li::before{content:"✓";position:absolute;left:0;top:0;color:var(--brand);font-weight:700}
.divider::before,.divider::after{content:"";height:1px;width:120px;background:var(--line)}
.cta-row{display:flex;gap:12px;flex-wrap:wrap;margin-top:22px}

/* 全屏客户中心（无左侧栏）：SQG848 分析等 */
.cbody-full{padding:26px 0 40px}
.cbody-full .panel{background:#fff;border:1px solid var(--line);border-radius:14px;padding:24px;margin-bottom:18px}

/* 我的系统 landing */
.sys-panel{max-width:760px;margin:30px auto;background:#fff;border:1px solid var(--line);border-radius:16px;padding:34px 32px;box-shadow:0 6px 24px rgba(31,42,68,.06)}
.sys-intro h2{margin:0 0 10px;font-size:24px;color:var(--brand2)}
.sys-actions{margin:22px 0 6px}
.btn.big{font-size:16px;padding:12px 26px}
.sys-note{margin-top:16px}

/* 管理后台：客户属性表 */
.attr-panel .attr-row{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding:12px 0;border-top:1px dashed var(--line)}
.attr-panel .attr-row:first-of-type{border-top:none}
.attr-acc{min-width:200px;font-weight:600;color:var(--brand2)}
.attr-pw{width:180px}
.pt-wrap{display:inline-block}

/* r327：「我的授权 / 我的账户」的二级目录胶囊标签（.subtabs / .subtab / .subtab-panel）
   已改用全站唯一的 .nav-tabs / .nav-tab ⇒ 这三条连同那段动画一起作废，就此删除。
   （.subtab-panel 引用的 @keyframes fadeIn 在 style.css 里本就不存在，删掉无副作用。） */
.dl-block{margin-top:18px}
.doc-h2{font-size:15px;color:var(--brand2);margin:0 0 10px;font-weight:700}
.dl-block .btn{margin-top:2px}
.doc-btns{display:flex;flex-wrap:wrap;gap:10px}
.amount{font-size:22px;font-weight:700;color:#0f172a;font-variant-numeric:tabular-nums}

/* 历史授权表格 */
.history-tbl th,.history-tbl td{padding:9px 12px;font-size:13px}
.history-tbl th{white-space:nowrap;color:var(--brand2);font-weight:700;background:#f8fafc}
.history-tbl .center{text-align:center}
.history-tbl td.mono{line-height:1.7}
.history-tbl .ok{color:#1f9d55;font-weight:700}
.history-tbl .no{color:#c0392b;font-weight:700;font-size:16px}

/* 非标准附加项提示 */
.dm-note{display:none;margin:10px 0 0;padding:10px 14px;background:#fff8f0;border-left:4px solid var(--brand);border-radius:8px;color:#5b4636;font-size:13px}

/* ----------------------------- SQG848 资产配置评估系统 ----------------------------- */
.sqg848-body{display:flex;margin:0;height:100vh;overflow:hidden;background:#f3f4f6}
.sqg848-sidebar{width:220px;flex:0 0 220px;background:#1f2937;color:#d1d5db;display:flex;flex-direction:column;overflow-y:auto}
.sqg848-nav-header{display:flex;align-items:center;gap:10px;padding:18px 16px;border-bottom:1px solid #374151}
.sqg848-nav-logo{width:28px;height:28px;border-radius:6px;background:var(--brand);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:14px}
.sqg848-nav-title{font-weight:700;color:#f9fafb;font-size:15px}
.sqg848-nav-group{margin:8px 0}
.sqg848-nav-group-title{padding:8px 16px;font-size:12px;color:#9ca3af;text-transform:uppercase;letter-spacing:.05em}
.sqg848-nav-item{display:block;padding:8px 16px 8px 28px;color:#d1d5db;font-size:14px;border-radius:6px;margin:2px 10px}
.sqg848-nav-item:hover{background:#374151;color:#fff}
.sqg848-nav-item.active{background:var(--brand);color:#fff;font-weight:600}
/* 二级子目录（如「分类资产 > 股票 > 量化指增」）：缩进 + 竖线 + 略小字号，
   让层级关系一眼可见。2026-09-19 r21 新增。 */
.sqg848-nav-sub{margin-left:24px;padding-left:18px;font-size:13px;border-left:2px solid #374151;border-radius:0 6px 6px 0}
.sqg848-nav-sub:hover{border-left-color:#4b5563}
.sqg848-main{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden}
.sqg848-topbar{height:64px;background:#fff;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;padding:0 24px;flex:0 0 64px}
.sqg848-topbar h1{font-size:18px;margin:0;color:#111827;font-weight:700}
.sqg848-user{display:flex;align-items:center;gap:12px;font-size:14px;color:#4b5563}
.sqg848-content{flex:1;min-width:0;overflow:auto;padding:20px 24px}
.sqg848-foot{flex:0 0 64px;background:#fff;border-top:1px solid var(--line);display:flex;align-items:center;padding:0 24px;font-size:12px;color:#9ca3af}
.sqg848-tabs{display:flex;gap:8px;margin:0 0 18px;flex-wrap:wrap}
.sqg848-tab{display:inline-block;padding:7px 16px;border-radius:999px;font-size:13px;font-weight:600;background:#fff;border:1px solid var(--line);color:#4b5563}
.sqg848-tab:hover{border-color:var(--brand);color:var(--brand)}
.sqg848-tab.active{background:var(--brand);border-color:var(--brand);color:#fff}
.sqg848-sec{background:#fff;border:1px solid var(--line);border-radius:12px;margin-bottom:18px;overflow:hidden}
.sqg848-sec-head{background:#fff;border-bottom:1px solid var(--line);padding:14px 18px 14px 28px;font-weight:700;color:#1f2937;font-size:16px;border-left:3px solid var(--brand);margin-left:-1px}
.sqg848-sec-body{padding:18px}
.sqg848-card{background:#fff;border:1px solid var(--line);border-radius:12px;overflow:hidden}
.sqg848-card-title{background:#fff;border-bottom:1px solid var(--line);padding:10px 14px;font-weight:500;color:#6b7280;font-size:13px;text-decoration:underline;text-underline-offset:4px}
.sqg848-card-body{padding:14px 14px 6px 14px}
.sqg848-grid2{display:grid;grid-template-columns:repeat(2,1fr);gap:18px}
.sqg848-chart{width:100%;height:320px}
.sqg848-chart-pie{width:100%;height:280px}
.sqg848-tbl{width:100%;border-collapse:collapse;font-size:13px}
.sqg848-tbl th,.sqg848-tbl td{padding:9px 10px;text-align:left;border-bottom:1px solid var(--line)}
.sqg848-tbl th{background:#f8fafc;color:#4b5563;font-weight:600;white-space:nowrap}
.sqg848-tbl tr:last-child td{border-bottom:none}
.sqg848-tbl .fund-name{max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sqg848-tbl .num{text-align:right;font-variant-numeric:tabular-nums;width:auto;height:auto;border-radius:0;background:transparent;color:inherit;display:table-cell;margin-bottom:0;font-weight:400!important}
.cust-table .num{text-align:right;font-variant-numeric:tabular-nums;width:auto;height:auto;border-radius:0;background:transparent;color:inherit;display:table-cell;margin-bottom:0;font-weight:400!important}
/* 数值列表头同样右对齐，与表内数值一致（2026-09-16）。
   🔴 2026-09-17 修：`.cust-table .num` 的 font-weight:400 带 !important ——
   **!important 压不过特指度，只能靠同样加 !important 才翻得过来**。
   改前它把数值列表头钉在 400 细体，并把底色/下边框顶成 #f8fafc / 1px，
   与其它表头（600 / #f0f4f8 / 2px）肉眼可见地不一致（用户报「存续期限(年) 的
   title 跟别的不一致」）。同理 background 也要显式写：`.cust-table .num` 的
   background:transparent 特指度 (0,2,0) 会盖掉 `.tbl-wrap thead th` 的 (0,1,2)。
   改这两处即可让 存续期限(年) 与 6 个费率列表头同时归位，且**仍保持右对齐**。 */
.cust-table th.num{text-align:right;font-variant-numeric:tabular-nums;font-weight:600!important;
  background:#f0f4f8;border-bottom:2px solid var(--line);color:#475569}
/* r41：去红绿 —— 正=蓝、负=灰（站点取色基调「蓝灰黑」，2026-09-15 裁定） */
.sqg848-tbl .up{color:#2563eb}
.sqg848-tbl .down{color:#9ca3af}
.sqg848-note{color:#4b5563;font-size:14px;margin:0 0 16px;padding:10px 14px;background:#eff6ff;border-radius:8px}
.sqg848-filter{margin-bottom:16px}
.sqg848-filter label{font-size:14px;color:#4b5563}
.sqg848-filter select{padding:7px 10px;border:1px solid var(--line);border-radius:8px;font-size:14px;margin-left:8px}
.sqg848-big-num{display:inline-flex;flex-direction:column;background:#fff;border:1px solid var(--line);border-radius:12px;padding:16px 24px;margin-bottom:18px}
.sqg848-big-num label{font-size:13px;color:#6b7280}
.sqg848-big-num .value{font-size:36px;font-weight:800;color:#111827;line-height:1}
.sqg848-metric-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:12px}
.sqg848-metric{background:#f8fafc;border:1px solid var(--line);border-radius:10px;padding:12px 14px}
.sqg848-metric label{display:block;font-size:12px;color:#6b7280;margin-bottom:4px}
.sqg848-metric span{font-size:20px;font-weight:700;color:#111827}
.sqg848-metric .up{color:#2563eb}
.sqg848-metric .down{color:#9ca3af}
.sqg848-suggest{margin:0;padding-left:20px;color:#374151;font-size:14px}
.sqg848-suggest li{margin:8px 0;line-height:1.7}
.fresh-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:6px}
.fresh-ok{background:#3b82f6}
.fresh-lag{background:#9ca3af}
.tag.strat-l1{background:#dbeafe;color:#1e40af}
.tag.strat-l2{background:#dcfce7;color:#166534}
@media(max-width:900px){
  .sqg848-body{flex-direction:column;height:auto;overflow:auto}
  .sqg848-sidebar{width:100%;flex:none;border-bottom:1px solid #374151}
  .sqg848-nav-group{display:contents}
  .sqg848-main{min-height:100vh}
  .sqg848-grid2{grid-template-columns:1fr}
  .sqg848-metric-grid{grid-template-columns:repeat(2,1fr)}
}
@media(max-width:560px){
  .sqg848-metric-grid{grid-template-columns:1fr}
  .sqg848-topbar{height:auto;padding:10px 16px;flex-wrap:wrap}
}

/* 主页说明区域样式 */
.sqg848-mailbox{background:#f8fafc;border:1px solid var(--line);border-radius:12px;padding:16px 20px}
.mb-notes{margin:0}
.mb-line{display:flex;align-items:center;gap:8px;padding:9px 0;border-bottom:1px solid var(--line);font-size:13px;color:#4b5563;line-height:1.5}
.mb-line:last-child{border-bottom:none}
.mb-num{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;background:var(--brand);color:#fff;font-weight:600;font-size:12px;flex-shrink:0}
.mb-label{font-size:13px;color:#1d4ed8;font-weight:600;margin-right:2px;white-space:nowrap}
.mb-sep{margin:0 5px;color:#d1d5db;font-size:12px}


.fresh-bad{background:#1f2937}


/* ===== Admin UI 组件样式（恢复） ===== */
.ui-select{position:relative;display:inline-block;vertical-align:middle}
.ui-trigger{position:relative;display:inline-flex;align-items:center;min-width:130px;padding:7px 32px 7px 14px;font-size:13px;color:#1f2933;background:#fff;border:1px solid var(--line);border-radius:10px;cursor:pointer;transition:border-color .15s,box-shadow .15s,background .15s;font-family:inherit}
.ui-trigger:hover{border-color:var(--brand);background:#f8fafc}
.ui-select.open .ui-trigger{border-color:var(--brand);box-shadow:0 0 0 3px rgba(39,70,196,.15)}
.ui-caret{position:absolute;right:12px;top:50%;transform:translateY(-50%);transition:transform .2s}
.ui-select.open .ui-caret{transform:translateY(-50%) rotate(180deg)}
.ui-menu{position:absolute;top:calc(100% + 6px);left:0;min-width:100%;background:#fff;border:1px solid var(--line);border-radius:12px;box-shadow:0 12px 32px rgba(15,23,42,.16);padding:6px;z-index:60;display:none}
.ui-select.open .ui-menu{display:block}
.ui-opt{padding:8px 12px;border-radius:8px;font-size:13px;cursor:pointer;color:#1f2933;white-space:nowrap;transition:background .12s,color .12s}
.ui-opt:hover{background:#eef2ff;color:var(--brand)}
.ui-opt.sel{background:var(--brand);color:#fff}
.ui-opt.sel:hover{background:var(--brand2)}

/* 模态弹窗 */
.modal-overlay{position:fixed;inset:0;background:rgba(15,23,42,.45);display:none;align-items:center;justify-content:center;z-index:200;padding:20px}
.modal{background:#fff;border-radius:16px;width:420px;max-width:100%;box-shadow:0 24px 60px rgba(15,23,42,.3);overflow:hidden}
.modal-head{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--line)}
.modal-head h3{margin:0;font-size:16px;color:#1f2933}
.modal-x{border:none;background:none;font-size:22px;line-height:1;color:#94a3b8;cursor:pointer;padding:0 4px}
.modal-x:hover{color:#475569}
.modal-body{padding:18px 20px;display:flex;flex-direction:column;gap:14px}
.modal-body label{display:flex;flex-direction:column;gap:6px;font-size:13px;color:#475569;font-weight:600}
.modal-body input{padding:9px 12px;border:1px solid var(--line);border-radius:10px;font-size:14px;font-weight:400;font-family:inherit;color:#1f2933}
.modal-body input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(39,70,196,.15)}
.modal-foot{display:flex;gap:10px;justify-content:flex-end;margin-top:4px}

/* Admin 客户管理页面样式 */
.admin-section{margin:0 auto 26px}
.admin-section:last-child{margin-bottom:0}
.admin-section-head{font-size:18px;font-weight:600;color:#1f2937;margin-bottom:12px}
/* ===== 后台统一设计系统（r108 · 2026-09-24）=====
   用户口径：/admin 左侧栏全部二级目录页面的「设计样式统一」（典型症状：筛选控件好几套写法）。
   规范 —— 各页面模块必须照此引用，**不得再内嵌 <style> 重复定义这些类**，
   也不得用内联 style 手写控件尺寸：
     ① 页面外壳：section.admin[.admin-wide] > .admin-section > .admin-section-head + .admin-section-body
     ② 工具条（筛选 / 搜索 / 操作行）：.admin-toolbar（.spacer 把后续元素右推）
     ③ 输入框：.inp（搜索框加 .inp-search 定宽）
     ④ 按钮：小号只有一档 = .btn.small；类顺序固定「btn 尺寸 颜色」
     ⑤ 标签页：.nav-tabs / .nav-tab（只此一份，原先在 3 个模块里各复制一份且尺寸互不相同） */
.admin-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:14px}
.admin-toolbar .spacer{flex:1}
/* 卡片（.admin-section-body）内自带 padding:0 ⇒ 工具条进来要自己补上边距 */
/* r115：margin-bottom 由 0 改 14 —— 工具条下面直接就是表格（净值更新 / 基金属性表 /
   客户管理 / 错误日志等页）时搜索框紧贴表头，实测间距 0px。取 14 与 .admin-toolbar
   的默认下边距一致，全后台同款。 */
.admin-section-body>.admin-toolbar{padding:14px 16px 0;margin-bottom:14px}
.admin-toolbar form{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0}
/* 输入框统一样式（替代原先各页内联 style 手写的 padding/border/radius 组合） */
.inp{height:34px;padding:0 12px;border:1px solid var(--line);border-radius:8px;font-size:13px;
  font-family:inherit;color:var(--ink);background:#fff}
.inp:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(39,70,196,.15)}
.inp-search{width:280px}
/* 页面说明 / 数据来源行（原为 3 种写法：内联小字、p.muted+内联 margin、客户站 .sqg848-note） */
.admin-note{margin:-6px 0 14px;font-size:12.5px;color:var(--muted);line-height:1.7}
/* 卡片内的标签页不要贴边（净值更新 / 邮件解析配置两页的 tab 都在 .admin-section-body 里） */
/* r115：补 margin-bottom 14 —— 标签页下面紧跟表格（邮件解析配置页），原先上下都贴边 */
.admin-section-body>.nav-tabs{margin:0 16px 14px}
/* 卡片内的汇总条：仅页面健康模块的 .ph-sum（错误日志的 .errstat 已于 r110 删除） */
.admin-section-body>.ph-sum{padding:14px 16px 0;margin:0 0 14px}
select.inp{padding-right:8px}
/* 标签页（原副本：task_detail / fund_config / sqg848，padding 有 10px22px 与 11px26px 两版） */
/* r330（用户口径：「admin登录界面下的标签页栏和搜索栏统一成现在搜索栏的大小，显示成一行。
   标签页栏左对齐，搜索栏右对齐。」）：整条标签栏对齐 .inp 的 34px 高、13px 字号 ——
   原先 padding 10px 22px + 15px 字，实测 39px（错误日志页 44px）比搜索框高一头。
   容器 min-height 34 + 标签 28 居中 ⇒ 与搜索框同高；左/右对齐由 .admin-toolbar 的
   align-items:center 与 .inp-search{margin-left:auto} 保证（两处均已就位）。 */
.nav-tabs{display:inline-flex;align-items:center;gap:4px;background:#EEF0F3;border-radius:10px;
  padding:0 3px;min-height:34px;margin:0 0 14px;flex-wrap:wrap}
.nav-tab{display:inline-flex;align-items:center;height:28px;padding:0 15px;border:none;
  background:transparent;font-size:13px;font-weight:500;font-family:inherit;color:#6B7280;
  cursor:pointer;border-radius:8px;transition:all .18s ease;white-space:nowrap;text-decoration:none}
.nav-tab:hover{color:var(--brand)}
.nav-tab.active{background:#fff;color:var(--brand);font-weight:600;box-shadow:0 1px 4px rgba(16,24,40,.10)}
.nav-tab .n{font-size:12px;font-weight:600;color:#9AA3AF;margin-left:7px;font-variant-numeric:tabular-nums}
.nav-tab.active .n{color:var(--brand)}
/* ⑥ 列表统一规范（r110 · 2026-09-24）—— 用户口径：
     「统一成标题、筛选、列表。列表的内容宽表单行省略（… + 悬停 title 看全文），不换行；
       横滚时表头与首列钉住。」
   页面模块只给列宽（.adm-list + nth-child 宽度），**不再各自手写省略/钉住样式**。
   机理同 .cust-wide / .tier1tbl：表格自身不得 overflow:hidden、须 border-collapse:separate，
   且必须放在 .tbl-wrap 里 —— sticky 相对「最近的滚动祖先」定位。 */
.adm-list{width:100%;table-layout:fixed;border-collapse:separate;border-spacing:0}
.adm-list th,.adm-list td{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 表头钉住（纵滚与横滚都在 .tbl-wrap 内发生，故 sticky 参照该容器） */
.adm-list thead th{position:sticky;top:0;z-index:3;background:#f0f4f8;
  border-bottom:2px solid var(--line);font-size:12px;letter-spacing:.02em}
/* 首列钉住：冻结格必须自带不透明底，否则横滚时下层单元格会从它下面透出来 */
.adm-list thead th.frozen{left:0;z-index:5}
.adm-list tbody td.frozen{position:sticky;left:0;z-index:1;background:#fff}
.adm-list tbody tr:nth-child(even) td.frozen{background:#f9fafb}
.adm-list tbody tr:hover td.frozen{background:#eff6ff}
/* ⚠️ 跨列单元格（点行展开的详情行 / 空表占位行）与含下拉控件的单元格**不能裁切**：
   前者内部是独立小表、后者是绝对定位的下拉面板，overflow:hidden 会把它们剪掉。 */
.adm-list td[colspan],.adm-list td.cell-ctl{overflow:visible;text-overflow:clip}
/* 搜索框与标签页同排（统一工具条）：搜索框贴右，标签页贴左 */
.admin-toolbar .inp-search{margin-left:auto}
/* r332：标签栏在工具条里必须去掉自带的 margin-bottom:14px —— flex 的 align-items:center
   按 margin box 对齐，多出来的 14px 会把整条标签顶高 7px，与按钮 / 搜索框错位。 */
.admin-toolbar>.nav-tabs{margin:0}
.admin-section-body{background:#fff;border:1px solid var(--line);border-radius:10px;overflow-x:auto}
.cust-table{width:100%;border-collapse:collapse;font-size:13px}
.cust-table th{padding:10px 12px;text-align:left;font-weight:600;color:#475569;background:#f8fafc;border-bottom:1px solid var(--line)}
.cust-table td{padding:10px 12px;border-bottom:1px solid #f1f5f9;color:#374151;vertical-align:middle}
.cust-table tr:hover td{background:#f8fafc}
.cust-table .col-check{width:40px;min-width:40px;text-align:center}
.cust-table .row-check{cursor:pointer}
.cust-table .sortable{cursor:pointer;user-select:none}
.cust-table .sort-arrow{font-size:11px;color:#94a3b8;margin-left:4px}
.cust-table .date-cell{white-space:nowrap}
.cust-table .date-edit{border:1px solid transparent;background:transparent;padding:4px 8px;border-radius:6px;font-size:13px;cursor:pointer}
.cust-table .date-edit:hover{border-color:var(--line);background:#f8fafc}
.cust-table .date-edit:focus{outline:none;border-color:var(--brand);background:#fff}
.cust-table .readonly{color:#94a3b8}

/* ===== 表格内容优化 ===== */
.cust-table th, .cust-table td {
    white-space: nowrap;
}
/* 长内容单元格：限宽 + 单行省略，悬停 title 看全文。
   口径同 /SQG848/product-elements 的 .pe-ell（用户 2026-09-18：宽表「写不下的隐藏，不然好几行」）。
   原先 .cname/.contact 走 white-space:normal + word-break ⇒ 28 列的客户管理页被撑成好几行。 */
.cust-table .ell {
    display: inline-block;
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    vertical-align: middle;
}
.cust-table .col-check { width: 40px; text-align: center; white-space: nowrap; }
.cust-table td.pk-col { font-weight: 600; }
.cust-table td.frozen { position: sticky; left: 0; z-index: 1; }
.cust-table th.frozen { position: sticky; left: 0; z-index: 4; }
/* 宽表（客户管理 /admin，28 列）：横滚时表头与首列钉住，始终看得到「是哪一个账号」。
   ⚠️ sticky 生效的两个前提（2026-09-18 实测踩过，同 tier1 宽表与 .pe-tbl）：
     ① 表格自身不得 overflow:hidden —— 它会变成「永不滚动」的滚动容器，
        sticky 相对最近滚动祖先定位 ⇒ 钉不住（实测滚动 1321px 后表头跑到 -771px）；
     ② 需 border-collapse:separate —— collapse 下 sticky 单元格的边框会塌陷丢线。
   故本表单独切换，**不影响其它 .cust-table 页面**。 */
.cust-table.cust-wide { overflow: visible; border-collapse: separate; border-spacing: 0; }

/* 斑马纹 */
.cust-table tbody tr:nth-child(even) td { background: #f9fafb; }
.cust-table tbody tr:nth-child(even) td.frozen { background: #f9fafb; }
.cust-table tbody tr:hover td { background: #eff6ff!important; }
.cust-table tbody tr:hover td.frozen { background: #eff6ff!important; }

/* 表格容器：sticky表头 + 内部滚动 */
.tbl-wrap{max-height:72vh;overflow:auto;border:1px solid var(--line);border-radius:10px;background:#fff}
.tbl-wrap thead th{position:sticky;top:0;z-index:3;background:#f0f4f8;border-bottom:2px solid var(--line);font-size:12px;letter-spacing:.02em}
.tbl-wrap thead th.frozen{z-index:5}

/* ===== tier1 基金属性表的滚动 + 冻结（2026-09-17）=====
   30 列 × 89 行：横着滚还得能对上「这一行是哪只基金」，故表头钉住 + 前两列冻结。 */

/* ① 破 sticky 的元凶是表格自己的 .tbl{overflow:hidden}：它会在 sticky 元素与 .tbl-wrap 之间
   插进一个「永不滚动」的滚动容器 —— sticky 相对**最近的滚动祖先**定位，而它不滚，
   于是表头与首列全都钉不住（实测：滚动 500px 后表头跑到视口上方 -224px）。
   它同时还与 .tbl-wrap 的 1px 边框重叠成双线。故卡片内的表格一律去框/去圆角/去裁切。
   border-collapse:separate 是配套项：collapse 下 sticky 单元格的边框会跟着塌陷丢线
   （与 /SQG848/product-elements 的 .pe-tbl 同一套写法）。 */
.tbl-wrap > table.tbl{border:0;border-radius:0;background:transparent;overflow:visible;
  border-collapse:separate;border-spacing:0}

/* ② 冻结两列：left 只能按固定值堆叠 ⇒ 列①宽度写死，**改列①宽度必须同步改这里的 left** */
.tier1tbl th:nth-child(1), .tier1tbl td:nth-child(1){width:110px;min-width:110px;max-width:110px}
.tier1tbl th.frozen2, .tier1tbl td.frozen2{position:sticky;left:110px;box-shadow:1px 0 0 var(--line)}
.tier1tbl th.frozen2{z-index:5}
.tier1tbl td.frozen2{z-index:1}
/* 冻结格必须自带不透明底，否则横向滚动时下层单元格会从它下面透出来 */
.cust-table td.frozen, .cust-table td.frozen2{background:#fff}
.cust-table tbody tr:nth-child(even) td.frozen2{background:#f9fafb}
.cust-table tbody tr:hover td.frozen2{background:#eff6ff!important}

/* ③ 卡片内工具区 / 说明：.admin-section-body 是 padding:0，进来必须各自补内边距 */
.tier1-tools{padding:14px 16px 0;margin:0;display:flex;gap:6px;align-items:center}
.tier1-note{margin:0;padding:8px 16px 10px;font-size:12px;color:#6b7280;line-height:1.7}
/* 卡片里的滚动区：外框已交给卡片，自己只负责滚。
   r352：原只认「直接子级」⇒ /admin 与 /admin/accounts 的表格包在 .adm-pane 里，
   内层 .tbl-wrap 的 1px 描边就贴着外框（实测间隙 1px）＝用户说的「内外框黏在一起」。
   改认后代，与 /admin/tier1/... 那一页的做法一致（那一页 .tbl-wrap 无描边）。 */
.admin-section-body .tbl-wrap{border:0;border-radius:0}

/* 大型弹窗（字段多的表单） */
.modal.wide{width:820px;max-width:94vw}
.modal-body.scroll{max-height:72vh;overflow-y:auto;padding-right:4px}

/* 表单字段分组 */
.form-section{margin-bottom:18px}
.form-section-title{font-size:12px;font-weight:700;color:var(--brand2);margin:0 0 10px;padding:4px 0;border-bottom:1px dashed var(--line);letter-spacing:.04em;text-transform:uppercase}
.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px 18px}
.form-grid .mf-row{min-width:0}
.form-grid .mf-row.full{grid-column:1/-1}
@media(max-width:600px){.form-grid{grid-template-columns:1fr}}

/* ========== SQG848 邮件查看页面 ========== */
.mail-filter {
    display: flex;
    gap: 8px;
    margin-bottom: 20px;
    flex-wrap: wrap;
}

.filter-tag {
    padding: 6px 14px;
    border-radius: 4px;
    font-size: 13px;
    background: #f3f4f6;
    color: #374151;
    text-decoration: none;
    transition: all 0.2s;
}

.filter-tag:hover {
    background: #e5e7eb;
}

.filter-tag.active {
    background: var(--brand, #2563eb);
    color: white;
}

.filter-tag.inactive {
    background: #f3f4f6;
    color: #6b7280;
}

.mail-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 13px;
}

.mail-table thead {
    background: #f9fafb;
    border-bottom: 2px solid #e5e7eb;
}

.mail-table th {
    padding: 10px 12px;
    text-align: left;
    font-weight: 600;
    color: #374151;
}

.mail-table td {
    padding: 10px 12px;
    border-bottom: 1px solid #e5e7eb;
    vertical-align: top;
}

.mail-table tbody tr:hover {
    background: #f9fafb;
}

.mail-date {
    white-space: nowrap;
    color: #6b7280;
    font-size: 12px;
    width: 140px;
}

.mail-from {
    max-width: 200px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    color: #374151;
}

.mail-subject {
    color: #111827;
}

.source-tag {
    display: inline-block;
    padding: 2px 8px;
    border-radius: 3px;
    font-size: 11px;
    font-weight: 500;
}

.source-tag.infinte {
    background: #dbeafe;
    color: #1e40af;
}

.source-tag.qinyuan {
    background: #fef3c7;
    color: #92400e;
}

.source-tag.direct {
    background: #d1fae5;
    color: #065f46;
}

.mail-empty {
    padding: 40px;
    text-align: center;
    color: #9ca3af;
    font-size: 14px;
}

/* 文档查看/下载链接：由 nav-update「合同查看」抽象为全站统一组件 */
.doc-link{color:var(--brand);text-decoration:none;font-size:13px;font-weight:500;display:inline-flex;align-items:center;gap:3px;vertical-align:middle;padding:3px 7px;margin:-3px -7px;border-radius:6px;transition:background .15s ease,color .15s ease}
.doc-link .dl-ico{width:11px;height:11px;flex:0 0 auto;transition:transform .15s ease}
.doc-link:hover{color:var(--brand2);background:rgba(37,99,235,.09)}
.doc-link:hover .dl-ico{transform:translate(1px,-1px)}
.doc-link:hover .dl-ico.dl-down{transform:translateY(1.5px)}
.tl-miss{color:#9CA3AF}

/* ===== 运维指南 /admin/guides ===== */
.gd{font-size:14px;background:#fff;border:1px solid var(--line);border-radius:10px;padding:22px 24px}
.gd-meta{display:inline-block;color:var(--muted);font-size:12px;margin:0 0 14px;padding:7px 12px;background:#f1f5f9;border-radius:8px}
.gd-h{margin:22px 0 10px;color:var(--brand2);line-height:1.35}
.gd-h1{font-size:24px;margin-top:0}
.gd-h2{font-size:19px;border-bottom:2px solid var(--line);padding-bottom:6px}
.gd-h3{font-size:16px;margin-top:28px}
.gd-h4,.gd-h5,.gd-h6{font-size:15px}
.gd-p{margin:9px 0}
.gd-list{margin:9px 0 9px 22px;padding:0}
.gd-list li{margin:4px 0}
.gd-tblwrap{overflow-x:auto;margin:12px 0;border:1px solid var(--line);border-radius:10px;background:#fff}
.gd-table{width:100%;border-collapse:collapse;font-size:13px}
.gd-table th{background:#f1f5f9;text-align:left;padding:8px 10px;font-weight:700;color:#1f2937;white-space:nowrap;border-bottom:1px solid var(--line)}
.gd-table td{padding:7px 10px;border-bottom:1px solid #f1f5f9;vertical-align:top}
.gd-table tr:last-child td{border-bottom:none}
.gd-table td:first-child{font-weight:600;color:#334155}
.gd-table-api td{font-size:12.5px;white-space:pre-wrap;font-weight:400}
.gd-table-api td:first-child{font-weight:600}
.gd-rowsec td{background:#eff6ff;color:var(--brand2);font-weight:700;font-size:13px}
.gd-pre{background:#0f172a;color:#e2e8f0;padding:12px 14px;border-radius:10px;overflow-x:auto;font-size:12.5px;line-height:1.6;margin:12px 0}
.gd-pre code{background:none;color:inherit;padding:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,"Microsoft YaHei",monospace}
.gd-quote{margin:12px 0;padding:10px 14px;border-left:4px solid var(--brand);background:#eff6ff;border-radius:0 8px 8px 0;color:#1e3a8a;font-size:13.5px}
.gd-hr{border:none;border-top:1px solid var(--line);margin:22px 0}
.gd-empty{padding:16px;background:#fef2f2;color:var(--bad);border:1px solid #fecaca;border-radius:10px}
.gd-cards{display:grid;grid-template-columns:1fr;gap:12px;margin-top:16px}
.gd-card{display:block;background:#fff;border:1px solid var(--line);border-radius:12px;padding:16px 18px;transition:.15s}
.gd-card:hover{border-color:var(--brand);box-shadow:0 4px 14px rgba(37,99,235,.08)}
.gd-card-t{font-size:16px;font-weight:700;color:var(--brand2);margin-bottom:6px}
.gd-card-d{font-size:13px;color:var(--muted);line-height:1.55}
.gd-card-m{font-size:12px;color:#94a3b8;margin-top:8px}
.gd-toc{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:10px;margin:12px 0 20px}
.gd-toc-g{background:#fff;border:1px solid var(--line);border-radius:10px;padding:12px 14px;display:flex;flex-wrap:wrap;align-items:baseline;gap:6px}
.gd-toc-t{font-weight:700;font-size:13.5px;color:var(--brand2)}
.gd-toc-n{font-size:11px;color:#fff;background:var(--brand);border-radius:999px;padding:1px 7px}
.gd-toc-l{flex:1 0 100%;display:flex;flex-wrap:wrap;gap:6px 10px;margin-top:6px}
.gd-toc-l a{font-size:12.5px;color:var(--muted)}
.gd-toc-l a:hover{color:var(--brand)}
.gd-details{background:#fff;border:1px solid var(--line);border-radius:10px;margin:8px 0;overflow:hidden}
.gd-details>summary{cursor:pointer;padding:11px 14px;font-weight:700;font-size:13.5px;color:#1f2937;display:flex;justify-content:space-between;align-items:center;gap:10px;background:#f8fafc}
.gd-details[open]>summary{border-bottom:1px solid var(--line);color:var(--brand2)}
.gd-sum-n{font-size:11px;font-weight:500;color:var(--muted);background:#e2e8f0;border-radius:999px;padding:1px 8px;white-space:nowrap}

/* ===== 运维指南：复制条 ===== */
.gd-copybar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:0 0 18px;padding:14px 16px;border:1px solid #d6e4ff;border-radius:10px;background:#f3f7ff}
.gd-copybtn{appearance:none;border:0;border-radius:8px;cursor:pointer;padding:10px 20px;font-size:14px;font-weight:600;color:#fff;background:#2f6bff;transition:background .15s}
.gd-copybtn:hover{background:#1f57e0}
.gd-copybtn:active{background:#1a49bd}
.gd-copyhint{font-size:13px;color:#5b6b85}
.gd-copyraw{margin:0 0 20px}
.gd-rawta{width:100%;min-height:280px;box-sizing:border-box;margin-top:10px;padding:12px;border:1px solid #dfe3ea;border-radius:8px;background:#fafbfc;font-family:inherit;font-size:13.5px;line-height:1.75;color:#24292f;white-space:pre;overflow:auto}

.gd-lead{margin:0 0 18px;padding:12px 16px;border-left:3px solid #2f6bff;border-radius:0 8px 8px 0;background:#f7f9fc;font-size:14px;line-height:1.7;color:#3d4a5c}

/* --- 交接页下半：文档框架（2026-09-13 新增）--- */
.gd-hr{margin:26px 0 20px;border:0;border-top:1px solid var(--line)}
.gd-below{font-size:13.5px;line-height:1.75;color:#24292f}
.gd-below h1{font-size:20px;margin:0 0 14px;padding-bottom:10px;border-bottom:2px solid var(--brand2);color:#1f2d3d}
.gd-below h2{font-size:16px;margin:26px 0 12px;padding-left:10px;border-left:3px solid var(--brand2);color:#1f2d3d}
.gd-below h3{font-size:14.5px;margin:20px 0 10px;color:#1f2d3d}
.gd-below pre{background:#f6f8fa;color:#24292f;border:1px solid var(--line);border-radius:8px;padding:12px 14px;overflow:auto;font-size:12.5px;line-height:1.6}
.gd-below code{background:#f1f5f9;padding:1px 5px;border-radius:4px;font-size:12.5px;color:#0b5cad}
.gd-below pre code{background:none;padding:0;color:inherit}
.gd-below table{width:100%;border-collapse:collapse;margin:12px 0;font-size:13px}
.gd-below th{background:#f8fafc;text-align:left;padding:9px 11px;border:1px solid var(--line);font-weight:700;color:#1f2d3d}
.gd-below td{padding:8px 11px;border:1px solid var(--line);vertical-align:top}
.gd-below tr:nth-child(even) td{background:#fcfdfe}
.gd-below blockquote{margin:12px 0;padding:10px 14px;background:#f8fafc;border-left:3px solid #cbd5e1;color:#475569}
.gd-below ul,.gd-below ol{margin:10px 0;padding-left:24px}
.gd-below li{margin:5px 0}

/* 系统说明页：表外「基金名称」+ 6 列数据明细单表。
   列：项目 / 更新频次 / 说明 / 数据来源 / 起始日期 / 最新日期。
   （原第 7 列已于 2026-09-24 按用户要求彻底删除。）
   与 /STY196/system-intro 展示口径一致（两边表外都只放基金名称）。
   table-layout:fixed 为必需：auto 布局下说明列（无定宽、内容最长）会吃掉全部富余宽度。 */
/* 表外的基金名称（2026-09-15 从表格首两行移出；2026-09-21 r48 起不再展示净值接收邮箱）。
   ⚠️ 字号与表内正文一致（.mb-tbl td = 13px）—— 用户明确「字号跟表内正文一致」，
   勿照搬 /STY196 的 14px。与表格之间用一条分隔线隔开。 */
.mb-fund{padding-bottom:12px;border-bottom:1px solid var(--line);margin-bottom:16px}
.mb-fund-name{font-size:15px;font-weight:400;color:#1f2937;line-height:1.35}
.mb-fund-mail{font-size:14px;color:#4b5563;line-height:1.55;margin-top:4px}
/* ↑ r48 起页面已不输出该元素；规则暂留（无副作用），删类名时一并清。 */
.mb-tbl-wrap{margin-top:2px;overflow-x:auto}
.mb-tbl{width:100%;border-collapse:collapse;border:1px solid var(--line);border-radius:8px;min-width:1000px;table-layout:fixed}
.mb-tbl th,.mb-tbl td{padding:7px 10px;text-align:left;border-bottom:1px solid var(--line)}
.mb-tbl th{background:#f8fafc;color:#4b5563;font-weight:600;font-size:12px;white-space:nowrap}
.mb-tbl td{font-size:13px;color:#4b5563;vertical-align:middle}
.mb-tbl tr:last-child td{border-bottom:none}
.mb-tbl tr:hover{background:#f8fafc}
/* 「已停止」的渠道行：整行文字调浅一档（gray-400），与在产行（gray-600）一眼可分。
   由 SQG848_SYSINTRO_STEPS 的 `retired` 标记驱动（现仅「子基金交易流水 · 估值表倒推」，
   2026-09-01 停止），文案改了也不会失效。
   ⚠️ 选择器必须带 `tr.` 才压得过 `.mb-tbl td`（0,1,1）—— 只写 `.mb-tbl-off td` 是 (0,1,1)，
   与后者同权、靠源码顺序取胜，改文件的顺序就会翻车。 */
.mb-tbl tr.mb-tbl-off td{color:#9ca3af}
.mb-tbl tr.mb-tbl-off:hover{background:#fcfdfe}
.mb-tbl .mb-tbl-c1{width:142px;white-space:nowrap}
.mb-tbl .mb-tbl-ctime{width:160px}
.mb-tbl .mb-tbl-cdesc{width:240px}
.mb-tbl .mb-tbl-csrc{width:250px}
.mb-tbl .mb-tbl-cdate{width:100px}
.mb-tbl-time{font-variant-numeric:tabular-nums;white-space:normal}
.mb-tbl-date{font-variant-numeric:tabular-nums;white-space:nowrap}
/* ⚠️ 表头与单元格一律**左对齐**：`mb-tbl-c*` 只写宽度、不写 text-align。
   2026-09-15 修：曾在列类上写 text-align:center，被 `.mb-tbl th,.mb-tbl td{text-align:left}`
   （0,1,1）压过 ⇒ 单元格实际左对齐，而表头因列类（0,2,0）保持居中，
   实测错位 24px（表头文字中心 1397 / 数值文字中心 1373）。与 /STY196 的修法逐字一致。
   当时在末列「数据时效」上暴露；该列已于 2026-09-24 按用户要求彻底删除，教训保留。 */
/* 表下备注：结构化说明每列是「打开页面实时取」还是「代码里的固定文案」。
   与 /STY196/system-intro 同款（那边这套类定义在 base.html 的内联样式里）。
   ⚠️ 改动上表取值方式时须同步这里的文案。 */
.mb-sched-note{margin-top:8px;font-size:12px;color:#6b7280;line-height:1.7}
.mb-note-lead{margin-bottom:5px}
.mb-note-row{display:grid;grid-template-columns:2.5em 1fr;column-gap:12px}
.mb-note-k{white-space:nowrap;font-weight:600;color:#4b5563}
.mb-note-v{overflow-wrap:break-word}
.mb-note-tail{margin-top:5px;padding-left:calc(2.5em + 12px);color:#8b93a1}
/* 表格已在 .sqg848-sec 白框内（body padding 18px）⇒ 去掉表格自身边框与圆角，
   否则框内 18px 处会再多一圈线，成「双框」。与 /STY196/system-intro 一致（那边表格无边框）。 */
.sqg848-sec-body .mb-tbl{border:none;border-radius:0}

/* ===== 错误日志表（2026-09-24 r110 统一版式）=====
   沿革：2026-09-16 由 9 列并到 7 列；r110 再把「未读圆点」并入首列 ⇒ 6 列。
   单行省略 / 表头与首列钉住统一由 .adm-list（本文档 ⑥ 节）提供；
   **列宽写在页面的内联 <style> 里（那里是唯一权威，改列请改那边）**。
   🔴 原先这里的 `th, td { white-space: normal }` 特指度 (0,2,1) 会盖掉
      `.adm-list th/td` 的 nowrap (0,1,1)，不清掉单行省略根本不生效；连同各列宽、
      备注三行截断规则一并删除。操作列三个按钮由竖排（display:block）改回同一行。 */
.cust-table.logtable { border: 0; border-radius: 0; background: transparent; }
/* 徽标整体换行、不折字（原先「错误」「待处理」被拆成竖排单字） */
.cust-table.logtable .badge { white-space: nowrap; }
.cust-table.logtable td.logacts .inline-form { display: inline-block; margin: 0 6px 0 0; }


/* r155：/my-system「我的系统」—— 客户专属系统条目（系统名 + 「进入系统」按钮） */
.sys-entry{display:flex;align-items:center;gap:16px;margin:0 0 14px}
.sys-entry .sys-entry-name{font-size:16px;font-weight:600;color:var(--brand2)}


/* 修改密码（r303 建 / r307 改可开合）：客户中心「客户信息」页自助改密。
   默认折叠，点「客户信息」框内末格「修改密码」文本**开 / 合**（r307 用户口径：
   「点击下方文本显示，再点击一次要下方文本能收回去」）。
   机制 = 纯 CSS：`.pw-toggle`（checkbox，提到 `<main>` 首、与 `#pwsec` 同级）+
   `:checked ~` 兄弟选择器。旧 `#pwsec:target` 已弃用 —— 同一锚点二次点击 hash 不变、
   收不回去。表单提交后带 ok / err 回来时由服务端直接输出 `checked`（不写内联 style），
   这样提示显示期间用户仍可点一下收起。 */
.pw-toggle{display:none}
#pwsec{display:none}
#pwsec-toggle:checked ~ #pwsec{display:block}
.pw-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:14px 20px;background:#fff;border:1px solid var(--line);border-radius:12px;padding:18px 20px;box-shadow:0 1px 3px rgba(15,23,42,.05)}
.pw-form label{display:flex;flex-direction:column;gap:6px;font-size:12px;color:var(--muted);font-weight:600;letter-spacing:.02em}
.pw-form input{font-family:inherit;font-size:14px;padding:8px 10px;border:1px solid var(--line);border-radius:8px;color:#1f2937;background:#fff}
.pw-form input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(37,99,235,.12)}
.pw-actions{grid-column:1/-1;display:flex;flex-wrap:wrap;align-items:center;gap:10px 14px}
.pw-hint{font-size:12.5px;color:var(--muted)}
.pw-msg{margin:0 0 12px;font-size:13.5px;padding:9px 12px;border-radius:9px}
.pw-msg.ok{background:#ecfdf5;color:#047857;border:1px solid #a7f3d0}
.pw-msg.err{background:#fef2f2;color:#b91c1c;border:1px solid #fecaca}
.dash-head .btn.btn-sm2{padding:6px 13px;font-size:13px}
@media (max-width:640px){.dash-head{flex-wrap:wrap;gap:10px}}
