:root{
  --bg:#f2f5fa; --card:#fff; --line:#e3e8f0; --txt:#1f2937; --sub:#6b7280;
  --blue:#1a73e8; --green:#12a150; --orange:#f59e0b; --purple:#8b5cf6; --red:#ef4444;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{background:var(--bg);color:var(--txt);font:14px/1.5 "Microsoft YaHei","PingFang SC",-apple-system,Segoe UI,sans-serif}
.hidden{display:none !important}
.btn{border:1px solid transparent;border-radius:6px;padding:7px 14px;cursor:pointer;font-size:13px;background:#fff;color:var(--txt);transition:.15s}
.btn-primary{background:var(--blue);color:#fff}
.btn-primary:hover{filter:brightness(1.08)}
.btn-ghost{border-color:var(--line);color:#4b5563;background:#fff}
.btn-ghost:hover{border-color:var(--blue);color:var(--blue)}
.btn-block{width:100%;margin-top:14px;padding:9px}
.btn-sm{padding:3px 8px;font-size:12px}

/* 登录 */
.login-wrap{position:fixed;inset:0;background:linear-gradient(135deg,#1a73e8,#6d3ce0);display:flex;align-items:center;justify-content:center;z-index:50}
.login-card{background:#fff;border-radius:12px;padding:32px 30px;width:340px;box-shadow:0 18px 50px rgba(0,0,0,.25)}
.login-title{font-size:19px;font-weight:700;text-align:center}
.login-sub{text-align:center;color:var(--sub);font-size:13px;margin:6px 0 20px}
.login-card input{width:100%;padding:10px 12px;border:1px solid var(--line);border-radius:6px;margin-bottom:12px;font-size:14px;outline:none}
.login-card input:focus{border-color:var(--blue)}
.login-err{color:var(--red);font-size:12px;min-height:16px;margin-bottom:6px}

/* 顶栏 */
.topbar{display:flex;align-items:center;justify-content:space-between;background:#fff;border-bottom:1px solid var(--line);padding:0 16px;height:52px;position:sticky;top:0;z-index:20}
.tabs{display:flex;gap:4px}
.tab{padding:9px 18px;border-radius:8px 8px 0 0;cursor:pointer;color:#4b5563;font-size:14px}
.tab.active{background:var(--blue);color:#fff}
.tab.plain{opacity:.55}
.topbar-right{display:flex;align-items:center;gap:10px}
.who{font-size:13px;color:var(--sub)}

.main{padding:16px;display:flex;flex-direction:column;gap:14px;max-width:1920px;margin:0 auto}
.panel{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:14px 16px}
.panel-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;gap:12px;flex-wrap:wrap}
.panel-title{font-size:15px;margin:0;font-weight:700;border-left:3px solid var(--blue);padding-left:9px}
.panel-title .unit{font-weight:400;color:var(--sub);font-size:12px;margin-left:6px}
.panel-tools{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.hint{font-size:12px;color:var(--sub)}
.legend{display:flex;gap:12px;font-size:12px;color:var(--sub)}
.legend i{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:4px}
.year-pick{font-size:13px;color:#374151}

/* 统计卡片 */
.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:12px}
.stat-card{border:1px solid var(--line);border-radius:8px;padding:12px 14px;background:#fbfcfe}
.stat-card h4{margin:0 0 10px;font-size:13px;font-weight:600;color:var(--sub);display:flex;align-items:center;gap:6px}
.stat-card h4 i{width:8px;height:14px;border-radius:2px;background:var(--blue)}
.stat-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(90px,1fr));gap:8px}
.metric .lab{font-size:11px;color:var(--sub)}
.metric .val{font-size:17px;font-weight:700}
.metric .val small{font-size:11px;font-weight:400;color:var(--sub)}
.metric.c1 .val{color:var(--blue)} .metric.c2 .val{color:var(--green)}
.metric.c3 .val{color:var(--orange)} .metric.c4 .val{color:var(--purple)}

.stage-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:12px}
.stage-card{border:1px solid var(--line);border-radius:8px;padding:12px 14px;background:#fbfcfe;cursor:pointer}
.stage-card:hover{border-color:var(--blue);background:#f4f8ff}
.stage-card h4{margin:0 0 8px;font-size:13px;color:#374151}
.stage-card .row{display:flex;justify-content:space-between;font-size:12px;color:var(--sub);padding:2px 0}
.stage-card .row b{color:var(--txt);font-weight:600}

/* 月度 */
.month-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(122px,1fr));gap:8px}
.month-box{border:1px solid var(--line);border-radius:8px;padding:8px 10px;text-align:center;cursor:pointer;background:#fff}
.month-box:hover{border-color:var(--blue)}
.month-box.active{background:var(--blue);border-color:var(--blue);color:#fff}
.month-box .m{font-weight:700;font-size:14px}
.month-box .c{font-size:12px;color:var(--sub);margin-top:3px;line-height:1.4}
.month-box.active .c{color:#e8f0fe}
.month-box.current{box-shadow:0 0 0 2px rgba(26,115,232,.25)}
.month-box.year-box{background:#eaf1fd;border-color:#b9d3fb}

/* 筛选 */
.filters-panel{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap}
.filters{display:flex;gap:14px;flex-wrap:wrap;flex:1}
.filter{display:flex;flex-direction:column;gap:5px}
.filter label{font-size:12px;color:var(--sub)}
.filter input,.filter select{border:1px solid var(--line);border-radius:6px;padding:7px 10px;font-size:13px;min-width:150px;outline:none;background:#fff}
.filter input:focus,.filter select:focus{border-color:var(--blue)}
.filter-actions{display:flex;gap:8px}

/* 表格 */
.count{font-size:14px;font-weight:600}
.count b{color:var(--blue)}
.table-wrap{overflow:auto;max-height:70vh;border:1px solid var(--line);border-radius:8px}
table.grid{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}
table.grid th{background:#f6f8fb;color:#475569;font-weight:600;text-align:left;padding:10px 10px;border-bottom:1px solid var(--line);white-space:nowrap;position:sticky;top:0;z-index:5;cursor:pointer}
table.grid th.nosort{cursor:default}
table.grid td{padding:9px 10px;border-bottom:1px solid #f0f2f7;vertical-align:middle;white-space:nowrap}
table.grid tbody tr:hover{background:#f7faff}
table.grid tbody tr.editing{background:#fffbe6}
table.grid tfoot td{background:#f6f8fb;font-weight:700;border-top:2px solid var(--line);padding:10px}
.num{text-align:right;font-variant-numeric:tabular-nums}
.badge{display:inline-block;padding:2px 9px;border-radius:4px;font-size:12px;color:#fff}
.badge.y{background:var(--green)} .badge.n{background:var(--red)}
.badge.gray{background:#9ca3af}
.cell-edit{min-width:60px;border:1px solid var(--line)!important;border-radius:4px;padding:3px 6px!important;font-size:13px}
.actions{display:flex;gap:6px}
.tag{display:inline-block;background:#eaf1fd;color:#1a73e8;border-radius:4px;padding:1px 7px;margin:1px 3px 1px 0;font-size:12px}

.pager{display:flex;align-items:center;gap:8px;justify-content:flex-end;margin-top:12px;font-size:13px;color:var(--sub)}
.pager button{border:1px solid var(--line);background:#fff;border-radius:5px;padding:4px 10px;cursor:pointer;font-size:13px}
.pager button:disabled{opacity:.45;cursor:default}
.pager button.on{background:var(--blue);color:#fff;border-color:var(--blue)}

/* 下拉 */
.dropdown{position:relative}
.dropdown-menu{position:absolute;right:0;top:110%;background:#fff;border:1px solid var(--line);border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.12);padding:10px;display:none;z-index:30;max-height:320px;overflow:auto;min-width:200px}
.dropdown-menu.show{display:block}
.dropdown-menu label{display:flex;align-items:center;gap:8px;font-size:13px;padding:4px 2px;cursor:pointer}

/* 模态 */
.modal-wrap{position:fixed;inset:0;background:rgba(15,23,42,.45);display:flex;align-items:center;justify-content:center;z-index:40}
.modal{background:#fff;border-radius:12px;width:620px;max-width:94vw;max-height:86vh;display:flex;flex-direction:column}
.modal-head{display:flex;justify-content:space-between;align-items:center;padding:14px 18px;border-bottom:1px solid var(--line);font-weight:700}
.modal-x{border:0;background:none;font-size:22px;cursor:pointer;color:var(--sub);line-height:1}
.modal-body{padding:18px;overflow:auto;display:grid;grid-template-columns:1fr 1fr;gap:14px}
.modal-foot{padding:12px 18px;border-top:1px solid var(--line);display:flex;justify-content:flex-end;gap:10px}
.form-item{display:flex;flex-direction:column;gap:5px}
.form-item.full{grid-column:1/-1}
.form-item label{font-size:12px;color:var(--sub)}
.form-item input,.form-item select,.form-item textarea{border:1px solid var(--line);border-radius:6px;padding:8px 10px;font-size:13px;outline:none;font-family:inherit}
.form-item input:focus,.form-item select:focus{border-color:var(--blue)}
.chips{display:flex;flex-wrap:wrap;gap:6px;border:1px solid var(--line);border-radius:6px;padding:6px;min-height:38px;align-items:center}
.chip{background:#eaf1fd;color:#1a73e8;border-radius:4px;padding:2px 8px;font-size:12px;display:flex;gap:5px;align-items:center}
.chip b{cursor:pointer;font-weight:700}

.toast{position:fixed;top:70px;left:50%;transform:translateX(-50%);background:#111827;color:#fff;padding:10px 18px;border-radius:8px;z-index:60;font-size:13px}
.toast.err{background:#b91c1c}
