:root{
  --bg:#f5f7fb; --panel:#fff; --line:#e6ebf4; --line-strong:#d5dded;
  --text:#1b2432; --text-2:#5b6b83; --text-3:#8b9ab1;
  --brand:#3358e0; --brand-soft:#eaeffe; --brand-2:#5b7cff;
  --ok:#0f9d63; --ok-soft:#e6f6ee;
  --warn:#c47b05; --warn-soft:#fdf3e0;
  --danger:#d64545; --danger-soft:#fdecec;
  --purple:#6b4ef2; --purple-soft:#f0ecff;
  --radius:12px;
  --shadow:0 1px 2px rgba(21,38,66,.05), 0 8px 24px -16px rgba(21,38,66,.28);
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  background:var(--bg);color:var(--text);
  font-family:"Microsoft YaHei","PingFang SC","Hiragino Sans GB",system-ui,-apple-system,sans-serif;
  font-size:13px;line-height:1.6;-webkit-font-smoothing:antialiased;
}
::selection{background:#d9e2ff}
button{font-family:inherit;cursor:pointer}
.wrap{display:flex;min-height:100vh;align-items:flex-start}

/* 侧边栏：position:sticky 保证页面下拉时主菜单固定不变 */
.side{position:sticky;top:0;align-self:flex-start;height:100vh;overflow-y:auto;z-index:25;
  width:218px;flex:0 0 218px;background:#0f1a2e;color:#c9d5ea;padding:18px 12px 12px;
  display:flex;flex-direction:column;gap:0}
.side::-webkit-scrollbar{width:6px}
.side::-webkit-scrollbar-track{background:transparent}
.side::-webkit-scrollbar-thumb{background:#263754;border-radius:6px}
.logo{display:block;padding:2px 6px 16px}
.brand-logo{display:block;width:100%;max-width:170px;height:auto;margin:4px auto 10px;
  filter:drop-shadow(0 4px 14px rgba(90,210,235,.12))}
.brand-sub{font-size:11px;color:#8fa8d0;text-align:center;letter-spacing:1.6px;
  padding-top:9px;border-top:1px solid #1c2942}
.side .grp{font-size:11px;color:#63758f;padding:14px 10px 6px;letter-spacing:.6px}
.side a{display:flex;align-items:center;gap:9px;padding:9px 10px;border-radius:9px;color:#c9d5ea;text-decoration:none;font-size:12.5px}
.side a:hover{background:#182644;color:#fff}
.side a.on{background:linear-gradient(90deg,#2b4bd8,#3f63ec);color:#fff;box-shadow:0 6px 16px -8px #2b4bd8}
.side .dot{width:5px;height:5px;border-radius:50%;background:currentColor;opacity:.55}
.side .foot{margin-top:auto;font-size:11px;color:#5b6d88;padding:10px;line-height:1.7;border-top:1px solid #1c2942}
.side .foot code{color:#8fa8d0;font-size:10.5px}

/* v2.16 四个功能主菜单：可折叠二级子菜单（不含角色视角字样） */
.nav{margin-top:4px;display:flex;flex-direction:column;gap:7px}
.nav-group{border:1px solid #1a2a46;border-radius:11px;background:rgba(255,255,255,.025);overflow:hidden}
.nav-group.active{border-color:#2b4276;background:rgba(51,88,224,.10)}
.nav-head{width:100%;display:flex;align-items:center;gap:9px;padding:11px 9px;background:none;border:0;
  color:#d7e2f5;text-align:left;cursor:pointer;font-family:inherit}
.nav-head:hover{background:rgba(255,255,255,.05)}
.nav-ico{width:25px;height:25px;flex:0 0 25px;border-radius:7px;background:#182745;color:#8fa8d0;
  display:grid;place-items:center}
.nav-ico svg{width:15px;height:15px;display:block}
.nav-group.active .nav-ico{background:#2b4bd8;color:#fff}
.nav-txt{flex:1;min-width:0;line-height:1.4}
.nav-txt b{font-size:12.5px;font-weight:700;letter-spacing:.3px}
.nav-caret{width:7px;height:7px;flex:0 0 7px;margin:0 4px 0 2px;
  border-right:1.6px solid #7f93b3;border-bottom:1.6px solid #7f93b3;
  transform:rotate(45deg) translateY(-2px);transition:transform .2s}
.nav-group.collapsed .nav-caret{transform:rotate(-45deg) translateY(0)}
.nav-items{max-height:420px;opacity:1;visibility:visible;pointer-events:auto;overflow:hidden;
  padding:2px 6px 7px;
  transition:max-height .24s ease,opacity .18s ease,padding .2s ease,visibility 0s}
.nav-group.collapsed .nav-items{max-height:0;opacity:0;padding-top:0;padding-bottom:0;
  visibility:hidden;pointer-events:none;
  transition:max-height .24s ease,opacity .18s ease,padding .2s ease,visibility 0s linear .24s}
.nav-items a{display:flex;align-items:center;gap:8px;padding:7px 9px 7px 12px;border-radius:8px;
  color:#b9c9e3;text-decoration:none;font-size:12px;line-height:1.5}
.nav-items a:hover{background:#182644;color:#fff}
.nav-items a.on{background:linear-gradient(90deg,#2b4bd8,#3f63ec);color:#fff;box-shadow:0 6px 16px -8px #2b4bd8}
.nav-items .dot{width:4px;height:4px;flex:0 0 4px;border-radius:50%;background:currentColor;opacity:.6}
.nav-crumb{font-size:11px;color:var(--text-2);background:#f1f5fd;border:1px solid var(--line);
  border-radius:20px;padding:3px 10px;white-space:nowrap}

/* 主区 */
.main{flex:1;min-width:0;display:flex;flex-direction:column;min-height:100vh}
.topbar{position:sticky;top:0;z-index:30;background:var(--panel);border-bottom:1px solid var(--line);padding:14px 22px;display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.topbar-brand{width:30px;height:30px;flex:0 0 30px;border-radius:9px;background:#0b1220;
  display:grid;place-items:center;box-shadow:0 5px 14px -8px rgba(11,18,32,.9)}
.topbar-brand img{width:21px;height:21px;display:block}
.topbar h1{font-size:16px;margin:0;font-weight:700;letter-spacing:.2px}
.pill{font-size:11px;padding:2px 8px;border-radius:20px;background:var(--brand-soft);color:var(--brand);font-weight:600}
.pill.ok{background:var(--ok-soft);color:var(--ok)}
.pill.warn{background:var(--warn-soft);color:var(--warn)}
.spacer{flex:1}
.field{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text-2)}
select,input[type="text"],input[type="number"]{
  font-family:inherit;font-size:12.5px;color:var(--text);background:#fff;
  border:1px solid var(--line-strong);border-radius:8px;padding:6px 10px;outline:none;
}
select:focus,input:focus{border-color:var(--brand-2);box-shadow:0 0 0 3px #eaeffe}
.btn{font-size:12.5px;padding:7px 14px;border-radius:8px;border:1px solid var(--line-strong);background:#fff;color:var(--text);font-weight:600}
.btn:hover{border-color:var(--brand-2);color:var(--brand)}
.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff}
.btn.primary:hover{background:#2b4bd8;color:#fff}
.btn.ghost{background:transparent;border-color:transparent;color:var(--brand)}
.btn.sm{padding:4px 10px;font-size:12px;font-weight:500}
.btn:disabled{opacity:.5;cursor:not-allowed}

/* Tabs */
.tabs{display:flex;gap:2px;padding:0 22px;background:var(--panel);border-bottom:1px solid var(--line);flex-wrap:wrap}
.tab{padding:11px 16px;font-size:13px;color:var(--text-2);border-bottom:2px solid transparent;background:none;border-top:0;border-left:0;border-right:0;font-weight:500;display:flex;align-items:center;gap:7px}
.tab .no{width:18px;height:18px;border-radius:6px;background:#eef2fa;color:var(--text-3);font-size:11px;display:grid;place-items:center;font-weight:700}
.tab.on{color:var(--brand);border-bottom-color:var(--brand);font-weight:700}
.tab.on .no{background:var(--brand);color:#fff}
.tab:hover{color:var(--brand)}

.content{padding:18px 22px 40px;min-width:0}
.panel{display:none}
.panel.on{display:block;animation:fade .18s ease-out}
@keyframes fade{from{opacity:0;transform:translateY(3px)}to{opacity:1;transform:none}}

/* 卡片 */
.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow)}
.card-h{padding:13px 16px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.card-h h3{margin:0;font-size:13.5px;font-weight:700}
.card-h .sub{font-size:11.5px;color:var(--text-3)}
.card-b{padding:16px}
.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:14px}
.kpi{padding:14px 16px;background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);position:relative;overflow:hidden}
.kpi .lab{font-size:12px;color:var(--text-2);display:flex;align-items:center;gap:6px}
.kpi .val{font-size:24px;font-weight:700;letter-spacing:-.4px;margin-top:5px;font-variant-numeric:tabular-nums}
.kpi .val small{font-size:12px;font-weight:600;color:var(--text-2);margin-left:3px}
.kpi .hint{font-size:11.5px;color:var(--text-3);margin-top:3px}
.kpi .bar{position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--brand)}
.kpi.ok .bar{background:var(--ok)}.kpi.warn .bar{background:var(--warn)}.kpi.danger .bar{background:var(--danger)}
.up{color:var(--ok);font-weight:700}.down{color:var(--danger);font-weight:700}
.q{width:13px;height:13px;border-radius:50%;border:1px solid var(--line-strong);color:var(--text-3);font-size:9px;display:inline-grid;place-items:center;cursor:help}
.grid2{display:grid;grid-template-columns:1.45fr 1fr;gap:14px}
.grid2.even{grid-template-columns:1fr 1fr}
.stack{display:flex;flex-direction:column;gap:12px}

/* 表格 */
table{width:100%;border-collapse:collapse;font-size:12.5px}
th{font-weight:600;color:var(--text-2);text-align:left;padding:8px 10px;background:#f8fafd;border-bottom:1px solid var(--line);white-space:nowrap;font-size:12px}
td{padding:8px 10px;border-bottom:1px solid #f1f4fa;font-variant-numeric:tabular-nums}
tbody tr:hover{background:#fafbff}
.num{text-align:right}
.tag{display:inline-block;padding:1px 7px;border-radius:6px;font-size:11px;font-weight:600;line-height:18px}
.tag.g{background:var(--ok-soft);color:var(--ok)}
.tag.y{background:var(--warn-soft);color:var(--warn)}
.tag.r{background:var(--danger-soft);color:var(--danger)}
.tag.b{background:var(--brand-soft);color:var(--brand)}
.tag.p{background:var(--purple-soft);color:var(--purple)}
.tag.n{background:#eef2fa;color:var(--text-2)}
.scroll{max-height:520px;overflow:auto}

/* 图 */
svg{display:block;width:100%;height:auto;overflow:visible}
.legend{display:flex;gap:16px;font-size:11.5px;color:var(--text-2);padding:0 16px 12px;flex-wrap:wrap}
.legend i{width:9px;height:9px;border-radius:3px;display:inline-block;margin-right:5px;vertical-align:-1px}

/* 热力图 */
.heat{display:grid;grid-template-columns:76px repeat(7,1fr);gap:5px;font-size:11.5px}
.heat .h{color:var(--text-3);text-align:center;padding-bottom:2px;font-weight:600}
.heat .rl{color:var(--text-2);display:flex;align-items:center;font-size:11.5px}
.cell{border-radius:7px;padding:9px 0;text-align:center;font-weight:700;font-variant-numeric:tabular-nums;color:#fff;cursor:default;position:relative}
.cell span{font-size:10px;font-weight:600;opacity:.85}

/* 建议卡 */
.adv{border:1px solid var(--line);border-radius:11px;padding:13px 14px;display:flex;gap:12px;background:#fff;transition:.15s}
.adv:hover{border-color:var(--brand-2);box-shadow:0 6px 20px -14px rgba(51,88,224,.6)}
.adv.done{background:#f9fcfa;border-color:#cfe9dc}
.adv .ic{width:32px;height:32px;flex:0 0 32px;border-radius:9px;display:grid;place-items:center;font-size:14px;font-weight:700}
.adv .body{flex:1;min-width:0}
.adv .t{font-weight:700;font-size:13px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.adv .m{color:var(--text-2);font-size:12px;margin-top:3px}
.adv .e{font-size:11.5px;color:var(--text-3);margin-top:6px;display:flex;gap:14px;flex-wrap:wrap}
.adv .e b{color:var(--text-2);font-weight:600}
.adv .ops{display:flex;flex-direction:column;gap:6px;justify-content:center;align-items:flex-end}
.adv .why{background:#f8fafd;border-left:3px solid #cdd8ee;padding:6px 9px;margin-top:8px;font-size:11.5px;color:var(--text-2);border-radius:0 6px 6px 0}

/* 抽屉 */
.drawer{position:fixed;right:0;top:0;bottom:0;width:620px;max-width:94vw;background:#fff;border-left:1px solid var(--line);box-shadow:-18px 0 50px -30px rgba(15,26,46,.5);transform:translateX(102%);transition:.25s;z-index:40;display:flex;flex-direction:column}
.drawer.on{transform:none}
.drawer .dh{padding:16px 18px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px}
.drawer .db{padding:16px 18px;overflow:auto}
.mask{position:fixed;inset:0;background:rgba(15,26,46,.28);opacity:0;pointer-events:none;transition:.2s;z-index:39}
.mask.on{opacity:1;pointer-events:auto}
.srch{font-size:11.5px;color:var(--text-3);margin:0 0 8px}
.api{font-family:Consolas,ui-monospace,monospace;font-size:11.5px;background:#f4f7fc;border:1px solid var(--line);border-radius:6px;padding:2px 6px;color:#3d4f6b}

/* 弹窗 */
.modal{position:fixed;inset:0;display:none;place-items:center;z-index:80;background:rgba(15,26,46,.32);padding:20px}
.modal.on{display:grid}
.modal .box{background:#fff;border-radius:14px;width:520px;max-width:100%;max-height:90vh;overflow:auto;box-shadow:0 24px 60px -24px rgba(15,26,46,.5)}
.modal .mh{padding:16px 18px;border-bottom:1px solid var(--line);display:flex;align-items:center}
.modal .mb{padding:16px 18px}
.modal .mf{padding:14px 18px;border-top:1px solid var(--line);display:flex;justify-content:flex-end;gap:8px}
.form-row{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.form-row label{width:150px;flex:0 0 150px;font-size:12.5px;color:var(--text-2)}
.form-row input{flex:1;min-width:0}
.form-row .unit{font-size:12px;color:var(--text-3);width:52px}

/* 其他 */
.toast{position:fixed;left:50%;bottom:28px;transform:translate(-50%,20px);background:#0f1a2e;color:#fff;padding:10px 18px;border-radius:10px;font-size:12.5px;opacity:0;pointer-events:none;transition:.22s;z-index:60;box-shadow:0 12px 30px -12px rgba(0,0,0,.5);max-width:76vw}
.toast.on{opacity:1;transform:translate(-50%,0)}
.note{font-size:11.5px;color:var(--text-3);margin-top:10px;line-height:1.7}
.divider{height:1px;background:var(--line);margin:14px 0}
.mini{display:flex;gap:8px;flex-wrap:wrap}
.chip{font-size:11.5px;padding:3px 9px;border-radius:20px;background:#f2f5fb;color:var(--text-2);border:1px solid var(--line)}
.chip.on{background:var(--brand-soft);color:var(--brand);border-color:#c9d6ff;font-weight:600}
.chip.btnish{cursor:pointer}
.empty{padding:40px 20px;text-align:center;color:var(--text-3)}
.empty h3{color:var(--text);font-size:15px;margin:0 0 8px}
.empty code{background:#f4f7fc;border:1px solid var(--line);border-radius:6px;padding:2px 6px;color:#3d4f6b;font-size:12px}
.loading{position:fixed;inset:0;background:rgba(245,247,251,.6);display:none;place-items:center;z-index:70;backdrop-filter:blur(1px)}
.loading.on{display:grid}
.spinner{width:28px;height:28px;border:3px solid #d8e1f2;border-top-color:var(--brand);border-radius:50%;animation:spin .8s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.kv{display:grid;grid-template-columns:110px 1fr;gap:4px 10px;font-size:12px}
.kv dt{color:var(--text-3)}
.kv dd{margin:0;color:var(--text)}
.bar-track{height:8px;background:#eef2fa;border-radius:6px;overflow:hidden}
.bar-fill{height:100%;border-radius:6px;transition:.3s}

/* v1.2 */
.fx{display:block;font-size:10px;color:var(--text-3);font-weight:400}
td small.fx{display:inline;font-size:10px;color:var(--text-3);margin-left:3px}
.card.blocker{border-color:#f3c3bd;background:#fff8f7}
.card.blocker .card-b{color:#b42318}
tr.batch-row.sel{background:#f0f4ff}
tr.batch-row.sel td:first-child{box-shadow:inset 3px 0 0 var(--brand)}
.kpi .val{font-size:22px}
.tab{padding:10px 13px;font-size:12.5px}
@media (max-width:1180px){
  .kpis{grid-template-columns:repeat(2,1fr)}
  .grid2,.grid2.even{grid-template-columns:1fr}
  .side{display:none}
}

/* ===== 排班表矩阵（员工 × 日期，浅红色调，参考人力管家排班页） ===== */
.sch-scroll{overflow:auto;border:1px solid #f3d5d0;border-radius:10px;background:#fff}
table.sch{border-collapse:separate;border-spacing:0;width:100%;font-size:12px}
table.sch th,table.sch td{border-bottom:1px solid #f7e3df;border-right:1px solid #f7e3df;padding:0}
table.sch thead th{background:#fdecea;color:#9c3428;font-weight:600;position:sticky;top:0;z-index:2}
.sch .sch-corner{min-width:96px;z-index:3}
.sch-day{padding:7px 8px;text-align:center;line-height:1.35;min-width:118px}
.sch-day b{display:block;font-size:12.5px;color:#b03a2e}
.sch-day span{display:block;font-size:11px;color:#c96f5f}
.sch-day em{display:block;font-style:normal;font-size:10.5px;color:#d19286}
.sch-day.we{background:#fadbd6}
.sch-sum-h{padding:7px 10px;text-align:center;min-width:70px}
.sch-name{padding:7px 10px;text-align:left;background:#fff9f8;font-weight:600;color:#7c2d22;position:sticky;left:0;z-index:1;min-width:96px}
.sch-name small{display:block;font-weight:400;font-size:10.5px;color:#c98a80}
.sch td.sch-cell{padding:4px 5px;vertical-align:middle;min-width:118px;height:44px;background:#fff}
.sch td.sch-cell.we{background:#fff7f5}
.sch-shift{display:flex;flex-direction:column;gap:1px;background:#fdecea;border:1px solid #f5c9c2;border-radius:7px;padding:3px 7px;color:#a03a2b;line-height:1.3}
.sch-shift b{font-size:11.5px;color:#9c3428}
.sch-shift small{font-size:10.5px;color:#c07a6b}
.sch-rest{text-align:center;color:#d64545;font-weight:600;font-size:11.5px;display:block}
.sch-empty{display:block;text-align:center;color:#e8c7c0}
.sch td.sch-sum{background:#fdf3f1;text-align:center;font-weight:600;color:#9c3428}
.sch tr:hover td.sch-cell{background:#fef1ee}
.sch tfoot td{background:#fdecea;color:#9c3428;font-weight:700;padding:8px 10px;border-top:2px solid #f0b9b0}
.sch-toolbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.sch-legend{display:flex;gap:14px;font-size:11px;color:#a9756b;flex-wrap:wrap}
.sch-legend i{display:inline-block;width:12px;height:12px;border-radius:3px;vertical-align:-2px;margin-right:4px}

/* ==================== v2.3 便捷性层：登录 / 首页 / 流程 / 账号 ==================== */
/* 顶栏 sticky 已在上方设定 */
.topbar{box-shadow:0 4px 16px -14px rgba(15,26,46,.8)}
/* v2.17：顶栏下拉已迁入「数据与运维 → 数据同步中心」，顶栏只保留用户菜单 */
.userbtn{display:flex;align-items:center;gap:7px;border:1px solid var(--line);background:#fff;
  border-radius:20px;padding:4px 10px 4px 4px;font-size:12.5px;color:var(--text);font-weight:600}
.userbtn:hover{border-color:var(--brand-2)}
.avatar{width:24px;height:24px;border-radius:50%;background:var(--brand-soft);color:var(--brand);
  display:grid;place-items:center;font-size:12px;font-weight:700}
.caret{color:var(--text-3);font-size:10px}
.user-pop{position:absolute;right:22px;top:60px;z-index:40;display:none;width:230px;background:#fff;
  border:1px solid var(--line);border-radius:12px;padding:14px;box-shadow:0 18px 44px -18px rgba(15,26,46,.5)}
.user-pop.on{display:block}
.uhead{display:flex;align-items:center;gap:8px;margin-bottom:4px}
.unote{font-size:11.5px;color:var(--text-3);margin-bottom:12px}
.user-pop .btn{width:100%;margin-top:6px;text-align:left}

/* 登录 */
.login-mask{position:fixed;inset:0;z-index:100;display:none;align-items:center;justify-content:center;
  background:radial-gradient(70% 60% at 12% 8%,#e2f5f8 0%,transparent 62%),
    linear-gradient(135deg,#eaf0fb 0%,#f7f9fd 55%,#fdeeee 100%);padding:20px}
.login-mask.on{display:flex}
.login-box{width:420px;max-width:100%;background:#fff;border-radius:18px;overflow:hidden;
  box-shadow:0 30px 80px -30px rgba(15,26,46,.5),0 2px 8px rgba(15,26,46,.06)}
.login-hero{position:relative;height:132px;display:flex;align-items:center;justify-content:center;overflow:hidden;
  background:radial-gradient(120% 150% at 18% 6%,#16304f 0%,#0b1220 60%,#080e1a 100%)}
.login-hero:before{content:"";position:absolute;width:300px;height:300px;left:-90px;top:-170px;
  background:radial-gradient(circle,rgba(94,220,235,.22),transparent 70%)}
.login-hero:after{content:"";position:absolute;left:0;right:0;bottom:0;height:2px;
  background:linear-gradient(90deg,transparent,#5ee0e6 25%,#4d7cf0 68%,transparent)}
.hero-logo{position:relative;z-index:1;display:block;width:252px;max-width:72%;height:auto;
  filter:drop-shadow(0 6px 20px rgba(80,210,235,.22))}
.login-body{padding:24px 30px 16px}
.login-brand{display:flex;align-items:center;gap:12px;margin-bottom:20px}
.login-brand .mark{width:38px;height:38px;flex:0 0 38px;border-radius:11px;background:#0b1220;
  display:grid;place-items:center;box-shadow:0 5px 14px -8px rgba(11,18,32,.9)}
.login-brand .mark img{width:27px;height:27px;display:block}
.login-brand b{font-size:15px}
.login-brand .sub{font-size:11px;color:var(--text-2);white-space:nowrap;margin-top:1px}
.login-brand .sub em{font-style:normal;color:var(--brand)}
.login-foot{text-align:center;font-size:10.5px;color:var(--text-3);letter-spacing:.4px;padding:0 20px 18px}
.login-box h2{font-size:19px;margin:0 0 18px}
.lrow{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.lrow label{width:70px;flex:0 0 70px;font-size:12.5px;color:var(--text-2)}
.lrow input,.lrow select{flex:1;min-width:0;font-family:inherit;font-size:13px;padding:9px 11px;
  border:1px solid var(--line-strong);border-radius:8px;outline:none;color:var(--text);background:#fff}
.lrow input:focus{border-color:var(--brand-2);box-shadow:0 0 0 3px var(--brand-soft)}
.lerr{min-height:18px;font-size:12px;color:var(--danger);margin:2px 0 8px}
.btn.block{width:100%;text-align:center;padding:10px}
.btn.danger-text{color:var(--danger)}

/* 首页：一句话结论 */
.detail-hint{margin-bottom:12px;padding:9px 14px;border:1px dashed var(--line-strong);border-radius:9px;
  background:#fbfcff;font-size:12px;color:var(--text-2);display:flex;align-items:center;gap:10px}
.linkbtn{border:0;background:none;color:var(--brand);font-size:12px;font-weight:600;padding:0;cursor:pointer}
.linkbtn:hover{text-decoration:underline}
body.compact [data-detail]{display:none!important}
.hero{border:1px solid var(--line);border-radius:14px;padding:22px 26px;margin-bottom:16px;background:#fff}
.hero.tone-ok{background:linear-gradient(100deg,#eefaf4 0%,#fff 70%);border-color:#cdeadf}
.hero.tone-danger{background:linear-gradient(100deg,#fdecec 0%,#fff 70%);border-color:#f3c9c2}
.hero.tone-warn{background:linear-gradient(100deg,#fdf3e0 0%,#fff 70%);border-color:#f0dcae}
.hero.tone-blue{background:linear-gradient(100deg,#eaf0fe 0%,#fff 70%);border-color:#d2ddf9}
.hero-badge{display:inline-block;font-size:11px;font-weight:700;color:var(--text-2);
  background:rgba(255,255,255,.75);border:1px solid var(--line);border-radius:20px;padding:2px 10px;margin-bottom:10px}
.hero-t{font-size:22px;font-weight:700;letter-spacing:-.3px;color:var(--text)}
.hero-d{font-size:13px;color:var(--text-2);margin:6px 0 16px;line-height:1.8}
.hero-btn{padding:9px 20px}

/* 流程步骤 */
.steps{display:grid;grid-template-columns:repeat(5,1fr);gap:10px}
.step{border:1px solid var(--line);border-radius:11px;padding:13px 12px;background:#fff;cursor:pointer;transition:.15s}
.step:hover{border-color:var(--brand-2);transform:translateY(-1px);box-shadow:var(--shadow)}
.step.done{background:#f4fbf7;border-color:#cdeadf}
.step.running{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
.step.fail{background:#fff5f4;border-color:#f0b9b0}
.step-no{width:22px;height:22px;border-radius:50%;background:var(--brand-soft);color:var(--brand);
  display:grid;place-items:center;font-size:11px;font-weight:700;margin-bottom:8px}
.step.done .step-no{background:var(--ok);color:#fff}
.step.fail .step-no{background:var(--danger);color:#fff}
.step-t{font-size:12.5px;font-weight:700}
.step-d{font-size:11px;color:var(--text-3);margin-top:3px;line-height:1.6}
.wiz-log{margin-top:14px;max-height:172px;overflow:auto;border-top:1px dashed var(--line);padding-top:10px;font-size:12px}
.wiz-row{padding:3px 0;color:var(--text-2)}
.wiz-row.run{color:var(--brand)}
.wiz-row.ok{color:var(--ok)}
.wiz-row.err{color:var(--danger)}
.wiz-row.hint{color:var(--text-3)}

/* 首页两栏与列表 */
.home-grid{display:grid;grid-template-columns:1.15fr 1fr;gap:14px}
.issue-row{display:flex;align-items:center;gap:10px;padding:9px 2px;border-bottom:1px solid var(--line);font-size:12px}
.issue-row:last-child{border-bottom:0}
.issue-when{color:var(--text-2);min-width:150px}
.issue-num{color:var(--text-2);flex:1}
.issue-diff{font-weight:700;color:var(--danger)}
.rank-line{display:flex;align-items:center;gap:10px;padding:9px 4px;border-bottom:1px solid var(--line);cursor:pointer;font-size:12px}
.rank-line:last-child{border-bottom:0}
.rank-line:hover{background:#f8faff}
.rank-code{font-weight:700;color:var(--brand);min-width:48px}
.rank-name{flex:1;color:var(--text)}
.rank-num{font-weight:700;color:var(--text-2)}
.empty-mini{padding:22px 6px;text-align:center;color:var(--text-3);font-size:12px}
.fresh{display:inline-block;margin:0 8px 8px 0;padding:4px 10px;border-radius:7px;font-size:11.5px;
  background:#f1f5fb;color:var(--text-2)}
.fresh.ok{background:var(--ok-soft);color:var(--ok)}
.fresh.stale{background:var(--warn-soft);color:var(--warn)}
.fresh.missing{background:var(--danger-soft);color:var(--danger)}
.blocker{margin-top:6px;padding:8px 12px;border-radius:8px;font-size:12px;
  background:var(--warn-soft);color:#985c00}
.blocker.error{background:var(--danger-soft);color:var(--danger)}
.tag.gap,.tag.tight{background:var(--danger-soft);color:var(--danger)}
.tag.over{background:var(--brand-soft);color:var(--brand)}
.tag.idle{background:var(--purple-soft);color:var(--purple)}
.tag.ok{background:var(--ok-soft);color:var(--ok)}
.tag.warn{background:var(--warn-soft);color:var(--warn)}
.tag.no_data{background:#eef2fa;color:var(--text-2)}

/* 账号与权限 */
.muted{color:var(--text-3);font-size:11.5px}
.ops{white-space:nowrap}
.perm-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
/* v2.26 权限矩阵按菜单板块分组 */
.perm-group{border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:12px}
.perm-group-h{display:flex;align-items:baseline;gap:8px;margin-bottom:8px}
.perm-group-h b{font-size:13px;color:var(--text-1)}
.perm-group-h .sub{font-size:11px;color:var(--text-3)}
.perm-group .perm{margin-bottom:6px}
.perm.menu-perm{background:#f6f9ff;border-color:var(--brand-soft)}
.perm.menu-perm span{font-weight:700;color:var(--brand)}
.perm{display:flex;align-items:center;gap:8px;border:1px solid var(--line);border-radius:8px;
  padding:9px 11px;font-size:12px;cursor:pointer;background:#fff}
.perm:hover{border-color:var(--brand-2);background:#fbfcff}
.perm input{accent-color:var(--brand)}
.perm span{flex:1}
.perm code{font-size:10.5px;color:var(--text-3);background:#f4f7fc;border-radius:4px;padding:1px 5px}

/* ==================== v2.13 成本管控（跨店用工成本驾驶舱）==================== */
.cost-alert{border:1px solid var(--line);border-left:3px solid var(--danger);
  border-radius:10px;padding:10px 12px;margin-bottom:10px;background:var(--panel)}
.cost-alert .hd{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px}
.cost-alert .sg{margin:6px 0 0 18px;font-size:12.5px;color:var(--text-2)}
.cost-alert .sg li{margin:2px 0}
#tblCostTargets input{font-size:12.5px;padding:5px 8px;border:1px solid var(--line);
  border-radius:7px;background:#fff;min-width:80px}
#tblCostTargets input:disabled{background:#f4f7fc;color:var(--text-3)}
#tblCostTargets td{vertical-align:middle}
#tblCost tbody td{font-variant-numeric:tabular-nums}

@media (max-width:1180px){
  .steps{grid-template-columns:repeat(3,1fr)}
  .home-grid{grid-template-columns:1fr}
  .perm-grid{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:820px){
  .steps{grid-template-columns:repeat(2,1fr)}
  .perm-grid{grid-template-columns:1fr}
  /* 窄屏改为顶部横向菜单，避免固定侧栏挤占内容宽度 */
  .wrap{flex-direction:column}
  .side{position:static;width:100%;flex:none;height:auto;overflow:visible;padding:12px}
  .nav{flex-direction:row;flex-wrap:wrap}
  .nav-group{flex:1 1 210px}
  .side .foot{margin-top:10px}
  .main{min-height:0}
}
/* 品牌登录卡片：窄屏允许标语换行，避免被卡片裁切 */
@media (max-width:480px){
  .login-body{padding:20px 22px 14px}
  .login-brand .sub{white-space:normal;font-size:11px;line-height:1.5}
  .hero-logo{width:220px}
}

/* ==================== v2.4 周排班表 / 24 小时日划线排班 ====================
   布局参照人力管家排班页：图1＝按天×按员工周表，图2＝点击星期下钻的
   半小时刻度划线视图。默认浅红主色，data-theme="hr" 切人力管家原色。 */
.bd-root{
  --bd-blk:#fdecea; --bd-blk-l:#f5c9c2; --bd-blk-t:#a03a2b; --bd-add:#c0504a;
  --bd-bar:#c0504a; --bd-bar-t:#fff; --bd-rest:#d64545; --bd-rest-bg:#fbe6e4;
  position:relative;font-size:12px;
}
.bd-root[data-theme="hr"]{
  --bd-blk:#eaf5e2; --bd-blk-l:#cfe6bf; --bd-blk-t:#3f7a35; --bd-add:#5aa64a;
  --bd-bar:#7d6ad8; --bd-bar-t:#fff;
}
/* 工具栏 */
.bd-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;background:#fff;border:1px solid var(--line);
  border-radius:10px;padding:9px 12px;margin-bottom:10px}
.bd-store{font-weight:700;background:#fdecea;border:1px solid #f5c9c2;color:#9c3428;
  padding:4px 10px;border-radius:6px;white-space:nowrap}
.bd-nav{border:1px solid var(--line-strong);background:#fff;color:var(--text-2);border-radius:6px;
  width:24px;height:24px;line-height:20px;font-size:15px;padding:0}
.bd-nav:hover{background:#f2f5fb;color:var(--brand)}
.bd-week,.bd-daytitle{font-size:12.5px;color:var(--text);white-space:nowrap}
.bd-sep{width:1px;height:18px;background:var(--line-strong);margin:0 2px}
.bd-view{font-size:11.5px;padding:4px 10px;border:1px solid var(--line-strong);border-radius:6px;background:#fff;color:var(--text-2)}
.bd-view.on{background:#fdecea;border-color:#f5c9c2;color:#9c3428;font-weight:700}
.bd-hint{font-size:11px;color:var(--text-3)}
.bd-spacer{flex:1}
.bd-btn{font-size:11.5px;padding:4px 10px;border:1px solid var(--line-strong);border-radius:6px;background:#fff;color:var(--text-2)}
.bd-btn:hover{background:#f2f5fb;color:var(--brand)}
.bd-back{font-size:11.5px;padding:4px 10px;border:1px solid #f5c9c2;border-radius:6px;background:#fdecea;color:#9c3428;font-weight:700}
.bd-opt{font-size:11px;color:var(--text-2);display:inline-flex;align-items:center;gap:4px;white-space:nowrap}
.bd-opt input{margin:0}
/* 数据链路 */
.bd-chain{display:flex;align-items:center;gap:6px;flex-wrap:wrap;background:#f8fafc;border:1px solid var(--line);
  border-radius:10px;padding:8px 12px;margin-bottom:10px;font-size:11px}
.bd-chain-h{font-weight:700;color:#9c3428;background:#fdecea;border-radius:5px;padding:3px 8px;margin-right:4px}
.bd-chain-i{display:inline-flex;align-items:center;gap:5px;background:#fff;border:1px solid var(--line);
  border-radius:20px;padding:3px 9px;color:var(--text-2);white-space:nowrap}
.bd-chain-i i{font-style:normal;width:15px;height:15px;border-radius:50%;background:#eaf1ff;color:#3358e0;
  font-size:9.5px;line-height:15px;text-align:center;font-weight:700}
.bd-chain-i b{color:#c0392b;font-size:10.5px}
.bd-chain-i.end i{background:#fdecea;color:#9c3428}
.bd-chain-i.end{background:#fff7f5;border-color:#f5c9c2}
/* 判定色标 */
.bd-lv{display:inline-block;font-style:normal;font-size:9.5px;padding:1px 6px;border-radius:10px;
  background:#8b9ab1;color:#fff;white-space:nowrap}
.bd-lv.gap,.bd-lv.r{background:#d64545}
.bd-lv.tight,.bd-lv.y{background:#e8a13a}
.bd-lv.ok,.bd-lv.g{background:#0f9d63}
.bd-lv.over,.bd-lv.b{background:#2f6fd0}
.bd-lv.idle,.bd-lv.p{background:#7b5cd6}
.bd-lv.none,.bd-lv.no_data{background:#c8d0dd;color:#5b6b83}
/* 周表 */
.bd-weekwrap{overflow:auto;border:1px solid #f3d5d0;border-radius:10px;background:#fff}
table.bd-week{border-collapse:separate;border-spacing:0;width:100%;min-width:1260px}
.bd-week th,.bd-week td{border-right:1px solid #eef0f5;border-bottom:1px solid #eef0f5;text-align:center}
.bd-week .bd-corner,.bd-week .bd-corner2,.bd-week .bd-name{width:132px;min-width:132px;
  position:sticky;left:0;z-index:2;text-align:left}
.bd-week .bd-h1d,.bd-week .bd-h2d,.bd-week td.bd-cell{width:118px;min-width:118px}
.bd-week .bd-h1 th{background:#4a5568;color:#fff;height:56px;vertical-align:middle;padding:4px 6px}
.bd-week .bd-corner{background:#3f4a5c;font-size:10.5px;font-weight:400;line-height:1.5;padding:6px 10px!important;z-index:4}
.bd-week .bd-corner span{display:block;opacity:.9}
.bd-h1d b{display:block;font-size:13px}
.bd-h1d span{display:block;font-size:11px;opacity:.88}
.bd-h1d em{display:block;font-style:normal;font-size:9.5px;opacity:.78;white-space:nowrap;margin-top:2px}
.bd-week .bd-h1sum{background:#3f4a5c}
.bd-h1sum b{display:block;font-size:14px}
.bd-h1sum span{display:block;font-size:12px;opacity:.9}
.bd-h1sum em{font-style:normal;font-size:10px;opacity:.75}
.bd-week .bd-h2 th{background:#f7f9fc;color:#42506a;font-size:10.5px;height:54px;padding:4px 6px;font-weight:600}
.bd-week .bd-corner2{background:#eef2f8!important;color:#5b6b83;z-index:4;padding:6px 10px!important}
.bd-h2d{cursor:pointer;transition:background .15s}
.bd-h2d:hover{background:#eef2ff}
.bd-wd{display:block;font-size:11.5px;font-weight:700;color:#42506a}
.bd-wd.we{color:#c0392b}
.bd-dt{display:block;font-size:10px;font-weight:400;color:var(--text-3)}
.bd-h2d .bd-lv{margin-top:2px;font-size:9px;padding:0 5px}
.bd-h2d small{display:block;font-size:9.5px;font-weight:400;color:#3358e0;margin-top:2px}
.bd-week td.bd-cell{padding:4px 5px;vertical-align:top;height:54px;background:#fff;cursor:pointer}
.bd-week td.bd-cell.we{background:#fffaf9}
.bd-week td.bd-cell:hover{background:#fef1ee}
.bd-blk{display:flex;align-items:center;gap:4px;background:var(--bd-blk);border:1px solid var(--bd-blk-l);
  border-radius:6px;padding:3px 5px;color:var(--bd-blk-t);margin-bottom:3px;text-align:left}
.bd-add{width:13px;height:13px;flex:0 0 13px;border-radius:3px;background:var(--bd-add);color:#fff;
  font-size:11px;line-height:13px;text-align:center;font-weight:700}
.bd-blk-t{flex:1;min-width:0;line-height:1.25}
.bd-blk-t b{display:block;font-size:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bd-blk-t small{display:block;font-size:9px;opacity:.82;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bd-more{font-size:10px;opacity:.55}
.bd-rest{color:var(--bd-rest);font-size:11px;line-height:1.25;padding:3px 0;text-align:center}
.bd-rest b{font-size:12px}
.bd-rest small{display:block;font-size:9px;opacity:.85}
.bd-none{height:26px;background:#f5f6f9;border-radius:5px}
.bd-flags{display:flex;flex-wrap:wrap;gap:2px;margin-top:2px;justify-content:center}
.bd-flag{font-size:9px;padding:0 4px;border-radius:4px;background:#fdf3e0;color:#a2690a;border:1px solid #f2dfb8;white-space:nowrap}
.bd-flag.bad{background:#fdecec;color:#c0392b;border-color:#f3c6c6}
.bd-flag.info{background:#eaf1ff;color:#2f6fd0;border-color:#cddcf8}
.bd-week th.bd-name{background:#fff9f8;padding:6px 10px;color:#7c2d22}
.bd-name b{display:block;font-size:11.5px;white-space:nowrap}
.bd-name small{display:block;font-size:9.5px;color:#c98a80;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bd-week td.bd-sum{background:#fdf7f5;color:#9c3428;font-weight:700;font-size:11.5px;padding:6px 3px;width:76px;min-width:76px}
.bd-week .bd-foot th,.bd-week .bd-foot td{background:#fdecea;color:#9c3428;font-weight:700;
  border-top:2px solid #f0b9b0;padding:7px 4px;font-size:10.5px}
.bd-week .bd-foot th{position:sticky;left:0;z-index:2;text-align:left;padding-left:10px}
.bd-foot b{display:block;font-size:11.5px}
.bd-foot b.gap{color:#d64545}.bd-foot b.tight{color:#c47b05}
.bd-foot b.ok{color:#0f9d63}.bd-foot b.over{color:#2f6fd0}.bd-foot b.idle{color:#7b5cd6}
.bd-foot small{display:block;font-size:9px;font-weight:400;opacity:.8}
.bd-empty{padding:18px!important;text-align:center;color:var(--text-3);font-size:12px}
/* 图例 */
.bd-legend{display:flex;gap:14px;flex-wrap:wrap;align-items:center;padding:9px 2px;color:var(--text-3);font-size:11px}
.bd-legend-tip{margin-left:auto;color:#a9756b}
.bd-lg{display:inline-block;width:14px;height:10px;border-radius:3px;vertical-align:-1px;margin-right:4px}
.bd-lg.blk{background:var(--bd-blk);border:1px solid var(--bd-blk-l)}
.bd-lg.rest{background:#fff;border:1px solid #f3c6c6;color:var(--bd-rest);line-height:8px;text-align:center;font-style:normal;font-size:8px}
.bd-lg.none{background:#f5f6f9;border:1px solid #e8ecf3}
.bd-lg.bar{background:var(--bd-bar)}
.bd-lg.restbar{background:var(--bd-rest-bg);border:1px dashed #eab4b0}
.bd-lg.manualbar{background:#fdf0d8;border:1px dashed #e8c27a}
/* 日视图 */
.bd-stat{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.bd-stat>div{background:#fff;border:1px solid var(--line);border-radius:9px;padding:7px 14px;min-width:118px}
.bd-stat span{display:block;font-size:10px;color:var(--text-3)}
.bd-stat b{font-size:15px;color:var(--text)}
.bd-stat b.gap{color:#d64545}.bd-stat b.ok{color:#0f9d63}
.bd-stat b.tight{color:#c47b05}.bd-stat b.over{color:#2f6fd0}
.bd-daywrap{overflow:auto;border:1px solid var(--line-strong);border-radius:10px;background:#fff}
table.bd-daytbl{border-collapse:separate;border-spacing:0}
.bd-daytbl th,.bd-daytbl td{border-bottom:1px solid #eef0f5;padding:0}
.bd-daytbl .bd-left{width:150px;min-width:150px;position:sticky;left:0;z-index:4;background:#f8fafc;
  text-align:left;padding:5px 10px!important;color:#42506a;font-size:10.5px}
.bd-left b{display:block;font-size:11.5px;color:var(--text);white-space:nowrap}
.bd-left small{display:block;font-size:9.5px;color:var(--text-3);font-weight:400;white-space:nowrap}
.bd-daytbl .bd-right{width:90px;min-width:90px;position:sticky;right:0;z-index:4;background:#f8fafc;
  font-size:10.5px;color:#42506a;padding:5px 6px!important}
.bd-right b{display:block;font-size:12.5px;color:#9c3428}
td.bd-axis{padding:0!important;vertical-align:middle}
.bd-g48{display:grid;grid-template-columns:repeat(48,26px);width:1248px}
.bd-g24{display:grid;grid-template-columns:repeat(24,52px);width:1248px}
.bd-g48 span,.bd-g24 span{border-right:1px solid #edf0f5;text-align:center;overflow:hidden;white-space:nowrap}
.bd-visrow th,.bd-visrow td{background:#4a5568;color:#fff}
.bd-visrow .bd-left,.bd-visrow .bd-right,.bd-hourrow .bd-left,.bd-hourrow .bd-right{background:#3f4a5c;color:#fff}
.bd-visrow .bd-left b,.bd-hourrow .bd-left b{color:#fff}
.bd-visrow .bd-left small,.bd-hourrow .bd-left small{color:#b9c4d6}
.bd-visrow .bd-right b{color:#ffd9d2}
.bd-visrow .bd-v{font-size:9px;height:22px;line-height:22px;border-right-color:rgba(255,255,255,.13)}
.bd-visrow .bd-v.out{background:rgba(255,255,255,.05)}
.bd-hourrow th,.bd-hourrow td{background:#e9edf4}
.bd-hourrow .bd-g24 span{font-size:9px;height:20px;line-height:20px;color:#5b6b83;
  border-right:1px solid #dbe1eb;text-align:left;padding-left:2px}
.bd-needrow .bd-n,.bd-haverow .bd-a{font-size:9px;height:19px;line-height:19px}
.bd-n{color:#2f6fd0;background:#f2f6fe}
.bd-a{color:#0f7a4d;background:#f1faf5}
.bd-needrow .bd-left,.bd-haverow .bd-left,.bd-levelrow .bd-left{background:#f8fafc}
.bd-needrow .bd-right,.bd-haverow .bd-right,.bd-levelrow .bd-right{background:#f8fafc}
.bd-levelrow .bd-lvcell{cursor:pointer;font-size:9px;height:20px;line-height:20px;background:#f7f9fc;color:#8b9ab1}
.bd-levelrow .bd-lvcell:hover{outline:2px solid #3358e0;outline-offset:-2px}
.bd-levelrow .bd-lvcell.gap,.bd-grid-lines i.gap{background:#f9d7d7}
.bd-levelrow .bd-lvcell.gap{color:#b02b2b;font-weight:700}
.bd-levelrow .bd-lvcell.tight,.bd-grid-lines i.tight{background:#fceeda}
.bd-levelrow .bd-lvcell.tight{color:#a2690a}
.bd-levelrow .bd-lvcell.ok,.bd-grid-lines i.ok{background:#e4f5ec}
.bd-levelrow .bd-lvcell.ok{color:#0f7a4d}
.bd-levelrow .bd-lvcell.over,.bd-grid-lines i.over{background:#e5edfb}
.bd-levelrow .bd-lvcell.over{color:#2f6fd0}
.bd-levelrow .bd-lvcell.idle,.bd-grid-lines i.idle{background:#eee9fb}
.bd-emprow .bd-left{background:#fff}
.bd-emprow:hover .bd-left{background:#fff7f5}
.bd-emprow .bd-right{font-size:12px;font-weight:700;color:#9c3428}
.bd-track{position:relative;width:1248px}
.bd-grid48{display:grid;grid-template-columns:repeat(48,26px);width:1248px}
.bd-grid-lines{position:absolute;inset:0;height:100%;pointer-events:none}
.bd-grid-lines i{border-right:1px solid #edf0f5;background:transparent}
.bd-grid-lines i.half{border-right-style:dotted;border-right-color:#e3e8f0}
.bd-bars{position:absolute;inset:0;pointer-events:none}
.bd-bar2{position:absolute;display:flex;align-items:center;justify-content:center;border-radius:4px;
  background:var(--bd-bar);color:var(--bd-bar-t);font-size:9px;overflow:hidden;white-space:nowrap;
  box-shadow:0 1px 2px rgba(21,38,66,.1);pointer-events:auto}
.bd-bar2 span{padding:0 3px;overflow:hidden;text-overflow:ellipsis}
.bd-bar2.rest{background:var(--bd-rest-bg);color:var(--bd-rest);border:1px dashed #eab4b0;box-shadow:none}
.bd-bar2.manual{background:#fdf0d8;color:#a2690a;border:1px dashed #e8c27a;box-shadow:none}
/* 时段明细浮层 */
.bd-pop{position:absolute;right:16px;top:96px;z-index:30;width:290px;background:#fff;
  border:1px solid var(--line-strong);border-radius:10px;padding:12px;
  box-shadow:0 14px 40px -12px rgba(21,38,66,.42)}
.bd-pop-h{display:flex;align-items:center;justify-content:space-between;font-size:12.5px;margin-bottom:8px}
.bd-pop-h button{border:0;background:none;font-size:18px;color:var(--text-3);line-height:1}
.bd-pop-lv{display:inline-block;font-size:10.5px;padding:2px 9px;border-radius:12px;background:#eef1f6;color:#5b6b83;margin-bottom:8px}
.bd-pop-lv.gap{background:#fdecec;color:#c0392b}.bd-pop-lv.tight{background:#fdf3e0;color:#a2690a}
.bd-pop-lv.ok{background:#e6f6ee;color:#0f7a4d}.bd-pop-lv.over{background:#eaf1ff;color:#2f6fd0}
.bd-pop-t{width:100%;border-collapse:collapse;font-size:11.5px}
.bd-pop-t td{padding:3px 0;border-bottom:1px dashed #eef1f6}
.bd-pop-t td:last-child{text-align:right;font-weight:700}
.bd-pop-sub{font-size:11px;color:var(--text-2);margin-top:9px;line-height:1.6}
.bd-pop-tip{margin-top:8px;background:#f8fafc;border-radius:6px;padding:7px 9px;font-size:11px;color:var(--text-2)}
/* 日诊断小结 */
.bd-summary{background:#fff;border:1px solid var(--line);border-radius:10px;padding:12px 14px;margin-top:10px}
.bd-summary-h{font-size:12.5px;font-weight:700;color:var(--text);margin-bottom:8px}
.bd-summary-h span{font-weight:400;font-size:11px;color:var(--text-3);margin-left:10px}
.bd-issues{display:flex;flex-wrap:wrap;gap:6px}
.bd-issue{font-size:10.5px;padding:4px 8px;border-radius:6px;background:#f8fafc;color:var(--text-2);border:1px solid var(--line)}
.bd-issue b{color:#9c3428;margin-right:4px}
.bd-issue.gap{background:#fdecec;border-color:#f3c6c6;color:#b02b2b}
.bd-issue.over{background:#eaf1ff;border-color:#cddcf8;color:#2f6fd0}
.bd-ok{font-size:11.5px;color:#0f7a4d;background:#e6f6ee;border-radius:6px;padding:7px 10px}
.bd-note{font-size:10.5px;color:var(--text-3);margin-top:9px;line-height:1.65}


/* ==================== v2.5 智能排班：影响因素面板 / 班次编辑 ==================== */
.bd-addbtn{display:flex;align-items:center;justify-content:center;color:#c98a8a;font-size:15px;
  cursor:pointer;transition:background .12s}
.bd-addbtn:hover{background:#fdecea;color:#d64545;font-weight:700}
.bd-edit{display:flex;flex-direction:column;gap:8px;font-size:12px}
.bd-edit label{display:flex;align-items:center;justify-content:space-between;gap:8px;color:#5b6b83}
.bd-edit select{border:1px solid var(--line-strong);border-radius:6px;padding:3px 6px;font-size:12px;min-width:120px}
.bd-edit-btns{display:flex;gap:8px;margin-top:2px}
.bd-btn.primary{background:var(--brand,#d64545);border-color:var(--brand,#d64545);color:#fff}
.bd-btn.primary:hover{opacity:.92}
.bd-btn.danger{background:#fff;border-color:#e2b4b4;color:#c0392b}
.bd-btn.danger:hover{background:#fdecec}

/* ==================== v2.6 数据与运维：设置说明 / 映射维护 ==================== */
.ds-field{display:flex;flex-direction:column;gap:3px;margin-bottom:9px;font-size:12px}
.ds-field label{font-weight:600;color:var(--text,#333)}
.ds-field .help{color:#8b9ab1;font-size:11.5px;line-height:1.5}
.cfg-group{margin:14px 0 4px;padding:6px 10px;background:var(--bg-2,#f6f8fb);border-radius:8px}
.cfg-group b{font-size:12.5px}
.cfg-group small{color:#8b9ab1;margin-left:8px}
.cfg-row{padding:2px 0}
.cfg-row .form-row{margin-bottom:0}
.cfg-desc{color:#8b9ab1;font-size:11.5px;line-height:1.5;margin:3px 0 12px 160px}
.cfg-desc b{color:#b0762e}
details.cfg-legacy summary{cursor:pointer;color:#b0762e;font-size:12px;font-weight:600;padding:4px 0}

/* ==================== v2.7 账号门店范围选择 ==================== */
.store-pick{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:4px 10px;
  max-height:180px;overflow:auto;border:0.5px solid var(--line,#e3e8ef);border-radius:8px;padding:8px 10px}
.store-pick .sp-item{display:flex;align-items:center;gap:6px;font-size:12px;cursor:pointer;
  padding:2px 4px;border-radius:6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.store-pick .sp-item:hover{background:var(--bg-2,#f6f8fb)}
.store-pick .sp-item input[type=checkbox]{margin:0}

/* ==================== v2.8 商户中心自动采集 ==================== */
.pw-stores{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:4px 10px;
  max-height:130px;overflow:auto;border:1px solid var(--line,#e3e8ef);border-radius:8px;padding:8px 10px}
.pw-stores .pw-item{display:flex;align-items:center;gap:6px;font-size:12px;cursor:pointer;
  padding:2px 4px;border-radius:6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pw-stores .pw-item:hover{background:var(--bg-2,#f6f8fb)}
.pw-stores .pw-item input[type=checkbox]{margin:0}
.pw-csv{margin:8px 0 0;padding:10px 12px;background:var(--bg-2,#f6f8fb);border:1px solid var(--line,#e3e8ef);
  border-radius:8px;font-size:11.5px;line-height:1.6;max-height:220px;overflow:auto;color:var(--text-2)}
#tblPosShops select{max-width:210px;font-size:11.5px}
.pw-tag{font-size:11px;padding:1px 7px;border-radius:10px;background:#eef2f8;color:#5b6b83}
.pw-tag.g{background:#e8f6ee;color:#1e9f7f}
.pw-tag.y{background:#fff4e0;color:#b0762e}

/* ==================== v2.17 数据同步中心 / 重复数据提示 ==================== */
.sync-center .sync-flow{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  background:var(--bg-2,#f6f8fb);border:1px solid var(--line);border-radius:8px;
  padding:9px 12px;margin-bottom:12px}
.sync-flow span{font-size:11.5px;color:var(--text-2);white-space:nowrap}
.sync-flow span b{color:var(--brand);margin-right:3px}
.sync-flow i{flex:1;min-width:10px;height:1px;background:var(--line)}
.sync-srcs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
.src-card{border:1px solid var(--line);border-radius:10px;padding:12px;background:#fff;
  display:flex;flex-direction:column;gap:8px}
.src-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.src-head b{font-size:13.5px;color:var(--text)}
.src-head .pill{margin-left:auto}
.src-body{font-size:12px;color:var(--text-2);line-height:1.6}
.src-body .note{margin-top:6px;font-size:11px}
.src-actions{margin-top:auto;display:flex;gap:8px;flex-wrap:wrap;padding-top:4px}
.csv-import{margin-top:12px;border-top:1px dashed var(--line);padding-top:12px}
.csv-head{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.csv-head b{font-size:12.5px}
.csv-head .sub{font-size:11.5px;color:var(--text-3)}
.dup-summary{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}
.dup-stat{border:1px solid var(--line);border-radius:8px;padding:9px 10px;background:var(--bg-2,#f6f8fb)}
.dup-stat b{display:block;font-size:17px;color:var(--brand);line-height:1.3}
.dup-stat span{font-size:11px;color:var(--text-3)}
.dup-stat.warn b{color:#c0392b}
.dup-samples{margin-top:10px;font-size:11.5px;color:var(--text-2);line-height:1.6}
.dup-samples table{width:100%;border-collapse:collapse;margin-top:6px}
.dup-samples th,.dup-samples td{border-bottom:1px solid var(--line);padding:4px 6px;text-align:left}
@media (max-width:820px){
  .sync-srcs{grid-template-columns:1fr}
  .dup-summary{grid-template-columns:repeat(2,minmax(0,1fr))}
}

/* ============================================================ v2.18 船长掌舵
   全店汇总四张图形卡 + 1 小时粒度风险预警热力图（浅色主题） */
.section-title{display:flex;align-items:baseline;gap:8px;margin:16px 0 10px;font-size:13px;color:var(--text)}
.section-title span{font-size:11.5px;color:var(--text-3)}
.captain-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
.cap-card{border:1px solid var(--line);border-radius:11px;padding:13px 14px 10px;background:#fff;
  min-width:0;display:flex;flex-direction:column}
.cap-top{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
.cap-lab{font-size:12.5px;font-weight:700;color:var(--text)}
.cap-delta{font-size:11px;font-weight:700;margin-left:auto;white-space:nowrap}
.cap-delta.good{color:#1e9f7f}
.cap-delta.bad{color:#c0392b}
.cap-delta.flat{color:var(--text-3);font-weight:600}
.cap-val{font-size:23px;font-weight:700;letter-spacing:-.4px;font-variant-numeric:tabular-nums;
  color:var(--brand);margin:6px 0 2px}
.cap-hint{font-size:11px;color:var(--text-3);line-height:1.6;min-height:17px}
.cap-card svg{width:100%;height:132px;display:block;margin-top:6px}
.cap-legend{display:flex;gap:10px;flex-wrap:wrap;font-size:10.5px;color:var(--text-3);margin-top:2px}
.cap-legend i,.heat-legend i{display:inline-block;width:9px;height:9px;border-radius:2px;
  margin-right:4px;vertical-align:-1px}
.cap-locked{margin-top:14px;padding:16px 12px;border:1px dashed var(--line-strong);border-radius:8px;
  background:var(--bg-2,#f6f8fb);font-size:11.5px;color:var(--text-2);line-height:1.7;flex:1}
.cap-error{padding:14px;border:1px solid #f0b9b0;border-radius:8px;background:#fff5f4;
  color:#c0392b;font-size:12px;grid-column:1/-1}
.captain-note{margin-top:12px;padding-top:10px;border-top:1px dashed var(--line);
  font-size:11px;color:var(--text-3);line-height:1.8}
.captain-note b{color:var(--text-2)}
/* v2.22 门店筛选 + 数据新鲜度 */
.cap-pick{display:flex;align-items:center;gap:6px;font-size:11.5px;color:var(--text-3)}
.cap-pick select{height:28px;border:1px solid var(--line-strong);border-radius:7px;background:#fff;
  font-size:12px;color:var(--text-1);padding:0 6px;max-width:230px}
.cap-pick select:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 2px var(--brand-soft)}
/* v2.23 盘面范围分段：全店汇总 / 本店（门店本身只由顶栏「当前门店」决定） */
.cap-seg{display:inline-flex;border:1px solid var(--line-strong);border-radius:8px;overflow:hidden;background:#fff}
.cap-seg button{border:0;background:none;font:inherit;font-size:11.5px;color:var(--text-2);
  padding:0 9px;height:26px;cursor:pointer;white-space:nowrap;max-width:190px;overflow:hidden;
  text-overflow:ellipsis;transition:.15s}
.cap-seg button + button{border-left:1px solid var(--line)}
.cap-seg button:hover{background:#f4f7fd;color:var(--text-1)}
.cap-seg button.on{background:var(--brand);color:#fff;border-left-color:var(--brand)}
/* v2.24 成本管控：总预算分拆操作区 + 跨店对比图 */
.alloc-bar{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:12px;
  padding:10px 12px;border:1px solid var(--line);border-radius:9px;background:#f8fafd}
.alloc-bar label{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text-2)}
.alloc-bar input{width:130px;height:28px;border:1px solid var(--line-strong);border-radius:7px;
  padding:0 8px;font-size:12.5px;background:#fff}
.alloc-bar input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 2px var(--brand-soft)}
.alloc-bar .note{font-size:11px;color:var(--text-3);flex:1;min-width:200px}
.cost-charts{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:14px;margin-bottom:14px}
.cost-chart{border:1px solid var(--line);border-radius:9px;padding:10px 12px;background:#fff}
.cost-chart .cc-h{display:flex;flex-direction:column;gap:2px;margin-bottom:6px}
.cost-chart .cc-h b{font-size:12.5px;color:var(--text-1)}
.cost-chart .cc-h span{font-size:11px;color:var(--text-3)}
.cap-fresh{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 10px;margin-bottom:12px;
  padding:8px 10px;border-radius:8px;background:#f6f8fc;font-size:11.5px;color:var(--text-2);line-height:1.6}
.cap-fresh .ok{color:#1e9f7f;font-weight:600;margin-left:auto}
.cap-fresh .warn{color:#b0762e;font-weight:600;margin-left:auto}
#captainAuto.on{background:var(--brand-soft);border-color:var(--brand);color:var(--brand)}
.risk-layout{display:grid;grid-template-columns:250px minmax(0,1fr);gap:14px}
.risk-side{border-right:1px solid var(--line);padding-right:12px;max-height:440px;overflow:auto}
.risk-tabs{display:flex;gap:6px;margin-bottom:10px;position:sticky;top:0;background:#fff;z-index:1;padding-bottom:6px}
.risk-tabs .btn.on{background:var(--brand);color:#fff;border-color:var(--brand)}
.risk-item{border:1px solid var(--line);border-radius:9px;padding:10px;margin-bottom:8px;cursor:pointer;transition:.15s}
.risk-item:hover{border-color:var(--brand-2);background:#f8faff}
.risk-item.on{border-color:var(--brand);box-shadow:0 0 0 2px var(--brand-soft);background:#f6f9ff}
.risk-item-top{display:flex;align-items:baseline;gap:6px;font-size:12px}
.risk-item-top b{flex:1;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.risk-score{font-size:10.5px;color:var(--text-3);white-space:nowrap}
.risk-tags{display:flex;flex-wrap:wrap;gap:4px;margin-top:7px}
.risk-tag{font-size:10px;color:#fff;border-radius:20px;padding:1px 7px}
.risk-worst{font-size:10.5px;color:var(--text-2);margin-top:7px;line-height:1.5}
.risk-gap{font-size:11.5px;padding:7px 2px;border-bottom:1px solid var(--line);color:var(--text-2)}
.risk-gap b{color:var(--brand);margin-right:4px}
.risk-gap span{float:right;color:var(--text-3);font-size:10.5px}
.risk-more{font-size:11px;color:var(--text-3);padding:8px 2px}
.risk-main{min-width:0}
.risk-head{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:10px;
  font-size:12px;color:var(--text-2)}
.risk-head b{font-size:13px;color:var(--text)}
.heat-scroll{overflow:auto;max-height:330px}
.heat-table{border-collapse:separate;border-spacing:3px;font-size:10px;width:100%}
.heat-table th{font-size:9.5px;color:var(--text-3);font-weight:600;text-align:center;white-space:nowrap;padding:2px}
.heat-day{text-align:left!important;min-width:52px;color:var(--text-2);font-size:10.5px;
  white-space:nowrap;position:sticky;left:0;background:#fff;z-index:1}
.heat-day span{color:var(--text-3);font-size:9.5px}
.heat-cell{width:100%;min-width:20px;height:20px;border-radius:3px;cursor:pointer;
  transition:transform .12s,box-shadow .12s}
.heat-cell:hover{transform:scale(1.18);box-shadow:0 0 0 2px var(--brand)}
.heat-legend{display:flex;gap:10px;flex-wrap:wrap;font-size:10.5px;color:var(--text-2);margin:10px 0}
.heat-tip{color:var(--text-3)}
.cell-empty{font-size:11.5px;color:var(--text-3);padding:10px 0}
.cell-box{border:1px solid var(--line);border-radius:9px;padding:12px;
  background:var(--bg-2,#f6f8fb);margin-top:8px}
.cell-h{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--text)}
.cell-level{font-size:10.5px;color:#fff;border-radius:20px;padding:2px 9px}
.cell-metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:10px 0}
.cell-metrics>div{border:1px solid var(--line);border-radius:7px;padding:8px;background:#fff}
.cell-metrics span{display:block;font-size:10.5px;color:var(--text-3)}
.cell-metrics b{font-size:15px;color:var(--text);font-variant-numeric:tabular-nums}
.cell-metrics b.bad{color:#c0392b}
.cell-metrics b.good{color:#1e9f7f}
.cell-metrics b.warn{color:#b0762e}
.cell-class{width:100%;border-collapse:collapse;font-size:11.5px;background:#fff}
.cell-class th,.cell-class td{border-bottom:1px solid var(--line);padding:5px 8px;text-align:left}
.cell-class th{font-size:10.5px;color:var(--text-3)}
.cell-class td.bad{color:#c0392b}
.cell-class td.good{color:#1e9f7f}
.cell-advice{font-size:11.5px;color:var(--text-2);line-height:1.7;margin-top:10px}
.cell-advice b{color:var(--text)}
@media (max-width:1100px){
  .risk-layout{grid-template-columns:1fr}
  .risk-side{border-right:0;border-bottom:1px solid var(--line);padding:0 0 12px;max-height:250px}
  .captain-grid{grid-template-columns:1fr}
  .cell-metrics{grid-template-columns:repeat(2,1fr)}
}

/* v2.20 岗位总览：同步岗位全量核对（数据与运维 → 岗位映射与营业因子） */
.map-stats{display:flex;flex-wrap:wrap;gap:8px}
.map-stat{border:1px solid var(--line);border-radius:8px;padding:6px 10px;background:var(--bg-2,#f6f8fb);min-width:96px}
.map-stat span{display:block;font-size:10.5px;color:var(--text-3)}
.map-stat b{font-size:14px;color:var(--text);font-variant-numeric:tabular-nums}
.map-stat.warn{border-color:#f0c987;background:#fff8ea}
.map-stat.warn b{color:#b0762e}
.map-acts{white-space:nowrap}
.map-bind{padding:1px 6px;font-size:11px;margin-right:3px;opacity:.75}
.map-bind.on{opacity:1;border-color:#3358e0;color:#3358e0;font-weight:600}
.map-row-warn td{background:#fffdf6}

/* v2.21 排班结果体检（智能排班 → 生成结果） */
.qual-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px}
.qual-cell{border:1px solid var(--line);border-radius:9px;padding:9px 11px;background:var(--bg-2,#f7f9fc)}
.qual-cell span{display:block;font-size:11px;color:var(--text-3)}
.qual-cell b{display:block;font-size:19px;line-height:1.35;color:var(--text);font-variant-numeric:tabular-nums}
.qual-cell i{display:block;font-size:11px;color:var(--text-3);font-style:normal}
.qual-cell.warn{border-color:#f0c987;background:#fff8ea}
.qual-cell.warn b{color:#b0762e}
.qual-dist{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-top:12px;padding-top:10px;border-top:1px dashed var(--line)}
.qual-eq{margin-top:10px;padding:8px 10px;border-radius:8px;background:#f6f8fc;font-size:12px;color:var(--text-2);line-height:1.7}
.qual-eq b{color:var(--text-1);font-variant-numeric:tabular-nums}
.qual-eq .sep{margin:0 8px;color:#c9d3e2}
.qual-eq .note{margin-left:8px;color:var(--text-3)}
.qual-dist-t{font-size:11.5px;color:var(--text-3);min-width:78px}
.qual-bar{display:flex;align-items:center;gap:6px;min-width:150px;flex:1}
.qual-bar-lab{font-size:11px;color:var(--text-3);width:34px;text-align:right}
.qual-bar-track{flex:1;height:9px;border-radius:5px;background:#eef2f8;overflow:hidden;min-width:52px}
.qual-bar-track i{display:block;height:100%;background:linear-gradient(90deg,#3358e0,#6d8bf0);border-radius:5px}
.qual-bar b{font-size:12px;min-width:20px;text-align:right;font-variant-numeric:tabular-nums}
.qual-gaps{margin-top:12px;padding-top:10px;border-top:1px dashed var(--line)}
.qual-gaps-h{display:flex;flex-wrap:wrap;align-items:baseline;gap:10px;margin-bottom:6px}
.qual-gaps-h b{font-size:12.5px;color:#b0762e}
