/* BMS · 凯诺特智能工程 —— 系统原型公共样式
   视觉语言沿用附件：墨绿主色 / 暖白纸底 / 30px 网格底纹 / 高密度信息卡 */
:root{
  --ink:#1d2821;
  --muted:#687268;
  --faint:#98a296;
  --brand:#5f8247;
  --brand-dark:#26382a;
  --brand-mid:#42603a;
  --brand-pale:#e9f0e2;
  --paper:#f3f4ee;
  --card:#ffffff;
  --line:#dce1d5;
  --line-strong:#cbd4c6;
  --safety:#dfa42d;
  --safety-pale:#fbf3db;
  --rust:#b55a43;
  --rust-pale:#fbede8;
  --steel:#426b72;
  --shadow:0 5px 18px rgba(29,40,33,.06);
  --radius:10px;
}
*{box-sizing:border-box}
html,body{margin:0;height:100%}
body{
  font-family:"PingFang SC","Noto Sans SC","Microsoft YaHei",system-ui,sans-serif;
  background:#e8e8e1;color:var(--ink);font-size:14px;
  -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
}
.num{font-family:"DIN Alternate","Barlow Condensed","Arial Narrow",sans-serif;font-variant-numeric:tabular-nums;font-weight:600;letter-spacing:.015em}
a{color:inherit}

/* ===== 外壳 ===== */
.app-shell{height:100vh;display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:64px minmax(0,1fr);background:var(--paper)}

/* ===== 全局头 ===== */
.app-header{
  grid-column:1/-1;grid-row:1;height:64px;background:#fff;border-bottom:1px solid var(--line);
  display:flex;align-items:center;gap:30px;padding:0 20px;position:relative;z-index:6;
}
.brand{display:flex;align-items:center;gap:10px;width:198px;flex-shrink:0;text-decoration:none}
.brand-logo{height:42px;width:auto;display:block}
.brand-mark{
  width:30px;height:30px;border-radius:6px;background:var(--brand-dark);color:#f1f0e2;
  display:flex;align-items:center;justify-content:center;font-weight:800;font-size:16px;letter-spacing:-.02em;
}
.brand-word{font-size:16px;font-weight:800;letter-spacing:.02em;line-height:1.05;color:var(--ink)}
.brand-sub{font-size:12px;color:var(--faint);letter-spacing:.08em;margin-top:3px}
.global-nav{display:flex;align-items:center;gap:2px;height:64px}
.global-nav a{
  color:var(--muted);font-size:14px;text-decoration:none;padding:21px 12px 19px;
  border-bottom:2px solid transparent;line-height:1;white-space:nowrap;
}
.global-nav a:hover{color:var(--brand-mid)}
.global-nav a.active{color:var(--brand-dark);font-weight:700;border-bottom-color:var(--brand)}
.header-right{margin-left:auto;display:flex;align-items:center;gap:10px}
.header-date{text-align:right;font-size:13px;line-height:1.45;color:var(--muted);margin-right:2px}
.header-date strong{display:block;font-size:14px;color:var(--ink);font-weight:500}
.header-date b{font-family:"DIN Alternate",sans-serif;font-variant-numeric:tabular-nums}
.icon-button{
  width:30px;height:30px;border:1px solid var(--line);border-radius:6px;background:#fafbf7;
  color:var(--muted);display:flex;align-items:center;justify-content:center;cursor:pointer;padding:0;
}
.icon-button:hover{background:#f2f5ec;color:var(--brand-mid)}
.icon-button svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:1.8}
.header-avatar{
  width:30px;height:30px;border-radius:50%;background:#e7efe0;color:var(--brand-dark);
  font-size:14px;font-weight:700;display:flex;align-items:center;justify-content:center;
  border:1px solid #cfdcc4;margin-left:3px;
}

