/* ============================================================
   和教育智慧校园项目｜运营台 · 前端样式
   ------------------------------------------------------------
   主色：International Klein Blue #002FA7
   辅色：琥珀 #E8A33D（只做「待审批 / 警示」强调，主按钮与侧栏底不用）
   中性色都带一点蓝味。

   视觉约束：
     1. 靠字体、间距、层次、微交互做质感，不靠霓虹光、不做大面积深色底；
     2. 纯 CSS + 内联 SVG，零外部字体、零 CDN、零请求（离线单文件仍能跑）；
     3. 过渡一律 ≤180ms，只有卡片阴影会变，卡片本体不位移（表格密集，位移会跳）。

   ============================================================ */
:root{
  /* 主色：克莱因蓝 */
  --teal:#002FA7;          /* 侧栏底、主按钮、表头强调、total 行文字 */
  --teal-800:#001D69;      /* 深压：侧栏渐变底端、hover */
  --teal-600:#1040C8;      /* 亮压：按钮 hover、链接 hover */
  --teal-100:#D5DEF8;      /* 淡边：tag/pill/period-tag 的边框 */
  --teal-050:#EDF1FD;      /* 淡底：选中行、total 行背景、info 提示底 */
  /* 琥珀：蓝底上的强调色，主按钮与侧栏底不要用 */
  --amber:#E8A33D; --amber-600:#C9862A; --amber-050:#FDF4E5;
  /* 中性：都带一点蓝味 */
  --bg:#F3F5FA; --panel:#fff; --line:#DCE2F0; --line-soft:#E9EDF7;
  --ink:#101528; --ink-2:#39415C; --muted:#666E8A; --muted-2:#8B92AA;
  /* 状态色（红/绿/琥珀保留语义，在蓝底上重新调过对比） */
  --ok-bg:#E6F3EA; --ok-fg:#146B40; --bad-bg:#FCEAE8; --bad-fg:#A5362A;
  --warn-bg:#FDF3E2; --warn-fg:#8A5A12; --editable:#FFFDF7;

  /* ---- 设计令牌 ---- */
  --r-card:12px; --r-btn:7px; --r-pill:999px;
  --sh-1:0 1px 2px rgba(16,21,40,.04), 0 4px 12px -2px rgba(16,21,40,.05);
  --sh-2:0 8px 24px -6px rgba(0,47,167,.16), 0 2px 6px rgba(16,21,40,.05);
  --grid:#E4E9F6; --axis:#8B92AA;
  --table-head:#F5F7FC; --table-hover:#F7F9FF;
  --ease:cubic-bezier(.4,0,.2,1); --t:.15s;
  /* 统一过渡：四种属性同一节奏，禁止各写各的 */
  --tr:background-color var(--t) var(--ease), border-color var(--t) var(--ease),
      box-shadow var(--t) var(--ease), color var(--t) var(--ease), transform var(--t) var(--ease);

  --shadow:var(--sh-1);    /* 兼容老引用 */
  --rail:208px;

  /* 侧栏文字（#EEF2FF on #002FA7 = 9.56:1；最亮的渐变顶 #1039C4 = 7.81:1） */
  --rail-fg:#EEF2FF;
  --rail-fg-dim:#C9D3F2;   /* 7.17:1 on #002FA7 / 5.86:1 on 渐变顶 */
  --rail-fg-mute:#B8C2E4;  /* 4.94:1 on 渐变顶最亮处 */
}
*{box-sizing:border-box}
body{
  margin:0;background:var(--bg);color:var(--ink);
  font:13.5px/1.5 "Inter","SF Pro Text",-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
  font-variant-numeric:tabular-nums;
  -webkit-font-smoothing:antialiased;
}
/* 数字一律等宽对齐：财务后台最怕数字左右跳动 */
input,select,textarea,table,.mono,.val,.num{font-variant-numeric:tabular-nums}

/* 全局焦点环：只写一次，别到处 :focus-visible 各写各的 */
a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,[tabindex]:focus-visible{
  outline:none;border-color:var(--teal);box-shadow:0 0 0 3px rgba(0,47,167,.14);
}

/* ============================================================
   侧栏：三层叠加（网格纹理 + 渐变），最出效果的一处
   ============================================================ */
