/* 基础配色：主题模块（css/theme.css）会在 :root 上给出 --ml-* 变量，
 * 这里用「带回退值」的形式接上 —— var(--ml-x, 原值)。
 * 关键：**主题文件没加载 / 加载失败时，这些变量取不到 → 自动落回后面的原值，
 * 视觉与接主题之前 100% 一致**（这是一条硬要求，不许改一处就变一处）。
 * 只接最主的五处（面板底色 / 正文色 / 次要文字色 / 分隔线 / 卡片阴影），
 * 不做全站重做：目的是「切夜间主题时卡片跟着变深、文字跟着变浅」。
 * 面板底色刻意用 --ml-card-eff（实色等效值）而不是 --ml-card（半透明）：
 * #topbar 是 sticky 且 z-index 高，半透明会让滚动内容从顶栏底下透出来。 */
:root{
  --bg:#f5f7fa;
  --panel:var(--ml-card-eff, #ffffff);
  --txt:var(--ml-text, #1f2733);
  --muted:var(--ml-text-sub, #8a97a8);
  --line:var(--ml-line, #e8edf3);
  --blue:#2f6df6; --red:#e5484d; --green:#21a366; --gold:#e6a23c;
  --shadow:var(--ml-shadow, 0 2px 10px rgba(31,39,51,.06)); --radius:12px;
  --tb-size:34px;
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent;}
html,body{margin:0;padding:0;background:var(--bg);color:var(--txt);
  font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif;
  font-size:14px;line-height:1.5;}
button{font-family:inherit;cursor:pointer;border:none;background:none;color:inherit;}
.hidden{display:none !important;}

/* 顶部栏 */
#topbar{position:sticky;top:0;z-index:20;background:var(--panel);border-bottom:1px solid var(--line);
  padding:8px 12px;display:flex;flex-wrap:wrap;align-items:center;gap:8px;box-shadow:var(--shadow);}
/* 顶栏各块的顺序（桌面）：品牌+统计+安装/账号 → 全局搜索 → 工具栏 → 同步状态 */
.brand{display:flex;align-items:center;gap:6px;font-weight:700;font-size:16px;order:0;}
.brand-ico{font-size:18px;}
.stats{font-size:12px;color:var(--muted);flex:1 1 200px;min-width:360px;order:0;
  display:flex;flex-direction:column;gap:2px;}
.stats b{color:var(--txt);}
/* 顶部两排：第一排本财年（= 当年 2 月 1 日 ~ 次年 1 月 31 日）、第二排当月，各含 项目数/总收入/待收入。
   每排内部不折行（nowrap）：宁可让极长数字省略，也绝不换行造成"跳行"错乱 */
.stats .srow{display:flex;flex-wrap:nowrap;align-items:baseline;gap:4px 12px;line-height:1.55;min-width:0;}
.stats .sk{flex:0 0 auto;font-weight:600;color:#5b6675;font-size:11.5px;
  background:#f1f4f9;border-radius:6px;padding:1px 6px;white-space:nowrap;
  min-width:62px;text-align:center;}
.stats .sv{white-space:nowrap;min-width:0;overflow:hidden;text-overflow:ellipsis;}
/* 统计行的显示/隐藏开关：独立于两排统计，隐藏任意一排它都还在，用户才关得回来 */
.stats .srow-ctl{display:flex;flex-wrap:nowrap;align-items:center;gap:6px;line-height:1.4;}
.stog{flex:0 0 auto;padding:2px 9px;border-radius:999px;border:1px solid var(--line);
  background:#fff;color:#5b6675;font-size:11px;font-weight:600;line-height:1.55;white-space:nowrap;}
.stog.on{background:#eaf1ff;border-color:#bcd0ff;color:#1f56d6;}
.stog:active{transform:scale(.97);}
.stog-tip{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;
  font-size:10.5px;color:var(--muted);white-space:nowrap;}
/* 统计区「展开 / 收起」主开关：收起时顶栏只占一行的高度（v26），
   点一下才展开全年 / 当月 / 毛利三排，顶部固定区因此清爽很多。 */
.stog-main{display:inline-flex;align-items:center;gap:4px;padding:2px 10px;border-radius:999px;
  border:1px solid #c9dbfd;background:#eef4ff;color:#1f56d6;font-size:11px;font-weight:700;
  line-height:1.55;white-space:nowrap;flex:0 0 auto;}
.stog-main:active{transform:scale(.97);}
.stog-main .arw{font-size:9px;transition:transform .15s;}
.stog-main.on .arw{transform:rotate(180deg);}
/* 收起状态下的一行摘要：让人不必展开就知道项目数与待收，
   不占额外行（与开关同排、nowrap + 省略号）。 */
.stat-mini{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-size:11px;color:#5b6675;}
.stat-mini b{color:var(--txt);font-variant-numeric:tabular-nums;}
/* 工具栏：**单排横向滚动**（v26）。以前靠 .tb-break 强行断成两排，顶栏被顶高，
   移动端一屏里看得到的项目少一截；现在按钮永远在同一排，放不下就在这排里左右滑。
   overflow-x:auto 只作用在 .toolbar 内部，页面本身不会出现横向滚动条。
   滚动条刻意隐藏：手机上是手势滑动，露出一条灰色滚动条既丑又占高度。 */
.toolbar{display:flex;gap:6px;flex-wrap:nowrap;min-width:0;order:3;align-items:center;
  overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;-ms-overflow-style:none;}
.toolbar::-webkit-scrollbar{display:none;height:0;}
/* 老的强制断行元素：万一还有残留（旧缓存 / 第三方改动）也不再制造空行 */
.tb-break{display:none !important;}
.stats .sv b{font-variant-numeric:tabular-nums;}
.stats .sv.money b{color:#1f2733;}
/* 安装/账号固定在品牌行右侧：任何屏幕宽度都看得见、点得到 */
.top-right{display:flex;align-items:center;gap:6px;flex:0 0 auto;margin-left:auto;order:1;}
.chip{display:inline-flex;align-items:center;gap:4px;height:var(--tb-size);padding:0 11px;
  border-radius:999px;border:1px solid #c9dbfd;background:#eef4ff;color:var(--blue);
  font-size:13px;font-weight:600;white-space:nowrap;transition:.15s;}
.chip:active{transform:scale(.96);}
.chip.ready{background:var(--blue);color:#fff;border-color:var(--blue);
  box-shadow:0 3px 10px rgba(47,109,246,.35);}
/* v37：图标栏 = 图标在上、中文小标签在下（.tb-t）。
   只在 .toolbar 内生效 —— 顶栏右侧的登录按钮仍是原来的纯图标方形。
   标签 10.5px（正文 13px 的 ~80%），单行不换行；按钮 flex:0 0 auto，
   窗口变窄时整排在 .toolbar 内横向滚动，不换行、不挤压、不遮挡图标。 */
.toolbar .tb{width:auto;min-width:var(--tb-size);height:auto;flex-direction:column;
  gap:1px;padding:4px 7px 3px;border-radius:10px;}
.toolbar .tb-ico{font-size:16px;line-height:1.1;display:block;}
.toolbar .tb-t{font-size:10.5px;line-height:1.1;color:var(--muted);white-space:nowrap;
  letter-spacing:0;transform:scale(.96);transform-origin:center;}
.toolbar .tb.on .tb-t,.toolbar .tb.toggle.on .tb-t{color:#fff;}
.toolbar .tb:active{transform:scale(.94);}
/* 品牌行右侧的「账号」按钮同样走图标 + 中文标签两行结构，与工具栏保持一致 */
.top-right .tb{width:auto;min-width:var(--tb-size);height:auto;flex-direction:column;
  gap:1px;padding:4px 7px 3px;}
.top-right .tb-ico{font-size:15px;line-height:1.1;display:block;}
.top-right .tb-t{font-size:10.5px;line-height:1.1;color:var(--muted);white-space:nowrap;}
/* 带文字的顶栏按钮（供应商 / 其他款项）保持横向单行 */
.tb.wide{height:var(--tb-size);flex-direction:row;}
.tb{width:var(--tb-size);height:var(--tb-size);border-radius:10px;border:1px solid var(--line);
  background:#f8fafc;font-size:16px;display:flex;align-items:center;justify-content:center;
  transition:.15s;flex:0 0 auto;}
.tb:active{transform:scale(.94);}
.tb.toggle.on{background:var(--blue);color:#fff;border-color:var(--blue);}
/* 带文字的顶栏按钮（供应商 / 其他款项） */
.tb.wide{width:auto;padding:0 9px;gap:4px;font-size:11.5px;font-weight:600;white-space:nowrap;
  color:#3a4453;background:#f4f7fb;border-color:#dbe4ef;}
.tb.wide.on{background:var(--blue);color:#fff;border-color:var(--blue);}
.tb.wide.act{background:#eaf1ff;border-color:#bcd0ff;color:#1f56d6;}
/* 💸 报销入口的未读红点角标（任务 #38）：贴在按钮右上角，移动端随工具栏横向滚动 */
.tb{position:relative;}
.tb-badge{position:absolute;top:-5px;right:-5px;min-width:16px;height:16px;padding:0 4px;
  border-radius:999px;background:var(--red);color:#fff;font-size:10px;font-weight:700;
  line-height:16px;text-align:center;box-shadow:0 0 0 2px var(--panel);pointer-events:none;}
.sync-status{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted);order:4;}
.sync-status .dot{width:9px;height:9px;border-radius:50%;background:var(--muted);}
.sync-status.ok .dot{background:var(--green);}
.sync-status.err .dot{background:var(--red);}
.sync-status.busy .dot{background:var(--gold);animation:pulse 1s infinite;}
/* v37 离线态：轻量灰点，不用红色（红色只留给真失败），文案由 JS 给出 */
.sync-status.off .dot{background:#9aa4b2;}
.sync-status.off{color:#8a94a3;}
.sync-status{white-space:nowrap;}
/* v38 同步失败时的「重试」入口：贴着状态文字，链接样式，不抢主视觉 */
.sync-status .sync-retry{margin-left:6px;padding:0 6px;height:18px;border:1px solid var(--red);
  border-radius:999px;background:transparent;color:var(--red);font-size:11px;line-height:16px;
  cursor:pointer;white-space:nowrap;}
.sync-status .sync-retry:hover{background:var(--red);color:#fff;}
@keyframes pulse{50%{opacity:.3;}}

/* 筛选栏：sticky 顶部必须跟顶栏真实高度走（--top-h 由 JS 写入），
   写死 53px 会在顶栏变高（统计行隐藏/显示、工具栏换行）时被顶栏压住 */
#filterbar{position:sticky;top:var(--top-h,53px);z-index:15;background:var(--bg);padding:8px 12px;
  display:flex;flex-wrap:wrap;align-items:center;gap:6px;border-bottom:1px solid var(--line);}
#filterbar select,#filterbar input{padding:7px 8px;border:1px solid var(--line);border-radius:8px;background:#fff;font-size:13px;}
#filterbar .sep{color:var(--muted);}
#search{flex:1 1 140px;min-width:120px;}
.mini-btn{padding:7px 10px;border:1px solid var(--line);border-radius:8px;background:#fff;font-size:13px;}
.mini-btn.primary{background:var(--blue);color:#fff;border-color:var(--blue);}

/* ================= 顶部全局搜索（覆盖全部项目） ================= */
.top-search{order:2;position:relative;flex:1 1 100%;min-width:0;display:flex;align-items:center;}
.top-search #gsearch{flex:1 1 auto;min-width:0;padding:7px 10px;border:1px solid var(--line);
  border-radius:9px;background:#fff;font-size:13px;color:var(--txt);width:100%;}
.top-search #gsearch:focus{outline:none;border-color:#bcd0ff;box-shadow:0 0 0 2px rgba(47,109,246,.12);}
.gresults{position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:26;
  max-height:min(56vh,320px);overflow:auto;-webkit-overflow-scrolling:touch;
  background:#fff;border:1px solid var(--line);border-radius:10px;padding:4px;
  box-shadow:0 8px 24px rgba(31,39,51,.16);}
.gresults .gitem{display:block;width:100%;text-align:left;padding:7px 9px;border-radius:8px;line-height:1.35;}
.gresults .gitem:hover,.gresults .gitem.on{background:#eef4ff;}
.gresults .gt{font-size:13px;font-weight:600;color:var(--txt);word-break:break-all;}
.gresults .gm{font-size:11.5px;color:var(--muted);margin-top:1px;word-break:break-all;}
.gresults .gnone{padding:10px;font-size:12.5px;color:var(--muted);}

/* ================= 安装提示条 ================= */
.install-nudge{position:fixed;left:14px;right:14px;bottom:26px;z-index:24;
  display:flex;align-items:center;gap:10px;padding:10px 12px;
  background:#fff;border:1px solid #c9dbfd;border-radius:12px;
  box-shadow:0 6px 20px rgba(31,39,51,.18);}
.nudge-txt{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:2px;}
.nudge-txt b{font-size:13px;color:var(--txt);}
.nudge-txt span{font-size:11.5px;color:var(--muted);line-height:1.45;}
.nudge-ops{flex:0 0 auto;display:flex;align-items:center;gap:6px;}
.nudge-ops .btn{padding:7px 14px;font-size:13px;}
.nudge-ops .mini{white-space:nowrap;}
/* 提示条出现时给内容留出底部空间，别把最后一行压在下面 */
body.nudge-on .view{padding-bottom:190px;}

/* 主视图 */
.view{padding:10px 12px 90px;max-width:1100px;margin:0 auto;}
.view.compact .row{padding:8px 10px;}
/* 主内容区标签页：项目 / 供应商（管理员）/ 其他款项（管理员） */
/* 标签条：供应商 / 其他款项从顶栏搬到这里后，用户还在顶栏找按钮，
   所以整条要有明显的「容器感 + 可点感」，不能看起来像一行灰字。 */
.view-tabs{display:flex;flex-wrap:nowrap;gap:4px;align-items:center;margin:0 0 10px;
  overflow-x:auto;-webkit-overflow-scrolling:touch;
  background:#eef2f8;border:1px solid var(--line);border-radius:12px;padding:5px;}
.view-tab{flex:0 0 auto;padding:8px 15px;border-radius:9px;border:1px solid transparent;
  background:transparent;color:#46536a;font-size:13.5px;font-weight:600;white-space:nowrap;line-height:1.4;}
.view-tab:active{transform:scale(.97);}
.view-tab.on{background:var(--blue);color:#fff;border-color:var(--blue);
  box-shadow:0 2px 6px rgba(47,109,246,.28);}
/* 管理员自检入口：贴在标签条最右侧，窄屏横向滚动时靠 sticky 一直露在外面 */
.vt-diag{position:sticky;right:0;margin-left:auto;flex:0 0 auto;
  background:#fff;border:1px solid var(--blue);border-radius:9px;color:var(--blue);
  font-size:12.5px;font-weight:700;padding:7px 10px;white-space:nowrap;line-height:1.4;
  box-shadow:-6px 0 8px -6px rgba(15,26,48,.18);}
.vt-diag:active{transform:scale(.97);}
/* 自检弹窗里的只读文本框：等宽、可滚动、手机上也能长按全选 */
.sc-text{width:100%;box-sizing:border-box;border:1px solid var(--line);border-radius:10px;
  background:#fbfcfe;color:#243044;font-size:12px;line-height:1.7;padding:10px;
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;resize:vertical;}
/* 模块面板（供应商 / 其他款项）：与项目列表互斥显示 */
.view-panel{margin-bottom:6px;}
.view-panel:empty{display:none;}
/* 模块里的显眼「＋ 新增…」入口 */
.mod-ops{display:flex;flex-wrap:wrap;gap:8px;margin:8px 0 2px;}
.mod-ops .btn{padding:8px 16px;font-size:13.5px;}
.row{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);
  padding:12px;margin-bottom:10px;box-shadow:var(--shadow);display:flex;gap:10px;align-items:flex-start;}
.row .rk{flex:0 0 auto;display:flex;flex-direction:row;align-items:center;gap:5px;min-width:44px;padding-top:3px;}
/* 项目编号：按时间顺序 001 起，等宽数字对齐 */
.row .rk .no{font-size:12px;font-weight:700;color:#8a97a8;letter-spacing:.4px;
  font-variant-numeric:tabular-nums;line-height:1;}
.row .main{flex:1 1 auto;min-width:0;}
.row .rname{font-weight:600;font-size:15px;word-break:break-all;}
/* 客户单位名：跟在项目名后面的次要信息（灰底小字），不抢项目名的视觉重心。
   超长名（如「中国妇幼保健协会XXXXX」）必须**截断成省略号**：
   不限宽时一个 30 字的客户名会把整行撑歪，右侧倒计时与操作按钮也会被挤走。
   inline-block + max-width + overflow hidden + ellipsis + nowrap：
   只截这一块，不影响 .rname / .rmeta / .rside 任何一列的对齐；
   title 属性保留完整名（JS 里写），长按 / 悬停仍看得到全名。 */
.row .rcust{font-size:11.5px;font-weight:400;color:var(--muted);
  margin-left:6px;padding:1px 6px;border-radius:6px;background:#f1f4f9;
  display:inline-block;vertical-align:2px;max-width:11em;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.row .rmeta{font-size:12px;color:var(--muted);margin-top:3px;display:flex;flex-wrap:wrap;gap:10px;}
.row .rstat{margin-top:6px;display:flex;align-items:center;gap:6px;font-size:12px;}
.dot{width:9px;height:9px;border-radius:50%;display:inline-block;}
.dot.done{background:var(--muted);} .dot.soon{background:var(--red);} .dot.later{background:var(--blue);}
/* 「筹备中」状态文字：品牌蓝 --blue(#2f6df6) 压在纯白上是 4.53:1（刚过 4.5），
   但卡片底色接了主题后变成 #fdfdfe（暗了 0.7%）→ 掉到 4.45:1 就不达标了。
   所以这里用主题给的强调色 --ml-accent（更深的蓝，实测 5.69:1），
   主题没加载时落回 #2b67f0（比 --blue 略深，纯白上 4.80:1）。
   同理 .stxt.soon / .done 语义色各自保留，只调这一处蓝色。 */
.stxt.done{color:var(--muted);} .stxt.soon{color:var(--red);}
.stxt.later{color:var(--ml-accent, #2b67f0);}
.row .rmoney{font-size:12px;color:#44505f;margin-top:4px;display:flex;flex-wrap:wrap;gap:10px;}
.row .rmoney b{color:var(--txt);}
.row .settle{font-size:11px;padding:1px 6px;border-radius:6px;background:#eef2f7;color:var(--muted);}
.row .settle.done{background:#e6f7ee;color:var(--green);}
.row .settle.ing{background:#fdeaeb;color:var(--red);}
/* v43 二、未结算逾期：行内 / 概览标红 */
.row.overdue{border-color:#f3b1b4;background:#fff7f7;}
.row .settle.warn{background:#fdeaeb;color:var(--red);font-weight:700;}
.dl-warn{margin:8px 0;padding:8px 10px;border-radius:9px;background:#fff4e6;border:1px solid #f3c98a;color:#8a5a00;font-size:12.5px;line-height:1.5;}
.yr-mem{font-size:12px;color:var(--muted);}
.od-row{background:#fff7f7;}
.hint.ok{color:var(--green);}
.row .racts{display:flex;flex-direction:row;align-items:flex-start;gap:6px;flex:0 0 auto;}
/* 行右侧：倒计时在上，操作按钮在下 */
.row .rside{display:flex;flex-direction:column;align-items:flex-end;gap:7px;flex:0 0 auto;}
.row .rcd{display:flex;flex-direction:column;align-items:center;justify-content:center;
  min-width:54px;padding:5px 8px;border-radius:11px;line-height:1.02;flex:0 0 auto;
  background:#eef4ff;color:#2c66d9;font-variant-numeric:tabular-nums;}
.row .rcd b{font-size:19px;font-weight:800;letter-spacing:-.6px;}
.row .rcd b.word{font-size:13px;letter-spacing:0;font-weight:700;}
.row .rcd span{font-size:10px;margin-top:2px;opacity:.8;white-space:nowrap;}
.row .rcd.soon{background:#fdeaeb;color:var(--red);}
.row .rcd.past,.row .rcd.none{background:#f1f4f8;color:#8a97a8;}
.row .rcd.none b{font-size:15px;letter-spacing:0;}
.row .racts button{padding:5px 9px;border:1px solid var(--line);border-radius:8px;background:#fff;font-size:12px;}
.row .racts .del{color:var(--red);border-color:#f3c9cb;}
.row .flag{font-size:10px;padding:1px 5px;border-radius:5px;margin-left:4px;white-space:nowrap;}
.row .flag.dirty{background:#fff4e0;color:var(--gold);}
.row .flag.adm{background:#e8f0ff;color:var(--blue);}
.empty{text-align:center;color:var(--muted);padding:40px 10px;}

/* 浮动按钮（手机端显示） */
.fab{position:fixed;right:18px;bottom:22px;width:54px;height:54px;border-radius:50%;
  background:var(--blue);color:#fff;font-size:26px;box-shadow:0 6px 16px rgba(47,109,246,.4);z-index:30;display:none;}

/* 一键分享按钮：全端可见、醒目（绿色圆形 + 文字标签）。
   固定在右下角，与「新增」在手机端错开（见下方窄屏规则）。 */
.share-fab{position:fixed;right:18px;bottom:22px;z-index:31;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:1px;width:56px;height:56px;border-radius:50%;
  background:#1aad19;color:#fff;border:2px solid #fff;box-sizing:border-box;
  box-shadow:0 6px 18px rgba(26,173,25,.45);font-size:11px;line-height:1;cursor:pointer;
  -webkit-tap-highlight-color:transparent;user-select:none;}
.share-fab .sf-ico{font-size:22px;line-height:1;}
.share-fab .sf-t{font-size:10px;font-weight:600;letter-spacing:.5px;}
.share-fab:active{transform:scale(.94);}

/* 弹窗 */
.modal{position:fixed;inset:0;z-index:50;background:rgba(20,28,40,.45);display:flex;align-items:flex-end;justify-content:center;}
.sheet{background:#fff;width:100%;max-width:560px;border-radius:16px 16px 0 0;max-height:88vh;
  display:flex;flex-direction:column;overflow:hidden;animation:rise .2s ease;}
.sheet.wide{max-width:860px;}
@keyframes rise{from{transform:translateY(30px);opacity:.6;}}
.sheet-head{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;border-bottom:1px solid var(--line);font-weight:700;font-size:16px;flex:0 0 auto;background:#fff;z-index:2;}
.sheet-head .x{font-size:18px;color:var(--muted);padding:4px 8px;}
/* 内容区自己滚动，头尾常驻——长表单的「保存」永远看得见 */
.sheet-body{padding:14px 16px;flex:1 1 auto;min-height:0;overflow:auto;-webkit-overflow-scrolling:touch;}
.sheet-body.center{text-align:center;}
.sheet-foot{padding:12px 16px;border-top:1px solid var(--line);display:flex;gap:10px;justify-content:flex-end;
  flex:0 0 auto;background:#fff;}
.form{display:grid;grid-template-columns:1fr 1fr;gap:10px 12px;}
.form .fld{display:flex;flex-direction:column;min-width:0;}
.form .fld.full{grid-column:1 / -1;}

/* 客户单位名搜索下拉（供应商库 = 客户资料库） */
.combo{position:relative;}
.combo-input{width:100%;padding:9px 10px;border:1px solid var(--line);border-radius:8px;font-size:14px;background:#fff;}
.combo-panel{background:var(--panel);border:1px solid var(--line);border-radius:10px;
  box-shadow:var(--shadow);max-height:260px;overflow:auto;padding:4px;margin-top:4px;}
.combo-item{padding:9px 10px;border-radius:8px;cursor:pointer;font-size:14px;line-height:1.3;color:var(--txt);}
.combo-item:hover{background:#f3f6fb;}
.combo-item.combo-add{color:var(--blue);font-weight:600;}
.combo-empty{padding:9px 10px;color:var(--muted);font-size:13px;}
.combo-add-box{padding:6px;}
.combo-add-input{width:100%;padding:8px 10px;border:1px solid var(--line);border-radius:8px;font-size:14px;}
.combo-add-actions{display:flex;gap:8px;justify-content:flex-end;margin-top:8px;}
.combo-add-actions button{padding:6px 12px;border-radius:8px;border:1px solid var(--line);background:#fff;font-size:13px;cursor:pointer;}
.combo-add-actions .combo-add-ok{background:var(--blue);color:#fff;border-color:var(--blue);}
.form .full{grid-column:1 / -1;}
.form label{font-size:12px;color:var(--muted);display:block;margin-bottom:3px;}
.form input,.form select,.form textarea{width:100%;padding:9px 10px;border:1px solid var(--line);border-radius:8px;font-size:14px;background:#fff;}
.form textarea{resize:vertical;min-height:54px;}
.btn{padding:9px 16px;border-radius:10px;border:1px solid var(--line);background:#f8fafc;font-size:14px;}
.btn.primary{background:var(--blue);color:#fff;border-color:var(--blue);}
.btn.ghost{background:transparent;color:var(--muted);}
.preview{max-height:200px;overflow:auto;border:1px dashed var(--line);border-radius:8px;padding:8px;margin-top:10px;font-size:12px;color:var(--muted);}
/* v69 任务 B：重复提交提醒弹窗内的对比表 */
.dup-table{margin-top:10px;border:1px solid var(--line);border-radius:8px;overflow:hidden;font-size:13px;}
.dup-table table{width:100%;border-collapse:collapse;}
.dup-table th,.dup-table td{padding:7px 10px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top;}
.dup-table tr:last-child td{border-bottom:0;}
.dup-table th{background:#f3f6fc;color:var(--muted);font-weight:600;width:30%;}
.dup-table td{color:var(--text);word-break:break-word;}
.dup-table td.dup-val-existing{color:var(--blue);font-weight:600;}
.flabel{display:block;font-size:12px;color:var(--muted);margin:10px 0 4px;font-weight:600;}
.fselect{width:100%;padding:10px;border:1px solid var(--line);border-radius:10px;font-size:14px;background:#fff;}
#modal-files input[type=file]{display:block;width:100%;margin-top:2px;padding:8px;border:1px dashed var(--line);
  border-radius:10px;background:#fbfcfe;font-size:13px;}
#modal-files .btn.primary{width:100%;margin-top:8px;}
.file-count{font-size:12px;color:var(--muted);margin:10px 0 0;}
.file-list{list-style:none;padding:0;margin:8px 0 0;}
.file-list li{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:10px;
  border:1px solid var(--line);border-radius:10px;margin-bottom:8px;background:#fbfcfe;}
.file-list .fmain{flex:1 1 auto;min-width:0;}
.file-list .fname{word-break:break-all;font-size:13.5px;font-weight:600;color:#1f2733;}
.file-list .fmeta{font-size:11.5px;color:var(--muted);margin-top:2px;}
.file-list .fproj{font-size:11.5px;color:var(--blue);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.file-list .fowner{font-size:11.5px;color:var(--muted);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.file-list .fops{display:flex;gap:6px;flex:0 0 auto;}
.file-list a{color:var(--blue);font-size:13px;text-decoration:none;}

/* ---- 项目编辑页里的文件区（#add-files） ---- */
.add-files{margin-top:16px;padding-top:14px;border-top:1px solid var(--line);}
.add-files .af-head{font-size:14px;font-weight:700;color:#1f2733;margin-bottom:2px;}
.add-files .hint{margin:4px 0 8px;}
.add-files input[type=file]{display:block;width:100%;padding:8px;border:1px dashed var(--line);
  border-radius:10px;background:#fbfcfe;font-size:13px;}
.add-files input[type=file]:disabled{opacity:.55;}
.add-files .af-ops{display:flex;gap:8px;margin-top:8px;flex-wrap:wrap;}
.add-files .af-ops .btn{margin-top:0;}

/* ---- 可搜索的项目选择器（#file-picker） ---- */
.file-picker{margin-top:8px;border:1px solid var(--line);border-radius:10px;background:#fbfcfe;
  max-height:260px;overflow:auto;-webkit-overflow-scrolling:touch;}
.file-picker:empty{display:none;}
.fproj-item{display:flex;align-items:center;gap:8px;width:100%;text-align:left;
  padding:9px 11px;border:0;border-bottom:1px solid var(--line);background:transparent;
  font-size:13px;color:var(--txt);cursor:pointer;flex-wrap:wrap;}
.file-picker .fproj-item:last-child{border-bottom:0;}
.fproj-item:hover{background:#f2f6ff;}
.fproj-item.on{background:#e8f0ff;box-shadow:inset 3px 0 0 var(--blue);}
.fproj-item.off{opacity:.5;cursor:not-allowed;}
.fproj-item .fpi-name{flex:1 1 130px;min-width:0;font-weight:600;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;}
.fproj-item .fpi-no{font-size:11px;color:var(--muted);font-variant-numeric:tabular-nums;}
.fproj-item .fpi-date{font-size:11px;color:var(--muted);}
.fproj-item .fpi-cust{font-size:11px;color:var(--blue);background:#eef3ff;border-radius:6px;padding:1px 6px;}
.fproj-item .fpi-tag{font-size:10.5px;color:var(--muted);border:1px solid var(--line);
  border-radius:6px;padding:1px 6px;}
.fp-empty{padding:12px 11px;font-size:12px;color:var(--muted);}
#file-search{width:100%;padding:10px;border:1px solid var(--line);border-radius:10px;font-size:14px;background:#fff;}
.mini.danger{color:var(--red);border-color:#f3c9cb;background:#fff;}
.mini:disabled{opacity:.55;}
.empty.err{color:var(--red);}
.qr{width:200px;height:200px;margin:8px auto;background:#fff;border:1px solid var(--line);border-radius:10px;display:flex;align-items:center;justify-content:center;}
.qr img{width:100%;height:100%;}
.qr .ph{color:var(--muted);font-size:12px;}
.hint{font-size:12px;color:var(--muted);margin:8px 0;}

/* 空态引导卡片：列表为空时给「下一步」，而不是留一块白板让用户猜为什么没有数据 */
.empty-card{border:1px dashed var(--line);border-radius:12px;background:#fbfcfe;
  padding:18px 14px;text-align:center;margin:10px 0 2px;}
.empty-card .ec-ico{font-size:26px;line-height:1;}
.empty-card .ec-t{font-size:14px;font-weight:600;color:#243044;margin-top:6px;}
.empty-card .ec-d{font-size:12px;color:var(--muted);margin-top:6px;
  line-height:1.65;text-align:left;word-break:break-word;}
.empty-card .ec-ops{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;margin-top:12px;}
.empty-card .ec-ops .btn{padding:9px 14px;font-size:13.5px;}

/* 🧹 清理重复数据：有重复时高亮 + 条数角标，避免用户没发现云端被翻倍 */
.dedup-ops{margin:8px 0 2px;}
.btn.clean{border-color:#cfe0ff;color:var(--blue);background:#f5f9ff;font-weight:600;}
.btn.clean.warn{border-color:#f0c98a;background:#fff6e8;color:#a35b00;}
.btn.clean .cbadge{display:inline-block;margin-left:6px;padding:1px 7px;border-radius:999px;
  font-size:11.5px;font-weight:700;background:var(--red);color:#fff;line-height:1.6;}
.btn.clean:not(.warn) .cbadge{background:var(--muted);}

/* 登录 / 注册 */
.tb.on{background:var(--blue);color:#fff;border-color:var(--blue);}
.tabs{display:flex;gap:8px;justify-content:center;margin-bottom:14px;}
.tab{padding:7px 20px;border:1px solid var(--line);border-radius:999px;background:#fff;font-size:13px;color:var(--muted);}
.tab.on{background:var(--blue);color:#fff;border-color:var(--blue);}
#modal-login .form{grid-template-columns:1fr;gap:8px;max-width:320px;margin:0 auto;}
#modal-login .form input{text-align:center;}
body.demo::after{content:"演示模式 · 数据仅存本机";position:fixed;left:0;right:0;bottom:0;z-index:60;
  background:var(--gold);color:#fff;font-size:11px;text-align:center;padding:3px 0;}

/* 本财年 / 当月概况（v47 起「全年」一律指财年） */
.yr-tabs{display:flex;gap:6px;margin-bottom:10px;flex-wrap:wrap;align-items:center;}
.yr-owner{margin-left:auto;max-width:56%;padding:6px 8px;border:1px solid var(--line);
  border-radius:8px;background:#fff;font-size:12.5px;color:var(--txt);}
/* 「客户」下拉：有「负责人」下拉时紧跟其右侧，没有时（非管理员 / 演示）自己靠右 */
#yr-customer{margin-left:auto;}
#yr-owner + #yr-customer{margin-left:0;}
.yr-summary{display:grid;grid-template-columns:repeat(auto-fit,minmax(152px,1fr));gap:8px;margin-bottom:12px;}
.yr-card{background:#f8fafc;border:1px solid var(--line);border-radius:10px;padding:10px;max-width:240px;min-width:0;}
.yr-card .k{font-size:12px;color:var(--muted);}
.yr-card .v{font-size:17px;font-weight:700;margin-top:2px;line-height:1.25;}
.yr-card .sub{font-size:11px;color:var(--muted);margin-top:3px;}
/* v35 区间概况：起止年月选择器 / 提示条 / 加载与失败态 */
.yr-lab{font-size:12px;color:var(--muted);white-space:nowrap;}
.yr-rg{display:inline-flex;align-items:center;gap:3px;flex-wrap:nowrap;}
.yr-rg select{padding:5px 6px;border:1px solid var(--line);border-radius:8px;background:#fff;
  font-size:12.5px;color:var(--txt);max-width:88px;}
.yr-rg select:disabled{background:#f2f4f7;color:#9aa5b1;}
.yr-rg i{font-style:normal;font-size:12px;color:var(--muted);}
.yr-cmpon{display:inline-flex;align-items:center;gap:4px;font-size:12.5px;color:var(--txt);white-space:nowrap;}
.yr-cmpon input{width:15px;height:15px;}
.yr-note{margin:6px 0 10px;padding:8px 10px;border-radius:9px;background:#fff8e6;border:1px solid #f5d9a0;
  font-size:12.5px;color:#7a5a12;line-height:1.6;}
.yr-note p{margin:0 0 3px;}
.yr-note p:last-child{margin-bottom:0;}
.yr-pending{display:flex;align-items:center;justify-content:center;height:88px;color:var(--muted);font-size:13px;}
.yr-error{display:flex;align-items:center;justify-content:center;min-height:60px;padding:10px;
  border:1px solid #f0b4b4;border-radius:10px;background:#fff5f5;color:#b3261e;font-size:13px;line-height:1.6;text-align:center;}
/* v45：筛选后本区间没有项目时的空态（不渲染空图表 / 空排行 / 空对比表） */
.yr-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;
  min-height:120px;padding:18px 12px;border:1px dashed var(--line);border-radius:12px;
  background:#fafbfc;text-align:center;}
.yr-empty .ye-main{font-size:13.5px;color:#3d4753;font-weight:600;}
.yr-empty .ye-tip{font-size:12px;color:var(--muted);}
/* v47：财年口径说明条（口径 = 当年 2 月 1 日 ~ 次年 1 月 31 日）。概况弹窗与工作台各一处，
   常驻显示、不可关闭，让看数字的人随时知道「全年」指的是哪 12 个月。 */
.yr-fiscal,.wb-fiscal{font-size:11.5px;color:var(--muted);line-height:1.6;
  background:#f7f9fb;border:1px dashed var(--line);border-left:3px solid #c8d3e0;border-radius:6px;
  padding:5px 9px;margin:0 0 8px;}
.tbl-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;}
.cmp{width:100%;border-collapse:collapse;font-size:12px;margin-top:6px;}
.cmp th,.cmp td{border:1px solid var(--line);padding:6px 8px;text-align:right;white-space:nowrap;}
.cmp th:first-child,.cmp td:first-child{text-align:left;}
.cmp .up{color:var(--red);} .cmp .down{color:var(--green);}
.yr-h{margin:14px 0 4px;font-size:13px;font-weight:600;color:#234;}
.rank{width:100%;border-collapse:collapse;font-size:12px;}
.rank th,.rank td{border:1px solid var(--line);padding:6px 8px;text-align:right;white-space:nowrap;}
.rank th:first-child,.rank td:first-child{text-align:left;}
.rank tbody tr{cursor:pointer;}
.rank tbody tr:hover{background:#f5f9ff;}
.rank tbody tr.on{background:#eef4ff;}
.chart{width:100%;height:auto;display:block;}
.conclusion{margin-top:12px;padding:10px 12px;background:#eef4ff;border-radius:10px;font-size:13px;color:#234;line-height:1.7;}

/* Toast */
.toast{position:fixed;left:50%;bottom:80px;transform:translateX(-50%) translateY(20px);
  background:rgba(31,39,51,.92);color:#fff;padding:10px 16px;border-radius:10px;font-size:13px;
  opacity:0;pointer-events:none;transition:.25s;z-index:80;max-width:80vw;text-align:center;}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0);}

/* ===== 手机窄屏适配 ===== */
@media (max-width:680px){
  :root{--tb-size:42px;}
  .brand-txt{display:block;font-size:14px;max-width:6.6em;overflow:hidden;
    text-overflow:ellipsis;white-space:nowrap;}
  .brand-ico{width:26px;height:26px;border-radius:7px;}
  /* 手机顺序：品牌+安装 → 全局搜索 → 两排统计 → 工具栏 → 同步状态 */
  .top-search{order:1;}
  .stats{flex-basis:100%;order:2;font-size:11.5px;gap:1px;min-width:0;}
  /* 毛利排有 4 个数字，比全年 / 当月排更宽：手机端再收一点字号与间距，
     保证 320px 宽下依然是一行（.srow 本身 nowrap，绝不折行） */
  .stats .srow{gap:2px 7px;font-size:11px;}
  .stats .sk{min-width:48px;font-size:10.5px;padding:1px 5px;}
  .stog{font-size:10px;padding:2px 7px;}
  /* 毛利排比另两排多一个数字，窄屏再收一档：360px 起就不再出现省略号。
     .srow 本身是 nowrap —— 再窄也只是省略，绝不会折行。 */
  .stats .srow-profit{font-size:10.5px;gap:1px 5px;}
  .stats .srow-profit .sk{min-width:42px;font-size:10px;padding:1px 4px;}
  /* 任务 #39：移动端固定区金额 / 毛利列横向滑动修复
   * 根因：桌面 .stats .sv 用 overflow:hidden + ellipsis（style.css:41），窄屏下
   * 收入 / 待收 / 毛利数值被截断而非可滚动。修复思路：窄屏让 #stats 自身
   * overflow-x:auto，.srow flex:none 不收缩、min-width:max-content 保证内容完整，
   * 超出部分横向滑出（滚动条隐藏，手感同 .toolbar）。桌面布局完全不变。 */
  #stats{overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;flex-basis:100%;}
  #stats::-webkit-scrollbar{display:none;height:0;}
  .stats .srow{flex:none;white-space:nowrap;min-width:max-content;}
  .stats .sv{overflow:visible;text-overflow:clip;min-width:0;}
  /* 单排横向滚动（与桌面同一套规则）：不再把按钮折到第二排顶高顶栏。
     顶栏真实高度仍由 JS 写入 --top-h，筛选栏永远贴着顶栏下沿。 */
  .toolbar{order:3;flex:1 1 100%;flex-wrap:nowrap;gap:4px;overflow-x:auto;}
  .toolbar .tb{flex:0 0 auto;min-width:34px;width:auto;height:auto;padding:3px 6px 2px;
    font-size:14px;border-radius:9px;gap:0;}
  .toolbar .tb-ico{font-size:14px;}
  .toolbar .tb-t{font-size:10px;}
  .toolbar .tb.wide{width:auto;padding:0 7px;font-size:11px;flex-direction:row;height:32px;}
  .top-right{order:0;margin-left:auto;}
  .chip{height:36px;padding:0 10px;font-size:12.5px;}
  /* 由 JS 写入顶栏真实高度，不再写死 97px */
  #filterbar{top:var(--top-h,97px);}
  .form{grid-template-columns:1fr;}
  .fab{display:flex;align-items:center;justify-content:center;}
  /* 手机端：新增按钮让出右下角给分享按钮，挪到它的左侧，避免两个圆钮重叠 */
  #fab-add{right:84px;}
  /* 分享面板里的链接框在窄屏也能长按全选 / 滚动 */
  #modal-share .sc-text{font-size:12px;}
  .row .racts{flex-direction:row;}
  .row .racts button{padding:7px 10px;font-size:13px;}
  /* 窄屏行宽只剩 ~150px：客户单位名再收一档，仍保证截断而不是撑破行 */
  .row .rcust{max-width:7.6em;}
  .row .rside{gap:6px;}
  .row .rcd{min-width:48px;padding:4px 6px;border-radius:10px;}
  .row .rcd b{font-size:17px;}
  .row .rcd span{font-size:9.5px;}
  .sheet{border-radius:16px 16px 0 0;}
  #topbar{padding:8px 10px;}
  .sync-status{order:4;flex-basis:100%;justify-content:flex-end;font-size:11px;}
  /* 安装提示条：浮在 FAB 上方，不遮住右下角的新增按钮 */
  .install-nudge{left:10px;right:10px;bottom:86px;flex-wrap:wrap;padding:10px 11px;}
  .nudge-ops{flex:1 1 100%;justify-content:flex-end;}
  body.nudge-on .view{padding-bottom:210px;}
}
@media (min-width:681px){
  .modal{align-items:center;}
  .sheet{border-radius:16px;}
}

/* 账号管理（管理员） */
.admin-add{display:flex;gap:8px;margin:10px 0 14px;}
.admin-add input{flex:1;padding:10px;border:1px solid var(--line);border-radius:10px;font-size:14px;}
.admin-list{display:flex;flex-direction:column;gap:8px;max-height:40vh;overflow:auto;}
.admin-row{display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:#fbfcfe;}
.admin-name{display:flex;align-items:center;gap:6px;font-size:14px;font-weight:600;flex-wrap:wrap;}
.admin-ops{display:flex;gap:6px;flex:0 0 auto;}
.mini{padding:6px 10px;border-radius:8px;border:1px solid var(--line);background:#fff;font-size:12px;color:var(--txt);}
.mini:active{background:#eef2f8;}
.badge{font-size:11px;font-weight:500;padding:1px 6px;border-radius:999px;background:#eef1f6;color:#5b6675;}
.badge.ok{background:#e6f6ec;color:#1a7f45;}
.badge.wait{background:#fff4e0;color:#9a6a12;}
.badge.admin{background:#e8f0ff;color:#2f6df6;}
.admin-view{margin-top:12px;border-top:1px dashed var(--line);padding-top:10px;}
.admin-view-head{font-size:13px;font-weight:600;color:#2b3442;margin-bottom:6px;}
.admin-view-list{max-height:32vh;overflow:auto;display:flex;flex-direction:column;gap:4px;}
.av-row{display:flex;gap:8px;font-size:12.5px;color:#3a4453;padding:5px 0;border-bottom:1px solid #f1f4f9;}
.av-t{flex:0 0 92px;color:#1f2937;font-variant-numeric:tabular-nums;}
.av-n{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.av-l{flex:0 0 auto;color:var(--muted);max-width:38%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.hint.err{color:#d93025;}

/* 安装到桌面弹窗 */
.install-steps{font-size:13.5px;line-height:1.85;color:#3a4453}
.install-steps b{display:block;margin:10px 0 4px;font-size:14px;color:#1d2430}
.install-steps b:first-child{margin-top:0}
.install-steps p{margin:2px 0}

/* ================= 品牌图标（新 logo） ================= */
.brand-ico{width:22px;height:22px;border-radius:6px;display:block;
  box-shadow:0 1px 4px rgba(34,82,255,.28);}

/* ================= 微信内置浏览器引导条 ================= */
.wx-bar{display:flex;align-items:center;gap:8px;padding:8px 12px;
  background:#fff8e6;border-bottom:1px solid #ffe2a8;color:#8a5a00;font-size:12.5px;}
.wx-txt{flex:1 1 auto;line-height:1.45;}
.wx-btn{flex:0 0 auto;padding:6px 10px;border-radius:8px;background:#ffb300;
  color:#3d2a00;font-weight:600;font-size:12.5px;}
.wx-btn:active{transform:scale(.96);}
.wx-x{flex:0 0 auto;width:24px;height:24px;line-height:1;color:#8a5a00;font-size:14px;}

/* ================= 安装面板 ================= */
#install-action .imeta{margin:0 0 10px;font-size:12.5px;color:var(--muted);text-align:center;}
#install-action .imeta b{color:var(--txt);}
#install-action .btn{display:block;width:100%;}

/* ================= 共享数据（只读） ================= */
.row.readonly{background:#fbfcfe;}
.row .flag.share{background:#eaf7f1;color:var(--green);}

/* ================= 查看权限配置 ================= */
.perm-tabs{display:flex;gap:6px;margin:2px 0 10px;border-bottom:1px solid var(--line);}
.perm-tab{padding:7px 12px;font-size:13px;color:var(--muted);border-bottom:2px solid transparent;margin-bottom:-1px;}
.perm-tab.on{color:var(--blue);border-bottom-color:var(--blue);font-weight:600;}
.perm-head{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-bottom:8px;}
.perm-count{flex:1 1 auto;font-size:12px;color:var(--muted);}
.perm-list{max-height:44vh;overflow:auto;border:1px solid var(--line);border-radius:10px;background:#fff;}
.perm-row{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid var(--line);}
.perm-row:last-child{border-bottom:none;}
.perm-t{flex:1 1 auto;min-width:0;font-size:13px;line-height:1.35;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.perm-t small{display:block;color:var(--muted);font-size:11px;font-weight:400;}
.perm-sel{flex:0 0 auto;font-size:12.5px;padding:5px 6px;border:1px solid var(--line);
  border-radius:8px;background:#fff;color:var(--txt);}
.perm-mem{display:flex;flex-wrap:wrap;gap:5px 12px;padding:0 10px 10px;font-size:12px;color:#44505f;}
.perm-mem label{display:inline-flex;align-items:center;gap:4px;}
.perm-tip{font-size:12px;color:var(--muted);margin:8px 0 0;line-height:1.6;}

/* ================= 字段权限：未授权统一隐藏 ================= */
.locked{color:var(--muted);font-size:12px;}
.row .rmoney .locked{display:inline-flex;align-items:center;gap:2px;}
label.full.locked{color:var(--muted);}
input:disabled{background:#f5f6f9;color:#9aa4b2;cursor:not-allowed;}
.yr-lock{display:flex;align-items:center;justify-content:center;height:86px;
  border:1px dashed var(--line);border-radius:10px;background:#fbfcfe;margin:8px 0;}

/* ================= 项目详情 ================= */
#detail-body{padding-bottom:6px;}
.dl-sec{margin:14px 0 6px;font-size:12px;font-weight:600;color:var(--muted);letter-spacing:.02em;}
.dl-row{display:flex;align-items:flex-start;gap:10px;padding:6px 0;border-bottom:1px dashed var(--line);}
.dl-row:last-child{border-bottom:none;}
.dl-k{flex:0 0 7.2em;color:var(--muted);font-size:12.5px;line-height:1.6;white-space:nowrap;}
.dl-v{flex:1 1 auto;min-width:0;font-size:13.5px;line-height:1.6;word-break:break-all;}
.dl-remark{font-size:13px;line-height:1.7;color:#44505f;white-space:pre-wrap;}

/* ================= 字段权限面板 ================= */
.fp-block{margin:10px 0 4px;}
.fp-title{font-size:12.5px;font-weight:600;color:var(--muted);margin-bottom:6px;}
.fp-chips{display:flex;flex-wrap:wrap;gap:6px;}
.fp-chip{padding:6px 11px;border-radius:999px;border:1px solid var(--line);
  background:#fff;color:#44505f;font-size:12.5px;line-height:1.2;}
.fp-chip.on{background:#eaf1ff;border-color:#bcd0ff;color:#1f56d6;font-weight:600;}
.fp-chip:active{transform:scale(.97);}
.fp-users{margin-top:2px;}
.fp-user{padding:8px 0;border-bottom:1px dashed var(--line);}
.fp-user:last-child{border-bottom:none;}
.fp-uname{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600;margin-bottom:6px;}
.fp-inherit{margin-left:auto;font-size:11.5px;padding:3px 8px;border-radius:999px;
  border:1px solid var(--line);background:#fff;color:var(--muted);}
.fp-inherit.on{background:#eef7f1;border-color:#cde9d9;color:#1a7f4b;}
.fp-glabel{font-size:11px;color:#93a0b0;margin:6px 0 4px;letter-spacing:.5px;}

/* ================= 编号面板 ================= */
.no-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:8px;margin:8px 0;}
.no-cell{background:#f8fafc;border:1px solid var(--line);border-radius:10px;padding:9px 6px;text-align:center;}
.no-cell b{display:block;font-size:15px;font-weight:800;color:#243044;letter-spacing:.2px;
  white-space:nowrap;font-variant-numeric:tabular-nums;}
.no-cell span{display:block;font-size:10.5px;color:var(--muted);margin-top:3px;line-height:1.3;}
.no-cell.warn{background:#fff7f7;border-color:#f3cdcf;}
.no-cell.warn b{color:var(--red);}
.no-ops{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:10px 0 2px;}
.perm-tip.ok{color:#1a7f4b;}

/* ================= 安装诊断 ================= */
.diag-body{border:1px solid var(--line);border-radius:10px;overflow:hidden;background:#fff;}
.diag-row{display:flex;align-items:flex-start;gap:8px;padding:8px 10px;border-bottom:1px solid var(--line);font-size:12.5px;}
.diag-row:last-child{border-bottom:none;}
.diag-row.bad{background:#fffafa;}
.diag-ico{flex:0 0 auto;line-height:1.5;}
.diag-k{flex:0 0 92px;color:var(--muted);}
.diag-v{flex:1 1 auto;min-width:0;color:#243044;word-break:break-all;}

/* ============ 概览：本财年 / 当月切换 + 图表类型（财年自 2 月起） ============ */
.seg{display:inline-flex;border:1px solid var(--line);border-radius:999px;overflow:hidden;background:#fff;flex:0 0 auto;}
.seg button{padding:5px 12px;font-size:12.5px;color:#5b6675;background:#fff;line-height:1.5;}
.seg button.on{background:var(--blue);color:#fff;font-weight:600;}
.seg button:active{transform:scale(.97);}
.yr-chartbar{display:flex;align-items:center;gap:8px;margin:10px 0 6px;flex-wrap:wrap;}
.yr-chartbar .ttl{font-size:12px;color:var(--muted);}
.yr-svg{width:100%;height:auto;display:block;}
.yr-legend{display:flex;flex-wrap:wrap;gap:5px 14px;margin-top:8px;font-size:12px;color:#44505f;}
.yr-legend span{display:inline-flex;align-items:center;gap:4px;white-space:nowrap;}
.yr-legend i{width:9px;height:9px;border-radius:2px;display:inline-block;}
.yr-legend b{font-variant-numeric:tabular-nums;}

/* ================= 供应商 / 其他款项 ================= */
.money-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(108px,1fr));gap:8px;margin:6px 0 10px;}
.money-cell{background:#f8fafc;border:1px solid var(--line);border-radius:10px;padding:9px 10px;}
.money-cell .k{font-size:11.5px;color:var(--muted);}
.money-cell .v{font-size:15px;font-weight:700;margin-top:2px;font-variant-numeric:tabular-nums;color:#1f2733;}
.money-cell.warn{background:#fff7f7;border-color:#f3cdcf;}
.money-cell.warn .v{color:var(--red);}
/* v53：特别款项差额卡片下方的小字备注「客户应付我们」 */
.money-cell.sp-diff .v{color:var(--blue);}
.sp-note{font-size:10.5px;color:var(--muted);margin-top:3px;line-height:1.3;}

/* 特别款项明细表：数字右对齐、等宽数字，状态/操作列居中，整体对齐统一 */
.special-tbl th:nth-child(2), .special-tbl td:nth-child(2){text-align:right;font-variant-numeric:tabular-nums;}
.special-tbl th:nth-child(4), .special-tbl td:nth-child(4){text-align:center;}
.special-tbl th:nth-child(6), .special-tbl td:nth-child(6){text-align:right;}
.special-tbl td .sub-tip{font-size:10.5px;color:var(--muted);margin-top:1px;}
.data-table{width:100%;border-collapse:collapse;font-size:12.5px;min-width:520px;}
.data-table.wide{min-width:720px;}
.data-table th,.data-table td{border-bottom:1px solid var(--line);padding:7px 8px;text-align:right;
  white-space:nowrap;font-variant-numeric:tabular-nums;}
.data-table th{background:#f8fafc;color:var(--muted);font-weight:600;font-size:11.5px;}
.data-table td:first-child,.data-table th:first-child{text-align:left;white-space:normal;
  min-width:110px;max-width:180px;word-break:break-all;}
.data-table tbody tr:hover{background:#f7faff;}
.data-table tbody tr.warn td{color:#c0392b;}
.data-table .ops{display:flex;gap:6px;justify-content:flex-end;}
.data-table .ops button{padding:4px 8px;border:1px solid var(--line);border-radius:7px;background:#fff;font-size:11.5px;}
.data-table .ops .del{color:var(--red);border-color:#f3c9cb;}
.row-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(148px,1fr));gap:8px;margin:8px 0 0;}
.row-form label{font-size:11.5px;color:var(--muted);display:block;margin-bottom:2px;}
.row-form input,.row-form select{width:100%;padding:8px 9px;border:1px solid var(--line);
  border-radius:8px;font-size:13.5px;background:#fff;color:var(--txt);}
.row-form .full{grid-column:1 / -1;}
.form-box{border:1px solid var(--line);border-radius:12px;padding:10px 12px 12px;background:#fbfcfe;margin:10px 0;}
.form-box h4{margin:0 0 2px;font-size:13px;color:#243044;}
.form-actions{display:flex;gap:8px;justify-content:flex-end;margin-top:10px;}
.form-actions .btn{padding:7px 14px;font-size:13px;}
.sub-tip{font-size:11.5px;color:var(--muted);margin:2px 0 0;}

/* 金额联动提示（v30）：顺算/倒算说明与「关系不成立」错误 */
.calc-hint{grid-column:1 / -1;font-size:11.5px;color:var(--muted);line-height:1.5;margin:2px 0 0;}
.calc-hint.is-error{color:#d93025;font-weight:600;}

/* ================= 划款明细（v50） =================
 * 「供应商 → 已付」「其他款项 → 已还」共用：一笔钱分几次付出去，
 * 明细逐笔记 付款日期 / 付款金额 / 还款账户，合计自动回填到「已付 / 已还」。
 * 结构：.pay-box > .pay-head（点开）+ .pay-body > .pay-rows + .pay-foot
 * 表格里则用 .pay-chip（N 笔）+ 展开的 .pay-sub 行。
 * -------------------------------------------------- */
.pay-box{border:1px solid var(--line);border-radius:10px;background:#fff;margin:2px 0 0;overflow:hidden;}
.pay-head{display:flex;align-items:center;gap:6px;width:100%;padding:8px 10px;background:#f6f9fc;
  border:0;text-align:left;font-size:12.5px;color:#243044;cursor:pointer;}
.pay-head .pay-ico{font-size:12px;line-height:1;}
.pay-head .pay-title{font-weight:600;}
.pay-badge{margin-left:auto;font-size:11.5px;color:var(--muted);font-variant-numeric:tabular-nums;}
.pay-head .arw{color:var(--muted);font-size:11px;transition:transform .16s;}
.pay-box.open .pay-head .arw{transform:rotate(180deg);}
.pay-body{display:none;padding:9px 10px 10px;border-top:1px solid var(--line);}
.pay-box.open .pay-body{display:block;}
.pay-cols,.pay-row{display:grid;grid-template-columns:132px 116px minmax(118px,1fr) 28px;gap:6px;align-items:center;}
.pay-cols{font-size:11px;color:var(--muted);margin-bottom:4px;}
.pay-row{margin-bottom:5px;}
.pay-row input{width:100%;padding:6px 8px;border:1px solid var(--line);border-radius:7px;
  font-size:12.5px;background:#fff;color:var(--txt);}
.pay-row input:focus{outline:2px solid #cfe0f7;outline-offset:0;border-color:#9dc0ec;}
.pay-row input.bad{border-color:#e05a5a;background:#fff6f6;}
.pay-del{width:26px;height:26px;padding:0;border:1px solid var(--line);border-radius:7px;
  background:#fff;color:var(--red);font-size:12px;line-height:1;cursor:pointer;}
.pay-foot{display:flex;align-items:center;gap:8px;margin-top:4px;}
.pay-total{margin-left:auto;font-size:12px;color:#1f2733;font-variant-numeric:tabular-nums;}
.pay-empty{margin:0 0 7px;padding:10px;border:1px dashed var(--line);border-radius:8px;
  background:#fbfcfe;font-size:11.5px;color:var(--muted);text-align:center;}
/* 表格里的「N 笔」小按钮 + 展开的分笔明细行 */
.pay-chip{margin-left:5px;padding:1px 6px;border:1px solid #cfe0f7;border-radius:8px;background:#f2f7ff;
  color:#1a5fb4;font-size:11px;font-variant-numeric:tabular-nums;cursor:pointer;white-space:nowrap;}
.pay-sub td{background:#f8fbff !important;padding:5px 10px 7px !important;text-align:left;}
.pay-sub-list{display:flex;flex-direction:column;gap:2px;}
.pay-sub-item{display:flex;gap:10px;font-size:12px;color:#3a4657;font-variant-numeric:tabular-nums;}
.pay-sub-item i{font-style:normal;color:var(--muted);min-width:76px;}
.pay-sub-item b{min-width:84px;}
.pay-sub-item em{font-style:normal;color:var(--muted);}
.pay-sub-sum{font-size:11.5px;color:var(--muted);margin-top:3px;}
@media (max-width:560px){
  .pay-cols{display:none;}
  .pay-row{grid-template-columns:1fr 1fr 28px;}
  .pay-row [data-pf="date"]{grid-column:1;grid-row:1;}
  .pay-row [data-pf="amount"]{grid-column:2;grid-row:1;}
  .pay-row .pay-del{grid-column:3;grid-row:1;}
  .pay-row [data-pf="account"]{grid-column:1 / -1;grid-row:2;}
}

/* ================= 客户单位名迁移引导条（项目列表顶部，仅管理员） =================
 * 早期录入的项目没有 customer 字段，用户看到的就是「列表里没有客户单位名」。
 * 这里在项目列表最上面给一条可操作的横幅：点一下就按内置数据补齐，
 * 而不是让用户自己去猜要点哪个按钮。补完（缺数归零）后横幅自动消失。 */
.cust-banner{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  margin:0 0 10px;padding:9px 11px;border:1px solid #c9dbfd;border-radius:12px;
  background:#eef4ff;color:#1f56d6;font-size:12.5px;line-height:1.5;}
.cust-banner .cb-ico{flex:0 0 auto;font-size:14px;}
.cust-banner .cb-txt{flex:1 1 auto;min-width:0;}
.cust-banner .cb-txt b{color:#1a4fc4;}
.cust-banner .btn{flex:0 0 auto;padding:6px 12px;font-size:12.5px;}
.cust-banner.done{background:#eefaf2;border-color:#cde9d9;color:#1a7f4b;}
.cust-banner.done .cb-txt b{color:#147a44;}

/* ================= 概览 · 客户单位维度 =================
 * 选中某个客户单位名后，除了顶部汇总卡片，再单独给一块「该客户的业务明细」：
 * 关键指标（项目数 / 总收入 / 待收 / 毛利 / 毛利率）+ 项目清单。
 * 指标与卡片同源（都来自 aggregateYear），不会出现两处数字对不上。 */
.yr-cust{border:1px solid #c9dbfd;border-radius:12px;background:#f7faff;padding:10px 12px;margin:10px 0 4px;}
.yr-cust .yc-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px;font-weight:700;color:#1a4fc4;}
.yr-cust .yc-head .yc-name{flex:1 1 auto;min-width:0;word-break:break-all;}
.yr-cust .yc-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(96px,1fr));gap:6px;margin:8px 0 2px;}
.yr-cust .yc-m{background:#fff;border:1px solid var(--line);border-radius:9px;padding:6px 8px;}
.yr-cust .yc-m .k{font-size:10.5px;color:var(--muted);white-space:nowrap;}
.yr-cust .yc-m .v{font-size:13.5px;font-weight:700;color:#1f2733;margin-top:1px;
  font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.yr-cust .yc-list{margin:6px 0 0;max-height:230px;overflow:auto;-webkit-overflow-scrolling:touch;}
.yr-cust .yc-item{display:flex;align-items:baseline;gap:8px;padding:5px 0;border-bottom:1px dashed #e3eaf5;font-size:12.5px;}
.yr-cust .yc-item:last-child{border-bottom:none;}
.yr-cust .yc-no{flex:0 0 auto;color:#8a97a8;font-size:11px;font-variant-numeric:tabular-nums;}
.yr-cust .yc-nm{flex:1 1 auto;min-width:0;color:#243044;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.yr-cust .yc-dt{flex:0 0 auto;color:var(--muted);font-size:11px;white-space:nowrap;}
.yr-cust .yc-am{flex:0 0 auto;color:#1f2733;font-variant-numeric:tabular-nums;white-space:nowrap;}
.yr-cust .yc-empty{padding:10px 2px;font-size:12.5px;color:#5b6675;line-height:1.6;}
.yr-cust .yc-ops{margin-top:8px;display:flex;gap:8px;flex-wrap:wrap;}

/* ================= 顶部全局搜索结果：把客户单位名单独成行 =================
 * 用户是按「客户单位名」来找项目的，混在一行灰字里根本看不出来，
 * 所以单独给一行并加 🏢 前缀；没有客户时显示「—」而不是留空让人以为漏了。 */
.gresults .gm .gmc{color:#1f56d6;font-weight:600;}

/* ================= v33：项目状态「进行中」 + 报销审批 / 站内信 / 总览 =================
 * 配色沿用既有浅色硬编码风格（与 .row .settle 一致），文字色一律选深色以保证
 * 对比度（--green #21a366 当正文只有 3.2:1，只用于圆点，不用于文字）。 */

/* 项目状态：当天 = 进行中（v33）。圆点用品牌绿，文字用更深的绿保证 4.5:1 */
.dot.ongoing{background:var(--green);}
.stxt.ongoing{color:#1a7f4b;font-weight:600;}
.row .rcd.ongoing{background:#e6f7ee;color:#147a44;}

/* 只读字段（报销人姓名：自动带出登录人，不可改） */
.row-form .ro-input,#reimb-form .ro-input{background:#f1f4f9;color:#243044;cursor:not-allowed;
  border-color:var(--line);font-weight:600;}

/* 面板内的通用盒子（消息区 / 总览区，与 .form-box 同一套视觉） */
.mod-box{border:1px solid var(--line);border-radius:12px;padding:10px 12px 12px;background:#fbfcfe;margin:10px 0;}
.mod-box h4{margin:0 0 2px;font-size:13px;color:#243044;}

/* ---- 审批消息（站内信） ---- */
.msg-box{background:#f8fafc;}
.msg-box .msg-badge{display:inline-block;margin-left:6px;padding:1px 7px;border-radius:9px;
  background:#fdeaeb;color:#b3261e;font-size:11px;font-weight:700;}
.msg-list{display:flex;flex-direction:column;gap:6px;margin-top:8px;}
.msg{border:1px solid var(--line);border-radius:10px;background:#fff;padding:8px 10px;cursor:pointer;}
.msg.unread{border-left:4px solid var(--blue);background:#f5f8ff;}
.msg.ok{border-color:#cde9d9;}
.msg.no{border-color:#f3c9cb;}
.msg .msg-t{font-size:12.5px;font-weight:700;color:#1f2733;}
.msg .msg-d{font-size:11.5px;color:var(--muted);margin-top:2px;}
.msg .msg-r{font-size:12px;color:#b3261e;margin-top:4px;word-break:break-all;}
.msg-empty{font-size:12px;color:var(--muted);padding:8px 2px;}

/* ---- 报销状态徽标 ---- */
.ap{display:inline-block;padding:1px 7px;border-radius:7px;font-size:11.5px;font-weight:600;white-space:nowrap;}
.ap-pending{background:#fff4e0;color:#8a5b00;}
.ap-approved{background:#e6f7ee;color:#147a44;}
.ap-rejected{background:#fdeaeb;color:#b3261e;}
.ap-legacyIng{background:#eef2f7;color:#5b6675;}
.ap-legacyDone{background:#eef2f7;color:#5b6675;}
.ap-reason{font-size:11px;color:#b3261e;margin-top:3px;max-width:150px;white-space:normal;word-break:break-all;}
.td-owner .own{color:#243044;}
.td-owner .own-me{margin-left:4px;font-size:10px;padding:0 4px;border-radius:5px;background:#e8f0ff;color:#1a4fc4;}

/* 行内驳回表单（原因必填） */
.rej-row td{background:#fffafa;text-align:left;}
.rej-box{display:flex;flex-direction:column;gap:6px;padding:2px 0;}
.rej-box label{font-size:11.5px;color:#b3261e;font-weight:600;}
.rej-input{width:100%;padding:8px 9px;border:1px solid #f3c9cb;border-radius:8px;font-size:13px;background:#fff;}
.rej-ops{display:flex;gap:8px;justify-content:flex-end;}
.btn.danger{background:#b3261e;color:#fff;border-color:#b3261e;}
.data-table .ops .ap-ok{color:#147a44;border-color:#cde9d9;font-weight:600;}
.data-table .ops .ap-no{color:#b3261e;border-color:#f3c9cb;font-weight:600;}

/* ---- v39 报销明细「上传后自动复核」 ---- */
.audit-box{margin:8px 0 2px;padding:10px 12px;border-radius:10px;border:1px solid var(--line);
  background:#f8fafc;font-size:12.5px;display:flex;flex-direction:column;gap:6px;}
.audit-box.ok{border-color:#cde9d9;background:#f2fbf6;}
.audit-box.bad{border-color:#f3c9cb;background:#fff6f6;}
.audit-box .audit-t{font-weight:700;font-size:13px;}
.audit-box.ok .audit-t{color:#147a44;}
.audit-box.bad .audit-t{color:#b3261e;}
.audit-box .audit-s{color:#3c4a5e;}
.audit-box .audit-s b{font-size:13px;}
.audit-box .audit-h{color:var(--muted);font-size:11.5px;line-height:1.5;}
.audit-box .audit-e{color:#b3261e;line-height:1.6;}
.audit-box .audit-idle{color:var(--muted);}
.audit-box .audit-list{display:flex;flex-direction:column;gap:4px;margin-top:2px;}
.audit-box .audit-row{display:flex;flex-wrap:wrap;gap:4px 8px;align-items:baseline;
  padding:6px 8px;border-radius:8px;background:#fff;border:1px solid #f3c9cb;cursor:pointer;}
.audit-box .audit-row:hover{background:#fff0f0;}
.audit-box .audit-tag{font-weight:700;color:#b3261e;}
.audit-box .audit-cmp{color:#3c4a5e;}
.audit-box .audit-cmp b{color:#b3261e;margin:0 2px;}
.audit-box .audit-why{color:var(--muted);font-size:11.5px;width:100%;}
.audit-box .audit-rows-t{margin-top:4px;color:var(--muted);font-size:11.5px;}
.audit-box .audit-rows{max-height:180px;overflow:auto;border:1px solid var(--line);border-radius:8px;background:#fff;}
.audit-box .audit-r{display:grid;grid-template-columns:64px 1fr auto;gap:8px;padding:5px 8px;
  border-bottom:1px solid #eef1f5;font-size:12px;}
.audit-box .audit-r:last-child{border-bottom:0;}
.audit-box .audit-r.bad-row{background:#fff2f2;color:#b3261e;}
/* 表单里出错字段：标红 + 行内差异提示 */
#reimb-form .audit-err{border-color:#b3261e !important;background:#fff6f6 !important;}
#reimb-form .audit-msg{margin-top:3px;font-size:11.5px;color:#b3261e;line-height:1.4;}

/* ---- 管理员报销总览：维度切换 + 纯 CSS 条形图 ---- */
.ov-box{background:#f7faff;border-color:#c9dbfd;}
.ov-ctl{display:flex;flex-wrap:wrap;gap:8px 12px;margin:8px 0 4px;align-items:flex-end;}
.ov-ctl label{font-size:11.5px;color:var(--muted);display:flex;flex-direction:column;gap:3px;}
.ov-ctl select{padding:7px 9px;border:1px solid var(--line);border-radius:8px;font-size:13px;background:#fff;min-width:150px;}
.ov-ctl select:disabled{background:#f1f4f9;color:#8a97a8;}
.ov-sub{font-size:12px;font-weight:700;color:#1a4fc4;margin:10px 0 4px;}
.ov-table th,.ov-table td{font-size:12px;}
.ov-table td.warn{color:#b3261e;font-weight:700;}
.ov-bar{display:inline-block;width:74px;height:9px;border-radius:5px;background:#e6edfa;vertical-align:middle;overflow:hidden;}
.ov-bar i{display:block;height:100%;border-radius:5px;background:var(--blue);}
@media (max-width:680px){
  /* 窄屏：条形图收窄，维度下拉整行铺开，表格照旧横向滚动 */
  .ov-bar{width:48px;}
  .ov-ctl label{flex:1 1 100%;}
  .ov-ctl select{width:100%;}
}

/* ================= 工作台（v46） =================
 * 登录后的默认首页：七个指标 + 超期预警 + 月度趋势 + 客户 TOP5 + 超期明细。
 * 全部走 :root 变量，主题切换（夜间）时不需要额外适配。 */
.wb-wrap{padding:2px 0 10px;}
.wb-bar{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:10px;}
.wb-lab{font-size:12px;color:var(--muted);}
#wb-year,#wb-owner{margin-left:0;max-width:220px;}
#wb-refresh{margin-left:auto;}
.wb-at{font-size:11.5px;color:var(--muted);white-space:nowrap;}
@media (max-width:560px){ .wb-at{width:100%;text-align:right;} }

.wb-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(148px,1fr));gap:8px;margin-bottom:10px;}
.wb-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);
  padding:11px 12px;box-shadow:var(--shadow);}
.wb-card .k{font-size:12px;color:var(--muted);}
.wb-card .v{font-size:17px;font-weight:700;margin-top:3px;line-height:1.25;
  font-variant-numeric:tabular-nums;}
.wb-card .sub{font-size:11px;color:var(--muted);margin-top:3px;}
.wb-card.lock{background:#fafbfc;}
.wb-card.lock .v{font-size:15px;}

.wb-alert{display:flex;gap:9px;align-items:flex-start;border-radius:var(--radius);
  padding:10px 12px;margin-bottom:10px;border:1px solid transparent;}
.wb-alert.bad{background:#fff6f6;border-color:#f3c9cb;}
.wb-alert.ok{background:#f4faf6;border-color:#c8e6d2;}
.wb-alert .wa-ico{font-size:15px;line-height:1.3;}
.wb-alert.bad .wa-ico{color:var(--red);}
.wb-alert.ok .wa-ico{color:var(--green);}
.wb-alert .wa-t{font-size:13.5px;font-weight:600;color:var(--txt);}
.wb-alert.bad .wa-t b{color:var(--red);font-size:15px;}
.wb-alert .wa-s{font-size:11.5px;color:var(--muted);margin-top:2px;}

.wb-st{display:flex;flex-wrap:wrap;gap:12px;font-size:12px;color:var(--muted);margin:0 0 12px;}
.wb-st .wbs{display:inline-flex;align-items:center;gap:5px;}
.wb-st .dot{width:7px;height:7px;border-radius:50%;display:inline-block;background:var(--muted);}
.wb-st .dot.ongoing{background:var(--blue);}
.wb-st .dot.soon{background:var(--gold);}
.wb-st .dot.done{background:var(--green);}
.wb-st .dot.later{background:#b9c3cf;}

.wb-sec{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);
  padding:11px 12px;margin-bottom:10px;box-shadow:var(--shadow);}
.wb-h{font-size:13px;font-weight:700;margin-bottom:8px;display:flex;flex-wrap:wrap;
  align-items:baseline;gap:8px;}
.wb-h-sub{font-size:11px;font-weight:400;color:var(--muted);}
.wb-svg{width:100%;height:auto;display:block;}

.wb-top .wt-row{display:flex;align-items:center;gap:8px;padding:4px 0;}
.wb-top .wt-name{flex:0 0 34%;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.wb-top .wt-bar{flex:1 1 auto;height:9px;background:#eef2f7;border-radius:5px;overflow:hidden;}
.wb-top .wt-bar i{display:block;height:100%;background:var(--blue);border-radius:5px;}
.wb-top .wt-val{flex:0 0 auto;font-size:12px;font-variant-numeric:tabular-nums;text-align:right;min-width:96px;}
.wb-top .wt-n{color:var(--muted);margin-left:6px;font-size:11px;}

.wb-od th:nth-child(2),.wb-od td:nth-child(2),
.wb-od th:nth-child(3),.wb-od td:nth-child(3){text-align:left;}
.wb-od tbody tr:hover{background:#f5f9ff;}
.wb-od .od-days{color:var(--red);font-weight:600;}

.wb-login{display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:6px;min-height:180px;text-align:center;background:var(--panel);
  border:1px dashed var(--line);border-radius:var(--radius);padding:24px 12px;}
.wb-login .wl-ico{font-size:26px;}
.wb-login .wl-t{font-size:14px;font-weight:600;}
.wb-login .wl-s{font-size:12px;color:var(--muted);max-width:340px;line-height:1.6;}

/* v52 结算状态「自动判定」提示行（表单里紧跟在结算状态下拉之后） */
.settle-hint{font-size:12px;color:var(--muted);line-height:1.4;padding:2px 0;}
.settle-hint.ok{color:#0f7a3d;}
.settle-hint.warn{color:var(--red);}

/* v52 撤销提示条 + 撤销按钮禁用态 */
.undo-bar{position:fixed;left:14px;right:14px;bottom:calc(18px + env(safe-area-inset-bottom,0px));z-index:26;
  display:flex;align-items:center;gap:10px;padding:9px 12px;background:#1f2733;color:#fff;
  border-radius:12px;box-shadow:0 8px 24px rgba(15,20,30,.28);font-size:13px;line-height:1.3;}
body.nudge-on .undo-bar{bottom:calc(96px + env(safe-area-inset-bottom,0px));}
.undo-bar.hidden{display:none;}
.undo-bar .undo-text{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.undo-bar .undo-btn{flex:0 0 auto;padding:5px 14px;border:0;border-radius:8px;background:#4c8dff;color:#fff;
  font-size:13px;font-weight:600;cursor:pointer;}
.undo-bar .undo-btn:active{opacity:.8;}
.undo-bar .undo-x{flex:0 0 auto;width:24px;height:24px;border:0;border-radius:50%;background:transparent;
  color:#9aa4b2;font-size:14px;line-height:24px;cursor:pointer;padding:0;}
.undo-count{margin:0 6px;font-size:12px;color:#888;font-variant-numeric:tabular-nums}
.undo-bar .undo-btn:disabled{opacity:.45;cursor:not-allowed}
.mini-btn:disabled{opacity:.45;cursor:not-allowed;}

/* ===== v57：工作台两级指标卡 + 特别款项支出/收入分区 + 客户资料库 ===== */
/* 工作台：核心指标（营业额/待收）大卡，其余小卡收字，层级一眼分明 */
.wb-cards.hero-cards{grid-template-columns:repeat(auto-fit,minmax(190px,1fr));margin-bottom:8px;}
.wb-card.hero{padding:12px 14px;}
.wb-card.hero .k{font-size:12.5px;font-weight:600;color:var(--txt);}
.wb-card.hero .v{font-size:21px;}
.wb-cards:not(.hero-cards) .wb-card .v{font-size:15px;}
/* 特别款项：支出/收入两个独立分区的标题条 */
.sp-sec-h{display:flex;align-items:baseline;gap:8px;font-size:13px;font-weight:700;margin:2px 0 6px;padding-left:2px;}
.sp-sec-h .sp-sec-n{font-size:11.5px;font-weight:400;color:var(--muted);}
.sp-sec-h.bad{color:var(--red);}
.sp-sec-h.ok{color:var(--green);}
.sp-gap{height:14px;}
/* 特别款项：按客户筛选条 */
.sp-filter{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:2px 0 10px;padding:7px 10px;background:var(--surface-2,#F8FAFC);border:1px solid var(--line,#E2E8F0);border-radius:10px;}
.sp-filter label{font-size:12.5px;font-weight:600;color:var(--text,#0F172A);}
.sp-filter select{max-width:220px;padding:5px 8px;font-size:12.5px;border:1px solid var(--line,#E2E8F0);border-radius:7px;background:#fff;color:var(--text,#0F172A);}
.sp-filter .sp-filter-on{font-size:12px;color:var(--muted,#64748B);}
.sp-filter .btn.ghost{padding:4px 10px;font-size:12px;background:transparent;border:1px solid var(--line,#E2E8F0);color:var(--muted,#64748B);}
/* 客户资料库：必填星号 */
.req{color:var(--red);font-weight:700;}

/* ===== v58：工作台顶栏胶囊化 + 可拖拽加号 ===== */
/* 顶栏：圆角面板一行放下财年/负责人两个胶囊 + 圆形刷新键 */
.wb-bar{display:flex;flex-wrap:wrap;align-items:center;gap:8px;background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:7px 10px;margin-bottom:7px;}
.wb-chip{display:inline-flex;align-items:center;gap:5px;background:#fff;border:1px solid var(--line);border-radius:999px;padding:3px 10px;}
.wb-bar .yr-owner{border:none;background:transparent;font-weight:600;font-size:13px;color:var(--txt);padding:0;outline:none;}
.wb-rf{margin-left:auto;width:30px;height:30px;border-radius:50%;border:1px solid var(--line);background:#fff;font-size:15px;line-height:1;color:var(--muted);cursor:pointer;}
.wb-meta{font-size:11px;color:var(--muted);margin:0 0 10px;line-height:1.6;}
/* 加号：可拖拽 —— 禁掉触摸滚动，按住才不误触页面 */
.fab{touch-action:none;cursor:grab;}
.fab:active{cursor:grabbing;}

/* ===== v59：客户资料库固定标签条最右端 ===== */
/* .vt-sticky 组：margin-left:auto 贴右；窄屏横向滚动时 sticky 钉在最右，
   缩小状态下客户资料库永远是可见的最后一个（组内顺序：🩺自检 | 客户资料库） */
.vt-sticky{position:sticky;right:0;margin-left:auto;display:flex;align-items:center;gap:4px;flex:0 0 auto;
  background:#eef2f8;padding-left:8px;box-shadow:-8px 0 10px -8px rgba(15,26,48,.22);}
.vt-sticky .vt-diag{position:static;right:auto;margin-left:0;box-shadow:none;}
.view-tab.cust-pin{flex:0 0 auto;}

/* ===== v62：管理员审批流 / 待办事项 / 字段隐藏 ===== */
/* 顶栏审批入口角标：管理员=待办审批数，成员=未读审批结果数 */
.tb-badge{display:inline-block;min-width:16px;height:16px;line-height:16px;padding:0 4px;margin-left:3px;
  border-radius:9px;background:var(--red);color:#fff;font-size:10px;font-weight:700;text-align:center;vertical-align:middle;}
.tb-badge.hidden{display:none;}
/* 工作台「待办事项 · 系统审批事项」 */
.wb-todo{display:flex;align-items:center;gap:12px;margin:0 0 12px;padding:10px 14px;
  border:1px solid var(--line);border-left:4px solid var(--gold);border-radius:10px;background:var(--panel);}
.wb-todo.has{border-left-color:var(--red);background:#fff8f1;}
.wbt-l{flex:1;min-width:0;}
.wbt-t{font-size:13.5px;font-weight:700;color:var(--txt);}
.wbt-s{font-size:11.5px;color:var(--muted);margin-top:2px;line-height:1.5;}
.wbt-n{font-size:12px;color:var(--muted);white-space:nowrap;}
.wbt-n b{font-size:22px;color:var(--red);margin-right:2px;}
.wbt-go{flex:0 0 auto;padding:6px 12px;font-size:12.5px;border:1px solid var(--line);border-radius:8px;
  background:#fff;color:var(--blue);cursor:pointer;}
/* 审批中心 */
.ap-wrap{padding-bottom:8px;}
.ap-hero{font-size:13px;color:var(--muted);margin:10px 0 12px;line-height:1.6;}
.ap-notice{margin:0 0 12px;padding:10px 14px;border-radius:10px;border:1px solid #f3c9a8;
  background:#fff5ec;color:#9a4b12;font-size:13px;line-height:1.6;}
.ap-notice b{font-size:16px;}
.ap-reject-box{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 12px;padding:10px 12px;
  border:1px solid var(--line);border-radius:10px;background:var(--bg);}
.ap-reject-box label{font-size:12.5px;font-weight:600;}
.ap-reject-box input{flex:1;min-width:180px;padding:6px 9px;font-size:13px;border:1px solid var(--line);border-radius:7px;}
.ap-fb{font-size:12.5px;line-height:1.5;color:var(--txt);}
.ap-ro{font-size:11.5px;color:var(--muted);}
.ap-pending{background:#fffaf2;}
.ap-wrap .wb-sec{margin-top:14px;}
/* 特别款项：普通账号可见范围提示 */
.sp-scope{margin:0 0 10px;padding:8px 12px;border-radius:8px;background:#fff8f1;
  border:1px solid #f3d8b8;color:#9a5a12;font-size:12px;line-height:1.6;}
/* v65：审批结果未读行 —— 点一下才标记已读，反馈不会只闪一次 */
.ap-unread{cursor:pointer;background:rgba(47,109,246,.06);}
.ap-unread:hover{background:rgba(47,109,246,.13);}
