/* ============================================================
   振鸿绩效 · 视觉系统（浅色版）
   白底 + 浅灰分割 + 低饱和强调色；清晰层级、统一组件、充足留白
   —— 仅样式与排版，不承载任何业务逻辑
   ============================================================ */
:root{
  color-scheme: light;

  /* 画布与表面 */
  --bg:#f5f7fa;
  --bg-2:#eef2f7;
  --card:#ffffff;
  --card2:#ffffff;
  --line:#e6eaf1;
  --line-2:#f0f3f8;

  /* 文字层级（白底高对比） */
  --txt:#16202e;      /* 标题 / 核心数值 */
  --txt2:#334155;     /* 正文 */
  --sub:#64748b;      /* 次要说明 */
  --faint:#94a3b8;    /* 弱化提示 */

  /* 浅底 / 轨道 */
  --soft:#f1f5f9;
  --softbg:#f8fafc;
  --bg-soft:#f4f7fb;

  /* 强调色 */
  --pri:#2563eb;
  --pri2:#1d4ed8;
  --priSoft:rgba(37,99,235,.09);
  --accent:#0f9dbf;

  /* 语义色 */
  --ok:#128a4c;    --okSoft:#e8f6ee;
  --warn:#a16308;  --warnSoft:#fdf3e2;
  --bad:#c0392b;   --badSoft:#fdeceb;
  --amber:#d97706;

  --r:14px;
  --shadow:0 1px 2px rgba(16,24,40,.04),0 6px 18px rgba(16,24,40,.05);
  --glow:0 0 0 3px rgba(37,99,235,.14);
}