.app{display:flex;min-height:100vh}
/* 侧栏固定定位：长页面滚到底时侧栏底部（角色/退出）仍然可见。 */
.rail{
  position:fixed;top:0;left:0;bottom:0;width:var(--rail);
  /* 自上而下：40px 细网格 → 极淡，渐变本体。三层叠加，最上面那层先写。 */
  background:
    repeating-linear-gradient(0deg,rgba(255,255,255,.035) 0 1px,transparent 1px 40px),
    repeating-linear-gradient(90deg,rgba(255,255,255,.035) 0 1px,transparent 1px 40px),
    linear-gradient(180deg,#1039C4 0%,#002FA7 42%,#001040 100%);
  color:var(--rail-fg);
  padding:16px 14px;display:flex;flex-direction:column;gap:14px;z-index:30;overflow:hidden;
  border-right:1px solid rgba(255,255,255,.10);
  box-shadow:inset -1px 0 0 rgba(255,255,255,.06);
}
.brand{display:flex;gap:9px;align-items:center}
.brand-mark{width:32px;height:32px;border-radius:8px;background:var(--amber);color:#3d2a08;display:grid;place-items:center;font-weight:700;font-size:16px;flex:0 0 32px}
.brand-name{font-size:13.5px;font-weight:600;color:#fff;letter-spacing:-.01em}
.brand-sub{font-size:10.5px;color:var(--rail-fg-mute);letter-spacing:.02em}
.nav{display:flex;flex-direction:column;gap:2px;flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;margin:0 -4px;padding:2px 4px}
/* 细滚动条：不抢视觉，但长菜单能滚 */
.nav::-webkit-scrollbar{width:6px}
.nav::-webkit-scrollbar-thumb{background:rgba(255,255,255,.18);border-radius:3px}
.nav::-webkit-scrollbar-track{background:transparent}
.nav-item{
  position:relative;display:flex;align-items:center;gap:9px;padding:8px 9px;border-radius:var(--r-btn);
  color:var(--rail-fg);font-size:13px;font-weight:450;text-decoration:none;cursor:pointer;
  transition:var(--tr);
}
.nav-item svg{width:16px;height:16px;flex:0 0 16px}
.nav-item:hover{background:rgba(255,255,255,.07);color:#fff}
.nav-item.active{background:rgba(255,255,255,.12);color:var(--rail-fg);font-weight:550}
.nav-item.active::before{content:"";position:absolute;left:-14px;top:8px;bottom:8px;width:3px;border-radius:0 2px 2px 0;background:var(--amber)}
.nav-item .cnt{margin-left:auto;font-size:10.5px;background:var(--amber);color:#3d2a08;border-radius:9px;padding:0 5px;font-weight:700}

/* 侧栏底部：上行「角色 + 在线点」，下行「版本 + ghost 退出」 */
.rail-foot{margin-top:auto;flex:0 0 auto;border-top:1px solid rgba(255,255,255,.12);padding-top:10px}
.rf-top{display:flex;align-items:center;gap:7px;min-width:0}
.rf-role{font-size:12.5px;font-weight:550;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rf-dot{width:6px;height:6px;border-radius:50%;background:#4ADE80;flex:0 0 6px;box-shadow:0 0 0 3px rgba(74,222,128,.22),0 0 6px rgba(74,222,128,.55)}
.rf-bot{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:8px}
.rail-ver{font-size:10.5px;color:var(--rail-fg-mute);letter-spacing:.02em}
.rail-logout{
  font:inherit;font-size:11.5px;background:transparent;color:var(--rail-fg-dim);
  border:1px solid rgba(255,255,255,.18);border-radius:var(--r-btn);padding:4px 10px;cursor:pointer;
  transition:var(--tr);
}
.rail-logout:hover{color:#fff;border-color:rgba(255,255,255,.36);background:rgba(255,255,255,.08)}

/* ============================================================
   顶栏：唯一允许用毛玻璃的地方（表格上不用）
   ============================================================ */
.main{flex:1;min-width:0;margin-left:var(--rail);display:flex;flex-direction:column;min-height:100vh}
.topbar{
  min-height:60px;background:rgba(255,255,255,.82);
  -webkit-backdrop-filter:saturate(180%) blur(12px);backdrop-filter:saturate(180%) blur(12px);
  border-bottom:1px solid rgba(16,21,40,.07);
  display:flex;align-items:center;justify-content:space-between;gap:14px;padding:9px 18px;
  position:sticky;top:0;z-index:5;flex-wrap:wrap;
}
.tb-left{display:flex;align-items:center;gap:9px;min-width:0}
.tb-left h1{font-size:16px;font-weight:600;margin:0;letter-spacing:-.01em}
.period-tag{font-size:11.5px;color:var(--teal-600);background:var(--teal-050);border:1px solid var(--teal-100);padding:2px 8px;border-radius:var(--r-pill);white-space:nowrap;font-weight:500}
.tb-right{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.ctl{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted)}
/* 学年选择器做成胶囊：白底、细边、hover 才亮边 */
.ctl select{
  font:inherit;font-size:12px;color:var(--ink);background:#fff;
  border:1px solid var(--line);border-radius:var(--r-pill);padding:4px 24px 4px 12px;
  appearance:none;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6'><path d='M1 1l4 4 4-4' fill='none' stroke='%23666E8A' stroke-width='1.4' stroke-linecap='round'/></svg>");
  background-repeat:no-repeat;background-position:right 9px center;
  transition:var(--tr);cursor:pointer;
}
.ctl select:hover{border-color:var(--teal-100)}
.ctl input[type=text],.ctl input[type=search],.ctl input:not([type]),.ctl input[type=number],.ctl input[type=date],.ctl input[type=month]{
  font:inherit;font-size:12px;color:var(--ink);background:#fff;border:1px solid var(--line);border-radius:var(--r-btn);padding:4px 9px;transition:var(--tr);
}
.ctl input:hover{border-color:var(--teal-100)}

/* ---- 顶栏「学校」多选 --------------------------------------------
   胶囊按钮 + 下拉浮层，纯 CSS，零依赖。
   浮层用 absolute 挂在 .ms 上，不占布局、不推开顶栏；
   列表最多 8 行，超出自身滚动（约 8 × 30px = 240px）。
   ------------------------------------------------------------------------ */
.ms{position:relative;display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted)}
.ms-lbl{white-space:nowrap}
.ms-btn{
  font:inherit;font-size:12px;color:var(--ink);background:#fff;
  border:1px solid var(--line);border-radius:var(--r-pill);
  padding:4px 26px 4px 12px;position:relative;cursor:pointer;
  transition:var(--tr);white-space:nowrap;
}
.ms-btn:hover{border-color:var(--teal-100)}
.ms-btn .chev{
  position:absolute;right:8px;top:50%;margin-top:-8px;
  width:16px;height:16px;color:var(--muted-2);transition:transform var(--t) var(--ease);
}
.ms.open .ms-btn .chev{transform:rotate(180deg)}
/* 有筛选时按钮变蓝底，一眼看出「现在看的不是全量」 */
.ms-btn.on{background:var(--teal-050);border-color:var(--teal-100);color:var(--teal-600);font-weight:500}
.ms-btn.on .chev{color:var(--teal-600)}
.ms-pop{
  position:absolute;top:calc(100% + 6px);right:0;z-index:40;
  width:250px;background:#fff;border:1px solid var(--line);border-radius:var(--r-card);
  box-shadow:var(--sh-2);padding:0;overflow:hidden;
}
.ms-pop[hidden]{display:none}
.ms-hd{
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding:8px 11px;border-bottom:1px solid var(--line-soft);
  font-size:11.5px;color:var(--muted);font-weight:600;
}
.ms-acts{display:flex;gap:4px}
.ms-acts .lnk{font-size:11.5px;font-weight:500;padding:1px 4px;border-radius:4px}
.ms-list{max-height:240px;overflow-y:auto;padding:4px}
.ms-item{
  display:flex;align-items:center;gap:8px;padding:5px 7px;border-radius:6px;
  cursor:pointer;font-size:12px;color:var(--ink);transition:var(--tr);
}
.ms-item:hover{background:var(--teal-050)}
.ms-item input[type=checkbox]{width:13px;height:13px;margin:0;accent-color:var(--teal);cursor:pointer;flex:0 0 auto}
.ms-item .nm{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ms-item .ct{font-size:11px;color:var(--muted-2);flex:0 0 auto}
.ms-ft{padding:7px 11px;border-top:1px solid var(--line-soft);font-size:11px;color:var(--muted-2)}

/* ============================================================
   按钮 / 输入
   ============================================================ */
.btn{
  font:inherit;font-size:12px;padding:5px 11px;border-radius:var(--r-btn);
  border:1px solid var(--line);background:#fff;color:var(--ink-2);cursor:pointer;
  transition:var(--tr);
}
.btn:hover{border-color:#C3CCE4;color:var(--ink);background:#FAFBFF}
.btn.primary{background:var(--teal);border-color:var(--teal);color:#fff;font-weight:500}
.btn.primary:hover{background:var(--teal-600);border-color:var(--teal-600);color:#fff;box-shadow:0 2px 8px -2px rgba(0,47,167,.4)}
.btn.primary:active{transform:translateY(1px);box-shadow:none}
.btn.ghost{background:transparent}
.btn.ghost:hover{background:var(--teal-050)}
.btn.sm{padding:3px 8px;font-size:11.5px}
.btn.danger{color:var(--bad-fg);border-color:#EBC9C5}
.btn.danger:hover{background:var(--bad-bg);border-color:#EBC9C5}
.btn.warn{color:var(--warn-fg);border-color:#f0dcb4;background:var(--amber-050)}
.btn.warn:hover{background:var(--warn-bg)}
.btn:disabled{opacity:.45;cursor:not-allowed}
.btn:disabled:hover{background:#fff;border-color:var(--line);color:var(--ink-2)}
.btn.primary:disabled:hover{background:var(--teal);border-color:var(--teal);color:#fff;box-shadow:none}
.content{padding:16px 18px 40px;flex:1;min-width:0;max-width:100%}

/* ============================================================
   面板 / 卡片
   ============================================================ */
.panel{
  background:var(--panel);border:1px solid var(--line);border-radius:var(--r-card);
  box-shadow:var(--sh-1);margin-bottom:16px;overflow:hidden;transition:var(--tr);min-width:0;max-width:100%;
}
/* 悬停只提阴影，不位移：表格密集时位移会让行跳 */
.panel:hover{box-shadow:var(--sh-2);border-color:#E2E8F6}
.panel-hd{
  display:flex;align-items:center;justify-content:space-between;gap:12px;padding:11px 14px;
  border-bottom:1px solid var(--line-soft);flex-wrap:wrap;
  background:linear-gradient(180deg,#FBFCFE,#fff);
}
.panel-hd h2{font-size:14px;font-weight:600;margin:0;display:flex;align-items:center;gap:8px;letter-spacing:-.01em}
/* 标题竖线使用克莱因蓝，琥珀仅用于待审批和警示。 */
.panel-hd h2::before{content:"";width:3px;height:14px;border-radius:2px;background:var(--teal)}
.panel-hd .sub{font-size:12px;color:var(--muted)}
.panel-bd{padding:13px 14px}
.panel-bd.flush{padding:0}
.panel-ft{
  padding:9px 14px;border-top:1px solid var(--line-soft);background:#FAFBFE;
  display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;font-size:12px;color:var(--muted);
}

/* ============================================================
   表格
   ============================================================ */
table.tbl{border-collapse:separate;border-spacing:0;width:100%;font-size:12.5px}
table.tbl th,table.tbl td{padding:8px 10px;text-align:right;white-space:nowrap;border-bottom:1px solid var(--line-soft);font-variant-numeric:tabular-nums}
table.tbl th:first-child,table.tbl td:first-child,table.tbl .txt{text-align:left}
table.tbl thead th{
  background:var(--table-head);color:var(--ink-2);font-weight:600;font-size:11.5px;letter-spacing:.02em;
  border-bottom:1px solid var(--line);position:sticky;top:var(--table-header-top,0px);z-index:1;
}
table.tbl tbody tr{transition:background-color var(--t) var(--ease)}
table.tbl tbody tr:hover td{background:var(--table-hover)}
/* 合计行：台账在 <tfoot>、看板在 <tbody>，两边都要吃到 */
table.tbl tr.total td{
  background:var(--teal-050);font-weight:650;color:var(--teal);border-top:1px solid #C9D5F5;
}
table.tbl tr.total td.ro{color:var(--teal)}
table.tbl td.neg{color:var(--bad-fg)}
table.tbl td.pos{color:var(--ok-fg)}
/* 学校名列：左对齐 + 500 字重，和数字列区分开 */
table.tbl tbody td:first-child{font-weight:500}
/* 只读单元格（如总人数）：灰字 + 问号光标，悬停有 title 提示「来自策略」 */
table.tbl td.ro,.ro-cell{color:var(--muted);cursor:help}
table.tbl td.mono,table.tbl th.mono{font-variant-numeric:tabular-nums}
.tbl-wrap{min-width:0;max-width:100%;width:100%;overflow:auto;overscroll-behavior:contain;isolation:isolate}
#lBody,#lBody>.panel{min-width:0;max-width:100%}
#lBody .ledger-scroll{width:100%;max-width:100%;min-width:0;overflow:auto;overscroll-behavior-x:contain}
#lBody .ledger-scroll .tbl{min-width:1320px}
/* Fixed cells are assigned by logical column, not DOM child order (rowspan/colspan). */
:is(.tbl,.mini-tbl,.oy-school-table) .table-key-cell:not([colspan]){
  width:var(--table-key-width,144px);min-width:var(--table-key-width,104px);max-width:var(--table-key-width,176px);
  white-space:normal;overflow-wrap:anywhere;
}
:is(.tbl,.mini-tbl,.oy-school-table) .table-key-cell input{min-width:0;max-width:100%}
:is(.tbl,.mini-tbl,.oy-school-table) .table-fixed-cell{
  position:sticky;left:var(--table-fixed-left,0px);z-index:2;background:var(--panel);
}
:is(.tbl,.mini-tbl,.oy-school-table) thead th.table-fixed-cell{
  top:var(--table-header-top,0px);z-index:4;background:var(--table-head);
}
:is(.tbl,.mini-tbl,.oy-school-table) .table-fixed-edge{box-shadow:1px 0 0 var(--line),7px 0 10px -10px var(--ink)}
:is(.tbl,.mini-tbl,.oy-school-table) tbody tr:hover .table-fixed-cell{background:var(--table-hover)}
:is(.tbl,.mini-tbl,.oy-school-table) tr.total .table-fixed-cell{background:var(--teal-050)}
.fa-school-scroll tr.fa-variance .table-fixed-cell{background:var(--amber-050)}
.table-scrollable:focus-visible{outline:2px solid var(--teal);outline-offset:-2px}
.col-num{text-align:right}

/* ============================================================
   状态胶囊 / 标签：统一成「小圆点 + 文字」，底为同色 12% 透明，无边框
   ============================================================ */
.tag,.pill{
  display:inline-flex;align-items:center;gap:5px;border-radius:var(--r-pill);border:0;
  font-weight:550;line-height:1.55;white-space:nowrap;
}
.tag{font-size:10.5px;padding:1px 8px;margin-left:5px;background:rgba(0,47,167,.12);color:var(--teal-600)}
.pill{font-size:11px;padding:2px 9px;background:rgba(102,110,138,.12);color:var(--muted);font-weight:500}
/* 圆点统一 6px，颜色永远跟着文字（currentColor），底永远同色 12% 透明、无边框 */
.tag::before,.pill::before{
  content:"";width:6px;height:6px;border-radius:50%;background:currentColor;flex:0 0 6px;
}
/* 语义色：pending=琥珀 · approved=绿 · rejected=红 · draft=灰 */
.tag.amber,.pill.warn{background:rgba(232,163,61,.12);color:var(--warn-fg)}
/* 灰胶囊文字比 --muted 再深一档：#5F6783 on 灰 12% 底 = 4.82:1
   （--muted #666E8A 只有 4.35:1，同色 12% 底会被稀释，差一点点不合格） */
.tag.gray,.pill.gray,.pill.draft{background:rgba(102,110,138,.12);color:#5F6783}
.tag.green,.pill.ok,.pill.approved{background:rgba(20,107,64,.12);color:var(--ok-fg)}
.tag.bad,.pill.bad,.pill.rejected{background:rgba(165,54,42,.12);color:var(--bad-fg)}
.pill.info,.pill.pending{background:rgba(0,47,167,.12);color:var(--teal-600)}
/* 只想加字、不要圆点时用 .plain */
.tag.plain::before,.pill.plain::before{display:none}

/* ============================================================
   提示条
   ============================================================ */
/* 看板筛选提示条（标题下方小字 + 清除链接） */
.filter-note{
  font-size:12px;color:var(--muted);background:var(--teal-050);
  border:1px solid var(--teal-100);border-radius:9px;
  padding:5px 11px;margin-bottom:12px;display:flex;align-items:center;gap:8px;flex-wrap:wrap;
}
.filter-note b{color:var(--teal-600);font-weight:600}
.filter-note .lnk{margin-left:auto;font-size:12px}
.note-bar{background:var(--amber-050);border:1px solid #f0dcb4;color:#7a4d0a;border-radius:10px;padding:8px 12px;font-size:12px;margin-bottom:12px}
.note-bar.err{background:var(--bad-bg);border-color:#f2d5d1;color:var(--bad-fg)}
.note-bar.ok{background:var(--ok-bg);border-color:#cfe4d6;color:var(--ok-fg)}
.note-bar.info{background:var(--teal-050);border-color:var(--teal-100);color:var(--teal-600)}

/* ============================================================
   KPI 卡：eyebrow → 数值 → 副行；顶边左侧 36px 短色条
   ============================================================ */
.kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:16px}
.kpis.k5{grid-template-columns:repeat(5,1fr)}
.kpis.k4{grid-template-columns:repeat(4,1fr)}
.kpi{
  position:relative;background:#fff;border:1px solid var(--line);border-radius:var(--r-card);
  box-shadow:var(--sh-1);padding:15px 16px;overflow:hidden;transition:var(--tr);min-width:0;
}
/* 顶边短色条：只占左侧 36px，圆角 2px。用 ::before，不加 DOM */
.kpi::before{
  content:"";position:absolute;top:0;left:0;width:36px;height:2px;border-radius:2px;background:var(--teal);
}
.kpi.is-bad::before{background:var(--bad-fg)}
.kpi.is-ok::before{background:var(--ok-fg)}
.kpi:hover{border-color:#C9D5F5;box-shadow:var(--sh-2)}
/* Financial summaries share one label/value/note hierarchy. */
.kpi .lbl{
  font-size:12px;letter-spacing:.02em;color:var(--muted);
  display:flex;align-items:center;gap:5px;font-weight:550;
}
.kpi .val{
  font-size:25px;font-weight:650;margin-top:8px;font-variant-numeric:tabular-nums;overflow-wrap:anywhere;
  letter-spacing:-.02em;line-height:1.25;
}
.kpi .note{font-size:11px;color:var(--muted-2);margin-top:7px;line-height:1.65;overflow-wrap:anywhere}
/* 负值：红色 + 650 字重 + 原样负号，不加底色 */
.kpi .val.neg{color:var(--bad-fg);font-weight:650}
.kpi .val.mute{color:var(--muted-2);font-size:15px;font-weight:500;padding:4px 0;letter-spacing:0}

/* ============================================================
   可编辑单元格：待填=琥珀，正在编辑=蓝色环（两种状态一眼区分）
   ============================================================ */
.cellinput{
  width:100%;min-width:58px;border:1px solid #ecd9b6;background:var(--editable);border-radius:5px;
  padding:3px 6px;font:inherit;font-size:12px;text-align:right;font-variant-numeric:tabular-nums;
  transition:var(--tr);
}
.cellinput:hover{border-color:var(--amber-600)}
.cellinput:focus{outline:none;border-color:var(--teal);box-shadow:0 0 0 3px rgba(0,47,167,.14);background:#fff}
.cellinput.dirty{background:#FFF8E8;border-color:var(--amber-600)}
.cellinput.dirty:focus{background:#fff;border-color:var(--teal);box-shadow:0 0 0 3px rgba(0,47,167,.14)}
.cellinput.bad{border-color:#dda9a1;background:#fff6f5}
.ro-cell{color:var(--muted)}

/* ============================================================
   时间线 / 流程行 / 栅格
   ============================================================ */
.timeline{display:flex;gap:0;margin:4px 0 2px;align-items:flex-start}
.tl-step{flex:1;position:relative;font-size:11.5px;color:var(--muted);padding-top:16px}
.tl-step::before{content:"";position:absolute;top:0;left:0;right:0;height:4px;background:var(--line-soft);border-radius:2px}
.tl-step.done::before{background:var(--teal)}
.tl-step.cur::before{background:var(--amber)}
.tl-step .dot{position:absolute;top:-3px;left:0;width:10px;height:10px;border-radius:50%;background:#C9D2E8;border:2px solid #fff}
.tl-step.done .dot{background:var(--teal)}
.tl-step.cur .dot{background:var(--amber)}
.tl-step b{display:block;color:var(--ink-2);font-weight:600}
.tl-step .meta{font-size:11px;color:var(--muted-2);margin-top:2px}
.flow-split{display:grid;grid-template-columns:1.25fr 1fr;gap:12px}
.flows{display:flex;flex-direction:column;gap:0}
.flow-row{display:flex;justify-content:space-between;gap:10px;padding:7px 10px;border-bottom:1px solid var(--line-soft);font-size:12.5px;align-items:center}
.flow-row:last-child{border-bottom:0}
.flow-row .l{display:flex;gap:7px;align-items:center;color:var(--ink-2)}
.flow-row .v{font-variant-numeric:tabular-nums;font-weight:500}
.flow-row .v.neg{color:var(--bad-fg)}
.flow-row .v.mute{color:var(--muted-2);font-weight:400}
.flow-row.big{background:var(--teal-050);font-weight:600;color:var(--teal)}
.flow-row.big .v{font-weight:700}
.grid2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
.grid3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
.grid2-3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
.sub-hd{font-size:12px;color:var(--muted);margin:0 0 7px;display:flex;align-items:center;gap:6px}
.legend{display:flex;gap:12px;font-size:11.5px;color:var(--muted);flex-wrap:wrap}
.legend i{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:4px;vertical-align:-1px}
.inline-note{font-size:11.5px;color:var(--muted);margin-top:6px;line-height:1.7}
.bar-mini{height:5px;background:var(--line-soft);border-radius:3px;overflow:hidden;min-width:52px;display:inline-block;vertical-align:middle;width:64px}
.bar-mini i{display:block;height:100%;background:var(--teal)}
.bar-mini i.low{background:var(--bad-fg)}

/* ============================================================
   图表容器（SVG 由 charts.js 生成）
   ============================================================ */
.chart{width:100%;height:auto;display:block;overflow:visible}
.chart-empty{height:150px;display:grid;place-items:center;color:var(--muted-2);font-size:12px;border:1px dashed var(--line);border-radius:var(--r-card);background:#FAFBFE}
/* 图表 tooltip：白底细边、跟随鼠标，超出右边时翻到左侧（方向由 JS 打 data-flip） */
.chart-tip{
  position:fixed;z-index:70;pointer-events:none;opacity:0;
  background:#fff;border:1px solid var(--line);border-radius:8px;box-shadow:var(--sh-2);
  padding:6px 9px;font-size:12px;color:var(--ink);line-height:1.55;white-space:nowrap;
  transition:opacity .12s var(--ease);font-variant-numeric:tabular-nums;
}
.chart-tip.on{opacity:1}
.chart-tip .tk{color:var(--muted);font-size:11px;margin-right:6px}
.chart-tip b{font-weight:650}
.chart-tip .dot{display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:5px;vertical-align:0}
.chart rect.bar{transition:fill var(--t) var(--ease)}
.chart rect.bar:hover{fill:var(--teal-600)}
.chart rect.bar.bad:hover{fill:#8E2C22}

.empt{padding:26px 10px;text-align:center;color:var(--muted);font-size:12.5px}
.empt b{display:block;color:var(--ink-2);margin-bottom:4px;font-size:13px}
.empty{padding:18px 0;color:var(--muted);font-size:12.5px}

/* ============================================================
   登录页：全屏克莱因蓝径向底 + 网格纹理 + 右上软光斑
   ============================================================ */
.login-wrap{
  position:relative;width:100%;min-height:100vh;display:grid;place-items:center;padding:40px 0;overflow:hidden;
  background:radial-gradient(1200px 620px at 18% -10%,#1E4BE0 0%,#002FA7 40%,#000E33 100%);
}
/* 同侧栏的 40px 网格，透明度 .05 */
.login-wrap::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:
    repeating-linear-gradient(0deg,rgba(255,255,255,.05) 0 1px,transparent 1px 40px),
    repeating-linear-gradient(90deg,rgba(255,255,255,.05) 0 1px,transparent 1px 40px);
}
/* 右上角一团软光斑 */
.login-wrap::after{
  content:"";position:absolute;top:-160px;right:-120px;width:620px;height:620px;border-radius:50%;
  background:radial-gradient(circle,rgba(108,138,234,.22) 0%,rgba(108,138,234,0) 70%);
  pointer-events:none;
}
.login-card{
  position:relative;z-index:1;width:380px;max-width:calc(100vw - 32px);background:#fff;
  border-radius:14px;box-shadow:0 24px 60px -12px rgba(0,10,40,.45);padding:28px;overflow:hidden;
}
/* 卡片顶部 2px 克莱因蓝细条（占满宽） */
.login-card::before{content:"";position:absolute;top:0;left:0;right:0;height:2px;background:var(--teal)}
.login-card .mk{width:40px;height:40px;border-radius:10px;background:var(--amber);color:#3d2a08;display:grid;place-items:center;font-weight:700;font-size:19px;margin:0 auto 12px}
.login-card h2{text-align:center;margin:0 0 4px;font-size:16px;letter-spacing:-.01em}
.login-card p{text-align:center;margin:0 0 18px;font-size:12px;color:var(--muted)}
.login-card label{display:block;font-size:12px;color:var(--muted);margin-bottom:5px}
.login-card input{
  width:100%;font:inherit;font-size:13px;padding:8px 10px;border:1px solid var(--line);
  border-radius:var(--r-btn);margin-bottom:13px;background:#fff;transition:var(--tr);
}
.login-card input:focus{outline:none;border-color:var(--teal);box-shadow:0 0 0 3px rgba(0,47,167,.14)}
.login-card .btn{width:100%;padding:9px;font-size:13px}
/* 登录失败：只有一条淡红提示，不闪红框 */
.login-err{background:var(--bad-bg);color:var(--bad-fg);border:0;border-radius:var(--r-btn);padding:8px 11px;font-size:12px;margin-bottom:12px;line-height:1.6;font-weight:500}

/* ============================================================
   弹窗 / Toast / 加载
   ============================================================ */
.modal-mask{position:fixed;inset:0;background:rgba(16,21,40,.38);display:grid;place-items:center;z-index:60;padding:20px;backdrop-filter:blur(2px)}
.modal{background:#fff;border-radius:var(--r-card);box-shadow:0 20px 50px -12px rgba(0,10,40,.35);width:min(460px,100%);overflow:hidden;max-height:92vh;display:flex;flex-direction:column}
.modal h3{margin:0;padding:12px 16px;font-size:14px;font-weight:600;border-bottom:1px solid var(--line-soft);background:linear-gradient(180deg,#FBFCFE,#fff)}
.modal .bd{padding:14px 16px;overflow:auto}
.modal .bd p{margin:0 0 10px;font-size:12.5px;color:var(--ink-2);line-height:1.7}
.modal .ft{padding:10px 16px;border-top:1px solid var(--line-soft);display:flex;justify-content:flex-end;gap:8px;background:#FAFBFE}
.modal label{display:block;font-size:12px;color:var(--muted);margin:10px 0 5px}
.modal textarea,.modal input[type=text],.modal input[type=password],.modal input[type=number],.modal select{
  width:100%;font:inherit;font-size:12.5px;padding:7px 9px;border:1px solid var(--line);
  border-radius:var(--r-btn);background:#fff;resize:vertical;transition:var(--tr);
}
.modal textarea:focus,.modal input:focus,.modal select:focus{outline:none;border-color:var(--teal);box-shadow:0 0 0 3px rgba(0,47,167,.14)}
.toast{position:fixed;right:18px;bottom:18px;z-index:80;display:flex;flex-direction:column;gap:8px;align-items:flex-end;pointer-events:none}
.toast .t{background:var(--teal);color:#fff;font-size:12.5px;padding:8px 13px;border-radius:var(--r-btn);box-shadow:var(--sh-2);max-width:380px;line-height:1.6}
.toast .t.err{background:var(--bad-fg)}
.toast .t.ok{background:var(--ok-fg)}
.spinner{width:14px;height:14px;border:2px solid rgba(255,255,255,.45);border-top-color:#fff;border-radius:50%;display:inline-block;vertical-align:-2px;margin-right:6px;animation:spin .7s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.loading-row{padding:30px;text-align:center;color:var(--muted)}
.nowrap{white-space:nowrap}
.right{text-align:right}
.small{font-size:11.5px}
.mono{font-variant-numeric:tabular-nums}
.hr{height:1px;background:var(--line-soft);margin:12px 0}
.chk{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--ink-2)}
a.lnk{color:var(--teal-600);text-decoration:none;border-bottom:1px solid var(--teal-100);transition:var(--tr)}
a.lnk:hover{color:var(--teal-800);border-color:var(--teal-100)}
/* 按钮形态的链接（清除筛选 / 全选 / 清空）：语义是按钮，外观是链接 */
button.lnk{
  font:inherit;background:none;border:0;padding:0;cursor:pointer;color:var(--teal-600);
  border-bottom:1px solid var(--teal-100);transition:var(--tr);line-height:1.35;
}
button.lnk:hover{color:var(--teal-800);border-color:var(--teal-100)}
button.lnk:focus-visible{outline:2px solid var(--teal);outline-offset:2px;border-radius:3px}
/* 主按钮上的链接不要被 a 的颜色盖掉 */
.tabs{display:flex;gap:8px;margin-bottom:12px;flex-wrap:wrap}

/* Shared finance-style page sections, tabs and optional explanations. */
.ui-heading{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:16px}
.ui-heading h2{margin:0;font-size:18px;font-weight:650;letter-spacing:-.02em}
.ui-heading p{margin:5px 0 0;color:var(--muted);font-size:12px;line-height:1.7}
:is(.ui-tabs,.fa-tabs){display:flex;align-items:center;gap:22px;flex-wrap:wrap;border-bottom:1px solid var(--line);margin:0 0 16px;padding:0}
:is(.ui-tabs,.fa-tabs)>:is(button,a){
  display:inline-flex;align-items:center;gap:7px;min-height:40px;padding:9px 2px;
  border:0;border-bottom:3px solid transparent;border-radius:0;background:transparent;box-shadow:none;
  color:var(--muted);font:inherit;font-size:13px;font-weight:600;text-decoration:none;text-align:left;cursor:pointer;
}
:is(.ui-tabs,.fa-tabs)>:is(button,a):hover{background:transparent;color:var(--ink-2)}
:is(.ui-tabs,.fa-tabs)>:is(button,a):is([aria-selected=true],[aria-pressed=true],[aria-current=page],.on){
  color:var(--teal);background:transparent;border-bottom-color:var(--teal);box-shadow:none;
}
.ui-tabs .pill{font-size:10.5px;padding:1px 6px}
.ui-help{font-size:12px;line-height:1.7;color:var(--muted);margin:0 0 12px;min-width:0;overflow-wrap:anywhere}
.ui-help>summary{cursor:pointer;color:var(--muted);padding:5px 0;font-weight:500}
.ui-help>summary:hover,.ui-help[open]>summary{color:var(--ink-2)}
.ui-help>summary:focus-visible{outline:2px solid var(--teal);outline-offset:2px;border-radius:3px}
.ui-help>:not(summary){margin-top:8px}
.ui-help p{margin:6px 0}
.panel>.ui-help{margin:0;padding:8px 14px;border-top:1px solid var(--line-soft)}
.ui-help .kpis{margin-bottom:0}
.ui-help .note-bar{margin:8px 0}
.ui-section-note{font-size:12px;color:var(--muted);line-height:1.7;margin:0 0 12px}


.kv{display:grid;grid-template-columns:120px 1fr;gap:5px 10px;font-size:12px}
.kv .k{color:var(--muted)}
.kv .v{font-variant-numeric:tabular-nums;color:var(--ink-2)}
.grp{border:1px solid var(--line-soft);border-radius:10px;padding:10px 12px;margin-bottom:9px;background:#FAFBFE}
.grp h4{margin:0 0 8px;font-size:12px;color:var(--teal);font-weight:600;display:flex;align-items:center;gap:6px}
.grp h4::before{content:"";width:6px;height:6px;border-radius:2px;background:var(--teal)}
.frow{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:12.5px;padding:4px 0}
.frow .fl{color:var(--ink-2)}
.frow .fi{width:104px;text-align:right;border:1px solid #ecd9b6;background:var(--editable);border-radius:5px;padding:3px 7px;font:inherit;font-size:12px;font-variant-numeric:tabular-nums;transition:var(--tr)}
.frow .fi:focus{outline:none;border-color:var(--teal);box-shadow:0 0 0 3px rgba(0,47,167,.14);background:#fff}
.frow .fu{font-size:11px;color:var(--muted-2);width:26px;text-align:left}
.frow .fx{font-size:11px;color:var(--muted-2);margin-left:auto}
.diffbox{font-size:12px;border-radius:10px;padding:9px 11px;line-height:1.8}
.diffbox.good{background:var(--ok-bg);color:var(--ok-fg);border:1px solid #cfe4d6}
.diffbox.bad{background:var(--bad-bg);color:var(--bad-fg);border:1px solid #f2d5d1}
.diffbox.warn{background:var(--amber-050);color:#7a4d0a;border:1px solid #f0dcb4}
.diffbox code{background:rgba(0,0,0,.05);padding:1px 4px;border-radius:3px;font-size:11.5px}
.dlt{font-variant-numeric:tabular-nums;font-weight:600}
.dlt.up{color:var(--ok-fg)}
.dlt.down{color:var(--bad-fg)}
.mini-tbl{border-collapse:separate;border-spacing:0;width:100%;font-size:12px}
.mini-tbl th,.mini-tbl td{padding:5px 8px;border-bottom:1px solid var(--line-soft);text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
.mini-tbl th:first-child,.mini-tbl td:first-child,.mini-tbl .txt{text-align:left}
.mini-tbl th{color:var(--ink-2);font-weight:600;font-size:11px;letter-spacing:.02em;background:#F5F7FC}
.mini-tbl tr.total td{background:var(--teal-050);font-weight:650;color:var(--teal)}

@media (max-width:1180px){
  .kpis{grid-template-columns:repeat(2,minmax(0,1fr))}
  .grid2-3{grid-template-columns:repeat(2,minmax(0,1fr))}
  .flow-split{grid-template-columns:1fr}
}

/* 策略编辑弹窗：字段多，给宽一点，正文可滚 */
.modal.wide{width:min(680px,100%)}
/* 弹窗里的策略字段行：.modal input 的 100% 宽会盖掉 .fi 的定宽，这里提一级 */
.modal .frow .fi{width:104px}
.modal .frow select{width:auto;flex:0 0 130px}

/* 表头的小星号：提示这一列是本地预览，以服务端为准 */
.hint-mark{color:var(--muted-2);margin-left:2px;font-weight:400;cursor:help}

/* ============================================================
   一级分组（可折叠二级菜单）
   ------------------------------------------------------------
   .nav-group 一个分组，.nav-head 是分组标题（button，不是链接），
   .nav-subwrap 高度过渡 150ms，.chev 箭头旋转 180°。
   子项缩进比一级项多 14px，左侧 1px 竖线表示层级。
   ============================================================ */
.nav-group{display:flex;flex-direction:column}
.nav-item.nav-head{width:100%;font:inherit;font-size:13px;background:transparent;border:0;text-align:left;color:var(--rail-fg)}
.nav-item.nav-head .chev{width:15px;height:15px;margin-left:auto;flex:0 0 15px;color:var(--rail-fg-mute);transition:transform 150ms var(--ease),color var(--t) var(--ease)}
.nav-group.open .nav-item.nav-head .chev{transform:rotate(180deg)}
.nav-group.active > .nav-item.nav-head{background:rgba(255,255,255,.12);color:#fff}
.nav-group.active > .nav-item.nav-head .chev{color:var(--rail-fg-dim)}
.nav-subwrap{display:grid;grid-template-rows:0fr;transition:grid-template-rows 150ms var(--ease)}
.nav-group.open > .nav-subwrap{grid-template-rows:1fr}
.nav-sublist{overflow:hidden;display:flex;flex-direction:column;gap:1px;margin-left:11px;border-left:1px solid rgba(255,255,255,.16);padding-left:0}
.nav-sub{
  position:relative;display:flex;align-items:center;padding:6px 9px 6px calc(9px + 14px);
  border-radius:0 var(--r-btn) var(--r-btn) 0;color:var(--rail-fg-dim);font-size:12.5px;text-decoration:none;
  transition:var(--tr);
}
.nav-sub:hover{background:rgba(255,255,255,.07);color:#fff}
.nav-sub.active{background:rgba(255,255,255,.12);color:#fff;font-weight:600}
.nav-sub.active::before{content:"";position:absolute;left:-1px;top:5px;bottom:5px;width:2px;border-radius:0 2px 2px 0;background:var(--amber)}

/* 只读页顶部的灰字提示 */
.ro-note{font-size:11.5px;color:var(--muted);background:var(--teal-050);border:1px solid var(--line);border-radius:10px;padding:6px 10px;margin-bottom:12px}

/* 企业分账策略：完整月度规则与具体策略周期分析。 */
.ep-page,.ep-analysis,.ep-grid,.ep-grid>.panel{min-width:0;max-width:100%}
.ep-plan-note{padding-bottom:4px;color:var(--muted);font-size:12px}
.ep-plan{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:8px;padding:10px 14px 14px}
.ep-month{display:flex;flex-direction:column;gap:5px;min-width:0;border:1px solid var(--line);border-radius:var(--r-btn);padding:10px;background:var(--panel);color:var(--ink);font:inherit;text-align:left;cursor:pointer}
.ep-month:hover,.ep-month:focus-visible{border-color:var(--teal);box-shadow:var(--sh-1)}
.ep-month.is-custom{background:var(--amber-050);border-color:var(--amber)}
.ep-month.is-snapshot{border-bottom:3px solid var(--teal)}
.ep-month strong{font-size:12px;overflow-wrap:anywhere}
.ep-month>span:not(.ep-month-top),.ep-month small{font-size:11px;color:var(--muted)}
.ep-month .ep-month-link{color:var(--teal);margin-top:auto;padding-top:4px}
.ep-month-top{display:flex;align-items:center;justify-content:space-between;gap:4px;flex-wrap:wrap}
.ep-month-top b{font-size:12px}
.ep-analysis-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin:22px 0 12px}
.ep-analysis-head h2{margin:0;font-size:14px;font-weight:600}
.ep-analysis-head .ctl{min-width:0;max-width:100%;flex-wrap:wrap}
.ep-analysis-head select{max-width:100%;min-width:0;width:min(440px,100%);text-overflow:ellipsis}
.ep-scope{border:1px solid var(--line);background:var(--panel);padding:14px 16px;margin-bottom:16px;border-radius:var(--r-card)}
.ep-scope h3{margin:0 0 8px;font-size:14px;overflow-wrap:anywhere}
.ep-scope dl{display:grid;grid-template-columns:110px minmax(0,1fr);gap:6px;margin:0;font-size:12px}
.ep-scope dt{color:var(--muted)}
.ep-scope dd{margin:0;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}
.ep-scope p,.ep-detail p{font-size:12px;color:var(--muted);line-height:1.7;margin:10px 0 0;overflow-wrap:anywhere}
.ep-kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr))}
.ep-kpis .kpi{min-width:0}.ep-kpis .val{overflow-wrap:anywhere}
.ep-ladder{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:0;padding:6px 14px}
.ep-ladder>div{display:grid;gap:5px;padding:10px 4px;border-bottom:1px solid var(--line-soft);min-width:0}
.ep-ladder span{font-size:12px;color:var(--muted)}
.ep-ladder strong{font-size:15px;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}
.ep-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}
.ep-table{overflow:auto;max-width:100%;max-height:420px;overscroll-behavior:contain}
.ep-table .tbl{min-width:540px}.ep-table .tbl th{white-space:nowrap}
.ep-detail{min-width:0}.ep-detail h4{margin:0;font-size:15px;overflow-wrap:anywhere}
.ep-detail .note-bar{margin:12px 0}
.ep-prices{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin:12px 0}
.ep-prices>div{display:grid;gap:5px;min-width:0;padding:12px;background:var(--panel);border:1px solid var(--line);border-radius:var(--r-btn)}
.ep-prices span,.ep-prices small{font-size:11px;color:var(--muted)}
.ep-prices strong{font-size:18px;overflow-wrap:anywhere}
.ep-modal{max-width:calc(100vw - 24px)}
@media(max-width:1100px){.ep-plan{grid-template-columns:repeat(4,minmax(0,1fr))}}
@media(max-width:760px){.ep-plan{grid-template-columns:repeat(3,minmax(0,1fr))}.ep-grid{grid-template-columns:minmax(0,1fr)}.ep-kpis,.ep-ladder{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:480px){.ep-plan{grid-template-columns:repeat(2,minmax(0,1fr));padding:10px;gap:6px}.ep-analysis-head{align-items:stretch}.ep-analysis-head .ctl{width:100%}.ep-analysis-head select{width:100%}.ep-scope{padding:10px}.ep-scope dl{grid-template-columns:84px minmax(0,1fr)}.ep-prices{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* ============================================================
   运营 · 学年管理：卡片式学年清单
   ------------------------------------------------------------
   一个学年一张卡，卡片是信息块（区间 / 台账月 / 默认策略 / 备注 / 操作）。
   宽屏固定两列（不是 auto-fill：1440 下 auto-fill 会排成三列，区间与备注被挤成两行），
   视口 < 1140（内容区再减 208 侧栏后每张不足 ~450px）落单列。
   颜色一律用现有变量，没有新增色。
   ============================================================ */
.yc-summary{font-size:12px;color:var(--muted);margin-bottom:12px}
.yc-footnote{
  display:flex;justify-content:space-between;gap:8px 12px;flex-wrap:wrap;
  margin-top:12px;font-size:12px;color:var(--muted);
}
.yc-grid{
  display:grid;gap:12px;align-items:start;
  grid-template-columns:repeat(2,minmax(0,1fr));
}
/* 内容区 = 视口 − 208 侧栏；视口 < 1140 时两列每张不足 ~450px，改单列 */
@media (max-width:1139px){
  .yc-grid{grid-template-columns:minmax(0,1fr)}
}
.yc-card{
  position:relative;overflow:hidden;
  border:1px solid var(--line);border-radius:var(--r-card);background:var(--panel);
  box-shadow:var(--sh-1);padding:16px;transition:var(--tr);
  display:flex;flex-direction:column;gap:12px;min-width:0;
}
.yc-card:hover{border-color:var(--teal-100)}
/* 头：学年名 + 当前标记，右侧状态胶囊 */
.yc-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.yc-name{
  font-size:14px;font-weight:600;color:var(--ink);letter-spacing:-.01em;
  display:flex;align-items:center;gap:6px;flex-wrap:wrap;min-width:0;
}
.yc-top .tag{margin-left:0}
.yc-top .st{margin-left:auto}
/* Period, business context and actions remain compact within each card. */
.yc-period{font-size:12px;color:var(--muted);font-variant-numeric:tabular-nums}
.yc-kv{
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;
  padding:12px 0;border-top:1px solid var(--line-soft);border-bottom:1px solid var(--line-soft);
}
.yc-kv .k,.yc-note .k{font-size:12px;color:var(--muted);margin-bottom:4px}
.yc-kv .v{display:block;font-size:16px;font-weight:600;color:var(--ink-2);font-variant-numeric:tabular-nums;overflow-wrap:anywhere}
.yc-kv .v.mono{font-variant-numeric:tabular-nums}
/* 没有这一项（学年还没进 years 表）：灰字 —，不是 0 */
.yc-kv .v.na{color:var(--muted-2)}
.yc-note{
  font-size:12px;color:var(--muted);line-height:1.6;overflow-wrap:anywhere;
}
.yc-note .na{color:var(--muted-2)}
.yc-note .rej{color:var(--bad-fg)}
.yc-ops{display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding-top:12px;border-top:1px solid var(--line-soft)}
.yc-ops .ro{font-size:12px;color:var(--muted-2)}
/* 空态：没有学年时占满一行 */
.yc-empty{
  padding:18px 4px;font-size:12.5px;color:var(--muted);
}

/* 填报月份：单选语义、横向选择带，窄屏仅在带内滚动。 */
.fill-months{display:flex;gap:6px;min-width:0;margin:0 0 14px;padding:0 0 6px;border:0;overflow-x:auto;overscroll-behavior-x:contain}
.fill-months legend{font-size:12px;color:var(--muted);margin-bottom:8px;padding:0}
.fill-month{position:relative;flex:1 0 72px;cursor:pointer}
.fill-month input{position:absolute;opacity:0;width:1px;height:1px}
.fill-month > span{display:grid;gap:3px;text-align:center;padding:9px 6px;border:1px solid var(--line);border-radius:var(--r-btn);background:var(--panel);color:var(--muted);white-space:nowrap}
.fill-month strong{font-size:14px;font-weight:600;color:var(--ink)}
.fill-month small{font-size:11px}
.fill-month input:checked + span{background:var(--teal);border-color:var(--teal);color:#fff}
.fill-month input:checked + span strong{color:inherit}
.fill-month input:focus-visible + span{outline:2px solid var(--teal);outline-offset:2px}
.fill-months:disabled .fill-month{cursor:wait;opacity:.6}

/* 学年申请：表单保持固定，只有学校表格区域滚动。 */
.modal.oy-modal{width:min(880px,100%);height:min(740px,calc(100dvh - 40px));max-height:none}
.oy-modal > h3,.oy-modal > .ft{flex-shrink:0}
.oy-modal > .bd{flex:1;min-height:0;overflow:hidden;padding:12px 16px}
.oy-form{height:100%;display:grid;grid-template-rows:auto auto minmax(0,1fr) auto;gap:12px}
.oy-section{min-width:0}
.oy-section + .oy-section{border-top:1px solid var(--line-soft);padding-top:10px}
.oy-section h4{font-size:13px;color:var(--ink);margin:0 0 6px}
.oy-section-head{display:flex;align-items:center;justify-content:space-between;gap:12px}
.oy-section-head h4{margin:0}
.modal .oy-help{font-size:11.5px;color:var(--muted);line-height:1.4;margin:5px 0}
.modal .oy-section label{margin:0;min-width:0;display:grid;gap:4px}
.oy-year-row{display:grid;grid-template-columns:140px 1fr;gap:16px;align-items:end}
.oy-range{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:7px 0;font-size:11.5px;color:var(--muted)}
.oy-range strong{font-size:13px;font-weight:500;color:var(--ink-2);font-variant-numeric:tabular-nums}
.oy-prices{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
.oy-unit{position:relative}
.modal .oy-unit input{padding-right:30px}
.oy-unit span{position:absolute;right:10px;top:7px;font-size:12px;color:var(--muted)}
.oy-school-section{display:flex;flex-direction:column;min-height:0}
.oy-school-section > :not(.oy-table-scroll){flex-shrink:0}
.oy-table-scroll{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;border:1px solid var(--line);border-radius:var(--r-btn);scrollbar-gutter:stable}
.oy-school-table{width:100%;min-width:580px;border-collapse:separate;border-spacing:0;table-layout:fixed;font-size:12px}
.oy-school-table th{position:sticky;top:0;z-index:1;background:var(--panel);text-align:left;font-weight:500;color:var(--muted)}
.oy-school-table th,.oy-school-table td{padding:5px 8px;border-bottom:1px solid var(--line-soft)}
.oy-school-table th:first-child{width:var(--table-key-width,156px)}
.oy-school-table th:nth-child(2){width:140px}
.oy-school-table th:nth-child(3){width:180px}
.oy-school-table th:nth-child(4){width:104px}
.oy-school-table tbody tr:last-child td{border-bottom:0}
.modal .oy-section input[type=text],.modal .oy-section input[type=number]{padding:5px 8px;min-width:0}
.modal .oy-school-table input[type=number]{text-align:right}
.oy-remove{color:var(--bad-fg);white-space:nowrap}
.modal .oy-note-section{display:grid;grid-template-columns:70px minmax(0,1fr);gap:10px;align-items:start}
.modal .oy-note-section label{padding-top:7px}
.modal .oy-note-section textarea{resize:none;padding:6px 8px}
@media(max-width:700px){
  .oy-prices{grid-template-columns:repeat(2,minmax(0,1fr))}
  .oy-year-row{grid-template-columns:110px 1fr;gap:10px}
  .oy-range{display:grid;gap:3px}
  .oy-form{gap:8px}
  .oy-section + .oy-section{padding-top:8px}
}
@media(max-height:600px){
  .oy-modal > h3,.oy-modal > .ft{padding-top:7px;padding-bottom:7px}
  .oy-modal > .bd{padding-top:8px;padding-bottom:8px}
  .oy-form{gap:6px}
  .oy-section + .oy-section{padding-top:6px}
  .oy-section h4{margin-bottom:3px}
}

/* ============================================================
   运营 · 学年内子导航
   ------------------------------------------------------------
   顶栏之下提供当前学年、页面入口与返回列表，三角色共用页签样式。
   ============================================================ */
.ynav{
  display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  padding:8px 18px;border-bottom:1px solid var(--line);
  background:var(--panel);position:sticky;top:60px;z-index:4;
}
.ynav-lbl{
  font-size:11.5px;color:var(--muted);white-space:nowrap;
  font-variant-numeric:tabular-nums;
}
.ynav-tabs{display:flex;align-items:center;gap:22px;flex-wrap:wrap}
.ynav-tabs.ui-tabs{margin:0;border-bottom:0}
.ynav-i{font-size:12px;color:var(--muted);text-decoration:none;padding:7px 2px;border-bottom:3px solid transparent;transition:var(--tr);white-space:nowrap}
.ynav-i:hover{color:var(--ink-2)}
.ynav-i.on{color:var(--teal);border-bottom-color:var(--teal);font-weight:600}
.ynav-back{
  margin-left:auto;font-size:11.5px;color:var(--muted);text-decoration:none;
  border-bottom:1px solid var(--line);transition:var(--tr);white-space:nowrap;
}
.ynav-back:hover{color:var(--teal-600);border-bottom-color:var(--teal-100)}
/* 学年卡片上的「进入」：主按钮样式的链接（a 上没有 .btn 的默认行高，补一下） */
.yc-ops a.btn{display:inline-block;text-decoration:none;line-height:1.5}
@media (max-width:1139px){
  .ynav{top:auto;position:static}
}

/* 运营策略：默认基准只读，自定义策略融合审批，月度适用策略独立展示。 */
.op-intro{font-size:12px;color:var(--muted);margin-bottom:14px;line-height:1.6}
.op-tabs{margin-bottom:16px}
.op-tab:focus-visible{outline:2px solid var(--teal);outline-offset:2px}
.op-muted{font-size:12px;color:var(--muted);line-height:1.6;font-weight:400}
.op-actions{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.op-section-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin:0 0 10px}
.op-section-head h2,.op-section-head h3,.op-section-head h4{margin:0;font-size:14px;font-weight:600}
.op-section-head p{margin:4px 0 0}
.op-prices{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
.op-prices > div{display:grid;gap:5px;padding:12px;background:var(--panel);border:1px solid var(--line);border-radius:var(--r-btn)}
.op-prices span,.op-prices small{font-size:11.5px;color:var(--muted)}
.op-prices strong{font-size:20px;font-weight:600;color:var(--ink);font-variant-numeric:tabular-nums}
.op-context{font-size:12px;color:var(--muted);line-height:1.7;margin:12px 0}
.op-request-box{display:flex;flex-direction:column;gap:10px;padding:10px 12px;margin:0 0 12px;border:1px solid var(--line);border-radius:var(--r-btn);background:var(--panel)}
.op-request-box.is-pending{border-color:var(--warn-fg);background:var(--amber-050)}
.op-request-box.is-rejected{border-color:var(--bad-fg);background:var(--bad-bg)}
.op-request-box.is-draft{border-style:dashed}
.op-request-main{display:grid;gap:4px;min-width:0;overflow-wrap:anywhere}
.op-request-main strong{margin:0 6px 0 8px;font-size:13px;color:var(--ink)}
.op-request-desc{font-size:12px;color:var(--ink-2);line-height:1.5}
.op-request-box .rej{font-size:12px;color:var(--bad-fg);line-height:1.4}
.op-history-details{margin-top:10px;border-top:1px solid var(--line-soft);padding-top:8px}
.op-history-details summary{font-size:12px;color:var(--muted);cursor:pointer}
.op-history-list{list-style:none;margin:8px 0 0;padding:0;display:grid;gap:6px}
.op-history-list li{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;font-size:11.5px;padding:6px 0;border-bottom:1px dashed var(--line-soft);overflow-wrap:anywhere}
.op-history-list li:last-child{border-bottom:0}
.op-custom-card.is-draft-card{border-style:dashed}
.op-legacy-default{padding:12px;margin:12px 0;background:var(--amber-050);border:1px solid var(--line);border-radius:var(--r-btn);font-size:12px;line-height:1.6}
.op-legacy-default p{margin:4px 0 8px}
.op-school-scroll{max-height:350px;overflow:auto;border:1px solid var(--line-soft);border-radius:var(--r-btn)}
.op-school-scroll th,.op-editor-school-scroll th{position:sticky;top:0;z-index:1}
.op-plan{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:8px;padding:12px 14px}
.op-plan-month{display:grid;gap:5px;padding:10px;border:1px solid var(--line);border-radius:var(--r-btn);min-width:0;background:var(--panel);font:inherit;text-align:left;cursor:pointer}
.op-plan-month.is-custom{border-color:var(--amber);background:var(--amber-050)}
.op-plan-month.is-snapshot{border-bottom:3px solid var(--teal)}
.op-plan-month:hover{box-shadow:var(--sh-1);border-color:var(--teal-600)}
.op-plan-month:focus-visible{outline:2px solid var(--teal);outline-offset:2px}
.op-plan-month span,.op-plan-month small{font-size:11px;color:var(--muted)}
.op-plan-month strong{font-size:12px;font-weight:500;overflow-wrap:anywhere}
.op-custom-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;align-items:stretch}
.op-custom-card{margin:0;min-width:0;display:flex;flex-direction:column}
.op-custom-card .panel-bd{flex:1}
.op-custom-card .op-prices{grid-template-columns:repeat(2,minmax(0,1fr))}
.op-custom-card .op-prices strong{font-size:16px}
.modal.op-editor{width:min(900px,100%);height:min(740px,calc(100dvh - 40px));max-height:none}
.op-editor > h3,.op-editor > .ft{flex-shrink:0}
.op-editor > .bd{flex:1;min-height:0;overflow:hidden}
.op-editor-form{height:100%;display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto minmax(0,1fr) auto;gap:14px}
.op-editor-form > *{min-width:0}
.op-editor-info{display:grid;grid-template-columns:minmax(0,2fr) repeat(2,minmax(0,1fr));gap:12px}
.op-editor .op-context{margin:0}
.op-editor label{margin:0;display:grid;gap:5px;min-width:0}
.op-editor input[type=month]{width:100%;min-width:0;font:inherit;font-size:12.5px;padding:7px 9px;border:1px solid var(--line);border-radius:var(--r-btn);background:var(--panel)}
.op-editor-price-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
.op-editor-school{min-height:0;display:flex;flex-direction:column}
.op-editor-school .op-section-head{flex-shrink:0}
.op-editor label.op-inherit{display:flex;align-items:center;font-size:12px;gap:6px}
#opSchoolWrap{flex:1;min-height:0;display:flex;flex-direction:column;gap:8px}
.op-editor-school-scroll{flex:1;min-height:0;overflow:auto;border:1px solid var(--line);border-radius:var(--r-btn)}
.op-editor-school-scroll .tbl{min-width:620px}
#opSchoolWrap.is-inherited .op-editor-school-scroll{opacity:.5}
.op-editor-school .op-actions{flex-shrink:0}
.op-editor .op-editor-note{display:grid;grid-template-columns:70px minmax(0,1fr);align-items:start}
.op-editor-note textarea{resize:none}
@media(max-width:1100px){.op-custom-grid{grid-template-columns:1fr}.op-plan{grid-template-columns:repeat(4,minmax(0,1fr))}}
@media(max-width:700px){
  .op-prices,.op-editor-price-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .op-plan{grid-template-columns:repeat(2,minmax(0,1fr))}
  .op-editor-info{grid-template-columns:repeat(2,minmax(0,1fr))}.op-editor-info > label:first-child{grid-column:1/-1}
  .op-editor-form{gap:10px}
}

/* 月度核算：审核优先，收付进度独立展示。 */
.fa-page{min-width:0;max-width:100%}
.fa-page [hidden]{display:none!important}
.fa-header{display:flex;justify-content:space-between;align-items:center;gap:12px;margin:0 0 12px}
.fa-header h2{font-size:17px;margin:0 0 6px}
.fa-meta,.fa-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.fa-meta{font-size:11.5px;color:var(--muted)}
.fa-actions{flex-shrink:0}
.fa-kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
.fa-kpi{min-width:0;padding:12px 14px;background:var(--panel);border:1px solid var(--line);border-radius:var(--r-card);display:grid;gap:5px}
.fa-kpi>span{font-size:12px;color:var(--ink-2)}
.fa-kpi strong{font-size:25px;font-weight:600;line-height:1.25;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}
.fa-kpi small{font-size:11px;color:var(--muted)}
.fa-kpi-variance{border-color:var(--amber);background:var(--amber-050)}
.fa-kpi-variance strong{color:var(--warn-fg)}
.fa-audit-status{font-size:12px;padding:10px 2px;color:var(--muted);overflow-wrap:anywhere}
.fa-audit-status strong{color:var(--ink-2)}
.fa-tabs{margin-bottom:12px}
.fa-page .panel{min-width:0;margin-bottom:12px}
.fa-page .panel-hd{gap:10px;flex-wrap:wrap}
.fa-filter{display:flex;align-items:center;gap:6px;font-size:12px;white-space:nowrap}
.fa-page .tbl-wrap{min-width:0;max-width:100%;overflow:auto}
.fa-school-scroll{max-height:330px}
.fa-school-scroll .tbl{min-width:900px}
.fa-school-scroll th{position:sticky;top:0;z-index:1;background:var(--bg)}
.fa-school-scroll .fa-variance td{background:var(--amber-050)}
.fa-caption{font-size:11.5px;color:var(--muted);line-height:1.65;padding:9px 14px;overflow-wrap:anywhere}
.fa-adjustment{margin-top:6px;min-width:180px;max-width:280px;white-space:normal;overflow-wrap:anywhere;font-size:11.5px}
.fa-adjustment summary{color:var(--muted);cursor:pointer}
.fa-adjustment dl{margin:8px 0 0}
.fa-adjustment dt{color:var(--muted)}
.fa-adjustment dd{margin:2px 0 8px;white-space:pre-wrap}
.fa-detail h3{font-size:12px;color:var(--ink-2);margin:0 0 5px;font-weight:600}
.fa-history{margin-top:10px;border-top:1px solid var(--line-soft);padding-top:8px}
.fa-history summary{color:var(--muted);font-size:12px;cursor:pointer}
.fa-history .tbl{min-width:560px;margin-top:8px}
.fa-progress{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
.fa-progress .flow-row{gap:12px;flex-wrap:wrap}
.fa-progress .flow-row .l{font-size:12px;flex-wrap:wrap}
.fa-detail{min-width:0;overflow-wrap:anywhere;font-size:12px}
.fa-detail h3:not(:first-child){margin-top:16px}
.fa-detail .fa-caption{padding:10px 0}
.fa-inputs{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:8px 0 16px}
.fa-inputs>div{min-width:0;padding:8px;background:var(--bg);border-radius:var(--r-btn)}
.fa-inputs dt{font-size:11px;color:var(--muted)}
.fa-inputs dd{margin:3px 0 0;font-weight:600;font-variant-numeric:tabular-nums}
@media(max-width:1000px){.fa-header{align-items:flex-start;flex-wrap:wrap}.fa-kpi strong{font-size:21px}.fa-progress{grid-template-columns:minmax(0,1fr)}}
@media(max-width:650px){
  .fa-kpis{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
  .fa-kpi{padding:10px}.fa-kpi strong{font-size:21px}
  .fa-inputs{grid-template-columns:repeat(2,minmax(0,1fr))}
  .fa-header h2{font-size:15px}.fa-meta{gap:6px}
  .fa-actions{width:100%}.fa-actions .btn{flex:1}
  .fa-page .panel-hd,.fa-page .panel-bd{padding:10px}
  .fa-caption{padding:8px 10px}.fa-school-scroll{max-height:390px}
}

/* Narrow screens retain full content width; navigation opens as a separate drawer. */
.nav-toggle,.nav-close,.nav-scrim{display:none}
@media(max-width:760px){
  .main{margin-left:0;width:100%}
  .content{padding:14px 12px 28px}
  .topbar{padding:9px 12px;gap:8px}
  .tb-left{flex:1 0 auto;min-width:0}.tb-left h1{font-size:15px;white-space:nowrap}
  .tb-right{gap:8px;max-width:100%}.ctl{min-width:0;flex-wrap:wrap}
  .rail{transform:translateX(-100%);width:min(280px,calc(100vw - 48px));z-index:51;transition:transform var(--t) var(--ease)}
  .app.nav-open .rail{transform:translateX(0)}
  .nav-toggle{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;flex:0 0 32px;padding:6px;border:1px solid var(--line);border-radius:var(--r-btn);background:var(--panel);color:var(--ink-2);cursor:pointer}
  .nav-toggle svg{width:18px;height:18px}
  .nav-close{display:block;position:absolute;right:12px;top:16px;border:0;background:transparent;color:var(--rail-fg);font:inherit;font-size:22px;line-height:24px;cursor:pointer}
  .rail .brand{padding-right:24px}
  .app.nav-open .nav-scrim{display:block;position:fixed;inset:0;z-index:50;border:0;padding:0;background:rgba(16,21,40,.38)}
  body.navigation-open{overflow:hidden}
  .ynav{padding:8px 12px;gap:6px 12px}.ynav-tabs{gap:16px}
  .panel-hd,.panel-bd{padding:12px}.panel-ft{padding:9px 12px}
  .grid2,.grid3,.grid2-3{grid-template-columns:minmax(0,1fr)}
  .kpis,.kpis.k4,.kpis.k5{grid-template-columns:repeat(2,minmax(0,1fr))}
  .kpi{padding:12px}.kpi .val{font-size:21px}
  .modal-mask{padding:12px}.modal .bd{padding:12px;min-width:0}
  .ui-tabs{gap:16px}.ui-heading h2{font-size:16px}
}
@media(max-width:380px){.kpis,.kpis.k4,.kpis.k5{grid-template-columns:minmax(0,1fr)}}

/* ============================================================
   无障碍：系统开了「减少动态效果」就全关
   ============================================================ */
@media (prefers-reduced-motion:reduce){
  *{transition:none!important;animation:none!important}
}