/* ===== 左侧导航 ===== */
.app-sidebar{
  grid-column:1;grid-row:2;background:var(--brand-dark);color:#e8ede2;
  padding:14px 12px 14px;display:flex;flex-direction:column;overflow-y:auto;z-index:2;
}
.app-sidebar::-webkit-scrollbar{width:0}
.side-group-title{font-size:12px;letter-spacing:.14em;color:#91a38e;font-weight:600;padding:0 10px;margin:7px 0 4px}
.side-item{
  height:30px;display:flex;align-items:center;gap:9px;padding:0 10px;border-radius:6px;
  color:#ccd8c7;text-decoration:none;font-size:14px;position:relative;white-space:nowrap;
}
.side-item:hover{background:#2d4331;color:#eef2e4}
.side-item svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:1.7;opacity:.92;flex-shrink:0}
.side-item.active{background:#334b37;color:#f2f1e2;font-weight:600}
.side-item.active::before{content:"";position:absolute;left:0;top:9px;bottom:9px;width:2px;background:var(--safety);border-radius:1px}
.side-sub{padding:1px 0 3px 24px;display:grid;gap:1px}
.side-sub a{
  font-size:13px;color:#aebda9;text-decoration:none;height:22px;display:flex;align-items:center;gap:7px;
  border-radius:5px;padding:0 8px;
}
.side-sub a::before{content:"";width:3px;height:3px;border-radius:50%;background:#71846c;flex-shrink:0}
.side-sub a:hover{color:#e9efdf}
.side-sub a.active{color:#f1efdd;background:#2b4130}
.side-sub a.active::before{background:var(--safety)}
.sidebar-spacer{flex:1;min-height:14px}
.current-project{background:#2b3f30;border:1px solid rgba(255,255,255,.08);border-radius:8px;padding:10px 10px 9px;text-decoration:none;display:block}
.current-project-label{font-size:12px;color:#9db097;letter-spacing:.08em}
.current-project-name{font-size:14px;color:#edf0e4;line-height:1.35;margin-top:4px;font-weight:600}
.project-progress{height:3px;background:rgba(255,255,255,.12);border-radius:2px;margin-top:9px;overflow:hidden}
.project-progress span{display:block;width:92.5%;height:100%;background:var(--safety);border-radius:2px}
.project-foot{display:flex;justify-content:space-between;font-size:12px;color:#9db097;margin-top:6px}
.project-foot b{color:#e6e9dc;font-weight:500}

/* ===== 主区域 ===== */
.app-main{
  grid-column:1;grid-row:2;overflow-y:auto;padding:18px 18px 22px;position:relative;
  background-color:#f1f3ed;
  background-image:
    linear-gradient(rgba(68,88,68,.045) 1px,transparent 1px),
    linear-gradient(90deg,rgba(68,88,68,.045) 1px,transparent 1px);
  background-size:30px 30px;
}
.app-main::-webkit-scrollbar{width:8px}
.app-main::-webkit-scrollbar-thumb{background:#c9d0c2;border-radius:4px}

.page-head{display:flex;justify-content:space-between;align-items:flex-start;gap:20px;min-height:58px}
.breadcrumb{font-size:12px;color:var(--faint);letter-spacing:.02em;display:flex;gap:5px;align-items:center}
.breadcrumb i{width:3px;height:3px;border-radius:50%;background:#aab3a6;display:inline-block}
.crumb-link{color:var(--faint);text-decoration:none}
.crumb-link:hover{color:var(--brand-mid)}
.page-title{font-size:24px;font-weight:800;letter-spacing:-.035em;line-height:1.18;margin:5px 0 0}
.page-subtitle{font-size:13px;color:var(--muted);margin-top:4px;line-height:1.4}
.page-subtitle strong{font-weight:500;color:var(--brand-dark)}
.page-actions{display:flex;align-items:center;gap:8px;margin-top:7px;flex-shrink:0;flex-wrap:wrap}
.live-tag{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--muted);margin-right:2px;white-space:nowrap}
.live-tag::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--brand);box-shadow:0 0 0 2px #e4eddd}
.btn{
  height:34px;padding:0 11px;border-radius:6px;border:1px solid var(--line-strong);background:#fff;
  color:var(--ink);font-family:inherit;font-size:13px;display:inline-flex;align-items:center;justify-content:center;
  gap:5px;white-space:nowrap;cursor:pointer;
}
.btn:hover{border-color:#b6c2b0;background:#fbfcf8}
.btn svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:1.8}
.btn-primary{background:var(--brand);border-color:var(--brand);color:#fff;font-weight:600}
.btn-primary:hover{background:#54733f;border-color:#54733f}
.btn-primary svg{stroke:#fff}
.btn-ghost{background:#fbfcf8}
.btn-danger{border-color:#e3c4ba;color:var(--rust);background:#fdf7f4}

/* ===== KPI ===== */
.kpi-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:12px;margin-top:14px}
.kpi-grid.six{grid-template-columns:repeat(6,minmax(0,1fr))}
.kpi{
  background:#fff;border:1px solid var(--line);border-radius:8px;padding:12px 14px 10px;
  position:relative;box-shadow:var(--shadow);overflow:hidden;min-height:88px;
}
.kpi-label{font-size:12px;color:var(--muted);letter-spacing:.04em}
.kpi-value{font-size:28px;line-height:1.05;color:var(--brand-dark);margin-top:5px}
.kpi-value .unit{font-family:"PingFang SC",sans-serif;font-size:12px;color:var(--muted);font-weight:500;margin-left:2px}
.kpi-foot{font-size:12px;color:var(--faint);margin-top:5px;display:flex;justify-content:space-between;align-items:center;gap:8px}
.kpi-foot .up{color:var(--brand);font-weight:600}
.kpi-foot .down{color:var(--rust);font-weight:600}
.kpi.warn .kpi-value{color:#8d6a1f}
.kpi.steel .kpi-value{color:var(--steel)}
.kpi.rust .kpi-value{color:var(--rust)}
.kpi-progress{height:3px;background:#edf0e8;border-radius:2px;margin-top:6px;overflow:hidden}
.kpi-progress span{display:block;height:100%;width:92.5%;background:var(--brand);border-radius:2px}
.kpi-icon{
  position:absolute;right:11px;top:11px;width:24px;height:24px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;background:var(--brand-pale);color:var(--brand-mid);
}
.kpi-icon svg{width:13px;height:13px;stroke:currentColor;fill:none;stroke-width:1.7}
.kpi.warn .kpi-icon{background:var(--safety-pale);color:#9a741f}
.kpi.steel .kpi-icon{background:#edf3f4;color:var(--steel)}
.kpi.rust .kpi-icon{background:var(--rust-pale);color:var(--rust)}

/* ===== 工作区（左表 + 右详情） ===== */
.workspace{display:grid;grid-template-columns:minmax(0,1fr) 400px;gap:16px;margin-top:14px;height:calc(100vh - 292px);min-height:430px}
body.has-subnav .workspace{height:calc(100vh - 336px)}
.card{background:#fff;border:1px solid var(--line);border-radius:9px;box-shadow:var(--shadow);min-height:0;overflow:hidden}
.table-card{display:flex;flex-direction:column}
.table-head{height:56px;padding:0 14px;display:flex;align-items:center;gap:10px;border-bottom:1px solid var(--line);flex-shrink:0}
.table-head h2{font-size:16px;font-weight:700;margin:0;display:flex;align-items:center;gap:7px;letter-spacing:-.01em}
.count-pill{display:inline-flex;align-items:center;height:20px;padding:0 6px;border-radius:3px;background:var(--brand-pale);color:var(--brand-mid);font-size:12px;font-weight:600}
.table-head-right{margin-left:auto;display:flex;align-items:center;gap:6px}
.table-filter{height:42px;padding:0 12px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;background:#fbfcf9;flex-shrink:0;flex-wrap:wrap}
.tabs{display:flex;align-items:center;gap:2px}
.tab{height:30px;padding:0 8px;border-radius:4px;font-size:13px;color:var(--muted);display:inline-flex;align-items:center;gap:4px;background:transparent;border:0;cursor:pointer;font-family:inherit}
.tab:hover{background:#f1f3ec}
.tab.active{background:var(--brand-pale);color:var(--brand-dark);font-weight:600}
.tab .tab-count{font-family:"DIN Alternate",sans-serif;font-size:13px;color:var(--faint)}
.tab.active .tab-count{color:var(--brand-mid)}
.filter-pill{height:28px;padding:0 8px;border:1px solid var(--line);border-radius:4px;background:#fff;font-size:12px;color:var(--muted);display:inline-flex;align-items:center;gap:5px;white-space:nowrap;cursor:pointer}
.filter-pill svg{width:9px;height:9px;stroke:var(--faint);fill:none;stroke-width:2}
.table-search{margin-left:auto;height:30px;width:158px;border:1px solid var(--line);border-radius:4px;background:#fff;display:flex;align-items:center;gap:6px;padding:0 7px;color:var(--faint)}
.table-search svg{width:11px;height:11px;stroke:var(--faint);fill:none;stroke-width:1.8;flex-shrink:0}
.table-search input{border:0;outline:0;background:transparent;font-family:inherit;font-size:12px;width:100%;color:var(--ink);min-width:0}
.table-search input::placeholder{color:var(--faint)}

.table-columns{height:36px;padding:0 12px;border-bottom:1px solid var(--line);background:#fff;color:var(--faint);font-size:12px;letter-spacing:.02em;flex-shrink:0;display:flex;align-items:center}
.table-body{flex:1;min-height:0;overflow-y:auto}
.table-body::-webkit-scrollbar{width:8px}
.table-body::-webkit-scrollbar-thumb{background:#dce2d6;border-radius:4px}

.row{height:54px;padding:0 12px;border-bottom:1px solid #edf0e9;cursor:pointer;color:var(--ink);position:relative;display:flex;align-items:center}
.row:hover{background:#fafcf7}
.row.selected{background:#eff4e9;box-shadow:inset 3px 0 0 var(--brand)}
.employee-cell{display:flex;align-items:center;gap:8px;min-width:0}
.avatar{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:#e8efe0;color:var(--brand-dark);font-size:13px;font-weight:700;flex-shrink:0;border:1px solid #d1dfc7}
.avatar.a2{background:#edf2e0;color:#4a5c38;border-color:#d8e1c2}
.avatar.a3{background:#e7eff1;color:#3d6068;border-color:#cadde0}
.avatar.a4{background:#f4eddf;color:#77613d;border-color:#e2d5bb}
.employee-copy{min-width:0;line-height:1.2}
.employee-name{font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.employee-id{font-size:12px;color:var(--faint);margin-top:2px;white-space:nowrap}
.team{font-size:13px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hours{font-size:14px;color:var(--ink)}
.hours small{font-family:"PingFang SC",sans-serif;font-size:12px;color:var(--faint);font-weight:400;margin-left:1px}
.ot{color:#9b6e18;font-size:14px}
.ot.zero{color:var(--faint);font-size:13px}
.loc-pill{display:inline-flex;align-items:center;gap:3px;font-size:12px;color:#56715c;background:#f0f5ed;border:1px solid #dce8d4;border-radius:3px;padding:2px 4px;white-space:nowrap}
.loc-pill svg{width:9px;height:9px;stroke:currentColor;fill:none;stroke-width:1.9}
.loc-pill.bad{color:var(--rust);background:var(--rust-pale);border-color:#eccfc5}
.evidence-chip{display:inline-flex;align-items:center;gap:3px;font-size:12px;color:#6d796d;background:#f6f7f2;border:1px solid #e2e6dc;border-radius:3px;padding:2px 4px;white-space:nowrap}
.evidence-chip svg{width:9px;height:9px;stroke:#7b8779;fill:none;stroke-width:1.7}
.money{font-family:"DIN Alternate",sans-serif;font-size:14px;color:var(--ink);letter-spacing:.02em;font-variant-numeric:tabular-nums}
.status{display:inline-flex;align-items:center;gap:4px;height:20px;padding:0 5px;border-radius:3px;font-size:12px;white-space:nowrap}
.status::before{content:"";width:4px;height:4px;border-radius:50%;background:currentColor}
.status.pending{color:#8b681d;background:var(--safety-pale)}
.status.approved{color:#4d7039;background:#edf4e5}
.status.abnormal{color:var(--rust);background:var(--rust-pale)}
.status.rejected{color:#7a4c3f;background:#f7eae4}
.status.done{color:#496a70;background:#edf3f4}
.row-action{border:0;background:transparent;color:var(--brand);font:600 9.5px/1 "PingFang SC",sans-serif;padding:4px 0;cursor:pointer;text-align:left}
.row-action::after{content:"›";margin-left:4px;font-size:14px;color:#91a18b}
.row-action:hover{color:var(--brand-dark)}
.table-foot{height:42px;padding:0 12px;border-top:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;color:var(--faint);font-size:12px;flex-shrink:0;background:#fcfdfa}
.pager{display:flex;align-items:center;gap:4px;color:var(--muted);font-size:12px}
.pager b{color:var(--brand-dark);font-weight:600}
.pager-btn{width:24px;height:24px;border:1px solid var(--line);border-radius:3px;background:#fff;cursor:pointer;color:var(--muted);font-size:12px;display:inline-flex;align-items:center;justify-content:center;padding:0}
.pager-btn:hover{background:#f2f5ec}

/* ===== 详情面板 ===== */
.detail-card{padding:15px 15px 13px;display:flex;flex-direction:column;gap:9px;overflow-y:auto}
.detail-card::-webkit-scrollbar{width:6px}
.detail-card::-webkit-scrollbar-thumb{background:#dce2d6;border-radius:3px}
.detail-top{display:flex;align-items:flex-start;gap:9px}
.detail-person{display:flex;align-items:center;gap:9px;min-width:0}
.detail-avatar{width:36px;height:36px;border-radius:50%;background:var(--brand-pale);color:var(--brand-dark);display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;border:1px solid #cedcc3;flex-shrink:0}
.detail-name{font-size:16px;font-weight:700;letter-spacing:-.02em;line-height:1.2}
.detail-role{font-size:12px;color:var(--muted);margin-top:2px}
.detail-top .status{margin-left:auto;margin-top:2px}
.detail-idline{display:flex;justify-content:space-between;align-items:center;gap:10px;font-size:12px;color:var(--faint);border-bottom:1px solid #edf0e8;padding-bottom:8px}
.detail-idline b{color:var(--muted);font-weight:500}

.map-card{height:96px;border:1px solid #d7e2d4;border-radius:6px;position:relative;overflow:hidden;background:#eef4e9;flex-shrink:0}
.map-grid{position:absolute;inset:0;background-image:linear-gradient(rgba(72,101,75,.09) 1px,transparent 1px),linear-gradient(90deg,rgba(72,101,75,.09) 1px,transparent 1px);background-size:16px 16px}
.map-road{position:absolute;background:#dce7d8}
.map-road.r1{width:150%;height:10px;left:-20%;top:58px;transform:rotate(-12deg)}
.map-road.r2{width:86px;height:7px;left:42%;top:38px;transform:rotate(68deg);background:#d3e0cf}
.map-block{position:absolute;border:1px solid #d0dfca;background:#e6eee0}
.map-block.b1{left:23px;top:17px;width:74px;height:30px}
.map-block.b2{right:31px;top:20px;width:98px;height:26px}
.map-block.b3{right:56px;bottom:12px;width:66px;height:18px}
.map-pin{position:absolute;left:56%;top:43%;width:23px;height:23px;border-radius:50% 50% 50% 0;transform:translate(-50%,-50%) rotate(-45deg);background:var(--brand);box-shadow:0 4px 9px rgba(47,71,42,.2);display:flex;align-items:center;justify-content:center}
.map-pin::after{content:"";width:5px;height:5px;border-radius:50%;background:#fff;position:absolute}
.map-label{position:absolute;left:10px;top:9px;background:rgba(255,255,255,.86);border:1px solid #d7e1d2;border-radius:3px;padding:3px 5px;font-size:12px;color:#4e664f;line-height:1.35}
.map-label b{display:block;font-size:12px;color:var(--brand-dark);font-weight:600}
.map-distance{position:absolute;right:9px;bottom:8px;background:var(--brand-dark);color:#eef2e5;border-radius:3px;padding:3px 6px;font-size:12px}
.map-distance b{font-family:"DIN Alternate",sans-serif;font-size:14px;font-weight:600;margin-right:2px}

.detail-label{display:flex;justify-content:space-between;align-items:center;font-size:13px;color:var(--muted)}
.detail-label b{font-size:13px;color:var(--ink);font-weight:600}
.ruler{display:flex;gap:2px;height:8px}
.ruler span{flex:1;border-radius:1px;background:#e6eae1}
.ruler span.on{background:var(--brand)}
.ruler span.ot{background:var(--safety)}
.ruler-meta{display:flex;justify-content:space-between;font-size:12px;color:var(--faint);margin-top:4px}
.ruler-meta b{color:var(--muted);font-weight:500}
.proof{display:flex;align-items:center;gap:9px;padding:7px;border:1px solid #e3e8dd;border-radius:5px;background:#fbfcf8}
.proof img{width:72px;height:54px;border-radius:3px;object-fit:cover;filter:saturate(.8) contrast(.96);background:#e8eee1}
.proof-copy{min-width:0;flex:1}
.proof-title{font-size:12px;font-weight:600;color:var(--ink)}
.proof-meta{font-size:12px;color:var(--muted);margin-top:3px;line-height:1.4}
.text-link{font-size:12px;color:var(--brand);text-decoration:none;white-space:nowrap;cursor:pointer}
.pay-panel{background:#f7f8f2;border:1px solid #e5e8de;border-radius:5px;padding:8px 9px;display:grid;gap:4px}
.pay-row{display:flex;justify-content:space-between;font-size:12px;color:var(--muted)}
.pay-row strong{font-family:"DIN Alternate",sans-serif;font-size:13px;color:var(--ink);font-weight:500;letter-spacing:.02em}
.pay-total{display:flex;justify-content:space-between;align-items:baseline;border-top:1px solid #dce2d6;margin-top:3px;padding-top:6px}
.pay-total span{font-size:12px;color:var(--brand-dark);font-weight:600}
.pay-total strong{font-size:24px;color:var(--brand-dark);font-family:"DIN Alternate",sans-serif;font-weight:600}
.pay-total strong small{font-family:"PingFang SC",sans-serif;font-size:12px;color:var(--faint);font-weight:400;margin-left:2px}
.detail-note{font-size:12px;color:var(--faint);line-height:1.4}
.decision{margin-top:auto;display:flex;gap:8px;padding-top:2px}
.decision .btn{height:34px;flex:1;font-size:13px}
.decision .btn-primary{flex:1.35}

/* ===== 台账页 ===== */
.stat-strip{height:58px;background:#fff;border:1px solid var(--line);border-radius:7px;display:grid;grid-template-columns:repeat(5,1fr);box-shadow:var(--shadow);margin-top:12px;overflow:hidden}
.stat{display:flex;flex-direction:column;justify-content:center;padding:0 15px;border-right:1px solid #edf0e9;min-width:0}
.stat:last-child{border-right:0}
.stat-label{font-size:12px;color:var(--muted);letter-spacing:.02em;white-space:nowrap}
.stat-value{font-size:20px;line-height:1.15;color:var(--brand-dark);margin-top:2px}
.stat-value small{font-family:"PingFang SC",sans-serif;font-size:12px;color:var(--faint);font-weight:400;margin-left:2px}
.stat.warn .stat-value{color:#8b681d}
.stat.abnormal .stat-value{color:var(--rust)}
.filter-card{height:52px;background:#fff;border:1px solid var(--line);border-radius:7px;margin-top:10px;display:flex;align-items:center;gap:8px;padding:0 11px;box-shadow:var(--shadow);flex-wrap:wrap;overflow:hidden}
.field{height:30px;border:1px solid var(--line);border-radius:4px;background:#fcfdfa;display:flex;align-items:center;gap:6px;padding:0 8px;font-size:12px;color:var(--muted);white-space:nowrap}
.field svg{width:10px;height:10px;stroke:#8c978a;fill:none;stroke-width:1.8}
.field b{font-weight:500;color:var(--ink);font-size:12px;margin-left:1px}
.field.wide{width:140px}
.filter-spacer{flex:1}
.ledger-card{background:#fff;border:1px solid var(--line);border-radius:9px;box-shadow:var(--shadow);margin-top:10px;display:flex;flex-direction:column;overflow:hidden;height:calc(100vh - 300px);min-height:380px}
.ledger-toolbar{height:44px;padding:0 12px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;flex-shrink:0;background:#fff}
.ledger-toolbar .tabs{flex:1}
.selected-info{font-size:12px;color:var(--muted);white-space:nowrap}
.selected-info b{color:var(--brand-dark);font-weight:600}
.ledger-thead{height:32px;padding:0 12px;background:#fbfcf9;border-bottom:1px solid var(--line);color:var(--faint);font-size:12px;flex-shrink:0;display:flex;align-items:center}
.ledger-body{flex:1;min-height:0;overflow-y:auto}
.ledger-body::-webkit-scrollbar{width:8px}
.ledger-body::-webkit-scrollbar-thumb{background:#dce2d6;border-radius:4px}
.ledger-row{height:42px;padding:0 12px;border-bottom:1px solid #edf0e8;font-size:12px;color:var(--muted);display:flex;align-items:center;cursor:pointer}
.ledger-row:hover{background:#fafcf7}
.ledger-row.alert{background:#fdf6f2}
.checkbox{width:14px;height:14px;border:1px solid #c7d2c2;border-radius:3px;background:#fff;display:inline-block;position:relative;flex-shrink:0}
.checkbox.on{background:var(--brand);border-color:var(--brand)}
.checkbox.on::after{content:"";position:absolute;left:3px;top:1px;width:4px;height:8px;border-right:2px solid #fff;border-bottom:2px solid #fff;transform:rotate(38deg)}
.employee-mini{display:flex;align-items:center;gap:7px;min-width:0}
.employee-mini .avatar{width:21px;height:21px;font-size:12px}
.employee-mini b{font-size:13px;color:var(--ink);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.employee-mini em{font-size:12px;color:var(--faint);font-style:normal;margin-left:3px}
.project-name{font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ledger-hours{font-size:13px;color:var(--ink)}
.ledger-hours small{font-family:"PingFang SC",sans-serif;font-size:12px;color:var(--faint);margin-left:1px}
.location-cell{display:flex;align-items:center;gap:4px;font-size:12px;color:#55715c}
.location-cell .dot{width:5px;height:5px;border-radius:50%;background:var(--brand);display:block;flex-shrink:0}
.location-cell.bad{color:var(--rust)}
.location-cell.bad .dot{background:var(--rust)}
.photo-cell{display:inline-flex;align-items:center;gap:3px;font-size:12px;color:#7b8678}
.photo-cell svg{width:9px;height:9px;stroke:#7b8678;fill:none;stroke-width:1.7}
.ledger-foot{height:42px;padding:0 12px;border-top:1px solid var(--line);background:#fcfdfa;display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(--faint);flex-shrink:0}
.ledger-foot-left{display:flex;align-items:center;gap:10px}
.ledger-foot-left b{color:var(--brand-dark);font-weight:600}
.batch-btn{height:26px;padding:0 9px;border:1px solid #cbd9c1;border-radius:4px;background:var(--brand-pale);color:var(--brand-dark);font:600 8.5px/1 "PingFang SC",sans-serif;cursor:pointer}
.batch-btn:hover{background:#e0ead7}
.batch-btn:disabled{opacity:.45;cursor:not-allowed}

/* ===== 驾驶舱 ===== */
.dash-grid{display:grid;grid-template-columns:minmax(0,1fr) 360px;gap:16px;margin-top:14px;height:calc(100vh - 292px);min-height:440px}
.stack{display:grid;grid-template-rows:minmax(0,1fr) auto;gap:14px;min-height:0}
.project-row{height:56px;padding:0 14px;border-bottom:1px solid #edf0e9;display:grid;grid-template-columns:minmax(0,1.9fr) 0.96fr minmax(0,1fr) minmax(0,0.81fr);align-items:center;gap:12px}
.project-row:hover{background:#fafcf7}
.pname{font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pmeta{font-size:12px;color:var(--faint);margin-top:2px}
.progress-track{height:6px;background:#eef1e9;border-radius:3px;overflow:hidden}
.progress-track span{display:block;height:100%;background:var(--brand);border-radius:3px}
.progress-track span.late{background:var(--rust)}
.progress-track span.warn{background:var(--safety)}
.progress-meta{display:flex;justify-content:space-between;font-size:12px;color:var(--faint);margin-top:3px}
.risk-item{display:flex;gap:9px;padding:11px 14px;border-bottom:1px solid #edf0e9}
.risk-dot{width:6px;height:6px;border-radius:50%;margin-top:4px;flex-shrink:0}
.risk-dot.rust{background:var(--rust)}
.risk-dot.warn{background:var(--safety)}
.risk-dot.ok{background:var(--brand)}
.risk-title{font-size:13px;font-weight:600;line-height:1.4}
.risk-meta{font-size:12px;color:var(--faint);margin-top:2px;line-height:1.4}
.chart-wrap{padding:12px 14px 6px}
.bars{display:flex;align-items:flex-end;gap:8px;height:96px}
.bar{flex:1;height:100%;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;gap:4px}
.bar i{display:block;width:100%;background:linear-gradient(180deg,#6e9257,#5f8247);border-radius:3px 3px 0 0;min-height:4px}
.bar b{font-family:"DIN Alternate",sans-serif;font-size:12px;color:var(--faint);font-weight:400}
.bar-label{display:flex;gap:8px;margin-top:6px;font-size:12px;color:var(--faint)}

/* ===== 表格栅格 ===== */
.att-grid{display:grid;grid-template-columns:minmax(0,2.40fr) minmax(0,1fr) minmax(0,0.67fr) minmax(0,0.58fr) minmax(0,0.96fr) minmax(0,0.65fr) minmax(0,0.96fr) minmax(0,0.83fr) minmax(0,0.58fr);gap:8px;align-items:center;width:100%}
.ledger-grid{display:grid;grid-template-columns:minmax(0,0.27fr) minmax(0,1.56fr) minmax(0,1fr) minmax(0,0.96fr) minmax(0,0.58fr) minmax(0,0.52fr) minmax(0,0.88fr) minmax(0,0.56fr) minmax(0,0.77fr) minmax(0,0.65fr);gap:8px;align-items:center;width:100%}

.sale-grid{display:grid;grid-template-columns:minmax(0,1.56fr) minmax(0,1.4fr) minmax(0,0.81fr) minmax(0,0.58fr) minmax(0,0.65fr) minmax(0,0.58fr) minmax(0,0.88fr);gap:8px;align-items:center;width:100%}
.proj-grid{display:grid;grid-template-columns:minmax(0,1.5fr) 0.95fr 0.8fr minmax(0,1fr) minmax(0,0.85fr) minmax(0,0.85fr) minmax(0,0.9fr);gap:8px;align-items:center;width:100%}
.fin-grid{display:grid;grid-template-columns:minmax(0,1.6fr) minmax(0,0.88fr) minmax(0,0.88fr) minmax(0,0.88fr) minmax(0,0.65fr) minmax(0,0.79fr);gap:8px;align-items:center;width:100%}

/* ===== 通用 ===== */
.section-title{display:flex;align-items:center;justify-content:space-between;padding:0 14px;height:44px;border-bottom:1px solid var(--line);flex-shrink:0}
.section-title h2{font-size:14px;font-weight:700;margin:0}
.section-title .text-link{font-size:12px}
.empty{padding:40px 14px;text-align:center;color:var(--faint);font-size:14px}

.toast{
  position:fixed;left:50%;bottom:28px;transform:translate(-50%,14px);z-index:99;
  background:var(--brand-dark);color:#f3f6ec;font-size:14px;padding:9px 16px;border-radius:8px;
  box-shadow:0 10px 26px rgba(20,30,20,.25);opacity:0;pointer-events:none;transition:.22s;max-width:80vw;
}
.toast.show{opacity:1;transform:translate(-50%,0)}

@media (max-width:1240px){
  .workspace,.dash-grid{grid-template-columns:1fr;height:auto}
  .detail-card{max-height:none}
  .table-body{max-height:420px}
}
@media (max-width:980px){
  .app-shell{grid-template-columns:1fr;grid-template-rows:64px minmax(0,1fr)}
  .app-sidebar{display:none}
  .app-main{grid-column:1}
  .app-header{gap:10px;padding:0 12px}
  .brand{width:auto}
  .brand-logo{height:34px}
  .header-date{display:none}
  .global-nav{display:none}
  .m-nav-btn{display:inline-flex}
  .kpi-grid,.kpi-grid.six{grid-template-columns:repeat(2,minmax(0,1fr))}
  .badge-grid,.stat-strip{grid-template-columns:repeat(2,1fr)}
}

/* 采购 / 人事表格栅格 */
.proc-grid{display:grid;grid-template-columns:minmax(0,1.6fr) 1.38fr 1.00fr 0.77fr 0.77fr 0.81fr;gap:8px;align-items:center;width:100%}
.hr-grid{display:grid;grid-template-columns:minmax(0,1.83fr) minmax(0,1.00fr) minmax(0,1fr) minmax(0,0.92fr) minmax(0,0.75fr);gap:8px;align-items:center;width:100%}

/* 报价单 / 销售合同表格栅格 */
.quote-grid{display:grid;grid-template-columns:minmax(0,1.6fr) 1.33fr 1.00fr 0.96fr 0.83fr;gap:8px;align-items:center;width:100%}
.contract-grid{display:grid;grid-template-columns:minmax(0,1.42fr) .95fr .98fr .86fr .82fr .60fr .92fr;gap:8px;align-items:center;width:100%}

/* 采购需求 / 采购合同表格栅格 */
.req-grid{display:grid;grid-template-columns:minmax(0,1.5fr) 1.23fr minmax(0,1.3fr) minmax(0,0.96fr) minmax(0,0.92fr) minmax(0,0.85fr);gap:8px;align-items:center;width:100%}
.pcontract-grid{display:grid;grid-template-columns:minmax(0,1.4fr) 1.38fr 1.00fr 1.23fr 0.92fr 0.81fr;gap:8px;align-items:center;width:100%}

/* 项目进度 / 任务 / 甘特图 / 我的任务 */
.prg-grid{display:grid;grid-template-columns:minmax(0,1.5fr) 1.00fr 1.00fr 0.85fr 0.81fr;gap:8px;align-items:center;width:100%}
.task-grid{display:grid;grid-template-columns:minmax(0,1.55fr) minmax(0,0.92fr) minmax(0,0.86fr) minmax(0,0.6fr) minmax(0,0.76fr) minmax(0,0.58fr) minmax(0,0.68fr);gap:8px;align-items:center;width:100%}
.mytask-grid{display:grid;grid-template-columns:minmax(0,0.17fr) minmax(0,1.55fr) minmax(0,0.92fr) minmax(0,0.78fr) minmax(0,0.72fr) minmax(0,0.66fr);gap:8px;align-items:center;width:100%}

/* 甘特图 */
.gantt-card{padding:0}
.gantt-head{display:flex;align-items:center;justify-content:space-between;padding:14px 16px 10px}
.gantt-legend{display:flex;gap:14px;align-items:center;font-size:12px;color:#7d837a}
.gantt-legend i{display:inline-block;width:14px;height:6px;border-radius:2px;margin-right:4px;vertical-align:middle}
.gantt-body{display:grid;grid-template-columns:230px 1fr;border-top:1px solid var(--line)}
.gantt-left{border-right:1px solid var(--line)}
.gantt-scale{display:grid;grid-template-columns:repeat(12,1fr);height:30px;border-bottom:1px solid var(--line);position:relative}
.gantt-scale span{font-size:12px;color:#8a9086;display:flex;align-items:center;justify-content:center;border-right:1px dashed #eceee6}
.gantt-row{height:32px;border-bottom:1px solid #f0f2ea;display:flex;align-items:center;padding:0 12px;font-size:12px;color:#3f463f;gap:6px;white-space:nowrap;overflow:hidden}
.gantt-row small{color:#9aa096;font-size:12px}
.gantt-track{position:relative;height:32px;border-bottom:1px solid #f0f2ea;
  background-image:linear-gradient(90deg, #eceee6 1px, transparent 1px);background-size:calc(100% / 12) 100%}
.gantt-bar{position:absolute;top:9px;height:14px;border-radius:3px;background:#a9bf98;overflow:hidden}
.gantt-bar b{display:block;height:100%;background:#5f8247;border-radius:3px}
.gantt-bar.risk{background:#e8c9bf}
.gantt-bar.risk b{background:#b55a43}
.gantt-done{position:absolute;top:11px;height:10px;width:2px;background:#8fae76;border-radius:2px}
.gantt-today{position:absolute;top:0;bottom:0;width:1.5px;background:#b55a43;z-index:3}
.gantt-today:after{content:"今天";position:absolute;top:-14px;left:-12px;font-size:12px;color:#b55a43;background:#fff;padding:0 3px;border-radius:2px}

/* 我的任务 */
.check-box{width:14px;height:14px;border:1px solid #c9d3bd;border-radius:3px;background:#fff;position:relative}
.check-box.done{background:#5f8247;border-color:#5f8247}
.check-box.done:after{content:"";position:absolute;left:4px;top:1px;width:5px;height:9px;border:solid #fff;border-width:0 1.5px 1.5px 0;transform:rotate(45deg)}

/* 系统管理：二级导航与各页栅格 */
.subnav{display:flex;gap:2px;border-bottom:1px solid var(--line);margin:0 0 12px;flex-wrap:wrap}
.subnav a{font-size:13px;color:#5b6459;text-decoration:none;padding:8px 11px;border-bottom:2px solid transparent;border-radius:4px 4px 0 0}
.subnav a:hover{background:#f3f5ec;color:#3f463f}
.subnav a.active{color:#33491f;border-bottom-color:var(--brand);font-weight:600;background:#f6f8f0}
.sysocr-grid{display:grid;grid-template-columns:minmax(0,1.55fr) 1.40fr 0.83fr 0.90fr 0.81fr;gap:8px;align-items:center;width:100%}
.sysu-grid{display:grid;grid-template-columns:minmax(0,1.4fr) 1.38fr 1.23fr 1.15fr 0.81fr;gap:8px;align-items:center;width:100%}
.sysd-grid{display:grid;grid-template-columns:minmax(0,1.6fr) 1.15fr 0.83fr 1.46fr 0.81fr;gap:8px;align-items:center;width:100%}
.sysr-grid{display:grid;grid-template-columns:minmax(0,1.56fr) minmax(0,1.6fr) minmax(0,0.83fr) minmax(0,1.25fr) minmax(0,0.81fr);gap:8px;align-items:center;width:100%}
.sysf-grid{display:grid;grid-template-columns:minmax(0,1.5fr) 1.35fr 0.73fr 1.00fr 0.81fr;gap:8px;align-items:center;width:100%}
.sysb-grid{display:grid;grid-template-columns:minmax(0,1.67fr) minmax(0,1.15fr) minmax(0,0.94fr) minmax(0,0.94fr) minmax(0,0.81fr);gap:8px;align-items:center;width:100%}
.sysl-grid{display:grid;grid-template-columns:minmax(0,0.86fr) minmax(0,0.96fr) minmax(0,0.72fr) minmax(0,1.55fr) minmax(0,0.78fr);gap:8px;align-items:center;width:100%}

.inv-grid{display:grid;grid-template-columns:minmax(0,1.45fr) 1.02fr .92fr .95fr .88fr .86fr;gap:8px;align-items:center;width:100%}
.rcv-grid{display:grid;grid-template-columns:minmax(0,1.38fr) 1.00fr .70fr .88fr .60fr 1.02fr .80fr;gap:8px;align-items:center;width:100%}
.pay-grid{display:grid;grid-template-columns:minmax(0,1.38fr) 1.00fr .70fr .88fr .92fr 1.02fr .80fr;gap:8px;align-items:center;width:100%}
.exp-grid{display:grid;grid-template-columns:minmax(0,1.34fr) .86fr 1.16fr .88fr .80fr .74fr;gap:8px;align-items:center;width:100%}

.cust-grid{display:grid;grid-template-columns:minmax(0,1.5fr) 1.00fr 0.81fr 0.88fr 1.04fr 0.81fr;gap:8px;align-items:center;width:100%}
.supp-grid{display:grid;grid-template-columns:minmax(0,1.5fr) 1.00fr 0.81fr 0.88fr 1.04fr 0.81fr;gap:8px;align-items:center;width:100%}

/* 分页器 */
.pager{display:flex;align-items:center;gap:6px;font-size:14px;color:#6b7264}
.pager .pg-size{display:flex;align-items:center;gap:3px}
.pager .pg-sel{font:inherit;color:#3f473c;background:#fff;border:1px solid #dce1d5;border-radius:4px;padding:1px 4px;outline:none}
.pager .pg-count{color:#8a9082;margin:0 4px}
.pager .pg-btn{min-width:22px;height:22px;padding:0 6px;font:inherit;color:#3f473c;background:#fff;border:1px solid #dce1d5;border-radius:4px;cursor:pointer}
.pager .pg-btn:hover:not(:disabled){border-color:#5f8247;color:#5f8247}
.pager .pg-btn:disabled{opacity:.45;cursor:default}
.pager .pg-btn.active{background:#5f8247;border-color:#5f8247;color:#fff}

.btn.filter-btn{display:inline-flex;align-items:center;gap:5px}
.btn.filter-btn svg{opacity:.55}
.filter-pop{position:fixed;z-index:120;width:300px;background:#fff;border:1px solid #dce1d5;border-radius:10px;box-shadow:0 14px 32px rgba(38,56,42,.14);padding:14px 16px;display:none}
.filter-pop .fp-title{font-size:13px;font-weight:600;color:#26382a;margin-bottom:10px;letter-spacing:.3px}
.filter-pop .fp-chips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}
.filter-pop .fp-chip{height:26px;line-height:26px;padding:0 10px;border:1px solid #dce1d5;border-radius:13px;font-size:13px;color:#4a5648;background:#fbfcf8;cursor:pointer}
.filter-pop .fp-chip.on{background:#eef2e4;border-color:#b9c8a2;color:#42603a;font-weight:600}
.filter-pop .fp-foot{display:flex;justify-content:flex-end;gap:8px;border-top:1px solid #dce1d5;padding-top:10px}

.kpi-link{cursor:pointer;transition:transform .15s ease,box-shadow .15s ease}
.kpi-link:hover{transform:translateY(-1px);box-shadow:0 2px 10px rgba(0,0,0,.06)}
.risk-act{cursor:pointer}
.risk-item.done{opacity:.45}
.risk-item.done .risk-title{text-decoration:line-through}
.row-act{cursor:pointer}

/* v28 考勤台账：与其他子表统一为标准卡片结构 */
.lg-grid{display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,1.35fr) minmax(0,0.8fr) minmax(0,0.55fr) minmax(0,0.55fr) minmax(0,0.85fr) minmax(0,0.55fr) minmax(0,0.8fr) minmax(0,0.7fr);gap:8px;align-items:center;width:100%}
.lg-grid .num{font-variant-numeric:tabular-nums}

/* 数据字典表格：列宽自适应，窄屏不裁切 */
#dictTable{overflow-x:auto;overflow-y:hidden}
#dictTable .dict-row{min-width:0}
#dictTable .dict-head{border-bottom:1px solid #e8eee2}

.material-grid{display:grid;grid-template-columns:minmax(0,1.6fr) 1fr 0.9fr 0.7fr 0.7fr;gap:8px;align-items:center;width:100%}

/* ===== v2.6.124 字号放大后的长文本适配：单位名/日志描述允许两行，不截字 ===== */
.team{white-space:normal;line-height:1.24;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;word-break:break-all}
.detail-card .team{display:block;white-space:normal}

/* v2.6.157 去掉页面标记行，标题区按方案B上移 */
.breadcrumb{display:none!important}
.page-head{min-height:0!important;padding-top:10px!important}
/* 移动端折叠菜单 */
.m-nav-btn{display:none;align-items:center;justify-content:center;width:38px;height:38px;flex:0 0 38px;
  border:1px solid var(--line);border-radius:8px;background:#fff;color:var(--ink);cursor:pointer;margin-right:8px}
.m-nav-mask{position:fixed;inset:0;background:rgba(20,30,20,.35);z-index:58;display:none}
.m-nav-panel{position:fixed;left:0;right:0;top:64px;background:#fff;z-index:59;display:none;padding:6px 0 12px;
  box-shadow:0 14px 30px rgba(20,30,20,.18);max-height:calc(100vh - 64px);overflow:auto;border-bottom:1px solid var(--line)}
.m-nav-panel a{display:block;padding:14px 22px;font-size:16px;color:var(--ink);text-decoration:none;border-bottom:1px solid rgba(0,0,0,.05)}
.m-nav-panel a.active{color:var(--brand-dark);font-weight:700;background:#f3f8ef}

@media (max-width:980px){.m-nav-btn{display:inline-flex}}

/* 移动端标题区自适应 */
.page-head>div:first-child{flex:1;min-width:0}
@media (max-width:980px){
  .page-head{flex-direction:column;gap:10px}
  .page-head>div:first-child{width:100%}
  .page-actions{width:100%;margin-top:2px}
  .page-title{font-size:24px}
  .page-subtitle{font-size:12px}
}

/* 手机端列表卡片化（配合 app.js 注入 .m-lab） */
@media (max-width:980px){
  .table-columns{display:none!important}
  .table-card{height:auto!important;min-height:0!important}
  .table-card .table-body{flex:0 0 auto!important;max-height:none!important;overflow:visible!important;padding:0!important}
  .table-body .row{height:auto!important;min-height:0!important;display:block!important;padding:0!important;align-items:stretch!important}
  .table-body .row{border-bottom:1px solid rgba(0,0,0,.07)}
  .table-body .row>.m-card,
  .table-body .row>[data-mcard="1"]{
    display:grid!important;grid-template-columns:74px minmax(0,1fr)!important;
    gap:8px 12px!important;padding:14px 2px!important;width:100%!important;
    align-items:center!important;box-sizing:border-box!important;
  }
  .m-lab{font-size:12px;color:#7C8578;line-height:1.4;text-align:left;align-self:center;word-break:keep-all}
  .m-card>*:not(.m-lab){min-width:0;overflow-wrap:anywhere}
  .table-card .table-foot{flex-wrap:wrap;gap:8px}
  .row-action{min-height:38px;min-width:62px;font-size:13px}
  .btn,.tab,.pager-btn{min-height:38px}
  .table-filter{gap:8px;flex-wrap:wrap}
}

/* 手机端解除列表卡片高度约束 */
@media (max-width:980px){
  .workspace,body.has-subnav .workspace,.dash-grid{height:auto!important;min-height:0!important}
  .card{overflow:visible!important}
  .table-card{overflow:visible!important}
}

/* 手机端列表头/筛选栏自适应高度 */
@media (max-width:980px){
  .table-head{height:auto!important;min-height:52px;padding:10px 12px!important;flex-wrap:wrap;gap:8px}
  .table-head-right{margin-left:auto}
  .table-filter{height:auto!important;min-height:44px;padding:8px 12px!important;flex-wrap:wrap;gap:8px}
  .table-filter .table-search{flex:1 1 150px;min-width:0}
  .table-filter .table-search input{width:100%!important}
  .table-foot{height:auto!important;min-height:44px;padding:8px 12px!important;flex-wrap:wrap;gap:8px}
  .table-body .row>[data-mcard="1"]{gap:6px 10px!important;padding:12px 2px!important}
  .m-lab{font-size:12px;color:#7C8578}
}

@media (max-width:980px){.m-lab{align-self:start;padding-top:3px}}