*{box-sizing:border-box}
html,body{margin:0;padding:0}
html{-webkit-text-size-adjust:100%}
body{
  background-color:var(--bg);
  background-image:
    radial-gradient(1000px 520px at 88% -12%,rgba(37,99,235,.055),transparent 62%),
    radial-gradient(760px 460px at 0% 4%,rgba(15,157,191,.04),transparent 58%);
  background-repeat:no-repeat;
  background-attachment:fixed;
  color:var(--txt2);
  font:14px/1.65 -apple-system,"Segoe UI","PingFang SC","Microsoft YaHei",system-ui,sans-serif;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
}
button{font:inherit;cursor:pointer;color:inherit}
input,select,textarea{font:inherit;color:var(--txt);background:#fff;border-color:var(--line)}
input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=file]),
select,textarea{background:#fff;color:var(--txt)}
input::placeholder,textarea::placeholder{color:var(--faint)}
select option{background:#fff;color:var(--txt)}
.hidden{display:none !important}

/* 选区 / 滚动条 */
::selection{background:rgba(37,99,235,.16);color:var(--txt)}
::-webkit-scrollbar{width:10px;height:10px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:#cfd8e3;border-radius:8px;border:2px solid transparent;background-clip:content-box}
::-webkit-scrollbar-thumb:hover{background:#b6c2d1;background-clip:content-box}

/* ============ 登录 ============ */
.login-wrap{
  min-height:100vh;display:flex;align-items:center;justify-content:center;padding:32px;
  background:
    radial-gradient(900px 520px at 14% -10%,rgba(37,99,235,.07),transparent 60%),
    radial-gradient(800px 480px at 104% 108%,rgba(15,157,191,.06),transparent 58%);
}
.login-shell{
  display:flex;width:100%;max-width:960px;
  background:var(--card);
  border:1px solid var(--line);border-radius:22px;
  box-shadow:0 18px 50px rgba(16,24,40,.10),0 2px 6px rgba(16,24,40,.04);
  overflow:hidden;position:relative;
}
.login-brand{
  position:relative;flex:1;min-width:0;
  background:linear-gradient(165deg,#eef4ff 0%,#e9f1ff 52%,#e8f6f9 100%);
  color:var(--txt);padding:46px 40px;display:flex;flex-direction:column;overflow:hidden;
  border-right:1px solid var(--line);
}
.login-brand::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background-image:linear-gradient(rgba(37,99,235,.05) 1px,transparent 1px),linear-gradient(90deg,rgba(37,99,235,.05) 1px,transparent 1px);
  background-size:38px 38px;
  mask-image:radial-gradient(circle at 24% 12%,#000,transparent 78%);
  -webkit-mask-image:radial-gradient(circle at 24% 12%,#000,transparent 78%);
}
.brand-glow{position:absolute;border-radius:50%;opacity:.5;filter:blur(12px);background:radial-gradient(circle,rgba(37,99,235,.22),transparent 70%)}
.brand-glow.g1{width:300px;height:300px;top:-110px;right:-80px}
.brand-glow.g2{width:240px;height:240px;bottom:-110px;left:-70px;background:radial-gradient(circle,rgba(15,157,191,.20),transparent 72%)}
.brand-ring{position:absolute;width:360px;height:360px;border:1px solid rgba(37,99,235,.14);border-radius:50%;right:-132px;bottom:-152px}
.brand-mark{
  position:relative;width:54px;height:54px;border-radius:16px;
  background:#fff;border:1px solid rgba(37,99,235,.22);
  display:flex;align-items:center;justify-content:center;font-size:24px;font-weight:700;color:var(--pri);
  box-shadow:0 6px 18px rgba(37,99,235,.14);
}
.brand-name{position:relative;font-size:22px;font-weight:800;margin-top:24px;letter-spacing:.4px;color:var(--txt)}
.brand-desc{position:relative;font-size:13px;color:var(--sub);margin-top:5px;letter-spacing:.2px}
.brand-feats{list-style:none;margin:auto 0 0;padding:0;display:flex;flex-direction:column;gap:16px;position:relative}
.brand-feats li{display:flex;flex-direction:column;gap:3px;padding-left:16px;position:relative}
.brand-feats li::before{content:"";position:absolute;left:0;top:8px;width:6px;height:6px;border-radius:50%;background:var(--accent)}
.brand-feats b{font-size:14px;color:var(--txt)}
.brand-feats span{font-size:12px;color:var(--sub);line-height:1.65}
.brand-foot{margin-top:26px;font-size:12px;color:var(--faint);border-top:1px solid rgba(37,99,235,.14);padding-top:15px;position:relative;letter-spacing:.4px}

.login-card{width:100%;max-width:430px;flex-shrink:0;padding:46px 42px;position:relative;background:#fff}
.login-logo{
  width:56px;height:56px;border-radius:17px;
  background:linear-gradient(140deg,#3b7bf0,#1d4ed8);
  display:flex;align-items:center;justify-content:center;font-size:26px;color:#fff;margin-bottom:20px;
  box-shadow:0 8px 20px rgba(37,99,235,.24),inset 0 1px 0 rgba(255,255,255,.3);
}
.login-title{font-size:23px;font-weight:700;margin-bottom:6px;letter-spacing:.3px;color:var(--txt)}
.login-sub{color:var(--sub);font-size:13px;margin-bottom:28px}
.field{margin-bottom:16px}
.field label{display:block;font-size:12.5px;color:var(--sub);margin-bottom:7px;letter-spacing:.2px}
.field input{
  width:100%;padding:12px 13px;border:1px solid var(--line);border-radius:11px;
  background:var(--softbg);outline:none;transition:border-color .16s,box-shadow .16s,background .16s;
}
.field input:hover{border-color:#cdd7e5}
.field input:focus{border-color:var(--pri);background:#fff;box-shadow:0 0 0 3px rgba(37,99,235,.13)}
.field select{width:100%;padding:12px 13px;border:1px solid var(--line);border-radius:11px;background:var(--softbg);outline:none;font:inherit;color:var(--txt)}
.field select:focus{border-color:var(--pri);background:#fff;box-shadow:0 0 0 3px rgba(37,99,235,.13)}
.ico-field{position:relative}
.ico-field .input-ico{position:absolute;left:13px;bottom:14px;color:var(--faint);display:flex;pointer-events:none}
.ico-field input{padding-left:39px}
.lg-submit{
  width:100%;padding:13px;border:none;border-radius:12px;
  background:linear-gradient(135deg,#3b7bf0,#1d4ed8);color:#fff;font-size:15px;font-weight:700;letter-spacing:6px;
  box-shadow:0 8px 20px rgba(37,99,235,.22),inset 0 1px 0 rgba(255,255,255,.22);
  transition:transform .15s,box-shadow .15s,filter .15s;
}
.lg-submit:hover{filter:brightness(1.05);box-shadow:0 10px 24px rgba(37,99,235,.28),inset 0 1px 0 rgba(255,255,255,.26)}
.lg-submit:active{transform:translateY(1px)}
.login-tip{
  margin-top:20px;font-size:12.5px;color:var(--sub);
  background:#f4f8ff;border:1px solid rgba(37,99,235,.14);
  border-left:2px solid var(--pri);
  border-radius:10px;padding:13px 15px;line-height:1.75;
}
.login-tip b{color:var(--pri2)}
@media (max-width:880px){
  .login-brand{display:none}
  .login-wrap{padding:18px}
  .login-card{margin:0 auto;max-width:430px;padding:38px 28px}
  .login-shell{border-radius:20px}
}

/* ============ 应用壳 ============ */
.app{display:none;min-height:100vh}
.topbar{
  position:sticky;top:0;z-index:30;
  background:rgba(255,255,255,.88);
  border-bottom:1px solid var(--line);
  backdrop-filter:blur(14px) saturate(150%);
  -webkit-backdrop-filter:blur(14px) saturate(150%);
}
.topbar-in{max-width:1240px;margin:0 auto;padding:0 24px;display:flex;align-items:center;gap:24px;height:64px}
.brand{display:flex;align-items:center;gap:10px;font-weight:700;font-size:15.5px;white-space:nowrap;letter-spacing:.3px;color:var(--txt)}
.brand .logo{
  width:32px;height:32px;border-radius:9px;
  background:linear-gradient(140deg,#3b7bf0,#1d4ed8);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:16px;
  box-shadow:0 4px 12px rgba(37,99,235,.24);
}
.nav{display:flex;gap:4px;flex:1;overflow-x:auto;scrollbar-width:none}
.nav::-webkit-scrollbar{display:none}
.nav button{
  border:1px solid transparent;background:transparent;color:var(--sub);
  padding:8px 14px;border-radius:9px;font-weight:600;font-size:13.5px;white-space:nowrap;
  transition:background .15s,color .15s,border-color .15s;
}
.nav button:hover{background:var(--soft);color:var(--txt)}
.nav button.on{
  background:var(--priSoft);border-color:rgba(37,99,235,.24);color:var(--pri2);
  box-shadow:inset 0 0 0 1px rgba(37,99,235,.06);
}
.userbox{display:flex;align-items:center;gap:10px;font-size:13px}
.userbox .avatar{
  width:34px;height:34px;border-radius:50%;
  background:#eaf1ff;border:1px solid rgba(37,99,235,.22);color:var(--pri2);
  display:flex;align-items:center;justify-content:center;font-weight:700;font-size:13px;
}
.userbox .meta{line-height:1.25}
.userbox .meta .nm{font-weight:600;color:var(--txt)}
.userbox .meta .rl{color:var(--sub);font-size:12px}
.btn-ghost{
  border:1px solid var(--line);background:#fff;color:var(--sub);
  border-radius:9px;padding:7px 13px;font-weight:600;font-size:13px;
  transition:.15s;display:inline-flex;align-items:center;gap:6px;
}
.btn-ghost:hover{border-color:rgba(37,99,235,.42);color:var(--pri2);background:#f5f9ff}
.btn-ghost svg{opacity:.8}

/* ============ 容器与标题层级 ============ */
.container{max-width:1240px;margin:0 auto;padding:30px 24px 76px}
.page-h1{
  font-size:22px;font-weight:800;margin:0 0 8px;letter-spacing:.2px;
  position:relative;padding-left:14px;color:var(--txt);
}
.page-h1::before{
  content:"";position:absolute;left:0;top:6px;bottom:6px;width:3px;border-radius:3px;
  background:linear-gradient(180deg,var(--pri),var(--accent));
}
.page-sub{color:var(--sub);font-size:13px;margin-bottom:24px;line-height:1.75;padding-left:14px}
.page-sub strong{color:var(--txt2);font-weight:600}

.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:14px;margin-bottom:22px}
.stat{
  position:relative;overflow:hidden;
  background:var(--card);
  border:1px solid var(--line);border-radius:var(--r);padding:18px 18px 17px;
  box-shadow:var(--shadow);transition:border-color .18s,box-shadow .18s;
}
.stat::before{
  content:"";position:absolute;left:16px;right:16px;top:0;height:2px;
  background:linear-gradient(90deg,var(--pri),var(--accent));opacity:.75;
}
.stat:hover{border-color:#cfd9e6;box-shadow:0 4px 14px rgba(16,24,40,.08)}
.stat .k{color:var(--sub);font-size:12.5px;letter-spacing:.2px}
.stat .v{font-size:30px;font-weight:800;margin-top:5px;letter-spacing:-.6px;font-variant-numeric:tabular-nums;line-height:1.2;color:var(--txt)}
.stat .v small{font-size:13px;color:var(--sub);font-weight:500;letter-spacing:0;margin-left:2px}

/* ============ 卡片 ============ */
.card{
  background:var(--card);
  border:1px solid var(--line);border-radius:var(--r);
  box-shadow:var(--shadow);padding:22px 24px;margin-bottom:18px;
}
.card h3{
  margin:0 0 16px;font-size:16px;font-weight:700;letter-spacing:.2px;
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;color:var(--txt);
}
.card h3 .sub{font-weight:400;font-size:12.5px;color:var(--sub)}
.card h3:empty{display:none}

/* ============ 表格 ============ */
.tbl{width:100%;border-collapse:collapse}
.tbl th{
  text-align:left;font-size:12px;color:#5b6b82;font-weight:600;
  padding:10px 10px;border-bottom:1px solid var(--line);
  letter-spacing:.3px;white-space:nowrap;
}
.tbl td{padding:12px 10px;border-bottom:1px solid var(--line-2);vertical-align:middle;color:var(--txt2)}
.tbl tbody tr{transition:background .13s}
.tbl tbody tr:hover td{background:#f6f9fd}
.tbl tr:last-child td{border-bottom:0}
.tbl .em{font-weight:600;color:var(--txt)}
.sub{color:var(--sub);font-size:12.5px}

/* ============ 标签 / 状态 ============ */
.pill{
  display:inline-block;padding:3px 10px;border-radius:999px;font-size:12px;font-weight:600;
  line-height:1.55;white-space:nowrap;
}
.pill.gray{background:var(--soft);color:#52627a}
.pill.red{background:var(--badSoft);color:var(--bad)}
.pill.green{background:var(--okSoft);color:var(--ok)}
.pill.amber{background:var(--warnSoft);color:var(--warn)}
.pill.blue{background:rgba(37,99,235,.10);color:var(--pri2)}
.pill.purple{background:rgba(139,110,240,.12);color:#6d34d8}

/* ============ 按钮 ============ */
.btn{
  border:1px solid transparent;border-radius:9px;padding:9px 16px;font-weight:600;font-size:13.5px;
  color:#fff;background:linear-gradient(135deg,#3b7bf0,#1d4ed8);
  box-shadow:0 4px 12px rgba(37,99,235,.18),inset 0 1px 0 rgba(255,255,255,.18);
  transition:filter .15s,transform .12s,box-shadow .15s;
}
.btn:hover{filter:brightness(1.06);box-shadow:0 6px 16px rgba(37,99,235,.24),inset 0 1px 0 rgba(255,255,255,.2)}
.btn:active{transform:translateY(1px)}
.btn.sm{padding:6px 12px;font-size:12.5px;border-radius:8px}
.btn.line{background:#fff;border:1px solid var(--line);color:var(--txt2);box-shadow:none}
.btn.line:hover{border-color:rgba(37,99,235,.45);color:var(--pri2);background:#f5f9ff}
.btn.green{background:linear-gradient(135deg,#1aa06a,#0f7b4f);box-shadow:0 4px 12px rgba(18,138,76,.18),inset 0 1px 0 rgba(255,255,255,.2)}
.btn.green:hover{filter:brightness(1.05);box-shadow:0 6px 16px rgba(18,138,76,.24)}
.btn.red{background:linear-gradient(135deg,#d9483c,#a82c22);box-shadow:0 4px 12px rgba(192,57,43,.18),inset 0 1px 0 rgba(255,255,255,.2)}
.btn.red:hover{filter:brightness(1.05)}
.btn.gray{background:var(--soft);color:#4a5b72;box-shadow:none}
.btn.gray:hover{background:#e6ecf3}
.btn:disabled{opacity:.5;cursor:not-allowed;filter:grayscale(.3);box-shadow:none}
.btn-row{display:flex;gap:8px;flex-wrap:wrap;align-items:center}

/* ============ 标签组 / 进度 ============ */
.tags{display:flex;gap:8px;flex-wrap:wrap;margin-top:6px}
.tag{background:var(--softbg);border:1px solid var(--line);border-radius:8px;padding:4px 10px;font-size:12.5px;color:#5b6b82}
.rowspace{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
.muted{color:var(--sub)}
.bar{height:6px;background:#edf1f6;border-radius:6px;overflow:hidden;min-width:70px}
.bar i{display:block;height:100%;border-radius:6px;background:linear-gradient(90deg,#3b7bf0,#1d4ed8)}
.bar.green i{background:linear-gradient(90deg,#1aa06a,var(--ok))}
.bar.red i{background:linear-gradient(90deg,#d9483c,var(--bad))}
.bar.amber i{background:linear-gradient(90deg,#e0920b,var(--amber))}

/* ============ 弹窗 ============ */
.modal-mask{
  position:fixed;inset:0;background:rgba(16,24,40,.42);
  backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);
  display:none;align-items:center;justify-content:center;z-index:50;padding:20px;
}
.modal-mask.on{display:flex}
.modal{
  background:var(--card);
  border:1px solid var(--line);border-radius:16px;
  box-shadow:0 24px 60px rgba(16,24,40,.18);
  width:100%;max-width:640px;max-height:90vh;overflow:auto;
}
.modal.sm{max-width:440px}
.modal.wide{max-width:1100px}
.modal-hd{
  padding:18px 22px;border-bottom:1px solid var(--line);
  display:flex;align-items:center;justify-content:space-between;
  position:sticky;top:0;z-index:2;
  background:#fff;
}
.modal-hd b{font-size:16px;letter-spacing:.2px;color:var(--txt)}
.modal-hd .x{
  border:1px solid var(--line);background:#fff;
  width:30px;height:30px;border-radius:8px;font-size:16px;color:var(--sub);
  transition:.15s;line-height:1;
}
.modal-hd .x:hover{border-color:var(--bad);color:var(--bad);background:var(--badSoft)}
.modal-bd{padding:20px 22px}
.modal-ft{padding:16px 22px;border-top:1px solid var(--line);display:flex;justify-content:flex-end;gap:10px;background:#fbfcfe}

/* ============ 评分 ============ */
.score-grid{display:grid;gap:14px}
.score-row{background:var(--softbg);border:1px solid var(--line);border-radius:11px;padding:13px 15px}
.score-row .top{display:flex;align-items:center;justify-content:space-between;margin-bottom:9px}
.score-row .nm{font-weight:600;color:var(--txt)}
.score-row .wt{color:var(--sub);font-size:12px}
.slider-wrap{display:flex;align-items:center;gap:14px}
.slider-wrap input[type=range]{flex:1;accent-color:var(--pri)}
.scale{display:flex;gap:6px}
.scale button{
  width:38px;height:32px;border:1px solid var(--line);border-radius:8px;
  background:#fff;color:var(--sub);font-weight:600;transition:.14s;
}
.scale button:hover{border-color:rgba(37,99,235,.45);color:var(--pri2);background:#f5f9ff}
.scale button.on{background:linear-gradient(135deg,#3b7bf0,#1d4ed8);border-color:transparent;color:#fff;box-shadow:0 4px 12px rgba(37,99,235,.22)}

/* 考核表来源提示条 */
.tplbar{background:#f4f8ff;border:1px solid rgba(37,99,235,.16);color:var(--pri2);border-radius:9px;padding:9px 13px;font-size:12.5px;margin-bottom:4px}
.tplbar.warn{background:var(--warnSoft);border-color:rgba(161,99,8,.2);color:var(--warn)}
.tplbar.danger{background:var(--badSoft);border-color:rgba(192,57,43,.2);color:var(--bad)}
.tplbar b{font-weight:700}
.tplbar .sub{margin-left:6px;color:inherit;opacity:.72}

/* 考核维度分组小标题 */
.dimhead{
  font-size:12px;font-weight:700;color:var(--pri2);margin:10px 0 -4px;padding-left:2px;
  letter-spacing:1.2px;text-transform:uppercase;
}
.dimhead:first-of-type{margin-top:0}

/* 指标的目标值 / 周期 / 评分规则 */
.indmeta{margin:-2px 0 10px;font-size:12px;line-height:1.6}
.indmeta .mt{margin-right:14px;color:var(--sub)}
.indmeta .mt i{font-style:normal;color:var(--faint);margin-right:4px}
.indmeta .rule{
  margin-top:5px;color:#5b6b82;background:var(--softbg);
  border-left:2px solid var(--pri);padding:6px 10px;border-radius:0 7px 7px 0;
}

/* 单表汇总评分 (人手一表, 列宽固定不再互相挤压) */
.score-tbl{table-layout:fixed;min-width:900px;border-collapse:separate;border-spacing:0}
.score-tbl th{white-space:nowrap;font-size:11.5px;padding:10px 8px;letter-spacing:.3px;color:#6b7a90}
.score-tbl td{padding:8px;vertical-align:middle;font-size:13px}
.score-tbl tbody tr:hover td{background:#f6f9fd}
.score-tbl th:first-child,.score-tbl td:first-child{padding-left:12px}
.score-tbl th:last-child,.score-tbl td:last-child{padding-right:12px}
/* 序号 / 维度 / 目标 / 权重 这些窄列居中显示 */
.score-tbl td:nth-child(1),.score-tbl th:nth-child(1),
.score-tbl td:nth-child(6),.score-tbl th:nth-child(6){text-align:center}
/* 指标名: 限 2 行, 不再被挤成竖排 */
.score-tbl .iname{font-weight:600;line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word;color:var(--txt)}
.score-tbl .target{color:#5b6b82;line-height:1.4;word-break:break-word}
/* 评分规则: 限 3 行, 悬停看全文
   注意: display:-webkit-box 必须放在内层 div 上, 不能直接加在 <td> 上——
   否则该 <td> 会失去 table-cell 身份, vertical-align:middle 失效, 规则文字顶到最上方, 与相邻列错位 */
.score-tbl .rulecell,.ind-tbl .rulecell{vertical-align:middle}
.score-tbl .rule{color:#6b7a90;font-size:12px;line-height:1.5;white-space:normal;word-break:break-word;
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
/* 维度合并单元格 */
.score-tbl .dimcell{text-align:center;vertical-align:middle;background:var(--softbg)}
/* 得分列: 滑块 + 数值 一行, 快捷分值一行 */
.score-tbl .scorecell{white-space:normal}
.score-tbl .score-inp{
  width:82px;height:34px;border:1px solid var(--line);border-radius:8px;padding:0 9px;
  font-size:15px;font-weight:700;color:var(--txt);text-align:center;
  background:#fff;outline:none;
  transition:border-color .15s,box-shadow .15s,background .15s;
  font-variant-numeric:tabular-nums;
}
.score-tbl .score-inp:focus{border-color:var(--pri);box-shadow:0 0 0 3px rgba(37,99,235,.13)}
.score-tbl .score-inp::-webkit-inner-spin-button{opacity:.5}
.score-tbl tfoot td{background:var(--bg-soft);font-weight:700;border-top:1px solid var(--line);color:var(--txt)}
/* 表格内滑块打分 */
.score-tbl .slider-wrap{display:flex;align-items:center;gap:8px;min-width:0}
.score-tbl .slider-wrap input[type=range]{flex:1;min-width:0;accent-color:var(--pri);height:22px;cursor:pointer}
.score-tbl .slider-wrap .rv{min-width:36px;text-align:right;font-size:15px;font-weight:700;color:var(--pri2);font-variant-numeric:tabular-nums}
.score-tbl .slider-wrap .rv.rv-empty{color:var(--faint);font-weight:400}
/* 未达 A 级（单项得分 < 90）→ 整行标红 + 分值标红 */
.score-tbl tbody tr.below-a td{background:#fdf3f2}
.score-tbl tbody tr.below-a td:first-child{box-shadow:inset 3px 0 0 var(--bad)}
.score-tbl tbody tr.below-a .iname{color:var(--bad)}
.score-tbl .slider-wrap .rv.rv-below{color:var(--bad)}
#score-wavg.below{color:var(--bad)}
/* 常用分值快选按钮: 单行等分, 不换行 */
.quick-picks{display:flex;gap:4px;margin-top:6px;flex-wrap:nowrap}
.quick-picks button{
  flex:1;min-width:0;height:22px;font-size:11px;padding:0;border-radius:6px;cursor:pointer;
  color:var(--sub);background:#fff;border:1px solid var(--line);transition:.12s;
}
.quick-picks button:hover{background:#eef4ff;border-color:rgba(37,99,235,.4);color:var(--pri2)}
.quick-picks button.on{background:linear-gradient(135deg,#3b7bf0,#1d4ed8);border-color:transparent;color:#fff;font-weight:700}
#score-wavg{color:var(--pri2);font-size:17px}
pre.out{background:var(--softbg);border:1px solid var(--line);color:var(--txt2);border-radius:10px;padding:16px;font-size:12.5px;white-space:pre-wrap;overflow:auto;max-height:280px}

/* ============ 提示 ============ */
.toast{
  position:fixed;left:50%;bottom:40px;transform:translateX(-50%) translateY(20px);
  background:#fff;border:1px solid var(--line);border-left:3px solid var(--pri);color:var(--txt);
  padding:12px 20px;border-radius:10px;
  box-shadow:0 14px 34px rgba(16,24,40,.16);
  opacity:0;pointer-events:none;transition:.25s;z-index:99;font-size:13.5px;font-weight:500;
}
.toast.on{opacity:1;transform:translateX(-50%) translateY(0)}
.toast.ok{border-left-color:var(--ok);color:#0f6b3d}
.toast.bad{border-left-color:var(--bad);color:var(--bad)}
.toast.warn{border-left-color:var(--amber);color:#8a4b06}

/* ============ 空态 ============ */
div.empty{text-align:center;padding:54px 20px;color:var(--sub)}
div.empty .ic{font-size:38px;margin-bottom:10px;opacity:.45}

/* ============ 表格上传区 ============ */
.drop{
  display:flex;align-items:center;gap:14px;
  background:var(--softbg);border:1px dashed #c9d4e2;border-radius:12px;
  padding:18px;margin-bottom:18px;transition:border-color .18s,background .18s;
}
.drop:hover{border-color:var(--pri);background:#f4f8ff}
.drop .hint{flex:1}

/* tab 内容切换 */
.view{display:none}
.view.on{display:block}
.arr{color:var(--sub)}

/* ============ 移动端 / 窄屏 ============ */
@media(max-width:760px){
  .topbar-in{flex-wrap:wrap;height:auto;padding:11px 14px;gap:10px}
  .brand{font-size:15px}
  .userbox{gap:6px;margin-left:auto}
  .userbox .avatar,.userbox .meta{display:none}
  .userbox .btn-ghost{padding:6px 10px;font-size:12px}
  .nav{order:3;flex:1 1 100%;width:auto;padding-bottom:2px;flex-wrap:wrap;overflow-x:visible}
  .nav button{padding:7px 11px;font-size:13px}
  .container{padding:18px 12px 56px}
  .page-h1{font-size:19px}
  .page-sub{margin-bottom:16px;padding-left:0}
  .page-h1{padding-left:12px}
  .card{padding:16px 14px;margin-bottom:14px}
  .card h3{font-size:15px;margin-bottom:12px}
  .stat{padding:14px}
  .stat .v{font-size:26px}
  .exec-kpi{padding:14px 15px}
  .exec-kpi .vv{font-size:25px}
  .exec-kpis{grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px}
  /* 宽表格(评分表最小 900px、薪资表 980px)在容器内独立横向滑动 */
  .card,.modal-bd,.kdrawer-bd{overflow-x:auto;-webkit-overflow-scrolling:touch}
  .modal{max-height:92vh}
  .modal-bd{padding:16px}
  .kdrawer-panel{width:100vw;max-width:100vw}
  .dr-kpis{grid-template-columns:1fr 1fr}
  .form-row{grid-template-columns:1fr}
  .chart-wrap{overflow-x:auto}
  .btn,.btn-ghost{min-height:34px}
  /* 弹窗底部按钮在窄屏换行 + 加大触控区：之前两个以上按钮会挤出屏幕，最右侧的按钮点不到 */
  .modal-ft{flex-wrap:wrap;padding:12px 14px;gap:8px;padding-bottom:calc(12px + env(safe-area-inset-bottom))}
  .modal-ft .btn{flex:1 1 auto;min-width:96px;min-height:44px}
  .modal-hd{position:static}   /* sticky 在小屏上会盖住内容，取消 */
  .tbtn{padding:6px 12px}
  /* 窄屏表格：中文短字段不折行，超宽时在卡片内横向滑动，避免"注塑一车间"被拆成三行 */
  .tbl th,.tbl td{word-break:keep-all;padding:10px 8px}
  .tbl .rule,.tbl .iname{word-break:break-word}
}
@media(min-width:761px) and (max-width:1080px){
  .container{padding:22px 16px 56px}
  .card{padding:18px}
}

/* ============ 指标模板左栏 ============ */
.tpl-list .tpl-item{
  padding:10px 12px;border-radius:9px;cursor:pointer;margin-bottom:6px;
  border:1px solid transparent;background:transparent;transition:.14s;
}
.tpl-list .tpl-item:hover{background:var(--soft)}
.tpl-list .tpl-item.on{background:var(--priSoft);border-color:rgba(37,99,235,.24);box-shadow:inset 2px 0 0 var(--pri)}
.tpl-list .tpl-item .t{font-weight:600;font-size:14px;color:var(--txt)}
.tpl-list .tpl-item .sub{font-size:12px;color:var(--sub);margin-top:2px}

/* ============ modal 表单 ============ */
.form{display:flex;flex-direction:column;gap:11px}
.form label{display:flex;flex-direction:column;font-size:12.5px;color:var(--sub);gap:6px;font-weight:500}
.form label > input,.form label > select,.form label > textarea{
  padding:10px 12px;border:1px solid var(--line);border-radius:9px;font-size:14px;
  background:var(--softbg);color:var(--txt);font-family:inherit;
  transition:border-color .15s,box-shadow .15s;
}
.form label > textarea{resize:vertical;min-height:60px}
.form label > input:focus,.form label > select:focus,.form label > textarea:focus{
  outline:none;border-color:var(--pri);box-shadow:0 0 0 3px rgba(37,99,235,.13);background:#fff;
}
.form-row{display:grid;grid-template-columns:1fr 1fr;gap:10px}
/* 弹窗内可滚动表格容器 */
.tbl-wrap{max-height:260px;overflow:auto;border:1px solid var(--line);border-radius:9px;background:#fff}
.tbl-wrap .tbl{margin:0;font-size:13px}
.tbl-wrap .tbl th{position:sticky;top:0;background:#f7f9fc;z-index:1}
/* 绩效核算 6 板块表 */
.pay-tbl{font-size:13px}
.pay-tbl th,.pay-tbl td{white-space:nowrap}
.pay-tbl thead tr:first-child th{text-align:center}
.pay-tbl .pw-base{min-width:74px;font-weight:normal}
.pay-tbl .pw-score{min-width:56px;font-weight:normal}
.pay-tbl .pw-grade{min-width:52px;font-weight:normal}
.pay-tbl .pw-coeff{min-width:56px;font-weight:normal}
.pay-tbl td{text-align:center}
.pay-tbl td.em{text-align:left}

/* ============ 维度徽章 (评分表 / 指标库 共用) ============ */
.dimbadge{
  display:inline-block;padding:5px 9px;border-radius:8px;
  background:rgba(37,99,235,.08);color:var(--pri2);
  border:1px solid rgba(37,99,235,.14);
  font-size:12px;font-weight:600;line-height:1.35;max-width:100%;word-break:break-word;
}
.dimbadge.t-purple{background:rgba(139,110,240,.10);color:#6d34d8;border-color:rgba(139,110,240,.16)}
.dimbadge.t-green{background:var(--okSoft);color:var(--ok);border-color:rgba(18,138,76,.16)}
.dimbadge.t-amber{background:var(--warnSoft);color:var(--warn);border-color:rgba(161,99,8,.16)}
.dimbadge.t-gray{background:var(--soft);color:#52627a;border-color:var(--line)}
.dimbars{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:12px 0 4px}

/* ============ 指标库: 左侧模板列表 + 右侧详情 ============ */
.ind-grid{display:grid;grid-template-columns:300px 1fr;gap:14px;align-items:start}
.ind-side{padding:12px}
.ind-side .ind-side-hd{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:10px}
.ind-side .ind-side-hd b{font-size:14px;color:var(--txt)}
.ind-search{
  width:100%;padding:9px 11px;border:1px solid var(--line);border-radius:9px;
  font-size:13px;background:var(--softbg);color:var(--txt);outline:none;
  transition:border-color .15s,box-shadow .15s;
}
.ind-search:focus{border-color:var(--pri);background:#fff;box-shadow:0 0 0 3px rgba(37,99,235,.13)}
.ind-grid .tpl-list{max-height:62vh;overflow:auto;padding-right:2px}
.ind-tbl{table-layout:fixed}
.ind-tbl th{white-space:nowrap;font-size:11.5px;padding:10px;color:#6b7a90}
.ind-tbl td{padding:10px;font-size:13px;vertical-align:middle}
.ind-tbl tbody tr:hover td{background:#f6f9fd}
.ind-tbl .iname{font-weight:600;line-height:1.45;word-break:break-word;color:var(--txt);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.ind-tbl .iname .seqno{
  display:inline-block;min-width:18px;margin-right:6px;padding:1px 5px;border-radius:5px;
  background:var(--soft);color:var(--sub);font-size:11px;font-weight:600;text-align:center;
}
.ind-tbl .target{color:#5b6b82;line-height:1.45;word-break:break-word}
.ind-tbl .rule{color:#6b7a90;font-size:12px;line-height:1.5;word-break:break-word;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.ind-tbl .dimcell,.ind-tbl td:nth-child(5){text-align:center}
.ind-tbl .dimcell{vertical-align:middle;background:var(--softbg)}
.ind-tbl .opcell{white-space:nowrap;text-align:right}
.ind-tbl .opcell .btn + .btn{margin-left:6px}
.ind-wrap{border-radius:10px}

@media(max-width:1080px){
  .ind-grid{grid-template-columns:1fr}
  .ind-side .tpl-list{max-height:none;display:flex;flex-wrap:wrap;gap:6px}
  .ind-side .tpl-item{flex:1 1 160px;margin-bottom:0}
}

/* ============ 经营看板 ============ */
.exec-bar{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  background:var(--card);
  border:1px solid var(--line);border-radius:var(--r);padding:12px 16px;margin-bottom:16px;box-shadow:var(--shadow);
}
.exec-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin-bottom:18px}
.exec-kpi{
  position:relative;overflow:hidden;
  background:var(--card);
  border:1px solid var(--line);border-left:3px solid rgba(37,99,235,.45);
  border-radius:var(--r);padding:16px 18px;box-shadow:var(--shadow);
  transition:border-color .18s,box-shadow .18s;
}
.exec-kpi:hover{border-color:#cfd9e6;border-left-color:var(--pri);box-shadow:0 4px 14px rgba(16,24,40,.08)}
.exec-kpi .kk{color:var(--sub);font-size:12.5px}
.exec-kpi .vv{font-size:30px;font-weight:800;line-height:1.25;margin-top:3px;letter-spacing:-.6px;font-variant-numeric:tabular-nums;color:var(--txt)}
.exec-kpi .vv small{font-size:13px;font-weight:600;color:var(--sub);margin-left:3px}
.exec-kpi .kd{margin-top:6px;min-height:20px;display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.exec-kpi .ks{color:var(--sub);font-size:11.5px;margin-top:4px}
.delta{display:inline-flex;align-items:center;gap:2px;font-size:12px;font-weight:700;padding:2px 8px;border-radius:20px;white-space:nowrap}
.delta.up{background:var(--okSoft);color:var(--ok)}
.delta.down{background:var(--badSoft);color:var(--bad)}
.delta.flat{background:var(--soft);color:var(--sub)}
.delta.none{background:var(--soft);color:var(--faint);font-weight:600}
.delta-prev{font-size:11.5px;color:var(--sub)}
.chart-wrap{width:100%;overflow-x:auto}
.legend{display:flex;flex-wrap:wrap;gap:14px;align-items:center;margin-top:10px;font-size:12px;color:var(--sub)}
.legend i{display:inline-block;width:11px;height:11px;border-radius:3px;margin-right:5px;vertical-align:-1px}
.exec-2col{display:grid;grid-template-columns:minmax(320px,1fr) minmax(320px,1fr);gap:18px}
.exec-2col .card{margin-bottom:18px}
@media(max-width:1080px){.exec-2col{grid-template-columns:1fr}}
.donut-row{display:flex;gap:20px;align-items:center;flex-wrap:wrap}
.donut-lg{flex:1;min-width:190px}
.donut-lg .dl{display:grid;grid-template-columns:12px 42px 1fr;align-items:center;gap:8px;padding:4px 0}
.donut-lg .dl i{width:11px;height:11px;border-radius:3px}
.donut-lg .dl b{font-size:12.5px;color:var(--txt2)}
.donut-lg .dl span{font-size:12px;color:var(--sub)}
.bar-mini{display:block;width:100%;height:6px;border-radius:6px;background:#edf1f6;overflow:hidden}
.bar-mini i{display:block;height:100%;border-radius:6px}
.donut-lg .dl .bar-mini{grid-column:1 / -1;margin-top:-2px}
.grade-tag{font-weight:800;font-size:13px}
tbody tr.rv-below td{background:#fdf3f2}
tbody tr.rv-below td:first-child{box-shadow:inset 3px 0 0 var(--bad)}
.modal-foot{display:flex;justify-content:flex-end;gap:10px;margin-top:16px;padding-top:14px;border-top:1px solid var(--line)}

/* ============ 经营看板增强: 警报台 / 图表 tab / 下钻抽屉 ============ */
.alert-list{display:flex;flex-direction:column;gap:9px}
.alert-item{
  display:flex;align-items:center;gap:14px;border-radius:10px;padding:11px 14px;
  border:1px solid transparent;transition:.14s;
}
.alert-item.red{background:#fdf3f2;border-color:rgba(192,57,43,.16);border-left:3px solid var(--bad)}
.alert-item.amber{background:var(--warnSoft);border-color:rgba(161,99,8,.18);border-left:3px solid var(--amber)}
.alert-item.red:hover{background:#fce9e8}
.alert-item.amber:hover{background:#fbedd6}
.ai-main{flex:1;min-width:0}
.ai-title{font-size:13.5px;font-weight:600;color:var(--txt)}
.ai-desc{font-size:12px;color:var(--sub);margin-top:2px}
.ai-act{flex-shrink:0;font-size:12px;font-weight:600;padding:5px 12px;border-radius:20px}
.alert-item.red .ai-act{background:var(--badSoft);color:var(--bad)}
.alert-item.amber .ai-act{background:#faedcf;color:var(--warn)}
.ai-empty{font-size:12.5px;color:var(--faint);padding:6px 0}
.card-tabs{margin-left:auto;display:inline-flex;gap:3px;background:var(--softbg);padding:3px;border-radius:9px;border:1px solid var(--line)}
.tbtn{
  border:1px solid transparent;background:none;padding:5px 12px;border-radius:7px;
  font-size:12.5px;color:var(--sub);cursor:pointer;font-family:inherit;transition:.14s;
}
.tbtn:hover{color:var(--txt)}
.tbtn.on{background:#fff;color:var(--pri2);font-weight:600;border-color:rgba(37,99,235,.22);box-shadow:0 1px 2px rgba(16,24,40,.06)}
.rg-chips{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:10px}
.rg-chip{
  border:1px solid var(--line);background:#fff;padding:4px 12px;border-radius:20px;
  font-size:12.5px;color:var(--sub);cursor:pointer;font-family:inherit;transition:.14s;
}
.rg-chip:hover{border-color:rgba(37,99,235,.4);color:var(--pri2);background:#f5f9ff}
.rg-chip.on{background:var(--priSoft);border-color:rgba(37,99,235,.4);color:var(--pri2);font-weight:600}
.rg-flex{display:flex;gap:20px;flex-wrap:wrap;align-items:flex-start}
.weak-cell{background:#fdf3f2;color:var(--bad);font-weight:600}
.mini-tag{display:inline-block;font-size:11px;padding:1px 7px;border-radius:20px;background:var(--soft);color:var(--sub);margin-left:4px}
.mini-tag.warn{background:var(--badSoft);color:var(--bad)}
.dim-row{opacity:.72}
.drow:hover td{background:#f6f9fd}
.qi{cursor:help;color:var(--faint);font-size:11px}
.warn-inline{color:var(--warn);font-size:11px}
.sel-row td{background:#eef4ff}
.kdrawer{position:fixed;inset:0;z-index:60;pointer-events:none}
.kdrawer-mask{position:absolute;inset:0;background:rgba(16,24,40,.34);opacity:0;transition:.2s}
.kdrawer-panel{
  position:absolute;top:0;right:0;height:100%;width:88vw;max-width:760px;
  background:#fff;
  border-left:1px solid var(--line);
  box-shadow:-16px 0 48px rgba(16,24,40,.16);
  transform:translateX(102%);transition:transform .24s ease;overflow-y:auto;
}
.kdrawer.on{pointer-events:auto}
.kdrawer.on .kdrawer-mask{opacity:1}
.kdrawer.on .kdrawer-panel{transform:none}
.kdrawer-hd{
  position:sticky;top:0;z-index:2;display:flex;align-items:center;gap:12px;
  padding:15px 20px;border-bottom:1px solid var(--line);
  background:#fff;
}
.kdrawer-hd b{font-size:15px;color:var(--txt)}
.kdrawer-hd .x{
  margin-left:auto;width:30px;height:30px;border:1px solid var(--line);border-radius:8px;
  background:#fff;cursor:pointer;font-size:16px;color:var(--sub);line-height:1;transition:.15s;
}
.kdrawer-hd .x:hover{border-color:var(--bad);color:var(--bad);background:var(--badSoft)}
.kdrawer-bd{padding:16px 20px 48px}
.kdrawer-bd h4{font-size:12.5px;font-weight:700;margin:20px 0 8px;color:var(--sub);letter-spacing:.8px;text-transform:uppercase}
.dr-kpis{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:6px}
.dr-kpis .mini{background:var(--softbg);border:1px solid var(--line);border-radius:10px;padding:10px 12px}
.dr-kpis .mk{font-size:11.5px;color:var(--sub)}
.dr-kpis .mv{font-size:19px;font-weight:700;margin-top:1px;font-variant-numeric:tabular-nums;color:var(--txt)}
.dr-kpis .mv small{font-size:12px;font-weight:500;color:var(--faint)}
.dr-rows{margin-top:6px}
.dr-rows .row{display:flex;justify-content:space-between;gap:12px;padding:8px 0;border-bottom:1px solid var(--line-2);font-size:12.5px}
.dr-rows .row span:last-child{font-weight:600;text-align:right;color:var(--txt)}
.dr-warn{
  margin-top:12px;background:var(--warnSoft);border-left:3px solid var(--amber);
  border-radius:8px;padding:9px 12px;font-size:12.5px;color:var(--warn);
}

/* ============ 交互一致性 ============ */
.btn:focus-visible,.btn-ghost:focus-visible,.nav button:focus-visible,
.tbtn:focus-visible,.rg-chip:focus-visible,.tpl-item:focus-visible,
.modal-hd .x:focus-visible,.kdrawer-hd .x:focus-visible,
input:focus-visible,select:focus-visible,textarea:focus-visible{
  outline:2px solid var(--pri);outline-offset:2px;
}
/* 评分弹窗: 单选题 / 多选题选项 */
.sv-opts{display:flex;flex-direction:column;gap:6px}
.sv-op{
  display:flex;align-items:center;gap:8px;padding:9px 11px;
  border:1px solid var(--line);border-radius:9px;cursor:pointer;font-size:13.5px;
  background:#fff;transition:.14s;
}
.sv-op:hover{border-color:rgba(37,99,235,.4);background:#f7faff}
.sv-op.on{border-color:var(--pri);background:#eef4ff}
.sv-op input{margin:0;accent-color:var(--pri)}

/* ---------- 填写链接 / 调查码（手机端可点、可长按、可复制） ---------- */
.sv-link{
  display:block;padding:11px 12px;border:1px solid var(--line);border-radius:10px;
  background:var(--softbg);color:var(--pri);font-size:13px;line-height:1.7;
  word-break:break-all;text-decoration:underline;
  -webkit-user-select:all;user-select:all;          /* 手机上长按即可整段选中复制 */
  -webkit-touch-callout:default;                    /* iOS 保留长按菜单（默认会被禁掉） */
  touch-action:manipulation;                        /* 去掉移动端 300ms 点击延迟 */
  min-height:44px;                                  /* 触控目标 ≥44px */
}
.sv-link:active{background:var(--priSoft)}
/* 用回环地址登录后台时的提醒: 二维码/链接已自动改成局域网地址 */
.sv-warn{
  padding:10px 12px;margin-bottom:12px;border-radius:10px;font-size:12.5px;line-height:1.7;
  background:#fff7e6;border:1px solid #f7d08a;color:#8a5a00;
}
.sv-warn b{color:#7a4b00}
.sv-code{
  padding:10px 12px;border:1px dashed rgba(37,99,235,.45);border-radius:10px;
  background:var(--priSoft);color:var(--pri2);font-weight:700;font-size:19px;
  letter-spacing:5px;text-align:center;-webkit-user-select:all;user-select:all;
  -webkit-touch-callout:default;
}

/* 通用隐藏 (JS 切换显示用) */
.hide{display:none!important}

/* 尊重系统"减少动效"设置 */
@media (prefers-reduced-motion: reduce){
  *{transition-duration:.01ms !important;animation-duration:.01ms !important}
}

/* ============================================================
   v20261020j · 体验统一层
   原则：只做「覆盖」，不改原有选择器语义；所有规则都可单独删除回退
   ============================================================ */

/* ---------- 1. 分段控件：全站唯一的 tab 语言 ---------- */
.seg{
  display:inline-flex;gap:4px;padding:4px;
  background:var(--soft);border:1px solid var(--line);border-radius:11px;
  max-width:100%;
}
.seg-i{
  border:0;background:transparent;color:var(--sub);
  font:inherit;font-size:13px;font-weight:600;
  padding:7px 14px;border-radius:8px;white-space:nowrap;
  transition:background .15s,color .15s,box-shadow .15s;
}
.seg-i:hover{color:var(--txt);background:rgba(255,255,255,.72)}
.seg-i.on{
  background:#fff;color:var(--pri2);
  box-shadow:0 1px 3px rgba(16,24,40,.10),0 0 0 1px rgba(37,99,235,.10);
}
.seg-wrap{display:flex;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch}
.seg-wrap::-webkit-scrollbar{display:none}

/* ---------- 2. 危险操作：默认安静，悬停才报警 ---------- */
.btn.danger{
  background:#fff;border-color:rgba(192,57,43,.26);color:var(--bad);
  box-shadow:none;
}
.btn.danger:hover{
  background:var(--badSoft);border-color:rgba(192,57,43,.46);color:var(--bad);
  filter:none;box-shadow:none;
}

/* ---------- 3. 表单栅格：多字段不再互相挤压 ---------- */
.sv-set{
  display:grid;grid-template-columns:repeat(5,minmax(0,1fr)) auto;
  gap:12px;align-items:end;
}
.sv-set .fld{min-width:0;display:flex;flex-direction:column;gap:6px}
.sv-set .fld>label{font-size:12.5px;color:var(--sub);letter-spacing:.2px}
.sv-set .inp{
  width:100%;height:38px;min-width:0;padding:0 10px;
  border:1px solid var(--line);border-radius:9px;background:var(--softbg);
  font:inherit;font-size:13.5px;color:var(--txt);outline:none;
  transition:border-color .15s,box-shadow .15s,background .15s;
}
.sv-set .inp:hover{border-color:#cdd7e5}
.sv-set .inp:focus{border-color:var(--pri);background:#fff;box-shadow:var(--glow)}
.sv-set-act{justify-content:flex-end}
.sv-set-act .btn{white-space:nowrap;height:38px;padding:0 18px}

/* ---------- 4. 按钮加载态（防止重复提交） ---------- */
.btn[data-busy="1"],.btn-ghost[data-busy="1"]{
  opacity:.62;pointer-events:none;cursor:progress;
}
.btn[data-busy="1"]::after{
  content:"";display:inline-block;width:11px;height:11px;margin-left:7px;
  border:2px solid rgba(255,255,255,.55);border-top-color:#fff;border-radius:50%;
  vertical-align:-1px;animation:kpi-spin .7s linear infinite;
}
@keyframes kpi-spin{to{transform:rotate(360deg)}}

/* ---------- 5. 卡片与标题：收紧节奏，强化层级 ---------- */
.card{padding:20px 22px}
.card h3{font-size:15.5px;margin-bottom:14px}
.card h3 .sub{font-weight:400}
.tbl th{font-size:12px;color:#5d6c82;letter-spacing:.3px}
.tbl td{padding:11px 10px}
.tbl tbody tr:hover td{background:#f7faff}

/* 数值统一等宽，表格里的分数才对齐 */
.tbl .num,.stat .v,.exec-kpi .vv{font-variant-numeric:tabular-nums}

/* ---------- 6. 窄屏：顶部导航单行滑动（原来换成 3 行，吃掉半屏） ---------- */
@media(max-width:760px){
  .topbar-in{flex-wrap:nowrap;height:56px;padding:0 12px;gap:10px}
  .nav{
    order:0;flex:1 1 auto;width:auto;
    flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;
    padding:0 2px;-webkit-overflow-scrolling:touch;
    mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 18px),transparent 100%);
    -webkit-mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 18px),transparent 100%);
  }
  .nav button{padding:7px 11px;font-size:13px;flex:0 0 auto}
  .container{padding:14px 12px 64px}
  .page-h1{font-size:19px;margin-bottom:6px}
  .page-sub{font-size:12.5px;line-height:1.7;margin-bottom:14px}
  .card{padding:15px 14px;margin-bottom:12px}
  .sv-set{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
  .sv-set-act{grid-column:1 / -1}
  .sv-set-act .btn{width:100%;height:42px}
  .seg{width:100%;overflow-x:auto}
  .seg-i{flex:0 0 auto}

  /* 宽表格：首列吸附 + 操作列吸附，中间列横滑 —— 按钮不会再被挤出屏幕 */
  .tbl th:first-child,.tbl td:first-child{
    position:sticky;left:0;z-index:2;background:#fff;
    box-shadow:1px 0 0 var(--line-2);
  }
  .tbl th:last-child,.tbl td:last-child{
    position:sticky;right:0;z-index:2;background:#fff;
    box-shadow:-1px 0 0 var(--line-2);
  }
  .tbl th:first-child,.tbl th:last-child{background:#f7f9fc}
  .tbl tbody tr:hover td:first-child,.tbl tbody tr:hover td:last-child{background:#f7faff}
  .tbl-wrap{max-height:none}
}

/* ---------- 7. 登录页：去掉重复标识，比例更像品牌页 ---------- */
.login-shell{max-width:960px}
.login-brand{flex:0 0 44%}
.brand-head{display:flex;align-items:center;gap:12px;position:relative}
.brand-mark{
  width:42px;height:42px;border-radius:13px;font-size:20px;
  box-shadow:0 4px 12px rgba(37,99,235,.12);
}
.brand-name{margin-top:0;font-size:19px;letter-spacing:.2px}
.brand-desc{margin-top:18px;font-size:13px;line-height:1.7;max-width:30ch}
.brand-feats{gap:15px;margin-top:34px}
.brand-foot{display:flex;justify-content:space-between;align-items:center;gap:12px}
.brand-ver{font-variant-numeric:tabular-nums;opacity:.75}
.login-card{max-width:480px;padding:42px 44px}
.login-logo{width:50px;height:50px;border-radius:15px;font-size:23px;margin-bottom:18px}
.login-title{font-size:22px}
.login-sub{margin-bottom:24px}
@media(max-width:880px){
  .login-brand{display:none}
  .login-card{max-width:440px;padding:34px 24px}
}

/* ---------- 8. 无障碍 / 低端设备 ---------- */
@media(prefers-reduced-motion:reduce){
  *{animation-duration:.001ms!important;transition-duration:.001ms!important}
}
/* 长列表卡片渲染隔离：滚动时只重绘可见区域，低端安卓更稳 */
.card{contain:layout style}

/* ---------- 9. 待办统计卡：数字之外给出「做什么」 ---------- */
.stat-k{padding:16px 18px 15px}
.stat-top{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
.stat-k .k{font-size:12.5px;color:var(--sub)}
.stat-ico{
  width:30px;height:30px;border-radius:9px;display:flex;align-items:center;justify-content:center;
  flex:0 0 auto;margin-top:-2px;
}
.stat-ico.report{background:rgba(37,99,235,.10);color:var(--pri2)}
.stat-ico.dept{background:var(--warnSoft);color:var(--warn)}
.stat-k .v{font-size:32px;margin-top:2px;line-height:1.15}
.stat-hint{margin-top:3px;font-size:12px;color:var(--faint)}
.stat-k::before{opacity:.6}

/* ---------- 10. 经营看板 KPI 卡：等高、说明不塌 ---------- */
.exec-kpi{display:flex;flex-direction:column;min-height:132px}
.exec-kpi .ks{margin-top:auto;padding-top:6px;line-height:1.6}
.exec-kpi .ks .qi,.exec-kpi .ks .q{
  display:inline-flex;align-items:center;justify-content:center;
  width:15px;height:15px;border-radius:50%;background:var(--soft);
  color:var(--sub);font-size:10px;font-style:normal;cursor:help;
  vertical-align:-2px;margin-left:3px;
}
.exec-kpi .ks br{display:none}
.warn-inline{color:var(--warn);font-size:11.5px}

/* ---------- 11. 行内组合（姓名+状态、进度条+计数） ---------- */
.who{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.who .em{white-space:nowrap}
.prog{display:flex;align-items:center;gap:9px;min-width:120px}
.prog .bar{flex:1 1 auto;min-width:54px}
.prog>span{flex:0 0 auto;font-variant-numeric:tabular-nums;font-size:12px}

/* ---------- 12. 登录页左栏：内容分组上收、脚注贴底 ---------- */
.login-brand .brand-feats{margin-top:32px;margin-bottom:0;gap:18px}
.login-brand .brand-foot{margin-top:auto}
.login-brand{justify-content:flex-start}
.stat-k{padding-bottom:17px}

/* ---------- 13. 宽表格：滚动可见 + 首列常驻 ---------- */
.tbl-wrap{scrollbar-width:thin;scrollbar-color:#c7d2e0 transparent}
.tbl-wrap::-webkit-scrollbar{width:9px;height:9px}
.tbl-wrap::-webkit-scrollbar-track{background:transparent}
.tbl-wrap::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:8px;border:2px solid #fff}
.tbl-wrap::-webkit-scrollbar-thumb:hover{background:#a9b7c9}
.tbl-wrap::-webkit-scrollbar-corner{background:transparent}
/* 桌面端也把姓名列钉住：薪资表 26 列，横滑时不至于找不到是谁 */
.tbl th:first-child,.tbl td:first-child{position:sticky;left:0;z-index:2;background:#fff}
.tbl th:first-child{background:#f7f9fc;z-index:3}
.tbl tbody tr:hover td:first-child{background:#f7faff}

/* ---------- 14. 窄屏顶部：品牌行 + 导航行（两行，不再三行） ---------- */
@media(max-width:760px){
  .topbar-in{
    flex-wrap:wrap;height:auto;padding:8px 12px 0;gap:6px 10px;row-gap:4px;
  }
  .brand{order:1;font-size:14.5px}
  .brand .logo{width:28px;height:28px;border-radius:8px;font-size:14px}
  .userbox{order:2;margin-left:auto;gap:4px}
  /* 手机端刷新由 25 秒静默刷新 + 切回标签页刷新兜底，按钮省掉换空间 */
  .userbox #btn-refresh{display:none}
  .userbox .btn-ghost{padding:5px 9px;font-size:12px;white-space:nowrap;flex:0 0 auto}
  .nav{
    order:3;flex:1 1 100%;width:100%;padding:0 0 5px;
    overflow-x:auto;overflow-y:hidden;flex-wrap:nowrap;
  }
  .nav button{padding:6px 11px;font-size:13px;flex:0 0 auto}
  /* 移动端表格：部门/职务列限宽，把空间让给得分与进度 */
  .tbl td:nth-child(2),.tbl th:nth-child(2){max-width:96px}
}

/* ---------- 15. 窄屏表格密度：按钮和分数先保证看得全 ---------- */
@media(max-width:760px){
  .tbl{font-size:12.5px}
  .tbl th,.tbl td{padding:9px 7px}
  .tbl .pill{font-size:11px;padding:2px 7px;line-height:1.5}
  .tbl .btn.sm{padding:6px 10px;font-size:12px;min-height:34px}
  /* 待办表：手机上进度只留「15/16」，把宽度让给得分与操作按钮 */
  .todo-tbl .prog{min-width:0}
  .todo-tbl .prog .bar{display:none}
  .todo-tbl td:nth-child(2){max-width:84px}
}

/* 待办表：手机上明确收起「评分进度」列，避免被 sticky 操作列半遮挡 */
@media(max-width:760px){
  .todo-tbl th:nth-child(4),.todo-tbl td:nth-child(4){display:none}
}

/* ---------- 16. 规则说明折叠：查得到即可，不占首屏 ---------- */
.rule-box{
  background:var(--card);border:1px solid var(--line);border-radius:var(--r);
  box-shadow:var(--shadow);padding:14px 20px;margin-bottom:16px;
}
.rule-box summary{
  display:flex;align-items:center;gap:10px;cursor:pointer;list-style:none;
  font-size:15px;color:var(--txt);
}
.rule-box summary::-webkit-details-marker{display:none}
.rule-box summary .sub{font-weight:400;font-size:12.5px}
.rule-box summary::after{
  content:"展开";margin-left:auto;font-size:12px;font-weight:600;color:var(--pri);
  padding:3px 10px;border-radius:999px;background:var(--priSoft);
}
.rule-box[open] summary::after{content:"收起"}
.rule-box[open] summary{padding-bottom:4px}

/* 薪资表：姓名与工号同行，行高从 ~56px 收到 ~42px，一屏多看 4 人 */
.who .code{font-size:11.5px;color:var(--faint);font-variant-numeric:tabular-nums}
.pay-tbl td{white-space:nowrap}
.pay-tbl td:nth-child(2){white-space:normal;min-width:110px}

/* ============================================================
   v20261023a · 部署前统一层
   只做「看得见的兜底」：加载中 / 失败重试 / 表单状态 / 键盘焦点 / 无障碍
   全部追加在文件末尾，纯覆盖式，不需要时可整段删除
   ============================================================ */

/* ---------- 17. 顶部请求进度条 ---------- */
#gload{
  position:fixed;top:0;left:0;right:0;height:2px;z-index:200;
  pointer-events:none;opacity:0;transition:opacity .18s ease;
  background:linear-gradient(90deg,rgba(37,99,235,0),var(--pri),rgba(15,157,191,.9),rgba(37,99,235,0));
  background-size:220% 100%;
}
#gload.on{opacity:1;animation:gload 1.1s linear infinite}
@keyframes gload{0%{background-position:100% 0}100%{background-position:-100% 0}}

/* ---------- 18. 加载态 ---------- */
.load-box{
  display:flex;align-items:center;justify-content:center;gap:9px;
  padding:56px 16px;color:var(--sub);font-size:13.5px;
}
.load-box .spin{
  width:15px;height:15px;flex-shrink:0;border-radius:50%;
  border:2px solid var(--line);border-top-color:var(--pri);
  animation:spin .7s linear infinite;
}
@keyframes spin{to{transform:rotate(360deg)}}
/* 卡片内的"正在算"占位，避免统计卡先显示 0 再跳成真值 */
.stat.pending .v,.exec-kpi.pending .vv{color:var(--faint)}

/* ---------- 19. 失败态（带重试） ---------- */
.err-box{
  background:var(--card);border:1px solid var(--line);border-left:3px solid var(--bad);
  border-radius:var(--r);box-shadow:var(--shadow);
  padding:26px 22px;margin:8px 0 16px;text-align:center;
}
.err-box .ic{font-size:26px;line-height:1;margin-bottom:10px}
.err-box .t{font-size:16px;font-weight:700;color:var(--txt);margin-bottom:6px}
.err-box .d{font-size:13px;color:var(--txt2);word-break:break-word}
.err-box .hint{font-size:12.5px;color:var(--sub);margin-top:8px;line-height:1.7}
.err-box .btn-row{justify-content:center;margin-top:16px}

/* ---------- 20. 表单与按钮状态统一 ---------- */
/* 禁用态：之前部分按钮 disabled 后没有视觉变化，点了还以为没生效 */
.btn:disabled,.btn-ghost:disabled,.btn[aria-disabled="true"]{
  opacity:.5;cursor:not-allowed;box-shadow:none;transform:none;filter:none;
}
input:disabled,select:disabled,textarea:disabled{
  background:var(--soft);color:var(--faint);cursor:not-allowed;
}
/* 必填未填：提交后标记，不要只在 toast 里说一句 */
input.invalid,select.invalid,textarea.invalid{
  border-color:var(--bad);background:#fffafa;
}
input.invalid:focus,select.invalid:focus,textarea.invalid:focus{
  box-shadow:0 0 0 3px rgba(192,57,43,.14);
}
.field .req{color:var(--bad);margin-left:3px}

/* ---------- 21. 键盘焦点可见（无障碍 + 表单键盘操作） ---------- */
a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,
textarea:focus-visible,summary:focus-visible,[tabindex]:focus-visible{
  outline:none;box-shadow:0 0 0 3px rgba(37,99,235,.28);border-radius:9px;
}
/* 鼠标点击不显示焦点环，键盘 Tab 才显示 */
a:focus:not(:focus-visible),button:focus:not(:focus-visible){box-shadow:none}

/* ---------- 22. 关掉 JS 时的提示 ---------- */
.noscript{
  position:fixed;inset:0;z-index:999;display:flex;align-items:center;justify-content:center;
  background:var(--bg);color:var(--txt);font-size:15px;padding:24px;text-align:center;line-height:1.8;
}

/* ---------- 23. 打印：签字/报表打印时去掉导航与按钮 ---------- */
@media print{
  .topbar,.btn,.btn-ghost,.modal-mask,.toast,#gload{display:none !important}
  body{background:#fff}
  .card,.tbl-wrap{box-shadow:none;border-color:#d7dde7;break-inside:avoid}
  .container{padding:0}
}

/* ---------- 24. 尊重系统"减少动效" ---------- */
@media (prefers-reduced-motion:reduce){
  #gload.on{animation:none;opacity:1}
  .load-box .spin{animation-duration:2s}
}

/* ==========================================================
   25. 考核记录删除（v20261023b）：勾选、批量条、已删除视图
   ========================================================== */
.tbl input[type="checkbox"]{
  width:15px;height:15px;cursor:pointer;accent-color:var(--pri);
  vertical-align:-2px;
}
.tbl input[type="checkbox"]:disabled{cursor:not-allowed;opacity:.4}
#cy-bulk-bar{min-height:34px;align-items:center;gap:8px}
#cy-bulk-bar .sub{font-size:12.5px}
/* 已删除视图整行降饱和，一眼区分"归档"而不是"在用" */
tr[data-cid]{transition:background .12s}
.tbl tbody tr:hover{background:#f8fafd}
/* 删除原因输入 */
.field .req{color:#d14343;margin-left:3px}
.field .inp{width:100%}
